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_rules
がfalse
に設定されている場合)。
ルール設定に使用される変数:
変数名 | 既定値 | 説明 |
---|---|---|
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_path
、ferm_ip6tables_path
、ferm_arptables_path
、ferm_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;"
@preserve
はferm
によって使用される特別な単語です。これは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