Сервис получает от 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:
Включите механизм секретов RabbitMQ:
d8 stronghold secrets enable rabbitmqНастройте подключение к management HTTP API:
d8 stronghold write rabbitmq/config/connection connection_uri="https://rabbitmq.example.com:15672" username="stronghold-admin" password="<STRONGHOLD_ADMIN_PASSWORD>"Задайте параметры аренды в секундах. Они действуют для всех ролей этого механизма секретов:
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 и управляйте их арендой:
Запросите учётные данные:
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Продлите аренду до истечения
lease_duration:d8 stronghold lease renew rabbitmq/creds/orders/I39Hu8XXOombof4wiK5bKMn9Когда учётные данные больше не нужны, отзовите аренду. 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 сервис получает нового пользователя, а старый удаляется: сервис должен переподключаться к брокеру с новыми учётными данными.
Проверка
Проверьте результат:
Запросите учётные данные и сохраните имя пользователя и пароль:
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')"Проверьте, что пользователь создан и аутентифицируется. Команды запускают
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"Проверьте права пользователя на виртуальных хостах:
d8 k -n rabbitmq exec rabbitmq-0 -- rabbitmqctl list_user_permissions "$MQ_USER"В выводе должен быть только виртуальный хост
ordersс регулярными выражениями^orders\..*.Отзовите аренду и убедитесь, что пользователь удалён:
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 со значениями из первого шага.
Очистка
Удалите объекты, созданные в примере:
Отзовите все выданные учётные данные роли:
d8 stronghold lease revoke -prefix rabbitmq/creds/orders/Удалите роль и политику, а при необходимости отключите механизм секретов:
d8 stronghold delete rabbitmq/roles/orders d8 stronghold policy delete orders-rabbitmq d8 stronghold secrets disable rabbitmqУдалите учётную запись Stronghold в RabbitMQ:
rabbitmqctl delete_user stronghold-admin.