Login
Newsletter
Werbung

So, 17. Januar 2010, 20:00

fwknopd - Portknocking der nächsten Generation

Konfiguration Client

Installieren Sie zuerst fwknop-client. Sie können ihn auf diese Art starten:

fwknop -A 'tcp/22' -a 192.168.1.10 -D 192.168.1.20

Starting fwknop client (SPA mode)...
        Enter an encryption key. This key must match a key in the file
        /etc/fwknop/access.conf on the remote system.

Encryption Key:

Building encrypted Single Packet Authorization (SPA) message...
        Packet fields:

Random data:    6576449485301062
                Username:       home
                Timestamp:      1263418373
                Version:        1.9.11
                Type:           1 (access mode)
                Access:         192.168.1.10,tcp/22
                SHA256 digest:  aw7c9mCDIq3DK+4Uy3Fn+SYU4g4S0ckK2E1dqvsGTN0

Sending 182 byte message to 192.168.1.20 over udp/62201...

Erklärung der Parameter:

  • -A: Hier geben Sie an, welcher Port geöffnet werden soll. Dies muss natürlich einer oder alle der OPEN_PORTS aus /etc/fwknop/access.conf sein.
  • -a: Dies ist Ihre lokale öffentliche IP-Adresse, von der Sie später auf den Dienst zugreifen.
  • -D: Server, auf dem fwknop-server läuft.

Sie werden hier auch nach dem Schlüssel gefragt, den wir in /etc/fwknop/access.conf angegeben hatten.

Die Standardkonfiguration ist, dass fwknopd den Netzwerkverkehr auf UDP-Port 62201 überwacht. Dies bedeutet nicht, dass dieser Port auch offen ist. Man kann alternativ auch den Port zufällig wahlen lassen, dazu mehr in /etc/fwknop/fwknop.conf.

Als Alternative zu -a kann man auch -R verwenden. Dies ermittelt Ihre lokale öffentliche IP-Adresse mittels whatismyip.com und packt diese in das SPA-Paket. Ich habe die Erfahrung gemacht, dass dies oft nicht funktioniert. Da ich auch DynDNS verwende, habe ich mir so beholfen, meine öffentliche IP-Adresse stattdessen mittels -a anzugeben.

Hat man alles korrekt gemacht, passiert erst einmal nichts. Schaut man allerdings auf dem Server nach, findet man:

Jan 13 21:48:25 hostname fwknopd: received valid Rijndael encrypted packet from: 192.168.1.10, remote user: home, client version: 1.9.11 (SOURCE line num: 26)
        Jan 13 21:48:25 hostname fwknopd: add FWKNOP_INPUT 192.168.1.10 -> 0.0.0.0/0(tcp/22) ACCEPT rule 30 sec

Und das iptables-Regelwerk sieht wie folgt aus:

Chain INPUT (policy ACCEPT 7807 packets, 8614K bytes)
         pkts bytes target     prot opt in     out     source               destination
          624  214K FWKNOP_INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0
         1011  336K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED

Chain FWKNOP_INPUT (1 references)
         pkts bytes target     prot opt in     out     source               destination
            0     0 ACCEPT     tcp  --  *      *       127.0.0.1            0.0.0.0/0           tcp dpt:22

Das sieht gut aus. Wenn man die 30 Sekunden wartet und sich das iptables-Regelwerk nochmals anschaut, ist die Regel fuer den SSH-Zugriff verschwunden. Prima. Was will man mehr?

Man kann sich nun entweder mittels einem Shell-Alias behelfen, um den obigen fwknop-client-Befehl zu vereinfachen, man kann aber auch einfach fwknop --last-cmd eingeben, denn fwknop speichert das letzte Kommando in ~/.fwknop.run.

Verwenden von GPG-Keys - oder auch: Portknocking der Edelklasse

Als ich mir dies eingerichtet hatte, war ich erst einmal rundum glücklich. Ich brauchte mir keine Sorgen zu machen, dass SSH offen ist. Es hat einfach tadellos funktioniert, wann immer ich es brauchte. Was mich nervte, war, jedesmal diesen Schlüssel einzugeben. Ich hatte keine (sichere) Möglichkeit gefunden, dies irgendwie zu umgehen. Beim Herumstöbern bin ich dann uber das GPG-Howto gestolpert. Portknocking der Edelklasse! Hier eine freie Übersetzung dieser Seite.

Wir installieren gpg auf dem Server und erzeugen als Benutzer root einen neuen Schlüssel mit gpg --gen-key. Aus Sicherheitsgründen sollte dieser Schlüssel nur für fwknopd verwendet werden. Auf keinen Fall sollte man einen bestehenden Schlüssel verwenden, denn fwknopd benötigt das Passwort! Wählen Sie als Schlüsselgröße nur 2048 Bit oder kleiner. Dies ist nötig, weil ein SPA-Paket in einem einzigen IP-Paket Platz finden muss.

gpg --list-keys
        pub   1024D/ABCD1234 2006-05-01
        uid                  fwknop server key <fwknopd@localhost>
        sub   2048g/EFGH1234 2006-05-01
gpg -a --export ABCD1234 > server.asc

Auf dem Client kann man das gleiche machen. Falls man schon z.B. einen Schlüssel für E-Mail verwenden sollte, kann dieser auch verwendet werden. Die Schlüsselgröße ist hier beliebig.

gpg --gen-key
gpg --list-keys
        pub   1024D/1234ABCD 2006-05-01
        uid                  fwknop client key <fwknopd@localhost>
        sub   2048g/1234EFGH 2006-05-01
gpg -a --export 1234ABCD > client.asc

Nun kopiert man den öffentlichen Schlüssel vom Server zum Client (server.asc) und den öffentlichen Schlüssel vom Client zum Server (client.asc). Dann importiert und signiert man den Client-Schlüssel mit dem Serverschlüssel auf dem Server:

gpg --import client.asc
gpg --edit-key 1234ABCD
        Command> sign

Dasselbe machen wir auf dem Client, nur umgekehrt:

gpg --import server.asc
gpg --edit-key ABCD1234
        Command> sign

Nun müssen wir auf dem Server /etc/fwknop/access.conf modifizieren:

SOURCE: ANY;
        OPEN_PORTS: tcp/22;
        DATA_COLLECT_MODE: PCAP;
        GPG_REMOTE_ID: 1234ABCD;
        GPG_DECRYPT_ID: ABCD1234;
        GPG_DECRYPT_PW: <your decryption password>;
        GPG_HOME_DIR: /root/.gnupg;
        FW_ACCESS_TIMEOUT: 60;

Der Server-Schlüssel ist ABCD1234 und der Client-Schlüssel ist 1234ABCD. fwknopd muss auf den privaten Schlüssel zugreifen, daher muss man hier das Passwort angeben. Ich erspare mir das, denn ich bin der Meinung, es bringt keinen Sicherheitsvorteil.

Wenn man nun vom Client mittels

fwknop -A tcp/22 --gpg-recip ABCD1234 --gpg-sign 1234ABCD -a 192.168.1.10 -D 192.168.1.20

das mit GPG verschlüsselte und signierte SPA-Paket sendet, wird man mit

Jan 13 20:12:37 hostname fwknopd: adding FWKNOP_INPUT ACCEPT rule for 192.168.1.10 -> tcp/22 (10 seconds)
        Jan 13 10:13:09 hostname fwknopd: received valid GnuPG encrypted packet (signed with required key ID: 1234ABCD) from: 192.168.1.10, remote user: home

begrüßt.

Mehrere GPG-Clients

Wenn man von mehreren Rechnern zum gleichen Server SPA verwenden möchte, verfährt man für jeden Client wie oben beschrieben. Die Datei /etc/fwknop/access.conf sieht dann ein bisschen anders aus:

GPG_REMOTE_ID: 1234ABCD,4321ABCD;

Windows als fwknop-Client

Es gibt auch einen einfachen Windows-Client für fwknop.

Wenn man das obige verstanden hat, dürfte dieser Client kein Problem darstellen. Als Anmerkung möchte ich erwähnen, dass mit »PGP Private Key« der private Schlüssel des Clients gemeint ist, »PGP Public Key« dagegen den öffentlichen Schlüssel des Servers bezeichnet. Man kann auf der GPG-Webseite auch einen Kommandozeilen-Client für GPG herunterladen, der seinen Zweck erfüllt.

Debugging

Sollte es »einfach nicht funktionieren« wollen, kann es helfen, fwknopd im Debugging-Modus auszuführen.

/etc/init.d/fwknop-server stop
/usr/sbin/fwknopd -d

Schlusswort

Nun kann ich wieder ruhig schlafen. Ich brauche mir keine Sorgen um SSH-Brute-Force-Attacken mehr zu machen, denn die Firewall erlaubt einfach keinen Zugriff. So kann ich einfach jeden Dienst abschotten, der nicht für die Allgemeinheit bestimmt ist.

Und Portknocking mit GPG-verschlüsselten und signierten Paketen hat nicht jeder - allerdings hoffe ich, es werden jetzt einige mehr.

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung