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


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

5.4.1. 配置 LDAP 以验证客户端

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

流程

  1. 打开 <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. 打开 <broker_instance_dir>/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)或 off(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

      指定代理可以花费的最长时间(毫秒)连接到目录服务器。如果代理无法在此时间内连接到该目录,它会中止连接尝试。如果为此属性指定零或以下值,则改为使用底层 TCP 协议的超时值。如果没有指定值,代理会无限期地等待建立连接,或者底层网络超时。

      当为连接请求连接池时,此属性指定代理在已达到最大池大小并且正在使用池中所有连接时等待连接的最长时间。如果您指定了零或以下值,代理会无限期等待连接可用。否则,代理会在达到最长等待时间时中止连接尝试。

      身份验证
      指定绑定到 LDAP 服务器时使用的身份验证方法。此参数可以设置为 simple (需要用户名和密码)或 none (允许匿名访问)。
      userBase
      选择 DIT 的特定子树以搜索用户条目。子树由 DN 指定,它指定子树的基节点。例如,通过将这个选项设置为 ou=User,ou=ActiveMQ,ou=system,搜索用户条目仅限于 ou=User,ou=ActiveMQ,ou=system node 下的子树。
      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、roleBase、roleSearchMatching、roleSearchSubtreeroleName)作为指定 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 路径,如 as 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 )。

如果生成的搜索过滤器应用到用户基础选择的子树 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,则搜索过滤器会在字符串替换后(假设 ApacheDS 搜索过滤器语法 )后变为(member=uid=jdoe )。

如果生成的搜索过滤器应用到角色基础 ou=Group,ou=ActiveMQ,ou=system 所选的子树,它将匹配 member 属性等于 uid=jdoe 的所有角色条目( member 属性的值是 DN)。

必须始终设置这个选项,即使角色搜索被禁用,因为它没有默认值。如果使用 OpenLDAP,搜索过滤器的语法为 (member:=uid=jdoe)。

其它资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.