Como executo playbooks do Ansible Azure, evitando o armazenamento de credenciais em arquivos?

13

fundo

  1. Usamos o Ansible para provisionar e gerenciar a infraestrutura do Azure. No momento, executamos o Ansible "manualmente", ou seja, executamos playbooks manualmente para várias tarefas automatizadas. Nenhuma infraestrutura de IC.
  2. Provavelmente não é relevante, mas gerenciamos nosso inventário usando script dinâmico azure_rm.py.
  3. Somos encorajados a ser o mais seguro possível, ou seja,
    1. Não armazene senhas do Vault em ~/.vault_passou em nenhum arquivo local
    2. Não armazene segredos do Azure em ~/.azure/credentials
    3. Não guarde nada seguro .bashrc.

Nesse cenário, estou tendo problemas para apresentar uma estratégia coerente para garantir que meus playbooks possam acessar os segredos do Azure, seguindo as diretrizes acima.

Questão

Como evitar o armazenamento de credenciais do Ansible Vault e do Azure em arquivos, garantindo ainda que meus playbooks possam acessá-los?

O que eu tentei

Até agora, criei um script de wrapper que

  1. pede ao usuário a senha do Vault
  2. Usa isso para descriptografar um script do Vaulted Shell
  3. Avalia o script, que carrega variáveis ​​de ambiente do Azure no ambiente;
  4. Executa o manual sobre o ambiente que foi definido.

Alguma solução melhor (mais elegante, menos complicada, mais "Ansible") por aí?

Vish
fonte
O que mais te incomoda nesse fluxo de trabalho?
Konstantin Suvorov
11
@KonstantinSuvorov, principalmente, é o número de pontos que eu preciso pular para alcançar o que parece (pelo menos para mim) um requisito bastante comum em empresas de conformidade pesada.
Vish

Respostas:

8

Senha do Vault

Primeiro de tudo, você deve se familiarizar com o fato de que o arquivo de senha do cofre pode ser um script executável. Nesse caso, o Ansible o executa e espera receber a senha como saída.

Por exemplo, você pode usar gpg-agentou keychainarmazenar sua senha real e desbloqueá-la quando necessário. Leia mais nesta postagem do blog: https://benincosa.com/?p=3235

Se você é um pouco paranóico, pode adicionar uma notificação quando seu script de senha é chamado, assim:

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

Esse script de senha do cofre usa key.gpgcomo chave de cofre real e também mostra a notificação pop-up (para MacOS) com o nome do processo pai quando o script é usado. Os caches do agente Gpg desbloqueiam a senha por algum tempo, portanto não há necessidade de digitar a senha sempre que você iniciar o playbook.

Basta definir vault_password_file = ./vault_pass.shno seu ansible.cfg.

Meio Ambiente

Você disse que usa azure_rm.pycomo script de inventário dinâmico. Isso significa que você precisa definir credenciais em suas variáveis ​​de ambiente antes de iniciar o ansible-playbook para que ele possa usá-las.

Você pode criar dois arquivos:

secure_env (criptografado com cofre):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (texto simples):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

Quando você abre um novo terminal para executar suas tarefas de automação, é necessário executar:

source set_env

Neste momento, o bash avalia set_enve secure_env(descriptografado via ansible-vault). Após esse comando, você tem credenciais do Azure definidas para o shell atual, para executar playbooks como de costume:

ansible-playbook provision-my-azure-instances.yml

Portanto, usando essas duas abordagens, você pode armazenar key.gpge secure_envem seu repositório; depois, na nova chamada do terminal source set_envuma vez, digite a senha gpg uma vez (para desbloquear o uso futuro de key.gpg); em seguida, ligue ansible-playbookquantas vezes quiser sem nenhuma senha.

Konstantin Suvorov
fonte
Obrigado pela resposta. Deixe-me tentar isso durante a semana.
Vish
Portanto, a principal vantagem sobre minha abordagem original é que ela usa GPG - o que traz benefícios de armazenamento em cache - certo? A abordagem do ambiente é semelhante à que eu criei.
Vish
11
No seu OP, entendo que você usa o wrapper toda vez que executa o playbook. Com a sourceabordagem, você define o ambiente uma vez por sessão do terminal e pode usar toda a gama de ferramentas separadamente: manuais de instruções, scripts de inventário, cli do azure, sem nenhum wrapper.
Konstantin Suvorov
Ah entendi. Vou apresentar isso ao meu time. Aceitando sua resposta como uma solução mais conveniente. Obrigado pela pesquisa e explicação! Além disso, gostei do seu blog :)
Vish
O principal benefício do uso do GPG (ou um chaveiro no macOS ou Linux) é que cada membro da equipe possui sua própria autenticação para desbloquear uma chave privada exclusiva para eles. Essa chave é usada para desbloquear a senha do Ansible Vault, que é um segredo compartilhado. Você precisa girar todos os seus segredos se alguém deixar a equipe de qualquer maneira, incluindo a senha do Ansible Vault, mas pelo menos as senhas do GPG / chaveiro não precisam ser alteradas.
RichVel 30/01/19
2

Leia https://docs.ansible.com/ansible/2.4/vault.html Desde o Ansible 2.4, pode-se usar --vault-id @prompt.

Criptografe um arquivo usando o ansible-vault:

ansible-vault encrypt /path/to/encrypted/file

Execute o manual e ele resultará em:

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

Existem várias opções para descriptografar arquivos, incluindo @prompt:

ansible-playbook some-playbook --vault-id @prompt

solicitará:

Vault password (default):

Depois que a senha do cofre for inserida, o manual deverá ser bem-sucedido.

030
fonte
11
Lendo a página, parece que há uma solução lá, mas incapaz de descobrir usando apenas o link. Você poderia por favor elaborar?
Vish
Obrigado por elaborar. Na verdade, estou exigindo solicitar ao usuário uma senha do cofre - usando a --ask-vault-passopção mais antiga . E não entendo como substituí-lo --vault-idresponderia à questão maior de um melhor fluxo de trabalho.
Vish
Quando você me encaminhou para o link que eu queria ver uma opção intrigante: ansible-playbook --vault-id my-vault-password.py. Eu pensei que talvez você tivesse uma solução usando um script python :) Eu também estou pensando um pouco sobre esse.
Vish