Contents

Como criar imagens Docker Python eficientes

O Docker é o software padrão do sector para empacotar e implementar aplicações em contentores. As imagens do Docker são a pedra angular sobre a qual pode construir e executar as suas aplicações.

Para tirar partido de todas as capacidades do Docker, é essencial afinar as imagens de contentores com o objetivo de otimizar a utilização de recursos, reforçar as medidas de segurança e melhorar o desempenho geral. Ao fazer isso, você pode facilitar a operação contínua de seus aplicativos no ambiente do Docker.

Obtenha uma compreensão do processo examinando uma ilustração prática que demonstra a implantação de um aplicativo de calculadora Python em um ambiente em contêiner.

Começando com uma imagem de base mínima

A seleção de uma imagem de base pode afetar significativamente o desempenho de um contêiner do Docker, e é recomendável começar com uma imagem mínima que contenha apenas os elementos fundamentais necessários para executar o aplicativo desejado.

Escolha uma imagem com um registo fiável de fornecimento de actualizações de segurança e patches atempados e que mantenha uma base de utilizadores empenhada, apoiada por documentação abrangente. Estas características são inestimáveis para resolver quaisquer dificuldades técnicas ou procurar orientação durante o desenvolvimento do seu projeto.

A seleção de “python:3.11-slim-bookworm” como linguagem de programação para a aplicação da calculadora conduz a uma imagem optimizada que requer menos recursos. Consequentemente, isto resulta num menor consumo de recursos durante a implementação e downloads mais rápidos da aplicação.

 # Starting With a Minimal Base Image
FROM python:3.11-slim-bookworm AS builder 

Tem a opção de utilizar uma distribuição Alpine Linux mais compacta seleccionando “python:3.11-alpine”. No entanto, é importante notar que esta imagem em particular omite a inclusão de um interpretador Python, um gestor de pacotes, e bibliotecas Python essenciais.

Executar aplicações como utilizadores não raiz

Executar contentores Docker com privilégios administrativos, tais como os detidos pelo utilizador raiz, pode levar a graves implicações de segurança se uma parte não autorizada obtiver acesso ao contentor. Nesses cenários, os atacantes poderiam potencialmente aproveitar quaisquer vulnerabilidades existentes na aplicação contentorizada ou nas suas dependências para elevar o seu nível de privilégio. Uma vez alcançado, isto permitir-lhes-ia executar comandos arbitrários no sistema anfitrião subjacente, comprometendo assim a sua integridade e confidencialidade. É crucial que as organizações implementem medidas de segurança robustas e melhores práticas ao implementar e gerir contentores Docker para mitigar estas potenciais ameaças.

Executar aplicações com privilégios reduzidos, como numa conta de utilizador não raiz, pode ser uma medida de segurança eficaz para mitigar os potenciais riscos associados à concessão de direitos de acesso total a recursos críticos do sistema. Ao implementar esta prática, os processos da aplicação são isolados de áreas sensíveis do sistema operativo, limitando o âmbito de qualquer atividade maliciosa que possa ocorrer no contexto da aplicação. Esta abordagem também facilita melhores capacidades de auditoria, permitindo um acompanhamento mais granular das acções executadas pela aplicação. Além disso, ajuda a manter a integridade do sistema subjacente, impedindo modificações não autorizadas ou a adulteração de definições essenciais.

 # Set non-root user for security
RUN adduser calculator --system

# Add the user to the calculator group
RUN addgroup calculator && adduser calculator calculator

Ao implementar uma conta de utilizador designada com privilégios restritos especificamente para o seu software, pode mitigar eficazmente os riscos de segurança limitando o âmbito de acesso que os potenciais intrusos podem tentar aproveitar contra vulnerabilidades no sistema.

Copiar os ficheiros necessários e criar um ambiente virtual

