Projekt: Pwned Local Database

1. Einleitung

Dieses kleine PHP Projekt entstand aus der Notwendigkeit Passwort­änderungen unserer Kunden gegen bereits bekannte und triviale Passwörter zu sichern. Zum Verifizieren wollten wir die Passwörter nicht an einen fremden Dienst übermitteln. Die Gründe für dieses Vorgehen sind vielfältig:

  1. Das neue EU-DSVGO verhindert eine Weitergabe personen­bezogener Daten.
  2. Aus Gründen der Sicherheit sollten sensitive Daten nicht in fremde Hände gelangen.
  3. Erreichbarkeit des Dienstes

2. Installations­dateien

Sie finden die Installationsdateien auf unsere Github Seite unter: https://github.com/isp4u/pwned


3. Installations­anweisung

Fügen Sie zu Ihrer Webserver­konfiguration eine weitere Domain hinzu und sichern Sie diese mit einem SSL Zertifikat ab. Danach können Sie unsere PHP-Skripte via Git klonen und die Passwort­liste von https://haveibeenpwned.com/Passwords via Torrent oder Direkt­download herunter­laden und entpacken. Legen Sie vorher noch eine index.html Dummy Datei an und stellen in der Web­server­konfiguration das automatische Directory-Listings aus.

$ git clone https://github.com/isp4u/pwned.git
$ touch index.html
$ wget downloads.pwnedpasswords.com/passwords/pwned-passwords-ordered-by-count.7z
$ nohup 7z e pwned-passwords-ordered-by-count.7z &

Das Entpacken der Passwortliste kann ein paar Minuten dauern, Zeit genug um sich einen frischen Kaffee zu holen. Wenn die Daten entpackt sind, empfehlen wir das Archive zu löschen. Die aktuelle Version der Liste beinhaltet über 500 Millionen Einträge und ist im gepacktem Zustand über 10G groß. Danach transferieren wir die Passwörter in eine SQLite3 Datenbank. 

$ rm pwned-passwords-ordered-by-count.7z 
$ nohup php pwnedCreateDBs.php new pwned-passwords-ordered-by-count.txt secretDBPw.db secretDBCustomPw.db &

Der letzte Befehl wir einige Zeit dauern. Durch den Befehl "nohup" können Sie sich nun auch von der Shell abmelden, einen weiteren Kaffee trinken und zum Mittagessen gehen. Bitte wählen Sie aus Gründen der Sicherheit für secretDBPw.db und secretDBCustomPw.db zwei zufällig gewählte Dateinamen. Die Datei  secretDBCustomPw.db kann gelöscht werden, wenn Sie in der Konfigurationsdatei pwnedConf.php die Variable $pwnedTrackPasswords auf False setzen. Weitere Informationen hierzu finden Sie unter 4.1. Konfigurationsdatei: pwnedConf.php. Sie können nun auch die heruntergeladene und entpackte Passwortliste löschen. Nun steht die Anpassung von pwnedConf.php an.

$ rm pwned-passwords-ordered-by-count.txt
$ joe pwnedConf.php

<?php
    if (!defined('pwned')) {
    die ('No direct access!');
  }
  $pwnedWithApiKey = True;     
  $pwnedAllowGET = False;        
  $pwnedAuthUser = 'default';      
  $pwnedAuthApikey ='default';  
  $pwnedDB = 'pwned.db3';  //-------- Change this         
  $pwnedTrackPasswords = False;    
  $pwnedPasswordDB = 'userdb.db3';  //-------- Change this     
 ?>


4. Dokumentation

4.1. Konfigurationsdatei: pwnedConf.php

Erklärung der einzelnen Konfigurationvariablen.
 

VariableTypeBeschreibung
$pwnedWithApiKeyBooleanTrue
globaler Api User und Key sind hinterlegt.

False
Keine Authentifizierung mit Apikey und User.
$pwnedAllowGetBooleanTrue
Akzeptiert sowohl $_GET als auch $_POST Variablen.

False
Akzeptiert nur $_POST Variablen. Diese Methode ist vorzuziehen, da die Daten nicht in der URL auftauchen und somit auch nicht im Serverlog gespeichert werden.
$pwnedAuthUserStringEnthält den Benutzername für die globale Authentifizierung. 
$pwnedAuthApikeyStringEnthält den Apikey für die globale Authentifizierung. 
$pwnedDBStringEnthält den Dateinamen für die pwned Passwortliste. Bitte nutzen Sie hierfür einen zufälligen Namen, um Downloads zu verhindern. z.B. QRd4fERdjhjh34j553jao.db3
$pwnedTrackPasswordsBooleanTrue
Speichert die übergebenden SHA1 Passwörter in einer eigenen Datenbank. Nützlich nach der Entdeckung eines Einbruchs in das System. Man kann dann die kompromittierten Passwörter in die pwned Datenbank übernehmen. 

False
Speichert keine SHA1 Passwörter.
$pwnedPasswordDBStringDatenbankname der SHA1 Kundenpasswörter. Hier ist es wichtig, dass der Datenbankname absolut zufällig gewählt wird. Da ein Download der Datei die Sicherheit des Systems kompromittiert!!!

4.2. pwnedUserAuth.php

Das Grundgerüst für eine Benutzer­authentifizierung. Als Default Wert wird False zurück­gegeben. Sollten Sie keine eigene Authentifizierung wollen, müssen Sie diese Datei nicht bearbeiten. Setzen Sie in pwnedConf.php die Variable $pwnedWithApiKey auf True um gegen einen globalen User / Apikey zu prüfen.

<?php
  if (!defined('pwned')) {
    die ('No direct access!');
  } 
  function isPwnedUserAuth ($user,$apikey,$response) {
    $response['error'] = True;
    $response['msg'] = 'Not authenticated.';
    return False;
  }
?>

VariableTypeBeschreibung
$userStringEnthalt den Benutzernamen
$apikeyStringEnthalt den Api Schlüssel. 
$responseArray 
FeldnameTypeBeschreibung
errorBooleanTrue
Signalisiert einen Fehler.

False
Kein Fehler.

Dieses Feld muss gesetzt werden.
msgStringEnthält eine genaue Fehlerbeschreibung, sobald das Feld 'error' True ist.

Weitere Felder können nach Belieben hinzugefügt werden.

Rückgabewert der FunktionBooleanTrue
Benutzer darf unsere pwned Datenbank abfragen.

False
Die Authentifizierung des Benutzers ist fehlgeschlagen. Weitere Fehlerinformationen sind in der Variable $response enthalten.

5. Weitere Links

[1] Have I Been Pwned
[2] https://github.com/isp4u/pwned
[3] Genutzt von isp4u.de
[4] Genutzt von ratgeber-arzt.de


 

Tags: php pwned passwort isp4u