使用Kerberos身份验证和Active Directory授权配置自管理MongoDB
MongoDB Enterprise支持查询LDAP服务器以获取认证用户所属的LDAP组。MongoDB将每个返回组的LDAP区分名称(DN)映射到角色上admin
数据库。MongoDB根据映射的角色及其关联的权限授权用户。有关更多信息,请参阅LDAP授权。
MongoDB Enterprise支持使用Kerberos服务进行身份验证。Kerberos是大型客户端/服务器系统的行业标准身份验证协议。
本教程描述了如何配置MongoDB通过Kerberos服务器进行身份验证,并通过平台库通过Active Directory(AD)服务器进行授权。
先决条件
重要
在继续之前,请彻底了解以下主题
AD的完整描述超出了本教程的范围。本教程假设您已了解AD。AD的完整描述超出了本教程的范围。本教程假设您已了解AD。
MongoDB支持使用SASL机制在MongoDB服务器和AD之间进行绑定。SASL、SASL机制或特定SASL机制的AD配置要求的完整描述超出了本教程的范围。本教程假设您已了解SASL及其相关主题。
配置和设置 Kerberos 部署超出了本文件的范畴。本教程假设您已经为每个 Kerberos 服务主体 配置了 mongod
和 mongos
实例,并且您为每个 密钥表文件 配置了有效的密钥表。
对于副本集和分片集群,确保您的配置使用完全限定域名(FQDN)而不是 IP 地址或非限定主机名。您必须使用 FQDN 来正确解析 Kerberos 域并允许您连接。
要验证您正在使用 MongoDB Enterprise,请将 --version
命令行选项传递给 mongod
或 mongos
:
mongod --version
在此命令的输出中,查找字符串 modules: subscription
或 modules: enterprise
以确认您正在使用 MongoDB Enterprise 二进制文件。
注意事项
本教程解释了如何配置 MongoDB 以进行 Kerberos 认证和 AD 授权。
要在您自己的 MongoDB 服务器上执行此过程,您必须根据您自己的特定基础设施修改给定的过程,特别是 Kerberos 配置、构建 AD 查询或管理用户。
传输层安全
默认情况下,MongoDB 在绑定到 AD 服务器时创建 TLS/SSL 连接。这要求配置 MongoDB 服务器的宿主以访问 AD 服务器证书授权机构(CA)证书。
本教程提供了所需的宿主配置说明。
本教程假设您有权访问AD服务器的CA证书,并且可以在MongoDB服务器上创建证书的副本。
示例Active Directory架构
本教程使用以下示例 AD 对象作为提供查询、配置和输出的基础。每个对象只显示可能属性的一部分。
用户对象
dn:CN=bob,CN=Users,DC=marketing,DC=example,DC=com userPrincipalName: bob@marketing.example.com memberOf: CN=marketing,CN=Users,DC=example,DC=com dn:CN=alice,CN=Users,DC=engineering,DC=example,DC=com userPrincipalName: alice@engineering.example.com memberOf: CN=web,CN=Users,DC=example,DC=com memberOf: CN=PrimaryApplication,CN=Users,DC=example,DC=com dn:CN=sam,CN=Users,DC=dba,DC=example,DC=com userPrincipalName: sam@dba.example.com memberOf: CN=dba,CN=Users,DC=example,DC=com memberOf: CN=PrimaryApplication,CN=Users,DC=example,DC=com dn:CN=joe,CN=Users,DC=analytics,DC=example,DC=com userPrincipalName: joe@analytics.example.com memberof: CN=marketing,CN=Users,DC=example,DC=com
组对象
dn:CN=marketing,CN=Users,DC=example,DC=com member:CN=bob,CN=Users,DC=marketing,DC=example,DC=com member:CN=joe,CN=Users,DC=analytics,DC=example,DC=com dn:CN=engineering,CN=Users,DC=example,DC=com member:CN=web,CN=Users,DC=example,DC=com member:CN=dba,CN=users,DC=example,DC=com dn:CN=web,CN=Users,DC=example,DC=com member:CN=alice,CN=Users,DC=engineering,DC=example,DC=com dn:CN=dba,CN=Users,DC=example,DC=com member:CN=sam,CN=Users,DC=dba,DC=example,DC=com dn:CN=PrimaryApplication,CN=Users,DC=example,DC=com member:CN=sam,CN=Users,DC=dba,DC=example,DC=com member:CN=alice,CN=Users,DC=engineering,DC=example,DC=com
Active Directory 凭据
本教程使用用户名和密码在 AD 服务器上执行查询。提供的凭据必须在 AD 服务器上具有足够的权限来支持与 security.ldap.userToDNMapping
或 security.ldap.authz.queryTemplate
相关的查询。
副本集
MongoDB LDAP 授权需要副本集中的每个 mongod
至少运行在 MongoDB 3.4.0 或更高版本。
分片集群
MongoDB LDAP 授权需要分片集群中的每个 mongod
和 mongos
至少运行在 MongoDB 3.4.0 或更高版本。
步骤
配置运行 MongoDB 的服务器 TLS/SSL。
要通过 TLS/SSL 连接到 AD(AD)服务器,mongod
或 mongos
需要访问 AD 服务器的证书颁发机构(CA)证书。
在 Linux 上,通过 ldap.conf
文件中的 TLS_CACERT
或 TLS_CACERTDIR
选项指定 AD 服务器的 CA 证书。
您的平台包管理器在安装MongoDB企业版的libldap
依赖项时创建ldap.conf
文件。有关配置文件或引用选项的完整文档,请参阅ldap.conf。
在Microsoft Windows上,使用平台的凭据管理工具加载AD服务器的证书颁发机构(CA)证书。确切的凭据管理工具取决于Windows
版本。要使用该工具,请参阅其关于您Windows
版本的文档。
如果mongod
或mongos
无法访问AD
CA文件,它们无法与Active Directory服务器建立TLS/SSL连接。
可选地,将security.ldap.transportSecurity
设置为none
以禁用TLS/SSL。
警告
将transportSecurity
设置为none
会在MongoDB和AD
服务器之间传输明文信息,包括用户凭据。
(仅限Windows) 将服务主体名称分配给MongoDB Windows服务。
对于在Windows操作系统上运行的MongoDB服务器,您必须使用setspn.exe将服务主体名称(SPN)分配给运行MongoDB服务的账户。
setspn.exe -S <service>/<fully qualified domain name> <service account name>
示例
例如,如果名为mongodb
的服务在mongodbserver.example.com
上以服务账户名mongodb_dev@example.com
运行,分配SPN的命令如下所示
setspn.exe -S mongodb/mongodbserver.example.com mongodb_dev@example.com
注意
Windows Server 2003不支持setspn.exe -S
。关于setspn.exe
的完整文档,请参阅setspn.exe。
连接到MongoDB服务器。
使用mongosh
通过--host
和--port
选项连接到MongoDB服务器。
mongosh --host <hostname> --port <port>
如果您的MongoDB服务器目前强制执行身份验证,您必须以具有角色管理权限的用户身份(如userAdmin
或userAdminAnyDatabase
提供的角色)认证到admin
数据库。包括适用于MongoDB服务器配置的身份验证机制的适当--authenticationMechanism
。
mongosh --host <hostname> --port <port> --username <user> --password <pass> --authenticationDatabase="admin" --authenticationMechanism="<mechanism>"
创建用户管理角色。
要使用AD管理MongoDB用户,您至少需要在admin
数据库上创建一个可以创建和管理角色的角色,如userAdmin
或userAdminAnyDatabase
提供的角色。
角色的名称必须与AD组的唯一名称完全匹配。该组必须至少有一个AD用户作为成员。
给定可用的 Active Directory组,以下操作
创建了一个名为 AD 组
CN=dba,CN=Users,DC=example,DC=com
的角色,并且将其分配给
admin
数据库上的userAdminAnyDatabase
角色。
var admin = db.getSiblingDB("admin") admin.createRole( { role: "CN=dba,CN=Users,DC=example,DC=com", privileges: [], roles: [ "userAdminAnyDatabase" ] } )
您还可以为用户应该拥有用户管理权限的每个数据库授予 userAdmin
角色。这些角色提供了创建和管理角色所需的所有权限。
重要
在配置MongoDB角色、AD组或组成员时,请考虑应用 最小权限原则。
创建一个MongoDB配置文件。
MongoDB 配置文件 是一个具有 .conf
扩展名的纯文本YAML文件。
如果您正在升级现有的MongoDB部署,请复制当前的配置文件并从该副本开始工作。
(仅限Linux) 如果这是一个新的部署 并且 您使用平台包管理器安装MongoDB Enterprise,安装将包含
/etc/mongod.conf
默认配置文件。使用该默认配置文件或创建该文件的副本以进行工作。如果不存在此类文件,请创建一个具有
.conf
扩展名的空文件,并从该新配置文件开始工作。
配置MongoDB以连接到Active Directory。
在MongoDB配置文件中,将 security.ldap.servers 设置为AD服务器的地址和端口。如果您在用于复制的AD基础设施中包含多个AD服务器,请将服务器的地址和端口作为逗号分隔的列表指定为 security.ldap.servers。
示例
要连接到位于 activedirectory.example.net
的AD服务器,在配置文件中包含以下内容
security: ldap: servers: "activedirectory.example.net"
MongoDB必须绑定到AD服务器以执行查询。默认情况下,MongoDB使用简单认证机制将自身绑定到AD服务器。
或者,您可以在配置文件中配置以下设置以使用 SASL
绑定到AD服务器
将 security.ldap.bind.method 设置为
sasl
security.ldap.bind.saslMechanisms
,指定AD服务器支持的逗号分隔的SASL机制字符串。
本教程使用默认的 simple
LDAP认证机制。
[更多]
在MongoDB配置文件中,将security.authorization
设置为enabled
,并将setParameter
authenticationMechanisms
设置为GSSAPI
。
要启用通过Kerberos的认证,请在配置文件中包含以下内容:
security: authorization: "enabled" setParameter: authenticationMechanisms: "GSSAPI"
配置授权的LDAP查询模板。
在MongoDB配置文件中,将security.ldap.authz.queryTemplate
设置为格式化的LDAP查询URL模板。
在模板中,您可以使用以下任一项:
{USER}
占位符将认证的用户名替换到LDAP查询URL中。{PROVIDED_USER}
占位符将提供的用户名,即在认证或LDAP转换之前,替换到LDAP查询中。
设计查询模板以检索用户组。
注意
本教程不涉及对RFC4515、RFC4516或AD查询的全面描述。本教程中提供的queryTemplate
仅作为示例,可能不适用于您的特定AD部署。
示例
以下查询模板返回任何列出{USER}
作为成员的组,并递归地跟踪组成员关系。此LDAP查询假设组对象通过存储使用member
属性的完整用户Distinguished Name (DN)来跟踪用户成员资格。查询包括针对LDAP_MATCHING_RULE_IN_CHAIN的AD特定匹配规则OID 1.2.840.113556.1.4.1941
。此匹配规则是LDAP搜索过滤器的一个AD特定扩展。
security: ldap: authz: queryTemplate: "DC=example,DC=com??sub?(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={USER}))"
使用查询模板,MongoDB将{USER}
替换为认证用户名以查询LDAP服务器。
例如,一个用户以CN=sam,CN=Users,DC=dba,DC=example,DC=com
的身份进行认证。MongoDB根据queryTemplate
创建一个LDAP查询,将{USER}
令牌替换为认证用户名。Active Directory服务器执行递归的组查找,查找任何直接或间接列出用户作为成员的组。根据Active Directory groups,AD服务器返回CN=dba,CN=Users,DC=example,DC=com
和CN=engineering,CN=Users,DC=example,DC=com
。
MongoDB 将每个返回的组 DN 映射到 admin
数据库中的一个角色。对于每个映射的组 DN,如果 admin
数据库中存在一个与 DN 名称完全匹配的角色,MongoDB 会授予用户该角色分配的权限和角色。
匹配规则 LDAP_MATCHING_RULE_IN_CHAIN
要求提供认证用户的完整 DN。由于 Kerberos 需要用用户的 userPrincipalName
进行认证,您必须使用 security.ldap.userToDNMapping
将传入的用户名转换为 DN。下一步将提供将传入用户名转换为支持 queryTemplate
的指南。
转换通过 Active Directory 进行身份验证的传入用户名。
在 MongoDB 配置文件中,将 userToDNMapping
设置为将认证用户提供的用户名转换为 AD DN,以支持 queryTemplate
。
示例
以下 userToDNMapping
配置使用 match
正则表达式过滤器捕获提供的用户名。MongoDB 在执行查询之前将捕获的用户名插入到 ldapQuery
查询模板中。
security: ldap: userToDNMapping: '[ { match : "(.+)", ldapQuery: "DC=example,DC=com??sub?(userPrincipalName={0})" } ]'
您必须修改给定的示例配置以匹配您的部署。例如,ldapQuery
基 DN 必须与包含您的用户实体的基本 DN 匹配。可能还需要进行其他修改以支持您的 AD 部署。
示例
用户 alice@ENGINEERING.EXAMPLE.COM
进行认证。MongoDB 首先将 userToDNMapping
中指定的任何转换应用于用户名。根据提供的配置,MongoDB 在 match
阶段捕获用户名,并执行 LDAP 查询。
DC=example,DC=com??sub?(userPrincipalName=alice@ENGINEERING.EXAMPLE.COM)
基于配置的 Active Directory 用户,AD 服务器应返回 CN=alice,CN=Users,DC=engineering,DC=example,DC=com
。
MongoDB 然后执行在 queryTemplate
中配置的 LDAP 查询,将 {USER}
标记替换为 转换后的 用户名 CN=alice,CN=Users,DC=engineering,DC=example,DC=com
。
重要
如果您使用 userToDNMapping
的 substitution
参数来转换组名,替换的结果 必须 是一个 RFC4514 的转义字符串。
配置查询凭据。
MongoDB 需要凭证以在 AD 服务器上执行查询。
在配置文件中配置以下设置
security.ldap.bind.queryUser
,指定mongod
或mongos
用于在 AD 服务器上执行查询的 Kerberos 用户。security.ldap.bind.queryPassword
,指定用于特定queryUser
的密码。
security: ldap: bind: queryUser: "mongodbadmin@dba.example.com" queryPassword: "secret123"
在 Windows MongoDB 服务器上,您可以将 security.ldap.bind.useOSDefaults
设置为 true
以使用 OS 用户的凭证,而不是 queryUser
和 queryPassword
。
queryUser
必须有权代表 MongoDB 执行所有 LDAP 查询。
可选:添加额外的配置设置。
根据您的配置需求添加额外的选项。例如,如果您希望远程客户端连接到您的部署或您的部署成员在不同的主机上运行,请指定 net.bindIp
设置。
以 Kerberos 认证和 Active Directory 授权启动 MongoDB 服务器。
使用 --config
选项启动 MongoDB 服务器,指定此过程中创建的配置文件的路径。如果 MongoDB 服务器目前正在运行,请进行适当的准备以停止服务器。
Linux MongoDB 服务器
在 Linux 上,您必须指定 KRB5_KTNAME
环境变量,指定 MongoDB 服务器密钥表文件的路径。
env KRB5_KTNAME <path-to-keytab> mongod --config <path-to-config-file>
Microsoft Windows MongoDB服务器
在Windows上,您必须以配置步骤中预先配置的服务主体账户启动MongoDB服务器
mongod.exe --config <path-to-config-file>
连接到MongoDB服务器。
连接到MongoDB服务器,以与在admin
数据库上对应MongoDB角色的用户直接或传递组成员身份进行身份验证,使用具有userAdmin
、userAdminAnyDatabase
或具有等效权限的自定义角色的用户。
使用mongosh
对MongoDB服务器进行身份验证,设置以下选项
--host
使用MongoDB服务器的主机名--port
使用MongoDB服务器的端口号--username
为用户的userPrincipalName
--password
为用户的密码(或省略以使mongosh
提示输入密码)--authenticationMechanism
设置为"GSSAPI"
--authenticationDatabase
设置为"$external"
示例
在此过程之前,您已在admin
数据库上配置了dn:CN=dba,CN=Users,DC=example,DC=com
角色,并赋予了所需的权限。此角色对应于一个AD组。根据配置的AD用户,您可以以用户sam@dba.example.com
的身份进行认证并接收所需的权限。
mongosh --username sam@DBA.EXAMPLE.COM --password --authenticationMechanisms="GSSAPI" --authenticationDatabase "$external" --host <hostname> --port <port>
如果您未指定-p
命令行选项的密码,则mongosh
会提示输入密码。
Windows MongoDB部署必须使用mongo.exe
而不是mongosh
。
给定配置的Active Directory用户,用户成功认证并获得了相应的权限。
注意
如果您想作为现有的非$external
用户进行认证,将--authenticationMechanism
设置为一个SCRAM认证机制(例如SCRAM-SHA-1
或SCRAM-SHA-256
)。这要求MongoDB服务器的setParameter
authenticationMechanisms
包括SCRAM-SHA-1
和/或SCRAM-SHA-256
。
为映射返回的AD组创建角色。
对于您希望在MongoDB授权中使用的AD服务器上的每个组,您必须在MongoDB服务器的admin
数据库上创建一个匹配的角色。
示例
以下操作创建了一个以AD组DNCN=PrimaryApplication,CN=Users,DC=example,DC=com
命名的角色,并为该组分配了相应的角色和权限。
db.getSiblingDB("admin").createRole( { role: "CN=PrimaryApplication,CN=Users,DC=example,DC=com", privileges: [], roles: [ { role: "readWrite", db: "PrimaryApplication" } ] } )
给定配置的Active Directory组,MongoDB授予用户以sam@DBA.EXAMPLE.COM
或alice@ENGINEERING.EXAMPLE.COM
的身份进行认证,在PrimaryApplication
数据库上拥有readWrite
角色。
注意
要管理admin
数据库上的角色,您必须以具有admin
数据库上的userAdmin
、userAdminAnyDatabase
或具有等效权限的自定义角色的用户进行认证。
可选:将现有用户从$external
过渡到Active Directory服务器。
如果升级已配置在$external
数据库上的用户,您必须满足以下要求,以确保在配置MongoDB进行Kerberos认证和AD授权后用户能够访问
用户在AD服务器上有一个相应的用户对象。
用户是AD服务器上适当组的成员。
MongoDB包含名为用户AD组的
admin
数据库上的角色,以便授权用户保留其权限。
示例
以下用户存在于$external
数据库上
{ user : "joe@ANALYTICS.EXAMPLE.COM", roles: [ { role : "read", db : "web_analytics" }, { role : "read", db : "PrimaryApplication" } ] }
假设用户属于AD组CN=marketing,CN=Users,DC=example,DC=com
,以下操作将创建具有相应权限的匹配角色
db.getSiblingDB("admin").createRole( { role: "CN=marketing,CN=Users,DC=example,DC=com", privileges: [], roles: [ { role: "read", db: "web_analytics" } { role: "read", db: "PrimaryApplication" } ] } )
基于配置的queryTemplate
,MongoDB授权任何直接或传递属于CN=marketing,CN=Users,DC=example,DC=com
组的用户在web_analytics
和PrimaryApplication
数据库上执行read
操作。
重要
在配置对应 AD 群组的角色时,请注意,该群组中 所有 成员都可以接收分配的角色和权限。在配置 MongoDB 角色、AD 群组或群组成员时,请考虑应用 最小权限原则。
如果您希望继续允许非 $external
数据库上的用户访问 MongoDB,您必须在 setParameter
authenticationMechanisms
配置选项中包含 SCRAM 认证机制(例如 SCRAM-SHA-1
和/或 SCRAM-SHA-256
)。
setParameter: authenticationMechanisms: "GSSAPI,SCRAM-SHA-1,SCRAM-SHA-256"
或者,按照上述步骤将非 $external
用户过渡到 AD。
此过程将生成以下配置文件
security: authorization: "enabled" ldap: servers: activedirectory.example.net" bind: queryUser: "mongodbadmin@dba.example.com" queryPassword: "secret123" userToDNMapping: '[ { match: "(.+)" ldapQuery: "DC=example,DC=com??sub?(userPrincipalName={0})" } ]' authz: queryTemplate: "DC=example,DC=com??sub?(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={USER}))" setParameter: authenticationMechanisms: "GSSAPI"
重要
给定的示例配置需要修改以匹配您的 AD 架构、目录结构和配置。您可能还需要为您的部署添加额外的 配置文件选项。
有关配置角色和权限的更多信息,请参阅
测试和验证
完成配置步骤后,您可以使用 mongokerberos
工具验证您的配置。
mongokerberos
提供了一种方便的方法来验证您的平台 Kerberos 配置是否适用于 MongoDB,并测试 MongoDB 客户端进行 Kerberos 身份验证是否按预期工作。有关更多信息,请参阅 mongokerberos
文档。
mongokerberos
仅在 MongoDB 企业版中可用。