Поиск, перешифрация и удаление устаревших ключей шифрования#
В данном разделе описаны 3 различных сценария администрирования, связанных с ключами шифрования:
просмотр и подсчет количества сообщений, зашифрованных различными ключами шифрования;
перешифрование сообщений со «старых» ключей шифрования на «новый»;
удаление «старого» ключа шифрования.
Данные сценарии администрирования осуществляются с помощью выполнения скриптов Ansible, которые используют инструменты encryption-message-cli-{version}.jar (описана в разделе Утилита шифрования Encryption_message_cli) и jmxterm-{version}.jar, поставляемые в дистрибутиве SMB. После установки продукта данные утилиты попадают в папку {artemis.installdir}/tools/.
Просмотр и подсчет сообщений, зашифрованных различными ключами шифрования#
Предусловия#
В файле vars.yml необходимо предварительно заполнить блок настроек:
...
artemis:
encryption_plugin:
enable: true # активация плагина шифрования сообщений на брокере
...
addresses: [] # наименование адресов или адрес:очередь, для которых будет проводиться шифрование сообщений (поддерживаются wildCard-шаблоны Artemis)
# - "queues.test_1.Q1"
- "#::#"
secrets: # ключи для шифрования/дешифрования сообщения
- secret: ./etc/encrypt.pass # путь до ключа для шифрования/дешифрования сообщения - «старый» ключ шифрования
alias: file_secret # алиас ключа для указания в activeSecret
- secret: ./etc/new_encrypt.pass # путь до ключа в Vault для шифрования/дешифрования сообщения - «новый» ключ шифрования, которым сообщения будут перешифрованы
alias: new_file_secret # алиас ключа для указания в activeSecret
activeSecret: file_secret # Активный секрет - секрет, с помощью которого проводится шифрование сообщений на брокере на данный момент
...
Поиск и подсчет сообщений будет производиться для всех ключей шифрования, указанных в блоке artemis.encryption_plugin.secrets. Поиск будет осуществляться по всем адресам::очередям, указанным в разделе artemis.encryption_plugin.addresses. В данном примере поиск будет осуществляться по всем адресам::очередям в кластере.
Ручной способ#
На сервере, с которого производилась установка, выполнить команду:
ansible-playbook -i inventories/<ID>/inventory reencrypt_messages.yml -t check_only --ask-vault-pass
, где ID — имя созданного inventory.
С помощью Jenkins#
Наименование задания Jenkins: artemis_custom. Запустить данную Jenkins Job с ниже перечисленными параметрами.
Параметры запуска:
job_config_renew— параметр, использующийся для перенастройки задания Jenkins. Его необходимо включить, если был добавлен новыйinventoryили изменен файлjenkins_defaults.groovy. Меняет значения по умолчанию всех параметров. Сохраняет предыдущее состояние параметров inventories_repo, inventories_branch, inventories_path. Обновляет список тегов для всех playbooks. По умолчанию не указывается;inventory— выбратьinventory, для которого необходимо произвести последовательное обновление;nexusUrl— полный путь до дистрибутива (можно указать несколько через запятую);playbook— указать значение reencrypt_messages.yml;tags- указать для поиска зашифрованных сообщений tagscheck_only(перешифрация производится не будет);install_all_hosts— запуск на всех hosts;only_on_host— отметить галочками нужные хосты. Доступен для выбора только в случае, когда не выбран параметрinstall_all_hosts;emailTo— список адресов электронной почты для отправки технических писем с логами;custom_vault_password— указывается, если нужен ручной ввод пароля для Ansible Vault;jenkins_slave— выбор Slave Jenkins;jdk_tool— указать Jenkins Tool с нужной версией JDK;ansible_branch— ветка скриптов развертывания (в настройках Jenkins Job указать ${ansible_branch});ansible_version— версия используемого ansible, например ansible29;nexus_user_cred— ID credential типа username with password для выкачивания дистрибутива. При задании параметра secman_url - полный путь в HashiCorp Vault до имени пользователя и пароля, например {ID credential типа vault app role для получение секретов из HashiCorp Vault}|/<путь до>/nexus:{user},{password};vault_cred— ID credential типа secret file со строкой для расшифровки паролей (ansible vault) (можно указывать несколько через запятую). При задании параметра secman_url - полный путь в HashiCorp Vault до пароля, например {ID credential }|/<путь до>/vault:{password_1},{ID credential _2}|/<путь до>/vault:{password_2} (в качестве пароля можно использовать не строку, а файл в base64 формате с ключом секрета, заканчивающимся на Base64, например myVaultBase64);server_ssh_cred— ID credential типа ssh key для подключения к серверам. При задании параметра secman_url - полный путь в HashiCorp Vault, например {ID credential типа vault app role для получение секретов из HashiCorp Vault}|/<путь до>/ssh:{юзер},{ключ},{passphrase} (в качестве ключа можно использовать не строку, а файл в base64 формате с ключом секрета, заканчивающимся на Base64, например myPrivateKeyBase64);secman_url— URL для подключения к HashiCorp Vault;ssl_verify— проверяем, являются ли сертификаты HashiCorp Vault/Nexus доверенными;inventories_repo— репозиторий с inventory (ssh://);inventories_branch— ветка репозитория;inventories_path— путь до inventories от корня репозитория.
Результат#
После запуска данного сценария будет получена сводная таблица со всеми ключами, указанными в файле vars.yml и количеством зашифрованных сообщений в каждой очереди.
Пример полученного результата:
╔══════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ Key alias: file_secret ................................................................................. ║
║ Key hash: 3c7d4c11d60e78e0b6108568cba4670ef9a6a83a8df3233adbf4cf4b1ac23250 ............................. ║
╠══════════════════════════════════════════════════════════════════════════════════════╦═══════════════════╣
║ .............................. Address | Type | Queue .............................. ║ Count of messages ║
╠══════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ DLQ | anycast | DLQ ................................................................ ║ ............... 0 ║
║ ExpiryQueue | anycast | ExpiryQueue ................................................ ║ ............... 0 ║
║ TEST | anycast | TEST .............................................................. ║ .............. 10 ║
║ test2 | anycast | test2 ............................................................ ║ ............... 0 ║
╠══════════════════════════════════════════════════════════════════════════════════════╩═══════════════════╣
║ Key alias: new_file_secret ............................................................................. ║
║ Key hash: de9249813c270855beb19b02fdd037c6eb52c31468f64056535838ce2246bbac ............................. ║
╠══════════════════════════════════════════════════════════════════════════════════════╦═══════════════════╣
║ .............................. Address | Type | Queue .............................. ║ Count of messages ║
╠══════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ DLQ | anycast | DLQ ................................................................ ║ ............... 0 ║
║ ExpiryQueue | anycast | ExpiryQueue ................................................ ║ ............... 0 ║
║ TEST | anycast | TEST .............................................................. ║ .............. 11 ║
║ test2 | anycast | test2 ............................................................ ║ ............... 0 ║
╠══════════════════════════════════════════════════════════════════════════════════════╩═══════════════════╣
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Перешифрование сообщений со «старого» ключа шифрования на «новый»#
Перешифрование сообщений со «старого» ключа шифрования на «новый» происходит в режиме недоступности брокера.
Если значение параметра check_cluster_join установлено в true (# Проверка восстановления топологии кластера, параметр находится в файле vars.yml, раздел artemis.reencrypt_messages), тогда перед процессом перешифрации сообщений происходит предварительное чтение топологии кластера (в память текущей задачи SMBX попадают данные о количестве и конфигурации брокеров в данном кластере).
Далее брокера по очереди становятся недоступными для внешних соединений, затем происходит перешифрование сообщений со «старого» ключа шифрования на «новый» на отключенном брокере, после окончания процесса перешифрования сообщений на брокере, он становится снова доступным для внешних подключений.
После перешифрации сообщений на каждом брокере кластера производится проверка, что каждый «обработанный» брокер восстановил работу в кластере. Таким образом происходит проверка соответствия первичной топологии кластера.
Если после перешифрации брокер не запускается — происходит прерывание работы процесса на проверке вхождения в топологию. После чего необходимо либо восстановить архивную копию кластера, либо проанализировать логи, исправить ошибки конфигурирования и перезапустить процесс перешифрования сообщений в кластере.
Сообщения на брокере будут зашифрованы уже «новым» ключом шифрования.
Предусловия#
В файле vars.yml необходимо предварительно заполнить блок настроек:
...
artemis:
encryption_plugin:
enable: true # активация плагина шифрования сообщений на брокере
...
addresses: [] # наименование адресов или адрес:очередь, для которых будет проводиться шифрование сообщений (поддерживаются wildCard-шаблоны Artemis)
# - "queues.test_1.Q1"
- "#::#"
secrets: # ключи для шифрования/дешифрования сообщения
- secret: ./etc/encrypt.pass # путь до ключа для шифрования/дешифрования сообщения - «старый» ключ шифрования
alias: file_secret # алиас ключа для указания в activeSecret
- secret: ./etc/new_encrypt.pass # путь до ключа в Vault для шифрования/дешифрования сообщения - «новый» ключ шифрования, которым сообщения будут перешифрованы
alias: new_file_secret # алиас ключа для указания в activeSecret
activeSecret: new_file_secret # Активный секрет - секрет, с помощью которого проводится шифрование сообщений на брокере на данный момент. Данный параметр должен быть заполнен «новым» ключом шифрования.
...
Перешифрование сообщений будет осуществляться для адресов::очередей, указанных в параметре artemis.encryption_plugin.addresses, «новым» ключом шифрования, который необходимо задать в параметре artemis.encryption_plugin.activeSecret.
Ручной способ#
На сервере, с которого производилась установка, выполнить команду:
ansible-playbook -i inventories/<ID>/inventory reencrypt_messages.yml --ask-vault-pass
, где ID — имя созданного inventory.
С помощью Jenkins#
Наименование задания Jenkins: artemis_custom. Запустить данную Jenkins Job с ниже перечисленными параметрами.
Параметры запуска:
job_config_renew— параметр, использующийся для перенастройки задания Jenkins. Его необходимо включить, если был добавлен новыйinventoryили изменен файлjenkins_defaults.groovy. Меняет значения по умолчанию всех параметров. Сохраняет предыдущее состояние параметров inventories_repo, inventories_branch, inventories_path. Обновляет список тегов для всех playbooks. По умолчанию не указывается;inventory— выбратьinventory, для которого необходимо произвести последовательное обновление;nexusUrl— полный путь до дистрибутива (можно указать несколько через запятую);playbook— указать значение reencrypt_messages.yml;tags- оставить поле пустым;install_all_hosts— запуск на всех hosts;only_on_host— отметить галочками нужные хосты. Доступен для выбора только в случае, когда не выбран параметрinstall_all_hosts;emailTo— список адресов электронной почты для отправки технических писем с логами;custom_vault_password— указывается, если нужен ручной ввод пароля для Ansible Vault;jenkins_slave— выбор Slave Jenkins;jdk_tool— указать Jenkins Tool с нужной версией JDK;ansible_branch— ветка скриптов развертывания (в настройках Jenkins Job указать ${ansible_branch});ansible_version— версия используемого ansible, например ansible29;nexus_user_cred— ID credential типа username with password для выкачивания дистрибутива. При задании параметра secman_url - полный путь в HashiCorp Vault до имени пользователя и пароля, например {ID credential типа vault app role для получение секретов из HashiCorp Vault}|/<путь до>/nexus:{user},{password};vault_cred— ID credential типа secret file со строкой для расшифровки паролей (ansible vault) (можно указывать несколько через запятую). При задании параметра secman_url - полный путь в HashiCorp Vault до пароля, например {ID credential }|/<путь до>/vault:{password_1},{ID credential _2}|/<путь до>/vault:{password_2} (в качестве пароля можно использовать не строку, а файл в base64 формате с ключом секрета, заканчивающимся на Base64, например myVaultBase64);server_ssh_cred— ID credential типа ssh key для подключения к серверам. При задании параметра secman_url - полный путь в HashiCorp Vault, например {ID credential типа vault app role для получение секретов из HashiCorp Vault}|/<путь до>/ssh:{юзер},{ключ},{passphrase} (в качестве ключа можно использовать не строку, а файл в base64 формате с ключом секрета, заканчивающимся на Base64, например myPrivateKeyBase64);secman_url— URL для подключения к HashiCorp Vault;ssl_verify— проверяем, являются ли сертификаты HashiCorp Vault/Nexus доверенными;inventories_repo— репозиторий с inventory (ssh://);inventories_branch— ветка репозитория;inventories_path— путь до inventories от корня репозитория.
Результат#
Все сообщения в указанных адресах::очередях (параметр artemis.encryption_plugin.addresses) будут перешифрованы «новым» ключом шифрования (параметр artemis.encryption_plugin.activeSecret). Для проверки можно запустить сценарий администрирования Просмотр и подсчет сообщений, зашифрованных различными ключами шифрования, описанный выше.
Удаление старого ключа шифрования#
В случае удаления ключа, дешифрация сообщений, зашифрованных данным ключом, станет невозможной. Рекомендуется предварительно провести проверку отсутствия сообщений, зашифрованных «старым» ключом, который подлежит удалению (раздел Просмотр и подсчет сообщений, зашифрованных различными ключами шифрования выше).
Предусловия#
В файле vars.yml необходимо удалить либо закомментировать (символ # в начале строки) «старый» ключ шифрования из блока artemis.encryption_plugin.secrets:
...
artemis:
encryption_plugin:
enable: true # активация плагина шифрования сообщений на брокере
...
addresses: [] # наименование адресов или адрес:очередь, для которых будет проводиться шифрование сообщений (поддерживаются wildCard-шаблоны Artemis)
# - "queues.test_1.Q1"
- "#::#"
secrets: # ключи для шифрования/дешифрования сообщения
- secret: ./etc/new_encrypt.pass # путь до ключа в Vault для шифрования/дешифрования сообщения - «новый» ключ шифрования, которым сообщения будут перешифрованы
alias: new_file_secret # алиас ключа для указания в activeSecret
activeSecret: new_file_secret # Активный секрет - секрет, с помощью которого проводится шифрование сообщений на брокере на данный момент. Данный параметр должен быть заполнен «новым» ключом шифрования.
...
Ручной способ#
На сервере, с которого производилась установка, выполнить команду:
ansible-playbook -i inventories/<ID>/inventory artemis.yml -t encryption_plugin --ask-vault-pass
, где ID — имя созданного inventory.
С помощью Jenkins#
Наименование задания Jenkins: artemis_custom. Запустить данную Jenkins Job с ниже перечисленными параметрами.
Параметры запуска:
job_config_renew— параметр, использующийся для перенастройки задания Jenkins. Его необходимо включить, если был добавлен новыйinventoryили изменен файлjenkins_defaults.groovy. Меняет значения по умолчанию всех параметров. Сохраняет предыдущее состояние параметров inventories_repo, inventories_branch, inventories_path. Обновляет список тегов для всех playbooks. По умолчанию не указывается;inventory— выбратьinventory, для которого необходимо произвести последовательное обновление;nexusUrl— полный путь до дистрибутива (можно указать несколько через запятую);playbook— указать значение artemis.yml;tags- указать значениеencryption_plugin;install_all_hosts— запуск на всех hosts;only_on_host— отметить галочками нужные хосты. Доступен для выбора только в случае, когда не выбран параметрinstall_all_hosts;emailTo— список адресов электронной почты для отправки технических писем с логами;custom_vault_password— указывается, если нужен ручной ввод пароля для Ansible Vault;jenkins_slave— выбор Slave Jenkins;jdk_tool— указать Jenkins Tool с нужной версией JDK;ansible_branch— ветка скриптов развертывания (в настройках Jenkins Job указать ${ansible_branch});ansible_version— версия используемого ansible, например ansible29;nexus_user_cred— ID credential типа username with password для выкачивания дистрибутива. При задании параметра secman_url - полный путь в HashiCorp Vault до имени пользователя и пароля, например {ID credential типа vault app role для получение секретов из HashiCorp Vault}|/<путь до>/nexus:{user},{password};vault_cred— ID credential типа secret file со строкой для расшифровки паролей (ansible vault) (можно указывать несколько через запятую). При задании параметра secman_url - полный путь в HashiCorp Vault до пароля, например {ID credential }|/<путь до>/vault:{password_1},{ID credential _2}|/<путь до>/vault:{password_2} (в качестве пароля можно использовать не строку, а файл в base64 формате с ключом секрета, заканчивающимся на Base64, например myVaultBase64);server_ssh_cred— ID credential типа ssh key для подключения к серверам. При задании параметра secman_url - полный путь в HashiCorp Vault, например {ID credential типа vault app role для получение секретов из HashiCorp Vault}|/<путь до>/ssh:{юзер},{ключ},{passphrase} (в качестве ключа можно использовать не строку, а файл в base64 формате с ключом секрета, заканчивающимся на Base64, например myPrivateKeyBase64);secman_url— URL для подключения к HashiCorp Vault;ssl_verify— проверяем, являются ли сертификаты HashiCorp Vault/Nexus доверенными;inventories_repo— репозиторий с inventory (ssh://);inventories_branch— ветка репозитория;inventories_path— путь до inventories от корня репозитория.
Результат#
«Старый» ключ шифрования будет удален из конфигурационного файла плагина encryption_msg_plugin.conf и все сообщения, зашифрованные данным ключом будут недоступны для дешифрации.