Bezpieczne przechowywanie tajemnic aplikacji podczas tworzenia aplikacji
Napiwek
Ta zawartość jest fragmentem publikacji eBook "Architektura mikrousług dla konteneryzowanych aplikacji .NET", dostępnej na .NET Docs lub jako bezpłatny plik PDF do pobrania, który można czytać w trybie offline.
Aby nawiązać połączenie z chronionymi zasobami i innymi usługami, aplikacje ASP.NET Core zwykle muszą używać parametrów połączenia, haseł lub innych poświadczeń zawierających poufne informacje. Te poufne informacje są nazywane tajemnicami . 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ć sekrety z bezpieczniejszych lokalizacji.
Należy oddzielić sekrety potrzebne do uzyskiwania dostępu do zasobów programistycznych i testowych od tych używanych dla zasobów produkcyjnych, ponieważ różne osoby będą potrzebować dostępu do tych różnych zestawów sekretów. 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 przechowywania w środowiskach produkcyjnych mikrousługi mogą przechowywać tajne informacje w usłudze Azure Key Vault.
Przechowuj sekrety 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 wartość Debug
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
na ConfigurationBuilder
podczas konstruowania obiektu IConfigurationRoot
.
Notatka
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ę nieumieszczania wpisów tajnych w kodzie źródłowym podczas tworzenia oprogramowania. Aby użyć narzędzia Secret Manager, zainstaluj pakiet Microsoft.Extensions.Configuration.UserSecrets w pliku projektu. Gdy ta zależność jest obecna i została przywrócona, można użyć komendy dotnet user-secrets
, aby ustawić wartość tajnych danych 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.
Sekrety ustawiane przez narzędzie Secret Manager są zorganizowane według właściwości UserSecretsId
projektu, który z nich korzysta. 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 tajemnic przechowywanych w programie Secret Manager w aplikacji odbywa się przez wywołanie AddUserSecrets<T>
w instancji ConfigurationBuilder
, aby uwzględnić tajemnice dla aplikacji w jej 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.
AddUserSecrets<Startup>()
jest uwzględniana w opcjach domyślnych środowiska deweloperskiego podczas korzystania z metody CreateDefaultBuilder
w programie Program.cs.