knockd und iptables

imported

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:

``` /etc/iptables.up.rules>
*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:

``` /etc/network/if-pre-up.d/iptables.up.rules>
#!/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


Comments

Blog Comments powered by Disqus.

Next Post Previous Post