在Linux上使用Kerberos身份验证配置自管理MongoDB
Overview
MongoDB Enterprise支持使用 Kerberos服务进行身份验证。 Kerberos是一种适用于大型客户端/服务器系统的行业标准身份验证协议。 MongoDB Enterprise仅支持 MIT实施 的Kerberos。
先决条件
要验证是否正在使用 MongoDB Enterprise,请将 --version
命令行选项传递给 mongod
或 mongos
:
mongod --version
在该命令的输出中,请查找字符串 modules:
subscription
或 modules: enterprise
,以确认您使用的是 MongoDB Enterprise 二进制文件。
对于副本集和分片集群,请确保配置使用完全限定的域名 (FQDN),而不是 IP 地址或未限定的主机名。您必须使用 GSSAPI 的 FQDN 才能正确解析 Kerberos Realm 并允许连接。
设置和配置 Kerberos 部署超出了本文档的范围。有关如何配置 Kerberos 部署的信息,请参阅 MIT Kerberos 文档或操作系统文档。
如需将 MongoDB 与 Kerberos 结合使用,必须在 Kerberos 数据库中为 MongoDB 部署中的每个 mongod
和 mongos
实例添加 Kerberos 服务主体。您可以在 KDC 上运行类似以下命令来添加服务主体:
kadmin.local addprinc mongodb/m1.example.com@EXAMPLE.COM
在运行 mongod
或 mongos
的每个系统上,都必须为相应的服务主体创建 keytab 文件。在运行 mongod
或 mongos
的系统上运行类似以下命令即可创建 keytab 文件:
kadmin.local ktadd mongodb/m1.example.com@EXAMPLE.COM
步骤
以下步骤概述了向 MongoDB 添加 Kerberos 用户主体、配置支持 Kerberos 的独立运行的 mongod
实例、使用 mongosh
连接并验证用户主体的步骤。
mongod
在不Kerberos的情况下启动 。
初次添加 Kerberos 用户时,启动 mongod
不支持 Kerberos。
如果 MongoDB 中已经存在 Kerberos 用户,且该用户拥有创建用户所需的权限,那么就可以启动支持 Kerberos 的 mongod
。
根据您的部署包含其他设置。
注意
leafygreen-ui-tqgtui 和 leafygreen-ui-tqgtui,默认绑定到本地主机。如果部署的成员在不同的主机上运行,或者希望远程客户端连接到部署,则必须指定 --bind_ip
或 net.bindIp
。
将 Kerberos 主体添加到 MongoDB。
在 $external
数据库中为 MongoDB 添加 Kerberos 主体(<username>@<KERBEROS REALM>
或 <username>/<instance>@<KERBEROS REALM>
)。用大写字母指定 Kerberos Realm。$external
数据库允许 mongod
查询外部来源(例如 Kerberos)进行身份验证。如需指定用户的权限,请为用户分配角色。
要对$external
身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,用户名不能大于 10k 字节。
以下示例将有只读访问权限的 Kerberos 主体 application/reporting@EXAMPLE.NET
添加至 records
数据库:
use $external db.createUser( { user: "application/reporting@EXAMPLE.NET", roles: [ { role: "read", db: "records" } ] } )
根据需要添加额外主体。对于要使用 Kerberos 进行身份验证的每个用户,必须在 MongoDB 中创建相应的用户。有关创建和管理用户的更多信息,请参阅用户管理命令。
启动mongod
,支持Kerberos 。
如需启动支持 Kerberos 的 mongod
,请将环境变量 KRB5_KTNAME
设置为 keytab 文件的路径,并将 mongod
参数 authenticationMechanisms
设置为 GSSAPI
,格式如下:
env KRB5_KTNAME=<path to keytab file> \ mongod \ --setParameter authenticationMechanisms=GSSAPI \ <additional mongod options>
根据配置要求包括其他选项。例如,如果希望远程客户端连接到您的部署,或是您的部署成员运行在不同主机上,请指定 --bind_ip
。
例如,以下代码启动一个支持 Kerberos 的独立 mongod
实例:
env KRB5_KTNAME=/opt/mongodb/mongod.keytab \ /opt/mongodb/bin/mongod --auth \ --setParameter authenticationMechanisms=GSSAPI \ --dbpath /opt/mongodb/data --bind_ip localhost,<hostname(s)|ip address(es)>
您的 mongod
和 keytab 文件的路径可能不同。keytab 文件必须只能由 mongod
进程的所有者访问。
对于正式的 .deb
或 .rpm
包,可以在环境设置文件中设置 KRB5_KTNAME
。有关详细信息,请参阅 KRB5_KTNAME。
将 mongosh
连接到 mongod
并进行身份验证。
以 Kerberos 主体 application/reporting@EXAMPLE.NET
的身份连接 mongosh
客户端。连接之前,必须使用 Kerberos 的 kinit
程序获取 application/reporting@EXAMPLE.NET
的凭证。
您可以从命令行进行连接和身份验证。
mongosh --host hostname.example.net --authenticationMechanism=GSSAPI --authenticationDatabase='$external' --username application/reporting@EXAMPLE.NET
如果您要连接到主机名与 Kerberos 名称匹配的系统,请确保为 --host
选项指定完全限定域名 (FQDN),而不是 IP 地址或非限定主机名。
如果要连接到主机名与 Kerberos 名称不匹配的系统,请先将 mongosh
连接到 mongod
,然后从 mongosh
中,使用 db.auth()
方法在 $external
数据库中进行身份验证。
use $external db.auth( { mechanism: "GSSAPI", user: "application/reporting@EXAMPLE.NET" } )
其他注意事项
KRB5_KTNAME
如果您使用某个官方 .deb
或 .rpm
软件包安装了 MongoDB Enterprise,并且使用随附的 init/upstart 脚本来控制 mongod
实例,则可以在默认环境设置文件中设置 KRB5_KTNAME
变量,而不是每次都设置该变量。
最新版本的 Red Hat 和基于 Debian 的系统使用 systemd
。旧版本使用 init
进行系统初始化。按照相应说明为系统配置 KRB5_KTNAME
变量。
systemd
配置文件
systemd
将配置存储在单元文件中。更新单元文件以设置 KRB5_KTNAME
变量。
编辑单元文件
将编辑后的行添加到单元文件中。编辑后的单元文件将类似于:
[Unit] Description=High-performance, schema-free document-oriented database After=network.target Documentation=https://docs.mongodb.org/manual [Service] User=mongodb Group=mongodb ExecStart=/usr/bin/mongod --config /etc/mongod.conf Environment="KRB5_KTNAME=/etc/mongod.keytab" PIDFile=/var/run/mongodb/mongod.pid file size LimitFSIZE=infinity cpu time LimitCPU=infinity virtual memory size LimitAS=infinity open files LimitNOFILE=64000 processes/threads LimitNPROC=64000 locked memory LimitMEMLOCK=infinity total threads (user+kernel) TasksMax=infinity TasksAccounting=false Recommended limits for for mongod as specified in http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings [Install] WantedBy=multi-user.target
重新启动mongod
服务
sudo systemctl restart mongod
init
配置文件
对于 .rpm
安装,默认环境设置文件为 /etc/sysconfig/mongod
。
对于 .deb
安装,文件为 /etc/default/mongodb
。
添加一行类似以下内容,设置 KRB5_KTNAME
值:
KRB5_KTNAME="<path to keytab>"
mongos
为Kerberos配置
要启动支持 Kerberos 的 mongos
,请将环境变量 KRB5_KTNAME
设置为其 keytab 文件的路径,并将 mongos
参数 authenticationMechanisms
设置为 GSSAPI
,格式如下:
env KRB5_KTNAME=<path to keytab file> \ mongos \ --setParameter authenticationMechanisms=GSSAPI \ <additional mongos options>
根据配置要求包括其他选项。例如,如果希望远程客户端连接到您的部署,或是您的部署成员运行在不同主机上,请指定 --bind_ip
。
例如,以下操作启动了支持 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,<hostname(s)|ip address(es)>
您的 mongos
和 keytab 文件的路径可能不同。keytab 文件必须只能由 mongos
进程的所有者访问。
根据配置需要修改或添加任何其他 mongos
选项。例如,您可以使用 x.509 节点身份验证,而不是使用 --keyFile
对分片集群节点进行内部身份验证。
使用配置文件
如需使用配置文件配置支持 Kerberos 的 mongod
或 mongos
,请在配置文件中指定 authenticationMechanisms
设置。
如果使用 YAML 配置文件格式:
setParameter: authenticationMechanisms: GSSAPI
根据配置要求包括其他选项。例如,如果您希望远程客户端连接到部署,或者部署节点运行在不同的主机上,请指定 net.bindIp
设置。
例如,如果 /opt/mongodb/mongod.conf
包含以下独立运行的 mongod
的配置设置:
security: authorization: enabled setParameter: authenticationMechanisms: GSSAPI storage: dbPath: /opt/mongodb/data net: bindIp: localhost,<hostname(s)|ip address(es)>
如需启动支持 Kerberos 的 mongod
,请使用以下表格:
env KRB5_KTNAME=/opt/mongodb/mongod.keytab \ /opt/mongodb/bin/mongod --config /opt/mongodb/mongod.conf
mongod
、keytab 文件和配置文件的路径可能不同。keytab 文件必须只能由 mongod
进程的所有者访问。
对 MongoDB 的 Kerberos 设置进行故障排除
如果在使用Kerberos身份验证启动mongod
或mongos
时遇到问题,请参阅对自管理Kerberos身份验证进行故障排除。
纳入更多身份验证机制
Kerberos 身份验证 (GSSAPI (Kerberos)) 可以与以下功能配合使用:
MongoDB 的 SCRAM 身份验证机制:
MongoDB 的 LDAP 身份验证机制:
PLAIN (LDAP SASL)
MongoDB 的 x.509 身份验证机制:
指定机制如下:
--setParameter authenticationMechanisms=GSSAPI,SCRAM-SHA-256
只有在使用时才添加其他机制。该参数设置不会影响 MongoDB 对集群节点的内部身份验证。
测试与验证
完成配置步骤后,可以使用 mongokerberos
工具验证配置。
mongokerberos
提供了一种便捷的方法,以验证您的平台的 Kerberos 配置是否与 MongoDB 一起使用,并测试 MongoDB 客户端的 Kerberos 身份验证是否按预期运行。有关更多信息,请参阅 mongokerberos
文档。
mongokerberos
仅在 MongoDB Enterprise 中可用。