見出し画像

[セキュリティー] SYNフラグが設定されていない新しいTCP接続をブロックする方法についてChatGPTに教えてもらった(iptables)

今回はiptablesについて、「SYNフラグが設定されていない、新しいTCP接続の試みをブロックする」について、ChatGPTに教えてもらいながら勉強していこうと思います。

以下の記事ではフラットにChatGPTにiptablesの設定を聞きましたが、今回はネットでiptablesの設定ネタを仕入れ、気になった設定についてChatGPTに聞いてみることにしました。

SYNフラグが設定されていない、新しいTCP接続の試みをブロックする

プロンプト

iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
説明してください

ChatGPTの回答

各オプションの意味-A INPUT:

INPUTチェーンにルールを追加します。INPUTチェーンは、ローカルシステムに向かってくるパケットを処理します。
-p tcp:
このルールは、TCPプロトコルに適用されます。
! --syn:
!(エクスクラメーションマーク)は否定を意味します。
--synオプションは、SYNフラグが設定されたTCPパケットを指定します。SYNフラグは、TCP接続の開始を示すフラグです。
! --synは、SYNフラグが設定されていないTCPパケットを指定します。
-m state --state NEW:
-m stateは、状態マッチングモジュールを使用することを指定します。
--state NEWは、パケットが新しい接続を開始しようとしている状態であることを指定します。
-j DROP:
ルールに一致するパケットを破棄します。

ルールの目的

このルールは、SYNフラグが設定されていない新しいTCP接続の試みをブロックするためのものです。通常、新しいTCP接続はSYNフラグが設定されたパケットから始まります。このルールは次のような目的で使用されます:セキュリティ強化:
新しいTCP接続がSYNフラグを持たない場合、これは異常な動作を示しています。たとえば、攻撃者がセッションハイジャックや他の種類のTCPプロトコルの悪用を試みている可能性があります。このルールはそのような不正な接続をブロックします。

不正パケットの除外:
正常なTCP接続の開始は必ずSYNパケットで行われます。SYNフラグなしで新しい接続が開始されることは通常ありません。このルールは、このような異常なパケットを検出してブロックします。

動作の詳細

具体的には、このルールは以下のように動作します:パケットがローカルシステムに到着し、INPUTチェーンで処理されます。
パケットがTCPプロトコルを使用しているかどうかを確認します。
パケットが新しい接続(--state NEW)であるかどうかを確認します。
パケットにSYNフラグが設定されていない場合(! --syn)、そのパケットはDROPされます。

まとめ

このルールは、新しいTCP接続がSYNフラグを持たない場合にその接続をブロックします。これにより、異常なパケットや潜在的な攻撃を防止し、システムのセキュリティを強化します。

'-m state'オプションについて

プロンプト

'-m state'とは、何ですか

-m state は、iptables でパケットの状態をチェックするためのマッチモジュールです。これにより、接続トラッキングの状態に基づいてパケットをフィルタリングできます。具体的には、パケットが現在どのような状態にあるかを調べ、それに基づいて処理を行うことができます。

接続トラッキングの状態

-m state モジュールを使うことで、パケットが以下の状態のいずれかにあるかをチェックできます:

NEW:
パケットが新しい接続を開始しようとしている状態です。接続トラッキング情報にはまだこの接続が記録されていません。
ESTABLISHED:
パケットが既存の接続に属している状態です。すでに確立された接続からのパケットです。
RELATED:
パケットが既存の接続に関連している状態です。これは、新しい接続ではないが、既存の接続に付随するものです(例えば、FTP データ接続など)。
INVALID:
パケットが無効な状態です。接続トラッカーがこのパケットの状態を識別できない場合にこの状態になります。これには破損したパケットや予期しないパケットが含まれます。

-m state の使用例

-m state を使用することで、特定の状態のパケットに対してルールを適用できます。以下は一般的な使用例です:

新しい接続を許可するルール

iptables -A INPUT -m state --state NEW -j ACCEPT

これは、新しい接続を許可するルールです。

既存の接続を許可するルール

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

これは、既に確立された接続や関連する接続からのパケットを許可するルールです。

