搜索

第 3 章 旧安全子系统

download PDF

3.1. 配置安全域以使用 LDAP

安全域可以配置为使用 LDAP 服务器进行身份验证和授权,方法是使用登录模块。JBoss EAP 安全架构指南 介绍了安全域和登录模块的基础知识LdapExtended 是与 LDAP 服务器(包括 Active Directory)集成的首选登录模块,但也可以使用其他几个 LDAP 登录模块。特别是,Ldap、AdapAdvancedAdap 登录模块也可用于配置安全域以使用 LDAP。本节使用 LdapExtended 登录模块来演示如何创建使用 LDAP 进行身份验证和授权的安全域,但也可以使用其他 LDAP 登录模块。有关其他 LDAP 登录模块的更多详细信息,请参阅 JBoss EAP登录模块参考

重要

如果传统 安全 子系统使用 LDAP 服务器来执行身份验证,如果该 LDAP 服务器无法访问 JBoss EAP 将返回 500 或内部服务器错误。此行为与之前版本的 JBoss EAP 不同,后者在相同的条件下返回 401 或未授权的错误代码。

3.1.1. LdapExtended Login Module

LdapExtended(org.jboss.security.auth.spi.LdapExtLoginModule)是一个登录模块,它使用搜索来查找 LDAP 服务器上的 bind 用户和相关角色。角色以递归方式查询 DN,以浏览分层角色结构。对于将 LDAP 与安全域搭配使用时的绝大多数情形中,应使用 LdapExtended 登录模块,特别是对于非 Active Directory 的 LDAP 实施。有关 LdapExtended login 模块配置选项的完整列表,请参见 JBoss EAP 登录模块参考中的LdapExtended login 模块部分

验证过程如下:

  1. 使用 bind DNbindCredential 选项实现到 LDAP 服务器的初始绑定。bindDN 是一个 LDAP 用户,能够同时搜索 baseCtxDNrolesCtxDN 树以用户和角色搜索。要使用 baseFilter 属性指定的过滤器查询要对其进行身份验证的用户 DN。
  2. 生成的用户 DN 通过使用用户 DN 作为 InitialLdapContext 环境 上下文.SECURITY_PRINCIPAL 绑定到 LDAP 服务器来验证。Context.SECURITY_CREDENTIALS 属性设置为回调处理程序获取的 String 密码。

3.1.1.1. 配置安全域以使用 LdapExtended Login 模块

数据示例(LDIF 格式)

dn: uid=jduke,ou=Users,dc=jboss,dc=org
objectClass: inetOrgPerson
objectClass: person
objectClass: top
cn: Java Duke
sn: duke
uid: jduke
userPassword: theduke
# =============================
dn: uid=hnelson,ou=Users,dc=jboss,dc=org
objectClass: inetOrgPerson
objectClass: person
objectClass: top
cn: Horatio Nelson
sn: Nelson
uid: hnelson
userPassword: secret
# =============================
dn: ou=groups,dc=jboss,dc=org
objectClass: top
objectClass: organizationalUnit
ou: groups
# =============================
dn: uid=ldap,ou=Users,dc=jboss,dc=org
objectClass: inetOrgPerson
objectClass: person
objectClass: top
cn: LDAP
sn: Service
uid: ldap
userPassword: randall
# =============================
dn: ou=Users,dc=jboss,dc=org
objectClass: top
objectClass: organizationalUnit
ou: Users
# =============================
dn: dc=jboss,dc=org
objectclass: top
objectclass: domain
dc: jboss
# =============================
dn: uid=GroupTwo,ou=groups,dc=jboss,dc=org
objectClass: top
objectClass: groupOfNames
objectClass: uidObject
cn: GroupTwo
member: uid=jduke,ou=Users,dc=jboss,dc=org
uid: GroupTwo
# =============================
dn: uid=GroupThree,ou=groups,dc=jboss,dc=org
objectClass: top
objectClass: groupOfUniqueNames
objectClass: uidObject
cn: GroupThree
uid: GroupThree
uniqueMember: uid=GroupOne,ou=groups,dc=jboss,dc=org
# =============================
dn: uid=HTTP,ou=Users,dc=jboss,dc=org
objectClass: inetOrgPerson
objectClass: person
objectClass: top
cn: HTTP
sn: Service
uid: HTTP
userPassword: httppwd
# =============================
dn: uid=GroupOne,ou=groups,dc=jboss,dc=org
objectClass: top
objectClass: groupOfUniqueNames
objectClass: uidObject
cn: GroupOne
uid: GroupOne
uniqueMember: uid=jduke,ou=Users,dc=jboss,dc=org
uniqueMember: uid=hnelson,ou=Users,dc=jboss,dc=org

