Für eine zentrale Speicherung einiger meiner Daten (u. a. Daten zum Studium) nutze ich HiDrive. Die Nutzung unter Windows ist durch das vom Anbieter bereitgestellte Tool vergleichsweise unkompliziert, für die Nutzung unter Linux werden jedoch nur verschiedene Anleitungen durch den Anbieter zur Verfügung gestellt. Allerdings umfasst Linux (in meinem Fall Linux Mint) bereits out-of-the-box die meisten Tools und fehlende können aus den Repositories heruntergeladen werden.

Auf die Voraussetzungen achten

Linux bietet verschiedene Wege zur Einbindung von HiDrive in das Dateisystem. Bei den verfügbaren HiDrive-Angeboten ist zunächst zu prüfen, welche Protokolle (z. B. git oder WebDAV) für die Einbindung in das Dateisystem durch den Anbieter bereitgestellt werden bzw. im gebuchten HiDrive-Angebot enthalten sind. Bei einige Anbieter muss ggf. eine Zusatzoption (z. B. unter der Bezeichnung Protokollpaket) hinzugebucht werden. In meinem HiDrive-Angebot besteht die Möglichkeit der Einbindung in das Dateisystem über FTP over TLS (FTPS), ein Git-Repository, remote sync (Rsync), Secure Copy (SCP), Secure File Transfer Protocol (SFTP), Server Message Block (SMB) und Web-based Distributed Authoring and Versioning (WebDAV).

Ebenso ist bei der Nutzung der Zwei-Faktor-Authentifizierung (2FA) zu beachten, dass eine automatische Einbindung ggf. nicht möglich ist und die Einbindung in das Dateisystem manuell vorgenommen werden muss. Bei meinem Anbieter wird das Einmalpasswort (engl. One-Time-Password, OTP) für die 2FA beispielsweise zusammen mit einem Doppelpunkt an das Benutzerkontopasswort angehängt (also Mein geheimes Passwort:OTP) [1].

Wie aus der Überschrift ersichtlich ist, habe ich mich für die Einbindung meines HiDrive-Speichers via WebDAV entschieden. Im Netz gibt es diverse Beschreibungen, wie die Einbindung des HiDrive-Speichers per WebDAV in das Linux-Dateisystem konfiguriert wird. Für meine Zwecke habe ich mich an die Beschreibungen aus dem Wiki von ubuntuusers.de [2] und bei STRATO [3] orientiert.

Vorbereitungen am Linux-System für die (Semi-)Automatisierung der Einbindung per Bash-Script

Um mir das Leben etwas leichter zu machen, habe ich mir ein kleines Bash-Script geschrieben und die wesentlichen Befehle in diesem hinterlegt. Ebenso habe ich einige Konfigurationen auf meinem Linux-System vorgenommen (z. B. die Hinterlegung des HiDrive-Speichers in der fstab-Datei), um den Aufwand etwas zu reduzieren. Das Bash-Script ist derzeit für den Verbindungsaufbau zu einem HiDrive-Speicher unter Berücksichtigung der 2FA geschrieben und kann über mein github-Repository [4] bezogen werden. Es ist momentan noch sehr rudimentär aufgebaut und könnte noch um einige weitere Funktionen (z. B. eine grafische Oberfläche, Einbindung mehrerer HiDrive-Speicher per WebDAV) aufgebohrt werden.

Zunächst sind die in der Anleitung auf ubuntuusers.de beschriebenen Pakete ca-certificates und davfs2 zu installieren. Bei der Installation von davfs2 erfolgt eine Abfrage, ob jedem Linux-Benutzer das Einbindungen (mount) von WebDAV-Laufwerken erlaubt sein soll (setzen des SUID-Bits). Diese Abfrage sollte mit JA beantwortet werden [2].

Damit unprivilegierte Benutzer (also Benutzer ohne root-Rechte) den mount-Befehlen für das WebDAV-Dateisystem auch ohne sudo ausführen können, müssen die jeweiligen Linux-Benutzerkonten noch der Gruppe davfs2 hinzugefügt werden. Dies erledigt der folgende Befehl [2]:

sudo usermod -aG davfs2 <Benutzername>

Die Parameter -aG stehen für add und Group (füge der Gruppe hinzu).

