使用 IAM 身份进行身份验证 - Amazon DocumentDB

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 IAM 身份进行身份验证

Amazon DocumentDB 用户和应用程序可以使用 IAM 用户和角色进行身份验证,以便进入 Amazon DocumentDB 集群。Amazon DocumentDB IAM 身份验证是一种无需密码的身份验证方法。此外,在使用 IAM 角色/用户时,客户端应用程序不会将密码密钥发送至 Amazon DocumentDB 集群。而是由 AWS STS 使用临时安全令牌对客户端连接进行身份验证。现在,在连接到不同的 Amazon DocumentDB 集群和其他 AWS 服务时,非管理员用户和应用程序可以使用相同的 IAM 身份 ARN。

您也可以选择同时使用基于密码的身份验证和 IAM 身份验证,对访问 Amazon DocumentDB 集群的用户和应用程序进行身份验证。只有 Amazon DocumentDB 基于实例的集群版本 5.0 才可以使用 IAM 身份验证。Amazon DocumentDB 主用户不支持用 IAM 身份 ARN 进行 IAM 身份验证。

注意

主用户只能使用现有基于密码的身份验证进行身份验证。

开始使用 IAM 用户和角色进行身份验证

具有 IAM 身份的 Amazon DocumentDB 用户和角色在 $external 数据库中进行创建和管理。

创建用户

以主用户身份进行连接,然后创建 IAM 用户和角色:

use $external; db.createUser( { user: "arn:aws:iam::123456789123:user/iamuser", mechanisms: ["MONGODB-AWS"], roles: [ { role: "readWrite", db: "readWriteDB" } ] } );

或者,使用 IAM 角色添加 Amazon DocumentDB 用户:

use $external; db.createUser( { user: "arn:aws:iam::123456789123:roles/iamrole", mechanisms: ["MONGODB-AWS"], roles: [ { role: "readWrite", db: "readWriteDB" } ] } );

修改 IAM 用户或角色

修改现有 IAM 用户:

use $external; db.updateUser( { "arn:aws:iam::123456789123:user/iamuser", { roles: [ { role: "read", db: "readDB" } ] } } );

修改现有 IAM 角色:

use $external; db.updateUser( { "arn:aws:iam::123456789123:roles/iamrole", { roles: [ { role: "read", db: "readDB" } ] } } );

授予或撤消 IAM 用户的角色:

use $external; db.grantRolesToUser("arn:aws:iam::123456789123:user/iamuser", [{db: "admin", role: "readWriteAnyDatabase"}])
use $external; db.revokeRolesFromUser("arn:aws:iam::123456789123:user/iamuser", [{db: "admin", role: "readWriteAnyDatabase"}])

授予或撤消 IAM 角色的角色:

use $external; db.grantRolesToUser("arn:aws:iam::123456789123:user/iamrole", [{db: "admin", role: "readWriteAnyDatabase"}])
use $external; db.revokeRolesFromUser("arn:aws:iam::123456789123:user/iamrole", [{db: "admin", role: "readWriteAnyDatabase"}])

删除 IAM 用户或角色

删除现有 IAM 用户:

use $external db.dropUser( { user: "arn:aws:iam::123456789123:user/iamuser" } );

删除现有 IAM 角色:

use $external db.dropUser( { user: "arn:aws:iam::123456789123:roles/iamrole" } );

配置 URI 连接以使用 AWS IAM 进行身份验证

要使用 AWS IAM 进行身份验证,请使用以下 URI 参数:authSource 作为 $external,以及 authMechanism 作为 MONGODB-AWS。如果使用 IAM 用户,则将用户名和密码字段分别替换为访问密钥和私有密钥。如果代入 IAM 角色,则将该角色附加到您所在的环境(例如,AWS Lambda 函数、Amazon EC2 实例)。利用 MONGODB-AWS 机制进行身份验证时,无需专门传递任何凭证。如果使用支持 MONGODB-AWS 身份验证机制的 MongoDB 驱动程序,这些驱动程序还可以从计算实例(例如 Amazon EC2、Lambda 函数等)检索 IAM 角色凭证。以下示例使用 mongo shell 进行身份验证,方法是使用 MONGODB-AWS 机制,通过手动传递(IAM 用户的)访问密钥和私有密钥来演示对 Amazon DocumentDB 进行身份验证。

以下示例使用 Python 代码进行身份验证,方法是使用 MONGODB-AWS 机制演示对 Amazon DocumentDB 进行身份验证,无需显式传递任何凭证(使用附加到此环境的 IAM 角色)。

##Create a MongoDB client, open a connection to Amazon DocumentDB using an IAM role client = pymongo.MongoClient(‘mongodb://<DocDBEndpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false&authSource=%24external&authMechanism=MONGODB-AWS')

