AWS Network Firewall のドロップアクションの挙動を確認する

記事タイトルとURLをコピーする

エンタープライズクラウド部の山下(祐)です。

本ブログでは、AWS Network Firewall(以下、NFW)のステートフルルールのドロップアクションで選択可能な、「確立された接続のパケットをドロップ」と「すべてをドロップ」の挙動の違いを確認します。
「標準ステートフルルール(以下、5-tuple)」「ドメインリスト」「Suricata互換ルール(以下、Suricata)」それぞれのルールグループ形式毎の挙動も見ていきたいと思います。

ステートフルルールのドロップアクションとは

どのステートフルルールにも一致しないパケットに対して実行されるドロップアクションです。 ファイアウォールポリシーでルールの順序を「厳密な順序」にした際に、オプションで選択可能です。

「確立された接続のパケットをドロップ」と「すべてをドロップ」の2種類があり、それぞれ以下のような挙動となります。

確立された接続のパケットをドロップ – 確立された接続のパケットだけをドロップします。この場合、上位レイヤーの接続に必要なレイヤ 3 とレイヤ 4 の接続確立パケットを確立し、既に確立されている接続のパケットをドロップできます。基盤となるプロトコルの下位レイヤーのハンドシェイク部分を許可する追加のルールを記述しなくても、アプリケーションレイヤーのパスルールをデフォルト拒否設定に記述できます。

すべてをドロップ – クライアントとサーバー間の最初のハンドシェイク中に、未確立のパケットを始めとするすべてのパケットをドロップします。このオプションはドメインリストのルールグループとは互換性がありません。

(※設定画面に表示される説明より引用)


公式ドキュメントでは以下リンクに記述があります。 https://docs.aws.amazon.com/network-firewall/latest/developerguide/suricata-rule-evaluation-order.html#suricata-strict-rule-evaluation-order


簡潔にまとめると以下のような挙動となります。

ドロップアクション 挙動
確立された接続のパケットをドロップ ・TCPコネクションは自動で許可される
すべてをドロップ ・TCP接続についても、明示的な許可をする必要がある
・ドメインリストと互換性がない


検証

それでは、実際にNFWを構築し、設定を変えながら、パケットがどのように許可/ドロップされるのか確認します。

検証構成

検証構成は下図の通りです。EC2からインターネットへのアウトバウンド通信(「www.serverworks.co.jp」へのHTTP/HTTPS接続)をNFWのステートフルルールで制御します。ルールの設定を変えながら、挙動の変化を見ていきます。 EC2にはAWS Systems Manager(以下、SSM)のセッションマネージャーでログインします。 EC2とSSM間の通信はVPCエンドポイント経由で行います。NFWを経由させないようにして、検証の影響を受けないようにしたいためです。


NFWではステートレスルールは使用せず、すべてステートフルルールグループに転送させます。

検証結果の結論

検証の結果、以下が確認できました。

  • 「確立された接続のパケットをドロップ」では、明示的にドロップ/拒否しない限り、どのポート番号へのTCP接続も可能。(アプリケーション接続に関しては、ルールで許可した接続のみ可能)
  • 「すべてをドロップ」では、TCP接続も明示的な許可が必要。
  • 「すべてをドロップ」でドメインリストを設定しても、許可したドメインへのHTTP/HTTPS接続は出来ない。(下位レイヤーのTCP接続が出来ないため)
  • 複数ルールグループがある場合、すべてのルールグループに合致しない場合に初めて「デフォルトのアクション」が適用される。
  • 5-tupleでは、TCP/80、TCP/443を許可すれば、「すべてをドロップ」でもHTTP、HTTPS接続が可能。「TCP/80」の許可があれば、「HTTP」の許可は不要。
  • 特定ドメインへの接続を許可しつつ、不要なポートへのTCP接続をドロップしたい場合、Suricataを利用する。

検証結果サマリ

続いて、ルールグループ形式とドロップアクションの組み合わせ毎の、TCP接続/アプリケーション接続の可否について表形式でまとめました。

