文档菜单

文档首页开发应用程序Python 驱动程序PyMongo

企业级身份验证机制

本页内容

  • 概述
  • 密钥服务系统(Kerberos)
  • PLAIN SASL
  • MONGODB-OIDC
  • Azure IMDS
  • GCP IMDS
  • 其他Azure环境
  • GCP GKE
  • API 文档

MongoDB 企业版包含在MongoDB 社区版中不可用的身份验证机制。在本指南中,您可以学习如何使用这些身份验证机制进行MongoDB身份验证。有关MongoDB中其他可用身份验证机制的信息,请参阅身份验证机制。

通用安全服务API(GSSAPI)提供了Kerberos身份验证的接口。选择与您的操作系统对应的选项卡,了解如何使用Kerberos进行身份验证。

PLAIN简单身份验证和安全层(SASL),如定义所述RFC 4616 是一种常与 TLS 或其他加密层一起使用的用户名密码认证机制。

重要

PLAIN SASL 是一种明文认证机制。我们强烈建议您在使用 PLAIN SASL 进行 MongoDB 认证时使用 TLS/SSL 并进行证书验证。

要了解如何为您的连接启用 TLS,请参阅 配置传输层安全性 (TLS)。

要使用 SASL 进行认证,请将authMechanism 连接选项设置为 PLAIN。您可以通过以下两种方式设置此选项:通过将参数传递给 MongoClient 构造函数或在您的连接字符串中设置参数。

重要

MONGODB-OIDC 认证机制需要 MongoDB v7.0 或更高版本在 Linux 平台上运行。

PyMongo 支持 工作负载标识 的 OIDC 认证。工作负载标识是您分配给软件工作负载(如应用程序、服务、脚本或容器)的标识,用于认证和访问其他服务和资源。

以下各节介绍了如何使用 MONGODB-OIDC 认证机制在各种平台上进行认证。

有关 MONGODB-OIDC 认证机制的更多信息,请参阅 MongoDB 服务器手册中的 OpenID Connect 认证

如果您的应用程序在Azure VM上运行,或者使用Azure 实例元数据服务 (IMDS),您可以使用PyMongo的内置Azure支持通过PyMongo对MongoDB进行认证。

您可以通过两种方式配置Azure IMDS的OIDC:通过传递参数给MongoClient构造函数或通过连接字符串中的参数。

提示

如果您的应用程序在Azure VM上运行,并且VM只关联了一个托管标识,则可以省略username连接选项。

如果您的应用程序在GCP VM上运行,或者使用GCP 实例元数据服务,您可以使用PyMongo的内置GCP支持通过PyMongo对MongoDB进行认证。

您可以通过两种方式配置GCP IMDS的OIDC:通过传递参数给MongoClient构造函数或通过连接字符串中的参数。

如果您的应用程序运行在Azure Functions、App Service Environment (ASE) 或 Azure Kubernetes Service (AKS) 上,您可以使用 azure-identity 包来获取身份验证凭据。

首先,使用pip安装 azure-identity 库,如下例所示

python3 -m pip install azure-identity

接下来,定义一个继承自 OIDCCallback 类的类。此类必须实现一个 fetch() 方法,该方法以 OIDCCallbackResult 对象的形式返回 OIDC 令牌。

以下示例展示了如何定义一个名为 MyCallback 的回调类。此类包括一个 fetch() 方法,该方法从标准服务帐户令牌文件位置中的文件检索 OIDC 令牌。

audience = "<audience configured on the MongoDB deployment>"
client_id = "<Azure client ID>"
class MyCallback(OIDCCallback):
def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult:
credential = DefaultAzureCredential(managed_identity_client_id=client_id)
token = credential.get_token(f"{audience}/.default").token
return OIDCCallbackResult(access_token=token)

定义您的回调类后,创建一个包含一个键 "OIDC_CALLBACK" 的 Python 字典,其值是您的自定义回调类的实例

properties = {"OIDC_CALLBACK": MyCallback()}

最后,通过向 MongoClient 构造函数传递参数来设置以下连接选项

  • authMechanism:设置为 "MONGODB-OIDC"

  • authMechanismProperties:设置为上一步骤中创建的 properties 字典。

from pymongo import MongoClient
from azure.identity import DefaultAzureCredential
from pymongo.auth_oidc import OIDCCallback, OIDCCallbackContext, OIDCCallbackResult
# define callback, properties, and MongoClient
audience = "<audience configured on the MongoDB deployment>"
client_id = "<Azure client ID>"
class MyCallback(OIDCCallback):
def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult:
credential = DefaultAzureCredential(managed_identity_client_id=client_id)
token = credential.get_token(f"{audience}/.default").token
return OIDCCallbackResult(access_token=token)
properties = {"OIDC_CALLBACK": MyCallback()}
client = MongoClient(
"mongodb://<hostname>:<port>",
authMechanism="MONGODB-OIDC",
authMechanismProperties=properties
)

如果您的应用程序运行在配置了服务帐户的GCP Google Kubernetes Engine (GKE)集群上,您可以从标准服务帐户令牌文件位置读取OIDC令牌。

首先,定义一个继承自OIDCCallback类的类。此类必须实现一个返回OIDCCallbackResult对象的fetch()方法。

以下示例展示了如何定义一个名为 MyCallback 的回调类。此类包括一个 fetch() 方法,该方法从标准服务帐户令牌文件位置中的文件检索 OIDC 令牌。

class MyCallback(OIDCCallback):
def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult:
with open("/var/run/secrets/kubernetes.io/serviceaccount/token") as fid:
token = fid.read()
return OIDCCallbackResult(access_token=token)

定义您的回调类后,创建一个包含一个键 "OIDC_CALLBACK" 的 Python 字典,其值是您的自定义回调类的实例

properties = {"OIDC_CALLBACK": MyCallback()}

最后,通过向 MongoClient 构造函数传递参数来设置以下连接选项

  • authMechanism:设置为 "MONGODB-OIDC"

  • authMechanismProperties:设置为上一步骤中创建的 properties 字典。

from pymongo import MongoClient
from pymongo.auth_oidc import OIDCCallback, OIDCCallbackContext, OIDCCallbackResult
# define callback, properties, and MongoClient
class MyCallback(OIDCCallback):
def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult:
with open("/var/run/secrets/kubernetes.io/serviceaccount/token") as fid:
token = fid.read()
return OIDCCallbackResult(access_token=token)
properties = {"OIDC_CALLBACK": MyCallback()}
client = MongoClient(
"mongodb://<hostname>:<port>",
authMechanism="MONGODB-OIDC",
authMechanismProperties=properties
)

要了解更多关于在PyMongo中使用企业身份验证机制的信息,请参阅以下API文档

← 身份验证机制