Podpora KeyVaultReference pro aplikace Service Fabric nasazené v Azure

Běžným problémem při vytváření cloudových aplikací je zjistit, jak bezpečně distribuovat tajné kódy do aplikací a spravovat je. Podpora Service Fabric KeyVaultReference usnadňuje. Po nakonfigurování můžete odkazovat na adresu URL tajného klíče uloženého ve službě Key Vault v definici vaší aplikace a Service Fabric zpracuje načtení tohoto tajného klíče a aktivaci aplikace. Při použití verze SF spravované funkce může Service Fabric také monitorovat službu Key Vault a automaticky aktivovat postupné upgrady parametrů aplikace při obměně tajných kódů v trezoru.

Možnosti doručování tajných kódů aplikacím v Service Fabric

Klasickým způsobem doručování tajných kódů do aplikace Service Fabric bylo deklarování šifrovaných parametrů. To zahrnovalo šifrování tajných kódů proti šifrovacímu certifikátu a předání těchto šifrovaných tajných kódů do vaší aplikace. Tato metoda má několik nevýhod: vyžaduje správu šifrovacího certifikátu, vystavení tajných kódů v kanálu nasazení a nedostatek přehledu o metadatech tajných kódů připojených k nasazené aplikaci. Podobně rotace tajných kódů vyžaduje nasazení aplikace. Pokud nepoužíváte samostatný cluster, nedoporučujeme používat šifrované parametry.

Další možností je použití odkazů na úložiště tajných kódů. Toto prostředí umožňuje centrální správu tajných kódů aplikací, lepší přehled o metadatech nasazených tajných kódů a umožňuje centrální správu šifrovacího certifikátu. Některé můžou preferovat tento styl správy tajných kódů při spouštění samostatných clusterů Service Fabric.

Dnes doporučujeme omezit závislost na tajných kódech všude, kde je to možné, pomocí spravovaných identit pro aplikace Service Fabric. Spravované identity se dají použít k přímému ověření ve službě Azure Storage, Azure SQL a dalších. To znamená, že při přístupu ke službám Azure, které podporují ověřování Microsoft Entra, není potřeba spravovat samostatné přihlašovací údaje.

Pokud není možné používat spravovanou identitu jako klienta, doporučujeme použít keyVaultReferences. Místo použití spravované identity byste měli použít keyVaultReferences, abyste přešli přímo do služby Key Vault. KeyVaultReferences pomáhají zvýšit dostupnost vaší aplikace, protože vynucuje změny tajných kódů během postupného upgradu. Škáluje se také lépe, protože tajné kódy se ukládají do mezipaměti a obsluhují se z clusteru. Pokud vaše aplikace dnes používá šifrované parametry, v kódu aplikace jsou potřeba jenom minimální změny, které by používaly KeyVaultReferences. Vaše aplikace může dál očekávat, že přijde s jedním tajným kódem a aby tento tajný kód byl po celou dobu života procesu stejný.

Předpoklady

  • Spravovaná identita pro aplikace Service Fabric

    Podpora Service Fabric KeyVaultReference používá spravovanou identitu aplikace k načtení tajných kódů jménem aplikace. Aplikaci musíte nasadit prostřednictvím ARM a přiřadit jí spravovanou identitu. Pokud chcete pro vaši aplikaci povolit spravovanou identitu, postupujte podle tohoto dokumentu .

  • Centrální úložiště tajných kódů (CSS).

    Centrální úložiště tajných kódů (CSS) je zašifrovaná místní mezipaměť tajných kódů Service Fabric. Tato funkce používá šablony stylů CSS k ochraně a uchovávání tajných kódů po načtení ze služby Key Vault. K použití KeyVaultReferences se vyžaduje povolení této systémové služby. Podle tohoto dokumentu povolte a nakonfigurujte šablony stylů CSS.

  • Udělení oprávnění pro přístup spravované identity aplikace ke službě Key Vault

    V tomto dokumentu se dozvíte, jak udělit spravované identitě přístup ke službě Key Vault. Všimněte si také, jestli používáte spravovanou identitu přiřazenou systémem, vytvoří se spravovaná identita až po nasazení aplikace. To může vytvořit podmínky časování, kdy se aplikace pokusí získat přístup k tajnému kódu předtím, než se identita dá získat přístup k trezoru. Název identity přiřazené systémem bude {cluster name}/{application name}/{service name}.