5-tuple:確立された接続のパケットをドロップ

ルール TCP接続 アプリケーション接続
HTTPを許可 80:OK
443:OK
HTTP:OK
HTTPS:NG
HTTPを許可
TCP443を許可
80:OK
443:OK
HTTP:OK
HTTPS:OK
HTTPを許可
TCP443をドロップ
80:OK
443:NG
HTTP:OK
HTTPS:NG

HTTPしか許可していない場合でも、443ポートへのTCP接続は可能でした。 443ポートへのTCP接続をドロップする設定を入れた際に初めて、当該通信がNGとなりました。

5-tuple:すべてをドロップ

ルール TCP接続 アプリケーション接続
HTTPを許可 80:NG
443:NG
HTTP:NG
HTTPS:NG
TCP80を許可 80:OK
443:NG
HTTP:OK
HTTPS:NG
TCP80を許可
TCP443を許可
80:OK
443:OK
HTTP:OK
HTTPS:OK

HTTPのみを許可した場合、TCP接続がNGとなりました。そのため、アプリケーションレイヤーの接続も出来ませんでした。 TCP/80、TCP/443を許可したところ、HTTP/HTTPの接続が出来ました。 TCP/80を許可していれば、HTTPの許可設定は要りませんでした。

ドメインリスト:確立された接続のパケットをドロップ

許可ドメイン 検査プロトコル TCP接続 アプリケーション接続
.serverworks.co.jp HTTP 80:OK
443:OK
HTTP:OK
HTTPS:NG
.serverworks.co.jp HTTPS 80:OK
443:OK
HTTP:NG
HTTPS:OK
.serverworks.co.jp HTTP
HTTPS
80:OK
443:OK
HTTP:OK
HTTPS:OK

検査プロトコルの指定によらず、TCP接続は全てOKでした。 アプリケーション接続は、検査対象としたプロトコルのみOKでした。

ドメインリスト:すべてをドロップ

許可ドメイン 検査プロトコル TCP接続 アプリケーション接続
.serverworks.co.jp HTTP 80:NG
443:NG
HTTP:NG
HTTPS:NG
.serverworks.co.jp HTTPS 80:NG
443:NG
HTTP:NG
HTTPS:NG
.serverworks.co.jp HTTP
HTTPS
80:NG
443:NG
HTTP:NG
HTTPS:NG

検査プロトコルの指定によらず、TCP接続は全てNGでした。 よって、上位レイヤーのアプリケーション接続も全てNGでした。

Suricata:確立された接続のパケットをドロップ

ルール TCP接続 アプリケーション接続
.serverworks.co.jp 向けの HTTPを許可 80:OK
443:OK
HTTP:OK
HTTPS:NG
.serverworks.co.jp 向けの HTTPを許可
.serverworks.co.jp 向けの TLSを許可
80:OK
443:OK
HTTP:OK
HTTPS:OK
.serverworks.co.jp 向けの HTTPを許可
.serverworks.co.jp 向けの TLSを許可
TCP443をドロップ
80:OK
443:NG
HTTP:OK
HTTPS:NG

明示的にドロップする設定を入れない限り、TCP接続はOKとなりました。 アプリケーション接続は、許可したもののみOKとなりました。

Suricata:すべてをドロップ

ルール TCP接続 アプリケーション接続
.serverworks.co.jp 向けの HTTPを許可
.serverworks.co.jp 向けの TLSを許可
80:NG
443:NG
HTTP:NG
HTTPS:NG
.serverworks.co.jp 向けの HTTPを許可
TCP80を許可
.serverworks.co.jp 向けの TLSを許可
TCP443を許可
80:OK
443:OK
HTTP:OK
HTTPS:OK

明示的に許可設定を入れない限り、TCP接続はNGとなり、上位レイヤーのアプリケーション接続もNGとなりました。 TCP接続とアプリケーション接続の双方について、明示的に許可設定を入れることで、アプリケーション接続がOKとなりました。

検証結果詳細

