跳至主内容
版本:4.2

将 Microsoft Entra ID(以前称为 Microsoft Azure AD)用作 OAuth 2.0 服务器

本指南介绍了如何使用以下流程将 OAuth 2.0 设置为 RabbitMQ 和 Microsoft Entra ID 的授权服务器

  • 使用 Entra ID(API 版本 2.0)通过浏览器访问管理 UI

遵循本指南的先决条件

  • 拥有一个 Azure 帐户
  • Docker
  • OpenSSL
  • 一个包含本示例中使用的所有配置文件和脚本的 GitHub 存储库 的本地克隆(next 分支)。

注册您的应用程序

当将 **Entra ID 用作 OAuth 2.0 服务器** 时,您的客户端应用程序(在本例中为 RabbitMQ)需要一种方式来信任 **Microsoft 身份平台** 向其颁发的安全令牌。

  1. 建立这种信任的第一步是在 Entra ID 中将 **应用程序注册** 到身份平台。

    提示
  2. 登录到 Entra ID Portal 上的帐户后,请转到 **Entra ID**(如果找不到,请使用搜索栏)。

  3. 在左侧导航菜单中,单击 **应用程序注册**。然后,选择 **新建注册**。

  4. 在 **注册应用程序** 窗格中,提供以下信息

    • 名称:您想为应用程序命名的名称(例如:rabbitmq-oauth2
    • 支持的帐户类型:选择 **仅此组织目录中的帐户(仅限默认目录 - 单租户)**(本指南为简单起见将重点关注此选项)
    • 在 **选择平台** 下拉列表中,选择 **单页应用程序 (SPA)**
    • 将 **重定向 URI** 配置为:https://:15671/js/oidc-oauth/login-callback.html
    重要

    Entra ID 只允许 `https` URI 作为 **重定向 URI**。要了解如何在端口 `15671` 上 为 RabbitMQ 管理 UI 启用 HTTPS,请参阅管理 UI 指南。

  5. 单击 **注册**。

    Entra ID OAuth 2.0 App

    请记下以下值,稍后您将需要它们来配置 RabbitMQ 端的 rabbitmq_auth_backend_oauth2

    • 目录(租户 ID)
    • 应用程序(客户端)ID

为您的应用程序创建 OAuth 2.0 角色

应用程序角色是在应用程序注册过程中使用 Entra ID Portal 定义的。当用户登录到您的应用程序时,Entra ID 会为用户或服务主体获得的每个角色发出一个 roles 声明(您将在本教程结束时查看它)。

信息

要了解有关 Entra ID 中角色的更多信息,请参阅 Entra ID 文档

  1. 仍在 Entra ID Portal 中,返回 **Entra ID** 主页。

  2. 在左侧菜单中,单击 **应用程序注册**,然后单击您的 **应用程序名称** 以打开您的应用程序 **概述** 窗格。

创建角色以允许访问管理 UI

  1. 在左侧菜单中,单击 **应用程序角色**。

  2. 然后,单击 **创建应用程序角色** 以创建将用于授予对 RabbitMQ 管理 UI 访问权限的 OAuth 2.0 角色。

  3. 在刚刚打开的右侧菜单中,提供所需信息

    • 显示名称:您想为角色命名的名称(例如:Management UI Admin
    • 允许的成员类型:两者(用户/组 + 应用程序)
    • {Application_ID}.tag:administrator(其中 Application_ID 是本教程前面记下的 应用程序(客户端)ID 的值)
    • 描述:简要描述此角色的目的(此处仅用于授予对 RabbitMQ 管理 UI 的管理员访问权限)
    • 您要启用此应用程序角色吗yes(选中该框)
  4. 单击 **应用**。

创建角色以授予对所有资源的配置权限

  1. 再次单击 **创建应用程序角色**。现在您将创建一个 OAuth 2.0 角色,该角色将用于授予对所有 RabbitMQ vhost 上所有资源的配置访问权限。

  2. 在刚刚打开的右侧菜单中,按如下方式填写表单

    • 显示名称:您想为角色命名的名称(例如:Configure All Vhosts
    • 允许的成员类型:两者(用户/组 + 应用程序)
    • {Application_ID}.configure:*/*(其中 Application_ID 是本教程前面记下的 应用程序(客户端)ID 的值)
    • 描述:简要描述此角色的目的(此处用于授予对 RabbitMQ 实例上所有可用 vhost 上的所有资源的配置权限)
    • 您要启用此应用程序角色吗yes(选中该框)
  3. 单击 **应用**。

将应用程序角色分配给用户

现在已为您的应用程序创建了一些角色,您仍需要将它们分配给某些用户。

  1. 仍在 Entra ID Portal 中,返回 **Entra ID** 主页,然后在左侧菜单中单击 **企业应用程序**。

  2. 在新打开的左侧菜单中,选择 **管理 -> 所有应用程序**。使用 **搜索栏** 和/或可用过滤器查找您的应用程序。

    Entra ID Enterprise Applications

  3. 单击您刚刚创建的、要为其分配用户/组角色的应用程序,然后在左侧导航菜单中,选择 **管理 -> 用户和组**。

  4. 单击 **添加用户/组** 以打开 **添加分配** 窗格。

  5. 在 **用户** 下方,单击 *未选择*,然后在右侧刚刚打开的 **用户** 窗格中,搜索并选择要分配角色的用户/组。

  6. 选择用户和组后,单击 **选择** 按钮。

  7. 回到 **添加分配** 窗格,在 **选择角色** 下方,单击 *未选择*,然后在右侧刚刚打开的 **选择角色** 窗格中,搜索并选择要分配给所选用户的角色。

    提示

    如果您的应用程序只有一个可用角色,它将被默认自动选中并置灰。

  8. 选择一个角色(一次只能选择一个角色),单击 **选择** 按钮,然后单击 **分配** 按钮以完成用户和组到应用程序的分配。

  9. 为要分配的所有角色重复这些操作。

为管理 UI 访问创建作用域

还有一个最后的配置步骤是必需的。没有这个步骤,**Entra ID** 返回的 access_token 将无效。RabbitMQ 无法验证其签名,因为 access_token 是为 Microsoft 资源设计的。首先,您需要为为 RabbitMQ 管理 UI 注册的应用程序创建一个作用域,如下所示

  1. 转到 **应用程序注册**。
  2. 单击您的应用程序。
  3. 转到左侧菜单上的 **管理** 选项,然后选择 **公开 API** 选项。
  4. 单击 **添加作用域**。
  5. 输入一个名称,例如 management-ui。为 **管理员同意显示名称** 和描述输入相同的名称,然后保存。
  6. 作用域的名称为 api://{Application (client) ID}/{scope_name}

查看最后一节,了解如何使用此作用域来配置 RabbitMQ。

配置自定义签名密钥

虽然为应用程序创建签名密钥是可选的,但如果创建了自定义密钥,则必须相应地配置 RabbitMQ。在以下示例中,将 {Application(client) ID} 替换为实际的 应用程序(客户端)ID

auth_oauth2.discovery_endpoint_params.appid = {Application(client) ID}

有关更多信息,请参阅 Microsoft Entra 文档中关于 配置自定义签名密钥 的内容。

配置 RabbitMQ 以使用 Entra ID 作为 OAuth 2.0 身份验证后端

**Entra ID** 端的配置已完成。接下来,配置 RabbitMQ 以使用这些资源。

从教程存储库中克隆 rabbitmq.conf.tmplrabbitmq.conf。它必须与 rabbitmq.conf.tmpl 在同一目录中。

编辑新的 rabbitmq.conf 文件并按如下方式进行

  1. {Directory (tenant) ID} 替换为之前收集的 **应用程序(客户端)ID** 值
  2. {Application(client) ID} 替换为收集到的 **应用程序(客户端)ID** 值
  3. 如果您决定使用自定义签名配置您的应用程序,则需要取消注释以下配置行。否则,OpenID Discovery 端点宣布的 jwks_uri 端点不包含应用程序的自定义签名密钥。
#...

management.oauth_enabled = true
management.oauth_client_id = {Application(client) ID}
management.oauth_scopes = openid profile api://{Application(client) ID}/rabbitmq

auth_oauth2.resource_server_id = {Application(client) ID}
auth_oauth2.additional_scopes_key = roles
auth_oauth2.issuer = https://login.microsoftonline.com/{Directory (tenant) ID}/v2.0

#...

启动 RabbitMQ

运行以下命令来运行 RabbitMQ docker 映像

export MODE=entra
make start-rabbitmq

这将启动一个名为 rabbitmq 的 Docker 容器,其中启用了 RabbitMQ 管理 UI/API (HTTPS),并根据本教程前面步骤中 rabbitmq.conf 中提供的信息,配置为将您的 Entra ID 用作 OAuth 2.0 身份验证后端。

自动生成 TLS 证书和密钥对

重要

Entra ID 只允许 `https` URI 作为 **重定向 URI**。要了解如何在端口 `15671` 上 为 RabbitMQ 管理 UI 启用 HTTPS,请参阅管理 UI 指南。

当您第一次使用 MODE=entra 运行 make start-rabbitmq 时,在 RabbitMQ 部署之前,会为 RabbitMQ 生成一个 TLS 证书,以便它监听 HTTPS 端口 15671。

该脚本将在 conf/entra/certs 中生成以下文件

  • cacert.pem:一个自定义证书颁发机构,用于生成和签名 RabbitMQ 的自签名证书
  • cert.pem:一个自签名证书 (cn=localhost)
  • key.pem:与 cert.pem 证书关联的私钥

这些文件稍后将在本教程中挂载到 rabbitmq 容器中,用于配置 RabbitMQ 管理 UI 和 HTTP API 的 HTTPS。

验证 RabbitMQ 管理 UI 访问

转到 RabbitMQ 管理 UI https://:15671。根据您的浏览器,忽略安全警告(由您使用的是自签名证书引起)以继续。

进入 RabbitMQ 管理 UI 页面后,单击 **点击此处登录** 按钮,使用您的 **Entra ID 用户** 进行身份验证。第一次,您可能需要提供同意(这取决于您方面的 Entra AD 应用的策略)。

提示

首次登录时,您可能会遇到一个名为 AADSTS90008 的错误。这是一个 已知问题

再次单击 **点击此处登录** 按钮,它将消失。

最后,您应该会被重定向回 RabbitMQ 管理 UI。

Entra AD 会颁发一个如下所示的访问令牌。权限在 roles 声明中进行管理。您已将 RabbitMQ 配置为 {extra_scopes_source, <<"roles">>},,这意味着 RabbitMQ 使用 roles 声明中的作用域来定义登录用户的权限。

{
"aud": "30b61ef8-72d7-4e40-88f2-6e16c8d3fd88",
"iss": "https://sts.windows.net/1ffc6121-590e-4aa5-bf47-c348674069cb/",
"iat": 1655740039,
"nbf": 1655740039,
"exp": 1655744211,
"acr": "1",
"aio": "AUQAu/8TAAAAjvwucwL4nZe83vNZvg6A7sAPscI9zsGvRs8EuT7aVhubpmhRnxJ+X7nbkISoP5eBBMxoi2yiCclnH2Ocjjzsqw==",
"amr": [
"wia"
],
"appid": "30b61ef8-72d7-4e40-88f2-6e16c8d3fd88",
"appidacr": "1",
"email": "baptiste.daroit@company.com",
"idp": "https://sts.windows.net/b3f4f7c2-72ce-4192-aba4-d6c7719b5766/",
"in_corp": "true",
"ipaddr": "xxx.xxx.xxx.xxx",
"name": "Baptiste DA ROIT",
"oid": "cf2df3b4-03df-4e1e-b5c0-f232932aaead",
"rh": "0.AR8AgCG80x7L90C1mhVBBXQzQjgoklctsdBMtgYVWFwc4tgfAMQ.",
"roles": [
"30b61ef8-72d7-4e40-88f2-6e16c8d3fd88.tag:monitoring",
"30b61ef8-72d7-4e40-88f2-6e16c8d3fd88.configure:*/*"
],
"scp": "User.Read",
"sub": "6aBzW3a1FOTTrnlZEuC1SmwG0sRjVgQU49DvrYK6Rqg",
"tid": "1ffc6121-590e-4aa5-bf47-c348674069cb",
"unique_name": "baptiste.daroit@company.com",
"uti": "QHqwThTqQEK9iMdnRuD_AA",
"ver": "1.0"
}
© . This site is unofficial and not affiliated with VMware.