ホスト名 (v2) の設定

Keycloak によって公開されるフロントエンドおよびバックチャネルのエンドポイントを設定する方法について説明します。

ホスト名オプション設定の重要性

デフォルトでは、Keycloak は hostname オプションの設定を必須とし、URL を動的に解決しません。これはセキュリティ対策です。

Keycloak は、OIDC Discovery エンドポイントや、メール内のパスワードリセットリンクの一部として、自身の URL を自由に開示します。ホスト名がホスト名ヘッダーから動的に解釈された場合、攻撃者にメール内の URL を操作し、ユーザーを攻撃者の偽のドメインにリダイレクトさせ、アクション トークンやパスワードなどの機密データを盗む機会を与える可能性があります。

hostname オプションを明示的に設定することで、不正な発行者によってトークンが発行される状況を回避できます。サーバーは、次のコマンドを使用して明示的なホスト名で起動できます。

bin/kc.[sh|bat] start --hostname my.keycloak.org
これらの例では、通信を保護するために公開証明書と秘密鍵を必要とする本番モードで Keycloak インスタンスを起動します。詳細については、Configuring Keycloak for production を参照してください。

ホスト名オプションの特定部分の定義

前の例で示したように、スキームとポートは明示的に必須ではありません。そのような場合、Keycloak はこれらの側面を自動的に処理します。たとえば、与えられた例では、サーバーは https://my.keycloak.org:8443 でアクセス可能になります。ただし、リバースプロキシは通常、Keycloak をデフォルトポート (例: 443) で公開します。その場合、URL の部分を動的に保つのではなく、hostname オプションで完全な URL を指定することが望ましいです。サーバーは次のコマンドで起動できます。

bin/kc.[sh|bat] start --hostname https://my.keycloak.org

同様に、リバースプロキシが Keycloak を異なるコンテキストパスで公開する場合があります。hostname オプションと hostname-admin オプションを介して、それを反映するように Keycloak を構成できます。次の例を参照してください。

bin/kc.[sh|bat] start --hostname https://my.keycloak.org:123/auth

クライアント間の通信に内部 URL を利用する

Keycloak は、バックチャネルリクエスト用に別の URL を提供する機能を備えており、フロントチャネルリクエスト用にパブリック URL の使用を維持しながら、内部通信を可能にします。さらに、バックチャネルは、受信ヘッダーに基づいて動的に解決されます。次の例を検討してください。

bin/kc.[sh|bat] start --hostname https://my.keycloak.org --hostname-backchannel-dynamic true

このようにして、クライアントと呼ばれるアプリケーションはローカルネットワーク経由で Keycloak に接続でき、サーバーは https://my.keycloak.org でパブリックにアクセス可能なままになります。

エッジ TLS 終端の使用

ご覧のとおり、HTTPS プロトコルはデフォルトの選択であり、Keycloak のセキュリティのベストプラクティスへのコミットメントに準拠しています。ただし、Keycloak は、必要に応じてユーザーが HTTP を選択できる柔軟性も提供します。これは、HTTP リスナーを指定するだけで実現できます。詳細については、Configuring TLS を参照してください。エッジ TLS 終端プロキシを使用すると、サーバーを次のように起動できます。

bin/kc.[sh|bat] start --hostname https://my.keycloak.org --http-enabled true

この構成の結果、HTTPS 経由で https://my.keycloak.org で Keycloak に引き続きアクセスでき、プロキシは HTTP とポート 8080 を使用してインスタンスと対話します。

リバースプロキシの使用

プロキシが http リクエストまたは再暗号化された TLS リクエストを転送する場合、proxy-headers オプションを設定する必要があります。ホスト名設定によっては、URL の一部またはすべてが動的に決定される場合があります。

forwarded または xforwarded のいずれかが選択されている場合は、リバースプロキシが Forwarded ヘッダーまたは X-Forwarded-* ヘッダーをそれぞれ適切に設定および上書きしていることを確認してください。これらのヘッダーを設定するには、リバースプロキシのドキュメントを参照してください。構成を誤ると、Keycloak がセキュリティ脆弱性にさらされることになります。

完全に動的な URL。

たとえば、リバースプロキシが Forwarded ヘッダーを正しく設定し、ホスト名をハードコードしたくない場合、Keycloak はこれに対応できます。サーバーを次のように起動するだけで済みます。

bin/kc.[sh|bat] start --hostname-strict false --proxy-headers forwarded

この構成では、サーバーは Forwarded ヘッダーによって設定された値を尊重します。これは、すべてのエンドポイントが動的に解決されることも意味します。

部分的に動的な URL

proxy-headers オプションは、hostname オプションが完全な URL として指定されていない場合に、URL を部分的に動的に解決するためにも使用できます。例:

