Ich arbeite mit Symfony Framework und Propel und ich war wandernd, was ist der einfachste Weg, um eine Datenbank zu verschlüsseln. Ich spreche nicht über Passwörter, sondern die ganze Datenbank. Ich habe eine kleine Webanwendung für einen Kunden gebaut, die einige Informationen verwaltet (Benutzerkonten, Passwörter usw.) und ich möchte nicht, dass sie sichtbar ist, wenn jemand zum Beispiel Zugriff auf phpmyadmin hat.
Antworten
Zu viele Anzeigen?Normalerweise würden Sie dies mit den in MySQL eingebauten Rechten handhaben.
Der einzige Weg, wie jemand phpMyAdmin benutzen könnte, ist, wenn es auf dem Server installiert und konfiguriert ist - der einfachste Weg, das zu beheben, ist, es einfach zu deinstallieren, oder, wenn Sie das nicht tun können, eine SSL-Verbindung und sichere Passwörter zu verwenden.
Andere Dinge, die man in Betracht ziehen könnte, wären das Sperren des Servers - für den Anfang können Sie sicherstellen, dass MySQL nur Verbindungen von localhost oder dem lokalen Netzwerk akzeptiert.
Was die eigentliche Frage betrifft, so kenne ich keine Möglichkeit, eine ganze Datenbank auf effektive Weise zu verschlüsseln. Sie können zwar die Daten verschlüsseln, aber da Sie den Entschlüsselungscode ohnehin auf dem Server platzieren müssten, wäre der Nutzen fraglich ... wenn jemand Zugang zum Server hat, könnte er immer noch auf die Daten zugreifen. Am besten ist es, diesen Zugriff von vornherein zu verhindern.
Nun, dies könnte ein bisschen naiv sein, aber wie über einfach verschlüsseln auf dem Server [php ich annehmen] Seite, bevor Sie in die DB zu schreiben und dann entschlüsseln Sie es zurück, wenn Sie lesen tun? Es sieht so aus, als ob Ihr Problem darin besteht, dass Sie nicht wollen, dass ein Server-Administrator einfach Ihre Daten lesen. Wenn Sie Symfony verwenden, können Sie dies wahrscheinlich tief genug im Modell tun, dass Ihr Code nicht geändert werden muss.
Nach einigem Suchen habe ich herausgefunden, wie ich es machen würde, wenn ich mich besonders mutig fühlen würde.
Editieren Sie buildParams() in xxx/symfony/vendor/propel/util/BasePeer.php, auf etwa 860 finden Sie
$params[] = array('column' => $crit->getColumn(), 'table' => $crit->getTable(), 'value' => $crit->getValue());
Wechsel zu
$params[] = array('column' => $crit->getColumn(), 'table' => $crit->getTable(), 'value' => your_encryption_method($crit->getValue()));
(es sei denn, ich habe etwas übersehen) alle symfony/propel schreibt an die Datenbank wird schließlich bis zum Aufruf dieser Funktion, so dass alles, was Sie an die db schreiben wird mit your_encryption_method() verschlüsselt.
Probieren Sie es aus, und wenn es funktioniert und Sie immer noch Wenn Sie sich mutig fühlen, ändern Sie die Funktion addHydrate() in xxx/symfony/vendor/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php (Zeile 668) so, dass der hydrate()-Code, den Propel für Sie erzeugt, wenn Sie symfony propel-build-model ou symfony-propel-build-all wird automatisch alles aus der Datenbank entschlüsselt.
sollte es derzeit wie folgt aussehen
case PropelTypes::DATE:
case PropelTypes::TIME:
case PropelTypes::TIMESTAMP:
$script .= "
\$this->$clo = \$rs->get$affix(\$startcol + $n, null);
";
break;
default:
$script .= "
\$this->$clo = \$rs->get$affix(\$startcol + $n);
";
möchten Sie es ändern in etwas in der Art von
case PropelTypes::DATE:
case PropelTypes::TIME:
case PropelTypes::TIMESTAMP:
$script .= "
\$this->$clo = \$rs->get$affix(\$startcol + $n, null);
";
break;
default:
$script .= "
\$this->$clo = \my_decryption_function($rs->get$affix(\$startcol + $n));
";
Nachdem Sie diese Änderung vorgenommen haben, führen Sie symfony propel-build-model aus und lassen Sie mich wissen, ob es funktioniert hat :-). Viel Glück und Sie wissen das wahrscheinlich schon, aber machen Sie Backups von diesen Dateien, bevor Sie sie ändern.... oh und da Sie den Kern von Symfony ändern, werden Ihre anderen Projekte Probleme haben, es sei denn, Sie wollen, dass sie alle verschlüsselte Daten in die Datenbank schreiben
Dies ist eine Frage der Stufe 3. Sie müssen mehrere Dinge schützen:
- Die Eingangs-/Ausgangsdaten können also nicht abgefangen werden können.
- Die Administratorrechte, damit Ihr System nicht von einer falschen Person betreten werden kann während der Arbeit.
- Die Festplatte selbst, d.h. wenn jemand direkten Zugriff auf den Computer hat Computer hat, kann er nicht darauf zugreifen zugreifen, selbst wenn er die Hardware extrahiert.
Für 1 können Sie SSL und HTTPS verwenden.
Für 2, folgen Sie den bewährten Praktiken der sysadmin für die Einstellung Passwörter, Rechte und Updates (serverfault.com ist Ihr Freund). Dies gilt auch für den DB-Admin.
Bei 3 müssen Sie die gesamte Hardware verschlüsseln. Wenn Sie nur die DB verschlüsseln, wird die Leistung Ihres Servers beeinträchtigt. Die Verwendung von Verschlüsselung verlangsamt Ihr System ohnehin, aber die Verschlüsselung auf einer Ebene oberhalb des Dateisystems ist eine Sackgasse für Webanwendungen. Außerdem sind die Tools, mit denen man ein ganzes Linux-System auf einer verschlüsselten Festplatte betreiben kann, ziemlich ausgereift (unter Ubuntu kann man das mit LVM fast transparent machen).
Wie Sie bemerkt haben, hat dies nichts mit Symfony zu tun, was auch immer.