Работа с ansible: шпаргалка

Использование файла паролей

Если вам нужно автоматизировать процесс инициализации серверов в Ansible с помощью стороннего инструмента, вам потребуется способ ввода пароля хранилища без его запроса. Вы можете сделать это, используя файл паролей через ansible-vault.

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

Чтобы применить файл паролей в ansible-vault, необходимо указать путь к файлу паролей при выполнении любой из команд vault:

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

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

Настройка системы

В данном разделе мы рассмотрим процессы, которые больше подходят для категории настройки системы. 

1. Добавить задание в cron.

Выполняется с помощью модуля cron:

— name: Add Job for Run Command
  cron:
    name: Start Script
    job: «/scripts/command.sh»
    user: root
    minute: «0»
    hour: «*/6»
    day: «*»
    month: «*»
    weekday: «*»

* в данном примере мы создадим задание для запуска команды /scripts/command.sh каждый день, каждые 6 часов.

О cron: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/cron_module.html.

2. Добавить публичный ключ хоста в known_hosts.

Делается с помощью known_hosts. Пример из официальной документации:

— name: Tell the host about our servers it might want to ssh to
  known_hosts:
    path: /etc/ssh/ssh_known_hosts
    name: foo.com.invalid
    key: «{{ lookup(‘file’, ‘pubkeys/foo.com.invalid’) }}»

* в данном примере мы добавим ключ из файла pubkeys/foo.com.invalid в /etc/ssh/ssh_known_hosts.

О known_hosts: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/known_hosts_module.html.

3. Создание новых SSH-ключей для сервера.

Создание ключей реализуется с помощью модуля openssh_keypair:

— name: Generate New SSH Host Keys
  openssh_keypair:
    path: «/etc/ssh/ssh_host_` item`.`type `_key»
    owner: root
    state: present
    type: «` item`.`type `»
    size: «` item`.`size `»
    force: yes
  loop:
    — { type: dsa, size: 1024 }
    — { type: ecdsa, size: 521 }
    — { type: ed25519, size: 2048 }
    — { type: rsa, size: 2048 }

* в данном примере мы создадим 4 ключа разных типов: dsa, ecdsa, ed25519, rsa. Так как у каждого из них свои требования к размеру, перечень представлен в виде двумерного массива. Ключи будут созданы в каталоге /etc/ssh/.

О openssh_keypair: https://docs.ansible.com/ansible/latest/collections/community/crypto/openssh_keypair_module.html.

4. Работа с SSH authorized_key.

Данный файл содержит публичный ключ для подключения по SSH. Работа с ним через Ansible выполняется с помощью модуля authorized_key.

Пример добавления ключа:

— name: Set authorized key took from file
  authorized_key:
    user: root
    state: present
    key: ‘` item `’
  with_file:
    — files/key.pub

* в данном примере мы берем содержимое файла files/key.pub и устанавливаем его для пользователя root.

Об authorized_key: https://docs.ansible.com/ansible/2.4/authorized_key_module.html.

5. Создание системной учетной записи.

Для этого есть модуль user. У него много опций, но для создания системной учетной записи нам достаточно:

— name: Create User Consul
  user:
    name: consul
    system: yes
    comment: «Consul Agent»

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

О user: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/user_module.html.

6. Работа с systemd.

Для данной настройки есть одноименный модуль systemd. Рассмотрим варианты его использования.

а) перечитать конфигурацию (необходимо делать каждый раз, когда мы меняем настройки юнита):

— name: systemd reload
  systemd:
    daemon_reload: yes

б) разрешить сервис (автозапуск):

— name: mysql enable
  systemd:
    name: mysql
    enabled: yes

* для сервиса mysql.

в) перезапустить сервис:

— name: mysql reload
  systemd:
    name: mysql
    state: restarted

* для сервиса mysql.

О systemd: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/systemd_module.html.

7. Настройка брандмауэра.

Выполняется разными модулями в зависимости от используемой системы управления netfilter:

  • firewalld
  • iptables
  • ufw

Рассмотрим небольшие примеры.

а) firewalld:

— name: permit traffic in default zone for https service
  firewalld:
    service: https
    permanent: yes
    state: enabled

