ricsanfre.firewall

Rol de Ansible: Firewall

CI

Instala y configura un firewall (basado en nftables) en Linux.

Requisitos

Ninguno.

Variables del Rol

Las variables disponibles se enumeran a continuación junto con sus valores predeterminados (ver defaults\main.yaml).

Habilitar NAT y reenvío de tráfico

  • firewall_forward_enabled: Habilitar o deshabilitar el soporte para reenvío de tráfico en un host dado. [predeterminado: false].
  • firewall_nat_enabled: Habilitar o deshabilitar el soporte para NAT en un host dado. [predeterminado: false].

Definir puertos abiertos por defecto

  • in_tcp_port: Se permite tráfico TCP entrante en estos puertos. [predeterminado: { ssh }].
  • in_udp_port: Se permite tráfico UDP entrante en estos puertos. [predeterminado: { snmp }].
  • out_tcp_port: Se permite tráfico TCP saliente en estos puertos. [predeterminado: { http, https, ssh }].
  • out_udp_port: Se permite tráfico UDP saliente en estos puertos. [predeterminado: { domain, bootps, ntp }].

Diccionarios de Reglas

Para cada cadena dentro de la tabla de IP (entrada, salida, reenvío) y la tabla NAT (nat-prerouting y nat-postrouting), las reglas nft se almacenan en diccionarios que se pueden sobrescribir a nivel de grupo y host.

Variables y conjuntos de definiciones y reglas globales

Conjunto de variables y definiciones utilizadas por las diferentes cadenas de reglas y reglas de cadena global que se pueden invocar desde otra cadena usando la regla jump global

definir conjuntos cadena global
nft_define_default nft_set_default nft_global_default
nft_define_group nft_set_group nft_global_group_rules
nft_define_host nft_set_host nft_global_host_rules

Reglas de la tabla IP

cadena de entrada cadena de salida cadena de reenvío
nft_input_default_rules nft_output_default_rules nft_forward_default_rules
nft_input_group_rules nft_output_group_rules nft_forward_group_rules
nft_input_host_rules nft_output_host_rules nft_forward_host_rules

Reglas de la tabla NAT

cadena de prerouting cadena de postrouting
nft_nat_default_prerouting_rules nft_nat_default_postrouting_rules
nft_nat_group_prerouting_rules nft_nat_group_postrouting_rules
nft_nat_host_prerouting_rules nft_nat_host_postrouting_rules

Cada tipo de diccionario de reglas se fusionará y las reglas se aplicarán en el orden alfabético de las claves (la razón para usar 000 a 999 como prefijo). Así:

  • nft_*_default_rules: Define reglas predeterminadas para todos los nodos. Se puede definir en group_vars/all.
  • nft_*_group_rules: Puede agregar reglas y sobrescribir las definidas por nft_*_default_rules y nft_*_rules. Se puede definir en group_vars/group_servers.
  • nft_*_host_rules: Puede agregar reglas y sobrescribir aquellas definidas por nft_*_default_rules, nft_*_group_rules y nft_*_rules. Se puede definir en host_vars/specific_host.

Configuración predeterminada de nftables

Por defecto, el rol generará el siguiente archivo de configuración:

/etc/nftables.conf

#!/usr/sbin/nft -f
# Gestionado por Ansible

# limpiar
flush ruleset

include "/etc/nftables.d/defines.nft"

table inet filter {
    chain global {
        # 000 gestión de estado
        ct state established,related accept
        ct state invalid drop
    }
    include "/etc/nftables.d/sets.nft"
    include "/etc/nftables.d/filter-input.nft"
    include "/etc/nftables.d/filter-output.nft"
}

/etc/nftables.d/defines.nft

  # direcciones de broadcast y multicast
  define badcast_addr = { 255.255.255.255, 224.0.0.1, 224.0.0.251 }

  # direcciones de broadcast y multicast
  define ip6_badcast_addr = { ff02::16 }

  # in_tcp_accept
  define in_tcp_accept = { ssh }

  # in_udp_accept
  define in_udp_accept = { snmp }

  # out_tcp_accept
  define out_tcp_accept = { http, https, ssh }

  # out_udp_accept
  define out_udp_accept = { domain, bootps , ntp }

/etc/nftables.d/sets.nft

  set blackhole {
        type ipv4_addr;
        elements = $badcast_addr
    }

  set in_tcp_accept {
        type inet_service; flags interval;
        elements = $in_tcp_accept
    }

  set in_udp_accept {
        type inet_service; flags interval;
        elements = $in_udp_accept
    }

  set ip6blackhole {
        type ipv6_addr;
        elements = $ip6_badcast_addr
    }

  set out_tcp_accept {
        type inet_service; flags interval;
        elements = $out_tcp_accept
    }

  set out_udp_accept {
        type inet_service; flags interval;
        elements = $out_udp_accept
    }

/etc/nftables.d/filter-input.nft

chain input {
        # 000 política
        type filter hook input priority 0; policy drop;
        # 005 global
        jump global
        # 010 eliminar lo no deseado
        ip daddr @blackhole counter drop
        # 011 eliminar lo no deseado ipv6
        ip6 daddr @ip6blackhole counter drop
        # 015 localhost
        iif lo accept
        # 050 icmp
        meta l4proto {icmp,icmpv6} accept
        # 200 entrada udp aceptada
        udp dport @in_udp_accept ct state new accept
        # 210 entrada tcp aceptada
        tcp dport @in_tcp_accept ct state new accept
}

