Blocco dinamico del traffico ostile in entrata con PF e fail2ban su OS X


7

L'immagine più grande è che sto provando a bloccare / sbloccare dinamicamente gli IP usando fail2ban 0.8.14. Ho seguito un vecchia guida per OS 10.5 con non include PF.

Penso di aver configurato tutto correttamente, ma il PF di OS X mi sta causando alcuni problemi.

Talaninc ha l'IP 192.168.1.68 ed è il "locale"

Celebgul ha l'IP 192.168.1.50 ed è il "telecomando"


Da quello che io capire , Dovrei essere in grado di emettere il seguente comando:

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

Questo aggiungerà l'indirizzo IP 192.168.1.68 al tavolo fail2bane bloccherà il traffico in entrata da Talantinc , quindi il seguente dovrebbe fallire:

forquare@talantinc:~$ ssh user@192.168.1.50
Password:
Last login: Mon Aug  3 12:09:05 2015 from talantinc.local
user@celebgul:~$ 

Ma come puoi vedere, ci riesce.


Da quello che posso vedere , la mia comprensione è sbagliata. Ho aggiunto 192.168.1.68e tuttavia può ancora utilizzare SSH Celebgul .

Posso interrogare il tavolo e vedere 192.168.1.68 dentro:

user@celebgul:~$ sudo pfctl -t fail2ban -T show
No ALTQ support in kernel
ALTQ related functions disabled
   192.168.1.68

Non ho modificato nessuno dei file di configurazione di default di Apple per PF, la mia comprensione era che avrei solo bisogno di modificare / creare il mio se volevo regole da lungo tempo / persistenti attraverso i riavvii.

Come posso utilizzare PF per bloccare le connessioni in entrata sul client OS X (non sul server)?

Sto specificatamente guardando El Capitan, però Nemmeno io riesco a farlo funzionare su Mavericks.


1
BTW pf è già accompagnato da un firewall adattativo: check afctl / Emond . Tuttavia non funziona molto affidabile.
klanomath


1
Hai corso tcpdump o ispezionato i log ssh per accertarti di essere effettivamente in arrivo sull'indirizzo IPv4 e non su IPv6?
bmike

1
@ Gilles Vediamo quale ottiene la migliore risposta in una settimana. Sono d'accordo sul fatto che il cross posting sia in generale cattivo, ma OS X è abbastanza diverso da BSD che non sono d'accordo. U & amp; L è il posto migliore per questo. C'è molta esperienza di lancio / bonjour lì? Chattiamo o Chiedi a Different Meta se necessario per risolvere il punto migliore per ottenere una risposta all'OP. Inoltre, questa è una grande domanda IMO.
bmike

1
@Gilles scusate, non sapevo che fosse una cattiva forma per fare un cross-post e renderlo ovvio, avendo fatto una discreta quantità di ricerche durante la scorsa settimana mi sono imbattuto in una serie di domande che sono state incrociate (l'OP non aveva lo ha reso evidente). Ho eliminato la domanda di U & amp; L in modo contrario alla tua affermazione, ho ricevuto informazioni più utili su Ask Different.
forquare

Risposte:


9

Ecco una procedura dettagliata per installare fail2ban su OS X 10.10 (probabilmente funziona anche su 10.9) basato sul (in qualche modo difettoso) guida a forgetcomputers.zendisk.com.

L'installatore automatico non ha funzionato per me quindi l'ho fatto manualmente.

  1. cd per ~ / Download e download 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. Disimballare il pacchetto tar:

    tar xzf fail2ban-0.8.10.tar.gz
    
  3. cd su fail2ban-0.8.10 e installare il software:

    cd fail2ban-0.8.10/
    sudo python setup.py install
    
  4. Crea un file per il registro:

    sudo touch /var/log/fail2ban.log
    
  5. torna indietro e scarica il pacchetto di modifiche:

    cd ~/Downloads/
    curl -O https://forgetcomputers.zendesk.com/hc/en-us/article_attachments/200287980/install_fail2ban_mods.tar.gz
    
  6. Disimballare questo pacchetto:

    tar xzf install_fail2ban_mods.tar.gz
    
  7. Esegui lo script di installazione dal pacchetto di modifiche:

    sudo ./fail2ban_mods/install_fail2ban_mod.sh
    
  8. Crea te stesso sudo e rinomina /etc/fail2ban/jail.local (il file jail.local è superiore a jail.conf e potrebbe rompere tutto perché il file installato contiene una configurazione totalmente inutile):

    sudo bash
    mv /etc/fail2ban/jail.local /etc/fail2ban/jail.local.bak
    
  9. Aggiungi le seguenti due linee a /etc/pf.conf con nano /etc/pf.conf:

    table <fail2ban> persist  
    block drop log quick from <fail2ban> to any
    
  10. In /etc/fail2ban/jail.conf, modificare la sezione [ssh-pf] alla fine con nano come segue:

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

    Puoi inserire un altro conteggio dei maxretry o definire un singolo bantime o un orario di ricerca.

  11. In /etc/fail2ban/action.d/pf.conf, assicurarsi che i seguenti valori siano impostati e modificarli se necessario 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. Spegni pf, digli di ricaricare la sua configurazione e riavvialo di nuovo:

    pfctl -d
    pfctl -f /etc/pf.conf
    pfctl -e
    
  13. Arrestare il daemon fail2ban se è già in esecuzione e avviarlo 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
    

Test del sistema

  1. Apri una finestra di terminale e guarda il log di fail2ban (live-update):

    sudo tail -f /var/log/fail2ban.log
    
  2. Mantenendo questo terminale attivo sul server, SSH nel server da un client e guardando l'output del terminale del server (il nome utente è arbitrario, dal momento che stiamo testando cosa accadrà quando viene tentato un login errato, sostituire server_ip con l'indirizzo IP o il nome host di il server):

     ssh username@server_ip
    
  3. Sul computer client, digitare la password errata più volte finché non viene visualizzato un messaggio nel log di fail2ban che indica che il client è stato bannato. Questo messaggio sarà simile a questo:

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

    Quando vedi questo messaggio, l'IP della macchina client è stato bannato. A questo punto, eventuali futuri tentativi SSH da questo IP (all'interno del periodo bentime di fail2ban) dovrebbero scadere e non avere esito positivo.

  4. Per fermare la coda basta inserire ctrl C

