对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

企业身份验证机制

在本指南中,您可以了解如何使用 MongoDB Enterprise Edition 提供的身份验证机制在 MongoDB 中进行身份验证。身份验证机制是驱动程序和服务器在连接之前确认客户端身份以确保安全的过程。

您可以在最新版本的 MongoDB Enterprise Edition 中使用以下身份验证机制:

要使用其他机制进行身份验证,请参阅身份验证机制基础知识页面。如需了解有关建立与 MongoDB 集群连接的更多信息,请参阅连接指南

您可以使用以下方法在连接到 MongoDB 时指定身份验证机制和凭证:

通用安全服务 API (GSSAPI) 身份验证机制允许用户使用其主体对 Kerberos 服务进行身份验证。

You must use the gssapi build tag and specify cgo support during compilation to use Kerberos authentication. cgo support is enabled by default unless you previously set environment variables to cross-compile to a different platform. To use the gssapi build tag, compile your code with the following command:

go build -tags gssapi

此示例使用以下占位符指定身份验证机制:

  • Kerberos principal: Your Kerberos principal. 示例用户名是myuser@KERBEROS.EXAMPLE.COM

  • password:Kerberos 用户的密码。 您还可以将密码存储在keytab文件中,避免在代码中暴露密码。

  • connection uri:您的连接字符串 URI。

以下代码演示如何定义 Credential 结构以向 Kerberos 进行身份验证,以及如何使用您的身份验证首选项创建客户端:

credential := options.Credential{
AuthMechanism: "GSSAPI",
Username: "<Kerberos principal>",
Password: "<password>",
PasswordSet: true,
}
uri := "<connection uri>"
clientOpts := options.Client().ApplyURI(uri).SetAuth(credential)
client, err := mongo.Connect(context.TODO(), clientOpts)

如果您将身份验证密钥存储在 keytab 文件中,则无需在 Credential 结构体中定义密码或 PasswordSet 字段。可以初始化凭证缓存,以便使用 kinit 二进制文件对 Kerberos 主体进行身份验证。要了解有关 kinit 二进制的更多信息,请参阅 Oracle 文档

以下命令显示如何为示例用户名调用凭证缓存:

kinit myuser@KERBEROS.EXAMPLE.COM

You can alternatively authenticate using a connection string URI, specifying your URL-encoded Kerberos principal, password, and hostname, the network address of your MongoDB server:

uri := "mongodb://<Kerberos principal>:<password>@<hostname>/?authMechanism=GSSAPI"

您可以使用Credential结构中的 AuthMechanismProperties 字段在身份验证机制中指定其他属性。Kerberos 的默认服务名称是“mongodb”。以下代码展示了如何在定义Credential结构时为 SERVICE_NAMESERVICE_REALM 字段设置自定义值:

credential := options.Credential{
AuthMechanism: "GSSAPI",
Username: "<Kerberos principal>",
Password: "<password>",
AuthMechanismProperties: map[string]string{
"SERVICE_REALM": "<Kerberos service realm>",
"SERVICE_NAME": "<service name>",
},
}

有关其他属性,请参阅服务器手册中有关身份验证属性的条目。

您可以使用目录服务器用户名和密码向轻量级目录访问协议 (LDAP) 服务器进行身份验证。

警告

此身份验证机制以明文形式将密码发送到服务器,因此仅对 TLS 连接使用此机制。

此示例使用以下占位符指定身份验证机制:

  • LDAP username:您的 LDAP 用户名

  • password:您的 LDAP 密码

  • connection uri:您的连接字符串 URI

以下代码演示如何定义 Credential 结构以向 LDAP 进行身份验证,以及如何使用您的身份验证首选项创建客户端:

credential := options.Credential{
AuthMechanism: "PLAIN",
Username: "<LDAP username>",
Password: "<password>",
}
uri := "<connection uri>"
clientOpts := options.Client().ApplyURI(uri).SetAuth(credential)
client, err := mongo.Connect(context.TODO(), clientOpts)

您也可以使用连接字符串 URI 进行身份验证,指定您的 LDAP 用户名、密码和 hostname,即 MongoDB 服务器的网络地址:

