Docs 菜单
Docs 主页
/ / /
Go 驱动程序
/

企业身份验证机制

在此页面上

  • Overview
  • 进行身份验证以访问 GSSAPI/Kerberos
  • 例子
  • 设置自定义 SERVICE_NAMESERVICE_REALM字段
  • LDAP 身份验证 (PLAIN)
  • 例子
  • MONGODB-OIDC
  • Azure IMDS
  • GCP IMDS
  • 自定义回调
  • 其他 Azure 环境
  • GCP GKE
  • 更多信息
  • API 文档

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

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

  • GSSAPI/Kerberos

  • LDAP (Plain)

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

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

  • 使用连接字符串 URI。要了解有关使用连接字符串 URI 进行企业身份验证的更多信息,请参阅关于连接字符串 URI 的服务器手册条目

  • Credential类型指定凭证和身份验证机制。

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

gssapi要使用Kerberos身份验证,必须使用 构建标签 并在编译期间指定 cgo支持。除非您之前设立环境变量以交叉编译到不同的平台,否则默认启用cgo 支持。要使用gssapi 构建标签,请使用以下命令编译代码:

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

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

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。 如果使用服务主体代表企业应用程序,请将其设置为服务主体的应用程序 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。 如果使用服务主体代表企业应用程序,请将其设置为服务主体的应用程序 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驾驶员并不为所有平台提供内置支持,包括Amazon Web Services 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

您的OIDCCallback 函数必须返回一个OIDCCredential AccessToken实例,该实例使用从azidentity 包生成的 。有关实现自定义回调以检索访问权限令牌,然后创建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)
}

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

后退

身份验证