Proteja seus segredos com o Ansible Vault

Manter seus segredos longe das mãos erradas é uma prioridade máxima. Mas como exatamente você protege seus segredos? Salvá-los em um arquivo de texto local? Sem criptografia, essa opção é muito arriscada. Por que não usar o Ansible Vault para criptografar suas variáveis e arquivos?

Neste tutorial, você aprenderá como proteger conteúdo sensível, como senhas ou chaves, com o Ansible Vault.

Leia adiante e mantenha olhos curiosos longe de seus segredos!

Pré-requisitos

Este tutorial será uma demonstração prática. Se você deseja acompanhar, certifique-se de ter o seguinte.

  • A Linux machine – This tutorial uses Ubuntu 20.04, but any Linux distribution will work.
  • O Ansible instalado em sua máquina.

Configurando o Editor Padrão do Ansible Vault

Como administrador de sistemas, você pode estar trabalhando em vários playbooks do Ansible contendo nomes de usuário e senhas de diferentes servidores. Você não pode enviar esses arquivos para o sistema de controle de versão em formato de texto simples porque isso não é seguro. E é por isso que o Ansible Vault é útil.

O Ansible Vault foi projetado para ser integrado ao seu fluxo de trabalho existente para armazenar seus dados em um arquivo criptografado. Mas antes de criar seu primeiro Ansible Vault, você terá que configurar o editor padrão do Ansible Vault.

1. Abra o terminal e faça SSH para a sua máquina.

2. Em seguida, abra o arquivo ~/.bashrc usando um editor de texto. O arquivo ~/.bashrc é um script de shell que é executado sempre que uma nova sessão terminal é iniciada. Este script de shell inicializa uma sessão interativa de shell e define variáveis de ambiente.

3. Adicione a seguinte linha ao final do arquivo ~/.bashrc, salve as alterações e saia do editor.

Esta linha define a variável EDITOR para o usuário atualmente conectado. A variável EDITOR garante que seu editor de texto preferido seja utilizado sempre que você abrir uma nova sessão terminal.

Você pode configurar qualquer outro editor de texto que preferir, mas este tutorial utiliza o editor de texto nano.

export EDITOR=nano
Setting the Default Text Editor

4. Por fim, execute os seguintes comandos para aplicar as alterações (source) sem sair e entrar novamente, e imprima (echo) o editor de texto padrão atual do seu sistema.

# Carrega a variável de ambiente na sessão atual do seu shell.
source ~/.bashrc
# Imprime o editor de texto padrão atual do seu sistema.
echo $EDITOR

Verifique se a variável EDITOR está configurada para o seu editor preferido, conforme mostrado abaixo.

Applying and Verifying Changes

Criando e Criptografando Seu Primeiro Ansible Vault

Você definiu o editor de vault padrão, então é hora de criar o seu primeiro vault. Você irá criar e criptografar um arquivo que contém informações sensíveis, como nomes de usuário, senhas, chaves de acesso secretas, etc.

Você irá executar o comando ansible-vault, a principal interface para interagir com Vaults do Ansible.

1. Execute o seguinte comando para criar o arquivo secret.yml. O Ansible utiliza YAML, um formato mais legível para humanos em comparação com outros formatos de dados, como JSON.

ansible-vault create secret.yml

Você será solicitado a digitar e confirmar uma senha para o arquivo. Você usará essa senha para criptografar e descriptografar o arquivo secret.yml posteriormente, portanto, certifique-se de escolher uma senha forte que você possa lembrar.

Creating the secret.yml File with a Password

2. Após definir a senha do vault, o seu editor de texto padrão abrirá um arquivo vazio. Insira as informações sensíveis que você deseja armazenar no arquivo, salve-o e feche o editor.

Neste tutorial, as variáveis aws_access_key e aws_secret_key são armazenadas no arquivo secret.yml. Neste ponto, o Ansible criptografa o arquivo secret.yml e mais ninguém pode ler o conteúdo do vault a menos que saibam a senha do vault.

Providing Sensitive Information (secrets)

3. Execute o comando cat para tentar visualizar o conteúdo do arquivo secret.yml sem a senha.

cat secret.yml