uri := "mongodb://<LDAP username>:<password>@<hostname>/?authMechanism=PLAIN"

注意

该方法引用 PLAIN 而不是LDAP ,因为它使用 RFC-4616 中定义的 PLAIN 简单身份验证和安全层 (SASL) 进行身份验证。

重要

MONGODB-OIDC 身份验证机制要求在 Linux 平台上运行 MongoDB Server v 7.0或更高版本。

Go驱动程序支持对工作负载身份进行 OpenID Connect (OIDC) 身份验证。工作负载身份是分配给软件工作负载(例如应用程序、服务、脚本或容器)的身份,用于验证和访问权限其他服务和资源。

以下部分介绍如何使用 MONGODB-OIDC 身份验证机制对各种平台进行身份验证。

要学习;了解有关 MONGODB-OIDC身份验证机制的更多信息,请参阅MongoDB Server手册中的OpenID Connect 身份验证MongoDB Server参数

如果应用程序在 Azure VM 上运行,或以其他方式使用 Azure 实例元数据服务 (IMDS),则可以使用 Go 驱动程序的内置 Azure 支持对 MongoDB 进行身份验证。

您可以通过以下方式为Azure IMDS 配置 OIDC:

  • 通过创建Credential结构并在创建客户端时将其传递给SetAuth()方法

  • 通过在连接string中设置参数

注意

如果AuthMechanismProperties结构体字段值包含逗号,则必须创建Credential实例来设立身份验证选项。

首先,创建一个映射来存储身份验证机制属性,如以下示例所示。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。

props := map[string]string{
"ENVIRONMENT": "azure",
"TOKEN_RESOURCE": "<audience>",
}

然后,设立以下Credential结构字段:

  • Username:如果使用的是Azure托管标识,设立为托管标识的客户端ID 。

  • AuthMechanism:设置为"MONGODB-OIDC"

  • AuthMechanismProperties:设置为之前创建的props地图。

以下代码示例展示了如何在创建Client时设立这些选项:

uri := "mongodb://<hostname>:<port>"
props := map[string]string{
"ENVIRONMENT": "azure",
"TOKEN_RESOURCE": "<audience>",
}
opts := options.Client().ApplyURI(uri)
opts.SetAuth(
options.Credential{
Username: "<Azure client ID or application ID>",
AuthMechanism: "MONGODB-OIDC",
AuthMechanismProperties: props,
},
)
client, err := mongo.Connect(context.TODO(), opts)
if err != nil {
panic(err)
}

在连接string中包含以下连接选项:

  • username:如果使用的是Azure托管标识,设立为托管标识的客户端ID 。

  • authMechanism:设置为MONGODB-OIDC

  • authMechanismProperties:设置为ENVIRONMENT:azure,TOKEN_RESOURCE:<audience> 。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。

以下代码示例展示了如何在连接string中设立这些选项:

uri := "mongodb://<hostname>:<port>/?" +
"username=<Azure client ID or application ID>" +
"&authMechanism=MONGODB-OIDC" +
"&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>"
client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
if err != nil {
panic(err)
}

提示

如果应用程序在 Azure VM 上运行,并且只有一个托管标识与该 VM 关联,则可以省略username连接选项。

如果您的应用程序在 Google Compute Engine 虚拟机上运行,或以其他方式使用GCP实例元数据服务,则可以使用Go驱动程序的内置GCP支持向MongoDB进行身份验证。

您可以通过以下方式为GCP IMDS 配置 OIDC:

  • 通过创建Credential结构并在创建客户端时将其传递给SetAuth()方法

  • 通过在连接string中设置参数

注意

如果AuthMechanismProperties结构体字段值包含逗号,则必须创建Credential实例来设立身份验证选项。

首先,创建一个映射来存储身份验证机制属性,如以下示例所示。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。

props := map[string]string{
"ENVIRONMENT": "gcp",
"TOKEN_RESOURCE": "<audience>",
}

然后,设立以下Credential结构字段:

  • AuthMechanism:设置为"MONGODB-OIDC"

  • AuthMechanismProperties:设置为之前创建的props地图。

以下代码示例展示了如何在创建Client时设立这些选项:

