Versleutelde geheimen beheren in Service Fabric-toepassingen

Deze handleiding begeleidt u bij de stappen voor het beheren van geheimen in een Service Fabric-toepassing. Geheimen kunnen gevoelige informatie zijn, zoals verbindingsreeksen voor opslag, wachtwoorden of andere waarden die niet in tekst zonder opmaak mogen worden verwerkt.

Het gebruik van versleutelde geheimen in een Service Fabric-toepassing omvat drie stappen:

  • Stel een versleutelingscertificaat in en versleutel geheimen.
  • Geef versleutelde geheimen op in een toepassing.
  • Versleutelde geheimen ontsleutelen van servicecode.

Een versleutelingscertificaat instellen en geheimen versleutelen

Het instellen van een versleutelingscertificaat en het gebruik ervan voor het versleutelen van geheimen varieert tussen Windows en Linux.

Versleutelde geheimen opgeven in een toepassing

In de vorige stap wordt beschreven hoe u een geheim versleutelt met een certificaat en een met base 64 gecodeerde tekenreeks produceert voor gebruik in een toepassing. Deze met base 64 gecodeerde tekenreeks kan worden opgegeven als een versleutelde parameter in de Settings.xml van een service of als een versleutelde omgevingsvariabele in de ServiceManifest.xml van een service.

Geef een versleutelde parameter op in het Settings.xml-configuratiebestand van uw service met het IsEncrypted kenmerk ingesteld op true:

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

Geef een versleutelde omgevingsvariabele op in het ServiceManifest.xml-bestand van uw service met het Type kenmerk ingesteld op Encrypted:

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

De geheimen moeten ook worden opgenomen in uw Service Fabric-toepassing door een certificaat op te geven in het toepassingsmanifest. Voeg het element SecretsCertificate toe aan ApplicationManifest.xml en voeg de vingerafdruk van het gewenste certificaat toe.

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

Notitie

Bij het activeren van een toepassing die een SecretsCertificate opgeeft, vindt Service Fabric het overeenkomende certificaat en verleent de identiteit die de toepassing wordt uitgevoerd onder volledige machtigingen voor de persoonlijke sleutel van het certificaat. Service Fabric controleert het certificaat ook op wijzigingen en past de machtigingen dienovereenkomstig toe. Als u wijzigingen wilt detecteren voor certificaten die zijn gedeclareerd met een algemene naam, voert Service Fabric een periodieke taak uit die alle overeenkomende certificaten zoekt en deze vergelijkt met een lijst met vingerafdrukken in de cache. Wanneer een nieuwe vingerafdruk wordt gedetecteerd, betekent dit dat een certificaat van dat onderwerp is vernieuwd. De taak wordt eenmaal per minuut uitgevoerd op elk knooppunt van het cluster.

Hoewel geheimencertificaat declaraties op basis van een onderwerp toestaat, moet u er rekening mee houden dat de versleutelde instellingen zijn gekoppeld aan het sleutelpaar dat is gebruikt om de instelling op de client te versleutelen. U moet ervoor zorgen dat het oorspronkelijke versleutelingscertificaat (of een equivalent) overeenkomt met de declaratie op basis van het onderwerp en dat het is geïnstalleerd, inclusief de bijbehorende persoonlijke sleutel, op elk knooppunt van het cluster waarop de toepassing kan worden gehost. Alle tijd geldige certificaten die overeenkomen met de op het onderwerp gebaseerde declaratie en die zijn gebouwd op basis van hetzelfde sleutelpaar als het oorspronkelijke versleutelingscertificaat, worden beschouwd als equivalenten.

Toepassingsgeheimen injecteren in toepassingsexemplaren

In het ideale geval moet de implementatie in verschillende omgevingen zo geautomatiseerd mogelijk zijn. Dit kan worden bereikt door geheime versleuteling uit te voeren in een build-omgeving en de versleutelde geheimen als parameters op te geven bij het maken van toepassingsexemplaren.

Overschrijfbare parameters gebruiken in Settings.xml

Het Settings.xml-configuratiebestand staat overschrijfbare parameters toe die kunnen worden opgegeven tijdens het maken van de toepassing. Gebruik het MustOverride kenmerk in plaats van een waarde op te geven voor een 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>

Als u waarden in Settings.xml wilt overschrijven, declareert u een overschrijvingsparameter voor de service in 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>

De waarde kan nu worden opgegeven als een toepassingsparameter bij het maken van een exemplaar van de toepassing. Het maken van een toepassingsexemplaren kan worden uitgevoerd met behulp van PowerShell of geschreven in C#, voor eenvoudige integratie in een buildproces.

Met Behulp van PowerShell wordt de parameter als een hash-tabel aan de New-ServiceFabricApplication opdracht geleverd:

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

Met behulp van C# worden toepassingsparameters in een ApplicationDescription opgegeven als een 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);

Versleutelde geheimen ontsleutelen vanuit servicecode

Met de API's voor toegang tot parameters en omgevingsvariabelen kunt u versleutelde waarden eenvoudig ontsleutelen. Omdat de versleutelde tekenreeks informatie bevat over het certificaat dat wordt gebruikt voor versleuteling, hoeft u het certificaat niet handmatig op te geven. Het certificaat hoeft alleen te worden geïnstalleerd op het knooppunt waarop de service wordt uitgevoerd.

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

Volgende stappen