KeyVaultReferences vs. Managed KeyVaultReferences

Základní myšlenka KeyVaultReferences je spíše než nastavení hodnoty parametru aplikace jako tajného kódu, nastavíte ji na adresu URL služby Key Vault, která se pak při aktivaci aplikace přeloží na hodnotu tajného kódu. Ve službě Key Vault může mít například https://my.vault.azure.net/secrets/MySecret/ jeden tajný kód více verzí, https://my.vault.azure.net/secrets/MySecret/<oid1> například a <oid2>. Pokud použijete KeyVaultReference, měla by být hodnota odkazem na verzi (https://my.vault.azure.net/secrets/MySecret/<oid1>). Pokud tento tajný kód v trezoru obměňujete například na <oid2>, měli byste aktivovat upgrade aplikace na nový odkaz. Při použití ManagedKeyVaultReference by hodnota měla být odkazem bez verze (https://my.vault.azure.net/secrets/MySecret/). Service Fabric vyřeší nejnovější instanci <oid1> a aktivuje aplikaci s tímto tajným kódem. Pokud tajný klíč v trezoru otočíte do <oid2>, Service Fabric automaticky aktivuje upgrade parametru aplikace, aby se vaším jménem přesunul.<oid2>

Poznámka:

Podpora KeyVaultReference (tajných kódů s verzemi) pro aplikace Service Fabric je obecně dostupná od Service Fabric verze 7.2 CU5. Před použitím této funkce doporučujeme upgradovat na tuto verzi.

Poznámka:

Podpora spravovaných klíčů KeyVaultReference (tajných kódů bez verze) pro aplikace Service Fabric je obecně dostupná od Service Fabric verze 9.0.

Použití keyVaultReferences ve vaší aplikaci

Je možné využívat keyVaultReferences.

Jako proměnná prostředí

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

Připojeno jako soubor do kontejneru

  • Přidání oddílu do settings.xml

    Definování MySecret parametru s typem KeyVaultReference a hodnotou <KeyVaultURL>

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
    </Section>
    
  • Odkaz na nový oddíl v ApplicationManifest.xml v <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>
    
  • Využívání tajných kódů z kódu služby

    Každý parametr uvedený v části <Section Name=MySecrets> bude soubor ve složce, na kterou odkazuje cesta SecretPath EnvironmentVariable. Následující fragment kódu jazyka C# ukazuje, jak číst MySecret z vaší aplikace.

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

    Poznámka:

    MountPoint řídí složku, do které se připojí soubory obsahující tajné hodnoty.

Jako odkaz na heslo úložiště kontejneru

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

Použití spravovaných objektů KeyVaultReference ve vaší aplikaci

Nejprve musíte povolit monitorování tajných kódů upgradem definice clusteru EnableSecretMonitoring , aby se toto nastavení přidalo kromě dalších požadovaných konfigurací CSS:

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

Poznámka:

Výchozí hodnota se může v budoucnu stát true

Po dokončení upgradu clusteru je možné upgradovat vaši uživatelskou aplikaci. Kdekoli je možné použít KeyVaultReference, dá se použít také ManagedKeyVaultReference.

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

Hlavním rozdílem při zadávání ManagedKeyVaultReferences je, že v manifestu typu aplikace nelze pevně zakódovat. Musí být deklarovány jako parametry na úrovni aplikace a dále je nutné je přepsat v definici aplikace ARM.

Tady je výňatek z dobře vytvořeného manifestu.

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

a výňatek definice prostředku aplikace:

{
    "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>"
            }
        ]
    }
}

Jak deklarování ManagedKeyVaultReference jako parametru aplikace, tak přepsání tohoto parametru při nasazení, aby Service Fabric úspěšně spravovaly životní cyklus nasazeného tajného klíče.

Další kroky