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

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

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

Читайте далее и держите любопытные глаза подальше от ваших секретов!

Предварительные требования

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

  • A Linux machine – This tutorial uses Ubuntu 20.04, but any Linux distribution will work.
  • Ansible установлен на вашем компьютере.

Настройка редактора Ansible Vault по умолчанию

Как системный администратор, вы можете работать с различными файлами Ansible playbook, содержащими имена пользователей и пароли для разных серверов. Вы не можете зафиксировать эти файлы в системе контроля версий в открытом текстовом формате, потому что это небезопасно. Именно по этой причине полезен Ansible Vault.

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

1. Откройте ваш терминал и подключитесь по SSH к вашему компьютеру.

2. Затем откройте файл ~/.bashrc с помощью текстового редактора. Файл ~/.bashrc представляет собой сценарий оболочки, который выполняется каждый раз при запуске новой сессии терминала. Этот сценарий оболочки инициализирует интерактивную сессию оболочки и определяет переменные среды.

3. Добавьте следующую строку в конец файла ~/.bashrc, сохраните изменения и выйдите из редактора.

Эта строка устанавливает переменную EDITOR для текущего пользователя. Переменная EDITOR гарантирует, что ваш предпочтительный текстовый редактор будет использоваться каждый раз при открытии новой сессии терминала.

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

export EDITOR=nano
Setting the Default Text Editor

4. Наконец, выполните следующие команды, чтобы применить изменения (source) без выхода и повторного входа в систему, а затем выведите (echo) текущий текстовый редактор вашей системы.

# Загружает переменную среды в вашу текущую оболочку.
source ~/.bashrc
# Печатает текущий текстовый редактор вашей системы.
echo $EDITOR

Убедитесь, что переменная EDITOR установлена в вашем предпочтительном редакторе, как показано ниже.

Applying and Verifying Changes

Создание и шифрование вашего первого хранилища Ansible Vault

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

Вы будете использовать команду ansible-vault, основной интерфейс для взаимодействия с Ansible Vaults.

1. Выполните следующую команду для создания файла secret.yml. Ansible использует формат YAML, более человекочитаемый по сравнению с другими форматами данных, такими как JSON.

ansible-vault create secret.yml

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

Creating the secret.yml File with a Password

2. После установки пароля хранилища ваш редактор текста по умолчанию откроет пустой файл. Введите чувствительную информацию, которую вы хотите сохранить в файле, сохраните и закройте редактор.

В этом руководстве переменные aws_access_key и aws_secret_key сохраняются в файле secret.yml. На данном этапе Ansible шифрует файл secret.yml, и никто другой не может прочитать содержимое хранилища, если не знает пароль хранилища.

Providing Sensitive Information (secrets)

3. Выполните команду cat, чтобы попытаться просмотреть содержимое файла secret.yml без пароля.

cat secret.yml

Вы можете проверить, что содержимое файла зашифровано, если вы видите случайные числа, как показано ниже. Заголовок $ANSIBLE_VAULT;1.1;AES256$ в верхней части файла указывает, что файл зашифрован с использованием Ansible Vault с шифром AES256.

Стандарт шифрования данных (AES) – это симметричный алгоритм, который использует один и тот же ключ для шифрования и дешифрования данных.

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

Шифрование существующих файлов

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

Выполните следующую команду для шифрования файла (vars.yml).

ansible-vault encrypt vars.yml

Как и при создании файла secret.yml в первый раз, вам будет предложено ввести пароль для файла vars.yml.

Редактор по умолчанию на этот раз не откроется, потому что файл vars.yml уже существует. Вместо этого вы получите сообщение Шифрование успешно, указывающее, что Ansible зашифровал файл, как показано ниже.

Encrypting an Existing File (vars.yml)

Теперь выполните команду cat ниже, чтобы проверить, что Ansible зашифровал файл vars.yml.

cat vars.yml
Verifying Encrypted Existing File

Расшифровка данных из Ansible Vault

Вы видели, как зашифровать файлы, сделав их безопасными. Но как только вам понадобится просмотреть содержимое файлов, как вы расшифруете их? Расшифровка файла полезна, когда вы хотите отредактировать зашифрованный файл или прочитать его содержимое без ввода пароля каждый раз. И подкоманда decrypt Ansible будет полезной.

1. Выполните следующую команду, чтобы расшифровать файл secret.yml.

Подкоманда decrypt принимает путь зашифрованного файла как единственный аргумент.

ansible-vault decrypt secret.yml

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

Decrypting File Data

2. Затем выполните команду cat, чтобы просмотреть расшифрованное содержимое файла secret.yml.

cat secret.yml

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

