このトピックでは、Shibboleth と Alibaba Cloud 間のユーザーベースシングルサインオン (SSO) を設定する、エンドツーエンドのプロセスを説明します。
事前準備
-
Shibboleth、Tomcat、および Lightweight Directory Access Protocol (LDAP) サーバーをインストールします。
-
LDAP サーバーを設定します。
この例では、識別名 (DN) が
uid=admin,ou=systemで、パスワードがsecretの管理者アカウントを LDAP に追加します。DN が
cn=Test User,ou=users,dc=wimpi,dc=netで、パスワードがsecretのテストアカウントを LDAP に追加します。アカウントの詳細は、次の図のとおりです。
ユーザー情報フィールドは次のとおりです。
-
mail: Alibaba Cloud の RAM ユーザーのログイン名に対応します。
-
memberof: ユーザーが所属する LDAP グループを示します。
-
samaccountname: Shibboleth へのログインに使用されるユーザー名です。
-
userpassword: ログインパスワードです。
-
-
Shibboleth が LDAP サーバーに接続するように設定します。
/opt/shibboleth-idp/conf/ldap.propertiesファイルで次の設定を変更します。# LDAP 認証モード idp.authn.LDAP.authenticator = bindSearchAuthenticator # LDAP サーバーアドレス idp.authn.LDAP.ldapURL = ldaps://[LDAP-server-address]:389 # TLS と 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}) # 管理者アカウントとパスワード idp.authn.LDAP.bindDN = uid=admin,ou=system idp.authn.LDAP.bindDNCredential = secret idp.attribute.resolver.LDAP.searchFilter =(samaccountname=$resolutionContext.principal)
このトピックで紹介する Shibboleth の設定は、Alibaba Cloud での SSO 設定のエンドツーエンドプロセスを説明するためのデモンストレーションです。Alibaba Cloud は、Shibboleth の設定に関するコンサルティングサービスを提供していません。
ステップ 1:Alibaba Cloud から SAML SP メタデータを取得
-
RAM 管理者として RAM コンソールにログインします。
-
左側のナビゲーションペインで、 を選択します。
-
ユーザーベースの SSO ログイン方式 タブをクリックします。SAML サービスプロバイダーメタデータ URL セクションで、Alibaba Cloud アカウントのメタデータ URL をコピーします。
-
コピーした URL を新しいブラウザウィンドウで開きます。ページを XML ファイルとして
/opt/shibboleth-idp/metadata/aliyun-ram-user-metadata.xmlに保存します。説明EntityDescriptor要素からentityID属性値を記録してください。この値は、後続の Shibboleth 設定で必要になります。
ステップ 2:Alibaba Cloud を Shibboleth に登録
「ステップ 1:Alibaba Cloud から SAML SP メタデータを取得」のメタデータファイルを指すように、/opt/shibboleth-idp/conf/metadata-providers.xml ファイルを設定します。これにより、Alibaba Cloud が 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"/>
ステップ 3:Shibboleth が返すユーザー属性の設定
-
/opt/shibboleth-idp/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-idp/conf/attribute-resolver-full.xmlファイルを変更します。-
ユーザー情報で返す属性を定義します。この例では、
mail属性を返します。<!-- ========================================== --> <!-- 属性定義 --> <!-- ========================================== --> <!-- スキーマ:コアスキーマ属性--> <!-- 上記のコメントアウトされたコードブロックを見つけて、その後に次のコードを追加します。 --> <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-idp/conf/ldap.propertiesの設定を使用して LDAP 接続を設定します。<!-- LDAP コネクタの例 --> <!-- <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}" ...omitted... </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-idp/conf/attribute-filter.xmlファイルを変更して、属性フィルターを追加します。「ステップ 1:Alibaba Cloud から SAML SP メタデータを取得」で取得した Alibaba Cloud の
entityIDで、PolicyRequirementRuleタグのvalue属性を置き換えます。<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>
ステップ 4:SAML NameID の設定
-
/opt/shibboleth-idp/conf/relying-party.xmlファイルを変更して、Alibaba Cloud の NameID を設定します。「ステップ 1:Alibaba Cloud から SAML SP メタデータを取得」で取得した Alibaba Cloud の
entityIDで、beanタグのrelyingPartyIds属性を置き換えます。<!-- 単一の RP を名前で識別し、暗号化なしで SAML 2 SSO 用に設定するオーバーライドの例です。これは一般的な「ベンダー」シナリオです。 --> <!-- <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-idp/conf/saml-nameid.xmlファイルを変更して、NameID の生成方法を設定します。<!-- 以下の 2 つのコードブロックを見つけてコメントを解除し、設定を適用します。 --> <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-idp/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
ステップ 5:Shibboleth から SAML IdP メタデータを取得
-
Tomcat を再起動して設定を適用します。
-
https://<your-server-address>/idp/shibbolethにアクセスし、メタデータファイルをローカルコンピューターに保存します。
ステップ 6:Alibaba Cloud でユーザーベース SSO を有効化
-
RAM コンソールの左側のナビゲーションペインで、 を選択します。
-
ユーザーベースの SSO ログイン方式 タブをクリックします。SSO 機能ステータス セクションで、有効 をクリックします。
説明ユーザーベース SSO はグローバルな機能です。有効にすると、すべての RAM ユーザーは SSO を使用してログインする必要があります。RAM ユーザーとして SSO を設定している場合は、この機能を当面無効にしておいてください。設定ミスによるロックアウトを避けるために、まず必要な RAM ユーザーを作成する必要があります。あるいは、Alibaba Cloud アカウントを使用して SSO を設定することで、この問題を回避できます。
-
メタデータファイル セクションで、メタデータドキュメントをアップロード をクリックし、「ステップ 5:Shibboleth から SAML IdP メタデータを取得」で取得した IdP メタデータファイルをアップロードします。
-
補助ドメイン名 セクションで、編集する をクリックし、補助ドメイン名を有効にして、Shibboleth のユーザーのメールのサフィックスに設定します。
この例では、値は
testdomain.alicloud.comです。
ステップ 7:Alibaba Cloud で RAM ユーザーを作成
-
RAM コンソールの左側のナビゲーションペインで、を選択します。
-
ユーザー ページで、ユーザーの作成 をクリックします。
-
ユーザーの作成 ページで、ログイン名 と 表示名 を入力します。
説明RAM ユーザーのログイン名のプレフィックスが、Shibboleth のユーザーのメールのプレフィックスと一致していることを確認してください。この例では、プレフィックスは testUser です。
-
アクセスモード セクションで コンソールへのアクセス を選択し、ログインパスワードとその他のパラメーターを設定します。
-
OK をクリックします。
結果の検証
設定が完了したら、Alibaba Cloud または Shibboleth のいずれかから SSO ログインを開始できます。
Alibaba Cloud からの SSO の開始
-
RAM コンソールの 概要 ページで、RAM ユーザーのログイン URL をコピーします。
-
右上隅のプロフィール画像にカーソルを合わせ、[ログアウト] をクリックするか、コピーした RAM ユーザーのログイン URL を新しいブラウザウィンドウで開きます。
-
[エンタープライズ IdP アカウントでログイン] をクリックします。Shibboleth のログインページにリダイレクトされます。

