Azure にデプロイされた Service Fabric アプリケーションに対する KeyVaultReference サポート

クラウド アプリケーションを構築する際の一般的な課題は、アプリケーションにシークレットを安全に配布して管理する方法を見つけ出すことです。 Service Fabric の KeyVaultReference サポートによりこれが容易になります。 構成後、アプリケーション定義の Key Vault に格納されているシークレットの URL を参照できます。Service Fabric は、そのシークレットのフェッチとそのシークレットを使用したアプリケーションのアクティブ化を処理します。 "SF で管理された" バージョンの機能を使用する場合、Service Fabric は Key Vault を監視し、シークレットがコンテナー内でローテーションされるときにアプリケーション パラメーターのローリング アップグレードを自動的にトリガーすることもできます。

Service Fabric でアプリケーションにシークレットを配信するためのオプション

Service Fabric アプリケーションにシークレットを配信する従来の方法は、暗号化されたパラメーターを宣言することでした。 これには、暗号化証明書に対するシークレットの暗号化と、それらの暗号化されたシークレットのアプリケーションへの引き渡しが含まれます。 この方法には、暗号化証明書の管理が必要、デプロイ パイプライン内のシークレットの公開、デプロイされたアプリケーションにアタッチされたシークレットのメタデータの可視性の欠如など、いくつかの欠点があります。 同様に、シークレットのローテーションには、アプリケーションのデプロイが必要です。 スタンドアロン クラスターを実行している場合を除き、暗号化されたパラメーターの使用は推奨されなくなりました。

もう 1 つのオプションは、シークレット ストア参照の使用です。 このエクスペリエンスにより、アプリケーション シークレットの一元管理、デプロイされたシークレットのメタデータの可視性向上、暗号化証明書の一元管理が可能になります。 スタンドアロン Service Fabric クラスターを実行する場合は、このスタイルのシークレット管理が望ましい場合があります。

現在の推奨事項は、Service Fabric アプリケーションにマネージド ID を使用することで、可能な限りシークレットへの依存を減らすことです。 マネージド ID を使用すると、Azure Storage、Azure SQL などで直接認証できます。 つまり、Microsoft Entra 認証 をサポートする Azure サービス にアクセスするときに、別の資格情報を管理する必要はありません。

マネージド ID をクライアントとして使用できない場合は、KeyVaultReferences の使用をお勧めします。 マネージド ID を使用して Key Vault に直接移動するのではなく、KeyVaultReferences を使用する必要があります。 KeyVaultReferences は、ローリング アップグレード中にシークレットの変更が行われるため、アプリケーションの可用性を高めるのに役立ちます。 また、シークレットがキャッシュされ、クラスター内から提供されるため、スケーリングも向上します。 現在、アプリケーションで暗号化されたパラメーターを使用している場合、KeyVaultReferences を使用するためにアプリケーション コードで必要な変更は最小限に抑えられています。 アプリケーションは、1 つのシークレットを見つけ出し、そのシークレットがプロセスの有効期間中同じであることを引き続き予想できます。

前提条件

  • Service Fabric アプリケーションのマネージド ID

    Service Fabric の KeyVaultReference サポートでは、アプリケーションのマネージド ID を使用して、アプリケーションの代わりにシークレットがフェッチされます。 アプリケーションを ARM を介してデプロイし、マネージド ID を割り当てる必要があります。 こちらのドキュメントに従って、アプリケーションのマネージド ID を有効にします。

  • セントラル シークレット ストア (CSS)。

    セントラル シークレット ストア (CSS) は、Service Fabric の暗号化されたローカル シークレット キャッシュです。 この機能では、シークレットは Key Vault からフェッチされた後、CSS を使用して保護および永続化されます。 KeyVaultReferences を使用するには、このシステム サービスを有効にする必要があります。 こちらのドキュメントに従って、CSS を有効にして構成します。

  • アプリケーションのマネージド ID に Key Vault へのアクセス許可を付与する

    こちらのドキュメントを参照して、マネージド ID に Key Vault へのアクセス許可を付与する方法を確認します。 また、システム割り当てマネージド ID を使用している場合は、アプリケーションのデプロイ後にのみ、マネージド ID が作成されることに注意してください。 これにより、コンテナーへのアクセス権が ID に付与される前に、アプリケーションでシークレットへのアクセスが試行される競合状態が生じる場合があります。 システム割り当て ID の名前は {cluster name}/{application name}/{service name} です。

