Zarządzanie zaszyfrowanymi wpisami tajnymi w aplikacjach usługi Service Fabric
Ten przewodnik przeprowadzi Cię przez kroki zarządzania wpisami tajnymi w aplikacji usługi Service Fabric. Wpisy tajne mogą być informacjami poufnymi, takimi jak parametry połączenia magazynu, hasła lub inne wartości, które nie powinny być obsługiwane w postaci zwykłego tekstu.
Używanie zaszyfrowanych wpisów tajnych w aplikacji usługi Service Fabric obejmuje trzy kroki:
- Konfigurowanie certyfikatu szyfrowania i szyfrowanie wpisów tajnych.
- Określ zaszyfrowane wpisy tajne w aplikacji.
- Odszyfrowywanie zaszyfrowanych wpisów tajnych z kodu usługi.
Konfigurowanie certyfikatu szyfrowania i szyfrowanie wpisów tajnych
Konfigurowanie certyfikatu szyfrowania i używanie go do szyfrowania wpisów tajnych różni się między systemami Windows i Linux.
- Konfigurowanie certyfikatu szyfrowania i szyfrowanie wpisów tajnych w klastrach systemu Windows.
- Skonfiguruj certyfikat szyfrowania i szyfruj wpisy tajne w klastrach systemu Linux.
Określanie zaszyfrowanych wpisów tajnych w aplikacji
W poprzednim kroku opisano sposób szyfrowania wpisu tajnego przy użyciu certyfikatu i tworzenia zakodowanego ciągu base-64 do użycia w aplikacji. Ten ciąg zakodowany w formacie base-64 można określić jako zaszyfrowany parametr w Settings.xml usługi lub jako zaszyfrowaną zmienną środowiskową w ServiceManifest.xml usługi.
Określ zaszyfrowany parametr w pliku konfiguracji Settings.xml usługi z atrybutem ustawionym IsEncrypted
na true
:
<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<Section Name="MySettings">
<Parameter Name="MySecret" IsEncrypted="true" Value="I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=" />
</Section>
</Settings>
Określ zaszyfrowaną zmienną środowiskową w pliku ServiceManifest.xml usługi z atrybutem ustawionym Type
na Encrypted
:
<CodePackage Name="Code" Version="1.0.0">
<EnvironmentVariables>
<EnvironmentVariable Name="MyEnvVariable" Type="Encrypted" Value="I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=" />
</EnvironmentVariables>
</CodePackage>
Wpisy tajne należy również uwzględnić w aplikacji usługi Service Fabric, określając certyfikat w manifeście aplikacji. Dodaj element SecretsCertificate do ApplicationManifest.xml i dołącz odcisk palca żądanego certyfikatu.
<ApplicationManifest … >
...
<Certificates>
<SecretsCertificate Name="MyCert" X509FindType="FindByThumbprint" X509FindValue="[YourCertThumbrint]"/>
</Certificates>
</ApplicationManifest>
Uwaga
Po aktywowaniu aplikacji, która określa secretsCertificate, usługa Service Fabric znajdzie pasujący certyfikat i przyzna tożsamość, którą aplikacja jest uruchomiona w ramach pełnych uprawnień do klucza prywatnego certyfikatu. Usługa Service Fabric będzie również monitorować certyfikat pod kątem zmian i odpowiednio zastosować uprawnienia. Aby wykryć zmiany certyfikatów zadeklarowanych przez nazwę pospolitą, usługa Service Fabric uruchamia okresowe zadanie, które znajduje wszystkie pasujące certyfikaty i porównuje je z buforowanym listą odcisków palców. Po wykryciu nowego odcisku palca oznacza to, że certyfikat tego podmiotu został odnowiony. Zadanie jest uruchamiane raz na minutę w każdym węźle klastra.
Podczas gdy funkcja SecretsCertificate zezwala na deklaracje oparte na tematach, należy pamiętać, że zaszyfrowane ustawienia są powiązane z parą kluczy, która została użyta do zaszyfrowania ustawienia na kliencie. Należy upewnić się, że oryginalny certyfikat szyfrowania (lub równoważny) jest zgodny z deklaracją opartą na temacie i że jest zainstalowany, w tym odpowiadający mu klucz prywatny, w każdym węźle klastra, który może hostować aplikację. Wszystkie prawidłowe czasowo certyfikaty pasujące do deklaracji opartej na temacie i utworzone na podstawie tej samej pary kluczy co oryginalny certyfikat szyfrowania są uznawane za równoważne.
Wstrzykiwanie wpisów tajnych aplikacji do wystąpień aplikacji
W idealnym przypadku wdrożenie w różnych środowiskach powinno być tak zautomatyzowane, jak to możliwe. Można to osiągnąć, wykonując szyfrowanie wpisów tajnych w środowisku kompilacji i dostarczając zaszyfrowane wpisy tajne jako parametry podczas tworzenia wystąpień aplikacji.
Używanie parametrów, które można zastąpić w Settings.xml
Plik konfiguracji Settings.xml umożliwia zastępowanie parametrów, które można podać w czasie tworzenia aplikacji. Użyj atrybutu MustOverride
zamiast podawania wartości dla parametru:
<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<Section Name="MySettings">
<Parameter Name="MySecret" IsEncrypted="true" Value="" MustOverride="true" />
</Section>
</Settings>
Aby zastąpić wartości w Settings.xml, zadeklaruj parametr zastąpienia dla usługi w ApplicationManifest.xml:
<ApplicationManifest ... >
<Parameters>
<Parameter Name="MySecret" DefaultValue="" />
</Parameters>
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="Stateful1Pkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides>
<ConfigOverride Name="Config">
<Settings>
<Section Name="MySettings">
<Parameter Name="MySecret" Value="[MySecret]" IsEncrypted="true" />
</Section>
</Settings>
</ConfigOverride>
</ConfigOverrides>
</ServiceManifestImport>
Teraz wartość można określić jako parametr aplikacji podczas tworzenia wystąpienia aplikacji. Tworzenie wystąpienia aplikacji można tworzyć skrypty przy użyciu programu PowerShell lub napisanego w języku C#, aby ułatwić integrację w procesie kompilacji.
Za pomocą programu PowerShell parametr jest dostarczany do New-ServiceFabricApplication
polecenia jako tabela skrótów:
New-ServiceFabricApplication -ApplicationName fabric:/MyApp -ApplicationTypeName MyAppType -ApplicationTypeVersion 1.0.0 -ApplicationParameter @{"MySecret" = "I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM="}
Przy użyciu języka C#parametry aplikacji są określane jako ApplicationDescription
:NameValueCollection
FabricClient fabricClient = new FabricClient();
NameValueCollection applicationParameters = new NameValueCollection();
applicationParameters["MySecret"] = "I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=";
ApplicationDescription applicationDescription = new ApplicationDescription(
applicationName: new Uri("fabric:/MyApp"),
applicationTypeName: "MyAppType",
applicationTypeVersion: "1.0.0",
applicationParameters: applicationParameters)
);
await fabricClient.ApplicationManager.CreateApplicationAsync(applicationDescription);
Odszyfrowywanie zaszyfrowanych wpisów tajnych z kodu usługi
Interfejsy API umożliwiające uzyskiwanie dostępu do parametrów i zmiennych środowiskowych umożliwiają łatwe odszyfrowywanie zaszyfrowanych wartości. Ponieważ zaszyfrowany ciąg zawiera informacje o certyfikacie używanym do szyfrowania, nie trzeba ręcznie określać certyfikatu. Certyfikat musi być zainstalowany tylko w węźle, na którym działa usługa.
// Access decrypted parameters from Settings.xml
ConfigurationPackage configPackage = FabricRuntime.GetActivationContext().GetConfigurationPackageObject("Config");
bool MySecretIsEncrypted = configPackage.Settings.Sections["MySettings"].Parameters["MySecret"].IsEncrypted;
if (MySecretIsEncrypted)
{
SecureString MySecretDecryptedValue = configPackage.Settings.Sections["MySettings"].Parameters["MySecret"].DecryptValue();
}
// Access decrypted environment variables from ServiceManifest.xml
// Note: you do not have to call any explicit API to decrypt the environment variable.
string MyEnvVariable = Environment.GetEnvironmentVariable("MyEnvVariable");
Następne kroki
- Magazyn wpisów tajnych usługi Service Fabric
- Dowiedz się więcej o zabezpieczeniach aplikacji i usług