Se si desidera installare l'ultimo fail2ban 0.9.1

  1. Scarica manualmente fail2ban nella tua cartella ~ / Downloads

  2. cd per ~ / scarica e decomprimi il pacchetto tar:

    cd ~/Downloads
    tar xzf fail2ban-0.9.1.tar.gz
    
  3. cd su fail2ban-0.9.1 e installare il software:

    cd fail2ban-0.9.1/
    sudo python setup.py install
    
  4. Crea un file per il registro:

    sudo touch /var/log/fail2ban.log
    
  5. torna indietro e scarica il pacchetto di modifiche:

    cd ~/Downloads/
    curl -O https://forgetcomputers.zendesk.com/hc/en-us/article_attachments/200287980/install_fail2ban_mods.tar.gz
    
  6. Disimballare questo pacchetto:

    tar xzf install_fail2ban_mods.tar.gz
    
  7. Effettua un backup di /etc/fail2ban/filter.d/sshd.conf e copia il file dal mod_pack alla directory fail2ban / filter.d. Puoi copiare l'altro filter.conf ma è meglio fare un backup dei file originali. Non ho provato questi però.

    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. Aggiungi le seguenti due linee a /etc/pf.conf con nano /etc/pf.conf:

    table <fail2ban> persist  
    block drop log quick from <fail2ban> to any
    
  9. In /etc/fail2ban/jail.conf, modificare la sezione [ssh-pf] alla fine con nano come segue:

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

    Puoi inserire un altro conteggio dei maxretry o definire un singolo bantime o un orario di ricerca.

  10. In /etc/fail2ban/action.d/pf.conf, assicurarsi che i seguenti valori siano impostati e modificarli se necessario 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. Spegni pf, digli di ricaricare la sua configurazione e riavvialo di nuovo:

    pfctl -d
    pfctl -f /etc/pf.conf
    pfctl -e
    
  12. Arrestare il daemon fail2ban se è già in esecuzione e riavviarlo:

    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
    

Ora prova nuovamente il tuo sistema come descritto sopra.

miglioramenti

Poiché l'implementazione della tabella e della regola fail2ban non è standard e il blocco fail2ban reale non sopravvive a un riavvio, ho rielaborato l'intero meccanismo pf, creato un'ancora separata (ispirata da IceFloor ) per rimuovere qualsiasi dipendenza dal file /etc/pf.conf di Apple e modificato l'azione di divieto.

  1. A partire dall'installazione di fail2ban 0.9.1 descritta sopra, immettere:

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

    e cambia nel file /etc/fail2ban/action.d/pf.conf le linee che iniziano con

    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
    

    e

    actionunban = ....
    

    a

    actionunban = /sbin/pfctl -a fail2ban.anchor -t fail2ban -T delete <ip>/32
    
  2. Crea una cartella pf in / etc / fail2ban /

    mkdir /etc/fail2ban/pf
    
  3. Creare tre file fail2ban, fail2ban.conf e fail2ban.sh nella cartella precedentemente creata con il seguente contenuto; successivamente eseguire eseguibile fail2ban.sh 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. Creare il file org.fail2ban.plist in / Library / LaunchDaemon con il seguente contenuto:

    <?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. Rimuovere le seguenti due righe da /etc/pf.conf con nano /etc/pf.conf:

    table <fail2ban> persist  
    block drop log quick from <fail2ban> to any
    
  6. Carica il file /Library/LaunchDaemons/org.fail2ban.plist con launchctl dopo l'interruzione di fail2ban e pf:

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

    o riavviare il Mac dopo aver caricato org.fail2ban.plist con launchctl.

