next up previous contents
Next: 6.4.8 DNS query Up: 6.4 フィルタリングルール Previous: 6.4.6 ICMP対策

6.4.7 Mail と Web

メイルやWebに関するルールは比較的に簡単です。特に、特定のホストで集中的に 送受信する場合にはそのホストだけに限定することが可能になります。もっとも、 全てのホストが外部へ直接メイルを送信できるとしても、それほど問題にならない でしょうが、少しだけセキュリティレベルが下がります。いずれにせよ、外から のアクセスを許すメイルホストやWebサーバのセキュリティには気を配らなければ なりません。

最初に解説したようにTCPにはコネクション開設のために、3ウェイハンドシェーク を行います。この過程を setup と呼びます。具体的には、SYN フラグのみが立った パケットが最初に飛び、それに対する応答パケットは SYN+ACK で、最後に応答 パケット ACK が返ってきます。これによってハンドシェークが終了し、実際の通信 が始まりますが、その通信においては全てACKフラグが立ち、同時にデータの連続 性を保証するための番号が付与されます。この状態を established と呼びます。 従来のパケットフィルタリングでは、これらの状態遷移を記憶していなかったために、 単にこのフラグのみを見て許可するパケットを考えなければなりませんでした。 しかし、最近の新しいフィルタリングツールではこうした状態遷移を記憶し、 一度 setup したコネクションは特に指定しなくても許可できるようになっています。 IPFilter にもその機能があり、keep state オプションを付けることで、帰りのパケット については一切心配することなく、一度のルール記述のみで全てを許可出来るようになり ました。同時に、この機能により不正なフラグの組み合わせや、 コネクションハイジャックなどもかなり防げるようになっています。

但し、keep state を用いて、stateful にTCP のコネクションを追いかけるに しても、最初の一発目が何かを指定しないと状態遷移を追いかける事は出来ません。 そこで、keep state を TCP に使う際には必ず flags S を用います。これは、 最初のパケットはコネクション確立要求パケットで、SYN ビットが立っている 訳ですから、そのパケットを通してしまえば、後は状態を追いかけることが 出来るという訳です。

メイルサーバ(MAIL)へのアクセスの許可は次のようにします。

pass in  quick proto tcp from any to MAIL port = 25 flags S keep state group 100
pass out quick proto tcp from MAIL to any port = 25 flags S keep state group 200

同様に、Web server(WWW) へのアクセスについても、

pass in  quick proto tcp from any to WWW port = 80 flags S keep state group 100
pass out quick proto tcp from any to any port = 80 flags S keep state group 200

となります。当然、Web サービスの口は 80 であると仮定していますが、他の ポートでも開設しているならばそれらを加えなければなりません。また、from any についての記述は前の節で出てきたように内部ネットのどのIPに飛ぶのかという 事を明示的に指定したほうが良いでしょう。

  1. flags S
    flags S を使う時に注意すべきは、 flags S では、SYN ビットのみが立ったパケットを対象とします。 従って、その他のU(RG),A(CK),P(SH),R(ST),S(YN),F(IN) が同時に(正確には U,A,P,R,F ですね)立っている場合はマッチしません。 この事は、コネクションの最初のパケットが SA (SYN+ACK)で来た場合には そのパケットはルールにマッチしないという事を意味します。しかし、 もしその他のビットが立っていても、このルールにマッチさせたい場合には マスクを書く事で目的を達する事が出来ます。例えば、

          flags S/SA
    

    は、SA 以外の SYNビットが立っている全てのパケットにマッチします。つまり、 S/SA は、S と U,P,R,F の全ての組合せにマッチする事になる訳です。 難しく聞こえるかも知れませんが、ルーティングの時のマスクと意味的には 同じなのです。つまり、これらのフラグがビットであると思えば、 もし下のように、入力ビットが SF であったとすると、SA でマスクすると、 結果は 000010 になり、S のみが立ったビット列と同じになります。

      ビット列 UAPRSF
    入力 SF 000011
    マスク SA 010010
    結果 SF & SA 000010
    比較 S 000010

    逆に、入力が SAF であったとします。すると、SAF(010011) に対して、 マスク SA(010010) を適用すると、結果は (010010) となり、S(000010)に 一致しません。つまり、入力 SAF は、ルール flags S/SA にはマッチしない 訳です。同時に、flags S/SA と書く時に、/S がなぜ必要かという理由も 明らかですね。

    では、flags S/SA という記述は正しいのでしょうか。例えば、入力が SF の場合はどうでしょう。実は、これは RFC1322 拡張TCP/IP で正規の フラグなのですが、これを受け入れるかどうかは良く考えないといけません。 元々、このような組合せは Web などへのコネクションを素早くするために、 近年考え出されたものなのですが、攻撃手段にも使われているものなのです。 よしんば、SF を受け入れたとしても、SR,SU,SP 等ははどうでしょうか。 本来こうしたフラグの組合せはあり得ない筈のものですので、こうしたものを 受け入れるのも考えものです。従って、結論としては、通常は flags S で良いが、どうしても SF を受け入れたければ、flags S/SUAPR とすべきで しょう。

  2. keep frags
    状態遷移を見ている場合、ルールセットは、最初の SYN パケットから keep state オプションにより、動的に生成されます。但し、これだけですと、もし、 パケットがフラグメンテーションを起こしている場合には通らなくなる ことがあります。そこで、それらのフラグメントパケットについても、フラグを 遡って見ることが出来るように、keep frags を付けます。 (フラグメンテーションを処理するのはネットワーク層です。)

    pass in  quick proto tcp from any to WWW port = 80 flags S keep state
                                                        keep frags group 100
    pass out quick proto tcp from any to any port = 80 flags S keep state
                                                        keep frags group 200
    
    (都合上、改行していますが、実際には改行はありません。)

Mail と同じく外からのアクセスを許すようなサービスとしては、 NTP (Network Time Protocol port=123) や NNTP(Network News Transfer Protocol port=119)なども ありますが、mailなどと同じなので設定はここでは触れません。


next up previous contents
Next: 6.4.8 DNS query Up: 6.4 フィルタリングルール Previous: 6.4.6 ICMP対策
Noriyo Kanayama