Mit PortSentry könnt Ihr ausgewählte Ports auf Port Scans überwachen und die Port Scan Quelle blockieren. Damit kriegen Angreifer sofort die Türen zu gemacht und werden schon vorm Versuch in den Server einzudringen ausgesperrt. Allesdings muss dafür ein Port offen gelassen werden, hier müsst Ihr selber entscheiden was Euch lieber ist, Ports schließen oder offen lassen…
In diesem Beispiel werden die Ports 22 und 23 offen gelassen und sobald darauf ein Scan statt findet, wird diese IP für min. 30 Minuten gesperrt. Dafür wird ein Script und die Beschreibung von Rob-Schulze.de verwendet. Vielen Dank an dieser Stelle für das Script und Tutorial!!!
Die Installation wird mit apt-get durchgeführt:
apt-get install portsentry
Die Konfigurationsdatei liegt im Pfad /etc/portsentry/portsentry.conf. Hier müssen diverse Einstellungen getätigt werden, zunächst empfehle ich zu prüfen, ob in der Datei alle Einträge die mit
KILL_ROUTE=
beginnen auskommentiert sind. Wenn nicht, dann müssen diese Einträge auskommentiert werden.
Selbiges gilt für die folgenden Einträge:
TCP_PORTS= UDP_PORTS=
Anstatt dessen werden nun folgende Werte in die Datei eingetragen:
TCP_PORTS=“22,23″ UDP_PORTS=“22,23″ KILL_RUN_CMD=“/etc/portsentry/filtermgr -a $TARGET$“
TCP_PORTS und UDP_PORTS definieren die Ports, die geprüft werden sollen. Hier können auch weitere Ports durch ein „,“ getrennt eingetragen werden. Die Firewall darf natürlich nicht diesen Port blocken. Wenn auf Port 22 gelauscht werden soll, dann ist es wichtig, dass vorher der SSH-Port umgelegt wurde, da man sich ansonsten im schlimmsten Fall aussperren kann.
Die folgenden Werte werden von der Default-Einstellung „0“ auf „2“ geändert, damit ein das externe Script von Rob Schulze überhaupt aufgerufen werden kann:
BLOCK_UDP="2" BLOCK_TCP="2"
Jetzt wird das Script von Rob Schulze benötigt:
cd /etc/portsentry wget http://www.rob-schulze.de/informatik/tutorials/portsentry/rcportsentry chmod 700 rcportsentry
Dieses Script muss editiert werden, u.a. muss hier der Pfad zur iptables und zum Pfad von der PortSentry-Konfiguration angegeben werden:
my $BASE_DIR=“/etc/portsentry“; my $BLOCK_FILE=“/var/lib/portsentry/portsentry.blocked“; my $IPTABLES_CMD=“/sbin/iptables“; my $BLOCK_TIMEOUT=60*30;
Der Wert BLOCK_TIMEOUT gibt die Sperrzeit in Sekunden an. Hier kann auch gerechnet werden, also 60*30 wären somit 1800 Sekunden oder 30 Minuten.
Damit die gesperrten IP-Adressen auch wieder freigegeben werden ist es notwendig, dass per Crontab das Script von Rob Schulze die iptables-Regeln wieder entfernt. Ich rufe das Script alle 30 Minuten auf, somit ist eine IP-Adresse im schlimmsten Fall 60 Minuten oder im schnellsten Fall nur 30 Minuten gesperrt. Hier der Crontab-Eintrag:
*/30 * * * * /etc/portsentry/filtermgr -d
Ich nutze ein Firewall-Script zum starten der „Sicherheits“programme auf dem vServer. Portsentry wird automatisch beim Systemstart geladen, allerdings soll Portsentry im Firewall-Script integriert werden, deshalb wird der automatische Start wie folgt aufgehoben:
update-rc.d -f portsentry remove
Das Firewall-Script inkl. der Einträge für PortSentry sieht dann so aus (die neuen Einträge sind durch #### vorher gekennzeichnet, damit Ihr diese leichter erkennt):
#!/bin/sh # script written by Gargi 2009 http://www.gargi.org #needed modules modprobe ip_conntrack_ftp BLACKLIST=/usr/local/etc/blacklist.txt #trigger for your ports IN_ALLOWED_TCP=“21 22 23 25 53 80″ OUT_ALLOWED_TCP=“21 22 23 25 53 80″ IN_ALLOWED_UDP=“53 7878″ OUT_ALLOWED_UDP=“53″ IN_ALLOWED_ICMP=“ “ OUT_ALLOWED_IMCP=“ “ case „$1“ in start) ##### Stopping PortSentry /etc/init.d/portsentry stop # Stopping IP trap /etc/init.d/fail2ban stop echo „Stopping fail2ban IP trap …“ # Clear iptables iptables -F #Defaults iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # loopback communication iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # persist on connections iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT # Ban blacklisted IPs for x in `grep -v ^# $BLACKLIST | awk ‚{print $1}’`; do echo „Blocking $x…“ iptables -A INPUT -t filter -s $x -j DROP done # TCP rules in for port in $IN_ALLOWED_TCP; do echo „Accepting TCP port $port“ iptables -A INPUT -t filter -p tcp –dport $port -j ACCEPT done # TCP rules out for port in $OUT_ALLOWED_TCP; do echo „Allowing sending over TCP port $port“ iptables -A OUTPUT -t filter -p tcp –dport $port -j ACCEPT done # UDP rules in for port in $IN_ALLOWED_UDP; do echo „Accepting UDP port $port“ iptables -A INPUT -t filter -p udp –dport $port -j ACCEPT done # UDP rules out for port in $OUT_ALLOWED_UDP; do echo „Allowing sending over UDP port $port“ iptables -A OUTPUT -t filter -p udp –dport $port -j ACCEPT done # ICMP rules in for port in $IN_ALLOWED_ICMP; do echo „Accepting ICMP port $port“ iptables -A INPUT -t filter -p icmp –dport $port -j ACCEPT done # ICMP rules out for port in $OUT_ALLOWED_ICMP; do echo „Allowing sending over ICMP port $port“ iptables -A OUTPUT -t filter -p icmp –dport $port -j ACCEPT done # Dropping startup requests iptables -A INPUT -t filter -p tcp –syn -j DROP # Restarting IP trap /etc/init.d/fail2ban start echo „Fire up IP trap again …“ ##### Restating PortSentry /etc/init.d/portsentry start ps -ef | grep „portsentry -tcp“ | grep -v grep | awk ‚{print $2}‘ > /var/run/portsentry-tcp.pid ps -ef | grep „portsentry -udp“ | grep -v grep | awk ‚{print $2}‘ > /var/run/portsentry-udp.pid ;; stop) /etc/init.d/portsentry stop /etc/init.d/fail2ban stop iptables -F iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT echo „Warning! Firewall is stopped, server is unprotected now!“ ;; restart) $0 stop sleep 1 $0 start ;; *) echo „Usage $0 {start|stop|restart}“ ;; esac