bimdata.ferm

Ansibleロール Ferm

このロールはFermをインストールおよび設定します。

要件

  • このロールはAnsible >= 2.9でのみテストされています。

ロールの変数

各オプションに関する詳細はFermのドキュメントを参照してください。

インストールに使用される変数:

変数名 既定値 説明
ferm_pkg_name ferm FermのAPTパッケージ名。
ferm_svc_name ferm デーモンを開始/停止するためのFermサービス名。

一般的な設定に使用される変数:

変数名 既定値 説明
ferm_main_conf_file /etc/ferm/ferm.conf Fermのメイン設定ファイルのパス。
ferm_rules_path /etc/ferm/ferm.d Fermのルールディレクトリのパス。

デフォルトのルールはメイン設定ファイルに保存され、設定ディレクトリで定義されたすべてのルールを読み込みます。これにより、このロールで管理されない他のルールを定義できます(ferm_delete_unknown_rulesfalseに設定されている場合)。

ルール設定に使用される変数:

変数名 既定値 説明
ferm_delete_unknown_rulefiles true このロールで管理されていないferm_rules_pathのルールを削除します。
ferm_default_domains ['ip', 'ip6'] ルールにドメインが指定されていない場合、これが使用されます。
ferm_default_table filter ルールにテーブルが指定されていない場合、これが使用されます。

ルール定義に使用される変数:

変数名 既定値 説明
ferm_input_policy DROP Fermのデフォルトの入力ポリシー。
ferm_output_policy ACCEPT Fermのデフォルトの出力ポリシー。
ferm_forward_policy DROP Fermのデフォルトの転送ポリシー。
_ferm_rules "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='rule')) }}" すべてのfermルールを定義する辞書のリスト。
_ferm_vars "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='var')) }}" すべてのferm変数を定義する辞書のリスト。
_ferm_functions "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='function')) }}" すべてのferm関数を定義する辞書のリスト。
_ferm_hooks "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='hook')) }}" すべてのfermフックを定義する辞書のリスト。

ほとんどの場合、'_'で始まる変数を修正すべきではありません。 テンプレート化を使用して、他の変数でこれらのリストを構築します。

  • _ferm_rulesは、名前がこの正規表現に一致するすべての変数を集約します: ^ferm_.+_rule(s)?$
  • _ferm_varsは、名前がこの正規表現に一致するすべての変数を集約します: ^ferm_.+_var(s)?$
  • _ferm_functionsは、名前がこの正規表現に一致するすべての変数を集約します: ^ferm_.+_function(s)?$
  • _ferm_hooksは、名前がこの正規表現に一致するすべての変数を集約します: ^ferm_.+_hook(s)?$

これらの正規表現に一致する各変数は次のようにする必要があります:

  • 1つのルール/変数/関数/フックを定義する辞書 または
  • 1つ以上のルール/変数/関数/フックを定義する辞書のリスト。

これにより、複数のグループ変数で変数を定義し、ホストグループのためにそれらを蓄積することが可能になります。

デフォルトのルールセットを定義するために使用される変数:

  • これはINPUTテーブルのデフォルトのルールセットを設定します:
    ferm_default_inputs:
      - "policy {{ ferm_input_policy }};"
      - interface lo ACCEPT;
      - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
    
  • これはOUTPUTテーブルのデフォルトのルールセットを設定します:
    ferm_default_outputs:
      - "policy {{ ferm_output_policy }};"
      - outerface lo ACCEPT;
      - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
    
  • これはFORWARDテーブルのデフォルトのルールセットを設定します:
    ferm_default_forwards: []
    

