Service Fabric 애플리케이션에서 암호화된 비밀 관리

이 가이드에서는 Service Fabric 애플리케이션에서 비밀을 관리하는 단계를 안내합니다. 스토리지 연결 문자열, 암호, 일반 텍스트로 처리하면 안 되는 값 등 모든 민감한 정보를 비밀로 처리할 수 있습니다.

Service Fabric 애플리케이션에서 암호화된 비밀을 사용하는 데에는 세 가지 단계가 포함됩니다.

  • 암호화 인증서 설정 및 비밀 암호화
  • 애플리케이션에서 암호화된 비밀 지정
  • 서비스 코드에서 암호화된 비밀 해독

암호화 인증서 설정 및 비밀 암호화

암호화 인증서를 설정하고 이를 사용하여 비밀을 암호화하는 것은 Windows와 Linux 간에 다릅니다.

애플리케이션에서 암호화된 비밀 지정

이전 단계에서 인증서를 사용하여 비밀을 암호화하고 애플리케이션에서 사용할 수 있도록 base-64로 인코딩된 문자열을 생성하는 방법을 설명했습니다. base-64로 인코딩된 이 문자열을 서비스의 Settings.xml에서 암호화된 매개 변수로, 또는 서비스의 ServiceManifest.xml에서 암호화된 환경 변수로 지정할 수 있습니다.

서비스의 Settings.xml 구성 파일에서 암호화된 매개 변수true로 설정된 IsEncrypted 특성을 통해 지정합니다.

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Section Name="MySettings">
    <Parameter Name="MySecret" IsEncrypted="true" Value="I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=" />
  </Section>
</Settings>

서비스의 ServiceManifest.xml 파일에서 암호화된 환경 변수Encrypted로 설정된 Type 특성을 통해 지정합니다.

<CodePackage Name="Code" Version="1.0.0">
  <EnvironmentVariables>
    <EnvironmentVariable Name="MyEnvVariable" Type="Encrypted" Value="I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=" />
  </EnvironmentVariables>
</CodePackage>

애플리케이션 매니페스트에서 인증서를 지정하여 Service Fabric 애플리케이션에도 암호를 포함해야 합니다. ApplicationManifest.xmlSecretsCertificate 요소를 추가하고 원하는 인증서의 지문을 포함합니다.

<ApplicationManifest … >
  ...
  <Certificates>
    <SecretsCertificate Name="MyCert" X509FindType="FindByThumbprint" X509FindValue="[YourCertThumbrint]"/>
  </Certificates>
</ApplicationManifest>

참고 항목

SecretsCertificate를 지정하는 애플리케이션을 활성화하면 Service Fabric에서 일치하는 인증서를 찾은 다음, 애플리케이션을 실행하는 ID에 인증서의 프라이빗 키에 대한 모든 권한을 부여합니다. 또한 Service Fabric은 인증서의 변경 내용을 모니터링하고 그에 따라 사용 권한을 다시 적용합니다. 일반 이름으로 선언된 인증서의 변경 내용을 검색하기 위해 Service Fabric은 일치하는 인증서를 모두 찾아서 캐시된 지문 목록과 비교하는 정기적인 작업을 실행합니다. 새 지문이 검색되면 해당 주체의 인증서가 갱신되었음을 의미합니다. 작업은 클러스터의 각 노드에서 분당 한 번 실행됩니다.

SecretsCertificate는 주체 기반 선언을 허용하지만 암호화된 설정이 클라이언트에서 설정을 암호화하는 데 사용된 키 쌍에 연결되어 있는지 확인합니다. 원본 암호화 인증서(또는 동등한 항목)가 주체 기반 선언과 일치하고 애플리케이션을 호스트할 수 있는 클러스터의 모든 노드에 해당 프라이빗 키와 함께 설치되어 있는지 확인해야 합니다. 주체 기반 선언과 일치하고 원본 암호화 인증서와 동일한 키 쌍을 기반으로 하는 시간이 유효한 모든 인증서가 동등한 항목으로 간주됩니다.

