U2F FIDO: Difference between revisions
(23 intermediate revisions by 3 users not shown) | |||
Line 5: | Line 5: | ||
[https://u2fdemo.appspot.com/ Beispiel Demo], welche ausschließlich mit einem Gnubby und einem existierenden Google Account funktioniert: |
[https://u2fdemo.appspot.com/ Beispiel Demo], welche ausschließlich mit einem Gnubby und einem existierenden Google Account funktioniert: |
||
[http://fidoalliance.org/specs/fido-u2f-raw-message-formats-v1.0-rd-20140209.pdf Dokumentation] der Daten, welche an und von dem Gnubby übermittelt werden |
[http://fidoalliance.org/specs/fido-u2f-raw-message-formats-v1.0-rd-20140209.pdf Dokumentation] der Daten, welche an und von dem Gnubby übermittelt werden |
||
[https://docs.google.com/document/d/1Jm_xAJTZGulMOkYOQm-fIQhhkd2VDr9578oh0KOwcEw/edit#heading=h.q5kqrl82hzpj Google U2F Protocol and API Details] |
[https://docs.google.com/document/d/1Jm_xAJTZGulMOkYOQm-fIQhhkd2VDr9578oh0KOwcEw/edit#heading=h.q5kqrl82hzpj Google U2F Protocol and API Details] |
||
[https://docs.google.com/document/d/1SjCwdrFbVPG1tYavO5RsSD1QpJwj8_im6sl-VWjJ6k0/edit# Product Overview: Easy Strong Auth for the web] |
|||
[https://docs.google.com/document/d/12AdwNDIhs6blXGTCOReaUGviBqCtsVrGMtrxGeCCxPU/edit# Protocol Design + User Flows] |
|||
= API Referenzen = |
= API Referenzen = |
||
Javascript |
Javascript-Referenz, welche in der Chome extension verwendet wird: |
||
http://fidoalliance.org/specs/fido-u2f-javascript-api-v1.0-rd-20140209.pdf |
http://fidoalliance.org/specs/fido-u2f-javascript-api-v1.0-rd-20140209.pdf |
||
Line 22: | Line 26: | ||
Modifiziertes Repo von Marc. |
Modifiziertes Repo von Marc. |
||
In dem u2f-ref-code wurde ein sehr einfacher Login als Beispiel implementiert. |
In dem u2f-ref-code wurde ein sehr einfacher Login als Beispiel implementiert. |
||
Außerdem wird in der U2F-Chrome-Extension localhost akzeptiert, welcher in dem Original mit einem "Error 2" abgelehnt wird: |
|||
https://github.com/MarcKe/u2f-ref-code |
https://github.com/MarcKe/u2f-ref-code |
||
Line 40: | Line 44: | ||
// find the longest matching eTLD first. |
// find the longest matching eTLD first. |
||
var next = host; |
var next = host; |
||
Für den simplen [https://github.com/MarcKe/u2f-ref-code/commit/858d2c394baed3ee0cdf236372a491c5243b1059 Test-Login] wurde das Http-Server-Beispiel von Google erweitert. Der Benutzername und das Passwort werden dabei während der Registrierung in Cookies gespeichert und somit kann der Server auf diese zugreifen. Das Passwort wird dann zusätzlich zu den anderen Daten (Public Key, Key Handle) auf dem Server in einer Hashmap gespeichert (ohne weitere Sicherheitsmaßnahmen, da hier nur ein Login demonstriert werden soll). Die Daten werden nicht persistent gemacht, also nur im Arbeitsspeicher gehalten, sodass bei jedem Neustart des Servers alle Daten gelöscht sind. Bei einem Login-Versuch wird das Passwort, welche in der Hashmap gespeichert ist, zusätzlich übertragen und mit den Login-Daten verglichen. Selbst wenn dies kein sicherer Weg ist, der Gnubby schützt zumindest davor, dass niemand anderes sich mit den Daten einloggen könnte. |
|||
= Beispieltoken der erstellt wird = |
= Beispieltoken der erstellt wird = |
||
Line 68: | Line 75: | ||
0030: D9 CF 8A A5 BA CA 23 2E E6 52 52 A9 06 D1 31 9F ......#..RR...1. |
0030: D9 CF 8A A5 BA CA 23 2E E6 52 52 A9 06 D1 31 9F ......#..RR...1. |
||
0040: A2 94 68 F6 2A 70 ..h.*p |
0040: A2 94 68 F6 2A 70 ..h.*p |
||
= Nutzerrechte unter Linux = |
|||
Der Zugriff via USB auf den Gnubby ist nicht automatisch für Standardbenutzer unter Linux möglich. Jedoch kann durch die Definition einer entsprechenden udev-Regel <pre>/etc/udev/rules.d/70-gnubby.rules</pre> Abhilfe geschaffen werden: |
|||
<pre> |
|||
# /etc/udev/rules.d/70-gnubby.rules |
|||
# |
|||
# https://pypi.python.org/pypi/python-u2flib-host/1.1.0 |
|||
# For Udev 188 and later |
|||
ACTION!="add|change", GOTO="gnubby_end" |
|||
ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0211", \ |
|||
ENV{ID_SECURITY_TOKEN}="1" |
|||
LABEL="gnubby_end"# For older Udev versions |
|||
</pre> |
|||
Mit <pre>udevadm control --reload</pre> wird der neue Regelsatz ohne Reboot aktiviert. Danach sollte ein Zugriff als normaler Nutzer vom "Chromium" mit installierter "FIDO U2F (Universal 2nd Factor) extension" auf den Gnubby möglich sein. |
|||
Diese Lösung wurde auf "openSUSE 13.1 (i586)" mit udev-Version 208 >= 188 erfolgreich getestet und der |
|||
[https://pypi.python.org/pypi/python-u2flib-host/1.1.0 Quelle] entnommen. |
|||
= USB Transaction = |
= USB Transaction = |
||
Ein Mitschnitt der USB-Übermittlung von und an das Gnubby Device bei der Registrierung eines Google Mail Accounts kann [[U2F-USB-dump|hier]] eingesehen werden. |
|||
TODO: anhängen der Datei |
|||
Die ersten 4 Frames sind nur USB-Geschwätz. Im 5. Frame sieht man eine Anfrage der Version des Gnubbys, zu erkennen an: 00 03 00 00 00 00 00 00 00. Die Antwort erfolgt in Frame 8. Man sieht deutlich die Version U2F_V2. |
|||
Im 9. Frame kann man eine U2F Registration-Request-Nachricht sehen. Die ersten 4-1/2 Zeilen sind nur USB-Protokoll. Danach sieht man den eigentlichen Request: 00 01 83 00 00 00 40 [64 bytes message] 00 00. Die 64 Byte sind dabei der Inhalt der Nachricht, in diesem Fall die Origin des Requests, welche sich aus Host, Port und Version zusammensetzt. Wenn der Gnubby nicht in einem gewissen Zeitraum berührt wird, sendet er die gleiche Nachricht erneut (zu sehen in Frame 17/25). Es wird auch ein Fehler ausgegeben, der besagt, dass eine Nutzerpräsenz (die Berührung) gefordert wird. Zu sehen ist er in Frame 12 und 20 durch [] 69 85. |
|||
Die Registration-Success-Nachricht erfolgt in Frame 28. Diese wird durch [457 bytes message] 90 00 gekennzeichnet. Die Nachricht enthält z.B. den Public Key, Key Handle und Signatur. |
|||
Ein Authentifizierung-Request ist in dem USB-Dump nicht dargestellt. |
|||
= USB Transaction im Detail = |
|||
Im Rahmen des Seminars von [https://www2.informatik.hu-berlin.de/~giessman/ Prof. Dr. Ernst-Günter Giessmann] wurde ein kompetter Mitschnitt mit "usbpcap" für die Registrierung sowie dei Authentisierung erstellt der in [[wireshark.pcap.txt]] zu sehen ist. Derzeit ist wireshark nicht in der Lage, die U2F-Kommunikation genauer zu visualisieren, sondern benennt sie einfach als "Leftover Capture Data". Allerdings hat Prof. Dr. Ernst-Günter Giessmann sich die Mühe gemacht, all diese Daten zu analysieren und diese hier [[eg.gnubby-protokoll explained.txt]] bereitzustellen. |
|||
= Was nicht funktioniert oder in der verfügbaren Zeit nicht möglich ist = |
= Was nicht funktioniert oder in der verfügbaren Zeit nicht möglich ist = |
||
Line 81: | Line 118: | ||
Es ist möglich, anhand der "u2f-gae-demo" ein einzelnes Modul für Apache, Tomcat, Jboss, etc. zu erstellen. |
Es ist möglich, anhand der "u2f-gae-demo" ein einzelnes Modul für Apache, Tomcat, Jboss, etc. zu erstellen. |
||
Dieses Beispiel von Google funktioniert auf einem Server mit der Google App Engine. |
Dieses Beispiel von Google funktioniert auf einem Server mit der Google App Engine. |
||
== NFC == |
|||
Zum Zeitpunkt des Seminars war die Anbindung über NFC noch nicht möglich, da noch keine Unterstützung von Google gegeben wird. Eine Beispiel-App des Herstellers existiert bereits, jedoch kommuniziert diese nicht mit dem Token. Die Beispiel-App ist [http://demo.yubico.com/u2f.php hier] und [http://www.yubico.com/products/yubikey-hardware/yubikey-neo/integrate/ hier] zu finden |
|||
= Weitere U2F-Anwendungen= |
|||
== SSH == |
|||
[https://bugzilla.mindrot.org/attachment.cgi?id=2521 Patch] |
Latest revision as of 15:15, 30 June 2015
Google Quellen
Slides von der Google Präsentation:
Beispiel Demo, welche ausschließlich mit einem Gnubby und einem existierenden Google Account funktioniert:
Dokumentation der Daten, welche an und von dem Gnubby übermittelt werden
Google U2F Protocol and API Details
Product Overview: Easy Strong Auth for the web
API Referenzen
Javascript-Referenz, welche in der Chome extension verwendet wird: http://fidoalliance.org/specs/fido-u2f-javascript-api-v1.0-rd-20140209.pdf
Git Repositorys
Original Repo von Google mit Beispielcode:
https://github.com/google/u2f-ref-code/
Modifiziertes Repo von Marc. In dem u2f-ref-code wurde ein sehr einfacher Login als Beispiel implementiert. Außerdem wird in der U2F-Chrome-Extension localhost akzeptiert, welcher in dem Original mit einem "Error 2" abgelehnt wird:
https://github.com/MarcKe/u2f-ref-code
Erläuterung der Änderung
Um den Localhost zu akzeptieren, müssen folgende Zeilen in der "etld.js" eingefügt werden:
if (host.indexOf(':') != -1) { host = host.substring(0, host.indexOf(':')); } if (host == "localhost") { return host; } // Loop over each possible subdomain, from longest to shortest, in order to // find the longest matching eTLD first. var next = host;
Für den simplen Test-Login wurde das Http-Server-Beispiel von Google erweitert. Der Benutzername und das Passwort werden dabei während der Registrierung in Cookies gespeichert und somit kann der Server auf diese zugreifen. Das Passwort wird dann zusätzlich zu den anderen Daten (Public Key, Key Handle) auf dem Server in einer Hashmap gespeichert (ohne weitere Sicherheitsmaßnahmen, da hier nur ein Login demonstriert werden soll). Die Daten werden nicht persistent gemacht, also nur im Arbeitsspeicher gehalten, sodass bei jedem Neustart des Servers alle Daten gelöscht sind. Bei einem Login-Versuch wird das Passwort, welche in der Hashmap gespeichert ist, zusätzlich übertragen und mit den Login-Daten verglichen. Selbst wenn dies kein sicherer Weg ist, der Gnubby schützt zumindest davor, dass niemand anderes sich mit den Daten einloggen könnte.
Beispieltoken der erstellt wird
Interessant ist hierbei die Gültigkeit des Zertifikats. Dies kann jedoch durch die Version (v0), also die frühe Entwicklung Token selbst zu tun haben.
new token: public_key: BPEfrHYFJIe7aMAljNIq3Gv7nlHdhkxjZYEOzpMhjsz6zXxJVmPZgW7hr6YEkLInTTRSKlhTBST80mu6vx4LPIU key_handle: xGDwceuts3WnDLvAuCUvPj6MZ59EMRusdd9SpM6ipQIO_lYOD40NW9HzwdkcwaWY1xvl54G5MuUDTfbRIrpaxw counter: 0 attestation certificate: Version: V3 Subject: OID.2.5.4.45=#030A00013284FFFFFFFF0444, CN=Google Gnubby v0 Signature Algorithm: SHA256withECDSA, OID = 1.2.840.10045.4.3.2 Key: Sun EC public key, 256 bits public x coord: 76325047710147689659458271283597733852774968588358871702791068908014891073689 public y coord: 51805930702706814209933188884277181691700110245786325738983307203119170576020 parameters: secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7) Validity: [From: Fri Jun 01 02:00:00 CEST 2012, To: Thu Jun 01 01:59:59 CEST 2062] Issuer: CN=Gnubby HSM CA 00 SerialNumber: [ 013284ff ffffff04 44] Algorithm: [SHA256withECDSA] Signature: 0000: 30 44 02 20 78 7D 36 9D 3D E3 ED CE ED AA 8D 9A 0D. x.6.=....... 0010: 6D 36 25 50 D3 39 98 27 11 DA 1D A5 A7 97 A4 93 m6%P.9.'........ 0020: 93 BB 0C 94 02 20 17 93 7E C1 61 BF 14 61 FA 29 ..... ....a..a.) 0030: D9 CF 8A A5 BA CA 23 2E E6 52 52 A9 06 D1 31 9F ......#..RR...1. 0040: A2 94 68 F6 2A 70 ..h.*p
Nutzerrechte unter Linux
Der Zugriff via USB auf den Gnubby ist nicht automatisch für Standardbenutzer unter Linux möglich. Jedoch kann durch die Definition einer entsprechenden udev-Regel
/etc/udev/rules.d/70-gnubby.rules
Abhilfe geschaffen werden:
# /etc/udev/rules.d/70-gnubby.rules # # https://pypi.python.org/pypi/python-u2flib-host/1.1.0 # For Udev 188 and later ACTION!="add|change", GOTO="gnubby_end" ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0211", \ ENV{ID_SECURITY_TOKEN}="1" LABEL="gnubby_end"# For older Udev versions
Mit
udevadm control --reload
wird der neue Regelsatz ohne Reboot aktiviert. Danach sollte ein Zugriff als normaler Nutzer vom "Chromium" mit installierter "FIDO U2F (Universal 2nd Factor) extension" auf den Gnubby möglich sein.
Diese Lösung wurde auf "openSUSE 13.1 (i586)" mit udev-Version 208 >= 188 erfolgreich getestet und der Quelle entnommen.
USB Transaction
Ein Mitschnitt der USB-Übermittlung von und an das Gnubby Device bei der Registrierung eines Google Mail Accounts kann hier eingesehen werden. Die ersten 4 Frames sind nur USB-Geschwätz. Im 5. Frame sieht man eine Anfrage der Version des Gnubbys, zu erkennen an: 00 03 00 00 00 00 00 00 00. Die Antwort erfolgt in Frame 8. Man sieht deutlich die Version U2F_V2.
Im 9. Frame kann man eine U2F Registration-Request-Nachricht sehen. Die ersten 4-1/2 Zeilen sind nur USB-Protokoll. Danach sieht man den eigentlichen Request: 00 01 83 00 00 00 40 [64 bytes message] 00 00. Die 64 Byte sind dabei der Inhalt der Nachricht, in diesem Fall die Origin des Requests, welche sich aus Host, Port und Version zusammensetzt. Wenn der Gnubby nicht in einem gewissen Zeitraum berührt wird, sendet er die gleiche Nachricht erneut (zu sehen in Frame 17/25). Es wird auch ein Fehler ausgegeben, der besagt, dass eine Nutzerpräsenz (die Berührung) gefordert wird. Zu sehen ist er in Frame 12 und 20 durch [] 69 85.
Die Registration-Success-Nachricht erfolgt in Frame 28. Diese wird durch [457 bytes message] 90 00 gekennzeichnet. Die Nachricht enthält z.B. den Public Key, Key Handle und Signatur.
Ein Authentifizierung-Request ist in dem USB-Dump nicht dargestellt.
USB Transaction im Detail
Im Rahmen des Seminars von Prof. Dr. Ernst-Günter Giessmann wurde ein kompetter Mitschnitt mit "usbpcap" für die Registrierung sowie dei Authentisierung erstellt der in wireshark.pcap.txt zu sehen ist. Derzeit ist wireshark nicht in der Lage, die U2F-Kommunikation genauer zu visualisieren, sondern benennt sie einfach als "Leftover Capture Data". Allerdings hat Prof. Dr. Ernst-Günter Giessmann sich die Mühe gemacht, all diese Daten zu analysieren und diese hier eg.gnubby-protokoll explained.txt bereitzustellen.
Was nicht funktioniert oder in der verfügbaren Zeit nicht möglich ist
Erstellen von Zufallszahlen mit dem Gnubby
Nach bisherigen Erkenntnissen, ist es nicht möglich Zufallszahlen mit dem Gnubby zu erstellen, da keine Funktion in der API vorhanden ist. Jedoch ist die Wahrscheinlichkeit hoch, das der Gnubby diese Möglichkeit besitzt, deswegen könnte es auf andere Wege funktionieren.
Separate Module für einzelne Dienste
Es ist möglich, anhand der "u2f-gae-demo" ein einzelnes Modul für Apache, Tomcat, Jboss, etc. zu erstellen. Dieses Beispiel von Google funktioniert auf einem Server mit der Google App Engine.
NFC
Zum Zeitpunkt des Seminars war die Anbindung über NFC noch nicht möglich, da noch keine Unterstützung von Google gegeben wird. Eine Beispiel-App des Herstellers existiert bereits, jedoch kommuniziert diese nicht mit dem Token. Die Beispiel-App ist hier und hier zu finden