Wie kann ich den Verschlüsselungsschlüssel schützen, der zum Verschlüsseln vertraulicher Daten im appsettings.json
meiner Webanwendung verwendet wird?
Ich möchte sensible Daten in der Konfiguration meiner Webanwendung schützen.
In ASP.NET MVC4-Anwendungen haben wir es so gemacht:
web.config
(oder web.prod.config
usw.) hinzugefügt. Stattdessen wird eine Platzhaltervariable geschrieben.web.config
.aspnet_regiis.exe
verschlüsseln.Jetzt verwenden wir ASP.NET Core. Der Prozess, den wir verfolgen, ist etwas anders.
appsettings.json
enthält die Platzhaltervariablen für vertrauliche Daten Ähnlich wie zuvor web.config gearbeitet hat.Anstatt aspnet_regiis
zu verwenden, glaube ich, dass ich Folgendes tun muss:
a) Erstellen Sie mein eigenes benutzerdefiniertes Tool, um Teile der appsettings.json
-Datei zu verschlüsseln.
b) Erstellen Sie einen benutzerdefinierten Konfigurationsanbieter, der den/die appsettings.json
(alle Teile davon) entschlüsseln kann.
Was ich nicht verstehe, ist der Schutz des für (a) und (b) verwendeten Verschlüsselungsschlüssels. Die alte Methode nutzte den Computerschlüssel des Servers zum Verschlüsseln der Datei.
Die Bedrohung, die ich zu verringern versuche, besteht darin, dass jemand Zugriff auf den appsettings.json
auf dem Server erhält und sensible Daten daraus liest (z. B. Datenbankkennwort usw.).
Ich bin auch an alternativen Wegen interessiert, um diese Bedrohung und/oder andere Probleme mit diesem Ansatz im Allgemeinen zu mildern.
Wenn Sie dem Server nicht "vertrauen", können Sie die "Geheimnisse" nicht schützen, die Sie auf diesem Server speichern.
Erläuterung:
Unabhängig davon, welches "gesicherte" (= ungesicherte) Schema Sie erfinden - wenn die Anwendung gestartet wird, muss es möglich sein, Geheimnisse in "verwendbarer" Form zu "entschlüsseln".
Dies bedeutet, dass alle zum "Entschlüsseln" erforderlichen "Schlüssel" (Zertifikate usw.) auf diesem Server vorhanden sein müssen und für die App zugänglich sind (andernfalls kann die App nicht gestartet werden).
Dies bedeutet, dass ein Bösewicht, der auf den Server und die App zugreift, auch auf alle "Schlüssel" darauf zugreifen und Ihre Geheimnisse "entschlüsseln" kann. Möglicherweise durch Kopieren von Dateien, durch Dekompilieren der App, möglicherweise Speicherauszug der App. Dies kann jedoch der Fall sein.
Es gibt keinen absoluten Schutz.
Es scheint, dass Sie nicht an "Wegen" interessiert sind, sondern an dem empfohlenen Ansatz, den ASP.NET Core unterstützt. In anderen Antworten wurde Azure KeyVault zwar als guter Speicher für vertrauliche Informationen erwähnt, es ist jedoch nicht der richtige Weg, diese Informationen zu speichern, sondern den tatsächlichen Speicher ASP.NET Core unterstützt die Vorstellung von overridable configuration
. Das heißt, mehrere Konfigurationsanbieter können im Konfigurationssystem registriert werden und in der Reihenfolge, in der sie registriert sind. Jede registrierte Einstellung überschreibt Einstellungen von vorherigen Providern - die sie natürlich hat. Wenn Sie also den Standard-JSON-Konfigurationsprovider registriert haben und dann auch einen Datenbankkonfigurationsprovider annehmen, dann die Einstellungen, die beide Provider haben. werden die Werte erhalten, die von dem später definierten Provider definiert werden - dem Datenbankprovider ..__ In Ihrer Situation also, was ich vorschlagen würde:
Dies ist zwar keine 1: 1-Zuordnung zu Ihrem aktuellen Prozess, es steht jedoch in Einklang mit den ASP.NET Core-Prinzipien.
Weitere Informationen zur ASP.NET-Konfiguration finden Sie unter: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/configuration/index?tabs=basicconfiguration
Hier finden Sie Informationen zum Konfigurationsanbieter von Azure KeyVault: https://docs.Microsoft.com/en-us/aspnet/core/security/key-vault-configuration?tabs=aspnetcore2x
Wenn die zertifikatsbasierte Authentifizierung keine Option für Sie ist, sollten Sie ClientId
und ClientSecret
für das Herstellen einer Verbindung zum Azure Key Vault-Dienst in Umgebungsvariablen speichern und einen geeigneten Konfigurationsanbieter (AddEnvironmentVariables()
) verwenden, um auf diese zuzugreifen.
Dieses Setup wird sehr sicher sein. Viel Glück!
Wenn jemand, der nicht autorisiert ist, Zugriff auf den Server erhält, ist das Stehlen der Geheimnisse - z. B. Datenbankverbindungszeichenfolgen - nur ein kleiner Teil des Problems (Antwort von @ Dmitry).
Da Sie eine bessere Kontrolle über die geheimen Daten oder die Konfiguration wünschen, ist es unwahrscheinlich, dass okay etwas vom üblichenappsettings.json
- basierten Ansatz abweicht.
Sie können die Geheimnisse mit dem Zertifikat des Servers asymmetrisch verschlüsseln, in einer separaten Datei speichern (dies könnte eine andere .json
-Datei sein), dann die Datei lesen und die Geheimnisse beim Start/bei jeder Webanforderung entschlüsseln. Auf diese Weise sind die Geheimnisse fast so sicher wie das Zertifikat/der private Schlüssel des Servers.
Eine weitere Möglichkeit: Verschlüsseln Sie die Geheimnisse symmetrisch und geben Sie das Kennwort beim Start der Webanwendung an, damit diese die Geheimnisse entschlüsseln kann. Wenn der Prozess, der die Webanwendung hostet, neu gestartet wird, müssen Sie das Kennwort erneut eingeben.
Siehe auch Data Protection in ASP.NET Core , Data Protection-Beispiele .
Manchmal genügen lange und kryptische Passwörter oder die einfache Verschleierung eines ansonsten menschenfreundlichen Passworts. Das heißt, nur gegen Abhören zu schützen. Angenommen, jemand, der neben dem Administrator sitzt, kann keine Zeichenfolge scheinbar zufälliger Zeichen lesen und speichern.
Ich konvertiere den Kommentar in eine Antwort :)
Auch wenn Sie nicht unter Azure laufen, würde ich dennoch empfehlen, Azure Key Vault zum Speichern Ihrer Geheimnisse zu verwenden. Für den Anfang ist es sehr günstig (~ 0.0159/10.000 Operationen) und zweitens ist es von überall her erreichbar, auch außerhalb von Azure. Darüber hinaus können die Geheimnisse in Azure Key Vault mit einer Version versehen werden. Dies ist eine nette Funktion zur Unterstützung mehrerer Versionen eines geheimen Umfelds (nur für die Vorproduktion, da Production über einen eigenen eigenen Tresor verfügen sollte). Das Paket Key Vault NuGet enthält Vorgänge zum Abrufen und Hinzufügen von Geheimnissen in .NET Core. Hier ist ein Link zur Dokumentation.
Sie können über einen In-Memory-Cache verfügen, sodass ein REST - Aufruf (oder eine Methode der Key Vault-Paketmethode) für Key Vault nur beim Start Ihrer Anwendung (oder wenn der Cache abläuft) ausgeführt wird. Dadurch werden weitere Latenzen vermieden. Drittens ist dies der empfohlene Ansatz von Microsoft.
Hoffe das hilft.