このトピックでは、Shibboleth から Alibaba Cloud へのロールベース シングルサインオン (SSO) を実装する方法の例を紹介します。この例では、クラウド ID プロバイダー (IdP) から Alibaba Cloud へのエンドツーエンドのロールベース SSO プロセスについて説明します。
準備
Shibboleth、Apache Tomcat、および Lightweight Directory Access Protocol (LDAP) 認証サーバーをインストールします。
LDAP 認証サーバーを構成します。
後で使用するために 2 つのアカウントを作成します。最初に、LDAP 認証サーバーに管理者アカウントを作成します。管理者アカウントの識別名 (DN) は
uid=admin,ou=system
で、パスワードはsecret
です。次に、LDAP 認証サーバーにテストアカウントを作成します。テストアカウントの DN は
cn=Test User,ou=users,dc=wimpi,dc=net
で、パスワードはsecret
です。次の図は詳細情報を示しています。次のセクションでは、ユーザー情報フィールドについて説明します。
メール: Resource Access Management (RAM) ユーザーのログイン名。
memberof: RAM ロールの名前。
samaccountname: Shibboleth にログインするために使用されるアカウントのユーザー名。
userpassword: Shibboleth にログインするために使用されるアカウントのパスワード。
LDAP 認証サーバーに接続するように Shibboleth を構成します。
/opt/shibboleth-idp/conf/ldap.properties
ファイルの次の内容を変更します。# LDAP 認証モード。 idp.authn.LDAP.authenticator = bindSearchAuthenticator # LDAP 認証サーバーのアドレス。 idp.authn.LDAP.ldapURL=ldaps://[LDAP 認証サーバーのアドレス]:389 # Transport Layer Security (TSL) および Transport Layer Security (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 の構成は、Shibboleth から Alibaba Cloud へのエンドツーエンドの SSO プロセスを理解するのに役立つための提案であり、Shibboleth の構成に関するコンサルティングサービスは提供していません。
ステップ 1: Alibaba Cloud の SAML SP メタデータファイルをダウンロードする
Alibaba Cloud アカウントで RAM コンソール にログインします。
左側のナビゲーションウィンドウで、 を選択します。
[ロールベース SSO] タブで、[SAML] タブをクリックし、Security Assertion Markup Language (SAML) サービスプロバイダー (SP) メタデータファイルの URL をコピーします。
ブラウザで新しいタブを開き、アドレスバーに URL を貼り付けます。表示されたページで、ページを右クリックし、[名前を付けて保存] を選択して、メタデータファイルを XML 形式でダウンロードし、
/opt/shibboleth-idp/metadata/aliyun-ram-role-metadata.xml
として保存します。説明XML ファイルには、Alibaba Cloud を Security Assertion Markup Language (SAML) サービスプロバイダー (SP) として構成するために必要な情報が含まれています。後ほど Shibboleth で構成するために、
EntityDescriptor
要素のentityID
の値を記録しておきます。
手順 2: Shibboleth に Alibaba Cloud を登録する
ステップ 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-role-metadata.xml"/>
手順 3:Shibboleth で SAML IdP のメタデータファイルを取得する
Apache Tomcat を再起動して、上記の構成を有効にします。
https://<LDAP サーバーの IP アドレス>/idp/shibboleth
にアクセスし、メタデータファイルをコンピューターに保存します。
ステップ 4: Alibaba Cloud で SAML IdP を作成する
Alibaba Cloud アカウントで RAM コンソール にログインします。
左側のナビゲーションウィンドウで、[統合] > [SSO] を選択します。
[ロールベース SSO] タブで、[SAML] タブをクリックし、[idp を追加] をクリックします。
[idp の作成] ページで、[idp 名] を shibboleth-provider に設定し、[備考] を構成します。
[メタデータファイル] セクションで、[ファイルをアップロード] をクリックして、ステップ 3: Shibboleth で SAML IdP のメタデータファイルを取得する で取得したメタデータファイルをアップロードします。
[OK] をクリックします。
作成された IdP の詳細を表示し、後で使用するために IdP の Alibaba Cloud リソースネーム (ARN) を記録します。
ステップ 5: Alibaba Cloud で RAM ロールを作成する
RAM コンソールの左側のナビゲーションウィンドウで、 を選択します。
[ロール] ページで、[ロールの作成] をクリックします。
[ロールの作成] ページの右上隅にある [ポリシーエディターに切り替え] をクリックします。
エディターで SAML IdP を指定します。
エディターは、ビジュアルエディターと JSON モードをサポートしています。この例では、ビジュアルエディターモードを使用します。[プリンシパル] 要素を構成するには、[ID プロバイダータイプ] で [SAML] を選択し、ステップ 4: Alibaba Cloud で SAML IdP を作成する で作成した shibboleth-provider を ID プロバイダーに指定する必要があります。
エディターで、
saml:recipient
条件をhttps://signin.alibabacloud.com/saml-role/sso
に設定します。[ロールの作成] ダイアログボックスで、[ロール名] パラメーターを worker に設定し、[OK] をクリックします。
作成された RAM ロールの詳細を表示し、後で使用するために RAM ロールの ARN を記録します。
ステップ 6: Shibboleth によって返されるユーザー属性を構成するステップ 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
ファイルを変更します。/opt/shibboleth/conf/attribute-resolver-full.xml ファイルで、Shibboleth によって返されるユーザー属性を構成します。この例では、
mail
フィールドとmemberof
フィールドがユーザー属性として使用されます。memberof
属性のid
をrole
に設定します。これは、ユーザーの RAM ロールを指定します。ReturnValue
タグの値を<worker を除く RAM ロールの ARN + '$1'>,<SP の ARN>
に設定します。SP の ARN
は ステップ 4: Alibaba Cloud で SAML IdP を作成する で、RAM ロールの ARN
は ステップ 5: Alibaba Cloud で RAM ロールを作成する で取得できます。説明複数の RAM ロールに対して SSO を構成できるように、RAM ロール名は
$1
に置き換えられます。memberof
フィールドの値を変更して、ユーザーの RAM ロールを変更できます。memberof
属性は、内部属性ではなくカスタムユーザー属性であることに注意してください。属性を、ユーザーの RAM ロールを示すことができる別の属性に置き換えることができます。<!-- ========================================== --> <!-- 属性定義 --> <!-- ========================================== --> <!-- スキーマ: コアスキーマ属性--> <!-- ファイル内の前の行に表示されているコードを見つけ、次の行に表示されているコードを追加します。 --> <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/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}" ... </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 メタデータファイルをダウンロードする で取得したエンティティ ID
に置き換えます。<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
ファイルの NameID 属性を構成します。bean
タグのrelyingPartyIds
属性を、ステップ 1: Alibaba Cloud の SAML SP メタデータファイルをダウンロードする で取得したエンティティ ID
に置き換えます。<!-- 名前で単一の 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 を再起動します。
ロールベース SSO をテストする
上記の構成を完了したら、Shibboleth から SSO を開始できます。
https://<LDAP サーバーの IP アドレス>/idp/profile/SAML2/Unsolicited/SSO?providerId=<entityID>
にアクセスします。<entityID>
を、ステップ 1: Alibaba Cloud の SAML SP メタデータファイルをダウンロードする で取得したエンティティ ID
に置き換えます。Shibboleth のログインページで、ユーザー名とパスワードを入力し、[ログイン] をクリックします。
ログインに成功すると、RAM ロール worker として Alibaba Cloud 管理コンソールのホームページにリダイレクトされます。
FAQ
構成結果を確認する際に問題が発生した場合は、/opt/shibboleth-idp/logs/idp-process.log
ファイルを使用して問題を特定できます。次のセクションでは、Shibboleth から Alibaba Cloud へのロールベース SSO に関するよくある質問への回答を提供します。
有効なユーザー名とパスワードを使用して Shibboleth にログインしようとすると例外が発生した場合はどうすればよいですか?有効なユーザー名とパスワードを使用して Shibboleth にログインしようとすると例外が発生した場合はどうすればよいですか?
/opt/shibboleth-idp/logs/idp-process.log
ファイルのエラーメッセージを確認します。ValidateUsernamePassword
エラーメッセージが表示された場合は、LDAP サーバーの接続構成とデプロイメントを確認します。コメントを解除する必要があるコードのコメントが解除されており、余分なスペースがないことを確認します。
Shibboleth にログインしようとするとシステムが応答せず、「ldap に接続できません」というエラーメッセージが表示された場合はどうすればよいですか?Shibboleth にログインしたときにシステムが応答しない場合はどうすればよいですか?LDAP に接続できません
エラーメッセージが表示されますか?
ldap.properties
ファイルと attribute-resolver-full.xml
ファイルの LDAP サーバーの接続構成が正しいかどうかを確認します。
Alibaba Cloud にリダイレクトされるときに「NameID がありません」というエラーメッセージが表示された場合はどうすればよいですか?どうすればよいですか? NameID がありません
Alibaba Cloud にリダイレクトされたときにエラーメッセージが表示されるのはなぜですか?
ステップ 6: Shibboleth によって返されるユーザー属性を構成する で、mail
フィールドが属性として正しくマッピングされているかどうかを確認します。ステップ 7: SAML レスポンスの NameID 属性を構成する で、NameID
属性が正しく構成されているかどうかを確認します。
どうすればよいですか。サポートされていないリクエスト
エラーメッセージがアクセス時に表示されますhttps://<LDAP サーバーの IP アドレス>/idp/profile/SAML2/Unsolicited/SSO?providerId=<エンティティ ID>
entityId
フィールドが正しく指定されているかどうかを確認します。metadata
ファイル、attribute-filter.xml
ファイル、および relying-party.xml
ファイルの entityId
フィールドの値が同じであることを確認します。
どうすればよいですか?必須の SAML ロール属性が見つかりません
Alibaba Cloud にリダイレクトされたときにエラーメッセージが表示されますか?
手順 6: Shibboleth から返されるユーザー属性を設定する で、memberof
フィールドが role
に正しくマッピングされているかどうかを確認します。ReturnValue
タグの値が正しいことを確認してください。
どうすればよいですか?必須の SAML ロールセッション名属性が見つかりません
Alibaba Cloud にリダイレクトされたときにエラーメッセージが表示されるのはなぜですか?
手順 6: Shibboleth によって返されるユーザー属性を構成する で、mail
属性の name
が https://www.aliyun.com/SAML-Role/Attributes/RoleSessionName
になっているかどうかを確認します。ユーザーベース SSO の構成をロールベース SSO を実装するように変更するときに、name
フィールドの値の変更を忘れるユーザーもいます。
どうすればよいですか。応答の署名が無効です
Alibaba Cloud にリダイレクトされたときにエラーメッセージが表示されるのはなぜですか?
Shibboleth のメタデータファイルを Alibaba Cloud に再アップロードします。