このトピックでは、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: ログインパスワードです。
Shibboleth を LDAP サーバーに接続するように構成します。
/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 SP メタデータファイルをダウンロードする
RAM 管理者として RAM コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
[ロールベース SSO] タブで、[SAML] タブをクリックし、Security Assertion Markup Language (SAML) サービスプロバイダー (SP) メタデータファイルの URL をコピーします。
コピーしたリンクを新しいブラウザウィンドウで開きます。メタデータ XML ファイルを
/opt/shibboleth-idp/metadata/aliyun-ram-role-metadata.xmlに保存します。説明メタデータ XML ファイルには、SAML サービスプロバイダー (SP) としての Alibaba Cloud のアクセス情報が含まれています。
EntityDescriptor要素のentityID属性の値を記録します。この値は、後で Shibboleth を構成するときに必要になります。
ステップ 2: Alibaba Cloud を Shibboleth に登録する
/opt/shibboleth-idp/conf/metadata-providers.xml ファイルを構成します。「ステップ 1: Alibaba Cloud の SAML SP メタデータファイルをダウンロードする」で取得したメタデータファイルを指定して、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-role-metadata.xml"/>ステップ 3: Shibboleth で SAML IdP のメタデータファイルを取得する
Apache Tomcat を再起動して、前述の構成を有効にします。
https:///<your server address>/idp/shibbolethにアクセスし、メタデータファイルをコンピューターに保存します。
ステップ 4: Alibaba Cloud で SAML IdP を作成する
Alibaba Cloud アカウントで RAM コンソールにログインします。
左側のナビゲーションウィンドウで、[統合] > [SSO] を選択します。
[ロールベース SSO] タブで、[SAML] タブをクリックし、[IdP の追加] をクリックします。
[IdP の作成] ページで、[IdP 名] を shibboleth-provider に設定し、[備考] を構成します。
[メタデータファイル] セクションで、[メタデータのアップロード] をクリックします。「ステップ 3: Shibboleth で SAML IdP のメタデータファイルを取得する」で取得した IdP メタデータをアップロードします。
[IdP の作成] をクリックします。
作成した IdP の詳細を表示し、後で使用するために IdP の Alibaba Cloud リソースネーム (ARN) を記録します。
ステップ 5: Alibaba Cloud で RAM ロールを作成する
RAM コンソールの左側のナビゲーションウィンドウで、 を選択します。
[ロール] ページで、[ロールの作成] をクリックします。
[ロールの作成] ページの右上隅にある [ポリシーエディターに切り替え] をクリックします。
エディターで SAML IdP を指定します。
エディターは、ビジュアルエディターとスクリプトエディターの 2 つのモードをサポートしています。どちらのモードでも使用できます。この例では、ビジュアルエディターを使用します。[プリンシパル] セクションで、[ID プロバイダータイプ] を [SAML] に設定し、「ステップ 4: Alibaba Cloud で SAML IdP を作成する」で作成した IdP (shibboleth-provider) を選択します。
エディターで、
saml:recipient条件をhttps://signin.alibabacloud.com/saml-role/ssoに設定します。[ロールの作成] ダイアログボックスで、[ロール名] パラメーターを worker に設定し、[OK] をクリックします。
作成した RAM ロールの詳細を表示し、後で使用するために RAM ロールの ARN を記録します。
ステップ 6: 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フィールドとmemberofフィールドが返されます。memberof属性のidは、ユーザーのロールを表すroleです。ReturnValueタグの値は<ARN of the RAM role except for the role name (worker) + '$1'>,<ARN of the SP>です。<ARN of the SP>はステップ 4: Alibaba Cloud で SAML IdP を作成するから、ARN of the RAM roleはステップ 5: Alibaba Cloud で RAM ロールを作成するから取得できます。説明ロール名は
$1に置き換えられ、複数のロールをサポートします。ユーザー情報のmemberofフィールドを調整することで、ユーザーのロールを変更できます。memberof属性は、内部属性ではなく、カスタムユーザー属性です。ユーザーのロールを示す別の属性に変更できます。<!-- ========================================== --> <!-- 属性定義 --> <!-- ========================================== --> <!-- スキーマ: コアスキーマ属性--> <!-- ファイル内で前の行に表示されているコードを見つけ、次の行に表示されているコードを追加します。 --> <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="https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName" friendlyName="mail" encodeType="false" /> </AttributeDefinition> <AttributeDefinition xsi:type="Mapped" id="role"> <InputDataConnector ref="myLDAP" attributeNames="memberof" /> <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:role" encodeType="false" /> <AttributeEncoder xsi:type="SAML2String" name="https://www.aliyun.com/SAML-Role/Attributes/Role" friendlyName="role" encodeType="false" /> <ValueMap> <ReturnValue>acs:ram::114*******71701:role/$1,acs:ram::114*******71701:saml-provider/shibboleth-provider</ReturnValue> <SourceValue>(.+)</SourceValue> </ValueMap> </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}" ... </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 SP メタデータファイルをダウンロードする」で記録した Alibaba CloudentityIDに置き換えます。<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> <AttributeRule attributeID="role"> <PermitValueRule xsi:type="ANY" /> </AttributeRule> </AttributeFilterPolicy>
ステップ 7: SAML 応答で NameID 属性を構成する
/opt/shibboleth/conf/relying-party.xmlファイルを変更して、Alibaba Cloud の NameID を構成します。beanタグのrelyingPartyIds属性を、「ステップ 1: Alibaba Cloud の SAML SP メタデータファイルをダウンロードする」で記録した Alibaba CloudentityIDに置き換えます。<!-- 単一の 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 の生成方法を構成します。<!-- 次のコードを見つけます。コードのコメントを解除して、構成を有効にします。--> <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
ステップ 8: Shibboleth を起動する
Apache Tomcat を再起動して、前述の構成を有効にします。
結果の検証
前述の構成が完了したら、Shibboleth から SSO を開始できます。
https://<your server address>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID>にアクセスします。URL の
<entityID>は、「ステップ 1: Alibaba Cloud の SAML SP メタデータファイルをダウンロードする」で記録した Alibaba CloudentityIDです。Shibboleth のログインページで、ユーザー名とパスワードを入力し、[ログイン] をクリックします。
ログインが成功すると、RAM ロール worker として 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 というメッセージが表示された場合はどうすればよいですか?
ステップ 6: Shibboleth によって返されるユーザー属性を設定するで、mail フィールドが属性として正しくマップされていること、およびステップ 7: SAML 応答で NameID 属性を設定するで、NameID 属性が正しく設定されていることを確認してください。
https://<your server address>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID> にアクセスしたときに Unsupported Request というメッセージが表示された場合はどうすればよいですか?
entityId が正しく構成されていることを確認します。entityId の値は、metadata フォルダー内のメタデータファイル、attribute-filter.xml ファイル、および relying-party.xml ファイルで同じである必要があります。
ログイン後に Alibaba Cloud にリダイレクトされ、Can not find SAML role attribute which is required というメッセージが表示された場合はどうすればよいですか?
「ステップ 6: Shibboleth によって返されるユーザー属性を構成する」でユーザー情報の memberof フィールドが role に正しくマップされていることを確認します。ReturnValue タグの値を注意深く確認してください。
ログイン後に Alibaba Cloud にリダイレクトされ、Can not find SAML role session name attribute which is required というメッセージが表示された場合はどうすればよいですか?
「ステップ 6: Shibboleth によって返されるユーザー属性を構成する」で mail 属性の name が https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName であることを確認します。一部のユーザーは、ユーザーベース SSO 構成をロールベース SSO 構成に変更するときに name の値を変更するのを忘れることがあります。
ログイン後に Alibaba Cloud にリダイレクトされ、The response signature is invalid というメッセージが表示された場合はどうすればよいですか?
Shibboleth のメタデータファイルを Alibaba Cloud に再アップロードします。