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

Blog

Modelos de ponta encontraram as vulnerabilidades. Só o atacante encontrou as cadeias.

A análise estática encontrou as falhas, mas só os testes de ataque em aplicações ativas provaram como elas poderiam ser encadeadas para causar invasões. Uma comparação entre Evo COS, Claude Security e Claude Code Security.

feature insights context
Blog

Os ataques autônomos já chegaram. A defesa precisa acompanhar o ritmo.

Os atacantes autônomos estão reduzindo o tempo disponível para a defesa. Saiba como a descoberta, a correção, a validação e a prevenção contínuas ajudam as equipes de segurança a acompanhar esse ritmo.

Blog

Por que agentes de programação com IA continuam criando falhas de controle de acesso

Agentes de programação com IA podem gerar uma lógica de autorização que compila e passa pela revisão, mas permite que um tenant acesse os dados de outro. Saiba por que é difícil detectar falhas de controle de acesso e como evitá-las.