Bescherm je server met GeoIP

Om te voorkomen dat gevoelige poorten van je server continu onder vuur liggen kun je de toegang beperken tot bepaalde landen. Dit komt vooral van pas als je actief bent buiten de USA waar 55% van de ip adressen aan gekoppeld zijn.

Installeer daarvoor eerst geoiplookup en de GeoIP landen database. Bij de meeste Linux distributies maakt dit pakket deel uit van het repository. Op Debian georienteerde distributies:

$ apt-get install geoip-bin geoip-database

Je kunt nu eenvoudig controleren of het werkt:

$ geoiplookup 8.8.8.8
GeoIP Country Edition: US, United States

Het script

Met een eenvoudig script dat true (ACCEPT) of false (DENY) teruggeeft. In het laatste geval wordt er een bericht weggeschreven naar de systemlog. Bewaar onderstaand script in /usr/local/bin/sshfilter.sh:

#!/bin/bash

# UPPERCASE space-separated country codes to ACCEPT
ALLOW_COUNTRIES="NL BE FR"

if [ $# -ne 1 ]; then
  echo "Usage:  `basename $0` <ip>" 1>&2
  exit 0 # return true in case of config issue
fi

COUNTRY=`/usr/bin/geoiplookup $1 | awk -F ": " '{ print $2 }' | awk -F "," '{ print $1 }' | head -n 1`

[[ $COUNTRY = "IP Address not found" || $ALLOW_COUNTRIES =~ $COUNTRY ]] && RESPONSE="ALLOW" || RESPONSE="DENY"

if [ $RESPONSE = "ALLOW" ]
then
  exit 0
else
  logger "$RESPONSE sshd connection from $1 ($COUNTRY)"
  exit 1
fi

ALLOW_COUNTRIES is een lijst met landen van waar toegang is toegestaan.

Opmerking: ook als een IP adres niet aan een land kan worden gekoppeld (bijvoorbeeld een intern IP adres), zal toegang worden verleend ($COUNTRY = "IP Address not found").

Maak het script nu uitvoerbaar:

$ chmod 775 /usr/local/bin/sshfilter.sh

Nu moet het script nog worden verbonden met de toegangsverlening van het systeem. We doen dit door in /etc/hosts.deny standaard alle SSH en FTP toegang te weigeren:

sshd: ALL
vsftpd: ALL

In /etc/hosts.allow plaatsen we vervolgens de regel:

sshd: ALL: aclexec /usr/local/bin/sshfilter.sh %a
vsftpd: ALL: aclexec /usr/local/bin/ipfilter.sh %a

Testen

Voordat je nu per ongeluk de toegang wordt ontzegd wil je het script nu natuurlijk testen. In de terminal kun je bovengebruikt 8.8.8.8 ip adres gebruiken dat zoals we al weten is gekoppeld aan de US en dus geweigerd zou moeten worden:

$ /usr/local/bin/sshfilter.sh 8.8.8.8

Het script geeft niets zichtbaars terug in de terminal, maar:

$ tail /var/log/syslog 

geeft onder meer iets als het onderstaande:

Apr 23 17:02:37 pi root: DENY sshd connection from 8.8.8.8 (US)

Hou je terminal nog even open en open een nieuwe terminal. Kijk of je daarin nog toegang hebt tot de server. Als dat zo is kunnen alle openstaande terminals nu met een gerust hard gesloten worden.

Als je na verloop van tijd nogmaals het syslog bestand bekijkt zul je zien dat veel connecties zijn tegengehouden.

Apr 23 17:17:19 gemenegronden root: DENY sshd connection from 118.212.132.231 (CN)
Apr 23 17:17:50 gemenegronden root: DENY sshd connection from 118.212.132.231 (CN)
Apr 23 17:18:17 gemenegronden root: DENY sshd connection from 118.212.132.231 (CN)
Apr 23 17:18:49 gemenegronden root: DENY sshd connection from 118.212.132.231 (CN)
Apr 23 17:19:18 gemenegronden root: DENY sshd connection from 118.212.132.231 (CN)
Apr 23 17:19:20 gemenegronden root: DENY sshd connection from 61.222.147.74 (TW)
Apr 23 17:19:54 gemenegronden root: DENY sshd connection from 118.212.132.231 (CN)
Apr 23 17:20:17 gemenegronden root: DENY sshd connection from 118.212.132.231 (CN)
Apr 23 17:21:58 gemenegronden root: DENY sshd connection from 84.236.49.189 (HU)

Bijwerken GeoIP

Om er voor te zorgen dat de GeoIP landen database actueel date blijft, maken we het volgende script (/root/bin/geoipupdate) als root cronjob maandelijks worden uitgevoerd:

#!/bin/bash

cd /tmp
wget -q https://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
if [ -f GeoIP.dat.gz ]
then
    gzip -d GeoIP.dat.gz
    rm -f /usr/share/GeoIP/GeoIP.dat
    mv -f GeoIP.dat /usr/share/GeoIP/GeoIP.dat
else
    echo "The GeoIP library could not be downloaded and updated"
fi

Maak het script uitvoerbaar en volg een cronjob toe met crontab -e:

0 5 1 * * /root/bin/geoipupdate > /dev/null @>&1

 

Topics

Reactie toevoegen