9.3. ロードバランサーまたはプロキシーの設定
このセクションでは、クラスター化された Red Hat Single Sign-On デプロイメントの前にリバースプロキシーまたはロードバランサーを配置する前に設定する必要があるいくつかの点について説明します。また、クラスター化されたドメインの例 であった組み込みロードバランサーの設定についても説明します。
以下の図は、ロードバランサーの使用を示しています。この例では、ロードバランサーは 3 つのクライアントと 3 つの Red Hat Single Sign-On サーバーのクラスターとの間のリバースプロキシーとして機能します。
ロードバランサーダイアグラムの例
9.3.1. クライアント IP アドレスの特定 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Single Sign-On のいくつかの機能は、認証サーバーに接続する HTTP クライアントのリモートアドレスがクライアントマシンの実際の IP アドレスであるというファクトに依存します。以下のようになります。
- イベントログ - 失敗したログイン試行が誤ったソース IP アドレスでログに記録される
- SSL 必須: SSL が外部 (デフォルト) に設定されている場合、外部リクエストすべてに SSL が必要になります。
- 認証フロー: IP アドレスを使用して外部リクエストにのみ OTP を示すカスタム認証フロー
- 動的クライアント登録
これは、Red Hat Single Sign-On 認証サーバーの前にリバースプロキシーまたはロードバランサーがある場合に問題が発生することがあります。通常の設定とは、プライベートネットワークにあるバックエンドの Red Hat Single Sign-On サーバーインスタンスに負荷を分散し、要求を転送するパブリックネットワークにフロントエンドプロキシーがあることです。この場合、実際のクライアントの IP アドレスが Red Hat Single Sign-On サーバーインスタンスへ転送され、処理されるようにするため、いくつかの追加設定が必要です。具体的には以下を実行します。
-
HTTP ヘッダーの
X-Forwarded-ForおよびX-Forwarded-Protoを適切に設定するように、リバースプロキシーまたはロードバランサーを設定します。 - 元の 'Host' HTTP ヘッダーを保持するようにリバースプロキシーまたはロードバランサーを設定します。
-
クライアントの IP アドレスを
X-Forwarded-Forヘッダーから読み取る認証サーバーを設定します。
HTTP ヘッダーの X-Forwarded-For および X-Forwarded-Proto を生成し、元の Host HTTP ヘッダーを保持するようにプロキシーを設定することは本ガイドの対象外となります。X-Forwarded-For ヘッダーがプロキシーによって設定されていることを確認します。プロキシーが正しく設定されていないと、不正な クライアントはこのヘッダー自体を設定し、Red Hat Single Sign-On に、クライアントが実際とは異なる IP アドレスから接続していると思わせることができます。IP アドレスのブラックリストまたはホワイト一覧を実行する場合は、このことが重要になります。
プロキシー自体以外では、Red Hat Single Sign-On で設定する必要があるいくつかの点があります。プロキシーが HTTP プロトコル経由で要求を転送している場合は、ネットワークパケットからではなく、X-Forwarded-For ヘッダーからクライアントの IP アドレスをプルするように Red Hat Single Sign-On を設定する必要があります。これを行うには、プロファイル設定ファイル (動作モード に応じて standalone.xml、standalone-ha.xml、または domain.xml) を開き、XML ブロック urn:jboss:domain:undertow:12.0 を探します。
HTTP 設定 X-Forwarded-For
proxy-address-forwarding 属性を http-listener 要素に追加します。この値は true に設定します。
プロキシーが HTTP ではなく AJP プロトコルを使用してリクエストを転送する場合 (Apache HTTPD + mod-cluster など)、何も異なる方法を設定する必要があります。http-listener を変更する代わりに、フィルターを追加して AJP パケットからこの情報をプルする必要があります。
AJP 設定 X-Forwarded-For
9.3.2. リバースプロキシーによる HTTPS/SSL の有効化 リンクのコピーリンクがクリップボードにコピーされました!
リバースプロキシーが SSL にポート 8443 を使用しない場合は、HTTPS トラフィックのリダイレクト先となるポートを設定する必要があります。
手順
-
http-listener要素にredirect-socket属性を追加します。この値は、定義する必要のあるソケットバインディングを参照するproxy-httpsである必要があります。 新しい
socket-binding要素をsocket-binding-group要素に追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.3.3. 設定の確認 リンクのコピーリンクがクリップボードにコピーされました!
リバースプロキシーまたはロードバランサーの設定を確認できます
手順
リバースプロキシーを介してパス
/auth/realms/master/.well-known/openid-configurationを開きます。たとえば、リバースプロキシーアドレスが
https://acme.com/の場合は、URLhttps://acme.com/auth/realms/master/.well-known/openid-configurationを開きます。これにより、JSON ドキュメントに Red Hat Single Sign-On の多数のエンドポイントがリストされます。- エンドポイントがリバースプロキシーまたはロードバランサーのアドレス (スキーム、ドメイン、ポート) で始まることを確認します。これを実行することで、Red Hat Single Sign-On が正しいエンドポイントを使用していることを確認します。
Red Hat Single Sign-On が要求の正しいソース IP アドレスを確認することを確認する必要があります。
これを確認するには、無効なユーザー名とパスワードを使用して管理コンソールにログインします。これにより、以下のような警告がサーバーログに記録されます。
08:14:21,287 WARN XNIO-1 task-45 [org.keycloak.events] type=LOGIN_ERROR, realmId=master, clientId=security-admin-console, userId=8f20d7ba-4974-4811-a695-242c8fbd1bf8, ipAddress=X.X.X.X, error=invalid_user_credentials, auth_method=openid-connect, auth_type=code, redirect_uri=http://localhost:8080/auth/admin/master/console/?redirect_fragment=%2Frealms%2Fmaster%2Fevents-settings, code_id=a3d48b67-a439-4546-b992-e93311d6493e, username=admin
08:14:21,287 WARN XNIO-1 task-45 [org.keycloak.events] type=LOGIN_ERROR, realmId=master, clientId=security-admin-console, userId=8f20d7ba-4974-4811-a695-242c8fbd1bf8, ipAddress=X.X.X.X, error=invalid_user_credentials, auth_method=openid-connect, auth_type=code, redirect_uri=http://localhost:8080/auth/admin/master/console/?redirect_fragment=%2Frealms%2Fmaster%2Fevents-settings, code_id=a3d48b67-a439-4546-b992-e93311d6493e, username=adminCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
ipAddressの値が、リバースプロキシーまたはロードバランサーの IP アドレスではなく、ログインを試みたマシンの IP アドレスであることを確認します。
9.3.4. 組み込みロードバランサーの使用 リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、クラスター化ドメインの例 で説明されている組み込みロードバランサーの設定を説明します。
クラスター化されたドメインの例 は、1 台のマシンでのみ実行されるように設計されています。別のホストでスレーブを起動するには、
- domain.xml ファイルを編集して、新規ホストのスレーブを指定します。
- サーバーのディストリビューションをコピーします。domain.xml ファイル、host.xml ファイル、または host-master.xml ファイルは必要ありません。また、standalone/ ディレクトリーも必要ありません。
- host-slave.xml ファイルを編集して、コマンドラインで使用するバインドアドレスを変更するか、上書きします。
手順
- domain.xml を開いて、新しいホストスレーブをロードバランサー設定に登録できるようにします。
load-balancerプロファイルの undertow 設定に移動します。reverse-proxyXML ブロック内にremote-host3という名前の新規host定義を追加します。domain.xml reverse-proxy config
Copy to Clipboard Copied! Toggle word wrap Toggle overflow output-socket-bindingは、domain.xml ファイルの後半に設定されたsocket-bindingを示す論理名です。instance-id属性は、負荷分散時にスティッキーセッションを有効にするために cookie によってこの値が使用されるため、新規ホストに一意である必要があります。load-balancer-socketssocket-binding-groupに移動し、remote-host3にoutbound-socket-bindingを追加します。この新しいバインディングは新規ホストのホストおよびポートを参照する必要があります。
domain.xml outbound-socket-binding
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.3.4.1. マスターバインドアドレス リンクのコピーリンクがクリップボードにコピーされました!
次に、マスターホストの public および management バインドアドレスを変更する必要があります。バインドアドレス の章で説明されているように domain.xml ファイルを編集するか、以下のようにコマンドラインでこれらのバインドアドレスを指定します。
domain.sh --host-config=host-master.xml -Djboss.bind.address=192.168.0.2 -Djboss.bind.address.management=192.168.0.2
$ domain.sh --host-config=host-master.xml -Djboss.bind.address=192.168.0.2 -Djboss.bind.address.management=192.168.0.2
9.3.4.2. ホストスレーブバインドアドレス リンクのコピーリンクがクリップボードにコピーされました!
次に、public、management、およびドメインコントローラーのバインドアドレス (jboss.domain.master-address) を変更する必要があります。host-slave.xml ファイルを編集するか、以下のようにコマンドラインで指定します。
domain.sh --host-config=host-slave.xml
-Djboss.bind.address=192.168.0.5
-Djboss.bind.address.management=192.168.0.5
-Djboss.domain.master.address=192.168.0.2
$ domain.sh --host-config=host-slave.xml
-Djboss.bind.address=192.168.0.5
-Djboss.bind.address.management=192.168.0.5
-Djboss.domain.master.address=192.168.0.2
ホストのスレーブの IP アドレスに関連する jboss.bind.address 値および jboss.bind.address.management の値です。jboss.domain.master.address の値は、マスターホストの管理アドレスであるドメインコントローラーの IP アドレスである必要があります。