애플리케이션 비밀을 애플리케이션 인스턴스에 삽입

여러 환경에 배포할 때에는 배포를 최대한 자동화하는 것이 좋습니다. 빌드 환경에서 비밀 암호화를 수행하고 애플리케이션 인스턴스를 만들 때 암호화된 비밀을 매개 변수로 제공하면 배포를 자동화할 수 있습니다.

Settings.xml에 재정의 가능한 매개 변수 사용

Settings.xml 구성 파일은 애플리케이션 생성 시 제공할 수 있는 재정의 가능한 매개 변수를 허용합니다. 매개 변수 값을 입력하는 대신 MustOverride 특성을 사용합니다.

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Section Name="MySettings">
    <Parameter Name="MySecret" IsEncrypted="true" Value="" MustOverride="true" />
  </Section>
</Settings>

Settings.xml의 값을 재정의하려면 ApplicationManifest.xml에서 서비스의 재정의 매개 변수를 선언합니다.

<ApplicationManifest ... >
  <Parameters>
    <Parameter Name="MySecret" DefaultValue="" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Stateful1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides>
      <ConfigOverride Name="Config">
        <Settings>
          <Section Name="MySettings">
            <Parameter Name="MySecret" Value="[MySecret]" IsEncrypted="true" />
          </Section>
        </Settings>
      </ConfigOverride>
    </ConfigOverrides>
  </ServiceManifestImport>

이제 애플리케이션의 인스턴스를 만들 때 이 값을 애플리케이션 매개 변수 로 지정할 수 있습니다. 애플리케이션 인스턴스 만들기를 PowerShell로 스크립팅하거나 C#으로 작성하면 빌드 프로세스에 쉽게 통합할 수 있습니다.

PowerShell을 사용하면 매개 변수가 New-ServiceFabricApplication 명령에 해시 테이블로 제공됩니다.

New-ServiceFabricApplication -ApplicationName fabric:/MyApp -ApplicationTypeName MyAppType -ApplicationTypeVersion 1.0.0 -ApplicationParameter @{"MySecret" = "I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM="}

C#을 사용하면 애플리케이션 매개 변수가 ApplicationDescriptionNameValueCollection로 지정됩니다.

FabricClient fabricClient = new FabricClient();

NameValueCollection applicationParameters = new NameValueCollection();
applicationParameters["MySecret"] = "I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=";

ApplicationDescription applicationDescription = new ApplicationDescription(
    applicationName: new Uri("fabric:/MyApp"),
    applicationTypeName: "MyAppType",
    applicationTypeVersion: "1.0.0",
    applicationParameters: applicationParameters)
);

await fabricClient.ApplicationManager.CreateApplicationAsync(applicationDescription);

서비스 코드에서 암호화된 비밀 해독

매개 변수환경 변수에 액세스하기 위한 API로 암호화된 값을 손쉽게 해독할 수 있습니다. 암호화된 문자열에는 암호화에 사용된 인증서 정보가 포함되어 있으므로 수동으로 인증서를 지정할 필요가 없습니다. 서비스가 실행되고 있는 노드에 인증서를 설치하기만 하면 됩니다.

// Access decrypted parameters from Settings.xml
ConfigurationPackage configPackage = FabricRuntime.GetActivationContext().GetConfigurationPackageObject("Config");
bool MySecretIsEncrypted = configPackage.Settings.Sections["MySettings"].Parameters["MySecret"].IsEncrypted;
if (MySecretIsEncrypted)
{
    SecureString MySecretDecryptedValue = configPackage.Settings.Sections["MySettings"].Parameters["MySecret"].DecryptValue();
}

// Access decrypted environment variables from ServiceManifest.xml
// Note: you do not have to call any explicit API to decrypt the environment variable.
string MyEnvVariable = Environment.GetEnvironmentVariable("MyEnvVariable");

다음 단계