TOTP QR-Code-Leser für die PowerShell- Kommandozeile

Die Zwei-Faktor-Authentifikation (2FA) erfordert zwei unabhängige Identitätsnachweise für eine Anmeldung und gilt mittlerweile als Stand der Technik für öffentlich zugängliche Konten. Neben der Authentifikation mit einem Kennwort wird häufig ein zeitbasiertes Einmalkennwort1 (TOTP) verwendet, dass über ein Gerät oder eine App berechnet wird. Der Vorteil an einem zeitbasiertes Einmalkennwort ist, dass es keine spezielle Hardware zum Einlesen von Chipkarten, Sicherheits-Tokens oder biometirischen Merkmalen benötigt wird.

Die bekanntesten Apps zur Erzeugung von zeitbasiertes Einmalkennwörtern sind der Microsoft Authenticator und der Google Authenticator, der sowohl für Android, wie auch für Apple iOS verfügbar ist. Daneben wird das TOTP-Verfahren auch von Open Source Passwortmanagern, wie KeePass und KeePassXC unterstützt.

Die Implementation ist jedoch stark auf Endkunden ausgerichtet. So wird beim Hinzufügen eines TOTP-Authentifikationsfaktors meist ein QR-Code angezeigt, der mit der entsprechenden App gescannt wird. Mit der im QR-Code codierten URI werden die Parameter für die Berechnung des Einmalkennwortes festgelegt.

Beispiel OTP-QR-Code
Beispiel OTP-QR-Code2

Durch die Ausrichtung des Einrichtungsprozesses und der Apps auf Einzelpersonen existiert bei der Einrichtung des TOTP-Faktors meist keine Möglichkeit, die Parameter zu sichern und die Apps sehen keine zentrale Datensicherung vor, wie sie in Unternehmen häufig erforderlich sind.

In diesem Artikel stellen wir ein PowerShell-Skript vor, dass die Verwendung von zeitbasierten Einmalkennwörtern im Unternehmen erheblich vereinfacht. Das Convert-OTP.ps1-Skript liest die OTP-Parameter aus einem QR-Code und gibt diese auf der Kommandozeile aus. Damit können sehr einfach TOTP-Parameter skriptbasiert weiterverarbeitet und gesichert werden. Mit den gesicherten Parametern können auch im Falle des Verlusts eines Smartphones, beim Smartphone Wechsel oder der Migration zu einer anderen Anwendung die 2FA-Konten in der jeweiligen App wiederhergestellt werden.

Darüber hinaus lassen sich die Parameter in einer Passwort-Datenbank, wie z.B. KeePass, speichern und können so einfach gesichert werden. Da die TOTP-Parameter den Faktor vollständig beschreiben, müssen diese genauso sicher, wie Kennwörter verwahrt werden.

Das Convert-OTP.ps1-Skript


Das Skript besteht aus zwei Blöcken. Im ersten Block überprüft das Skript das Vorhandensein des Convert-Barcode.ps1-Skriptes. Falls dieses nicht gefunden wurde, wird das Convert-Barcode.ps1-Skript von der LogicLink-Webseite heruntergeladen und im Verzeichnis des Convert-OTP.ps1-Skriptes gespeichert:

# Download the Convert-Barcode1.ps1 script which is required from LogicLink's website.
if( -not (Test-InPath("Convert-Barcode.ps1")) ) {
    Invoke-WebRequest -UserAgent "Wget" -Uri "https://www.logiclink.de/wp-content/uploads/2024/04/Convert-Barcode.zip" -OutFile "$env:USERPROFILE\Downloads\Convert-Barcode.zip"
    Expand-Archive "$env:USERPROFILE\Downloads\Convert-Barcode.zip" -DestinationPath "$env:USERPROFILE\Downloads\Convert-Barcode\" -Force
    mv "$env:USERPROFILE\Downloads\Convert-Barcode\Convert-Barcode.ps1" "$PSScriptRoot\" -Force
    rm "$env:USERPROFILE\Downloads\Convert-Barcode" -Recurse -Force -ErrorAction SilentlyContinue
    rm "$env:USERPROFILE\Downloads\Convert-Barcode.zip" -Recurse -ErrorAction SilentlyContinue
} 

