Keycloak & PostgreSQL

Keycloakを使った実用的な構成として、外部DB、リバースプロキシを使ったシステムを作ってみました。
デフォルトではH2という内部DBを使用しますが、外部DBのPostgreSQLを使うように変更します。v17以降WildflyからQuarkusベースになったことからPostgresの構築方法が変わったため、両方試すことにしました。DBサーバは同じですが、databaseは分けました。

Apacheにはauth_openidcモジュールを使用しKeycloakの設定と、他にリバースプロキシの設定もします。Keycloakは下記環境の認可フローを使用します。(設定や画面の説明はここでは割愛。管理画面はすこし違うがv15,v21とも登録したユーザで認証が成功することが前提。v21は今回新規にインストール。)

OpenID Flow / Keycloak

※Apacheのauth_openidc.conf の OIDCProviderMetadataURL、OIDCClientSecret は、Keycloak v15、v21それぞれの設定にして切り替える必要があります。またv21のURLは、/authが不要です。

http://192.168.1.172:8080/realms/apache/.well-known/openid-configuration

Nginxのインストール・設定

$ sudo apt install nginx
$ vi /etc/nginx/sites-available/default

server {
#listen 80 default_server;
listen 8088 default_server;
#listen [::]:80 default_server;
listen [::]:8088 default_server;

#root /var/www/html;
root /var/www/nginxroot/html;

$ sudo service nginx restart

確認

n@n03:/var/www/nginxroot/html$ cat index.html

n@n03:/var$ curl localhost:8088

n@n03:/var/www/nginxroot/html/private$ cat page.html

n@n03:/var/www/nginxroot/html/private$ curl localhost:8088/private/page.html

Apache設定
参考) https://www.server-world.info/query?os=Ubuntu_22.04&p=httpd&f=13

$ sudo a2enmod proxy proxy_http

上記のようにまずモジュールを有効にする。

n@n03:/etc/apache2$ sudo vi conf-available/reverse_proxy.conf

n@n03:/etc/apache2$ sudo a2enconf reverse_proxy
Enabling conf reverse_proxy.
To activate the new configuration, you need to run:
systemctl reload apache2

下記のように設定を無効にして再起動すると、Apacheにあるpage.htmlを表示する。(とても便利)

$ sudo a2disconf reverse_proxy

Keycloak v21のインストール

$ wget https://github.com/keycloak/keycloak/releases/download/21.0.2/keycloak-21.0.2.tar.gz

ダウンロードして、解凍するだけです。
実行(まずは内部DBのH2で認証まで試してから、外部DBのPostgreSQLに変更。起動コマンドはv15と違う。)

$ bin/kc.sh start-dev

adminアカウントを最初に作る時だけ、localhostからブラウザアクセスする必要あり。GUIがなくできない場合下記のようにPortForwardする。

$ ssh -g -L 8888:localhost:8080 localhost

Keycloak v21 のPostgreSQLの設定

$ cat conf/keycloak.conf
# The database vendor.
db=postgres

# The username of the database user.
db-username=keycloak

# The password of the database user.
db-password=password

# The full database JDBC URL. If not provided, a default URL is set based on the selected database vendor.
db-url=jdbc:postgresql://192.168.1.147/keycloak

PostgreSQLサーバの設定
data/postgresql.conf
下記編集

listen_addresses = ‘*’

data/pg_hba.conf
下記編集

host keycloak keycloak 192.168.1.172/32 trust

postgres@n03:~$ createdb keycloak
postgres@n03:~$ psql -d keycloak
keycloak=# create role keycloak login password ‘password’;
CREATE ROLE

起動するとテーブルが作成される

keycloak=# \d