Ora il bando funziona correttamente anche dopo aver riavviato il sistema. Se si desidera aggiungere manualmente un indirizzo IP per bloccarlo, è sufficiente inserire:

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

Per sbloccarlo (non sarà automaticamente non-bannato dopo il fail2ban bantime!) Inserisci:

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

Quindi, per rispondere alla tua domanda:

Se si desidera utilizzare la tabella fail2ban per vietare manualmente un IP dopo aver applicato il miglioramenti , devi inserire il comando sopra. Il motivo per le parti aggiuntive:

  • /sbin/pfctl -k <ip>/32 è necessario per uccidere tutti delle voci di stato originate dall'host specificato.
  • /sbin/pfctl -Ef /etc/fail2ban/pf/fail2ban.conf per ricaricare grace2ban.conf con garbo e riflettere le modifiche apportate nella tabella fail2ban.

Senza i suddetti miglioramenti puoi usare:

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

Installazione di fail2ban 0.9.1 su El Capitan

L'ho installato su El Capitan in modalità senza radici ( sudo nvram boot-args="rootless=0" e riavviare) dopo aver rimosso la parte di installazione di documenti in / usr / share / docs / fail2ban (= le righe 140-143) nel setup.py di fail2ban 0.9.1.

Utilizzare il miglior metodo di installazione e configurazione 0.9.1. Se il comando pfctl -sA non rivela fail2ban.anchor controlla le virgolette corrette (senza virgolette!) nel file /etc/fail2ban/pf/fail2ban.conf.


Mentre questo è stato enormemente utile per la mia immagine più grande, la mia domanda riguardava specificamente la PF, quindi non sono sicuro di quale argomento sia questa risposta?
forquare

1
@forquare Esistiamo per risposte fantastiche. Questo sicuramente aiuterà - +1 nel mio libro dal momento che è così informativo e utile come a) una ricetta eb) per risolvere questo problema. Apple davvero non fa un buon lavoro documentando / supportando il loro firewall IMO adattativo. Questo tipo di domande e tutte le risposte sono esattamente le ragioni per cui partecipa a Ask Different / Stack Exchange.
bmike

@ bmike Sono d'accordo, e la mia domanda era puramente basata su Ho pensato di sapere come ha funzionato StackExchange, ma un paio di cose recentemente l'hanno scosso :) + 1'd
forquare

Miglior post su pf e fail2ban che abbia mai visto! pollice su
Garex

@klanomath: enorme!
daniel Azuelos

1

Mi mancava un pezzo del puzzle che klanomath ha gentilmente riempito collegando a questo " Configurazione di Fail2ban su Mac OS X 10.7+ "Post, e Buscar 웃 rinforzato con questo" Integrazione di PF con Fail2ban 0.9 "Post.

Mentre PF stava aggiungendo l'indirizzo IP al fail2ban tavolo, non sapeva cosa fare con esso. Ci sono un paio di modi per ottenere questo:

Il primo post collegato sopra suggerisce di modificare /etc/pf.conf e aggiungendo quanto segue:

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

Il secondo post suggerisce un percorso più corretto, creando un nuovo file "anchor" /etc/fail2ban/pf-anchor.conf e inserendo quanto segue:

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

Quindi fa riferimento a questo ancoraggio in /etc/pf.conf inserendo:

anchor fail2ban

Non ho verificato il secondo metodo, ma il mio test iniziale con il primo metodo ha risolto il mio problema con PF. Grazie a klanomoath e Buscar 웃 per aver postato collegamenti a guide pertinenti, o le mie query di ricerca erano lontane o è la prima volta che DuckDuckGo mi ha deluso.


Lavoro eccellente! Hai ricevuto fail2ban da homebrew o altrove? Sarei tentato di inviare un PR per risolvere questo problema se sei nella versione fornita dallo strumento ...
bmike

Ho installato utilizzando homebrew. Tutto questo è un po 'frammentario, visto che proverò principalmente su 10.11 mentre spingo la mia scatola Mavericks per bit qua e là per confermare i comportamenti. Sto cercando di tornare indietro adesso e rifare tutto su Mavericks per ottenere una procedura completa e documentata. Cercherò di mandare un PR una volta che l'avrò fatto.
forquare

1

Installare Server.app ha diversi vantaggi per le mani UNIX tradizionali poiché OS X fa scelte di configurazione sul sistema operativo del client che non funzionano bene per le persone che vivono nel mondo della riga di comando. (Max file per processo, ottimizzazione VM, altre varie modifiche di ottimizzazione del kernel)

Escludendo una soluzione semplice, suggerirei di installare Server e abilitare il firewall adattativo OS X per assicurarti di avere i servizi launchd corretti abilitati.

In poche parole, l'articolo sopra chiede:

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

Seguito dal passaggio 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

Da lì, è quindi possibile utilizzare il framework pfctl / afctl per bloccare host e porte in base alle esigenze. Puoi testare le cose provando gli attacchi ssh brute force e vedendo che il firewall sta funzionando (o non lo è) prima di provare a personalizzare ulteriormente il firewall.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.