Verschl├╝sselte Daten├╝bertragung mit spiped

Einf├╝hrung in den Secure Pipe Daemon

Zur sicheren Daten├╝bertragung einzelner Nachrichten hat sich PGP/GPG etabliert. F├╝r gesicherte, d.h. verschl├╝sselte Verbindungen gibt es SSH. Eine SSH-Sitzung wird jedoch unterbrochen, wenn die TCP-Verbindung abbricht. Der Secure Pipe Daemon (spiped) arbeitet als Daemon, wodurch man es mit einer best├Ąndigen, verschl├╝sselten Datenverbindung zu tun hat.

Im Gegensatz zu GPG und SSH kommt jedoch bei spiped eine symmetrische Verschl├╝sselung zum Einsatz. Der gemeinsame Schl├╝ssel muss also vor Verbindungsaufnahme ├╝ber einen sicheren Kanal ausgetauscht werden. Da spiped aus dem tarsnap-Projekt ÔÇĺ einer Online-Backup-L├Âsung ÔÇĺ stammt, ist es offenbar f├╝r gr├Âssere Datenmengen ausgelegt. Und hierzu ist eine symmetrische Verschl├╝sselung wesentlich effizienter als eine asymmetrische.

Beispiel: Sichere Daten├╝bertragung in Mittelerde

Die K├Ânigreiche Rohan und Gondor haben Leuchtfeuer eingerichtet, um einander im Ernstfall alarmieren zu k├Ânnen. Leider kann mit dieser Form der Kommunikation nur wenig Inhalt ausgetauscht werden. Werden die Leuchtfeuer entfacht, weiss das andere K├Ânigreich nur, dass es ein Problem gibt, und man zur Hilfe eilen soll.

Sauron ist bekannterweise besiegt worden, und in Rohan und Gondor besch├Ąftigt man sich nun mit dem Wiederaufbau. Hierzu m├Âchte man gerne schnell und sicher Informationen miteinander austauschen k├Ânnen. Nicht nur Textnachrichten, sondern vielleicht auch Konstruktionspl├Ąne im PDF-Format.

Der symmetrische Schl├╝ssel soll ├╝ber einen berittenen Boten ausgetauscht werden. Am Terminal sitzen Eomer (Rohan) und Faramir (Gondor). Eine stabile TCP-Verbindung ist ├╝ber Glasfaser gew├Ąhrleistet. (F├╝r die Fertigung der Kabel hat sich Legolas eigens eine Glatze rasiert, aber das war es ihm Wert.)

Auf zu Tod und Terminal!

Schl├╝sselgenerierung

Zuerst erstellt Eomer einen symmetrischen Schl├╝ssel, wozu er /dev/urandom verwendet. 32 Bytes sollten gen├╝gen. Diese werden base64-codiert, damit man den Schl├╝ssel besser auf Pergament schreiben kann (ja, in Mittelerde wurde aus Kompatibilit├Ątsgr├╝nden mitlerweile auch ASCII eingef├╝hrt):

$ dd if=/dev/urandom of=/dev/stdout bs=1 count=32 2>/dev/null | base64 | tee secret.key
jZNVa1at1EBA+Kqk7Xx7mD5N9X2KZCZ61uUv594qen4=

Dieser Schl├╝ssel wurde nun nach Gondor ├╝berbracht, sodass es auf beiden Seiten ein secret.key mit dem gleichen Inhalt gibt.

spiped starten

Wir ben├Âtigen zwei Kan├Ąle:

  1. einen verschl├╝sselnden Kanal von Rohan nach Gondor
  2. einen entschl├╝sselnden Kanal innerhalb von Gondor

Wir beschr├Ąnken uns auf die Einweg-Kommunikation von Rohan nach Gondor. Der R├╝ckweg erfolgt analog dazu.

Den verschl├╝sselnden Kanal ├Âffnen

Der verschl├╝sselnde Kanal wird folgendermassen aufseiten von Rohan eingerichtet (Voraussetzung: spiped ist installiert):

eomer@rohan:~$ spiped -e -s 0.0.0.0:2000 -t gondor:3000 -k secret.key

Der Parameter -e steht f├╝r “encrypt” (“verschl├╝sseln”). Die Parameter -s und -t stehen f├╝r “source” (“Quelle”) und “target” (“Ziel”). Mit -k wird die Datei mit dem Schl├╝ssel (“key”) angegeben. Der Prozess wurde automatisch als Daemon in den Hintergrund verschoben.

