8 votos

Bloquear el tráfico hostil entrante dinámicamente con PF y fail2ban en OS X

El panorama más amplio es que estoy tratando de bloquear/desbloquear IPs de forma dinámica usando fail2ban 0.8.14. He estado siguiendo una guía antigua para OS 10.5 que no incluye PF.

Creo que he configurado todo correctamente, pero el PF de OS X me está causando algunos problemas.

Talaninc tiene la IP 192.168.1.68 y es el "local"

Celebgul tiene la IP 192.168.1.50 y es el "remoto"


Por lo que entiendo, debería poder emitir el siguiente comando:

user@celebgul:~$ sudo /sbin/pfctl -t fail2ban -T add 192.168.1.68/32

Esto agregará la dirección IP 192.168.1.68 a la tabla fail2ban, y bloqueará el tráfico entrante desde Talantinc, por lo tanto lo siguiente debería fallar:

forquare@talantinc:~$ ssh user@192.168.1.50
Contraseña:
Último inicio de sesión: Lun Ago 3 12:09:05 2015 desde talantinc.local
user@celebgul:~$ 

Pero como puedes ver, tiene éxito.


Por lo que puedo ver, mi entendimiento es incorrecto. He agregado 192.168.1.68, y aún puedo hacer SSH desde él a Celebgul.

Puedo consultar la tabla y ver 192.168.1.68 en ella:

user@celebgul:~$ sudo pfctl -t fail2ban -T show
No hay soporte ALTQ en el kernel
Funciones relacionadas con ALTQ desactivadas
   192.168.1.68

No he cambiado ninguno de los archivos de configuración predeterminados de Apple para PF, mi entendimiento era que solo necesitaría editar/crear los míos si quería reglas que fueran duraderas/persistieran en reinicios.

¿Cómo puedo usar PF para bloquear conexiones entrantes en OS X Client (no Server)?

Específicamente estoy mirando a El Capitan, sin embargo tampoco puedo hacer que esto funcione en Mavericks.

1 votos

Por cierto, pf ya está acompañado por un firewall adaptativo: verifica afctl/emond. Aunque no funciona de manera muy confiable.

0 votos

¿Es afctl/emond parte del cliente de OS X? Por lo que se ve en esa pregunta a la que enlazaste (y la investigación previa), parece que son parte de OS X Server.

1 votos

9voto

klanomath Puntos 19587

Aquí está un tutorial mejorado para instalar fail2ban en OS X 10.10 (probablemente también funciona en 10.9) basado en el (de alguna manera defectuosa) guía en forgetcomputers.zendisk.com.

