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

# この記事の概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50759/0724f129-0e33-42a5-f89b-d9dbe410a10e.png)

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


# Keycloakの紹介

- 基本的な機能は、NRIさんの紹介記事があるので参考に ⇒ [Keycloakとは]
- 基盤は Javaサーブレット ⇒ 稼働先OSやアプリケーションサーバやについて選択の幅が広く持てる
- ライセンスは [Apache-2.0](https://github.com/keycloak/keycloak/blob/main/LICENSE.txt)
 

# 本記事執筆時の諸事情

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


# 構成

こんな感じとした。

![strunture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50759/3e9c8e5e-fcfc-9936-05a9-e816bd052d15.png)


# 導入・試用

## 配布物の展開

手元でメモリに余裕のあるホストを模索、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 command
> scoop install corretto8-jdk
> scoop install keycloak16
```

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


## Windowsサービスへの登録

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

[設定ガイド](https://www.keycloak.org/docs/16.1/server_installation/index.html) でも [Wildflyの文書](http://docs.wildfly.org/23/Admin_Guide.html) を参照するようにとある。

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

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

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

```
> service.bat install
```

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

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


## listen設定

`standalone.xml` を編集する。

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

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

[^1]:詳細は忘れた。。


## その他設定補足

ちゃんと運用したいならバックエンド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. [初期ユーザー作成・ログイン](https://www.keycloak.org/docs/16.1/server_admin/index.html#creating-first-admin_server_administration_guide)
1. `Master Realm` での [メールサーバーの設定](https://www.keycloak.org/docs/16.1/server_admin/index.html#_email)
1. アプリ用に [Realmの追加](https://www.keycloak.org/docs/16.1/server_admin/index.html#proc-creating-a-realm_server_administration_guide)

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

## その他

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

H2DB利用時の回復方法は [別記事にまとめた](https://qiita.com/k2ok/items/28b160c2f6c82ec327d3) 。


# 参考

- [WildFlyのWindowsサービスへの登録方法]
- [Server Administration Guide (v16.1.1)]
- [Keycloakとは]

[WildFlyのWindowsサービスへの登録方法]:https://qiita.com/h1r0r0n1/items/83659cc0257c92f3a100

[Server Administration Guide (v16.1.1)]:https://www.keycloak.org/docs/16.1/server_admin/index.html

[Keycloakとは]:https://qiita.com/daian183/items/30f01e162e03567ff21b


# その後

[Quarkusベースで立ち上げなおしました。](https://qiita.com/k2ok/items/c681f1ad25d75f6af4d5)