KeyVaultReference-stöd för Azure-distribuerade Service Fabric-program

En vanlig utmaning när du skapar molnprogram är att på ett säkert sätt distribuera hemligheter till dina program och hantera dem. Service Fabric KeyVaultReference-stöd gör det enkelt. När du har konfigurerat den kan du referera till URL:en för hemligheten som lagras i Key Vault i programdefinitionen och Service Fabric hanterar hämtning av den hemligheten och aktiverar programmet med den. När du använder den "SF-hanterade" versionen av funktionen kan Service Fabric även övervaka ditt Key Vault och automatiskt utlösa löpande programparameteruppgraderingar när dina hemligheter roterar i valvet.

Alternativ för att leverera hemligheter till program i Service Fabric

Det klassiska sättet att leverera hemligheter till ett Service Fabric-program var att deklarera krypterade parametrar. Det handlade om att kryptera hemligheter mot ett krypteringscertifikat och skicka dessa krypterade hemligheter till ditt program. Den här metoden har några nackdelar: att behöva hantera krypteringscertifikatet, exponering av hemligheter i distributionspipelinen och bristande insyn i metadata för hemligheter som är kopplade till ett distribuerat program. På samma sätt kräver roterande hemligheter en programdistribution. Om du inte kör ett fristående kluster rekommenderar vi inte längre att du använder krypterade parametrar.

Ett annat alternativ är att använda referenser för hemligt arkiv. Den här upplevelsen möjliggör central hantering av dina programhemligheter, bättre insyn i metadata för distribuerade hemligheter och möjliggör central hantering av krypteringscertifikatet. Vissa kanske föredrar den här typen av hemlig hantering när du kör fristående Service Fabric-kluster.

Rekommendationen idag är att minska beroendet av hemligheter där det är möjligt med hjälp av hanterade identiteter för Service Fabric-program. Hanterade identiteter kan användas för att autentisera direkt till Azure Storage, Azure SQL med mera. Det innebär att du inte behöver hantera en separat autentiseringsuppgift vid åtkomst till Azure-tjänster som stöder Microsoft Entra-autentisering.

När det inte går att använda hanterad identitet som klient rekommenderar vi att du använder KeyVaultReferences. Du bör använda KeyVaultReferences i stället för att använda hanterad identitet för att gå direkt till Key Vault. KeyVaultReferences bidrar till att öka tillgängligheten för ditt program eftersom det framtvingar att hemliga ändringar sker under löpande uppgraderingar. Den skalar också bättre när hemligheter cachelagras och hanteras inifrån klustret. Om programmet använder krypterade parametrar i dag behövs bara minimala ändringar i programkoden för att använda KeyVaultReferences. Ditt program kan fortsätta att förvänta sig att komma med en enda hemlighet och att den hemligheten ska vara densamma under hela processen.

Förutsättningar

  • Hanterad identitet för Service Fabric-program

    Service Fabric KeyVaultReference-stöd använder ett programs hanterade identitet för att hämta hemligheter för programmets räkning. Du måste distribuera programmet via ARM och tilldela det en hanterad identitet. Följ det här dokumentet för att aktivera hanterad identitet för ditt program.

  • Central Secrets Store (CSS).

    Central Secrets Store (CSS) är Service Fabrics krypterade cache för lokala hemligheter. Den här funktionen använder CSS för att skydda och bevara hemligheter när de har hämtats från Key Vault. Aktivering av den här systemtjänsten krävs för att använda KeyVaultReferences. Följ det här dokumentet för att aktivera och konfigurera CSS.

  • Ge programmets hanterade identitet åtkomstbehörighet till Key Vault

    Referera till det här dokumentet om du vill se hur du beviljar hanterad identitet åtkomst till Key Vault. Observera också att om du använder systemtilldelad hanterad identitet skapas den hanterade identiteten först efter programdistributionen. Detta kan skapa konkurrensvillkor där programmet försöker komma åt hemligheten innan identiteten kan ges åtkomst till valvet. Den systemtilldelade identitetens namn blir {cluster name}/{application name}/{service name}.

KeyVaultReferences jämfört med Managed KeyVaultReferences

Den grundläggande idén med KeyVaultReferences är snarare än att ange värdet för din programparameter som din hemlighet, du anger den till Key Vault-URL:en, som sedan matchas till det hemliga värdet vid aktivering av ditt program. I Key Vault kan till exempel https://my.vault.azure.net/secrets/MySecret/ en enda hemlighet ha flera versioner, https://my.vault.azure.net/secrets/MySecret/<oid1> till exempel och <oid2>. När du använder en KeyVaultReference ska värdet vara en versionsreferens (https://my.vault.azure.net/secrets/MySecret/<oid1>). Om du roterar hemligheten i valvet, till exempel till <oid2>, bör du utlösa en programuppgradering till den nya referensen. När du använder en ManagedKeyVaultReference ska värdet vara en referens utan version (https://my.vault.azure.net/secrets/MySecret/). Service Fabric löser den senaste instansen <oid1> och aktiverar programmet med den hemligheten. Om du roterar hemligheten i valvet till <oid2>utlöser Service Fabric automatiskt en uppgradering av programparametern för din <oid2> räkning.

Kommentar

Stöd för KeyVaultReference (versionshemligheter) för Service Fabric-program är allmänt tillgängligt från och med Service Fabric version 7.2 CU5. Vi rekommenderar att du uppgraderar till den här versionen innan du använder den här funktionen.

