Central Secret Service in Azure Service Fabric
Central Secret Service (CSS), znana również jako Central Secret Store, to usługa systemowa usługi Service Fabric przeznaczona do ochrony wpisów tajnych w klastrze. Arkusz CSS ułatwia zarządzanie wpisami tajnymi dla aplikacji SF, eliminując konieczność polegania na zaszyfrowanych parametrach.
Central Secret Service to trwała, replikowana w klastrze pamięć podręczna wpisów tajnych; wpisy tajne przechowywane w arkuszu CSS są szyfrowane w spoczynku do certyfikatu szyfrowania zarządzanego przez klienta lub klastra. Arkusz CSS udostępnia interfejsy API klienta do zarządzania wpisami tajnymi, dostępne dla jednostek uwierzytelniających się jako klaster lub użytkownika administratora klastra. Model aplikacji środowiska uruchomieniowego usługi Service Fabric integruje się z arkuszem CSS, umożliwiając deklarowanie parametrów aplikacji jako odwołania do wpisów tajnych CSS.
Css odgrywa również kluczową rolę w aprowizacji wpisów tajnych aplikacji zadeklarowanych jako identyfikatory URI wpisów tajnych usługi KeyVault w połączeniu z tożsamością zarządzaną dla wdrożonych aplikacji usługi Service Fabric wdrożonych na platformie Azure.
Central Secret Service nie jest przeznaczona do zastąpienia dedykowanej, zewnętrznej usługi zarządzania wpisami tajnymi, takiej jak Azure Key Vault.
Uwaga
Podczas aktywowania css w klastrze SF z uruchomioną wersją starszą niż 7.1. CU3, aktywacja może zakończyć się niepowodzeniem i pozostawić arkusz CSS w stanie trwałej złej kondycji, jeśli klaster jest skonfigurowany do uwierzytelniania systemu Windows lub jeśli EncryptionCertificateThumbprint
jest zadeklarowany niepoprawnie lub odpowiedni certyfikat nie jest zainstalowany. W obu przypadkach zaleca się uaktualnienie klastra do wersji środowiska uruchomieniowego SF nowszej niż 7.1. CU3 przed kontynuowaniem.
Włączanie centralnej usługi wpisów tajnych
Aby włączyć centralną usługę wpisów tajnych, zaktualizuj konfigurację klastra zgodnie z poniższym opisem.
{
"fabricSettings": [
{
"name": "CentralSecretService",
"parameters": [
{
"name": "DeployedState",
"value": "enabled"
},
{
"name": "MinReplicaSetSize",
"value": "1"
},
{
"name": "TargetReplicaSetSize",
"value": "3"
}
]
}
]
}
Uwaga
Przed usługą Service Fabric w wersji 10.1 CU4 należy aprowizować certyfikat, który CSS będzie używany do szyfrowania magazynu. Należy go zainstalować na wszystkich węzłach, a jego odcisk palca SHA-1 należy zadeklarować przy użyciu parametru ustawienia sieci szkieletowej "EncryptionCertificateThumbprint" w sekcji "CentralSecretService". Zalecamy użycie certyfikatu szyfrowania, który różni się od certyfikatu klastra. Od wersji 10.1 CU4, jeśli to ustawienie nie zostanie przekazane, arkusz CSS będzie domyślnie używać certyfikatu zarządzanego przez klaster na potrzeby szyfrowania. Istniejące wdrożenie CSS można przenieść do certyfikatu zarządzanego przez klaster, usuwając deklarację odcisku palca w uaktualnieniu.
Uwaga
Ustawienie konfiguracji "DeployedState", wprowadzone w usłudze Service Fabric w wersji 8.0, jest preferowanym mechanizmem włączania lub wyłączania arkuszy CSS. Ta funkcja była obsługiwana w poprzednich wersjach przez ustawienie konfiguracji "IsEnabled", które jest obecnie uważane za przestarzałe.
Centralny model wpisów tajnych usługi secret Service
Centralny interfejs API usługi wpisów tajnych uwidacznia dwa typy: zasób tajny i wersję wpisu tajnego. Typ zasobu wpisu tajnego reprezentuje, koncepcyjnie, rodzinę wersji pojedynczego wpisu tajnego używanego do określonego celu; przykłady obejmują: parametry połączenia, hasło, certyfikat punktu końcowego. Obiekt typu zasobu wpisu tajnego zawiera metadane skojarzone z tym wpisem tajnym, w szczególności rodzaj, typ zawartości i opis. Typ wersji wpisu tajnego reprezentuje określone wystąpienie skojarzonego wpisu tajnego i przechowuje tajny zwykły tekst (zaszyfrowany); kontynuując powyższe przykłady, wersja wpisu tajnego zawiera bieżącą wartość hasła, obiekt certyfikatu ważny do końca miesiąca itp. Po odnowieniu tych wpisów tajnych należy wygenerować nowe wersje wpisów tajnych (i dodać je do arkusza CSS).
Sformalizowanie modelu, poniżej przedstawiono reguły zaimplementowane i wymuszone w implementacji CSS:
- Zasób tajny może mieć zero lub więcej wersji
- Każda wersja wpisu tajnego jest elementem podrzędnym określonego zasobu wpisu tajnego; wersja może mieć tylko jeden zasób nadrzędny
- Można usunąć pojedynczą wersję wpisu tajnego bez wpływu na inne wersje tego samego wpisu tajnego
- Usunięcie zasobu wpisu tajnego powoduje usunięcie wszystkich jego wersji
- Wartość wersji wpisu tajnego jest niezmienna
Deklarowanie zasobu wpisu tajnego
Zasób wpisu tajnego można utworzyć przy użyciu interfejsu API REST.
Uwaga
Jeśli klaster korzysta z uwierzytelniania systemu Windows bez certyfikatu HttpGateway, żądanie REST jest wysyłane za pośrednictwem niezabezpieczonego kanału HTTP. Aby włączyć protokół TLS dla tego kanału, należy zaktualizować definicję klastra w celu określenia certyfikatu serwera bramy http.
Aby utworzyć zasób wpisu tajnego supersecret
przy użyciu interfejsu API REST, utwórz żądanie PUT na https://<clusterfqdn>:19080/Resources/Secrets/supersecret?api-version=6.4-preview
adres . Aby utworzyć zasób tajny, należy uwierzytelnić się przy użyciu certyfikatu klastra lub certyfikatu klienta administratora.
$json = '{"properties": {"kind": "inlinedValue", "contentType": "text/plain", "description": "supersecret"}}'
Invoke-WebRequest -Uri https://<clusterfqdn>:19080/Resources/Secrets/supersecret?api-version=6.4-preview -Method PUT -CertificateThumbprint <CertThumbprint> -Body $json
Ustawianie wartości wpisu tajnego
Użyj następującego skryptu, aby ustawić wartość wpisu tajnego przy użyciu interfejsu API REST.
$Params = '{"properties": {"value": "mysecretpassword"}}'
Invoke-WebRequest -Uri https://<clusterfqdn>:19080/Resources/Secrets/supersecret/values/ver1?api-version=6.4-preview -Method PUT -Body $Params -CertificateThumbprint <ClusterCertThumbprint>
Sprawdzanie wartości wpisu tajnego
Invoke-WebRequest -CertificateThumbprint <ClusterCertThumbprint> -Method POST -Uri "https:<clusterfqdn>/Resources/Secrets/supersecret/values/ver1/list_value?api-version=6.4-preview"
Używanie wpisu tajnego w aplikacji
Aplikacja może używać wpisu tajnego z arkusza CSS, deklarując go jako zmienną środowiskową lub określając ścieżkę, w której jest serializowany tajny zwykły tekst. Wykonaj następujące kroki, aby odwołać się do wpisu tajnego CSS:
- Dodaj sekcję w pliku settings.xml przy użyciu poniższego fragmentu kodu. Zwróć uwagę, że wartość jest w formacie {
secretname:version
}.
<Section Name="testsecrets">
<Parameter Name="TopSecret" Type="SecretsStoreRef" Value="supersecret:ver1"/
</Section>
- Zaimportuj sekcję w ApplicationManifest.xml.
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="testservicePkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<Policies>
<ConfigPackagePolicies CodePackageRef="Code">
<ConfigPackage Name="Config" SectionName="testsecrets" EnvironmentVariableName="SecretPath" />
</ConfigPackagePolicies>
</Policies>
</ServiceManifestImport>
Przykład 1. Instalowanie wpisów tajnych w kontenerze. Jedyną zmianą wymaganą do udostępnienia wpisów tajnych wewnątrz kontenera jest specify
punkt instalacji w programie <ConfigPackage>
.
Poniższy fragment kodu to zmodyfikowany ApplicationManifest.xml.
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="testservicePkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<Policies>
<ConfigPackagePolicies CodePackageRef="Code">
<ConfigPackage Name="Config" SectionName="testsecrets" MountPoint="C:\secrets" EnvironmentVariableName="SecretPath" />
<!-- Linux Container
<ConfigPackage Name="Config" SectionName="testsecrets" MountPoint="/mnt/secrets" EnvironmentVariableName="SecretPath" />
-->
</ConfigPackagePolicies>
</Policies>
</ServiceManifestImport>
Wpisy tajne są dostępne w punkcie instalacji wewnątrz kontenera.
Przykład 2. Powiązanie wpisu tajnego ze zmienną środowiskową procesu przez określenie Type='SecretsStoreRef
elementu . Poniższy fragment kodu to przykład powiązania supersecret
wersji ver1
ze zmienną środowiskową MySuperSecret
w ServiceManifest.xml.
<EnvironmentVariables>
<EnvironmentVariable Name="MySuperSecret" Type="SecretsStoreRef" Value="supersecret:ver1"/>
</EnvironmentVariables>
Zmienna środowiskowa SecretPath
wskaże katalog, w którym są przechowywane wszystkie wpisy tajne. Każdy parametr wymieniony testsecrets
w sekcji jest przechowywany w osobnym pliku. Aplikacja może teraz używać wpisu tajnego w następujący sposób:
secretValue = IO.ReadFile(Path.Join(Environment.GetEnvironmentVariable("SecretPath"), "TopSecret"))
Rotacja centralnego certyfikatu szyfrowania usługi wpisów tajnych
Te wskazówki są w przypadku, gdy arkusz CSS został skonfigurowany przy użyciu własnego certyfikatu szyfrowania zadeklarowany przy użyciu polecenia EncryptionCertificateThumbprint
. Jeśli używasz opcji poświadczeń zarządzanych przez klaster, klaster zarządza cyklem życia poświadczeń i nie jest wymagana żadna akcja.
Należy pamiętać, że certyfikaty pozostają prawidłowe do odszyfrowywania poza ich wygaśnięciem. W tej chwili zalecamy kontynuowanie aprowizacji poprzednich certyfikatów szyfrowania po rotacji, aby zmniejszyć prawdopodobieństwo blokady. Rotacja certyfikatu szyfrowania CSS wymaga następujących kroków:
- Aprowizuj nowy certyfikat w każdym węźle klastra. Obecnie nie usuwaj/kontynuuj aprowizacji poprzedniego certyfikatu szyfrowania.
- Uruchom uaktualnienie konfiguracji klastra, aby zmienić wartość
EncryptionCertificateThumbprint
na odcisk palca SHA-1 nowego certyfikatu. Po zakończeniu uaktualniania arkusz CSS rozpocznie ponowne szyfrowanie istniejącej zawartości do nowego certyfikatu szyfrowania. Wszystkie wpisy tajne dodane do arkuszy CSS po tym punkcie zostaną zaszyfrowane bezpośrednio do nowego certyfikatu szyfrowania. Ponieważ zbieżność wszystkich wpisów tajnych chronionych przez nowy certyfikat jest asynchroniczna, ważne jest, aby poprzedni certyfikat szyfrowania pozostał zainstalowany na wszystkich węzłach i dostępny dla arkuszy CSS.
Usuwanie centralnej usługi wpisów tajnych z klastra
Bezpieczne usunięcie centralnej usługi tajnej z klastra wymaga dwóch uaktualnień. Pierwsze uaktualnienie funkcjonalnie wyłącza arkusz CSS, podczas gdy drugie uaktualnienie usuwa usługę z definicji klastra, która obejmuje trwałe usunięcie jego zawartości. Ten dwuetapowy proces zapobiega przypadkowemu usunięciu usługi i pomaga zapewnić, że podczas procesu usuwania nie ma oddzielonych zależności od arkuszy CSS. Ta funkcja jest dostępna w wersji SF w wersji 8.0.
Krok 1. Aktualizowanie elementu CSS DeployedState w celu usunięcia
Uaktualnianie definicji klastra z "IsEnabled" = "true"
lub do "DeployedState" = "enabled"
{
"name": "DeployedState",
"value": "removing"
}
Gdy centralna usługa wpisów tajnych wejdzie w wdrożony stan Removing
, odrzuci wszystkie przychodzące wywołania interfejsu API wpisów tajnych, niezależnie od tego, czy bezpośrednie wywołania REST, czy za pośrednictwem aktywacji usług, które obejmują SecretStoreRefs lub KeyVaultReferences. Wszystkie aplikacje lub składniki w klastrze, które nadal zależą od arkuszy CSS w tym momencie, zostaną wyświetlone w stanie Ostrzeżenie. W takim przypadku uaktualnienie do stanu Removing
wdrożonego powinno zostać wycofane. Jeśli uaktualnienie już się powiodło, należy zainicjować nowe uaktualnienie, aby zmienić arkusz CSS z powrotem na DeployedState = Enabled
.
Jeśli centralna usługa wpisów tajnych odbiera żądanie w stanie Removing
wdrożonym, zwróci kod HTTP 401 (nieautoryzowany) i umieści się w stanie kondycji Ostrzeżenie.
Krok 2. Aktualizowanie elementu CSS DeployedState do wyłączonego
Uaktualnianie definicji klastra z "DeployedState" = "removing"
do
{
"name": "DeployedState",
"value": "disabled"
}
Central secret Service nie powinna już działać w klastrze i nie będzie obecna na liście usług systemowych. Zawartość css jest nieodwracalnie utracona.
Następne kroki
- Dowiedz się więcej o zabezpieczeniach aplikacji i usług.
- Wprowadzenie do tożsamości zarządzanej dla aplikacji usługi Service Fabric.
- Rozszerzanie funkcjonalności css za pomocą funkcji KeyVaultReferences