Hoe SSH te beschermen met Fail2Ban op Ubuntu 22.04

Introductie

SSH is de facto de methode om verbinding te maken met een cloudserver. Het is duurzaam en het is uitbreidbaar – naarmate nieuwe versleutelingsstandaarden worden ontwikkeld, kunnen ze worden gebruikt om nieuwe SSH-sleutels te genereren, waardoor het kernprotocol veilig blijft. Echter, geen enkel protocol of softwarestack is volledig waterdicht, en omdat SSH zo wijdverspreid is over het internet, betekent dit dat het een zeer voorspelbaar aanvalsoppervlak of aanvalsvector vertegenwoordigt waardoor mensen proberen toegang te krijgen.

Elke service die aan het netwerk wordt blootgesteld, is op deze manier een potentieel doelwit. Als u de logs bekijkt voor uw SSH-service die draait op een veelgebruikte server, zult u vaak herhaalde, systematische pogingen tot aanmelding zien die brute force-aanvallen door gebruikers en bots vertegenwoordigen. Hoewel u enkele optimalisaties kunt maken voor uw SSH-service om de kans op het slagen van deze aanvallen tot bijna nul te verkleinen, zoals het uitschakelen van wachtwoordauthenticatie ten gunste van SSH-sleutels, kunnen ze nog steeds een kleine, voortdurende aansprakelijkheid vormen.

Grote productie-implementaties waarvoor deze aansprakelijkheid volledig onaanvaardbaar is, zullen meestal een VPN implementeren zoals WireGuard voor hun SSH-service, zodat het onmogelijk is om rechtstreeks verbinding te maken met de standaard SSH-poort 22 vanaf het externe internet zonder extra software abstractie of gateways. Deze VPN-oplossingen worden algemeen vertrouwd, maar voegen complexiteit toe en kunnen sommige automatiseringen of andere kleine softwarehooks verbreken.

Voorafgaand aan of in aanvulling op het zich committeren aan een volledige VPN-opstelling, kunt u een tool implementeren genaamd Fail2ban. Fail2ban kan brute force-aanvallen aanzienlijk verminderen door regels te creëren die automatisch uw firewallconfiguratie wijzigen om specifieke IP-adressen te verbannen na een bepaald aantal mislukte aanmeldpogingen. Hierdoor kan uw server zichzelf versterken tegen deze toegangspogingen zonder tussenkomst van u.

In deze handleiding ziet u hoe u Fail2ban installeert en gebruikt op een Ubuntu 22.04-server.

Vereisten

Om deze handleiding te voltooien, heeft u nodig:

  • Een Ubuntu 22.04-server en een niet-rootgebruiker met sudo-rechten. U kunt meeren over hoe u een gebruiker met deze rechten instelt in onze Initiële serverconfiguratie met Ubuntu 22.04 handleiding.

  • Optioneel, een tweede server waarvan u verbinding kunt maken met uw eerste server, die u zult gebruiken om opzettelijk verbannen te worden.

Stap 1 — Fail2ban installeren

Fail2ban is beschikbaar in de softwarebronnen van Ubuntu. Begin met het uitvoeren van de volgende opdrachten als een niet-rootgebruiker om uw pakketlijsten bij te werken en Fail2ban te installeren:

  1. sudo apt update
  2. sudo apt install fail2ban

Fail2ban zal automatisch een achtergronddienst instellen na installatie. Het is echter standaard uitgeschakeld, omdat sommige van de standaardinstellingen ongewenste effecten kunnen hebben. U kunt dit verifiëren door de systemctl-opdracht te gebruiken:

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled Active: inactive (dead) Docs: man:fail2ban(1)

U kunt Fail2ban meteen inschakelen, maar eerst zult u enkele van de functies bekijken.

Stap 2 – Fail2ban configureren

De fail2ban-service bewaart zijn configuratiebestanden in de map /etc/fail2ban. Er is een bestand met standaardinstellingen genaamd jail.conf. Ga naar die map en print de eerste 20 regels van dat bestand met behulp van head -20:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
Output
# # WAARSCHUWING: zwaar hervormd in versie 0.9.0. Review alstublieft en # pas de instellingen aan voor uw configuratie. # # Wijzigingen: in de meeste gevallen moet u dit bestand niet wijzigen, # maar aanpassingen doen in het jail.local-bestand, # of aparte .conf-bestanden onder de jail.d/-map, bijv.: # # HOE JAILS TE ACTIVEREN: # # U MAG DIT BESTAND NIET WIJZIGEN. # # Het zal waarschijnlijk worden overschreven of verbeterd bij een distributie-update. # # Voor aanpassingen gebruikt u een jail.local-bestand of een jail.d/customisation.local. # Bijvoorbeeld om de standaard-bantijd voor alle jails te wijzigen en de # ssh-iptables jail in te schakelen, zou het volgende (uitgecommentarieerd) in het .local-bestand verschijnen. # Zie man 5 jail.conf voor details. # # [DEFAULT]

Zoals je zult zien, zijn de eerste paar regels van dit bestand uitgecommentarieerd – ze beginnen met #-tekens die aangeven dat ze moeten worden gelezen als documentatie in plaats van als instellingen. Zoals je ook zult zien, wijzen deze opmerkingen erop dat je dit bestand niet direct moet wijzigen. In plaats daarvan heb je twee opties: ofwel individuele profielen maken voor Fail2ban in meerdere bestanden binnen de jail.d/-directory, of alle lokale instellingen maken en verzamelen in een jail.local-bestand. Het jail.conf-bestand wordt periodiek bijgewerkt wanneer Fail2ban zelf wordt bijgewerkt, en zal worden gebruikt als bron van standaardinstellingen waarvoor je geen overrides hebt gemaakt.

In deze tutorial maak je jail.local aan. Dat kun je doen door jail.conf te kopiëren:

  1. sudo cp jail.conf jail.local

Nu kun je beginnen met het maken van configuratiewijzigingen. Open het bestand in nano of je favoriete teksteditor:

  1. sudo nano jail.local

Terwijl je door het bestand bladert, zal deze tutorial enkele opties bespreken die je mogelijk wilt bijwerken. De instellingen onder de [DEFAULT]-sectie bijna bovenaan het bestand zullen worden toegepast op alle services die worden ondersteund door Fail2ban. Elders in het bestand zijn er koppen voor [sshd] en voor andere services, die service-specifieke instellingen bevatten die bovenop de standaarden worden toegepast.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 10m
. . .

De bantime-parameter stelt de lengte van de tijd in dat een client wordt verbannen wanneer ze er niet in slagen om correct te authenticeren. Dit wordt gemeten in seconden. Standaard is dit ingesteld op 10 minuten.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

De volgende twee parameters zijn findtime en maxretry. Deze werken samen om de voorwaarden vast te stellen waaronder een client wordt beschouwd als een illegitieme gebruiker die verbannen moet worden.

De variabele maxretry stelt het aantal pogingen in dat een client heeft om zich binnen een tijdsbestek gedefinieerd door findtime te authenticeren, voordat deze wordt verbannen. Met de standaardinstellingen zal de fail2ban-service een client verbannen die 5 keer tevergeefs probeert in te loggen binnen een tijdsbestek van 10 minuten.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

Als u e-mailmeldingen wilt ontvangen wanneer Fail2ban actie onderneemt, moet u de instellingen destemail, sendername en mta evalueren. De parameter destemail stelt het e-mailadres in dat banberichten moet ontvangen. De sendername stelt de waarde in van het “Van” veld in de e-mail. De mta parameter configureert welke mailservice zal worden gebruikt om mail te verzenden. Standaard is dit sendmail, maar u kunt bijvoorbeeld Postfix of een andere mailsoplossing gebruiken.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = $(action_)s
. . .

