• Русский
  • Управление пользователями, virtual hosts и разрешениями

    Используйте пользователей RabbitMQ, virtual hosts и разрешения, чтобы изолировать приложения и снизить влияние скомпрометированных учетных данных. Производственная нагрузка не должна использовать учетную запись администратора, созданную платформой, совместно с клиентскими приложениями.

    В этом руководстве показано, как создать virtual host, создать пользователя приложения и назначить разрешения с минимально необходимыми привилегиями.

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

    Перед управлением пользователями и разрешениями убедитесь, что выполнены следующие условия:

    1. У вас есть доступ к management endpoint или kubectl exec к RabbitMQ Pod.
    2. У вас есть учетные данные администратора. Для учетной записи по умолчанию, созданной платформой, см. Управление пользователями.
    3. Вам известны имя virtual host, имя пользователя приложения и шаблон именования exchange или queue, который требуется приложению.

    Модель разрешений

    Разрешения RabbitMQ привязаны к virtual host и включают три регулярных выражения:

    РазрешениеУправляет
    configureКакими ресурсами пользователь может объявлять, удалять или изменять.
    writeВ какие exchange пользователь может публиковать сообщения.
    readИз каких queue пользователь может потреблять сообщения и к каким exchange может делать binding.

    Используйте узкие регулярные выражения для пользователей приложений. Назначайте теги administrator только операционным пользователям, которым нужны права управления на уровне всего экземпляра.

    Процедура

    1. Создайте virtual host

    Создайте virtual host для приложения:

    rabbitmqadmin \
      --host <management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      declare vhost name=payments

    Для команд, выполняемых внутри RabbitMQ Pod, также можно использовать rabbitmqctl:

    kubectl -n <namespace> exec <instance-name>-server-0 -- \
      rabbitmqctl add_vhost payments

    2. Создайте пользователя приложения

    Создайте пользователя для приложения. Не используйте этого пользователя для администрирования.

    rabbitmqadmin \
      --host <management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      declare user name=payments-app password='<strong-password>' tags=

    Если вы используете rabbitmqctl, выполните:

    kubectl -n <namespace> exec <instance-name>-server-0 -- \
      rabbitmqctl add_user payments-app '<strong-password>'

    Храните пароль приложения в Kubernetes Secret или в одобренном вами secret manager. Не храните его в манифестах приложения в виде открытого текста.

    3. Назначьте разрешения приложения

    В следующем примере пользователю payments-app разрешается настраивать, публиковать сообщения и потреблять их из ресурсов, начинающихся с payments., в virtual host payments:

    rabbitmqadmin \
      --host <management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      declare permission \
      vhost=payments \
      user=payments-app \
      configure='^payments\.' \
      write='^payments\.' \
      read='^payments\.'

    Эквивалентная команда rabbitmqctl:

    kubectl -n <namespace> exec <instance-name>-server-0 -- \
      rabbitmqctl set_permissions -p payments payments-app \
      '^payments\.' '^payments\.' '^payments\.'

    4. Назначайте topic permissions при необходимости

    Если приложение использует topic authorization, задавайте topic permissions отдельно от разрешений на ресурсы:

    kubectl -n <namespace> exec <instance-name>-server-0 -- \
      rabbitmqctl set_topic_permissions -p payments payments-app amq.topic \
      '^payments\.' '^payments\.'

    Настраивайте topic permissions только в том случае, если этого требует ваша модель авторизации.

    5. Проверьте доступ

    Выведите список virtual hosts, пользователей и разрешений:

    rabbitmqadmin \
      --host <management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      list vhosts name
    
    rabbitmqadmin \
      --host <management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      list users name tags
    
    rabbitmqadmin \
      --host <management-host> \
      --port 15672 \
      --username <admin-user> \
      --password <admin-password> \
      list permissions user vhost configure write read

    Проверьте подключение приложения с помощью учетной записи пользователя приложения, а не учетной записи администратора.

    Рекомендуемые практики

    • Создавайте отдельный virtual host для каждого приложения или каждой tenant-границы.
    • Создавайте одного пользователя RabbitMQ для каждой runtime-идентичности приложения.
    • Используйте узкие регулярные выражения разрешений вместо .* для пользователей приложений.
    • Держите пользователей-администраторов отдельно от пользователей-производителей и пользователей-потребителей.
    • Периодически обновляйте пароли приложений через обновления Kubernetes Secret или через одобренный вами secret manager.
    • Удаляйте пользователей и разрешения, когда приложение выводится из эксплуатации.

    Связанная информация