どのような攻撃をブロックできるか

プロンプト

この設定をすると、具体的にどのような攻撃をブロックできますか

ChatGPTの回答

ブロックできる攻撃や不正な接続試行

TCP セッションハイジャック:
攻撃者が既存の TCP セッションに割り込もうとする場合、通常、新しい接続の開始ではないため SYN フラグが設定されていない TCP パケットを送信します。このルールは、そのような新しいセッションでないパケットが新しい接続として扱われる場合をブロックします。
ステルススキャン(FIN、XMAS、NULL スキャン):
FIN スキャン: 攻撃者は FIN フラグが設定されたパケットを送信し、ポートの状態を判別しようとします。通常の接続開始ではないため、SYN フラグがありません。
XMAS スキャン: 攻撃者は多くのフラグ(FIN、PSH、URG など)が設定されたパケットを送信します。これも新しい接続の開始ではありません。
NULL スキャン: 攻撃者はすべてのフラグがクリアされたパケットを送信します。これも新しい接続の開始ではありません。
異常な接続試行:
正常な TCP 接続は必ず SYN パケットで始まります。新しい接続が SYN パケットで始まらない場合、それは異常です。このルールはそのような異常な新しい接続試行をブロックします。

ルールの具体的な動作正常な新しい接続:
新しい TCP 接続は SYN パケットで始まります。このルールはそのようなパケットには影響しません。
異常な新しい接続:
新しい接続の開始に SYN フラグがない場合、このルールはそのパケットをブロックします。
既存の接続:
既存の接続からのパケット(ESTABLISHED 状態)はこのルールの対象外です。既存の接続のパケットには SYN フラグが設定されていないことが多いためです。

例外

このルールは、以下のような特定のケースには影響しません:正当な接続リセット:
接続をリセットするための RST パケットなど、既存の接続に関連するフラグが設定されたパケットには影響しません。
TCP ハンドシェイクの後続パケット:
TCP ハンドシェイクの最初の SYN パケット以外のパケット(SYN-ACK や ACK パケットなど)には影響しません。

まとめ

この設定により、主に新しい接続試行における異常なパケットや、不正な接続試行(特に SYN フラグなしの新しい接続試行)を効果的にブロックすることができます。結果として、ネットワークやホストのセキュリティが強化され、攻撃者が不正な手法を用いて接続を確立するのを防ぐことができます。

FIN スキャン、XMAS スキャン、NULL スキャンは攻撃者にとって、どのようなメリットがあるか?

プロンプト

FIN スキャン、XMAS スキャン、NULL スキャンは攻撃者にとって、どのようなメリットがありますか

FINスキャン、XMASスキャン、NULLスキャンは、攻撃者がネットワークセキュリティの脆弱性を探るために使用する手法です。それぞれのスキャンには特定のメリットがあり、これらを利用することで攻撃者は以下のような利点を得ることができます。

FINスキャン

FINスキャンは、TCPパケットにFINフラグのみを設定して送信するスキャン方法です。

メリット:ステルス性:
FINパケットは通常のTCP接続の開始(SYNパケット)とは異なるため、ファイアウォールやIDS(侵入検知システム)が見逃しやすいです。SYNパケットに対する防御は一般的ですが、FINパケットに対する防御は少ないことがあります。
OSによる応答の違いの利用:
オープンポートに対しては応答がありませんが、クローズドポートに対してはRSTパケットで応答するという特定のOSの挙動を利用できます。


XMASスキャン

XMASスキャンは、TCPパケットにFIN、URG、PSHフラグを設定して送信するスキャン方法です。この名前は「クリスマスツリーのようにフラグが全部点灯している」ことから来ています。

メリット:ステルス性:
多くのファイアウォールやIDSは、XMASスキャンを正常なトラフィックと誤認する可能性があり、検出を逃れることができます。
異なるOS応答の利用:
オープンポートは無応答、クローズドポートはRSTで応答するため、これも特定のOSの挙動を利用してネットワークの状態を調査できます。

NULLスキャン

