Liferay+Keycloakで、SCIMを使った自動ユーザプロビジョニングを試してみる

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

 

今回は、Liferay + Keycloakの環境でユーザの自動プロビジョニングを試してみようと思います。この自動プロビジョニングにはSCIMというユーザ情報同期の規格を利用しており、Liferay DXPはバージョン2024.Q1以降がSCIMに対応しています。

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

  • Liferay DXP 2025.Q3
  • Keycloak 26.4

 

SCIMとは

SCIMとはSystem for Cross-domain Identity Managementの略で、クロスドメインでID情報をやりとりするための規格です(RFC7642, 7643, 7644で定義されています)。JSON形式のID情報をHTTP(Web API)で連携するプロトコルで、異なるドメインでホストされている複数のシステム/サービス間でユーザ情報を同期することができます。

SAMLやOpenID Connectなどを利用して複数のシステムでSSOすることが一般的になった現在、認証/ID管理基盤とそれを利用する各システムでのユーザプロビジョニングをどのように行うか(自動化するか)が重要な考慮事項の1つとなっており、SCIMはそれを実現するための1つの選択肢となります。

なお、SCIMにおいては以下のようにクライアント/サーバという表現をします。

  • サーバ : ユーザ操作用のWeb APIを公開し、ユーザ情報変更の提供を受ける側(主に、サービスを提供する各システム)
  • クライアント : SCIMサーバのWeb APIをコールし、ユーザ情報の変更をプッシュする側(主に、ユーザ情報を管理している認証/ID管理基盤)

また、SCIMには1.0と2.0という2つのバージョンがあり、SCIM対応製品がどのバージョンに対応しているかは製品選定のポイントになるので注意が必要です。

 

今回は、以下のケースを実装してみようと思います。

  • Keycloak : 認証基盤。SCIMクライアント。ユーザ情報を管理しており、そのユーザ情報操作を自動的に各サービスに同期する
  • Liferay : 認証基盤を利用するサービス。SCIMサーバ。Keycloakで行われたユーザ情報変更が自動的に反映される

 

Liferayのセットアップ

まずはLiferayをセットアップします。

1. ブログ記事LiferayとKeycloakでSAML SSO設定をしてみようの「Liferayをセットアップする」のとおりLiferayをセットアップする

続いて、SCIM連携のための設定を行います。

2. <LIFERAY_HOME>/portal-ext.propertiesに以下の設定を追加する(ファイルが無ければ作成する)。本設定はLiferayアクセス時に利用するドメイン名/IPアドレスを制限するセキュリティ設定で、空だと制限なし(なんでもOK)になります。実運用時はエンドユーザや連携システムからLiferayへのアクセスに使うドメイン名やIPアドレスをカンマ区切りでリストアップしてください。

virtual.hosts.valid.hosts=

3. Liferayを再起動する

cd /tomcat/bin
./stop.sh
./startup.sh

4. Liferayが起動したら、ブラウザで http://localhost:8080/ にアクセスしてLiferay管理者でログインする

5. 画面右上のアプリケーションメニューアイコン > コントロールパネル > インスタンス設定 > SCIM に移動する(SCIMメニューが表示されない場合は、機能フラグ(リリース or ベータ)でSCIM機能(LPS-96845)を有効にしてください)

6. 以下のとおり設定し、「アクセストークンを生成」の生成ボタンをクリックして生成されたアクセストークンをコピーし(後で使います)、保存をクリックする

  • OAuth 2 アプリケーション名 : 適当
  • マッチャーフィールド : email

以上でLiferayの設定は完了です。

 

Keycloakのセットアップ

次に、Keycloakをセットアップします。KeycloakでSCIMを利用するためにはプラグインが必要なので、SCIM 2.0クライアントのプラグインkeycloak-scim-clientを導入したDockerイメージを作ります(Dockerのインストール方法は割愛)。

1. 以下の内容のDockerfileを作成する

FROM quay.io/keycloak/keycloak as builder
COPY keycloak-scim-1.0-SNAPSHOT-all.jar /opt/keycloak/providers/
RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak
COPY --from=builder /opt/keycloak/ /opt/keycloak/
WORKDIR /opt/keycloak
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]
CMD ["start"]

2. keycloak-scim-clientのリリースページからkeycloak-scim-1.0-SNAPSHOT-all.jarをダウンロードし、Dockerfileと同じディレクトリにコピーする

3. 以下のコマンドでDockerイメージをビルドする

docker build -t keycloakscim:latest .

4. 以下のコマンドでコンテナを起動する

docker run -p 127.0.0.1:18080:8080 -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin keycloakscim:latest start-dev

5. ブラウザで http://localhost:18080/ にアクセスしてログイン画面が表示されること、Keycloak管理者(ユーザ名admin、パスワードadmin)でログインできることを確認する

続いてSCIM連携の設定を行います。

6. User federation > Add new provider > Scim をクリックする

7. 以下のとおり設定し、Saveをクリックする(細かな設定はひとまずデフォルトのまま)

  • UI display name : 適当
  • SCIM 2.0 endpoint : http://host.docker.internal:8080/o/scim/v1.0/v2 (環境に応じて、KeycloakサーバからLiferayサーバに接続可能なIPアドレスorドメインに変更してください。KeycloakをDockerで起動し、Liferayをローカルで起動している場合はこの設定でよいはずです)
  • Endpoint content type : application/scim+json
  • Auth mode : BEARER
  • Auth username : 空
  • Auth password/token : Liferay側でコピーしたアクセストークン
  • Enable import during sync : On
  • Enable refresh during sync : On

8. Realm settings > Events > Event listeners に移動し、Event listenersに「scim」を追加してSaveをクリックする

以上でKeycloakのセットアップも完了です。

 

動作確認してみよう

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

1. ブラウザで http://localhost:18080/ にアクセスしてKeycloak管理者でログインする

2. Users > Add user をクリックし、以下のとおり入力してCreateをクリックする

  • Email verified : On
  • Username : synctest.user1
  • Email : synctest.user1@aegif.jp
  • First name : User1
  • Last name : Synctest

3. Keycloak上にユーザが作成されたことを確認する

4. ブラウザで http://localhost:8080/ にアクセスしてLiferay管理者でログインする

5. アプリケーションメニュー > コントロールパネル > ユーザーと組織 > ユーザー に移動する

6. 先ほど作成したユーザが同期されていることを確認する。スクリーン名がsynctest.user1となっており、メールアドレスや姓名も同期されているはずです

 

これで自動プロビジョニングの成功です!

対応しているSCIMバージョンやどこまで詳細な設定ができるかなどが製品によって大きく違うため、実運用を考えると製品選定が重要になりますが、ひとまずSCIM連携を試してみるということであればこれくらいから始めるのが良いかと思います。

では、皆様も是非SCIM連携を試してみてください。


RANKING
2021.01.08
2020.12.01
2020.10.30
2020.12.28
2020.12.18