In der fstab-Datei (File System Table [5], Pfad /etc/fstab) wird folgende Zeile hinterlegt [2]:

<URL zum HiDrive> <Pfad Zielverzeichnis> davfs noauto,user,rw 0 0

Beim ersten Parameter <URL zum HiDrive> wird die vom HiDrive-Anbieter für die Einbindnug per WebDAV vorgegebene URL hinterlegt. Der zweite Parameter <Pfad Zielverzeichnis> gibt den Ort zur Einbindung im eigenen Linux-Dateisystem wieder (z. B. /mnt/hidrive oder /home/<User>/hidrive bzw. ~/hidrive). Es folgt die Angabe des Dateisystemtyps davfs.

Der vierte Parameter umfasst die Angabe zu den Optionen. Hier sollte die Option noauto gesetzt werden, da für die Einbindung des HiDrive-Speichers eine Netzwerkverbindung zwingend und zum Zeitpunkt des Einlesens und Einbindens der Dateisysteme aus der fstab i. d. R. aber noch nicht verfügbar ist. Die Einbindung muss daher zu einem späteren Zeitpunkt erfolgen (z. B. nach erfolgreichem Login am Linux-System). Die Option user gewährleistet, dass die Einbindung mit den Benutzerrechten des eingeloggten Benutzers erfolgt. Per rw wird festgelegt, dass Daten des Dateisystem gelesen und geschrieben werden dürfen. Per Option uid=username kann auch der HiDrive-Benutzername fest hinterlegt werden, sodass bei der Authentifizierung am HiDrive-Speicher nur noch das Passwort und das OTP angegeben werden müssen. Diese Option ist eine davfs-spezifische Option und nicht für jeden Dateisystemtypen verfügbar. Ich habe auf die Angabe dieser Option verzichtet, um HiDrive-Speicher anderer Benutzer einbinden zu können. Weitere Optionen zum WebDAV-Dateisystem davfs werden unter [6] erläutert.

Die letzten beiden Parameter (jeweils die Ziffer 0) konfigurieren die Berücksichtigung des HiDrive-Speichers durch das Backup-Programm dump (5. Parameter, erste Ziffer) und die Dateisystemprüfung (6. Parameter, zweite Ziffer). Mit der 0 wird für das Backup-Programm dump festgelegt, dass der HiDrive-Speicher nicht gesichert werden soll. Für die Dateisystemprüfung legt die 0 fest, dass keine regelmäßige Prüfung erfolgen soll [7].

Die feste Konfiguration in der fstab-Datei hat den Vorteil, dass die Einbindung per mount nur mit der Angabe des Zielverzeichnisses erfolgen kann. Erfolgt die Einbindung per WebDAV beispielsweise im Verzeichnis ~/hidrive, reicht folgender Befehl zur Einbindung aus:

mount ~/hidrive

Es werden dann die Zugangsdaten abgefragt und nach dessen Eingabe sind die im HiDrive-Speicher verfügbaren Daten unter ~/hidrive verfügbar. Die Einbindung erfolgt hier im Home-Verzeichnis des jeweiligen Benutzers, um mögliche Konflikte bei der Einbindung von verschiedenen HiDrive-Speichern durch verschiedene Benutzer vorzubeugen.

Ist für den HiDrive-Speicher kein 2FA konfiguriert, kann die automatisierte Einbindung durch Hinterlegung der Zugangsdaten in der Datei ~/.davfs2/secrets erfolgen. Der Aufbau der Datei folgt dem folgenden Schema aus [2]:

<WebDAV URL> <Benutzername> <Passwort>

Die Datei muss noch per chmod im Zugriff auf 600 eingeschränkt werden, damit ausschließlich das aktuelle Benutzer-konto auf die Zugangsdaten zugreifen kann.

chmod 600 ~/.davfs2/secrets

Das Bash-Script

Im Grunde reichen die vorherigen Schritte bereits aus, um den HiDrive-Speicher manuell in das Linux-System einzubinden. Ist kein 2FA konfiguriert, kann das Bash-Script für die automatische Einbindung mit den folgenden Zweizeiler realisiert werden:

#!/bin/bash
mount ~/hidrive

