Liferay Supportは、特定のサードパーティ製品を他の製品よりも推奨または承認するものではありません。 Liferayは、これらの製品に関して、ここに記載または参照されているいかなる指示に対しても責任を負いません。 これらの原則の実行は、加入者の責任において行われるものとします。
本記事では、Shibbolethをアイデンティティプロバイダー(IdP)として、Liferay DXP 7.0 with SAMLをサービスプロバイダー(SP)として設定する概念実証を記録します。 これは、SPとなるDXPやポータルのインスタンスに接続するIdPのプロトコルとしてShibbolethを利用する、ごく一般的なビジネス実装です。 そうすれば、ユーザーはSPからシングルサインオン(SSO)アクションを実行し、インスタンスにログインすることができます。
この記事は、一般的なチェックリストとして、いくつかのステップを明確化するために記載しています。 管理者は、このプロセスを開始する前に、ShibbolethとLDAPに関連するレビュードキュメントを必ず確認してください。
以下が必要です:
- ローカルマシンにインストールされたShibboleth 3
- SPとして構成されたLiferay DXP 7.xインスタンス1台
- Hypersonic(HSQL)以外のデータベース。
オプション(ただし、強く推奨):
- 第二のDXPインスタンス
- LDAPサーバー
重要事項: Shibboleth 3 にはネイティブな idp.war が付属しており、 をアプリケーションサーバーにデプロイする必要があります。 そこで、このファイルをDXP 7.0インスタンスにデプロイしてみました。 通常、Liferay DXP 7.0はこのアプリサーバー上にある必要はありませんが、この概念実証では、特にこのLDAPサーバーにプロダクションデータが含まれている場合、このインスタンスを使用してLDAPサーバーを管理することもできます。
さらに、本番環境では、データベースだけに頼るのではなく、LDAPサーバーを使ってすべてのユーザーを管理するのがベストプラクティスです。
解像度
チェックリスト
- Shibboleth 3をインストールする
- Apache Tomcatに必要なJava Server Tag Library Jarを追加する。
- HTTPS を有効にする
idp-metadata.xml
ファイルを設定する。- IdPインスタンスを設定する
- Liferay DXPをサービスプロバイダーとして構成する。
- ShibbolethにSPメタデータを追加する。
- SPが開始したSSOを実行する
Shibboleth 3をインストールする
- 最新の Shibboleth 3 IdPをダウンロードし、インストールします。
- インストール時に、インストールフォルダーを指定するか、デフォルトを使用します(例:
/opt/shibboleth-idp *Nix環境では
)。 これを今後、idp.home
と略して呼ぶことにする。 - インストールする際は、以下の値を使用してください:
- ホスト名: localhost
- SAML EntityID: https://localhost:8443/idp/shibboleth
- アトリビュートスコープ: localhost
- パスワード: shibboleth-test
Apache Tomcatに必要なJava Server Tag Library JARを追加します。
Apache Tomcat 8.xを使用する場合、生成された idp.war
ファイルを使用するために、追加のJava Server Tag Library .jar
が必要です。 このJSTLの詳細については、「追加情報」セクションを参照してください。
- jstl-1.2.jarをダウンロードします。
- 生成された
idp.war
を 7zip のような zip ファイルマネージャプログラムを使って開く。 - jar を
{idp.war}/../WEB-INF/lib/
フォルダに配置します。 - 更新された
idp.war
を保存します。
HTTPS を有効にする
アプリケーションサーバーでHTTPSを有効にすることが必要です。 両方のアプリケーションサーバーでSSLが有効になっていること、およびJavaセキュリティ証明書が追加されていることを確認してください。 Shibbolethを本番環境で使用する場合、セキュリティ証明書がそのレベルにふさわしいものであることを確認する。 必ず最初にベンダーのドキュメントを参照してください。
idp-metadata.xml
ファイルを設定する。
生成された idp-metadata.xml
の要素に正しいポート番号があることを確認する SingleSignOnService Binding
. 特に、 Location
属性にポート番号:8443が含まれていることを確認してください。
<SingleSignOnService Binding="urn:mace:shibboleth:1.0:profiles:AuthnRequest" Location="https://localhost:8443/idp/profile/Shibboleth/SSO"/> <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://localhost:8443/idp/profile/SAML2/POST/SSO"/> <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" Location="https://localhost:8443/idp/profile/SAML2/POST-SimpleSign/SSO"/> <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://localhost:8443/idp/profile/SAML2/Redirect/SSO"/>
IdPインスタンスを設定する
上述のように、Shibboleth 3のidp.warが展開されている同じアプリケーションサーバーにDXP 7.0がインストールされていることは、 、必要ありません。 しかし、この2つ目のDXP 7.xインスタンスを使うことで、より簡単になりました。
- DXP 7.0 プラットフォームを起動します。
- 修正した
idp.war
をこのアプリサーバーにデプロイする。 - 戦争が正常に展開されたことを確認し、https://localhost:8443/idp/status に移動します。
このサーバーがアクティブな間は、このDXPインスタンスに任意のLDAPサーバーを接続してください。 このスタック全体がIdPとして機能する。
完了したら、アプリケーションサーバーをシャットダウンします。 Shibbolethの設定ファイルにSPのメタデータを追加するために、アプリケーションサーバーをシャットダウンする必要があります。
チェックポイント:
- Shibboleth 3がローカルマシンにインストールされました。
- Apache Tomcat を使用している場合、追加の JSTL
.jar
はidp.war
の中に挿入されています。 そうでない場合は、このステップを飛ばしても問題ありません。 - Java セキュリティ
.jks
ファイルが生成され、IdP インスタンスサーバーで HTTPS が有効化されています。 -
idp-metadata.xml
に正しいポートが含まれています。 -
idp.war
は、正常にデプロイされました。 - LDAPを使用している場合、このサーバーはDXP 7.0に接続されています。
Liferay DXPをサービスプロバイダーとして構成する。
Liferay DXPインスタンスが2つ稼働している場合、Service Providerインスタンスが競合しないように、異なるポートで稼働するように修正する必要があります。 アプリケーションサーバーによって、ポートの割り当て方法が異なるため、このガイドでは範囲を限定しています。 デモのため、以下の手順はApache Tomcatの場合です。 管理者は、変更を行う前にまずドキュメントを参照する必要があります。
推奨される構成です:
- LDAPサーバーをIdPとする:
- HTTP: 8080
- HTTPS: 8443
- SPとしてDXP 7.0:
- HTTP: 8081
- HTTPS: 8444
前述のように、Liferay DXPインスタンスは、Hypersonicのような非本番データベースではなく、本番レベルのデータベースに接続することが不可欠です。 どのデータベースがサポートされているかは、 Compatibility Matrix のページでご確認ください。 デモのために、MySQL 5.7を使用しました。
SAML Service Provider として Liferay DXP を設定する際の管理者をガイドするドキュメントが既に存在します。 もちろん、最初に適切な SAML Connector を DXP インスタンスに配備することを忘れないでください。
Liferay DXPとShibbolethの連携に関しては、いくつか注意すべき点があります:
- SAML SP メタデータを生成する際に、HTTPS が使用されていることを確認する(
https://localhost:8444/c/portal/saml/metadata
)。 - サインイン時に Remember Me チェックボックスをチェックすることはありません。 これにより、すべてのSSO/SLOが否定される。
-
General タブで、以下の設定を有効にする必要があります:
- SAMLの役割:サービスプロバイダ
- EntityID:https://localhost:8444
-
Service Provider タブで、以下の設定を有効にする必要があります:
- アサーション署名が必要
- SSLを必須にする
- LDAPインポートを有効にする
- サインメタデータ
-
Identity Provider タブで、以下の設定を有効にする必要があります:
- 名前シボレーズ
- EntityID:https://localhost:8443/idp/shibboleth
- メタデータURL:
idp-metadata.xml
ファイルをアップロードします。 - Name Identifierのフォーマット:未定義*です。
- アトリビュートマッピング:(空欄)
- 完了したら、[Save]をクリックします。
SPインスタンスでは、IdPインスタンスと認証情報が一致するユーザーを持つ必要がある。 デモ用に、このDXP 7.0 SPインスタンスはデータベースを使用してユーザーを管理しています。 そうでない場合は、SSO/SLOは失敗します。 これは、開発環境か本番環境かに関係なく言えることです。
インスタンスが正しく設定されているか、IdPとSPが通信しているかをテストする簡単な方法があります。 SPインスタンスのコントロールパネルで、「 ユーザーと組織」に移動します。 LDAPディレクトリにも存在する同じクレデンシャルで、管理者権限を持つDXP 7.0ユーザを作成します。 この新しく作成したユーザー(名前:John Harrison / パスワード:Khan)を使って、DXP 7.0からのLDAPに対して認証を試みます。
最後に、SPメタデータファイルを生成します。
-
https://localhost:4444/c/portal/saml/metadata
に移動します。 -
sp-metadata.xml
として保存します。
チェックポイント:
- DXP 7.0のインスタンスは、別のポート(この例では8444)で実行されています。
- DXP 7.0がサービスプロバイダーとして有効化されました。
- SAML SP メタデータが生成されました。
- DXP 7.0 SPでLDAPのユーザーと一致するユーザーが作成されました。
ShibbolethにSPメタデータを追加する。
Liferay DXP 7.0でSSO/SLOをテストする前に、IdPインスタンスとSPインスタンスを、お互いのメタデータを向けて接続する必要があります。 つまり、Shibboleth IdPインスタンスで sp-metadata.xml
を指定し、逆にSAML有効化時にSPインスタンスで idp-metadata.xml
を既に指定した。 Shibboleth IdPのインスタンスでは、いくつかのファイルを修正する必要があります。
まず、Shibboleth IdPで sp-metadata.xml
を指定し、設定を完了する必要があります。
-
{idp.home}/conf/
フォルダに移動します。 - ファイル
metadata-providers.xml
を以下のように変更します:<MetadataProvider id="sp-metadata" xsi:type="FilesystemMetadataProvider" metadataFile="/{idp.home}/metadata/sp-metadata.xml"/>
ここで、
metadataFile=
には、sp-metadata.xml
ファイルの場所(metadataFile="/opt/shibboleth-idp/metadata/sp-metadata.xml")が含まれます。
次に、SAML暗号化を有効にします。 すべてのファイルは、 {idp.home}/conf
フォルダにあります。
- ファイル
idp.properties
を以下のプロパティで変更します:
idp.encryption.optional = true
最後に、 attribute-filter.xml
ファイルを修正して、以下の attribute policy liferaysp
を追加します:
<AttributeFilterPolicy id="liferaysp"> <PolicyRequirementRule xsi:type="Requester" value="https://localhost:8444"/> <AttributeRule attributeID="uid"> <PermitValueRule xsi:type="ANY"/> </AttributeRule> <AttributeRule attributeID="mail"> <PermitValueRule xsi:type="ANY"/> </AttributeRule> <AttributeRule attributeID="firstName"> <PermitValueRule xsi:type="ANY"/> </AttributeRule> <AttributeRule attributeID="lastName"> <PermitValueRule xsi:type="ANY"/> </AttributeRule> <AttributeRule attributeID="screenName"> <PermitValueRule xsi:type="ANY"/> </AttributeRule> </AttributeFilterPolicy>
チェックポイント:
-
sp-metadata.xml
が Shibboleth 3 IdP に追加されました。 - 暗号化が有効になっています。
-
attribute-policy
が設定されました。
この時点で、IdPインスタンスを再度起動します。 サーバーがエラーなく正常に起動し、LDAPに接続されていることを確認します。
SP主導のSSOを実行する
- 別のブラウザウィンドウで、https://locahost:8444 に移動します。 また、キャッシュされたデータがないことを確認します。
- 右上の「 サインイン 」リンクをクリックします。
- ブラウザが https://localhost:8443 の Shibboleth ページにリダイレクトされることを確認する。
- 先に作成したユーザー名とパスワード(John Harrison / Khan)を入力し、LDAPの同じユーザーに対応させる必要があります。
- ユーザーがDXP 7.0にサインインしていることを確認する。
追加情報
- Shibboleth IDP3の Apache Tomcat 8 追加JSTライブラリについての案内です。
- 機能リクエスト - SAMLアサーションの暗号化: https://issues.liferay.com/browse/LPS-70270
- 機能要求 - SAML NameId および Attribute ステートメントを暗号化する機能。https://issues.liferay.com/browse/LPS-35296
* Name Identifier Format Service Provider で Unspecified を使用する代替案は、 Email Addressを使用することである。 LDAPサーバーをIdPインスタンスに接続するために、Shibboleth 3 IdPで追加の手順が必要です。
- DXP 7.0 コントロールパネル → 設定 → SAML Adminで、 Service Provider タブに以下を入力します:
- Name Identifier Format: Email Address
-
アトリビュートマッピング:
mail=emailAddress screenName=screenName firstName=firstName lastName=lastName uid=uuid
- 次に、Email Addressを使うので、NameIdPolicyを設定する。
-
{idp.home}/conf
フォルダに移動します。 -
saml-nameid.xml ファイル
を開いてください。 - エントリーのコメントを解除する: <bean parent="shibboleth.SAML2AttributeSourcedGenerator" ...>
- エントリーのコメントを解除する: <bean parent="shibboleth.SAML1AttributeSourcedGenerator" ...>
-
- 最後に、
attribute-resolver.xml
ファイル内の属性定義を更新します。 これは、Liferay SAML SPを有効にする際に宣言された属性マッピングのためです。 これらのマッピングは、上記の5つの属性と一致する必要があります。
この時点で、IdPインスタンスはLDAPサーバーと通信してユーザーを認証することができます。 属性マッピングに応じて、ShibbolethとSPの間で送信されるリクエストに5つの値が含まれます。