Hier ist ein interessantes Problem, und ich suche nach einem Muster, das alles funktionsfähig hält.
Ich baue eine Smart-Client-App für ein Schulsystem. Es enthält Informationen über Schüler einschließlich ihrer Zeugnisse, Krankheitstage und so weiter. Es werden Berichte auf Schülerebene erstellt, einschließlich ihrer Zeugnisse, die alle mit sehr persönlichen Kommentaren ihrer Lehrer versehen sind. Die App ruft Daten über Webdienste vom Remote-Server ab.
Die Daten sind also ziemlich vertraulich. Ich werde es in der Datenbank verschlüsseln und es beim Abrufen entschlüsseln - kein Problem dort.
Das Problem ist, dass mein Team und ich nie die Produktions-Klartextdaten sehen sollten. Ein interessantes Problem ergibt sich dann für die Untersuchung von Produktionsfehlern! Wir wollen den gleichen Datensatz wie der Benutzer öffnen, um zu sehen, was er sieht. Aber wenn wir das tun, verletzen wir die Vertraulichkeit.
Mein Gedanke ist das und es ist nicht perfekt.
Schließlich müssen wir in den Fällen, in denen wir unbedingt den Klartext der Datensätze eines Studenten sehen müssen, eine Überschreibungseinstellung in der Benutzeroberfläche vornehmen, die die Konfigurationseinstellung ablehnt und den Klartext anzeigt. Und das schaffen wir auf menschlicher Ebene - indem wir die Schulverwaltung informieren, dass wir an DIESEM Datum aus DIESEM Grund die Unterlagen dieses Schülers sehen müssen, etc. Unterschriften werden unterschrieben, murrende Zustimmung gegeben, Anwälte werden zu ihren Jets geschickt, spülen und wiederholen.
Gedanken? Ich fühle, dass dies muss ausgetretener Boden sein. Bitte helfen Sie mir, wenn möglich, diesen Plan zu verbessern.
Tatsächlich müssen Sie die Daten auf der Benutzeroberfläche nicht entschlüsseln. SQL Server verfügt über Tools für die Echtzeit-Verschlüsselung für Sie. Wenn jemand den Klartext sehen wollte, konnte er in eine Rolle fallen, die ihm diese Erlaubnis gab (und wenn er fertig war).
Wenn Sie jedoch die Vertraulichkeit der Daten sehen, können Sie die Produktionsdaten natürlich nicht sehen. Die einzige Lösung ist eine Kopie der Daten entweder mit Munged-Daten oder völlig zufälligen Daten.
Nachdem wir in einem Team mit einem ähnlichen Problem waren, mussten wir einen riesigen Vorrat an gefälschten Daten verwenden. Produktion war IMMER raten Arbeit. Niemand durfte irgendwelche der Chiffren kennen.
BEARBEITEN
Wenn Sie vollkommen sicher sein wollen, würden Sie es einem externen Unternehmen erlauben, mit den Daten umzugehen, was sie in die Lage versetzt, die Daten zu schützen und garantiert, dass Sie nicht verklagt werden, wenn ein Fehler passiert. Nur meine .02
Im Allgemeinen habe ich das wie folgt angegangen:
SQL Server verfügt über eine Verschlüsselungsfunktion - entweder transparente Verschlüsselung (die für Ihren Fall nicht geeignet ist, da entschlüsselte Daten in Abfragen angezeigt werden) oder schlüsselbasierte Verschlüsselung, bei der Benutzerkonten Zugriffssteuerungslisten für den Schlüssel besitzen. Mit dieser Methode erstellen Sie ein X509-Zertifikat auf dem SQL-Server selbst und generieren dann symmetrische Schlüssel mit geeigneten ACLs. Innerhalb Ihrer gespeicherten Prozeduren können Sie dann den symmetrischen Schlüssel öffnen, um unverschlüsselte Daten an Ihre Anwendung zurückzugeben. Natürlich sollten Sie sich mit sicheren Mitteln mit SQL verbinden - Sie können ein X509-Zertifikat auf den SQL-Server setzen, um Verbindungen zu schützen.
Natürlich haben Sie jetzt das Problem der Schlüsselverwaltung. Sie können ein spezifisches Windows-Konto erstellen, unter dem Ihre Anwendung läuft, mit einem zufälligen starken Passwort, das verworfen wird, sobald Sie den Anwendungspool konfigurieren und dieses NT-Konto zu SQL hinzufügen (wenn Sie innerhalb einer Domänenumgebung sind, ist dies einfach) zu tun, Arbeitsgruppen müssen Sie das Konto auf dem IIS und SQL-Server spiegeln). Zum Debuggen benötigen Sie ein anderes Konto mit Zugriff auf die Schlüssel. Das Passwort für dieses Konto sollte in einem "break glass" eingerichtet sein - irgendwo gespeichert, das auditierbar ist, oder die Hälfte des Passwortes wird von zwei oder mehr Personen geteilt, die zustimmen müssen, mit formeller Abzeichnung, dass es benötigt wird (und dann wird es einmal geändert )
Es gibt eine Einführung in die SQL-Verschlüsselung hier , aber ACLs werden nicht behandelt. MSDN hat einen ganzen Abschnitt darauf, der auch Authenticators und die verschiedenen Optionen umfasst, die Ihnen zur Verfügung stehen.
Wenn Sie einen Verschlüsselungs-Webdienst verwenden, den Sie zum Verschlüsseln von Daten aufrufen, wird eine GUID-Referenz auf einen Schlüssel und den Chiffretext zurückgegeben. Auf diese Weise kann der Schlüssel in einer gut geschützten Datenbank gespeichert werden und die Entschlüsselungsfunktionen können pro Konto geschützt werden. Auch hier müßtest du einen break-glass-Account haben. Ich habe dies getan, wenn Kunden sich nicht sicher genug fühlen, SQL-Verschlüsselung selbst zu verwalten.
Eine Sache, die Sie unbedingt haben sollten, ist ein unveränderlicher Audit-Trail. Wann immer jemand auf vertrauliche Daten zugreift, wird ein Audit-Datensatz erstellt. In Fällen, in denen SysAdmins Zugriff auf Berichtsdaten anfordert, die normalerweise nicht angezeigt werden sollen, werden Ausnahmen protokolliert.
Der Kunde sollte einen Geschäftsprozess einrichten, um alle Ausnahmen im Audit-Protokoll regelmäßig zu überprüfen. Dies sollte sowohl als Abschreckung für den Missbrauch des Systems dienen, als auch Untersuchungen nach der Tat ermöglichen, wenn jemand >> schurkisch wird.
Tags und Links design-patterns sql-server-2008 vb.net encryption obfuscation