Hoe SSH te beschermen met Fail2Ban op Rocky Linux 8

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:

  1. sudo dnf install epel-release -y

De dnf pakketbeheerder zal nu EPEL controleren naast uw standaard pakketbronnen bij het installeren van nieuwe software. Ga verder met het installeren van Fail2ban:

  1. sudo dnf install fail2ban -y

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:

  1. systemctl status fail2ban.service
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:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
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:

  1. sudo cp jail.conf jail.local

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

  1. sudo vi jail.local

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.

/etc/fail2ban/jail.local
[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.

/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 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.

/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 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.

/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 betreffende host te weigeren totdat de banperiode verstrijkt.

Er zijn andere standaardscripts voor action_ beschikbaar die u kunt vervangen door $(action_) hierboven:

/etc/fail2ban/jail.local
…
# 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.

/etc/fail2ban/jail.local
[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.

/etc/fail2ban/jail.local
#
# 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:

  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 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:

/etc/fail2ban/jail.local
. . .
[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:

  1. sudo systemctl enable fail2ban

Vervolgens, start 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: 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:

  1. ssh blah@your_server

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.

  1. sudo fail2ban-client status
Output
Status |- 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:

  1. sudo fail2ban-client status sshd
Output
Status 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