Podes verificar o conteúdo do ficheiro está encriptado se vires números aleatórios, como mostrado abaixo. O cabeçalho $ANSIBLE_VAULT;1.1;AES256 no topo do ficheiro indica que o ficheiro está encriptado com o Ansible Vault usando o cifrão AES256.

O Padrão de Encriptação Avançada (AES) é um algoritmo de chave simétrica que usa a mesma chave para encriptar e desencriptar dados.

Viewing the secret.yml file Without the Vault’s Password

Encriptar Ficheiros Existentes

Criaste um ficheiro do zero que é automaticamente encriptado. Mas e quanto à encriptação de ficheiros existentes? O Ansible também oferece o sub-comando encrypt para encriptar um ficheiro específico. Para ver como encriptar um ficheiro existente, vais encriptar um ficheiro específico que contém variáveis do Ansible.

Executa o seguinte comando para encriptar um ficheiro (vars.yml).

ansible-vault encrypt vars.yml

Tal como quando criaste o ficheiro secret.yml pela primeira vez, ser-te-á pedido para forneceres uma palavra-passe para o ficheiro vars.yml.

O editor padrão não abrirá desta vez porque o ficheiro vars.yml já existe. Em vez disso, receberás a mensagem Encriptação bem-sucedida, indicando que o Ansible encriptou o ficheiro, como mostrado abaixo.

Encrypting an Existing File (vars.yml)

Agora, executa o comando cat abaixo para verificar se o Ansible encriptou o ficheiro vars.yml.

cat vars.yml
Verifying Encrypted Existing File

Desencriptar Dados do Ansible Vault

Você viu como criptografar arquivos, tornando-os seguros. Mas quando você precisa visualizar o conteúdo de seus arquivos, como descriptografá-los? Descriptografar um arquivo é útil quando você deseja editar um arquivo criptografado ou ler seu conteúdo sem fornecer a senha toda vez. E o subcomando decrypt do Ansible será útil.

1. Execute o seguinte comando para descriptografar o arquivo secret.yml.

O subcomando de descriptografia recebe o caminho de um arquivo criptografado como único argumento.

ansible-vault decrypt secret.yml

Forneca a senha para o arquivo, e o conteúdo do arquivo será descriptografado e escrito no disco em texto simples.

Decrypting File Data

2. Em seguida, execute o comando cat para visualizar o conteúdo descriptografado do arquivo secret.yml.

cat secret.yml

Você pode ver abaixo o conteúdo do arquivo secret.yml impresso no terminal sem nenhuma criptografia. Neste ponto, você pode adicionar, editar ou excluir qualquer linha no arquivo conforme desejar.

file to your heart’s content

3. Por fim, execute o comando abaixo para criptografar o arquivo secret.yml e forneça uma senha para manter o conteúdo do arquivo seguro.

ansible-vault encrypt secret.yml
Encrypting a Decrypted File (secret.yml)

Atualizando a Senha do Ansible Vault

Você viu que precisa inserir uma senha cada vez que criptografa e descriptografa arquivos. Mas talvez você queira apenas atualizar a senha do arquivo sem descriptografá-lo. Se for o caso, você precisará usar o subcomando rekey. Este subcomando permite que você altere a senha do seu arquivo conforme desejar.

Execute o seguinte comando para atualizar a senha do arquivo secret.yml.

O sub-comando rekey recebe o caminho de um arquivo criptografado como seu único argumento.

ansible-vault rekey secret.yml

Fornecer a senha atual do arquivo seguida da nova senha, como mostrado abaixo.

Neste ponto, a senha antiga não funcionará mais para descriptografar o arquivo.

Updating Ansible Vault’s Password

Agora, execute o comando abaixo para tentar descriptografar o secret.yml.

ansible-vault decrypt secret.yml

Fornecer a senha antiga quando solicitado, e você verá uma mensagem de erro dizendo que a descriptografia falhou, como mostrado abaixo. Esta saída confirma que a senha para o arquivo foi atualizada com sucesso.

Verifying New Password is in Effect

Usando Dados Seguros em Playbooks e Módulos

Você viu que executar comandos para criptografar e descriptografar arquivos funciona. Mas se você planeja automatizar o processo de forma segura para sua aplicação, você precisará usar playbooks e módulos.

1. Abra o arquivo de configuração do Ansible (~/.ansible.cfg) em seu editor, que contém as configurações para o Ansible.

