KeyVaultReference-Unterstützung für in Azure bereitgestellte Service Fabric-Anwendungen

Eine häufige Herausforderung bei der Entwicklung von Cloudanwendungen besteht darin, herauszufinden, wie Sie Geheimnisse sicher an Ihre Anwendungen weitergeben und verwalten können. Durch KeyVaultReference-Unterstützung von Service Fabric wird diese Aufgabe ganz einfach. Nach der Konfiguration können Sie in Ihrer Anwendungsdefinition auf die URL des Geheimnisses verweisen, das in Key Vault gespeichert ist, und Service Fabric übernimmt das Abrufen dieses Geheimnisses und die Aktivierung Ihrer Anwendung mit diesem Geheimnis. Wenn Sie die „SF-verwaltete“ Version der Funktion verwenden, kann Service Fabric auch Ihren Key Vault überwachen und automatisch rollierende Upgrades der Anwendungsparameter auslösen, wenn sich Ihre Geheimnisse im Tresor rotiert werden.

Optionen für die Bereitstellung von Geheimen für Anwendungen in Service Fabric

Das klassische Verfahren zur Übermittlung von Geheimnissen an eine Service-Fabric-Anwendung bestand darin, verschlüsselte Parameter zu deklarieren. Dabei wurden Geheimnisse mit einem Verschlüsselungszertifikat verschlüsselt und diese verschlüsselten Geheimnisse an Ihre Anwendung übergeben. Diese Methode hat einige Nachteile: Das Verschlüsselungszertifikat muss verwaltet werden, die Geheimnisse werden in der Bereitstellungspipeline offengelegt und die Metadaten der Geheimnisse, die mit einer bereitgestellten Anwendung verknüpft sind, sind nicht transparent. Auch das Rotieren von Geheimnissen erfordert eine Anwendungsbereitstellung. Sofern Sie keinen eigenständigen Cluster ausführen, wird die Verwendung verschlüsselter Parameter nicht mehr empfohlen.

Eine weitere Option ist die Verwendung von geheimen Speicherverweisen. Diese Vorgehensweise ermöglicht die zentrale Verwaltung Ihrer Anwendungsgeheimnisse, eine bessere Transparenz der Metadaten der bereitgestellten Geheimnisse und die zentrale Verwaltung des Verschlüsselungszertifikats. Einige Benutzer bevorzugen diese Art der Geheimnisverwaltung, wenn sie eigenständige Service Fabric-Cluster betreiben.

Die aktuelle Empfehlung lautet, die Abhängigkeit von Geheimnissen so weit wie möglich zu reduzieren, indem verwaltete Identitäten für Service Fabric-Anwendungen verwendet werden. Verwaltete Identitäten können verwendet werden, um sich direkt für Azure Storage, Azure SQL und vieles mehr zu authentifizieren. Das bedeutet, dass beim Zugriff auf Azure-Dienste, die Microsoft Entra-Authentifizierung unterstützen, keine separaten Anmeldeinformationen verwaltet werden müssen.

Wenn es nicht möglich ist, eine verwaltete Identität als Client zu verwenden, wird die Verwendung von KeyVaultReferences empfohlen. Sie sollten KeyVaultReferences verwenden, anstatt eine verwaltete Identität zu verwenden, um direkt zu Key Vault zu gelangen. KeyVaultReferences helfen, die Verfügbarkeit Ihrer Anwendung zu erhöhen, da diese Option erzwingt, dass Geheimnisänderungen während paralleler Upgrades auftreten. Auch die Skalierbarkeit ist besser, da die Geheimnisse zwischengespeichert und aus dem Cluster bereitgestellt werden. Wenn Ihre Anwendung derzeit verschlüsselte Parameter verwendet, sind nur minimale Änderungen in Ihrem Anwendungscode erforderlich, um KeyVaultReferences zu verwenden. Ihre Anwendung kann weiterhin erwarten, dass sie ein einziges Geheimnis verwendet, und dass dieses Geheimnis während der gesamten Lebensdauer des Prozesses gleich bleibt.

