vbotka.freebsd_pf

freebsd_pf

クオリティ
ビルドステータス
GitHubタグ

Ansibleのロールです。FreeBSDのPFファイアウォールを設定します。

ご意見や問題をお気軽にこちらからお知らせください

貢献も大歓迎です

警告:

ファイアウォールを操作するため、ロックアウトされるリスクがあります。必ずハンドブックを読む必要があります。

リモートホストでpfを実験する際は、セッションを開き、rootとして以下のコマンドを実行してください。pfを有効にする前に実行します。

shell> sleep 120; pfctl -d

このコマンドは、2分後にpfを無効にし、何か問題が発生した場合にリモートホストへの新しいセッションを開くことができます。

要件と依存関係

コレクション

  • community.general

オプションの依存関係

ロール変数

デフォルトでは、ファイアウォールは無効です。

pf_enable: False

デフォルトで sshguardblacklistdfail2ban、および relayd は無効です。

pf_blacklistd_enable: False
pf_fail2ban_enable: False
pf_relayd_enable: False
pf_sshguard_enable: False

デフォルトでは、ブロックされたパケットはログに記録されません。

pf_log_all_blocked: False

デフォルトや例をvarsで確認してください。

ワークフロー

  1. 必要に応じてシェルを/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'
  1. ロールとコレクションをインストールします。
shell> ansible-galaxy role install vbotka.freebsd_pf

必要であればコレクションもインストールします。

shell> ansible-galaxy collection install community.general
  1. ファイアウォールを作成します。

いくつかのテンプレート -pf.conf.j2 が利用可能です。目的に合ったテンプレートを選び、varsの変数の例.yml.sampleを確認してください。テンプレートのdefault-pf.conf.j2と変数pfconf_example*_default.yml.sampleはテスト済みです。他のテンプレートやサンプルはもっと注意とテストが必要です。

注:テンプレートdefault-pf.conf.j2に対してネストされたリスト(テーブル、オプション、正規化、キューイング、翻訳、フィルタリングなど)を作成できます。リストはフラット化されます。

  1. プレイブックを作成します。
shell> cat freebsd-pf.yml
- hosts: srv.example.com
  roles:
    - vbotka.freebsd_pf
  1. pfの起動/再起動/再読み込みの実装方法を確認するためにハンドラをレビューします。

  2. パッケージをインストールします。

shell> ansible-playbook -t pf_packages -e pf_install=true freebsd-pf.yml

その後、プレイブックの実行速度を上げるためにインストールを無効にします。

  1. ファイアウォールを設定します。

ファイアウォールの起動や再起動は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=falsepf_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

参考文献

ライセンス

ライセンス

著者情報

Vladimir Botka

プロジェクトについて

FreeBSD. Configure PF firewall.

インストール
ansible-galaxy install vbotka.freebsd_pf
ライセンス
bsd-2-clause
ダウンロード
243
所有者