Dela via


Central Secret Service i Azure Service Fabric

Central Secret Service (CSS), även kallat Central Secret Store, är en Service Fabric-systemtjänst som är avsedd att skydda hemligheter i ett kluster. CSS underlättar hanteringen av hemligheter för SF-program, vilket eliminerar behovet av att förlita sig på krypterade parametrar.

Central Secret Service är en beständig, replikerad hemlig cache i klustret. hemligheter som lagras i CSS krypteras i vila till ett krypteringscertifikat som tillhandahålls av kunden. CSS tillhandahåller klient-API:er för hemlig hantering, som är tillgängliga för entiteter som autentiseras som klustret eller en klusteradministratörsanvändare. Service Fabric Runtime-programmodellen integreras med CSS, vilket tillåter deklaration av programparametrar som CSS-hemliga referenser.

CSS är också avgörande för att etablera programhemligheter som deklarerats som KeyVault-hemliga URI:er i kombination med hanterad identitet för Azure-distribuerade Service Fabric-program.

Central Secret Service är inte avsett att ersätta en dedikerad tjänst för hantering av externa hemligheter, till exempel Azure Key Vault.

Anteckning

När du aktiverar CSS i ett SF-kluster som kör en tidigare version än 7.1. CU3, aktiveringen kan misslyckas och lämna CSS i ett permanent feltillstånd om klustret har konfigurerats för Windows-autentisering eller om EncryptionCertificateThumbprint det deklareras felaktigt eller om motsvarande certifikat inte har installerats. I båda fallen rekommenderar vi att du uppgraderar klustret till en SF-körningsversion som är nyare än 7.1. CU3 innan du fortsätter.

Aktivera tjänsten Centrala hemligheter

Om du vill aktivera Central Secret Service uppdaterar du klusterkonfigurationen enligt beskrivningen nedan. Vi rekommenderar att du använder ett krypteringscertifikat som skiljer sig från klustercertifikatet. Certifikatet måste vara installerat på alla noder.

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

Anteckning

Konfigurationsinställningen "DeployedState", som introducerades i Service Fabric version 8.0, är den bästa mekanismen för att aktivera eller inaktivera CSS. den här funktionen användes i tidigare versioner av konfigurationsinställningen "IsEnabled", som nu anses vara föråldrad.

Hemlig modell för Central Secret Service

API:et för Central Secret Service exponerar två typer: hemlig resurs och hemlig version. Den hemliga resurstypen representerar konceptuellt en familj med versioner av en enda hemlighet som används för ett specifikt syfte. Exempel är: en anslutningssträng, ett lösenord, ett slutpunktscertifikat. Ett objekt av den hemliga resurstypen innehåller metadata som är associerade med den hemligheten, särskilt typ, innehållstyp och beskrivning. Den hemliga versionstypen representerar en viss instans av dess associerade hemlighet och lagrar den hemliga klartexten (krypterad); om du fortsätter med exemplen ovan innehåller en hemlig version det aktuella lösenordsvärdet, ett certifikatobjekt som är giltigt till slutet av månaden osv. När du förnyar dessa hemligheter bör nya hemliga versioner skapas (och läggas till i CSS).

När modellen formaliseras är följande regler implementerade och framtvingade i CSS-implementeringen:

  • En hemlig resurs kan ha noll eller flera versioner
  • Varje hemlig version är underordnad en viss hemlig resurs. en version kanske bara har en överordnad resurs
  • En enskild hemlig version kan tas bort, utan att andra versioner av samma hemlighet påverkas
  • Om du tar bort en hemlig resurs tas alla dess versioner bort
  • Värdet för en hemlig version är oföränderligt

Deklarera en hemlig resurs

Du kan skapa en hemlig resurs med hjälp av REST-API:et.

Anteckning

Om klustret använder Windows-autentisering utan ett HttpGateway-certifikat skickas REST-begäran via en oskyddad HTTP-kanal. Om du vill aktivera TLS för den här kanalen bör klusterdefinitionen uppdateras för att ange ett http gateway-servercertifikat.

Om du vill skapa en supersecret hemlig resurs med hjälp av REST-API:et gör du en PUT-begäran till https://<clusterfqdn>:19080/Resources/Secrets/supersecret?api-version=6.4-preview. Du måste autentisera med ett klustercertifikat eller ett administratörsklientcertifikat för att skapa en hemlig resurs.

$json = '{"properties": {"kind": "inlinedValue", "contentType": "text/plain", "description": "supersecret"}}'
Invoke-WebRequest  -Uri https://<clusterfqdn>:19080/Resources/Secrets/supersecret?api-version=6.4-preview -Method PUT -CertificateThumbprint <CertThumbprint> -Body $json

Ange det hemliga värdet

Använd följande skript för att använda REST-API:et för att ange det hemliga värdet.

$Params = '{"properties": {"value": "mysecretpassword"}}'
Invoke-WebRequest -Uri https://<clusterfqdn>:19080/Resources/Secrets/supersecret/values/ver1?api-version=6.4-preview -Method PUT -Body $Params -CertificateThumbprint <ClusterCertThumbprint>

Granska det hemliga värdet

Invoke-WebRequest -CertificateThumbprint <ClusterCertThumbprint> -Method POST -Uri "https:<clusterfqdn>/Resources/Secrets/supersecret/values/ver1/list_value?api-version=6.4-preview"

Använda hemligheten i ditt program

Ett program kan använda en hemlighet från CSS genom att deklarera den som en miljövariabel eller genom att ange en sökväg där den hemliga klartexten ska serialiseras. Följ dessa steg för att referera till en CSS-hemlighet:

  1. Lägg till ett avsnitt i settings.xml-filen med följande kodfragment. Observera här att värdet har formatet {secretname:version}.
     <Section Name="testsecrets">
      <Parameter Name="TopSecret" Type="SecretsStoreRef" Value="supersecret:ver1"/
     </Section>
  1. Importera avsnittet i ApplicationManifest.xml.
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="testservicePkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<Policies>
 <ConfigPackagePolicies CodePackageRef="Code">
   <ConfigPackage Name="Config" SectionName="testsecrets" EnvironmentVariableName="SecretPath" />
   </ConfigPackagePolicies>
</Policies>
</ServiceManifestImport>

Exempel 1: Montera hemligheterna i en container. Den enda ändring som krävs för att göra hemligheterna tillgängliga i containern är till specify en monteringspunkt i <ConfigPackage>. Följande kodfragment är den ändrade ApplicationManifest.xml.

   <ServiceManifestImport>
       <ServiceManifestRef ServiceManifestName="testservicePkg" ServiceManifestVersion="1.0.0" />
       <ConfigOverrides />
       <Policies>
         <ConfigPackagePolicies CodePackageRef="Code">
           <ConfigPackage Name="Config" SectionName="testsecrets" MountPoint="C:\secrets" EnvironmentVariableName="SecretPath" />
           <!-- Linux Container
            <ConfigPackage Name="Config" SectionName="testsecrets" MountPoint="/mnt/secrets" EnvironmentVariableName="SecretPath" />
           -->
         </ConfigPackagePolicies>
       </Policies>
     </ServiceManifestImport>

Hemligheter är tillgängliga under monteringspunkten i containern.

Exempel 2: Binda en hemlighet till en processmiljövariabel genom att Type='SecretsStoreRefange . Följande kodfragment är ett exempel på hur du binder supersecret versionen ver1 till miljövariabeln MySuperSecret i ServiceManifest.xml.

   <EnvironmentVariables>
     <EnvironmentVariable Name="MySuperSecret" Type="SecretsStoreRef" Value="supersecret:ver1"/>
   </EnvironmentVariables>

Miljövariabeln SecretPath pekar på katalogen där alla hemligheter lagras. Varje parameter som anges under testsecrets avsnittet lagras i en separat fil. Programmet kan nu använda hemligheten på följande sätt:

secretValue = IO.ReadFile(Path.Join(Environment.GetEnvironmentVariable("SecretPath"),  "TopSecret"))

Rotera krypteringscertifikatet för den centrala hemliga tjänsten

Det är viktigt att observera att certifikaten förblir giltiga för dekryptering efter att de upphört att gälla. För närvarande rekommenderar vi att du fortsätter att etablera tidigare krypteringscertifikat efter rotation för att minska risken för en utelåsning. För att rotera CSS-krypteringscertifikatet krävs följande steg:

  1. Etablera det nya certifikatet till varje nod i klustret. Ta för närvarande inte bort/fortsätt att etablera det tidigare krypteringscertifikatet.
  2. Starta en klusterkonfigurationsuppgradering för att ändra värdet EncryptionCertificateThumbprint för till SHA-1-tumavtrycket för det nya certifikatet. När uppgraderingen är klar börjar CSS omkryptera det befintliga innehållet till det nya krypteringscertifikatet. Alla hemligheter som läggs till i CSS efter den här punkten krypteras direkt till det nya krypteringscertifikatet. Eftersom konvergensen med att alla hemligheter skyddas av det nya certifikatet är asynkron är det viktigt att det tidigare krypteringscertifikatet förblir installerat på alla noder och är tillgängligt för CSS.

Ta bort Central Secret Service från klustret

Säker borttagning av Central Secret Service från ett kluster kräver två uppgraderingar. Den första uppgraderingen inaktiverar CSS funktionellt, medan den andra uppgraderingen tar bort tjänsten från klusterdefinitionen, vilket inkluderar permanent borttagning av dess innehåll. Den här tvåstegsprocessen förhindrar oavsiktlig borttagning av tjänsten och hjälper till att säkerställa att det inte finns några överblivna beroenden på CSS under borttagningsprocessen. Den här funktionen är tillgänglig från SF version 8.0 och senare.

Steg 1: Uppdatera CSS DeployedState till borttagning

Uppgradera klusterdefinition från "IsEnabled" = "true" eller från "DeployedState" = "enabled" till

{
    "name":  "DeployedState",
    "value":  "removing"
}

När Central Secret Service har angett det distribuerade tillståndet Removingavvisas alla inkommande HEMLIGA API-anrop, oavsett om det gäller direkta REST-anrop eller via aktiveringar av tjänster som inkluderar SecretStoreRefs eller KeyVaultReferences. Alla program eller komponenter i klustret som fortfarande är beroende av CSS vid den här tidpunkten hamnar i varningstillstånd. Om detta inträffar bör uppgraderingen till distribuerat tillstånd Removing återställas. Om uppgraderingen redan har slutförts bör en ny uppgradering initieras för att ändra CSS tillbaka till DeployedState = Enabled. Om Central Secret Service tar emot en begäran när den är i distribuerat tillstånd Removingreturnerar den HTTP Code 401 (obehörig) och placerar sig i ett varningstillstånd.

Steg 2: Uppdatera CSS DeployedState till inaktiverad

Uppgradera klusterdefinition från "DeployedState" = "removing" till

{
    "name":  "DeployedState",
    "value":  "disabled"
}

Central Secret Service bör inte längre köras i klustret och finns inte i listan över systemtjänster. Innehållet i CSS går oåterkalleligt förlorat.

Nästa steg