連載
» 2010年01月06日 00時00分 公開

ステートフル・パケットインスペクションiptablesテンプレート集 改訂版(2)(2/3 ページ)

[鶴長鎮一,@IT]

テンプレート3
sshでステートフル性を確認

受信パケットは基本的にすべて破棄(1)
送信パケットは基本的にすべて破棄(2)
ループバックアドレスに関してはすべて許可(3)
メンテナンスホストからのping、メンテナンスホストへのpingを許可(4)
メンテナンスホストからのssh(TCP 22)を許可。ただしパケットのステートフル性が無効なものは破棄(5)

 テンプレート1を基に、SSHサーバに対する接続をさらに厳密にします。特定のメンテナンスホストからのみSSH接続を許可し、さらにパケットのステートフル性を確認し、NEW・ESTABLISHED・RELATEDの状態にあるパケットだけを受け入れます。さらに新規接続を表すNEWに関しては、SYNパケットでないものは破棄します。

 テンプレート3の内容を説明します。適宜、以下のリンクでリストを表示させるか、テンプレートをダウンロードしてください。

テンプレート3の解説

 3、4行目のメンテナンスホスト($trusthost)とサーバ($myhost)のIPアドレス指定や9〜11行目で既存のiptablesの設定リセットについては、テンプレート1の解説を参考にしてください。

 テンプレート1を基に36行目を修正し、新たに37行目を追加しています。36行目では元のオプションに加え「-m state --state NEW,ESTABLISHED,RELATED」を新たに付け加えています。

36  /sbin/iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $trusthost -d $myhost --dport 22 -j ACCEPT
        -p tcp               プロトコルがTCP
        -m state       stateモジュールを使用
        --state NEW,ESTABLISHED,RELATED
                             NEW・ESTABLISHED・RELATEDの状態にあるパケット
        -s $trusthost        送信元IPアドレスが$trusthost
        -d $myhost           送信先IPアドレスが$myhost
        --dport 22           送信先サービスポートが22
        --sport 22           送信元サービスポートが22
        -j ACCEPT            ACCEPT(許可)する

 コネクション追跡機能を有効にするため、「-m state」でstateモジュールを使用し、続いて「--state NEW,ESTABLISHED,RELATED」でNEW・ESTABLISHED・RELATEDの状態にあるパケットを受け入れ、(ACCEPT)の条件に加えます。

 37行目では接続の最初のパケットであるにもかかわらずSYNでないパケット(つまり最初のパケットがSYN以外のパケット)を破棄(DROP)しています。

37  /sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -s $trusthost -d $myhost --dport 22 -j DROP
        ! --syn        SYNパケットでないもの

 これでDoS攻撃やDDoS攻撃のようなサーバの利用停止を狙った攻撃を、一部防ぐことができます。ただし「SYN Flood」のように、SYNパケットを使った攻撃には無防備です。DoS攻撃対策については回を改めて解説します。

 作成したスクリプトの実行と動作確認は、第1回「設定確認とリセット」を参考にします。

改造のヒント:HTTPでもステートフル性を確認する

 HTTPサービスでもパケットのステートフル性を確認できるよう、テンプレート2を基に修正を加えましょう。sshの場合、同様に次のように変更します。

テンプレート2の42行目を修正
(修正前)
/sbin/iptables -A INPUT -p tcp -s $any -d $myhost --dport 80 -j ACCEPT

(修正後)
/sbin/iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s $any -d $myhost --dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -s $any -d $myhost --dport 80 -j DROP

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。