Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

API GatewayでALBへの直接アクセスをシンプルに制限

By Devanshu KhannaJan 27, 20254 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

マイクロサービスは、インターネットからの直接アクセスを遮断し分離・保護するために、Amazon Virtual Private Cloud (VPC) のプライベートサブネット内にデプロイするのが一般的です。マイクロサービスへの外部アクセスを構成する方法としては、主に次の2つのアプローチがあります。

  • Private Link:インターフェースエンドポイントを利用し、プライベートVPC内のリソースをパブリックインターネットに公開することなくAPI Gatewayへ安全に接続するネットワーク機能です。トラフィックはAWSネットワーク内に閉じたまま流れます。
  • HTTP Integration (インターネット向け):インターネット向けのApplication Load Balancer (ALB) など、パブリックにアクセス可能なHTTPエンドポイントへAPI Gatewayからリクエストをルーティングし、サービスをパブリックエンドポイント経由で公開する方法です。

本記事では、2つ目のアプローチ、つまりAPI Gatewayの背後に配置したインターネット向けALBのセキュリティ強化に焦点を当てます。具体的には、信頼できるクライアントからはAPI Gateway経由でのみアプリケーションにアクセスできるようにしつつ、パブリックALBへの直接アクセスを遮断するという課題を取り上げます。

課題

HTTP Integrationを使ってインターネット向けALBをAPI Gatewayの背後に配置すると、ALB自体がインターネットからアクセス可能な状態になります。信頼できるクライアントはAPI Gateway経由で接続しますが、この構成にはセキュリティ上の大きな落とし穴があります。ALBのパブリックエンドポイントに直接アクセスされてしまえば、API Gatewayが提供するセキュリティ機能をすべて素通りされてしまうのです。

こうしたアクセス制御の不備は、さまざまな脆弱性につながります。アプリケーションのセキュリティと健全性を保つには、ALBへの直接アクセスを確実に防ぐことが欠かせません。すべてのトラフィックをAPI Gateway経由に集約してはじめて、リクエスト検証、スロットリング、認証、認可といった重要なセキュリティ機能を一貫して適用できます。これらの保護がなければ、攻撃者に脆弱性を突かれたり、認証を回避されたり、過剰な負荷でバックエンドを圧迫されたりして、サービス拒否(DoS)攻撃を招く恐れがあります。

AWSはREST API GatewayとAWS Web Application Firewall (WAF) を組み合わせ、特定のヘッダーを持たないリクエストをブロックするソリューションを提供していますが、この方法は構成の複雑さとコストの増加を伴います。なお、SQLインジェクションやクロスサイトスクリプティング (XSS) への対策、ボット軽減など高度なセキュリティ要件があるユースケースでは、AWS WAFは引き続き有力な選択肢です。

本記事では、よりシンプルでコスト効率に優れた代替手段をご紹介します。カスタムヘッダーとALBのルール条件を組み合わせることで、AWS WAFに頼らずに同等のセキュリティを実現できます。この方法はREST API Gateway / HTTP API Gatewayのいずれにもそのまま適用でき、運用負荷を大幅に下げられます。

**ソリューション**

本アプローチでは、ALBが備えるコンテンツベースルーティング機能を活用し、AWS WAFを不要にします。手順は次の3つです。

  1. API GatewayでHTTPリクエストにカスタムヘッダーと値を付与する。
  2. ALBルールでヘッダー検証を行うよう設定する。正しいヘッダーと値を持つリクエストだけが目的のALBルールにマッチし、それ以外はすべてデフォルトルールに流れます。
  3. ALBのデフォルトルールで、403 ForbiddenなどのHTTPエラーコードを返すよう設定する。

アーキテクチャの全体像は次のとおりです。

HTTPリクエストのフロー

**実装手順**

ステップ1:API Gatewayでカスタムヘッダーを定義する

HTTP API Gatewayの場合は、パラメータマッピングを使ってALBインテグレーションへ送るリクエストを書き換えます。

  1. API Gatewayコンソールを開きます。
  2. 対象のHTTP APIに移動します。
  3. 「Integrations」セクションで「Manage Integrations」を開きます。
  4. カスタムヘッダーと値を追加するパラメータマッピングを作成します。

パラメータマッピングの設定

REST API Gatewayをご利用の場合は、こちらのドキュメントを参照してカスタムHTTPヘッダーを追加してください。

ステップ2:ALBルールを設定する

  1. EC2コンソールでALBの設定画面を開きます。
  2. デフォルトルールを除く各リスナールールに対し、以下を行います。
  • AND条件を追加します。
  • 条件タイプに「HTTP header」を指定します。
  • ヘッダー名と想定する値を入力します。

3. デフォルトルールでHTTPエラーレスポンス(例:403 Forbidden)を返すよう設定します。

ALBのルール条件とアクション

ALBのコンテンツベースルーティングの詳細については、AWSのこちらのブログ記事をご覧ください。

ステップ3:設定をテストする

  1. カスタムヘッダーを付けずにALBへリクエストを送信し、デフォルトルールが適用されてエラーレスポンスが返ることを確認します。
  2. API Gateway経由でリクエストを送信し、アプリケーションへ正しくルーティングされることを確認します。

**まとめ**

本ソリューションでは、AWS WAFへの依存をなくすことでアーキテクチャをシンプルに保てます。ALBに標準搭載されているコンテンツベースルーティング機能を活用するだけで、Application Load Balancerへの直接アクセスを安全かつ効率的に制限できます。

さらに詳しく知りたい方や当社のサービスにご関心のある方は、お気軽にお問い合わせください。お問い合わせはこちらから。