Ansible практика – урок №15: Использование vault для хранения секретов.

Предыдущий урок: Ansible практика – урок №14: defaults для хранения констант.

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

Как запаролить пароль?

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

Использование vault для хранения секретов

В прошлый раз мы создали файл roles/nginx/defaults/main.yml, в котором храниться пароль от Basic Auth. Защитим данный файл.

Шаг 1: Шифруем файл

Используем команду ansible-vault encrypt:

[root@Control-Node ansible]# ansible-vault encrypt roles/nginx/defaults/main.yml
New Vault password:
Confirm New Vault password:
Encryption successful
[root@Control-Node ansible]#

Нас попросят придумать пароль, и повторить его.

После того, как мы запаролили файл, проверим его содержание:

[root@Control-Node ansible]# cat roles/nginx/defaults/main.yml
$ANSIBLE_VAULT;1.1;AES256
63643862363332346332663238306630323861666331363730613636303563363132343931633664
6634313036326166346634643563373139623537366264350a353063643933663163363566376564
32396339343663336261396265383265336430326464386639383565333937336433313535346338
6637346166333933390a363938653562316333666265643866363862663166633163373030303066
63396238316461383064306262333466343265643966346130363864306431373238633232643230
64316363316466633739326534643734373939383134376162363661363032643861376363323862
65393030333033336433623736373662653537376237363962373436656136313363376230376464
36623931373432313962396566656538616536626165313366383434613861353565386535636265
35323564643966373233633430356663653334366330306439346239383762323664306438383761
39366635393264633361626362376665343934356637653466396230633764306339643737343034
33366365356265636139326636616166643765616664613730353334646134353266663165316265
39666566353832623865356662656432306332623834393437643765343535623835616237376162
66313730636264363866626332303930356661323035653134393634643435346562
[root@Control-Node ansible]#

Файл имеет шифрованный вид.

Шаг 2: Проверяем плейбук

Проверим, будет ли плейбук работать как раньше:

[root@Control-Node ansible]# ansible-playbook install_lemp.yml --tags nginx --skip-tags installation,start
ERROR! Attempting to decrypt but no vault secrets found
[root@Control-Node ansible]#

Ansible наткнулся на шифрованные данные и не смог их разобрать.

Дадим ему пароль через параметр –ask-vault-password, чтобы он мог прочитать файл:

[root@Control-Node ansible]# ansible-playbook install_lemp.yml --tags nginx --skip-tags installation,start --ask-vault-password
Vault password:

PLAY [all] ******************************************************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************************************
ok: [Managed-Node-1]
ok: [Managed-Node-2]
ok: [Managed-Node-3]

TASK [nginx : Deploy nginx.conf from template] ******************************************************************************************************************************************************
ok: [Managed-Node-1]
ok: [Managed-Node-2]
ok: [Managed-Node-3]

TASK [nginx : Set user/password for Basic Auth] *****************************************************************************************************************************************************
skipping: [Managed-Node-2]
skipping: [Managed-Node-3]
changed: [Managed-Node-1]

RUNNING HANDLER [nginx : restart_nginx] *************************************************************************************************************************************************************
changed: [Managed-Node-1]

PLAY RECAP ******************************************************************************************************************************************************************************************
Managed-Node-1             : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
Managed-Node-2             : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
Managed-Node-3             : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

[root@Control-Node ansible]#

После того, как мы дали Ansible пароль, плейбук отработал как обычно.

Шаг 3: Расшифровываем файл

Если нам нужно внести изменения в шифрованный файл, его нужно предварительно расшифровать. Используем обратную команду ansible-vault decrypt:

[root@Control-Node ansible]# ansible-vault decrypt roles/nginx/defaults/main.yml
Vault password:
Decryption successful
[root@Control-Node ansible]#

Файл снова в открытом виде и готов к редактированию:

[root@Control-Node ansible]# cat roles/nginx/defaults/main.yml
---
default_nginx_conf_file: "/etc/nginx/nginx.conf"
default_htpasswd_file: "/usr/share/nginx/.htpasswd"
default_basic_auth_user: "ba_user"
default_basic_auth_password: "secret_password"
[root@Control-Node ansible]#

После внесения очередных изменений, не забывайте шифровать файл.

Итоги:

Мы рассмотрели механизм Ansible vault и научились шифровать и расшифровывать файлы. Хорошей практикой считается держать все пароли и секреты в закрытом виде.

Следующий урок: в процессе