今回、クラスタ構築に使用したコンポーネントは以下の通りです。
コンポーネント | ソフトウェア | バージョン |
---|---|---|
Keycloak | Keycloak | 3.4.0.Final |
Datasource | PostgreSQL | 9.2.13 |
ロードバランサー | Apache httpd | 2.4.6 |
mod_cluster | 1.3.1.Final | |
まずは、データソースとなる外部RDBMSへの接続設定を行います。Keycloakがデフォルトで利用する「H2DB」では、異なるマシン上で動作するKeycloak間のデータを共有することができません。そのため、複数のKeycloakからアクセスできる共有データソースとして、外部にRDBMSサーバを用意します。今回は、PostgreSQLを利用して設定を行います。
最初に、WildFlyにPostgreSQLのドライバを設定します。下記のディレクトリを作成して、PostgreSQLのJDBC(Java Database Connectivity)をコピーします。
- $ mkdir -p modules/system/layers/keycloak/org/postgresql/main
- $ cp /usr/share/java/postgresql-jdbc.jar modules/system/layers/keycloak/org/postgresql/main
次にJDBCをコピーしたディレクトリに「module.xml」ファイルを作成して、以下の内容を記述します。
- <?xml version="1.0" ?>
- <module xmlns="urn:jboss:module:1.3" name="org.postgresql">
- <resources>
- <resource-root path="postgresql-jdbc.jar"/>
- </resources>
- <dependencies>
- <module name="javax.api"/>
- <module name="javax.transaction.api"/>
- </dependencies>
- </module>
ファイルの配置は以下のようになります。
org/postgresql/
└── main
├── module.xml
└── postgresql-jdbc.jar
これで、WildFlyへのJDBCの設定は完了です。
データソース接続に利用するパスワードは、設定ファイル「standalone-ha.xml」に直接記述することも可能ですが、暗号化されていないパスワードを保持しておくことはセキュリティ的に問題があります。
そこで、WildFlyが提供しているセキュアストレージ機能「JBoss Vault」を利用して、パスワード情報を保持します。JBoss Vaultに格納したパスワードは、設定ファイル上で「${VAULT::datasource::password::1}」のように記述できます。
JBoss Vaultにパスワードを格納するために、下記のコマンドを実行します。
- $ ./bin/vault.sh \
- -e /opt/keycloak/vault \
- -t -k /opt/keycloak/keystore.jceks -p p@ssword -v vault \
- -b datasource -a password \
- -i 50 -s 12345678 -x p@ssword
- ...
- ********************************************
- Vault Block:datasource
- Attribute Name:password
- Configuration should be done as follows:
- VAULT::datasource::password::1
- ********************************************
- WFLYSEC0048: Vault Configuration commands in WildFly for CLI:
- ********************************************
- For standalone mode:
- /core-service=vault:add(vault-options=[("KEYSTORE_URL" => "/opt/keycloak/keystore.jceks"),("KEYSTORE_PASSWORD" => "MASK-1VwGIeXLMWQUwqPaz34YTf"),("KEYSTORE_ALIAS" => "vault"),("SALT" => "12345678"),("ITERATION_COUNT" => "50"),("ENC_FILE_DIR" => "/opt/keycloak/vault/")])
- ********************************************
- ...
上記コマンドにより、暗号化されたパスワード(p@ssword)がJBoss Vaultのデータディレクトリ(/opt/keycloak/vault)に保存されます。コマンド実行時に表示される「VAULT::datasource::password::1」はJBoss Vaultの構文です。この値はデータソースへの接続設定時に利用するので忘れずに控えておいてください。
そして、この暗号化されたパスワードをWildFlyで利用できるようにするために、コマンド出力中に表示された「jboss-cli」のコマンドを実行します。
- $ ./bin/jboss-cli.sh
- [disconnected /] embed-server --server-config=standalone-ha.xml
- [standalone@embedded /] /core-service=vault:add(vault-options=[("KEYSTORE_URL" => "/opt/keycloak/keystore.jceks"),("KEYSTORE_PASSWORD" => "MASK-1VwGIeXLMWQUwqPaz34YTf"),("KEYSTORE_ALIAS" => "vault"),("SALT" => "12345678"),("ITERATION_COUNT" => "50"),("ENC_FILE_DIR" => "/opt/keycloak/vault/")])
これで、JBoss Vaultに保存したパスワードが利用可能になります。
次に、WildFlyの設定ファイル「standalone/configuration/standalone-ha.xml」に、データソースへの接続設定を記述します。データソースとドライバの設定は、以下の通りです。
- <datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
- <connection-url>jdbc:postgresql://192.168.100.20/keycloak</connection-url>
- <driver>postgresql</driver>
- <pool>
- <max-pool-size>20</max-pool-size>
- </pool>
- <security>
- <user-name>keycloak</user-name>
- <password>${VAULT::datasource::password::1}</password>
- </security>
- </datasource>
- <drivers>
- <driver name="h2" module="com.h2database.h2">
- <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
- </driver>
- <driver name="postgresql" module="org.postgresql">
- <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
- </driver>
- </drivers>
フェイルオーバー動作を確認するために、Keycloakのアクセスログを有効化します。「standalone/configuration/standalone-ha.xml」に以下の設定を追加します。
- <subsystem xmlns="urn:jboss:domain:undertow:4.0">
- <buffer-cache name="default"/>
- <server name="default-server">
- ...
- <host name="default-host" alias="localhost">
- <location name="/" handler="welcome-content"/>
- <!-- ↓この行を追加 -->
- <access-log worker="default" directory="${jboss.server.log.dir}" prefix="access" suffix=".log"/>
- <http-invoker security-realm="ApplicationRealm"/>
- <filter-ref name="proxy-peer"/>
- </host>
- </server>
この設定を追加すると、Keycloakのログディレクトリ(standalone/log/)に「access.log」というログファイルが作成され、アクセスが記録されるようになります。
次にロードバランサーとして、「Apache HTTPD」と「mod_cluster」の設定を行います。mod_clusterはダウンロードページ(http://mod-cluster.jboss.org/mod_cluster/downloads/1-3-1-Final-bin)から、「linux-x86_64 mod_cluster binaries」をダウンロードします。
ダウンロードした圧縮ファイル内には「mod_porxy_cluster.so」「mod_advertise.so」「mod_cluster_slotmem.so」「mod_manager.so」という4つのファイルがあるので、これをApache HTTPDの「modules」ディレクトリ(/etc/httpd/modules)にコピーします。
次に、mod_clusterの設定ファイルを作成します。「/etc/httpd/conf.d/mod_cluster.conf」ファイルを作成して、以下の内容を記述します。
- LoadModule cluster_slotmem_module modules/mod_cluster_slotmem.so
- LoadModule manager_module modules/mod_manager.so
- LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
- LoadModule advertise_module modules/mod_advertise.so
- Listen 6666
- <VirtualHost 192.168.100.10:6666>
- <Directory "/">
- Require ip 192.168.100.
- </Directory>
- KeepAliveTimeout 60
- MaxKeepAliveRequests 0
- ManagerBalancerName mycluster
- EnableMCPMReceive
- ServerAdvertise On
- </VirtualHost>
- <Location /mod_cluster-manager>
- SetHandler mod_cluster-manager
- Require ip 172.0.0.1
- </Location>
設定ファイル中のIPアドレスは、ご自身の環境に合わせて適宜変更してください。また、「<Directory "/">」にはKeycloakサーバからアクセスできる必要があるため、アクセス制御も必要に応じて変更してください。
最後に、mod_clusterを動作させる際には、「mod_balancer_module」を無効化する必要があります。CentOS 7.4では「/etc/httpd/conf.module.d/00-proxy.conf」に記述されているため、該当行をコメントアウトします。
- LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
- LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
- #LoadModule proxy_balancer_module modules/mod_proxy_balancer.so <-この行をコメントアウト
- LoadModule proxy_connect_module modules/mod_proxy_connect.so
これでApache HTTPDとmod_clusterの設定が完了しました。以下のマンドを実行して、Apache HTTPDを起動します。
- # systemctl start httpd
Keycloakのデータソース設定、mod_clusterの設定が完了したので、クラスタを構成する全てのKeycloakをStandalone Clusterモードで起動します。
- $ ./bin/standalone.sh --server-config=standalone-ha.xml -b=0.0.0.0 -bprivate=192.168.100.11
「-bprivate」で指定するIPアドレスはクラスタ間の通信で利用するIPアドレスですので、クラスタ間で通信できるIPアドレスを指定してください。クラスタ間通信専用のネットワークを用意できる場合は、そのネットワーク側のIPアドレスを指定してください。
Copyright © ITmedia, Inc. All Rights Reserved.
Linux �ス�ス OSS 髫ェ蛟�スコ荵斟帷ケ晢スウ郢ァ�ュ郢晢スウ郢ァ�ー