AWS Network Firewall でドメインによるホワイトリスト通信制御
AWS Network Firewall とは
AWS Network Firewall は、インバウンド・アウトバウンドの通信を制御できるクラウド型ファイアウォールです。AWS のフルマネージドサービスであるため、サーバーや仮想アプライアンスの管理が不要になります。
AWS Network Firewall の展開モデルとして、分散型・集約型・複合型の 3 パターンが考えられます。それぞれのモデルについては以下ページを参考にしてください。
ユースケース
ホワイトリスト形式のドメインで通信を制御することを考えます。この要件を達成するために自前のプロキシ (Squid) サーバーを運用している組織は多いのではないでしょうか。このユースケースで必要な要素は以下のとおりです。
- AWS Network Firewall 自体
- AWS Network Firewall 用のサブネット
- エンドポイントへ向けたルーティング
- 内部のルーティング
- エッジのルーティング (Ingress Routing)
- ステートフルルール
- ホワイトリスト形式のドメイン
エッジのルーティング (Ingress Routing) は使用経験がない方が多いと思います。これはインバウンドの通信に対してルーティングが可能になる機能です。インバウンドのパケットに対して通信を検査するために設定が必要です。
AWS Network Firewall にはステートレスルールも存在します。5 タプル形式(ソース IP・ソースポート・宛先 IP・宛先ポート・プロトコル)による制御ができますが、今回は説明を割愛します。
構成図
以下の構成を作成します。Google への通信のみを許可し、それ以外の通信をドロップします。 セッションマネージャー接続用のドメインも許可しています。
構築
以下 Terraform コードを利用してください。コードのリソースとパラメーターを参考にして、マネジメントコンソールから作成しても構いません。
AWS Network Firewall の作成コード
一部抜粋です。
Terraform コードにおけるエンドポイント ID の取り出し方
ルーティングに必要なエンドポイント ID は直感的に取り出せません。リポジトリのコードや以下ページを参考にしてください。
vpc_endpoint_id = tolist(aws_networkfirewall_firewall.main.firewall_status[0].sync_states)[0].attachment[0].endpoint_id
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
許可外のドメインである Yahoo へアクセスします。通信はタイムアウトしました。
curl -s -v -sslv3 -m 5 https://yahoo.co.jp 1> /dev/null
以上からドメインによる通信制御ができることが確認できました!
注意点
セキュリティ対策効果
悪質な内部犯や高度なマルウェア等には効果がない場合があります。これは AWS Network Firewall は Host ヘッダや SNI の server_name を見ているだけで、実際の通信先を検査していないからです。より詳しい解説は以下ページを参照ください。
ドメイン制御を回避してみる
以下コマンドで SNI の内容を偽装します。
curl https://www.google.com --resolv www.google.com:443:183.79.250.251 -H "Host: yahoo.co.jp" --insecure -v
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 |
まとめ
注意点のように気をつけるべきポイントはありますが、ドメインによるホワイトリスト通信制御として利用可能です。要件を満たせる場合は、マネージドサービスを積極的に利用していきましょう!
Discussion