Kubernetes Operator 支持 OpenID Connect (OIDC) 作为身份验证机制。配置 OIDC身份验证时,客户端应用程序会向MongoDB资源提供JSON web token(JSON web token )。 MongoDB根据配置的 OIDC 身份提供程序 (IdP) 验证JSON web token,并使用令牌中的声明来确定用户的身份,以及(可选)用于角色映射的群组成员身份。
本指南介绍如何使用Kubernetes Operator 为连接到MongoDB部署的客户端应用程序配置 OIDC身份验证。
注意
您无法在Kubernetes集群中使用 OIDC 保护MongoDB的独立实例。
Considerations
启用OIDC身份验证时,请考虑以下事项:
身份提供程序:您必须有一个预先存在且已配置的 OIDC 身份提供程序 (IdP)。Kubernetes Operator 本身不管理IdP。
授权: Kubernetes Operator 通过 OIDC 配置身份验证(验证身份)。通过将 OIDC 声明映射到MongoDB自定义资源中的MongoDB角色来处理授权(授予权限)。
Federation: MongoDB支持 Workload Identity Federation(用于机器到机器的身份验证)和 Workforce Identity Federation(用于人员用户身份验证)。
TLS 加密:为了提高安全性,强烈建议部署TLS 加密的副本集或 TLS 加密的分片集群。虽然 OIDC 与身份提供商的通信通过 HTTPS 进行保护,但在MongoDB资源上启用 TLS 会加密客户端应用程序与数据库之间的连接。这可以保护 OIDC 令牌和所有其他数据库流量免受网络威胁。
一般先决条件
在为MongoDB部署配置 OIDC身份验证之前,请完成以下任务:
确保部署MongoDB Enterprise数据库资源。MongoDB Community数据库不支持OIDC身份验证。
OIDC 配置详细信息
字段 | 类型和必要性 | 说明 | 例子 |
| 字符串大量;必需 | 要启用的一大量身份验证机制。必须包含“OIDC”才能启用OIDC身份验证。 |
|
| 字符串;必需 | 此提供商配置的唯一逻辑名称。映射角色时会使用此名称。 |
|
| 字符串;必需 | OIDC 提供商的发现端点的 URI。 |
|
| 字符串;必需 | 向 OIDC提供商注册的应用程序的客户端ID 。 |
|
| 字符串;必需 | JSON web token的受众声明。 它必须与 IdP 颁发的令牌的受众相匹配。 |
|
| 字符串;可选 | MongoDB用用户名的JSON web token声明。 默认为 |
|
| 字符串;可选 | 包含用户群组成员身份的JSON web token声明。 如果 |
|
| 字符串;必需 | 联合方法。可以是 |
|
| 字符串;必需 | 授权模型。可以是 |
|
| 字符串大量;可选 | 向 OIDC提供商请求的其他范围列表。 |
|
了解 OIDC 授权模型
MongoDB中的 OIDC 配置结合了两个关键概念: 联合方法 和 授权类型 。
联合方法 (authorizationMethod
)
此设置会告知MongoDB正在验证的身份类型。
WorkforceIdentityFederation
:将其用于人类用户。此方法适用于登录系统的人员,例如通过 IdP 进行身份验证的开发人员、分析师或管理员。WorkloadIdentityFederation
:将其用于应用程序或服务(即机器对机器通信)。此方法适用于非人类身份,例如需要连接数据库的微服务、批处理作业或自动化脚本。
授权类型 (authorizationType
)
此设置定义了在对用户或服务进行身份验证后, MongoDB应如何授予权限。
GroupMembership
:这是最常见且可扩展的方法。对于这种类型, MongoDB使用JSON web token(由groupsClaim
定义)中的特定声明,其中包含用户所属群组的列表。 然后,将这些群组名称映射到MongoDB角色。需要设立groupsClaim
。UserID
:对于这种类型, MongoDB使用唯一标识用户的声明(由userClaim
定义,默认为sub
)。然后,将此特定的单个用户ID映射到 MongoDBUser(需要单独创建)。这种粒度更细,对于在不使用群组的情况下向单个用户或特定服务身份授予权限非常有用。
管理 OIDC 角色和权限
配置 OIDC提供商后,您必须授予权限。用于执行此操作的方法取决于您选择的 authorizationType
。
方法 1:GroupMembership 的角色映射
如果使用 authorizationType: GroupMembership
,则通过将角色映射添加到MongoDB资源中的 spec.security.roles
大量来授予权限。角色字段的格式必须为 <configurationName>/<groupNameFromToken>
。
roles: - role: "idp-human-users/app-devs" # Maps the "app-devs" group from the IdP db: "admin" roles: - role: "readWrite" db: "app-data"
方法 2:为 UserID 创建用户
如果使用 authorizationType: UserID
,则必须创建单独的 MongoDBUser
资源来授予权限。
要学习;了解详情,请参阅使用 OIDC/OAuth 2.0 进行身份验证和授权。
为多 Kubernetes 集群副本集配置 OIDC 客户端身份验证
请按照以下步骤为副本集配置 OIDC。有关其他示例,请参阅使用 OIDC 进行安全客户端身份验证。
添加 OIDC身份验证设置。
在定义文件中,修改 spec.security
部分。根据您的使用案例,选择以下一个或多个示例。您可以在 oidcProviderConfigs
大量中组合多个提供商程序配置。
示例 A:具有群组成员资格的劳动力联合
使用此功能,根据 IdP 中的群组成员身份对人类用户进行身份验证。这是管理用户团队的最常见模型。
apiVersion: mongodb.com/v1 kind: MongoDBMultiCluster metadata: name: my-multi-cluster-oidc-replicaset spec: type: ReplicaSet members: 3 version: 7.0.11-ent opsManager: configMapRef: name: <my-project-configmap> credentials: <my-credentials-secret> security: authentication: modes: ["SCRAM", "OIDC"] oidcProviderConfigs: - configurationName: "idp-human-users" issuerURI: "https://<your-idp-domain>" clientId: "<your-client-id>" audience: "api://default" groupsClaim: "groups" authorizationMethod: "WorkforceIdentityFederation" authorizationType: "GroupMembership" roles: - role: "idp-human-users/app-devs" db: "admin" roles: - role: "readWrite" db: "app-data" clusterSpecList: - clusterName: ${MDB_CLUSTER_1_FULL_NAME} members: 3 - clusterName: ${MDB_CLUSTER_2_FULL_NAME} members: 2 - clusterName: ${MDB_CLUSTER_3_FULL_NAME} members: 3
OIDC 故障排除
- 手动验证JSON web token令牌:使用工具解码 OIDC 令牌。
核心声明:确保令牌中的
iss
(颁发者)和aud
(受众)声明与 OIDC提供商配置完全匹配。检查令牌是否未过期(exp
声明)。预期用户/群组声明:验证用户身份 (
userClaim
) 和群组 (groupsClaim
) 的预期声明是否存在于令牌中并包含正确的值。
验证用户 ID 身份验证的用户名格式:
MongoDBUser
用户名必须采用精确的<configurationName>/<userClaimValue>
格式。<configurationName>
必须与MongoDB
资源中的 OIDC提供商的名称匹配。确认已使用 $external 数据库:对于
UserID
授权,MongoDBUser
资源必须指定db: "$external"
。通过外部源进行身份验证的用户始终通过此虚拟数据库进行解析。检查 GroupMembership 身份验证的群组角色映射:确保MongoDB资源的
spec.security.roles
部分中定义的角色格式正确为<configurationName>/<groupName>
,其中<groupName>
与JSON web token 的groupsClaim
中的群组完全匹配。验证分配的角色权限:检查分配给 OIDC 用户或群组的 MongoDB 角色是否实际授予必要的权限(例如,对正确数据库的
readWrite
)。验证 MongoDBUser 资源参考:对于
UserID
授权,请确保MongoDBUser
资源中的spec.mongodbResourceRef.name
正确指向MongoDB
部署的名称。