Páginas

quinta-feira, 15 de outubro de 2020

  



Executando containers Docker em produção com segurança


Segurança é Tudo não é mesmo? Sabemos que hoje mesmo, com todos os avanços tecnológicos, não estamos isentos de sermos vitimas de algum ataque que mau sabemos de onde veio, nossos containers não escapam dessa lógica perversa, portanto todo cuidado é pouco quando estamos administrando containers Docker


Kernel exploits (exploração do kernel)

Como não acontece quando se usa uma Virtual Machine, ao usar containers o kernel é compartilhado entre todos os containers e o host, assim sendo, aumenta a importância de qualquer vulnerabilidade que explore o kernel.

 

Denial-of-service attacks (ataque de negação de serviço)

Como todos os containers compartilham os recursos do kernel, se ocorrer de um container poder monopolizar o acesso a alguns recursos, tal como memória, ou até IDs de usuário (UIDs), o que pode ocasionar a falta recursos para outros containers, ocasionando em uma negação de serviço (DoS).

 

Container breakouts (invasão de container)

Um possível invasor que possui acesso a um container não consegue acessar os outros containers ou ao host. Se por acaso você usa root no container, você será root no host.

 

Poisoned images (imagens “envenenadas”)

Como você pode garantir que as imagens que você está utilizando são realmente seguras, não foram adulteradas, e vêm da fonte que elas afirmam vir?

 

Application secrets (segredos de aplicações)

Quando um container acessa um banco de dados ou a um serviço, será muito provável que credenciais serão exigidas, tal como um token ou mesmo um usuário e senha. Se um possível invasor obtiver acesso ao container, ele terá acesso a todos esses dados.

 

Algumas medidas de proteção 

Um modo de obter o hardening de containers docker em produção é tornando-os “imutáveis”, ou seja, no modo read only (somente leitura). Outros métodos para executar containers de forma segura incluem minimizar o attack surface e aplicar tanto o procedimento padrão de hardening do Linux, como os que são específicos a um ambiente de container.


Docker modo read only

Um container pode ser executado no modo somente leitura usando a flag –read-only ao iniciá-lo. Isso impede qualquer processo de escrita para o sistema de arquivos. Qualquer tentativa resulta em erro. A execução dessa infraestrutura imutável também tem relação com outras melhores práticas recomendadas para pipelines de deploy de software.

Embora a imutabilidade evite a execução de qualquer script malicioso ou alterações que possam acontecer através de vulnerabilidades presentes em outros softwares rodando dentro do container docker, até que ponto esse modo é viável para aplicativos no mundo real? Aplicativos que geram log de arquivos e usam bancos de dados, por exemplo, necessitam de escrita.

 

Sistema de log

Uma solução possível para o log seria usar um sistema de log centralizado como o Elasticsearch/Logstash/Kibana (ELK) para que todos os logs sejam coletados em um local central, possivelmente outro container, que não seja acessado diretamente pelo usuário final. Outra alternativa é exportar os logs para fora do container docker usando a flag –log-driver ao iniciar o container.

Para aplicativos que precisam de acesso de gravação para diretórios temporários como /tmp, uma solução é montar um sistema de arquivos temporário no container para esses diretórios.

Os bancos de dados não são acessados diretamente pelo usuário final, portanto, o risco é menor. No entanto, isso não impede ataques, a menos que os aplicativos voltados para o usuário contemplem o hardening.

Nos casos em que é inevitável ter um sistema de arquivos gravável, o Docker fornece auditoria e reverte as alterações. O sistema de arquivos em um container Docker é empilhado como uma série de camadas. Quando um novo container docker é criado, uma nova camada é adicionada na parte superior onde pode ser gravada.

O driver de armazenamento docker oculta a ação nos bastidores e o apresenta como um sistema de arquivos regular para o usuário. As gravações criadas em um container docker em execução são feitas nesta nova camada. Isso geralmente é chamado Copy-On-Write (COW).

 Alterações de configuração esperada são fáceis de detectar em um container docker. O comando ‘docker diff‘ exibe as alterações feitas no sistema de arquivos – sejam eles arquivos adicionados, removidos ou modificados.

 

Outras boas recomendações para proteger containers docker em produção

Executar uma imagem mínima como Alpine Linux, que foi projetada com tendo a segurança em mente. O kernel é corrigido com uma porta não oficial do grsecurity. O grsecurity é um conjunto de melhorias de segurança para o kernel Linux, que inclui controle de acesso e eliminação de vulnerabilidades baseadas em corrupção de memória, minimizando as formas pelas quais um sistema pode ser atacado.

Reforço de limites de recursos (CPU/RAM) para evitar ataques DoS

