このトピックでは、Shibboleth と Alibaba Cloud の間でユーザーベースのシングルサインオン (SSO) を実装する方法の例を説明します。この例は、エンタープライズ ID プロバイダー (IdP) と Alibaba Cloud の間の SSO のエンドツーエンドの構成プロセスを理解するのに役立ちます。
準備
Shibboleth、Tomcat、および LDAP サーバーをインストールします。
LDAP サーバーを構成します。
この例では、管理者アカウントを 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: ログインパスワードです。
LDAP サーバーに接続するように Shibboleth を構成します。
/opt/shibboleth-idp/conf/ldap.propertiesファイルで次のデータを変更します:# LDAP 認証モード idp.authn.LDAP.authenticator = bindSearchAuthenticator # LDAP アドレス idp.authn.LDAP.ldapURL = ldaps://[LDAP server address]: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}) # 管理者アカウントとパスワード idp.authn.LDAP.bindDN = uid=admin,ou=system idp.authn.LDAP.bindDNCredential = secret idp.attribute.resolver.LDAP.searchFilter =(samaccountname=$resolutionContext.principal)
このトピックの Shibboleth 構成は提案です。これらは、エンドツーエンドの SSO ログインプロセスを理解するのに役立つ目的でのみ提供されています。Alibaba Cloud は、Shibboleth 構成に関するコンサルティングサービスを提供していません。
ステップ 1: Alibaba Cloud から SAML サービスプロバイダーのメタデータを取得する
RAM 管理者として Resource Access Management (RAM) コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
[ユーザーベース SSO] タブの [SAML サービスプロバイダーメタデータ] セクションで、現在の Alibaba Cloud アカウントのメタデータ URL をコピーします。
コピーした URL を新しいブラウザウィンドウで開きます。メタデータ XML ファイルを
/opt/shibboleth-idp/metadata/aliyun-ram-user-metadata.xmlとして保存します。説明メタデータ XML ファイルには、SAML サービスプロバイダー (SP) としての Alibaba Cloud のアクセス情報が含まれています。
EntityDescriptor要素のentityID属性の値を記録します。この値は、後で Shibboleth を構成するときに必要になります。
ステップ 2: Shibboleth に Alibaba Cloud を登録する
/opt/shibboleth-idp/conf/metadata-providers.xml ファイルを構成します。ステップ 1: Alibaba Cloud から SAML サービスプロバイダーのメタデータを取得するで取得したメタデータファイルを指定して、Shibboleth に Alibaba Cloud を登録します。
<!--
<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/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フィールドが選択されています。<!-- ========================================== --> <!-- 属性定義 --> <!-- ========================================== --> <!-- スキーマ: コアスキーマ属性--> <!-- 上記のコメントアウトされたコードを見つけて、その後に次のコードを追加します。 --> <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で構成された情報を使用して 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/conf/attribute-filter.xmlファイルを変更して、属性フィルターを追加します。PolicyRequirementRuleタグのvalue属性を、ステップ 1: Alibaba Cloud から SAML サービスプロバイダーのメタデータを取得するで取得した Alibaba Cloud の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>
ステップ 4: SAML 応答の NameID を構成する
/opt/shibboleth/conf/relying-party.xmlファイルを変更して、Alibaba Cloud の NameID 構成を作成します。beanタグのrelyingPartyIds属性を、ステップ 1: Alibaba Cloud から SAML サービスプロバイダーのメタデータを取得するで取得した Alibaba Cloud のentityIDに置き換えます。<!-- 単一の 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/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/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:///<サーバーアドレス>/idp/shibbolethにアクセスし、メタデータファイルをローカルに保存します。
ステップ 6: Alibaba Cloud でユーザーベース SSO を有効にする
RAM コンソールの左側のナビゲーションウィンドウで、 を選択します。
[ユーザーベース SSO] タブの [SSO ステータス] セクションで、[有効] をクリックします。
説明ユーザーベース SSO はグローバル機能です。有効にすると、すべての RAM ユーザーが SSO を使用してログインする必要があります。RAM ユーザーとしてこの機能を構成している場合は、現時点では無効のままにしておきます。構成エラーによるロックアウトを避けるために、まず RAM ユーザーを作成する必要があります。Alibaba Cloud アカウントを使用して構成を実行し、この問題を回避することもできます。
[メタデータファイル] セクションで [メタデータのアップロード] をクリックし、ステップ 5: Shibboleth から SAML IdP メタデータを取得するで取得した IdP メタデータファイルをアップロードします。
[補助ドメイン] セクションで [編集] をクリックします。次に、補助ドメインを有効にし、Shibboleth ユーザー名のメールサフィックスに設定します。
この例では、ドメインは
testdomain.alicloud.comです。
ステップ 7: Alibaba Cloud で RAM ユーザーを作成する
RAM コンソールの左側のナビゲーションウィンドウで、 を選択します。
[ユーザー] ページで、[ユーザーの作成] をクリックします。
[ユーザーの作成] ページで、[ログイン名] と [表示名] を入力します。
説明RAM ユーザーのログイン名のプレフィックスが、Shibboleth のユーザー名のメールプレフィックスと同じであることを確認してください。この例では、プレフィックスは testUser です。
[アクセスモード] セクションで、[コンソールアクセス] を選択し、ログインパスワードなどのパラメーターを設定します。
[OK] をクリックします。
結果の確認
構成が完了したら、Alibaba Cloud または Shibboleth のいずれかから SSO ログインを開始できます。
Alibaba Cloud からのログインの開始
RAM コンソールの [概要] ページから RAM ユーザーのログイン URL をコピーできます。
右上のプロフィール画像にカーソルを合わせ、[ログアウト] をクリックするか、コピーした RAM ユーザーのログイン URL を新しいブラウザで開きます。
[エンタープライズアカウントでログイン] をクリックします。自動的に Shibboleth ログインページにリダイレクトされます。