以下示例使用 mongo shell 进行身份验证,方法是使用 MONGODB-AWS 机制,通过手动传递(IAM 用户的)访问密钥和私有密钥来演示对 Amazon DocumentDB 进行身份验证。

$ mongo 'mongodb://<access_key>:<secret_key>@<cluster_endpoint>:<db_port>/test?authSource=%24external&authMechanism=MONGODB-AWS'

以下示例使用 mongo shell 进行身份验证,方法是使用 MONGODB-AWS 机制演示对 Amazon DocumentDB 进行身份验证,无需显式传递任何凭证(使用附加到此环境的 IAM 角色)。

$ mongo 'mongodb://<cluster_endpoint>:<db_port>/test?authSource=%24external&authMechanism=MONGODB-AWS'

配置 AWS 计算类型,以使用 AWS IAM 对 Amazon DocumentDB 进行身份验证

使用 Amazon EC2/AWS Lambda/AWS Fargate

Amazon EC2 使用以下环境变量。如果有附加到 EC2 实例的 IAM 角色,或与 Lambda 函数或 Amazon ECS 任务关联的执行 IAM 角色,则这些变量会自动填充,驱动程序可以从环境中获取这些值:

AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN

有关环境变量的更多信息,请参阅《AWS Lambda 开发人员指南》中的使用 Lambda 环境变量

使用 Amazon EKS

向 Amazon Elastic Kubernetes Service (Amazon EKS) 容器组分配角色会自动设置以下两个环境变量:

AWS_WEB_IDENTITY_TOKEN_FILE - path of web identity token file AWS_ROLE_ARN - Name of IAM role to connect with

借助这些变量,通过使用 AWS SDK 调用 AssumeRoleWithWebIdentity 来手动代入您代码中的角色:

  • 省略 ProviderID 参数。

  • AWS_WEB_IDENTITY_TOKEN_FILE 环境变量所述的文件中查找 WebIdentityToken 参数的值。

有关更多信息,请参阅《Amazon EKS 用户指南》中什么是 Amazon EKS

监控 IAM 身份验证请求

使用 Amazon DocumentDB 审核

前往 Amazon CloudWatch 中的审核日志文件夹,使用不同的搜索模式获取 IAM 身份验证的日志。例如,用 { $.param.mechanism = "MONGODB-AWS" } 作为“搜索所有日志流” 的搜索模式。

有关审核中所支持事件的更多信息,请参阅 审核 Amazon DocumentDB 事件

使用 Amazon CloudWatch 指标

StsGetCallerIdentityCalls:该指标显示 Amazon DocumentDB 实例对区域化 AWS Security Token Service (AWS STS) 端点的 GetCallerIdentity 调用次数。请参阅 MONGODB-AWS 身份验证规范,了解数据库实例为何需要进行 STS GetCallerIdentity 调用。

使用 IAM 身份验证

使用 IAM 身份验证

如果您不想在自己的数据库中管理用户名和密码,可以使用 IAM 身份验证。只有 Amazon DocumentDB 基于实例的集群版本 5.0 才可以使用 IAM 身份验证。

IAM 身份验证依赖于 STS 服务。在使用 IAM 身份验证进行连接并收到 STS 节流异常时,我们建议您评估是否可以降低连接速率。

对于 IAM 配额,请参阅《IAM 用户指南》中的 IAM 和 AWS STS 配额

支持的 IAM 驱动程序

支持 Amazon DocumentDB 5.0 和 MONGODB-AWS 身份验证机制的驱动程序应与 Amazon DocumentDB 中的 IAM 身份验证实现配合使用。NodeJS 驱动程序存在已知的限制,Amazon DocumentDB 目前不支持用这种驱动程序进行 IAM 身份验证。一旦限制解决后,就可以更新 NodeJS 驱动程序支持。

IAM 身份验证的常见问题解答

是否有我可以参考的示例?

请参阅以下页面了解示例用例和配置:

我在使用 Python 驱动程序时显示错误:“pymongo.errors.ConfigurationError:MONGODB-AWS 身份验证需要 pymongo-auth-aws”。我该如何解决这个问题?

在安装采用 IAM 身份验证的 Python 驱动程序时,请确保采用以下语句:

pip install 'pymongo[aws]'

这将安装 IAM 身份验证正常运行所需的附加 AWS 依赖项。

当我的 IAM 角色临时凭证到期时,连接会中断吗?

不会,临时 IAM 凭证仅用于建立连接和身份验证。然后,所有进一步的身份验证都是在 Amazon DocumentDB 集群中完成的。即使 IAM 凭证发生轮换/到期,连接也不会中断或过时。