Copie e cole o seguinte código no final do arquivo ~/.ansible.cfg, salve as alterações e feche o editor. Este código diz ao Ansible para procurar o arquivo de inventário (~/.ansible-hosts).

[defaults]
hostfile = ~/.ansible-hosts

2. Em seguida, abra o arquivo ~/.ansible-hosts, que contém o inventário de hosts que seu nó de gerenciamento Ansible pode gerenciar.

Preencha o arquivo ~/.ansible-hosts com a seguinte linha de código, salve as alterações e feche o arquivo. Este código diz ao Ansible que ele pode gerenciar o localhost via o tipo de conexão local.

localhost ansible_connection=local

3. Execute o comando abaixo para criar um novo arquivo criptografado. Você pode nomear o arquivo como quiser, mas neste tutorial, o arquivo é chamado de helloworld.yml.

ansible-vault create helloworld.yml
Creating Ansible Playbook (helloworld.yml)

Popule o código abaixo no arquivo helloworld.yml, salve as alterações e feche o editor.

Este código é um playbook básico do Ansible que imprime a mensagem de olá mundo em todos os hosts em seu inventário. O símbolo — no topo do bloco de código denota o início de um documento YAML.

---

- hosts: all # Define a tarefa a ser executada em todos os hosts no inventário
  tasks: # Define as tarefas a serem executadas
    - shell: echo 'hello world' # Imprime uma mensagem 'olá mundo'

4. Por fim, execute o comando ansible-playbook abaixo, seguido das opções –ask-vault-pass, para executar o playbook helloworld.yml em todos os hosts do seu inventário.

ansible-playbook --ask-vault-pass helloworld.yml

Forneca a senha para o arquivo helloworld.yml quando solicitado. Como você pode ver abaixo, a execução do seu playbook foi bem-sucedida.

  • ok=2 – indica que ambas as tarefas foram executadas com sucesso.
  • changed=1 – indica que sua tarefa fez uma alteração no estado do seu sistema. Neste caso, escreveu uma mensagem de olá mundo no terminal.
  • unreachable e failed ambos são 0 – indica que nenhum host ficou inacessível ou falhou durante a execução.
Running your playbook

Usando o Ansible Vault com um Arquivo de Senha

Embora inserir manualmente uma senha ao executar tarefas pontuais funcione, não é prático para uso no mundo real.

A better way to provide the password for encrypting and decrypting files is to use a password file. This way, you can store the password in a secure location, and Ansible will read the password from the file needed.

1. Execute o comando abaixo para armazenar a senha do Ansible Vault em um arquivo chamado .vault_pass. Substitua my_vault_password pela sua senha real do vault.

echo 'my_vault_password' > .vault_pass

2. Em seguida, execute cada comando abaixo para alterar a propriedade (chown) do arquivo para root e alterar as permissões do arquivo .vault_pass. Esses comandos garantem que apenas você (o usuário root) possa ler e escrever no arquivo.

# Alterar a propriedade do arquivo para o usuário root
chown root:root .vault_pass
# Alterar as permissões do arquivo para somente root (permissões de leitura e escrita)
chmod 700 .vault_pass

3. Por fim, execute o comando ansible-playbook abaixo, seguido da opção –vault-password-file para executar um playbook (helloworld.yml) usando um arquivo de senha (.vault_pass).

ansible-playbook --vault-password-file=.vault_pass helloworld.yml

Observe abaixo que o Ansible executou o playbook sem solicitar a senha do arquivo criptografado.

Running Playbook using a Password File

Conclusão

Neste tutorial, você aprendeu como usar o Ansible Vault para criptografar e descriptografar dados sensíveis para playbooks e tarefas do Ansible. Você armazenou a senha do Ansible Vault em um local seguro usando um arquivo de senha. Esse comportamento é útil para menos intervenção do usuário ao executar um playbook.

Com esse conhecimento recém-adquirido, agora você pode criptografar dados sensíveis com confiança e compartilhar seus playbooks com outras pessoas sem se preocupar com a segurança de seus dados.

Se você usa o LastPass para gerenciar senhas, por que não armazenar a senha do seu Ansible Vault no LastPass e permitir que o Ansible a recupere automaticamente quando necessário?

Source:
https://adamtheautomator.com/ansible-vault/