Network security. Configurar el firewall con iptables / firewalld.

========================================================================

Introducción.

Si manejas habitualmente iptables y pensabas que sabias algo de configuración de Firewalls en Redhat / Centos… se fastidió. Con Centos 7 cambian las utilidades de configuración del Firewall y toca aprendérselas de nuevo. Firewalld sustituye a iptables (al servicio). Sigue existiendo la posibilidad de instalar iptables mediante yum y desactivar firewalld pero no se recomienda

Algunas novedades en la gestión del Firewall.

  • Firewalld sustituye al SERVICIO iptables (aunque “debajo” sigue estando iptables -comando- y por supuesto Netfilter)
  • Ya no se usan las cadenas INPUT, OUTPUT y FORWARD si no que cambia el concepto y ahora se usan Zonas.
  • Existen servicios predefinidos para evitar tener que trabajar con puertos (se pueden definir nuevos servicios y si se desea también trabajar con puertos).
  • La configuración es dinámica. Los cambios que se hagan pueden aplicarse en cualquier momento sin necesidad de recargar las reglas y de perder conexiones de red existentes.
  • Se usa la utilidad firewall-cmd para la configuración (Puedes usar firewall-config si tienes un interface gráfico, pero no se verá en este artículo).
  • Cambian completamente los ficheros de configuración.

Instalación y configuración de inicio

El paquete firewalld viene por defecto instalado e iniciado incluso en la instalación mínima. Si fuera necesario instalarlo y configurarlo al inicio.

yum install -y firewalld
systemctl enable firewalld
systemctl start firewalld

La configuración se realiza en modo comandos con la utilidad firewall-cmd. Como siempre disponemos de la ayuda tanto en formato man como en formato rápido:

man firewall-cmd
firewall-cmd --help

Podemosver el estado del servicio firewalld

[]# firewall-cmd --state
running

Y listar de forma general la configuración con

[]# firewall-cmd --list-all
public (default, active)
  interfaces: ens33
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Zonas.

Cuando configuramos firewalld lo primero que tendremos que hacer es asignar nuestro/s interface/s a una Zona. Una Zona es básicamente un conjunto de reglas que definen que tráfico estará permitido dependiendo del nivel de confianza que se tenga en la red a la que se está conectado.

Existen una serie de Zonas predefinidas y listas para usar en /etc/firewalld/. Dichas Zonas son las siguientes:

  • drop – Cualquier paquete de red entrante será eliminado. No hay replica. Solo conexiones de red de salida son posibles.
  • block – Cualquier conexión de red de entrada será rechazada con el mensaje “icmp-host-prohibited” para IPv4 y “icmp6-adm-prohibited” para IPv6. Solo se permiten conexiones de red iniciadas desde el sistema.
  • public – Para usar en áreas públicas. No se confiá en el resto de equipos en la red para proteger tu equipo. Solo se permiten conexiones de entrada seleccionadas. Es la zona por defecto.
  • external – Para usar en redes externas con enmascaramiento (masquerading) activado especialmente para Routers. No se confiá en el resto de equipos en la red para proteger tu equipo. Solo se aceptan conexiones de entrada seleccionadas.
  • dmz – Para equipos en tu zona desmilitarizada accesibles públicamente pero con acceso limitado a tu red interna. Solo acepta conexiones internas seleccionadas.
  • work – Para usar en áreas de trabajo. Se confiá en general que el resto de equipos de la red no dañará tu equipo. Solo acepta conexiones internas seleccionadas.
  • home – Para usar en la red de área doméstica. Se confiá en general que el resto de equipos de la red no dañará tu equipo. Solo acepta conexiones internas seleccionadas.
  • internal – Para usar en redes internas. Se confiá en general que el resto de equipos de la red no dañará tu equipo. Solo acepta conexiones internas seleccionadas.
  • trusted – Se aceptan todas las conexiones de red. Barra libre.

Podemos ver una lista de zonas activas y sus interfaces

[]# firewall-cmd --get-active-zones
public
  interfaces: ens33

Ver la configuración de una zona (sin indicarle una concreta mostrará la zona por defecto -> public)

[]# firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: ens33
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Si no tuvieramos en public ningún interface nos echa una mano para que nos centremos.

[]# firewall-cmd  --list-all
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'work' (see --get-active-zones)
You most likely need to use --zone=work option.

Podemos listar también de un plumazo la configuración de todas las zonas

firewall-cmd --list-all-zones

O ver solo las zonas activas.

[]# firewall-cmd --get-active-zones
work
  interfaces: ens33

En teoría se puede cambiar un interface de zona mediate firewall-cmd ya que existen comando para ello

[]# firewall-cmd --zone=public --add-interface=ens33
Error: ZONE_CONFLICT
[]# firewall-cmd --permanent --zone=public --change-interface=ens33
success