Kommentar

Stöd för Managed KeyVaultReference (versionslösa hemligheter) för Service Fabric-program är allmänt tillgängligt från och med Service Fabric version 9.0.

Använda KeyVaultReferences i ditt program

KeyVaultReferences kan användas

Som en miljövariabel

<EnvironmentVariables>
      <EnvironmentVariable Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
</EnvironmentVariables>
string secret =  Environment.GetEnvironmentVariable("MySecret");

Monterad som en fil i containern

  • Lägg till ett avsnitt i settings.xml

    Definiera MySecret parameter med typ KeyVaultReference och värde <KeyVaultURL>

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
    </Section>
    
  • Referera till det nya avsnittet i ApplicationManifest.xml i <ConfigPackagePolicies>

    <ServiceManifestImport>
        <Policies>
        <IdentityBindingPolicy ServiceIdentityRef="MyServiceMI" ApplicationIdentityRef="MyApplicationMI" />
        <ConfigPackagePolicies CodePackageRef="Code">
            <!--Linux container example-->
            <ConfigPackage Name="Config" SectionName="MySecrets" EnvironmentVariableName="SecretPath" MountPoint="/var/secrets"/>
            <!--Windows container example-->
            <!-- <ConfigPackage Name="Config" SectionName="dbsecrets" EnvironmentVariableName="SecretPath" MountPoint="C:\secrets"/> -->
        </ConfigPackagePolicies>
        </Policies>
    </ServiceManifestImport>
    
  • Använda hemligheterna från tjänstkoden

    Varje parameter som anges under <Section Name=MySecrets> är en fil under mappen som pekas på av EnvironmentVariable SecretPath. Kodfragmentet nedan visar hur du läser MySecret från ditt program.

    string secretPath = Environment.GetEnvironmentVariable("SecretPath");
    using (StreamReader sr = new StreamReader(Path.Combine(secretPath, "MySecret"))) 
    {
        string secret =  sr.ReadToEnd();
    }
    

    Kommentar

    MountPoint styr mappen där filerna som innehåller hemliga värden monteras.

Som en referens till ett lösenord för containerlagringsplatsen

 <Policies>
      <ContainerHostPolicies CodePackageRef="Code">
        <RepositoryCredentials AccountName="MyACRUser" Type="KeyVaultReference" Password="<KeyVaultURL>"/>
      </ContainerHostPolicies>

Använda Managed KeyVaultReferences i ditt program

Först måste du aktivera hemlig övervakning genom att uppgradera klusterdefinitionen EnableSecretMonitoring för att lägga till inställningen, utöver de andra nödvändiga CSS-konfigurationerna:

"fabricSettings": [
    {
        "name": "CentralSecretService",     
        "parameters": [
            {
                "name": "EnableSecretMonitoring",
                "value": "true"
            },
            {
                "name":  "DeployedState",
                "value":  "enabled"
            },
            {
                "name" : "EncryptionCertificateThumbprint",
                "value": "<thumbprint>"
            },
            {
                "name":  "MinReplicaSetSize",
                "value":  "<size>"
            },
            {
                "name":  "TargetReplicaSetSize",
                "value":  "<size>"
            }
        ]
    }
],

Kommentar

Standardvärdet kan bli true i framtiden

När klusteruppgradningen är klar kan ditt användarprogram uppgraderas. Överallt där en KeyVaultReference kan användas kan en ManagedKeyVaultReference också användas, till exempel

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="ManagedKeyVaultReference" Value="[MySecretReference]"/>
    </Section>

Den primära skillnaden när du anger ManagedKeyVaultReferences är att de inte kan hårdkodas i programtypmanifestet. De måste deklareras som parametrar på programnivå och måste dessutom åsidosättas i arm-programdefinitionen.

Här är ett utdrag ur ett välformulerad manifest

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest ApplicationTypeName="MyAppType" ApplicationTypeVersion="1.0.0">
  <Parameters>
    <Parameter Name="MySecretReference" DefaultValue="" />
  </Parameters>
  <ServiceManifestImport>
    <EnvironmentOverrides CodePackageRef="Code">
      <EnvironmentVariable Name="MySecret" Value="[MySecretReference]" Type="ManagedKeyVaultReference" />
    </EnvironmentOverrides>
    <Policies>
      <IdentityBindingPolicy ServiceIdentityRef="MySvcIdentity" ApplicationIdentityRef="MyAppIdentity" />
    </Policies>
  </ServiceManifestImport>
  <Principals>
    <ManagedIdentities>
      <ManagedIdentity Name="MyAppIdentity" />
    </ManagedIdentities>
  </Principals>
</ApplicationManifest>

och ett utdrag av programresursdefinitionen:

{
    "type": "Microsoft.ServiceFabric/clusters/applications",
    "name": "MyApp",
    "identity": {
        "type" : "userAssigned",
        "userAssignedIdentities": {
            "[variables('userAssignedIdentityResourceId')]": {}
        }
    },
    "properties": {
        "parameters": {
            "MySecretReference": "https://my.vault.azure.net/secrets/MySecret/"
        },
        "managedIdentities": [
            {
            "name" : "MyAppIdentity",
            "principalId" : "<guid>"
            }
        ]
    }
}

Båda deklarerar ManagedKeyVaultReference som en programparameter, samt åsidosätter parametern vid distributionen för att Service Fabric ska kunna hantera livscykeln för den distribuerade hemligheten.

Nästa steg