OIDC 集成
今天,当我们使用 rabbitmq-management 和 rabbitmq_auth_backend_oauth2 插件时,唯一支持的授权服务器是 UAA,这使得连接到其他 OAuth 2.0 服务器变得困难。此外,rabbitmq-management 插件使用 OAuth 2.0 隐式流,出于安全原因,该流已不再推荐。
RabbitMQ 3.11 将支持几乎所有符合 OpenID Connect 和 OAuth 2.0 协议的授权服务器。此外,OAuth 2.0 授权码授予将成为默认授予,并且不再支持隐式授予。
概述
在 RabbitMQ 3.11 之前,当与管理 UI 一起使用 OAuth 2.0 时,RabbitMQ 由于使用了 UAA 提供的 JavaScript 库,仅支持 UAA 作为 OAuth 2.0 服务器。此外,该库仅支持 *隐式* 授权类型,并指向自定义 UAA 的 HTTP 端点,这些端点不遵循任何标准,例如 OpenID Connect。
RabbitMQ 3.11 将所有 OAuth 2.0 和 OpenID Connect 协议委托给 oidc-client-ts 库,不再依赖 UAA 客户端库。通过此更改,RabbitMQ 不再支持 *隐式* 授权类型,而是支持 *授权码* 授权类型。此外,带有 `uaa_` 前缀的旧设置,如 `uaa_location`,已被弃用,并被带有 `oauth_` 前缀的新设置集替换,具体说明见下一节 用法。
用法
要配置 *rabbitmq-management* 以使用任何 OAuth 2.0 服务器对用户进行身份验证,我们需要提供以下设置:
oauth_enabled替换enable_uaaoauth_client_id替换uaa_client_idoauth_client_secret包含与oauth_client_id对应的密钥。这是一个新设置,因为 *隐式* 授权流程不需要密钥。oauth_provider_url替换uaa_location。它是 OpenID Connect 端点 URL,通过此端点,RabbitMQ 可以发现所有其他 OAuth 2.0 端点。
以下是使用上述设置的插件的配置示例:
{ rabbitmq_management,
...
{oauth_enabled, true},
{oauth_client_id, "PUT YOUR AUTH CLIENT ID"},
{oauth_client_secret, "PUT YOUR AUTH CLIENT SECRET"},
{oauth_provider_url, "PUT YOUR OpenID Connect URL"}
...
}
除了上述四个强制性设置外,还有一个额外的可选设置:
oauth_scopes设置 RabbitMQ 代表访问管理 UI 的用户请求的 *范围*。当enable_uaa未设置或为 false 时,默认值为openid profile;当enable_uaa为 true 时,默认值为openid profile <rabbitmq_auth_backend_oauth2.resource_server_id>.*。
何时需要设置 oauth_scopes?
一些 OAuth 2.0 服务器可以自动授予用户 *范围*,而不管 RabbitMQ 在授权请求期间请求的范围如何。如果您的 OAuth 2.0 服务器具有此功能,则无需在 oauth_scopes 中指定所有范围。
相反,如果您的 OAuth 2.0 服务器仅授予在授权请求期间请求的 *范围*,则必须在 oauth_scopes 设置中指定它们。
现有集群如何受此更改影响?
只有当前配置为使用 UAA 进行身份验证的 RabbitMQ 集群会受到此更改的影响。除非进行这些更改,否则它们将停止工作。
- 添加
{oauth_enabled, true}, - 添加
{oauth_client_secret, "UAA_CLIENT_SECRET"},,其中UAA_CLIENT_SECRET是与之前配置的uaa_client_id关联的客户端密钥。
但是,强烈建议完全使用新设置重新配置现有的使用 UAA 进行 OAuth 2.0 的集群,因为旧配置已被弃用,并将在未来的版本中删除。
目前支持哪些 OAuth 2.0 服务器?
理论上,任何符合 OpenID Connect 标准的 OAuth 2.0 服务器都应该得到支持。RabbitMQ 已针对以下 OAuth 2.0 服务器进行了测试:
- Keycloak
- Auth0
- Azure Active Directory
