Hantera krypterade hemligheter i Service Fabric-program

Den här guiden vägleder dig genom stegen för att hantera hemligheter i ett Service Fabric-program. Hemligheter kan vara känslig information, till exempel anslutningssträngar för lagring, lösenord eller andra värden som inte ska hanteras i oformaterad text.

Användning av krypterade hemligheter i ett Service Fabric-program omfattar tre steg:

  • Konfigurera ett krypteringscertifikat och kryptera hemligheter.
  • Ange krypterade hemligheter i ett program.
  • Dekryptera krypterade hemligheter från tjänstkoden.

Konfigurera ett krypteringscertifikat och kryptera hemligheter

Att konfigurera ett krypteringscertifikat och använda det för att kryptera hemligheter varierar mellan Windows och Linux.

Ange krypterade hemligheter i ett program

I föregående steg beskrivs hur du krypterar en hemlighet med ett certifikat och skapar en base-64-kodad sträng för användning i ett program. Den här base-64-kodade strängen kan anges som en krypterad parameter i en tjänsts Settings.xml eller som en krypterad miljövariabel i en tjänsts ServiceManifest.xml.

Ange en krypterad parameter i tjänstens Settings.xml konfigurationsfil med attributet inställt på IsEncryptedtrue:

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

Ange en krypterad miljövariabel i tjänstens ServiceManifest.xml-fil med attributet inställt på TypeEncrypted:

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

Hemligheterna bör också ingå i Service Fabric-programmet genom att ange ett certifikat i programmanifestet. Lägg till ett SecretsCertificate-element iApplicationManifest.xml och inkludera det önskade certifikatets tumavtryck.

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

Anteckning

När du aktiverar ett program som anger ett SecretsCertificate hittar Service Fabric det matchande certifikatet och beviljar identiteten som programmet körs med fullständiga behörigheter till certifikatets privata nyckel. Service Fabric övervakar även certifikatet för ändringar och tillämpar behörigheterna på nytt. För att identifiera ändringar för certifikat som deklarerats med eget namn kör Service Fabric en periodisk aktivitet som hittar alla matchande certifikat och jämför den med en cachelagrad lista med tumavtryck. När ett nytt tumavtryck identifieras innebär det att ett certifikat från det ämnet har förnyats. Aktiviteten körs en gång per minut på varje nod i klustret.

Även om SecretsCertificate tillåter ämnesbaserade deklarationer, bör du observera att de krypterade inställningarna är knutna till nyckelparet som användes för att kryptera inställningen på klienten. Du måste se till att det ursprungliga krypteringscertifikatet (eller motsvarande) matchar den ämnesbaserade deklarationen och att det installeras, inklusive dess motsvarande privata nyckel, på varje nod i klustret som kan vara värd för programmet. Alla tidsgiltigt certifikat som matchar den ämnesbaserade deklarationen och som skapats från samma nyckelpar som det ursprungliga krypteringscertifikatet betraktas som motsvarigheter.

Mata in programhemligheter i programinstanser

Helst bör distributionen till olika miljöer vara så automatiserad som möjligt. Detta kan åstadkommas genom att utföra hemlig kryptering i en byggmiljö och tillhandahålla krypterade hemligheter som parametrar när du skapar programinstanser.

Använda åsidosättande parametrar i Settings.xml

Konfigurationsfilen Settings.xml tillåter åsidosättbara parametrar som kan anges när programmet skapas. Använd attributet MustOverride i stället för att ange ett värde för en parameter:

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

Om du vill åsidosätta värden i Settings.xml deklarerar du en åsidosättningsparameter för tjänsten i 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>

Nu kan värdet anges som en programparameter när du skapar en instans av programmet. Skapa en programinstans kan skriptas med PowerShell, eller skrivas i C#, för enkel integrering i en byggprocess.

Med Hjälp av PowerShell anges parametern New-ServiceFabricApplication till kommandot som en hash-tabell:

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

Med C# anges programparametrar i som ApplicationDescription en 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);

Dekryptera krypterade hemligheter från tjänstkod

API:erna för åtkomst till parametrar och miljövariabler möjliggör enkel dekryptering av krypterade värden. Eftersom den krypterade strängen innehåller information om certifikatet som används för kryptering behöver du inte ange certifikatet manuellt. Certifikatet behöver bara installeras på noden som tjänsten körs på.

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

Nästa steg