A utilização de um ambiente virtualizado encapsulado num contentor Docker facilita a gestão de dependências, isolando potenciais conflitos com pacotes de software globais e outros programas. Além disso, garante a consistência nas versões dos pacotes, uma vez que edições precisas das dependências necessárias podem ser instaladas, preservando a integridade do sistema geral.

Claro! Eis a minha tentativa de parafrasear as instruções de uma forma mais sofisticada:Para configurar a aplicação da calculadora no contentor Docker, siga cuidadosamente estes passos:1. Em primeiro lugar, transfira todos os ficheiros essenciais da sua máquina local para a pasta designada no servidor onde reside a imagem Docker. Este processo envolve a cópia dos dados necessários para facilitar o bom funcionamento do software.2. Em seguida, utilize o módulo eficiente venv que vem pré-instalado com o Python para estabelecer um ambiente virtual isolado dentro do contentor. Ao fazer isso, podemos garantir que o aplicativo seja executado sem problemas, sem qualquer interferência ou conflito com outros pacotes instalados. O objetivo deste passo é fornecer um ambiente autónomo e seguro para que o programa da calculadora funcione da melhor forma.

 # Set working directory and copy necessary files
WORKDIR /app
COPY app.py .
COPY requirements.txt .
COPY config.json ./
# Copy config.json from the local directory

# Create a virtual environment and install dependencies
RUN python -m venv /venv
ENV PATH="/venv/bin:$PATH"
RUN /venv/bin/pip install --upgrade pip --no-cache-dir --requirement requirements.txt 

A utilização de ambientes virtuais proporciona uma abordagem simplificada à gestão de pacotes em contentores Docker, evitando a duplicação de componentes de todo o sistema. Isso resulta em um tamanho de imagem mais compacto e menor uso de recursos durante o tempo de execução.

Minimizar camadas para obter eficiência

O Docker emprega uma estratégia de cópia na gravação ao construir imagens, em que cada diretiva dentro de um Dockerfile dá origem a uma camada adicional. Para otimizar as dimensões da imagem e a velocidade de construção, é prudente minimizar o número de camadas presentes na imagem do Docker. Uma abordagem prática para atingir esse objetivo envolve a combinação de várias instruções em uma instrução solitária RUN .

 # Minimizing Layers for Efficiency
# Combine commands to reduce the number of layers
RUN echo "Build process goes here" && \
   /venv/bin/python -m compileall . && \
   rm -rf __pycache__ 

Utilizando as recomendações mencionadas acima, podemos efetivamente minimizar a geração de camadas intermediárias durante a construção de uma imagem.

Protegendo o manuseio da configuração

O uso de imagens do Docker para manipular dados confidenciais representa uma ameaça potencial à segurança. Para mitigar esse risco, é recomendável utilizar variáveis de ambiente e arquivos de configuração externos. Por exemplo, no caso da aplicação da calculadora, pode estabelecer-se um diretório chamado “/config” para alojar o ficheiro de configuração e garantir que são atribuídos privilégios de propriedade adequados.

 # Securing Configuration Handling
RUN mkdir /config && chown calculator:calculator /config

Depois de colocar uma duplicata do ficheiro “config.json” nesta pasta, mantendo a sua separação do código fonte da aplicação.

 # Copy the config.json file into the container
RUN cp config.json /config/config.json
ENV CONFIG_PATH=/config/config.json 

Isolar as informações de configuração da base de código e implementar permissões adequadas é um aspeto fundamental para reforçar a postura de segurança abrangente do seu contêiner Docker. Esta abordagem restringe entidades não autorizadas, como processos ou indivíduos desonestos, de aceder a detalhes de configuração sensíveis.

Usando compilações em vários estágios

Ao implementar um processo de compilação em vários estágios, é possível isolar o ambiente de construção da representação gráfica final. Consequentemente, esta abordagem produz produtos finais mais compactos e especializados. Para além disso, reforça a segurança ao excluir os recursos e dados de desenvolvimento da representação final. Ao fazê-lo, diminui a área de superfície de ataque e minimiza quaisquer perigos colaterais que possam surgir de inclusões injustificadas.

 # Leveraging Multi-Stage Builds
