Wenn eine PHP-Anwendung eine Datenbankverbindung herstellt, muss sie natürlich in der Regel einen Login und ein Passwort übergeben. Wenn ich für meine Anwendung einen einzigen Mindestberechtigungs-Login verwende, muss das PHP diesen Login und das Passwort irgendwo wissen. Was ist der beste Weg, um dieses Passwort zu sichern? Es scheint, als wäre es keine gute Idee, es einfach im PHP-Code zu schreiben.
Antworten
Zu viele Anzeigen?Diese Lösung ist allgemein gültig, da sie sowohl für Open-Source- als auch für Closed-Source-Anwendungen nützlich ist.
- Erstellen Sie einen Betriebssystembenutzer für Ihre Anwendung. Siehe http://en.wikipedia.org/wiki/Principle_of_least_privilege
- Erstellen Sie eine (nicht-sitzungsbezogene) Betriebssystemumgebungsvariable für diesen Benutzer mit dem Passwort
- Führen Sie die Anwendung als diesen Benutzer aus
Vorteile:
- Sie werden Ihr Passwort nicht versehentlich in die Versionskontrolle hochladen, weil Sie es nicht können
- Sie werden nicht versehentlich Dateiberechtigungen zerstören. Nun ja, es könnte passieren, aber es betrifft dies nicht.
- Kann nur von Root oder diesem Benutzer gelesen werden. Root kann sowieso alle Ihre Dateien und Verschlüsselungsschlüssel lesen.
- Wenn Sie Verschlüsselung verwenden, wie speichern Sie den Schlüssel sicher?
- Funktioniert plattformübergreifend
- Vergewissern Sie sich, dass Sie die Umgebungsvariablen nicht an nicht vertrauenswürdige Unterprozesse übergeben
Diese Methode wird von Heroku empfohlen, die sehr erfolgreich sind.
Wenn es möglich ist, die Datenbankverbindung in derselben Datei zu erstellen, in der die Anmeldedaten gespeichert sind. Fügen Sie die Anmeldedaten in der Verbindungsanweisung ein.
mysql_connect("localhost", "ich", "meinpasswort");
Sonst ist es am besten, die Anmeldedaten nach der Verbindungsanweisung zu löschen, da Anmeldedaten, die nicht im Speicher sind, nicht aus dem Speicher gelesen werden können ;)
include("/ausserhalb-webroot/db_settings.php");
mysql_connect("localhost", $db_benutzer, $db_passwort);
unset ($db_benutzer, $db_passwort);
Zuvor haben wir Benutzername/Passwort in einer Konfigurationsdatei gespeichert, sind aber jetzt in den paranoiden Modus übergegangen - verfolgen eine Politik der Defence in Depth.
Wenn Ihre Anwendung kompromittiert ist, hat der Benutzer Lesezugriff auf Ihre Konfigurationsdatei und es besteht die Möglichkeit, dass ein Angreifer diese Informationen liest. Konfigurationsdateien können auch in Versionskontrolle geraten oder auf Servern kopiert werden.
Wir haben umgestellt und setzen Benutzername/Passwort als Umgebungsvariablen im Apache VirtualHost. Diese Konfiguration ist nur von root lesbar - hoffentlich wird Ihr Apache-Benutzer nicht als root ausgeführt.
Der Nachteil dabei ist, dass das Passwort jetzt in einer globalen PHP-Variablen steht.
Um dieses Risiko zu mindern, treffen wir folgende Sicherheitsmaßnahmen:
- Das Passwort ist verschlüsselt. Wir erweitern die PDO-Klasse um Logik zum Entschlüsseln des Passworts. Wenn jemand den Code liest, in dem wir eine Verbindung herstellen, wird nicht offensichtlich sein, dass die Verbindung mit einem verschlüsselten Passwort und nicht mit dem Passwort selbst hergestellt wird.
- Das verschlüsselte Passwort wird von den globalen Variablen in eine private Variable verschoben. Die Anwendung macht dies sofort, um das Zeitfenster zu verringern, in dem der Wert im globalen Raum verfügbar ist.
phpinfo()
ist deaktiviert. PHPInfo ist ein einfaches Ziel, um einen Überblick über alles zu bekommen, einschließlich Umgebungsvariablen.
Ihre Möglichkeiten sind ziemlich begrenzt, da Sie das Passwort benötigen, um auf die Datenbank zuzugreifen. Ein allgemeiner Ansatz besteht darin, den Benutzernamen und das Passwort in einer separaten Konfigurationsdatei anstatt im Hauptskript zu speichern. Stellen Sie dann sicher, dass Sie diese außerhalb des Haupt-Webbaums speichern. So wird verhindert, dass bei einem Web-Konfigurationsproblem, das dazu führt, dass Ihre PHP-Dateien einfach als Text angezeigt werden anstatt ausgeführt zu werden, das Passwort offengelegt wird.
Ansonsten sind Sie auf dem richtigen Weg mit minimalem Zugriff für das verwendete Konto. Fügen Sie dazu hinzu
- Verwenden Sie die Kombination aus Benutzername/Passwort nicht für etwas anderes
- Konfigurieren Sie den Datenbankserver so, dass er nur Verbindungen vom Web-Host für diesen Benutzer akzeptiert (localhost ist noch besser, wenn die DB auf demselben Computer ist). So sind die Anmeldeinformationen selbst dann nutzlos, wenn sie preisgegeben werden, es sei denn, die Person hat anderweitigen Zugriff auf den Computer.
- Verschleiern Sie das Passwort (selbst ROT13 wird ausreichen), auch wenn es nicht viel Schutz bietet, wenn jemand Zugriff auf die Datei erhält, aber zumindest verhindert es das einfache Anzeigen davon.
Peter
3 Stimmen
Um vollständig sicher zu sein, müssen Sie eine SSL-Verbindung einrichten, da sonst jeder in Ihrem Netzwerk das Passwort, das Sie eingeben, immer noch abfangen kann.
2 Stimmen
Meinen Sie die Benutzerpasswörter oder das Datenbankpasswort, das im Verbindungsschlüssel verwendet wird?
5 Stimmen
Datenbankpasswort, das im Verbindungszeichenfolge verwendet wird. Vielen Dank!