Docker
  • Introdução a Containeres e Docker
    • Introdução
    • O que é um container e suas vantanges
    • VM versus Container
    • Como funcionam os containers
    • Linux
    • Container sem Docker
      • cgroup
      • cpu.max
    • LxC
    • LxD
    • Containers versus Imagens
    • Arquitetura do Docker
    • Arquitetura do Docker mais a fundo
    • Projetos Open Source
  • Instalação do Docker
    • Linux
    • Windows
      • Docker Desktop
      • Rancher Desktop
      • WSL
    • Mac
    • Visual Studio Code
  • Primeiros Passos com Docker
    • Criação e listagem básica de um container
    • Interagindo com o container
    • Executando containers continuamente
      • nginx
      • docker container run
      • docker container run nginx
      • docker container run -d nginx
      • docker container exec
    • Como usar publish de porta
      • docker container stop
      • docker container start
      • docker container rm
      • docker container rm -f $(docker container ls -qa)
    • Containers e variáveis de ambiente
      • docker container run -e
  • Desafio
    • Desafio 01 - Banco de Dados Postgresql
    • Desafio 02 - Banco de Dados MySQL
    • Desafio 03 - Banco de Dados MongoDB
  • Executando a sua primeira aplicação em containers
    • Introdução
    • Preparando o container para a aplicação
    • Executando a aplicação
      • docker container cp
  • Primeiros Passos com Docker Images
    • Introdução
    • OverlayFS na Prática
    • Copy-on-Write
    • Formas de criar uma imagem Docker
    • Como funciona o Docker Commit
    • Docker Commit na Prática
      • docker commit
    • Entendendo melhor a sua imagem
      • docker image history
      • docker image inspect
    • Entrando mais a fundo na imagem
    • Como usar a imagem Docker no modo raiz
  • Avançando em imagens Docker com Dockerfile
    • O que é Dockerfile
    • Primeira Imagem com Dockerfile
      • docker image build
    • Como funciona a construção com Dockerfile
    • Possibilidades com Dockerfile
    • FROM
    • RUN
    • WORKDIR
    • COPY
    • ADD
    • LABEL
    • ENV
    • VOLUME
    • ARG
    • EXPOSE
    • USER
    • ENTRYPOINT
    • CMD
    • ENTRYPOINT versus CMD
    • Principais comandos com imagem
    • Imagem da aplicação com Dockerfile
    • Comparando Docker Commit com Dockerfile
  • Docker Registry
    • Introdução
    • Docker Hub
    • Sua imagem com o nome certo
    • Renomear imagens com Docker Tag
      • docker image tag
    • Enviando a sua primeira imagem para o Docker Hub
      • docker image push
      • docker image pull
  • Algumas boas práticas para construção de imagem
    • Um processo por container
    • Usar imagens confiáveis
    • Otimizar sempre a sua imagem
    • Uso inteligente das camadas
    • Dockerignore
  • Multistage Build
    • Introdução
    • Multistage build na prática
    • Target para fazer o build
      • docker image build --target
    • Imagem externa no Multistage build
    • Usar um estágio de build como base
  • Docker Volume
    • Introdução
      • docker volume
    • Bind Mount
    • Particularidades do Bind Mount
    • Bind Mount no Windows
    • Exemplo com Bind Mount
    • Docker Volume
      • docker volume create
      • docker volume inspect
      • docker volume ls
      • docker volume prune
      • docker volume rm
    • Onde ficam os arquivos do Docker volume?
    • Usando o volume no Dockerfile
    • Como fazer backup de um Docker Volume
    • Exemplo com Docker Volume
    • Storage tmpfs
    • Como criar algo funcional com o que aprendemos
  • Network
    • Introdução
    • Componentes do Docker Network
    • Rede Bridge na prática
      • docker network
      • docker network create
      • docker network inspect
      • docker network ls
      • docker network prune
      • docker network rm
    • Criando a sua rede bridge
      • docker network connect
      • docker network disconnect
    • Como funciona a rede bridge por dentro
    • Rede Host na prática
    • Rede none da prática
    • Como adicionar domínios no seu container
  • Aplicação 100% no Docker
    • Introdução
    • Criação da Imagem e Envio para o Docker Hub
    • Criação do Docker Network
    • Container do PostgreSQL
    • Container da Aplicação Web
    • Atualização da aplicação
  • Docker Compose
    • Introdução
      • docker compose
    • A evolução do docker compose
    • Criação básica de um Docker Compose
      • docker compose attach
      • docker compose build
      • docker compose config
      • docker compose cp
      • docker compose create
      • docker compose down
      • docker compose events
      • docker compose exec
      • docker compose images
      • docker compose kill
      • docker compose logs
      • docker compose ls
      • docker compose pause
      • docker compose port
      • docker compose ps
      • docker compose pull
      • docker compose push
      • docker compose restart
      • docker compose rm
      • docker compose run
      • docker compose scale
      • docker compose start
      • docker compose stats
      • docker compose stop
      • docker compose top
      • docker compose unpause
      • docker compose up
      • docker compose version
      • docker compose wait
      • docker compose watch
    • Variáveis de Ambiente
    • Volume Bind Mount
    • Docker Volume
    • Docker Network - Bridge
    • Docker Network - Host Driver e Add Host
    • Ordenando a execução dos containers
    • Compose com build de imagem
    • Como Parametrizar o Compose com Variáveis de Ambiente
    • Múltiplos Composes
    • Extends
    • Merge
    • Include
    • Profiles
    • Comandos importantes do Docker Compose
  • Troubleshooting
    • Introdução
    • Docker Info
    • Docker Events
    • Docker Logs
    • Docker Inspect
    • Docker Top
    • Docker Stats
    • Docker Exec
  • Resiliência e Gerenciamento de Recursos
    • Introdução
    • Docker Restart
      • Introdução
      • on-failure
      • unless-stopped
      • always
      • Docker Compose
    • Healthcheck
      • Introdução
      • Linha de Comando
      • Docker Compose
      • Direto na Imagem
    • Gerenciamento de Recurso
      • CPU
        • Como Gerenciar CPU
        • Prática
      • Memória
        • Como Gerenciar Memória
        • Prática
      • Docker Compose
  • Fazendo um ambiente mais seguro
    • Introdução
    • Docker Scout
      • Introdução
      • Verificação Simples de Imagem
      • Como adicionar um repositório
      • Primeira melhoria na imagem
  • BUSCA RÁPIDA
    • Referências
    • Comandos
      • docker commit
      • docker compose
      • docker container
      • docker image
      • docker network
      • docker volume
    • Dockerfile
