Keycloak & Apache module

Apache Webサーバのモジュール mod_auth_openidcを使ってKeycloakの認証をテストしてみました。

参考)
「KeycloakでOpenID Connectを使ってシングルサインオンをしてみる(認可コードフロー(Authorization Code Flow)編)」
https://qiita.com/rawr/items/d4f45e094c39ef43cbdf
Keycloakの環境の下記のものを使用します。

Keycloak ID Manager


keycloak-15.0.2の起動(port:8080)

bin/standalone.sh

Apacheの環境は、前回のモジュール開発のもので、そのときに作成したデバッグモジュールを使用します。
目的は、下記の保護されたコンテンツを表示します。

$ cat /var/www/html/private/page.html

<h3>Private Page</h3>

インストール)

sudo apt install libapache2-mod-auth-openidc
sudo a2enmod auth_openidc

※インストール時にモジュールの有効化までされるが一応記述

下記のようになるように設定ファイルを編集します。(編集後はApacheリスタート)

$ cat /etc/apache2/mods-enabled/auth_openidc.load

LoadModule auth_openidc_module /usr/lib/apache2/modules/mod_auth_openidc.so

$ cat /etc/apache2/mods-enabled/auth_openidc.conf

※MetadataURLは、httpsである必要があるため、port:8443にアクセス (2/28追記: httpでも可能)
※OIDCClientSecretは管理画面(クライアント->クレデンシャル)で生成されたものを記述

前回作成したモジュールのLocationも変更します。(returnをDECLINEにすることと、dauthを使わない場合は、Cokkieをチェックしないという修正も必要)

$ cat /etc/apache2/mods-enabled/dinfo.conf

Apacheという名のレルムに、クライアント、ユーザ(パスワードも設定)を作成します。(名前に任意)

http://localhost/private/page.html にアクセスします。

ログインが成功すると目的のページが表示されました。
OpenID Connectの情報や、設定したユーザ情報などが表示されていることがわかります。

あとauth_openidc.confに記述されているMetadataURL, RedirectURIについて、どのように使われているか気になったので調べてみました。

MetadataURLは、ApacheからのリダイレクトURLになると思いましたが、違いました。
https://qiita.com/TakahikoKawasaki/items/185d34814eb9f7ac7ef3
こちらに

/.well-known/openid-configuration を付けた URL に HTTP GET リクエストを投げることで、当該 OpenID プロバイダーの情報を取得することができます

とありました。
しかし、ブラウザからはリクエストを投げた形跡がないため、Apacheからされたことになります。
確認のため、MetadataURLをhttpにしてあえてエラーを起こさせることにしました。(httpsでないとだめという確認と、tcpdumpで何か確認するために内容が見えた方がよいということからでしたが、Apacheログで確認できたのであまり意味がなかったかもしれません)

http://localhost/private/page.html

Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: mod_auth_openidc_state_I_xP-uj6Ilj11bRCEIr7pLOSdpM=eyJhbGciOiAiZGlyIiwgImVuYyI6ICJBMjU2R0NNIn0.._HmuDuLO_zLHVBRZ.46LcP_OgPG-

GET: HTTP/1.1 500 Internal Server Error
Date: Fri, 24 Feb 2023 03:27:49 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Length: 607
Connection: close
Content-Type: text/html; charset=iso-8859-1
….

/var/log/apache2/access.log

127.0.0.1 – – [24/Feb/2023:12:27:49 +0900] “GET /auth/realms/apache/.well-known/openid-configuration HTTP/1.1″ 404 432 “-” “mod_auth_openidc”
::1 – – [24/Feb/2023:12:27:49 +0900] “GET /private/page.html HTTP/1.1” 500 799 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0”

/var/log/apache2/error.log

[Fri Feb 24 12:27:49.316199 2023] [auth_openidc:error] [pid 722] [client ::1:47900] oidc_util_decode_json_object: JSON parsing returned an error: ‘[‘ or ‘{‘ expected near ‘<' (404 Not Found\n<h1>Not Found</h1>\nThe requested URL was not found on this server.\nApache/2.4.41 (Ubuntu) Server at localhost Port 80\n\n) [Fri Feb 24 12:27:49.316356 2023] [auth_openidc:error] [pid 722] [client ::1:47900] oidc_metadata_provider_retrieve: JSON parsing of retrieved Discovery document failed [Fri Feb 24 12:27:49.316361 2023] [auth_openidc:error] [pid 722] [client ::1:47900] oidc_provider_static_config: could not retrieve metadata from url: http://localhost/auth/realms/apache/.well-known/openid-configuration

時刻から(GMTとJSTは9時間差)、Apacheが.well-knownにリクエストを投げていることを確認できました。
次はRedirectURIですが、これはブラウザの拡張機能で確認できました。


これは、ログイン画面で入力後の動きです。
localhost/private/callbackが呼ばれているタイミングが確認できました。
KeycloakとApacheを同じlocalhostにたてたため、面倒なことをしましたが、いろいろと理解が深まりました。