Поиск, перешифрация и удаление устаревших ключей шифрования#

В данном разделе описаны 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. Сохраняет предыдущее состояние параметров inventories_repo, inventories_branch, inventories_path. Обновляет список тегов для всех playbooks. По умолчанию не указывается;

  • inventory — выбрать inventory, для которого необходимо произвести последовательное обновление;

  • nexusUrl — полный путь до дистрибутива (можно указать несколько через запятую);

  • playbook — указать значение reencrypt_messages.yml;

  • tags - указать для поиска зашифрованных сообщений tags check_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 — Jenkins Username With Password Credential ID для выкачивания дистрибутива устанавливаемого компонента из Nexus. Чтобы получить username и password для Nexus из SecMan, надо заполнить поле secman_url и это поле в формате:
    JenkinsCredID|SecManPath:SecManKeys|SecManParams
    Здесь:
    JenkinsCredID - Jenkins Vault App Role Credential ID c реквизитами для подключения к SecMan;
    SecManPath - Путь к секретам в SecMan;
    SecManKeys - Имена полей для username и password в SecMan через запятую;
    SecManParams - Параметры для подключения к SecMan через точку с запятой. Могут быть пропущены вместе с |, если параметры по умолчанию;

  • vault_cred — Jenkins secret file credential ID со строкой для расшифровки паролей ansible vault (можно несколько через запятую). Чтобы получить ansible vault password из SecMan, надо заполнить поле secman_url и это поле в формате:
    JenkinsCredID|SecManPath:SecManKey|SecManParams
    Здесь:
    JenkinsCredID - Jenkins Vault App Role Credential ID с реквизитами для подключения к SecMan;
    SecManPath - Путь к секрету в SecMan;
    SecManKey - Имя поля для ansible vault password в SecMan;
    SecManParams - Параметры для подключения к SecMan, через точку с запятой. Могут быть пропущены вместе с |, если параметры по умолчанию (в качестве пароля можно использовать не строку, а файл в base64 формате и секрет в SecMan с именем, оканчивающимся на „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 доверенными;

  • second_hand_approve — подтверждение запуска другим администратором (контроль «второй рукой»). Двухэтапное подтверждение запуска, требующее действия другого администратора для запуска задания Jenkins Job. При активации этой опции одному администратору будет недоступна возможность запуска задания Jenkins Job без подтверждения со стороны другого администратора;

  • inventories_repo — репозиторий с inventory (ssh://);

  • inventories_branch — ветка репозитория;

  • inventories_path — путь до inventories от корня репозитория.

Результат#

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

Пример полученного результата:

╔══════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ Key alias: file_secret ................................................................................. ║
║ Key hash: <hash> ....................................................................................... ║
╠══════════════════════════════════════════════════════════════════════════════════════╦═══════════════════╣
║ .............................. 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: <hash> ....................................................................................... ║
╠══════════════════════════════════════════════════════════════════════════════════════╦═══════════════════╣
║ .............................. 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. Сохраняет предыдущее состояние параметров 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 — Jenkins Username With Password Credential ID для выкачивания дистрибутива устанавливаемого компонента из Nexus. Чтобы получить username и password для Nexus из SecMan, надо заполнить поле secman_url и это поле в формате:
    JenkinsCredID|SecManPath:SecManKeys|SecManParams
    Здесь:
    JenkinsCredID - Jenkins Vault App Role Credential ID c реквизитами для подключения к SecMan;
    SecManPath - Путь к секретам в SecMan;
    SecManKeys - Имена полей для username и password в SecMan через запятую;
    SecManParams - Параметры для подключения к SecMan через точку с запятой. Могут быть пропущены вместе с |, если параметры по умолчанию;

  • vault_cred — Jenkins secret file credential ID со строкой для расшифровки паролей ansible vault (можно несколько через запятую). Чтобы получить ansible vault password из SecMan, надо заполнить поле secman_url и это поле в формате:
    JenkinsCredID|SecManPath:SecManKey|SecManParams
    Здесь:
    JenkinsCredID - Jenkins Vault App Role Credential ID с реквизитами для подключения к SecMan;
    SecManPath - Путь к секрету в SecMan;
    SecManKey - Имя поля для ansible vault password в SecMan;
    SecManParams - Параметры для подключения к SecMan, через точку с запятой. Могут быть пропущены вместе с |, если параметры по умолчанию (в качестве пароля можно использовать не строку, а файл в base64 формате и секрет в SecMan с именем, оканчивающимся на „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. Сохраняет предыдущее состояние параметров 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 — Jenkins Username With Password Credential ID для выкачивания дистрибутива устанавливаемого компонента из Nexus. Чтобы получить username и password для Nexus из SecMan, надо заполнить поле secman_url и это поле в формате:
    JenkinsCredID|SecManPath:SecManKeys|SecManParams
    Здесь:
    JenkinsCredID - Jenkins Vault App Role Credential ID c реквизитами для подключения к SecMan;
    SecManPath - Путь к секретам в SecMan;
    SecManKeys - Имена полей для username и password в SecMan через запятую;
    SecManParams - Параметры для подключения к SecMan через точку с запятой. Могут быть пропущены вместе с |, если параметры по умолчанию;

  • vault_cred — Jenkins secret file credential ID со строкой для расшифровки паролей ansible vault (можно несколько через запятую). Чтобы получить ansible vault password из SecMan, надо заполнить поле secman_url и это поле в формате:
    JenkinsCredID|SecManPath:SecManKey|SecManParams
    Здесь:
    JenkinsCredID - Jenkins Vault App Role Credential ID с реквизитами для подключения к SecMan;
    SecManPath - Путь к секрету в SecMan;
    SecManKey - Имя поля для ansible vault password в SecMan;
    SecManParams - Параметры для подключения к SecMan, через точку с запятой. Могут быть пропущены вместе с |, если параметры по умолчанию (в качестве пароля можно использовать не строку, а файл в base64 формате и секрет в SecMan с именем, оканчивающимся на „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 и все сообщения, зашифрованные данным ключом будут недоступны для дешифрации.