オリジンクローキング
概要
オリジンクローキングは、ウェブアプリケーションの攻撃対象領域を減らすことを目的とした一連の手法です。DDoS 攻撃や望ましくないボットに対する保護などのセキュリティ制御が適用されるウェブアプリケーションへの単一のエントリポイントとして CloudFront を使用するのがベストプラクティスです。オリジンクローキングは、CloudFront のエントリポイントから送信されないトラフィックをブロックするファイアウォールルールを使用して、悪意のある攻撃者が CloudFront とそのセキュリティコントロールを迂回してオリジンに直接攻撃するのを防ぎます。オリジンクローキングは、OSI モデルの複数のレイヤーで実現できます。
アプリケーション層で
ネットワーク層でのオリジンクローキングは、オリジンを直接ターゲットとするすべての攻撃からオリジンを保護します。ただし、攻撃者は発見したオリジンドメイン名で CloudFront ディストリビューションを設定し、CloudFront ディストリビューションを介してアプリケーションレイヤー攻撃でオリジンを標的にして、独自の CloudFront ディストリビューションに設定されたセキュリティコントロールを効果的にバイパスする可能性があります。
オリジンドメイン名を難読化することに加えて(例:origin.example.comは避けてください!)CloudFront とオリジンの間にアプリケーションレイヤーのアクセス制御を追加して、上記のリスクを軽減できます。これは、オリジンタイプとセキュリティ要件に応じてさまざまな方法で実装できます。
署名リクエストに基づくアクセス制御
OAC は CloudFront の機能で、IAM ポリシーに基づく AWS 署名バージョン 4 アルゴリズム (sigv4) を使用して、特定のタイプのオリジンへのリクエストにネイティブに署名できます。現在、OAC は S3 、メディアストア、メディアパッケージ、Lambda 関数 URL 、および S3 オブジェクトラムダと互換性があります。OAC を S3 で使用すると、S3 バケットポリシーに基づいて CloudFront に排他的にアクセスできるため、S3 バケットをプライベートに保つことができます。
オリジンタイプが OAC でサポートされていない場合は、エッジ関数を使用してオリジンへのリクエストに署名できます。実装例については、以下のブログで説明されています。
アクセス制御ベースの共有秘密鍵
オリジンがリクエスト署名をサポートしていない場合や、アプリケーションにこのレベルのアクセス制御が必要ないと考えられる場合は、共有シークレットを含むカスタムヘッダーをオリジンに送信するように CloudFront を設定できます。このヘッダーは、オリジンで検証されてリクエストを処理できます。次の実装例を考えてみましょう。
- ALB ベースのオリジン。ALB ベースのオリジンでシークレットヘッダーを検証するには、ALB ルールを使用するか、ALB が既に AWS WAF WebACL に関連付けられている場合は AWS WAF ルールを使用します。
- API ゲートウェイベースのオリジン。API キーを使用して API ゲートウェイのシークレットヘッダーを検証できます。
- NGINX ベースのオリジン。CloudFront が abc123 という値を持つカスタムヘッダー X-CloudFront を送信すると仮定すると、/etc/nginx/nginx.conf Nginx 設定ファイルのサーバータグに次のコードを追加することで、Nginx ベースのウェブサーバー (クラウドベースまたはオンプレミスベース) のシークレットヘッダーを検証できます。
もし ($http_x_cloudfront!=「abc123」) {
403 を返します。
} - アパッチベースの起源。CloudFront が abc123 という値を持つカスタムヘッダー X-CloudFront を送信すると仮定すると、 httpd.conf 構成ファイル (および使用されている場合は ssl.conf ファイル) に次のコードを追加することで、Apache ベースのウェブサーバー (クラウドベースまたはオンプレミスベース) のシークレットヘッダーを検証できます。
リライトエンジンオン
Cond% {http: X-CloudFront} を書き直してください!^abc123$ [NC]
リライトルール ^-[F]
いずれの場合も、シークレットが漏洩するリスクを減らすために、この共有シークレットを定期的にローテーションすることをお勧めします。上記で共有したサンプル実装では、API Gateway と ALB の両方にシークレットローテーションの自動化が含まれています。
ネットワーク層で
CloudFront は、サービスフィールドの CLOUDFRONT_ORIGIN_FACING 値を使用して、オリジンとの TCP 接続の確立に使用される IP アドレスを公開します。オリジンのファイアウォールに ACL を実装して、CloudFront のオリジン側 IP から発信されていないトラフィックをブロックできます。この方法では、ACL を更新するには IP の変更をサブスクライブする必要があります。サードパーティのファイアウォールを使用してオンプレミスのウェブサーバーにオリジンクロッキングを実装する方法については、このブログ記事をご覧ください。
オリジンが Amazon VPC でホストされている場合は、オリジンにアタッチされたセキュリティグループ (EC2、NLB、ALB など) に AWS が管理する Amazon CloudFront のプレフィックスリストを追加するだけで、オリジンクローキングを簡単に実装できます。
いずれの場合も、 CloudFront とオリジン間で TLS 経由で安全な接続を確立することをお勧めします。
物理層で
オリジンがオンプレミスにある場合は、 Direct Connect 接続のパブリック仮想インターフェイスを使用して、オンプレミスのインフラストラクチャと AWS の間に AWS Direct Connect を設定することを検討してください。これにより、オリジンと CloudFront 間のトラフィックは、インターネットからはアクセスできないプライベートマネージドネットワークで転送されます。