uri := "mongodb://<hostname>:<port>"
props := map[string]string{
"ENVIRONMENT": "gcp",
"TOKEN_RESOURCE": "<audience>",
}
opts := options.Client().ApplyURI(uri)
opts.SetAuth(
options.Credential{
AuthMechanism: "MONGODB-OIDC",
AuthMechanismProperties: props,
},
)
client, err := mongo.Connect(context.TODO(), opts)
if err != nil {
panic(err)
}

在连接string中包含以下连接选项:

  • authMechanism:设置为MONGODB-OIDC

  • authMechanismProperties:设置为ENVIRONMENT:gcp,TOKEN_RESOURCE:<audience> 。 将<audience>占位符替换为MongoDB 部署上配置的audience参数的值。

以下代码示例展示了如何在连接string中设立这些选项:

uri := "mongodb://<hostname>:<port>/?" +
"&authMechanism=MONGODB-OIDC" +
"&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>"
client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri))
if err != nil {
panic(err)
}

Go驱动程序并不为所有平台提供内置支持,包括 AWS Elastic Kubernetes Service (EKS)。要对不受支持的平台进行身份验证,您必须定义自定义回调函数以使用 OIDC 进行身份验证。在驱动程序中,您可以定义一个 options.OIDCCallback 函数,并将其设立为 Credential 结构中 OIDCMachineCallback 字段的值。

以下示例为具有已配置 IAM OIDC提供商的 EKS集群定义了自定义回调。 访问权限令牌是从AWS_WEB_IDENTITY_TOKEN_FILE环境变量中设立的路径读取的:

eksCallback := func(_ context.Context,
_ *options.OIDCArgs) (*options.OIDCCredential, error) {
accessToken, err := os.ReadFile(
os.Getenv("AWS_WEB_IDENTITY_TOKEN_FILE"))
if err != nil {
return nil, err
}
return &options.OIDCCredential{
AccessToken: string(accessToken),
}, nil
}

然后,您可以创建一个Credential结构体来使用您定义的 EKS回调函数:

uri := "mongodb://<hostname>:<port>"
opts := options.Client().ApplyURI(uri)
opts.SetAuth(
options.Credential{
AuthMechanism: "MONGODB-OIDC",
OIDCMachineCallback: eksCallback,
},
)
client, err := mongo.Connect(context.TODO(), opts)
if err != nil {
panic(err)
}

如果应用程序在Azure Functions、App Service 环境 (ASE) 或Azure Kubernetes服务 (AKS) 上运行,则可以使用 azidentity 模块获取身份验证凭证。

首先,通过运行以下命令来安装azidentity模块:

go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity

Your OIDCCallback function must return an OIDCCredential instance that uses the AccessToken generated from the azidentity package. See the preceding Custom Callback section for an example that implements a custom callback to retrieve an access token and then creates a Credential.

如果您的应用程序在配置了服务帐户的GCP Google Kubernetes Engine (GKE)集群上运行,则可以从标准服务帐户令牌文件位置读取 OIDC 令牌。

首先,定义OIDCCallback函数。 此函数读取 OIDC 令牌并返回OIDCCredential实例。

以下示例定义了一个名为gkeCallback的回调函数。 该函数从标准 服务帐户令牌文件位置中的文件中检索 OIDC 令牌:

gkeCallback := func(_ context.Context,
_ *options.OIDCArgs) (*options.OIDCCredential, error) {
accessToken, err := os.ReadFile(
"/var/run/secrets/kubernetes.io/serviceaccount/token")
if err != nil {
return nil, err
}
return &options.OIDCCredential{
AccessToken: string(accessToken),
}, nil
}

然后,您可以创建一个Credential结构体,使用您定义的 GKE回调函数:

uri := "mongodb://<hostname>:<port>"
opts := options.Client().ApplyURI(uri)
opts.SetAuth(
options.Credential{
AuthMechanism: "MONGODB-OIDC",
OIDCMachineCallback: gkeCallback,
},
)
client, err := mongo.Connect(context.TODO(), opts)
if err != nil {
panic(err)
}

要了解有关本指南中概念的更多信息,请参阅以下文档: