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/26192.168.23.64/26 はゾーン internal に追加されます
  • 192.168.32.64/26192.168.33.64/26 はゾーン internal から削除されます

カスタムサービスが作成され、指定されたポートでゾーンに追加されます:

  • app123-public サービスがポート/プロトコル 5000/tcp で作成され、ゾーン public に追加されます。
  • app123-internal サービスがポート/プロトコル 8080/tcp9000/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
ライセンス
mit
ダウンロード
1k
所有者
Ansible all the things