LiferayとKeycloakでSAML SSO設定をしてみよう

こんにちは。おおたにです。

 

今回は、Liferayを構築する際に認証連携として選択されることの多いSAMLベースのSSOについて、実際にLiferayとKeycloakを利用してSAML SSOを設定する方法を紹介します。

KeycloakはオープンソースのID管理製品で、無償利用可能、簡単にセットアップできる、UIでそれなりに設定/管理できるためチョイスしましたが、もちろん他のID管理/認証基盤でも同様の設定でSAML SSOを設定することができます。

なお、本記事では以下のバージョンのソフトウェアを利用しています。

  • Java : Java21
  • Liferay : Liferay DXP 2025.Q3
  • Keycloak : 26.4

では、さっそく見ていきましょう。

 

SAMLとは

まずはSAMLについて紹介します。SAML(Security Assertion Markup Language)とは、異なるドメイン間、アプリケーション間で認証情報をやりとりするためのXMLベースのプロトコルです。主にSSO(シングルサインオン)の実現のために利用されており、ユーザ認証を担当する側をIdP(Identity Provider)、認証情報を利用してサービスを提供する側をSP(Service Provider)と呼びます。今回の例だと、KeycloakがIdP、LiferayがSPとなります。

 

Liferayをセットアップする

まずはJavaをインストールします。利用するLiferayによって必要なJavaのバージョンが異なるのでご注意ください。

1. Oracle JDK 21OpenJDK 21あたりからインストーラをダウンロードしてインストールする。OSのパッケージ管理ツールを使える場合はそちらでインストールする

2. javaコマンドを実行し、バージョンを確認する。openjdk version "21.0.2"などと表示されればOKです

java -version

続いて、Liferayをセットアップします。

1. LiferayのTomcatバンドル版を入手する。liferay-dxp-tomcat-<バージョン名等>.tar.gzというファイル名です

2. 入手したファイルを展開する。展開するとliferay-dxpディレクトリが作成されますが、このディレクトリをLIFERAY_HOMEディレクトリと呼びます

3. Liferay DXPのライセンスファイルを<LIFERAY_HOME>/deployディレクトリにコピーする

4. Liferayを起動する

cd /tomcat/bin
./startup.sh

5. Liferayが起動したら、ブラウザでhttp://localhost:8080/にアクセスする

6. 初期設定画面が表示されるので、以下の設定を行い Finish Configurationボタンをクリックする

  • Default Language : 日本語 (日本)
  • Email : test@liferay.com

7. 再度ブラウザでhttp://localhost:8080/にアクセスし、以下の画面が表示されることを確認する

8. ログインをクリックし、Liferay管理者(メールアドレス test@liferay.com、初期パスワード test)でログインする

9. 画面右上のアプリケーションメニューアイコン > コントロールパネル > インスタンス設定 > ユーザー認証 > 共通 に移動し、「ゲストにメールアドレスの認証を必要とする」のチェックを外して保存する(ユーザを追加するたびにメール送信を伴う認証処理が必要になるのでOFFにします)

以上でLiferayのセットアップは完了です。

 

Keycloakをセットアップする

続いてKeycloakをセットアップします。公式のDockerイメージが公開されているので、Dockerでサクッとたてます(Dockerのセットアップ方法は割愛します)。

1. 以下のコマンドを実行して、KeycloakのDockerコンテナを起動する(ローカルホストの18080番ポートにフォワードしている)

docker run -p 127.0.0.1:18080:8080 -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:26.4 start-dev

2. 起動したら、ブラウザでhttp://localhost:18080/にアクセスし、以下の画面が表示されることを確認する

3. Keycloak管理者(ユーザ名 admin、パスワード admin)でログインする

無事ログインできたらKeycloakのセットアップも完了です。

 

SAML SSOを設定する前に

LiferayとKeycloakのセットアップが完了したら、SAML SSOに進みましょう。

と言いたいところですが、その前に、SAML SSO設定後にもLiferay上のユーザで非SSOログインできるように専用のログインページを作成します。

1. LiferayにLiferay管理者でログインする

2. 画面左上のメニューアイコンをクリックして画面左のメニューを表示し、サイトビルダー > ページ をクリックする

3. 新規作成ボタン > ウィジェットページ をクリックし、名前に「login」と入力して追加ボタンをクリックする

4. ページ一覧に戻り、作成したloginページのアクションメニュー > 参照 をクリックする

5. loginページが開くので、画面右上の+(追加)アイコンをクリックし、ウィジェット > ツール > ログイン をページ上にD&Dする。これでログインフォームがページ上に表示されるようになります(現在は管理者でログインしているのでその旨が表示されている)

SAML SSO設定を有効にしたもののSSOがうまくいかず、ログインをクリックするとSSOシーケンスが走ってしまいどうしようもないというような状況になったら、このページから管理者でログインして設定を見直してください。

 

SAML SSOを設定しよう

では、本題のSAML SSO設定を行っていきます。まずはLiferayをSAMLのSPとして設定します。