file to your heart’s content

3. Наконец, выполните следующую команду, чтобы зашифровать файл secret.yml и укажите пароль, чтобы сохранить содержимое файла в безопасности.

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

Обновление пароля хранилища Ansible Vault

Вы видели, что вам нужно вводить пароль каждый раз при шифровании и расшифровке файлов. Но возможно, вам просто нужно обновить пароль файла без расшифровки файла. Если так, вам потребуется использовать подкоманду rekey. Эта подкоманда позволяет вам изменить пароль вашего файла по своему усмотрению.

Выполните следующую команду для обновления пароля файла secret.yml.

Подкоманда rekey принимает путь к зашифрованному файлу в качестве единственного аргумента.

ansible-vault rekey secret.yml

Укажите текущий пароль для файла, а затем новый пароль, как показано ниже.

На этом этапе старый пароль больше не сможет расшифровать файл.

Updating Ansible Vault’s Password

Теперь выполните следующую команду, чтобы попытаться расшифровать secret.yml.

ansible-vault decrypt secret.yml

Укажите старый пароль при запросе, и вы увидите сообщение об ошибке, где будет сказано, что Расшифровка не удалась, как показано ниже. Этот вывод подтверждает успешное обновление пароля для файла.

Verifying New Password is in Effect

Использование защищенных данных в плейбуках и модулях

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

1. Откройте файл конфигурации Ansible (~/.ansible.cfg) в вашем редакторе, который содержит настройки Ansible.

Скопируйте и вставьте следующий код в конец файла ~/.ansible.cfg, сохраните изменения и закройте редактор. Этот код указывает Ansible искать файл инвентаря (~/.ansible-hosts).

[defaults]
hostfile = ~/.ansible-hosts

2. Затем откройте файл ~/.ansible-hosts, который содержит инвентарь хостов, которыми ваш управляемый узел Ansible может управлять.

Заполните файл ~/.ansible-hosts следующей строкой кода, сохраните изменения и закройте файл. Этот код указывает Ansible, что он может управлять локальным хостом через тип локального соединения.

localhost ansible_connection=local

3. Запустите нижеприведенную команду для создания нового зашифрованного файла. Вы можете назвать файл как угодно, но в данном учебнике файл назван helloworld.yml.

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

Заполните код ниже в файле helloworld.yml, сохраните изменения и закройте редактор.

Этот код представляет собой базовый плейбук Ansible, который выводит сообщение “hello world” на всех хостах в вашем инвентаре. Символ — вверху блока кода обозначает начало YAML-документа.

---

- hosts: all # Устанавливает выполнение задачи для всех хостов в инвентаре
  tasks: # Устанавливает задачи для выполнения
    - shell: echo 'hello world' # Выводит сообщение 'hello world'

4. Наконец, выполните команду ansible-playbook ниже, за которой следуют параметры –ask-vault-pass, чтобы выполнить плейбук helloworld.yml на всех хостах в вашем инвентаре.

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

Укажите пароль для файла helloworld.yml, когда будет запрошено. Как видно ниже, выполнение вашего плейбука было успешным.

  • ok=2 – указывает на то, что обе ваши задачи были выполнены успешно.
  • changed=1 – указывает на то, что ваша задача внесла одно изменение в состояние вашей системы. В данном случае было выведено сообщение “hello world” в оболочку.
  • unreachable и failed оба равны 0 – указывает на то, что ни один хост не был недоступен или неудачен во время выполнения.
Running your playbook

Использование Ansible Vault с файлом пароля

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

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. Выполните нижеуказанную команду, чтобы сохранить пароль Ansible Vault в файл с именем .vault_pass. Замените my_vault_password на ваш фактический пароль от хранилища.

echo 'my_vault_password' > .vault_pass

2. Затем выполните каждую из следующих команд для изменения владельца файла (chown) на root и изменения разрешений файла .vault_pass. Эти команды гарантируют, что только вы (пользователь root) можете читать и записывать в файл.


# Изменить владельца файла на пользователя root

chown root:root .vault_pass

# Изменить разрешения файла только для root (разрешения на чтение и запись)

chmod 700 .vault_pass

3. Наконец, выполните команду ansible-playbook, приведенную ниже, а затем используйте опцию –vault-password-file для выполнения playbook (helloworld.yml) с использованием файла пароля .vault_pass.

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

Обратите внимание, что Ansible выполнил playbook без запроса пароля для зашифрованного файла.

Running Playbook using a Password File

Заключение

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

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

Если вы используете LastPass для управления паролями, почему бы не хранить свой пароль от Ansible Vault в LastPass и позволить Ansible автоматически извлекать его при необходимости?

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