Docs 菜单
Docs 主页
/ /

Amazon Web Services身份和访问管理

注意

Amazon Web Services身份验证仅在MongoDB Enterprise for MongoDB 4.4 及更高版本中可用。

MONGODB-AWS身份验证机制使用 AWS 身份和访问管理 (IAM) 以及 AWS 安全令牌服务 (STS) 向MongoDB 部署证明客户端的身份。以下步骤描述了 AWS身份验证进程:

  1. 客户端使用 AWS IAM凭证创建签名并将其发送到MongoDB 部署。

  2. 此部署使用客户端签名向Amazon Web Services STS 发送请求。

  3. 如果请求成功,STS 将返回与客户端凭证对应的 IAM 用户或角色的Amazon资源名称 (ARN)。

  4. 部署使用返回的 ARN 来查找用户。客户端以此用户身份进行身份验证。

注意

客户端和服务器使用不同的用户名。客户端将 AWS访问权限密钥ID作为用户名发送。服务器使用与访问权限密钥ID对应的 IAM 用户或角色的 ARN 作为用户名。

要使用此机制进行身份验证,请执行以下操作:

  • $external数据库上创建一个用户,其名称是您要进行身份验证的 IAM 用户或角色的 ARN。

  • 配置客户端以使用 MONGODB-AWS身份验证机制。

Amazon Web Services凭证包括以下组件:

  • 访问密钥 ID

  • 秘密访问密钥

  • 可选会话令牌

使用 AWS IAM凭证进行身份验证会使用访问权限密钥ID和秘密访问权限密钥。使用临时 AWS IAM凭证进行的身份验证会使用所有三个组件:访问权限密钥ID、秘密访问权限密钥和会话令牌。

注意

驱动程序从不通过网络发送秘密访问密钥或会话令牌。

临时凭证用于:

本页上的代码示例使用以下占位符:

  • <hostname>: MongoDB 部署的网络解决。

  • <port>: MongoDB 部署的端口号。

  • <aws_access_key_id>:AWS访问权限密钥ID。

  • <aws_secret_access_key>:AWS 秘密访问权限密钥。

  • <aws_session_token>:AWS 会话令牌。

要使用本页上的代码示例,请将这些占位符替换为您自己的值。

C++驾驶员可以从环境中检索AWS IAM凭证,您也可以在应用程序代码中显式提供这些凭证。

当您使用 MONGODB-AWS身份验证机制时, C++驾驶员会尝试按以下顺序从以下源检索AWS凭证:

  1. 在连接 URI 中传递的档案

  2. 环境变量

  3. Amazon Web Services EKS AssumeRoleWithWebIdentity请求

  4. ECS容器元数据

  5. EC 2实例元数据

您可以在连接 URI 中提供长期(非临时)IAM凭证。为此,设立以下 URI 参数:

  • username:设置为您的 AWS访问权限密钥ID。

  • password:设置为您的 AWS 秘密访问权限密钥。

  • authMechanism:设置为MONGODB-AWS

您可以单独使用连接 URI,也可以使用带有通过 mongocxx::options::tlsmongocxx::options::client 类配置的 TLS 选项的连接 URI。选择 Connection URIClient Options with TLS标签页,查看相应的语法:

auto uri = mongocxx::uri("mongodb://<aws_access_key_id>:<aws_secret_access_key>@<hostname>:<port>/?"
"authMechanism=MONGODB-AWS");
auto client = mongocxx::client(uri);
mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.ca_file("/path/to/ca.pem");
client_options.tls_opts(tls_options);
auto uri = mongocxx::uri("mongodb://<aws_access_key_id>:<aws_secret_access_key>@<hostname>:<port>/?"
"authMechanism=MONGODB-AWS&tls=true");
auto client = mongocxx::client(uri, client_options);

注意

如果在 URI 中提供凭证,请对访问权限密钥ID或秘密访问权限密钥中的任何特殊字符进行百分号编码。

您可以通过将会话令牌包含在连接 URI 的 authMechanismProperties 参数中,在连接 URI 中提供临时 IAM凭证。

选择 Connection URIClient Options with TLS标签页,查看相应的语法:

auto uri = mongocxx::uri("mongodb://<aws_access_key_id>:<aws_secret_access_key>@<hostname>:<port>/?"
"authMechanism=MONGODB-AWS&authMechanismProperties=AWS_SESSION_TOKEN:<aws_session_token>");
auto client = mongocxx::client(uri);
mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.ca_file("/path/to/ca.pem");
client_options.tls_opts(tls_options);
auto uri = mongocxx::uri("mongodb://<aws_access_key_id>:<aws_secret_access_key>@<hostname>:<port>/?"
"authMechanism=MONGODB-AWS"
"&authMechanismProperties=AWS_SESSION_TOKEN:<aws_session_token>&tls=true");
auto client = mongocxx::client(uri, client_options);

当您指定 MONGODB-AWS身份验证机制并省略 usernamepassword 时, C++驾驶员会自动尝试从环境变量、Web 身份角色和 AWS元数据端点检索AWS凭证。