Pero parece NO FUNCIONA correctamente actualmente (agosto 2015) aunque modifica correctamente los ficheros XML de zona no funcionará. La forma “adecuada” de hacerlo es configurarlo en la definición del interface correspondiente en /etc/sysconfig/network-scripts/ en la forma “ZONE=work”. También existe la posibilidad de configurarlo con Network Manager. Más información en: https://bugs.centos.org/view.php?id=7407. Si no existe la definición de ZONE para el interface en el fichero de configuración lo asignará a la zona por defecto.

¿Y como sabe si un interface está o no en una zona? La forma más efectiva debería ser:

[]# firewall-cmd --get-zone-of-interface=ens33
home

NOTA: Pueden existir ficheros XML de definición de zonas en /etc/firewalld/zones/ Dichos ficheros solo se crean si hay cambios en la zona. Si no has añadido cambios de interfaces o servicios en una zona dicho fichero XML no existirá y dicha zona tendrá una configuración por defecto. Las zonas por defecto estarán en: /usr/lib/firewalld

Zona por defecto.

La zona por defecto viene definida en el fichero de configuración /etc/firewalld/firewalld.conf con el valor “DefaultZone” pero es posible cambiarla también con el comando:

firewall-cmd --set-default-zone=work

Servicios.

En firewalld existe el concepto de servicio y una serie de servicios predefinidos con el propósito de facilitar la configuración de acceso de las aplicaciones. Los servicios no solo son listas de puertos locales y destino si no que pueden añadir listas de módulos “firewall helpers” que se activan automáticamente al activar el servicio. La idea es hacer la vida del administrador más fácil. Los servicios son configuraciones en ficheros de configuración individuales XML (service-name.xml) tal como se describe en el man firewalld.service(5). La ubicación de los ficheros será:

  • /usr/lib/firewalld/services/ → Para los servicios predefinidos. No se deben editar.
  • /etc/firewalld/services/ → Para generar los nuevos servicios.

Para crear un nuevo servicio lo mejor será copiar uno de los servicios predefinidos en la nueva ubicación y modificar el fichero XML.

Ver servicios disponibles

[]# firewall-cmd --get-service
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https

Por tanto cuando habilitemos el acceso a las aplicaciones con firewalld lo haremos normalmente habilitando servicios predefinidos. Podemos echar un ojo a la definición XML de un servicio sencillo (puerto básicamente) como HTTP.

vim /usr/lib/firewalld/services/http.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>WWW (HTTP)</short>
  <description>HTTP is the protocol used to serve Web pages.
  If you plan to make your Web server publicly available, 
  enable this option. This option is not required for 
  viewing pages locally or developing Web pages.</description>
  <port protocol="tcp" port="80"/>
</service>

La forma de activar por tanto de forma permanente el acceso a Apache sería activando el/los servicios correspondientes y recargando la configuración.

firewall-cmd --permanent --zone=public --add-service=http 
# Podemos ya habilitar https (443) si queremos
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

NOTA: Activación inmediata o no de servicios. Comentábamos que unas de las bondades de Firewalld es que podemos configurar una regla para que se aplique inmediatamente sin recargar la configuración (sin usar “permanent” se aplicará al momento) pero si queremos que la regla sea permanente debemos, además de especificarlo realizar un “reload” de la configuración. Si hacemos el reload mediante el comando firewall-cmd lo realizará sin interrumpir las conexiones de usuario y por tanto no perderá la información de estado.

Verificamos que efectivamente están activados.

[~]# firewall-cmd --permanent --list-all
public (default)
  interfaces:
  sources:
  services: dhcpv6-client http https ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Vemos que nos muestra los interfaces pertenecientes a la zona, servicios habilitados (que vemos en un segundo), puertos habilitados,...

Modo pánico

Podemos de forma rápida conmutar el firewall a modo pánico para bloquear TODO el tráfico entrante / saliente. Los comandos que activan / desactivan / visualizan el modo pánico son:

firewall-cmd --panic-on
firewall-cmd --panic-off
firewall-cmd --query-panic

Un comando normal de estado no nos mostrará si está en este estado así que si entrás en pánico ten cuidado no te vuelvas loco después.

Ficheros de configuración.

Ya hemos ido viendo donde están los ficheros de configuración. Hacemos un repaso interesante: Todos los valores por defecto (predefinidos) están en: /usr/lib/firewalld . Tenemos en directorios valores para las zonas predefinidas, servicios por defecto y tipos de comandos icmp

El fichero “principal” de configuración del servicio es /etc/firewalld/firewalld.conf
Las configuraciones propias estarán en e directorio /etc/firewalld/ en:

  • services/ Definición de servicios propios
  • zones/ Cuando alteramos una zona añadiendole servicios nos creará el fichero en esta ubicación y prevalecerá sobre el fichero de zona por defecto.
  • icmptypes/ cambios / adiciones en tipos icmp, imagino.

Ficheros logs.

El fichero log por defecto para el servicio Firewalld está en /var/log/firewalld

Referencias.