/etc/nftables.d/filter-output.nft

chain output {
        # 000 política
        type filter hook output priority 0; policy drop;
        # 005 global
        jump global
        # 015 localhost
        oif lo accept
        # 050 icmp
        ip protocol icmp accept
        ip6 nexthdr icmpv6 counter accept
        # 200 salida udp aceptada
        udp dport @out_udp_accept ct state new accept
        # 210 salida tcp aceptada
        tcp dport @out_tcp_accept ct state new accept
        # 250 reiniciar-ssh
        tcp sport ssh tcp flags { rst, psh | ack } counter accept
}

Y el siguiente conjunto de reglas en el host (mostrado al ejecutar el comando nft list ruleset):

table inet filter {
        set blackhole {
                type ipv4_addr
                elements = { 224.0.0.1, 224.0.0.251,
                             255.255.255.255 }
        }

        set in_tcp_accept {
                type inet_service
                flags interval
                elements = { 22 }
        }

        set in_udp_accept {
                type inet_service
                flags interval
                elements = { 161 }
        }

        set ip6blackhole {
                type ipv6_addr
                elements = { ff02::16 }
        }

        set out_tcp_accept {
                type inet_service
                flags interval
                elements = { 22, 80, 443 }
        }

        set out_udp_accept {
                type inet_service
                flags interval
                elements = { 53, 67, 123 }
        }

        chain global {
                ct state established,related accept
                ct state invalid drop
        }

        chain input {
                type filter hook input priority filter; policy drop;
                jump global
                ip daddr @blackhole counter packets 0 bytes 0 drop
                ip6 daddr @ip6blackhole counter packets 0 bytes 0 drop
                iif "lo" accept
                meta l4proto { icmp, ipv6-icmp } accept
                udp dport @in_udp_accept ct state new accept
                tcp dport @in_tcp_accept ct state new accept
        }

        chain output {
                type filter hook output priority filter; policy drop;
                jump global
                oif "lo" accept
                ip protocol icmp accept
                ip6 nexthdr ipv6-icmp counter packets 0 bytes 0 accept
                udp dport @out_udp_accept ct state new accept
                tcp dport @out_tcp_accept ct state new accept
                tcp sport 22 tcp flags { rst, psh | ack } counter packets 0 bytes 0 accept
        }
}

Dependencias

Ninguna

Ejemplos de Playbooks

Aplicar reglas predeterminadas

Instalar y configurar un firewall en un host con reglas predeterminadas

- hosts: serverx
  roles:
    - ricsanfre.firewall

en group_vars/all.yml puedes sobrescribir las reglas predeterminadas para todos tus hosts:

nft_input_default_rules:
  000 política:
    - type filter hook input priority 0; policy drop;
  005 global:
    - jump global
  010 eliminar lo no deseado:
    - ip daddr @blackhole counter drop
  011 eliminar lo no deseado ipv6:
    - ip6 daddr @ip6blackhole counter drop
  015 localhost:
    - iif lo accept
  050 icmp:
    - meta l4proto {icmp,icmpv6} accept
  200 entrada udp aceptada:
    - udp dport @in_udp_accept ct state new accept
  210 entrada tcp aceptada:
    - tcp dport @in_tcp_accept ct state new accept

Modificar reglas predeterminadas a nivel de grupo

Abrir tráfico HTTP entrante para el grupo webservers:

En group_vars/webservers.yml esto se puede hacer modificando in_tcp_port :

in_tcp_port: { ssh, http }

O agregando una nueva regla específica

nft_input_group_rule:
  220 entrada web aceptada:
    - tcp dport http ct state new accept

Modificar predeterminados + reglas de grupo a nivel de host

Abrir tráfico HTTPS entrante para el host secureweb en host_vars/secureweb.yml querrías abrir https y eliminar el acceso a http:

nft_input_group_rule:
  220 entrada web aceptada: []
  230 entrada web segura aceptada:
    - tcp dport https ct state new accept

Las reglas predeterminadas se pueden eliminar

Para "eliminar" reglas, simplemente asigna una lista vacía a una clave de diccionario existente: Ejemplo: desactivar tráfico ICMP entrante

nft_input_host_rules:
  050 icmp: []

Eliminar reglas predeterminadas para permitir todo el tráfico saliente. en un group_vars/group.yml específico

nft_output_group_rules:
  000 política:
    - type filter hook output priority 0;
  005 global:
    -
  015 localhost:
    -
  050 icmp:
    -
  200 salida udp aceptada:
    -
  210 salida tcp aceptada:
    -
  250 reiniciar-ssh:
    -

La regla predeterminada 000 política se sobrescribe para aceptar todo el tráfico y el resto de las reglas se eliminan.

Para resumir, las reglas en nft_X_host_rules sobrescribirán las reglas en nft_X_group_rules, y luego las reglas en nft_X_group_rules sobrescribirán las reglas en nft_X_default_rules.

Licencia

MIT/BSD

Información del Autor

Ricardo Sanchez (ricsanfre)

Acerca del proyecto

Nftables-based firewall installation and configuration role

Instalar
ansible-galaxy install ricsanfre.firewall
Licencia
mit
Descargas
11.1k
Propietario
Telecom engineer.