最後に、各ルールグループ形式での具体的なルール内容と、EC2のログについて、まとめて記載します。

5-tuple:確立された接続のパケットをドロップ

ファイアウォールポリシーの設定は下図の通りです。 「5-tuple-strict」のルールの内容を変えながら、挙動を確認します。

HTTPを許可

「5-tuple-strict」でHTTPのみ許可します。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 03:15:12 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.serverworks.co.jp/
*   Trying 210.152.14.43:443...
* Connected to www.serverworks.co.jp (210.152.14.43) port 443
* ALPN: curl offers h2,http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$
sh-4.2$

1~6行目ではHTTPリクエストがリダイレクトされており、問題なく接続できていることが確認できました。
HTTPSリクエストについては、13行目でTCP接続が出来ていることは確認できましたが、16行目以降のTLS接続が成功せずにタイムアウトしています。

HTTPを許可・TCP/443を許可

「5-tuple-strict」でHTTP・TCP/443を許可します。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 03:20:14 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
HTTP/1.1 200 OK
Date: Wed, 10 Apr 2024 03:20:36 GMT
Server: Apache
Accept-Ranges: bytes
Vary: Accept-Encoding,User-Agent
Content-Type: text/html

sh-4.2$

HTTPはリダイレクトされており、HTTPSでは200 OKが返ってきています。 どちらも問題なく接続できました。

HTTPを許可・TCP/443をドロップ

「5-tuple-strict」でHTTPを許可し、TCP/443はドロップさせます。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 03:23:26 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.serverworks.co.jp/
*   Trying 210.152.14.43:443...
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$

HTTPはリダイレクトされており、問題なく接続できています。 HTTPSはタイムアウトしています。13~14行目の内容から、TCP接続が失敗していることが確認できました。

5-tuple:すべてをドロップ

ファイアウォールポリシーの設定は下図の通りです。 「5-tuple-strict」のルールの内容を変えながら、挙動を確認します。

HTTPを許可

「5-tuple-strict」でHTTPのみ許可します。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v http://www.serverworks.co.jp/
*   Trying 210.152.14.43:80...
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.serverworks.co.jp/
*   Trying 210.152.14.43:443...
* Connection timed out after 3000 milliseconds
* Closing connection
curl: (28) Connection timed out after 3000 milliseconds
sh-4.2$

HTTP・HTTPSともにタイムアウトしており、接続できませんでした。また、6行目、16行目のログから、TCP接続が出来ていないことも確認できました。

TCP/80を許可

「5-tuple-strict」でTCP/80のみ許可します。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 03:42:57 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.serverworks.co.jp/
*   Trying 210.152.14.43:443...
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$

HTTP接続は問題なく出来ました。
HTTPSに関しては、TCP接続の時点で失敗していました。

TCP/80を許可・TCP/443を許可

「5-tuple-strict」でTCP/80・TCP/443を許可します。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 03:46:29 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
HTTP/1.1 200 OK
Date: Wed, 10 Apr 2024 03:46:40 GMT
Server: Apache
Accept-Ranges: bytes
Vary: Accept-Encoding,User-Agent
Content-Type: text/html

sh-4.2$

HTTPはリダイレクトされており、HTTPSでは200 OKが返ってきています。 どちらも問題なく接続できました。

ドメインリスト:確立された接続のパケットをドロップ

ファイアウォールポリシーの設定は下図の通りです。 「Domain-list-strict」のルールの内容を変えながら、挙動を確認します。

HTTPを検査

「Domain-list-strict」で「.serverworks.co.jp」を許可します。検査対象はHTTPとします。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 09:44:23 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.serverworks.co.jp/
*   Trying 210.152.14.43:443...
* Connected to www.serverworks.co.jp (210.152.14.43) port 443
* ALPN: curl offers h2,http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
* Connection timed out after 3000 milliseconds
* Closing connection
curl: (28) Connection timed out after 3000 milliseconds
sh-4.2$