El instalador automático no me funcionó en absoluto, así que lo hice manualmente.

  1. cd a ~/Downloads y descarga fail2ban-0.8.10

    cd ~/Downloads
    curl -O https://forgetcomputers.zendesk.com/hc/en-us/article_attachments/200287990/fail2ban-0.8.10.tar.gz
  2. Descomprima el paquete tar:

    tar xzf fail2ban-0.8.10.tar.gz
  3. cd a fail2ban-0.8.10 e instale el software:

    cd fail2ban-0.8.10/
    sudo python setup.py install
  4. Crea un archivo para el registro:

    sudo touch /var/log/fail2ban.log
  5. cd atrás y descarga el paquete de modificaciones:

    cd ~/Downloads/
    curl -O https://forgetcomputers.zendesk.com/hc/en-us/article_attachments/200287980/install_fail2ban_mods.tar.gz
  6. Desembale este paquete:

    tar xzf install_fail2ban_mods.tar.gz
  7. Ejecute install script desde el paquete de modificaciones:

    sudo ./fail2ban_mods/install_fail2ban_mod.sh
  8. Hazte sudo y renombra /etc/fail2ban/jail.local (el archivo jail.local es superior a jail.conf y podría romperlo todo porque el archivo instalado contiene una configuración totalmente inútil):

    sudo bash
    mv /etc/fail2ban/jail.local /etc/fail2ban/jail.local.bak
  9. Añada las dos líneas siguientes a /etc/pf.conf con nano /etc/pf.conf :

    table <fail2ban> persist  
    block drop log quick from <fail2ban> to any
  10. En /etc/fail2ban/jail.conf, modifica la sección [ssh-pf] al final con nano como sigue:

    [ssh-pf]  
    
    enabled  = true  
    filter   = sshd  
    action   = pf  
    logpath  = /var/log/system.log  
    maxretry = 3  

    Puede introducir otro recuento máximo de intentos o definir un tiempo de espera o de búsqueda individual.

  11. En /etc/fail2ban/action.d/pf.conf, asegúrese de que los siguientes valores están configurados y modifíquelos si es necesario con nano /etc/fail2ban/action.d/pf.conf :

    actionban = /sbin/pfctl -t fail2ban -T add <ip>  
    actionunban = pfctl -t fail2ban -T delete `pfctl -t fail2ban -T show 2>/dev/null | grep <ip>`  
    [Init] 
    tablename = fail2ban
    localhost = 127.0.0.1
  12. Apaga pf, dile que recargue su configuración y vuelve a iniciarlo:

    pfctl -d
    pfctl -f /etc/pf.conf
    pfctl -e
  13. Detenga el demonio fail2ban si ya se está ejecutando, e inícielo con launchctl:

    fail2ban-client stop
    launchctl load -w /Library/LaunchDaemons/org.fail2ban.init.plist 
    launchctl load -w /Library/LaunchDaemons/org.fail2ban.redo.plist 
    launchctl load -w /Library/LaunchDaemons/org.fail2ban.reset.plist

Probar el sistema

  1. Abra una ventana de terminal y observe el registro de fail2ban (live-update):

    sudo tail -f /var/log/fail2ban.log
  2. Mientras mantienes este terminal activo en el servidor, accede mediante SSH al servidor desde un cliente y observa la salida del terminal del servidor (el nombre de usuario es arbitrario, ya que estamos probando qué ocurrirá cuando se intente un inicio de sesión incorrecto; sustituye server_ip por la dirección IP o el nombre de host del servidor):

     ssh username@server_ip
  3. En la máquina cliente, escriba la contraseña incorrecta varias veces hasta que vea un mensaje en el registro de fail2ban que indique que el cliente ha sido baneado. Este mensaje será algo parecido a esto:

    2015-08-04 18:56:25,001 fail2ban.actions [216]: NOTICE [ssh-pf] Ban 192.168.8.15

    Cuando veas este mensaje, la IP de la máquina cliente ha sido baneada. En este punto, cualquier intento futuro de SSH desde esta IP (dentro del periodo de baneo de fail2ban) debería expirar y ser infructuoso.

  4. Para detener la cola basta con introducir ctrlC