Подробнее: https://docs.ansible.com/ansible/latest/collections/ansible/posix/firewalld_module.html.

б) iptables:

— name: Block specific IP
  iptables:
    chain: INPUT
    source: 8.8.8.8
    jump: DROP

Подробнее: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/iptables_module.html.

в) UFW.

Добавить 80 порт:

— name: Allow all access to tcp port 80
  ufw:
    rule: allow
    port: ’80’
    proto: tcp

Добавить порты с циклом:

— name: Allow Ports in Firewall
  ufw:
    rule: allow
    port: «` item`.`port `»
    proto: «` item`.`proto `»
    comment: «` item`.`comment `»
  loop:
    — { port: 5432, proto: tcp, comment: ‘PostgreSQL’ }

Подробнее: https://docs.ansible.com/ansible/latest/collections/community/general/ufw_module.html.

Использование нескольких паролей

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

Чтобы создать новый зашифрованный файл с пользовательским идентификатором хранилища, включите параметр –vault-id вместе с меткой и расположением, где ansible-vault может найти пароль для этого хранилища. Метка может быть любой, а расположение может быть либо prompt (что означает, что команда должна предложить вам ввести пароль), либо путь к файлу паролей.

Это создаст новый идентификатор по имени dev, который использует prompt для получения пароля. Комбинируя этот метод с файлами переменных группы, вы сможете создать отдельные хранилища для каждой среды приложения:

Мы использовали dev и prod в качестве идентификаторов хранилищ, чтобы продемонстрировать, как вы можете создавать отдельные хранилища для каждой среды. Самостоятельно вы можете создать столько хранилищ, сколько захотите, и использовать любой ID.

Теперь, чтобы просмотреть, отредактировать или расшифровать эти файлы, вам необходимо предоставить тот же ID хранилища и источник пароля вместе с командой ansible-vault:

Tested with Vault

We currently test against the latest patch version within the latest two minor versions of the latest major version of Vault. Put another way, we test against version . For example as of this writing, Vault is on major version , with the latest two minors being and . So we’ll test Vault and where is the latest patch within those versions.

We do not test against any versions of Vault with major version or against pre-release/release candidate (RC) versions.

If/when a new major version of Vault is released, we’ll revisit which and how many versions to test against.

The decision of which version(s) of Vault to test against is still somewhat in flux, as we try to balance wide testing with CI execution time and resources.

See the CI configuration for the most accurate testing information.

Providing Password

If you’ve tried the commands above, you would’ve been asked for encryption password. Instead of entering the password everytime you run ansible-vault, Ansible allows you to store the password on a file. This is very useful if you have a long password because typing it or using copy & paste command is not practical. Since version 2.4, the recommended way to provide password is using —vault-id flag, followed by the path to the file containing password. If you want it to prompt the password, use —vault-id @prompt instead.

Prior to version 2.4, you can use —vault-password-file flag, followed by the path to the password file. The flag is applicable for all the commands above, with the exception for changing password (rekeying), where you also need additional flag —new-vault-password-file for the new password file. To be prompted for password, use —ask-vault-pass flag.

Краткий словарь терминов Ansible

В этом руководстве широко используются такие термины Ansible:

  • Control Machine (или Node): ведущая система, в которой установлен Ansible и откуда он может подключаться к нодам и выполнять на них команды.
  • Нода: сервер, управляемый Ansible.
  • Файл инвентаря: файл, который содержит информацию о серверах, которыми управляет Ansible, обычно находится в /etc/ansible/hosts.
  • Плейбук (Playbook): файл, содержащий серию задач, которые нужно выполнить на удаленном сервере.
  • Роль: коллекция плейбуков и других файлов, которые имеют отношение к цели (например, к установке веб-сервера).
  • Play: полный набор инструкций Ansible. В play может быть несколько плейбуков и ролей, включенных в один плейбук, который служит точкой входа.

8. Using ansible vault in playbook

  • For using ansible vault in playbook, we need to be able to inform how to access any encrypted data it might encounter.
  • Unlike , which exists solely to deal with file encryption or decryption, ansible-playbook is more general-purpose, and it will not assume it is dealing with encrypted data by default.
  • Luckily, all of our familiar —vault-id parameters from the previous examples work just the same in ansible-playbook as they do in and requires no special handling using ansible vault in playbook
  • Ansible will hold the provided passwords and IDs in memory for the duration of the playbook execution.

