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ę w zależności od systemu Windows i Linux.

Określanie zaszyfrowanych wpisów tajnych w aplikacji

W poprzednim kroku opisano sposób szyfrowania wpisu tajnego przy użyciu certyfikatu i tworzenia ciągu zakodowanego w formacie 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 powinny być również uwzględniane w aplikacji usługi Service Fabric przez określenie certyfikatu w manifeście aplikacji. Dodaj element SecretsCertificate , aby ApplicationManifest.xml i uwzględnić 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 działa 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 przez ten podmiot został odnowiony. Zadanie jest uruchamiane raz na minutę w każdym węźle klastra.

Podczas gdy funkcja SecretsCertificate zezwala na deklaracje oparte na podmiotach, należy pamiętać, że zaszyfrowane ustawienia są powiązane z parą kluczy, która została użyta do szyfrowania 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, na każdym węźle klastra, który może hostować aplikację. Wszystkie ważne 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ć możliwie jak najbardziej zautomatyzowane. 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.

Przy użyciu 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 w elemecie ApplicationDescriptionNameValueCollectionjako :

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 jest uruchomiona 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