vbotka.freebsd_pf
freebsd_pf
Ansibleのロールです。FreeBSDのPFファイアウォールを設定します。
ご意見や問題をお気軽にこちらからお知らせください。
警告:
ファイアウォールを操作するため、ロックアウトされるリスクがあります。必ずハンドブックを読む必要があります。
- https://www.freebsd.org/doc/en/books/handbook/firewalls-pf.html
- https://www.openbsd.org/faq/pf/filter.html
リモートホストでpfを実験する際は、セッションを開き、rootとして以下のコマンドを実行してください。pfを有効にする前に実行します。
shell> sleep 120; pfctl -d
このコマンドは、2分後にpfを無効にし、何か問題が発生した場合にリモートホストへの新しいセッションを開くことができます。
要件と依存関係
コレクション
- community.general
オプションの依存関係
ロール変数
デフォルトでは、ファイアウォールは無効です。
pf_enable: False
デフォルトで sshguard、 blacklistd、 fail2ban、および relayd は無効です。
pf_blacklistd_enable: False
pf_fail2ban_enable: False
pf_relayd_enable: False
pf_sshguard_enable: False
デフォルトでは、ブロックされたパケットはログに記録されません。
pf_log_all_blocked: False
デフォルトや例をvarsで確認してください。
ワークフロー
- 必要に応じてシェルを/bin/shに変更します。
shell> ansible srv.example.com -e 'ansible_shell_type=csh ansible_shell_executable=/bin/csh' -a 'sudo pw usermod freebsd -s /bin/sh'
- ロールとコレクションをインストールします。
shell> ansible-galaxy role install vbotka.freebsd_pf
必要であればコレクションもインストールします。
shell> ansible-galaxy collection install community.general
- ファイアウォールを作成します。
いくつかのテンプレート -pf.conf.j2 が利用可能です。目的に合ったテンプレートを選び、varsの変数の例.yml.sampleを確認してください。テンプレートのdefault-pf.conf.j2と変数pfconf_example*_default.yml.sampleはテスト済みです。他のテンプレートやサンプルはもっと注意とテストが必要です。
注:テンプレートdefault-pf.conf.j2に対してネストされたリスト(テーブル、オプション、正規化、キューイング、翻訳、フィルタリングなど)を作成できます。リストはフラット化されます。
- プレイブックを作成します。
shell> cat freebsd-pf.yml
- hosts: srv.example.com
roles:
- vbotka.freebsd_pf
pfの起動/再起動/再読み込みの実装方法を確認するためにハンドラをレビューします。
パッケージをインストールします。
shell> ansible-playbook -t pf_packages -e pf_install=true freebsd-pf.yml
その後、プレイブックの実行速度を上げるためにインストールを無効にします。
- ファイアウォールを設定します。
ファイアウォールの起動や再起動はSSH接続を切断します。詳細はハンドラで確認してください。その結果、起動と再読み込みの両方のハンドラが正しく機能せず、SSH接続が無効になります。まずルールを設定しましょう。
shell> ansible-playbook -e pf_enable=false freebsd-pf.yml
ファイアウォールを有効にする前に、リモートホストへのSSHセッションを開き、以下のコマンドを実行します。
shell> sleep 120; pfctl -d
もしリモートホストからロックアウトされた場合、上記のコマンドは2分後にファイアウォールを無効にします。これらのコマンドは、ファイアウォールを実験する際には常に実行することをお勧めします。さて、ファイアウォールを有効にします。
shell> ansible-playbook -e pf_enable=true freebsd-pf.yml
ファイアウォールを更新します。
何か問題が発生する可能性に備えて、ホストへのSSH接続を開いておきます。設定を更新して検証します。ルールを再読み込みしないでください。
shell> ansible-playbook -e pf_conf_only=true -e pf_conf_validate=true freebsd-pf.yml
設定が更新され検証された後、ルールを再読み込みします。
shell> ansible srv.example.com -m service -a "name=pf state=reloaded"
トラブルシューティング
pf.conf
最初のステップとして、設定ファイルのバックアップを有効にします。
pf_backup_conf: true
もし設定 /etc/pf.conf が検証を通らない場合、プレイは失敗します。
TASK [vbotka.freebsd_pf : pfconf: ルールの設定] **********************************************
fatal: [srv.example.com]: FAILED! => changed=false
checksum: 765302b1f0de9f200b2cab396e0271fc04e6adcc
exit_status: 1
msg: 検証に失敗しました
stderr: |-
/home/freebsd/.ansible/tmp/ansible-tmp-1554558267.39-44232067735996/source:119: 構文エラー
上記のメッセージは、一時ファイル内の構文エラーの位置(source:119)を示しています。この一時ファイルがレビューできない場合、エラーを見つけるのが難しくなります。
pf_conf_only=trueを有効にし、検証を無効にしてpf_conf_validate=falseまで問題を見つけます。
shell> ansible-playbook -e pf_conf_only=true -e pf_conf_validate=false freebsd-pf.yml
設定ファイル /etc/pf.conf内で構文エラーを特定します。
shell> pfctl -n -f /etc/pf.conf
設定が修正された後、ルールを更新、検証し再読み込みします。
shell> ansible srv.example.com -m service -a "name=pf state=reloaded"
relayd.conf
/usr/local/etc/relayd.confをトラブルシュートする際も同様の方法が使えます。
shell> ansible-playbook -t pf_relayd -e pf_debug=true -e pf_relayd_conf_validate=false -e pf_relayd_conf_only=true freebsd-pf.yml
設定ファイル /usr/local/etc/relayd.conf内で構文エラーを特定します。
shell> relayd -n -f /usr/local/etc/relayd.conf
設定が修正された後、ルールを更新、検証し再読み込みします。
shell> ansible srv.example.com -m service -a "name=relayd state=reloaded"
セキュリティ
検証されていない設定がハンドラによって再読み込みされるのを防ぐために、設定ファイル /etc/pf.confは作成されず、pf_conf_only=falseとpf_conf_validate=falseの両方が有効な場合プレイは終了します。
shell> ansible-playbook -e pf_conf_only=false -e pf_conf_validate=false freebsd-pf.yml
fatal: [srv.example.com]: FAILED! => changed=false
msg: 検証はpf_conf_only=Trueの場合にのみオフにできます。プレイが終了しました。
ロールは、 -e pf_relayd_conf_only=false -e pf_relayd_conf_validate=false
の場合も同様に失敗します。
Ansibleのリント
ansible-lintを実行する際は、設定ファイル*.ansible-lint.local*を使用します。一部のルールは無効にされ、一部の警告は無視される可能性があります。設定ファイル内のメモを確認してください。
shell> ansible-lint -c .ansible-lint.local
参考文献
- PFの本
- OpenBSDのPFパケットフィルタを用いたファイアウォールについて
- pfによるファイアウォールの初心者ガイド
- PFファイアウォールのテスト - OpenBSDジャーナル
- ZFS上でのezjailを用いた簡単なjailのセットアップとPF NATの設定
- FreeBSDとblacklistd
- FreeBSD上のBlacklistd
- PFとsshguard
- PFでFail2banの禁止を施行する
- PFを用いたFail2Ban
- Fail2Ban pf.conf: マルチポート構文を修正