ulm-store.de – SFTP

ulm-store.de – SFTP

ulm-store-Service mit SFTP

Der ulm-store-Service des IN-Ulm e.V. bietet seinen Nutzern unter der Domäne ulm-store.de Online-Speicher aka „Cloud Storage“ an. Dieser kann in je einer von aktuell drei Varianten zur Verfügung gestellt werden: Neben S3 und WebDAV, kann er auch mit dem SSH-File-Transfer-Protokoll gebucht werden. Je nach gewünschter Verwendung, spielt die eine oder andere Variante ihre Vorteile aus. Der Objektspeicher S3 ist sehr effizient wird von vielen Backup-Lösungen unterstützt, WebDAV ist dank HTTP sehr universell einsetzbar und SFTP gilt als besonders sicher und ist auf jedem aktuellen Unix-ähnlichen Betriebssystem leicht nutzbar.

In diesem Beitrag wollen wir den ulm-store-Service mit SSH-File-Transfer-Protokoll, kurz SFTP, und seine Integration ins lokale Dateisystem inklusive Data-At-Rest-Encryption zeigen. Vorschläge für weitere Anleitungen dieser Art können gern über unsere üblichen Kontaktmöglichkeiten eingereicht werden.

SFTP ist als Subsystem mit SSH v2 erschienen und ist nicht zu verwechseln mit dem Simple-File-Transfer-Protokoll (nutzt heute niemand mehr, hat das Acronym aber als erstes benutzt), FTPS (Erweiterung von FTP um TLS), FTP over SSH (tunneln von FTP via SSH), SCP (Secure Copy von SSH v1) oder sftp (secure file transfer program, ein SFTP Client).

Da SFTP, im Gegensatz zu seinem Vorgänger SCP, mehr Funktionen eines Remote-Dateisystems unterstützt (Verzeichnisse auflisten oder das Löschen entfernter Dateien), bietet es sich als Protokoll für Cloud-Speicher an. Der ulm-store-Service nutzt für die Bereitstellung von SFTP den OpenSSH sftp-server, als Subsystem vom OpenSSH-Daemon. Letzterer übernimmt dabei die Authentifizierung und unterstützt auch die Public-Key-Authentifizierung. Die authentifizierte SFTP-Sitzung stellt dem Nutzer nur ein Verzeichnis bereit, in welches geschrieben werden kann. Ein Zugriff per Secure Shell (SSH) und das Ausführen von Kommandos auf dem Service-Host ist nicht möglich.

Wie der Name schon suggeriert, ist SFTP nur für den gesicherten Transport der Daten von und zum Storage-Service zuständig, nicht aber für eine verschlüsselte Speicherung der Daten. Unverschlüsselte Daten speichert man aber nicht in einem Cloud-Speicher. Natürlich kann man die Daten manuell verschlüsseln und erst dann in den Cloud-Speicher transferieren; Sehr praktisch ist das aber nicht. Wir wollen zeigen, wie sich der  ulm-store-Service mit SFTP mit für den Endanwender transparenter Verschlüsselung nutzen lässt.

Jede Instanz eines ulm-store-SFTP-Service hat eine Id, ist mit einem Passwort gesichert und ist unter sftp://<id>@ulm-store.de erreichbar. Das root-Verzeichnis des Service ist nur lesbar. Das Unterverzeichnis data/ ist zum Speichern der Daten beschreibbar.

Einfacher Zugriff via sftp und Passwort

Für den Zugriff auf einen ulm-store-SFTP-Service benötigt man die Id seines Service und das Passwort. Auf Unix-ähnlichen Betriebssystemen bietet sich sftp als Client an. Interaktiv möchte man damit aber eher nicht arbeiten; Graphische Tools oder Desktop-Umgebungen haben meist hübsche Wrapper darum: Beispielsweise einfach mal sftp://<id>@ulm-store.de in die Location-Zeile vom Dateibrowser eingeben. Als Windows-User kann man WinSCP installieren und nutzen – der Windows-Dateibrowser machte bei mir aus sftp:// selbstständig ftp:// und scheint sftp nicht zu beherrschen.

Public-Key-Authentifizierung

Der authentifizierende SSH-Daemon beachtet die Datei data/.authorized_keys und erwartet das AUTHORIZED_KEYS FILE FORMAT. Diese Datei hat, anders als die übliche Datei in ~/.ssh/, einen . am Anfang. Mit sftp und einem Public-Key aus ~/.ssh/ lässt sich die Datei leicht anlegen (die Service-Id in den folgenden Beispielen ist „abc“):

trv@T480s:~$ sftp abc@ulm-store.de
abc@ulm-store.de's password: 
Connected to ulm-store.de.
sftp> ls
data readme.txt 
sftp> cd data
sftp> put .ssh/id_rsa.pub .authorized_keys
Uploading .ssh/id_rsa.pub to /data/.authorized_keys
.ssh/id_rsa.pub                                                             100%  744    48.3KB/s   00:00    
sftp> bye
trv@T480s:~$ 

Beim nächsten Aufbau einer sftp-Session sollte die Eingabe des Passwortes nicht erscheinen:

trv@T480s:~$ sftp abc@ulm-store.de
Connected to ulm-store.de.
sftp> version
SFTP protocol version 3
sftp> bye
trv@T480s:~$

Dateisystem-Mount mit FUSE

Der ulm-store-SFTP-Service lässt sich auch als „filesystem in userspace“ (FUSE) einbinden. Hierfür wird der „filesystem client based on ssh„, kurz SSHFS, verwendet. Unter Debian-basierten Betriebssystemen oder Archlinux steckt er im gleichnamigen Paket „sshfs“.

Da wir nur das data/-Verzeichnis beschreiben können, mounten wir auch nur dieses. Die Passworteingabe entfällt, weil wir die data/.authorized_keys-Datei bereits angelegt haben (s.o.). Der lokale Mountpoint soll – in Voraussicht auf das, was noch kommt, .ulm-store.sftp lauten.

trv@T480s:~$ mkdir .ulm-store.sftp
trv@T480s:~$ sshfs abc@ulm-store.de:data .ulm-store.sftp 
trv@T480s:~$ ls -a .ulm-store.sftp/
. .. .authorized_keys
trv@T480s:~$ df -h .ulm-store.sftp 
Filesystem                  Size  Used Avail Use% Mounted on
abc@ulm-store.de:data  2,0T  1,2T  867G  58% /home/trv/.ulm-store.sftp
trv@T480s:~$

Wie sowas mit systemd.(auto)mount oder autofs und/oder via /etc/fstab umzusetzen wäre, könne man bei Bedarf noch beschreiben.

Dateisystem-Mount mit Verschlüsselung

Um eine in der Benutzung transparente Ver- und Entschlüsselung der Daten zu bekommen, mounten wir ein verschlüsselndes Overlay-Dateisystem über das via sshfs eingebundene Dateisystem. Wir verwenden gocryptfs – unter Debian-basierten OS und Archlinux aus dem Paket „gocryptfs“. Andere verschlüsselnde Dateisyseme sind auch möglich – eine gute Übersicht gibt Comparison with Other Projects. Wegen dem geringeren Platzverbrauch und den vorhandenen Dateisystem-Features geben wir gocryptfs den Vorzug vor CryFS. encfs hat in Version 1.9.2 (bspw. in Linux Mint 19) ein Bug, der es unnutzbar macht. Wegen dem sowiso bestehenden Security-Problem in Version 1.x, ist es nicht in die engere Auswahl gekommen.

Der Mountpoint soll ulm-store.sftp lauten. Diesmal ohne Punkt davor, da diese Verzeichnis hauptächlich genutzt werden soll. Da sich gocryptfs nur in einem leeren Verzeichnis initialisieren lässt, erstellen wir eins vorab.

trv@T480s:~$ # im gemounteten Verzeichnis ein Verzeichnis für verschlüsselte Daten erstellen
trv@T480s:~$ mkdir .ulm-store.sftp/crypted
trv@T480s:~$
trv@T480s:~$ # initialisiere gocryptfs
trv@T480s:~$ gocryptfs -init .ulm-store.sftp/crypted/
Choose a password for protecting your files.
Password:
Repeat:
The gocryptfs filesystem has been created successfully.
You can now mount it using: gocryptfs ulm-store.sftp/crypted MOUNTPOINT
trv@T480s:~$
trv@T480s:~$ # Mountpoint für data-at-rest-encryption erstellen
trv@T480s:~$ mkdir ulm-store.sftp
trv@T480s:~$
trv@T480s:~$ # einbinden data-at-rest-encryption Verzeichnis
trv@T480s:~$ gocryptfs .ulm-store.sftp/crypted ulm-store.sftp
Password:
Decrypting master key

Your master key is:

xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx-
xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx

If the gocryptfs.conf file becomes corrupted or you ever forget your password,
there is only one hope for recovery: The master key. Print it to a piece of
paper and store it in a drawer. Use "-q" to suppress this message.

Filesystem mounted and ready.
trv@T480s:~$
trv@T480s:~$ # Testen der Verschlüsselung
trv@T480s:~$ # bis auf beiden gocryptfs-config Dateien ist das Verzeichnis leer
trv@T480s:~$ ls .ulm-store.sftp/crypted/
gocryptfs.conf gocryptfs.diriv
trv@T480s:~$
trv@T480s:~$ # wir legen eine Datei an
trv@T480s:~$ echo 'secret text' > ulm-store.sftp/crypted-file.txt
trv@T480s:~$
trv@T480s:~$ # ohne gocryptfs-Overlay is der Name der erstellten Datei nicht zu erkennen
trv@T480s:~$ ls .ulm-store.sftp/crypted/
gocryptfs.conf gocryptfs.diriv ZYmR48sEgVtIUvs5NpHhkF9Nnk9LF1CoI2r2Y27pYm8
trv@T480s:~$
trv@T480s:~$ # mit gocryptfs-Overlay sehen wir die erstellte Datei
trv@T480s:~$ ls ulm-store.sftp/
encrypted-file.txt
trv@T480s:~$
trv@T480s:~$ # unentschlüsselt enthält die Datei keinen nutzbaren Inhalt
trv@T480s:~$ od -bc .ulm-store.sftp/crypted/ZYmR48sEgVtIUvs5NpHhkF9Nnk9LF1CoI2r2Y27pYm8
0000000 000 002 200 073 034 043 377 341 225 253 106 002 332 241 137 051
\0 002 200 ; 034 # 377 341 225 253 F 002 332 241 _ )
0000020 054 130 003 301 106 156 206 364 121 102 215 220 234 004 245 032
, X 003 301 F n 206 364 Q B 215 220 234 004 245 032
0000040 347 336 230 356 235 006 077 270 102 365 155 052 055 251 066 175
347 336 230 356 235 006 ? 270 B 365 m * - 251 6 }
0000060 261 030 331 214 336 307 267 204 246 124 335 162 340 353
261 030 331 214 336 307 267 204 246 T 335 r 340 353
0000076
trv@T480s:~$
trv@T480s:~$ # entschlüsselt enthält sie dagegen den 'secrettext'
trv@T480s:~$ od -bc ulm-store.sftp/crypted-file.txt
0000000 163 145 143 162 145 164 040 164 145 170 164 012
s e c r e t t e x t \n
0000014
trv@T480s:~$ 

Fertig erstmal.