文档菜单
文档首页
/ / /
PyMongo
/

企业身份验证机制

本页内容

  • 概述
  • kerberos
  • PLAIN SASL
  • MONGODB-OIDC
  • Azure IMDS
  • GCP IMDS
  • 其他Azure环境
  • GCP GKE
  • API文档

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

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

首先,使用pip或easy_install安装Pythonkerberospykerberos 模块。

安装这些模块之一后,运行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:用于认证的Kerberos主体。在将其包含在连接URI中之前,请对此值进行百分比编码。

  • authMechanism:设置为 "GSSAPI"

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

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

注意

如果您的 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:用于认证的Kerberos主体。在将其包含在连接URI中之前,请对此值进行百分比编码。

  • authMechanism:设置为 "GSSAPI"

  • password:可选。如果要认证的用户与应用程序进程的所有者用户不同,请将此选项设置为认证用户的密码。

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

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

    • CANONICALIZE_HOST_NAME:是否使用 MongoDB 主机的完全限定域名 (FQDN) 作为服务器主体。

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

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

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),由RFC 4616定义,是一种常与TLS或其他加密层一起使用的用户名密码身份验证机制。

重要

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

有关如何为连接启用TLS的更多信息,请参阅配置传输层安全性(TLS)。

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

注意

如果您的 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身份验证机制需要MongoDB服务器v7.0或更高版本,在Linux平台上运行。

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

以下部分描述了如何使用MONGODB-OIDC身份验证机制进行各种平台的身份验证。

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

注意

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

如果您的应用程序在 Azure 虚拟机 (VM) 上运行,或者使用 Azure 实例元数据服务 (IMDS),您可以使用 PyMongo 的内置 Azure 支持通过身份验证连接到 MongoDB。

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

注意

如果您的 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
)

在您的连接字符串中包含以下连接选项

  • 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 虚拟机上运行,并且只有一个管理身份与虚拟机关联,则可以省略 username 连接选项。

如果你的应用程序运行在Google Compute Engine虚拟机(VM)上,或者使用GCP实例元数据服务,你可以通过PyMongo的内置GCP支持来对MongoDB进行身份验证。

你可以通过以下两种方式为GCP IMDS配置OIDC:通过传递参数到MongoClient构造函数,或者通过连接字符串中的参数。

注意

如果您的 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
)

在您的连接字符串中包含以下连接选项

  • 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 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>"
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>"
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文档。

返回

身份验证