KeyVaultReferences と Managed KeyVaultReferences の比較

KeyVaultReferences の基本的な考え方は、アプリケーション パラメーターの値をシークレットとして設定するのではなく、Key Vault URL に設定し、これがアプリケーションのアクティブ化後にシークレット値に解決されるというものです。 Key Vault では、1 つのシークレット (たとえば https://my.vault.azure.net/secrets/MySecret/) に複数のバージョン (たとえば、https://my.vault.azure.net/secrets/MySecret/<oid1> および <oid2>) を含めることができます。 KeyVaultReference を使用する場合、値はバージョン付きの参照 (https://my.vault.azure.net/secrets/MySecret/<oid1>) になります。 コンテナーでそのシークレットをたとえば <oid2> にローテーションする場合、新しい参照へのアプリケーションのアップグレードをトリガーする必要があります。 ManagedKeyVaultReference を使用する場合、値はバージョンレスの参照 (https://my.vault.azure.net/secrets/MySecret/) になります。 Service Fabric は最新のインスタンス <oid1> を解決し、そのシークレットを使用してアプリケーションをアクティブ化します。 コンテナー内のシークレットを <oid2> にローテーションする場合、Service Fabric は自動的にアプリケーション パラメーターのアップグレードをトリガーして、ユーザーに代わって <oid2> に移行します。

Note

Service Fabric アプリケーションに対する KeyVaultReference (バージョン付きのシークレット) サポートは、Service Fabric バージョン 7.2 CU5 から一般提供されています。 この機能を使用する前に、このバージョンにアップグレードすることをお勧めします。

注意

Service Fabric アプリケーションに対する Managed KeyVaultReference (バージョンレスのシークレット) サポートは、Service Fabric バージョン 9.0 から一般提供されています。

アプリケーションで KeyVaultReferences を使用する

KeyVaultReferences は以下のように使用できます

環境変数として

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

コンテナーにファイルとしてマウントする

  • 1 つのセクションを settings.xml に追加する

    MySecret パラメーターを型 KeyVaultReference および値 <KeyVaultURL> として定義します

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
    </Section>
    
  • <ConfigPackagePolicies> で ApplicationManifest.xml 内の新しいセクションを参照します

    <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>
    
  • サービス コードからシークレットを使用します

    <Section Name=MySecrets> 下に一覧表示される各パラメーターは、EnvironmentVariable SecretPath によって参照されるフォルダー下のファイルです。 次の C# のコード スニペットでは、アプリケーションから MySecret を読み取る方法を示しています。

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

    Note

    MountPoint で、シークレット値が含まれたファイルがマウントされるフォルダーが制御されます。

コンテナー リポジトリのパスワードへの参照として

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

アプリケーションで Managed KeyVaultReferences を使用する

まず、クラスター定義をアップグレードしてシークレットの監視を有効にし、他の必要な CSS 構成に加えて EnableSecretMonitoring 設定を追加する必要があります。

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

Note

今後、既定値が true になる可能性があります

クラスターのアップグレードが完了したら、ユーザー アプリケーションをアップグレードできます。 KeyVaultReference は任意の場所で使用でき、ManagedKeyVaultReference も使用できます。たとえば、次のとおりです。

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

ManagedKeyVaultReferences を指定する際の主な違いは、アプリケーションの種類のマニフェストでハードコーディング "できない" ことです。 アプリケーション レベルのパラメーターとして宣言する必要があり、さらに ARM アプリケーション定義でオーバーライドする必要があります。

整形式マニフェストからの抜粋を次に示します

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

アプリケーション リソース定義の抜粋は次のとおりです。

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

ManagedKeyVaultReference をアプリケーション パラメーターとして宣言することと、デプロイ時にそのパラメーターをオーバーライドすることはどちらも、デプロイされたシークレットのライフサイクルを正常に管理するために Service Fabric に必要です。

次のステップ