1. Liferayに管理者でログインする

2. アプリケーションメニューアイコン > コントロールパネル > SAML設定 をクリックする

3. 以下の設定を行い、保存をクリックする

  • SAMLロール : サービス・プロバイダー
  • エンティティID : liferay

4. 証明書と秘密鍵 > 証明書を作成 をクリックし、共通名とキーのパスワードを適当に入力し、保存をクリックする

5. 署名用のキーペアが作成されたので、証明書をダウンロード をクリックしてpemファイルをダウンロードする(Keycloak側の設定で使う)

6. 有効 にチェックを入れて、保存をクリックする

7. http://localhost:8080/c/portal/saml/metadata にアクセスするとLiferayのSAMLメタデータが公開されているので、これをmetadata.xmlとして保存する(これもKeycloak側の設定で使う)

続いて、Keycloak側でSAML IdPの設定を行います。

8. Keycloakに管理者でログインする

9. 画面左のClientsをクリックし、Import clientをクリックする

10. Browseをクリックして先ほどダウンロードしたmetadata.xmlを選択する

11. Client IDにLiferayののエンティティIDが自動入力されたことを確認し、Saveをクリックする(その他はデフォルト設定でOK)

12. Settingsタブ > Name ID format を email に変更してSaveをクリックする

13. Client scopesタブ > "LiferayエンティティID名"_dedicated をクリックし、Configure a new mapperをクリックして以下のマッピングを設定する(2つ目以降は、Add mapper > By configuration)。Keycloak上のユーザ属性をSAML属性名にマッピングする際にLiferayが読みに行く属性名でマッピングするのがポイントです。

マッパータイプ:User Attribute Mapper For NameID、Name:email、Name ID Format:urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress、User Attribute:email

マッパータイプ:User Attribute、Name:emailAddress、User Attribute:email、SAML Attribute Name:emailAddress

マッパータイプ:User Attribute、Name:firstName、User Attribute:firstName、SAML Attribute Name:firstName

マッパータイプ:User Attribute、Name:lastName、User Attribute:lastName、SAML Attribute Name:lastName

マッパータイプ:User Attribute、Name:username、User Attribute:username、SAML Attribute Name:screenName

一通り設定すると以下のようになります。

14. http://localhost:18080/realms/master/protocol/saml/descriptor にアクセスするとKeycloakのSAMLメタデータが公開されているので、これをdescriptor.xmlとして保存する(Liferay側の設定で使う)

以上でIdPの設定は完了です。続いてテスト用のユーザを作成します。

15. 画面左のUsers > Add user をクリックし、以下のとおり設定してCreateをクリックする

  • Email verified : On
  • Username : test.taro
  • Email : test.taro@aegif.jp
  • First name : Taro
  • Last name : Test

16. Credentialsタブを開き、Set passwordをクリックしてパスワードを入力し、TemporaryをOffにして保存する

最後に、LiferayのSAML設定にIdPを登録します。

17. Liferayに管理者でログインする

18. アプリケーションメニューアイコン > コントロールパネル > SAML設定 > アイデンティティ・プロバイダー接続 をクリックする

19. アイデンティティ・プロバイダーを追加 をクリックし、以下のとおり設定して保存をクリックする

  • 名前 : http://localhost:18080/realms/master
  • エンティティID : http://localhost:18080/realms/master
  • 有効 : チェックを入れる
  • メタデータ : 「メタデータXMLをアップロード」を選択し、ダウンロードしたdescriptor.xmlを選択

これで準備完了です!

 

動作確認してみよう!

では、動作確認してみましょう。

1. Liferay  http://localhost:8080/ にアクセスし、画面右上のログイン(Sign in)をクリックする。管理者でログインしている場合は一旦ログアウトしてから行う

2. Keycloakのログイン画面に遷移するので、先ほど作成したユーザ名とパスワードを入力する

3. 認証に成功するとLiferayの画面に戻る。新規アクセスなので利用規約に同意してパスワード復旧設定を行う

4. Liferayに当該ユーザでログインできたことを確認する

無事SAMLのSSOに成功しました!

なお、今回は可能な限りデフォルト設定を活かして最小限の設定だけで連携したので、実際の環境構築の場合は要件を踏まえた上でSAML認証連携の設定やユーザ情報連携を行う必要があります。例えば…

  • デフォルト設定では、Liferay上に存在しないユーザでSAMLログインが行われた場合、SAML属性値を元にLiferay上に自動的にユーザを作成する(先ほどテストしたパターン)。要件によっては、認証時に自動的にユーザを作成するのはNGで事前にLiferay側にユーザ情報を作成orインポートしておく必要がある
  • IdP側で認証を行っているので、Liferay側のパスワード復旧設定は不要
  • 認証がキックされるタイミングや、認証後のランディング先

 

今回の紹介は以上です。皆さんも是非SAML SSOの設定にチャレンジしてみてください。


RANKING
2021-01-08
2020-12-01
2020-10-30
2020-12-28
2020-12-18