2 votos

Inicio del cortafuegos `pf` en el arranque del sistema

Tengo una máquina en particular que mantengo abrochada con mucha fuerza. Sólo se permiten algunos puertos/protocolos específicos. Tengo un conjunto bastante básico de reglas que funcionan muy bien.

Mientras trabajaba en otro problema, me di cuenta de que podía añadir unas cuantas reglas más y ajustar aún más las cosas especificando puertos concretos en interfaces de red específicas. Así, por ejemplo, en una interfaz de red, sólo se permite el acceso a 80 y 443, sin acceso de correo o vpn a esa interfaz.

Así que aquí está el aspecto de una de las antiguas normas:

pass in quick proto tcp from any to any port { 80 443 } keep state

Y este es el aspecto de una de las nuevas normas:

pass in quick proto tcp from any to en1 port { 80 443 } keep state

La diferencia es sutil, pero estoy especificando una interfaz de red específica, no sólo en a 'cualquiera'. Este servidor en particular tiene tres conexiones a Internet.

El problema es... pf ya no se iniciará justo en el arranque con estas nuevas reglas. Cuando especifico la interfaz, mi pf startup script no se inicia pf . Y tengo que hacerlo manualmente a través del terminal.

A primera vista, el problema parece que mi script probablemente está intentando utilizar interfaces de red que aún no están en funcionamiento. Pero ya estoy esperando a que aparezcan. Aquí está mi pf startup script, ha funcionado perfectamente durante años, hasta este cambio de norma.

#!/bin/bash
ipconfig waitall
/sbin/pfctl -e -f /etc/pf.conf

Con las nuevas reglas, no se carga nada en el inicio del sistema cuando esto se ejecuta. Pero si ejecuto la misma pfctl una vez que el sistema está en marcha, carga las reglas e inicia el cortafuegos sin problemas.

He modificado mi script para guardar varias copias de ifconfig para poder ver cómo progresa el estado de las dos interfaces en0 y en1. Antes de la ipconfig waitall comando, están allí sin IPs. Después del comando, siguen sin ips y aparecen como "inactivos". Durante los siguientes segundos, las diferentes IPs comienzan a cargarse. Pero las dos interfaces aparecen todo el tiempo.

Así que la solución fácil del parche sería simplemente ejecutar ipconfig waitall seguido de sleep 6 y dar por terminado el día. Pero prefiero saber exactamente lo que está causando el cuelgue para poder esperar a que esa "cosa" exacta esté lista, en lugar de dejar el firewall completamente abierto durante 6 segundos. Es un servidor de alto tráfico y recibe muchos intentos de hackeo/datos, así que cada segundo puede contar.

0 votos

¿Has comprobado que el script se ejecuta realmente? ¿Puedes extender el script para detectar cualquier error que se produzca en sus comandos y registrarlo?

0 votos

@nohillside Lo hice, y lo es. Y no emite nada, ni errores, ni comentarios, nada.

1 votos

¿Ha encontrado alguna solución?

0voto

Rich Puntos 2429

Hay un pequeño error en su regla añadida:

pass in quick proto tcp from any to en1 port { 80 443 } keep state

los campos después de la clave from y to debe ser la dirección IP y la especificación del puerto, pero no un nombre de interfaz.

Para aplicar su regla explícitamente al tráfico entrante en la interfaz en1 , deberías escribir así, con la macro para poder mantener sus reglas de PF muy rápidamente:

ext_if = "en1"

pass in quick on $ext_if proto tcp from any to any port { 80 443 } keep state

Si comprueba la carga de su pf.conf de forma interactiva, pfctl debería advertirle de un error de sintaxis. Como efecto secundario positivo, esta regla será independiente de la dirección IP atribuida a en1 Así, no tendrá ningún tipo de sincronización.

-1voto

Douglas Puntos 10417

No deberías tener que crear tu propio plist para habilitar el firewall pf en el arranque especialmente ya que está utilizando el conjunto de reglas por defecto. Sólo tienes que habilitarlo. Esto se lanzará en el "momento correcto" cuando todas sus interfaces estén configuradas y en funcionamiento.

Paso 1: Editar el plist suministrado por Apple

El archivo que está buscando es /System/Library/LaunchDaemons/com.apple.pfctl.plist .

Cambia el Discapacitados de "verdadero" a "falso". Esto es lo que debería parecer:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>Label</key>
    <string>com.apple.pfctl</string>
    <key>WorkingDirectory</key>
    <string>/var/run</string>
    <key>Program</key>
    <string>/sbin/pfctl</string>
    <key>ProgramArguments</key>
    <array>
        <string>pfctl</string>
        <string>-f</string>
        <string>/etc/pf.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Paso 2: Cargar (o recargar) el plist con launchctl

% sudo launchctl load /System/Library/LaunchDaemons/com.apple.pfctl.plist

Paso 3: El cortafuegos debe estar activado en el arranque.


Mi recomendación...

No debe exponer el Mac (o cualquier servidor) directamente a Internet, sino que debe estar detrás de una caja/aparato cortafuegos.

No me malinterpreten: soy un gran fan de la pf. Usted todavía debe habilitar el firewall pf en el Mac. Sin embargo, si lo que estás diciendo es correcto que incluso durante un par de segundos se te abalanzan los ataques DDoS, el servidor (Mac) no debería lidiar con ellos; tu firewall debería. De hecho, deberías tener un Cortafuegos pfSense frente a este servidor. Al tener un cortafuegos separado, el Mac siempre estará protegido independientemente de su estado (es decir, un cambio de regla inadvertido lo abre por error).

También se obtiene la ventaja de poder ejecutar paquetes como pfBlocker-NG en el dispositivo (eliminará las conexiones de los malos actores conocidos basándose en las listas blancas/negras) ofreciéndole un mayor nivel de protección. Tenerlo en el dispositivo libera a su Mac de tener que manejar esos procesos.

1 votos

Me parece que no has leído bien el post. Mi problema no es "cómo hacer un launchd script". El problema es una cuestión muy spacific con no ser capaz de iniciar pf inmediatamente en el arranque del sistema cuando mis reglas contienen especificadores de dispositivos Ethernet (en0 etc). Usando el plist suministrado por apple para iniciar pf tendrá exactamente el mismo problema que mi propio plist.

0 votos

En realidad sí - Apple incluido un plist para cargarlo correctamente evitando estos problemas.

1 votos

No hay nada en las manzanas plist que se activará para que se ejecute en cualquier momento diferente frente a cualquier otro RunAtLoad plist.

-2voto

Portos Puntos 1

Lea este artículo sobre los ataques DDoS, tal vez le sirva de ayuda

https://journalofcyberpolicy.com/2020/10/02/33-types-of-ddos-attacks-dissected/

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X