splitt-it.de

my digital lifestyle

Mit PortSentry könnt Ihr ausgewählte Ports auf Port Scans überwachen und die Port Scan Quelle erst mal blocken. 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:

[cc lang=’text‘ line_numbers=’false‘]apt-get install portsentry[/cc]

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

[cc lang=’text‘ line_numbers=’false‘]KILL_ROUTE=[/cc]

beginnen auskommentiert sind. Wenn nicht, dann müssen diese Einträge auskommentiert werden.

Selbiges gilt für die folgenden Einträge:

[cc lang=’text‘ line_numbers=’false‘]TCP_PORTS=
UDP_PORTS=[/cc]

Anstatt dessen werden nun folgende Werte in die Datei eingetragen:

[cc lang=’text‘ line_numbers=’false‘]TCP_PORTS=“22,23″
UDP_PORTS=“22,23″
KILL_RUN_CMD=“/etc/portsentry/filtermgr -a $TARGET$“[/cc]

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:

[cc lang=’text‘ line_numbers=’false‘]BLOCK_UDP=“2″
BLOCK_TCP=“2″[/cc]
Jetzt wird das Script von Rob Schulze benötigt:

[cc lang=’text‘ line_numbers=’false‘]cd /etc/portsentry
wget http://www.rob-schulze.de/informatik/tutorials/portsentry/rcportsentry
chmod 700 rcportsentry[/cc]

Dieses Script muss editiert werden, u.a. muss hier der Pfad zur iptables und zum Pfad von der PortSentry-Konfiguration angegeben werden:

[cc lang=’text‘ line_numbers=’false‘]my $BASE_DIR=“/etc/portsentry“;
my $BLOCK_FILE=“/var/lib/portsentry/portsentry.blocked“;
my $IPTABLES_CMD=“/sbin/iptables“;
my $BLOCK_TIMEOUT=60*30;[/cc]

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:

[cc lang=’text‘ line_numbers=’false‘]*/30 * * * * /etc/portsentry/filtermgr -d[/cc]

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:

[cc lang=’text‘ line_numbers=’false‘]update-rc.d -f portsentry remove[/cc]

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

[cc lang=’text‘ line_numbers=’false‘]#!/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[/cc]

?