In den Code-Basiss von OpenSSH. experimentelle Unterstützung für die Zwei-Faktor-Authentifizierung mithilfe von Geräten, die das Protokoll unterstützen. , entwickelt von der Allianz . U2F ermöglicht die Erstellung kostengünstiger Hardware-Tokens zur Bestätigung der physischen Anwesenheit des Benutzers, die über USB, Bluetooth oder NFC kommuniziert werden. Solche Geräte werden als Mittel zur Zwei-Faktor-Authentifizierung auf Websites gefördert, werden bereits von den gängigen Browsern unterstützt und werden von verschiedenen Herstellern wie Yubico, Feitian, Thetis und Kensington angeboten.
Um mit Geräten zu interagieren, die die Anwesenheit des Benutzers bestätigen, wurde in OpenSSH ein neuer Schlüsseltukturtyp «sk-ecdsa-sha2-nistp256@openssh.com» («ecdsa-sk») eingeführt, der den ECDSA (Elliptic Curve Digital Signature Algorithm) mit der elliptischen Kurve NIST P-256 und dem Hash-Algorithmus SHA-256 nutzt. Die Interaktionsprozeduren mit Token wurden in eine Zwischenbibliothek ausgelagert, die analog zur Bibliothek für die Unterstützung von PKCS#11 geladen wird und eine Wrapper-Bibliothek darstellt. , die Mittel zur Kommunikation mit Tokens über USB bereitstellt (unterstützt die Protokolle FIDO U2F/CTAP 1 und FIDO 2.0/CTAP 2). Die von OpenSSH-Entwicklern bereitgestellte Zwischenbibliothek libsk-libfido2 wird in die Hauptbibliothek libfido2 integriert, ebenso wie für OpenBSD.
Um U2F zu aktivieren, kann die aktuelle Version des Code-Bases von OpenSSH und dem HEAD-Branch der Bibliothek , der bereits die für OpenSSH notwendige Schicht enthält.
Libfido2 unterstützt die Nutzung in OpenBSD, Linux, macOS und Windows.
Für die Authentifizierung und Generierung des Schlüssels muss die Umgebungsvariable SSH_SK_PROVIDER gesetzt werden, wobei der Pfad zu libsk-libfido2.so angegeben wird (export SSH_SK_PROVIDER=/path/to/libsk-libfido2.so), oder die Bibliothek kann über die Einstellung SecurityKeyProvider definiert werden. Anschließend kann „ssh-keygen -t ecdsa-sk“ ausgeführt werden, oder wenn die Schlüssel bereits erstellt und konfiguriert sind, kann eine Verbindung zum Server mit „ssh“ hergestellt werden. Beim Ausführen von ssh-keygen wird das generierte Schlüsselpaar in „~/.ssh/id_ecdsa_sk“ gespeichert und kann wie andere Schlüssel verwendet werden.
Der öffentliche Schlüssel (id_ecdsa_sk.pub) sollte auf den Server in die Datei authorized_keys kopiert werden. Auf der Serverseite wird nur die digitale Signatur überprüft, während die Interaktion mit den Token auf der Clientseite erfolgt (auf dem Server muss libsk-libfido2 nicht installiert sein, aber der Server muss den Schlüsseln vom Typ „ecdsa-sk“ unterstützen). Der generierte private Schlüssel (id_ecdsa_sk) fungiert im Wesentlichen als Schlüsseldescriptor, der nur in Kombination mit der geheimen Sequenz, die auf dem U2F-Token gespeichert ist, einen echten Schlüssel bildet.
Wenn der Schlüssel id_ecdsa_sk in die Hände eines Angreifers gelangt, benötigt dieser für die Authentifizierung auch Zugriff auf das Hardware-Token, ohne das der im Datei gespeicherte private Schlüssel id_ecdsa_sk nutzlos ist. Darüber hinaus ist standardmäßig bei allen Vorgängen mit Schlüsseln (sowohl bei der Erstellung als auch bei der Authentifizierung) eine lokale Bestätigung der physischen Anwesenheit des Benutzers erforderlich, indem beispielsweise angeboten wird, den Sensor am Token zu berühren, was Remote-Angriffe auf Systeme mit angeschlossenem Token erschwert. Als zusätzliche Schutzmaßnahme kann bei der Ausführung von ssh-keygen auch ein Passwort für den Zugriff auf die Datei mit dem Schlüssel festgelegt werden.
Der U2F-Schlüssel kann über «ssh-add ~/ .ssh/id_ecdsa_sk» in den ssh-agent hinzugefügt werden, jedoch muss der ssh-agent mit Unterstützung für die «ecdsa-sk»-Schlüssel kompiliert sein, das libsk-libfido2-Framework vorhanden sein und der Agent muss auf dem System laufen, mit dem das Token verbunden wird.
Der neue Schlüsseltitel «ecdsa-sk» wurde hinzugefügt, da das Format der ecdsa-Schlüssel von OpenSSH sich vom U2F-Format für digitale ECDSA-Signaturen durch zusätzliche Felder unterscheidet.
Quelle: opennet.ru
