iptablesによる負荷分散とDoS対策:習うより慣れろ! iptablesテンプレート集(3)(4/4 ページ)
iptablesを応用すれば、簡易負荷分散システムを構築できる。さらに、DoS対策やQoSの実現方法を紹介する。(編集部)
テンプレート13
ping応答回数制限によるDoS攻撃の防御
テンプレート13の想定環境
・外部からの接続パケットは基本的にすべて破棄
・内部からの接続パケットは基本的にすべて破棄
・ループバックアドレスに関してはすべて許可
・メンテナンスホストからのping、メンテナンスホストへのpingを許可
・メンテナンスホストからのssh(TCP 22)を許可
・サーバからメンテナンスホストへのsshは許可しない
・SYNクッキーを有効化
・ブロードキャストpingに応答しない
・通常pingに1分間に10回までしか応答しない
DoS(Denial of Service attacks)攻撃は、さまざまな手法でターゲットにしたホストのサービスを利用不能に陥れます。最近では、攻撃元が分散化されたDDoS(Distributed Denial of Service attacks)が使用されるなど、手口も巧妙化しています。ここでは、知られている攻撃手法とそれに対する防御法をいくつか紹介します。
テンプレート2以降では、Linuxサーバに対してping応答が使えるクライアントを限定しています。しかし、社内や学内運用の都合上、場合によってはもう少し広い範囲でping応答が使えるように設定する必要があるかもしれません。穴の範囲が広くなれば、それだけリスクも大きくなります。そこで、応答回数に制限を設けることで、リスクを低減します。
テンプレート13の解説
テンプレート13は、テンプレート1に以下の修正を加えています。
32 iptables -A INPUT -p icmp --icmp-type echo-request -s $trusthost -d $myhost -m limit --limit 1/m --limit-burst 10 -j ACCEPT
新たに「-m limit --limit 1/m --limit-burst 10」を追加しました。32行目で1分間に10回応答した後、1分間ロックを掛けて応答を返しません。34行目は期間の単位を秒に変更したものです。35行目以降はテンプレート1と同じです。
SYNクッキーを有効にする[SYN攻撃対策]
テンプレート3で、パケットのステートフル性を確認する方法を紹介しました。ステートフル性を確認することで、3ウェイハンドシェイク手順を満たさないパケットを破棄できます。
しかし、SYN→SYN/ACK→ACKを完了していながらデータを送信してこない「コネクション完了型」のアタックに対して、この手法は役に立ちません。そこで、「SYNクッキー」を使用します。SYNクッキーを使用することで、ACKの中に含まれる確認応答番号を計算し、正しいセッションであることを確認できます。セッションの正当性を確認してから処理を行うことにより、無駄な処理でコネクションなどのリソースが費やされるのを防ぐことができます。
参考:「DoS攻撃防御製品の仕組みと特徴」
自ホスト(Linux)でSYNクッキーが有効になっているか否かは、/proc/sys/net/ipv4/tcp_syncookiesファイルの内容で確認できます。「1」と書き込まれていれば有効になっています。なっていない場合は、以下のコマンドで有効にすることができます。
# echo '1' > /proc/sys/net/ipv4/tcp_syncookies
または、
# sysctl -w net.ipv4.tcp_syncookies=1
ただし、上記の方法ではマシンを再起動すると設定が消えてしまいます。再起動後もSYNクッキーを有効にするには、/etc/sysctl.confファイルに以下の行を追記します。
# Disables packet forwarding net.ipv4.ip_forward = 0 # Enables source route verification net.ipv4.conf.all.rp_filter = 1 # Disables the magic-sysrq key kernel.sysrq = 0 # Enable SYN Cookie ←追加 net.ipv4.tcp_syncookies=1 ←追加
SYNクッキーを有効にするとACKの中に含まれる確認応答番号を計算するため、パケット処理において多少オーバーヘッドが発生します。パケットの流量によっては、CPUの処理能力がネックになる可能性があることを覚えておきましょう。
ブロードキャストpingに答えない[Smurf攻撃対策]
Smurf攻撃は、ターゲットにしたホストに対して、送信元アドレスを偽造したICMP Echo Requestパケットを大量に送り付ける攻撃方法です。ICMP Echo Requestパケットを特定のホストではなく、ブロードキャストアドレスに対して送信した場合、そのネットワーク上のすべてのコンピュータから応答パケットが投げ返されます。Smurf攻撃はこれを悪用する場合があるため、Linux側でブロードキャストpingに答えないようにします。
# echo '1' > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
または、
# sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
マシン再起動後も設定を有効にするには、/etc/sysctl.confファイルに以下の行を追記します。
(省略) # Disable Broadcast Ping ←追加 net.ipv4.icmp_echo_ignore_broadcasts=1 ←追加
ここで紹介した以外にも、FraggleやLANDなど、さまざまなDoS攻撃があり、これらを完全に防ぐことは難しい状況です。通常のパケットと攻撃を意図したパケットを見分けることができれば対応しやすいのですが、両者の区別はほとんどできません。こうした対策には、ログのチェックやトラフィックの確認など、日ごろのメンテナンスが欠かせません。
Copyright © ITmedia, Inc. All Rights Reserved.