Si desea instalar la última fail2ban 0.9.1

  1. Descargar manualmente fail2ban a su carpeta ~/Downloads

  2. cd a ~/Downloads y descomprima el paquete tar:

    cd ~/Downloads
    tar xzf fail2ban-0.9.1.tar.gz
  3. cd a fail2ban-0.9.1 e instale el software:

    cd fail2ban-0.9.1/
    sudo python setup.py install
  4. Crea un archivo para el registro:

    sudo touch /var/log/fail2ban.log
  5. cd atrás y descarga el paquete de modificaciones:

    cd ~/Downloads/
    curl -O https://forgetcomputers.zendesk.com/hc/en-us/article_attachments/200287980/install_fail2ban_mods.tar.gz
  6. Desembale este paquete:

    tar xzf install_fail2ban_mods.tar.gz
  7. Haga una copia de seguridad de /etc/fail2ban/filter.d/sshd.conf y copie el archivo del mod_pack al directorio fail2ban/filter.d. Puedes copiar el otro filter.conf pero mejor haz una copia de seguridad de los archivos originales. Aunque no he probado estos.

    sudo bash
    mv /etc/fail2ban/filter.d/sshd.conf /etc/fail2ban/filter.d/sshd.conf.old
    cp ~/Downloads/fail2ban_mods/filter.d/sshd.conf /etc/fail2ban/filter.d/
    cp ~/Downloads/fail2ban_mods/fail2ban_reset.sh /private/etc/fail2ban
    cp ~/Downloads/fail2ban_mods/lib-launchdaemons/org.fail2ban* /Library/LaunchDaemons
  8. Añada las dos líneas siguientes a /etc/pf.conf con nano /etc/pf.conf :

    table <fail2ban> persist  
    block drop log quick from <fail2ban> to any
  9. En /etc/fail2ban/jail.conf, modifica la sección [ssh-pf] al final con nano como sigue:

    [ssh-pf]  
    
    enabled  = true  
    filter   = sshd  
    action   = pf  
    logpath  = /var/log/system.log  
    maxretry = 3  

    Puede introducir otro recuento máximo de intentos o definir un tiempo de espera o de búsqueda individual.

  10. En /etc/fail2ban/action.d/pf.conf, asegúrese de que los siguientes valores están configurados y modifíquelos si es necesario con nano /etc/fail2ban/action.d/pf.conf :

    actionban = /sbin/pfctl -t fail2ban -T add <ip>/32
    actionunban = /sbin/pfctl -t fail2ban -T delete <ip>/32 
    [Init] 
    tablename = fail2ban
  11. Apaga pf, dile que recargue su configuración y vuelve a iniciarlo:

    pfctl -d
    pfctl -f /etc/pf.conf
    pfctl -e
  12. Detenga el demonio fail2ban si ya se está ejecutando e inícielo de nuevo:

    fail2ban-client stop
    launchctl load -w /Library/LaunchDaemons/org.fail2ban.init.plist 
    launchctl load -w /Library/LaunchDaemons/org.fail2ban.redo.plist 
    launchctl load -w /Library/LaunchDaemons/org.fail2ban.reset.plist

Ahora pruebe de nuevo su sistema como se ha descrito anteriormente.

Mejoras

Dado que la implementación de la tabla fail2ban y la regla no es estándar y fail2ban-blocking real no sobrevive a un reinicio, he reelaborado todo el pf-mecanismo, creó un ancla separada (inspirado en IceFloor ) para eliminar cualquier dependencia del archivo /etc/pf.conf de Apple y modificó la acción de prohibición.

  1. A partir de la fail2ban 0.9.1 instalar descrito anteriormente entrar:

    sudo bash
    nano /etc/fail2ban/action.d/pf.conf 

    y cambie en el archivo /etc/fail2ban/action.d/pf.conf las líneas que empiezan por

    actionban = .... 

    a

    actionban = /sbin/pfctl -a fail2ban.anchor -t fail2ban -T add <ip>/32 && /sbin/pfctl -k <ip>/32 && /sbin/pfctl -Ef /etc/fail2ban/pf/fail2ban.conf

    y

    actionunban = ....

    a

    actionunban = /sbin/pfctl -a fail2ban.anchor -t fail2ban -T delete <ip>/32
  2. Crear una carpeta pf en /etc/fail2ban/

    mkdir /etc/fail2ban/pf
  3. Cree tres archivos fail2ban, fail2ban.conf y fail2ban.sh en la carpeta creada anteriormente con el siguiente contenido; después haga fail2ban.sh ejecutable con chmod:

    fail2ban:

    table <fail2ban> persist
    block drop log quick from <fail2ban> to any

    fail2ban.conf:

    ############### LOOPBACK ###############
    #
    # skip loopback (no filtering on loopback interface)
    set skip on lo0
    
    scrub-anchor "com.apple/*"
    
    ############### INBOUND ###############
    #
    anchor "fail2ban.anchor"
    load anchor "fail2ban.anchor" from "/etc/fail2ban/pf/fail2ban"

    fail2ban.sh:

    #!/bin/sh
    
    # start
    #
    # We need to trap on TERM signals, according to Apple's launchd docs:
    #
    trap 'exit 1' 15
    
    #
    # Use the "ipconfig waitall" command to wait for all the interfaces to come up:
    #
    ipconfig waitall
    sleep 5
    #
    # System sysctl 
    #
    sysctl -w net.inet6.ip6.fw.verbose=0
    sysctl -w net.inet.ip.fw.verbose=0
    sysctl -w net.inet.ip.fw.verbose_limit=0
    
    #
    # interface forwarding enabled by default
    #
    sysctl -w net.inet.ip.forwarding=1
    
    # enable PF and load rules from default fail2ban configuration file using tokens (apple specific PF options -E and -X)
    #
    /sbin/pfctl -e
    /sbin/pfctl -Ef /etc/fail2ban/pf/fail2ban.conf
    
    # Exit with a clean status
    exit 0
    
    # this file is public domain and is available to everyone with no exceptions.
  4. Cree el archivo org.fail2ban.plist en /Library/LaunchDaemon con el siguiente contenido:

    <?xml version="1.0" encoding="UTF-8"?>
    <!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>ExitTimeOut</key>
        <integer>1</integer>
        <key>Label</key>
        <string>org.fail2ban</string>
        <key>Program</key>
        <string>/etc/fail2ban/pf/fail2ban.sh</string>
        <key>RunAtLoad</key>
        <true/>
    </dict>
    </plist>
  5. Elimine las dos líneas siguientes de /etc/pf.conf con nano /etc/pf.conf :

    table <fail2ban> persist  
    block drop log quick from <fail2ban> to any
  6. Cargue el archivo /Library/LaunchDaemons/org.fail2ban.plist con launchctl después de detener fail2ban y pf:

    fail2ban-client stop
    pfctl -d
    pfctl -f /etc/pf.conf
    launchctl load -w /Library/LaunchDaemons/org.fail2ban.plist
    fail2ban-client start

    o reinicie su Mac después de cargar org.fail2ban.plist con launchctl.