Zur Verbesserung der Sicherheit der im HiDrive-Speicher hinterlegten Daten können verschiedene Mechanismen herangezogen werden (z. B. 2FA oder Ende-zu-Ende-Verschlüsselung der Daten). Welche Sicherheitsmechanismen verfügbar sind hängt letztendlich vom Anbieter ab. Es sollte vorher geprüft werden, ob der Anbieter die Sicherheitsmechanismen auch für die Einbindung unter Linux unterstützt. Strato beispielsweise unterstützt derzeit die Ende-zu-Ende-Verschlüsselung unter Linux nicht [8]. In diesem Beitrag gehe ich daher nur auf die Berücksichtigung von 2FA ein.

Wie bereits oben beschrieben, wird das OTP jeweils zusammen mit dem Doppelpunkt ans Ende des Zugangspassworts angehängt und beim Anbieter dann während des Authentifizierungsverfahrens mit abgeprüft. Das OTP wechselt alle 60 Sekunden und kann somit nicht fest bei den Zugangsdaten unter ~/.davfs2/secrets hinterlegt bzw. muss jeweils dann immer aktualisiert werden.

Das Problem kann auf zweierlei Wege im Bash-Script gelöst werden. Lösungsweg 1 fragt jeweils die Daten (URL zum HiDrive, Benutzername, Passwort und OTP) ab und verwendet diese dann beim Einbinden des HiDrive-Speichers. Die Variante Lösungsweg 2 nutzt die in der ~/.davfs2/secrets hinterlegten Daten, fragt nur das OTP vom Benutzer ab und ändert dann in der ~/.davfs2/secrets jeweils das hinterlegte OTP.

Es wird für beide Lösungswege der Einfachheit angenommen, dass nur ein HiDrive-Speicher/WebDAV-Verbindungen eingebunden werden soll. Um mehrere HiDrive-Speicher/WebDAV-Verbindungen einzubinden wären die Bash-Scripte zu beiden Lösungswegen entsprechend anzupassen.

Das Bash-Script für Lösungsweg 1 ist wie folgt aufgebaut:

#!/bin/bash
# statische Variablen
file=~/.davfs2/secrets

# Schritt 1: username, passwort und otp abfragen und zwischenspeichern
read -p "Bitte gebe die URL zum HiDrive-Speicher ein: " url
read -p "Bitte gebe dein Benutzernamen ein: " user
read -p "Bitte gebe das Passwort ein: " -s upw
echo
read -p "Bitte gebe das Einmalpasswort (OTP) ein: " otp

# Schritt 2: Logindaten in secret File schreiben
sed -i 1d $file
echo $url $user $upw:$otp >> $file

# Schritt 3: Einbinden
echo "Verbindungsaufbau zum HiDrive-Speicher via WebDAV..."
mount /mnt/hidrive

In Schritt 1 werden die URL zum HiDrive-Speicher und dazugehörigen Zugangsdaten samt OTP abgefragt und sind vom Benutzer einzugeben. Diese Daten werden in Schritt 2 dann in die ~/.davfs2/secrets zurückgeschrieben. Wahlweise können zumindest die Variablen url und user per url=<URL zum HiDrive-Speicher> und user=<Benutzername> fest im Bash-Script im Bereich der statischen Variablen gesetzt werden. Die entsprechenden Abfragezeilen sind dann zu löschen oder zumindest auszukommentieren.

Schritt 2 löscht zunächst die erste Zeile zum HiDrive-Speicher (Befehl sed -i 1d $file, zu sed siehe [9] und [10]). Anschließend werden die Zugriffsdaten neu in die ~/.davfs2/secrets per Umleitung [11] der Ausgabe in die Datei geschrieben.

Im letzten Schritt 3 wird dann für den Benutzer ein Hinweis auf der Konsole ausgegeben und der Versuch des Einbindens des HiDrive-Speichers angestoßen.

In Lösungsweg 2 wird das Bestehen der Datei ~/.davfs2/secrets und der dort enthaltenen Daten genutzt, um die statischen Zugangsdaten aus der Datei einzulesen und im Bash-Script weiterzuverwenden. Abgefragt wird dann nur noch das OTP als veränderliche Komponente der Zugangsdaten.