NULLスキャンは、すべてのTCPフラグがクリアされた(つまり、フラグが全く設定されていない)パケットを送信するスキャン方法です。

メリット:ステルス性:
他のスキャン方法と同様に、NULLスキャンは一般的なセキュリティデバイスに検出されにくいです。特に全てのフラグがクリアされているため、異常なトラフィックと見なされないことがあります。
OS依存の応答の利用:
こちらもオープンポートは無応答、クローズドポートはRSTで応答するため、OSの違いを利用してネットワークの情報を得ることができます。


まとめ

これらのスキャン手法は、それぞれのフラグ設定によって異常なトラフィックとして認識されにくく、ステルス性を高めることができます。さらに、特定のOSの応答の違いを利用して、ネットワークやホストのポートの状態を判別することができます。

以下にそれぞれのスキャンの一般的な特長をまとめます:FINスキャン: ステルス性が高く、ファイアウォールに見つかりにくい。オープンポートは無応答、クローズドポートはRST応答。
XMASスキャン: ステルス性が高く、複数のフラグを立てることで通常のトラフィックと誤認されやすい。オープンポートは無応答、クローズドポートはRST応答。
NULLスキャン: すべてのフラグがクリアされているため、検出されにくい。オープンポートは無応答、クローズドポートはRST応答。


これらのスキャンは、それぞれの特徴を利用して、ネットワークの脆弱性を探るために効果的に使用されます。

iptables設定後の動作確認について

プロンプト

上記の設定を動作確認したい

上記の設定を動作確認するためには、以下の手順を実行します。これには、ルールを設定してから、そのルールが正しく動作していることを確認するためのテストを含みます。

手順ルールを設定する まず、iptables にルールを追加します。

sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

ルールの確認 追加されたルールを確認します。

sudo iptables -L INPUT -v -n

このコマンドの出力に、設定したルールが表示されていることを確認します。
テスト用のツールを準備する
テストには nc (netcat) や nmap などのツールを使用できます。ここでは ncnmap を使用した例を示します。
正常な接続を確認する 別のホストから正常な TCP 接続を試みて、接続が成功することを確認します。

nc -zv <ターゲットIP> <ポート番号>

例えば、ターゲットホストの 80 番ポートに接続を試みる場合:

nc -zv <ターゲットIP> 80

期待される結果: 接続が成功します。
異常な接続を試みる SYN フラグがない新しい接続を試みるには、nmap の FIN スキャンや NULL スキャンを使用します。
FIN スキャン:

nmap -sF <ターゲットIP>

NULL スキャン:

nmap -sN <ターゲットIP>

期待される結果: これらのスキャンがブロックされるため、接続が失敗します。

ログを確認する ルールの動作を確認するためにログを有効にして、ブロックされたパケットのログを確認することもできます。

sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "iptables: new connection without SYN: "
sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

ログは通常、/var/log/syslog または /var/log/messages に記録されます。これを確認するには:

sudo tail -f /var/log/syslog

期待される結果: ログに「iptables: new connection without SYN:」というメッセージが表示され、該当するパケットがログに記録されます。

まとめ

この手順に従うことで、設定したルールが正しく動作していることを確認できます。特に、正常な接続は許可され、異常な接続(SYN フラグがない新しい接続)はブロックされることを確認することで、ルールが意図したとおりに機能していることを検証できます。

おわりに

最後まで読んで頂き、ありがとうございます!

一つのiptablesの設定ネタで、様々なセキュリティーネタに発展していくので、今回も色々と勉強になりました!わからない点があるとすぐにChatGPTに聞けるのでスムーズに学習できたと思います。

iptablesの設定ネタはこれ以外にもたくさんありますが、ネットで拾ってきたiptablesの設定をコピペで済ませるのではなく、目的を把握した上で設定する方が良いのかなと思いました。
念の為の設定なのか、必ずやっておいた方が設定なのかの見極めたり、設定ミス時のリスクについても整理しながら進めることが大切かと思いました。

iptablesの設定は難しいですが、今後も少しずつ設定ネタを深掘っていこうと思います。

この記事が気に入ったらサポートをしてみませんか?