Installation

Zunächst müssen wir mal den Portknocking-Server installieren, das machen wir, wie fast immer, aus den Ports:

# cd /usr/ports/security/knock/ && make install clean

Bei der Konfiguration können wir den Client erstmal deaktivieren, da wir die Paketabfolge von unserem Client, und nicht vom Server direkt abschicken werden. Bevor wir uns aber an die Konfiguration machen, schauen wir uns erstmal die wichtigsten Konfigurationsparameter an, die wir in der '/etc/rc.conf' in den Parameter "knockd_flags" eintragen.

  • -i: Damit legen wir fest auf welchem Interface der Server lauscht.
  • -d: Startet den Dienst im Hintergrund als Daemon
  • -v: Verbose-Mode für Status-Meldungen

Konfiguration

Um den Portknocking-Server starten zu können, tragen wir ihn in die '/etc/rc.conf' ein:

knockd_enable="YES"

Nachdem wir den Dienst grundsätzlich konfiguriert haben, können wir nun die verschiedenen Dienste bzw. Ports konfigurieren, die bei bestimmten Paketfolgen geöffnet werden sollen, bzw. Befehle die dann ausgeführt werden sollen.

Die Konfigurationsdatei '/usr/local/etc/knockd.conf' besteht aus mindestens zwei Bereichen, die mit Überschriften in eckigen Klammern eingeleitet werden. In den Bereich "[options]" werden die globalen Einstellungen geschrieben, die für alle Bereiche gelten sollen. Bei uns sieht dieser so aus:

[options]
logfile = /var/log/knockd.log
interface = rl0

Firewall anpassen

Um pf-Regeln dynamisch zu laden, denn das ist ja das Ziel unseres Portknocking-Servers, bedienen wir uns ANCHORS, die wir im pf-Tutorial vorgestellt haben. Wie das genau funktioniert kannst du dort nachlesen, ich gehe davon aus, dass du verstanden hast wie ANCHORS funktionieren.

Alternativ, und etwas sicherer, wäre der Einsatz von TABLES. Angenommen wir haben folgende Regel in unser '/etc/pf.conf':

table <ssh_allowed> persist
pass in on rl0 from <ssh_allowed> to any port 22 keep state

Dann könnten wir mit dem Befehl

pfctl -t ssh_allowed -T add %IP%

lediglich die eigene IP für den SSH-Port (hier: 22) freischalten. Diesen würden wir dann anstelle von "/sbin/pfctl -a open_ssh (...)" im unten gelisteten Beispiel eintragen.

Mit dem Befehl

pfctl -t ssh_allowed -T delete %IP%

wird die IP dann wieder "gesperrt".

Knockd-Regeln erstellen

Jetzt schreiben wir unseren ersten Konfigurationsteil für unseren ersten Port mit unserer ersten eigenen Abfolge...

[openssh]
sequence = 2772:udp,25:tcp,8080:tcp,666:udp,3732:tcp,53:udp,997:tcp
seq_timeout = 15
tcpflags = syn
start_command = /sbin/pfctl -a open_ssh -f /etc/pf_files/open_ssh.knockd
cmd_timeout = 15
stop_command = /sbin/pfctl -a open_ssh -F all

Aber was bedeuten die Parameter jetzt? Also der Reihe nach:

  • sequence: Hier geben wir eine Abfolge von Ports und das zugehörige Protokoll an, die als Schlüssel dienen. Hier also Port 2772 (UDP), dann Port 25 (TCP) usw.
  • seq_timeout: Zeitspanne die zur Verfügung steht die gesamte Abfolge abzuspulen. Wird sie überschritten wird die bisher abgespielte Sequenz verworfen.
  • tcpflags: Die Pakete müssen diese Parameter gesetzt haben um akzeptiert zu werden.
  • start_command: Befehl der ausgeführt wird, wenn die Squenzen übereinstimmen, also hier PF-Regeln laden.
  • cmd_timeout: Zeitspanne bis der Befehl stop_command ausgeführt wird. Dieser ist nur dann erforderlich, wenn der Parameter stop_command gesetzt ist.
  • stop_command: Befehl der ausgeführt wird, nachdem die Zeitspanne cmd_timeout abgelaufen ist.

Handhabung

Jetzt müssen wir uns vor dem Start des Daemons noch den knockd-Client besorgen und richtig konfigurieren. Dann kann es losgehen. Den Client kriegst du auf der knockd-Website. Der Aufruf ist ganz einfach. Du lädst dir die richtige Version für dein Betriebssystem herunter und rufst die Datei mit dem Zielhost und deiner gewählte "sequence" als Parameter auf, wobei du jedes ',' (Komma) durch eine Leerstelle ersetzt.

Wenn du jetzt den Daemon aktivierst und mit dem Client die Sequenz an deinen Server schickst, wird "start_command" ausgeführt. Die Einsatzmöglichkeiten sind somit sehr vielfältig...