webentwicklung-frage-antwort-db.com.de

Appsettings.json sicher auf dem Server verschlüsseln/entschlüsseln

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:

  1. Vertrauliche Daten (z. B. Kennwort in einer Verbindungszeichenfolge) werden nicht direkt zu web.config (oder web.prod.config usw.) hinzugefügt. Stattdessen wird eine Platzhaltervariable geschrieben.
  2. Zum Zeitpunkt der Bereitstellung ruft unser Bereitstellungsdienst (Octopus) vertrauliche Daten aus seinem sicheren Speicher ab und überschreibt die Variable im web.config.
  3. Der Bereitstellungsprozess würde dann sensible Abschnitte der web.config mit aspnet_regiis.exe verschlüsseln.

Jetzt verwenden wir ASP.NET Core. Der Prozess, den wir verfolgen, ist etwas anders.

  1. appsettings.json enthält die Platzhaltervariablen für vertrauliche Daten Ähnlich wie zuvor web.config gearbeitet hat.
  2. Beim Bereitstellungsprozess werden Platzhalter wie bisher durch vertrauliche Daten aus dem sicheren Speicher ersetzt.
  3. 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.

8
Ergwun

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.

2
Dmitry

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:

  1. Haben Sie alle Standardkonfigurationsanbieter registriert.
  2. Registrieren Sie am Ende den Konfigurationsanbieter Azure Key Vault (oder einen auf einem geheimen Speicher basierenden Anbieter).
  3. Verwenden Sie die Zertifikatauthentifizierung zur Authentifizierung bei Key Vault und zum Lesen vertraulicher Einstellungen.

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!

2
Artak

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.

1
turdus-merula

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.