knockd und iptables
Es kann Situationen geben, in denen Dienste nur für ganze bestimmte Zwecke und Zeiten benötigt werden. Man kann nun entweder diese Dienste nur zeitweise starten, oder den Zugriff darauf per iptables
verhindern.
Allerdings ist es sehr umständlich dann immer für die Zeit der Nutzung den Dienst zu starten bzw. per iptables wieder freizugeben. Abhilfe schafft hier knockd
. Mithilfe von knockd kann man Regeln definieren, die den Start/die Freigabe des Dienstes automatisiert erlauben. Hierzu "klopft" man bestimmte Ports des Servers ab, macht man dies in korrekter Abfolge wird ein Befehl ausgeführt, der den Dienst entweder startet oder freigibt. Auf die gleiche Weise lassen sich Dienste beenden/sperren.## iptables ##
Bevor knockd
mit Hilfe von iptables
genutzt werden kann ist zunächst eine sinnvolle iptables-Konfiguration zu erstellen.
Beginnen wir mit einigen Regeln:
*filter
# create chain for knockd
-N knockd
-A INPUT -j knockd
# Allows all loopback traffic
-A INPUT -i lo -j ACCEPT
# Accept all esthablished inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow all outbound traffic
-A OUTPUT -j ACCEPT
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-level 7
# Allow services
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 25 -j ACCEPT
-A INPUT -p tcp --dport 143 -j ACCEPT
-A INPUT -p tcp --dport 993 -j ACCEPT
# Reject all other
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
Zunächst wird eine chain
für knockd erstellt und mit der INPUT
-Chain verbunden. So ist sichergestellt, dass die Regeln von knockd bevorzugt behandelt werden. Anschließend wird jedweder (eingehender) loopback-Traffic lo
erlaubt. Außerdem wird eine Regel erstellt, welche dafür sorgt, dass einmal hergestellte Verbindungen nicht durch andere Regeln unterbunden werden. Das ist insbesondere für SSH sehr wichtig, gerade dann, wenn man gerade dabei ist Regeln zu erstellen oder anzupassen. Andernfalls kann man sich durchaus aus dem System aussperren. Nun wird ausgehender Traffic generell erlaubt, wir wollen uns ja nur gegen Verbindungen von außen schützen. Da wir später jedweden eingehenden Traffic verbieten könnten wir auch kein ping mehr verwenden, daher erlauben wir dies explizit. Außerdem loggen wir noch alle Zugriffsversuche auf geschlossene Ports.
Nun erstellen wir noch Regeln für Dienste welche wir nach außen freigeben möchten, also z.B. Port 80 für http. Alle anderen Ports werden anschließend geschlossen.
Die so erstellten Regeln können wir nun mit iptables-restore < /etc/iptables.up.rules
aktivieren. Hierbei gehen eventuell die Chains von fail2ban
verloren, daher sollte dieser anschließend einmal neu gestartet werden /etc/init.d/fail2ban restart
.
Damit unsere Regeln bei jedem Neustart automatisch aktiv werden, und auch dann gelten, wenn sich an unserer Netzwerkkonfiguration etwas verändert, erstellen wir noch ein kleinen Script:
#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules
/etc/init.d/fail2ban restart
Sicherheitshalber wird auch hierbei der fail2ban
-Service neu gestartet. Die Datei muss nun natürlich noch ausführbar gemacht werden:
chmod +x /etc/network/if-pre-up.d/iptables.up.rules
```## knockd ##
Nun können wir mit der eigentlichen knockd-Konfiguration beginnen:
apt-get install knockd
Damit knockd startet ist folgende Anpassung nötig:
/etc/default/knockd
#
# knockd's default file, for generic sys config
#
control if we start knockd at init or not
1 = start
anything else = don't start
#
PLEASE EDIT /etc/knockd.conf BEFORE ENABLING
START_KNOCKD=1
command line options
KNOCKD_OPTS="-i eth0"
Nun kommt die eigentliche Konfiguration:
/etc/knockd.conf
[options] UseSyslog
[openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /sbin/iptables -A knockd -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
[closeSSH] sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/iptables -D knockd -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
Die Werte in den eckigen Klammern können frei gewählt werden, sollten aber sprechende Namen haben. Hier ist nun `[openSSH]` und `[closeSSH]` angelegt. openSSH wird ausgeführt, wenn an die Ports `7000`, `8000` und `9000` (in dieser Reihenfolge) geklopft wird. Dies muss innerhalb von 5 Sekunden passieren.
Ist dies der Fall wird der Befehl `command` ausgeführt. In diesem Fall wird eine iptables-Regel erstellt, welche für die "klopfende" IP den Port 22 freigibt. Benötigt man den Zugriff nicht mehr kann man die Regel durch "abklopfen" der Port `9000`, `8000` und `7000` wieder entfernen.
Anstelle von iptables-Regeln könnte man durch das "Klopfen" natürlich auch Dienste überhaupt erst starten bzw. wieder beenden:
* `command = /etc/init.d/ssh start`
* `command = /etc/init.d/ssh stop`
iptables-Regeln sind jedoch flexibler, dann man den Dienst so für interne Zwecke stets verfügbar halten kann, den Zugriff von außen aber sperrt und nur durch anklopfen freigibt. Außerdem wäre der Dienst eventuell so für alle benutzbar und nicht nur für die klopfende IP-Adresse.
Nun können wir knockd starten: `/etc/init.d/knockd start`## Nutzung ##
Grundsätzlich kann man das Anklopfen mit beliebigen Tools durchführen (z.B. telnet). Einfacher geht es aber mit dem Befehl `knock` welcher im Paket von `knockd` enthalten ist.
knock servername/ip 1000 2000 3000