Powered by GitBook
On this page
  • Segurança no Docker
  • 1. Imagens Distroless
  • 2. Linux Capabilities
  • 3. Docker Scout
  • 4. Trivy
  • 5. Cosign
  • 6. Assinatura de Imagens Docker
  • 7. Privilégios de Execução em Containers
  • Conclusão
  • Laboratório
  1. Fazendo um ambiente mais seguro

Introdução

Segurança no Docker

A segurança é uma preocupação fundamental em ambientes de containers, uma vez que esses ambientes são dinâmicos e frequentemente compartilhados entre diversas aplicações e serviços. A seguir, abordaremos os principais aspectos e ferramentas que podem ser usadas para garantir um ambiente Docker seguro, incluindo escaneamento de vulnerabilidades, assinatura de imagens, controle de permissões e boas práticas para construção de imagens.

1. Imagens Distroless

As imagens Distroless são uma abordagem minimalista para a criação de containers, onde apenas os binários necessários para a execução da aplicação são incluídos, sem componentes extras do sistema operacional, como gerenciadores de pacotes ou shells. Isso reduz significativamente a superfície de ataque.

  • Benefícios:

    • Menor superfície de ataque: Sem ferramentas extras, como bash, wget ou gerenciadores de pacotes, o risco de exploração de vulnerabilidades é reduzido.

    • Tamanho reduzido: Menores que as imagens tradicionais, o que acelera o tempo de download e startup dos containers.

    • Menos dependências: Menos pacotes e bibliotecas significa menos vetores de vulnerabilidade.

Exemplo de uso com uma imagem Distroless:

FROM gcr.io/distroless/base
COPY myapp /myapp
CMD ["/myapp"]
  • Nesse exemplo, apenas o binário da aplicação é copiado para a imagem e nenhuma outra ferramenta ou pacote é incluído, mantendo o container extremamente leve e seguro.

2. Linux Capabilities

No Docker, os containers são isolados, mas ainda compartilham o kernel do sistema operacional host. As Linux Capabilities permitem controlar os privilégios concedidos ao container no host. Por padrão, os containers têm privilégios limitados, mas é possível ajustá-los conforme necessário.

  • Principais capacidades:

    • CAP_NET_RAW: Permite a criação de pacotes de rede personalizados. Remover essa capacidade melhora a segurança do container.

    • CAP_SYS_ADMIN: Uma das capacidades mais poderosas, que deve ser evitada, pois concede muitos privilégios sobre o sistema.

    • CAP_CHOWN, CAP_SETUID, CAP_SETGID: Permitem manipular permissões de usuários e grupos.

Exemplo de uso para restringir capacidades:

docker run --cap-drop=NET_RAW --cap-drop=SYS_ADMIN <imagem>
  • Nesse exemplo, o container não poderá criar pacotes de rede brutos ou acessar privilégios administrativos do sistema, reforçando sua segurança.

3. Docker Scout