Ahora la prohibición funciona correctamente incluso después de reiniciar el sistema. Si quieres añadir una dirección IP manualmente para bloquearla, simplemente introduce:

sudo /sbin/pfctl -a fail2ban.anchor -t fail2ban -T add <ip>/32 && /sbin/pfctl -k <ip>/32 && /sbin/pfctl -Ef /etc/fail2ban/pf/fail2ban.conf

Para desbanearlo (¡no se desbaneará automáticamente tras el tiempo de baneo de fail2ban!) introduce:

sudo /sbin/pfctl -a fail2ban.anchor -t fail2ban -T delete <ip>/32

Así que para responder a su pregunta:

Si desea utilizar la tabla fail2ban para prohibir una IP manualmente después de aplicar la directiva mejoras tienes que introducir el comando anterior. La razón de las partes adicionales:

  • /sbin/pfctl -k <ip>/32 es necesario para matar todos de las entradas de estado procedentes del host especificado.
  • /sbin/pfctl -Ef /etc/fail2ban/pf/fail2ban.conf para recargar el fail2ban.conf con gracia y reflejar los cambios que hiciste en la tabla fail2ban.

Sin las mejoras anteriores puede utilizar:

sudo /sbin/pfctl -t fail2ban -T add <ip>/32 && /sbin/pfctl -k <ip>/32 && /sbin/pfctl -Ef /etc/pf.conf

Instalación de fail2ban 0.9.1 en El Capitan

Lo tengo instalado en El Capitan en modo rootless ( sudo nvram boot-args="rootless=0" y reiniciar) después de eliminar la parte doc-install a /usr/share/docs/fail2ban (= las líneas 140-143) en el setup.py de fail2ban 0.9.1.

Utilice el método mejorado de instalación y configuración de la versión 0.9.1. Si el comando pfctl -sA no revela fail2ban.anchor comprueba si las comillas dobles son correctas (¡no comillas inteligentes!) en el archivo /etc/fail2ban/pf/fail2ban.conf.

0 votos

Mientras esto fue de gran utilidad para mi panorama general, mi pregunta era específicamente sobre PF, ¿por lo tanto, no estoy segura de cuán relevante es esta respuesta?

