Proteger e usar segredos com o Ansible Vault

AnsibleBeginner
Pratique Agora

Introdução

O Ansible Vault criptografa variáveis sensíveis para que possam ser armazenadas junto aos playbooks sem expor segredos em texto simples. Um playbook só pode utilizar o valor quando você fornece uma senha válida do vault.

Neste laboratório, você criará uma variável criptografada, observará a falha quando a senha estiver ausente e executará um playbook com sucesso utilizando um arquivo de senha do vault.

Criar um projeto de prática com o Vault

Nesta etapa, você criará um projeto com um inventário, diretório de variáveis de grupo, diretório de playbooks e diretório de relatórios.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars/managed,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF

A variável criptografada residirá em inventory/group_vars/managed, portanto, ela será carregada para o grupo managed como qualquer outro arquivo de variáveis. A diferença é que o Ansible deve descriptografá-la antes do uso.

Criar um arquivo de senha do Vault

Nesta etapa, você criará um arquivo de senha para a automação do laboratório. Em um ambiente de trabalho real, proteja este arquivo cuidadosamente ou utilize um fluxo de trabalho baseado em prompt. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible. Isso mantém os comandos estáveis, mesmo que o LabEx execute cada etapa separadamente.

cd /home/labex/project/rhce-ansible
cat > vault_pass.txt <<'EOF'
labex-vault-pass
EOF
chmod 600 vault_pass.txt

Este arquivo de senha é apenas para o fluxo de trabalho do laboratório. O modo chmod 600 significa que apenas o proprietário pode ler e gravar nele, o que é o hábito mínimo a ser praticado quando um arquivo pode desbloquear segredos.

ls -l vault_pass.txt

Verifique se as permissões são semelhantes a -rw-------. Se o arquivo puder ser lido pelo grupo ou por outros usuários, execute novamente o comando chmod 600.

Criar uma variável criptografada

Nesta etapa, você usará o ansible-vault encrypt_string para criar uma variável criptografada chamada app_secret. O arquivo criptografado pode ser carregado como qualquer outro arquivo de variáveis de grupo. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible. Isso mantém os comandos estáveis, mesmo que o LabEx execute cada etapa separadamente.

cd /home/labex/project/rhce-ansible
ansible-vault encrypt_string --vault-password-file vault_pass.txt 'redhat' --name app_secret > inventory/group_vars/managed/vault.yml

O comando grava uma variável YAML criptografada chamada app_secret. O nome da variável permanece legível, mas o valor redhat é armazenado dentro de um bloco do Vault.

sed -n "1,8p" inventory/group_vars/managed/vault.yml

O arquivo deve exibir app_secret: !vault e um cabeçalho $ANSIBLE_VAULT;. Você não deve ver o segredo em texto simples neste arquivo.

Escrever um playbook que utiliza o segredo

Nesta etapa, você escreverá um playbook que faz referência a app_secret. Sem a senha do vault, o Ansible não consegue descriptografar essa variável. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible. Isso mantém os comandos estáveis, mesmo que o LabEx execute cada etapa separadamente.

cd /home/labex/project/rhce-ansible
cat > playbooks/use-vault.yml <<'EOF'
---
- name: Use an encrypted variable
  hosts: managed
  gather_facts: false
  tasks:
    - name: Write secret-derived file
      ansible.builtin.copy:
        dest: /home/labex/project/rhce-ansible/managed/secret.txt
        content: |
          secret={{ app_secret }}
        mode: '0600'
EOF

O playbook usa app_secret como uma variável normal. Esse é o objetivo do Vault: a lógica do playbook pode permanecer limpa enquanto o valor sensível permanece criptografado em repouso.

ansible-playbook playbooks/use-vault.yml > reports/vault-missing.txt 2>&1 || true

Espera-se que esta execução falhe porque nenhuma senha do vault foi fornecida. A saída é redirecionada para um relatório para que você possa inspecionar a falha sem interromper o laboratório.

grep -Ei "vault|decrypt|password|secret" reports/vault-missing.txt

O erro filtrado deve mencionar Vault, descriptografia (decryption), senha ou o segredo. Observe também que a verificação espera que o arquivo managed/secret.txt ainda não exista.

Executar o playbook com a senha do Vault

Nesta etapa, você fornecerá o arquivo de senha do vault para que o Ansible possa descriptografar a variável e gravar o arquivo de saída protegido. Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible. Isso mantém os comandos estáveis, mesmo que o LabEx execute cada etapa separadamente.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/use-vault.yml --vault-password-file vault_pass.txt | tee reports/vault-run.txt

Agora o Ansible pode descriptografar app_secret e passar o valor em texto simples para a tarefa copy em tempo de execução. O arquivo criptografado no disco permanece criptografado.

sudo ls -l managed/secret.txt && cat managed/secret.txt

O arquivo deve ter o modo 600 e conter secret=redhat. Isso prova que o playbook usou o valor descriptografado enquanto ainda protegia o arquivo de segredo gerado.

Resumo

Você criou uma variável criptografada com o Vault, observou que o playbook não pode utilizá-la sem uma senha e, em seguida, executou o playbook com um arquivo de senha do vault para descriptografar e aplicar o segredo.