bimdata.ferm

Rol de Ansible Ferm

Este rol instala y configura Ferm.

Requisitos

  • Este rol solo se ha probado con Ansible >= 2.9.

Variables del Rol

Puedes encontrar más información sobre cada opción en la documentación de Ferm.

Variables utilizadas para la instalación:

Variables Valor por defecto Descripción
ferm_pkg_name ferm El nombre del paquete APT de ferm.
ferm_svc_name ferm El nombre del servicio ferm para iniciar/detener el daemon.

Variables utilizadas para la configuración general:

Variables Valor por defecto Descripción
ferm_main_conf_file /etc/ferm/ferm.conf Ruta de configuración principal de Ferm.
ferm_rules_path /etc/ferm/ferm.d Ruta del directorio de reglas de Ferm.

Las reglas por defecto se almacenarán en el archivo de configuración principal, que luego cargará todas las reglas definidas en el directorio de configuración. Esto te permite definir otras reglas no gestionadas por este rol (si ferm_delete_unknown_rules está configurado en false).

Variables utilizadas para la configuración de reglas:

Variables Valor por defecto Descripción
ferm_delete_unknown_rulefiles true Eliminar las reglas en ferm_rules_path que no son gestionadas por este rol.
ferm_default_domains ['ip', 'ip6'] Cuando una regla no especifica un dominio, se utiliza este.
ferm_default_table filter Cuando una regla no especifica una tabla, se utiliza esta.

Variables utilizadas para la definición de reglas:

Variables Valor por defecto Descripción
ferm_input_policy DROP Política de entrada por defecto de Ferm.
ferm_output_policy ACCEPT Política de salida por defecto de Ferm.
ferm_forward_policy DROP Política de reenvío por defecto de Ferm.
_ferm_rules "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='rule')) }}" Lista de diccionarios que definen todas las reglas de Ferm.
_ferm_vars "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='var')) }}" Lista de diccionarios que definen todas las variables de Ferm.
_ferm_functions "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='function')) }}" Lista de diccionarios que definen todas las funciones de Ferm.
_ferm_hooks "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='hook')) }}" Lista de diccionarios que definen todos los hooks de Ferm.

En la mayoría de los casos, no debes modificar las variables que empiezan con un '_'. Se utiliza templating para construir estas listas con otras variables.

  • _ferm_rules agregará todas las variables cuyo nombre coincida con esta expresión regular: ^ferm_.+_rule(s)?$
  • _ferm_vars agregará todas las variables cuyo nombre coincida con esta expresión regular: ^ferm_.+_var(s)?$
  • _ferm_functions agregará todas las variables cuyo nombre coincida con esta expresión regular: ^ferm_.+_function(s)?$
  • _ferm_hooks agregará todas las variables cuyo nombre coincida con esta expresión regular: ^ferm_.+_hook(s)?$

Cada variable que coincide con estas expresiones regulares debe ser:

  • un diccionario que define una regla/variable/función/hook o
  • una lista de diccionarios que definen una o más reglas/variables/funciones/hooks.

Esto te permite definir variables en múltiples group_vars y acumularlas para hosts en múltiples grupos sin necesidad de reescribir la lista completa.

Variables utilizadas para definir el conjunto de reglas por defecto:

  • esta configura el conjunto de reglas por defecto para la tabla INPUT:
    ferm_default_inputs:
      - "policy {{ ferm_input_policy }};"
      - interface lo ACCEPT;
      - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
    
  • esta configura el conjunto de reglas por defecto para la tabla OUTPUT:
    ferm_default_outputs:
      - "policy {{ ferm_output_policy }};"
      - outerface lo ACCEPT;
      - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
    
  • esta configura el conjunto de reglas por defecto para la tabla FORWARD:
    ferm_default_forwards: []
    

Debian 11 usa iptables-nft por defecto y no es compatible con ferm. Desde Debian 11, ferm ignora la configuración alternativa y obliga el uso de iptables-legacy (https://github.com/MaxKellermann/ferm/issues/47)

Variables Valor por defecto Descripción
ferm_iptables_path /usr/sbin/iptables-legacy Ruta de iptables-legacy.
ferm_ip6tables_path /usr/sbin/ip6tables-legacy Ruta de ip6tables-legacy.
ferm_arptables_path /usr/sbin/arptables-legacy Ruta de arptables-legacy.
ferm_ebtables_path /usr/sbin/ebtables-legacy Ruta de ebtables-legacy.

Estas variables solo se utilizan en host Debian con versión > 10. Configurarán el sistema operativo con el sistema alternative para establecer el valor de ferm_iptables_path, ferm_ip6tables_path, ferm_arptables_path y ferm_ebtables_path como el comando iptables por defecto.

Definiciones de Variables

Una variable de ferm se puede definir así:

ferm_webports_var:
  name: web_ports
  content:
    - 80
    - 443

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

Definiciones de Hooks

Un hook de ferm se puede definir así:

ferm_fail2ban_hooks:
  - comment: Hooks de 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";

Definiciones de Reglas

Una regla se puede definir de dos maneras:

ferm_web_rules:
  - name: "web_server"
    content:
      - domains: ['ip']        # Se puede omitir, se utilizarán ferm_default_domains
        chains: ['INPUT']      # Se puede omitir, se utilizará ferm_default_table
        rules:
          - proto tcp dport ($web_ports) mod comment comment "servidor web" ACCEPT

o puedes definir reglas en bruto:

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

Definiciones de Funciones

Una función de ferm se puede definir así:

ferm_dnat_function:
  comment: "Fácil DNAT (reglas DNAT+filtro)"
  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;
    }

Luego necesitas usar una regla en bruto para utilizarla, algo como:

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

Ejemplo de Docker

Docker y otro software pueden querer gestionar sus propias reglas de iptables. Esto es posible, con algunas limitaciones. Aquí hay un ejemplo para Docker:

# No se puede definir ninguna regla en FORWARD antes de la regla utilizada para preservar todas
# las reglas configuradas por docker
ferm_default_forwards: []

# Preservar reglas de 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 es una palabra especial utilizada por ferm. Guardará las reglas anteriores con iptables-save y luego extraerá todas las reglas para las cadenas preservadas y las insertará en las nuevas reglas.

Dependencias

Ninguna

Ejemplo de Playbook

en group_vars/all.yml:

ferm_webports_var:
  name: web_ports
  content:
    - 80
    - 443

en group_vars/web.yml:

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

en 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: "Fácil DNAT (reglas DNAT+filtro)"
  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);

en playbook.yml:

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

Licencia

BSD

Información del Autor

BIMData.io

Acerca del proyecto

This role installs and configures ferm.

Instalar
ansible-galaxy install bimdata.ferm
Licencia
mit
Descargas
45k
Propietario