Ist es eine gute Praxis, Verbindungszeichenfolgen in einer Webkonfiguration festzulegen?

14

Kürzlich habe ich eine Diskussion mit einigen meiner Kollegen bei meiner Arbeit, weil sie sagten, dass es besser ist, in einer .DLL eine String-Verbindung zu verschlüsseln. Und ich sagte, warum nicht einfach die in der web.config definierte String-Verbindung verschlüsselt verwenden? es ist das gleiche und es ist besser, weil das Entity Framework zum Beispiel in der Webkonfiguration der Anwendung nach dem Namen der Verbindung sucht.

Jorge
quelle
2
Natürlich können Sie die Anwendung auch nur als Domänenbenutzer ausführen lassen und nur diesem Benutzer den Zugriff auf die Datenbank erlauben. Dann benötigen sie Zugriff auf LDAP, um in Ihre Datenbank einzubrechen.
pdr
@pdr: In der Verbindungszeichenfolge werden weiterhin einige Informationen angezeigt, die Sie nicht anzeigen möchten, wenn der Webserver kompromittiert wurde, z. B. der Name des Datenbankservers und der Name der Datenbank.
Carson63000

Antworten:

18

Es gibt keinen wesentlichen Unterschied, außer dass Sie tatsächlich eine Binärdatei erstellen müssen, wenn Sie eine Konfigurationsänderung vornehmen möchten, wenn Sie diese in eine DLL einfügen, während ein Administrator die Konfiguration nur mit gut verständlichen Standardwerkzeugen ändern kann wenn es in der config ist. Es gibt bereits einen Mechanismus zum Verschlüsseln von Konfigurationszeichenfolgen und zusätzliche Anleitungen zu MSDN . Aktuelle Versionen von Asp.Net verfügen möglicherweise über alternative Mechanismen. Führen Sie daher einige zusätzliche Untersuchungen durch, bevor Sie sich zu einem Ansatz entschließen.

Nur weil sich etwas in einer DLL befindet, wird es nicht sicherer. Ein Texteditor kann auch Binärdateien öffnen. Tools wie Reflector bieten eine bessere Oberfläche für die Navigation in einer .Net-DLL. Eine DLL bietet keine zusätzliche Verschlüsselung.

JasonTrue
quelle
Test ist binär, binär sind Zahlen, wenn jemand die Einsen und Nullen lesen kann, ist Ihre physische und Software-Sicherheit fehlgeschlagen.
Ramhound
12

Es ist egal, wo die verschlüsselten Daten gespeichert sind, es ist wichtig, wie sie verschlüsselt sind.

Verschlüsselte Abschnitte in einer web.config werden normalerweise mit der Data Protection API verschlüsselt , die extrem schwer zu knacken ist, ohne den gesamten Computer zu beeinträchtigen. Sie können auch einen RSA-Schlüsselcontainer verwenden, der ähnlich ist (es ist schwierig, ihn von der Maschine zu entfernen).

Wenn Sie die verschlüsselte Zeichenfolge in der DLL speichern möchten, ist das in Ordnung, denke ich, obwohl es von Natur aus nicht sicherer ist als eine verschlüsselte web.config (jeder kann mit Reflector in diese DLL hineinschauen ) und es ist offensichtlich schwieriger, sie zu ändern (Sie) müsste neu kompilieren). Noch viel wichtiger ist jedoch, wie diese verschlüsselte Zeichenfolge generiert wurde. Vermutlich verwenden Sie nicht dieselben Anbieter wie für eine verschlüsselte web.config. Was verwenden Sie also?

Ein Verschlüsselungsschema ist nur so stark wie der private Schlüssel oder das gemeinsame Geheimnis. Wenn dieser Schlüssel auch in Ihrer Assembly gespeichert ist, haben Sie möglicherweise überhaupt keine Verschlüsselung. Wenn es in einer externen Datenbank gespeichert ist, stellt sich die Frage, wie die Verbindungszeichenfolge dieser Datenbank gesichert ist. Dies kann eigentlich nur zu einer insgesamt schwächeren Sicherheit führen.

Auf der anderen Seite, wenn Sie ein Service - Provider und die Verbindungszeichenfolge waren mit einem verschlüsselten wurden Benutzer - Passwort, das wäre dann mehr sicherer als eine statische Maschine Schlüssel. Wenn Sie zum Verschlüsseln Benutzerkennwörter verwenden, ist es jedoch ziemlich unwahrscheinlich, dass Sie die verschlüsselten Daten in Ihrer Assembly fest codieren, da sie als Reaktion auf Benutzeraktionen (nicht Entwickleraktionen) generiert und gespeichert werden müssen.

Wirklich kann ich nicht an zu viele Situationen denken, in denen das harte Codieren einer (verschlüsselten) Verbindungszeichenfolge in der DLL sicherer ist als das Verschlüsseln des relevanten Abschnitts web.config. Im besten Fall erhöht dies nur die Unannehmlichkeit, im schlimmsten Fall wird auf einige plump geschriebene, mit Löchern durchsetzte benutzerdefinierte Sicherheitsfunktionen zurückgegriffen. Tun Sie sich selbst einen Gefallen und tun Sie, was Microsoft empfiehlt - verschlüsseln Sie einfach Ihre web.config, wenn dort vertrauliche Daten gespeichert sind.

Aaronaught
quelle
2

Die bewährte Methode für ASP.NET besteht darin, alle Konfigurationen / Einstellungen in der Datei web.config oder app.config (für andere Projekttypen) abzulegen.

Die Verschlüsselung und der Grund, warum Sie sie für Ihre Verbindungszeichenfolgen verwenden, müssen ein ganz besonderer Fall sein. Da in den meisten Fällen bis zu 99% keine Verschlüsselung der Verbindungszeichenfolgen erforderlich ist. Microsoft-eigene Unternehmensanwendungen haben ihre Verbindungszeichenfolge in der Datei web.config / app.config verfügbar gemacht. Ich denke, Sie sind über die Sicherheit zu komplizieren.

Eine weitere Sache ist, dass Sie Ihre Verbindungszeichenfolgen hart codieren. Fügen Sie beispielsweise keine Verbindungszeichenfolge (auch als Verbindungszeichenfolge bezeichnet) in eine DLL, eine ASPX / ASCX / CSHML-Datei oder einen Code-Behind ein.

William Chang
quelle
1
Sie sollten niemals ein Passwort im Klartext in einer Konfigurationsdatei haben. Nur weil es sich um eine Unternehmensanwendung hinter Firewalls handelt, bedeutet dies nicht, dass sie sicher ist und Sie die Sicherheit vergessen können.
Ryan M