Docs 菜单
Docs 主页
/ / /
pymongo
/

企业身份验证机制

在此页面上

  • Overview
  • Kerberos
  • PLAIN SASL
  • MONGODB-OIDC
  • Azure IMDS
  • GCP IMDS
  • 其他 Azure 环境
  • GCP GKE
  • API 文档

MongoDB Enterprise Edition 包含MongoDB Community Edition中不提供的身份验证机制。 在本指南中,您可以学习;了解如何使用这些身份验证机制对MongoDB进行身份验证。 要学习;了解MongoDB中提供的其他身份验证机制,请参阅身份验证机制。

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

首先,使用 pip 或简易安装安装PythonPythonKerberos Kerberos 或 pykerberos 模块。

安装这些模块之一后,运行 kinit命令以获取并缓存初始票证授予票证。 以下示例使用knit命令获取主体mongodbuser@EXAMPLE.COM的票证授予票证。 然后,它使用klist命令显示凭证缓存中的主体和票证。

$ kinit mongodbuser@EXAMPLE.COM
mongodbuser@EXAMPLE.COM's Password:
$ klist
Credentials cache: FILE:/tmp/krb5cc_1000
Principal: mongodbuser@EXAMPLE.COM
Issued Expires Principal
Feb 9 13:48:51 2013 Feb 9 23:48:51 2013 krbtgt/mongodbuser@EXAMPLE.COM

获得票证授予票证后,请设置以下连接选项:

  • username:要进行身份验证的 Kerbos 主体。 在将其包含在连接 URI 中之前,对该值进行百分比编码。

  • authMechanism:设置为"GSSAPI"

  • authMechanismProperties:可选。 默认, MongoDB使用mongodb作为身份验证服务名称。 要指定不同的服务名称,请将此选项设立为"SERVICE_NAME:<authentication service name>"

您可以通过两种方式设置这些选项:将参数传递给 MongoClient 构造函数,或通过连接string中的参数。

注意

如果authMechanismProperties值包含逗号,则必须使用MongoClient构造函数来设立身份验证选项。

client = pymongo.MongoClient("mongodb://<hostname>:<port>",
username="mongodbuser@EXAMPLE.COM",
authMechanism="GSSAPI",
authMechanismProperties="SERVICE_NAME:<authentication service name>")
uri = ("mongodb://mongodbuser%40EXAMPLE.COM@<hostname>:<port>/?"
"&authMechanism=GSSAPI"
"&authMechanismProperties=SERVICE_NAME:<authentication service name>")
client = pymongo.MongoClient(uri)

首先,安装 winkerberos 模块。然后,设立以下连接选项:

  • username:要进行身份验证的 Kerbos 主体。 在将其包含在连接 URI 中之前,对该值进行百分比编码。

  • authMechanism:设置为"GSSAPI"

  • password:可选。 如果要进行身份验证的用户与拥有应用程序进程的用户不同,请将此选项设立为进行身份验证的用户的密码。

  • authMechanismProperties:可选。 此选项包括多个身份验证属性。 要指定多个以下属性,请使用逗号分隔的列表。

    • SERVICE_NAME: 默认, MongoDB使用mongodb作为身份验证服务名称。 使用此选项指定不同的服务名称。

    • CANONICALIZE_HOST_NAME:是否将MongoDB托管的完全限定域名 (FQDN) 用于服务器主体。

    • SERVICE_REALM:服务域。 当用户的域与服务的域不同时,请使用此选项。

您可以通过两种方式设置这些选项:将参数传递给 MongoClient 构造函数,或通过连接string中的参数。

