Azure 배포 Service Fabric 애플리케이션에 대한 KeyVaultReference 지원

클라우드 애플리케이션을 빌드하는 경우 일반적인 문제는 비밀을 애플리케이션에 안전하게 배포하고 관리하는 방법을 파악하는 것입니다. Service Fabric KeyVaultReference 지원을 통해 쉽게 사용할 수 있습니다. 구성되면 애플리케이션 정의의 Key Vault에 저장된 비밀의 URL을 참조할 수 있으며 Service Fabric에서 해당 비밀을 가져오고 이를 사용하여 애플리케이션을 활성화하는 작업을 처리합니다. 기능의 "SF 관리" 버전을 사용하는 경우 Service Fabric에서 Key Vault를 모니터링하고 자격 증명 모음에서 비밀이 회전할 때 롤링 애플리케이션 매개 변수 업그레이드를 자동으로 트리거할 수도 있습니다.

비밀을 Service Fabric의 애플리케이션에 전달하는 옵션

비밀을 Service Fabric 애플리케이션에 전달하는 클래식 방법은 암호화된 매개 변수를 선언하는 것이었습니다. 여기에는 암호화 인증서에 대한 비밀을 암호화하고 해당 암호화된 비밀을 애플리케이션에 전달하는 작업이 포함되었습니다. 이 방법에는 몇 가지 단점이 있습니다. 암호화 인증서를 관리해야 하고, 배포 파이프라인에서 비밀이 공개되고, 배포된 애플리케이션에 연결된 비밀의 메타데이터에 대한 가시성이 부족합니다. 마찬가지로 비밀을 회전하려면 애플리케이션 배포가 필요합니다. 독립 실행형 클러스터를 실행하는 경우를 제외하고는 암호화된 매개 변수를 더 이상 사용하지 않는 것이 좋습니다.

또 다른 옵션은 비밀 저장소 참조를 사용하는 것입니다. 이 환경을 사용하면 애플리케이션 비밀을 중앙에서 관리하고, 배포된 비밀의 메타데이터에 대한 가시성을 높이며, 암호화 인증서를 중앙에서 관리할 수 있습니다. 일부에서는 독립 실행형 Service Fabric 클러스터를 실행할 때 이 스타일의 비밀 관리를 선호할 수 있습니다.

현재 권장 사항은 Service Fabric 애플리케이션에 관리 ID를 사용하여 가능한 한 비밀에 대한 의존도를 줄이는 것입니다. 관리 ID를 사용하여 Azure Storage, Azure SQL 등에 직접 인증할 수 있습니다. 즉, Microsoft Entra 인증을 지원하는 Azure 서비스에 액세스할 때 별도의 자격 증명을 관리할 필요가 없습니다.

관리 ID를 클라이언트로 사용할 수 없는 경우 KeyVaultReference를 사용하는 것이 좋습니다. 관리 ID를 사용하는 대신 KeyVaultReference를 사용하여 Key Vault로 직접 이동해야 합니다. KeyVaultReference는 롤링 업그레이드 중에 비밀 변경이 수행되도록 강제하므로 애플리케이션의 가용성을 높이는 데 도움이 됩니다. 또한 비밀이 캐시되어 클러스터 내에서 제공되므로 확장성이 향상됩니다. 현재 애플리케이션에서 암호화된 매개 변수를 사용하는 경우 KeyVaultReference를 사용하려면 애플리케이션 코드에서 최소한으로 변경하면 됩니다. 애플리케이션에서 단일 비밀을 계속 제안할 것으로 예상할 수 있으며, 해당 비밀은 프로세스의 수명 동안 동일하게 유지됩니다.

