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:
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:
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
:
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:
Nu kun je beginnen met het maken van configuratiewijzigingen. Open het bestand in nano
of je favoriete teksteditor:
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.
[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.
[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.
[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.
[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:
…
# 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.
[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:
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:
. . .
[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:
Vervolgens start je het handmatig voor de eerste keer met systemctl start
:
Je kunt controleren of het wordt uitgevoerd met systemctl status
:
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:
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:
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:
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