iptables

第7回 iptablesでできるDoS/DDoS対策


この連載では、初心者にとってハードルの高いiptablesの設定を、テンプレートを用いながら紹介していきます。「習うより慣れよ!」の精神でまず試してみてはいかがでしょう。(編集部)

鶴長 鎮一
2010/7/14


はじめに

 今回は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の表示(このウィンドウで開く)
テンプレート12の表示(別ウィンドウで開く)
テンプレート12(template12.sh)のダウンロード

テンプレート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           :条件にマッチしたパケットを許可
pingエコーの応答を制限する(10回リクエストに応答した後は1分に1回)

 テンプレート12では、受信パケット(INPUT)に関するデフォルトルールをDROPとし、破棄しています。ただしステートフル性を確認し、サーバのリクエストに対する受信パケットは許可しています。そのため、28行目のiptablesのマッチしないパケットは破棄されます。しかしデフォルトルールをACCEPTに設定している場合は、次のようにiptablesを実行し、制限に漏れたものを破棄する必要があります。

/sbin/iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

-j DENY :条件にマッチしたパケットを破棄
INPUTチェインのデフォルトルールをACCEPTにしている場合の追加設定

 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
ssh接続リクエストに対し1分間に1接続に限定

 pingエコーのときと同様に、受信(INPUT)パケットのデフォルトルールをACCEPTに設定している場合は、次のようなiptablesの実行が必要です。

/sbin/iptables -A INPUT -p tcp --syn -m state --state NEW --dport 22 -j DROP
INPUTチェインのデフォルトルールをACCEPTにしている場合の追加設定

 limitモジュールの制限では、正常なリクエストも不正アクセスに紛れてしまいます。クライアントごとにリクエスト回数を制限するには、次に紹介するテンプレート13のhashlimitモジュールを使用します。

第6回へ
1/3

Index
習うより慣れろ! iptablesテンプレート集 改訂版
第7回 iptablesでできるDoS/DDoS対策
Page 1
はじめに
DoS/DDoS対策の難しさ
2通りプラス1の対策方法
テンプレート12 応答回数を制限する(limit編)
  Page 2
テンプレート13 応答回数を制限する(hashlimit編)
  Page 3
iptablesを使わずにLinuxでできるDoS/DDoS対策
次回予告

連載 習うより慣れろ! iptablesテンプレート集


 Linux Squareフォーラム セキュリティ関連記事
連載:習うより慣れろ! iptablesテンプレート集(全4回)
初心者にとって、iptablesは難しい。そこで、学習の第1歩としてテンプレートを自分の環境に適応させることから始めよう
連載:ゼロから始めるLinuxセキュリティ(全11回)
奥が深いセキュリティ対策の世界をゼロから解説。ホストレベルのセキュリティからファイアウォール、IDSの構築、ログ管理方法まで、システム管理者必見
特集:WebDAV時代のセキュリティ対策[前編]
WebDAVのメソッドは便利な反面、セキュリティホールとなり得る。しかし、適切な対策を講じることでメソッドの危険性は取り除くことができる
特集:FreeS/WANによるIPSecの導入と運用[前編]
LinuxでIPSecを利用するには、「FreeS/WAN」というIPSecスタックを用いることになる。まず、これをインストールすることから始めよう
特集:Linux以外のIPSecスタックとの相互接続[前編]
別のOSや異なるIPSecスタックとの相互接続が可能なら、その用途は大幅に広がる。前編では、FreeBSDのKAMEと相互接続を試みる
特集:sshでセキュアネットワーク
サーバにリモートログインする場合は、暗号化して転送するsshを使おう。sshをサーバとクライアントにインストールすれば、インターネット上でも安全な通信が可能になる

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します

TechTargetジャパン

Linux Square フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ



- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH