在 Linux 上使用 Kerberos 身份验证配置 MongoDB
概述
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 部署超出了本文档的范围。请参阅 MIT Kerberos 文档 或操作系统文档,了解如何配置 Kerberos 部署。
为了将 MongoDB 与 Kerberos 结合使用,必须将 MongoDB 部署中每个mongod
和mongos
实例的 Kerberos 服务主体 添加到 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
步骤
以下过程概述了将 Kerberos 用户主体添加到 MongoDB、配置独立mongod
实例以支持 Kerberos、使用mongosh
连接并对用户主体进行身份验证的步骤。
在没有 Kerberos 的情况下启动 mongod
。
初次添加 Kerberos 用户时,启动 mongod
不支持 Kerberos。
如果 MongoDB 中已经存在 Kerberos 用户,且该用户拥有创建用户所需的权限,那么就可以启动支持 Kerberos 的 mongod
。
根据您的部署包含其他设置。
注意
leafygreen-ui-qufvci 和 leafygreen-ui-qufvci,默认绑定到本地主机。如果部署的成员在不同的主机上运行,或者希望远程客户端连接到部署,则必须指定 --bind_ip
或 net.bindIp
。
连接至 mongod
。
将mongosh
连接到mongod
实例。如果mongod
启用了--auth
,请确保使用创建用户所需的特权进行连接。
将 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 中创建相应的用户。有关创建和管理用户的更多信息,请参阅用户管理命令。
在带有 Kerberos 支持的情况下启动 mongod
。
如需启动支持 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
。有关详细信息,请参阅KRB 5 _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>"
为 Kerberos 配置 mongos
要启动支持 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 身份验证机制:
SCRAM-SHA-256(在 MongoDB 4.0 中添加)
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 中可用。