5.4. 使用 LDAP 进行身份验证和授权


LDAP 登录模块通过根据存储在中央 X.500 目录服务器中的用户数据检查传入的凭证来启用身份验证和授权。它通过 org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule 实施。

5.4.1. 配置 LDAP 以验证客户端

以下示例步骤演示了如何使用 LDAP 验证客户端。

流程

  1. 打开 & lt;broker_instance_dir> /etc/broker.xml 配置文件。
  2. 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>
    Copy to Clipboard Toggle word wrap

    上述配置 将所有 队列的特定权限 分配给用户 角色的成员。

  3. 打开 & lt;broker_instance_dir&gt; /etc/login.config 文件。
  4. 根据您使用的目录服务,配置 LDAP 登录模块。

    1. 如果您使用 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
           ;
      };
      Copy to Clipboard Toggle word wrap
      注意

      如果您使用 Microsoft Active Directory,而您需要为 connectionUsername 属性指定的值包含一个空格(例如 OU=System Accounts),那么您必须将该值放在一对双引号("")中,并使用反斜杠(\)来转义对中的每个双引号。例如, connectionUsername="CN=Administrator,CN=Users,OU=\"System Accounts\",DC=example,DC=com"

    2. 如果您使用 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
           ;
      };
      Copy to Clipboard Toggle word wrap
      debug
      打开调试(true)或关闭()。默认值为 false
      initialContextFactory
      必须始终设置为 com.sun.jndi.ldap.LdapCtxFactory
      connectionURL
      使用 LDAP URL 的目录服务器的位置__<ldap://Host:Port>。通过添加正斜杠 / 以及目录树中特定节点的 DN,可以选择性地验证此 URL。对于 Microsoft AD,Apache DS 的默认端口为 10389,默认为 389
      connectionUsername
      打开与目录服务器的连接的用户的区分名称(DN)。例如: uid=admin,ou=system。目录服务器通常需要客户端提供用户名/密码凭证才能打开连接。
      connectionPassword
      与来自 connectionUsername 的 DN 匹配的密码。在目录服务器中,在 Directory Information Tree (DIT)中,密码通常作为 userPassword 属性存储在对应的目录条目中。
      connectionProtocol
      支持任何值,但实际上没有使用。必须明确设置这个选项,因为它没有默认值。
      connectionTimeout

      指定代理连接到目录服务器所需的最长时间(以毫秒为单位)。如果代理无法在此时间内连接到目录 sever,它会中止连接尝试。如果为此属性指定 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 的特定子树来搜索角色/组条目。子树由 DN 指定,用于指定子树的基本节点。例如,通过将此选项设置为 ou=Group,ou=ActiveMQ,ou=system,搜索 role/group 条目仅限于 ou=Group,ou=ActiveMQ,ou=system 节点下的子树。
      roleName
      包含角色/组名称(如 C、O、OU 等)的角色条目的属性类型。如果省略这个选项,则角色搜索功能会有效地禁用。
      roleSearchMatching
      指定一个 LDAP 搜索过滤器,它应用到 roleBase 所选的子树。详情请查看 第 5.4.1.1 节 “搜索匹配参数” 部分。
      roleSearchSubtree

      指定与 roleBase 指定的节点相关的角色条目的搜索深度。如果设置为 false (默认值)搜索会尝试匹配 roleBase 节点的一个子条目(映射到 javax.naming.directory.SearchControls.ONELEVEL_SCOPE)。如果为 true,它会尝试匹配属于 roleBase 节点子树的任何条目(映射到 javax.naming.directory.SearchControls.SUBTREE_SCOPE)。

      注意

      Apache DS 使用 DN 路径的 OID 部分。Microsoft Active Directory 使用 CN 部分。例如,您可以在 Apache DS 中使用 DN 路径,如 oid=testuser,dc=example,dc=com,而您可能在 Microsoft Active Directory 中使用一个 DN 路径,如 cn=testuser,dc=example,dc=com

  5. 启动或重启代理(服务或进程)。

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=doe,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)

其他资源

5.4.2. 配置 LDAP 授权

