しよたろのぶろぐ

しよたろがブログを始めてみました。よろしければ一度読んでやってください。

FreeBSDでipfwを学ぶ。keep-stateって何ができるか、どう使うか知っていますか?

はじめに

前回の記事ではFreeBSDで使えるファイアーウォールの種類についていくつか調べてみました。それぞれの特徴やメリットを深く掘り下げるには至りませんでしたが、現在はipfwが最有力であることが分かりましたので、引き続きipfwを掘り下げて勉強していきたいと思います。

 

マニュアルを読む

英語は苦手なので翻訳されたサイトで読んで理解を深めていきます。

http://www.yosbits.com/opensonar/rest/man/freebsd/man/ja/man8/ipfw.8.html?l=ja

ファイアウォールの設定、または 規則セット は、1 から 65535 までの番号が付けられた 規則 のリストでできています。パケットは、プロトコルスタック中の多くの異なった場所からファイアウォールに渡されます (パケットの発信元と宛先によっては、ファイアウォールが同じパケットで複数回起動される可能性があります)。ファイアウォールに渡されたパケットは、規則番号の順序で、 規則セット 中のそれぞれの規則に対して比較されます (同じ数がある複数の規則が許可されます、その場合、それらは、挿入された順序で処理されます)。マッチしたとき、マッチする規則に対応するアクションが実行されます。

 

  • 規則セットは、1 から 65535 の番号の規則のリスト
  • 規則番号の順序で、 規則セット中のそれぞれの規則に対して比較される
  • マッチしたとき、マッチする規則に対応するアクションが実行される

「規則セットの番号順に評価されて、マッチした時にルールが適応される」という事ですね。アクション次第だけど基本はマッチした時点で処理を抜けるように設定していく。

 

規則セットが keep-state または limit オプションがある 1 つ以上の規則を含んでいるなら、ファイアウォールには、 ステートフル (状態依存型) の振る舞いがあります、すなわち、マッチにおいて 動的規則 を作成します、すなわち、それらの作成を引き起こしたパケットとして同じ 5 つの組 (プロトコル、発信元と宛先アドレスおよびポート) があるパケットとマッチする規則。生存時間が有限である動的規則は、 check-statekeep-state または limit 規則の最初に生じた時点でチェックされ、正当なトラフィックのみをオンデマンドで、ファイアウォールをオープンするために通常使用されます。

いきなり難しそうなのが出てきましたね。

  • 動的規則
  • ステートフルの振る舞い

「正当なトラフィックのみをオンデマンドで…」という表現から察するにセキュリティ面に配慮した機能になりそうな印象。このまま「使用例」の部分を見てみましょう。

 

最初に効率良く (動的規則を用いずに) アクセスを制限する方法は、次の規則を用いることです。

 

ipfw add allow tcp from any to any established
ipfw add allow tcp from net1 portlist1 to net2 portlist2 setup
ipfw add allow tcp from net3 portlist3 to net3 portlist3 setup
...
ipfw add deny tcp from any to any

また知らない用語が出てきました。setupestablishedは何でしょう。

setup

SYN ビットがセットされているが ACK ビットを持たない TCP パケットに適合します。これは、“ tcpflags syn,!ack”の短縮形です。

established

RST か ACK ビットがセットされている TCP パケットに適合します。

なるほど。TCPパケットに関しては、

setupを使う事でSYN ビットをチェックする。

established を使ってRST・ACK ビットを早期に適合させる。

というやり方が効率的なんですね。

 

verrevpathantispoofsetdscpは後で見るとして、次の「動的規則」へ。

 

にせの TCP パケットを含む怒涛の攻撃 (flood attack) からサイトを保護するために、次の動的規則を用いた方が安全です。

 

ipfw add check-state
ipfw add deny tcp from any to any established
ipfw add allow tcp from my-net to any setup keep-state
 