I have a playbook file with below content

---
- name: This is a secret file
  hosts: server2.example.com
  tasks:
    - name: Execute command 'date'
      command: date

In the below ansible vault example, We will execute this playbook with «» which will prompt us with the password for the yml file before processing the playbook.

$ ansible-playbook --vault-id @prompt secret.yml
Vault password (default):

PLAY  ************************************************************************************

TASK  ******************************************************************************************
ok: 

TASK  ***********************************************************************************
changed: 

PLAY RECAP ******************************************************************************************************
server2.example.com        : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

So here we are using ansible vault in playbook, after we provide the password ansible-playbook will process the yml file tasks.

Использование файла паролей

Если вам нужно автоматизировать процесс инициализации серверов в Ansible с помощью стороннего инструмента, вам потребуется способ ввода пароля хранилища без его запроса. Вы можете сделать это, используя файл паролей через ansible-vault.

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

Чтобы применить файл паролей в ansible-vault, необходимо указать путь к файлу паролей при выполнении любой из команд vault:

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

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

Использование Ansible Vault на практике

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

  • Непроверенная расшифровка
  • Несколько хранилищ
  • смена ключей

Непроверенная расшифровка

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

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

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

Несколько хранилищ

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

Приведенный выше код создаст хранилище и запросить пароль во время выполнения (как отмечено строка). Если у вас уже есть файл пароля, который вы хотели бы использовать, просто укажите путь к файлу.

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

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

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

смена ключей

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

Проходя в Параметр позволяет легко сменить пароль, которым зашифрованы секреты.

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

Use encrypt_string to create encrypted variables to embed in yaml¶

The command will encrypt and format a provided string into a format
that can be included in YAML files.

To encrypt a string provided as a cli arg:

ansible-vault encrypt_string --vault-password-file a_password_file 'foobar' --name 'the_secret'

Result:

the_secret !vault |
      $ANSIBLE_VAULT;1.1;AES256
      62313365396662343061393464336163383764373764613633653634306231386433626436623361
      6134333665353966363534333632666535333761666131620a663537646436643839616531643561
      63396265333966386166373632626539326166353965363262633030333630313338646335303630
      3438626666666137650a353638643435666633633964366338633066623234616432373231333331
      6564

To use a vault-id label for ‘dev’ vault-id:

ansible-vault encrypt_string --vault-id _password_file 'foooodev' --name 'the_dev_secret'

Result:

the_dev_secret !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          30613233633461343837653833666333643061636561303338373661313838333565653635353162
          3263363434623733343538653462613064333634333464660a663633623939393439316636633863
          61636237636537333938306331383339353265363239643939666639386530626330633337633833
          6664656334373166630a363736393262666465663432613932613036303963343263623137386239
          6330

To encrypt a string read from stdin and name it ‘db_password’:

echo -n 'letmein' | ansible-vault encrypt_string --vault-id _password_file --stdin-name 'db_password'

Warning

This method leaves the string in your shell history. Do not use it outside of testing.

Result:

Reading plaintext input from stdin. (ctrl-d to end input)
db_password !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          61323931353866666336306139373937316366366138656131323863373866376666353364373761
          3539633234313836346435323766306164626134376564330a373530313635343535343133316133
          36643666306434616266376434363239346433643238336464643566386135356334303736353136
          6565633133366366360a326566323363363936613664616364623437336130623133343530333739
          3039

To be prompted for a string to encrypt, encrypt it, and give it the name ‘new_user_password’:

ansible-vault encrypt_string --vault-id _password_file --stdin-name 'new_user_password'

Output:

Reading plaintext input from stdin. (ctrl-d to end input)

User enters ‘hunter2’ and hits ctrl-d.

Warning

Do not press Enter after supplying the string. That will add a newline to the encrypted value.

Result:

new_user_password !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          37636561366636643464376336303466613062633537323632306566653533383833366462366662
          6565353063303065303831323539656138653863353230620a653638643639333133306331336365
          62373737623337616130386137373461306535383538373162316263386165376131623631323434
          3866363862363335620a376466656164383032633338306162326639643635663936623939666238
          3161

