Vor längerer Zeit gab es schon einen Beitrag zur 2FA mit Privacyidea. Das dort vorgestellte Modell wollen wir jetzt dahingehend erweitern, dass Benutzer ohne zutun eines Administrators die 2FA aktivieren können.

Der Prozess sieht wie folgt aus.

Mit Hilfe der Privacyidea API erstellen wir einen Registrierungscode. Dieser wird von Privacyidea an den jeweiligen Benutzer versendet. Damit kann sich der Benutzer dann einloggen und den OTP-Token generieren.

Schritt 1 – API call

Im folgenden PHP-Code wird der Registrierungscode generiert. Die fett hervorgehobenen Stellen sind gegebenfalls an die eigene Umgebung anzupassen. Zuerst erfolgt der Admin-Login bei Privacyidea, um ein SessionToken zu bekommen. Im 2. Schritt generieren wir einen Registrierungstoken. Dieser wird event-getrieben an den jeweiligen Benutzer per Mail verschickt. Zum Schluss ist es vermutlich noch notwendig, ein 2FA-Flag in einer Datenbank zu setzen. Damit wird für diesen Benutzer die 2FA aktiviert.

$url = "https://PRIVACYIDEAURL/auth";
$ch = curl_init($url);

// Setup request to send json via POST
$data = array(
    'ideaAdmin' => 'ADMINLOGIN'
    'ideaPassword' => 'PASSWORD'
);
$payload = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);

$result=json_decode($result,true); //sessionToken

$token = $result['result']['value']['token'];
curl_close($ch);

$url="https://PRIVACYIDEAURL/token/init";
$ch = curl_init($url);
$userName = getUserNameFromSession();  //user who wants to activate 2FA

$data = array(
    'timeStep' => '30',
    'otplen' => '6',
    'genkey' => true,
    'type' => 'registration',
    'hashlib' => 'sha256',
    'radius.system_settings' => true,
    'user' => $userName,
    'realm' => 'mainrealm'
);
$payload = json_encode(($data));

$headers =
    [
        "Content-Type: application/json;charset=utf-8",
        "Accept: application/json",
        "Authorization: $token"
    ];

curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
$result=json_decode($result,true);

if($result['result']['status']==1) { //result ok => change setting in database
   try {
      //set 2FA flag for user in database

   } catch (PDOException $e) {
      die();
   }

}

Schritt 2 – Event und Policy in PrivacyIdea erstellen.

Zuerst erstellen wir die „Web-Policy“. Diese legt fest, was der Benutzer von PrivacyIdea sieht, sobald er sich mit seinem zugesendeten Registrierungscode einloggt. Als Scope stellen wir „webui“ ein. Dann wechseln wir auf das Action Tab und aktivieren folgende Einstellungen im „miscellaneous“ Abschnitt.

Teil zwei ist die Self-Service-Policy. Also wieder eine neue Policy erstellen. Als Scope wählen wir dieses Mal „user“. Im Abschnitt token „assign, reset und resync“ werden aktiviert. Im Abschnitt enrollment „enrollTOTP„.

Das Ergebnis sieht dann für beide Policies so aus.

Jetzt fehlt noch der Event-Handler, der den Registrierungscode an den Benutzer verschickt. Im Abschnitt Events klicken wir auf „Create new Event-Handler“. Als Event wählen wir „token-init“ aus. Bei den Bedingungen stellen wir unter token den „tokentype“ auf „registration“ und unter user den „logged_in_user“ auf admin. (Wir loggen uns am Webservice mit dem Administrator ein und erstellen einen „registration“-token).

Am Action-Tab nehmen wir folgende Änderungen vor.

Action „sendmail“
To „tokenowner“
emailconfig „smtp-server“
subject „QR-Code für FreeOTP registrieren“
body – siehe Abbildung

Das wäre es gewesen. Jetzt das ganze Setup noch testen, indem der PHP-Code aufgerufen wird. Werden E-Mails mit Registrierungscode verschickt?
Kann die Benutzerin einen TOTP-Token generieren?
Ist die 2FA aktiv und funktioniert?

Für manche macht es vielleicht Sinn die 2FA-Prüfung in der Schule nicht durchzuführen. Das kann man zum Beispiel durch folgenden authproc-Filter erreichen.

 70 => array(
      'class' => 'core:PHP',
      'code' => '
        if (($_SERVER["REMOTE_ADDR"] == "PUBLIC-SCHOOL-IPv4-ADDRESS") or ($_SERVER["REMOTE_ADDR"] == "PUBLIC-SCHOOL-IPv6")) {
          $state["use_pi"] = ["key" => "0"]; //turn off 2fa for school ip
        }
  ),

Literatur:
https://www.privacyidea.org/create-user-portal/

https://www.youtube.com/watch?v=ja1VeNYVxuM


0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.