Хранение секретов в Hashicorp Vault для Ansible

Обновлено и опубликовано Опубликовано:

Используемые термины: Hashicorp VaultAnsible.

А Ansible есть свой механизм безопасного хранения секретов, однако, нам может понадобиться использовать централизованное решение. В этом случае, есть решение для интеграции Hashicorp Vault и Ansible. Наша инструкция подойдет к системам на базе Deb (Ubuntu, Debian) или RPM (Rocky Linux, Red Hat, CentOS).

Настройка Hashicorp Vault

На стороне Hashicorp Vault необходимо создать:

  1. Путь хранения секретов для Ansible и сам секрет.
  2. Политику доступа к созданному секрету.
  3. Токен для возможности подключения с привязкой к созданной политике.

1. Для начала, формируем путь хранения секрета по механизму key-value:

vault secrets enable -path=ansible kv

* в данном примере путь будет начинаться с ansible.

Создаем секрет:

vault kv put ansible/projects/test-project/database \
 username=my_user \
 password=password135 \
 host=mariadb.dmosk.local \
 dbname=testdb

* в данном примере будет создан секрет по пути ansible/projects/test-project/database, в котором будут записи для подключения к базе данных (например, mariadb).

Смотрим, что получилось:

vault kv get ansible/projects/test-project/database

Команда должна нам вернуть что-то на подобие:

====== Data ======
Key         Value
---         -----
dbname      testdb
host        mariadb.dmosk.local
password    password135
username    my_user

* мы должны получить данные, которые добавили в секрет.

2. Создаем политику:

vault policy write test-project-ansible - <<EOF
path "ansible/projects/test-project/*" {
  capabilities = [ "read" ]
}
EOF

* в данном примере мы назвали политику test-project-ansible. По нашему правилу мы разрешаем чтение по пути ansible/projects/test-project.

3. Создаем токен для нашей политики:

vault token create -policy="test-project-ansible"

Мы должны увидеть что-то на подобие:

Key                  Value
---                  -----
token                s.E1jqoGhkgcMcZtbOLENSsW21
token_accessor       E9TGHoaDYw1q8HPpyWZy9xkf
token_duration       768h
token_renewable      true
token_policies       ["default" "test-project-ansible"]
identity_policies    []
policies             ["default" "test-project-ansible"]

Записываем token — его значение нам понадобиться позже.

Настройка Ansible

Переходим к Ansible. Устанавливаем питон-модуль hvac:

pip3 install hvac

Создаем плейбук, в котором нам нужно обращаться к Vault, например:

vi /etc/ansible/vault-playbook.yml

---

- hosts: test_servers
  user: dmosk
  become: true
  become_method: su
  become_user: root

  vars:
    vault_url: https://vault.dmosk.local:8200
    vault_token: s.E1jqoGhkgcMcZtbOLENSsW21
    vault_secret: ansible/projects/test-project/database
    database_arr: "{{ lookup('hashi_vault', 'secret={{ vault_secret }} token={{ vault_token }} url={{ vault_url }} validate_certs=False') }}"

  tasks:
    - name: Echo Vars
      ansible.builtin.debug:
        msg: "Database host: {{ database_arr.host }}, dbname: {{ database_arr.dbname }}, username: {{ database_arr.username }}, password: {{ database_arr.password }}"

* где:

  • vault_url — ссылка для запросов к серверу Vault. Это может быть имя сервера или IP-адресс.
  • vault_token — токен для подключения. Используем тот, что создали в первой части инструкции.
  • vault_secret — полный путь до созданного в Vault секрета.
  • database_arr — переменна, в которую мы запишем значения для каждой из строк нашего секрета.

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

  1. database_arr.host
  2. database_arr.dbname
  3. database_arr.username
  4. database_arr.password

Обратите внимание, что часть после точки соответствует имени параметра в секрете.

Для проверка запустим наш плейбук:

ansible-playbook /etc/ansible/vault-playbook.yml -kK

Мы должны получить что-то на подобие:

ok: [192.168.0.15] => {
    "msg": "Database host: mariadb.dmosk.local, dbname: testdb, username: my_user, password: password135"
}

Цель достигнута — мы можем читать секреты из Hashicorp Vault средствами Ansible.

# DevOps # Linux # Безопасность # Серверы # Управление
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет