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, zodat het kernprotocol veilig blijft. Echter, geen enkel protocol of softwarestack is volledig waterdicht, en doordat SSH zo wijdverspreid is over het internet, betekent dit 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 u de logs bekijkt voor uw SSH-service die draait op een veelgebruikte server, zult u vaak herhaalde, systematische pogingen tot inloggen zien die brute force-aanvallen door gebruikers en bots vertegenwoordigen. Hoewel u enkele optimalisaties kunt maken aan uw SSH-service om de kans op succesvolle aanvallen tot bijna nul te verminderen, zoals wachtwoordverificatie uitschakelen ten gunste van SSH-sleutels, kunnen ze nog steeds een kleine, voortdurende aansprakelijkheid vormen.
Grote implementaties van productie 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 aanvullende software abstractie of gateways. Deze VPN-oplossingen worden breed vertrouwd, maar zullen complexiteit toevoegen en kunnen sommige automatiseringen of andere kleine softwarekoppelingen breken.
Voorafgaand aan of naast het zich committeren aan een volledige VPN-setup, 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’s te verbieden na een bepaald aantal mislukte pogingen om in te loggen. Dit stelt uw server in staat om zichzelf te versterken tegen deze toegangspogingen zonder tussenkomst van u.
In deze handleiding ziet u hoe u Fail2ban installeert en gebruikt op een Rocky Linux 8-server.
Vereisten
Om deze handleiding te voltooien, heeft u nodig:
-
Een Rocky Linux 8-server en een niet-rootgebruiker met sudo-rechten. U kunt meer leren over hoe u een gebruiker met deze rechten instelt in onze Initiële Serverconfiguratie met Rocky Linux 8 gids. U moet ook
firewalld
draaien op de server, wat wordt behandeld in onze initiële serverconfiguratiegids. -
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 niet beschikbaar in de standaard software repositories van Rocky. Het is echter beschikbaar in de EPEL of Enhanced Packages for Enterprise Linux repository, die vaak wordt gebruikt voor pakketten van derden op Red Hat en Rocky Linux. Als u EPEL nog niet heeft toegevoegd aan uw systeem pakketbronnen, kunt u de repository toevoegen met dnf
, zoals u een ander pakket zou installeren:
De dnf
pakketbeheerder zal nu EPEL controleren naast uw standaard pakketbronnen bij het installeren van nieuwe software. Ga verder met het installeren van Fail2ban:
Fail2ban zal automatisch een achtergronddienst instellen nadat het is geïnstalleerd. Het is echter standaard uitgeschakeld, omdat sommige van de standaardinstellingen ongewenste effecten kunnen veroorzaken. U kunt dit verifiëren door het systemctl
-commando te gebruiken:
Output○ fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled
Active: inactive (dead)
Docs: man:fail2ban(1)
U kunt Fail2ban direct inschakelen, maar eerst zult u enkele van de functies ervan bekijken.
Stap 2 – Configuratie van Fail2ban
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 release 0.9.0. Gelieve te controleren en
# aanpassingen te doen voor uw opstelling.
#
# Veranderingen: in de meeste gevallen moet u dit bestand niet wijzigen, maar aanpassingen
# leveren in het jail.local bestand,
# of aparte .conf bestanden onder de jail.d/ map, bijvoorbeeld:
#
# HOE JAILS TE ACTIVEREN:
#
# U MOET DIT BESTAND NIET WIJZIGEN.
#
# Het zal waarschijnlijk overschreven of verbeterd worden in een distributie-update.
#
# Lever aanpassingen in een jail.local bestand of een jail.d/aanpassing.local.
# Bijvoorbeeld om de standaard ban-tijd 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, geven deze opmerkingen aan dat je dit bestand niet rechtstreeks moet wijzigen. In plaats daarvan heb je twee opties: maak individuele profielen voor Fail2ban aan in meerdere bestanden binnen de jail.d/
map, of maak en verzamel al uw lokale instellingen in een jail.local
bestand. Het jail.conf
bestand zal periodiek worden bijgewerkt wanneer Fail2ban zelf wordt bijgewerkt, en zal worden gebruikt als bron van standaardinstellingen waarvoor u geen overrides heeft 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 vi
of je favoriete teksteditor:
Terwijl je door het bestand bladert, zal deze tutorial enkele opties doornemen die je mogelijk wilt bijwerken. De instellingen onder de sectie [DEFAULT]
vlakbij de bovenkant van het bestand worden toegepast op alle services die worden ondersteund door Fail2ban. Elders in het bestand zijn koppen voor [sshd]
en voor andere services, die service-specifieke instellingen bevatten die boven op de standaardinstellingen worden toegepast.
[DEFAULT]
. . .
bantime = 10m
. . .
De parameter bantime
stelt de lengte van de tijd in dat een client wordt verbannen wanneer deze er niet in slaagt 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 gevonden als een onrechtmatige gebruiker die verbannen moet worden.
De variabele maxretry
stelt het aantal pogingen in dat een client heeft om binnen een tijdsbestek gedefinieerd door findtime
te authenticeren, voordat deze wordt verbannen. Met de standaardinstellingen zal de fail2ban-service een client verbannen die vijf 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 destemail
-parameter stelt het e-mailadres in dat banmeldingen moet ontvangen. De sendername
stelt de waarde van het “Van” veld in de e-mail in. De mta
-parameter configureert welke mailservice wordt gebruikt om e-mails te verzenden. Standaard is dit sendmail
, maar u kunt ervoor kiezen om Postfix of een andere mailservice te 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 betreffende host te weigeren totdat de banperiode verstrijkt.
Er zijn andere standaardscripts voor action_
beschikbaar die u kunt vervangen door $(action_)
hierboven:
…
# ban & verstuur een e-mail met whois-rapport naar destemail.
action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
# ban & verstuur een e-mail met whois-rapport en relevante logregels
# naar destemail.
action_mwl = %(action_)s
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
# Zie het BELANGRIJKE bericht in action.d/xarf-login-attack voor wanneer deze actie moet worden gebruikt
#
# ban & verstuur een xarf-e-mail naar het abuse-contact van het IP-adres en voeg relevante logregels toe
# naar destemail.
action_xarf = %(action_)s
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
# ban IP op CloudFlare & verstuur een e-mail met whois-rapport en relevante logregels
# naar destemail.
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 een actie uit en stuurt een e-mail, action_mwl
voert een actie uit, stuurt een e-mail en omvat logging, en action_cf_mwl
doet dit alles plus stuurt ook een update naar de Cloudflare API die is gekoppeld aan uw account om de overtreder daar ook te verbannen.
Individuele Gevangenisinstellingen
Volgende is het gedeelte van het configuratiebestand dat te maken heeft met individuele services. Deze worden gespecificeerd door sectiekoppen, zoals [sshd]
.
Elk van deze secties moet afzonderlijk worden ingeschakeld door een regel toe te voegen enabled = true
onder de kop, met hun andere instellingen.
[jail_to_enable]
. . .
enabled = true
. . .
Voor deze handleiding schakelt u de SSH-gevangenis in. Het moet bovenaan de instellingen voor individuele gevangenissen staan. De standaardparameters werken anders, maar u moet een configuratieregel toevoegen die zegt enabled = true
onder de [sshd]
-kop.
#
# JAILS
#
#
# SSH-servers
#
[sshd]
# Om meer agressieve sshd-modi te gebruiken, stel filterparameter "mode" in jail.local:
# normaal (standaard), ddos, extra of agressief (combineert alles).
# Zie "tests/files/logs/sshd" of "filter.d/sshd.conf" voor gebruiksvoorbeeld en details.
#mode = normaal
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
Enkele andere instellingen die hier zijn ingesteld, zijn de filter
die zal worden gebruikt om te beslissen of een regel in een logboek 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 verkorte notatie voor tekstanalyse) die bepalen of een regel in het logboek een mislukte authenticatiepoging is. We zullen deze bestanden niet uitgebreid behandelen in deze handleiding, omdat ze vrij complex zijn en de vooraf gedefinieerde instellingen goed overeenkomen met geschikte regels.
U kunt echter zien welke soort 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 van commentaar voorzien en u moet op zijn minst kunnen zien welk type voorwaarde het script was ontworpen om tegen te beschermen. De meeste van deze filters hebben passende (uitgeschakelde) secties in het bestand jail.conf
die we kunnen inschakelen in het bestand jail.local
indien gewenst.
Bijvoorbeeld, stel dat u een website bedient met behulp van Nginx en realiseert dat een met een wachtwoord beveiligd gedeelte van uw site wordt overspoeld met inlogpogingen. U 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 het bestand dan op en sluit het af. Als je vi
gebruikt, gebruik dan :x
om op te slaan en af te sluiten. Op dit punt kun je je Fail2ban-service inschakelen zodat deze vanaf nu automatisch wordt uitgevoerd. Voer eerst systemctl enable
uit:
Vervolgens, start 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: disabled
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.6 -s /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 in te loggen op de Fail2ban-server via SSH. Je kunt proberen verbinding te maken met een niet-bestaande naam:
Voer willekeurige tekens in bij het wachtwoordprompt. Herhaal dit een paar keer. Op een gegeven moment zou de fout die je ontvangt moeten veranderen van Toestemming geweigerd
naar Verbinding geweigerd
. Dit geeft aan dat je tweede server is verbannen van de Fail2ban-server.
Op uw Fail2ban-server kunt u de nieuwe regel zien door de uitvoer van fail2ban-client
te controleren. fail2ban-client
is een aanvullend commando dat wordt geleverd door Fail2ban om de actieve configuratie te controleren.
OutputStatus
|- Number of jail: 1
`- Jail list: sshd
Als u fail2ban-client status sshd
uitvoert, kunt u de lijst zien van IP-adressen die zijn verbannen van SSH:
OutputStatus for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 7
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 134.209.165.184
De inhoud van de Verbannen IP-lijst
moet het IP-adres van uw tweede server weerspiegelen.
Conclusie
U zou nu in staat moeten zijn om enkele verbanningsbeleidsregels voor uw services te configureren. Fail2ban is een nuttige manier om elke vorm van service die authenticatie gebruikt, te beschermen. 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 services te beschermen, kunt u lezen over Hoe u een Nginx-server beschermt met Fail2Ban en Hoe u een Apache-server beschermt met Fail2Ban.
Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-rocky-linux-8