HTTP接続は問題なく出来ました。
HTTPS接続はタイムアウトしていますが、14行目のログから、TCP接続は成功していることが確認できました。

HTTPSを検査

「Domain-list-strict」で「.serverworks.co.jp」を許可します。検査対象はHTTPSとします。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v http://www.serverworks.co.jp/
*   Trying 210.152.14.43:80...
* Connected to www.serverworks.co.jp (210.152.14.43) port 80
> GET / HTTP/1.1
> Host: www.serverworks.co.jp
> User-Agent: curl/8.3.0
> Accept: */*
>
* Operation timed out after 3001 milliseconds with 0 bytes received
* Closing connection
curl: (28) Operation timed out after 3001 milliseconds with 0 bytes received
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
HTTP/1.1 200 OK
Date: Wed, 10 Apr 2024 09:50:55 GMT
Server: Apache
Accept-Ranges: bytes
Vary: Accept-Encoding,User-Agent
Content-Type: text/html

sh-4.2$

HTTP接続はタイムアウトしました。が、6行目のログから、TCP接続は成功していることが確認できました。
HTTPS接続は200 OKが返ってきており、問題なく接続できました。

HTTP・HTTPSを検査

「Domain-list-strict」で「.serverworks.co.jp」を許可します。検査対象はHTTP/HTTPSとします。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 10:02:08 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
HTTP/1.1 200 OK
Date: Wed, 10 Apr 2024 10:02:24 GMT
Server: Apache
Accept-Ranges: bytes
Vary: Accept-Encoding,User-Agent
Content-Type: text/html

sh-4.2$

HTTPはリダイレクトされており、HTTPSでは200 OKが返ってきています。 どちらも問題なく接続できました。

ドメインリスト:すべてをドロップ

ファイアウォールポリシーの設定は下図の通りです。 「Domain-list-strict」のルールの内容を変えながら、挙動を確認します。

HTTPを検査

「Domain-list-strict」で「.serverworks.co.jp」を許可します。検査対象はHTTPとします。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v http://www.serverworks.co.jp/
*   Trying 210.152.14.43:80...
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.serverworks.co.jp/
*   Trying 210.152.14.43:443...
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$

HTTP・HTTPSともにタイムアウトしており、接続できませんでした。また、6行目、16行目のログから、TCP接続が出来ていないことも確認できました。

HTTPSを検査

「Domain-list-strict」で「.serverworks.co.jp」を許可します。検査対象はHTTPSとします。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v http://www.serverworks.co.jp/
*   Trying 210.152.14.43:80...
* Connection timed out after 3000 milliseconds
* Closing connection
curl: (28) Connection timed out after 3000 milliseconds
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.serverworks.co.jp/
*   Trying 210.152.14.43:443...
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$

HTTP・HTTPSともにタイムアウトしており、接続できませんでした。また、6行目、16行目のログから、TCP接続が出来ていないことも確認できました。

HTTP・HTTPSを検査

「Domain-list-strict」で「.serverworks.co.jp」を許可します。検査対象はHTTP/HTTPSとします。


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v http://www.serverworks.co.jp/
*   Trying 210.152.14.43:80...
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.serverworks.co.jp/
*   Trying 210.152.14.43:443...
* Connection timed out after 3000 milliseconds
* Closing connection
curl: (28) Connection timed out after 3000 milliseconds
sh-4.2$

HTTP・HTTPSともにタイムアウトしており、接続できませんでした。また、6行目、16行目のログから、TCP接続が出来ていないことも確認できました。

Suricata:確立された接続のパケットをドロップ

ファイアウォールポリシーの設定は下図の通りです。 「Suricata-strict」のルールの内容を変えながら、挙動を確認します。

HTTPを許可

「Suricata-strict」で「.serverworks.co.jp」向けのHTTP接続を許可します。

pass http $HOME_NET any -> any 80 (http.host; dotprefix; content:".serverworks.co.jp"; endswith; msg:"Allow HTTP access to Serverworks."; sid:1000000; rev:1;)


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 11:31:38 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.serverworks.co.jp/
*   Trying 210.152.14.43:443...
* Connected to www.serverworks.co.jp (210.152.14.43) port 443
* ALPN: curl offers h2,http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
* Connection timed out after 3000 milliseconds
* Closing connection
curl: (28) Connection timed out after 3000 milliseconds
sh-4.2$

HTTP接続は問題なく出来ました。
HTTPS接続はタイムアウトしていますが、14行目のログから、TCP接続は成功していることが確認できました。

HTTPを許可・TLSを許可

「Suricata-strict」で「.serverworks.co.jp」向けのHTTP接続・TLS接続を許可します。

pass http $HOME_NET any -> any 80 (http.host; dotprefix; content:".serverworks.co.jp"; endswith; msg:"Allow HTTP access to Serverworks."; sid:1000000; rev:1;)
pass tls $HOME_NET any -> any 443 (tls.sni; dotprefix; content:".serverworks.co.jp"; endswith; msg:"Allow TLS access to Serverworks."; sid:1000010; rev:1;)


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 12:39:36 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
HTTP/1.1 200 OK
Date: Wed, 10 Apr 2024 12:39:48 GMT
Server: Apache
Accept-Ranges: bytes
Vary: Accept-Encoding,User-Agent
Content-Type: text/html

sh-4.2$

HTTPはリダイレクトされており、HTTPSでは200 OKが返ってきています。 どちらも問題なく接続できました。

HTTPを許可・TLSを許可・TCP/443をドロップ

「Suricata-strict」で「.serverworks.co.jp」向けのHTTP接続・TLS接続を許可します。TCP/443への接続はドロップさせます。

pass http $HOME_NET any -> any 80 (http.host; dotprefix; content:".serverworks.co.jp"; endswith; msg:"Allow HTTP access to Serverworks."; sid:1000000; rev:1;)
pass tls $HOME_NET any -> any 443 (tls.sni; dotprefix; content:".serverworks.co.jp"; endswith; msg:"Allow TLS access to Serverworks."; sid:1000010; rev:1;)
drop tcp $HOME_NET any <> $EXTERNAL_NET 443 (flow:not_established; sid:1000011; rev:1;)


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 12:46:27 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.serverworks.co.jp/
*   Trying 210.152.14.43:443...
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$

HTTP接続は問題なく出来ました。
HTTPS接続はタイムアウトしており、14行目のログから、TCP接続も失敗していることが確認できました。

Suricata:すべてをドロップ

ファイアウォールポリシーの設定は下図の通りです。 「Suricata-strict」のルールの内容を変えながら、挙動を確認します。

HTTPを許可・TLSを許可

「Suricata-strict」で「.serverworks.co.jp」向けのHTTP接続・TLS接続を許可します。

pass http $HOME_NET any -> any 80 (http.host; dotprefix; content:".serverworks.co.jp"; endswith; msg:"Allow HTTP access to Serverworks."; sid:1000000; rev:1;)
pass tls $HOME_NET any -> any 443 (tls.sni; dotprefix; content:".serverworks.co.jp"; endswith; msg:"Allow TLS access to Serverworks."; sid:1000010; rev:1;)


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v http://www.serverworks.co.jp/
*   Trying 210.152.14.43:80...
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.serverworks.co.jp/
*   Trying 210.152.14.43:443...
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$

HTTP・HTTPSともにタイムアウトしており、接続できませんでした。また、6行目、16行目のログから、TCP接続が出来ていないことも確認できました。

HTTPを許可・TCP/80を許可・TLSを許可・TCP/443を許可

「Suricata-strict」で「.serverworks.co.jp」向けのHTTP接続・TLS接続を許可します。 加えて、TCP/80・TCP/443への接続も明示的に許可します。

pass http $HOME_NET any -> any 80 (http.host; dotprefix; content:".serverworks.co.jp"; endswith; msg:"Allow HTTP access to Serverworks."; sid:1000000; rev:1;)
pass tcp $HOME_NET any <> $EXTERNAL_NET 80 (flow:not_established; sid:1000001; rev:1;)
pass tls $HOME_NET any -> any 443 (tls.sni; dotprefix; content:".serverworks.co.jp"; endswith; msg:"Allow TLS access to Serverworks."; sid:1000010; rev:1;)
pass tcp $HOME_NET any <> $EXTERNAL_NET 443 (flow:not_established; sid:1000011; rev:1;)


この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 13:08:44 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
HTTP/1.1 200 OK
Date: Wed, 10 Apr 2024 13:08:53 GMT
Server: Apache
Accept-Ranges: bytes
Vary: Accept-Encoding,User-Agent
Content-Type: text/html
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.amazon.com/
^C
sh-4.2$
sh-4.2$ curl -m 3 -v https://www.amazon.com/
*   Trying 162.219.225.118:443...
* Connected to www.amazon.com (162.219.225.118) port 443
* ALPN: curl offers h2,http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
* Connection timed out after 3001 milliseconds
* Closing connection
curl: (28) Connection timed out after 3001 milliseconds
sh-4.2$

HTTPはリダイレクトされており、HTTPSでは200 OKが返ってきています。 どちらも問題なく接続できました。
また、念のため、許可していないドメイン(www.amazon.com)へのHTTPS接続も試しましたが、こちらはタイムアウトしました。TCP接続は成功しました。

(※失敗例)ドメインリスト+5-tuple:すべてをドロップ

ファイアウォールポリシーの設定は下図の通りです。ドロップアクションは「すべてをドロップ」を選択します。


「Domain-list-strict」で「.serverworks.co.jp」を許可します。検査対象はHTTP/HTTPSとします。 また、「5-tuple-strict」でTCP/80・TCP/443を許可します。



この設定で、EC2から「www.serverworks.co.jp」宛てに curl を実行したログが以下です。

sh-4.2$ curl -I http://www.serverworks.co.jp/
HTTP/1.1 301 Moved Permanently
Date: Wed, 10 Apr 2024 17:11:21 GMT
Server: Apache
Location: https://www.serverworks.co.jp/
Content-Type: text/html; charset=iso-8859-1
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.serverworks.co.jp/
HTTP/1.1 200 OK
Date: Wed, 10 Apr 2024 17:11:33 GMT
Server: Apache
Accept-Ranges: bytes
Vary: Accept-Encoding,User-Agent
Content-Type: text/html
sh-4.2$
sh-4.2$
sh-4.2$ curl -I https://www.yahoo.co.jp/
HTTP/2 200
server: nginx
date: Wed, 10 Apr 2024 17:11:40 GMT
content-type: text/html; charset=utf-8
content-length: 0
etag: W/"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"
vary: Accept-Encoding
x-vcap-request-id: 07ac419a-33fd-4be6-49e1-167e2bd78484
x-xss-protection: 1; mode=block
age: 0
accept-ch: Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model, Sec-CH-UA-Platform-Version, Sec-CH-UA-Arch
permissions-policy: ch-ua-full-version-list=*, ch-ua-model=*, ch-ua-platform-version=*, ch-ua-arch=*
permissions-policy: unload=()
sh-4.2$

ドメインリストで許可していない「www.yahoo.co.jp」へのHTTPS接続も成功してしまいました。 5-tupleでTCP/443向けの通信を全て許可しており、そちらのルールに合致してしまうためです。
そのため、この方式では、特定ドメインへの接続を許可しつつ、不要なポートへのTCP接続をドロップする、といった制御が出来ません。



以上、ドロップアクションの挙動の確認でした。
かなり長文のブログとなってしまいましたが、各ルールグループ形式毎の挙動をじっくり調査・比較することで、理解が深まりました。
皆様のドロップアクションのご理解のために、本ブログが少しでもお役に立てば幸いです。

山下 祐樹(執筆記事の一覧)

2021年11月中途入社。前職では情シスとして社内ネットワークの更改や運用に携わっていました。 2023 Japan AWS All Certifications Engineers。