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.
- Einrichten eines Verschlüsselungszertifikats und Verschlüsseln von Geheimnissen in Windows-Clustern.
- Einrichten eines Verschlüsselungszertifikats und Verschlüsseln von Geheimnissen in Linux-Clustern.
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
- Service Fabric-Geheimnisspeicher
- Erfahren Sie mehr über Anwendungs- und Dienstsicherheit.