こちらの記事では、SYN flood攻撃の仕組みと対策方法について、図を用いながら解説します。
SYN flood攻撃とは、Webサーバーなどをターゲットにし、サービスを妨害する目的として行われるDoS(Denial of Service)攻撃の一つです。TCP SYN floodやSYN flooding attack、SYNフラッド攻撃などと表現されます。
この攻撃では、攻撃者が3ウェイハンドシェイクの最後の確認応答であるACKパケットを送信しないようにし、サーバーを攻撃者からのACKパケット待ち状態にします。こうすることで、サーバーは新たな接続要求を受け付けられなくなります。
このようにして、SYN flood攻撃ではサーバーを大量の応答待ち状態にさせることで、機能低下やOSのダウンにより正常なサービスを提供できなくさせることを目的とします。
TCP 3ウェイハンドシェイクの仕組み
はじめに、SYN flood攻撃を理解する上で大切な、3ウェイハンドシェイクとはどういった内容なのかを理解しましょう。その後、SYN flood攻撃の特徴を説明します。
TCPではデータ通信を行う前に、通信相手との間で通信を始める準備を行います。この準備のことを3ウェイハンドシェイクと呼び、TCPでは最初にコネクション確立要求のSYNパケットを送信する側をクライアント、受信する側をサーバーと呼びます。
はじめに、クライアントがサーバーへコネクション確立要求であるSYNパケットを送信します。
次に、SYNパケットを受け取ったサーバーは、その情報をBacklogキューと呼ばれる領域へ一時的に保存し、受信したSYNパケットに対する確認応答のACKパケットとSYNパケットをクライアントへ送信します。
サーバーからのACK/SYNパケットを受信したクライアントは、サーバーに対してACKパケットを送信します。
クライアントからのACKパケットをサーバーが受信すると、コネクションが確立します。
このように、3ウェイハンドシェイクを行い、コネクションが確立することで通信することができるようになります。
逆に言えば、確認応答が返ってこない場合、通信を開始することができません。
SYN flood攻撃の特徴
SYN flood攻撃の特徴は次の通りです。
- サーバーのハーフオープン状態を狙い、Backlogキューの容量を圧迫させる。
- 多くの場合、IPアドレスを偽装すること(IP Spoofing)で攻撃が行われる。
Backlogキューの容量を圧迫させる
SYN flood攻撃は、OSI参照モデル第4層、トランスポート層のプロトコルであるTCPを利用した攻撃です。TCPではコネクション確立のため、3ウェイハンドシェイクを行います。
OSI参照モデルについては、次の記事をご覧ください。
https://envader.plus/article/38
SYN flood攻撃の目的は、攻撃者がターゲットのサーバーに対しSYNパケットを大量に送り、Backlogの容量を圧迫することで、他の正当なリクエストを拒否させるようにすることです。以下、その流れを詳しく説明します。
はじめに攻撃者は、コネクションの確立要求であるSYNパケットをサーバーへ送信します。
サーバーは攻撃者からSYNパケットを受信すると、Backlogキューへその情報を一時的に保存します。(Backlogキューには情報を保存できる上限がある。)
その後、攻撃者側へ確認応答であるSYN/ACKパケットを送信します。この状態がハーフオープン状態にあたり、コネクションがまだ確立していない状態です。
ここで攻撃者は、IPアドレスの偽装やボットネットなどを使用し、最後のACKパケットを送信しない状況を作り出します。この時点ではコネクションはまだ確立していないため、サーバーは攻撃者からのACKパケットを待ち続けます。
この状態からさらに、攻撃者は新たなSYNパケットをサーバーへ送り続けます。すると、Backlogの容量が圧迫されていき、保存容量の上限値に達します。
Backlogの容量が上限値に達してしまった場合、正当なリクエストが送られてきても、そのリクエストは拒否されてしまいます。
SYN flood攻撃は、このBacklogの容量を溢れさせる(flood)ことで、正規のクライアントとの通信をできなくさせる手法なのです。
RFC4987では、SYN flood攻撃について以下のように記載されていました。以下一部抜粋します。
The SYN flooding attack does not attempt to overload the network's resources or the end host's memory, but merely attempts to exhaust the backlog of half-open connections associated with a port number. SYNフラッディング攻撃は、ネットワークのリソースやエンドホストのメモリに過負荷をかけようとするのではなく、単にポート番号に関連する半開きの接続のバックログを使い果たそうとするものである。
IPアドレスの偽装(IP Spoofing)
攻撃者は多くの場合、ACK/SYNパケットを無視する状況を作り出すため、IPアドレスの偽装を行います。このIPアドレスの偽装のことを、IP Spoofing(スプーフィング)と言います。
IP Spoofingは、IPアドレスをspoof(だます)技術です。
攻撃者からのIPアドレスは偽装されているため、サーバーは攻撃者へパケットを返すのではなく、この偽装されたIPアドレスに対してACK/SYNパケットを送り返してしまうため、最後のACKパケットを受け取ることができず、ACKパケットの待ち状態になってしまうのです。
IP Spoofingを行う方法の一つに、ポートスキャンを行うNmapを使う方法があります。Nmapでは、コマンドオプションを使うことで送信元IPアドレスを変更することができます。
ポートスキャンやNmapについては、別の記事で解説しています。
https://envader.plus/article/89
SYN flood攻撃への対策
SYN flood攻撃を受けてしまい、サーバーのダウンなどにより正常にサービスを提供できなくなってしまえば、その影響は非常に大きいものになるでしょう。SYN flood攻撃への対策として、今回は次の3つを取り上げます。
SYN Cookiesによる対策
Backlogの容量を圧迫させないようにするために用いられるのが、SYN Cookiesです。
通常、3ウェイハンドシェイクではSYNパケットを受け取るとその情報をBacklogへ保存します。SYN Cookiesは、Backlogへ情報を保存しないようにすることで、容量が圧迫されるのを防ぐ手法です。
SYN Cookiesでは、クライアントからSYNパケットを受け取ると、サーバーは受け取った情報をBacklogへは保存せず、その情報をハッシュ化してSYN/ACKパケットのシーケンス番号に埋め込みます。その後、SYN/ACK+ハッシュ値をクライアントへ送ります。
SYN/ACK+ハッシュ値を受け取ったクライアントは、シーケンス番号を流用したACKパケットをサーバーへ返します。
ACKパケットを受け取ったサーバーは、シーケンス番号からハッシュ値を計算し、正しい確認応答であることを確認して、初めてBacklogへ情報を保存します。
こうすることで、データの保存容量を圧迫されることなく、コネクションを確立することができます。
通信する相手が攻撃者の場合、IPアドレスの偽装などにより、SYN/ACK+ハッシュ値の情報をサーバーへ返すことがないため、攻撃者とのやり取りがサーバーへ保存されることはありません。結果、Backlogの容量を無駄に消費することがなくなります。
SYN Cookiesの詳細な説明についても、RFC4987で確認できます。RFCの中で説明されている通り、SYN Cookiesに関する問題点も存在するため、実装する際にはその問題点に対しても検討する必要があるでしょう。
Backlogの容量を増加させる
Backlogには保存できる上限がある、と先ほど紹介しました。容量を圧迫されて正常なリクエストを拒否してしまわないよう、Backlogを保存できる上限を増やしてしまおうというのがこの方法です。こうすることで、ハーフオープン状態の接続数を増やすことができます。
ただし、Backlogの容量を増やすということは、メモリなどのリソースを余分に消費させることになるため、こちらも実装する際には、どこまでBacklogを増加させることが最適なのかなど、検討する必要があります。
IDS/IPSの導入
SYN flood攻撃を行なっているIPアドレスを特定できる場合には、IDS(侵入検知システム)やIPS(侵入防止システム)を導入し通信を遮断することも有効です。
IDSはネットワーク上のパケットやノードのログを監視し、不正アクセスの兆候を検知した場合、管理者に警告を通知してくれる仕組みです。
IPSは不正アクセスを検知した場合に通信を遮断するなどして、自身のネットワークを守ってくれる機器です。
WAFやIDS・IPSについては以下の記事で解説しています。
https://envader.plus/article/21
まとめ
SYN flood攻撃はTCPの3ウェイハンドシェイクの仕組みを利用し、サーバーの機能低下やOSのダウンなどを引き起こす攻撃です。
RFC4987では複数の対策方法が記されていますが、どの対策を取るにしても問題点があることが分かります。それぞれのメリットデメリットをよく理解し、より堅牢なシステムの構築を行なっていきましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.07.29
インフラ・クラウドエンジニア必見!AzureとAWSのRBACの違いを徹底解説
クラウドサービスを利用する上で、セキュリティとアクセス管理は非常に重要です。特にAzureとAWSは、それぞれ独自のRBAC(ロールベースアクセス制御)を提供しており、その違いを理解することが求められます。本記事では、初心者インフラ・クラウドエンジニアに向けて、AzureとAWSのRBACの違いを詳しく解説します。
- AWS
- Azure
- サイバーセキュリティ
- インフラエンジニア
2022.12.19
CSRF(クロスサイトリクエストフォージェリ)の仕組みと対策
CSRFの呼び名は複数あり、「シーサーフ」、「XSRF」、「リクエスト強要」、「セッションライディング」などと呼ばれます。
- サイバーセキュリティ
2024.07.23
セキュリティエンジニアのお仕事 必須スキルは?どんな業務をするの?
今回は、セキュリティエンジニアのお仕事について詳しく解説します。「セキュリティエンジニアの基本」や「必要なスキル」「日々の業務」までわかりやすく紹介しています。
- サイバーセキュリティ