Sicheres Speichern von Anwendungsgeheimnissen während der Entwicklung

Tipp

Diese Inhalte sind ein Auszug aus dem eBook „.NET Microservices Architecture for Containerized .NET Applications“, verfügbar unter .NET Docs oder als kostenlos herunterladbare PDF-Datei, die offline gelesen werden kann.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Zum Verbinden mit geschützten Ressourcen und anderen Diensten benötigen ASP.NET Core-Anwendungen in der Regel Verbindungszeichenfolgen, Kennwörter oder andere Anmeldeinformationen, die vertrauliche Informationen enthalten. Diese vertraulichen Informationen werden Geheimnisse genannt. Es ist eine bewährte Methode, Geheimnisse nicht in den Quellcode einzufügen und auf keinen Fall in der Quellcodeverwaltung zu speichern. Stattdessen sollten Sie das Konfigurationsmodell von ASP.NET Core verwenden, um Geheimnisse aus sichereren Speicherorten zu lesen.

Sie müssen die Geheimnisse für den Zugriff auf Entwicklungs- und Stagingressourcen von denen trennen, die für den Zugriff auf Produktionsressourcen verwendet werden, da verschiedene Personen Zugriff auf diese verschiedenen Geheimnisse benötigen. Beim Speichern von Geheimnissen, die während der Entwicklung genutzt werden, ist es gebräuchlich, diese entweder in Umgebungsvariablen oder mithilfe des Secret Manager-Tools von ASP.NET Core zu speichern. Für eine sicherere Speicherung in Produktionsumgebungen können Microservices Geheimnisse in Azure Key Vault speichern.

Speichern von Geheimnissen in Umgebungsvariablen

Eine Möglichkeit, um Geheimnisse aus dem Quellcode fernzuhalten, besteht darin, dass Entwickler zeichenfolgenbasierte Geheimnisse als Umgebungsvariablen auf Ihren Entwicklungscomputern festlegen können. Wenn Sie Umgebungsvariablen zum Speichern von Geheimnissen mit hierarchischen Namen verwenden, etwa die in den Konfigurationsabschnitten geschachtelten, müssen Sie die Variablen benennen, um die vollständige, mit Doppelpunkten (:) getrennte Hierarchie der Abschnitte einzubeziehen.

Zum Beispiel würde das Festlegen der Umgebungsvariablen Logging:LogLevel:Default auf Debug einem Konfigurationswert der folgenden JSON-Datei entsprechen:

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug"
        }
    }
}

Um über Umgebungsvariablen auf diese Werte zuzugreifen, muss die Anwendung beim Erstellen eines IConfigurationRoot-Objekts lediglich AddEnvironmentVariables für ConfigurationBuilder aufrufen.

Hinweis

Umgebungsvariablen werden in der Regel im Nur-Text-Format gespeichert. Wenn also der Computer oder Prozess mit den Umgebungsvariablen kompromittiert wird, sind die Werte der Umgebungsvariablen sichtbar.

Speichern von Geheimnissen mit Secret Manager von ASP.NET Core

Das ASP.NET Core-Tool Secret Manager stellt eine weitere Methode bereit, um während der Entwicklung Geheimnisse aus dem Quellcode fernzuhalten. Um das Secret Manager-Tool verwenden zu können, installieren Sie das Paket Microsoft.Extensions.Configuration.SecretManager in Ihrer Projektdatei. Sobald diese Abhängigkeit vorhanden ist und wiederhergestellt wurde, kann der Befehl dotnet user-secrets verwendet werden, um den Wert der Geheimnisse über die Befehlszeile festzulegen. Diese Geheimnisse werden außerhalb vom Quellcode in einer JSON-Datei im Verzeichnis des Profils vom Benutzer (Details variieren je nach Betriebssystem) gespeichert.

Geheimnisse, die durch das Secret Manager-Tool festgelegt wurden, werden von der Eigenschaft UserSecretsId des Projekts organisiert, das die Geheimnisse verwendet. Aus diesem Grund sollten Sie sicherstellen, dass Sie die Eigenschaft UserSecretsId, wie im folgenden Codeausschnitt gezeigt wird, in Ihrer Projektdatei festlegen. Der Standardwert ist eine von Visual Studio zugewiesene GUID, aber die tatsächliche Zeichenfolge ist nicht wichtig, solange sie auf dem Computer eindeutig ist.

<PropertyGroup>
    <UserSecretsId>UniqueIdentifyingString</UserSecretsId>
</PropertyGroup>

Sie können mit Secret Manager gespeicherte Geheimnisse in einer Anwendung verwenden, indem Sie AddUserSecrets<T> für die ConfigurationBuilder-Instanz aufrufen, um Geheimnisse für die Anwendung in die zugehörige Konfiguration einzubeziehen. Der generische Parameter T sollte ein Typ aus der Assembly sein, auf die „UserSecretId“ angewendet wurde. Normalerweise kann AddUserSecrets<Startup> verwendet werden.

AddUserSecrets<Startup>() wird bei Verwendung der Standardoptionen für die Entwicklungsumgebung einbezogen, wenn die CreateDefaultBuilder-Methode in Program.cs verwendet wird.