Doorgaan naar hoofdinhoud

fail2ban

Onofficiële Beta-vertaling

Deze pagina is vertaald door PageTurner AI (beta). Niet officieel goedgekeurd door het project. Een fout gevonden? Probleem melden →

Fail2ban is een softwareframework voor inbraakpreventie dat servers beschermt tegen brute-force-aanvallen. Het werkt door logbestanden (bijv. /var/log/auth.log, /var/log/apache/access.log, etc.) te monitoren op specifieke vermeldingen en op basis daarvan scripts uit te voeren.

Jellyfin genereert logbestanden die door Fail2ban kunnen worden gemonitord om brute-force-aanvallen op je systeem te voorkomen.

Vereisten

  • Jellyfin toegankelijk via extern netwerk

  • Fail2ban geïnstalleerd en actief

  • Weten waar de Jellyfin-logbestanden zijn opgeslagen: standaard /var/log/jellyfin/ voor desktop en /config/log/ voor dockercontainers.

  • Logniveau van Jellyfin ingesteld op Info (mislukte authenticatiepogingen worden niet gelogd bij Error). Deze instelling vind je in logging.json

Stap één: de jail aanmaken

Je moet een jail voor Fail2ban aanmaken. Als je Ubuntu gebruikt en nano als editor, voer dan uit:

sudoedit /etc/fail2ban/jail.d/jellyfin.local

Voeg dit toe aan het nieuwe bestand, waarbij je /path_to_logs vervangt door het pad naar bovenstaande logbestanden, bijv. /var/log/jellyfin/:

[jellyfin]

backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = jellyfin
maxretry = 3
bantime = 86400
findtime = 43200
logpath = /path_to_logs/log_*.log

Sla op en verlaat nano.

Let op:

  1. Als Jellyfin in een dockercontainer draait, voeg dan het volgende toe aan het jellyfin.local-bestand:

    action = iptables-allports[name=jellyfin, chain=DOCKER-USER]
  2. Als je Jellyfin op een niet-standaardpoort draait, verander dan de poort van 80,443 naar de relevante poort, bijvoorbeeld 8096,8920

Stap twee: het filter aanmaken

Het filter bevat regels die Fail2ban gebruikt om mislukte authenticatiepogingen te identificeren. Maak het filter aan door uit te voeren:

sudoedit /etc/fail2ban/filter.d/jellyfin.conf

Plak:

[Definition]
failregex = ^.*Authentication request for .* has been denied \(IP: "<ADDR>"\)\.

Sla op en sluit af, laad vervolgens Fail2ban opnieuw:

sudo systemctl restart fail2ban

Controleer of fail2ban actief is:

sudo systemctl status fail2ban

Stap drie: testen

Als je minstens één mislukte authenticatiepoging hebt, kun je deze nieuwe jail testen met fail2ban-regex:

sudo fail2ban-regex /path_to_logs/log_*.log /etc/fail2ban/filter.d/jellyfin.conf --print-all-matched

Geavanceerde Fail2Ban-installatie: Doorsturen en beheren van bans op een upstream proxyserver

Voor verbeterde beveiliging kan Fail2Ban IP-bans op een upstream reverse proxyserver beheren in plaats van rechtstreeks op de Jellyfin-server. Deze opstelling blokkeert kwaadwillende IP's dichter bij het netwerkingangspunt, wat ook andere services via dezelfde proxy ten goede kan komen.

Deze handleiding biedt een configuratie om Fail2Ban in te stellen voor het beheren van IP-bans op een upstream reverse proxyserver via Dynamic Chains, waarbij elke Fail2Ban-jail zijn eigen iptables-keten op de upstream-server aanmaakt en beheert.

Veronderstellingen

  • Fail2Ban is geïnstalleerd op je lokale server (waar Jellyfin draait).

  • iptables is geconfigureerd op de upstream-server.

Stap één: SSH-sleutelauthenticatie instellen

Zorg dat de Fail2Ban-server via SSH kan inloggen op de upstream-server zonder wachtwoord. Dit is essentieel voor het automatiseren van het IP-ban- en unban-proces.

Vervang <upstream-server-ip> door het daadwerkelijke IP-adres van je upstream-server.

  1. Genereer SSH-sleutel (indien nog niet gebeurd):

    ssh-keygen -t rsa -b 4096 -f /root/.ssh/id_rsa
  2. Kopieer de SSH-sleutel naar de upstream-server:

    ssh-copy-id -i /root/.ssh/id_rsa.pub root@<upstream-server-ip>
  3. SSH-toegang testen:

    Controleer of de SSH-verbinding werkt zonder wachtwoordinvoer:

    ssh -i /root/.ssh/id_rsa root@<upstream-server-ip>