Deze parameter configureert de actie die Fail2ban onderneemt wanneer het een ban wil instellen. De waarde action_ is gedefinieerd in het bestand kort voor deze parameter. De standaardactie is om uw firewallconfiguratie bij te werken om verkeer van de overtredende host af te wijzen totdat de banperiode verstrijkt.

Er zijn andere action_ scripts standaard meegeleverd die u kunt vervangen $(action_) mee hierboven:

/etc/fail2ban/jail.local
…
# verbied & stuur een e-mail met whois-rapport naar het bestemmings-e-mailadres.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# verbied & stuur een e-mail met whois-rapport en relevante logregels
# naar het bestemmings-e-mailadres.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

# Zie de BELANGRIJKE opmerking in actie.d/xarf-login-aanval voor wanneer deze actie moet worden gebruikt
#
# verbied & stuur een xarf-e-mail naar abuse-contact van het IP-adres en voeg relevante logregels toe
# naar het bestemmings-e-mailadres.
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# verbied IP op CloudFlare & stuur een e-mail met whois-rapport en relevante logregels
# naar het bestemmings-e-mailadres.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

Bijvoorbeeld, action_mw voert actie uit en stuurt een e-mail, action_mwl voert actie uit, stuurt een e-mail en neemt logboekregistratie op, en action_cf_mwl doet dit alles naast het verzenden van een update naar de Cloudflare API die is gekoppeld aan uw account om de overtreder daar ook te verbieden.

Individuele Jail-instellingen

Hier volgt het deel van het configuratiebestand dat zich bezighoudt met individuele services. Deze worden gespecificeerd door sectiekoppen, zoals [sshd].

Elk van deze secties moet afzonderlijk worden ingeschakeld door een enabled = true-regel toe te voegen onder de kop, met hun andere instellingen.

/etc/fail2ban/jail.local
[jail_to_enable]
. . .
enabled = true
. . .

Standaard is de SSH-service ingeschakeld en zijn alle andere services uitgeschakeld.
.
Enkele andere instellingen die hier zijn ingesteld, zijn de filter die zal worden gebruikt om te beslissen of een regel in een logbestand aangeeft dat een authenticatie is mislukt en de logpath die fail2ban vertelt waar de logs voor die specifieke service zich bevinden.

De waarde van filter is eigenlijk een verwijzing naar een bestand dat zich bevindt in de map /etc/fail2ban/filter.d, waarbij de extensie .conf is verwijderd. Deze bestanden bevatten reguliere expressies (een veelvoorkomende verkorting voor tekstanalyse) die bepalen of een regel in het logbestand een mislukte authenticatiepoging is. We zullen deze bestanden niet diepgaand behandelen in deze handleiding, omdat ze vrij complex zijn en de vooraf gedefinieerde instellingen goed overeenkomen met geschikte regels.

U kunt echter zien welke soorten filters beschikbaar zijn door naar die map te kijken:

  1. ls /etc/fail2ban/filter.d

Als u een bestand ziet dat gerelateerd lijkt aan een service die u gebruikt, moet u het openen met een teksteditor. De meeste bestanden zijn redelijk goed toegelicht en u moet op zijn minst kunnen achterhalen welk type voorwaarde het script is ontworpen om tegen te beschermen. De meeste van deze filters hebben passende (uitgeschakelde) secties in het bestand jail.conf die we indien gewenst kunnen inschakelen in het bestand jail.local.

Bijvoorbeeld, stel je voor dat je een website bedient met behulp van Nginx en je beseft dat een met een wachtwoord beveiligd gedeelte van je site wordt overspoeld met inlogpogingen. Je kunt fail2ban vertellen om het bestand nginx-http-auth.conf te gebruiken om deze situatie te controleren binnen het bestand /var/log/nginx/error.log.

