Eyes, JAPAN Blog > Yes, with PF

Yes, with PF

Masato Kaneko

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

外部向けにサーバを公開して運用するに当たっては、専用機器のファイアーウォールを導入したり、サーバ内の OS によるファイアーウォール機能を有効にして設定・運用したり、またはその両方を利用するのがほぼ常識となっているかと思います。
私は、今までには個人的な趣味で専ら Linux を愛用してきて、Linux のファイアーウォール機能である Netfilter (iptables) の挙動や設定は、ある程度経験してきているので把握しています。
しかし、最近特に FreeBSD への関心が強くなり、FreeBSD で Linux と同等のファイアーウォール機能を利用したいと思い、色々と調査や試行錯誤を繰り返した結果、幸いにも現在まではほぼ同等の設定で運用することが出来ています。
FreeBSD では、標準のファイアーウォール機能としては IPFW (ipfirewall) が用意されていて、この IPFW を用いて運用していました。
しかし、iptables でいう limithashlimit モジュールによる機能とほぼ同等のものが、IPFW では (自分の知る限りだと) 存在しないことを知り、運用に若干の不安が残りました。(IPFW においての同等の機能をもし知っている方がいらっしゃいましたら教えていただけると幸いです)
具体的には、特に SSH のポートである TCP 22 番に対するパスワードの辞書攻撃や総当り攻撃を、ファイアーウォールレベルで防ぐために、自分の Linux 環境では iptables により、まずはアクセス元の国ごとでフィルタを掛け、許可した国からのアクセスには limit や hashlimit を利用して、時間あたりのパケット数の制限を設けていました。
それにより、明らかに人間が手でユーザ ID やパスワードを入力したのではないようなアクセス、つまり、プログラムを使って ID やパスワードの入力作業を自動化し、認証を突破しようとするようなアクセスを、なるべく正常なアクセスに影響を与えずに遮断しています。
もちろん理想としては、sshd のリッスンポートを変更したり、公開鍵認証だけを許可するように設定したり、接続元をホワイトリスト的に制限したりする方が、セキュリティ的にはより強固なのですが、利便性が低下するために、制限を設けすぎることは意図的にしないでいます。
そして、FreeBSD にはファイアーウォールの選択肢として、IPFW の他に OpenBSD 由来の PF (Packet Filter) というものが存在することを知り、PF で設定してみたところ、自分が求めていたような設定が実現出来たので、少し紹介したいと思います。

少し長いのですが、

外部向けネットワークインターフェイスの内向きに来る、TCP 22 番ポート (SSH) へのアクセスを日本からのみ許可し、その上同一アドレスからの新しいセッションは 30 秒間に最大 5 つまでに制限して、その制限を超えたアクセスをすべて拒否するルール

を設定しました。

言葉だけでは分かりにくいので、具体的な PF における設定 (pf.conf 抜粋) を示しますと、以下のようになります。


block in quick on $ext_iface inet proto tcp from <ATTACKERS> to any port 22
pass in quick on $ext_iface inet proto tcp from <JAPAN> to any port 22 flags S/SA keep state \
    (max-src-conn-rate 5/30, overload <ATTACKERS> flush global)

まず補足ですが、ドル記号で始まる $ext_iface の部分は、外向きのネットワークインターフェイスを示すマクロで、自分の分かりやすいように名前や値を設定して、変数のように利用できます。
また、<ATTACKERS><JAPAN> は PF では テーブル と呼ばれ、自分の好きなように名前や値を設定出来る、IP アドレスやネットワークアドレスのリストになります。
では簡単に説明すると、1 行目の設定により悪意があると思われる TCP 22 番ポートへのアクセスを拒否し、2 行目で各種制限を設定して、制限を超えたホストを <ATTACKERS> テーブルに逐一追加しています。
この設定により、設定した時間あたりのセッション数の制限により、攻撃と思われるような高速なログイン試行を遮断出来ます。

PF には例えば、フラグメントパケットを再構成 (正規化) したり、TCP の 3 ウェイハンドシェイクを肩代わりしたりなど、他にも多くの便利な機能があります。
それだけでなく、ファイアーウォールの設定をなるべく短く出来るような書式・文法がサポートされているので、設定自体も読みやすくなります。
もし FreeBSD を利用していて、IPFW では物足りないと思った方は、PF はおすすめなので試してみてはいかがでしょうか?

Author: Masato Kaneko (OpenBSD 透過型ファイアーウォールを自宅に導入しました。)
  • このエントリーをはてなブックマークに追加

Comments are closed.