第 3 章 旧安全子系统
3.1. 配置安全域以使用 LDAP
安全域可以配置为使用 LDAP 服务器进行身份验证和授权,方法是使用登录模块。JBoss EAP 安全架构指南 介绍了安全域和登录模块的基础知识。LdapExtended 是与 LDAP 服务器(包括 Active Directory)集成的首选登录模块,但也可以使用其他几个 LDAP 登录模块。特别是,Ldap、Adap 和 AdvancedAdap 登录模块也可用于配置安全域以使用 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 模块部分。
验证过程如下:
-
使用 bind
DN
和bindCredential
选项实现到 LDAP 服务器的初始绑定。bindDN
是一个 LDAP 用户,能够同时搜索baseCtxDN
和rolesCtxDN
树以用户和角色搜索。要使用baseFilter
属性指定的过滤器查询要对其进行身份验证的用户 DN。 -
生成的用户 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