Shibboleth ログインページで、ユーザー名 (testUser) とパスワードを入力し、[ログイン] をクリックします。
システムは自動的に SSO ログインを完了し、Alibaba Cloud コンソールのホームページにリダイレクトします。
Shibboleth からのログインの開始
https://<サーバーアドレス>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID>にアクセスします。URL の
<entityID>は、ステップ 1: Alibaba Cloud から SAML サービスプロバイダーのメタデータを取得するで取得した Alibaba Cloud のentityIDです。Shibboleth ログインページで、ユーザー名 (testUser) とパスワードを入力し、[ログイン] をクリックします。
システムは自動的に SSO ログインを完了し、Alibaba Cloud コンソールのホームページにリダイレクトします。
よくある質問
確認中に問題が発生した場合は、/opt/shibboleth-idp/logs/idp-process.log ファイルを表示して原因を分析できます。一般的な問題を以下に示します:
Shibboleth のユーザー名とパスワードは正しいですが、ログイン後に例外が報告されます。
/opt/shibboleth-idp/logs/idp-process.log のエラーメッセージを確認します。エラーが ValidateUsernamePassword に関連している場合は、LDAP 接続の構成とデプロイメントを確認します。コメントが削除され、余分なスペースがないことを確認してください。
ログイン後にシステムが応答せず、unable to connect to the ldap と報告されます。
ldap.properties ファイルと attribute-resolver-full.xml ファイルの LDAP 接続構成を確認します。
ログイン後、Alibaba Cloud にリダイレクトされ、メッセージ The NameID is missing が報告されます。
手順 3: Shibboleth によって返されるユーザー属性を設定するで、mail フィールドが属性として正しくマッピングされているかを確認します。手順 4: SAML 応答の NameID 属性を設定するで、NameID 属性が正しく設定されているかを確認します。
https://<サーバーアドレス>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID> にアクセスすると、メッセージ Unsupported Request が報告されます。
entityId が正しく構成されているかどうかを確認します。entityId は、metadata フォルダ内のメタデータファイル、attribute-filter.xml ファイル、relying-party.xml ファイルの 3 か所で同じである必要があります。
ログイン後、Alibaba Cloud にリダイレクトされ、メッセージ The response signature is invalid が報告されます。
Shibboleth メタデータファイルを Alibaba Cloud に再度アップロードします。