用于添加 LdapExtended Login 模块的 CLI 命令

/subsystem=security/security-domain=testLdapExtendedExample:add(cache-type=default)

/subsystem=security/security-domain=testLdapExtendedExample/authentication=classic:add

/subsystem=security/security-domain=testLdapExtendedExample/authentication=classic/login-module=LdapExtended:add(code=LdapExtended, flag=required, module-options=[ ("java.naming.factory.initial"=>"com.sun.jndi.ldap.LdapCtxFactory"),     ("java.naming.provider.url"=>"ldap://localhost:10389"), ("java.naming.security.authentication"=>"simple"),     ("bindDN"=>"uid=ldap,ou=Users,dc=jboss,dc=org"), ("bindCredential"=>"randall"),     ("baseCtxDN"=>"ou=Users,dc=jboss,dc=org"), ("baseFilter"=>"(uid={0})"), ("rolesCtxDN"=>"ou=groups,dc=jboss,dc=org"),     ("roleFilter"=>"(uniqueMember={1})"), ("roleAttributeID"=>"uid")])

reload

注意

显示的管理 CLI 命令假定您在运行 JBoss EAP 单机服务器。有关将管理 CLI 用于 JBoss EAP 受管域的更多详细信息,请参见 JBoss EAP管理 CLI 指南

3.1.1.1.1. 配置安全域以使用 LdapExtended Login 模块进行 Active Directory

对于 Microsoft Active Directory,可以使用 LdapExtended 登录模块。

以下示例显示了默认 Active Directory 配置的配置。某些 Active Directory 配置可能需要在端口 3268 上针对 Global Catalog 进行搜索,而不是通常的端口 389。这很可能是因为 Active Directory 林中包含多个域。

用于默认 AD 配置的 LdapExtended Login 模块配置示例

/subsystem=security/security-domain=AD_Default:add(cache-type=default)

/subsystem=security/security-domain=AD_Default/authentication=classic:add

/subsystem=security/security-domain=AD_Default/authentication=classic/login-module=LdapExtended:add(code=LdapExtended,flag=required,module-options=[ ("java.naming.provider.url"=>"ldap://ldaphost.jboss.org"),("bindDN"=>"JBOSSsearchuser"), ("bindCredential"=>"password"), ("baseCtxDN"=>"CN=Users,DC=jboss,DC=org"), ("baseFilter"=>"(sAMAccountName={0})"), ("rolesCtxDN"=>"CN=Users,DC=jboss,DC=org"), ("roleFilter"=>"(sAMAccountName={0})"), ("roleAttributeID"=>"memberOf"), ("roleAttributeIsDN"=>"true"), ("roleNameAttributeID"=>"cn"), ("searchScope"=>"ONELEVEL_SCOPE"), ("allowEmptyPasswords"=>"false")])

reload

以下示例在 Active Directory 中实施递归角色搜索。本例与默认 Active Directory 示例之间的主要区别在于,角色搜索已被替换,以使用用户的 DN 搜索 member 属性。然后,登录模块使用角色的 DN 来查找该组所属的组。

使用递归搜索进行默认 AD 配置的 LdapExtended Login 模块配置示例

/subsystem=security/security-domain=AD_Recursive:add(cache-type=default)

/subsystem=security/security-domain=AD_Recursive/authentication=classic:add

/subsystem=security/security-domain=AD_Recursive/authentication=classic/login-module=LdapExtended:add(code=LdapExtended,flag=required,module-options=[("java.naming.provider.url"=>"ldap://ldaphost.jboss.org"), ("java.naming.referral"=>"follow"), ("bindDN"=>"JBOSSsearchuser"), ("bindCredential"=>"password"), ("baseCtxDN"=>"CN=Users,DC=jboss,DC=org"), ("baseFilter"=>"(sAMAccountName={0})"), ("rolesCtxDN"=>"CN=Users,DC=jboss,DC=org"), ("roleFilter"=>"(member={1})"), ("roleAttributeID"=>"cn"), ("roleAttributeIsDN"=>"false"), ("roleRecursion"=>"2"), ("searchScope"=>"ONELEVEL_SCOPE"), ("allowEmptyPasswords"=>"false")])

reload

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.