client = pymongo.MongoClient("mongodb://<hostname>:<port>",
username="mongodbuser@EXAMPLE.COM",
authMechanism="GSSAPI",
password="<user password>",
authMechanismProperties="SERVICE_NAME:<authentication service name>,
CANONICALIZE_HOST_NAME:true,
SERVICE_REALM:<service realm>")
uri = ("mongodb://mongodbuser%40EXAMPLE.COM:<percent-encoded user password>"
"@<hostname>:<port>/?"
"&authMechanism=GSSAPI"
"&authMechanismProperties="
"SERVICE_NAME:<authentication service name>,"
"CANONICALIZE_HOST_NAME:true,"
"SERVICE_REALM:<service realm>")
client = pymongo.MongoClient(uri)

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

重要

PLAIN SASL 是一种明文身份验证机制。 在使用 PLAIN SASL 对 MongoDB 进行身份验证时,强烈建议您将 TLS/SSL 与证书验证结合使用。

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

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

注意

如果authMechanismProperties值包含逗号,则必须使用MongoClient构造函数来设立身份验证选项。

client = pymongo.MongoClient("mongodb://<hostname>:<port>",
username="<db_username>",
password="<db_password>",
authMechanism="PLAIN",
tls=True)
uri = ("mongodb://<db_username>:<db_password>@<hostname>:<port>/?"
"&authMechanism=PLAIN"
"&tls=true")
client = pymongo.MongoClient(uri)

重要

MONGODB-OIDC 身份验证机制要求在 Linux 平台上运行 MongoDB Server v 7.0或更高版本。

PyMongo 支持对工作负载身份进行 OIDC 身份验证。 工作负载身份是分配给软件工作负载(例如应用程序、服务、脚本或容器)的身份,用于验证和访问其他服务和资源。

以下部分介绍如何使用 MONGODB-OIDC 身份验证机制对各种平台进行身份验证。

有关 MONGODB-OIDC 身份验证机制的更多信息,请参阅 MongoDB Server 手册中的OpenID Connect 身份验证MongoDB Server 参数

注意

由于 Python 的标准库不支持异步HTTP请求,因此来自PyMongo的所有 OIDC 请求都是同步的,并会区块asyncio循环。

如果应用程序在Azure VM 上运行,或以其他方式使用 Azure实例元数据服务(IMDS),您可以使用 PyMongo 的内置Azure支持对MongoDB进行身份验证。

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

注意

如果authMechanismProperties值包含逗号,则必须使用MongoClient构造函数来设立身份验证选项。

首先,为身份验证机制属性创建 Python 字典,如以下示例所示。 将<audience>占位符替换为 MongoDB 部署上配置的audience参数的值。

以下代码示例展示了如何在连接string中设立这些选项:

properties = {"ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>"}

然后,设置以下连接选项:

  • username:如果使用的是 Azure 托管标识,请将其设置为托管标识的客户端 ID。 如果使用服务主体代表企业应用程序,请将其设置为服务主体的应用程序 ID。

  • authMechanism:设置为"MONGODB-OIDC"

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

以下代码示例展示了如何在创建MongoClient时设立这些选项:

from pymongo import MongoClient
# define properties and MongoClient
properties = {"ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>"}
client = MongoClient(
"mongodb://<hostname>:<port>",
username="<Azure client ID or application ID>",
authMechanism="MONGODB-OIDC",
authMechanismProperties=properties
)

在连接string中包含以下连接选项:

  • username:如果使用的是 Azure 托管标识,请将其设置为托管标识的客户端 ID。 如果使用服务主体代表企业应用程序,请将其设置为服务主体的应用程序 ID。

  • authMechanism:设置为MONGODB-OIDC

  • authMechanismProperties:设置为ENVIRONMENT:azure,TOKEN_RESOURCE:<audience> 。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。

    以下代码示例展示了如何在连接string中设立这些选项:

from pymongo import MongoClient
# define URI and MongoClient
uri = ("mongodb://<hostname>:<port>/?"
"username=<Azure client ID or application ID>"
"&authMechanism=MONGODB-OIDC"
"&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>")
client = MongoClient(uri)

提示

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

如果您的应用程序在 Google Compute Engine 虚拟机上运行,或以其他方式使用 GCP实例元数据服务 ,您可以使用 PyMongo 的内置GCP支持对MongoDB进行身份验证。

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

注意

如果authMechanismProperties值包含逗号,则必须使用MongoClient构造函数来设立身份验证选项。

首先,为身份验证机制属性创建 Python 字典,如以下示例所示。 将<audience>占位符替换为 MongoDB 部署上配置的audience参数的值。

properties = {"ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>"}

然后,设置以下连接选项:

  • authMechanism:设置为"MONGODB-OIDC"

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

以下代码示例展示了如何在创建MongoClient时设立这些选项:

from pymongo import MongoClient
# define properties and MongoClient
properties = {"ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>"}
client = MongoClient(
"mongodb://<hostname>:<port>",
authMechanism="MONGODB-OIDC",
authMechanismProperties=properties
)

在连接string中包含以下连接选项:

  • authMechanism:设置为MONGODB-OIDC

  • authMechanismProperties:设置为ENVIRONMENT:gcp,TOKEN_RESOURCE:<audience> 。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。

以下代码示例展示了如何在连接string中设立这些选项:

from pymongo import MongoClient
# define URI and MongoClient
uri = ("mongodb://<hostname>:<port>/?"
"&authMechanism=MONGODB-OIDC"
"&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>")
client = MongoClient(uri)

如果应用程序在Azure Functions、App Service 环境 (ASE) 或Azure Kubernetes服务 (AKS) 上运行,则可以使用 azure-identity 包以获取身份验证凭证。

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

python3 -m pip install azure-identity

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

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

audience = "<audience>"
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)

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

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>"
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类继承的类。 此类必须实现fetch()方法,该方法以OIDCCallbackResult对象的形式返回 OIDC 令牌。

以下示例演示如何定义名为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)

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

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 文档:

后退

身份验证