本番環境向けKeycloakの設定

Keycloakを本番環境に対応させる方法を学びます。

Keycloakの本番環境は、数千人のユーザーをサポートするオンプレミス環境から数百万人のユーザーに対応する環境まで、幅広い展開に対して安全な認証と認可を提供します。

このガイドでは、本番環境に対応したKeycloak環境に必要な設定の一般的な領域について説明します。この情報は、実際の環境に依存する具体的な実装ではなく、一般的な概念に焦点を当てています。このガイドで取り上げる重要な点は、コンテナ化、オンプレミス、GitOps、Ansibleなど、すべての環境に適用されます。

セキュアな通信のためのTLS

Keycloakは継続的に機密データを交換するため、Keycloakとのすべての通信にはセキュアな通信チャネルが必要です。いくつかの攻撃ベクトルを防ぐために、そのチャネルにTLS over HTTP、つまりHTTPSを有効にします。

Keycloakのセキュアな通信チャネルを設定するには、TLSの設定 および 送信HTTPリクエストの設定 を参照してください。

Keycloakのキャッシュ通信をセキュアにするには、分散キャッシュの設定 を参照してください。

Keycloakのホスト名

本番環境では、Keycloakインスタンスは通常プライベートネットワークで実行されますが、Keycloakはセキュリティで保護されるアプリケーションと通信するために、特定のパブリックに公開されるエンドポイントを公開する必要があります。

エンドポイントのカテゴリと、それらのパブリックホスト名を設定する方法の詳細については、ホスト名の設定 (v2) を参照してください。

異なるホスト名でのKeycloak管理APIとUIの公開

ログインフローなどで使用されるパブリックフロントエンドURLに使用されるものとは異なるホスト名またはコンテキストパスでKeycloak管理REST APIとコンソールを公開することがベストプラクティスとされています。この分離により、管理インターフェースがパブリックインターネットに公開されないようにし、攻撃対象領域を減らすことができます。

REST APIへのアクセスは、公開を意図していない場合は、リバースプロキシレベルでブロックする必要があります。

詳細については、ホスト名の設定 (v2) を参照してください。

分散環境におけるリバースプロキシ

ホスト名の設定 (v2) に加えて、本番環境には通常、リバースプロキシ/ロードバランサーコンポーネントが含まれています。これは、会社または組織で使用されるネットワークへのアクセスを分離および統合します。Keycloakの本番環境では、このコンポーネントが推奨されます。

Keycloakでのプロキシ通信モードの設定の詳細については、リバースプロキシの使用 を参照してください。そのガイドでは、パブリックアクセスから隠すべきパスと、Keycloakがアプリケーションを保護できるように公開すべきパスについても推奨しています。

キューに格納されたリクエスト数の制限

本番環境は、過負荷状態から自身を保護する必要があります。これにより、可能な限り多くの有効なリクエストに応答し、状況が再び正常に戻ったら通常の運用を継続できます。これを行う1つの方法は、特定のしきい値に達したら追加のリクエストを拒否することです。

ロードシェディングは、環境内のロードバランサーを含むすべてのレベルで実装する必要があります。それに加えて、Keycloakには、すぐに処理できずキューに入れる必要があるリクエストの数を制限する機能があります。デフォルトでは、制限は設定されていません。http-max-queued-requestsオプションを設定して、環境に合わせた特定のしきい値までキューに入れられるリクエストの数を制限します。この制限を超えるリクエストは、すぐに503 Server not Availableレスポンスを返します。

本番環境グレードのデータベース

Keycloakで使用されるデータベースは、Keycloakの全体的なパフォーマンス、可用性、信頼性、および整合性にとって重要です。サポートされているデータベースの設定方法の詳細については、データベースの設定 を参照してください。

クラスターにおけるKeycloakのサポート

Keycloakインスタンスがダウンした場合でもユーザーがログインし続けられるようにするために、一般的な本番環境には2つ以上のKeycloakインスタンスが含まれています。

KeycloakはJGroupsとInfinispan上で実行され、これらはクラスタ化されたシナリオ向けの信頼性の高い高可用性スタックを提供します。クラスターにデプロイする場合、埋め込まれたInfinispanサーバー通信を保護する必要があります。この通信を保護するには、認証と暗号化を有効にするか、クラスター通信に使用されるネットワークを隔離します。

複数のノードの使用、さまざまなキャッシュ、および環境に適したスタックの詳細については、分散キャッシュの設定 を参照してください。

セキュアなネットワーク通信

JGroupsはTCP通信用のJava SSLソケットをサポートしています。TLSの設定方法とUDP通信に利用できる代替手段の詳細については、分散キャッシュの設定 を確認してください。

ファイアウォールポートの設定

Keycloakサーバー間の健全なネットワーク通信を可能にするには、一連のネットワークポートを開く必要があります。分散キャッシュの設定 を参照してください。ここでは、開く必要のあるポートとその使用法について説明しています。

IPv4またはIPv6でのKeycloakサーバーの設定

システムプロパティjava.net.preferIPv4Stackおよびjava.net.preferIPv6Addressesは、IPv4またはIPv6アドレスで使用するためにJVMを設定するために使用されます。

デフォルトでは、KeycloakはIPv4およびIPv6アドレスの両方から同時にアクセスできます。IPv4アドレスのみで実行するには、プロパティjava.net.preferIPv4Stack=trueを指定する必要があります。後者は、ホスト名からIPアドレスへの変換が常にIPv4アドレスバリアントを返すことを保証します。

これらのシステムプロパティは、JAVA_OPTS_APPEND環境変数によって簡単に設定できます。たとえば、IPスタックの優先度をIPv4に変更するには、次のように環境変数を設定します。

export JAVA_OPTS_APPEND="-Djava.net.preferIPv4Stack=true"

サーバーをIPv6のみに設定するには、分散キャッシュがクラスターを形成するために、次のように環境変数を設定します。

export JAVA_OPTS_APPEND="-Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Addresses=true"

詳細については、分散キャッシュの設定 を参照してください。

このページについて