続 pf authpf を使う

先日 pf を使って作成した NAT 箱ですが、あのままだとローカルネットワークに繋がった機器は全てお外の世界にアクセス可能になってしまいます。対応としては

1. 物理的に遮断
2. 接続元の IPAddress で規制
3. 接続元の MAC Address で規制

辺りが思いつきますが(他にもたくさんあるでしょう)、今回は pf に付いてる authpf という仕組みを使ってみました。authpf を使うとユーザが認証ゲートウェイssh でログインした場合に pf のフィルタルールを動的に変更する事が出来ます。例によって詳しい事は man 見てくださいと。
設定ファイル

/etc/authpf/authpf.conf

auhtpf の設定ファイルです。中身は空でも構いませんが、ファイルの存在自体は必須のようです。

/etc/authpf/authpf.allow

authpf 認証可能なユーザ名を記述します。このファイルが無い場合は全てのユーザが許可されます。ファイルがある場合は、このファイルに名前が無いユーザは

Sorry,you are not allowed to use this facility!

と接続拒否されます。

/etc/authpf/users/ユーザ名/authpf.rules /etc/authpf/authpf.rules

認証された時に読み込まれる pf のルールを記述します。users 以下の個別のファイルが無い場合は /etc/authpf/authpf.rules が使用されます。どちらかのファイルの存在が必須です。

/etc/authpf/authpf.message

認証出来た場合に表示するメッセージを記述します。無くても大丈夫です。

/etc/authpf/banned/ユーザー名

/etc/authpf/banned/ 以下にユーザ名の付いたファイルを置くと、そのユーザは

 -**- Sorry, you have been banned! -**-

と怒られて、認証拒否されます。

/var/authpf ディレクト

マニュアルに書いてませんが必要です。authpf が書き込み可能なパーミッションに設定します。

/etc/syslogd.conf

authpf のログを取る為に syslogd.conf に追加します。

 !authpf
 *.*                                             /var/log/authpf

/etc/fstab

authpf は fdescfs を必要とするので起動時に読み込んでくれるように fstab に追加

fdescfs                 /dev/fd         fdescfs rw              0       0

するか、手動で

# mount_fdescfs fdescfs /dev/fd

する。

pf.conf

#ローカルネットワークからの接続許可ルールをコメントアウト
#pass in on $int_if from $int_if:network to any keep state

#ローカルネットワークから認証用の ssh アクセス許可と authpf 用アンカー
pass in on $int_if prot tcp from $int_if:network to $int_if port 22 keep state
anchor "authpf/*"

/etc/authpf/authpf.rules

int_if = "dc0"

pass in quick on $int_if proto tcp from $user_ip to any  keep state
pass in quick on $int_if proto { udp,icmp } from $user_ip to any  keep state

/etc/authpf/users/ユーザ名/authpf.rules を使えば、ユーザ単位で「 HTTP だけ許可とか SSH だけ許可」と言ったポリシーにも対応出来ます。