Türchen 12: Doppelt hält besser – Magento Backend Login mit Google Authenticator

12.12.2011   //   von Jörg Weller   //   Adventskalender, Magento  //  19 Kommentare

Vor einiger Zeit bin ich beim Durchstöbern meiner Feeds auf den Google Authenticator gestoßen und das Thema hat mich sofort fasziniert. An einem ruhigen Samstagabend beschloss ich das System einmal in das Magento-Backend-Login zu integrieren. Das entstandene Modul möchte ich euch hier gern vorstellen.

Um es vorwegzunehmen und möglicher Paranoia vorzubeugen: Google ist lediglich der Herausgeber der Software. Für die Nutzung wird weder ein Google-Account benötigt, noch werden irgendwelche Daten an die Datenkraken Google übertragen.

Zweifaktor-Authentifizierung

Gerti G. / photocase.comViele von euch kennen sicher RSA-Token. Der Token generiert in einem festen Intervall einen Zahlencode, der beim Login zusätzlich zum Benutzernamen und Passwort angegeben werden muss. Ein gestohlenes Passwort ist also zu verschmerzen, solange der Angreifer nicht auch im Besitz des RSA-Tokens ist.

Mit Googles Authenticator gibt es eine flexible und kostenlose Open Source Alternative, bei der man statt zusätzlicher Hardware nur ein Smartphone benötigt. Die zur Code-Generierung benötigte App gibt es für Android, iOS, Blackberry und ist jeweils auch als Quellcode verfügbar.

Das Magento Modul

Das Modul kann aktuell per github bezogen werden.
Nach der Installation erscheint in der Magento Backenduser-Verwaltung ein neuer Tab “Google Authenticator”.

Klickt man den Button “generate Secret Key” wird automatisch ein Schlüssel erzeugt. Dieser Key wird für die Generierung der Zahlenfolge benötigt, die beim Login abgefragt wird.
Zusätzlich wird der Schlüssel als QR-Code angezeigt, der eine einfache Übergabe an ein Smartphone ermöglicht.

Scannt man den QR-Code mit dem Smartphone ein, wird in der Google-Authenticator-App ein Eintrag für die Magento Instanz erzeugt und alle 30 Sekunden ein neuer Zahlencode für den Backend-Login angezeigt.

Beim Aufrufen des Magento Backends wird jetzt ein erweitertes Loginformular angezeigt, bei dem zusätzlich ein Verification-Code eingegeben werden muss. Benutzer, bei denen im Backend ein “Secret Key” hinterlegt wurde, müssen dieses Feld ab jetzt ausfüllen. Ist beim Benutzer kein “Secret Key” angelegt, kann der Login auch ohne Eingabe des Sicherheitscodes wie gewohnt erfolgen. Auf diese Weise kann bei weniger kritischen Logins auf die zusätzliche Sicherheit verzichtet werden.

Bitte beachtet:

  • Das Modul ist mit Sicherheit noch nicht ausgereift, ich habe es bisher nur mit der Magento Version 1.6.0 erfolgreich getestet
  • Wie viele Lösungen, die eine Zweifaktor-Authentifizierung ermöglichen, wird der Zahlencode nach einem bestimmten Algorithmus errechnet. Als variable Komponente kommt hier immer die Uhrzeit ins Spiel – und das ist ein sensibler Punkt. Stimmt die Zeit bei den beiden Partnern (Webserver und Smartphone) nicht überein, wird zwangsläufig ein anderer Code errechnet. Beim Abgleich führt dies zu einem Fehler und ein Login ist nicht möglich.
  • Ja, Rouven ich weiß, die Kommentare im Quellcode fehlen noch ;-)

→ Modul Download

Der Autor

Jörg Weller entwickelt seit über zehn Jahren anspruchsvolle Web-Applikationen und hat dabei Erfahrungen mit verschiedensten E-Commerce- und Content Management Systemen gesammelt. Als Geschäftsführer der Flagbit GmbH & Co. KG aus Karlsruhe kümmert er sich heute hauptsächlich um die Anbindung und Integration von Magento. Er ist Chefentwickler der Magento Integration Platform (MIP) sowie von TypoGento.