C++驾驶员首先检查以下环境变量中的凭证:

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN (可选)

这些变量可由许多 AWS 工具和软件开发工具包(例如 AWS CLI )识别,并且通常在 AWS Lambda环境中设立。

设置这些变量的示例:

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>

设立这些环境变量后,将连接 URI 中的 authMechanism 参数设立为 "MONGODB-AWS"。选择 Connection URIClient Options with TLS标签页,查看相应的语法:

auto uri = mongocxx::uri("mongodb://<hostname>:<port>/?"
"authMechanism=MONGODB-AWS");
auto client = mongocxx::client(uri);
mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.ca_file("/path/to/ca.pem");
client_options.tls_opts(tls_options);
auto uri = mongocxx::uri("mongodb://<hostname>:<port>/?"
"authMechanism=MONGODB-AWS&tls=true");
auto client = mongocxx::client(uri, client_options);

如果您的应用程序在Amazon EKS集群中运行并通过 OpenID Connect (OIDC) 身份提供商进行身份验证,则C++驾驶员可以使用 AssumeRoleWithWebIdentity请求。此请求将 OIDC 令牌交换为应用程序的临时 AWS凭证。

要配置此机制:

  1. 创建或更新AWS 配置文件。要学习;了解如何创建此配置文件,请参阅全局配置 AWS SDK 和工具。

  2. 设置以下环境变量:

    • AWS_ROLE_ARN:设置为要代入 IAM角色的 ARN。

    • AWS_WEB_IDENTITY_TOKEN_FILE:设置为包含服务帐户的 OIDC 令牌的文件的路径。

    • AWS_ROLE_SESSION_NAME (可选):设置为假定角色会话的标识符。如果省略此变量,驾驶员将生成一个随机标识符。

  3. 将连接 URI 中的 authMechanism 参数设置为 "MONGODB-AWS"

选择 Connection URIClient Options with TLS标签页,查看相应的语法:

auto uri = mongocxx::uri("mongodb://<hostname>:<port>/?"
"authMechanism=MONGODB-AWS");
auto client = mongocxx::client(uri);
mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.ca_file("/path/to/ca.pem");
client_options.tls_opts(tls_options);
auto uri = mongocxx::uri("mongodb://<hostname>:<port>/?"
"authMechanism=MONGODB-AWS&tls=true");
auto client = mongocxx::client(uri, client_options);

要学习;了解有关使用 Web 身份角色进行身份验证的更多信息,请参阅 AssumeRoleWithWebIdentity API

如果您的应用程序在Amazon ECS容器中运行,C++驾驶员可以从 ECS任务元数据端点检索临时 AWS凭证。

要启用此行为,请将 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 环境变量设立为 ECS任务元数据端点的相对 URI,如以下示例所示:

export AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=<relative URI of the ECS task metadata endpoint>

然后构建客户端,并将 authMechanism设立为 "MONGODB-AWS"。选择 Connection URIClient Options with TLS标签页,查看相应的语法:

auto uri = mongocxx::uri("mongodb://<hostname>:<port>/?"
"authMechanism=MONGODB-AWS");
auto client = mongocxx::client(uri);
mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.ca_file("/path/to/ca.pem");
client_options.tls_opts(tls_options);
auto uri = mongocxx::uri("mongodb://<hostname>:<port>/?"
"authMechanism=MONGODB-AWS&tls=true");
auto client = mongocxx::client(uri, client_options);

如果您的应用程序在Amazon EC2实例上运行,C++驾驶员可以从 EC2实例元数据端点检索临时 AWS凭证。

要启用此行为,请将连接 URI 中的 authMechanism 参数设立为 "MONGODB-AWS"。选择 Connection URIClient Options with TLS标签页,查看相应的语法:

auto uri = mongocxx::uri("mongodb://<hostname>:<port>/?"
"authMechanism=MONGODB-AWS");
auto client = mongocxx::client(uri);
mongocxx::options::client client_options;
mongocxx::options::tls tls_options;
tls_options.ca_file("/path/to/ca.pem");
client_options.tls_opts(tls_options);
auto uri = mongocxx::uri("mongodb://<hostname>:<port>/?"
"authMechanism=MONGODB-AWS&tls=true");
auto client = mongocxx::client(uri, client_options);

注意

如果您通过上述 AWS 身份验证方法设立了任何环境变量,则 C++ 驱动程序会尝试使用这些方法检索凭证,然后再尝试从 EC2 实例中检索凭证。要尝试仅从 EC2实例检索凭证,请确保未设立环境变量。

如果应用程序在 EC2实例上的 ECS容器中运行,并且允许该容器访问实例元数据,则驱动程序会尝试从 EC2实例元数据终结点检索AWS凭证。如果驱动程序以这种方式检索凭证,您的应用程序可以作为分配给 EC2实例的 IAM角色进行身份验证。

要学习;了解如何阻止容器访问 EC2实例元数据,请参阅Amazon Web Services文档。

要学习;了解有关在C++驾驶员中创建 mongocxx::client对象或配置 TLS 的更多信息,请参阅以下API文档:

后退

x.509

在此页面上