Dit is eigenlijk al ingesteld in een sectie genaamd [nginx-http-auth] in je bestand /etc/fail2ban/jail.conf. Je hoeft alleen de parameter enabled toe te voegen:

/etc/fail2ban/jail.local
. . .
[nginx-http-auth]

enabled = true
. . .

Als je klaar bent met bewerken, sla het bestand dan op en sluit het af. Op dit punt kun je je Fail2ban-service inschakelen zodat deze vanaf nu automatisch wordt uitgevoerd. Voer eerst systemctl enable uit:

  1. sudo systemctl enable fail2ban

Vervolgens start je het handmatig voor de eerste keer met systemctl start:

  1. sudo systemctl start fail2ban

Je kunt controleren of het wordt uitgevoerd met systemctl status:

  1. sudo systemctl status fail2ban
Output
● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab> Active: active (running) since Mon 2022-06-27 19:25:15 UTC; 3s ago Docs: man:fail2ban(1) Main PID: 39396 (fail2ban-server) Tasks: 5 (limit: 1119) Memory: 12.9M CPU: 278ms CGroup: /system.slice/fail2ban.service └─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf start Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service. Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready

In de volgende stap zul je Fail2ban in actie zien.

Stap 3 — Testen van de Verbanningsbeleidsregels (Optioneel)

Vanaf een andere server, een die in de toekomst niet hoeft in te loggen op je Fail2ban-server, kun je de regels testen door die tweede server te laten verbannen. Nadat je bent ingelogd op je tweede server, probeer je SSH te gebruiken om verbinding te maken met de Fail2ban-server. Je kunt proberen verbinding te maken met een niet-bestaande naam:

  1. ssh blah@your_server

Voer willekeurige tekens in het wachtwoordprompt in. Herhaal dit een paar keer. Op een gegeven moment zou de foutmelding die je ontvangt moeten veranderen van Permission denied naar Connection refused. Dit geeft aan dat je tweede server verbannen is van de Fail2ban-server.

Op je Fail2ban-server kun je de nieuwe regel zien door de output van je iptables te controleren. iptables is een opdracht om te communiceren met firewallregels op laag niveau op je server. Als je de handleiding van DigitalOcean voor de initiële serverconfiguratie hebt gevolgd, zul je ufw gebruiken om firewallregels op een hoger niveau te beheren. Het uitvoeren van iptables -S laat je alle firewallregels zien die ufw al heeft gemaakt:

  1. sudo iptables -S
Output
-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N f2b-sshd -N ufw-after-forward -N ufw-after-input -N ufw-after-logging-forward -N ufw-after-logging-input -N ufw-after-logging-output -N ufw-after-output -N ufw-before-forward -N ufw-before-input -N ufw-before-logging-forward -N ufw-before-logging-input -N ufw-before-logging-output …

Als je de output van iptables -S doorstuurt naar grep om binnen die regels te zoeken naar de string f2b, kun je de regels zien die zijn toegevoegd door fail2ban:

  1. sudo iptables -S | grep f2b
Output
-N f2b-sshd -A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd -A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable -A f2b-sshd -j RETURN

De regel die REJECT --reject-with icmp-port-unreachable bevat, is toegevoegd door Fail2ban en zou het IP-adres van je tweede server moeten weergeven.

Conclusie

Je zou nu enkele verbanningsbeleidsregels moeten kunnen configureren voor je services. Fail2ban is een nuttige manier om elk soort service te beschermen die authenticatie gebruikt. Als je meer wilt weten over hoe fail2ban werkt, kun je onze tutorial bekijken over hoe fail2ban regels en bestanden werken.

Voor informatie over hoe je fail2ban kunt gebruiken om andere services te beschermen, kun je lezen over Hoe je een Nginx-server beschermt met Fail2Ban op Ubuntu 14.04 en Hoe je een Apache-server beschermt met Fail2Ban op Ubuntu 14.04.

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-22-04