bin/kc.[sh|bat] start --hostname my.keycloak.org --proxy-headers xforwarded

この場合、スキームとポートは X-Forwarded-* ヘッダーから動的に解決されますが、ホスト名は my.keycloak.org として静的に定義されます。

固定 URL

proxy-headers は、ヘッダーがリクエストのオリジンを特定するために使用されるため、hostname が完全な URL に設定されている場合でも依然として関連性があります。例:

bin/kc.[sh|bat] start --hostname https://my.keycloak.org --proxy-headers xforwarded

この場合、X-Forwarded-* ヘッダーから動的に解決されるものはありませんが、X-Forwarded-* ヘッダーはリクエストの正しいオリジンを特定するために使用されます。

管理コンソールを別のホスト名で公開する

管理コンソールを別のホストで公開する場合は、次のコマンドで実行できます。

bin/kc.[sh|bat] start --hostname https://my.keycloak.org --hostname-admin https://admin.my.keycloak.org:8443

これにより、バックエンドが https://my.keycloak.org を引き続き使用している間、https://my.keycloak.org で Keycloak に、https://admin.my.keycloak.org:8443 で管理コンソールにアクセスできます。

ホスト名オプションとプロキシオプションは、サーバーがリッスンするポートを変更しないことに注意してください。代わりに、プロキシの前面で使用される JavaScript や CSS リンク、OIDC well-known エンドポイント、リダイレクト URI などの静的リソースのポートのみを変更します。サーバーがリッスンしている実際のポートを変更するには、HTTP 構成オプションを使用する必要があります。詳細については、All configuration を参照してください。
hostname-admin オプションを使用しても、hostname オプションで指定されたフロントエンド URL を介して Administration REST API エンドポイントにアクセスすることを防ぐことはできません。Administration REST API へのアクセスを制限する場合は、リバースプロキシレベルで実行する必要があります。管理コンソールは、hostname-admin オプションで指定された URL を使用して API に暗黙的にアクセスします。

背景 - サーバーエンドポイント

Keycloak は、それぞれ異なる目的を持ついくつかのエンドポイントを公開しています。これらは通常、アプリケーション間の通信またはサーバーの管理に使用されます。ここでは、3 つの主要なエンドポイントグループを認識します。

  • フロントエンド

  • バックエンド

  • 管理

これらのエンドポイントのいずれかを使用する場合は、ベース URL を設定する必要があります。ベース URL は、いくつかの部分で構成されています。

  • スキーム (例: https プロトコル)

  • ホスト名 (例: example.keycloak.org)

  • ポート (例: 8443)

  • パス (例: /auth)

各グループのベース URL は、トークンが発行および検証される方法、ユーザーを Keycloak にリダイレクトする必要があるアクション (たとえば、メールリンクを介してパスワードをリセットする場合) のリンクが作成される方法、および最も重要なこととして、アプリケーションが realms/{realm-name}/.well-known/openid-configuration から OpenID Connect Discovery Document をフェッチするときにこれらのエンドポイントを検出する方法に重要な影響を与えます。

フロントエンド

ユーザーとアプリケーションは、フロントチャネルを介して Keycloak にアクセスするためにフロントエンド URL を使用します。フロントチャネルは、パブリックにアクセス可能な通信チャネルです。たとえば、ブラウザベースのフロー (ログインページへのアクセス、パスワードをリセットするためのリンクのクリック、またはトークンのバインド) は、フロントチャネルリクエストと見なすことができます。

フロントエンド URL 経由で Keycloak にアクセスできるようにするには、hostname オプションを設定する必要があります。

bin/kc.[sh|bat] start --hostname my.keycloak.org

バックエンド

バックエンドエンドポイントは、パブリックドメインまたはプライベートネットワークを介してアクセスできるものです。これらは、Keycloak とクライアント (Keycloak によって保護されたアプリケーション) 間の直接的なバックエンド通信に関連しています。このような通信は、リバースプロキシを回避して、ローカルネットワーク経由で行われる場合があります。このグループに属するエンドポイントの例としては、認証エンドポイント、トークンおよびトークンイントロスペクションエンドポイント、userinfo エンドポイント、JWKS URI エンドポイントなどがあります。

hostname-backchannel-dynamic オプションのデフォルト値は false です。これは、バックチャネル URL がフロントチャネル URL と同じであることを意味します。受信リクエストヘッダーからのバックチャネル URL の動的解決は、次のオプションを設定することで有効にできます。

bin/kc.[sh|bat] start --hostname https://my.keycloak.org --hostname-backchannel-dynamic true

hostname オプションは URL に設定する必要があることに注意してください。詳細については、以下の Validations セクションを参照してください。

管理

