Android: Sicherer Zugriff auf SSH-Server per Public-Key-Authentifizierung via Termux, OpenKeyChain & YubiKey

Aktuell stand ich vor der Frage, wie ich mich mit meinem Android-Smartphone per SSH mit meinem SSH-Server verbinden kann. Die Anmeldung sollte dabei per Public-Key-Authentifizierung möglich sein. Zudem wollte ich meinen GPG-Authentifizierungs-Unterschlüssel, der sich auf meinem YubiKey befindet, als SSH-Schlüssel/Key verwenden.

In diesem Beitrag beschreibe ich euch, wie ich das Ganze mit den Open-Source-Apps Termux, OkcAgent und OpenKeychain umgesetzt bekommen habe.

Folgende Software wurde verwendet:
  • Ubuntu v20.04 LTS
  • OpenSSH v8.2p1 Ubuntu-4ubuntu0.2, OpenSSL 1.1.1f 31 Mar 2020 (unter Ubuntu)
  • OpenSSH v8.6p1, OpenSSL 1.1.1k 31 Mar 2021 (unter LineageOS)
  • LineageOS v18.1
  • Termux v0.113 (F-Droid-Version)
  • OkcAgent v0.2.3 (F-Droid-Version)
  • OpenKeychain v5.7.5 (F-Droid-Version)
  • YubiKey Neo

Voraussetzungen

Ich gehe in diesem Beitrag nicht auf jedes Detail ein, weshalb folgende Punkte als vorausgesetzt angesehen werden:

  • SSH-Server - installiert & eingerichtet
    • über das Netzwerk durch euer Android-Smarthone erreichbar
    • Public-Key-Authentifizierung aktiviert
    • öffentlicher SSH-Schlüssel (Public-SSH-Key) in der Datei authorized_keys hinterlegt - befindet sich im Verzeichnis /home/user/.ssh des Benutzers mit dem ihr euch anmelden wollt
  • YubiKey mit NFC-Funktion und eingerichteten GPG-Schlüsseln
  • Android-Smartphone
    • die o.g. Apps Termux, OkcAgent und OpenKeychain sind installiert
    • OpenKeychain ist bereits mit eurem YubiKey eingerichtet
Hinweis YubiKey, Security-Token & NFC

Anstatt eines YubiKeys könnt ihr natürlich auch einen anderen Hardware-Security-Token, wie z.B. einen NitroKey, verwenden. Zudem werden wohl auch Security-Token ohne NFC alternativ per USB/OTG unterstützt.
Nähere Informationen hierzu siehe: OpenKeychain: Supported NFC/USB Security Keys

Android - Termux & OkcAgent einrichten

Bei Termux handelt es sich um einen Terminal-Emulator. Termux verfügt wie andere Linux-Distributionen über ein eigenes Paket-Repository. Die Pakete werden durch die Termux-Entwickler gebaut und signiert (Details siehe Termux-Wiki: Package Management).

Standardmäßig ist unter Termux kein SSH-Client installiert. Außerdem verfügt Termux derzeit über keine OpenKeychain-Integration. Hierfür gibt es glücklicherweise OkcAgent, welches als Schnittstelle zwischen Termux und OpenKeychain dient. OkcAgent besteht dabei aus einem eigenständigen Termux-Paket sowie einer separaten Android-App. Das OkcAgent-Paket dient als SSH-Agent und Schnittstelle zwischen Termux und der OkcAgent-App. Die OkcAgent-App wiederum sorgt für die Verbindung zur OpenKeychain-App.

Termux - SSH- und OkcAgent-Paket installieren und einrichten

Startet Termux und stellt zuallererst sicher, dass alle Pakete aktuell sind:

pkg upgrade
Terminal / Konsole

Nun installieren wir das SSH-Paket (Client als auch Server - für diesen Beitrag brauchen wir aber nur die Client-Funktionalität) und das OkcAgent-Paket:

pkg install openssh
pkg install okc-agents
Terminal / Konsole

