Hoe SSH te beschermen met Fail2Ban op Ubuntu 20.04

Introductie

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

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

Grootschalige productie-implementaties waarvoor deze aansprakelijkheid volledig onaanvaardbaar is, zullen meestal een VPN implementeren zoals WireGuard vóór 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 softwarekoppelingen verbreken.

Voorafgaand aan of als aanvulling op het implementeren van een volledige VPN-opstelling, kunt u een tool genaamd Fail2ban implementeren. Fail2ban kan brute force-aanvallen aanzienlijk beperken door regels te creëren die automatisch uw firewallconfiguratie aanpassen om specifieke IP-adressen te blokkeren na een bepaald aantal mislukte inlogpogingen. Hierdoor kan uw server zichzelf versterken tegen deze toegangspogingen zonder ingrijpen van u.

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

Vereisten

Om deze handleiding te voltooien, heeft u nodig:

  • Een Ubuntu 20.04-server en een niet-root gebruiker met sudo-rechten. U kunt meer leren over het instellen van een gebruiker met deze rechten in onze Initiële serverconfiguratie met Ubuntu 20.04 handleiding.

  • Optioneel, een tweede server waar u verbinding mee kunt maken vanaf 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 commando’s 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 veroorzaken. U kunt dit verifiëren met behulp van het systemctl-commando:

  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 ervan 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 head -20:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
Output
# # WAARSCHUWING: ingrijpend gewijzigd in versie 0.9.0. Gelieve te controleren en # aanpassingen te maken voor uw setup. # # Wijzigingen: In de meeste gevallen zou u dit bestand niet moeten aanpassen, # maar aanpassingen moeten aanbrengen in het jail.local-bestand, # of aparte .conf-bestanden onder de jail.d/-map, bijvoorbeeld: # # HOE JAILS TE ACTIVEREN: # # DIT BESTAND MOET U NIET AANPASSEN. # # Het zal waarschijnlijk overschreven worden of verbeterd in een distributie-update. # # Voor aanpassingen gebruikt u een jail.local-bestand of een jail.d/customisation.local-bestand. # Bijvoorbeeld om de standaard ban-tijd voor alle jails te wijzigen en de # ssh-iptables-jail in te schakelen, zou het volgende (uitgecommentarieerd) verschijnen in het .local-bestand. # Raadpleeg man 5 jail.conf voor details. # # [DEFAULT]

Zoals je zult zien, zijn de eerste verschillende regels van dit bestand uitgeschakeld – ze beginnen met #-tekens die aangeven dat ze moeten worden gelezen als documentatie in plaats van als instellingen. Zoals je ook zult zien, geven deze opmerkingen aan dat je dit bestand niet rechtstreeks moet wijzigen. In plaats daarvan heb je twee opties: ofwel individuele profielen maken voor Fail2ban in meerdere bestanden binnen de jail.d/-directory, ofwel al je lokale instellingen maken en verzamelen in een jail.local-bestand. Het jail.conf-bestand wordt regelmatig 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. Je kunt dat 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 worden toegepast op alle door Fail2ban ondersteunde services. Elders in het bestand zijn er headers voor [sshd] en voor andere services, die service-specifieke instellingen bevatten die boven op de standaardinstellingen 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 zijn geslaagd om correct geauthentiseerd te worden. Dit wordt gemeten in seconden. Standaard staat 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 onwettige 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 binnen een periode van 10 minuten 5 keer onsuccesvol probeert in te loggen.

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

Als u e-mailmeldingen wilt ontvangen wanneer Fail2ban actie onderneemt, dient u de instellingen destemail, sendername en mta te 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 e-mail te verzenden. Standaard is dit sendmail, maar u wilt mogelijk 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 verbod wil instellen. De waarde action_ is gedefinieerd in het bestand vlak voor deze parameter. De standaardactie is om uw firewallconfiguratie bij te werken om verkeer van de betreffende host af te wijzen totdat de verbanningstijd verstrijkt.

