Segurança para contêineres Docker

Nota do tradutor.: O tema da segurança do Docker é, sem dúvida, uma questão eterna no mundo da TI moderna. Portanto, sem mais explicações, apresentamos a tradução de mais uma seleção de recomendações pertinentes. Se você já se interessou por esse assunto, muitos delas serão familiares. Também adicionamos à seleção uma lista de utilitários úteis e alguns recursos para estudo adicional.

Segurança para contêineres Docker

Apresento à sua atenção um guia sobre a segurança do Docker. Feedback é bem-vindo, pois este é mais um apanhado de trechos de diferentes recursos, e nem todos foram submetidos a uma verificação rigorosa. As recomendações são divididas em três categorias:

  1. Medidas necessárias dentro do sistema operacional do host ao trabalhar com Docker;
  2. Instruções relativas ao arquivo de configuração de construção e criação de containers;
  3. Ferramentas de segurança que podem se integrar a recursos específicos do Docker Enterprise.


A base para o guia foram diversos recursos, muitos dos quais estão listados abaixo. Não pode ser considerado exaustivo, no entanto, cobre todos os fundamentos. Informações adicionais podem ser encontradas na descrição dos testes CIS (link fornecido ao final deste guia), bem como na documentação do Docker.

Docker Security Benchmark

Docker Bench for Security verifica automaticamente seu Docker quanto à conformidade com as melhores práticas mais comuns. O script serve como um bom teste heurístico de segurança, porém não deve ser considerado uma ferramenta de análise abrangente.

Sistema operacional do host

É evidente que um container Docker não pode ser seguro se o próprio sistema host não estiver protegido. Portanto, é necessário seguir as melhores práticas em segurança de sistemas operacionais. Além disso, seria prudente realizar uma análise de vulnerabilidades além das recomendações a seguir.

Regras de auditoria

Crie e utilize regras de auditoria para arquivos relacionados ao Docker usando auditctl. Por exemplo, você pode adicionar -w /usr/bin/dockerd -k docker para /etc/audit.rules e reiniciar o serviço de auditoria.

Modo FIPS

Ativar o modo FIPS faz com que as ferramentas criptográficas mudem para algoritmos incluídos no FIPS (padrões de Federal Information Processing Standards — nota do tradutor.), correspondendo, assim, às normas e requisitos federais e setoriais. Se o sistema operacional do host suportar o modo FIPS, ele pode ser ativado executando os seguintes comandos:

sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="fips=1 /g' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg && reboot

Também é necessário habilitar o FIPS no Docker Engine:

mkdir -p /etc/systemd/system/docker.service.d 2>&1; echo -e "[Service]n Environment="DOCKER_FIPS=1"" > /etc/systemd/system/docker.service.d/fips-module.conf; systemctl daemon-reload; systemctl restart docker

Para mais informações, consulte a documentação Docker e Red Hat.

Docker Secrets

Os dados confidenciais devem ser armazenados como segredos. O serviço correspondente pode ser iniciado com o comando docker service create:

docker service create --label com.docker.ucp.access.label=/prod --name nginx --publish 443 --secret source=orcabank_prod_mobile.ca.pem.v1,target=ca.pem nginx

Mais detalhes podem ser encontrados em documentação.

Arquivo de configuração do Docker

As seguintes configurações podem ser adicionadas ao arquivo de configuração /etc/docker/daemon.json:

  • "icc":false — desativa a troca de dados entre contêineres, para evitar vazamentos de informações desnecessários.
  • log-level: "info" — captura todos os logs, exceto os de depuração.
  • {
      "log-driver": "syslog",
      "log-opts": {
        "syslog-address": "udp://1.2.3.4:1111"
      }
    }

    — ativa a coleta remota de logs, enviando-os para o endereço especificado. Funciona somente se o daemon syslog estiver em execução. Aceita opções TCP e UDP. Conexão específica para cada contêiner também é possível. Para isso, um sinalizador especial deve ser definido ao iniciar o Docker (--log-opt syslog-address=ADDRESS).

  • "userns-remap": "Your_User" — previne a elevação de privilégios (privilege escalation), isolando o espaço de nomes para um usuário específico.

Segurança do nível de transporte

O acesso ao daemon Docker (se o acesso remoto for necessário) deve ser restrito apenas a usuários com credenciais de cliente TLS.

Plugins de autorização

Defina quais usuários têm permissão para executar quais comandos e crie um plugin de autorização correspondente para o Docker. Em seguida, inicie o daemon Docker e adicione o plugin:

dockerd --authorization-plugin=PLUGIN_ID

Para mais informações sobre a criação de plugins de autorização, consulte documentação.