Debian 11はデフォルトでiptables-nftを使用しており、これはfermではサポートされていません。 Debian 11以降、fermは代替設定を無視し、iptables-legacyの使用を強制します(https://github.com/MaxKellermann/ferm/issues/47)

変数名 既定値 説明
ferm_iptables_path /usr/sbin/iptables-legacy iptables-legacyのパス。
ferm_ip6tables_path /usr/sbin/ip6tables-legacy ip6tables-legacyのパス。
ferm_arptables_path /usr/sbin/arptables-legacy arptables-legacyのパス。
ferm_ebtables_path /usr/sbin/ebtables-legacy ebtables-legacyのパス。

これらの変数はDebian 10以上のホストでのみ使用されます。 それは、OSをalternativeシステムで設定し、ferm_iptables_pathferm_ip6tables_pathferm_arptables_pathferm_ebtables_pathの値をデフォルトのiptablesコマンドとして設定します。

変数の定義

Ferm変数は次のように定義できます:

ferm_webports_var:
  name: web_ports
  content:
    - 80
    - 443

ferm_hosts_vars:
  - name: web_front_addr
    content:
      - 172.29.10.100
      - 2a01:baaf::100

フックの定義

Fermフックは次のように定義できます:

ferm_fail2ban_hooks:
  - comment: Fail2ban hooks
    content: post "type fail2ban-server > /dev/null && (fail2ban-client ping > /dev/null && fail2ban-client reload > /dev/null || true) || true";
  - content: flush "type fail2ban-server > /dev/null && (fail2ban-client ping > /dev/null && fail2ban-client reload > /dev/null || true) || true";

ルールの定義

ルールは次の2つの方法で定義できます:

ferm_web_rules:
  - name: "web_server"
    content:
      - domains: ['ip']        # 省略可能、ferm_default_domainsが使用されます
        chains: ['INPUT']      # 省略可能、ferm_default_tableが使用されます
        rules:
          - proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT

または、生のルールを定義できます:

ferm_web_rules:
  - name: "web_server"
    raw_content: |
      domain (ip) table filter {
        chain (INPUT) {
          proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT;
        }
      }

関数の定義

Ferm関数は次のように定義できます:

ferm_dnat_function:
  comment: "Easy DNAT (DNAT+filter rules)"
  content: |
    @def &EASY_DNAT($wan_ip, $proto, $port, $dest) = {
      domain ip table nat chain PREROUTING daddr $wan_ip proto $proto dport $port DNAT to @ipfilter($dest);
      domain (ip ip6) table filter chain FORWARD outerface $dmz_iface daddr $dest proto $proto dport $port ACCEPT;
    }

その後、生のルールを使用してこれを利用する必要があります。以下のように:

ferm_dnat_rules:
  - name: "80-dnat-rules"
    raw_content: |
      # HTTP(S) web_front
      &EASY_DNAT($main_public_ip, tcp, (80 443), $web_front_addr);

Dockerの例

Dockerや他のソフトウェアは独自のiptablesルールを管理したい場合があります。この場合は、制限がありますが可能です。Dockerの例を以下に示します:

# FORWARDではルールを定義できません、dockerによって設定されたすべての
# ルールを保持するためのルールの前にあります
ferm_default_forwards: []

# Dockerルールを保持します
ferm_docker_preserve_rules:
  - name: 99-docker-users.ferm
    content:
      - domains: ['ip']
        chains: ['DOCKER-USER']
        rules:
          - "RETURN;"
  - name: 00-docker-preserve.ferm
    content:
      - domains: ['ip']
        chains:
          - DOCKER
          - DOCKER-INGRESS
          - DOCKER-ISOLATION-STAGE-1
          - DOCKER-ISOLATION-STAGE-2
          - FORWARD
        rules:
          - "@preserve;"
      - domains: ['ip']
        table: nat
        chains:
          - DOCKER
          - DOCKER-INGRESS
          - PREROUTING
          - OUTPUT
          - POSTROUTING
        rules:
          - "@preserve;"

@preservefermによって使用される特別な単語です。これはiptables-saveで前のルールを保存し、その後、保存されたチェーンに対するすべてのルールを抽出し、新しいルールに挿入します。

依存関係

なし

使用例のプレイブック

group_vars/all.ymlに:

ferm_webports_var:
  name: web_ports
  content:
    - 80
    - 443

group_vars/web.ymlに:

ferm_web_rules:
  - name: "web_server"
    content:
      - chains: ['INPUT']
        rules:
          - proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT

group_vars/router.ymlに:

ferm_interface_vars:
  - name: wan_iface
    content: ['eth0']
  - name: dmz_iface
    content: ['eth1']
  - name: lan_iface
    content:
      - eth2
      - eth3

ferm_ips_vars:
  - name: main_public_ip
    content: ['1.2.3.4']
  - name: web_front_addr
    content:
      - 10.0.0.100
      - 2a01:baaf::100

ferm_dnat_function:
  comment: "Easy DNAT (DNAT+filter rules)"
  content: |
    @def &EASY_DNAT($wan_ip, $proto, $port, $dest) = {
      domain ip table nat chain PREROUTING daddr $wan_ip proto $proto dport $port DNAT to @ipfilter($dest);
      domain (ip ip6) table filter chain FORWARD outerface $dmz_iface daddr $dest proto $proto dport $port ACCEPT;
    }

ferm_dnat_rules:
  - name: "80-dnat-rules"
    raw_content: |
      # HTTP(S) web_front
      &EASY_DNAT($main_public_ip, tcp, $web_ports, $web_front_addr);

playbook.ymlに:

- hosts: all
  gather_facts: True
  become: yes
  roles:
    - bimdata.ferm

ライセンス

BSD

著者情報

BIMData.io

プロジェクトについて

This role installs and configures ferm.

インストール
ansible-galaxy install bimdata.ferm
ライセンス
mit
ダウンロード
45k
所有者