Onde colocar a senha do ansible-vault

26

Planejamos usar o cofre ansible em nosso projeto para evitar o vazamento de senhas ou chaves no git.

A idéia é colocar todos os nossos dados confidenciais em um arquivo simples e depois criptografá-lo com o ansible-vault usando uma senha antes de enviar para o git.

Para descriptografar o arquivo, temos que passar a senha do cofre para ansible, estou pensando em três possibilidades:

  • Armazene-o dentro de uma variável de ambiente do servidor
  • Passe-o como uma opção para o comando ansible-playbook
  • Armazene-o em um arquivo sem versão.

Existe alguma outra opção, que é a melhor (e segura) maneira de armazenar a senha do ansible-vault, a documentação do ansible best practice não está dizendo nada sobre isso.

tempestade
fonte
Discussão muito relevante: danielsomerfield.github.io/turtles
Xiong Chiamiov
Existem algumas boas respostas aqui: devops.stackexchange.com/questions/3806/…
Vish

Respostas:

13

A idéia é colocar todos os nossos dados sensíveis [...]

O significado de "todos" nesta frase deve ser analisado com muito cuidado antes de implementar a solução que você planeja.

O cofre Ansible é uma ferramenta muito útil, mas deve ser usada apenas para armazenar segredos que são:

  1. Especificamente necessário para implantações ansíveis
  2. Facilmente tornado inútil para os proprietários que deveriam desconhecer eles, mas que podem "lembrá-los" ilegítimamente (normalmente funcionários não autorizados)

O segundo ponto é crítico.

Muitas pessoas, e potencialmente toda a equipe do DevOps, terão acesso à senha do Ansible Vault e, portanto, a todos os segredos.

Portanto, para todos os segredos armazenados no cofre, deve-se manter uma condição para a qual uma pessoa ou máquina com acesso não autorizado a eles deve ser incapaz de usá-los, se assim o desejar.

Em termos concretos, se você usar o ansible para implantar um banco de dados e seus usuários, poderá armazenar as senhas no cofre, mas terá que ter muito cuidado (e provavelmente considerar outra solução) se esse serviço estiver disponível na Internet e sem a necessidade de autenticação VPN!

Os usuários (DevOps) expostos ao segredo devem ser incapazes de usar senhas "lembradas" se uma barreira de segurança lhes for imposta (por exemplo, o acesso VPN revogado). Além disso, o acesso ao repositório de código-fonte (onde o cofre está armazenado) também deve ser revogado antes que as senhas sejam alteradas.

Sob essas condições, o cofre ansible é uma ferramenta muito útil.

Tentar armazenar um segredo que pudesse ser usado por qualquer pessoa ou máquina na Internet no cofre seria um erro (por exemplo, credenciais de VPN dos usuários).

Existe alguma outra opção, que é a melhor (e segura) maneira de armazenar a senha do ansible-vault

Nas condições do parágrafo anterior, acho que uma boa prática seria:

  1. Armazene a senha do cofre em um cofre seguro externo (algo como o Vault da HashiCorp ou qualquer SaaS para gerenciamento de credenciais)
  2. Permitir acesso ao item do cofre externo ao DevOps (eles precisarão da senha para teste) e ao sistema de CI / CD ou controlador ansible
  3. Mantenha uma convenção para usar segredos ! Você não poderá revisar alterações nos segredos e não poderá grep para variáveis ​​ansible nos arquivos de segredos! Portanto, seja cuidadoso desde o início. Uma boa convenção é nomear todas as variáveis ​​armazenadas no cofre ansible com um secret_prefixo. Quando você verá algo como:

    postgres.yml:

    postgres_password: "{{ secret_postgres_password }}"
    

    você saberá que o valor é armazenado no cofre ansible.

Vincenzo Pii
fonte
1
Bom argumento sobre o armazenamento da senha do Ansible Vault em algum lugar mais seguro (HashiCorp Vault ou SaaS, como o AWS Secrets Manager). No entanto, ele ainda precisa ser rotacionado (alterado) se alguém deixar a equipe, pois eles tiveram acesso a ela, mesmo que brevemente. Isso pode ser atenuado talvez usando cofres separados (dev, test, production) ou seja, arquivos secretos no YAML. O Ansible 2.4+ também permite que você especifique senhas diferentes para esses arquivos usando um 'ID do cofre' - página de documentos
RichVel
1
O Ansible 2.3 introduziu um recurso que criptografa apenas os valores nos arquivos YAML, não o arquivo inteiro - é mais simples de manter do que a convenção mais antiga mencionada no ponto 3 no final desta resposta.
RichVel 03/02
7

