本記事では、SAML メタデータの交換、属性マッピング、NameID の設定など、Shibboleth から 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:SAML サービスプロバイダーのメタデータの取得
-
RAM 管理者として RAM コンソール にログインします。
-
ナビゲーションウィンドウで、 を選択します。
-
[ロールベースの SSO ログイン方式] タブで、SAML タブをクリックし、Alibaba Cloud SAML サービスプロバイダーのメタデータ URL をコピーします。
-
コピーしたリンクを新しいブラウザウィンドウで開き、メタデータファイルを
/opt/shibboleth-idp/metadata/aliyun-ram-role-metadata.xmlとして保存します。説明メタデータ XML ファイルには、SAML サービスプロバイダー (SP) としての Alibaba Cloud のアクセス情報が含まれています。
EntityDescriptor要素のentityID属性の値を記録します。この値は、後で Shibboleth を構成するときに必要になります。
ステップ 2:Shibboleth への Alibaba Cloud の登録
/opt/shibboleth-idp/conf/metadata-providers.xml で、「ステップ 1:SAML サービスプロバイダーのメタデータの取得」のメタデータファイルを指定して、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:SAML IdP メタデータの取得
-
Tomcat を再起動して変更を適用します。
-
https://<your server address>/idp/shibbolethにアクセスし、メタデータファイルをお使いのローカルマシンに保存します。
ステップ 4:SAML ID プロバイダーの作成
-
Alibaba Cloud アカウントで RAM コンソールにログインします。
-
ナビゲーションウィンドウで、[Integrations] > [SSO] を選択します。
-
[ロールベースの SSO ログイン方式] タブで、SAML タブをクリックし、[IdP の作成] をクリックします。
-
[IdP の作成] ページで、[IdP 名] (shibboleth-provider) と [注] を入力します。
-
[メタデータファイル] セクションで、[メタデータドキュメントをアップロード] をクリックし、「ステップ 3:SAML IdP メタデータの取得」で取得した IdP メタデータをアップロードします。
-
[IdP の作成] をクリックします。
後の手順のために、新しい ID プロバイダーの ARN を控えておいてください。
ステップ 5:RAM ロールの作成
-
RAM コンソールのナビゲーションウィンドウで、 を選択します。
-
[ロール] ページで、[ロール作成] をクリックします。
-
[ロール作成] ページの右上隅にある [Switch to Policy Editor] をクリックします。
-
エディターで SAML ID プロバイダーを指定します。
ビジュアルエディターで、[Principal] を「ステップ 4:SAML ID プロバイダーの作成」で作成した ID プロバイダー (shibboleth-provider) に設定します。[IdP タイプ] には SAML を選択します。
-
エディターで、
saml:recipient条件をhttps://signin.alibabacloud.com/saml-role/ssoに設定します。 -
[ロール作成] ダイアログボックスで、[ロール名] (worker) を入力し、[OK] をクリックします。
後の手順のために、新しい RAM ロールの ARN を控えておいてください。
ステップ 6: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ファイルを変更します。-
Shibboleth が
mailおよびmemberofユーザー属性を返すように設定します。memberof属性のidはroleで、これはユーザーのロールを表します。ReturnValueはロール ARN からロール名 (worker) を除いた部分+'$1',<サービスプロバイダー ARN>です。<サービスプロバイダー ARN>は「ステップ 4:SAML ID プロバイダーの作成」から、role ARNは「ステップ 5: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> -
この LDAP 接続は、
/opt/shibboleth-idp/conf/ldap.propertiesから設定を読み取ります。<!-- 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に属性フィルターを追加します。PolicyRequirementRuleタグのvalueを、「ステップ 1: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> <AttributeRule attributeID="role"> <PermitValueRule xsi:type="ANY" /> </AttributeRule> </AttributeFilterPolicy>
ステップ 7:NameID の設定
-
/opt/shibboleth-idp/conf/relying-party.xmlで Alibaba Cloud の NameID を設定します。beanタグのrelyingPartyIdsを、「ステップ 1: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-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
ステップ 8:Tomcat の再起動
Tomcat を再起動して変更を適用します。
ロールベース SSO のテスト
設定が完了したら、SSO 統合をテストします。
-
https://<your server address>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID>にアクセスします。URL の
<entityID>部分は、「ステップ 1:SAML サービスプロバイダーのメタデータの取得」で取得した Alibaba Cloud のentityIDに置き換えます。 -
Shibboleth のログインページで、ユーザー名とパスワードを入力し、[ログイン] をクリックします。
SSO が実行され、指定されたロール (worker) で Alibaba Cloud コンソールにログインします。
よくある質問
エラーの詳細については、/opt/shibboleth-idp/logs/idp-process.log を確認してください。一般的な問題には、以下のようなものがあります。
正しい認証情報でもログインに失敗する場合
/opt/shibboleth-idp/logs/idp-process.log を確認してください。エラーが ValidateUsernamePassword に関連している場合は、LDAP 接続設定を確認してください。コメントアウトされたセクションが余分なスペースなしで正しく有効になっていることを確認してください。
ログインが応答せず、unable to connect to the ldap エラーが発生する場合
ldap.properties および attribute-resolver-full.xml ファイルの LDAP 接続設定を確認してください。
リダイレクトエラー:The NameID is missing
「ステップ 6:Shibboleth でのユーザー属性の設定」での mail 属性マッピングと、「ステップ 7:NameID の設定」での NameID 設定を確認してください。
https://<your server address>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID> にアクセスすると Unsupported Request エラーが返される場合
entityID が正しいことを確認してください。entityID は、metadata フォルダー内のメタデータファイル、attribute-filter.xml、および relying-party.xml で一貫している必要があります。
リダイレクトエラー:Cannot find SAML role attribute which is required
「ステップ 6:Shibboleth でのユーザー属性の設定」で、memberof 属性から role へのマッピングと ReturnValue の値を確認してください。
リダイレクトエラー:Cannot find SAML role session name attribute which is required
「ステップ 6:Shibboleth でのユーザー属性の設定」で、mail 属性の name が https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName であることを確認してください。これは、ユーザーベース SSO 設定をロールベース SSO に変換する際に name の値を更新しなかった場合によく発生します。
リダイレクトエラー:The response signature is invalid
Shibboleth のメタデータを Alibaba Cloud に再アップロードしてください。