Bezpieczne przechowywanie wpisów tajnych aplikacji podczas programowania
Napiwek
Ta zawartość jest fragmentem książki eBook, architektury mikrousług platformy .NET dla konteneryzowanych aplikacji platformy .NET dostępnych na platformie .NET Docs lub jako bezpłatnego pliku PDF, który można odczytać w trybie offline.
Aby nawiązać połączenie z chronionymi zasobami i innymi usługami, aplikacje ASP.NET Core zwykle muszą używać parametry połączenia, haseł lub innych poświadczeń zawierających poufne informacje. Te poufne informacje są nazywane wpisami tajnymi. Najlepszym rozwiązaniem jest, aby nie uwzględniać wpisów tajnych w kodzie źródłowym i nie przechowywać wpisów tajnych w kontroli źródła. Zamiast tego należy użyć modelu konfiguracji ASP.NET Core, aby odczytać wpisy tajne z bezpieczniejszych lokalizacji.
Należy oddzielić wpisy tajne na potrzeby uzyskiwania dostępu do zasobów programistycznych i przejściowych od zasobów używanych do uzyskiwania dostępu do zasobów produkcyjnych, ponieważ różne osoby będą potrzebować dostępu do tych różnych zestawów wpisów tajnych. Aby przechowywać wpisy tajne używane podczas programowania, typowe podejścia to przechowywanie wpisów tajnych w zmiennych środowiskowych lub użycie narzędzia ASP.NET Core Secret Manager. W przypadku bezpieczniejszego magazynu w środowiskach produkcyjnych mikrousługi mogą przechowywać wpisy tajne w usłudze Azure Key Vault.
Przechowywanie wpisów tajnych w zmiennych środowiskowych
Jednym ze sposobów zachowania wpisów tajnych poza kodem źródłowym jest ustawienie przez deweloperów wpisów tajnych opartych na ciągach jako zmiennych środowiskowych na maszynach deweloperskich. Jeśli używasz zmiennych środowiskowych do przechowywania wpisów tajnych z nazwami hierarchicznymi, takimi jak te zagnieżdżone w sekcjach konfiguracji, należy nazwać zmienne, aby uwzględnić pełną hierarchię jej sekcji, rozdzielaną dwukropkami (:).
Na przykład ustawienie zmiennej środowiskowej Logging:LogLevel:Default
na Debug
wartość będzie równoważne wartości konfiguracji z następującego pliku JSON:
{
"Logging": {
"LogLevel": {
"Default": "Debug"
}
}
}
Aby uzyskać dostęp do tych wartości ze zmiennych środowiskowych, aplikacja musi wywołać AddEnvironmentVariables
element ConfigurationBuilder
podczas konstruowania IConfigurationRoot
obiektu.
Uwaga
Zmienne środowiskowe są często przechowywane jako zwykły tekst, więc jeśli maszyna lub proces ze zmiennymi środowiskowymi zostaną naruszone, wartości zmiennych środowiskowych będą widoczne.
Przechowywanie wpisów tajnych za pomocą programu ASP.NET Core Secret Manager
Narzędzie ASP.NET Core Secret Manager udostępnia inną metodę przechowywania wpisów tajnych poza kodem źródłowym podczas programowania. Aby użyć narzędzia Secret Manager, zainstaluj pakiet Microsoft.Extensions.Configuration.SecretManager w pliku projektu. Po utworzeniu tej zależności i przywróceniu można użyć polecenia , dotnet user-secrets
aby ustawić wartość wpisów tajnych z wiersza polecenia. Te wpisy tajne będą przechowywane w pliku JSON w katalogu profilu użytkownika (szczegóły różnią się w zależności od systemu operacyjnego), z dala od kodu źródłowego.
Wpisy tajne ustawiane przez narzędzie Secret Manager są zorganizowane przez UserSecretsId
właściwość projektu korzystającego z wpisów tajnych. W związku z tym należy ustawić właściwość UserSecretsId w pliku projektu, jak pokazano w poniższym fragmencie kodu. Wartość domyślna to identyfikator GUID przypisany przez program Visual Studio, ale rzeczywisty ciąg nie jest ważny, o ile jest on unikatowy na komputerze.
<PropertyGroup>
<UserSecretsId>UniqueIdentifyingString</UserSecretsId>
</PropertyGroup>
Używanie wpisów tajnych przechowywanych w programie Secret Manager w aplikacji odbywa się przez wywołanie AddUserSecrets<T>
ConfigurationBuilder
wystąpienia w celu uwzględnienia wpisów tajnych dla aplikacji w konfiguracji. Parametr ogólny T
powinien być typem z zestawu, do którego zastosowano parametr UserSecretId. Zwykle użycie AddUserSecrets<Startup>
jest w porządku.
Element AddUserSecrets<Startup>()
jest uwzględniony w opcjach domyślnych środowiska deweloperskiego podczas używania CreateDefaultBuilder
metody w Program.cs.