前回のおさらい(AWS Network Firewall の構成要素)
AWS Network Firewall の構成要素
-
- ファイアウォール:ファイアウォール本体
- ファイアウォールポリシー:ファイアウォールに付与するポリシー
- ルールグループ:ファイアウォールポリシーに付与する制御ルール
ルールグループの種類
- ステートレスグループ 5-tuple ルールで評価 行きと戻りのトラフィックはそれぞれ個別にルール設定が必要 ≒ NACL
- ステートフルグループ
片方向どちらかをルール設定すれば OK
≒ セキュリティグループ
以下のルールを使用可能
- 5-tuple ルール
- ドメインリストルール
- Suricata 互換 IPS ルール
ルールの種類
- 5-tuple
ルール以下の項目を設定するルール- 送信元アドレス
- 宛先アドレス
- 送信元ポート番号
- 宛先ポート番号
- プロトコル
- ドメインリストルール
ドメインのリストを作成し、対象ドメインへの HTTP/HTTPS トラフィックを制御できる - Suricata 互換 IPS ルール
Suricata(スリカタ)はオープンソースベースの侵入検知システムおよび侵入防止システムで、標準化されたトラフィック制御ルール記法がある
▼ 例alert tcp any any -> any 22 (msg:"ALERT TCP port 22 but not SSH"; app-layer-protocol:!ssh; sid:2271009; rev:1;)
アクション
ルールで評価した通信に対するアクション
ステートレスルール
- Allow – パケットの通信を許可する
- Drop – パケットの通信をブロックする
- Forward to stateful rule groups – ステートフルルール評価に転送する
※どのステートレスルールにも合致しない通信に対するアクションとしてステートレスデフォルトアクションを上記の 3 つから選んでファイアウォールポリシーに設定できる
※カスタムアクションとしてユーザ任意の CloudWatch メトリクスを出力することも可能
⇒ つまり、ユーザ独自のアクションを組み込むことができる
ステートフルルール
- Pass – パケットの通信を許可する
- Drop – パケットの通信をブロックする
- Alert – パケットの通信を許可するが、アラートログが設定されている場合はアラートログを出力する
※ステートフルルールはデフォルトのアクションが “Pass” になる
⇒ ルールに該当しなかったトラフィックは自動的に許可される(何もルール設定しない場合も許可に相当する)
ルールグループの評価ロジック
- NetworkFirewall への通信はまず最初にステートレスルールで評価される
- ステートレスルールで評価された際、アクションで”Forward to stateful rule group”(ステートフルルールへ転送)が設定されていた通信のみがステートフルルールで評価される
同一ルールグループ内での評価ロジック
ステートレスルール
各ルールに優先度(Priority)が設定でき、その値が小さいものから順に評価される
ステートフルルール
アクションの内容に応じて以下の順に優先で評価される
- Pass
- Drop
- Alert
※注意点- 同一のアクション内では優先度(Priority)の値に応じて評価される
- 優先度(Priority)は Suricata 互換 IPS ルールのみで設定可能
- 同じファイアウォールポリシーに複数のステートフルルールグループが設定されている場合も、全てのルールが Pass⇒Drop⇒Alert の順で評価される
- 公式ドキュメントに記載はないが、5-tuple ルール ⇒ ドメインリストルールの順で評価されるよう(検証済)
ルールの Tips
- VPC 内のシステムコンポーネントが EIP・PublicIP を使用している場合でも、ルールで指定する IP はプライベート IPを使用する
- NATGateway からの通信が NFW を通過する際、送信元 IP は NATGateway の IP アドレスになるため、PrivateSubnet の IP アドレスを送信元 IP に指定したルールを作成しても意味ない
- ステートフルルールは 5-tuple ルール ⇒ ドメインリストルールの順で評価されるため、5-tuple ルールで TCP 通信を全て Drop してしまうとドメインリストで許可している通信も拒否されてしまう
- 逆に 5-tuple ルールで TCP 通信を全て Pass してしまうとドメインリストで拒否しているドメインへの通信も許可されてしまう
- ドメインリストでサブドメインもまとめて指定する場合はネイキッドドメインの前に”.”をつける(例:.example.com)
- TCP 通信を全て Drop すると TCP ハンドシェイク時の通信もドロップされる アプリケーションプロトコル(HTTP とか HTTPS)もおおまかには TCP に分類されるため、TCP を全て Drop する場合は HTTP とかをルールで指定して評価させようとしてもできない ルール設定する方法は以下のどちらか(上の方が簡単)
- プロトコル:TCP とポート番号で指定する(例:HTTPS なら、プロトコル:TCP、送信先ポート番号:443)
- Suricata 互換 IPS ルールで”flow:to_server,established”(セッション確立済)を指定する
- ドメイン解決時の外部の DNS サーバへの DNS クエリの通信はルールによってブロックされない
[引用元(AWS 公式)](https://docs.aws.amazon.com/ja_jp/network-firewall/latest/ developerguide/stateful-rule-groups-domain-names.html)
For HTTPS traffic, Network Firewall uses the Server Name Indication (SNI) extension in the TLS handshake to determine the hostname, or domain name, that the client is trying to connect to. For HTTP traffic, Network Firewall uses the HTTP host header to get the name. In both cases, Network Firewall doesn’t pause connections to do out-of-band DNS lookups.
- 各ルールに設定する”キャパシティ”について、ルールの複雑度に応じてユーザが任意に設定できる
- ステートフルルールでは将来的に設定されるルールの数に応じて適当に決めるっぽい
- ステートレスルールでは計算方法があり、キャパシティを少なく設定しすぎると作成時にエラーになる(多く設定する分には OK)
- 大きくしすぎるとキャパシティの制限に引っかかる恐れがあるので、迷ったら”100″くらいにしとくのが無難?と思われる
- 他の VPC からの通信に対してドメインフィルタリングするには HOME_NET の設定が必要
検証中に浮かんだ疑問
- Q:暗号化された通信の中の情報を取得してのフィルタリングはできる?
- A:できない。やりたい場合は NetworkLoadBalancer とかを前において復号化してあげる必要がある
- Q:HTTPS パケット内の情報である宛先のドメイン情報をどうやって取得してる?暗号化されてたら無理なのでは?
- A:SNI という TLS ハンドシェイク時にクライアントから送る、宛先ドメインが設定されている情報を見ている
Q: Can AWS Network Firewall inspect encrypted traffic? AWS Network Firewall does not currently support deep packet inspection for encrypted traffic. To work around this limitation, you can decrypt traffic using a Network Load Balancer (NLB) before sending it to an AWS Network Firewall endpoint. Also, for HTTPS traffic, AWS Network Firewall can inspect the domain name provided by the Server Name Indicator (SNI) during the TLS handshake
最後に
いかがだったでしょうか。今回は AWS Network Firewall のルールについて詳細に解説しました。 実際に触れてみると細かな制約や決まりがあり、ルールが自分の思うような挙動をしてくれないことが多々ありました。 AWS Network Firewall を使用される方の参考になれば幸いです。
※NetworkFirewall は比較的最近のサービスで頻繁にアップデートされているようなので当記事の情報が古くなることもありますが予めご了承ください。