#!/bin/bash
# statische Variablen
file=~/.davfs2/secrets

# Schritt 1: Zugangsdaten aus $file einlesen
read ln < $file
IFS=' ' read -ra login <<< "$ln"
upw=$( echo ${login[2]} | awk '{ print substr( $0, 1, length($0)-7 ) }' )

# Schritt 2: OTP abfragen
read -p "Bitte gebe das Einmalpasswort (OTP) ein: " otp

# Schritt 3: Logindaten in secret File schreiben
sed -i 1d $file
echo ${login[0]} ${login[1]} $upw:$otp >> $file

# Schritt 4: Verbindungsaufbau
echo "Verbindungsaufbau zu HiDrive-Speicher via WebDAV..."
mount /mnt/hidrive

Die Schritte 2 und 3 aus Variante 1 werden identisch übernommen und als Schritt 3 und 4 ausgeführt. Im vormaligen Schritt 1 (nun Schritt 2) wird nur noch das Einmalpasswort (OTP) abgefragt. In einem neuen vorgeschalteten Schritt (der neue Schritt 1) erfolgt das Einlesen der Zugangsdaten aus der Datei ~/.davfs2/secrets.

Im neuen Schritt 1 wird zunächst die erste Zeile aus der secrets-Datei eingelesen und in der Variablen ln gespeichert. Die Zugangsdaten sind durch ein Leerzeichen getrennt, wodurch der String in der Variablen ln anhand des Trennzeichens (also dem Leerzeichen) aufgespalten werden muss (siehe [12]). Dies erfolgt anhand des Befehels IFS=' ' read -ra login <<< "$ln", in welchem anhand des Trennzeichens die Zugangsdaten in den Array gespeichert werden. Im Feld 0 des Arrays ist dann die URL zum HiDrive-Speicher, in Feld 1 der Benutzername und in Feld 2 das hinterlegte Passwort samt den OTP-Anhängsel gespeichert. Daher muss Feld 2 noch gekürzt werden.

Das Entfernen des OTP-Anteils im Passwort-String erfolgt über den Befehl upw=$( echo ${login[2]} | awk '{ print substr( $0, 1, length($0)-7 ) }' ) (vgl. auch [13]). Der Variablen upw wird das Ergebnis des nachfolgenden Befehls zugewiesen. Es wird das Passwort samt OTP-Anteil ausgegeben und die Ausgabe per Pipe-Operator an den awk-Befehl weitergeleitet. Der awk-Befehl führt dann die substr()-Funktion aus, dessen Parameter das Passwort, die Startposition ab dem 1. Zeichen und die Länge des zurückzugebenden Strings. Die Länge des zurückzugebenen Teilstrings umfasst dabei die Länge des Passworts -7, da das OTP 6 Zeichen lang ist zuzüglich dem Trennzeichen : und sich am Ende des Passwort-Strings befinden.

Der Rest ist wie gehabt, wobei die Dateneingabe des Benutzers auf das OTP beschränkt bleibt, die restlichen Abfragen also entfallen, und die Variablenbezeichnungen mit den in die secrets-Datei zu schreibenden Zugangsdaten angepasst werden müssen.

Da im Lösungsweg 2 die Daten aus der secrets-Datei eingelesen werden, muss diese Datei samt den Zugangsdaten vorhanden sein. Das Bash-Script könnte noch dahingehend erweitert werden, dass zunächst auf die Existenz der secrets-Datei geprüft wird und bei Nichtbestehen die Zugangsdaten wie im Lösungsweg 1 (Schritt 1) abgefragt werden.

(Semi-)Automatisierung der Einbindung per Bash-Script

Das Bash-Script wird im Verzeichnis ~/.local/bin unter der Bezeichnung hidrive.sh gespeichert. Das Bash-Script muss als ausführbar markiert werden, was via chmod erfolgt:

chmod 775 ~/.local/bin/hidrive.sh

Somit ist das Bash-Script für die Automatisierung vorbereitet. Für den Autostart ist unter ~/.config/autostart noch eine .desktop-Datei anzulegen (weitere Informationen siehe [14] und [15]). In meinem Fall heißt die Datei (mit vollständigen Pfad) ~/.config/autostart/hidrive.desktop und umfasst folgende Zeilen:

