本連載では、近年注目されている認証プロトコル「OpenID Connect」をサポートするオープンソースのシングルサインオン(SSO)ソフトウェア「Keycloak」の活用方法を解説していきます。今回は、Keycloakのクラスタ環境を構成する方法を解説します。
「Keycloak」を含むシステムを構築した際、Keycloakがダウンすると認可に関する情報を取得できなくなるため、システム全体がアクセス不能となってしまいます。これを防ぐためには、Keycloakサーバをクラスタ化し、システム全体の可用性を確保する必要があります。
KeycloakではKeycloakを実行するためのアプリケーション(AP)サーバである「WildFly」が提供するクラスタ機能を利用して、ホスト間でデータを共有しています。また、セッション情報などのデータをクラスタ間で共有することで、ホストがダウンした際の処理を他のホストで引き継げるようになっています。
クラスタ間で共有される情報は「Keycloakの設定項目」「セッション情報」「アプリケーションサーバの設定項目」の3つです。
Keycloak自体が持つ設定情報や、Keycloak上で行ったレルムやクライアント設定など、GUIやCLIで設定した項目が共有されます。これらの情報は、外部のデータソースを経由して共有されます。
Keycloakのセッション情報もホスト間で共有されます。これにより、ユーザーのログイン状態が維持されます。セッション情報は、WildFlyに搭載されている「JGroups」「Infinispan」を利用して共有されます。JGroups、Infinispanの詳細は、WildFlyのドキュメント(https://docs.jboss.org/author/display/WFLY10/Documentation)を参照してください。
Keycloakが動作するWildFlyの設定項目も共有されます。共有される項目にはデータソースやログの設定、起動パラメーターといった情報が含まれます。これらの項目は、後述する「Domain Clustered」モードでクラスタ環境を構築した場合のみ共有されます。
ここからは、Keycloakが動作するAPサーバ、WildFlyについて説明します。WildFlyには「Standalone」「Standalone Cluster」「Domain Clustered」という3つの動作モードが定義されており、利用状況や構築するクラスタの規模に合わせて選択できます。
モード | Keycloak設定項目の共有 | セッション情報の共有 | APサーバ設定項目の共有 |
---|---|---|---|
Standalone | × | × | × |
Standalone Cluster | ○ | ○ | × |
Domain Clustered | ○ | ○ | ○ |
各動作モードの違いは、以下のようになります。
Standaloneは、Keycloakのアプリケーションが1インスタンスで動作するモードです。クラスタ化することはできませんが、簡単な設定で動作させることが可能です。Standaloneモードでは可用性が確保できないため、本番環境での利用は推奨されていません。
Standalone Clusterは、複数のサーバでクラスタを動作させるモードです。クラスタ環境が構築されると、データソースやセッション情報がクラスタのノード間で共有されるようになります。
ただし、データソースやロギングの設定など、APサーバの設定項目は共有されないため、設定を変更するたびに、各ノードに対して同じ変更を行う必要があります。クラスタを動作させるための設定は簡単ですが、数十台の大規模なクラスタ環境を構築する場合には作業量が多くなってしまいます。
Domain Clusteredは、「ドメインコントローラー」という機能でクラスタ内ホストの設定項目を管理するモードです。クラスタが構築されると、データソースやセッション情報だけでなく、WildFlyに対する設定項目がクラスタ内のノード間で自動的に共有されます。これにより、ノードの追加時にAPサーバへの設定が必要なくなり、システム負荷に応じて柔軟にクラスタノード数を変更できるようになります。
今回は、設定が簡単なStandalone Clusterモードでクラスタを構築します。
今回構築するKeycloakクラスタは、以下の図1のような構成になります。
クラスタを構築するためには、2台以上のKeycloakホストが必要です。それぞれのKeycloakをStandalone Clusterモードで動作させるように設定します。
クラスタ化されたKeycloakにHTTPリクエストを振り分けるために、Keycloakサーバの前面にロードバランサーを設置します。今回は「Apache HTTPD」と「mod_cluster」モジュールを利用します。
クラスタ間で設定項目を共有するためには、外部の共有データソースが必要になります。共有データソース(Datasource)には、「PostgreSQL」「MySQL」「Oracle」などのRDBMS(Relational Database Management System)が利用できます。今回は、PostgreSQLを利用します。
WildFlyによるクラスタ環境では、設定項目を共有するためにノード間の情報がマルチキャストで送信されます。そのため、セキュリティ上の観点から、クラスタ間通信には専用ネットワークを利用することが推奨されています。今回は、プライベートネットワークを利用できなかったのでこの設定は行っていません。
Copyright © ITmedia, Inc. All Rights Reserved.