身份验证机制
概述
在本指南中,您可以学习如何使用MongoDB社区版中可用的每种认证机制。MongoDB使用认证机制来确认身份并建立信任,以确保在连接之前驱动程序和服务器中的安全性。
要使用以下认证方式GSSAPI/Kerberos 或 LDAP,请参阅企业认证机制基础页面。要了解更多关于连接到您的MongoDB集群的信息,请参阅连接指南。
支持的机制
Go 驱动程序支持以下认证机制
The Go Driver establishes a connection with an authentication mechanism through a Client type. The Client type specifies the mechanism and credentials to use as connection options in a Credential type . To configure these options, pass a Credential type to the SetAuth() method of the ClientOptions type.
以下部分通过使用MongoDB社区版支持的五种机制来演示此过程。
示例约定
每种认证机制都包含以下占位符
db_username- 您的MongoDB数据库用户名db_password- 您的MongoDB数据库用户密码hostname- 您的MongoDB服务器网络地址,可由您的客户端访问port- 您的MongoDB服务器端口号authenticationDb- 包含用户认证数据的您的MongoDB数据库。如果您省略此选项,驱动程序将使用默认值admin。
默认
默认机制根据服务器支持的MongoDB版本使用以下认证机制之一
机制 | 版本 |
|---|---|
SCRAM-SHA-256 | MongoDB 4.0及更高版本 |
SCRAM-SHA-1 | MongoDB 3.0、3.2、3.4和3.6 |
MONGODB-CR | MongoDB 2.6及更早版本 |
要指定默认认证机制,省略AuthMechanism选项
credential := options.Credential{ AuthSource: "<authenticationDb>", Username: "<db_username>", Password: "<db_password>", } clientOpts := options.Client().ApplyURI("mongodb://<hostname>:<port>"). SetAuth(credential) client, err := mongo.Connect(context.TODO(), clientOpts)
要了解更多关于MongoDB支持的挑战-响应(CR)和加盐挑战-响应(SCRAM)认证机制的信息,请参阅服务器手册中的SCRAM部分。
SCRAM-SHA-256
重要
SCRAM-SHA-256是从MongoDB 4.0开始默认的认证方法。
SCRAM-SHA-256是一种加盐挑战-响应(SCRAM)认证机制,使用数据库用户名和密码,通过SHA-256算法加密来认证用户。
要指定SCRAM-SHA-256认证机制,将AuthMechanism选项的值设置为"SCRAM-SHA-256"
credential := options.Credential{ AuthMechanism: "SCRAM-SHA-256", AuthSource: "<authenticationDb>", Username: "<db_username>", Password: "<db_password>", } clientOpts := options.Client().ApplyURI("mongodb://<hostname>:<port>"). SetAuth(credential) client, err := mongo.Connect(context.TODO(), clientOpts)
SCRAM-SHA-1
重要
SCRAM-SHA-1 是 MongoDB 3.0、3.2、3.4 和 3.6 版本的默认认证方法。
SCRAM-SHA-1 是一种盐值挑战响应机制(SCRAM),它使用您的用户名和密码,通过 SHA-1 算法加密来认证您的用户。
要指定 SCRAM-SHA-1 认证机制,将 AuthMechanism 选项的值设置为 "SCRAM-SHA-1"
credential := options.Credential{ AuthMechanism: "SCRAM-SHA-1", AuthSource: "<authenticationDb>", Username: "<db_username>", Password: "<db_password>", } clientOpts := options.Client().ApplyURI("mongodb://<hostname>:<port>"). SetAuth(credential) client, err := mongo.Connect(context.TODO(), clientOpts)
MONGODB-CR
MONGODB-CR 是一种挑战响应认证机制,它使用您的用户名和密码来认证您的用户。
重要
从 MongoDB 3.6 开始,此认证机制已被弃用,并在 MongoDB 4.0 中不再受支持。
MONGODB-AWS
重要
MONGODB-AWS 认证机制仅在 MongoDB 版本 4.4 及更高版本中可用。
MONGODB-AWS 认证机制使用您的 Amazon Web Services 身份和访问管理 (AWS IAM) 凭证来验证您的用户。
要连接到启用 MONGODB-AWS 认证的 MongoDB 实例,请指定 MONGODB-AWS 认证机制。
驱动程序将按照以下顺序检查您的凭据来源
连接字符串
环境变量
Web 身份令牌文件
在
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI环境变量中指定的 AWS ECS 端点AWS EC2 端点。有关更多信息,请参阅 IAM Roles for Tasks。
重要
驱动程序仅从找到的第一个来源获取凭据。例如,如果您在连接字符串中指定了您的 AWS 凭证,则驱动程序将忽略您在环境变量中指定的任何凭据。
提示
以下示例使用 SetAuth() 方法设置适当的凭据。您也可以使用 ApplyURI() 方法指定这些凭据。如果您使用 ApplyURI() 方法,则必须对用户名和密码进行 URL 编码,以确保它们被正确解析。
要使用您的 AWS IAM 凭证连接到您的 MongoDB 实例,请执行以下步骤
将
AuthMechanism选项设置为MONGODB-AWS将
Username选项设置为您的accessKeyID将
Password选项设置为您的secretAccessKey
var accessKeyID, secretAccessKey string awsCredential := options.Credential{ AuthMechanism: "MONGODB-AWS", AuthSource: "<authenticationDb>", Username: "<accessKeyID>", Password: "<secretAccessKey>", } awsIAMClient, err := mongo.Connect( context.TODO(), options.Client().SetAuth(awsCredential)) if err != nil { panic(err) } _ = awsIAMClient
如果必须指定AWS会话令牌,请使用来自假设角色请求的临时凭证。
要使用临时凭证,将您的sessionToken的值分配给AuthMechanismProperties选项。
var accessKeyID, secretAccessKey, sessionToken string assumeRoleCredential := options.Credential{ AuthMechanism: "MONGODB-AWS", AuthSource: "<authenticationDb>", Username: "<accessKeyID>", Password: "<secretAccessKey>", AuthMechanismProperties: map[string]string{ "AWS_SESSION_TOKEN": "<sessionToken>", }, } assumeRoleClient, err := mongo.Connect(context.TODO(), options.Client().SetAuth(assumeRoleCredential))
要使用存储在环境变量中的AWS凭证对MongoDB实例进行身份验证,请使用shell设置以下变量
export AWS_ACCESS_KEY_ID=<awsKeyId> export AWS_SECRET_ACCESS_KEY=<awsSecretKey> export AWS_SESSION_TOKEN=<awsSessionToken>
注意
如果您使用该角色进行身份验证时不需要AWS会话令牌,请省略包含AWS_SESSION_TOKEN的行。
设置上述环境变量后,指定如下示例所示的MONGODB-AWS身份验证机制
envVariablesCredential := options.Credential{ AuthMechanism: "MONGODB-AWS", } envVariablesClient, err := mongo.Connect( context.TODO(), options.Client().SetAuth(envVariablesCredential)) if err != nil { panic(err) } _ = envVariablesClient
您可以使用从Web身份提供者获得的OpenID Connect (OIDC)令牌来验证Amazon Elastic Kubernetes Service (EKS)或其他服务。要使用OIDC令牌,创建一个包含您的令牌的文件,然后使用shell将此文件的绝对路径设置为一个环境变量,如下例所示
export AWS_WEB_IDENTITY_TOKEN_FILE=<absolute path to file containing your OIDC token>
设置上述环境变量后,指定如下示例所示的MONGODB-AWS身份验证机制
envVariablesCredential := options.Credential{ AuthMechanism: "MONGODB-AWS", } envVariablesClient, err := mongo.Connect( context.TODO(), options.Client().SetAuth(envVariablesCredential)) if err != nil { panic(err) } _ = envVariablesClient
X.509
使用X.509认证机制通过TLS和X.509证书来认证您的用户,该用户通过客户端证书的相对区分名(RDN)进行标识。当指定X.509认证机制时,服务器使用以下文件的路径进行连接认证:
tlsCAFile,其中包含一个或多个用于建立TLS连接时信任的证书颁发机构tlsCertificateKeyFile,引用客户端证书文件或客户端私钥文件的路径
要指定X.509认证机制,请执行以下操作:
将
tlsCAFile分配给连接字符串中其文件的路径将
tlsCertificateKeyFile分配给连接字符串中其文件的路径将
AuthMechanism选项分配给值"MONGODB-X509"
caFilePath := "<cafile_path>" certificateKeyFilePath := "<client_certificate_path>" uri := "mongodb://<hostname>:<port>/?tlsCAFile=%s&tlsCertificateKeyFile=%s" uri = fmt.Sprintf(uri, caFilePath, certificateKeyFilePath) credential := options.Credential{ AuthMechanism: "MONGODB-X509", } clientOpts := options.Client().ApplyURI(uri).SetAuth(credential)