Das Convert-Barcode.ps1-Skript iest die OTPAUTH-URI aus dem QR-Code.  Das Convert-Barcode.ps1-Skript verwendet die ZXing.Net-Library von Michael Jahn, die es, falls noch nicht vorhanden, beim ersten Aufruf des Skriptes herunterlädt und im GAC (Global Assembly Cache) installiert. Für die GAC-Installation sind administrative Rechte erforderlich und das Convert-Barcode.ps1-Skript bricht mit einer Fehlermeldung ab, wenn diese fehlen. Administrative Rechte sind nur für den ersten Aufruf notwendig. Wenn alle Komponenten am Platz sind, reichen einfach Benutzerrechte und eine Leseberechtigung für die QR-Code Datei.

Aus dieser wird im nächsten Schritt die URI extrahiert und

# Extract OTP paraemeter from otpauth-URI in the QR-Code image
gci $path | % {
    Write-Verbose $_
    try {
        $u = [Uri](Convert-Barcode.ps1 $_)
        if($u.Scheme -eq "otpauth") {
            $p = GetOTPParameter($u)
            $o = [PSCustomObject]@{
                    Uri = [string]$u
                    Type = [System.Web.HttpUtility]::UrlDecode($u.Host)
                    Label = GetOTPLabel($u)
                    Secret = $p["secret"]
                    Secret_Base32_Decoded = Decode-Base32($p["secret"])
                    Issuer = $p["issuer"]
                    Algorithm = $p["algorithm"]
                    Digits = $p["digits"]
                    Counter = $p["counter"]
                    Period = $p["period"]
                }
            $o
        } else {
           throw "$_ does not encode a otpauth uri."
        }
    } catch { throw }
}

Die Funktionen GetOTPParameter und GetOTPLabel kapseln einige der Parsing-Schritte der URI, während die Decode-Base32 Funktion die Base32-Kodierung des Geheimnisses rückgängig macht. Die meisten Apps verwenden jedoch das Base32-kodierte Geheimnis direkt.

Mit der komplette URI kann der QR-Code später ggf. neu erzeugt werden, wenn dieser nicht aufgehoben werden soll. Falls der QR-Code als Bilddatei zusammen mit den Parametern gespeichert werden soll, so empfiehlt sich hierfür ebenfalls ein Passwort-Manager, da sonst die TOTP-Parameter frei zugänglich sind.

Ausführung des Skriptes

Für die Ausführung des Skriptes sollte der QR-Code, der normalerweise mit der jeweiligen Authenticator-App gescannt wird, als Bild gespeichert werden. Danach kann das Skript über die Kommandozeile mit der QR-Code-Datei als Parameter aufgerufen werden:

Run Convert-OTP.ps1

Von hier aus können die URI und TOTP-Parameter weiterverarbeitet werden. Wenn der QR-Code keine passende URI kodiert, tritt ein Fehler auf.

Verwenden des Skriptes mit KeePass

Die OTP-Informationen für einen KeePass-Eintrag sind in der Benutzeroberfläche von KeePass etwas versteckt. Sie finden diese im Register „Erweitert“ mit der Schaltfläche „Mehr“:

KeePass-TOTP-Generator öffnen
KeePass-TOTP-Generator

In den OTP-Generator-Einstellungen können Sie die einzelnen TOTP-Parameter aus dem QR-Code hinterlegen:

Einstellungen des KeePass-TOTP-Generators
KeePass-TOTP-Generator-Einstellungen

In den meisten Fällen reicht das Base32 kodierte Geheimnis, da die Standardeinstellungen des Generators meist korrekt sind. Mit „OK“ werden die Einstellungen übernommen. In der Eintragsübersicht kann dann mit der Tastaturkombination Strg+Umschalt+T ein zeitbasiertes Einmalkennwort berechnet und angezeigt werden.

KeePass OTP (Strg+Shift+T)
KeePass OTP (Strg+Shift+T)

Strg +T kopiert ein neu berechnetes Einmalkennwort direkt in die Zwischenablage. Dieselben Funktionen können auch über das Kontextmenü mit den Punkten „Sonstige Daten/Zeitbasiertes OTP kopieren (Strg+T)“ und „Sonstige Daten/Zeitbasiertes OTP anzeigen (Strg+Umschalt+T)

Downloads

Convert-OTP.zip80,4 KBPowerShell Skript Convert-OTP.ps1 und Beispiel TOTP-QR-Code

Weitere Informationen