Keycloakのクラスタ環境を構成してみようKeycloak超入門(4)(2/3 ページ)

» 2018年02月07日 05時00分 公開
[茂木昂士株式会社日立製作所]

Keycloakのクラスタ環境を構築する

 今回、クラスタ構築に使用したコンポーネントは以下の通りです。

コンポーネント ソフトウェア バージョン
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を利用して設定を行います。

  • JDBCの設定

 最初に、WildFlyにPostgreSQLのドライバを設定します。下記のディレクトリを作成して、PostgreSQLのJDBC(Java Database Connectivity)をコピーします。

  1. $ mkdir -p modules/system/layers/keycloak/org/postgresql/main
  2. $ cp /usr/share/java/postgresql-jdbc.jar modules/system/layers/keycloak/org/postgresql/main

 次にJDBCをコピーしたディレクトリに「module.xml」ファイルを作成して、以下の内容を記述します。

  1. <?xml version="1.0" ?>
  2. <module xmlns="urn:jboss:module:1.3" name="org.postgresql">
  3. <resources>
  4. <resource-root path="postgresql-jdbc.jar"/>
  5. </resources>
  6. <dependencies>
  7. <module name="javax.api"/>
  8. <module name="javax.transaction.api"/>
  9. </dependencies>
  10. </module>

 ファイルの配置は以下のようになります。

org/postgresql/

└── main

├── module.xml

└── postgresql-jdbc.jar

 これで、WildFlyへのJDBCの設定は完了です。

  • JBoss Vaultを使ったパスワードの設定

 データソース接続に利用するパスワードは、設定ファイル「standalone-ha.xml」に直接記述することも可能ですが、暗号化されていないパスワードを保持しておくことはセキュリティ的に問題があります。

 そこで、WildFlyが提供しているセキュアストレージ機能「JBoss Vault」を利用して、パスワード情報を保持します。JBoss Vaultに格納したパスワードは、設定ファイル上で「${VAULT::datasource::password::1}」のように記述できます。

 JBoss Vaultにパスワードを格納するために、下記のコマンドを実行します。

  1. $ ./bin/vault.sh \
  2. -e /opt/keycloak/vault \
  3. -t -k /opt/keycloak/keystore.jceks -p p@ssword -v vault \
  4. -b datasource -a password \
  5. -i 50 -s 12345678 -x p@ssword
  6. ...
  7. ********************************************
  8. Vault Block:datasource
  9. Attribute Name:password
  10. Configuration should be done as follows:
  11. VAULT::datasource::password::1
  12. ********************************************
  13. WFLYSEC0048: Vault Configuration commands in WildFly for CLI:
  14. ********************************************
  15. For standalone mode:
  16. /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/")])
  17. ********************************************
  18. ...

 上記コマンドにより、暗号化されたパスワード(p@ssword)がJBoss Vaultのデータディレクトリ(/opt/keycloak/vault)に保存されます。コマンド実行時に表示される「VAULT::datasource::password::1」はJBoss Vaultの構文です。この値はデータソースへの接続設定時に利用するので忘れずに控えておいてください。

 そして、この暗号化されたパスワードをWildFlyで利用できるようにするために、コマンド出力中に表示された「jboss-cli」のコマンドを実行します。

  1. $ ./bin/jboss-cli.sh
  2. [disconnected /] embed-server --server-config=standalone-ha.xml
  3. [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」に、データソースへの接続設定を記述します。データソースとドライバの設定は、以下の通りです。

  1. <datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
  2. <connection-url>jdbc:postgresql://192.168.100.20/keycloak</connection-url>
  3. <driver>postgresql</driver>
  4. <pool>
  5. <max-pool-size>20</max-pool-size>
  6. </pool>
  7. <security>
  8. <user-name>keycloak</user-name>
  9. <password>${VAULT::datasource::password::1}</password>
  10. </security>
  11. </datasource>
  12. <drivers>
  13. <driver name="h2" module="com.h2database.h2">
  14. <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
  15. </driver>
  16. <driver name="postgresql" module="org.postgresql">
  17. <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
  18. </driver>
  19. </drivers>

Keycloakの設定

 フェイルオーバー動作を確認するために、Keycloakのアクセスログを有効化します。「standalone/configuration/standalone-ha.xml」に以下の設定を追加します。

  1. <subsystem xmlns="urn:jboss:domain:undertow:4.0">
  2. <buffer-cache name="default"/>
  3. <server name="default-server">
  4. ...
  5. <host name="default-host" alias="localhost">
  6. <location name="/" handler="welcome-content"/>
  7. <!-- ↓この行を追加 -->
  8. <access-log worker="default" directory="${jboss.server.log.dir}" prefix="access" suffix=".log"/>
  9. <http-invoker security-realm="ApplicationRealm"/>
  10. <filter-ref name="proxy-peer"/>
  11. </host>
  12. </server>

 この設定を追加すると、Keycloakのログディレクトリ(standalone/log/)に「access.log」というログファイルが作成され、アクセスが記録されるようになります。

Apache HTTPDとmod_clusterの設定

 次にロードバランサーとして、「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」ファイルを作成して、以下の内容を記述します。

  1. LoadModule cluster_slotmem_module modules/mod_cluster_slotmem.so
  2. LoadModule manager_module modules/mod_manager.so
  3. LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
  4. LoadModule advertise_module modules/mod_advertise.so
  5. Listen 6666
  6. <VirtualHost 192.168.100.10:6666>
  7. <Directory "/">
  8. Require ip 192.168.100.
  9. </Directory>
  10. KeepAliveTimeout 60
  11. MaxKeepAliveRequests 0
  12. ManagerBalancerName mycluster
  13. EnableMCPMReceive
  14. ServerAdvertise On
  15. </VirtualHost>
  16. <Location /mod_cluster-manager>
  17. SetHandler mod_cluster-manager
  18. Require ip 172.0.0.1
  19. </Location>

 設定ファイル中のIPアドレスは、ご自身の環境に合わせて適宜変更してください。また、「<Directory "/">」にはKeycloakサーバからアクセスできる必要があるため、アクセス制御も必要に応じて変更してください。

 最後に、mod_clusterを動作させる際には、「mod_balancer_module」を無効化する必要があります。CentOS 7.4では「/etc/httpd/conf.module.d/00-proxy.conf」に記述されているため、該当行をコメントアウトします。

  1. LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
  2. LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
  3. #LoadModule proxy_balancer_module modules/mod_proxy_balancer.so <-この行をコメントアウト
  4. LoadModule proxy_connect_module modules/mod_proxy_connect.so

 これでApache HTTPDとmod_clusterの設定が完了しました。以下のマンドを実行して、Apache HTTPDを起動します。

  1. # systemctl start httpd

Keycloakの起動

 Keycloakのデータソース設定、mod_clusterの設定が完了したので、クラスタを構成する全てのKeycloakをStandalone Clusterモードで起動します。

  1. $ ./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.

スポンサーからのお知らせPR

Linux �ス�ス OSS 髫ェ蛟�スコ荵斟帷ケ晢スウ郢ァ�ュ郢晢スウ郢ァ�ー

隴幢スャ隴鯉ス・隴帷」ッ菫」

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。