SSブログ

OpenBSD本家でpfを動かす その1(OpenBSD 6.6R、2019/11/10) [OpenBSD]

OpenBSDにはpfというパケットフィルタリングツール、つまりはソフトウェアファイアウォールが付いています。FreeBSDだとipfwに該当するものです。まあ、FreeBSDにもpfは移植されていますけどね。
主要な機能面だけを見れば、他のフィルタリングツールと大差はないと思います。

しかしこのpf、他のツールにはない面白い特徴を持っています。それは、ポリシ評価がラストマッチング方式であるということです。実はこの方式自体はpf独自のものという訳ではく、pfの前身となっているipf(IP Filter)の思想を引き継いでいます。

ラストマッチング方式というのは世間一般で使用されているファイアウォールや、ネットワーク機器のフィルタとは概念が異なり、
・マッチ処理は途中でヒットするものがあっても評価が終わらず、残りのマッチ処理が継続される
・マッチ処理で該当した「最後」のポリシが実行される
となります。

よくあるファイアウォールポリシの例では、
 順序10 http, httpsの接続受付を許可
 順序20 自発の通信は許可
 順序30 全ての通信を不許可
といったものを見かけますが、これをpfで評価するとどんな通信も順序30がラストマッチングとなり、全ての通信がブロックされてしまいます。実際は、マッチ処理を途中で終わらせるquickオプションがあるため、自分たちがよく知っている直観的な記載をすることも可能です。
OpenBSDでサーバを立てる場合、pfの設定は必須となるでしょう。うちは以下のようなpf.confで運用しています。
openbsd# cat /etc/pf.conf
#       $OpenBSD: pf.conf,v 1.55 2017/12/03 20:40:04 sthen Exp $
#
# See pf.conf(5) and /etc/examples/pf.conf

set skip on lo  /* ループバックインタフェースはスキップ */

# By default, do not permit remote connections to X11
block return in on ! lo0 proto tcp to port 6000:6010   /* ひな形にあるデフォルト */

# Port build user does not need network
block return out log proto {tcp udp} user _pbuild   /* ひな形にあるデフォルト */

# my rules
set block-policy drop   /* blockアクションでは、パケットを廃棄する */
tcp_pass = "{ ssh, smtp, https, submission }"   /* 接続を受け付けるサービスを定義 */

# scrub
match in all scrub (no-df)   /* パケットの正規化。攻撃に対する緩衝処理 */

/* 以下、実際の詳細な運用ポリシ */
block log all   /* 暗黙のdeny相当。どこにも該当しない場合の受け皿 */
block in quick proto tcp to any port "{ telnet, 445, 1433, mysql, rdp }"   /* 数が多い攻撃なので、ログに残さず破棄 */
block in quick inet6 all   /* VPSがIPv6非対応なのでIPv6関係は全面廃棄 */

# blacklist   /* ログに残ってる攻撃元をブラックリストで廃棄(手動) */
block in quick from 35.201.237.65
block in quick from 37.49.231.15
block in quick from 40.77.167.2
block in quick from 45.227.254.30
block in quick from 47.75.186.129
block in quick from 51.68.225.51
block in quick from 71.6.199.23
block in quick from 77.247.108.77
block in quick from 77.247.108.119
....

pass in proto tcp to any port $tcp_pass modulate state   /* 許可しているサービスは接続を受け付ける */
pass in proto icmp all keep state   /* ICMP系を許可(今後絞るかも) */

pass out proto tcp all modulate state    /* 自発のTCPを許可 */
pass out proto udp all keep state    /* 自発のUDPを許可 */
pass out proto icmp all keep state    /* 自発のICMPを許可 */


とまあこんな感じです。最初は取っ付きにくい感じもしましたが、慣れてしまえば問題ありませんね。

タグ:PF
nice!(0)  コメント(0) 
共通テーマ:日記・雑感

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。