fn-knock の前段に Alibaba Cloud ESA を配置
Alibaba Cloud ESA を fn-knock の前段に置き、DNS、TLS、エッジ配信を担わせることができます。オリジンサーバーは引き続き fn-knock ゲートウェイです。ESA の設定によって、fn-knock の認証、セッション、Host ルーティング、アクセスポリシーを迂回しないようにしてください。
接続前の確認
- ESA を経由しない経路で、サブドメインマッピングの動作を確認済みである。
- 認証用 Host と各サービス用 Host について、DNS、証明書、上流の転送先が確定している。
- ESA から、fn-knock が公開するアドレス、ポート、プロトコルでオリジン接続できる。
- ESA を迂回する管理経路または切り戻し経路を確保している。
設定の要点
サブドメインマッピング → サブドメインモード → エッジ経由の実クライアント IP 検出でAlibaba Cloud ESAを選びます。ゲートウェイはAli-Real-Client-IPを読み取り、認識したアドレスをX-Forwarded-Forで認証サービスへ渡します。ESA 側では、マネージド変換リクエストヘッダーを有効にしてください。- ESA にサイトを追加し、認証用 Host とサービス用 Host のオリジンを fn-knock ゲートウェイへ向けます。
- Host ヘッダー、WebSocket、実クライアント IP のヘッダーをオリジンまでそのまま渡します。
- 認証、コールバック、API、その他の動的パスはキャッシュをバイパスします。静的ファイルをキャッシュする前に、Cookie や認証処理を壊さないことを確認してください。
- 実際の外部ネットワークから、ログイン、サービス画面、ファイルダウンロード、長時間接続を順にテストします。
オリジン設定
ESA のオリジンサーバーには、fn-knock ゲートウェイへ到達できるアドレスを指定します。ポートは実際のゲートウェイポートを使い、デフォルトは 7999 です。管理入口の 7991 や内部バックエンドのポートをオリジンにしないでください。認証用 Host とサービス用 Host は同じオリジンを共有できますが、元の Host ヘッダーを fn-knock へ渡す必要があります。
ESA から HTTPS でオリジン接続する場合は、fn-knock 側の証明書がオリジン Host をカバーし、証明書チェーンがプラットフォームの検証を通る必要があります。HTTP でオリジン接続し、利用者から ESA までは HTTPS となる構成では、前段から渡されるプロトコル情報が原因で、アプリが http:// のコールバック URL や Cookie を生成していないか確認してください。
次のリクエストは動的コンテンツとして扱います。
- 認証画面と認証 API。
- OIDC、QQ などの外部ログインコールバック。
- ログアウト、セッション状態、パスキー、
Set-Cookieを含むレスポンス。 - サービス側のログイン、アップロード、ダウンロード署名、WebSocket ハンドシェイク。
静的ファイルは、Cookie、ユーザー、権限によってレスポンスが変化しないことを確認してからキャッシュします。Set-Cookie を含むレスポンスをキャッシュせず、非公開データを含むキャッシュオブジェクトを複数ユーザーで共有しないでください。
実クライアント IP の信頼境界
ESA をプロバイダーとして選ぶと、Ali-Real-Client-IP がクライアントアドレスの判定に使われます。攻撃者が ESA を迂回してオリジンへ直接接続できる場合、同名のヘッダーを偽装できてしまいます。ファイアウォール、クラウドのセキュリティグループ、またはオリジン側のアクセス制御で、ESA のオリジン接続ノードと必要な運用元だけにゲートウェイ入口を許可してください。
管理入口を一般公開された ESA サイトに通してはいけません。リモート管理が必要な場合は、VPN、アクセスを制限したリバースプロキシ、その他の独立した管理経路を使用します。
トラブルシューティング
モバイル回線から、経路全体をテストします。
- 未ログイン状態でサービス用 Host へアクセスし、認証フローへ進むことを確認します。
- ログインを完了し、サービス用 Host へ戻ることを確認します。
- リクエストログで、
クライアント IPが利用者のアドレスであることを確認します。接続元 IPは ESA ノードでも問題ありません。また、Ali-Real-Client-IPが表示されることを確認してください。 - リクエストの Host、認証結果、上流 Target、レスポンス状態を確認します。
- ログアウト、外部ログインのコールバック、WebSocket、ファイル転送をテストします。
- ESA を迂回してオリジンへ直接接続し、ネットワーク層で拒否されることを確認します。
ログインループ、静的ファイルの読み込み異常、地域ルールの誤判定が起きた場合は、fn-knock のマッピングを変更する前に、ESA のキャッシュルール、オリジン Host、外部プロトコル、Cookie ドメイン、クライアント IP ヘッダーを確認します。リクエストが fn-knock のログに現れない場合は、DNS、ESA のオリジンヘルス、オリジン側ネットワークを調べてください。ログに 502 が表示される場合は、fn-knock からサービスの Target までを切り分けます。
切り戻し
変更前に、元の DNS、オリジン接続プロトコル、ポート、証明書、キャッシュポリシーを保存します。切り戻す場合は、元の入口を復元するか ESA プロキシを無効にしてから、fn-knock のエッジ実クライアント IP プロバイダーを現在の経路に合う設定へ戻します。DNS の伝播中は、新旧の入口で異なる Cookie ドメインやキャッシュルールを使わないでください。
ESA のコンソールやプランごとの機能は変更されることがあります。エッジ側の操作は ESA 公式ドキュメントを参照してください。