See also

After you added the encrypted value to a var file (vars.yml), you can see the original value using the debug module.

Лучшие практики

Безопасность сложна, особенно когда речь идет об использовании секретов в системах автоматизации. Имея это в виду, ниже приведены несколько рекомендаций, которые следует использовать при использовании Ansible Vault. Хотя мы рассмотрели некоторые из них ранее, было бы целесообразно повторить эту практику.

  • Защищенные ACL и неверсированные файлы паролейФайлы паролей не должны храниться в системах контроля версий, таких как GIT. Кроме того, убедитесь, что только соответствующие пользователи могут получить доступ к файлу паролей.
  • Отдельные хранилищаОбычно используется много разных сред. Поэтому лучше всего разделить необходимые учетные данные на соответствующие хранилища.
  • Регулярное изменение пароля к файлу и переменнойВ случае повторного использования или утечки пароля лучше всего регулярно вводить новые пароли, чтобы использовать их для ограничения риска.

OS Distribution Variables

The binary works on most Linux platforms and is not distribution
specific. However, some distributions require installation of specific OS
packages with different naming, so this role was built with support for
popular Linux distributions and defines these variables to deal with the
differences across distributions:

  • Vault package filename
  • Default value:
  • Vault package download URL
  • Default value:
  • List of OS packages to install
  • Default value: list
  • Vault package filename
  • Default value:
  • Vault package download URL
  • Default value:
  • Vault download SHA256 summary
  • Default value: SHA256 summary
  • List of OS packages to install
  • Default value: list
  • Vault package filename
  • Default value:
  • Vault package download URL
  • Default value:
  • Vault package SHA256 summary
  • Default value: SHA256 summary
  • List of OS packages to install
  • Default value: list
  • Vault package filename
  • Default value:
  • Vault package download URL
  • Default value:
  • Vault package SHA256 summary
  • Default value: SHA256 summary
  • Enable log to
  • Default value: false
  • Enable logrotation for systemd based systems
  • Default value: false
  • Determines how frequently to rotate vault logs
  • Default value: 7
  • Logrotate template file
  • Default value:
  • List of OS packages to install
  • Default value: list

Управление выполнением плейбука

Вы можете использовать опцию –start-at-task, чтобы определить новую точку входа вашего плейбука. Затем Ansible пропустит все, что предшествует указанной задаче, выполнив оставшуюся часть play с заданного момента. Эта опция в качестве аргумента требует правильное имя задачи:

Чтобы выполнять только задачи, связанные с конкретными тегами, вы можете использовать опцию –tags. Например, если вы хотите выполнить только задачи, помеченные как nginx или mysql, вы можете использовать:

Если вы хотите пропустить все задачи, которые находятся под определенными тегами, используйте –skip-tags. Следующая команда будет выполнять myplaybook.yml, пропуская все задачи, помеченные как mysql:

Ansible Vault для хранения конфиденциальных данных

Если ваши плейбуки Ansible содержат конфиденциальные данные, такие как пароли, ключи API и учетные данные, важно обеспечить их безопасность с помощью шифрования. Ansible предоставляет ansible-vault для шифрования файлов и переменных

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

Создание нового зашифрованного файла

Вы можете создать новый зашифрованный файл Ansible с помощью:

Эта команда выполнит следующие действия:

  1. Сначала вам будет предложено ввести новый пароль. Вам нужно будет указывать этот пароль при каждом доступе к содержимому файла, будь то редактирование, просмотр или просто запуск плейбука (или команд с использованием его значений).
  2. Затем откроется редактор командной строки по умолчанию, чтобы вы могли заполнить файл требуемым содержимым.
  3. Наконец, когда вы закончите редактирование, ansible-vault сохранит файл как зашифрованный.

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

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

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

Просмотр содержимого зашифрованного файла

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

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

Редактирование зашифрованного файла

Чтобы изменить содержимое файла, который ранее был зашифрован с помощью Ansible Vault, выполните:

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

Расшифровка файлов

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

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

Заключение

Как и в случае любой системы автоматизации, очень важно, чтобы секреты были должным образом защищены и контролировались. Благодаря Ansible Vault этот процесс становится простым и гибким

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

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

Просмотры:
369

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: