IdP认证对接及属性定义(LDAP)(ova第3/6步,手动第3/9步)
本文档介绍了采用CARSI IdP标准安装包对接LDAP认证和属性定义的配置步骤,适用于本地采用LDAP认证的情况。下一步:配置eduPersonTargetedID属性定义。
LDAP认证配置
[root@www ~]# vi /opt/shibboleth-idp/conf/ldap.properties idp.authn.LDAP.authenticator = bindSearchAuthenticator # 采用 bindDN + bindDnCredential 方式,先 Search 用户 DN,再认证的模式 idp.authn.LDAP.ldapURL = ldap://ldap服务器IP地址 idp.authn.LDAP.useStartTLS = false idp.authn.LDAP.sslConfig = jvmTrust idp.authn.LDAP.baseDN = ou=People,dc=Test,dc=Test #本地ldap配置中人员所在分支 idp.authn.LDAP.bindDN = cn=Manager,dc=Test,dc=Test #登录本地ldap服务器的用户名 idp.authn.LDAP.bindDNCredential = 密码 #登录本地ldap服务器的密码 idp.authn.LDAP.subtreeSearch = true #本地ldap是否允许搜索子树 idp.authn.LDAP.userFilter = (uid={user}) #用哪个属性唯一标识用户,即用户登录的用户名对应 LDAP 内的哪条属性。示例中为“uid”,如果您使用 AD 作为 LDAP,那么这里通常需要修改为(sAMAccountName={user}) idp.attribute.resolver.LDAP.searchFilter = (uid=$resolutionContext.principal) #“uid”用法与上一行相同,根据本地ldap的实际配置修改为对应的用户标识属性名
因LDAP服务器配置差异,请和本地LDAP管理员确认以上配置,需要了解本校LDAP的目录结构以及字段定义后再做修改。以上属性在ldap.properties文件中已经定义好,请勿直接拷贝添加到ldap.properties,会造成属性重复定义,其他未提到的属性按照ldap.properties默认配置即可。
如果LDAP中不是用“uid”来唯一区别用户,请修改成本地LDAP中采用的用户标识名。比如在使用 AD 的情况下,通常使用 sAMAccountName 作为唯一标识,则该部分的配置应该如下所示
idp.authn.LDAP.userFilter = (sAMAccountName={user}) idp.attribute.resolver.LDAP.searchFilter = (sAMAccountName=$resolutionContext.principal)
注:强烈建议先在IdP所在的服务器上测试一下对本校LDAP的连接性,以及查看一下LDAP管理员提供的属性及其取值是否正确。华东师范大学冯骐老师分享了一个轻量级的 LDAP测试工具 https://github.com/shanghai-edu/ldap-test-tool , 可以用来进行测试。或使用类似LDAP Browser或LDAP Admin这样的工具,在IdP所在服务器进行验证,以排除环境问题的影响。
登录界面提示信息修改
登录错误信息显示,默认用户名错误显示:The username you entered cannot be identified;默认密码错误显示:The password you entered was incorrect。需要修改默认显示,降低根据提示猜测用户名密码的风险。
[root@www ~]# vi /opt/shibboleth-idp/messages/messages.properties # 新增 bad-username.message = Login error bad-password.message = Login error
防止爆破攻击
shibboleth idp3.3以上版本(ova安装方式idp版本为3.4.3,支持此配置)提供了账号锁定的功能,当账号错误登录达到一定次数时,自动锁定账号一段时间,具体配置如下
[root@www ~]# vi /opt/shibboleth-idp/conf/authn/password-authn-config.xml #取消注释,修改p:lockoutDuration="PT5M"为p:lockoutDuration="PT30M",增加账号锁定时间 <bean id="shibboleth.authn.Password.AccountLockoutManager" parent="shibboleth.StorageBackedAccountLockoutManager" p:maxAttempts="5" p:counterInterval="PT5M" p:lockoutDuration="PT30M" p:extendLockoutDuration="false" />
p:maxAttempts="5"表示最大5次尝试
p:counterInterval="PT5M"表示5分钟内达到最大尝试次数
p:lockoutDuration="PT30M"表示锁定账号时间30分钟
账号锁定的依据是用户ip和登录的账号。如果某个账号在某台电脑上被锁定了,但另外一台电脑仍可以正常使用。
配置属性定义
用以下内容替换/opt/shibboleth-idp/conf/attribute-resolver.xml文件。
eduPersonScopedAffiliation属性,取值为用户在学校的身份,其中的“userType”为本地LDAP中确定用户身份的属性名称,请替换成实际使用的属性名。关于身份属性取值,需要将本地用户身份的取值,对应到CARSI联盟标准取值,包括:faculty(教师),student(学生),staff(教工),employee(雇员),member(各类人员,包括faculty、student、staff、employee),alum(校友),affiliate(附属人员或临聘,常用),other(CARSI补充,不建议优先使用)。下文样例,将所有的本地用户区分为“staff”、“student”、“member”三种身份。学校可根据本地LDAP实际部署情况选取其中的一部分值。不同SP对用户身份的要求不同,建议配置时尽可能细化用户身份分类,避免后期修改配置。
目前对于ldap中用目录来区分用户身份的情况,建议还是在ldap中添加描述用户身份的字段,再进行配置。
eduPersonPrincipalName属性,在CARSI联盟中,目前只做属性定义,供生成eduPersonTargetID使用,不进行直接属性释放。
<?xml version="1.0" encoding="UTF-8"?> <AttributeResolver xmlns="urn:mace:shibboleth:2.0:resolver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mace:shibboleth:2.0:resolver http://shibboleth.net/schema/idp/shibboleth-attribute-resolver.xsd"> <AttributeDefinition xsi:type="ScriptedAttribute" id="eduPersonScopedAffiliation"> <InputDataConnector ref="myLDAP" attributeNames="usertype"/> <Script><![CDATA[ var localpart = ""; if(usertype.getValues().get(0)=="staf") localpart = "staff"; else if(usertype.getValues().get(0)=="std") localpart = "student"; else localpart = "member"; eduPersonScopedAffiliation.addValue(localpart + "@%{idp.scope}"); ]]></Script> <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:eduPersonScopedAffiliation" encodeType="false" /> <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.9" friendlyName="eduPersonScopedAffiliation" encodeType="false" /> </AttributeDefinition> <AttributeDefinition xsi:type="Scoped" id="eduPersonPrincipalName" scope="%{idp.scope}"> <InputAttributeDefinition ref="uid" /> <AttributeEncoder xsi:type="SAML1ScopedString" name="urn:mace:dir:attribute-def:eduPersonPrincipalName" encodeType="false" /> <AttributeEncoder xsi:type="SAML2ScopedString" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" friendlyName="eduPersonPrincipalName" encodeType="false" /> </AttributeDefinition> <AttributeDefinition id="uid" xsi:type="PrincipalName"> <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:uid" encodeType="false" /> <AttributeEncoder xsi:type="SAML2String" name="urn:oid:0.9.2342.19200300.100.1.1" friendlyName="uid" encodeType="false" /> </AttributeDefinition> <AttributeDefinition id="eduPersonEntitlement" xsi:type="Simple"> <InputDataConnector ref="staticAttributes" attributeNames="eduPersonEntitlement" /> <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:eduPersonEntitlement" encodeType="false"/> <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.7" friendlyName="eduPersonEntitlement" encodeType="false"/> </AttributeDefinition> <DataConnector id="staticAttributes" xsi:type="Static"> <Attribute id="eduPersonEntitlement"> <Value>urn:mace:dir:entitlement:common-lib-terms</Value> </Attribute> </DataConnector> <DataConnector id="myLDAP" xsi:type="LDAPDirectory" ldapURL="%{idp.attribute.resolver.LDAP.ldapURL}" baseDN="%{idp.attribute.resolver.LDAP.baseDN}" principal="%{idp.attribute.resolver.LDAP.bindDN}" principalCredential="%{idp.attribute.resolver.LDAP.bindDNCredential}" connectTimeout="%{idp.attribute.resolver.LDAP.connectTimeout}" responseTimeout="%{idp.attribute.resolver.LDAP.responseTimeout}"> <FilterTemplate> <![CDATA[ %{idp.attribute.resolver.LDAP.searchFilter} ]]> </FilterTemplate> <ConnectionPool minPoolSize="%{idp.pool.LDAP.minSize:3}" maxPoolSize="%{idp.pool.LDAP.maxSize:10}" blockWaitTime="%{idp.pool.LDAP.blockWaitTime:PT3S}" validatePeriodically="%{idp.pool.LDAP.validatePeriodically:true}" validateTimerPeriod="%{idp.pool.LDAP.validatePeriod:PT5M}" expirationTime="%{idp.pool.LDAP.idleTime:PT10M}" failFastInitialize="%{idp.pool.LDAP.failFastInitialize:false}" /> </DataConnector> </AttributeResolver>
下一步:配置eduPersonTargetedID属性定义。
版权所有©北京大学计算中心