Supporto di KeyVaultReference per le applicazioni di Service Fabric distribuite in Azure

Capire come distribuire in modo sicuro i segreti alle applicazioni e gestirli è una sfida comune quando si creano applicazioni cloud. Il supporto di Service Fabric KeyVaultReference semplifica l'operazione. Dopo la configurazione, è possibile fare riferimento all'URL del segreto archiviato in Key Vault nella definizione di applicazione e Service Fabric gestirà il recupero del segreto e l'attivazione dell'applicazione con essa. Quando si usa la versione "gestita da SF" della funzionalità, Service Fabric può anche monitorare l'insieme di credenziali delle chiavi e attivare automaticamente gli aggiornamenti dei parametri dell'applicazione in sequenza quando i segreti ruotano nell'insieme di credenziali.

Opzioni per la distribuzione di segreti alle applicazioni in Service Fabric

La maniera classica per distribuire segreti a un'applicazione di Service Fabric era dichiarare i parametri crittografati. Ciò comportava la crittografia dei segreti in base a un certificato di crittografia e il passaggio di tali segreti crittografati all'applicazione. Questo metodo presenta alcuni svantaggi: la necessità di gestire il certificato di crittografia, l'esposizione dei segreti nella pipeline di distribuzione e la mancanza di visibilità sui metadati dei segreti associati a un'applicazione distribuita. Analogamente, la rotazione dei segreti richiede una distribuzione dell'applicazione. A meno che non si esegua un cluster autonomo, non è più consigliabile usare parametri crittografati.

Un'altra opzione è l'uso dei riferimenti all'archivio segreti. Questa esperienza consente la gestione centrale dei segreti dell'applicazione, una migliore visibilità sui metadati dei segreti distribuiti e consente la gestione centrale del certificato di crittografia. Alcuni potrebbero preferire questo stile di gestione dei segreti quando si eseguono cluster di Service Fabric autonomi.

Oggi è consigliabile ridurre la dipendenza dai segreti, laddove possibile, usando identità gestite per le applicazioni di Service Fabric. Le identità gestite possono essere usate per eseguire l'autenticazione direttamente in Archiviazione di Azure, Azure SQL e altro ancora. Questo significa che non è necessario gestire credenziali separate quando si accede ai servizi di Azure che supportano l'autenticazione di Microsoft Entra.

Quando non è possibile usare l'identità gestita come client, è consigliabile usare KeyVaultReferences. È consigliabile usare KeyVaultReferences anziché usare l'identità gestita per passare direttamente a Key Vault. KeyVaultReferences consente di aumentare la disponibilità dell'applicazione perché impone che le modifiche ai segreti vengano apportate durante gli aggiornamenti in sequenza. Aumenta anche la scalabilità man mano che i segreti vengono memorizzati nella cache e gestiti dall'interno del cluster. Se l'applicazione attualmente usa parametri crittografati, nel codice dell'applicazione saranno necessarie solo modifiche minime per l'uso di KeyVaultReferences. L'applicazione può continuare a proporre un singolo segreto e tale segreto sarà lo stesso per la durata del processo.

Prerequisiti

  • Identità gestita per le applicazioni di Service Fabric

    Il supporto di Service Fabric KeyVaultReference usa l'identità gestita di un'applicazione per recuperare i segreti per conto dell'applicazione. È necessario distribuire l'applicazione tramite ARM e assegnarla un'identità gestita. Seguire questo documento per abilitare l'identità gestita per l'applicazione.

  • Archivio segreti centrali (CSS).

    L'archivio segreti centrali (CSS) è la cache dei segreti locali crittografati di Service Fabric. Questa funzionalità usa CSS per proteggere e perdurare i segreti dopo che sono stati recuperati da Key Vault. L'abilitazione di questo servizio di sistema è necessaria per usare KeyVaultReferences. Seguire questo documento per abilitare e configurare CSS.

  • Concedere all'applicazione l'autorizzazione di identità gestita per l’accesso a Key Vault

    Fare riferimento a questo documento per informazioni su come concedere l'accesso all'identità gestita a Key Vault. Tenere presente che se si usa l'identità gestita assegnata dal sistema, l'identità gestita verrà creata solo dopo la distribuzione dell'applicazione. Ciò può creare race condition in cui l'applicazione tenta di accedere al segreto prima che l'identità possa accedere all'insieme di credenziali. Il nome dell'identità assegnata dal sistema sarà {cluster name}/{application name}/{service name}.

