Central Secret Service in Azure Service Fabric

Central Secret Service (CSS), ook wel bekend als Central Secret Store, is een Service Fabric-systeemservice die is bedoeld om geheimen binnen een cluster te beveiligen. CSS vereenvoudigt het beheer van geheimen voor SF-toepassingen, waardoor het niet meer nodig is om te vertrouwen op versleutelde parameters.

Central Secret Service is een duurzame, gerepliceerde geheime cache in het cluster; geheimen die zijn opgeslagen in CSS worden at rest versleuteld naar een door de klant geleverd versleutelingscertificaat. CSS biedt client-API's voor geheimbeheer, die toegankelijk zijn voor entiteiten die zich verifiëren als het cluster of als gebruiker van een clusterbeheerder. Het Service Fabric-runtimetoepassingsmodel kan worden geïntegreerd met CSS, waardoor toepassingsparameters kunnen worden opgegeven als CSS-geheime verwijzingen.

CSS is ook belangrijk bij het inrichten van toepassingsgeheimen die zijn gedeclareerd als KeyVault-geheime URI's, in combinatie met beheerde identiteit voor in Azure geïmplementeerde Service Fabric-toepassingen.

Central Secret Service is niet bedoeld als vervanging voor een speciale, externe geheimenbeheerservice, zoals Azure Key Vault.

Notitie

Bij het activeren van CSS op een SF-cluster met een eerdere versie dan 7.1. CU3, activering kan mislukken en CSS permanent beschadigd laten als het cluster is geconfigureerd voor Windows-verificatie of als EncryptionCertificateThumbprint onjuist is gedeclareerd of als het bijbehorende certificaat niet is geïnstalleerd. In beide gevallen is het raadzaam om het cluster te upgraden naar een SF-runtimeversie die hoger is dan 7.1. CU3 voordat u doorgaat.

Central Secrets Service inschakelen

Als u Central Secret Service wilt inschakelen, werkt u de clusterconfiguratie bij zoals hieronder wordt beschreven. U wordt aangeraden een versleutelingscertificaat te gebruiken dat verschilt van uw clustercertificaat. Dit certificaat moet op alle knooppunten worden geïnstalleerd.

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

Notitie

De configuratie-instelling 'DeployedState', geïntroduceerd in Service Fabric versie 8.0, is het voorkeursmechanisme om CSS in of uit te schakelen; deze functie werd in eerdere versies geleverd door de configuratie-instelling 'IsEnabled', die nu als verouderd wordt beschouwd.

Geheimmodel van centrale geheime service

De Central Secret Service-API maakt twee typen beschikbaar: geheime resource en geheime versie. Het type geheime resource vertegenwoordigt conceptueel een familie van versies van één geheim dat voor een specifiek doel wordt gebruikt; voorbeelden zijn: een connection string, een wachtwoord, een eindpuntcertificaat. Een object van het resourcetype geheim bevat metagegevens die aan dat geheim zijn gekoppeld, met name soort, inhoudstype en beschrijving. Het type geheime versie vertegenwoordigt een bepaald exemplaar van het bijbehorende geheim en slaat de geheime tekst zonder opmaak (versleuteld) op; Verdergaand met de bovenstaande voorbeelden bevat een geheime versie de huidige wachtwoordwaarde, een certificaatobject dat geldig is tot het einde van de maand, enzovoort. Bij het vernieuwen van deze geheimen moeten nieuwe geheime versies worden geproduceerd (en toegevoegd aan CSS).

Als u het model formaliseert, zijn de volgende regels geïmplementeerd en afgedwongen in de CSS-implementatie:

  • Een geheime resource kan nul of meer versies hebben
  • Elke geheime versie is een onderliggend element van een bepaalde geheime resource; een versie mag slechts één bovenliggende resource hebben
  • Een afzonderlijke geheime versie kan worden verwijderd, zonder dat dit van invloed is op andere versies van hetzelfde geheim
  • Als u een geheime resource verwijdert, worden alle versies ervan verwijderd
  • De waarde van een geheime versie is onveranderbaar

Een geheime resource declareren

U kunt een geheime resource maken met behulp van de REST API.

Notitie

Als het cluster Gebruikmaakt van Windows-verificatie zonder een HttpGateway-certificaat, wordt de REST-aanvraag verzonden via een onbeveiligd HTTP-kanaal. Als u TLS voor dit kanaal wilt inschakelen, moet de clusterdefinitie worden bijgewerkt om een HTTP-gatewayservercertificaat op te geven.

Als u een supersecret geheime resource wilt maken met behulp van de REST API, moet u een PUT-aanvraag indienen bij https://<clusterfqdn>:19080/Resources/Secrets/supersecret?api-version=6.4-preview. U moet verifiëren met behulp van een clustercertificaat of een clientcertificaat voor beheerders om een geheime resource te maken.

$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

De geheime waarde instellen

Gebruik het volgende script om de REST API te gebruiken om de geheime waarde in te stellen.

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

De geheime waarde onderzoeken

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

