iptablesでできるDoS/DDoS対策:iptablesテンプレート集 改訂版(7)(1/3 ページ)
この連載では、初心者にとってハードルの高いiptablesの設定を、テンプレートを用いながら紹介していきます。「習うより慣れよ!」の精神でまず試してみてはいかがでしょう。(編集部)
はじめに
今回はDoS/DDoS対策を紹介します。今回はiptablesを使った方法とともに、Linuxのカーネルパラメータを使った方法も紹介します。
関連リンク:
→Linuxで作るファイアウォール[パケットフィルタリング設定編]
http://www.atmarkit.co.jp/flinux/rensai/security05/security05a.html
→連載記事 「習うより慣れろ! iptablesテンプレート集」
http://www.atmarkit.co.jp/flinux/index/indexfiles/iptablesindex.html
→連載記事 「習うより慣れろ! iptablesテンプレート集 改訂版」
http://www.atmarkit.co.jp/flinux/index/indexfiles/newiptablesindex.html
DoS/DDoS対策の難しさ
DoS攻撃(Denial of Service attacks)はネットワークの帯域を消費するほか、大量のリクエストでサーバのコネクションを食いつぶし、サーバを利用不能に陥れます。またパスワードを解読しようと総当たりで接続を試みるブルートフォース(Brute Force)攻撃も横行しています。
攻撃元が1台のホストならIPアドレスに基づいて規制できますが、攻撃元を特定できないDDoS(Distributed Denial of Service attacks)攻撃にはほかの手段が必要です。そこで、リクエスト応答回数に制限を設けるといった対策を実施します。
2通りの対策方法
パケットをカウントし回数で制限するのに、iptablesには2種類のモジュールが用意されています。
1つは、第1回でログの出力を抑制するために使用した「limit」モジュールです。パケットをカウントし、回数に応じて制限を実施します。ただし送信元のIPアドレスで回数制限を加えるには、対象のIPアドレスを都度指定しiptablesを実行する必要があります。そのため送信元を特定できないDDoS攻撃には役立ちません。
もう1つの「hashlimit」モジュールなら、クライアントのIPアドレスごとにパケット数をカウントし、iptables実行時にクライアントごとに制限を実施することができます。その際、個々のIPアドレスを指定する必要もありません。
今回は、次の3つのDoS/DDoS対策方法を解説します。
テンプレート12
応答回数を制限する(limit編)
サーバとして
・受信パケットは破棄。ただしステートフル性を確認しサーバから送信されたパケットに関連するものは許可
・送信パケットは基本的にすべて許可
・ループバックアドレスに関してはすべて許可
・サーバからのDNS問い合わせ(UDP 53)を許可
・pingリクエストを許可
・ssh接続を許可
DoS/DDoS対策のため
・pingリクエストに対し1分間に10回までしか応答しない
・ssh接続リクエストに対し1分間に1接続に限定
テンプレート12の解説
いままでのテンプレートでは、Linuxサーバに対してpingに対する応答やssh接続許可を、特定のホストに限定していました。しかし運用の都合上ホストを限定できない場合もあります。そこで、クライアントのIPアドレスで規制を掛ける代わりに応答回数に制限を設けることで、リスクを低減します。
テンプレート12ではICMP Pingエコーの応答回数を、最大10回(10回リクエストに応答した後は1分に1回)に制限しています。「--limit-burst 10」で最大応答回数を10回としています。10回までは無条件に応答し、11回目の応答は破棄されます。
ただし「--limit 1/m」と指定することで、1分経過するごとに1回の応答が可能になり、もし10分間pingエコーが行われなければ、再び10回までリクエストに応じられるようになります。「--limit 2/m」と指定すれば、1/2分、すなわち30秒に1回の接続が可能になります。
20回までは無制限、それ以降は1分に5回ずつ応答するには「--limit 5/m --limit-burst 20」と設定します。「/m」のほかには「/s(1秒当たり)」「/h(1時間当たり)」といった単位が用意されています。
28 /sbin/iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m --limit-burst 10 -j ACCEPT -A INPUT :受信パケットを指定 -p icmp :ICMPプロトコルを指定 --icmp-type echo-request:pingエコーを指定 -m limit :limitモジュールを有効化 --limit 1/m :1分に1回 --limit-burst 10 :最大10回 -j ACCEPT :条件にマッチしたパケットを許可
テンプレート12では、受信パケット(INPUT)に関するデフォルトルールをDROPとし、破棄しています。ただしステートフル性を確認し、サーバのリクエストに対する受信パケットは許可しています。そのため、28行目のiptablesのマッチしないパケットは破棄されます。しかしデフォルトルールをACCEPTに設定している場合は、次のようにiptablesを実行し、制限に漏れたものを破棄する必要があります。
/sbin/iptables -A INPUT -p icmp --icmp-type echo-request -j DROP -j DENY :条件にマッチしたパケットを破棄
pingエコー以外のものにも応答回数を制限することができます。例えばSSHサービスに対するリクエストに制限を実施するには、「--dport 22」とSSHのサービスポート番号「22番」を指定します。ssh接続中のパケットは規制しないよう、ssh接続開始時のリクエストパケットだけを制限するため「-m state --syn --state NEW」と指定します。そのほか、WWWサービスのリクエストを制限するには、サービスポート番号を変えて「--dport 80」のように指定します。そのほかのサービスにもポート番号を変えることで対応できます。
パケットの規制は「-m limit --limit 1/m --limit-burst 1」としています。1分間に1回までssh接続が可能です。パスワードのタイプミスなどでログインに失敗すると、その後1分間はリクエストを受け付けません。パスワードを総当たりで解析するブルートフォース(Brute force)攻撃には有効です。
34 /sbin/iptables -A INPUT -p tcp --syn -m state --state NEW --dport 22 -m limit --limit 1/m --limit-burst 1 -j ACCEPT
pingエコーのときと同様に、受信(INPUT)パケットのデフォルトルールをACCEPTに設定している場合は、次のようなiptablesの実行が必要です。
/sbin/iptables -A INPUT -p tcp --syn -m state --state NEW --dport 22 -j DROP
limitモジュールの制限では、正常なリクエストも不正アクセスに紛れてしまいます。クライアントごとにリクエスト回数を制限するには、次に紹介するテンプレート13のhashlimitモジュールを使用します。
Copyright © ITmedia, Inc. All Rights Reserved.