A segurança é uma preocupação crítica em qualquer ambiente de computação. Ao criar Dockerfiles, é importante ter em mente que a segurança é um aspecto fundamental que deve ser levado em consideração desde o início. O Dockerfile é a base para a criação das imagens de contêineres. Portanto, apresento aqui algumas boas práticas importantes que devem ser consideradas ao criar ou atualizar suas imagens.
Defina um usuário em seu Dockerfile:
O Docker executa contêineres como root por padrão, o que pode representar um risco de segurança, permitindo que um invasor explore vulnerabilidades e obtenha acesso ao host.
Para mitigar esse risco, é altamente recomendado executar contêineres como um usuário com menos privilégios sempre que possível, utilizando a instrução “USER” no Dockerfile.
FROM python:3.9-slim
# Cria grupo e usuário de sistema sem senha.
RUN groupadd -r appuser && useradd -r -g appuser appuser
WORKDIR /app
COPY myapp /app
RUN pip install --no-cache-dir -r requirements.txt
# Define as permissões para o diretório /app
RUN chown -R appuser:appuser /app
# Define o usuário padrão para o contêiner
USER appuser
CMD [ "python", "./app.py" ]
Use imagens confiáveis:
Ao criar um Dockerfile, é importante escolher imagens oficiais de fontes confiáveis como base para suas próprias imagens. Optar por imagens mínimas com apenas as ferramentas e bibliotecas necessárias garante uma imagem mais leve, segura e eficiente.
Dessa forma, você pode manter o controle sobre o ambiente em que sua aplicação será executada, evitar problemas de segurança e conflitos futuros, e garantir que todas as dependências estejam presentes na imagem.
# Imagem Base
FROM alpine:3.14
RUN apk add --no-cache python3 py3-pip
RUN addgroup -S appuser && adduser -S appuser -G appuser
WORKDIR /app
COPY app /app
RUN pip install --no-cache-dir -r requirements.txt
RUN chown -R appuser:appuser /app
USER appuser
CMD [ "python", "./app.py" ]
Evite vazamento de dados confidenciais:
É fundamental proteger dados confidenciais, como senhas, chaves privadas e tokens, evitando sua inclusão direta no Dockerfile. Utilize recursos seguros para armazená-los, como Kubernetes secrets ou cofres como por exemplo hashicorp vault, aws secrets Manager, etc.
Além disso, para evitar a inclusão acidental de arquivos confidenciais na imagem, utilize o arquivo “.dockerignore” para especificar arquivos e diretórios que devem ser excluídos durante o processo de construção da imagem.
Construa imagens usando Multi-stage:
Uma abordagem de multi-stage bem elaborada inclui somente os binários e as dependências mínimas necessárias na imagem final, diminuindo o tempo de build e podendo reduzir a superfície de ataques e vulnerabilidades, além de diminuir significativamente o tamanho da imagem final.
# Stage 1 - Build da aplicação
FROM node:14-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install –production
COPY app /app
RUN npm run build
# Stage 2 - Cópia dos arquivos de build e execução da aplicação
FROM node:14-alpine
WORKDIR /app
COPY --from=build /app/dist /app
COPY package*.json ./
RUN npm install –only=production
USER node
EXPOSE 3000
CMD ["npm", "start"]
Utilize um Linter para verificar erros:
Utilizar ferramentas como o hadolint, ajudam a identificar possíveis erros e garante que seu Dockerfile está seguindo as boas práticas recomendadas, dessa forma, é possível corrigir problemas antes ou durante o processo de construção de sua imagem.
FROM alpine:3.14
RUN apk add --no-cache python3 py3-pip
RUN addgroup -S appuser && adduser -S appuser -G appuser
WORKDIR /app
COPY app /app
RUN pip install --no-cache-dir -r requirements.txt
RUN chown -R appuser:appuser /app
USER appuser
CMD [ "python", "./app.py" ]
Utilizando ferramentas de scan:
Ferramentas de scan, como o trivy, ajudam a identificar vulnerabilidades em imagens e fornecer informações detalhadas sobre os problemas encontrados. Ao utilizá-las, você pode identificar e corrigir vulnerabilidades antes de implantar sua aplicação no ambiente, garantindo uma maior segurança e confiabilidade.
Conclusão:
Criar um Dockerfile utilizando as boas práticas permite mitigar riscos de segurança, reduzir vulnerabilidades e garantir a confiabilidade da aplicação. Portanto, investir em segurança desde o início do processo de construção da imagem é a melhor maneira de evitar futuros problemas de segurança.