O Docker Scout é uma ferramenta de análise de segurança que oferece insights detalhados sobre a segurança das imagens Docker. Ele verifica se as imagens contêm vulnerabilidades conhecidas em seus pacotes e dependências.

  • Funcionalidades:

    • Escaneia vulnerabilidades em pacotes de sistema e bibliotecas.

    • Sugere atualizações de imagens que corrigem vulnerabilidades.

    • Oferece um relatório detalhado com os riscos identificados e recomendações.

Exemplo de uso com Docker Scout:

docker scout cves marcelodpbarbieri/simulador-caos:v2
  • Esse comando escaneia a imagem simulador-caos:v2 em busca de vulnerabilidades conhecidas e fornece um relatório.

4. Trivy

  • Funcionalidades:

    • Detecta vulnerabilidades em imagens Docker, incluindo dependências do sistema operacional e bibliotecas.

    • Verifica configurações inseguras, como permissões de arquivos e exposições de portas.

    • Escaneia código-fonte e arquivos de configuração para práticas inseguras.

Exemplo de uso com Trivy:

trivy image marcelodpbarbieri/simulador-caos:v2
  • Esse comando escaneia a imagem simulador-caos:v2 em busca de vulnerabilidades e gera um relatório detalhado sobre possíveis riscos.

5. Cosign

  • Funcionalidades:

    • Assinatura de imagens: Gera uma assinatura digital que garante a integridade e autenticidade da imagem.

    • Verificação de assinaturas: Confirma que a imagem não foi alterada após a assinatura.

    • Integração com repositórios de containers e ferramentas CI/CD.

Exemplo de uso com Cosign:

cosign sign --key <chave-privada> marcelodpbarbieri/simulador-caos:v2
cosign verify --key <chave-publica> marcelodpbarbieri/simulador-caos:v2
  • No primeiro comando, a imagem é assinada com uma chave privada. No segundo comando, a assinatura da imagem é verificada usando a chave pública correspondente.

Benefícios de usar Cosign:

  • Autenticidade garantida: A imagem é garantida como sendo proveniente de uma fonte confiável.

  • Integridade: Garante que a imagem não foi modificada ou corrompida após a criação.

6. Assinatura de Imagens Docker

Assinar imagens Docker é uma prática recomendada para garantir que a imagem não foi alterada desde que foi criada e publicada. A assinatura digital permite que você verifique a autenticidade e a integridade da imagem antes de usá-la.

  • Docker Content Trust (DCT): O Docker oferece suporte para assinatura de imagens por meio do Docker Content Trust (DCT), que usa chaves criptográficas para assinar e verificar imagens.

Exemplo de assinatura de imagem com Docker Content Trust:

export DOCKER_CONTENT_TRUST=1
docker push marcelodpbarbieri/simulador-caos:v2
  • Com DOCKER_CONTENT_TRUST habilitado, a imagem será assinada automaticamente ao ser enviada para o repositório. Da mesma forma, ao fazer o pull de uma imagem, sua assinatura será verificada.

7. Privilégios de Execução em Containers

A segurança também está relacionada a como os containers são executados. Evitar executar containers como root é uma prática recomendada, pois reduzir os privilégios no container limita os danos caso haja uma vulnerabilidade explorável.

  • Exemplo de Dockerfile com usuário não-root:

FROM debian:latest
RUN useradd -ms /bin/bash appuser
USER appuser
  • Neste Dockerfile, um usuário appuser é criado e o container é executado com esse usuário, evitando a execução como root.


Conclusão

A segurança no Docker envolve uma combinação de práticas e ferramentas para proteger seu ambiente, desde a construção das imagens até a execução dos containers. Ferramentas como Docker Scout, Trivy, Cosign e o uso de imagens Distroless ajudam a reduzir riscos e garantir a integridade do ambiente. Além disso, o controle de capacidades Linux e a assinatura de imagens são medidas cruciais para mitigar vulnerabilidades e assegurar que seus containers sejam confiáveis e seguros.

Implementar uma abordagem de segurança desde o início, incluindo o escaneamento regular de vulnerabilidades e o controle rigoroso de permissões, é fundamental para proteger qualquer infraestrutura baseada em containers.

Laboratório

Projeto:

PreviousFazendo um ambiente mais seguroNextDocker Scout

Last updated 8 months ago

O é uma ferramenta amplamente utilizada para escanear vulnerabilidades de segurança em containers, código-fonte e outras infraestruturas. Ele verifica vulnerabilidades em sistemas operacionais, bibliotecas de aplicações e configurações inseguras em containers.

O é uma ferramenta usada para assinar e verificar a assinatura de imagens de containers, garantindo que a imagem foi criada por uma fonte confiável e não foi modificada durante o transporte.

Trivy
Cosign
GitHub - marcelobarbieri/devops-projeto-caoticoGitHub
Logo