Shibboleth简介
Shibboleth是一个基于标准的,实现组织内部或跨组织的网页单点登录的开源软件包。它允许站点为处于私有保护方式下的受保护的在线资源做出被通知的认证决定。
Shibboleth软件工具广泛使用联合的身份标准,主要是OASIS安全声称标记语言(SAML),来提供一个联合单点登录和属性交换框架。一个用户用他的组织的证书认证,组织(或IdP)传送最少的必要的身份信息给SP实现认证决定。Shibboleth也提供扩展的隐私功能,允许一个用户和他们的主站点来控制释放给每一个应用的属性。
Shibboleth项目作为一个Internet2中间件活动启动于2000年,这年晚些时候该项目和OASIS SAML工作组的工作相联系。Shibboleth1.0 于2003年发布,并快速被全世界的研究和教育机构使用。随着2005年SAML2.0的发布,2006年Shibboleth2.0也发布,SAML标准升级到包含所有的多边,由Shibboleth首创的元数据驱动方法。
Shibboleth作为开源软件开发,在Apache 软件许可证下发布。关于个别部件的更多信息可以在产品页面看到。
JAAS简介
Java Authentication Authorization Service(JAAS,Java验证和授权API)提供了灵活和可伸缩的机制来保证客户端或服务器端的Java程序。Java早期的安全框架强调的是通过验证代码的来源和作者,保护用户避免受到下载下来的代码的攻击。JAAS强调的是通过验证谁在运行代码以及他/她的权限来保护系统免受用户的攻击。它让你能够将一些标准的安全机制,例如Solaris NIS(网络信息服务)、Windows NT、LDAP(轻量目录存取协议),Kerberos等通过一种通用的,可配置的方式集成到系统当中去。
配置 Shibboleth
可将 Shibboleth 配置为 阿里云 中企业登录的身份提供者 (IDP)。配置过程包含两个主要步骤:将企业级 IDP 注册到 阿里云,以及将 阿里云 注册到企业级 IDP。
前提条件
当以Shibboleth 配置为阿里云中企业登录的身份提供者(IDP)时,登陆者身份需要在阿里云存在,例如如果以abc@testdomain.com身份登录,那么在阿里云上必须绑定testdomain.com的域名并验证,并且存在abc这个用户。
阿里云需要的信息
当用户使用企业登录帐户进行登录时,阿里云 需要从 IDP 处接收某些属性信息。NameID 属性为强制属性,并且必须由您的 IDP 在 SAML 响应中发送,才能使 阿里云 的联合身份验证起作用。由于 阿里云 使用 NameID 的值唯一标识指定用户,因此建议使用常量值来唯一标识用户。
注册Shibboleth为阿里云IDP
将%{idp.home}/metadata/idp-metadata.xml上传到阿里云
企业控制台->人员目录->目录设置->SSO设置
将阿里云注册到Shibboleth
1.将阿里云配置为Shibboleth的依赖方
a)配置metadata-providers.xml
<MetadataProvider id="AliyunMetadata" xsi:type="FilesystemMetadataProvider" metadataFile="%{idp.home}/metadata/aliyun-metadata.xml"/>
先下载阿里云账号的SP Metadata XML文档:进入RAM控制台 > 人员管理 > 设置 > 高级设置,在SSO 登录设置下可以查看当前云账号的SAML 服务提供方元数据 URL。从该URL下载内容并保存到aliyun-metadata.xml,并拷贝到%{idp.home}/metadata/aliyun-metadata.xml。
b)将%{idp.home}/metadata/idp-metadata.xml上传到阿里云
RAM控制台 > 人员管理 > 设置 > 高级设置 > SSO 登录设置。
2.配置JAAS(JAAS 是 Java Authentication Authorization Service)
一个jaas实现的demo为https://github.com/tauceti2/jaas-rdbms
编译后将tagishauth.jar拷贝到{%CATALINA_HOME}/lib/目录下
编辑password_authn_config.xml修改代码片段为
<import resource="jaas-authn-config.xml" />
<!-- <import resource="krb5-authn-config.xml" /> -->
<!-- <import resource="ldap-authn-config.xml" /> -->
修改jaas.config为
ShibUserPassAuth {
/*
com.sun.security.auth.module.Krb5LoginModule required;
*/
com.tagish.auth.DBLogin required debug=true
dbDriver="com.mysql.jdbc.Driver"
dbURL="jdbc:mysql://{host}:{port}/{db_name}"
dbUser="{dbuser}"
dbPassword="{dbpassword}"
userTable="{usertableName}"
userColumn="{userColumn}"
passColumn="{passColumn}";
};
注:请将{host} {port} 等信息修改为正确的数据库配置
配置好了jaas即可以完成shibboleth的认证过程,上述例子提供一个jaas的demo,如需要定制实现请详细了解jaas的原理并提供相应的LoginModule打包成jar包,并修改相应的jaas.config配置
3.配置将由Shibboleth返回的用户属性
a)下载需要的lib
下载commons-dbcp-1.4.jar,commons-pool-1.6.jar,mysql-connector-java-5.1.45-bin.jar并拷贝到 ${CATALINA_HOME}/lib目录下
增加返回属性的数据源
b)global.xml
<bean id="MyDataSource" class="org.apache.commons.dbcp.BasicDataSource"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://{host}:{port}/{dbname}?autoReconnect=true"
p:username="{username}"
p:password="{password}"
p:testOnBorrow="true"
p:validationQuery="select 1"
p:validationQueryTimeout="5" />
c)attribute-resolver.xml
增加lmysql解析NameID映射过来的属性,例如以mail为NameID则增加属性
<AttributeDefinition xsi:type="Simple" id="mail" sourceAttributeID="mail">
<Dependency ref="myDatabase" />
<AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:mail" encodeType="false" />
<AttributeEncoder xsi:type="SAML2String" name="urn:oid:0.9.2342.19200300.100.1.3" friendlyName="mail" encodeType="false" />
</AttributeDefinition>
<DataConnector id="myDatabase" xsi:type="RelationalDatabase">
<BeanManagedConnection>MyDataSource</BeanManagedConnection>
<QueryTemplate>
<![CDATA[
SELECT * FROM {usertable} WHERE {username}='$resolutionContext.principal'
]]>
</QueryTemplate>
<Column columnName="{email}" attributeID="mail" />
</DataConnector>
d)attribute-filter.xml
增加属性过滤器
<AttributeFilterPolicy id="aliyun">
<PolicyRequirementRule xsi:type="Requester" value="https://signin.aliyun.com/saml/SSO" />
<AttributeRule attributeID="<NameID Attribute>">
<PermitValueRule xsi:type="ANY" />
</AttributeRule>
<AttributeRule attributeID="givenName">
<PermitValueRule xsi:type="ANY" />
</AttributeRule>
<AttributeRule attributeID="mail">
<PermitValueRule xsi:type="ANY" />
</AttributeRule>
</AttributeFilterPolicy>
</AttributeFilterPolicy>
4.修改relaying-party.xml
<util:list id="shibboleth.RelyingPartyOverrides">
<!--增加Aliyun RelyintParty -->
<bean parent="RelyingPartyByName" c:relyingPartyIds="https://signin.aliyun.com/<account-id>/saml/SSO">
<property name="profileConfigurations">
<list>
<bean parent="SAML2.SSO" p:encryptAssertions="false" p:nameIDFormatPrecedence="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" />
</list>
</property>
</bean>
<!--增加结束 -->
</util:list>
5.修改saml-nameid.xml
配置NameID产生的方式
<!-- SAML 2 NameID Generation -->
<util:list id="shibboleth.SAML2NameIDGenerators">
<bean parent="shibboleth.SAML2AttributeSourcedGenerator"
p:format="urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified"
p:attributeSourceIds="#{ {'your-name-id-attribute'} }" />
</util:list>
6.重新启动 Shibboleth后台程序(Linux)或者(Windows)服务
小结
到此 我们完成了Shibboleth到阿里云的打通过程,效果如下