Voraussetzungen

  • Verwaltete Identität für Service Fabric-Anwendungen

    KeyVaultReference-Unterstützung für Service Fabric verwendet die verwaltete Identität einer Anwendung, um Geheimnisse für die Anwendung abzurufen. Sie müssen Ihre Anwendung über ARM bereitstellen und ihr eine verwaltete Identität zuweisen. Befolgen Sie die Anweisungen in diesem Dokument, um die verwaltete Identität für Ihre Anwendung zu aktivieren.

  • Central Secrets Store (CSS)

    Central Secrets Store (CSS) ist der verschlüsselte lokale Cache für Geheimnisse von Service Fabric. Diese Funktion verwendet CSS, um Geheimnisse zu schützen und beizubehalten, nachdem sie aus Key Vault abgerufen wurden. Das Aktivieren dieses Systemdiensts ist erforderlich, um KeyVaultReferences zu verwenden. Aktivieren und konfigurieren Sie CSS wie in diesem Dokument beschrieben.

  • Erteilen der Zugriffsberechtigung für verwaltete Identitäten der Anwendung auf die Key Vault-Instanz

    Lesen Sie dieses Dokument, um zu sehen, wie Sie der Key Vault-Instanz Zugriff auf verwaltete Identitäten erteilen können. Beachten Sie auch, dass bei Verwendung der systemseitig zugewiesenen verwalteten Identität die verwaltete Identität erst nach der Bereitstellung der Anwendung erstellt wird. Dadurch können Racebedingungen entstehen, unter denen die Anwendung versucht, auf das Geheimnis zuzugreifen, bevor der Identität Zugriff auf den Tresor erteilt werden kann. Der Name der systemseitig zugewiesenen Identität wird {cluster name}/{application name}/{service name} lauten.

KeyVaultReferences im Vergleich zu verwalteten KeyVaultReferences

Die Grundidee von KeyVaultReferences ist, dass Sie nicht den Wert Ihres Anwendungsparameters als Ihr Geheimnis festlegen, sondern die Key Vault-URL, die dann bei der Aktivierung Ihrer Anwendung in den geheimen Wert aufgelöst wird. In Key Vault kann beispielsweise ein einzelnes Geheimnis, z. B. https://my.vault.azure.net/secrets/MySecret/, mehrere Versionen haben, z. B. https://my.vault.azure.net/secrets/MySecret/<oid1> und <oid2>. Wenn Sie KeyVaultReference verwenden, sollte der Wert ein Verweis mit Versionsangabe (https://my.vault.azure.net/secrets/MySecret/<oid1>) sein. Wenn Sie dieses Geheimnis im Tresor rotieren, beispielsweise in <oid2>, sollten Sie ein Anwendungsupgrade für den neuen Verweis auslösen. Wenn Sie ManagedKeyVaultReference verwenden, sollte der Wert ein versionsloser Verweis (https://my.vault.azure.net/secrets/MySecret/) sein. Service Fabric löst die neueste <oid1>-Instanz auf und aktiviert die Anwendung mit diesem Geheimnis. Wenn Sie den Schlüssel im Tresor in <oid2> rotieren, löst Service Fabric automatisch ein Anwendungsparameterupgrade aus, um in Ihrem Auftrag zu <oid2> zu wechseln.

Hinweis

KeyVaultReference-Unterstützung (Geheimnisse mit Versionsangabe) für Service Fabric-Anwendungen ist ab Service Fabric Version 7.2 CU5 allgemein verfügbar. Sie sollten ein Upgrade auf diese Version durchführen, bevor Sie dieses Feature verwenden.

Hinweis

Verwaltete KeyVaultReference-Unterstützung (versionslose Geheimnisse) für Service Fabric-Anwendungen ist ab Service Fabric Version 9.0 allgemein verfügbar.

Verwenden von KeyVaultReferences in der Anwendung

KeyVaultReferences kann folgendermaßen genutzt werden:

Als Umgebungsvariable

<EnvironmentVariables>
      <EnvironmentVariable Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
</EnvironmentVariables>
string secret =  Environment.GetEnvironmentVariable("MySecret");

