Ansible Sign#
Ansible Sign – это инструмент командной строки, позволяющий обеспечить надежную передачу содержимого Ansible от разработчиков к пользователям с помощью цифровой подписи. Это простой способ обеспечить защиту содержимого, исключающий возможность его несанкционированного изменения и повышающий надежность автоматизации, особенно в критически важных или многопользовательских средах.
Для создания и проверки цифровой подписи Ansible Sign использует GPG – набор утилит от проекта GNU, реализующих протокол OpenGPG.
Примечание
Подробности использования GPG доступны на сайте проекта The GNU Privacy Guard, а описание протокола OpenPGP в RFC 4880.
Применение Ansible Sign для контроля целостности проекта показано на схеме:
Разработчик публикует проект Ansible в SCM-системе, например, в репозитории GitFlic.
SCM-система подписывает содержимое приватным ключом GPG.
Пользователь синхронизирует содержимое с SCM-системой.
Пользователь запускает проверку целостности полученного проекта, используя публичный ключ GPG. Утилита Ansible Sign проверяет цифровую подпись и контрольные суммы файлов.
Проверка может быть выполнена следующими способами:
вручную;
автоматически.
Для автоматической проверки в Automation Controller или контроллере EDA создайте полномочие типа «Публичный ключ GPG». Если проверка целостности не будет успешной, Automation Controller и контроллер EDA заблокируют использование содержимого.
Установка#
Для установки Ansible Sign выполните следующие действия:
Подключите репозиторий Astra Automation.
Инструкция по подключению репозитория
В каталоге
/etc/apt/sources.list.d/
создайте файлastra-automation.list
со ссылкой на репозиторий Astra Automation:deb https://dl.astralinux.ru/aa/aa-debs-for-alse-1.8 <version> main
Вместо <version> необходимо подставить версию устанавливаемой платформы, например,
1.2
.Доступные версии продукта опубликованы в таблице История обновлений.
Обновите список доступных пакетов:
sudo apt update
Установите пакет
ansible-sign
:sudo apt install ansible-sign --yes
Установка при отсутствии доступа к интернету описана в документе Средства разработки.
Создание хранилища и ключей#
Для создания пары ключей GPG выполните следующие действия:
Проверьте наличие хранилища ключей:
gpg --list-secret-keys
Если хранилище не существует, утилита создаст его, о чем свидетельствует следующий вывод в терминал:
Если хранилище существует, но не содержит ключей, вывод утилиты будет пустым.
Если в хранилище уже существуют ключи, утилита выводит информацию о них, например:
Для создания пары ключей выполните команду:
gpg --full-generate-key
В терминал выводится приглашение для выбора типа ключа:
Для выбора нужного типа ключа укажите число, стоящее в скобках рядом с названием, и нажмите Enter.
Совет
Рекомендуется использовать ключи типа RSA и RSA.
В терминал выводится приглашение для выбора длины ключа:
Введите нужную длину ключа и нажмите Enter.
Совет
Рекомендуется использовать ключи длиной не менее 4096 бит.
В терминал выводится приглашение для ввода срока действия ключа:
Укажите срок действия ключа и нажмите Enter.
В терминал выводится запрос на подтверждение корректности выбранного срока действия ключа:
Для подтверждения корректности выбранного срока действия ключа введите
y
и нажмите Enter.В терминал выводится приглашение ко вводу вашего полного имени:
Введите латиницей ваше полное имя, например,
John Dow
, и нажмите Enter.В терминал выводится приглашение ко вводу адреса электронной почты:
Введите адрес электронной почты и нажмите Enter.
В терминал выводится приглашение ко вводу примечания.
Введите текст примечания и нажмите Enter.
В терминал выводится запрос на подтверждение корректности введенных данных, например:
Чтобы подтвердить корректность введенных данных, введите
O
и нажмите Enter.В терминал выводится диалоговое окно для ввода пароля для защиты ключа:
Введите пароль и нажмите Enter.
В терминал выводится диалоговое окно для ввода подтверждения пароля:
Введите пароль еще раз и нажмите Enter.
В терминал выводится сообщение о необходимости получения множества случайных чисел:
Для увеличения энтропии случайным образом двигайте мышь и нажимайте клавиши на клавиатуре до тех пор, пока в терминал не выводится сообщение о создании ключей и сертификата, например:
Распространение публичного ключа#
Чтобы подготовить публичный ключ GPG к передаче пользователям, выполните следующие действия:
Получите список существующих ключей:
gpg --list-secret-keys
Команда выводит в терминал список ключей и их отпечатков (fingerprints), например:
Здесь
A90B44D4C5967DDF9280A737A92BB253E671651D
– отпечаток ключа.Выполните команду экспорта публичной части ключа:
gpg --export --armor <fingerprint> > <file>
Здесь:
<fingerprint> – отпечаток ключа;
<file> – путь к файлу для сохранения публичного ключа. Как правило, такие файлы имеют расширение
.asc
. Например, файл с ключом GPG, которым подписаны файлы в APT-репозиториях PostgreSQL, имеет название ACCC4CF8.asc.
Любым удобным способом передайте файл с публичным ключом пользователям содержимого Ansible.
Чтобы использовать публичный ключ GPG для автоматической проверки содержимого при использовании в Automation Controller или контроллере EDA, выполните следующие действия:
Используйте файл с публичным ключом GPG для создания полномочия типа «Открытый ключ GPG» (GPG Public Key).
В настройках проекта заполните поле Учетные данные для проверки подписи содержимого (Content Signature Validation Credential), указав созданное полномочие.
Синхронизируйте проект с источником.
Примечание
Инструкции по созданию полномочий, настройке и синхронизации проектов приведены в соответствующих разделах.
Импорт ключей#
Импорт ключей необходим для проверки целостности полученного содержимого Ansible.
По умолчанию ключи импортируются в стандартное хранилище – файл ~/.gnupg/trustdb.gpg
.
В некоторых случаях целесообразно использовать отдельное хранилище для ключей GPG.
Чтобы импортировать ключ GPG в отдельное хранилище, в аргументах команды gpg
укажите опции --no-default-keyring
и --keyring
.
Чтобы импортировать публичный ключ в отдельное хранилище, выполните следующие действия:
Загрузите ключ в формате
.asc
на компьютер.Создайте хранилище ключей и импортируйте в него загруженный ключ:
gpg \ --no-default-keyring \ --keyring path/to/custom-keyring.gpg \ --import path/to/public/key.asc
Здесь:
--no-default-keyring
– запрет использования стандартного хранилища;--keyring
– путь к хранилищу, в которое импортируется ключ;--import
– путь к файлу ключа.
Убедитесь, что ключ успешно импортирован:
gpg \ --no-default-keyring \ --keyring path/to/custom-keyring.gpg \ --list-keys
Если импорт выполнен успешно, в терминал выводится список ключей.
Чтобы использовать импортированные ключи для проверки целостности содержимого, укажите путь к хранилищу в опции
--keyring
командыansible-sign
:ansible-sign project gpg-verify . --keyring path/to/custom-keyring.gpg
Подписывание содержимого#
Процесс подписывания содержимого Ansible состоит из двух этапов:
Создание файла
MANIFEST.in
.Этот файл содержит директивы, управляющие формирование списка файлов, которые необходимо контролировать.
Запуск утилиты
ansible-sign
.Утилита
ansible-sign
выполняет следующие операции:Формирует список файлов проекта на основе содержимого файла
MANIFEST.in
.Рассчитывает контрольные суммы указанных файлов.
Создает в каталоге проекта подкаталог
.ansible-sign/
, содержащий следующие файлы:sha256sum.txt
– контрольные суммы файлов;sha256sum.txt.sig
– цифровая подпись файла с контрольными суммами.
Создание файла MANIFEST.in
#
В корневом каталоге проекта создайте файл MANIFEST.in
.
В этом файле укажите директивы, управляющие списком файлов для расчета контрольных сумм.
Директивы#
В файле MANIFEST.in
допускается использование следующих директив:
- include <templates>#
Включает размещенные в корневом каталоге проекта файлы, названия которых удовлетворяют шаблонам <templates>.
Например, так можно включить все файлы с расширениями
.yaml
и.md
в корневом каталоге:include *.yaml *.md
- recursive-include <directory> <templates>#
Рекурсивно включает из каталогов, названия которых удовлетворяют шаблону <directory>, все файлы, названия которых удовлетворяют шаблонам <templates>.
Например, так можно включить все файлы с расширениями
.yaml
и.md
, размещенные в каталогеroles/
:recursive-include roles/ *.yaml *.md
- global-include <templates>#
Включает все файлы, названия которых удовлетворяет указанным шаблонам, независимо от каталога, в котором они находятся.
Например, так можно включить все файлы с расширением
.yaml
:global-include *.yaml
- exclude <templates>#
Исключает размещенные в корневом каталоге проекта файлы, названия которых удовлетворяют указанным шаблонам <templates>.
Например, так можно исключить файлы
.log
в корневом каталоге:exclude *.log
- recursive-exclude <directory> <templates>#
Исключает из каталога <directory> и его подкаталогов все файлы, названия которых удовлетворяют шаблонам. Например, так можно исключить все файлы с расширением
.bak
, размещенные в каталогеsrc/
и его подкаталогах:recursive-exclude src/ *.bak
- global-exclude <templates>#
Исключает все файлы проекта, названия которых удовлетворяют указанным шаблонам. Например, так можно исключить все файлы с расширениями
.tmp
и.log
:global-exclude *.tmp *.log
- grafs <templates>#
Рекурсивно включает содержимое каталогов, названия которых удовлетворяют указанному шаблону.
- prune <templates>#
Рекурсивно исключает содержимое каталогов, названия которых удовлетворяют указанному шаблону.
Ansible Sign обрабатывает символы в шаблонах следующим образом:
*
– любой символ любое количество раз.?
– любой символ.[chars]
– любой символ из перечисленных.Чтобы задать диапазон символов, используйте дефис, например:
global-exclude *.py[cod]
Эта директива исключит из списка подписываемых все файлы с расширениями
.pyc
,.pyo
и.pyd
.
Названия каталогов рассчитываются относительно корневого каталога проекта.
Директивы обрабатываются в порядке следования в файле MANIFEST.in
, например:
graft tests
global-exclude *.py[cod]
Директива graft
включит в список все содержимое каталога tests/
и его подкаталогов.
Следующая после нее директива global-exclude
исключит из списка файлы с расширениями .pyc
, .pyo
и .pyd
.
Запуск ansible-sign
#
Чтобы подписать проект, в его корневом каталоге выполните команду:
ansible-sign project gpg-sign .
Чтобы использовать для подписывания проекта определенный приватный ключ, укажите его отпечаток в опции --fingerprint
:
ansible-sign project gpg-sign . --fingerprint <fingerprint>
Подробное описание аргументов утилиты ansible-sign
см. в справочнике.
Проверка целостности#
Проверка целостности содержимого Ansible может быть выполнена вручную или автоматически.
Ручная проверка целостности#
Для ручной проверки целостности содержимого Ansible выполните в корневом каталоге проекта команду:
ansible-sign project gpg-verify .
В терминал выводятся результаты проверки, например:
Если контрольная сумма хотя бы одного файла не соответствует ожидаемой, в терминал выводится соответствующее сообщение:
Автоматическая проверка целостности#
Automation Controller и контроллер Event-Driven Ansible выполняют проверку целостности содержимого Ansible автоматически, если с проектом связано полномочие типа «Публичный ключ GPG» (GPG public key).
Инструкции по созданию полномочия:
Примеры#
Изучите использование Ansible Sign на примере подписывания файлов проекта.
Если у вас нет хранилища и пары ключей GPG, создайте их согласно инструкции.
В корневом каталоге проекта создайте файл
MANIFEST.in
, например:include README.md recursive-include playbooks *.yml prune .git
Выполните команду:
ansible-sign project --gpg-sign .
В терминал выводится диалоговое окно для ввода пароля секретного ключа OpenPGP:
Введите пароль секретного ключа OpenPGP и нажмите Enter.
В терминал будут выведены сообщения о ходе и результатах расчета контрольных сумм: