Tips en Trucs 2022

Verbanning bij ongeoorloofd gedrag (Fail2ban)

Elke dienst die aan het internet wordt blootgesteld, loopt het risico op malware-aanvallen. Als je bijvoorbeeld een dienst draait op een openbaar netwerk, kunnen aanvallers brute-force pogingen gebruiken om in te loggen.

Fail2ban is een hulpmiddel dat helpt jouw Linux machine te beschermen tegen brute-force en andere geautomatiseerde aanvallen door de services logs te controleren op kwaadaardige activiteit. Het gebruikt reguliere expressies om logbestanden te scannen. Alle regels die overeenkomen met de patronen worden geteld, en wanneer hun aantal een bepaalde vooraf gedefinieerde drempel bereikt, verbant Fail2ban het overtredende IP via de systeemfirewall voor een bepaalde tijdsduur. Wanneer de ban periode afloopt, wordt het IP adres verwijderd van de ban lijst.

Fail2ban installeren

Fail2ban is niet aanwezig in de standaard softwarebronnen van openSUSE Leap 15.4, maar wel in de Security softwarebron. Deze voeg je als volgt toe aan het software beheer van openSUSE:

dany@pindabook:~> sudo zypper addrepo -f https://download.opensuse.org/repositories/security/15.4/ security
[sudo] wachtwoord voor root: 
Opslagruimte 'security' wordt toegevoegd ....................................................................................[gereed]
Opslagruimte 'security' is toegevoegd

URI                    : https://download.opensuse.org/repositories/security/15.4/
Ingeschakeld           : Ja
GPG-controle           : Ja
Automatisch vernieuwen : Ja
Prioriteit             : 99 (standaard prioriteit)

Prioriteiten van opslagruimtes hebben geen effect. Alle ingeschakelde opslagruimtes delen dezelfde prioriteit.

Daarna kan je Fail2ban installeren met de gebruikelijke opdracht. Aangezien we voor het eerst gebruik maken van de pas toegevoegde Security softwarebron, wordt ook gevraagd of je deze vertrouwd. Daar antwoord ik altijd (a) op, waardoor je in het vervolg ook automatisch updates ontvangt.

dany@pindabook:~> sudo zypper install fail2ban
Ophalen van metagegevens uit opslagruimte 'Update repository with updates from SUSE Linux Enterprise 15' ....................[gereed]
Cache van opslagruimte 'Update repository with updates from SUSE Linux Enterprise 15' wordt gebouwd .........................[gereed]

Een nieuwe handtekening voor een opslagruimte of pakket is ontvangen:

  Opslagruimte:              security
  Vingerafdruk van sleutel:  AAF3 EB04 4C49 C402 A9E7 B9AE 69D1 B2AA EE3D 166A
  Sleutelnaam:               security OBS Project 
  Sleutelalgoritme:          RSA 2048
  Sleutel aangemaakt:        ma 28 dec 2020 02:19:32 CET
  Sleutel verloopt op:       wo 08 mrt 2023 02:19:32 CET
  Rpm-naam:                  gpg-pubkey-ee3d166a-5fe932a4



    Opmerking: Ondertekenen van gegevens maakt het mogelijk voor de ontvanger om te controleren dat
    er na het ondertekenen geen wijzigingen zijn geweest na het ondertekenen. Accepteren van
    pakketten met foute ondertekening kan leiden tot een corrupt systeem en in extreme gevallen
    zelfs tot een gecompromitteerd systeem.

    Opmerking: Een GPG publieke sleutel wordt betrouwbaar geïdentificeerd door zijn vingerafdruk.
    Vertrouw niet op de sleutelnaam. Als u niet zeker bent of de gepresenteerde sleutel is autentiek
    is, vraag dan de leverancier van de opslagruimte of controleer zijn website. Veel leveranciers
    onderhouden een webpagina die de vingerafdrukken tonen van de GPG sleutels die ze gebruiken.

Wilt u de sleutel verwerpen, tijdelijk vertrouwen of altijd vertrouwen? [v/t/a/?] (v): a
Ophalen van metagegevens uit opslagruimte 'security' ........................................................................[gereed]
Cache van opslagruimte 'security' wordt gebouwd .............................................................................[gereed]
Gegevens van opslagruimte laden...
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

De volgende 5 NIEUWE pakketten zullen worden geïnstalleerd:
  ed fail2ban python3-pyinotify python3-systemd whois

5 nieuwe te installeren pakketten.
Totale downloadgrootte: 763,2 KiB. Reeds in de cache: 0 B. Na de bewerking zal aanvullend 2,3 MiB worden gebruikt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
pakket ed-1.17-150400.1.5.x86_64 wordt opgehaald                                               (1/5),  76,0 KiB (125,2 KiB uitgepakt)
Ophalen: ed-1.17-150400.1.5.x86_64.rpm ......................................................................................[gereed]
pakket python3-pyinotify-0.9.6-4.5.1.noarch wordt opgehaald                                    (2/5),  56,3 KiB (262,8 KiB uitgepakt)
Ophalen: python3-pyinotify-0.9.6-4.5.1.noarch.rpm ...............................................................[gereed (2,5 KiB/s)]
pakket python3-systemd-234-5.3.5.x86_64 wordt opgehaald                                        (3/5),  70,2 KiB (247,0 KiB uitgepakt)
Ophalen: python3-systemd-234-5.3.5.x86_64.rpm ...............................................................................[gereed]
pakket whois-5.5.10-150400.1.7.x86_64 wordt opgehaald                                          (4/5), 100,8 KiB (363,2 KiB uitgepakt)
Ophalen: whois-5.5.10-150400.1.7.x86_64.rpm .................................................................................[gereed]
pakket fail2ban-0.11.2-150400.2.4.noarch wordt opgehaald                                       (5/5), 459,8 KiB (  1,4 MiB uitgepakt)
Ophalen: fail2ban-0.11.2-150400.2.4.noarch.rpm ..............................................................................[gereed]

Controleren op conflicten tussen bestanden: .................................................................................[gereed]
(1/5) Installeren van: ed-1.17-150400.1.5.x86_64 ............................................................................[gereed]
update-alternatives: using /usr/bin/pyinotify-3.6 to provide /usr/bin/pyinotify (pyinotify) in auto mode
(2/5) Installeren van: python3-pyinotify-0.9.6-4.5.1.noarch .................................................................[gereed]
(3/5) Installeren van: python3-systemd-234-5.3.5.x86_64 .....................................................................[gereed]
(4/5) Installeren van: whois-5.5.10-150400.1.7.x86_64 .......................................................................[gereed]
Updating /etc/sysconfig/fail2ban ...
(5/5) Installeren van: fail2ban-0.11.2-150400.2.4.noarch ....................................................................[gereed]

Met de volgende opdracht controleer je of Fail2ban al actief is:

dany@pindabook:~> sudo systemctl status fail2ban
[sudo] wachtwoord voor root: 
○ fail2ban.service - Fail2Ban Service
     Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled)
     Active: inactive (dead)
       Docs: man:fail2ban(1)

Niet dus, dan starten we Fail2ban manueel met:

dany@pindabook:~> sudo systemctl start fail2ban
dany@pindabook:~> sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
     Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled)
     Active: active (running) since Fri 2022-06-24 18:34:06 CEST; 3s ago
       Docs: man:fail2ban(1)
    Process: 5290 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
   Main PID: 5291 (fail2ban-server)
      Tasks: 3 (limit: 4915)
     CGroup: /system.slice/fail2ban.service
             └─5291 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

jun 24 18:34:06 pindabook systemd[1]: Starting Fail2Ban Service...
jun 24 18:34:06 pindabook systemd[1]: Started Fail2Ban Service.
jun 24 18:34:06 pindabook fail2ban-server[5291]: Server ready

Nu we weten dat Fail2ban zonder fouten opstart, kunnen we deze opnemen in de opstartprocedure van het systeem:

dany@pindabook:~> sudo systemctl enable fail2ban
[sudo] wachtwoord voor root: 
Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /usr/lib/systemd/system/fail2ban.service.

Fail2ban configureren

De standaard Fail2ban installatie wordt geleverd met een aantal configuratiebestanden in de map /etc/fail2ban/. Je wijzigt deze bestanden beter niet omdat ze overschreven kunnen worden wanneer het pakket wordt bijgewerkt.

Fail2ban leest de configuratie bestanden in de volgende volgorde. Elk .local bestand overschrijft de instellingen van het .conf bestand:

Voor de meeste gebruikers is de gemakkelijkste manier om Fail2ban te configureren het kopiëren van de jail.conf naar jail.local en het .local bestand aan te passen. Meer geavanceerde gebruikers kunnen een .local configuratiebestand vanaf nul opbouwen. Het .local bestand hoeft niet alle instellingen van het corresponderende .conf bestand te bevatten, alleen degene die je wilt overschrijven.

Maak een .local configuratiebestand van het standaard jail.conf bestand:

dany@pindabook:~> sudo cp /etc/fail2ban/jail.{conf,local}

Om te beginnen met het configureren van de Fail2ban server open je het jail.local bestand met de tekst editor nano:

dany@pindabook:~> sudo nano /etc/fail2ban/jail.local

Lijst met veilige IP adressen (whitelist)

IP adressen, IP bereiken, of hosts die je wil uitsluiten van de ban kunnen toegevoegd worden aan de ignoreip optie. Hier moet je het IP adres van jouw lokale PC toevoegen en alle andere machines die je op de witte lijst wilt zetten.

Haal het commentaarteken (#) weg van de regel die begint met ignoreip en voeg jouw IP-adressen toe, gescheiden door spaties:

ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

Ban instellingen

De waarden van bantime, findtime en maxretry opties bepalen de ban tijd en ban voorwaarden.

bantime is de duur dat het IP verbannen wordt. Wanneer geen achtervoegsel is opgegeven, is de standaardeenheid seconden. Standaard is de bantime-waarde ingesteld op 10 minuten. Over het algemeen zullen de meeste gebruikers een langere ban tijd willen instellen. Verander de waarde naar wens:

bantime  = 1d

Gebruik een negatief getal om het IP permanent te verbannen.

findtime is de duur tussen het aantal mislukkingen voordat een ban wordt ingesteld. Bijvoorbeeld, als Fail2ban is ingesteld om een IP te bannen na vijf mislukkingen (maxretry, zie hieronder), moeten die mislukkingen binnen de findtime duur vallen.

findtime  = 10m

maxretry is het aantal mislukkingen voordat een IP wordt verbannen. De standaardwaarde is ingesteld op vijf, wat voor de meeste gebruikers goed zou moeten zijn.

maxretry = 5

Fail2ban jails

Fail2ban gebruikt een concept van jails. Een jail beschrijft een service en bevat filters en acties. Log items die overeenkomen met het zoekpatroon worden geteld en als aan een voorgedefinieerde voorwaarde wordt voldaan, worden de bijbehorende acties uitgevoerd.

Fail2ban wordt geleverd met een aantal jails voor verschillende diensten. Je kunt ook eigen jail configuraties maken.

Standaard is de ssh-jail uitgeschakeld. Om een jail in te schakelen, moet je enabled = true toevoegen achter de jail titel. In het voorbeeld hieronder schakel ik de ssh jail in:

[sshd]
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
enabled = true
#mode   = normal
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

De filters staan in de /etc/fail2ban/filter.d map, opgeslagen in een bestand met dezelfde naam als de jail. Als je een aangepaste configuratie hebt en ervaring met reguliere expressies, kun je de filters fijn afstellen.

dany@pindabook:~> ls -l /etc/fail2ban/filter.d/
totaal 368
-rw-r--r-- 1 root root  467 23 nov  2020 3proxy.conf
-rw-r--r-- 1 root root 3228 23 nov  2020 apache-auth.conf
-rw-r--r-- 1 root root 2831 23 nov  2020 apache-badbots.conf
...
-rw-r--r-- 1 root root  521 23 nov  2020 xinetd-fail.conf
-rw-r--r-- 1 root root  912 23 nov  2020 znc-adminlog.conf
-rw-r--r-- 1 root root  524 23 nov  2020 zoneminder.conf

Telkens wanneer je een configuratiebestand wijzigt, moet je de Fail2ban-service opnieuw starten om de wijzigingen van kracht te laten worden:

dany@pindabook:~> sudo systemctl restart fail2ban

Fail2ban Client

Fail2ban wordt geleverd met de terminal opdracht fail2ban-client die je kunt gebruiken om te communiceren met de Fail2ban dienst.

Om alle beschikbare opties te zien, roep je de opdracht op met de -h optie:

dany@pindabook:~> fail2ban-client -h
Usage: fail2ban-client [OPTIONS] 

Fail2Ban v0.11.2 reads log file that contains password failure report
and bans the corresponding IP addresses using firewall rules.

Options:
    -c, --conf         configuration directory
    -s, --socket      socket path
    -p, --pidfile     pidfile path
...
    --str2sec       convert time abbreviation format to seconds
    -h, --help              display this help message
    -V, --version           print the version (-V returns machine-readable short format)

Command:
                                             BASIC
    start                                    starts the server and the jails
    restart                                  restarts the server
    restart [--unban] [--if-exists]    restarts the jail  (alias
                                             for 'reload --restart ... ')
...
    get  actionproperties         gets a list of properties for the
                                             action  for 
    get  actionmethods            gets a list of methods for the
                                             action  for 
    get  action         gets the value of  for
                                             the action  for 

Report bugs to https://github.com/fail2ban/fail2ban/issues

Dit hulpmiddel kan gebruikt worden om IP adressen te bannen/ontbannen, instellingen te wijzigen, de dienst te herstarten, en meer. Hier zijn een paar voorbeelden:

Om de SSH dienst vanaf een bepaald IP adres te blokkeren (te bannen) voer je de volgende opdracht uit:

dany@pindabook:~> sudo fail2ban-client set sshd banip 192.168.1.24
[sudo] wachtwoord voor root:
1

Vanaf nu heeft het apparaat met het IP adres 192.168.1.24 geen toegang meer via SSH. Dit kan je nagaan door dit te proberen, maar ook door de status van een dienst met de fail2ban-client opdracht na te gaan:

dany@pindabook:~> sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   192.168.1.24

Je kunt de SSH ban terug opheffen met de opdracht:

dany@pindabook:~> sudo fail2ban-client set sshd unbanip 192.168.1.241
Fail2ban

Fail2ban volledig van de computer verwijderen

Laten we beginnen met het afsluiten van Fail2ban:

dany@pindabook:~> sudo systemctl stop fail2ban.service
[sudo] wachtwoord voor root:

Ook het automatisch opstarten schakelen we uit:

dany@pindabook:~> sudo systemctl disable fail2ban.service 
Removed /etc/systemd/system/multi-user.target.wants/fail2ban.service.

Het zelfgemaakte configuratiebestand verwijderen we met:

dany@pindabook:~> sudo rm /etc/fail2ban/jail.local

Fail2ban zelf verwijderen we volledig met de opdracht:

dany@pindabook:~> sudo zypper remove -u fail2ban
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

De volgende 5 pakketten zullen worden VERWIJDERD:
  ed fail2ban python3-pyinotify python3-systemd whois

5 te verwijderen pakketten.
Na de bewerking zal 2,3 MiB worden vrijgemaakt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
warning: file /etc/fail2ban/jail.local: remove failed: No such file or directory
rm: cannot remove '/var/lib/systemd/migrated/fail2ban': No such file or directory
(1/5) Verwijderen van fail2ban-0.11.2-150400.2.4.noarch .....................................................................[gereed]
(2/5) Verwijderen van whois-5.5.10-150400.1.7.x86_64 ........................................................................[gereed]
(3/5) Verwijderen van python3-systemd-234-5.3.5.x86_64 ......................................................................[gereed]
(4/5) Verwijderen van python3-pyinotify-0.9.6-4.5.1.noarch ..................................................................[gereed]
(5/5) Verwijderen van ed-1.17-150400.1.5.x86_64 .............................................................................[gereed]

Om de toegevoegde softwarebron en bijhorende GPG-sleutel te verwijderen, moet je eerst de bij de softwarebron horende sleutel opsporen. Een lijst met GPG-sleutels die door het softwarebeheer gebruikt worden, vraag je op met de opdracht:

dany@pindabook:~> rpm -q gpg-pubkey --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{SUMMARY}\n'
gpg-pubkey-307e3d54-5aaa90a5    gpg(SuSE Package Signing Key )
gpg-pubkey-39db7c82-5f68629b    gpg(SuSE Package Signing Key )
gpg-pubkey-3dbdc284-53674dd4    gpg(openSUSE Project Signing Key )
gpg-pubkey-65176565-61a0ee8f    gpg(openSUSE:Backports OBS Project )
gpg-pubkey-1abd1afb-54176598    gpg(PackMan Project (signing key) )
gpg-pubkey-ee3d166a-5fe932a4    gpg(security OBS Project )

De GPG-sleutel voor de security softwarebron staat in het voorbeeld als laatste en heeft als referentie gpg-pubkey-ee3d166a-5fe932a4. Deze referentie heb je nodig om de GPG-sleutel te verwijderen met:

dany@pindabook:~> sudo rpm -e gpg-pubkey-ee3d166a-5fe932a4

Door het verwijderen van de GPG-sleutel vertrouw je de softwarebron niet langer. De softwarebron security zelf, verwijder je met de opdracht:

dany@pindabook:~> sudo zypper removerepo security
Opslagruimte 'security' wordt verwijderd ....................................................................................[gereed]
Opslagruimte 'security' is verwijderd.