使用本地LDAP通过自管理Active Directory进行用户认证和授权
注意
从MongoDB 8.0开始,LDAP认证和授权已被弃用。LDAP仍可用,并在MongoDB 8的生命周期内保持不变,无需更改。在未来的一次主要版本更新中,LDAP将被删除。
详细信息,请参阅LDAP弃用.
MongoDB企业版通过平台LDAP库为代理认证和授权请求到指定的轻量级目录访问协议(LDAP)服务(如Active Directory(AD))提供支持。
本教程描述了如何配置MongoDB通过平台库通过Active Directory(AD)服务器执行认证和授权。
注意
对于链接到libldap
(例如在RHEL上运行时),对libldap
的访问是同步的,这会产生一些性能/延迟成本。
对于链接到libldap_r
的MongoDB 4.2企业版二进制文件,其行为与早期MongoDB版本没有变化。
先决条件
重要
在继续之前,请熟悉以下主题
关于AD的详细描述超出了本教程的范围。本教程假定您已了解AD。
MongoDB支持使用SASL机制在MongoDB服务器和AD之间进行绑定。SASL、SASL机制或特定SASL机制的特定AD配置要求超出本教程的范围。本教程假定您已了解SASL及其相关主题。
配置内部成员认证
您必须配置内部成员认证,然后才能为集群设置LDAP认证或授权。
注意事项
本教程解释了如何配置 MongoDB 以实现 AD 认证和授权。
要在自己的 MongoDB 服务器上执行此程序,您必须根据您自己的特定基础设施修改给定的程序,特别是 Active Directory 配置、构建 AD 查询或管理用户。
传输层安全性
默认情况下,MongoDB 在绑定到 AD 服务器时会创建 TLS/SSL 连接。这需要配置 MongoDB 服务器的宿主,使其能够访问 AD 服务器证书颁发机构(CA)的证书。
本教程提供了必要的宿主配置指令。
本教程假定您有权访问 AD 服务器证书颁发机构(CA)的证书,并且可以在 MongoDB 服务器上创建证书的副本。
用户名
要使用与$external
身份验证用户(Kerberos、LDAP或x.509用户)配合的客户端会话和因果一致性保证,用户名长度不能超过10k字节。
示例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(活动目录)服务器,需要为mongod
或mongos
提供访问AD服务器证书颁发机构(CA)证书的权限。
在Linux上,通过在ldap.conf
文件中使用TLS_CACERT
或TLS_CACERTDIR
选项来指定AD服务器的CA证书。
您的平台包管理器在安装MongoDB Enterprise的libldap
依赖项时创建ldap.conf
文件。有关配置文件或引用选项的完整文档,请参阅ldap.conf。
在Microsoft Windows上,使用平台的凭据管理工具加载AD服务器的证书颁发机构(CA)证书。确切的凭据管理工具取决于Windows版本。要使用该工具,请参考其针对您版本< span tabindex="0" class="leafygreen-ui-vm4wms">Windows的文档。
如果mongod
或mongos
无法访问AD CA文件,则无法创建与Active Directory服务器的TLS/SSL连接。
可选地,将security.ldap.transportSecurity
设置为none
以禁用TLS/SSL。
警告
将 transportSecurity
设置为 none
会将明文信息(包括用户凭证)在 MongoDB 和 AD 服务器之间传输。
连接到 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 企业版,则安装包括默认配置文件
/etc/mongod.conf
。使用该默认配置文件,或复制该文件以从该副本开始工作。如果不存在此类文件,请创建一个具有
.conf
扩展名的空文件并从该新配置文件开始工作。
配置MongoDB连接到Active Directory。
在MongoDB配置文件中,将 security.ldap.servers
设置为 AD 服务器的地址和端口。如果您的 AD 基础设施包含多个 AD 服务器用于复制目的,请将服务器地址和端口作为以逗号分隔的列表指定为 security.ldap.servers
。
您还必须通过将 security.authorization
设置为 enabled
和 setParameter
authenticationMechanisms
设置为 PLAIN
来启用 LDAP 认证。
示例
要连接到位于 activedirectory.example.net
的 AD 服务器,请在配置文件中包含以下内容
security: authorization: "enabled" ldap: servers: "activedirectory.example.net" setParameter: authenticationMechanisms: 'PLAIN'
MongoDB 必须绑定到 AD 服务器以执行查询。默认情况下,MongoDB 使用简单认证机制将自身绑定到 AD 服务器。
或者,您可以在配置文件中配置以下设置以使用 SASL
绑定到 AD 服务器
将
security.ldap.bind.method
设置为sasl
security.ldap.bind.saslMechanisms
,指定 AD 服务器支持的以逗号分隔的 SASL 机制字符串。
本教程使用默认的 simple
LDAP 认证机制。
配置授权的 LDAP 查询模板。
在MongoDB的配置文件中,将 security.ldap.authz.queryTemplate
设置为 RFC4516 格式的LDAP查询URL模板。
在模板中,您可以使用
{USER}
占位符,将认证用户名替换到LDAP查询URL中。{PROVIDED_USER}
占位符,将提供的用户名(即在认证或LDAP转换之前)替换到LDAP查询中。
注意
关于 RFC4515、RFC4516或AD查询的完整描述超出了本教程的范围。本教程中提供的queryTemplate
仅作为示例,可能不适用于您的特定AD部署。
示例
以下查询模板返回任何将 {USER}
列为成员的组,并递归地查找组成员资格。此LDAP查询假设组对象通过使用 member
属性存储完整的用户唯一名称(DN)来跟踪用户成员资格。查询包括 AD 特定的匹配规则OID 1.2.840.113556.1.4.1941
,用于 LDAP_MATCHING_RULE_IN_CHAIN。此匹配规则是LDAP搜索过滤器的一个 AD 特定扩展。
警告
如果 AD 林包含大量组,递归的 member:1.2.840.113556.1.4.1941
过滤器可能会导致性能显著下降。
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 根据查询模板创建一个LDAP查询,将 {USER}
令牌替换为已认证/转换的用户名。Active Directory服务器执行递归组查找,查找任何直接或间接列出用户为成员的组。根据 Active Directory 组,AD 服务器返回以下组
CN=dba,CN=Users,DC=example,DC=com
CN=engineering,CN=Users,DC=example,DC=com
CN=PrimaryApplication,CN=Users,DC=example,DC=com
MongoDB 将每个返回的组 DN 映射到 admin
数据库上的一个角色。对于每个映射的组 DN,如果 admin
数据库上存在一个与其名称完全匹配的现有角色,MongoDB 将授予用户该角色分配的权限和角色。
匹配规则 LDAP_MATCHING_RULE_IN_CHAIN
需要提供认证用户的完整 DN。如果用户使用不同的用户名格式进行认证,例如他们的 用户主体名称
,则必须使用 security.ldap.userToDNMapping
将传入的用户名转换为 DN。
可选:通过Active Directory对传入的用户名进行身份验证转换,
如果您的用户使用不是完整LDAP DN的用户名进行身份验证,您可能需要将用户名转换为支持LDAP身份验证或授权。MongoDB使用转换后的用户名进行身份验证和授权。
在MongoDB配置文件中,将userToDNMapping
设置为将认证用户的提供用户名转换为AD DN以支持queryTemplate
。
示例
给定配置的queryTemplate
,用户必须使用完整的LDAP DN进行身份验证。如果用户使用userPrincipalName
进行身份验证,则必须应用转换将提供的用户名转换为完整的LDAP DN。
以下userToDNMapping
配置使用match
正则表达式过滤器捕获提供的用户名。MongoDB在执行查询之前将捕获的用户名插入到ldapQuery
查询模板中。
security: ldap: userToDNMapping: '[ { match : "(.+)", ldapQuery: "DC=example,DC=com??sub?(userPrincipalName={0})" } ]'
Active Directory服务器返回与具有匹配userPrincipalName
的用户对象关联的完整LDAP DN。MongoDB然后可以使用此转换后的用户名进行身份验证和授权。
您必须修改给定的示例配置以匹配您的部署。例如,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
,指定用于在 AD 服务器上执行查询的 Active Directory 用户mongod
或mongos
。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 查询的权限。
可选:添加额外的配置设置。
添加您部署所需的任何额外配置选项。例如,您可以指定所需的 storage.dbPath
或更改默认的 net.port
端口号。
mongod
和 mongos
默认绑定到本地主机。如果您的部署成员在不同的主机上运行或您希望远程客户端连接到您的部署,您必须指定 net.bindIp
设置。
使用活动目录身份验证和授权启动 MongoDB 服务器。
使用 --config
选项启动 MongoDB 服务器,指定在此过程中创建的配置文件路径。如果 MongoDB 服务器当前正在运行,请进行适当的准备以停止服务器。
mongod --config <path-to-config-file>
Windows MongoDB 部署必须使用 mongod.exe
而不是 mongod
。
连接到 MongoDB 服务器。
连接到 MongoDB 服务器,以用户身份验证,其直接或间接组成员资格对应于 admin
数据库上的 MongoDB 角色,该角色具有 userAdmin
、userAdminAnyDatabase
或具有等效权限的自定义角色。
使用 mongosh
验证 MongoDB 服务器,设置以下选项
--host
使用 MongoDB 服务器的主机名--port
使用 MongoDB 服务器的端口号--username
为用户名--password
为用户密码--authenticationMechanism
为'PLAIN'
--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 --authenticationMechanism 'PLAIN' --authenticationDatabase '$external' --host <hostname> --port <port>
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组DN CN=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 groups,MongoDB授予了以sam@DBA.EXAMPLE.COM
或alice@ENGINEERING.EXAMPLE.COM
身份进行身份验证的用户在PrimaryApplication
数据库上的
角色。readWrite
注意
要管理admin
数据库上的角色,您必须以具有
、userAdmin
或具有等效权限的自定义角色在userAdminAnyDatabase
admin
上认证的用户身份进行认证。
将现有用户从$external
过渡到ActiveDirectory服务器
如果要在配置在 $external
数据库上的 用户 上升级现有安装,您必须满足以下要求以确保在为 AD 身份验证和授权配置 MongoDB 后可以访问
用户在 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: "PLAIN,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: "PLAIN"
提供的示例配置需要修改以匹配您的 Active Directory 架构、目录结构和配置。您可能还需要为您的部署添加其他 配置文件选项。
有关配置角色和权限的更多信息,请参阅