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

Thank you for reading this post, don't forget to subscribe!

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

Настройка 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.test.local \
dbname=testdb

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

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

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

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

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

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

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

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

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

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

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

Настройка Ansible

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

pip3 install hvac

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

vi /etc/ansible/vault-playbook.yml

* где:

  • 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

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

гото­во мы можем читать сек­ре­ты из Hashicorp Vault сред­ства­ми Ansible