[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=true
Name=HiDrive Automount
Comment=Automatisches Einbinden einer HiDrive Ressource
Exec=/bin/bash ~/.local/bin/hidrive.sh
StartupNotify=true
Autostart-Delay=30
X-GNOME-Autostart-Delay=30

Die Bedeutung der einzelnen Zeilen der .desktop-Datei kann unter [15] nachgeschlagen werden. Der Autostart soll um 30 Sekunden verzögert werden (Zeilen Autostart-Delay=30und X-GNOME-Autostart-Delay=30, letzteres für den Cinnamon-Desktop). Da das OTP abgefragt werden muss, wird die Zeile Terminal=true zum Öffnen eines Terminalfensters für die Eingabe des OTP benötigt. Per StartupNotify=true wird eine Benachrichtigung über den Start des Bash-Scripts an den Desktop gesendet.

Die beiden Bash-Scripte können über mein github-Repository unter [4] heruntergeladen werden.

Quellen

[1] HiDrive 2-Faktor-Authentifizierung, FAQ-Beitrag auf strato.de, https://www.strato.de/faq/cloud-speicher/2-Faktor-Authentifizierung/ (Zugriff am 21. Dez. 2022).

[2] WebDAV, Wiki-Artikel auf ubuntuusers.de, https://wiki.ubuntuusers.de/WebDAV/ (Zugriff am 21. Dez. 2022).

[3] HiDrive auf einem Server einrichten, FAQ-Beitrag auf strato.de, https://www.strato.de/faq/cloud-speicher/hidrive-auf-einem-server-einrichten/#Einbindung%20mit%20Davfs2 (Zugriff am 21. Dez. 2022).

[4] GitHub-Repository zu den HiDrive Bash-Skripten, Tim Jaap, https://github.com/Ascony/hidrive-bashscript (Zugriff am 21. Dez. 2022).

[5] fstab, deutschsprachige Wikipedia, https://de.wikipedia.org/wiki/Fstab (Zugriff am 21. Dez. 2022).

[6] mount.davfs(8) - Linux man page, linux.die.net, https://linux.die.net/man/8/mount.davfs (Zugriff am 21. Dez. 2022).

[7] fstab, Wiki-Artikel auf ubuntuusers.de, https://wiki.ubuntuusers.de/fstab/ (Zugriff am 21. Dez. 2022).

[8] HiDrive Ende-zu-Ende-Verschlüsselung auf Ihrem Rechner, FAQ-Beitrag auf strato.de, https://www.strato.de/faq/cloud-speicher/hidrive-ende-zu-ende-verschluesselung-auf-ihrem-rechner/ (Zugriff am 21. Dez. 2022).

[9] sed, Wiki-Artikel auf ubuntuusers.de, https://wiki.ubuntuusers.de/sed/ (Zugriff am 21. Dez. 2022).

[10] Kapitel 12 Der Stream-Editor sed, Shell-Programmierung: Einführung, Praxis, Referenz von Jürgen Wolf, Bonn, Deutschland: Rheinwerk Verlag, 2005; Openbook-Version, https://openbook.rheinwerk-verlag.de/shell_programmierung/shell_014_000.htm#Xxx999276 (Zugriff am 21. Dez. 2022).

[11] Umleitungen, Wiki-Artikel auf ubuntuusers.de, https://wiki.ubuntuusers.de/Shell/Umleitungen/ (Zugriff am 21. Dez. 2022).

[12] How to Split String in Bash Script von Abhishek Prakash, linuxhandbook.com, https://linuxhandbook.com/bash-split-string/ (Zugriff am 21. Dez. 2022).

[13] Remove Last character from String in Linux von Pushpender007, geeksforgeeks.org, https://www.geeksforgeeks.org/remove-last-character-from-string-in-linux/ (Zugriff am 21. Dez. 2022).

[14] Autostart, Wiki-Artikel auf ubuntuusers.de, https://wiki.ubuntuusers.de/Autostart/ (Zugriff am 21. Dez. 2022).

[15] .desktop-Dateien, Wiki-Artikel auf ubuntuusers.de, https://wiki.ubuntuusers.de/.desktop-Dateien/ (Zugriff am 21. Dez. 2022).