Docs 菜单
Docs 主页
/ / /
pymongo
/

企业身份验证机制

在此页面上

  • 概述
  • 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 或简易安装安装 Python 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:服务领域。当用户的 Realm 与服务的 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参数的值。

以下代码示例展示了如何在连接字符串中设置这些选项:

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参数的值。

    以下代码示例展示了如何在连接字符串中设置这些选项:

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参数的值。

以下代码示例展示了如何在连接字符串中设置这些选项:

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

后退

身份验证机制