在 Linux 上使用 Kerberos 身份验证配置 MongoDB

在本页面

Overview

MongoDB Enterprise 支持使用Kerberos service进行身份验证。 Kerberos 是用于大型 Client 端/服务器系统的行业标准身份验证协议。

Prerequisites

设置和配置 Kerberos 部署超出了本文档的范围。本教程假定您为 MongoDB 部署中的每个mongodmongos实例配置了一个Kerberos 服务主体,并且为每个mongodmongos实例具有了一个有效的keytab file

对于副本集和分片群集,请确保您的配置使用完全合格的域名(FQDN),而不是 IP 地址或不合格的主机名。您必须使用 FQDN for GSSAPI 才能正确解析 Kerberos 领域并允许您进行连接。

要验证 MongoDB Enterprise 二进制文件,请将--version命令行选项传递给mongodmongos

mongod --version

在此命令的输出中,查找字符串modules: subscriptionmodules: enterprise以确认您的系统具有 MongoDB Enterprise。

Procedure

以下过程概述了以下步骤:将 Kerberos 用户主体添加到 MongoDB,为 Kerberos 支持配置独立的mongod实例,并使用mongo Shell 连接并验证用户主体。

在没有 Kerberos 的情况下启动 mongod。

对于最初添加的 Kerberos 用户,请在不支持 Kerberos 的情况下启动mongod

如果 Kerberos 用户已经在 MongoDB 中并且具有创建用户所需的特权,则可以使用 Kerberos 支持来启动mongod

包括适合您的部署的其他设置。

Note

从 MongoDB 3.6 开始,默认情况下mongodmongos绑定到 localhost。如果部署的成员在不同的主机上运行,或者希望远程 Client 端连接到部署,则必须指定--bind_ipnet.bindIp。有关更多信息,请参见Localhost 绑定兼容性更改

连接到 mongod。

通过mongo shell 连接到mongod实例。如果mongod已启用--auth,请确保与创建用户所需的特权连接。

将 Kerberos 主体添加到 MongoDB。

将 Kerberos 主体<username>@<KERBEROS REALM><username>/<instance>@<KERBEROS REALM>添加到$external数据库中的 MongoDB。以全部大写形式指定 Kerberos 领域。 $external数据库允许mongod查询外部源(例如 Kerberos)以进行身份验证。要指定用户的特权,请为用户分配roles

在版本 3.6.3 中更改:要与$external个身份验证用户(即 Kerberos,LDAP,x.509 用户)一起使用会话,用户名不能超过 10k 字节。

下面的示例添加对records数据库具有只读访问权限的 Kerberos 主体application/reporting@EXAMPLE.NET

use $external
db.createUser(
   {
     user: "application/reporting@EXAMPLE.NET",
     roles: [ { role: "read", db: "records" } ]
   }
)

根据需要添加其他主体。对于要使用 Kerberos 进行身份验证的每个用户,必须在 MongoDB 中创建一个相应的用户。有关创建和 Management 用户的更多信息,请参阅用户 Management 命令

使用 Kerberos 支持启动 mongod。

要以 Kerberos 支持启动mongod,请将环境变量KRB5_KTNAME设置为密钥表文件的路径,并将mongod参数authenticationMechanisms设置为GSSAPI的形式如下:

env KRB5_KTNAME=<path to keytab file> \
mongod \
--setParameter authenticationMechanisms=GSSAPI \
<additional mongod options>

包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定--bind_ip。有关更多信息,请参见Localhost 绑定兼容性更改

例如,以下代码启动具有 Kerberos 支持的独立mongod实例:

env KRB5_KTNAME=/opt/mongodb/mongod.keytab \
/opt/mongodb/bin/mongod --auth \
--setParameter authenticationMechanisms=GSSAPI \
--dbpath /opt/mongodb/data --bind_ip localhost,<ip address>

您的mongodkeytab file的路径可能不同。 keytab file只能由mongod进程的所有者访问。

使用官方的.deb.rpm软件包,您可以在环境设置文件中设置KRB5_KTNAME。有关详情,请参见KRB5_KTNAME

将 mongo shell 连接到 mongod 并进行身份验证。