Het geheim in uw toepassing gebruiken

Een toepassing kan een geheim uit CSS gebruiken door het te declareren als een omgevingsvariabele of door een pad op te geven waar de geheime tekst zonder opmaak moet worden geserialiseerd. Volg deze stappen om te verwijzen naar een CSS-geheim:

  1. Voeg een sectie toe aan het settings.xml-bestand met het volgende fragment. Hier ziet u dat de waarde de notatie {secretname:version} heeft.
     <Section Name="testsecrets">
      <Parameter Name="TopSecret" Type="SecretsStoreRef" Value="supersecret:ver1"/
     </Section>
  1. Importeer de sectie in 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>

Voorbeeld 1: Koppel de geheimen aan een container. De enige wijziging die nodig is om de geheimen beschikbaar te maken in de container, is naar specify een koppelpunt in <ConfigPackage>. Het volgende codefragment is de gewijzigde 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>

Geheimen zijn beschikbaar onder het koppelpunt in uw container.

Voorbeeld 2: Een geheim binden aan een procesomgevingsvariabele door op te Type='SecretsStoreRefgeven. Het volgende codefragment is een voorbeeld van het binden van de supersecret versie ver1 aan de omgevingsvariabele MySuperSecret in ServiceManifest.xml.

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

De omgevingsvariabele SecretPath verwijst naar de map waarin alle geheimen zijn opgeslagen. Elke parameter die in de testsecrets sectie wordt vermeld, wordt opgeslagen in een afzonderlijk bestand. De toepassing kan het geheim nu als volgt gebruiken:

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

Het versleutelingscertificaat van de centrale geheime service roteren

Het is belangrijk te weten dat certificaten ook na het verlopen geldig blijven voor ontsleuteling. Op dit moment raden we u aan om na het rouleren door te gaan met het inrichten van eerdere versleutelingscertificaten, om de kans op een vergrendeling te verkleinen. Voor het roteren van het CSS-versleutelingscertificaat zijn de volgende stappen vereist:

  1. Richt het nieuwe certificaat in voor elk knooppunt van het cluster. Op dit moment moet u het vorige versleutelingscertificaat niet verwijderen of doorgaan met het inrichten van het vorige versleutelingscertificaat.
  2. Start een clusterconfiguratie-upgrade om de waarde van EncryptionCertificateThumbprint te wijzigen in de SHA-1-vingerafdruk van het nieuwe certificaat. Na voltooiing van de upgrade begint CSS met het opnieuw versleutelen van de bestaande inhoud naar het nieuwe versleutelingscertificaat. Alle geheimen die na dit punt aan CSS worden toegevoegd, worden rechtstreeks versleuteld naar het nieuwe versleutelingscertificaat. Omdat de convergentie om alle geheimen te beveiligen door het nieuwe certificaat asynchroon is, is het belangrijk dat het vorige versleutelingscertificaat op alle knooppunten is geïnstalleerd en beschikbaar blijft voor CSS.

Central Secret Service verwijderen uit uw cluster

Voor het veilig verwijderen van Central Secret Service uit een cluster zijn twee upgrades vereist. De eerste upgrade schakelt CSS functioneel uit, terwijl de tweede upgrade de service verwijdert uit de clusterdefinitie, waaronder de permanente verwijdering van de inhoud. Dit proces in twee fasen voorkomt onbedoelde verwijdering van de service en helpt ervoor te zorgen dat er geen zwevende afhankelijkheden van CSS zijn tijdens het verwijderingsproces. Deze functie is beschikbaar vanaf SF-versie 8.0.

Stap 1: CSS DeployedState bijwerken om te verwijderen

Clusterdefinitie upgraden van "IsEnabled" = "true" of van "DeployedState" = "enabled" naar

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

Zodra Central Secret Service de geïmplementeerde status Removingheeft bereikt, worden alle binnenkomende geheime API-aanroepen geweigerd, ongeacht of het directe REST-aanroepen zijn of via activeringen van services die SecretStoreRefs of KeyVaultReferences bevatten. Alle toepassingen of onderdelen in het cluster die op dit moment nog steeds afhankelijk zijn van CSS, krijgen de status Waarschuwing. Als dit gebeurt, moet de upgrade naar de geïmplementeerde status Removing worden teruggedraaid. Als die upgrade al is geslaagd, moet een nieuwe upgrade worden gestart om CSS weer te wijzigen in DeployedState = Enabled. Als de Centrale Geheime Dienst een aanvraag ontvangt terwijl deze is geïmplementeerd Removing, wordt HTTP-code 401 (niet geautoriseerd) geretourneerd en wordt de status Waarschuwing weergegeven.

Stap 2: CSS DeployedState bijwerken naar uitgeschakeld

Clusterdefinitie upgraden van "DeployedState" = "removing" naar

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

Centrale geheime service mag niet meer worden uitgevoerd in het cluster en zal niet aanwezig zijn in de lijst met systeemservices. De inhoud van CSS is onherroepelijk verloren gegaan.

Volgende stappen