🔥

AWS Network Firewall でドメインによるホワイトリスト通信制御

2023/11/14に公開

AWS Network Firewall とは

AWS Network Firewall は、インバウンド・アウトバウンドの通信を制御できるクラウド型ファイアウォールです。AWS のフルマネージドサービスであるため、サーバーや仮想アプライアンスの管理が不要になります。

AWS Network Firewall の展開モデルとして、分散型・集約型・複合型の 3 パターンが考えられます。それぞれのモデルについては以下ページを参考にしてください。

https://aws.amazon.com/jp/blogs/news/networking-and-content-delivery-deployment-models-for-aws-network-firewall/

ユースケース

ホワイトリスト形式のドメインで通信を制御することを考えます。この要件を達成するために自前のプロキシ (Squid) サーバーを運用している組織は多いのではないでしょうか。このユースケースで必要な要素は以下のとおりです。

architecture1

  • AWS Network Firewall 自体
  • AWS Network Firewall 用のサブネット
  • エンドポイントへ向けたルーティング
    • 内部のルーティング
    • エッジのルーティング (Ingress Routing)
  • ステートフルルール
    • ホワイトリスト形式のドメイン

エッジのルーティング (Ingress Routing) は使用経験がない方が多いと思います。これはインバウンドの通信に対してルーティングが可能になる機能です。インバウンドのパケットに対して通信を検査するために設定が必要です。

https://aws.amazon.com/jp/blogs/news/new-vpc-ingress-routing-simplifying-integration-of-third-party-appliances/

AWS Network Firewall にはステートレスルールも存在します。5 タプル形式(ソース IP・ソースポート・宛先 IP・宛先ポート・プロトコル)による制御ができますが、今回は説明を割愛します。

https://docs.aws.amazon.com/ja_jp/network-firewall/latest/developerguide/firewall-rules-engines.html

構成図

以下の構成を作成します。Google への通信のみを許可し、それ以外の通信をドロップします。 セッションマネージャー接続用のドメインも許可しています。

architecture2

構築

以下 Terraform コードを利用してください。コードのリソースとパラメーターを参考にして、マネジメントコンソールから作成しても構いません。

https://github.com/teradatky/aws-network-firewall-sample

AWS Network Firewall の作成コード
Terraform コードにおけるエンドポイント ID の取り出し方

ルーティングに必要なエンドポイント ID は直感的に取り出せません。リポジトリのコードや以下ページを参考にしてください。

Single-AZの場合
vpc_endpoint_id = tolist(aws_networkfirewall_firewall.main.firewall_status[0].sync_states)[0].attachment[0].endpoint_id
Multi-AZの場合
for_each = toset(["ap-northeast-1a", "ap-northeast-1c", "ap-northeast-1d"])
vpc_endpoint_id = [for ss in tolist(aws_networkfirewall_firewall.main.firewall_status[0].sync_states) : ss.attachment[0].endpoint_id if ss.availability_zone == each.value][0]

動作確認

作成された EC2 へセッションマネージャー経由でアクセスしてください。

許可ドメインに含まれる Google へアクセスします。TLS ハンドシェイクに成功しています。

curl -s -v -sslv3 -m 5 https://www.google.com 1> /dev/null

curl_ok

許可外のドメインである Yahoo へアクセスします。通信はタイムアウトしました。

curl -s -v -sslv3 -m 5 https://yahoo.co.jp 1> /dev/null

curl_ng

以上からドメインによる通信制御ができることが確認できました!

注意点

セキュリティ対策効果

悪質な内部犯や高度なマルウェア等には効果がない場合があります。これは AWS Network Firewall は Host ヘッダや SNI の server_name を見ているだけで、実際の通信先を検査していないからです。より詳しい解説は以下ページを参照ください。

https://zenn.dev/osprey/articles/networkfirewall-is-not-for-domainbase-restriction

ドメイン制御を回避してみる

以下コマンドで SNI の内容を偽装します。

curl https://www.google.com --resolv www.google.com:443:183.79.250.251 -H "Host: yahoo.co.jp" --insecure -v

spoofing
Google への通信を偽装することで、Yahoo に通信できてしまう

価格

意外と高額になりがちです。固定費は工夫して削減することが難しく、小~中規模なプロジェクトでは支出の多くを占める可能性があります。以下は東京リージョンでの利用例です。

Type Amount Pricing Total Remarks
Endpoint Charges 720 h * 2 0.395 USD/h 568.8 USD 30 days, Multi-AZ
Data Processing Charges 3000 GB 0.065 USD/GB 195.0 USD 30 days, 100GB/day

まとめ

注意点のように気をつけるべきポイントはありますが、ドメインによるホワイトリスト通信制御として利用可能です。要件を満たせる場合は、マネージドサービスを積極的に利用していきましょう!

GitHubで編集を提案

Discussion