Keycloakのクラスタ環境を構成してみよう:Keycloak超入門(4)(2/3 ページ)
本連載では、近年注目されている認証プロトコル「OpenID Connect」をサポートするオープンソースのシングルサインオン(SSO)ソフトウェア「Keycloak」の活用方法を解説していきます。今回は、Keycloakのクラスタ環境を構成する方法を解説します。
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.
関連記事
- なぜ「シングルサインオン」が必要なのか?
企業でのWebサービスの実現が具体的になるにつれ、パスワード/IDマネジメントが重視されるようになり、「シングル・サインオン」がますます注目を集めている。この連載では、シングル・サインオンの実践ステップなど具体的な考え方を紹介する。また、メタディレクトリやLDAPなど「ディレクトリ統合」をキーワードとしてシングル・サインオンを実現するための技術を分かりやすく解説する。(編集部) - 第1回 もはや企業のID管理で避けては通れない「IDaaS」とは?
これまで社内設置が当たり前だったアイデンティティ(ID)管理/認証システム。でも「クラウド」「モバイル」に代表される激烈な変化に対応できる、と本当に思っていますか? ID管理/シングルサインオンの新たな選択肢「IDaaS」について解説する連載開始! - 強力なSSOを実現するXML認証・認可サービス(SAML)
- OpenIG、OpenDJと連携したOpenAMの新機能
今回は、OpenAMの姉妹製品で既存アプリケーションを改修せずにシングルサインオンを可能にする「OpenIG」と、OpenAMのデフォルトデータストアである「OpenDJ」について解説します。