KeyVaultReferences rispetto a KeyVaultReferences gestito

L'idea di base di KeyVaultReferences consiste nell'impostare il valore del parametro dell'applicazione come segreto, impostandolo sull'URL dell'insieme di credenziali delle chiavi, che verrà quindi risolto nel valore del segreto all'attivazione dell'applicazione. In Key Vault un singolo segreto, ad esempio https://my.vault.azure.net/secrets/MySecret/, può avere più versioni, ad esempio https://my.vault.azure.net/secrets/MySecret/<oid1> e <oid2>. Quando si usa un KeyVaultReference, il valore deve essere un riferimento con controllo delle versioni (https://my.vault.azure.net/secrets/MySecret/<oid1>). Se si ruota il segreto nell'insieme di credenziali, ad esempio in <oid2>, è necessario attivare un aggiornamento dell'applicazione al nuovo riferimento. Quando si usa ManagedKeyVaultReference, il valore deve essere un riferimento senza versione (https://my.vault.azure.net/secrets/MySecret/). Service Fabric risolverà l'istanza <oid1> più recente e attiverà l'applicazione con tale segreto. Se si ruota il segreto nell'insieme di credenziali su <oid2>, Service Fabric attiverà automaticamente l'aggiornamento di un parametro dell'applicazione per passare a <oid2> per conto dell'utente.

Nota

Il supporto di KeyVaultReference (segreti con versione) per le applicazioni di Service Fabric è disponibile a livello generale a partire dalla versione 7.2 CU5. di Service Fabric. È consigliabile eseguire l'aggiornamento a questa versione prima di usare questa funzionalità.

Nota

Il supporto di KeyVaultReference gestito (segreti senza versione) per le applicazioni di Service Fabric è disponibile a livello generale a partire dalla versione 9.0 di Service Fabric.

Usare KeyVaultReferences nell'applicazione

KeyVaultReferences può essere utilizzato

Come variabile di ambiente

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

Montato come file nel contenitore

  • Aggiungere una sezione a settings.xml

    Definire il parametro MySecret con Tipo KeyVaultReference e Valore <KeyVaultURL>

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
    </Section>
    
  • Fare riferimento alla nuova sezione 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>
    
  • Utilizzare i segreti dal codice del servizio

    Ogni parametro elencato in <Section Name=MySecrets> sarà un file nella cartella indicata da EnvironmentVariable SecretPath. Il seguente frammento di codice C# illustra come leggere MySecret dall'applicazione.

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

    Nota

    MountPoint controlla la cartella in cui verranno montati i file che contengono valori segreti.

Come riferimento a una password del repository di contenitori

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

Usare KeyVaultReferences gestito nell'applicazione

Prima di tutto, è necessario abilitare il monitoraggio dei segreti aggiornando la definizione del cluster per aggiungere l'impostazione EnableSecretMonitoring, oltre alle altre configurazioni CSS necessarie:

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

Nota

Il valore predefinito potrebbe diventare true in futuro

Al termine dell'aggiornamento del cluster, l'applicazione utente può essere aggiornata. Un oggetto KeyVaultReference può essere usato ovunque, ad esempio, è possibile usare ManagedKeyVaultReference.

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

La differenza principale nella specifica di ManagedKeyVaultReferences è che non possono essere codificati nel manifesto del tipo di applicazione. Devono essere dichiarati come parametri a livello di applicazione e devono essere sottoposti a override nella definizione dell'applicazione ARM.

Ecco un estratto da un manifesto ben formato

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

e un estratto della definizione della risorsa dell'applicazione:

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

Sia dichiarare ManagedKeyVaultReference come parametro dell'applicazione, sia l'override di tale parametro in fase di distribuzione è necessario per consentire a Service Fabric di gestire correttamente il ciclo di vita del segreto distribuito.

Passaggi successivi