LegacyLDAPSecuritySettingPlugin 安全设置插件读取之前在 AMQ 6 中由 LDAPAuthorizationMapcachedLDAPAuthorizationMap 控制的安全信息,并在可能的情况下将这个信息转换为对应的 AMQ 7 安全设置。

AMQ 6 和 AMQ 7 中的代理的安全实现不完全匹配。因此,插件在两个版本之间执行一些转换,以实现近似的功能。

以下示例演示了如何配置插件。

流程

  1. 打开 & lt;broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. 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>
    Copy to Clipboard Toggle word wrap
    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 7 manage 权限。请参阅下表中映射语义的详情。默认值为 false

LDAP 中定义的队列或主题的名称充当安全设置的"匹配",权限值从 AMQ 6 类型映射到 AMQ 7 类型,角色映射为 as-is。由于 LDAP 中定义的队列或主题的名称充当安全设置的匹配项,因此 security 设置可能无法应用到 JMS 目的地。这是因为 AMQ 7 始终根据需要为 JMS 目的地添加前缀 "jms.queue." 或 "jms.topic."。

AMQ 6 有三种权限类型 - 读取写入 和管理。这些权限类型在 ActiveMQ 网站上进行了描述; 安全性

AMQ 7 有以下权限类型:

  • createAddress
  • deleteAddress
  • createDurableQueue
  • deleteDurableQueue
  • createNonDurableQueue
  • deleteNonDurableQueue
  • send
  • consume
  • 管理
  • browse

    下表显示了安全设置插件如何将 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 (如果 mapAdminToManage is set to true

    如下方所述,在一些情况下,插件在 AMQ 6 和 AMQ 7 权限类型间执行一些转换来实现等效性:

    • 映射默认不包含 AMQ 7 管理 权限类型,因为 AMQ 6 中没有类似的权限类型。但是,如果 mapAdminToManage 设为 true,插件会将 AMQ 6 admin 权限映射到 AMQ 7 管理权限
    • AMQ 6 中的 admin 权限类型决定代理在目标不存在时自动创建目的地,用户是否向它发送消息。如果用户有向目的地发送消息的权限,AMQ 7 会自动允许自动创建目的地。因此,插件会将旧的 admin 权限映射到上面显示的 AMQ 7 权限。如果 mapAdminToManage 设为 true,则该插件也会将 AMQ 6 admin 权限映射到 AMQ 7 manage 权限。
allowQueueAdminOnRead

是否要将旧的读取权限映射到 createDurableQueue、createNonDurableQueue 和 deleteDurableQueue 权限,以便 JMS 客户端能够在不需要 admin 权限的情况下创建持久和非持久订阅。这在 AMQ 6 中允许。默认值为 false。

下表显示了当 allowQueueAdminOnReadtrue 时,安全设置插件如何将 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 服务器的密码,因此需要加密此密码。

先决条件

流程

以下流程演示了如何屏蔽 < broker_instance_dir> /etc/login.config 文件中的 connectionPassword 参数的值。

  1. 在命令提示符下,使用 mask 工具加密密码:

    $ <broker_instance_dir>/bin/artemis mask <password>
    Copy to Clipboard Toggle word wrap
    result: 3a34fd21b82bf2a822fa49a8d8fa115d
    Copy to Clipboard Toggle word wrap
  2. 打开 & lt;broker_instance_dir&gt; /etc/login.config 文件。找到 connectionPassword 参数:

    connectionPassword = <password>
    Copy to Clipboard Toggle word wrap
  3. 将纯文本密码替换为加密值:

    connectionPassword = 3a34fd21b82bf2a822fa49a8d8fa115d
    Copy to Clipboard Toggle word wrap
  4. 使用标识符 "ENC ()" 嵌套加密值:

    connectionPassword = "ENC(3a34fd21b82bf2a822fa49a8d8fa115d)"
    Copy to Clipboard Toggle word wrap

login.config 文件现在包含屏蔽的密码。因为密码被嵌套为 "ENC ()" 标识符,所以 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>
Copy to Clipboard Toggle word wrap
注意
  • 角色映射是添加的。这意味着用户将保留原始角色以及新分配的角色。
  • 角色映射仅影响授权队列访问的角色,不提供启用 Web 控制台访问的方法。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat