Správa šifrovaných tajných kódů v aplikacích Service Fabric

Tato příručka vás provede jednotlivými kroky správy tajných kódů v aplikaci Service Fabric. Tajnými kódy můžou být jakékoli citlivé informace, jako jsou připojovací řetězce úložiště, hesla nebo jiné hodnoty, které by se neměly zpracovávat ve formátu prostého textu.

Použití šifrovaných tajných kódů v aplikaci Service Fabric zahrnuje tři kroky:

  • Nastavení šifrovacího certifikátu a šifrování tajných klíčů
  • Zadejte šifrované tajné kódy v aplikaci.
  • Dešifrujte šifrované tajné kódy z kódu služby.

Nastavení šifrovacího certifikátu a šifrování tajných klíčů

Nastavení šifrovacího certifikátu a jeho použití k šifrování tajných kódů se v systému Windows a Linux liší.

Určení šifrovaných tajných kódů v aplikaci

Předchozí krok popisuje, jak zašifrovat tajný klíč pomocí certifikátu a vytvořit řetězec s kódováním Base-64 pro použití v aplikaci. Tento řetězec s kódováním Base 64 lze zadat jako šifrovaný parametr v Settings.xml služby nebo jako šifrovanou proměnnou prostředí v ServiceManifest.xml služby.

Do konfiguračního souboru Settings.xml služby zadejte šifrovaný parametr s atributem nastaveným IsEncrypted na truehodnotu :

<?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>

Do souboru ServiceManifest.xml služby zadejte šifrovanou proměnnou prostředí s atributem nastaveným Type na Encrypted:

<CodePackage Name="Code" Version="1.0.0">
  <EnvironmentVariables>
    <EnvironmentVariable Name="MyEnvVariable" Type="Encrypted" Value="I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=" />
  </EnvironmentVariables>
</CodePackage>

Tajné kódy by také měly být součástí vaší aplikace Service Fabric zadáním certifikátu v manifestu aplikace. Přidejte element SecretsCertificate do ApplicationManifest.xml a přidejte kryptografický otisk požadovaného certifikátu.

<ApplicationManifest … >
  ...
  <Certificates>
    <SecretsCertificate Name="MyCert" X509FindType="FindByThumbprint" X509FindValue="[YourCertThumbrint]"/>
  </Certificates>
</ApplicationManifest>

Poznámka

Po aktivaci aplikace, která určuje certifikát SecretsCertificate, Service Fabric najde odpovídající certifikát a udělí identitě, která aplikace běží pod úplnými oprávněními k privátnímu klíči certifikátu. Service Fabric také bude monitorovat změny certifikátu a odpovídajícím způsobem znovu použije oprávnění. Aby služba Service Fabric zjistila změny certifikátů deklarovaných podle běžného názvu, spouští pravidelnou úlohu, která najde všechny odpovídající certifikáty a porovná je se seznamem kryptografických otisků uloženým v mezipaměti. Když se zjistí nový kryptografický otisk, znamená to, že certifikát od daného subjektu byl obnoven. Úloha se spouští jednou za minutu na každém uzlu clusteru.

I když SecretsCertificate umožňuje deklarace založené na předmětu, nezapomeňte, že šifrovaná nastavení jsou svázaná s párem klíčů, který byl použit k šifrování nastavení v klientovi. Musíte zajistit, aby původní šifrovací certifikát (nebo ekvivalentní) odpovídal deklaraci subjektu a aby byl nainstalován, včetně odpovídajícího privátního klíče, na každém uzlu clusteru, který může hostovat aplikaci. Všechny časově platné certifikáty, které odpovídají deklaraci subjektu a jsou sestavené ze stejného páru klíčů jako původní šifrovací certifikát, se považují za ekvivalenty.

Vložení tajných kódů aplikace do instancí aplikace

V ideálním případě by nasazení do různých prostředí mělo být co nejvíce automatizované. Toho lze dosáhnout provedením šifrování tajných kódů v prostředí sestavení a poskytnutím šifrovaných tajných kódů jako parametrů při vytváření instancí aplikace.

Použití přepisovatelných parametrů v Settings.xml

Konfigurační soubor Settings.xml umožňuje přepisovatelné parametry, které lze zadat při vytváření aplikace. Místo zadání hodnoty parametru MustOverride použijte atribut :

<?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>

Pokud chcete přepsat hodnoty v Settings.xml, deklarujte parametr přepsání služby v 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>

Teď je možné hodnotu zadat jako parametr aplikace při vytváření instance aplikace. Vytvoření instance aplikace je možné skriptovat pomocí PowerShellu nebo napsat v jazyce C# pro snadnou integraci do procesu sestavení.

Pomocí PowerShellu se parametr zadává do New-ServiceFabricApplication příkazu jako tabulka hodnot hash:

New-ServiceFabricApplication -ApplicationName fabric:/MyApp -ApplicationTypeName MyAppType -ApplicationTypeVersion 1.0.0 -ApplicationParameter @{"MySecret" = "I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM="}

Při použití jazyka C# se parametry aplikace zadají v objektu 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);

Dešifrování zašifrovaných tajných kódů z kódu služby

Rozhraní API pro přístup k parametrům a proměnným prostředí umožňují snadné dešifrování šifrovaných hodnot. Vzhledem k tomu, že šifrovaný řetězec obsahuje informace o certifikátu použitém k šifrování, nemusíte certifikát zadávat ručně. Certifikát stačí nainstalovat na uzel, na kterém je služba spuštěná.

// 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");

Další kroky