mongo shellClient 端连接为 Kerberos 主体application/reporting@EXAMPLE.NET。在连接之前,您必须已经使用 Kerberos 的kinit程序来获取application/reporting@EXAMPLE.NET的凭据。

您可以从命令行连接并进行身份验证。

mongo --host hostname.example.net --authenticationMechanism=GSSAPI --authenticationDatabase='$external' --username application/reporting@EXAMPLE.NET

如果要连接主机名与 Kerberos 名称匹配的系统,请确保为--host选项指定完全合格的域名(FQDN),而不是 IP 地址或不合格的主机名。

如果要连接到主机名与 Kerberos 名称不匹配的系统,请使用--gssapiHostName指定它响应的 Kerberos FQDN。

或者,您可以先将mongo连接到mongod,然后从mongo shell 中使用db.auth()方法在$external数据库中进行身份验证。

use $external
db.auth( { mechanism: "GSSAPI", user: "application/reporting@EXAMPLE.NET" } )

Additional Considerations

KRB5_KTNAME

如果您使用官方.deb.rpm软件包之一安装了 MongoDB Enterprise,并使用随附的 init/upstart 脚本来控制mongod实例,则可以在默认环境设置文件中设置KR5_KTNAME变量,而不必每次都设置变量。

对于.rpm软件包,默认环境设置文件是/etc/sysconfig/mongod

对于.deb个软件包,文件是/etc/default/mongodb

在类似于以下内容的行中设置KRB5_KTNAME值:

export KRB5_KTNAME="<path to keytab>"

为 Kerberos 配置 mongos

要以 Kerberos 支持启动mongos,请将环境变量KRB5_KTNAME设置为其keytab file的路径,并将mongos参数authenticationMechanismsGSSAPI的格式如下:

env KRB5_KTNAME=<path to keytab file> \
mongos \
--setParameter authenticationMechanisms=GSSAPI \
<additional mongos options>

包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定--bind_ip。有关更多信息,请参见Localhost 绑定兼容性更改

例如,以下代码启动具有 Kerberos 支持的mongos实例:

env KRB5_KTNAME=/opt/mongodb/mongos.keytab \
mongos \
--setParameter authenticationMechanisms=GSSAPI \
--configdb shard0.example.net, shard1.example.net,shard2.example.net \
--keyFile /opt/mongodb/mongos.keyfile \
--bind_ip localhost,<ip address>

您的mongoskeytab file的路径可能不同。 keytab file只能由mongos进程的所有者访问。

根据您的配置要求修改或包括其他mongos个选项。例如,您可以使用x.509 成员身份验证代替使用--keyFile进行分片群集成员的内部身份验证。

使用配置文件

要使用configuration file配置mongodmongos以支持 Kerberos,请在配置文件中指定authenticationMechanisms设置。

如果使用YAML 配置文件格式

setParameter:
   authenticationMechanisms: GSSAPI

包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp设置。有关更多信息,请参见Localhost 绑定兼容性更改

例如,如果/opt/mongodb/mongod.conf包含独立mongod的以下配置设置:

security:
   authorization: enabled
setParameter:
   authenticationMechanisms: GSSAPI
storage:
   dbPath: /opt/mongodb/data
net:
   bindIp: localhost,<ip address>

要以 Kerberos 支持开头mongod,请使用以下格式:

env KRB5_KTNAME=/opt/mongodb/mongod.keytab \
/opt/mongodb/bin/mongod --config /opt/mongodb/mongod.conf

mongodkeytab file和配置文件的路径可能不同。 keytab file只能由mongod进程的所有者访问。

对 MongoDB 的 Kerberos 设置进行故障排除

如果使用 Kerberos 身份验证启动mongodmongos时遇到问题,请参见Kerberos 身份验证疑难解答

合并其他身份验证机制

Kerberos 身份验证(GSSAPI(Kerberos))可以与以下各项协同工作:

  • MongoDB 的质询/响应身份验证机制:

  • SCRAM-SHA-1

  • MongoDB 的 LDAP 认证机制:

  • PLAIN(LDAP SASL)

  • MongoDB 的 x.509 身份验证机制:

  • MONGODB-X509)

指定以下机制:

--setParameter authenticationMechanisms=GSSAPI,SCRAM-SHA-1

仅在使用时添加其他机制。此参数设置不会影响 MongoDB 对集群成员的内部身份验证。