文档菜单

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

身份验证机制

本页内容

  • 概述
  • SCRAM-SHA-256
  • SCRAM-SHA-1
  • MONGODB-X509
  • MONGODB-AWS
  • MongoClient 凭据
  • 环境变量
  • 共享凭据文件
  • AWS 配置文件
  • AssumeRole 请求
  • AssumeRoleWithWebIdentity
  • ECS 容器或 EC2 实例
  • API 文档

本指南介绍了您可以在 PyMongo 中使用的身份验证机制。

重要

百分比编码

您必须百分号编码 在将用户名和密码包含在MongoDB URI之前,请对它们进行百分号编码。quote_plus() 方法,在 urllib.parse 模块中可用,是执行此任务的一种方式。例如,调用 quote_plus("and / or") 返回字符串 and+%2F+or

在将用户名或密码作为参数传递给 MongoClient 时,请不要对它们进行百分号编码。

SCRAM-SHA-256,由RFC 7677定义,是MongoDB v4.0或更高版本部署上的默认身份验证机制。

要使用此机制进行身份验证,请设置以下连接选项

  • username:用于身份验证的用户名。在将其包含在连接URI中之前,对此值进行百分比值编码。

  • password:用于身份验证的密码。在将其包含在连接URI中之前,对此值进行百分比值编码。

  • authSource:要对其身份验证的MongoDB数据库。默认情况下,PyMongo在连接URI中包含数据库时对其身份验证,如果不包含,则对admin数据库进行身份验证。

  • authMechanism:设置为SCRAM-SHA-256

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

SCRAM-SHA-1,由RFC 5802定义,是MongoDB v3.6部署上的默认身份验证机制。

要使用此机制进行身份验证,请设置以下连接选项

  • username:用于身份验证的用户名。在将其包含在连接URI中之前,对此值进行百分比值编码。

  • password:用于身份验证的密码。在将其包含在连接URI中之前,对此值进行百分比值编码。

  • authSource:要对其身份验证的MongoDB数据库。默认情况下,PyMongo对admin数据库进行身份验证。

  • authMechanism:设置为"SCRAM-SHA-1"

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

如果您启用了TLS,在TLS握手过程中,PyMongo可以向MongoDB提供X.509客户端证书以证明其身份。MONGODB-X509身份验证机制使用此证书来验证客户端。

要使用此机制进行身份验证,请设置以下连接选项

  • tls:设置为True

  • tlsCertificateKeyFile:包含您的客户端证书和私钥的.pem文件的文件路径。

  • authMechanism:设置为"MONGODB-X509"

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

重要

MONGODB-AWS认证机制需要MongoDB v4.4或更高版本。

MONGODB-AWS认证机制使用AWS IAM(Amazon Web Services Identity and Access Management)或AWS Lambda凭证来认证您的应用程序。要使用MONGODB-AWS进行认证,您必须安装带aws选项的PyMongo,如下例所示

python -m pip install pymongo[aws]

PyMongo使用Boto3,Python的AWS SDK,来处理凭证。Boto3将按照以下顺序尝试从以下来源检索AWS凭证

  1. 传递给MongoClient构造函数的命名参数或连接URI中的参数

  2. 环境变量

  3. 共享凭证文件

  4. AWS配置文件

  5. 向AWS安全令牌服务(STS)发送的AssumeRole请求

  6. 向AWS STS发送的AssumeRoleWithWebIdentity请求

  7. 配置了IAM角色的Amazon EC2实例上的实例元数据服务

以下部分描述了如何使用PyMongo从这些来源检索凭证,并使用它们来认证您的应用程序。

首先,PyMongo检查您是否已将AWS凭证传递给MongoClient构造函数,无论是作为命名参数还是作为连接URI的一部分。要将凭证传递给MongoClient,设置以下连接选项

  • username:用于认证的AWS IAM访问密钥ID。在将其包含在连接URI中之前,对该值进行百分编码。

  • password:AWS IAM秘密访问密钥。在将其包含在连接URI中之前,对该值进行百分编码。

  • authMechanism:设置为"MONGODB-AWS"

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

当您构建MongoClient对象时,如果没有提供用户名和密码,PyMongo将尝试从以下环境变量中检索AWS凭证

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN

要使用这些环境变量来认证您的应用程序,首先将它们设置为认证所需的AWS IAM值,如下所示代码示例

export AWS_ACCESS_KEY_ID=<AWS IAM access key ID>
export AWS_SECRET_ACCESS_KEY=<AWS IAM secret access key>
export AWS_SESSION_TOKEN=<AWS session token>

重要

不要对环境变量中的值进行百分编码。