Stap twee: Fail2Ban configureren voor dynamische ketens

  1. Het Fail2Ban-actiebestand aanmaken:

    Maak op de Fail2Ban-server een nieuw actiebestand aan:

    sudo nano /etc/fail2ban/action.d/proxy-iptables-dynamic.conf

    Plak de volgende configuratie, die dynamisch iptables-ketens op de upstream-server per jail aanmaakt, beheert en verwijdert:

    Vergeet niet <upstream-server-ip> te vervangen door het daadwerkelijke IP-adres van je upstream-server.

    [Definition]

    # Option: actionban
    # 1. Create the chain if it doesn't exist
    # 2. Add the banned IP to the dynamic chain based on the jail name
    # 3. Log the event
    actionban = ssh -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@<upstream-server-ip> \
    'iptables -N f2b-<name> 2>/dev/null || true; \
    iptables -C INPUT -j f2b-<name> 2>/dev/null || iptables -I INPUT -j f2b-<name>; \
    iptables -I f2b-<name> 1 -s <ip> -j DROP' && \
    echo "Banned <ip> from jail <name> via upstream proxy" >> /var/log/fail2ban.log

    # Option: actionunban
    # 1. Remove the banned IP from the dynamic chain
    # 2. Remove the chain if it becomes empty (cleanup)
    # 3. Log the event
    actionunban = ssh -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@<upstream-server-ip> \
    'iptables -D f2b-<name> -s <ip> -j DROP; \
    if ! iptables -L f2b-<name> | grep -q "DROP"; then \
    iptables -D INPUT -j f2b-<name>; \
    iptables -F f2b-<name>; \
    iptables -X f2b-<name>; \
    fi' && \
    echo "Unbanned <ip> from jail <name> via upstream proxy and cleaned up chain if empty" >> /var/log/fail2ban.log

    Sla na wijzigingen het bestand op en sluit het.

  2. Fail2Ban-jails updaten voor dynamische ketenactie:

    Open je jail-configuratiebestand (doorgaans /etc/fail2ban/jail.local):

    sudo nano /etc/fail2ban/jail.local

    Voeg voor elke jail die je via de upstream-proxy wilt beheren de actieregel toe of wijzig deze naar proxy-iptables-dynamic. Voorbeeldconfiguratie voor twee jails:

    [jellyfin]
    enabled = true
    filter = jellyfin
    logpath = /path/to/jellyfin/log
    maxretry = 3
    bantime = 3600
    action = proxy-iptables-dynamic

    [nginx-http-auth]
    enabled = true
    filter = nginx-http-auth
    logpath = /var/log/nginx/error.log
    maxretry = 5
    bantime = 3600
    action = proxy-iptables-dynamic

    Sla na wijzigingen het bestand op en sluit het.

Stap drie: Proxy-IP's toevoegen aan Jellyfin

  1. Proxy-IP's verzamelen

    Omdat je een proxyserver gebruikt, moet Jellyfin de juiste IP-adressen in logs registreren voor fail2ban.

    Afhankelijk van je hostingopstelling kunnen deze IP-reeksen komen van interne Docker-IP's, HAProxy of andere services.

    Jellyfin accepteert IP's met subnetmaskers zoals 172.18.0.1/24. Je hebt een komma-gescheiden lijst hiervan nodig.

  2. Proxies toevoegen aan Jellyfin

    Open je Jellyfin-dashboard, ga naar Advanced -> Networking en scroll naar Known proxies.

    Voer je komma-gescheiden lijst met proxy-IP-reeksen in. Herstart de Jellyfin-server zoals aangegeven.

Stap vier: Fail2Ban opnieuw opstarten en de configuratie testen

  1. Fail2Ban opnieuw opstarten:

    Na het aanbrengen van de configuratiewijzigingen start je Fail2Ban opnieuw op om de nieuwe instellingen toe te passen:

    sudo systemctl restart fail2ban
  2. Controleer de status van de jail:

    Verifieer de status van je jails om zeker te weten dat ze correct werken:

    sudo fail2ban-client status jellyfin
  3. Test een ban:

    Activeer een ban door ongeldige inlogpogingen uit te voeren of door handmatig een IP te verbannen. Bijvoorbeeld:

    sudo fail2ban-client set jellyfin banip 192.168.1.100
  4. Controleer op de upstream-server:

    Controleer of het IP verbannen is in de bijbehorende jail-keten ('f2b-jail-name') op de upstream-server:

    ssh root@<upstream-server-ip> "iptables -L f2b-jellyfin"
  5. Test het opheffen van de ban:

    Om het opheffen van de ban te testen, hef je handmatig het IP-verbod op:

    sudo fail2ban-client set jellyfin unbanip 192.168.1.100
  6. Deblokkering verifiëren:

    Controleer of het IP verwijderd is uit de bijbehorende jail-keten ('f2b-jail-name'):

    ssh root@<upstream-server-ip> "iptables -L f2b-jellyfin"

Stap vijf: Logs monitoren

Houd het Fail2Ban-logboek in de gaten om er zeker van te zijn dat acties correct worden uitgevoerd:

tail -f /var/log/fail2ban.log

Dit logboek toont berichten wanneer een IP wordt verbannen of vrijgegeven, zodat je kunt bevestigen dat de configuratie werkt zoals verwacht.