本文提供一個以Shibboleth與阿里云進行用戶SSO的示例,幫助您理解企業IdP與阿里云進行SSO的端到端配置流程。
準備工作
安裝Shibboleth、Tomcat和LDAP Server。
配置LDAP Server。
為了更好地演示示例,在LDAP中添加一個管理員賬號,DN為
uid=admin,ou=system
,密碼為secret
。在LDAP中添加一個測試賬號,DN為
cn=Test User,ou=users,dc=wimpi,dc=net
,密碼為secret
,具體信息如下圖所示。用戶信息字段:
mail:對應阿里云的RAM用戶登錄名稱。
memberof:對應于阿里云的RAM角色名稱。
samaccountname:用于配置登錄Shibboleth的用戶名。
userpassword:登錄的密碼。
配置Shibboleth連接LDAP Server。
修改
/opt/shibboleth-idp/conf/ldap.properties
文件的以下數據:# LDAP認證模式 idp.authn.LDAP.authenticator = bindSearchAuthenticator # LDAP的地址 idp.authn.LDAP.ldapURL = ldaps://[LDAP服務地址]:389 # 禁用TSL和SSL idp.authn.LDAP.useStartTLS = false idp.authn.LDAP.useSSL = false # 基本搜索目錄 idp.authn.LDAP.baseDN = dc=wimpi,dc=net idp.authn.LDAP.subtreeSearch = true # 登錄匹配規則,samaccountname是用戶數據中的字段,用于登錄LDAP。 idp.authn.LDAP.userFilter= (samaccountname={user}) # admin賬戶和密碼 idp.authn.LDAP.bindDN = uid=admin,ou=system idp.authn.LDAP.bindDNCredential = secret idp.attribute.resolver.LDAP.searchFilter =(samaccountname=$resolutionContext.principal)
本文中涉及的Shibboleth配置部分屬于建議,僅用于幫助理解阿里云SSO登錄的端到端配置流程,阿里云不提供Shibboleth配置的咨詢服務。
步驟一:在阿里云獲取SAML服務提供商元數據
使用阿里云賬號登錄RAM控制臺。
在左側導航欄,選擇 。
在SSO管理頁面,單擊用戶SSO頁簽。
在SSO登錄設置區域,復制SAML服務提供商元數據URL。
在新的瀏覽器窗口中打開復制的鏈接,將元數據XML文件另存到
/opt/shibboleth-idp/metadata/aliyun-ram-user-metadata.xml
。說明元數據XML文件保存了阿里云作為一個SAML服務提供商的訪問信息。您需要記錄XML文件中
EntityDescriptor
元素的entityID
屬性值,以便后續在Shibboleth的配置中使用。
步驟二:將阿里云注冊到Shibboleth
配置/opt/shibboleth-idp/conf/metadata-providers.xml
,指定步驟一:在阿里云獲取SAML服務提供商元數據獲取的元數據文件,將阿里云注冊到Shibboleth。
<!--
<MetadataProvider id="LocalMetadata" xsi:type="FilesystemMetadataProvider" metadataFile="PATH_TO_YOUR_METADATA"/>
-->
<!-- 找到上方注釋代碼,替換為下方代碼 -->
<MetadataProvider id="AliyunMetadata" xsi:type="FilesystemMetadataProvider" metadataFile="%{idp.home}/metadata/aliyun-ram-user-metadata.xml"/>
步驟三:配置Shibboleth返回的用戶屬性
修改
/opt/shibboleth/conf/services.xml
。原版使用的是
attribute-resolver.xml
配置文件,包含的配置信息不夠,需要啟動完整版的配置,將其替換為attribute-resolver-full.xml
。<value>%{idp.home}/conf/attribute-resolver.xml</value> <!-- 找到上方代碼,替換為下方代碼 --> <value>%{idp.home}/conf/attribute-resolver-full.xml</value>
修改
/opt/shibboleth/conf/attribute-resolver-full.xml
。在該文件中配置用戶信息中返回的屬性。本示例中選擇
mail
字段作為返回屬性。<!-- ========================================== --> <!-- Attribute Definitions --> <!-- ========================================== --> <!-- Schema: Core schema attributes--> <!-- 找到上方注釋代碼,在后面加入下方代碼 --> <AttributeDefinition xsi:type="Simple" id="mail"> <InputDataConnector ref="myLDAP" attributeNames="mail" /> <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>
在該文件中讀取
/opt/shibboleth/conf/ldap.properties
中配置的信息,進行IDAP連接的創建。<!-- Example LDAP Connector --> <!-- <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}" useStartTLS="%{idp.attribute.resolver.LDAP.useStartTLS:true}" ...省略... </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}" useStartTLS="%{idp.attribute.resolver.LDAP.useStartTLS}" connectTimeout="%{idp.attribute.resolver.LDAP.connectTimeout}" responseTimeout="%{idp.attribute.resolver.LDAP.responseTimeout}"> <FilterTemplate> <![CDATA[ %{idp.attribute.resolver.LDAP.searchFilter} ]]> </FilterTemplate> </DataConnector>
修改
/opt/shibboleth/conf/attribute-filter.xml
,添加屬性過濾器。將
PolicyRequirementRule
標簽中的value
屬性替換為步驟一:在阿里云獲取SAML服務提供商元數據中的阿里云entityID
。<AttributeFilterPolicyGroup id="ShibbolethFilterPolicy" xmlns="urn:mace:shibboleth:2.0:afp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mace:shibboleth:2.0:afp http://shibboleth.net/schema/idp/shibboleth-afp.xsd"> <!-- 找到上方代碼,在后面加入下方代碼 --> <AttributeFilterPolicy id="aliyun"> <PolicyRequirementRule xsi:type="Requester" value="[entityID]" /> <AttributeRule attributeID="mail"> <PermitValueRule xsi:type="ANY" /> </AttributeRule> </AttributeFilterPolicy>
步驟四:配置SAML響應的NameID
修改
/opt/shibboleth/conf/relying-party.xml
,為阿里云建立NameID的配置。將
bean
標簽中的relyingPartyIds
屬性替換為步驟一:在阿里云獲取SAML服務提供商元數據中的阿里云entityID
。<!-- Override example that identifies a single RP by name and configures it for SAML 2 SSO without encryption. This is a common "vendor" scenario. --> <!-- <bean parent="RelyingPartyByName" c:relyingPartyIds="https://sp.example.org"> <property name="profileConfigurations"> <list> <bean parent="SAML2.SSO" p:encryptAssertions="false" /> </list> </property> </bean> --> <!-- 找到上方注釋代碼,替換為下方代碼 --> <bean parent="RelyingPartyByName" c:relyingPartyIds="[entityID]"> <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>
修改
/opt/shibboleth/conf/saml-nameid.xml
,配置NameID的生成方式。<!-- 找到下方兩處代碼,將其注釋取消,使之生效 --> <bean parent="shibboleth.SAML2AttributeSourcedGenerator" p:omitQualifiers="true" p:format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" p:attributeSourceIds="#{ {'mail'} }" /> <bean parent="shibboleth.SAML1AttributeSourcedGenerator" p:omitQualifiers="true" p:format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" p:attributeSourceIds="#{ {'mail'} }" />
修改
/opt/shibboleth/conf/saml-nameid.properties
,配置NameID的相關屬性。idp.nameid.saml2.default = urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress idp.persistentId.useUnfilteredAttributes = true idp.persistentId.encoding = BASE32
步驟五:在Shibboleth獲取SAML IdP元數據
重啟Tomcat,使前面的配置生效。
訪問
https:///<您的服務器地址>/idp/shibboleth
,將元數據文件保存到本地。
步驟六:在阿里云開啟用戶SSO
在RAM控制臺的左側導航欄,選擇 。
在SSO管理頁面,單擊用戶SSO頁簽。
在SSO登錄設置區域,單擊編輯。
在編輯SSO登錄設置面板的SSO功能狀態區域,單擊開啟。
說明用戶SSO是一個全局功能,開啟后,所有RAM用戶都需要使用SSO登錄。 如果您是通過RAM用戶配置的,請先保留為關閉狀態,您需要先完成RAM用戶的創建,以免配置錯誤導致自己無法登錄。您也可以通過阿里云賬號(主賬號)進行配置來規避此問題。
在元數據文檔區域,單擊上傳文件,上傳從步驟五:在Shibboleth獲取SAML IdP元數據中獲取的IdP元數據文件。
在輔助域名區域,單擊開啟,并配置輔助域名為Shibboleth中的用戶名Email后綴。
在本示例中為
testdomain.alicloud.com
。單擊確定。
步驟七:在阿里云創建RAM用戶
在RAM控制臺的左側導航欄,選擇 。
在用戶頁面,單擊創建用戶。
在創建用戶頁面,輸入登錄名稱和顯示名稱。
說明請確保RAM用戶的登錄名稱前綴與Shibboleth中的用戶名Email前綴保持一致,本示例中為testUser。
在訪問方式區域,選擇控制臺訪問,并設置登錄密碼等參數。
單擊確定。
驗證結果
完成上述配置后,您可以從阿里云或Shibboleth發起SSO登錄。
從阿里云側發起登錄
在RAM控制臺的概覽頁,復制RAM用戶的登錄地址。
將鼠標懸停在右上角頭像的位置,單擊退出登錄或使用新的瀏覽器打開復制的RAM用戶登錄地址。
單擊使用企業賬號登錄,系統會自動跳轉到Shibboleth的登錄頁面。
在Shibboleth的登錄界面,輸入用戶名(testUser)和密碼,單擊登錄。
系統將自動SSO登錄并重定向到阿里云控制臺首頁。
從Shibboleth側發起登錄
訪問
https://<您的服務器地址>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID>
。該鏈接中的
<entityID>
為步驟一:在阿里云獲取SAML服務提供商元數據中的阿里云entityID
。在Shibboleth的登錄界面,輸入用戶名(testUser)和密碼,單擊登錄。
系統將自動SSO登錄并重定向到阿里云控制臺首頁。
常見問題
結果驗證時如果遇到問題,您可以查看/opt/shibboleth-idp/logs/idp-process.log
,通過日志分析問題原因。常見問題如下:
Shibboleth用戶名密碼正確,但是登錄后提示異常。
查看/opt/shibboleth-idp/logs/idp-process.log
中的報錯信息,如果是與ValidateUsernamePassword
錯誤有關,則重點檢查IDAP的連接配置和部署情況,重點查看是否將注釋去除,且不能輸入多余空格。
登錄后無響應,提示unable to connect to the ldap
。
檢查ldap.properties
和attribute-resolver-full.xml
文件中IDAP連接的相關配置。
登錄后轉跳阿里云,提示The NameID is missing
。
檢查步驟三:配置Shibboleth返回的用戶屬性中是否正確將用戶信息中的mail
映射為屬性,檢查步驟四:配置SAML響應的NameID中NameID
配置是否正確。
訪問https://<您的服務器地址>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID>
時提示Unsupported Request
。
檢查entityId
是否配置正確。metadata
文件夾下的元數據、attribute-filter.xml
和relying-party.xml
三處中的entityId
必須保持一致。
登錄后轉跳阿里云,提示The response signature is invalid
。
重新將Shibboleth的元數據文件上傳到阿里云。