-
Shibboleth のログインページで、ユーザー名 (testUser) とパスワードを入力し、[Log On] をクリックします。
SSO を介して自動的にログインし、Alibaba Cloud コンソールのホームページにリダイレクトされます。
Shibboleth からの SSO の開始
-
https://<your-server-address>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID>にアクセスします。URL 内の
<entityID>は、「ステップ 1:Alibaba Cloud から SAML SP メタデータを取得」で取得した Alibaba Cloud のentityIDです。 -
Shibboleth のログインページで、ユーザー名 (testUser) とパスワードを入力し、[Log On] をクリックします。
SSO を介して自動的にログインし、Alibaba Cloud コンソールのホームページにリダイレクトされます。
よくある質問
検証中に問題が発生した場合は、/opt/shibboleth-idp/logs/idp-process.log で原因を確認してください。一般的な問題は次のとおりです。
正しい認証情報でのログインエラー
/opt/shibboleth-idp/logs/idp-process.log のエラーメッセージを確認します。エラーが ValidateUsernamePassword に関連している場合は、LDAP 接続の設定とデプロイを確認してください。必要なすべてのコードがコメント解除されており、余分なスペースがないことを確認してください。
ログイン後にレスポンスがなく、unable to connect to the ldap というエラーが表示される
unable to connect to the ldapldap.properties と attribute-resolver-full.xml の LDAP 接続設定を確認します。
ログイン後に Alibaba Cloud へリダイレクトされる際のエラー: The NameID is missing.
The NameID is missing「ステップ 3:Shibboleth が返すユーザー属性の設定」で mail フィールドが属性として正しくマッピングされていること、および「ステップ 4:SAML NameID の設定」で NameID が正しく設定されていることを確認してください。
https://<your server address>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID> へのアクセス時に Unsupported Request が表示される
Unsupported RequestentityId が正しく設定されていることを確認してください。entityId は、metadata フォルダー内のメタデータ、attribute-filter.xml、および relying-party.xml で一貫している必要があります。
ログイン後に Alibaba Cloud へリダイレクトされる際のエラー: The response signature is invalid.
The response signature is invalidShibboleth のメタデータファイルを Alibaba Cloud に再アップロードしてください。