Als Datei in Ihren Container eingebunden

  • Hinzufügen eines Abschnitts zu „settings.xml“

    Definieren Sie den Parameter MySecret mit dem Typ KeyVaultReference und dem Wert <KeyVaultURL>.

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
    </Section>
    
  • Verweisen Sie auf den neuen Abschnitt in „ApplicationManifest.xml“ in <ConfigPackagePolicies>.

    <ServiceManifestImport>
        <Policies>
        <IdentityBindingPolicy ServiceIdentityRef="MyServiceMI" ApplicationIdentityRef="MyApplicationMI" />
        <ConfigPackagePolicies CodePackageRef="Code">
            <!--Linux container example-->
            <ConfigPackage Name="Config" SectionName="MySecrets" EnvironmentVariableName="SecretPath" MountPoint="/var/secrets"/>
            <!--Windows container example-->
            <!-- <ConfigPackage Name="Config" SectionName="dbsecrets" EnvironmentVariableName="SecretPath" MountPoint="C:\secrets"/> -->
        </ConfigPackagePolicies>
        </Policies>
    </ServiceManifestImport>
    
  • Nutzen von Geheimnissen vom Dienstcode aus

    Jeder unter <Section Name=MySecrets> aufgeführte Parameter ist eine Datei unter dem Ordner, auf den „EnvironmentVariable SecretPath“ verweist. Der nachfolgende C#-Codeausschnitt zeigt, wie Sie MySecret aus Ihrer Anwendung lesen können.

    string secretPath = Environment.GetEnvironmentVariable("SecretPath");
    using (StreamReader sr = new StreamReader(Path.Combine(secretPath, "MySecret"))) 
    {
        string secret =  sr.ReadToEnd();
    }
    

    Hinweis

    MountPoint steuert den Ordner, in den die Dateien mit den geheimen Werten eingebunden werden.

Als Verweis auf ein Containerrepository-Kennwort

 <Policies>
      <ContainerHostPolicies CodePackageRef="Code">
        <RepositoryCredentials AccountName="MyACRUser" Type="KeyVaultReference" Password="<KeyVaultURL>"/>
      </ContainerHostPolicies>

Verwenden von verwalteten KeyVaultReferences in der Anwendung

Zunächst müssen Sie die Geheimnisüberwachung aktivieren, indem Sie Ihre Clusterdefinition aktualisieren, um die Einstellung EnableSecretMonitoring zusätzlich zu den anderen erforderlichen CSS-Konfigurationen hinzuzufügen:

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

Hinweis

Die Standardeinstellung kann in Zukunft ggf. true sein.

Nachdem das Clusterupgrade abgeschlossen wurde, kann Ihre Benutzeranwendung aktualisiert werden. Überall dort, wo KeyVaultReference verwendet werden kann, kann auch ManagedKeyVaultReference verwendet werden, z. B.

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="ManagedKeyVaultReference" Value="[MySecretReference]"/>
    </Section>

Der Hauptunterschied bei der Angabe von ManagedKeyVaultReferences besteht darin, dass diese Verweise nicht im Anwendungstypmanifest hartcodiert werden können. Sie müssen als Parameter auf Anwendungsebene deklariert werden, und darüber hinaus müssen sie in Ihrer ARM-Anwendungsdefinition außer Kraft gesetzt werden.

Hier ist ein Auszug aus einem wohlgeformten Manifest

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest ApplicationTypeName="MyAppType" ApplicationTypeVersion="1.0.0">
  <Parameters>
    <Parameter Name="MySecretReference" DefaultValue="" />
  </Parameters>
  <ServiceManifestImport>
    <EnvironmentOverrides CodePackageRef="Code">
      <EnvironmentVariable Name="MySecret" Value="[MySecretReference]" Type="ManagedKeyVaultReference" />
    </EnvironmentOverrides>
    <Policies>
      <IdentityBindingPolicy ServiceIdentityRef="MySvcIdentity" ApplicationIdentityRef="MyAppIdentity" />
    </Policies>
  </ServiceManifestImport>
  <Principals>
    <ManagedIdentities>
      <ManagedIdentity Name="MyAppIdentity" />
    </ManagedIdentities>
  </Principals>
</ApplicationManifest>

und ein Auszug der Anwendungsressourcendefinition:

{
    "type": "Microsoft.ServiceFabric/clusters/applications",
    "name": "MyApp",
    "identity": {
        "type" : "userAssigned",
        "userAssignedIdentities": {
            "[variables('userAssignedIdentityResourceId')]": {}
        }
    },
    "properties": {
        "parameters": {
            "MySecretReference": "https://my.vault.azure.net/secrets/MySecret/"
        },
        "managedIdentities": [
            {
            "name" : "MyAppIdentity",
            "principalId" : "<guid>"
            }
        ]
    }
}

Sowohl die Deklaration von ManagedKeyVaultReference als Anwendungsparameter als auch das Überschreiben dieses Parameters bei der Bereitstellung ist erforderlich, damit Service Fabric den Lebenszyklus des bereitgestellten Geheimnisses erfolgreich verwalten kann.

Nächste Schritte