List of relations
Schema | Name | Type | Owner
——–+——————————-+——-+———-
public | admin_event_entity | table | keycloak
public | associated_policy | table | keycloak
public | authentication_execution | table | keycloak
public | authentication_flow | table | keycloak
public | authenticator_config | table | keycloak
public | authenticator_config_entry | table | keycloak
public | broker_link | table | keycloak
public | client | table | keycloak
public | client_attributes | table | keycloak
public | client_auth_flow_bindings | table | keycloak
public | client_initial_access | table | keycloak
public | client_node_registrations | table | keycloak
public | client_scope | table | keycloak
public | client_scope_attributes | table | keycloak
public | client_scope_client | table | keycloak
public | client_scope_role_mapping | table | keycloak
public | client_session | table | keycloak
public | client_session_auth_status | table | keycloak
public | client_session_note | table | keycloak
public | client_session_prot_mapper | table | keycloak
public | client_session_role | table | keycloak
public | client_user_session_note | table | keycloak
public | component | table | keycloak
public | component_config | table | keycloak
public | composite_role | table | keycloak
public | credential | table | keycloak
public | databasechangelog | table | keycloak
public | databasechangeloglock | table | keycloak
public | default_client_scope | table | keycloak
public | event_entity | table | keycloak
public | fed_user_attribute | table | keycloak
public | fed_user_consent | table | keycloak
public | fed_user_consent_cl_scope | table | keycloak
public | fed_user_credential | table | keycloak
public | fed_user_group_membership | table | keycloak
public | fed_user_required_action | table | keycloak
public | fed_user_role_mapping | table | keycloak
public | federated_identity | table | keycloak
public | federated_user | table | keycloak
public | group_attribute | table | keycloak
public | group_role_mapping | table | keycloak
public | identity_provider | table | keycloak
public | identity_provider_config | table | keycloak
public | identity_provider_mapper | table | keycloak
public | idp_mapper_config | table | keycloak
public | keycloak_group | table | keycloak
public | keycloak_role | table | keycloak
public | migration_model | table | keycloak
public | offline_client_session | table | keycloak
public | offline_user_session | table | keycloak
public | policy_config | table | keycloak
public | protocol_mapper | table | keycloak
public | protocol_mapper_config | table | keycloak
public | realm | table | keycloak
public | realm_attribute | table | keycloak
public | realm_default_groups | table | keycloak
public | realm_enabled_event_types | table | keycloak
public | realm_events_listeners | table | keycloak
public | realm_localizations | table | keycloak
public | realm_required_credential | table | keycloak
public | realm_smtp_config | table | keycloak
public | realm_supported_locales | table | keycloak
public | redirect_uris | table | keycloak
public | required_action_config | table | keycloak
public | required_action_provider | table | keycloak
public | resource_attribute | table | keycloak
public | resource_policy | table | keycloak
public | resource_scope | table | keycloak
public | resource_server | table | keycloak
public | resource_server_perm_ticket | table | keycloak
public | resource_server_policy | table | keycloak
public | resource_server_resource | table | keycloak
public | resource_server_scope | table | keycloak
public | resource_uris | table | keycloak
public | role_attribute | table | keycloak
public | scope_mapping | table | keycloak
public | scope_policy | table | keycloak
public | user_attribute | table | keycloak
public | user_consent | table | keycloak
public | user_consent_client_scope | table | keycloak
public | user_entity | table | keycloak
public | user_federation_config | table | keycloak
public | user_federation_mapper | table | keycloak
public | user_federation_mapper_config | table | keycloak
public | user_federation_provider | table | keycloak
public | user_group_membership | table | keycloak
public | user_required_action | table | keycloak
public | user_role_mapping | table | keycloak
public | user_session | table | keycloak
public | user_session_note | table | keycloak
public | username_login_failure | table | keycloak
public | web_origins | table | keycloak
(92 rows)

うまく設定できれば、Keycloakでログイン成功後、下記画面が表示されます。

Keycloak v15 のPostgreSQLの設定 (v15は既存環境)
参考) https://keycloak-documentation.openstandia.jp/15.1.1/ja_JP/server_installation/index.html

n@n07:~/keycloak-15.0.2/modules/system/layers/keycloak/org$ mkdir -p postgresql/main
n@n07:~/keycloak-15.0.2/modules/system/layers/keycloak/org/postgresql/main$ wget https://jdbc.postgresql.org/download/postgresql-42.6.0.jar
n@n07:~/keycloak-15.0.2/modules/system/layers/keycloak/org/postgresql/main$ ls
module.xml postgresql-42.6.0.jar
n@n07:~/keycloak-15.0.2/modules/system/layers/keycloak/org/postgresql/main$ cat module.xml

standalone/configuration/standalone.xml の編集

PostgreSQLサーバの設定(追加)

postgres@n03:~$ createdb keycloak2

pg_hba.confの編集

local all all trust
host keycloak keycloak 192.168.1.172/32 trust
host keycloak2 keycloak 192.168.1.148/32 trust

Keycloakの起動
n@n07:~/keycloak-15.0.2$ bin/standalone.sh

ログインのブラウザの操作、表示結果はv21と同じです。

PostgreSQLのユーザ情報のテーブル検索してみました。

PostgreSQLのドライバーのダウンロードサイトです。(参考サイトとかなりバージョンがはなれている。Javaは古め)

Postgresの組み込みは、v21の方が簡単にできます。テーブルはどちらも同じように見えますが、詳細は確認する必要がありそうです。