Skip to main content

Como manter os secrets do Docker seguros (mesmo sem usar Kubernetes)

Escrito por

Marcelo Oliveira

hero docker secrets

24 de agosto de 2022

0 minutos de leitura

Sistemas distribuídos em contêineres reúnem aplicações, recursos, serviços, bancos de dados e outros artefatos. Para funcionar corretamente, esses componentes muitas vezes precisam de informações confidenciais, como chaves de usuário, senhas, chaves de API e certificados.

O gerenciamento de secrets é essencial para lidar adequadamente com informações confidenciais. Em implantações do Kubernetes, é comum usar o tipo de recurso Secrets integrado à plataforma e os controles de RBAC associados. Mas e se você não estiver implantando no Kubernetes? Muitas organizações simplesmente não precisam de todos os recursos ou não querem assumir a complexidade de operar o Kubernetes, mas ainda precisam evitar o risco de vazamento de dados ou perda de senhas. Felizmente, o orquestrador Swarm integrado ao Docker oferece uma solução.

Este artigo aborda o gerenciamento de secrets no Docker, explorando as práticas recomendadas e os possíveis riscos envolvidos. Também apresenta um exercício simples para criar e listar secrets do Docker, além de adicioná-los e removê-los de um serviço. Pressupõe-se que você tenha conhecimentos básicos sobre o runtime de contêineres do Docker e seu orquestrador Swarm.

Como proteger os secrets do Docker

Sempre que você envia secrets ou dados confidenciais pela sua organização, há o risco de vazamento de dados ou perda de senhas. Ao trabalhar em um projeto Docker que exige o tratamento de informações confidenciais, como senhas, chaves privadas, tokens e chaves de API, você deve definir uma forma segura de armazenar e transmitir esses secrets aos contêineres.

Uma das piores práticas é deixar dados confidenciais no código-fonte. Além dos riscos de segurança, inserir secrets diretamenteno código significa que você terá que recriar a imagem sempre que eles mudarem.

Outra prática ruim é adotar uma abordagem “manual” para lidar com informações importantes, como senhas e chaves SSH, deixando secrets no disco local. Lembre-se de que programas não autorizados ou maliciosos também podem ler seus arquivos.

Muitas pessoas desenvolvedoras recorrem a variáveis de ambiente para armazenar dados confidenciais. Isso pode funcionar em alguns cenários, mas não é recomendado para contêineres Docker. Variáveis de ambiente são ainda menos seguras do que arquivos e estão vulneráveis de várias outras maneiras, como:

Por exemplo, uma aplicação pode despejar o context em um log durante o tratamento de uma exceção, e esse log pode acabar incluindo os valores confidenciais das variáveis de ambiente.

Usar um gerenciador de secrets é muito melhor do que as opções anteriores, pois oferece um local centralizado para lidar com secrets no Docker Swarm. Esse gerenciador ajuda a proteger o acesso às suas aplicações, serviços e recursos de TI, oferecendo um serviço prático para armazenar, gerenciar e recuperar secrets. Entre eles estão credenciais de bancos de dados de API, chaves, senhas, chaves privadas SSH, certificados SSL e outros dados confidenciais de que uma aplicação precisa durante a execução.

Como o Docker gerencia secrets

Diagrama que mostra uma interface web conectada a um grupo de consenso Raft, com gerenciadores, workers bloqueados, documentos internos, chaves e um app externo.

O diagrama acima mostra que o Docker usa o Raft, um algoritmo de consenso para gerenciar um log replicado em um sistema distribuído e garantir que seus dados permaneçam consistentes em todo o Swarm e em todos os serviços em execução nele. O algoritmo Raft transmite secrets de forma consistente e criptografada para todos os nós gerenciadores.

O diagrama também mostra os nós workers, que são instâncias do Docker Engine dedicadas à execução de contêineres. Os nós gerenciadores distribuem secrets aos contêineres que fazem parte do serviço com acesso à chave.

Os secrets do Docker funcionam como um cofre onde você pode guardar dados confidenciais. Só é possível acessá-los com a chave do cofre, que deve ser obtida nos nós de serviço aos quais você atribuiu a chave.

O serviço de gerenciamento de secrets do Docker faz parte da pilha de orquestração de contêineres e automatiza a proteção desses dados.

Nos serviços do Docker Swarm, os secrets são criptografados tanto quando estão armazenados quanto durante a transmissão.

Os secrets do Docker podem ser gerenciados centralmente e transmitidos com segurança aos contêineres que precisam acessá-los. Cada secret só fica acessível aos serviços que receberam permissão explícita e apenas enquanto o serviço está em execução.

Quando um serviço recebe acesso aos secrets, ele os descriptografa e os compartilha com o contêiner em um sistema de arquivos na memória. Quando a tarefa do contêiner é interrompida, os secrets descriptografados são removidos imediatamente e apagados da memória do nó.

Como gerenciar secrets com a CLI do Docker

A funcionalidade integrada ao Docker permite inserir secrets e controlar detalhadamente quais serviços podem acessá-los e em que circunstâncias podem usá-los.

Neste exercício simples, você vai criar um serviço MySQL com uma senha de root e adicionar as credenciais como secrets.

Como os secrets do Docker só ficam disponíveis para serviços do Swarm, você precisa configurar um Docker Swarm para demonstrá-los. Mas, primeiro, verifique se instalou a interface de linha de comando do Docker (Docker CLI). Se ainda não fez isso, inicialize ou entre no Swarm:

docker swarm init

Swarm initialized: current node (wv4c3hvdwqlssjpaxzvvhy3vj) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-3qizt7vyw8cbpii3nosl8ws7zr1npikrepr0qqh9ad7esucwon-bfxct86tefphzo8xiz8ue0tx6 192.168.65.3:2377

Agora, adicione um secret ao Docker.

Crie um arquivo de texto para armazenar seu secret. O comando a seguir cria o arquivo password.txt com a string this-is-a-mysql-password.

$ echo "this-is-a-mysql-password" > $HOME/password.txt

Agora, use o comando docker secret create para criar um novo secret com o arquivo criado na etapa anterior:

$ docker secret create mysql-password-secret $HOME/password.txt

l1m5jvgcox1l96i6bjbz4dvnt

Observe que a string l1m5jvgcox1l96i6bjbz4dvnt acima representa o ID do secret, não o próprio secret. Portanto, é provável que seja diferente no seu ambiente.

Agora, veja outra forma de usar o comando docker secret create. Aqui, omita o nome do arquivo definindo o último argumento, que representa o arquivo, como o símbolo de menos (-):

$ echo "another-mysql-password" | docker secret create another-mysql-secret -

Esse comando gera uma saída como a mostrada abaixo:

q3bjo7wx4xqr45ma20lk5j2g7

Isso omite o arquivo de onde o secret seria lido. Em seguida, o comando docker secret create lê a entrada padrão another-mysql-password.

Como listar secrets do Docker

Para listar os secrets disponíveis no Docker Swarm, execute o comando docker secret ls:

$ docker secret ls

O resultado mostra os secrets que você criou no Docker Swarm:

ID                          NAME                    DRIVER    CREATED              UPDATED
q3bjo7wx4xqr45ma20lk5j2g7   another-mysql-secret              46 seconds ago       46 seconds ago
l1m5jvgcox1l96i6bjbz4dvnt   mysql-password-secret             About a minute ago   About a minute ago

Como criar um serviço com secrets

Você pode criar um serviço usando um dos secrets criados acima.

Crie o serviço mysql-service e use a flag --secret para dar ao contêiner acesso ao secret another-mysql-secret:

$ docker service create --name mysql-service --secret another-mysql-secret mysql:5.7

Como adicionar ou remover secrets de um serviço existente

Você pode remover um secret de um serviço existente:

$ docker service update --secret-rm another-mysql-secret mysql-service

Ou adicionar um secret a um serviço em execução:

$ docker service update --secret-add mysql-password-secret mysql-service

Ao vincular um secret a um serviço, o Docker cria um arquivo de texto com o nome do secret. Esse arquivo contém uma string que representa o secret e, por padrão, fica no diretório /run/secrets, montado em um sistema de arquivos temporário (TMPFS) dentro do contêiner. No nosso caso, o arquivo fica no caminho /run/secrets/mysql-password-secret. Depois de criado, o secret fica disponível para todos os contêineres desse serviço.

Alternativas externas para gerenciar secrets

Os secrets do Docker são uma ótima solução, mas você também pode considerar delegar essa tarefa a soluções externas de armazenamento de secrets. Isso é especialmente válido se sua organização já tiver experiência e investimentos em uma plataforma específica.

Por exemplo, se sua empresa já usa o Hashicorp Vault e suas aplicações estão integradas a ele, há poucos motivos para migrar para os secrets do Docker — ou do Kubernetes — simplesmente porque eles fazem parte da plataforma. Aproveite os processos, as bibliotecas e a experiência que você já tem com essa solução nos seus serviços.

Algumas alternativas populares para o gerenciamento de secrets incluem:

Mantenha seus secrets seguros

Este artigo apresentou o conceito de secrets e seu gerenciamento no contexto do Docker Swarm e mostrou como o Docker gerencia secrets. Também demonstrou por que usar um gerenciador de secrets é muito melhor do que inserir dados confidenciais diretamente no código, usar variáveis de ambiente ou adotar uma abordagem manual.

A segurança dos dados é um dos pilares de uma governança corporativa eficaz. Com comandos da CLI e uma arquitetura em memória que permite implantar dados secretos com controle detalhado, o Docker oferece ferramentas sólidas de gerenciamento de secrets para ajudar você a implementar corretamente a segurança da informação na sua organização.

Manter os secrets longe de olhares curiosos é uma etapa importante para criar contêineres seguros. O Snyk Code ajuda você a encontrar secrets inseridos diretamente no código, enquanto o Snyk Container e o Snyk Open Source indicam as imagens base e os pacotes mais seguros para seus contêineres. E, quando você estiver pronto para entrar em produção, o Snyk IaC ajuda a reduzir os riscos antes e depois da implantação. Comece gratuitamente hoje mesmo para encontrar e corrigir vulnerabilidades automaticamente no seu código, nas dependências de código aberto, nos contêineres e na infraestrutura de nuvem.

Segurança de contêineres que prioriza os desenvolvedores

O Snyk encontra e corrige automaticamente vulnerabilidades em imagens de contêiner e workloads do Kubernetes.

Leia mais