Er zijn andere action_-scripts standaard aanwezig 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 het BELANGRIJKE opmerking in action.d/xarf-login-attack voor wanneer deze actie moet worden gebruikt
#
# verbied & stuur een xarf-e-mail naar abuse contact van IP-adres en inclusief relevante logregels
# 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 neemt actie en stuurt een e-mail, action_mwl neemt actie, stuurt een e-mail en omvat logging, en action_cf_mwl doet dit allemaal 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

Volgende is het deel van het configuratiebestand dat te maken heeft met individuele services. Deze worden gespecificeerd door sectiekopteksten, zoals [sshd].

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

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

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

De filter-waarde is eigenlijk een verwijzing naar een bestand dat zich bevindt in de /etc/fail2ban/filter.d-directory, met de extensie .conf verwijderd. Deze bestanden bevatten reguliere expressies (een veelgebruikte verkorting voor tekstverwerking) die bepalen of een regel in het logboek een mislukte authenticatiepoging is. We zullen deze bestanden niet in detail behandelen in deze handleiding, omdat ze vrij complex zijn en de vooraf gedefinieerde instellingen passende regels goed matchen.

U kunt echter zien welke soorten filters beschikbaar zijn door naar die directory 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 van commentaar voorzien en u moet op zijn minst kunnen zien wat voor soort voorwaarde het script was ontworpen om tegen te beschermen. De meeste van deze filters hebben passende (uitgeschakelde) secties in het jail.conf-bestand die we kunnen inschakelen in het jail.local-bestand indien gewenst.

Bijvoorbeeld, stel je voor dat je een website bedient met behulp van Nginx en je realiseert je 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 voorwaarde te controleren binnen het bestand /var/log/nginx/error.log.

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

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

enabled = true
. . .

Als je klaar bent met bewerken, sla je het bestand op en sluit je het af. Op dit punt kun je je Fail2ban-service inschakelen zodat deze automatisch zal worden uitgevoerd vanaf nu. 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 draait 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 Tue 2022-06-28 19:29: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 28 19:29:15 fail2ban20 systemd[1]: Started Fail2Ban Service. Jun 28 19:29:15 fail2ban20 fail2ban-server[39396]: Server ready

In de volgende stap zul je Fail2ban in actie zien.

Stap 3 — Testen van de Banning-beleidsregels (Optioneel)

Vanaf een andere server, een die niet hoeft in te loggen op je Fail2ban-server in de toekomst, kun je de regels testen door die tweede server te laten verbannen. Nadat je bent ingelogd op je tweede server, probeer je via SSH 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 wachtwoord prompt in. Herhaal dit een paar keer. Op een gegeven moment zou de foutmelding moeten veranderen van Toestemming geweigerd naar Verbinding geweigerd. Dit geeft aan dat je tweede server verbannen is van de Fail2ban server.

Op je Fail2ban-server kun je de nieuwe regel zien door je iptables-uitvoer te controleren. iptables is een opdracht om op laag niveau poort- en firewallregels op je server te beheren. Als je de gids voor de initiële serverconfiguratie van DigitalOcean hebt gevolgd, gebruik je ufw om firewallregels op een hoger niveau te beheren. Door iptables -S uit te voeren, zie je alle firewallregels die ufw al heeft aangemaakt:

  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 uitvoer 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 met REJECT --reject-with icmp-port-unreachable zal zijn toegevoegd door Fail2ban en zou het IP-adres van je tweede server moeten weergeven.

Conclusie

U moet nu enkele verbanningsbeleidsregels kunnen configureren voor uw diensten. Fail2ban is een handige manier om elk type service te beschermen dat authenticatie gebruikt. Als u meer wilt weten over hoe fail2ban werkt, kunt u onze tutorial bekijken over hoe fail2ban-regels en bestanden werken.

Voor informatie over hoe u fail2ban kunt gebruiken om andere diensten te beschermen, kunt u lezen over Hoe u een Nginx-server beschermt met Fail2Ban op Ubuntu 14.04 en Hoe u 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-20-04