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:
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:
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
:
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:
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 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.
[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.
[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.
[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.
[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:
…
# 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.
[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:
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:
. . .
[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:
Vervolgens start je het handmatig voor de eerste keer met systemctl start
:
Je kunt controleren of het draait met systemctl status
:
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:
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:
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:
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