本指南介绍了如何使用MongoDB C驱动程序的身份验证选项。 在建立连接之前,确保MongoDB服务器也已正确配置身份验证。 有关详细信息,请参阅 MongoDB安全文档。
MongoDB C 驱动程序通过使用 MongoDB 连接 URI 支持多种身份验证机制。
默认,如果提供了用户名和密码作为连接string (以及可选的身份验证数据库)的一部分,则使用它们通过服务器的默认身份验证机制进行连接。
要选择默认以外的特定身份验证机制,请参阅下面支持的机制列表。
mongoc_client_t *client = mongoc_client_new ("mongodb://user:password@localhost/?authSource=mydb");
authMechanism 连接string选项当前支持的值为:
基本身份验证 (SCRAM-SHA- 256 )
MongoDB4.0 引入了对使用SCRAM协议进行身份验证的支持,该协议具有256 RFC7677 中描述的更安全的 SHA- 哈希 。使用这种身份验证机制意味着,在进行身份验证时,实际上永远不会通过网络发送密码,而是通过计算证明客户端密码与服务器已知的密码相同。 在MongoDB 4中。 0 , C驾驶员可以为具有存储的 SCRAM-SHA- 1和SCRAM -SHA- 256档案的用户确定正确的默认凭证身份验证机制:
mongoc_client_t *client = mongoc_client_new ("mongodb://user:password@localhost/?authSource=mydb"); /* the correct authMechanism is negotiated between the driver and server. */
或者,可以将SCRAM-SHA- 256显式指定为 authMechanism。
mongoc_client_t *client = mongoc_client_new ("mongodb://user:password@localhost/?authMechanism=SCRAM-SHA-256&authSource=mydb");
基本身份验证 (SCRAM-SHA- 1 )
MongoDB4.0 之前的默认身份验证机制是SCRAM-SHA-1
( RFC5802 )。使用这种身份验证机制意味着,在进行身份验证时,实际上永远不会通过网络发送密码,而是通过计算证明客户端密码与服务器已知的密码相同。
mongoc_client_t *client = mongoc_client_new ("mongodb://user:password@localhost/?authMechanism=SCRAM-SHA-1&authSource=mydb");
注意
SCRAM-SHA-1
默认根据admin
数据库进行身份验证。 如果用户是在另一个数据库中创建的,则需要指定 authSource。
传统身份验证 (MONGODB-CR)
MONGODB-CR authMechanism 已弃用,将不再在 MongoDB 4.0中运行。 相反,不指定 authMechanism,驱动程序将使用与服务器兼容的身份验证机制。
GSSAPI (Kerberos) 身份验证
注意
在类 UNIX 环境中, Kerberos支持要求针对cyrus-sasl
编译驾驶员。
在Windows上, Kerberos支持要求针对Windows Native SSPI 或cyrus-sasl
编译驾驶员。 驾驶员的默认配置将使用Windows Native SSPI。
要修改默认配置,请使用 cmake 选项ENABLE_SASL
。
GSSAPI
(Kerberos)身份验证在MongoDB企业版中可用。 要使用GSSAPI
进行身份验证,必须安装支持SASL 的MongoDB C驾驶员。
在类 UNIX 环境中,请先运行kinit
命令,然后再使用以下身份验证方法:
$ kinit mongodbuser@EXAMPLE.COM mongodbuser@EXAMPLE.COM's Password: $ klistCredentials cache: FILE:/tmp/krb5cc_1000 Principal: mongodbuser@EXAMPLE.COM Issued Expires Principal Feb 9 13:48:51 2013 Feb 9 23:48:51 2013 krbtgt/EXAMPLE.COM@EXAMPLE.COM
现在使用 MongoDB URI 进行身份验证。 GSSAPI
根据$external
虚拟数据库进行身份验证,因此无需在 URI 中指定数据库。 请注意,Kerberos 主体必须进行 URL 编码:
mongoc_client_t *client; client = mongoc_client_new ("mongodb://mongodbuser%40EXAMPLE.COM@mongo-server.example.com/?authMechanism=GSSAPI");
注意
GSSAPI
根据$external
数据库进行身份验证,因此无需指定 authSource数据库。
驱动程序支持以下 GSSAPI 属性:
CANONICALIZE_HOST_NAME
:当主机报告的主机名与Kerberos数据库中使用的主机名不同时,Cyrus-SASL 可能需要这样做。 默认值为“false”。SERVICE_NAME
:使用不同于默认名称“ MongoDB ”的服务名称。
在URL中设置属性:
mongoc_client_t *client; client = mongoc_client_new ("mongodb://mongodbuser%40EXAMPLE.COM@mongo-server.example.com/?authMechanism=GSSAPI&" "authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:true");
如果遇到Invalid net address
等错误,请检查应用程序是否位于 NAT(网络地址转换)防火墙后面。 如果是这样,请创建使用forwardable
和addressless
Kerberos票证的票证。 这可以通过将-f -A
传递给kinit
来完成。
$ kinit -f -A mongodbuser@EXAMPLE.COM
SASL 普通身份验证
注意
MongoDB C驱动程序必须在编译时支持SASL,才能使用SASL PLAIN
身份验证。
MongoDB Enterprise版支持SASL PLAIN
身份验证机制,该机制最初用于将身份验证委托给LDAP服务器。 使用SASL PLAIN
机制与使用用户名和密码的挑战响应机制非常相似。 此身份验证机制使用$external
虚拟数据库来提供LDAP
支持:
注意
SASL PLAIN
是一种明文身份验证机制。 使用PLAIN
机制时,强烈建议使用带证书验证的 TLS 连接 MongoDB。
mongoc_client_t *client; client = mongoc_client_new ("mongodb://user:password@example.com/?authMechanism=PLAIN");
PLAIN
根据$external
数据库进行身份验证,因此无需指定 authSource数据库。
X. 509证书身份验证
注意
MongoDB C驱动程序必须在编译时支持TLS,以支持X. 509身份验证。 完成此操作后,使用以下选项启动服务器:
$ mongod --tlsMode requireTLS --tlsCertificateKeyFile server.pem --tlsCAFile ca.pem
MONGODB-X509
机制对从驾驶员在 TLS 协商期间提供的 X. 509证书的标识主题名称派生的用户名进行身份验证。 此身份验证方法需要使用带证书验证的 TLS 连接。
mongoc_client_t *client; mongoc_ssl_opt_t ssl_opts = { 0 }; ssl_opts.pem_file = "mycert.pem"; ssl_opts.pem_pwd = "mycertpassword"; ssl_opts.ca_file = "myca.pem"; ssl_opts.ca_dir = "trust_dir"; ssl_opts.weak_cert_validation = false; client = mongoc_client_new ("mongodb://x509_derived_username@localhost/?authMechanism=MONGODB-X509"); mongoc_client_set_ssl_opts (client, &ssl_opts);
MONGODB-X509
根据$external
数据库进行身份验证,因此无需指定 authSource数据库。 有关 x 509 _衍生_用户名的更多信息,请参阅MongoDB服务器x。 509教程。
注意
当未提供任何用户名时, MongoDB C驱动程序将尝试确定 x 509派生的用户名,并且从MongoDB 3.4开始,只要根本不需要用户名。
通过Amazon Web Services IAM 进行身份验证
机制使用MONGODB-AWS
MongoDBAmazon Web ServicesIdentity and Access Management (IAM) 提供的档案对 服务器进行凭证验证。
要进行身份验证,请在$external
数据库上创建具有关联Amazon资源名称 (ARN) 的用户,并在 URI 中指定MONGODB-AWS
authMechanism
。
mongoc_uri_t *uri = mongoc_uri_new ("mongodb://localhost/?authMechanism=MONGODB-AWS");
由于MONGODB-AWS
始终根据$external
数据库进行身份验证,因此无需指定 authSource数据库。
档案包括access key id
、 secret access key
和可选的session token
。 可以通过以下方式获取它们。
通过 URI 获取Amazon Web Services凭证
凭证可以作为用户名/密码直接在 URI 中传递。
mongoc_uri_t *uri = mongoc_uri_new ("mongodb://<access key id>:<secret access key>localhost/?authMechanism=MONGODB-AWS");
这可能包括通过session token
传递的authMechanismProperties
。
mongoc_uri_t *uri = mongoc_uri_new ("mongodb://<access key id>:<secret access key>localhost/?authMechanism=MONGODB-AWS&authMechanismProperties=AWS_SESSION_TOKEN:<token>");
通过环境提供的Amazon Web Services凭证
如果凭证未通过 URI 传递,libmongoc 将检查以下环境变量。
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN (optional)
通过 ECS 的Amazon Web Services凭证
如果凭证未在 URI 中或与环境变量一起传递,libmongoc 将检查是否设置了环境变量AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
,如果已设立,则尝试通过查询链接本地解决从 ECS任务元数据中检索临时凭证。
通过 EC2 的Amazon Web Services档案
如果凭证未在 URI 中传递或随环境变量一起传递,且未设立环境变量AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
,则 libmongoc 将尝试通过查询链接本地地址从 EC 2机器元数据中检索临时凭证。