FROM python:3.11-slim-bookworm

COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /etc/group /etc/group
COPY --from=builder /venv /venv
COPY --from=builder /config /config
COPY --from=builder /app /app
# Copy the application code

O código acima mencionado transfere seletivamente componentes essenciais da fase de construção (designada por construtor) para a imagem final. Ao eliminar os recursos e dados desnecessários associados à construção, simplifica as dimensões da imagem, assegurando um desempenho ótimo da aplicação de software da calculadora.

Aumentar a segurança com a digitalização de imagens

Para aumentar a segurança das suas imagens Docker, utilize ferramentas de digitalização de imagens como o Trivy ou o Clair.Concebidas especificamente para detetar vulnerabilidades nas suas camadas de imagem e elementos fiáveis, estas ferramentas oferecem uma solução robusta para garantir a integridade das suas aplicações em contentores. Por exemplo, pode utilizar o Trivy para efetuar análises de vulnerabilidades na aplicação da calculadora.

 # Install Trivy for Debian/Ubuntu
RUN apt-get update && \
   apt-get install -y wget apt-transport-https gnupg lsb-release && \
   wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | apt-key add - && \
   echo "deb https://aquasecurity.github.io/trivy-repo/deb bookworm main" \
   | tee -a /etc/apt/sources.list.d/trivy.list && \
   apt-get update && \
   apt-get install -y trivy 

Incorporar os recursos de verificação de vulnerabilidades do Trivy em uma imagem do Docker é de suma importância devido à sua dependência do banco de dados CVE (Common Vulnerabilities and Exposures) amplamente reconhecido. A base de dados CVE fornece actualizações atempadas relativamente às vulnerabilidades identificadas, permitindo a manutenção contínua da segurança da imagem através da implementação dos patches mais recentes. Consequentemente, isto atenua os potenciais riscos associados a explorações conhecidas e protege contra o acesso não autorizado ou violações de dados.

Para obter uma avaliação de segurança da sua imagem, pode utilizar a seguinte instrução. Ao executar este comando, receberá um relatório abrangente que detalha quaisquer potenciais fraquezas ou susceptibilidades presentes nos componentes de software da sua imagem.

 docker run --rm `
 -v /var/run/docker.sock:/var/run/docker.sock `
 -v $HOME/Library/Caches:/root/.cache/ `
 aquasec/trivy:0.18.3 `
 <your image name> 

A instrução anterior pode necessitar de uma duração de execução alargada. Por conseguinte, após a sua conclusão, produzirá um documento análogo ao exemplo que se segue.

/pt/images/how-to-create-efficient-python-docker-images-trivy-output.jpg

É imperativo resolver prontamente uma vulnerabilidade de segurança de acordo com o seu nível de gravidade, uma vez que quanto mais grave for o problema, mais rapidamente deve ser resolvido.

Executar aplicações como utilizadores não raiz

Para reforçar a segurança desta aplicação, recomenda-se que a utilize sob os auspícios da conta de administrador do sistema, o que serve para minimizar quaisquer susceptibilidades latentes que possam existir.

 # Running Applications as Non-Root Users
WORKDIR /app
USER calculator

# Activate the virtual environment and run the application
CMD ["/bin/bash", "-c", "source /venv/bin/activate && python app.py"]

A transição para um utilizador não administrativo reduz significativamente as potenciais vulnerabilidades, limitando os privilégios de acesso e reduzindo o âmbito de potenciais explorações.

Containerizando aplicativos não Python

O processo de containerização de aplicativos que utilizam linguagens diferentes de JavaScript pode variar um pouco, exigindo um entendimento de várias técnicas de containerização. Ao compreender essas nuances, é possível determinar a abordagem ideal para implantar seu aplicativo específico, levando em consideração sua linguagem de programação.