필수 조건

  • Service Fabric 애플리케이션에 대한 관리 ID

    Service Fabric KeyVaultReference 지원은 애플리케이션의 관리 ID를 사용하여 애플리케이션을 대신하여 비밀을 가져옵니다. ARM을 통해 애플리케이션을 배포하고 관리 ID를 할당해야 합니다. 이 문서에 따라 애플리케이션에 관리 ID를 사용하도록 설정합니다.

  • CSS(중앙 비밀 저장소).

    CSS(중앙 비밀 저장소)는 Service Fabric의 암호화된 로컬 비밀 캐시입니다. 이 기능은 CSS를 사용하여 Key Vault에서 가져온 비밀을 보호하고 유지합니다. KeyVaultReference를 사용하려면 이 시스템 서비스를 용하도록 설정해야 합니다. 이 문서에 따라 CSS를 사용하도록 설정하고 구성합니다.

  • Key Vault에 대한 애플리케이션의 관리 ID 액세스 권한 부여

    Key Vault에 대한 관리 ID 액세스 권한을 부여하는 방법을 알아보려면 이 문서를 참조하세요. 또한 시스템이 할당한 관리 ID를 사용하는 경우 관리 ID는 애플리케이션 배포 후에만 만들어집니다. 이로 인해 ID에 자격 증명 모음에 대한 액세스 권한을 부여하기 전에 애플리케이션이 비밀 액세스를 시도하는 경쟁 조건이 만들어질 수 있습니다. 시스템에서 할당한 ID의 이름은 {cluster name}/{application name}/{service name}입니다.

KeyVaultReference 및 ManagedKeyVaultReference

KeyVaultReference의 기본 아이디어는 애플리케이션 매개 변수의 값을 비밀로 설정하는 것이 아니라 Key Vault URL로 설정하는 것입니다. 그러면 애플리케이션을 활성화할 때 비밀 값으로 확인됩니다. Key Vault에서 단일 비밀(예: 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>로 이동합니다.

참고 항목

Service Fabric 애플리케이션에 대한 KeyVaultReference(버전이 지정된 비밀) 지원은 Service Fabric 버전 7.2 CU5부터 일반 공급됩니다. 이 기능을 사용하기 전에 이 버전으로 업그레이드하는 것이 좋습니다.

참고 항목

Service Fabric 애플리케이션에 대한 ManagedKeyVaultReference(버전 없는 비밀) 지원은 Service Fabric 버전 9.0부터 일반 공급됩니다.

애플리케이션에서 KeyVaultReferences 사용

KeyVaultReference는 다음과 같이 사용할 수 있습니다.

환경 변수로

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

컨테이너에 파일로 탑재

  • settings.xml에 섹션 추가

    형식 KeyVaultReference 및 값 <KeyVaultURL>MySecret 매개 변수 정의

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
    </Section>
    
  • ApplicationManifest.xml의 <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>
    
  • 서비스 코드에서 비밀 사용

    <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();
    }
    

    참고 항목

    MountPoint는 비밀 값을 포함하는 파일이 탑재될 폴더를 제어합니다.

컨테이너 리포지토리 암호에 대한 참조로

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

애플리케이션에서 ManagedKeyVaultReference 사용

먼저 클러스터 정의를 업그레이드하여 다른 필수 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>"
            }
        ]
    }
],

참고 항목

기본값은 나중에 true가 될 수 있습니다.

클러스터 업그레이드가 완료되면 사용자 애플리케이션을 업그레이드할 수 있습니다. ManagedKeyVaultReference도 KeyVaultReference를 사용할 수 있는 모든 위치에서 사용할 수 있습니다. 예를 들어 다음과 같습니다.

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

ManagedKeyVaultReference 지정의 주요 차이점은 애플리케이션 유형 매니페스트에서 하드 코딩할 수 없다는 것입니다. 애플리케이션 수준 매개 변수로 선언해야 하며, 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>"
            }
        ]
    }
}

Service Fabric에서 배포된 비밀의 수명 주기를 성공적으로 관리하려면 ManagedKeyVaultReference를 애플리케이션 매개 변수로 선언하고 배포 시 해당 매개 변수를 재정의해야 합니다.

다음 단계