Verwalten von verschlüsselten Geheimnissen in Service Fabric-Anwendungen

In diesem Leitfaden werden die Schritte zum Verwalten von Geheimnissen in einer Service Fabric-Anwendung beschrieben. Geheimnisse beinhalten jegliche Art von vertraulichen Informationen (z.B. Speicherverbindungszeichenfolgen, Kennwörter oder andere Werte, die nicht als Nur-Text verarbeitet werden sollen).

Die Verwendung von verschlüsselten Geheimnissen in einer Service Fabric-Anwendung umfasst drei Schritte:

  • Einrichten eines Verschlüsselungszertifikats und Verschlüsseln von Geheimnissen
  • Angeben von verschlüsselten Geheimnissen in einer Anwendung
  • Entschlüsseln von verschlüsselten Geheimnissen im Dienstcode

Einrichten eines Verschlüsselungszertifikats und Verschlüsseln von Geheimnissen

Das Einrichten eines Verschlüsselungszertifikats und das anschließende Verwenden zum Verschlüsseln von Geheimnissen unterscheidet sich unter Windows und Linux.

Angeben von verschlüsselten Geheimnissen in einer Anwendung

Im vorherigen Schritt wird beschrieben, wie Sie ein Geheimnis mit einem Zertifikat verschlüsseln und eine Zeichenfolge mit Base64-Codierung erzeugen, die in einer Anwendung verwendet werden kann. Diese Base64-codierte Zeichenfolge kann als verschlüsselter Parameter in der Datei „Settings.xml“ eines Diensts oder als verschlüsselte Umgebungsvariable in der Datei „ServiceManifest.xml“ eines Diensts angegeben werden.

Geben Sie einen verschlüsselten Parameter in der Konfigurationsdatei „Settings.xml“ Ihres Diensts an, und legen Sie das Attribut IsEncrypted auf true fest:

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

Geben Sie eine verschlüsselte Umgebungsvariable in der Datei „ServiceManifest.xml“ Ihres Diensts an, und legen Sie das Attribut Type auf Encrypted fest:

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

Die Geheimnisse sollten auch in Ihre Service Fabric-Anwendung eingebunden werden, indem Sie ein Zertifikat im Anwendungsmanifest angeben. Fügen Sie der Datei ApplicationManifest.xml ein SecretsCertificate-Element hinzu, und binden Sie den Fingerabdruck des gewünschten Zertifikats ein.

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

Hinweis

Beim Aktivieren einer Anwendung, die ein SecretsCertificate angibt, sucht Service Fabric das übereinstimmende Zertifikat und gewährt der Identität, in der die Anwendung ausgeführt wird, volle Berechtigungen für den privaten Schlüssel des Zertifikats. Service Fabric überwacht außerdem das Zertifikat auf Änderungen und wendet die Berechtigungen entsprechend erneut an. Zum Erkennen von Änderungen für Zertifikate, die über einen allgemeinen Namen deklariert wurden, führt Service Fabric eine regelmäßige Aufgabe aus, die alle übereinstimmenden Zertifikate findet und sie mit einer zwischengespeicherten Liste von Fingerabdrücken vergleicht. Wenn ein neuer Fingerabdruck erkannt wird, bedeutet dies, dass ein Zertifikat dieses Antragstellers erneuert wurde. Der Task wird einmal pro Minute auf jedem Knoten des Clusters ausgeführt.

Obwohl SecretsCertificate antragstellerbasierte Deklarationen zulässt, sollten Sie beachten, dass die verschlüsselten Einstellungen an das Schlüsselpaar gebunden sind, das zum Verschlüsseln der Einstellung auf dem Client verwendet wurde. Sie müssen sicherstellen, dass das ursprüngliche Verschlüsselungszertifikat (oder eine Entsprechung) mit der antragstellerbasierten Deklaration übereinstimmt und dass es einschließlich des zugehörigen privaten Schlüssels auf jedem Knoten des Clusters installiert ist, der die Anwendung hosten könnte. Alle derzeit gültigen Zertifikate, die mit der antragstellerbasierten Deklaration übereinstimmen und mit demselben Schlüsselpaar wie das ursprüngliche Verschlüsselungszertifikat erstellt wurden, werden als Entsprechungen angesehen.

Einfügen von Geheimnissen aus Anwendungen in Anwendungsinstanzen

Die Bereitstellung in anderen Umgebungen sollte idealerweise so automatisiert wie möglich erfolgen. Zu diesem Zweck können Sie die Geheimnisse in einer Buildumgebung verschlüsseln und die verschlüsselten Geheimnisse beim Erstellen von Anwendungsinstanzen als Parameter angeben.

Verwenden von überschreibbaren Parametern in „Settings.xml“

Die Konfigurationsdatei „Settings.xml“ ermöglicht die Verwendung überschreibbarer Parameter, die bei der Anwendungserstellung angegeben werden können. Verwenden Sie das Attribut MustOverride , anstatt einen Wert für einen Parameter anzugeben:

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

Um Werte in „Settings.xml“ zu überschreiben, deklarieren Sie einen Außerkraftsetzungsparameter für den Dienst 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>

Der Wert kann nun beim Erstellen einer Instanz der Anwendung als Anwendungsparameter angegeben werden. Sie können mithilfe von PowerShell ein Skript zum Erstellen einer Anwendungsinstanz erstellen. Alternativ können Sie C# verwenden, um eine problemlose Integration in einen Erstellungsprozess zu ermöglichen.

Bei Verwendung von PowerShell wird der Parameter als Hashtabelle an den Befehl New-ServiceFabricApplication übergeben:

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

Bei Verwendung von C# werden Anwendungsparameter in einer ApplicationDescription als NameValueCollection angegeben:

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

Entschlüsseln von verschlüsselten Geheimnissen im Dienstcode

Mit den APIs für den Zugriff auf Parameter und Umgebungsvariablen wird eine einfache Entschlüsselung von verschlüsselten Werten ermöglicht. Da die verschlüsselte Zeichenfolge Informationen zum Zertifikat enthält, das für die Verschlüsselung verwendet wurde, müssen Sie das Zertifikat nicht manuell angeben. Das Zertifikat muss lediglich auf dem Knoten installiert sein, auf dem der Dienst ausgeführt wird.

// 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ächste Schritte