Um dem System mitzuteilen, dass OkcAgent als SSH-Agent verwendet werden soll, bedarf es ein paar Zeilen Code (siehe OkcAgent: How to use). Diesen könnt ihr z.B. in die .profile-Datei eures Termux-Homeverzeichnis einfügen. Bei jedem Start von Termux wird so auch automatisch OkcAgent gestartet. Ich selbst habe den Code in eine Datei namens initSshAgent eingefügt und führe die Datei bei Bedarf aus:

if ! pgrep okc-ssh-agent > /dev/null; then
    okc-ssh-agent > "$PREFIX/tmp/okc-ssh-agent.env"
fi

source "$PREFIX/tmp/okc-ssh-agent.env"
Datei: ~/initSshAgent

Damit ist die Einrichtung von Termux soweit fertig.

OkcAgent einrichten

Jetzt muss die OkcAgent-App eingerichtet werden. In der OkcAgent-App müssen wir unseren in OpenKeychain hinterlegen SSH-Key auswählen. Wie bereits erwähnt, gehe ich auf die Einrichtung von OpenKeychain nicht weiter ein und gehe davon aus, dass ihr euren YubiKey bereits mit OpenKeychain eingerichtet habt. Bei mir sieht das z.B. wie folgt aus:

Android: OpenKeychain-Status - GPG-SubKeys vom YubiKey

Startet nun also die OkcAgent-App. In der App klickt ihr nun auf Add SSH Key:

Android: OkcAgent einrichten - SSH-Key auswählen

Wählt den SSH-Key aus, der später in Termux verwendet werden soll:

Android: OkcAgent einrichten - SSH-Key auswählen

Der ausgewählte Key sollte dann in der OkcAgent-App entsprechend angezeigt werden:

Android: OkcAgent einrichten - SSH-Key auswählen

Die Einrichtung ist nun soweit abgeschlossen.

SSH-Verbindung zw. Android und SSH-Server herstellen

Als erstes muss der OkcAgent und somit SSH-Agent in Termux gestartet werden. Wenn ihr, wie o.a. die Datei initSshAgent angelegt habt, dann führt diese nun wie folgt aus:

source initSshAgent
Agent pid 20916
Terminal / Konsole

Erhaltet ihr keinen Fehler und eine Ausgabe, wie oben aufgeführt, dann sollte der SSH-Agent erfolgreich gestartet sein. Zur Sicherheit könnt ihr auch folgenden Befehl ausführen, der euch nun euren öffentlichen SSH-Key anzeigen sollte:

ssh-add -L
ssh-rsa AAAAAB3[...] Stephan (codingblatt.de) [...]
Terminal / Konsole

Zuguterletzt stellt nun die SSH-Verbindung mit dem üblichen SSH-Client-Befehl her:

ssh user@mein-ssh-server
Terminal / Konsole

Ihr solltet nun die bekannte Aufforderung von OpenKeychain erhalten, die PIN eures YubiKeys einzugeben. Nach Eingabe der PIN, werdet ihr dann gebeten den YubiKey an euer Smartphone zu halten.

Android: SSH-Public-Key-Authentifizierung per OpenKeychain und YubiKey

Im Erfolgsfall solltet ihr nun auf eurem SSH-Server angemeldet sein.

Fazit

Dank dem Zusammenspiel mehrerer Open-Source-Apps kann ich unter Android auf meinen SSH-Server per Public-Key-Authentifizierung zugreifen. Zudem muss ich meinen dafür verwendeten privaten SSH-Schlüssel (streng genommen ist es mein GPG-Authentifizierungs-Unterschlüssel) nicht auf meinem Android-Smartphone speichern, sondern kann meinen YubiKey dafür verwenden.

Ihr könnt Termux auch Zugriff auf eure Dateien geben. Ihr könntet dann z.B. per rsync eure Dateien als Backup auf euren SSH-Server übertragen.

Feedback

Für Feedback zum Beitrag, seien es Fragen, Korrigierungen und/oder Anregungen, könnt ihr mir gerne eine Nachricht per E-Mail oder Mastodon schreiben (siehe Kontakt).