5.4. 使用 LDAP 进行身份验证和授权
LDAP 登录模块通过针对存储在中央 X.500 目录服务器中的用户数据检查传入的凭证来启用身份验证和授权。它通过 org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule 来实施。
5.4.1. 配置 LDAP 以验证客户端 复制链接链接已复制到粘贴板!
以下示例演示了如何使用 LDAP 验证客户端。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml配置文件。 在
security-settings元素内,添加一个security-setting元素来配置权限。例如:<security-settings> <security-setting match="#"> <permission type="createDurableQueue" roles="user"/> <permission type="deleteDurableQueue" roles="user"/> <permission type="createNonDurableQueue" roles="user"/> <permission type="deleteNonDurableQueue" roles="user"/> <permission type="send" roles="user"/> <permission type="consume" roles="user"/> </security-setting> </security-settings>上述配置 将所有 队列的特定权限
分配给用户角色的成员。-
打开 &
lt;broker_instance_dir> /etc/login.config文件。 根据您使用的目录服务,配置 LDAP 登录模块。
如果您使用 Microsoft Active Directory 目录服务,请添加类似以下示例的配置:
activemq { org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule required debug=true initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory connectionURL="LDAP://localhost:389" connectionUsername="CN=Administrator,CN=Users,OU=System,DC=example,DC=com" connectionPassword=redhat.123 connectionProtocol=s connectionTimeout="5000" authentication=simple userBase="dc=example,dc=com" userSearchMatching="(CN={0})" userSearchSubtree=true readTimeout="5000" roleBase="dc=example,dc=com" roleName=cn roleSearchMatching="(member={0})" roleSearchSubtree=true ; };注意如果您使用 Microsoft Active Directory,并且需要为
connectionUsername属性指定的值包含一个空格(如OU=System Accounts),那么您必须将值包含在一对双引号中(""),并使用反斜杠(\)来转义每个双引号中的双引号。例如:connectionUsername="CN=Administrator,CN=Users,OU=\"System Accounts\",DC=example,DC=com"。如果您使用 ApacheDS 目录服务,请添加类似以下示例的配置:
activemq { org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule required debug=true initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory connectionURL="ldap://localhost:10389" connectionUsername="uid=admin,ou=system" connectionPassword=secret connectionProtocol=s connectionTimeout=5000 authentication=simple userBase="dc=example,dc=com" userSearchMatching="(uid={0})" userSearchSubtree=true userRoleName= readTimeout=5000 roleBase="dc=example,dc=com" roleName=cn roleSearchMatching="(member={0})" roleSearchSubtree=true ; };debug-
打开(
true)或关闭调试(false)。默认值为false。 initialContextFactory-
必须始终设置为
com.sun.jndi.ldap.LdapCtxFactory connectionURL-
使用 LDAP URL、_<ldap://Host:Port> 的目录服务器的位置。通过添加正斜杠
/,后跟目录树中特定节点的 DN,可以选择验证此 URL。Apache DS 的默认端口为10389,而 Microsoft AD 的默认端口为389。 connectionUsername-
打开目录服务器连接的用户的可分辨名称(DN)。例如:
uid=admin,ou=system。目录服务器通常需要客户端提供用户名/密码凭据才能打开连接。 connectionPassword-
与来自
connectionUsername的 DN 匹配的密码。在目录服务器中,在 Directory Information Tree (DIT)中,密码通常以userPassword属性存储在对应的目录条目中。 connectionProtocol- 支持任何值,但实际上并没有使用。必须明确设置这个选项,因为它没有默认值。
connectionTimeout指定代理可以连接到目录服务器的最大时间(以毫秒为单位)。如果代理此时无法连接到目录,它将中止连接尝试。如果为此属性指定 0 或更小的值,则会使用底层 TCP 协议的超时值。如果没有指定值,代理会无限期等待建立连接,或者底层网络超时。
当为连接池请求连接池时,此属性指定代理在达到最大池大小以及池中所有连接都处于使用时等待的时间。如果您指定了零个或更少值,代理会无限期等待连接可用。否则,当达到最大等待时间时,代理会中止连接尝试。
身份验证-
指定绑定到 LDAP 服务器时使用的验证方法。这个参数可以设置为
simple(这需要用户名和密码)或none(允许匿名访问)。 userBase-
选择要搜索用户条目的 DIT 的特定子树。子树由 DN 指定,用于指定子树的基本节点。例如,通过将此选项设置为
ou=User,ou=ActiveMQ,ou=system,对用户条目的搜索仅限于ou=User,ou=ActiveMQ,ou=system节点下的子树。 userSearchMatching-
指定一个 LDAP 搜索过滤器,它应用到
userBase所选的子树。详情请查看下面的 第 5.4.1.1 节 “搜索匹配参数” 部分。 userSearchSubtree-
指定用户条目的搜索深度,相对于
userBase指定的节点。此选项是一个布尔值。指定一个false值表示搜索会尝试与userBase节点的其中一个子条目匹配(映射到javax.naming.directory.SearchControls.ONELEVEL_SCOPE)。指定一个true值意味着搜索会尝试匹配属于userBase节点 子树的 任何条目(映射到javax.naming.directory.SearchControls.SUBTREE_SCOPE)。 userRoleName- 包含用户角色名称列表的用户条目属性名称。角色名称由代理的授权插件解释为组名称。如果省略这个选项,则不会从用户条目中提取角色名称。
readTimeout- 指定代理可以等待从目录服务器接收响应到 LDAP 请求的最长时间(以毫秒为单位)。如果代理没有收到来自目录服务器的响应,代理会中止请求。如果您指定了零个或更少值,或者您没有指定值,代理会无限期等待从目录服务器的响应到 LDAP 请求。
roleBase-
如果角色数据直接存储在目录服务器中,可以使用角色选项的组合(
roleBase,roleSearchMatching,roleSearchSubtree, 和roleName)作为指定userRoleName选项的替代选择。此选项选择 DIT 的特定子树来搜索 role/group 条目。子树由 DN 指定,用于指定子树的基本节点。例如,通过将此选项设置为ou=Group,ou=ActiveMQ,ou=system,搜索 role/group 条目仅限于ou=Group,ou=ActiveMQ,ou=system节点下的子树。 roleName- 包含 role/group 名称的角色条目的属性类型(如 C、O、OU 等)。如果省略此选项,则有效禁用角色搜索功能。
roleSearchMatching-
指定一个 LDAP 搜索过滤器,它应用到
roleBase所选的子树。详情请查看下面的 第 5.4.1.1 节 “搜索匹配参数” 部分。 roleSearchSubtree指定角色条目的搜索深度,相对于
roleBase指定的节点。如果设置为false(默认值),搜索会尝试匹配roleBase节点的其中一个子条目(映射到javax.naming.directory.SearchControls.ONELEVEL_SCOPE)。如果为true,它会尝试匹配属于角色 Base 节点的子树的任何条目(映射到javax.naming.directory.SearchControls.SUBTREE_SCOPE)。注意Apache DS 使用 DN 路径的
OID部分。Microsoft Active Directory 使用CN部分。例如,您可以使用 Apache DS 中的oid=testuser,dc=example,dc=com等 DN 路径,而您可以在 Microsoft Active Directory 中使用cn=testuser,dc=example,dc=com等 DN 路径。
- 启动或重启代理(服务或进程)。
5.4.1.1. 搜索匹配参数 复制链接链接已复制到粘贴板!
userSearchMatching在传递给 LDAP 搜索操作前,此配置参数中提供的字符串值受到字符串替换,如
java.text.MessageFormat类实现。
这意味着,特殊字符串
{0}替换为用户名,如从传入的客户端凭据中提取。替换后,字符串将解释为 LDAP 搜索过滤器(语法由 IETF 标准 RFC 2254 定义)。
例如,如果此选项设置为
(uid={0}),并且收到的用户名是jdoe,则搜索过滤器会在字符串替换后变为(uid=jdoe)。
如果生成的搜索过滤器应用到用户 base,
ou=User,ou=ActiveMQ,ou=system指定的子树中,它将与条目uid=jdoe,ou=User,ou=ActiveMQ,ou=system匹配。
roleSearchMatching这的工作方式与
userSearchMatching选项类似,但它支持两个替换字符串。
替换字符串
{0}替换匹配用户条目的完整 DN (即用户搜索的结果)。例如,对于用户jdoe,替换的字符串可以是uid=jdoe,ou=User,ou=ActiveMQ,ou=system。
替换字符串
{1}会替换接收到的用户名。例如,jdoe.
如果此选项设为
(member=uid={1}),且接收到的用户名为jdoe,在进行了字符串替换后,搜索过滤器变为(member=uid=jdoe)(假设使用 ApacheDS 搜索过滤器语法)。
如果生成的搜索过滤器被应用由角色基础 (
ou=Group,ou=ActiveMQ,ou=system) 所选择的子树,它将匹配具有member属性等于uid=jdoe(member属性的值是一个 DN)。
必须始终设置这个选项,即使角色搜索被禁用,因为它没有默认值。如果使用 OpenLDAP,搜索过滤器的语法为
(member:=uid=jdoe)。
其他资源
- 有关搜索过滤器语法的简短介绍,请参阅 Oracle JNDI 教程。
5.4.2. 配置 LDAP 授权 复制链接链接已复制到粘贴板!
LegacyLDAPSecuritySettingPlugin 安全设置插件读取之前在 AMQ 6 中由 LDAPAuthorizationMap 和 cachedLDAPAuthorizationMap 控制的安全信息,并在可能的情况下将这个信息转换为对应的 AMQ 7 安全设置。
AMQ 6 和 AMQ 7 中代理的安全实现与 AMQ 7 中不匹配。因此,插件在两个版本之间执行一些转换,以实现接近等效的功能。
以下示例演示了如何配置插件。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml配置文件。 在
security-settings元素内,添加security-setting-plugin元素。例如:<security-settings> <security-setting-plugin class-name="org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin"> <setting name="initialContextFactory" value="com.sun.jndi.ldap.LdapCtxFactory"/> <setting name="connectionURL" value="ldap://localhost:1024"/>`ou=destinations,o=ActiveMQ,ou=system` <setting name="connectionUsername" value="uid=admin,ou=system"/> <setting name="connectionPassword" value="secret"/> <setting name="connectionProtocol" value="s"/> <setting name="authentication" value="simple"/> </security-setting-plugin> </security-settings>class-name-
实施是
org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin。 initialContextFactory-
用于连接到 LDAP 的初始上下文工厂。它必须始终设置为
com.sun.jndi.ldap.LdapCtxFactory(即默认值)。 connectionURL-
使用 LDAP URL 指定目录服务器的位置,<ldap://Host:Port> ;。您可选择通过添加正斜杠
/,后跟目录树中特定节点的可分辨名称(DN)来选择性地验证此 URL。例如:ldap://ldapserver:10389/ou=system。默认值为ldap://localhost:1024。 connectionUsername-
打开到目录服务器连接的用户的 DN。例如:
uid=admin,ou=system。目录服务器通常需要客户端提供用户名/密码凭据才能打开连接。 connectionPassword-
与来自
connectionUsername的 DN 匹配的密码。在目录服务器中,在 Directory Information Tree (DIT)中,密码通常以userPassword属性存储在对应的目录条目中。 connectionProtocol- 当前未使用。以后,这个选项可能会允许您选择与目录服务器的连接的安全套接字层(SSL)。必须明确设置这个选项,因为它没有默认值。
身份验证指定绑定到 LDAP 服务器时使用的验证方法。此参数的有效值为
simple(用户名和密码)或none(匿名)。默认值为simple。注意不支持 简单身份验证和安全层(SASL)身份验证。
上述配置示例中没有显示的其他设置有:
destinationBase-
指定其子对象为所有目的地提供权限的节点 DN。在这种情况下,DN 是一个字面值(即,没有对属性值执行字符串替换)。例如,此属性的典型值为
ou=destinations,o=ActiveMQ,ou=system。默认值为ou=destinations,o=ActiveMQ,ou=system。 filter-
指定 LDAP 搜索过滤器,它会在查找任何类型的目的地时使用该过滤器。搜索过滤器会尝试匹配队列或主题节点的其中一个子或后代。默认值为
(cn=*)。 roleAttribute-
指定节点的一个属性,它匹配其值是一个角色的 DN 的
filter。默认值为uniqueMember。 adminPermissionValue-
指定与
admin权限匹配的值。默认值为admin。 readPermissionValue-
指定匹配
read权限的值。默认值为读取。 writePermissionValue-
指定匹配
write权限的值。默认值为write。 enableListener-
指定是否启用自动接收 LDAP 服务器中的更新的监听程序,并实时更新代理的授权配置。默认值为
true。 mapAdminToManage指定是否将传统(即 AMQ 6)
admin的权限映射到 AMQ 7manage权限。下表中的映射语义的详情。默认值为false。LDAP 中定义的队列或主题的名称充当安全设置的"匹配",权限值将从 AMQ 6 类型映射到 AMQ 7 类型,并且角色映射为 as-is。由于 LDAP 中定义的队列或主题的名称充当 security 设置的匹配项,因此安全性设置可能无法像 JMS 目的地一样应用。这是因为 AMQ 7 始终根据需要为 JMS 目的地添加前缀 "jms.queue." 或 "jms.topic."。
AMQ 6 有三种权限类型 -
读取、写和admin。ActiveMQ 网站( 安全 )上描述了这些权限类型。AMQ 7 有以下权限类型:
-
createAddress -
deleteAddress -
createDurableQueue -
deleteDurableQueue -
createNonDurableQueue -
deleteNonDurableQueue -
send -
Consume -
管理 浏览下表显示了安全设置插件如何将 AMQ 6 权限类型映射到 AMQ 7 权限类型:
Expand 表 5.3. 将 AMQ 6 权限类型映射到 AMQ 7 AMQ 6 权限类型 AMQ 7 权限类型 读取
使用、浏览
write
send
admin
createAddress, deleteAddress, createDurableQueue, deleteDurableQueue, createNonDurableQueue, deleteNonDurableQueue, manage (if
mapAdminToManageis set totrue)如下所述,在一些情况下,插件在 AMQ 6 和 AMQ 7 权限类型之间执行一些转换来实现等效性:
-
默认情况下,映射不包括 AMQ 7
管理权限类型,因为 AMQ 6 中没有类似的权限类型。但是,如果mapAdminToManage设为true,则该插件会将 AMQ 6admin权限映射到 AMQ 7管理权限。 -
AMQ 6 中的
admin权限类型决定代理是否自动创建一个目的地(如果目的地不存在),并且用户会向它发送消息。如果用户有向目的地发送消息的权限,AMQ 7 会自动允许自动创建目的地。因此,插件默认将旧的admin权限映射到上述 AMQ 7 权限。如果mapAdminToManage设为true,则该插件也会将 AMQ 6admin权限映射到 AMQ 7manage权限。
-
默认情况下,映射不包括 AMQ 7
-
allowQueueAdminOnRead是否将旧的读取权限映射到 createDurableQueue、createNonDurableQueue 和 deleteDurableQueue 权限,以便 JMS 客户端可以在不需要 admin 权限的情况下创建持久和非持久性订阅。这是 AMQ 6 中允许的。默认值为 false。
下表显示了当
allowQueueAdminOnRead为true时,安全设置插件如何将 AMQ 6 权限类型映射到 AMQ 7 权限类型:Expand 表 5.4. 当 allowQueueAdminOnRead 为 true时,将 AMQ 6 权限类型映射到 AMQ 7 AMQ 6 权限类型 AMQ 7 权限类型 读取
consume, browse, createDurableQueue, createNonDurableQueue, deleteDurableQueue
write
send
admin
createAddress, deleteAddress, deleteNonDurableQueue, manage (如果
mapAdminToManage设置为true)
5.4.3. 在 login.config 文件中加密密码 复制链接链接已复制到粘贴板!
因为机构通常使用 LDAP 安全地存储数据,所以 login.config 文件可以包含代理与机构的 LDAP 服务器通信所需的配置。此配置文件通常包含登录 LDAP 服务器的密码,因此需要加密此密码。
先决条件
-
确保您已修改了
login.config文件来添加所需属性,如 第 5.4.2 节 “配置 LDAP 授权” 所述。
流程
以下流程演示了如何屏蔽 < broker_instance_dir> /etc/login.config 文件中的 connectionPassword 参数的值。
在命令提示符中,使用
mask工具来加密密码:$ <broker_instance_dir>/bin/artemis mask <password>result: 3a34fd21b82bf2a822fa49a8d8fa115d打开 &
lt;broker_instance_dir> /etc/login.config文件。找到connectionPassword参数:connectionPassword = <password>将明文密码替换为加密值:
connectionPassword = 3a34fd21b82bf2a822fa49a8d8fa115d使用标识符
"ENC ()"嵌套加密值:connectionPassword = "ENC(3a34fd21b82bf2a822fa49a8d8fa115d)"
login.config 文件现在包含屏蔽的密码。由于密码使用 "ENC ()" 标识符嵌套,因此 AMQ Broker 在使用前对其进行解密。
其他资源
- 有关 AMQ Broker 中包含的配置文件的更多信息,请参阅 AMQ Broker 配置文件和位置。
5.4.4. 映射外部角色 复制链接链接已复制到粘贴板!
您可以将外部身份验证供应商(如 LDAP)的角色映射到代理内部使用的角色。
要映射外部角色,请在 broker.xml 配置文件中的 security-settings 项中创建 role-mapping 条目。例如:
<security-settings>
...
<role-mapping from="cn=admins,ou=Group,ou=ActiveMQ,ou=system" to="my-admin-role"/>
<role-mapping from="cn=users,ou=Group,ou=ActiveMQ,ou=system" to="my-user-role"/>
</security-settings>
- 角色映射是添加的。这意味着用户将保留原始角色以及新分配的角色。
- 角色映射仅影响授权队列访问的角色,不提供启用 Web 控制台访问的方法。