1 votos

@forquare Existimos para respuestas increíbles. Esto seguramente ayudará - +1 en mi libro ya que es tan informativo y útil como a) una receta y b) para solucionar esto. En mi opinión, Apple realmente no hace un buen trabajo documentando / apoyando su firewall adaptativo. Este tipo de pregunta y todas las respuestas son exactamente por qué participo en Ask Different / Stack Exchange.

0 votos

@bmike Estoy de acuerdo, y mi pregunta se basó puramente en que pensé que sabía cómo funcionaba StackExchange, pero un par de cosas recientes han sacudido eso :) +1'd

2voto

Oskar Puntos 1242

Instalar Server.app tiene varios beneficios para los usuarios tradicionales de UNIX ya que OS X hace elecciones de configuración en el sistema cliente que no funcionan bien para las personas que viven en el mundo de la línea de comandos. (Máximos archivos por proceso, ajuste de VM, otros varios cambios de ajuste del kernel)

Excepto por una solución fácil, recomendaría instalar Server y luego habilitar el firewall adaptativo de OS X para asegurarse de tener los servicios de launchd adecuados habilitados.

En pocas palabras, el artículo anterior solicita:

sudo pfctl -f /etc/pf.conf
sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/serverctl enable service=com.apple.afctl
sudo /Applications/Server.app/Contents/ServerRoot/usr/libexec/afctl -c
sudo /Applications/Server.app/Contents/ServerRoot/usr/libexec/afctl -f

Seguido por el paso 2:

sudo defaults write /System/Library/LaunchDaemons/com.apple.pfctl ProgramArguments '(pfctl, -f, /etc/pf.conf, -e)'
sudo chmod 644 /System/Library/LaunchDaemons/com.apple.pfctl.plist
sudo plutil -convert xml1 /System/Library/LaunchDaemons/com.apple.pfctl.plist

A partir de ahí, puedes utilizar el marco pfctl / afctl para bloquear hosts y puertos según sea necesario. Puedes probar cosas intentando ataques de fuerza bruta de ssh y viendo si el firewall está funcionando (o no) antes de intentar personalizar aún más el firewall.

1voto

forquare Puntos 841

Me faltaba una pieza del rompecabezas que amablemente llenó klanomath al enlazar a este post " Configuración de Fail2ban en Mac OS X 10.7+ " , y Buscar웃 reforzó con este post " Integrar PF con Fail2ban 0.9 ".

Mientras PF añadía la dirección IP a la tabla fail2ban, no sabía qué hacer con ella. Hay un par de formas de lograr esto:

El primer post enlazado arriba sugiere modificar /etc/pf.conf y añadir lo siguiente:

table  persist
block drop log quick from  to any

El segundo post sugiere un camino más correcto, creando un nuevo archivo de "anclaje" /etc/fail2ban/pf-anchor.conf e insertando lo siguiente:

table  counters
block drop log quick from  to any

Luego hace referencia a este anclaje en /etc/pf.conf insertando:

anchor fail2ban

No he verificado el segundo método, pero mis pruebas iniciales con el primer método han resuelto mi problema con PF. Gracias a klanomoath y Buscar웃 por publicar enlaces a guías relevantes, o mis consultas de búsqueda estaban muy lejos o es la primera vez que DuckDuckGo me ha decepcionado.

0 votos

¡Excelente trabajo! ¿Obtuviste fail2ban de homebrew o de otro lugar? Me tentaría enviar un PR para solucionar esto si estás usando la versión proporcionada por brew de la herramienta...

0 votos

Hice la instalación usando Homebrew. Todo esto es un poco irregular ya que principalmente estoy experimentando en 10.11 mientras investigo en mi equipo Mavericks para confirmar comportamientos. Ahora estoy intentando volver atrás y rehacer todo en Mavericks para obtener un procedimiento documentado completo. Investigaré cómo enviar una solicitud de extracción una vez que haya completado esto.

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