Keycloakを使った実用的な構成として、外部DB、リバースプロキシを使ったシステムを作ってみました。
デフォルトではH2という内部DBを使用しますが、外部DBのPostgreSQLを使うように変更します。v17以降WildflyからQuarkusベースになったことからPostgresの構築方法が変わったため、両方試すことにしました。DBサーバは同じですが、databaseは分けました。
Apacheにはauth_openidcモジュールを使用しKeycloakの設定と、他にリバースプロキシの設定もします。Keycloakは下記環境の認可フローを使用します。(設定や画面の説明はここでは割愛。管理画面はすこし違うがv15,v21とも登録したユーザで認証が成功することが前提。v21は今回新規にインストール。)
※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
1 |
<h3>Nginx Index Page<h3> |
n@n03:/var$ curl localhost:8088
1 |
<h3>Nginx Index Page<h3> |
n@n03:/var/www/nginxroot/html/private$ cat page.html
1 |
<h3>Private Page on Nginx via Reverse Proxy</h3> |
n@n03:/var/www/nginxroot/html/private$ curl localhost:8088/private/page.html
1 |
<h3>Private Page on Nginx via Reverse Proxy</h3> |
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
1 2 3 4 5 6 7 8 |
<IfModule mod_proxy.c> ProxyRequests Off <Proxy *> Require all granted </Proxy> ProxyPass / http://localhost:8088/ ProxyPassReverse / http://localhost:8088/ </IfModule> |
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
1 2 3 4 5 6 7 8 9 10 11 12 |
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.3" name="org.postgresql"> <resources> <resource-root path="postgresql-42.6.0.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module> |
standalone/configuration/standalone.xml の編集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}"> <connection-url>jdbc:postgresql://192.168.1.147/keycloak2</connection-url> <driver>postgresql</driver> <pool> <max-pool-size>20</max-pool-size> </pool> <security> <user-name>keycloak</user-name> <password>password</password> </security> <!-- <connection-url>jdbc:h2:${jboss.server.data.dir}/keycloak;AUTO_SERVER=TRUE</connection-url> <driver>h2</driver> <security> <user-name>sa</user-name> <password>sa</password> </security> --> </datasource> <drivers> <driver name="postgresql" module="org.postgresql"> <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class> </driver> |
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の方が簡単にできます。テーブルはどちらも同じように見えますが、詳細は確認する必要がありそうです。