D
derOli
Guest
Hallo zusammen.
Am Wochenende habe ich versucht die Sicherheit meines Servers durch die Installation eines Portknockers zu erhöhen. Die Installation an sich war nicht schwierig. Allerdings habe ich einige Zeit damit verbracht einen brauchbaren und einfach zu verwendenen Client für Windows zu finden.
Damit der nächste nicht ähnlich lange suchen muss, möchte die kurz auf die notwendigen Schritte eingehen. Die folgenden Schritte beziehen sich auf die Installation unter Debian Wheezy.
Grund der Absicherung per knockd
Aktuell wird mein Server durch fail2ban geschützt. Die Anmeldung per SSH als Root ist deaktiviert. Ebenso ist eine Anmeldung nur per private-key möglich. Dennoch laufen zahlreiche "Attacken" auf Port 22. Ein Verlegen des Ports würde hier sicherlich Abhilfe schaffen. Allerdings gibt es persönliche Gründe die dagegen sprechen. Daher habe ich mich für die Installation des knockd entschieden.
Vorteile von knockd
Der entsprechende SSH-Port kann durchgehend geschlossen bleiben. Nur dann, wenn eine Verbindung erforderlich ist, wird eine Ausnahme-Regel für den entsprechenden Client auf der Firewall generiert. Der entsprechende SSH-Port ist also nur temporär, für eine bestimmte IP zugänglich.
1. Installieren des knockd
2. Konfiguration von knockd
Das Config-File enthält nach der Installation eine Beispiel-Konfiguration für den SSH-Server. Sequence definiert die Ports und deren Reihenfolge, an die "angeklopft" werden muss, damit die damit verbundene Aktion (command) ausgeführt wird.
[openSSH] erstellt eine Regel per iptables, welche es dem "klopfenden" Client erlaubt, eine Verbindung zum SSH-Server auf Port 22 herzustellen.
"Klopft" der Client entsprechend der in [closeSSH] definierten Sequence, so wird die zuvor erstellte Regel wieder gelöscht, sodass der entsprechende Port wieder komplett geschlossen ist.
Wichtig: Ports, welche in der Sequence zum öffnen genannt werden, sollten nicht in der Sequence genannt werden, welche den Port wieder schließt und umgekehrt. Wird z.B. in der Sequence von [closeSSH] ebenfalls der Port 5000 angesprochen führt dies dazu, dass das "Klopfen" auf Port 5000 als Anfang der Sequence für [openSSH] interpretiert wird. [closeSSH] wird somit nicht ausgelöst.
3. Neustart des knockd
Nachdem die Konfigurations-Datei entsprechend angepasst wurde muss der Dienst neugestartet werden.
4. Portknocking-Client für Windows
Bemüth man Google auf der Suche nach einem Portknocking-Client für Windows, so finden sich einige mehr oder weniger brauchbare Varianten.
Ich selbst finde den Client von http://www.zeroflux.org/projects/knock sehr gelungen und einfach zu handhaben. Die Windows-Variante kann unter http://www.zeroflux.org/proj/knock/files/knock-win32.zip heruntergeladen werden.
Nach dem entpacken befindet sich im Ordner "Release" eine Datei namens "knock.exe". Diese kann wie folgt verwendet werden.
Damit die einzelnen Ports nicht jedesmal neu eingegeben werden müssen, habe ich mir zwei batch-files erstellt, welche die entsprechenden Informationen beinhalten.
Alternativ zu zwei einzelnen batch-files kan auch ein batch-file erstellt werden, welches sowohl die Sequenze zum Öffnen und Schließen beinhaltet. Zwischen beiden Sequenzen wird Putty gestartet.
5. Konfiguration der Firewall
Abschließend sollte erwähnt werden dass die ganze Maßnahme nur Sinn ergibt, wenn Anfragen auf dem SSH-Port per Default-Policy oder Regel verworfen werden. Ist dies nicht der Fall bringt auch der knockd nicht den gewünschten Effekt, da der Port ohnehin offen steht.
In meinem Beispiel sieht die Konfiguration der IP-Tables wie folgt aus:
Konstruktive Kritik und Verbesserungsvorschläge sind gerne gesehen.
Es grüßt
derOli
Am Wochenende habe ich versucht die Sicherheit meines Servers durch die Installation eines Portknockers zu erhöhen. Die Installation an sich war nicht schwierig. Allerdings habe ich einige Zeit damit verbracht einen brauchbaren und einfach zu verwendenen Client für Windows zu finden.
Damit der nächste nicht ähnlich lange suchen muss, möchte die kurz auf die notwendigen Schritte eingehen. Die folgenden Schritte beziehen sich auf die Installation unter Debian Wheezy.
Grund der Absicherung per knockd
Aktuell wird mein Server durch fail2ban geschützt. Die Anmeldung per SSH als Root ist deaktiviert. Ebenso ist eine Anmeldung nur per private-key möglich. Dennoch laufen zahlreiche "Attacken" auf Port 22. Ein Verlegen des Ports würde hier sicherlich Abhilfe schaffen. Allerdings gibt es persönliche Gründe die dagegen sprechen. Daher habe ich mich für die Installation des knockd entschieden.
Vorteile von knockd
Der entsprechende SSH-Port kann durchgehend geschlossen bleiben. Nur dann, wenn eine Verbindung erforderlich ist, wird eine Ausnahme-Regel für den entsprechenden Client auf der Firewall generiert. Der entsprechende SSH-Port ist also nur temporär, für eine bestimmte IP zugänglich.
1. Installieren des knockd
Code:
aptitude update
aptitude upgrade
aptitude install knockd
2. Konfiguration von knockd
Das Config-File enthält nach der Installation eine Beispiel-Konfiguration für den SSH-Server. Sequence definiert die Ports und deren Reihenfolge, an die "angeklopft" werden muss, damit die damit verbundene Aktion (command) ausgeführt wird.
[openSSH] erstellt eine Regel per iptables, welche es dem "klopfenden" Client erlaubt, eine Verbindung zum SSH-Server auf Port 22 herzustellen.
"Klopft" der Client entsprechend der in [closeSSH] definierten Sequence, so wird die zuvor erstellte Regel wieder gelöscht, sodass der entsprechende Port wieder komplett geschlossen ist.
Wichtig: Ports, welche in der Sequence zum öffnen genannt werden, sollten nicht in der Sequence genannt werden, welche den Port wieder schließt und umgekehrt. Wird z.B. in der Sequence von [closeSSH] ebenfalls der Port 5000 angesprochen führt dies dazu, dass das "Klopfen" auf Port 5000 als Anfang der Sequence für [openSSH] interpretiert wird. [closeSSH] wird somit nicht ausgelöst.
Code:
root@wheezy:~# nano /etc/knockd.conf
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 5000, 6000, 7000, 8000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000, 10000, 11000, 12000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
3. Neustart des knockd
Nachdem die Konfigurations-Datei entsprechend angepasst wurde muss der Dienst neugestartet werden.
Code:
service knockd restart
4. Portknocking-Client für Windows
Bemüth man Google auf der Suche nach einem Portknocking-Client für Windows, so finden sich einige mehr oder weniger brauchbare Varianten.
Ich selbst finde den Client von http://www.zeroflux.org/projects/knock sehr gelungen und einfach zu handhaben. Die Windows-Variante kann unter http://www.zeroflux.org/proj/knock/files/knock-win32.zip heruntergeladen werden.
Nach dem entpacken befindet sich im Ordner "Release" eine Datei namens "knock.exe". Diese kann wie folgt verwendet werden.
Code:
knock.exe [options] <host> <port[:protocol]> <port[:protocol]>
Damit die einzelnen Ports nicht jedesmal neu eingegeben werden müssen, habe ich mir zwei batch-files erstellt, welche die entsprechenden Informationen beinhalten.
Code:
[B]openSSH.bat[/B]
knock.exe deine-server-ip 5000:tcp 6000:tcp 7000:tcp 8000:tcp
[B]closeSSH.bat[/B]
knock.exe deine-server-ip 9000:tcp 10000:tcp 11000:tcp 12000:tcp
Alternativ zu zwei einzelnen batch-files kan auch ein batch-file erstellt werden, welches sowohl die Sequenze zum Öffnen und Schließen beinhaltet. Zwischen beiden Sequenzen wird Putty gestartet.
Code:
knock.exe deine-server-ip 5000:tcp 6000:tcp 7000:tcp 8000:tcp
start /w putty
knock.exe deine-server-ip 9000:tcp 10000:tcp 11000:tcp 12000:tcp
5. Konfiguration der Firewall
Abschließend sollte erwähnt werden dass die ganze Maßnahme nur Sinn ergibt, wenn Anfragen auf dem SSH-Port per Default-Policy oder Regel verworfen werden. Ist dies nicht der Fall bringt auch der knockd nicht den gewünschten Effekt, da der Port ohnehin offen steht.
In meinem Beispiel sieht die Konfiguration der IP-Tables wie folgt aus:
Code:
hain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Konstruktive Kritik und Verbesserungsvorschläge sind gerne gesehen.
Es grüßt
derOli
Last edited by a moderator: