bimdata.ferm

Ansible-Rolle Ferm

Diese Rolle installiert und konfiguriert Ferm.

Anforderungen

  • Diese Rolle wurde nur mit Ansible >= 2.9 getestet.

Rollen-Variablen

Weitere Informationen zu jeder Option finden Sie in der Ferm-Dokumentation.

Variablen, die für die Installation verwendet werden:

Variablen Standardwert Beschreibung
ferm_pkg_name ferm Der Name des Ferm APT-Pakets.
ferm_svc_name ferm Der Name des Ferm-Dienstes zum Starten/Stoppen des Daemons.

Variablen für die allgemeine Konfiguration:

Variablen Standardwert Beschreibung
ferm_main_conf_file /etc/ferm/ferm.conf Pfad zur Hauptkonfiguration von Ferm.
ferm_rules_path /etc/ferm/ferm.d Pfad zum Regelverzeichnis von Ferm.

Die Standardregeln werden in der Hauptkonfigurationsdatei gespeichert, die dann alle Regeln lädt, die im Konfigurationsverzeichnis definiert sind. Dies ermöglicht es Ihnen, andere Regeln zu definieren, die nicht von dieser Rolle verwaltet werden (wenn ferm_delete_unknown_rules auf false gesetzt ist).

Variablen für die Regelkonfiguration:

Variablen Standardwert Beschreibung
ferm_delete_unknown_rulefiles true Löscht die Regeln im ferm_rules_path, die von dieser Rolle nicht verwaltet werden.
ferm_default_domains ['ip', 'ip6'] Wenn eine Regel keine Domäne angibt, wird diese verwendet.
ferm_default_table filter Wenn eine Regel keine Tabelle angibt, wird diese verwendet.

Variablen für die Regeldefinition:

Variablen Standardwert Beschreibung
ferm_input_policy DROP Standard-Input-Politik von Ferm.
ferm_output_policy ACCEPT Standard-Output-Politik von Ferm.
ferm_forward_policy DROP Standard-Forward-Politik von Ferm.
_ferm_rules "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='rule')) }}" Liste von Dictionaries, die alle Ferm-Regeln definieren.
_ferm_vars "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='var')) }}" Liste von Dictionaries, die alle Ferm-Variablen definieren.
_ferm_functions "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='function')) }}" Liste von Dictionaries, die alle Ferm-Funktionen definieren.
_ferm_hooks "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='hook')) }}" Liste von Dictionaries, die alle Ferm-Hooks definieren.

In den meisten Fällen sollten Sie die mit '_' beginnenden Variablen nicht ändern. Templates werden verwendet, um diese Listen mit anderen Variablen zu erstellen.

  • _ferm_rules aggregiert alle Variablen, deren Namen mit diesem Regex übereinstimmen: ^ferm_.+_rule(s)?$
  • _ferm_vars aggregiert alle Variablen, deren Namen mit diesem Regex übereinstimmen: ^ferm_.+_var(s)?$
  • _ferm_functions aggregiert alle Variablen, deren Namen mit diesem Regex übereinstimmen: ^ferm_.+_function(s)?$
  • _ferm_hooks aggregiert alle Variablen, deren Namen mit diesem Regex übereinstimmen: ^ferm_.+_hook(s)?$

Jede Variable, die diesen Regex entspricht, muss sein:

  • ein Dictionary, das eine Regel/Variable/Funktion/Hook definiert oder
  • eine Liste von Dictionaries, die eine oder mehrere Regeln/Variablen/Funktionen/Hooks definieren.

Damit können Sie Variablen in mehreren group_vars definieren und diese für Hosts in mehreren Gruppen ohne die Notwendigkeit, die gesamte Liste neu zu schreiben, kumulieren.

Variablen zur Definition des Standard-Regelsatzes:

  • Dies konfiguriert den Standard-Regelsatz für die INPUT-Tabelle:
    ferm_default_inputs:
      - "policy {{ ferm_input_policy }};"
      - interface lo ACCEPT;
      - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
    
  • Dies konfiguriert den Standard-Regelsatz für die OUTPUT-Tabelle:
    ferm_default_outputs:
      - "policy {{ ferm_output_policy }};"
      - outerface lo ACCEPT;
      - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
    
  • Dies konfiguriert den Standard-Regelsatz für die FORWARD-Tabelle:
    ferm_default_forwards: []
    

Debian 11 verwendet standardmäßig iptables-nft und wird von Ferm nicht unterstützt. Seit Debian 11 ignoriert Ferm alternative Einstellungen und zwingt die Verwendung von iptables-legacy (https://github.com/MaxKellermann/ferm/issues/47)

Variablen Standardwert Beschreibung
ferm_iptables_path /usr/sbin/iptables-legacy Pfad zu iptables-legacy.
ferm_ip6tables_path /usr/sbin/ip6tables-legacy Pfad zu ip6tables-legacy.
ferm_arptables_path /usr/sbin/arptables-legacy Pfad zu arptables-legacy.
ferm_ebtables_path /usr/sbin/ebtables-legacy Pfad zu ebtables-legacy.

Diese Variablen werden nur auf Debian-Hosts mit Version > 10 verwendet. Sie konfigurieren das Betriebssystem mit dem alternative System, um den Wert von ferm_iptables_path, ferm_ip6tables_path, ferm_arptables_path und ferm_ebtables_path als Standard-iptables-Befehl festzulegen.

Variablen-Definitionen

Eine Ferm-Variable kann so definiert werden:

ferm_webports_var:
  name: web_ports
  content:
    - 80
    - 443

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

Hook-Definitionen

Ein Ferm-Hook kann so definiert werden:

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";

Regel-Definitionen

Eine Regel kann auf zwei Arten definiert werden:

ferm_web_rules:
  - name: "web_server"
    content:
      - domains: ['ip']        # Kann weggelassen werden, ferm_default_domains wird verwendet.
        chains: ['INPUT']      # Kann weggelassen werden, ferm_default_table wird verwendet.
        rules:
          - proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT

oder Sie können rohe Regeln definieren:

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;
        }
      }

Funktions-Definitionen

Eine Ferm-Funktion kann so definiert werden:

ferm_dnat_function:
  comment: "Einfache DNAT (DNAT+Filterregeln)"
  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;
    }

Dann müssen Sie eine rohe Regel verwenden, um sie zu verwenden, etwa so:

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

Docker-Beispiel

Docker und andere Software möchten möglicherweise ihre eigenen iptables-Regeln verwalten. Dies ist möglich, mit einigen Einschränkungen. Hier ein Beispiel für Docker:

# Keine Regel kann in FORWARD definiert werden, bevor die Regel verwendet wird, um alle
# Regeln von Docker zu erhalten.
ferm_default_forwards: []

# Docker-Regeln bewahren
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 ist ein spezielles Wort, das von ferm verwendet wird. Es speichert die vorherigen Regeln mit iptables-save und extrahiert dann alle Regeln für die bewahrten Chains und fügt sie in die neuen Regeln ein.

Abhängigkeiten

Keine

Beispiel-Playbook

in group_vars/all.yml:

ferm_webports_var:
  name: web_ports
  content:
    - 80
    - 443

in 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

in 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: "Einfache DNAT (DNAT+Filterregeln)"
  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-regeln"
    raw_content: |
      # HTTP(S) web_front
      &EASY_DNAT($main_public_ip, tcp, $web_ports, $web_front_addr);

in playbook.yml:

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

Lizenz

BSD

Autoreninformationen

BIMData.io

Über das Projekt

This role installs and configures ferm.

Installieren
ansible-galaxy install bimdata.ferm
GitHub Repository
Lizenz
mit
Downloads
45k
Besitzer