ryandaniels.firewalld
Ansible ロール: firewalld
サーバー上で firewalld を使ってローカルファイアウォールルールを追加します。
なぜ firewalld を管理するために別の Ansible ロールが必要なのか?このロールはすべて「オフライン」モードで動作します。新しいサービスの作成もオフラインで行えます。
これにより、firewalld が起動し、デフォルトで全てをブロックしても問題が生じることはありません!(必ず非本番環境でテストしてください、保証はできません)
これはカスタムポートでカスタムの firewalld「サービス」をゾーンに追加することをサポートします。また、firewalld が提供する既存のサービスのポートを追加または削除することもできます。
不要なデフォルトサービスをパブリックおよび内部ゾーンから削除します。
ゾーン: ゾーンに IP 範囲を追加します。削除するには、状態を disabled
に変更します。1 つの IP 範囲だけを無効にする必要がある場合は、その IP 範囲のための新しいゾーンエントリを作成します。
サービス: サービスを disable
すると、変数で指定されたゾーンから削除されます。単に設定を削除して削除しないでください!
ポート: ポートを削除するには、設定ファイルから削除します(ポートプロトコルの下)。
VM は異なるインターフェース(eth0/eth1 など)を持つ可能性があるため、インターフェースは管理されません。
注意が必要です。これにより、OS 上の firewalld ルールが削除および追加されます。慎重に使用してください。
firewalld マニュアル: https://firewalld.org/documentation/
注意: Docker と firewalld はうまく連携しません。このロールには、docker サービスが実行中または有効の場合は失敗するチェックが有効になっています。
firewalld と Docker に関する詳細情報:
https://success.docker.com/article/why-am-i-having-network-problems-after-firewalld-is-restarted
https://www.tripwire.com/state-of-security/devops/psa-beware-exposing-ports-docker/
https://docs.docker.com/network/iptables/
テスト
Molecule を使用してテストを行い、すべての機能がテストされます。変更が行われた後、もう一度テストしてすべてが機能することを確認します。
テスト済みディストリビューション
- CentOS: 7.6, 7.7, 8.1
- Fedora 30, 31
- Arch Linux (firewalld バージョン 0.8.1) - でも誰が Arch サーバーをたくさん運用するでしょうか..
依存関係
- firewalld
テスト済みバージョン
- 0.6.3 (CentOS 7 の最新)
- 0.6.6 (Fedora 30 の最新)
- 0.7.0 (CentOS 8 の最新)
- 0.7.3 (Fedora 31 の最新)
- 0.8.1 (Arch Linux の最新)
デフォルト設定
- デバッグを有効にする
debug_enabled_default: false
- プロキシ(プロキシの背後にいる場合、必要なパッケージをインストールする時)
proxy_env: []
- デフォルトではロールは無効です。group_vars や playbook などで true に変更してください
firewalld_managed: false
- (Docker)サービスが実行中または有効かどうかをチェックし、ロールを失敗させます
firewalld_check_problem_service_managed: true
- チェックするサービスと、失敗させるサービス
firewalld_check_problem_service:
- docker.service
- 変数からの設定を表示
firewalld_show_config: false
- firewalld サービスを開始
firewalld_start: false
- firewalld パッケージをインストール
firewalld_managed_pkg: true
ユーザー設定
- パブリックゾーンから不要なデフォルトサービスを削除
firewalld_public_remove_default:
- mdns
- samba-client
- 内部ゾーンから不要なデフォルトサービスを削除
firewalld_internal_remove_default:
- mdns
- samba-client
- ゾーン設定
firewalld の事前定義されたゾーンの完全リスト: https://firewalld.org/documentation/zone/predefined-zones.html
firewalld_zone_source:
- zone: 事前定義されたゾーンの名前 (ex. internal|public) (必須)
state: enabled|disabled (必須)
source:
- "IP/サブネット" (必須)
- サービスとポート設定
firewalld_custom_service:
- name: サービス名 (必須)
zone: public|internal など (上記のゾーンリストを参照) (必須)
state: enabled (必須)
description: サービスの説明 (オプション)
port_protocol: (必須、組み込みサービスの場合は不要、ただし組み込みサービスのデフォルトポートを変更する場合は必要)
- ポート/プロトコル (必須、組み込みサービスでない限り)
詳細については例を参照してください。
組み込みサービスのリストを取得:
firewall-offline-cmd --get-services
設定ファイルの例 (inventories/dev-env/group_vars/all.yml)
以下の例から:
IP 範囲がゾーンに追加または削除されます:
192.168.22.64/26
と192.168.23.64/26
はゾーンinternal
に追加されます192.168.32.64/26
と192.168.33.64/26
はゾーンinternal
から削除されます
カスタムサービスが作成され、指定されたポートでゾーンに追加されます:
app123-public
サービスがポート/プロトコル5000/tcp
で作成され、ゾーンpublic
に追加されます。app123-internal
サービスがポート/プロトコル8080/tcp
と9000/tcp
で作成され、ゾーンinternal
に追加されます。zabbix-agent
サービス(firewalld に組み込まれたサービス)は、設定にデフォルトポート(10050)を使用せず、10050/tcp
を削除します。その代わりにポート/プロトコル3333/tcp
を使用し、ゾーンpublic
に追加されます。(注意: ポートはコメントアウトする必要はありません)。openvpn
サービス(firewalld に組み込まれたサービス)はデフォルトのポート/プロトコルを使用し、ゾーンpublic
に追加されます。このサービスは組み込みのため、ポートを指定する必要はありませんが、安全のために指定するべきです。
---
firewalld_zone_source:
- zone: internal
state: enabled
source:
- "192.168.22.64/26"
- "192.168.23.64/26"
- zone: internal
state: disabled
source:
- "192.168.32.64/26"
- "192.168.33.64/26"
firewalld_custom_service:
- name: app123-public
zone: public
# state: disabled
state: enabled
description: app123 パブリック ゾーン用ファイアウォールルール
port_protocol:
- 5000/tcp
- name: app123-internal
zone: internal
# state: disabled
state: enabled
description: app123 内部ゾーン用ファイアウォールルール
port_protocol:
- 8080/tcp
- 9000/tcp
- name: zabbix-agent
zone: public
# state: disabled
state: enabled
port_protocol:
# - 10050/tcp
- 3333/tcp
- name: openvpn
zone: public
state: enabled
Playbook の例 firewalld.yml
---
- hosts: '{{ inventory }}'
become: yes
vars:
# このロールを使用する #RTFM
# firewalld_managed: true
roles:
- firewalld
使用法
デフォルトでは firewalld_managed=true
を設定しない限り、タスクは実行されません。これは、マニュアルを読まない人による事故を防ぐための設計です。
ansible-playbook firewalld.yml --extra-vars "inventory=centos7 firewalld_managed=true" -i hosts-dev
パッケージのインストールをスキップ(すでにある場合 - タスクの速度を向上させる)
ansible-playbook firewalld.yml --extra-vars "inventory=centos7 firewalld_managed=true" -i hosts --skip-tags=firewalld_pkg_install
より詳細な出力を表示(デバッグ情報)
ansible-playbook firewalld.yml --extra-vars "inventory=centos7 firewalld_managed=true debug_enabled_default=true" -i hosts-dev
ロールの最後に firewalld サービスを開始
ansible-playbook firewalld.yml --extra-vars "inventory=centos7 firewalld_managed=true firewalld_start=true" -i hosts-dev
設定のみを表示(変数から)
ansible-playbook firewalld.yml --extra-vars "inventory=centos7 firewalld_managed=true firewalld_show_config=true" -i hosts --tags "firewalld_show_config"
firewalld コマンドリファレンス
firewalld ドキュメンテーションにて、他のコマンドを見つけられます: https://firewalld.org/documentation/man-pages/firewall-offline-cmd
ゾーンに IP を追加:
firewall-offline-cmd --zone=public --list-all
firewall-offline-cmd --zone=internal --add-source=192.168.22.64/26
firewall-offline-cmd --zone=internal --add-source=192.168.23.64/26
パブリックゾーンにカスタムサービスを追加:
firewall-offline-cmd --new-service=app123-public
firewall-offline-cmd --service=app123-public --set-short=app123-public
firewall-offline-cmd --service=app123-public --set-description='app123 fw rules for public zone'
firewall-offline-cmd --service=app123-public --add-port=5000/tcp
firewall-offline-cmd --zone=public --add-service=app123-public
内部ゾーンにカスタムサービスを追加:
firewall-offline-cmd --new-service=app123-internal
firewall-offline-cmd --service=app123-internal --set-short=app123-internal
firewall-offline-cmd --service=app123-internal --set-description='app123 fw rules for internal zone'
firewall-offline-cmd --service=app123-internal --add-port=8080/tcp
firewall-offline-cmd --service=app123-internal --add-port=9000/tcp
firewall-offline-cmd --zone=internal --add-service=app123-internal
firewall-offline-cmd --zone=internal --list-all
組み込みサービスのリストを取得:
firewall-offline-cmd --get-services
その他の便利なコマンド:
firewall-cmd --state
firewall-cmd --get-active-zones
firewall-offline-cmd --zone=public --list-all
firewall-offline-cmd --zone=internal --list-all
firewall-offline-cmd --zone=public --list-services
firewall-offline-cmd --zone=internal --list-services
firewall-offline-cmd --info-service=app123-public
firewall-offline-cmd --info-service=app123-internal
firewall-cmd --reload
iptables コマンドリファレンス
アクティブな iptables をリスト:
iptables -nL
nftables コマンドリファレンス
アクティブな nftables をリスト:
nft list tables
nft list ruleset
nft list table inet firewalld
nft list chain inet firewalld filter_IN_public_allow
TODO
- firewalld が開始または停止している状態で動作するようにする
- 必要な場所でリロードを確認: "notify: Reload firewalld"
- タスクにさらにタグを追加
- firewalld サービスが実行されている場合に実際に機能することを確認し、アプリへのトラフィックをブロックしないことを確認
- さまざまなシナリオのための travis テストを構築
- ポートの変更/削除を簡素化/短縮
- --diff では多くのコマンドを使用しているためあまり表示されない。何が起こるかを表示し、デバッグが有効な場合に停止するようにするか?
著者
ライアン・ダニエルズ
Role to manage firewalld configuration using simple variables. All changes made in "offline" mode to prevent blocking existing services.
ansible-galaxy install ryandaniels.firewalld