🕯️

【サービス別】SYNフラッド (Flood) 攻撃 対策機能

2021/11/20に公開

趣旨

前回の記事で、SYNフラッド(Flood)攻撃とSYN Cookieについて、紹介しました。
しかし、対策となる機能は、SYN Cookieの中でも様々な種類があり、SYN Cookie以外にもあります。
そこで今回は、各サービス別の対策機能と設定方法を紹介していきたいと思います。


Linux

大半のLinux ディストリビューションでは、デフォルトでSYN Cookieが有効になっています
設定ファイルを見てましょう。

$ cat /proc/sys/net/ipv4/tcp_syncookies
1

1で有効、0で無効です。
無効にする場合は、vimコマンドやechoコマンドを使います。

$ vim /proc/sys/net/ipv4/tcp_syncookies
1
# Insertモードから0に変更

$ echo 0 > /proc/sys/net/ipv4/tcp_syncookies

AWS

AWSでは、AWS Shieldというサービスが該当し、SYNCookieとは別物の対策機能になります。
AWS Shieldとは、SYNフラッド攻撃をはじめとするDDos攻撃専用のセキュリティサービスです。

Standard と Advancedに分かれており、Standardはレイヤ3・4層の保護機能で、全ユーザが無料で使うことができます。
SYNフラッド攻撃はレイヤ4層なので、Standardで充分ですね。

Standardに関しては、ユーザ側から設定する必要はありません。
Cloud Front とRoute53を使用すれば、自動で適用されます。

各エッジロケーションに配置されているため、上記2つのサービスどちらかを使えば、通信が勝手に経由してくれるという仕組みです。
逆に、いずれのサービスも使わないと利用は不可能ということですね。
図解すると以下の通りです。

攻撃の自動検知・自動緩和は、AWS独自のシステムによって成り立っており、攻撃の96%を緩和します。詳細な情報は、下記ブラックベルトの資料が参考になるかと思います。
【AWS Black Belt Online Seminar】AWS Shield


Ciscoルータ

Ciscoルータでも、SYNCookieとは異なる対策機能を持っています。
TCPインターセプトといい、着信したTCPパケットをすべて検査する機能です。
ルータに高負荷がかかるため、一般的には採用されませんが、参考情報として説明します。

TCPインターセプトは、InterceptモードとWatchモードの2種類に分かれています。
Interceptモードは、リバースプロキシのような役割を果たします。
まず、背後にいるサーバ向けのTCPパケットを横取りし、クライアントと3wayハンドシェイクを行います。
クライアントから正常にACKパケットが返ってきたら、横取りしたSYNパケットをサーバに送信し、ルータ-サーバ間で3wayハンドシェイクを行います。
オリジナルのSYNパケットを保持しておけば、シーケンス番号がずれないため、コネクション確立後はクライアント-サーバ間で直接通信ができます。

図解すると以下の通りです。

Interceptモードでは閾値が設定されており、ハーフオープン状態のパケット数が一定数を越えたら、新規パケットを受け取るごとに古いものを削除していきます。
これによって、ACKパケットが送信されないSYNフラッド攻撃を見極め、サーバを保護することができます。

Wacthモードは、その名の通り監視機能です。
クライアントとサーバの3wayハンドシェイクを監視し、30秒以内にコネクションが確立されなかった場合は、ルータからRSTパケットを送信して、通信を切断するという機能です。
コネクション確立までの時間によって、SYNフラッド攻撃を検知するという仕組みですね。

設定方法は以下の通りです。
まず、TCPインターセプトを適用するパケットを決めます。
例では、192.168.1.0/24 宛のTCPパケットに対して適用しています。

(config)# access-list 任意の番号 permit tcp any 対象のセグメント

-例
 (config)# access-list 100 permit tcp any 192.168.1.0 0.0.0.0.255

次に、TCPインターセプトを有効化し、モードを選択します。
デフォルトでは、Interceptモードが適用されます。
例では、wachモードを選択しています。

(config)# ip tcp intercept mode intercept/watch

-例
 (config)# ip tcp intercept mode watch

次に、最初に設定した「access-list」を、番号を指定して紐づけます。
例では、「access-list 100」で作成したため、「list 100」になっています。

(config)# ip tcp intercept list access-listの番号

-例
 (config)# ip tcp intercept list 100

最後に、「access-list」を着信するインターフェイスに紐づけて終わりです。

(config)# Interface 対象のインターフェイス名
(config-if)# ip access-group 100 in 

-例
 (config)# Interface GigabitEthernet0/0
 (config-if)# ip access-group 100 in

まとめ

Linux,AWS,Ciscoの紹介をしました。
また新たなものがあったら追加していきます!

Discussion