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)をコピーします。

$ 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の設定は完了です。

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

 データソース接続に利用するパスワードは、設定ファイル「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の設定

 フェイルオーバー動作を確認するために、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の設定

 次にロードバランサーとして、「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の起動

 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.

RSSについて

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

メールマガジン登録

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