Planejamos usar o cofre ansible em nosso projeto para evitar o vazamento de senhas ou chaves no git.

Como você ainda não implementou nada, você pode reconsiderar isso. O uso de um sistema como o Ansible Vault possui várias desvantagens de segurança:

  • não há trilha de auditoria de quem o acessou
  • quando um funcionário sai, é fácil para eles levar a loja secreta com ele
  • quando um funcionário sai, remover o acesso significa alterar a senha e redistribuí-la para todos os outros
  • uma senha do cofre Ansible comprometida pode ser usada para sempre em uma versão antiga do cofre, armazenada no controle de versão
  • segredos tem que ser estático

Um sistema potencialmente muito mais seguro, embora mais complexo, que não tenha essas desvantagens é usar o Hashicorp Vault para armazenar seus segredos. Você ainda pode extrair valores dele quase tão facilmente quanto no Ansible vault usando https://github.com/jhaals/ansible-vault .

Você precisa gerenciar a autenticação no Hashicorp Vault, no entanto, e essa é a questão da tartaruga . Para humanos, acho que a melhor solução é solicitar uma senha periodicamente e expirar o token após um curto período de tempo; para máquinas, use o back - end de autenticação da AWS ou similar. Você nunca pode se livrar totalmente da necessidade de autenticação em algum lugar, mas pode dificultar o acesso de um invasor a ela.

Agora, se configurar e administrar um servidor secreto é demais para você, certamente você pode usar o Ansible Vault. Por que armazenar a senha em todas as máquinas individuais? Para uso interativo, basta solicitar a senha e os usuários podem armazená-la no gerenciador de senhas de sua escolha. O iTerm no OS X possui um gerenciador de senhas que se integra ao Keychain.app que torna isso particularmente fácil por lá.

Xiong Chiamiov
fonte
2
A melhor maneira de usar o cofre ansible é não usá-lo. Obrigado por apontar isso!
tempestade
1
Para organizações de pequeno a médio porte, recomendo procurar um gerenciador de segredos baseado na nuvem, como o AWS Secrets Manager - isso é muito menos trabalhoso do que executar um cluster altamente disponível para o HashiCorp Vault, mas uma grande melhoria na segurança obtida com o Ansible Vault, incluindo auditoria e controle de acesso granular. Obviamente, você acaba dependendo desse serviço, mas pode ser encapsulado com alguma codificação de aplicativo e trabalho Ansible. O principal benefício é que alguns segredos não precisam ser gerenciados pela Ansible, por exemplo, senhas de banco de dados - apenas deixe o aplicativo ficar em segredo do gerenciador de segredos.
RichVel 30/01
3

Isso vai muito para quais políticas internas você possui ao lidar com dados confidenciais.

Gostaria de contar minha abordagem e explicar o que vejo como prós e contras. Eu mantenho a senha do Ansible Vault em um arquivo na máquina de controle e tenho uma variável de ambiente apontando para ela:

export ANSIBLE_VAULT_PASSWORD_FILE=/deep/dark/place

Tenho isso na minha estação de trabalho (como preciso testar e desenvolver playbooks), alguns colegas também o têm e, é claro, o temos na máquina de controle Ansible principal.

Prós:

  • não em um local / repositório compartilhado (é um arquivo sem versão, como você diz)
  • não é necessário saber sua senha do cofre Ansible para executar uma peça (isso está sob a condição de que você tenha uma ferramenta de IC, por exemplo, Jenkins, onde é possível iniciar facilmente as cartilhas)

Contras:

  • não é fácil girar a senha
  • todo mundo que trabalha com seus playbooks precisa tê-lo em sua estação de trabalho

Os contras têm mitigações, mas, novamente, depende das políticas e regras que você adotou nas operações do dia a dia.

13dimitar
fonte
1
Boa combinação .. verifique a outra resposta, que pode ser do seu interesse.
tempestade
0

Dê uma olhada neste projeto para gerenciar suas senhas de criptografia de cofre ansible https://github.com/Smile-SA/ansible-vault-manager

Ele lida com várias plataformas de armazenamento de chaveiros com plug-ins (por enquanto, apenas o AWS SSM implementado). Além disso, a integração com um projeto Ansible atual é muito fácil ...

gillg
fonte
Seria útil se você tornar mais fácil o concreto, em vez de adicionar algo genérico. Li o README da página do github, mas você poderia alterar a resposta para que ela contenha um exemplo claro? Eu gostaria de experimentá-lo.
030