Keycloakはデフォルトのまま動いてしまうため、本番投入前に「締める」作業が抜けやすいプロダクトです。HTTPS強制、hostname、adminコンソールの隔離、ブルートフォース防御、CVE追随まで、現場で実際に確認している項目を公式ドキュメントに沿って整理しました。

Keycloakは開発モード(start-dev)なら証明書もhostnameも気にせず起動できてしまう反面、その手軽さのまま本番へ持ち込むと、あとから穴が見つかりがちなプロダクトです。ここでは新しめのQuarkusベース版(WildFly版は非推奨のため、以下はQuarkus版基準です。バージョン依存の挙動は必ず公式で確認してください)を前提に、本番投入前に「締める」項目をチェックリスト形式で整理します。

01まず全体像 — 何を締めるのか

ハードニングと一口に言っても、レイヤは分かれます。ざっくり「入口(TLS/hostname/proxy)」「管理面(adminコンソールの隔離)」「認証防御(ブルートフォース/パスワードポリシー)」「アプリ結合(クライアント設定)」「運用(CVE追随/ヘッダ)」の5層です。下図の順にレビューしていくと漏れが出にくくなります。

入口 — TLS強制 / hostname確定 / proxy-headers https:// をhostnameに固定、9000は公開しない 管理面 — adminコンソール/REST APIの隔離 hostname-admin で別ホスト、proxyで/adminを遮断 認証防御 — ブルートフォース / パスワードポリシー realm単位で有効化、ロックアウト戦略を選定 アプリ結合 — クライアント設定の締め redirect URI厳格化 / confidential / PKCE 運用 — CVE追随 / セキュリティヘッダ リリース購読、HSTS / X-Frame-Options を確認
図:本番前レビューは入口から運用へ、5層の順で点検すると漏れが出にくい

02HTTPS強制とTLSの取り回し

公式ドキュメントは「Keycloakとの通信はすべて安全な通信路を必要とする」と明言しています(Configuring Keycloak for production)。実運用ではTLS終端をどこに置くかで設定が変わります。

加えて、realm単位のSSL Required設定を必ず確認します。値はexternal(プライベートIP以外はHTTPS必須・デフォルト)/all(全リクエストHTTPS必須)/none(開発専用)の3つで、本番では原則allを推奨します。noneのrealmが混ざっていないかは、複数realm運用だと見落としやすいポイントです。

現場のコツ:プロキシ終端構成でproxy-headersを設定し忘れると、リダイレクトURLがhttp://になったりループしたりします。「ログインは通るがリダイレクトで壊れる」症状の大半はここです。同時に、プロキシ側でX-Forwarded-*を外部から詐称されないよう上書き設定にしておくことも忘れずに。

03hostnameを確定させる

Quarkus版のhostname設定(v2)は、動的にリクエストから組み立てるより、本番ではフルURLを固定するのが定石です(Configuring the hostname (v2))。プロキシが443で公開する典型構成なら、次のように起動します。

hostnameを固定しておくと、トークンのissuerやOIDCのメタデータ(.well-known)に出るURLがぶれません。ここが揺れると、RP側のissuer検証やJWKSエンドポイントの解決で地味に事故ります。

04adminコンソールとREST APIの隔離

公式も「攻撃面を減らすため、管理REST APIとコンソールを別ホスト名またはコンテキストパスで公開する」ことをベストプラクティスとして挙げています(Configuring Keycloak for production)。具体策は次の通りです。

なおproxy-headersを使うときに注意すべきは、公開すべきポートの整理です。フロント/バックエンド/管理でホスト名を分けても、実際にプロキシすべきは8443(または8080)だけで、ヘルスチェックとメトリクスが乗る9000番ポートは公開しないのが公式の指針です(Configuring a reverse proxy)。管理系の分離とあわせて、マルチアカウント統制のようにネットワーク境界の設計と一体で考えると整理しやすくなります。

05ブルートフォース防御とパスワードポリシー

見落としが多いのが、ブルートフォース防御はデフォルトで無効という点です(Server Administration Guide)。realm設定の Security defenses > Brute force detection から明示的に有効化します。ロックアウト戦略は用途に応じて選びます。

ロックにより正規ユーザーが締め出されると、それ自体がDoSになり得ます。しきい値・待機時間・最大待機時間はヘルプデスクの運用体制と合わせて決めるのが実務です。また、フェデレーション(LDAP/AD等の外部ストレージプロバイダ)経由のユーザーについても、失敗回数のカウント自体は行われます。ただし読み取り専用のフェデレーションストレージではロックアウト状態を永続化できないケースがあり(この問題は後続バージョンで修正されています)、いずれにせよLDAP/AD連携時はフェデレーション側のネイティブなロックアウトポリシーも併用する多層防御で設計するのが堅実です。

パスワードポリシーも忘れずに。長さ・複雑性・履歴・有効期限をrealmのPassword policyで定義し、要件がある場合はHaveIBeenPwned連携など漏洩パスワード拒否も検討します。

現場のコツ:ブルートフォース防御を入れる際は、必ず「攻撃者にロックされて自分の運用アカウントまで締め出される」ケースを想定してください。master realmの管理者用に、ブルートフォース対象外またはIP制限付きのブレークグラス経路を一つ確保しておくと、いざという時にコンソールへ戻れます。

06クライアント設定の締め

Keycloak本体を固めても、クライアント(RP)側の設定が緩いと台無しです。本番前に各クライアントを次の観点で棚卸しします。

加えて、クライアント登録(dynamic client registration)を開放している場合は、匿名登録を無効にするか初期アクセストークンで制御し、勝手なクライアントが増えないようにします。

07セキュリティヘッダとブラウザ側防御

Keycloakはrealmの Security defenses > Headers で、レスポンスヘッダを設定できます。クリックジャッキング対策のX-Frame-Options(およびContent-Security-Policyのframe-ancestors)、通信を強制するStrict-Transport-Security(HSTS)X-Content-Type-Options: nosniffなどがデフォルトで設定されますが、値が自社要件に合っているかは確認が必要です。特にKeycloakのログイン画面を自社アプリのiframeに埋め込む要件がある場合、frame-ancestorsの緩め方を最小限にとどめないと、クリックジャッキング耐性を自ら削ることになります。CSRF・オープンリダイレクタ・トークン失効ポリシーといった防御も同ガイドにまとまっているので、リリース前に一読をおすすめします(Server Administration Guide)。

08CVE追随と過負荷対策

認証基盤はCVEの影響が直撃するコンポーネントです。KeycloakにはSecurity Policyページがあり、脆弱性はリリースノートで開示されます。運用としては、リリース(セキュリティリリース含む)を購読し、影響評価とパッチ適用のリードタイムをあらかじめ決めておくことが重要です。バージョンアップ手順そのものはバージョンアップ運用の記事もあわせてご覧ください。

可用性面では、公式がhttp-max-queued-requestsによる受付キューの上限設定を挙げています。上限超過時は503を返すことで、認証基盤が過負荷で総崩れになるのを防ぎます(Configuring Keycloak for production)。前段のプロキシ/WAFでのレート制限と組み合わせるのが定石です。

まとめ — 本番前チェックリスト

最後に、本番投入前の確認項目を一覧にします。

EMWではKeycloakによるエンタープライズ認証基盤の実構築を通じ、こうしたハードニングを本番運用まで落とし込んできました。導入事例もあわせてご覧ください。

参考(一次情報)

Keycloakの本番設計・ハードニングでお困りでしたら、実構築の知見を踏まえてお問い合わせください。

相談する
← ブログ一覧へ戻る