2013-12-11 7 views
5

In meiner Datenbank speichere ich Informationen, die über eine PHP-Klasse verschlüsselt und entschlüsselt werden.Speicherort für den privaten Schlüssel für die Verschlüsselung in der PHP-Umgebung

Pro Anwendung verwende ich einen privaten Schlüssel mit einem Benutzerschlüssel, um sicherzustellen, dass die Entschlüsselung nur erfolgreich ist, wenn ein Benutzer versucht, seine eigenen Daten zu entschlüsseln.

Der Benutzerschlüssel wird in der Datenbank gespeichert; aber der private Schlüssel (Anwendungsebene) wird als txt-Datei im FS gespeichert. Natürlich "über" der Web-Wurzel.

Überlegungen: - Wenn die Datenbank gehackt wird: sie enden mit einem Teil des Schlüssels auf und verschlüsselten Daten - Wenn PHP-Stops oder beschädigt sind: sie mit einer einzigen Seite am Ende mit nur include('../private/private.php') drin.
- Wenn NGINX fehlschlägt: Die Verbindung wird "nur" gelöscht.

Das einzige Szenario, an das ich denken kann, ist die Korruption des Systems selbst. Aber der Server führt eine Firewall aus, wird regelmäßig aktualisiert, führt fail2ban aus und nur die benötigten Dienste werden ausgeführt. SSH Logins nur über Schlüssel-Zugang usw.

Ich fragte mich, ob dies die "beste" Praxis ist. Oder gibt es eine bessere Möglichkeit, diese Art der Verschlüsselung mit den oben genannten Spezifikationen zu tun? Was wären die korrekten Zugriffsrechte auf die Schlüsseldatei?

Im Moment befinden sich die Datenbank und der Webserver beide auf demselben Server mit Blick auf das Internet. Ist es besser, sie zu splitten und einen Internet-Server mit nur dem Webserver zu erstellen? und legen Sie den Datenbankserver und die Schlüsseldatei auf einem anderen Server in einem privaten Netzwerk ab?

edit: der private Schlüssel zur Verschlüsselung der Daten ist durch zwei Komponenten aufbauen:
$key = $app_key . $user_key

+3

Korrekte Zugriffsrechte auf die Schlüsseldatei wären '-r --------' oder '400' und der Webserver-Benutzer als Besitzer. Ansonsten scheint es, dass Sie einen ziemlich guten Job gemacht haben. –

+1

* "Ich benutze einen privaten Schlüssel mit einem Benutzerschlüssel, um sicherzustellen, dass die Entschlüsselung nur erfolgreich ist, wenn ein Benutzer versucht, seine eigenen Daten zu entschlüsseln" * Ich bin mir nicht sicher was meint. Sie behalten beide Schlüssel auf dem Server, damit die Entschlüsselung erfolgreich ist, wann immer Sie wollen. Umgekehrt, wenn der Server besessen wird, sind die Daten auch besessen. – Jon

+0

Es ist ein fähiger Start, es hängt ganz davon ab, welche Ebene von Informationen Sie haben und wie eng Sie mit Sicherheit sein müssen. Für die meisten üblichen Szenarien ist es in Ordnung, wenn Sie eine Überprüfung der Daemons durchführen möchten, die auf dem Betriebssystem ausgeführt werden, um zu überprüfen, ob auf ihnen bekannte Angriffsvektoren wie ssh'd version usw. sind. – Dave

Antwort

1

Sie können den Schlüssel in APC oder etwas ähnliches laden. Dies würde menschliche Eingaben während des Bootens erfordern (oder vielleicht von einem gesicherten Server gestartet). Dies würde bedeuten, dass der Schlüssel niemals in einer Datei auf dem Server gespeichert wird.

Es ist nicht perfekt, aber es ist besser als der typische Ansatz der Verwendung einer lokalen Datei.

q.v., Where should I store an encryption key for php?

2

Ich habe mich gefragt, ob dies die 'beste' ist die Praxis. Oder wenn es eine bessere Möglichkeit gibt, diese Art von Verschlüsselung mit obigen Spezifikationen zu tun? Was wären die korrekten Zugriffsrechte auf die Schlüsseldatei?

schwer zu implementieren

Um ganz sicher werden Sie auf einem HSM (Hardware Security Module), wie eine Smartcard oder eine HSM-Box ein privates-public-Schlüsselpaar zu erzeugen, benötigen würden. Der generierte private Schlüssel wird innerhalb des HSM erstellt und kann das HSM niemals verlassen, er kann nur für Entschlüsselungs-/Zeichenoperationen innerhalb des HSM selbst verwendet werden, er kann jedoch niemals vom HSM gelesen werden. Wenn in diesem Fall jemand Ihren Server hackt oder sogar die vollständige Kontrolle über Ihren Server erlangt, können Sie niemals den in HSM gespeicherten privaten Schlüssel erhalten. Abhängig von der Anzahl der Entschlüsselungs-/Zeichenoperationen, die auf Ihrem Server erforderlich sind, benötigen Sie ein angemessenes HSM, um die erforderlichen Daten zu entschlüsseln.Um diese Aufgabe in reinen PHP zu erreichen, ist jedoch ein langer Weg zu gehen (können Sie Ihre eigene C++ Erweiterung implementieren könnte oder Interprozess-Kommunikation mit einem Verfahren verwenden, das mit HSMs können interact ist)

Einfacher zu implementieren

Es ist wichtig, Ihren Server zu härten und den Angriffsvektor so gering wie möglich zu halten. Dies umfasst hauptsächlich die Zuweisung von Berechtigungen für Dateien und Datenbanken. Werfen Sie einen Blick auf this für einige gute Sicherheitsmaßnahmen. Um meine paar Cent hinzufügen Sie verwenden können:

  1. APC für in Speichern Ihrer privaten Schlüssel in PHP (dies wird Ihnen auch eine Leistungssteigerung gibt in Vergleichen mit constanlty einen Schlüssel aus einer Datei zu lesen). Sie müssen einen sicheren Mechanismus (z. B. die Eingabe eines Kennworts) implementieren, um bei jedem Neustart des Webservers einen verschlüsselten Schlüssel in den APC zu entschlüsseln/wiederherzustellen.
  2. So etwas wie ionCube für die Verschlüsselung und den Schutz Ihrer PHP-Skripte
  3. Steuerung Sie Bereitstellungsprozess unter Verwendung eines Applikationsbehälter wie docker

Im Moment ist die Datenbank und Webserver sind beide auf demselben Server zugewandt das Internet. Ist es besser, sie zu teilen und einen Internet-Server nur mit dem Webserver zu erstellen; und legen Sie den Datenbankserver und Schlüsseldatei auf einem anderen Server in einem privaten Netzwerk?

Ja, die Trennung des Webservers vom Datenbankserver ist definitiv eine gute Übung.

0

Sehen Sie sich den OWASP Cryptographic Storage Cheat Sheet und seine Empfehlungen an. Regel 2.1.5.4: Schützt Schlüssel in einem Schlüsseltresor. Schlüssel sollten nicht auf der Anwendung oder dem Webserver gespeichert werden.

Verwandte Themen