ADMIN
2023
03
2023-02-28T12:00:00
Hybrid Cloud
PRAXIS
048
Open-Source-Tipp
Kommunikation
Open Authorization 2.0
Passwortloser Zugriff
von Thorsten Scherf
Veröffentlicht in Ausgabe 03/2023 - PRAXIS
E-Mails lesen und versenden, ohne hierfür sein Passwort über das Netzwerk zu übertragen, ist eigentlich gar nicht so schwer. Der Open-Source-Tipp in diesem Monat zeigt, wie Sie den Mailclient NeoMutt konfigurieren müssen, um mithilfe des Protokolls Open Authorization 2.0 – OAuth2 – auf Ihr Gmail-Konto zuzugreifen.

Mutt [1] ist ein Klassiker unter den textbasierten Mailclients. Allerdings ist die Software schon knapp 30 Jahre alt und es existieren in der Entwickler-Community einige Spannungen, weil oftmals eingereichte Patches nicht angenommen werden. Als Konsequenz wurde vor einigen Jahren daher ein Fork der Software erzeugt, der als NeoMutt [2] bekannt ist. Letzteres soll in diesem Monat als Beispiel dienen, wie Sie ohne den Einsatz von Passwörtern auf Ihr Gmail-Postfach zugreifen. Der Verzicht auf Passwörter ist ja gerade in Zeiten, in denen immer mehr von Zero-Trust-Security [3] die Rede ist, ein wichtiger Baustein. Das Verwenden von Passwörtern kann gerade beim Zugriff auf Services großer Anbieter, wie beispielsweise Google, ein Sicherheitsproblem darstellen, da hiermit zumeist der Zugang zu einer Vielzahl an unterschiedlichen Diensten des Anbieters möglich ist.
Dieses Problem lässt sich jedoch relativ leicht lösen, indem Sie auf einfache Passwörter verzichten und stattdessen applikationsspezifische Zugangstoken einsetzen. Diese können entweder als statische Token vorliegen, die Sie manuell erzeugen und dann dauerhaft für den Zugang zu einem Service einsetzen, oder Sie greifen stattdessen auf das Protokoll OAuth2 [4] zurück. Letzteres nutzt, sehr vereinfacht dargestellt, eigentlich auch nichts anderes als dynamische Token, die Sie dann für einen bestimmten Zeitrahmen zur Autorisierung an einem Service einsetzen können. Danach verlieren diese Token jedoch ihre Gültigkeit und das Protokoll kümmert sich darum, ein neues Token von einem Authorization-Server zu beziehen.
OAuth2-Skript für NeoMutt
Wollen Sie das OAuth2-Protokoll zur Autorisierung eines Clients einsetzen, muss der Client dieses natürlich unterstützen. NeoMutt stellt einen OAuth2-Support für die Mailprotokolle IMAP, POP3 und SMTP mithilfe eines externen Skripts [5] zur Verfügung. Bevor Sie dieses jedoch in die NeoMutt-Konfiguration aufnehmen können, sind einige Anpassungen notwendig. So müssen Sie neben einer "client_id" und einem "client_secret" auch einen GPG-Key im Skript hinterlegen. Um zu verstehen, was es damit auf sich hat, ist ein kurzer Abstecher in den OAuth2-Protokollablauf hilfreich.
Mutt [1] ist ein Klassiker unter den textbasierten Mailclients. Allerdings ist die Software schon knapp 30 Jahre alt und es existieren in der Entwickler-Community einige Spannungen, weil oftmals eingereichte Patches nicht angenommen werden. Als Konsequenz wurde vor einigen Jahren daher ein Fork der Software erzeugt, der als NeoMutt [2] bekannt ist. Letzteres soll in diesem Monat als Beispiel dienen, wie Sie ohne den Einsatz von Passwörtern auf Ihr Gmail-Postfach zugreifen. Der Verzicht auf Passwörter ist ja gerade in Zeiten, in denen immer mehr von Zero-Trust-Security [3] die Rede ist, ein wichtiger Baustein. Das Verwenden von Passwörtern kann gerade beim Zugriff auf Services großer Anbieter, wie beispielsweise Google, ein Sicherheitsproblem darstellen, da hiermit zumeist der Zugang zu einer Vielzahl an unterschiedlichen Diensten des Anbieters möglich ist.
Dieses Problem lässt sich jedoch relativ leicht lösen, indem Sie auf einfache Passwörter verzichten und stattdessen applikationsspezifische Zugangstoken einsetzen. Diese können entweder als statische Token vorliegen, die Sie manuell erzeugen und dann dauerhaft für den Zugang zu einem Service einsetzen, oder Sie greifen stattdessen auf das Protokoll OAuth2 [4] zurück. Letzteres nutzt, sehr vereinfacht dargestellt, eigentlich auch nichts anderes als dynamische Token, die Sie dann für einen bestimmten Zeitrahmen zur Autorisierung an einem Service einsetzen können. Danach verlieren diese Token jedoch ihre Gültigkeit und das Protokoll kümmert sich darum, ein neues Token von einem Authorization-Server zu beziehen.
OAuth2-Skript für NeoMutt
Wollen Sie das OAuth2-Protokoll zur Autorisierung eines Clients einsetzen, muss der Client dieses natürlich unterstützen. NeoMutt stellt einen OAuth2-Support für die Mailprotokolle IMAP, POP3 und SMTP mithilfe eines externen Skripts [5] zur Verfügung. Bevor Sie dieses jedoch in die NeoMutt-Konfiguration aufnehmen können, sind einige Anpassungen notwendig. So müssen Sie neben einer "client_id" und einem "client_secret" auch einen GPG-Key im Skript hinterlegen. Um zu verstehen, was es damit auf sich hat, ist ein kurzer Abstecher in den OAuth2-Protokollablauf hilfreich.
Wenn Sie mittels OAuth2 einen Client gegenüber einem Service, beispielsweise Gmail, autorisieren möchten, benötigen Sie einen Access-Token. Einen solchen erhalten Sie von einem Authorization-Server, beispielsweise Google, wenn der Ressource-Owner, in diesem Fall der Gmail-Service, sein OK dafür gegeben hat. Mit diesem Token können Sie dann auf Ressourcen des Services zugreifen, solange er gültig ist. Danach benötigen Sie einen sogenannten Refresh-Token, um damit einen neuen Access-Token zu bekommen. Damit dieser Ablauf funktioniert, müssen Sie die Clientanwendung zuerst beim Authorization-Server registrieren.
Anwendung registrieren
Google stellt unter [6] einen Service zur Verfügung, mit dessen Hilfe Sie beliebige OAuth2-Clients registrieren. Hierfür erzeugen Sie in der Google API & Services Console ein neues Projekt, beispielsweise NeoMutt, und fügen diesem einige Informationen hinzu. So müssen Sie beispielsweise einen Scope für den Service definieren. Diesen wählen Sie aus einem Pull-Down-Menü aus.
Für den Gmail-Service lautet der Scope "https://mail.google.com/". Außerdem müssen Sie einen Clienttyp definieren und einen Clientbenutzer angeben. Dieser entspricht Ihrem Google-Account-Namen. Im Anschluss erhalten Sie dann die gewünschten "client_id" und "secret_id", die Sie in das NeoMutt-Skript "mutt_ oauth2.py" eintragen. Falls Sie keinen GPG-Schlüssel besitzen, erzeugen Sie mit dem folgenden Befehl einen solchen:
gpg --gen-key
Ersetzen Sie nun den String "YOUR_ GPG_IDENTITY" im Skript mit Ihrer Benutzter-ID, die Sie beim Anlegen des GPG-Schlüssels angegeben haben. Mithilfe des Keys sorgt NeoMutt dafür, dass die Tokeninformationen, die Sie vom Google-Server beziehen, verschlüsselt auf dem Dateisystem gespeichert werden und beim Zugriff auf diese Daten auch wieder entschlüsselt verfügbar sind.
Dieser Schritt ist wichtig, da Google bei der Registrierung eines Clients neben dem kurzlebigen Access-Token auch einen langlebigen Refresh-Token überträgt. Mit letzterem können Sie zu jeder Zeit immer wieder einen neuen Access-Token anfordern und sich so bei Bedarf erfolgreich gegenüber dem Gmail-Service autorisieren.
Token anfordern
Hat soweit alles geklappt, fordern Sie schließlich einen Access- und Refresh-Token von Google an. Hierzu rufen Sie das Skript "mutt_oauth2.py" mit der Option "--authorize" und einem Dateinamen für den Token auf:
/home/tscherf/gmail-test/mutt_oauth2.py
/home/tscherf/gmail-token --authorize
Available app and endpoint registrations: google microsoft
OAuth2 registration: google
Preferred OAuth2 flow ("authcode" or "localhostauthcode" or "devicecode"): authcode
Account e-mail address: tscherf@gmail.com
https://accounts.google.com/o/oauth2/auth?client_id=<...>
Visit displayed URL to retrieve authorization code. Enter code from server
(might be in browser address bar): <code>
Exchanging the authorization code for an access token
<access-token>
Hierbei gibt das Skript eine URL aus, die Sie im Webbrowser aufrufen müssen, um dann zu bestätigen, dass der OAuth2 Client NeoMutt nun bestimme Zugriffsrechte, die im zuvor ausgewählten Scope definiert wurden, erhalten darf. Bestätigen Sie dies, wirft der Browser einen Code aus, den Sie einfach mittels Copy und Paste an das "mutt_oauth2.py"-Skript übergeben.
Im Anschluss gibt das Skript einen Access-Token aus und speichert diesen auch in einer verschlüsselten JSON-Datei. Diese enthält neben dem Access-Token nun auch einen Refresh-Token. Um einen Blick in die JSON-Datei zu werfen, können Sie diese mittels gpg -d
einfach dekodieren. Im Anschluss testen Sie mit dem folgenden Kommando, ob die Autorisierung mit dem Access-Token gegenüber den einzelnen Gmail-Services wie gewünscht funktioniert:
/home/tscherf/gmail-test/mutt_oauth2.py
/home/tscherf/gmail-token
--verbose --test
Access Token: <access-token>
IMAP authentication succeeded
POP authentication succeeded
SMTP authentication succeeded
Listing: NeoMutt konfigurieren
set from = "tscherf@gmail.com"
set use_from = yes
set envelope_from = yes
set smtp_url = "smtps://tscherf@gmail.com@smtp.gmail.com: 465/"
set imap_user = "tscherf@gmail.com"
set folder = "imaps://imap.gmail.com:993"
set spoolfile = "+INBOX"
set ssl_force_tls = yes
set header_cache = $HOME/gmail-test/header_cache
bind index G imap-fetch-mail
set editor = "vim"
set charset = "utf-8"
set record = ''
set imap_authenticators = "oauthbearer"
set imap_oauth_refresh_command = "$HOME/gmail-test/mutt_oauth2.py $HOME/gmail-test/gmail-token"
set smtp_authenticators = ${imap_authenticators}
set smtp_oauth_refresh_command = ${imap_oauth_refresh_command}
NeoMutt konfigurieren
Abschließend müssen Sie nun noch das "mutt_oauth2.py"-Skript in die NeoMutt-Konfiguration einbinden. Das Listing "NeoMutt konfigurieren" zeigt hierfür ein einfaches Beispiel. Interessant sind hier natürlich vor allem die Optionen "imap_
authenticators", "imap_oauth_refresh_command", "smtp_authenticators" und "smtp_oauth_refresh_command".
NeoMutt erwartet die Konfigurationsanweisungen standardmäßig in der Datei "neomuttrc" im Verzeichnis "XDG_ CONFIG_HOME". Dieses entspricht auf einem Linux-System "~/.config/neomutt/". Nähere Informationen zu den OAuth2-Konfigurationsoptionen finden Sie in der NeoMutt-Dokumentation [7]. Zu Testzwecken können Sie das Listing im Kasten verwenden, die Einstellungen entsprechend anpassen und dann NeoMutt mit einer alternativen Konfigurationsdatei aufrufen:
neomutt -F meine-config
Fazit
Mithilfe des OAuth2-Protokolls autorisieren Sie Clients ganz einfach gegenüber einem Service, ohne dass hierfür ein Passwort zu übertragen ist. Der Open-Source-Artikel in diesem Monat demonstrierte dies anhand der Mailclients NeoMutt und Gmail. Nachdem Sie NeoMutt innerhalb von Google als OAuth2-Client registriert haben, können Sie im Anschluss mittels eines Access-Tokens auf Gmail zugreifen.
(dr)
Link-Codes
[7] NeoMutt Dokumentation:
https://neomutt.org/guide/