Сервис получает от Stronghold отдельного пользователя RabbitMQ с правами только на свой виртуальный хост и на ресурсы с заданным префиксом имени. Stronghold создаёт пользователя через RabbitMQ management HTTP API и удаляет его при отзыве или по истечении аренды.

Цель

Настроить выдачу динамических учётных данных RabbitMQ сервису orders: пользователь получает на виртуальном хосте orders права configure, write и read только на очереди и обмены с именами, начинающимися с orders., живёт 1 час с возможностью продления до 24 часов.

Предварительные требования

Для выполнения примера нужны:

  • Stronghold и токен с правами на настройку механизмов секретов и политик.
  • RabbitMQ с включённым плагином rabbitmq_management, management HTTP API доступен из Stronghold.
  • Созданный виртуальный хост orders, например командой rabbitmqctl add_vhost orders.
  • Доступ к rabbitmqctl для проверки: через d8 k exec в поде брокера или на узле RabbitMQ.

Шаг 1. Подготовьте учётную запись для Stronghold

Создайте в RabbitMQ отдельного пользователя с тегом administrator — от его имени Stronghold будет создавать и удалять пользователей:

rabbitmqctl add_user stronghold-admin '<STRONGHOLD_ADMIN_PASSWORD>'
rabbitmqctl set_user_tags stronghold-admin administrator

<STRONGHOLD_ADMIN_PASSWORD> — пароль пользователя stronghold-admin.

Не используйте эту учётную запись для других целей.

Шаг 2. Настройте механизм секретов

Включите механизм секретов RabbitMQ и подключите его к management HTTP API:

  1. Включите механизм секретов RabbitMQ:

    d8 stronghold secrets enable rabbitmq
  2. Настройте подключение к management HTTP API:

    d8 stronghold write rabbitmq/config/connection connection_uri="https://rabbitmq.example.com:15672" username="stronghold-admin" password="<STRONGHOLD_ADMIN_PASSWORD>"
  3. Задайте параметры аренды в секундах. Они действуют для всех ролей этого механизма секретов:

    d8 stronghold write rabbitmq/config/lease ttl=3600 max_ttl=86400

    Чтобы задать для разных сервисов разные сроки аренды, подключите отдельные экземпляры механизма секретов с аргументом -path.

Шаг 3. Создайте роль

Создайте роль, которая выдаёт права на виртуальный хост orders:

d8 stronghold write rabbitmq/roles/orders vhosts='{"orders":{"configure":"^orders\\..*","write":"^orders\\..*","read":"^orders\\..*"}}'
  • vhosts — JSON-карта виртуальных хостов и прав. Значения configure, write и read — регулярные выражения RabbitMQ для имён очередей и обменов;
  • tags не задан — пользователь не получает доступ к веб-интерфейсу management и HTTP API.

Если сервис публикует сообщения в обмен типа topic, ограничьте допустимые ключи маршрутизации параметром vhost_topics:

d8 stronghold write rabbitmq/roles/orders vhosts='{"orders":{"configure":"^orders\\..*","write":"^orders\\..*","read":"^orders\\..*"}}' vhost_topics='{"orders":{"orders.events":{"write":"^order\\.(created|paid)$","read":".*"}}}'

Шаг 4. Создайте политику

Создайте политику, которая разрешает читать учётные данные роли orders:

d8 stronghold policy write orders-rabbitmq - <<'POLICY'
path "rabbitmq/creds/orders" {
  capabilities = ["read"]
}
POLICY

Назначьте политику роли метода аутентификации, через который входит сервис, например роли метода Kubernetes, как в руководстве «Динамические учётные данные PostgreSQL». Продление и отзыв собственных аренд разрешены встроенной политикой default.

Шаг 5. Получите учётные данные

Запросите учётные данные роли orders и управляйте их арендой:

  1. Запросите учётные данные:

    d8 stronghold read rabbitmq/creds/orders

    Пример вывода:

    Key                Value
    ---                -----
    lease_id           rabbitmq/creds/orders/I39Hu8XXOombof4wiK5bKMn9
    lease_duration     1h
    lease_renewable    true
    password           3yNDBikgQvrkx2VA2zhq5IdSM7IWk1RyMYJr
    username           token-39669250-3894-8032-c420-3d58483ebfc4
  2. Продлите аренду до истечения lease_duration:

    d8 stronghold lease renew rabbitmq/creds/orders/I39Hu8XXOombof4wiK5bKMn9
  3. Когда учётные данные больше не нужны, отзовите аренду. Stronghold удалит пользователя в RabbitMQ:

    d8 stronghold lease revoke rabbitmq/creds/orders/I39Hu8XXOombof4wiK5bKMn9

Шаг 6. Доставьте учётные данные в сервис

Stronghold Agent продлевает аренду и перерисовывает файл при получении новых учётных данных. Пример шаблона, который формирует URI подключения по AMQP:

{{ with secret "rabbitmq/creds/orders" }}
AMQP_URL=amqps://{{ .Data.username }}:{{ .Data.password }}@rabbitmq.example.com:5671/orders
{{ end }}

Конфигурация Agent в режиме sidecar приведена в разделе «Доставка секретов в поды Kubernetes». После достижения max_ttl сервис получает нового пользователя, а старый удаляется: сервис должен переподключаться к брокеру с новыми учётными данными.

Проверка

Проверьте результат:

  1. Запросите учётные данные и сохраните имя пользователя и пароль:

    creds="$(d8 stronghold read -format=json rabbitmq/creds/orders)"
    MQ_USER="$(echo "$creds" | jq -r '.data.username')"
    MQ_PASSWORD="$(echo "$creds" | jq -r '.data.password')"
    LEASE_ID="$(echo "$creds" | jq -r '.lease_id')"
  2. Проверьте, что пользователь создан и аутентифицируется. Команды запускают rabbitmqctl в поде брокера rabbitmq-0 с рабочей станции, поэтому в rabbitmqctl передаются переменные MQ_USER и MQ_PASSWORD текущей оболочки:

    d8 k -n rabbitmq exec rabbitmq-0 -- rabbitmqctl list_users
    d8 k -n rabbitmq exec rabbitmq-0 -- rabbitmqctl authenticate_user "$MQ_USER" "$MQ_PASSWORD"
  3. Проверьте права пользователя на виртуальных хостах:

    d8 k -n rabbitmq exec rabbitmq-0 -- rabbitmqctl list_user_permissions "$MQ_USER"

    В выводе должен быть только виртуальный хост orders с регулярными выражениями ^orders\..*.

  4. Отзовите аренду и убедитесь, что пользователь удалён:

    d8 stronghold lease revoke "$LEASE_ID"
    d8 k -n rabbitmq exec rabbitmq-0 -- rabbitmqctl list_users

Команды предполагают, что RabbitMQ работает в кластере DP в неймспейсе rabbitmq. Если RabbitMQ работает вне Kubernetes, выполните rabbitmqctl с теми же аргументами на узле RabbitMQ и задайте на этом узле переменные MQ_USER и MQ_PASSWORD со значениями из первого шага.

Очистка

Удалите объекты, созданные в примере:

  1. Отзовите все выданные учётные данные роли:

    d8 stronghold lease revoke -prefix rabbitmq/creds/orders/
  2. Удалите роль и политику, а при необходимости отключите механизм секретов:

    d8 stronghold delete rabbitmq/roles/orders
    d8 stronghold policy delete orders-rabbitmq
    d8 stronghold secrets disable rabbitmq
  3. Удалите учётную запись Stronghold в RabbitMQ: rabbitmqctl delete_user stronghold-admin.

Дополнительные ресурсы