ベースフロントエンド URL と同様に、管理コンソールのリソースとエンドポイントのベース URL を設定することもできます。サーバーは、特定の URL を使用して管理コンソールと静的リソースを公開します。この URL は、リダイレクト URL、リソース (CSS、JS) のロード、Administration REST API などに使用されます。これは、hostname-admin オプションを設定することで実行できます。

bin/kc.[sh|bat] start --hostname https://my.keycloak.org --hostname-admin https://admin.my.keycloak.org:8443

繰り返しますが、hostname オプションは URL に設定する必要があります。詳細については、以下の Validations セクションを参照してください。

URL を解決するためのソース

前のセクションで示したように、URL はいくつかの方法で解決できます。動的に生成したり、ハードコードしたり、または両方の組み合わせにしたりできます。

  • 受信リクエストからの動的

    • ホストヘッダー、スキーム、サーバーポート、コンテキストパス

    • プロキシ設定ヘッダー: Forwarded および X-Forwarded-*

  • ハードコード

    • サーバー全体の構成 (例: hostnamehostname-admin など)

    • フロントエンド URL のレルム構成

検証

  • hostname URL および hostname-admin URL は、スキームとホスト名を含む完全な URL が使用されていることが検証されます。ポートは存在する場合にのみ検証され、それ以外の場合は、指定されたプロトコルのデフォルトポート (80 または 443) が想定されます。

  • 本番プロファイル (kc.sh|bat start) では、--hostname または --hostname-strict false のいずれかを明示的に構成する必要があります。

    • これは、--hostname-strict false がデフォルト値である開発プロファイル (kc.sh|bat start-dev) には適用されません。

  • --hostname が構成されていない場合

    • hostname-backchannel-dynamic は false に設定する必要があります。

    • hostname-strict は false に設定する必要があります。

  • hostname-admin が構成されている場合、hostname は URL (ホスト名だけでなく) に設定する必要があります。そうしないと、管理コンソールにアクセスするときに、Keycloak は正しいフロントエンド URL (ポートなどを含む) を認識できません。

  • hostname-backchannel-dynamic が true に設定されている場合、hostname は URL (ホスト名だけでなく) に設定する必要があります。そうしないと、動的に解決されたバックチャネル経由でアクセスされたときに、Keycloak は正しいフロントエンド URL (ポートなどを含む) を認識できません。

さらに、ホスト名が構成されている場合、hostname-strict は無視されます。

トラブルシューティング

ホスト名構成のトラブルシューティングを行うには、専用のデバッグツールを使用できます。これは次のように有効にできます。

Keycloak の構成
bin/kc.[sh|bat] start --hostname=mykeycloak --hostname-debug=true

Keycloak が正常に起動したら、ブラウザを開いて次の URL にアクセスします: http://mykeycloak:8080/realms/<your-realm>/hostname-debug

関連オプション

表 1. デフォルトでは、このエンドポイントは無効になっています (--hostname-debug=false)

ホスト名

サーバーが公開されるアドレス。

完全な URL、またはホスト名のみを指定できます。ホスト名のみが指定されている場合、スキーム、ポート、およびコンテキストパスはリクエストから解決されます。

CLI: --hostname
Env: KC_HOSTNAME

hostname:v2 機能が有効になっている場合にのみ使用可能

hostname-admin

管理コンソールにアクセスするためのアドレス。

hostname オプションで指定されたアドレスとは異なるアドレスのリバースプロキシを使用して管理コンソールを公開する場合は、このオプションを使用します。

CLI: --hostname-admin
Env: KC_HOSTNAME_ADMIN

hostname:v2 機能が有効になっている場合にのみ使用可能

hostname-backchannel-dynamic

ホスト名、スキーム、ポート、およびコンテキストパスを含む、バックチャネル URL の動的解決を有効にします。

アプリケーションがプライベートネットワーク経由で Keycloak にアクセスする場合は true に設定します。true に設定した場合、hostname オプションは完全な URL として指定する必要があります。

CLI: --hostname-backchannel-dynamic
Env: KC_HOSTNAME_BACKCHANNEL_DYNAMIC

hostname:v2 機能が有効になっている場合にのみ使用可能

truefalse (デフォルト)

hostname-debug

/realms/master/hostname-debug でアクセス可能なホスト名デバッグページを切り替えます。

CLI: --hostname-debug
Env: KC_HOSTNAME_DEBUG

hostname:v2 機能が有効になっている場合にのみ使用可能

truefalse (デフォルト)

hostname-strict

リクエストヘッダーからのホスト名の動的解決を無効にします。

リバースプロキシが Host ヘッダーを上書きしない限り、本番環境では常に true に設定する必要があります。有効にした場合、hostname オプションを指定する必要があります。

CLI: --hostname-strict
Env: KC_HOSTNAME_STRICT

hostname:v2 機能が有効になっている場合にのみ使用可能

true (デフォルト)、false

このページについて