Ansible vault как средство хранения секретов

Ansible vault как средство хранения секретов

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

Там, где внедрение системы хранения секретов невозможно в силу незрелости проекта или нецелесообразности с точки зрения оставшегося времени жизни проекта, используем стандартные механизмы работы с секретами, например, ansible vault. Официальную документацию по этому инструменту можно посмотреть по ссылке.

Ansible vault как инструмент

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

  • создать файл, записать в него парольную фразу и использовать этот файл при попытке шифрования yml файлов. В этом случае в строку вызова добавляется параметр —vault-password-file=<путь к файлу>
  • вводить парольную фразу с клавиатуры при каждом обращении к инструменту ansible-vault. В строку вызова добавляется ключ —ask-vault-pass
Создание и редактирование секретов

Создание зашифрованного файла средствами ansible-vault:

# с помощью файла с парольной фразой
ansible-vault create test_secret_file_1.yml --vault-password-file=/u01/ansible/secret
# ввод парольной фразы с клавиатуры
ansible-vault create test_secret_file_2.yml
New Vault password:
Confirm New Vault password:

Для того, чтобы отредактировать файл, необходимо указать директиву edit:

# с помощью файла с парольной фразой
ansible-vault edit test_secret_file_1.yml --vault-password-file=/u01/ansible/secret
# ввод парольной фразы с клавиатуры
ansible-vault edit test_secret_file_2.yml
Vault password:

И при создании, и при редактировании файл откроется в редакторе vi.

Честно говоря, этими методами создания и редактирования не пользовался ни разу, так как процесс написания playbook подразумевает создание переменных в процессе разработки. Во время отладки, если не используется репозиторий, переменные не шифрую. Когда проект готов, просто шифрую файл с секретами и заливается весь playbook в репозиторий.

Шифрование и дешифрование

Зашифровать готовый файл можно с помощью директивы encrypt:

# с помощью файла с парольной фразой
ansible-vault encrypt test_secret_file_3.yml --vault-password-file=/u01/ansible/secret
# ввод парольной фразы с клавиатуры
ansible-vault encrypt test_secret_file_4.yml
New Vault password:
Confirm New Vault password:

Для расшифровывания используется директива decrypt:

# с помощью файла с парольной фразой
ansible-vault decrypt test_secret_file_3.yml --vault-password-file=/u01/ansible/secret
# ввод парольной фразы с клавиатуры
ansible-vault decrypt test_secret_file_4.yml
Vault password:
Decryption successful

Более просто и быстро работать с секретами можно через вэб интерфейс собственной разработки. Про то как это сделать, написал в статье про графический интерфейс для ansible vault.

Соответственно, если в playbook появились зашифрованные переменные, необходимо при запуске указать ключ для использования парольной фразы:

# с помощью файла с парольной фразой
ansible-playbook service_install_kesl_all_servers.yml --vault-password-file=/u01/ansible/secret
# ввод парольной фразы с клавиатуры
ansible-playbook service_install_kesl_all_servers.yml --ask-vault-pass
Vault password:

Про то, как устроен проект на ansible, можно посмотреть перейдя по ссылке.

Работа со строками

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

ansible-vault encrypt_string --vault-password-file=/u01/ansible/secret 'test_secret_string'
!vault |
          $ANSIBLE_VAULT;1.1;AES256
          65353731326432383934356239306632386366663534386431643237633930376162633130393539
          6461326238363233656233356330343837613532376434380a326531626465386534313262303838
          64306366376431346532326335646237663065383262306331383534393565313363356639393361
          3132366531373633390a396539323462383630646365373930323936643264303539616630326163
          63323034336138323032363136346362336339616231386236653339336637383961
Encryption successful

Введение пароля с клавиатуры:

ansible-vault encrypt_string 'test_secret_string'
New Vault password:
Confirm New Vault password:
!vault |
          $ANSIBLE_VAULT;1.1;AES256
          64666336343331363631343237646438663431353930616163333838326235626638663366313164
          3833313633646535656338656532343431386234326165350a353730623162663936626633383836
          35656639646135393265633762346261626431383830393266343937366139303739653735396631
          6461363566373136360a623035393631623038646665656263343466636138646662383631616636
          66336263353264333232363466633132333061316262653966636630376664636534
Encryption successful

Кстати, дешифровать строку с помощью файла с парольной фразой можно через прием ниже:

echo '$ANSIBLE_VAULT;1.1;AES256
65353731326432383934356239306632386366663534386431643237633930376162633130393539
6461326238363233656233356330343837613532376434380a326531626465386534313262303838
64306366376431346532326335646237663065383262306331383534393565313363356639393361
3132366531373633390a396539323462383630646365373930323936643264303539616630326163
63323034336138323032363136346362336339616231386236653339336637383961' | \
ansible-vault decrypt --vault-password-file=/u01/ansible/secret && echo
[user@server01 u01]$ echo '$ANSIBLE_VAULT;1.1;AES256
> 65353731326432383934356239306632386366663534386431643237633930376162633130393539
> 6461326238363233656233356330343837613532376434380a326531626465386534313262303838
> 64306366376431346532326335646237663065383262306331383534393565313363356639393361
> 3132366531373633390a396539323462383630646365373930323936643264303539616630326163
> 63323034336138323032363136346362336339616231386236653339336637383961' | \
> ansible-vault decrypt --vault-password-file=/u01/ansible/secret && echo
Decryption successful
test_secret_string

Та же дешифрация, только с помощью ввода пароля с клавиатуры:

[user@server01 u01]$ echo '$ANSIBLE_VAULT;1.1;AES256
> 64666336343331363631343237646438663431353930616163333838326235626638663366313164
> 3833313633646535656338656532343431386234326165350a353730623162663936626633383836
> 35656639646135393265633762346261626431383830393266343937366139303739653735396631
> 6461363566373136360a623035393631623038646665656263343466636138646662383631616636
> 66336263353264333232363466633132333061316262653966636630376664636534' | \
> ansible-vault decrypt  && echo
Vault password:
Decryption successful
test_secret_string

Заключение

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