Shibboleth IdP v4を使ってcybozu.comとのSAML認証を設定する
はじめに
Shibbolethは、 学術認証フェデレーション (学認:GakuNin)で利用している、シングルサインオンを実現するためのソフトウェアです。
Shibbolethを使って、cybozu.comへのシングルサインオンを行うための設定手順を説明します。
cybozu.comとの連携に必要な設定箇所だけを記載しています。
Shibboleth IdPサーバーの構築方法の詳細は、
貴学にてIdPv4をインストールする場合の構築手順(外部サイト)
を参照してください。
cybozu.comのSAML認証は、SP-initiated SSOとして動作します。
動作環境
前提条件
- ShibbolethではIdP(Identify Provider)の機能を利用し、cybozu.comはSP(Service Provider)として動作します。
- Shibboleth IdPサーバーの構築、およびユーザー情報を管理するサーバーの構築は、行われているものとします。
検証環境
Shibboleth IdP v4.2.1で動作を確認しています。
事前の準備
手順1:cybozu.com環境の準備
cybozu.com環境を用意します。
環境がない場合は、
サイボウズドットコム ストア
から試用環境を申し込んでください。
「お試しになるサービス」は、任意のサービスを選択してください。
手順2:ログインユーザーの追加
SAML認証でログインするユーザーを追加します。
ユーザーを追加する手順は、
ユーザーを追加する
を参照してください。
例としてログイン名が「user」のユーザーを追加します。
手順3:ServiceProviderメタデータファイルのダウンロード
cybozu.comをSPとしてShibboleth IdPに登録するためのメタデータをダウンロードします。
このファイルは、あとの手順で使用します。
- cybozu.comにログインし、[cybozu.com共通管理]を開きます。
- 「システム管理」の[ログイン]を開きます。
- 「SAML認証を有効にする」のチェックボックスを選択します。
- 「Service Providerメタデータのダウンロード」をクリックして、メタデータファイルをダウンロードします。
- ファイル名を「cybozu-sp-metadata.xml」に変更します。
Shibboleth IdPでの設定(IdP側)
cybozu.comとの連携するために、Shibbolethの設定ファイルを変更します。
以降、Shibboleth IdPは/opt/shibboleth-idp/
以下にインストールされているものとして記載します。
適宜インストールしているディレクトリに合わせて読み替えてください。
手順1:cybozu.comをSPとして登録する
-
事前の準備でダウンロードしたメタデータファイルを、Shibboleth IdPサーバーに配置します。
配置する場所:/opt/shibboleth-idp/metadata/cybozu-sp-metadata.xml
-
/opt/shibboleth-idp/conf/metadata-providers.xml
を開きます。 -
ファイルの末尾に、次の内容を追記して保存します。
1 2 3 4 5 6 7 8 9 10 11
<!-- 以下の内容を追記する ここから --> <!-- cybozu.com --> <MetadataProvider id="cybozu" xsi:type="FilesystemMetadataProvider" xmlns="urn:mace:shibboleth:2.0:metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd" failFastInitialization="true" metadataFile="/opt/shibboleth-idp/metadata/cybozu-sp-metadata.xml" maxRefreshDelay="PT48H"> </MetadataProvider> <!-- ここまで --> </MetadataProvider>
手順2:アサーションの暗号化を解除する
Shibboleth IdPでは、すべてのSPに対して送信するアサーションは暗号化されます。
参考:
特定のSPへのアサーションを暗号化しない設定(外部サイト)
cybozu.comでは、アサーションの暗号化に対応していないため、暗号化を解除します。
また、レスポンスに署名をするためアサーションへの署名も不要です。
-
/opt/shibboleth-idp/conf/relying-party.xml
を開きます。 -
<util:list id="shibboleth.RelyingPartyOverrides">
要素の中に、次の内容を追記して保存します。
<bean>
要素のc:relyingPartyIds
の値は、連携するcybozu.comのURLに変更してください。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<!-- 以下の内容を追記する ここから --> <!-- cybozu.com --> <bean parent="RelyingPartyByName" c:relyingPartyIds="https://sample.cybozu.com"> <property name="profileConfigurations"> <list> <bean parent="SAML2.SSO" p:encryptAssertions="false" p:signAssertions="true" p:signResponses="false" /> </list> </property> </bean> <!-- ここまで --> </util:list>
手順3:NameIDにcybozu.comでユーザーを識別するための要素を入れる
cybozu.comでのSAML認証では、SAML ResponseのNameIDの値がcybozu.comの「ログイン名」と一致する必要があります。
ShibbolethではNameIDとして、ログインのたびに異なるID(transientId)が割り当てられるため、ユーザーを一意に特定できません。
そのため、cybozu.comのログイン名と一致する値をNameIDとして受け渡します。
attribute-filter.xml
-
/opt/shibboleth-idp/conf/attribute-filter.xml
を開きます。 -
<AttributeFilterPolicyGroup>
要素の中に、次の内容を追記して保存します。
<PolicyRequirementRule>
要素のvalue
の値は、連携するcybozu.comのURLに変更してください。1 2 3 4 5 6 7 8 9 10
<!-- 以下の内容を追記する ここから --> <!-- cybozu.com --> <AttributeFilterPolicy id="cybozu"> <PolicyRequirementRule xsi:type="Requester" value="https://sample.cybozu.com" /> <!-- cybozu.comのログイン名がユーザーIDの場合 --> <AttributeRule attributeID="uid" permitAny="true" /> <!-- cybozu.comのログイン名がメールアドレスの場合 --> <AttributeRule attributeID="mail" permitAny="true" /> </AttributeFilterPolicy> <!-- ここまで -->
saml-nameid.xml
-
/opt/shibboleth-idp/conf/saml-nameid.xml
を開きます。 -
<util:list id="shibboleth.SAML2NameIDGenerators">
要素の中に、次の内容を追記して保存します。-
cybozu.comのログイン名にIDを利用する場合
1 2 3 4 5 6 7 8
<!-- SAML 2 NameID Generation --> <util:list id="shibboleth.SAML2NameIDGenerators"> <ref bean="shibboleth.SAML2TransientGenerator" /> <!-- 以下の内容を追記する ここから --> <bean parent="shibboleth.SAML2AttributeSourcedGenerator" p:format="urn:oasis:names:tc:SAML:1.1:nameid-format:username" p:attributeSourceIds="#{ {'uid'} }" /> <!-- ここまで -->
-
cybozu.comのログイン名にメールアドレスを利用する場合
1 2 3 4 5 6 7 8
<!-- SAML 2 NameID Generation --> <util:list id="shibboleth.SAML2NameIDGenerators"> <ref bean="shibboleth.SAML2TransientGenerator" /> <!-- 以下の内容を追記する ここから --> <bean parent="shibboleth.SAML2AttributeSourcedGenerator" p:format="urn:oasis:names:tc:SAML:1.1:nameid-format:username" p:attributeSourceIds="#{ {'mail'} }" /> <!-- ここまで -->
-
relying-party.xml
-
/opt/shibboleth-idp/conf/relying-party.xml
を開きます。 -
<util:list id="shibboleth.RelyingPartyOverrides">
要素の中に、次の内容を追記して保存します。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
<!-- cybozu.com --> <bean parent="RelyingPartyByName" c:relyingPartyIds="https://sample.cybozu.com"> <property name="profileConfigurations"> <list> <bean parent="SAML2.SSO" p:encryptAssertions="false" p:signAssertions="true" p:signResponses="false" <!-- 以下の内容を追記する ここから --> p:nameIDFormatPrecedence="urn:oasis:names:tc:SAML:1.1:nameid-format:username" <!-- ここまで --> /> </list> </property> </bean> </util:list>
手順4:Jettyの再起動
Shibboleth IdPの設定を変更したら、Jettyを再起動してください。
|
|
手順5:SAMLResponseを確認する
SAMLResponseで、NameIDのテキストがcybozu.comでユーザーを識別するための要素になっていることを確認します。
-
次のコマンドを実行します。
-
--principal
:cybozu.comと連携するユーザーのアカウント名 -
--requester
:cybozu.comのURL1 2
/opt/shibboleth-idp/bin/aacli.sh \ --principal=user --requester="https://sample.cybozu.com" --saml2
-
-
<saml2:Subject>
の要素の値が、cybozu.comのログイン名になっていることを確認します。
次の例では、5〜7行目の<saml2:Subject>
の要素の値が、cybozu.comのログイン名「user」になっています。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
<?xml version="1.0" encoding="UTF-8"?> <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_68614df3778292ff49673274acf8ebc5" IssueInstant="2022-08-22T00:31:18.945Z" Version="2.0"> <saml2:Issuer>https://IdPのサーバー名/idp/shibboleth</saml2:Issuer> <saml2:Subject> <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:username" NameQualifier="https://IdPのサーバー名/idp/shibboleth" SPNameQualifier="https://sample.cybozu.com"> user </saml2:NameID> </saml2:Subject> <saml2:AttributeStatement> <saml2:Attribute FriendlyName="schacHomeOrganization" Name="urn:oid:1.3.6.1.4.1.25178.1.2.9" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"> <saml2:AttributeValue>compute-1.amazonaws.com</saml2:AttributeValue> </saml2:Attribute> <saml2:Attribute FriendlyName="uid" Name="urn:oid:0.9.2342.19200300.100.1.1" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"> <saml2:AttributeValue>user</saml2:AttributeValue> </saml2:Attribute> <saml2:Attribute FriendlyName="mail" Name="urn:oid:0.9.2342.19200300.100.1.3" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"> <saml2:AttributeValue>user@example.com</saml2:AttributeValue> </saml2:Attribute> </saml2:AttributeStatement> </saml2:Assertion>
cybozu.comでの設定(SP側)
手順1:公開鍵の証明書ファイルを取得する
Shibboleth IdPのサーバーから、SAMLの署名に利用する公開鍵の証明書ファイルを取得します。
/opt/shibboleth-idp/conf/idp.properties
のidp.signing.cert
に指定している証明書ファイルです。
手順2:cybozu.comへShibboleth IdPの情報を登録する
Identity Provider(IdP)の情報を設定する手順の詳細は、 STEP2:cybozu.comでSAML認証を設定する を参照してください。
- cybozu.comにログインし、[cybozu.com共通管理]を開きます。
- 「システム管理」の[ログイン]を開きます。
- 「SAML認証を有効にする」のチェックボックスを選択します。
- IdPの情報を入力します。
- Identity ProviderのSSOエンドポイントURL:
https://IdPのサーバー名/idp/profile/SAML2/Redirect/SSO
- cybozu.comからのログアウト後に遷移するURL:
cybozu.comからログアウトした後に表示されるIdPのURL
- Identity ProviderのSSOエンドポイントURL:
- 「証明書を登録する」の[参照]をクリックし、公開鍵の証明書ファイルを指定します。
- [保存]をクリックします。
動作確認
SAML認証を使用してcybozu.comにシングルサインオンできることを確認します。
次の操作ができれば完了です。
- Webブラウザーでcybozu.comにアクセスすると、IdPの認証に成功し、ログイン後の画面が表示される。
- 正常にログアウトできる。
SAML認証の設定に失敗してcybozu.comにログインできなくなった場合には、 SAML認証を回避するURL からcybozu.comにログインして、SAML認証の設定を見直してください。
このTips 2022年11月版cybozu.comおよびShibboleth IdP v4.2.1で確認した内容です。