搜索

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

download PDF

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>

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

  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
           ;
      };
      注意

      如果您使用 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
           ;
      };
      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 搜索过滤器,它 应用到用户Base 选择的子树。详情请查看下面的 第 5.4.1.1 节 “搜索匹配的参数” 部分。
      userSearchSubtree
      相对于 用户Base 指定的节点,指定用户条目的搜索深度。这个选项是一个布尔值。指定一个 false 表示搜索尝试 与用户Base 节点的子条目之一匹配(映射到 javax.naming.directory.SearchControls.ONELEVEL_SCOPE)。指定一个 true 表示搜索会尝试与 属于用户Base 节点 的子树 的任何条目匹配(映射到 javax.naming.directory.SearchControls.SUBTREE_SCOPE)。
      userRoleName
      用户条目的属性名称,其中包含用户的角色名称列表。角色名称由代理的授权插件解释为组名称。如果省略这个选项,则不会从用户条目中提取角色名称。
      readTimeout
      指定代理可以等待从目录服务器收到响应到 LDAP 请求的最长时间(以毫秒为单位)。如果代理没有从目录服务器收到响应,代理会中止请求。如果您指定了零个或更少值,或者您没有指定值,代理会无限期等待目录服务器到 LDAP 请求的响应。
      roleBase
      如果角色数据直接存储在目录服务器中,可以使用角色选项的组合(角色BaseroleSearchMatchingroleSearchSubtreeroleName)作为指定 userRoleName 选项的替代选择。这个选项选择 DIT 的特定子树来搜索角色/组条目。子树由 DN 指定,用于指定子树的基本节点。例如,通过将这个选项设置为 ou=Group,ou=ActiveMQ,ou=system,搜索 role/group 条目仅限于 ou=Group,ou=ActiveMQ,ou=system 节点下的子树。
      roleName
      角色条目的属性类型,其中包含角色/组的名称(如 C、O、OU 等)。如果省略这个选项,则角色搜索功能会被实际禁用。
      roleSearchMatching
      指定 LDAP 搜索过滤器,它应用到由 角色Base 选择的子树。详情请查看下面的 第 5.4.1.1 节 “搜索匹配的参数” 部分。
      roleSearchSubtree

      指定与 角色Base 指定的节点相关的角色条目的搜索深度。如果设置为 false (默认值),则搜索尝试与 角色Base 节点的子条目之一匹配(映射到 javax.naming.directory.SearchControls.ONELEVEL_SCOPE)。如果为 true,它将尝试匹配角色Base 节点的子树的任何条目(映射到 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. 启动或重启代理(service 或 process)。

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

这与 用户SearchMatching 选项类似,除了它支持两个替换字符串外。

替换字符串 {0} 替换匹配用户条目的完整 DN(即用户搜索的结果)。例如,对于用户 jdoe,替换的字符串可以是 uid=jdoe,ou=User,ou=ActiveMQ,ou=system

替换字符串 {1} 替换所接收的用户名。例如,jdo e

如果将此选项设置为 (member=uid={1}),并且收到的用户名为 jdoe,则搜索过滤器将在字符串替换后变为 (member=uid=jdoe) (假设 ApacheDS 搜索过滤器语法)。

如果生成的搜索过滤器应用于角色基础 ou=Group,ou=ActiveMQ,ou=system 中选择的子树,它将匹配 所有成员 属性等于 uid=jdoemember 属性的值是 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>
    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 The defaults is ou=destinations,o=ActiveMQ,ou=system
filter
指定 LDAP 搜索过滤器,用于在查找任何类型的目标的权限时使用。搜索过滤器会尝试匹配其中一个队列或主题节点的子项或子代。默认值为 (cn=*)
roleAttribute
指定与 过滤器 匹配的节点属性,其值是角色的 DN。默认值为 uniqueMember
adminPermissionValue
指定与 admin 权限匹配的值。默认值为 admin
readPermissionValue
指定匹配 read 权限的值。默认值为 读取
writePermissionValue
指定匹配 write 权限的值。默认值为 write
enableListener
指定是否启用监听程序,它可自动接收 LDAP 服务器中的更新并实时更新代理的授权配置。默认值为 true
mapAdminToManage

指定是否将 legacy(即 AMQ 6) 管理员权限 映射到 AMQ 7 管理权限。请参考下表中映射语义的详情。默认值为 false

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

AMQ 6 具有三种权限类型 - 读取写入和 admin。这些权限类型在 ActiveMQ 网站上描述; 安全

AMQ 7 有以下权限类型:

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

    下表显示了安全设置插件如何将 AMQ 6 权限类型映射到 AMQ 7 权限类型:

    AMQ 6 权限类型AMQ 7 权限类型

    读取

    使用、浏览

    write

    send

    admin

    createAddress, deleteAddress, createDurableQueue, deleteDurableQueue, createNonDurableQueue, deleteNonDurableQueue, manage(if mapAdminToManage is 设为 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 权限类型:

AMQ 6 权限类型AMQ 7 权限类型

读取

consume, browse, createDurableQueue, createNonDurableQueue, deleteDurableQueue

write

send

admin

createAddress, deleteAddress, deleteNonDurableQueue, manage(if 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>
    result: 3a34fd21b82bf2a822fa49a8d8fa115d
  2. 打开 & lt;broker_instance_dir&gt; /etc/login.config 文件。找到 connectionPassword 参数:

    connectionPassword = <password>
  3. 使用加密值替换 plain-text 密码:

    connectionPassword = 3a34fd21b82bf2a822fa49a8d8fa115d
  4. 使用标识符 "ENC()" 嵌套加密值:

    connectionPassword = "ENC(3a34fd21b82bf2a822fa49a8d8fa115d)"

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>
注意
  • 角色映射是可添加的。这意味着用户将保留原始角色以及新分配的角色。
  • 角色映射仅影响授权队列访问的角色,不提供启用 Web 控制台访问权限的方法。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.