Como manter os secrets do Docker seguros (mesmo sem usar Kubernetes)
Marcelo Oliveira
24 de agosto de 2022
0 minutos de leituraSistemas 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:
O comando docker inspect
Arquivos de log de eventos
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

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:
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.
Agora, use o comando docker secret create para criar um novo secret com o arquivo criado na etapa anterior:
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 (-):
Esse comando gera uma saída como a mostrada abaixo:
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:
O resultado mostra os secrets que você criou no Docker Swarm:
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:
Como adicionar ou remover secrets de um serviço existente
Você pode remover um secret de um serviço existente:
Ou adicionar um secret a um serviço em execução:
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:
Soluções de provedores de nuvem (AWS Secrets Manager, GCP Secret Manager etc.)
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.



