Защита и использование секретов с помощью Ansible Vault

AnsibleBeginner
Практиковаться сейчас

Введение

Ansible Vault позволяет шифровать конфиденциальные переменные, чтобы их можно было хранить вместе с плейбуками, не раскрывая секреты в открытом виде. Плейбук может использовать значение переменной только в том случае, если вы предоставите корректный пароль Vault.

В этой лабораторной работе вы создадите зашифрованную переменную, увидите, что произойдет при отсутствии пароля, а затем успешно запустите плейбук, используя файл паролей Vault.

Создание проекта для работы с Vault

На этом этапе вы создадите проект, включающий инвентарь, каталог для групповых переменных, каталог для плейбуков и каталог для отчетов.

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

Зашифрованная переменная будет находиться в inventory/group_vars/managed, поэтому она будет загружаться для группы managed так же, как и любой другой файл переменных. Разница лишь в том, что Ansible должен расшифровать её перед использованием.

Создание файла паролей Vault

На этом этапе вы создадите файл пароля для автоматизации лабораторной работы. В реальных условиях тщательно защищайте этот файл или используйте рабочий процесс с запросом пароля. Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible. Это обеспечит стабильность выполнения команд, даже если LabEx запускает каждый шаг отдельно.

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

Этот файл пароля предназначен только для лабораторного процесса. Режим chmod 600 означает, что только владелец может читать и записывать его — это минимальное правило безопасности, которое следует соблюдать при работе с файлами, открывающими доступ к секретам.

ls -l vault_pass.txt

Убедитесь, что права доступа выглядят примерно как -rw-------. Если файл доступен для чтения группе или другим пользователям, повторно выполните команду chmod 600.

Создание зашифрованной переменной

На этом этапе вы используете ansible-vault encrypt_string для создания зашифрованной переменной с именем app_secret. Зашифрованный файл можно загрузить так же, как и любой другой файл групповых переменных. Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible.

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

Команда записывает зашифрованную YAML-переменную с именем app_secret. Имя переменной остается читаемым, но значение redhat хранится внутри блока Vault.

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

В файле должно отображаться app_secret: !vault и заголовок $ANSIBLE_VAULT;. Вы не должны видеть секрет в открытом виде в этом файле.

Написание плейбука, использующего секрет

На этом этапе вы напишете плейбук, который ссылается на app_secret. Без пароля Vault Ansible не сможет расшифровать эту переменную. Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible.

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

Плейбук использует app_secret как обычную переменную. В этом и заключается смысл Vault: логика плейбука остается чистой, в то время как конфиденциальное значение остается зашифрованным в состоянии покоя.

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

Ожидается, что этот запуск завершится ошибкой, так как пароль Vault не был предоставлен. Вывод перенаправляется в отчет, чтобы вы могли изучить ошибку, не прерывая работу лаборатории.

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

Отфильтрованная ошибка должна содержать упоминания Vault, расшифровки (decryption), пароля или секрета. Также обратите внимание, что файл managed/secret.txt еще не создан.

Запуск плейбука с паролем Vault

На этом этапе вы предоставите файл пароля Vault, чтобы Ansible мог расшифровать переменную и записать защищенный выходной файл. Перед выполнением команд на этом этапе вернитесь в каталог проекта Ansible.

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

Теперь Ansible может расшифровать app_secret и передать значение в открытом виде задаче copy во время выполнения. Зашифрованный файл на диске остается зашифрованным.

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

Файл должен иметь права 600 и содержать secret=redhat. Это доказывает, что плейбук использовал расшифрованное значение, при этом обеспечивая защиту созданного файла с секретом.

Резюме

Вы создали переменную, зашифрованную с помощью Vault, убедились, что плейбук не может использовать её без пароля, а затем успешно выполнили плейбук с файлом паролей Vault для расшифровки и применения секрета.