Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/
适用于Kubernetes Operator 的MongoDB控制器
/ /

使用 OIDC 保护客户端身份验证

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的独立实例。

启用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身份验证。

  • 部署副本集部署要使用 OpenID Connect 保护其客户端身份验证安全的分片集群

字段

类型和必要性

说明

例子

spec.security.authentication.modes

字符串大量;必需

要启用的一大量身份验证机制。必须包含“OIDC”才能启用OIDC身份验证。

["SCRAM", "OIDC"]

spec.security.authentication.oidcProviderConfigs.configurationName

字符串;必需

此提供商配置的唯一逻辑名称。映射角色时会使用此名称。

"example-provider"

spec.security.authentication.oidcProviderConfigs.issuerURI

字符串;必需

OIDC 提供商的发现端点的 URI。

"https://dev-12345.provider.com"

spec.security.authentication.oidcProviderConfigs.clientId

字符串;必需

向 OIDC提供商注册的应用程序的客户端ID 。

"0oa1b2c3d4e5f6g7h8"

spec.security.authentication.oidcProviderConfigs.audience

字符串;必需

JSON web token的受众声明。 它必须与 IdP 颁发的令牌的受众相匹配。

"api://default"

spec.security.authentication.oidcProviderConfigs.userClaim

字符串;可选

MongoDB用用户名的JSON web token声明。 默认为 sub

"sub"

spec.security.authentication.oidcProviderConfigs.groupsClaim

字符串;可选

包含用户群组成员身份的JSON web token声明。 如果 authorizationTypeGroupMembership,则为必填项。

"groups"

spec.security.authentication.oidcProviderConfigs.authorizationMethod

字符串;必需

联合方法。可以是 WorkloadIdentityFederationWorkforceIdentityFederation

"WorkforceIdentityFederation"

spec.security.authentication.oidcProviderConfigs.authorizationType

字符串;必需

授权模型。可以是 UserIDGroupMembership

"GroupMembership"

spec.security.authentication.oidcProviderConfigs.requestedScopes

字符串大量;可选

向 OIDC提供商请求的其他范围列表。

["openid", "profile", "groups"]

MongoDB中的 OIDC 配置结合了两个关键概念: 联合方法授权类型

此设置会告知MongoDB正在验证的身份类型。

  • WorkforceIdentityFederation:将其用于人类用户。此方法适用于登录系统的人员,例如通过 IdP 进行身份验证的开发人员、分析师或管理员。

  • WorkloadIdentityFederation:将其用于应用程序或服务(即机器对机器通信)。此方法适用于非人类身份,例如需要连接数据库的微服务、批处理作业或自动化脚本。

此设置定义了在对用户或服务进行身份验证后, MongoDB应如何授予权限。

  • GroupMembership:这是最常见且可扩展的方法。对于这种类型, MongoDB使用JSON web token(由 groupsClaim 定义)中的特定声明,其中包含用户所属群组的列表。 然后,将这些群组名称映射到MongoDB角色。需要设立groupsClaim

  • UserID:对于这种类型, MongoDB使用唯一标识用户的声明(由 userClaim 定义,默认为 sub)。然后,将此特定的单个用户ID映射到 MongoDBUser(需要单独创建)。这种粒度更细,对于在不使用群组的情况下向单个用户或特定服务身份授予权限非常有用。

配置 OIDC提供商后,您必须授予权限。用于执行此操作的方法取决于您选择的 authorizationType

如果使用 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"

如果使用 authorizationType: UserID,则必须创建单独的 MongoDBUser资源来授予权限。

要学习;了解详情,请参阅使用 OIDC/OAuth 2.0 进行身份验证和授权。

请按照以下步骤为副本集配置 OIDC。有关其他示例,请参阅使用 OIDC 进行安全客户端身份验证。

1

如果您有现有的副本集定义文件,请将其打开。否则,您可以复制下面的整个工作示例。

2

在定义文件中,修改 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
  • 手动验证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部署的名称。