Keycloakによる認証基盤の立ち上げ(1) Wildfly版


この記事の概要

  • 既存の認証基盤を持たない組織の前提
  • 認証基盤としてKeycloak導入、組織で保持するアプリのSSO用に活用する
  • アプリごとにどんなRealmを切るかは試行錯誤

Keycloakの紹介

  • 基本的な機能は、NRIさんの紹介記事があるので参考に ⇒ Keycloakとは
  • 基盤は Javaサーブレット ⇒ 稼働先OSやアプリケーションサーバやについて選択の幅が広く持てる
  • ライセンスは Apache-2.0

本記事執筆時の諸事情

試使用を開始し、現在も試使用中なのは v16.1.1
折り悪く、ちょうどKeycloakは v16 から v17 への移行の過程で、同梱する標準アプリケーションサーバを Wildfly から Quarkus に切り替えたとのこと。
もちろん Quarkus への興味はあるけど、とりあえずは Wildfly ベースで試用した内容を提示・公開する。

構成

こんな感じとした。

導入・試用

配布物の展開

手元でメモリに余裕のあるホストを模索、Windows10 (32bit) ベースの端末をサーバとして拠出予定だったので、そちらに入れる。
インストールツールとしての scoop が、(あらゆる意味で)容易なのでmanifestつくる。

keycloak16.json
{
    "version": "16.1.1",
    "description": "Open Source Identity and Access Management",
    "homepage": "https://www.keycloak.org/",
    "extract_dir": "keycloak-16.1.1",
    "url": "https://github.com/keycloak/keycloak/releases/download/16.1.1/keycloak-16.1.1.tar.gz",
    "hash": "bb120dd1433ba7f2713cef2f064556c058bc0409a8ce0a62aa9cccc1349d1ad7"
}

scoop セットアップ済の環境なら、上記manifestからインストールすればファイル展開は簡単。

JVMも同様にscoopでインストール。

> scoop install corretto8-jdk
> scoop install keycloak16

(本業のほうで)Java8ベースで展開しているシステムが多くJava17 LTSなどへの移行は当面難しそうなので、Java8ベースで。
corretto8-jdk を選択したのは個人的な好みで、積極的な理由は無い。

Windowsサービスへの登録

'scoop\apps\keycloak16\current' 以下に展開されたフォルダ構成は、素の Wildfly を展開した内容と同じような感じ。
(というか、よく読まずに先にWildfly単体を準備してしまってからKeycloakを紐解いたらなんか同じだったので驚いた)

設定ガイド でも Wildflyの文書 を参照するようにとある。

なので WildFlyのWindowsサービスへの登録方法 と同じ手順でサービス登録可能。

Keycloakであることが分かるように、サービスの表示名くらいは変更する。

service.bat (抜粋)
set DISPLAYNAME=Keycloak based on WildFly
> service.bat install

インストールできたら、Windowsのサービスマネージャからサービス起動する1

listen設定

standalone.xml を編集する。

当初 AJP Listener でApacheの後ろにつけようとしたのだけど、動作が安定しなかった2ので諦めた。

普通にhttp / https proxyの後ろに置いても、よきにはからってくれるようだ。

その他設定補足

ちゃんと運用したいならバックエンドDBの設定するようにとドキュメントにも書かれているが、まずは試用したいだけなのでデフォルトのH2DBのまま使用する。

Apache側の設定

既存サーバーに仮想サイト設定を追加する。

keycloak.example.com.conf
<VirtualHost _default_:443>
    ServerName keycloak.example.com
...(中略)...
    ProxyRequests off
    ProxyPreserveHost On
    ProxyVia On
    ProxyTimeout 300

    ProxyPass / http://host-b:80/ disablereuse=On
    ProxyPassReverse / http://host-b:80/
...(中略)...
</VirtualHost>

初期ユーザーの作成・設定

ここまで出来たら Server Administration Guide (v16.1.1) の記載に従って操作できる。

最低限必要なのは以下くらい。

  1. 初期ユーザー作成・ログイン
  2. Master Realm での メールサーバーの設定
  3. アプリ用に Realmの追加

もちろん認証方法としてOTPを使えるようにしたり、二段階認証できるようにしたり、ユーザーの登録受付できるようにしたりしたいのであれば、それぞれ設定が必要。
ほとんど試せていないが追々確認していく。

その他

Master realmを無効にしてはいけない!
万が一無効にしてしまった場合は、DBの強制更新くらいしか回復方法が無さそう。
(CLIを使うための認証方法もなくなってしまい、正規ルートが無くなる見える)

H2DB利用時の回復方法は 別記事にまとめた

参考

  1. 実行ファイルの引数に既視感があるなと思ったら、この手続き自体が別件で触っているTomcat-8.5と同じだった。。 Apacheファミリーなので当然か。

  2. 詳細は忘れた。。