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
ansible-galaxy install bimdata.ferm