19 Kommentare

  • Geniale Idee. Wird getestet :-)

  • Hallo,

    erstmal: eine sehr schöne Idee, und eine sehr sehr gute Möglichkeit das Backend gegen gestohlene Logins (z.B. durch Trojaner) abzusichern.

    Allerdings hast du noch eine mögliche Schwachstelle:
    Wenn man sich über eine unsichere Verbindung (nehmen wir Beispielsweise einen Flughafen-Hotspot ohne VPN und ohne validem SSL-Zertifikat) einloggt ist es möglich die Zugangsdaten sowie den Key zu sniffen und in einem begrenzten Zeitrahmen durch ein automatisches Skript sich auch noch einzuloggen. Das ganze wäre zwar ein gezielter Angriff, den ich persönlich aber nicht ausschließen möchte.

    Ein einfacher Weg das zu stoppen wäre es den Code direkt nach der Eingabe zu sperren (nicht in der Session, sondern z.B. mit in der admin_users Tabelle als lastUsedCode o.ä.) und somit nur einen Loginversuch pro Code zuzulassen.

    Gruß, Bastian

  • Hallo Bastian,

    du hast vollkommen recht!
    Im PAM Module ist das bereits eingebaut.
    Steht also auch auf meiner Featureliste! ;-)

    Jörg

  • Super :)

    hatte nur deinen Teil des Codes, und nicht die Google-Lib, angeschaut.

    So oder so aber definitiv ein super Feature das out-of-the-box bei Magento drin sein sollte.

    Gruß

  • Super Idee, freue mich total zu sehen was der Adventskalender so an das Tageslicht befördert! +1

  • Wow, das ist ja quasi genau termingerecht “unterm Baum”. Evtl. kann ich das nutzen für mein Projekt.

    Ich wollte mich demnächst hinsetzen und das Magento Backend um OpenID Login zu erweitern. Anstelle eines öffentlichen OpenID Server nutze ich etwas selbstgebautes. Mittels http://www.openid-ldap.org/ und der Library http://www.nongnu.org/oath-toolkit/ und einem Token (da geht es Mobile Token oder z.B. http://www.ftsafe.com/products/otpc200.html, den gibt es ab 10€) betreibe ich selber einen OpenID Server. Das interessante an der Sache ist das man durch die Kombination von OpenID + LDAP das gleiche Passwort benutzen kann wie “im Haus”. Das macht es der Erfahrung nach für viele Anwender viel einfacher sich nur noch ein Passwort zu merken und dies auch öfter zu wechseln. Da der Seed vom Token im AD/LDAP liegt (und nur nach Anmeldung gelesen werden kann), und der OpenID Server von einem selbst betrieben wird hat man keine Probleme, dass das Passwort/Seed “das Haus verläßt” und man kann super einfach selber prüfen ob jemand versucht sich unbefugt anzumelden. Für Typo3 klappt das mittlerweile hevorragend im Standard.

  • Hallo Claas,

    das hört sich sehr interessant an!
    Wir haben genau das gleiche vor, vieleicht können wir da zusammenarbeiten.
    Wenn du Interesse hast sollten wir uns mal darüber unterhalten, wie kann ich dich erreichen?

    Viele Grüße,

    Jörg

  • Hallo Claas, Hallo Jörg,

    ich würde mich an der Lösung auch gern beteiligen. Ich hatte angefangen eine OpenID Lösung auf Basis von SimpleID zu bauen. Ich wollte den Weg gehen und hier den Provider um eine LDAP Lösung erweitern.

    Also egal wie und welcher Stack, ich mach mit!

    Gruß Karl

  • Hallo zusammen,

    hehe, ja, SimpleID sah mir auch von den PHP-OpenID-Lösungen am besten aus. Wollte ich mir genauer anschauen. Ich mach jetzt mal den OpenID-Login für Magento fertig, dann kann man daran ja alles andere anflanschen.

    Gruß
    David

  • Eine gute Idee, den Login weiter abzusichern. Natürlich noch eine Frage wie sich das bei einem internationalen Team mit Uhrzeit und Datum verhält, aber alles in allem eine sehr schöne Lösung.

  • Hey Michael,

    ich würde davon ausgehen das das Ding in Weltzeit rechnet. Lokale Zeitangaben sollten dann keine Rolle spielen :)

    Tobi

  • Hallo Jörg,
    nette Lösung! :)) Sag mal wo findest du noch die Zeit nebenbei mal eben sowas aus dem Ärmel zu schütteln?!!

    Genial! Hut ab!

    Liebe Grüße,
    Amir

  • Super Beitrag, danke!

  • @Amir das Problem ist wir haben nur 2 Wii Controller und für mich war keiner übrig ;-(

  • Tolle Idee! Funktioniert nach Zeitsynchronisation auch sehr gut.
    Den secret key musste ich allerdings manuell in die “admin_user” Tabelle eintragen.
    Kann es sein, dass es hier ein Problem mit dem Tabellen-Präfix gibt?

  • Normal sollte ein Tabellen Präfix kein Problem darstellen. Der Tabellenname wird über $this->getTable(‘admin/user’) geholt. Welche Magento Version verwendest du?

  • 1.6.1.0

  • thank you for great extension.

    It works very well magento ce 1.7

    If it’s not print a qr code after generation, in alternative way change this,

    open adminhtml/default/default/template/googleauthenticator/generator.phtml

    find this line->

    getNoDisplay()): ?>

    then, replace the line or remove ! character from if stament

    getNoDisplay()): ?>

    Don’t forget the qr codes created on google’s server, if you have in-house qr create solution you may use with your own qr code generator with change geturl() function in GoogleAuthenticator/GoogleAuthenticator.php file easily.

Kommentar schreiben

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.