设置这些环境变量后,将authMechanism连接选项设置为"MONGODB-AWS"。您可以通过两种方式设置此选项:通过传递参数给MongoClient构造函数或在您的连接字符串中设置参数。

提示

AWS Lambda

AWS Lambda 运行时可以在初始化过程中自动设置这些环境变量。有关在 AWS Lambda 环境中使用环境变量的更多信息,请参阅 AWS 文档中的使用 Lambda 环境变量

如果 PyMongo 在前面的环境变量中找不到 AWS 凭据,它会尝试从共享凭据文件中读取它们。

要使用共享凭据文件对您的应用程序进行身份验证,请确保该文件存在于您的环境中并且配置正确。有关创建共享凭据文件的方法,请参阅Boto3文档中的凭据和AWS文档中的配置

创建共享凭据文件后,将连接选项authMechanism设置为"MONGODB-AWS"。您可以通过两种方式设置此选项:通过将参数传递给MongoClient构造函数或通过连接字符串中的参数。

提示

为了防止PyMongo使用共享凭据文件进行身份验证,请执行以下操作之一

  • 在您的终端中将环境变量AWS_SHARED_CREDENTIALS_FILE设置为""

  • 在您的脚本或应用程序中添加os.environ["AWS_SHARED_CREDENTIALS_FILE"] = ""

  • 为您的MongoDB凭据创建一个专门的AWS配置文件。将环境变量AWS_PROFILE设置为创建的配置文件名称。

如果PyMongo在共享凭据文件中找不到凭据,它会尝试从AWS配置文件中读取它们。

要使用AWS配置文件对应用程序进行身份验证,请确保该文件存在于您的环境中,并且配置正确。有关如何创建AWS配置文件的说明,请参阅Boto3文档中的凭据以及AWS文档中的配置

创建配置文件后,将authMechanism连接选项设置为"MONGODB-AWS"。您可以通过两种方式设置此选项:通过向MongoClient构造函数传递参数,或者通过连接字符串中的参数。

您可以使用PyMongo指示AWS STS端点进行AssumeRole请求,而不是在AWS配置文件中存储AWS凭据。此请求返回临时凭据,应用程序可以使用这些凭据进行身份验证。

要使用由AssumeRole请求返回的临时AWS IAM凭证进行身份验证,请确保您的环境中存在AWS配置文件且配置正确。有关如何创建和配置AWS配置文件的说明,请参阅Boto3文档中的凭证以及AWS文档中的配置

创建配置文件后,设置以下连接选项

  • username:由AssumeRole请求返回的AWS IAM访问密钥ID。在将其包含在连接URI之前,请对此值进行百分号编码。

  • password:由AssumeRole请求返回的AWS IAM密钥访问密钥。在将其包含在连接URI之前,请对此值进行百分号编码。

  • authMechanismProperties:设置为AWS_SESSION_TOKEN:和由AssumeRole请求返回的AWS会话令牌。在将其包含在连接URI之前,请对此值进行百分号编码。

  • authMechanism:设置为"MONGODB-AWS"

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

有关使用AssumeRole请求对您的应用程序进行身份验证的更多信息,请参阅以下AWS文档

重要

您的应用程序必须使用pymongo_auth_aws v1.1.0或更高版本以支持EKS。

如果您的应用程序从OpenID Connect(OIDC)身份提供者对您的EKS集群进行用户身份验证,PyMongo可以通过发送一个AssumeRoleWithWebIdentity请求,用OIDC令牌交换应用程序的临时AWS凭据。

要使用由AssumeRoleWithWebIdentity请求返回的临时AWS IAM凭据进行身份验证,请确保您的环境中存在AWS配置文件并且配置正确。有关创建和配置AWS配置文件的说明,请参阅Boto3文档中的Credentials部分,以及AWS文档中的Configuration部分。

配置您的环境以使用AssumeRoleWithWebIdentity请求后,将authMechanism连接选项设置为"MONGODB-AWS"。您可以通过以下两种方式设置此选项:通过传递参数给MongoClient构造函数,或在您的连接字符串中设置参数。

有关使用AssumeRoleWithWebIdentity请求对应用程序进行身份验证的更多信息,请参阅以下AWS文档

如果您的应用程序在Amazon Elastic Container Service(ECS)容器中的Amazon Elastic Cloud Compute(EC2)实例上运行,PyMongo可以自动从ECS端点检索临时AWS凭据。

要在EC2实例内部使用临时凭证,将authMechanism连接选项设置为"MONGODB-AWS"。您可以通过两种方式设置此选项:通过将参数传递给MongoClient构造函数或通过连接字符串中的参数。

要了解如何在PyMongo中验证应用程序,请参阅以下API文档

← 保护您的数据