Configuração de limites de threads e processos no sistema operacional

Aplicação de procedimentos padrão de hardening do kernel Linux como o sysctl hardening

Execução de um único aplicativo por container. Isso é recomendado porque reduz a o attack surface, ou seja, a quantidade de vulnerabilidades possíveis para um determinado container é limitada àquelas que podem estar presentes no aplicativo desse container.

 

Segurança é tudo!




Como fazer login no Docker Hub, fazer o Docker pull e o Docker push

 

Nesse artigo vamos aprender como logar no repositório do Docker Hub, para que você possa enviar suas imagens e também se assim quiser baixa las posteriormente para o seu host, para isso escolha uma imagem a qual você queira fazer o upload

root@ubuntu:~# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

rfnc/apache 1.0 146941fa2166 7 days ago 221MB

ubuntu/rfnc latest 9140108b62dc 2 weeks ago 72.9MB

ubuntu latest 9140108b62dc 2 weeks ago 72.9MB

rfnc/ubuntu latest 9140108b62dc 2 weeks ago 72.9MB

ubuntu 14.04 df043b4f0cf1 4 weeks ago 197MB

debian latest f6dcff9b59af 5 weeks ago 114MB

ubuntu 19.10 2f6c85efea61 4 months ago 72.9MB

ubuntu 14.10 a8a2ba3ce1a3 5 years ago 194MB

 

Renomeie sua imagem como no exemplo abaixo, lembrando que você precisa sempre usar o IMAGE ID, e o nome da sua imagem sempre deverá ficar no formato, seu usuário no Docker Hub/nome da imagem que você queira atribuir, como no exemplo abaixo, renomeei a imagem debian para rfnc/debian

 root@ubuntu:~# docker tag f6dcff9b59af rfnc/debian


Veja a nova imagem

 root@ubuntu:~# docker images | grep debian

debian latest f6dcff9b59af 5 weeks ago 114MB

rfnc/debian latest f6dcff9b59af 5 weeks ago 114MB

 

 Criado seu login no site do Docker Hub, agora use o seguinte comando para logar no repositório, use seu ID e senha

 root@ubuntu:~# docker login

Authenticating with existing credentials...

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

 

 Agora use o seguinte comando para fazer o upload da sua imagem para o repositório do Docker Hub

 root@ubuntu:~# docker push rfnc/debian

The push refers to repository [docker.io/rfnc/debian]

4ef54afed780: Mounted from library/debian

latest: digest: sha256:2f53b5f0101a2f296c632c28010df43575b8ced96615b4b0b370d52a7004f473 size: 529

 

 Vá até o site do Docker Hub e verifique se sua imagem está lá no repositório




 Agora remova a sua imagem do seu host com o comando abaixo

 root@ubuntu:~# docker rmi -f rfnc/debian

Untagged: rfnc/debian:latest

Untagged: rfnc/debian@sha256:2f53b5f0101a2f296c632c28010df43575b8ced96615b4b0b370d52a7004f473

 

 Como podem ver a imagem rfnc/debian não está mais presente

 root@ubuntu:~# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

rfnc/apache 1.0 146941fa2166 7 days ago 221MB

ubuntu latest 9140108b62dc 2 weeks ago 72.9MB

rfnc/ubuntu latest 9140108b62dc 2 weeks ago 72.9MB

ubuntu/rfnc latest 9140108b62dc 2 weeks ago 72.9MB

ubuntu 14.04 df043b4f0cf1 4 weeks ago 197MB

debian latest f6dcff9b59af 5 weeks ago 114MB

ubuntu 19.10 2f6c85efea61 4 months ago 72.9MB

ubuntu 14.10 a8a2ba3ce1a3 5 years ago 194MB

 

Agora use o seguinte comando para fazer o download da sua imagem do repositório do Docker Hub

root@ubuntu:~# docker pull rfnc/debian

Using default tag: latest

latest: Pulling from rfnc/debian

Digest: sha256:2f53b5f0101a2f296c632c28010df43575b8ced96615b4b0b370d52a7004f473

Status: Downloaded newer image for rfnc/debian:latest

docker.io/rfnc/debian:latest

 

 Como podem ver a imagem agora está presente no host

root@ubuntu:~# docker images | grep debian

debian latest f6dcff9b59af 5 weeks ago 114MB

rfnc/debian latest f6dcff9b59af 5 weeks ago 114MB

 

Entre no container pra se certificar que está tudo certo

root@ubuntu:~# docker run -ti rfnc/debian

root@9d9b99b02d04:/# ps -ef

 

Como podem ver o procedimento é bem simples e descomplicado