Good to Know Database

CentOS 5: Port Knocking einrichten


1. Einleitung

Port Knocking ist eine Methode um Ports in der Firewall für einen oder mehrere Clients auf Anfrage zu öffnen und zu schließen. Durch festgelegte Portanfragen welche der Knock-Daemon knockd überwacht, kann man einen Port öffnen und wieder schließen. Auf dem Linux-Server benötigt man neben dem knockd auch den Netfilter iptables. Das Senden der Anklopfsequenz übernimmt auf dem Client das Programm knock.

Im folgenden Tutorial möchte ich Ihnen zeigen wie Sie unter CentOS 5 Port Knocking einrichten und verwenden können.

2. knock und knockd installieren

Da knock und knockd sich nicht im CentOS 5 Repository befinden, laden Sie sich das für Ihre Architektur passende RPM-Paket aus dem Repository von Dag Wieërs herunter.

[root@centos5 ~] wget http://dag.wieers.com/rpm/packages/knock/knock-0.5-1.el5.rf.i386.rpm

[root@centos5 ~] wget http://dag.wieers.com/rpm/packages/knock/knock-0.5-1.el5.rf.x86_64.rpm

Nachdem Sie das benötigte RPM-Paket heruntergeladen haben, installieren Sie es wie folgt.

[root@centos5 ~] rpm -i knock-0.5-1.el5.rf.i386.rpm

[root@centos5 ~] rpm -i knock-0.5-1.el5.rf.x86_64.rpm

3. knockd konfigurieren

Nach der Installation müssen Sie die Konfigurationsdatei /etc/knockd.conf anpassen.

[root@centos5 ~] vi /etc/knockd.conf

Standadmäßig sieht die Konfigurationsdatei folgendermaßen aus.

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

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 9000,8000,7000
        seq_timeout = 5
        command     = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

Im Abschnitt [options] werden die allgemeinen Einstellungen für den knockd vorgenommen. Wie Sie sehen, ist hier nur die Direktive LogFile eingetragen, welche alle Meldungen des knockd in die angegebene Logdatei (/var/log/knockd.log) protokolliert. Alternativ können Sie die Meldungen mit der Direktive UseSyslog an den Syslog-Daemon übergeben lassen. Dieser protokolliert die Meldungen anschließend in der Logdatei /var/log/messages.

Sollten Sie mehrere Netzwerkkarten in Ihrem Server haben, können Sie im allgemeinen Bereich noch das Interface angeben, auf welchem später die Klopfzeichen ankommen werden. Dazu verwenden Sie die Direktive Interface wie im folgenden Beispiel.

        interface = eth0

Nach dem allgemeinen Teil der Konfigurationsdatei folgen Abschnitte, in welchen die einzelnen Klopfsequenzen definiert werden und was dadurch ausgelöst werden soll. Wie Sie sehen, sind standardmäßg bereits zwei Klopfsequenzen eingetragen, mit welchen der Port 22 geöffnet und wieder geschlossen werden kann.

In den eckigen Klammern wird ein Name für die Klopfsequenz angegeben. Durch die Direktive Sequence wird die Reihenfolge der Ports für das entsprechende Klopfzeichen angegeben. Wenn Sie die beiden Standardeinträge verwenden wollen, sollten Sie die Klopfsequenzen gegebenenfalls abändern. Wird bei einem Port kein Protokoll angegeben, wird automatisch TCP angenommen. Mit der Direktive Seq_Timeout wird der Timeout für die Klopfsequenz in Sekunden angegeben.

Die Firewall-Regel, welche bei der Erkennung einer korrekten Klopfsequenz eingetragen beziehungsweise gelöscht werden soll, wird mit der Direktive Command hinterlegt. Bei CentOS 5 befindet sich iptables übrigens im Verzeichnis /sbin. Aus diesem Grund müssen Sie die Pfadangaben in der Konfigurationsdatei anpassen. Der Platzhalter %IP% wird durch die IP-Adresse des anklopfenden Clients ersetzt. Das heißt für den Eintrag [openSSH], dass nur von dieser IP-Adresse auf den geöffneten Port zugegriffen werden kann.

Beim Eintrag [openSSH] in der Standardkonfiguration wird iptables mit der Option -A INPUT aufgerufen. Dadurch wird die neue Firewall-Regel an das Ende der INPUT-Chain gehängt. Sollte vorher bereits eine Regel bestehen, welche alle eingehenden Pakete ablehnt, wird der Port 22 trotz der neuen Firewall-Regel nicht erreichbar sein. Aus diesem Grund sollten Sie die Option -A durch -I ersetzen. Somit kann eine bereits bestehende Regel nicht die neue Regel beeinflussen.

Mit der Direktive TCPFlags können Sie eingehende TCP-Pakete ausfiltern, welche nicht die angegebenen Flags besitzen.

4. knockd für FTP konfigurieren

Da man knockd nicht nur für den SSH-Port einsetzen kann und es noch ein paar weitere Direktiven gibt welche Sie kennen lernen sollten, möchte ich in diesem Abschnitt eine Konfiguration vorstellen, mit welcher der Zugriff auf den FTP-Server freigegeben wird.

[opencloseFTP]
        sequence      = 1000,2000,3000
        seq_timeout   = 15
        start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport ftp -j ACCEPT
        cmd_timeout   = 10
        stop_command  = /sbin/iptables -D INPUT -s %IP% -p tcp --dport ftp -j ACCEPT
        tcpflags      = syn

Die meisten verwendeten Direktiven kennen Sie bereits aus dem vorhergehenden Abschnitt. Neu hinzugekommen sind die Direktiven Start_Command, Cmd_Timeout und Stop_Command. Sobald die korrekte Klopfsequenz erkannt wurde, wird die Direktive Start_Command ausgeführt. Durch die Direktive Cmd_Timeout wird eine Zeitspanne zwischen dem Ausführen des Befehls von Start_Command und dem Ausführen des Befehl von Stop_Command angegeben. Dadurch kann man einen Port nur für eine kurze Zeitspanne öffnen und anschließend mittels der Direktive Stop_Command wieder schließen.

Diese Vorgehensweise ist allerdings nur nutzbar, wenn in der Zeitspanne, in welcher der Port geöffnet ist, eine Verbindung zum entsprechenden Service aufgebaut wird und solange bestehen bleibt bis der Benutzer diese trennt.

5. knockd für HTTP konfigurieren

Wenn Sie den Port 80 freigeben wollen, können Sie die Variante aus dem vorhergehenden Abschnitt nicht verwenden. Bei HTTP wird für jeden Seitenaufruf eine neue Verbindung zum Server aufgebaut. Deshalb muss der Port 80 solange geöffnet sein, wie der Benutzer auf den Webserver zugreifen will.

[openHTTP]
        sequence      = 4000:udp,2000:tcp,6000:udp
        seq_timeout   = 15
        tcpflags      = syn
        command       = /sbin/iptables -I INPUT -s %IP% -p tcp --dport http -j ACCEPT

[closeHTTP]
        sequence      = 4100:udp,2100:tcp,6100:udp
        seq_timeout   = 15
        tcpflags      = syn
        command       = /sbin/iptables -D INPUT -s %IP% -p tcp --dport http -j ACCEPT

6. knockd starten

Standardmäßig wird knockd ohne Init-Skripte installiert. Das heißt, Sie müssen den Knock-Daemon mit dem folgenden Befehl starten.

[root@centos5 ~] /usr/sbin/knockd &

Damit man nachvollziehen kann ob die Klopfzeichen ankommen und vom Daemon erkannt werden, sollten Sie das Logfile öffnen.

[root@centos5 ~] tail -f /var/log/knockd.log

7. Init-Skript erstellen

Da wir den Knock-Daemon auch beim Systemstart automatisch starten wollen, erstellen wir ein einfaches Init-Skript für den knockd.

[root@centos5 ~]# vi /etc/rc.d/init.d/knockd

Das folgende Skript ermöglicht das Starten, Stoppen und Neustarten des Knock-Daemons. Kopieren Sie den Code in die Datei /etc/rc.d/init.d/knockd.

#!/bin/sh
# chkconfig: - 99 00
# description: Start and stop knockd

# Check that config file exist
[ -f /etc/knockd.conf ] || exit 0

# Source function library
. /etc/rc.d/init.d/functions

# Source networking configuration
. /etc/sysconfig/network

# Check that networking is up
[ "$NETWORKING" = "no" ] && exit 0

start() {
  echo "Starting knockd ..."
  /usr/sbin/knockd &
  }

stop() {
  echo "Shutting down knockd ..."
  kill `pidof /usr/sbin/knockd`
  }

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    ;;
esac

exit 0

Nachdem das Init-Skript erstellt wurde, ändern Sie die Zugriffsberechtigungen der Datei.

[root@centos5 ~]# chmod 755 /etc/rc.d/init.d/knockd

Anschließend wird der Service knockd mit den folgenden Befehlen erstellt und im Runlevel 3 und 5 aktiviert.

[root@centos5 ~]# chkconfig --add knockd
[root@centos5 ~]# chkconfig --level 35 knockd on

Der soeben erstellte Service kann jetzt gestartet werden.

[root@centos5 ~]# service knockd start

8. Anklopfen mit knock

Mit dem Befehl knock können Sie eine Klopfsequenz an den Linux-Server senden. Durch die Option -v werden zusätzliche Statusmeldungen ausgegeben. Danach folgen die IP-Adresse des Servers, die Ports und die Netzwerkprotokolle welche zum Öffnen des entsprechenden Ports führen.

[root@centos5 ~]# knock -v 192.168.10.1 7000:tcp 8000:tcp 9000:tcp
hitting tcp 192.168.10.1:7000
hitting tcp 192.168.10.1:8000
hitting tcp 192.168.10.1:9000

Wenn Sie auf dem Server das Logfile noch geöffnet haben, sollten Sie jetzt die folgenden Ausgaben sehen.

[2010-04-29 18:46] 192.168.10.2: openSSH: Stage 1
[2010-04-29 18:46] 192.168.10.2: openSSH: Stage 2
[2010-04-29 18:46] 192.168.10.2: openSSH: Stage 3
[2010-04-29 18:46] 192.168.10.2: openSSH: OPEN SESAME
[2010-04-29 18:46] openSSH: running command: /sbin/iptables -I INPUT -s 192.168.10.2 -p tcp --dport 22 -j ACCEPT


Dieser Eintrag wurde am 29.04.2010 erstellt und zuletzt am 19.05.2012 bearbeitet.

Direkter Link zu dieser Seite: http://www.gtkdb.de/index_33_958.html

[ Zur Startseite ]   [ Zur Kategorie ]


Valid XHTML 1.0 Transitional Valid CSS Valid Atom 1.0

© 2004-2018 by Georg Kainzbauer