U2F FIDO: Difference between revisions

From
Jump to navigation Jump to search
(Created page with "U2F FIDO")
 
 
(38 intermediate revisions by 3 users not shown)
Line 1: Line 1:
= Google Quellen =
U2F FIDO

[https://docs.google.com/presentation/d/16mB3Nptab1i4-IlFbn6vfkWYk-ozN6j3-fr7JL8XVyA/edit?pli=1#slide=id.g19c09a112_2_0 Slides] von der Google Präsentation:

[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

[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 =

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 [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 =

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 <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 =

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.
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 =

== 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 [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

Protocol Design + User Flows

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

Weitere U2F-Anwendungen

SSH

Patch