これらの規則により、ファイアウォールは、自分たちのネットワークの内側から到着する通常の SYN パケットで始まるコネクションに対してのみ動的規則を組み込みます。動的規則は、 check-statekeep-state または limit 規則の最初の発生に遭遇したときにチェックされます。規則セットのスキャン量を最小にするために、 check-state 規則は、規則セットの最初のほうに置くことになるのが普通です。実際の燃費は、変動します。

動的規則が出てきましたね。さっきの難しそうだった箇所。

keep-stateはセキュリティを考慮して利用するもの」という認識でしたが、check-stateは効率よく規則セットを捌く為に利用するように読み取れますね。念のためkeep-stateの説明を見てみましょう。

 

keep-state

適合する際に、ファイアウォールは、動的規則を作成します。作成される規則は、デフォルトでは、同じプロトコルを使用している発信元と宛先 IP/ポート間での双方向のトラフィックに適合するような動作となります。この規則には、有限の生存時間 ( sysctl(8) 変数の集合により制御されます) があり、生存時間は、適合するパケットが見つかるたびにリフレッシュされます。

 

つまりここでの設定は、

・keep-state 利用して双方向の通信を一時的に一定時間許可する。

established を利用して不正なパケットを遮断する。

check-state を利用して効率的に規則セット捌く。

という事ですね。

 

ユーザが開ける接続数を制限するには、次のタイプの規則を使用可能です。

ipfw add allow tcp from my-net/24 to any setup limit src-addr 10
ipfw add allow tcp from any to me setup limit src-addr 4
 
ステートフルな規則は、怒涛の SYN 攻撃により極めて大量の動的規則を作ってしまい、サービス不能攻撃を受けることになる可能性があります。

「動的規則」のサンプルの設定をしてしまうと全TCPパケットに適応される規則なので、全規則を動的規則とするとサーバー側の負荷が大きくなって機能が停止する恐れがある、という事のよう。もともとは偽パケット(ACKフラッド攻撃)を遮断する為にしてる設定だったけど、「SYNフラッド攻撃」を受けるとipfw側でハングしてしまう恐れがあるという事なのかな。そのために接続数にlimitを設けて「SYNフラッド攻撃」にも備えよう、という事でしょうか。

 

ちょっと理解が進んだので戻って「ステートフルファイアウォール」の項目へ戻ってみます。

 

動的規則の典型的な使い方は、ファイアウォールの設定を閉じた状態にしておきつつ、内部ネットワークからの最初の TCP SYN パケットに、そのフローに対する動的規則をインストールさせ、そのセッションに属するパケットがファイアウォールを通過できるようにするというものです。

 

ipfw add check-state
ipfw add allow tcp from my-subnet to any setup keep-state
ipfw add deny tcp from any to any

これが「動的規則」の基本形なんですね。最初にこっちを見るべきだった。。

・keep-stateを使う事で一時的に特定のセッションのパケットを双方向に許可する。

・ただしそれ以外のパケットは遮断する。

 

一時的に特定のパケットを動的に許可する事ができる。これがkeep-stateを使うポイントになるのでしょうか。奥が深いですね。

 

同様なアプローチが UDP に対しても使えます。内部から来た UDP パケットに動的規則をインストールさせ、その応答がファイアウォールを通過するようにします。

 

ipfw add check-state
ipfw add allow udp from my-subnet to any keep-state
ipfw add deny udp from any to any

これらのサンプルでは、内部から外部へアクセスした際のレスポンスを一時的に許可する目的でkeep-stateを利用する事で「セキュアな環境を維持しよう」としている訳ですね。動的規則の便利さがやっと理解できました。(あってるのかな?)

 

今日はここまで。マニュアルを読み進めるだけでも奥深くとても勉強になりますね。まだまだ実際の設定には至っていないので道のりは長いですが、引き続き勉強を進めます。もし理解が誤っている点があればご指摘頂けると助かります

 

 

 ※参考

DDoS攻撃の主な攻撃手法8つの特徴をまとめてみた

https://www.shadan-kun.com/blog/measure/1426/