Aufseiten von Gondor k├Ânnte nun auch der entschl├╝sselnde Kanal eingerichtet werden. Zuerst soll aber einmal die Verschl├╝sselung getestet werden.

Daten mit netcat ├╝bertragen

F├╝r die Daten├╝bertragung ben├Âtigt man ein Werkzeug wie netcat, das bei einer Debian-Standardinstallation unter netcat-traditional schon dabei sein sollte.

Versuchen wir zuerst einmal eine ├ťbertragung ohne Entschl├╝sselung, um sicherzustellen, dass kein Klartext ankommt, und dass die Verbindung steht. H├Âren wir also aufseiten von Gondor auf Port 3000:

faramir@gondor:~$ nc -l -p 3000

Dieser Befehl (-l steht f├╝r “listen”, d.h. “horchen”, mit -p definiert man den Port) wartet nun blockierend auf Nachrichten, die auf Port 3000 ankommen.

Aufseiten von Rohan wird nun eine Nachricht geschickt:

eomer@rohan:~$ echo 'Mir hen koi Leberk├Ąs me.' | nc localhost 2000

Die dann ungef├Ąhr folgendermassen aufseiten von Gondor eintrifft:

´┐Ż´┐Ż16´┐Ż´┐Ż´┐Ż´┐Ż´┐ŻO´┐Ż´┐Ż´┐Ż´┐Ż(´┐Ż0       ŔĘúR´┐Ż´┐ŻÔľĺ´┐Żn´┐Ż´┐Ż´┐Ż

(Tipp: Mit reset kann das Terminal zur├╝ckgesetzt werden, falls es durch bestimmte Bytes etwas irritiert worden ist.)

Den entschl├╝sselnden Kanal ├Âffnen

Die Verschl├╝sselung funktioniert offenbar. Jetzt wollen wir aber die Meldungen auch entschl├╝sseln k├Ânnen. Aufseiten von Gondor wird nun der entschl├╝sselnde Kanal ge├Âffnet:

faramir@gondor:~$ spiped -d -s 0.0.0.0:3000 -t 127.0.0.1:4000 -k secret.key

Und wieder horcht man in Gondor aufmerksam, nun aber auf Port 4000:

faramir@gondor:~$ nc -l -p 4000

In Rohan sendet man einen weiteren Notruf aus:

echo 'Auch d Herrgottsbscheisserle sind ausgange.' | nc 127.0.0.1 2000

Der nun in Gondor entschl├╝sselt werden kann:

Auch d Herrgottsbscheisserle sind ausgange.

Eine Datei ├╝bertragen

Da man in Gondor nicht genau verstanden hat, was da in Rohan ausgegangen ist, schickt man kurzerhand eine Abbildung vom gew├╝nschten Gut (leberkaes.jpg):

In Gondor horcht man schon gespannt:

faramir@gondor:~$ nc -l -p 4000 > leberkaes.jpg

Und in Rohan macht man sich an die ├ťbertragung:

eomer@rohan:~$ nc -q 1 127.0.0.1 2000 <leberkaes.jpg

Das hat geklappt!

faramir@gondor:~$ file leberkaes.jpg
leberkaes.jpg: JPEG image data [ÔÇŽ]

Die sichere Verbindung steht. Jetzt braucht es nur noch einen sicheren Transportweg f├╝r Waren. Aber das ist nicht mehr unsere AbteilungÔÇŽ

Ports ├Âffnen

Falls das obige Beispiel nicht wie geschildert funktioniert, liegt es m├Âglicherweise daran, dass Port 3000 aufseiten von Gondor nicht ge├Âffnet ist. Mithilfe von ufw kann das folgendermassen bewerkstelligt werden:

faramir@gondor:~$ sudo su -
# root@gondor:~# ufw allow 22/tcp
# root@gondor:~# ufw allow 3000/tcp
# root@gondor:~# ufw enable

Port 22 (SSH) wurde sicherheitshalber auch gleich mitge├Âffnet, um ein Aussperren vom Server beim n├Ąchsten SSH-Verbindungsversuch zu verhindern.

├ťbungen

In diese Beitrag wurde v.a. der grundlegenden Mechanismus erkl├Ąrt. Rein praktisch gibt es sicherlich noch Diskussionsbedarf: Ist die Schl├╝sselgenerierung sinnvoll? Wie k├Ânnte man sonst noch Daten ├╝bertragen, d.h. nicht mit nc, sondern etwas komfortabler? Wie macht man das mit der Firewall? Warum nutzt man nicht einfach scp? Gibt es weitere Verwendungszwecke f├╝r spiped?