Opções do daemon

O daemon Docker opera com um conjunto de opções padrão.

  • --live-restore — esta opção ajuda a reduzir o tempo de inatividade dos contêineres durante o desligamento ou reinício do sistema. Facilita a aplicação de patches ou atualizações com parada mínima;
  • --userland-proxy=false — quando hairpin NATs estão disponíveis ou em uso, o proxy no espaço do usuário torna-se um serviço redundante, que apenas aumenta o número de vetores de ataque possíveis;
  • --no-new-privileges — impede que os contêineres adquiram privilégios adicionais através de suid ou sguid;
  • --seccomp-profile /path/to/profile — se você possui seu próprio perfil seccomp, pode aplicá-lo usando esta flag. Saiba mais sobre Seccomp e Docker aqui.

Configuração de contêineres e arquivos de build

Criando usuário

Certifique-se de que um usuário foi criado para o contêiner e execute-o sob esse usuário (NÃO execute o contêiner como root).

Acesso remoto

Proíba o acesso remoto ao daemon. Se isso for necessário, proteja-o com certificados.

Isolar o namespace de usuário

É especialmente importante garantir que o namespace de usuário no Docker esteja isolado, uma vez que, por padrão, ele é compartilhado com o namespace do host. Em alguns casos, isso pode ser explorado para aumentar privilégios ou até mesmo para sair do contêiner. O espaço de nome do usuário pode ser isolado editando o arquivo de configuração (como descrito acima na seção 'Arquivo de configuração do Docker'). A menção adicional desse problema aqui se deve à sua importância.

Healthchecks

O healthcheck (verificação de saúde) é uma ferramenta poderosa que permite monitorar a integridade do contêiner. Ele é configurado no Dockerfile usando a instrução HEALTHCHECK. Os healthchecks garantem que o contêiner esteja funcionando corretamente. No exemplo abaixo, a verificação de saúde retorna 0 se o servidor estiver funcionando e 1 se ele 'falhar':

HEALTHCHECK CMD curl --fail http://localhost || exit 1

SELinux

Se o SELinux for suportado pelo sistema operacional do host, crie ou importe uma política SELinux e execute o Docker no modo daemon com o SELinux ativado:

docker daemon --selinux-enable

Nesse caso, os contêineres Docker podem ser executados com opções de segurança, por exemplo:

docker run --interactive --tty --security-opt label=level:TopSecret centos /bin/bash

Interfaces de rede

Por padrão, o Docker escuta todas as interfaces de rede. Como na maioria dos casos o tráfego é esperado apenas em uma delas, essa abordagem aumenta injustificadamente o risco de ataques. Portanto, ao iniciar um contêiner, você pode vincular suas portas a interfaces específicas no host:

docker run --detach --publish 10.2.3.4:49153:80 nginx

Versões em cache das imagens

Ao baixar imagens, certifique-se de que o cache local corresponde ao conteúdo do repositório. Caso contrário, você pode obter uma versão desatualizada da imagem ou uma imagem contendo vulnerabilidades.

Ponte de rede

Modelo de rede padrão, docker0, vulnerável a ataques de ARP-spoofing e MAC-flooding. Para resolver esse problema, crie uma ponte de rede de acordo com suas especificações, como descrito aqui.

Aviso sobre o socket do Docker

Nunca exponha o socket do Docker dentro do contêiner. Caso contrário, o contêiner terá a capacidade de executar comandos do Docker e, consequentemente, interagir com o sistema operacional do host e controlá-lo. Não faça isso.

Configuração do Docker Enterprise

Docker Trust

O Docker Trust permite gerar chaves com as quais é possível verificar a integridade criptográfica das imagens. As chaves do Docker Trust podem ser usadas para assinar imagens com chaves privadas, que são verificadas por chaves públicas no Notary Server. Mais informações — aqui. A ativação do Docker Trust no Enterprise Engine é descrita detalhadamente na neste segmento da documentação.

Escaneamento de vulnerabilidades

O Docker Enterprise possui um scanner de vulnerabilidades integrado que permite baixar uma base de CVEs para escaneamento offline de vulnerabilidades nas imagens. A escaneamento regular das imagens ajuda a torná-las mais seguras: o usuário recebe imediatamente avisos sobre vulnerabilidades detectadas. Para saber mais sobre como fazer isso, consulte aqui.

Nota do tradutor.: Existem também scanners de vulnerabilidades Open Source nas imagens do Docker, cujos exemplos podem ser encontrados no final do material.

Integração LDAP e UCP

O Universal Control Plane pode ser integrado ao LDAP. O resultado será um sistema de autenticação simplificado, evitando a duplicação desnecessária. Para saber mais sobre isso, leia o artigo Integrar-se a um diretório LDAP.

Outros materiais

Mais informações sobre as melhores práticas de segurança do Docker podem ser encontradas em docs.docker.com. Também recomendamos baixar os testes do Center for Internet Security para Docker.

Bônus do tradutor

Como um complemento lógico a este artigo, publicamos uma lista de 10 utilitários Open Source populares para segurança no Docker. Foi emprestado de outro artigo (escrito por Bill Doerrfeld do Doerrfeld.io).

NB: Saiba mais sobre muitos dos projetos mencionados aqui no artigo “33+ ferramentas para segurança do Kubernetes».

  1. Docker Bench for Security — o script já mencionado no início do artigo que verifica se os contêineres Docker estão em conformidade com as práticas recomendadas de segurança.

    Segurança para contêineres Docker

  2. Clair — provavelmente a ferramenta mais popular para análise estática de vulnerabilidades em contêineres. Utiliza inúmeras bases de dados de vulnerabilidades CVE (incluindo rastreadores de principais distribuições Linux, como Red Hat, Debian, Ubuntu). Oferece API para desenvolvedores e uma maneira simples de estender funcionalidades (por meio da adição de “drivers”). É utilizada no popular registro público de imagens de contêiner, Quay.io.
  3. Cilium — uma solução para garantir segurança de rede a nível do kernel, baseada na tecnologia de filtragem de pacotes de rede BPF.
  4. Anchore — uma ferramenta para analisar o conteúdo de imagens em busca de vulnerabilidades de segurança com base na CVE. Além disso, permite aplicar políticas personalizadas (com base em diferentes dados, incluindo listas brancas/negras, conteúdo de arquivos, etc.) para avaliação da segurança dos contêineres.
  5. OpenSCAP Workbench — todo um ecossistema para criar e manter políticas de segurança em diferentes plataformas. Para verificação de contêineres, oferece a ferramenta oscap-docker.
  6. Dagda — uma ferramenta para escanear contêineres Docker em busca de vulnerabilidades, trojans, vírus e malware. Os bancos de dados CVE incluem verificações de dependências da OWASP, a base Red Hat Oval, e o repositório de exploits Exploit Database.
  7. Notary — um framework para assinatura de imagens Docker, originalmente criado na Docker Inc (e depois transferido para desenvolvimento na CNCF). Seu uso permite delegar funções e distribuir responsabilidades nos contêineres, bem como verificar a integridade criptográfica das imagens.
  8. Grafaes — API para metadados, projetada para gerenciar políticas de segurança internas. Por exemplo, permite melhorar o funcionamento dos scanners de segurança de contêineres. O Shopify utiliza essa API para gerenciar os metadados de suas 500 mil imagens.
  9. Sysdig Falco — uma ferramenta para Kubernetes que monitora o comportamento do sistema: atividade em contêineres, em hosts, na rede. Permite configurar verificações contínuas na infraestrutura, detecção de anomalias e envio de alertas para quaisquer chamadas de sistema Linux.
  10. Banyanops Collector — mais uma ferramenta para análise estática de imagens de contêineres Docker. Permite 'espiar' os arquivos da imagem, coletando os dados necessários, aplicando as políticas apropriadas, etc.

Outra boa seleção de recomendações práticas sobre como tornar o Docker mais seguro pode ser encontrada em este artigo a empresa Aqua Security. Muitos de seus conselhos se sobrepõem aos já mencionados acima, mas há outros. Por exemplo, os autores sugerem organizar a monitorização da atividade nos contêineres e indicam o que prestar atenção ao usar o Docker Swarm.

Para aqueles que desejam mergulhar ainda mais profundamente neste assunto, no ano passado foi publicada uma livro "Docker Security: Quick Reference»", cujos trechos estão disponíveis gratuitamente aqui.

Finalmente, para uma experiência prática com alguns aspectos de segurança do Docker: perfis Seccomp e uso de capabilities do kernel Linux em contêineres — é possível realizar os correspondentes trabalhos laboratoriais no recurso Play with Docker* — veja a seção 'Segurança'.

Segurança para contêineres Docker

* Sobre este recurso, nós falamos falamos há dois anos, e em novembro de 2018, ocorreu uma história bastante interessante (do ponto de vista de segurança) com ele. Em resumo, especialistas da CyberArk Software Ltd. conseguiram hackeá-lo: conseguiram executar comandos fora dos contêineres, ou seja, no sistema host. Uma bela ilustração do problema de segurança no Docker, não é? Para todos os detalhes do ocorrido, leia aqui.

P.S. do tradutor

Confira também em nosso blog:

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster