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.