bimdata.ferm

Ansible Rola Ferm

Ta rola instaluje i konfiguruje Ferm.

Wymagania

  • Ta rola jest testowana tylko z Ansible >= 2.9.

Zmienne Roli

Więcej informacji na temat każdej opcji znajdziesz w dokumentacji Ferm.

Zmienne używane do instalacji:

Zmienne Wartość domyślna Opis
ferm_pkg_name ferm Nazwa pakietu Ferm w APT.
ferm_svc_name ferm Nazwa usługi Ferm do uruchamiania/zatrzymywania demona.

Zmienne używane do ogólnej konfiguracji:

Zmienne Wartość domyślna Opis
ferm_main_conf_file /etc/ferm/ferm.conf Ścieżka do głównego pliku konfiguracyjnego Ferm.
ferm_rules_path /etc/ferm/ferm.d Ścieżka do katalogu z regułami Ferm.

Domyślne reguły zostaną zapisane w głównym pliku konfiguracyjnym, który załaduje wszystkie reguły zdefiniowane w katalogu konfiguracyjnym. Pozwoli to na definiowanie innych reguł, które nie są zarządzane przez tę rolę (jeśli ferm_delete_unknown_rules jest ustawione na false).

Zmienne używane do konfiguracji reguł:

Zmienne Wartość domyślna Opis
ferm_delete_unknown_rulefiles true Usuwa reguły w ferm_rules_path, które nie są zarządzane przez tę rolę.
ferm_default_domains ['ip', 'ip6'] Gdy reguła nie określa domeny, ta jest używana.
ferm_default_table filter Gdy reguła nie określa tabeli, ta jest używana.

Zmienne używane do definiowania reguł:

Zmienne Wartość domyślna Opis
ferm_input_policy DROP Domyślna polityka wejściowa Ferm.
ferm_output_policy ACCEPT Domyślna polityka wyjściowa Ferm.
ferm_forward_policy DROP Domyślna polityka przekazywania Ferm.
_ferm_rules "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='rule')) }}" Lista słowników definiujących wszystkie reguły Ferm.
_ferm_vars "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='var')) }}" Lista słowników definiujących wszystkie zmienne Ferm.
_ferm_functions "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='function')) }}" Lista słowników definiujących wszystkie funkcje Ferm.
_ferm_hooks "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='hook')) }}" Lista słowników definiujących wszystkie haki Ferm.

W większości przypadków nie powinieneś modyfikować zmiennych, które zaczynają się na '_'. Szablonowanie jest używane do budowania tych list z innymi zmiennymi.

  • _ferm_rules zbiera wszystkie zmienne, których nazwa pasuje do tego wyrażenia regularnego: ^ferm_.+_rule(s)?$
  • _ferm_vars zbiera wszystkie zmienne, których nazwa pasuje do tego wyrażenia regularnego: ^ferm_.+_var(s)?$
  • _ferm_functions zbiera wszystkie zmienne, których nazwa pasuje do tego wyrażenia regularnego: ^ferm_.+_function(s)?$
  • _ferm_hooks zbiera wszystkie zmienne, których nazwa pasuje do tego wyrażenia regularnego: ^ferm_.+_hook(s)?$

Każda zmienna pasująca do tych wyrażeń regularnych musi być:

  • słownikiem definiującym jedną regułę/zmienną/funkcję/hak lub
  • listą słowników definiujących jedną lub więcej reguł/zmiennych/funkcji/haków.

Pozwala to na definiowanie zmiennych w różnych group_vars i ich kumulowanie dla hostów w wielu grupach bez potrzeby przepisywania pełnej listy.

Zmienne używane do definiowania domyślnego zestawu reguł:

  • ta zmienna konfiguruje domyślny zestaw reguł dla tabeli INPUT:
    ferm_default_inputs:
      - "policy {{ ferm_input_policy }};"
      - interface lo ACCEPT;
      - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
    
  • ta zmienna konfiguruje domyślny zestaw reguł dla tabeli OUTPUT:
    ferm_default_outputs:
      - "policy {{ ferm_output_policy }};"
      - interface lo ACCEPT;
      - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
    
  • ta zmienna konfiguruje domyślny zestaw reguł dla tabeli FORWARD:
    ferm_default_forwards: []
    

Debian 11 używa iptables-nft domyślnie, a nie jest on obsługiwany przez ferm. Od Debiana 11, ferm ignoruje alternatywne ustawienia i wymusza użycie iptables-legacy (https://github.com/MaxKellermann/ferm/issues/47)

Zmienne Wartość domyślna Opis
ferm_iptables_path /usr/sbin/iptables-legacy Ścieżka do iptables-legacy.
ferm_ip6tables_path /usr/sbin/ip6tables-legacy Ścieżka do ip6tables-legacy.
ferm_arptables_path /usr/sbin/arptables-legacy Ścieżka do arptables-legacy.
ferm_ebtables_path /usr/sbin/ebtables-legacy Ścieżka do ebtables-legacy.

Te zmienne są używane tylko na hostach Debianie z wersją > 10. Skonfigurują system operacyjny za pomocą systemu alternative, aby ustawić wartość ferm_iptables_path, ferm_ip6tables_path, ferm_arptables_path i ferm_ebtables_path jako domyślną komendę iptables.

Definicje zmiennych

Zmienną ferm można zdefiniować w następujący sposób:

ferm_webports_var:
  name: web_ports
  content:
    - 80
    - 443

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

Definicje haków

Hak ferm można zdefiniować w następujący sposób:

ferm_fail2ban_hooks:
  - comment: Haki Fail2ban
    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";

Definicje reguł

Regułę można zdefiniować w dwa sposoby:

ferm_web_rules:
  - name: "web_server"
    content:
      - domains: ['ip']        # Można pominąć, użyta zostanie ferm_default_domains
        chains: ['INPUT']      # Można pominąć, użyta zostanie ferm_default_table
        rules:
          - proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT

lub można zdefiniować surowe reguły:

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

Definicje funkcji

Funkcję ferm można zdefiniować w następujący sposób:

ferm_dnat_function:
  comment: "Łatwy DNAT (DNAT + reguły filtrujące)"
  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;
    }

Następnie musisz użyć surowej reguły, aby jej użyć, na przykład:

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

Przykład Docker

Docker i inne oprogramowanie mogą chcieć zarządzać własnymi regułami iptables. To jest możliwe, z pewnymi ograniczeniami. Oto przykład dla Dockera:

# Żadna reguła nie może być zdefiniowana w FORWARD przed regułą używaną do zachowania wszystkich
# reguł skonfigurowanych przez docker
ferm_default_forwards: []

# Zachowaj reguły dockera
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 to specjalne słowo używane przez ferm. Umożliwi ono zapisanie poprzednich reguł za pomocą iptables-save i następnie wydobycie wszystkich reguł dla zachowanych łańcuchów i wstawienie ich do nowych reguł.

Zależności

Brak

Przykład Playbook

w group_vars/all.yml:

ferm_webports_var:
  name: web_ports
  content:
    - 80
    - 443

w 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

w 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: "Łatwy DNAT (DNAT + reguły filtrujące)"
  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);

w playbook.yml:

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

Licencja

BSD

Informacje o Autorze

BIMData.io

O projekcie

This role installs and configures ferm.

Zainstaluj
ansible-galaxy install bimdata.ferm
Licencja
mit
Pobrania
45k
Właściciel