Azure Service Fabric 보안

Azure 보안 모범 사례에 대한 자세한 내용은 Azure Service Fabric 보안 모범 사례를 참조하세요.

Key Vault

Azure Key Vault는 Azure Service Fabric 애플리케이션 및 클러스터에 추천되는 비밀 관리 서비스입니다.

참고 항목

Virtual Machine Scale Set에 Key Vault의 인증서/비밀을 Virtual Machine Scale Set 비밀로 배포하는 경우 Key Vault와 Virtual Machine Scale Set를 함께 배치해야 합니다.

인증 기관에서 발급한 Service Fabric 인증서 만들기

Azure Key Vault 인증서는 만들거나 Key Vault로 가져올 수 있습니다. Key Vault 인증서가 만들어지면 프라이빗 키가 Key Vault 내에 만들어지며 인증서 소유자에게 공개되지 않습니다. Key Vault에 인증서를 만드는 방법은 다음과 같습니다.

  • 자체 서명된 인증서를 만들어퍼블릭-프라이빗 키 쌍을 만들고 이를 인증서와 연결합니다. 인증서는 자체 키에 의해 서명됩니다.
  • 새 인증서를 수동으로 만들어퍼블릭-프라이빗 키 쌍을 만들고 X.509 인증서 서명 요청을 생성합니다. 등록 기관 또는 인증 기관에서 서명 요청에 서명할 수 있습니다. 서명된 x509 인증서를 보류 중인 키 쌍과 병합하여 Key Vault에서 KV 인증서를 완료할 수 있습니다. 이 방법은 더 많은 단계를 필요로 하지만 프라이빗 키가 Key Vault에서 만들어지고 또 Key Vault로 제한되기 때문에 보안이 더욱 강화됩니다. 이 방법을 아래 다이어그램에서 설명합니다.

자세한 내용은 Azure Key Vault 인증서를 만드는 방법을 검토하세요.

Service Fabric 클러스터 가상 머신 확장 집합에 Key Vault 인증서 배포

인증서를 함께 배치된 키 자격 증명 모음에서 Virtual Machine Scale Set로 배포하려면 osProfile Virtual Machine Scale Set를 사용합니다. Resource Manager 템플릿 속성은 다음과 같습니다.

"secrets": [
   {
       "sourceVault": {
           "id": "[parameters('sourceVaultValue')]"
       },
       "vaultCertificates": [
          {
              "certificateStore": "[parameters('certificateStoreValue')]",
              "certificateUrl": "[parameters('certificateUrlValue')]"
          }
       ]
   }
]

참고 항목

Resource Manager 템플릿을 배포하려면 자격 증명 모음을 사용하도록 설정해야 합니다.

Service Fabric 클러스터의 인증서에 ACL(액세스 제어 목록) 적용

Virtual Machine Scale Set 확장 게시자인 Microsoft.Azure.ServiceFabric은 노드 보안을 구성하는 데 사용됩니다. Service Fabric 클러스터 프로세스에 대한 인증서에 ACL을 적용하려면 다음 Resource Manager 템플릿 속성을 사용합니다.

"certificate": {
   "commonNames": [
       "[parameters('certificateCommonName')]"
   ],
   "x509StoreName": "[parameters('certificateStoreValue')]"
}

일반 이름으로 Service Fabric 클러스터 인증서 보호

인증서 Common Name으로 Service Fabric 클러스터를 보호하려면 다음과 같이 certificateCommonNames Resource Manager 템플릿 속성을 사용합니다.

"certificateCommonNames": {
    "commonNames": [
        {
            "certificateCommonName": "[parameters('certificateCommonName')]",
            "certificateIssuerThumbprint": "[parameters('certificateIssuerThumbprint')]"
        }
    ],
    "x509StoreName": "[parameters('certificateStoreValue')]"
}

참고 항목

Service Fabric 클러스터는 호스트의 인증서 저장소에서 찾은 첫 번째 유효한 인증서를 사용합니다. Windows에서는 일반 이름 및 발급자 지문과 일치하는 최신 만료 날짜가 있는 인증서입니다.

*<YOUR SUBDOMAIN>.cloudapp.azure.com 또는 <YOUR SUBDOMAIN>.trafficmanager.net과 같은 Azure 도메인은 Microsoft에서 소유하고 있습니다. 인증 기관은 인증되지 않은 사용자에게 도메인에 대한 인증서를 발급하지 않습니다. 대부분의 사용자는 인증 기관에서 해당 일반 이름의 인증서를 발급할 수 있도록 등록 기관으로부터 도메인을 구입하거나 권한이 있는 도메인 관리자여야 합니다.

도메인을 Microsoft IP 주소로 확인하도록 DNS 서비스를 구성하는 방법에 대한 자세한 내용은 도메인을 호스팅하도록 Azure DNS를 구성하는 방법을 검토하세요.

참고 항목

도메인 이름 서버를 Azure DNS 영역 이름 서버에 위임한 후 다음 두 레코드를 DNS 영역에 추가하세요.

  • 사용자 지정 도메인에서 확인할 모든 IP 주소에 대한 Alias record set가 아닌 APEX 도메인에 대한 'A' 레코드입니다.
  • Alias record set가 아닌 프로비전한 Microsoft 하위 도메인에 대한 'C' 레코드입니다. 예를 들어 Traffic Manager 또는 Load Balancer의 DNS 이름을 사용할 수 있습니다.

Service Fabric 클러스터에 대한 사용자 지정 DNS 이름("managementEndpoint")을 표시하도록 포털을 업데이트하려면 다음 Service Fabric 클러스터 Resource Manager 템플릿 속성을 업데이트합니다.

 "managementEndpoint": "[concat('https://<YOUR CUSTOM DOMAIN>:',parameters('nt0fabricHttpGatewayPort'))]",

Service Fabric 패키지의 비밀 값 암호화

Service Fabric 패키지에서 암호화되는 공통 값에는 ACR(Azure Container Registry) 자격 증명, 환경 변수, 설정 및 Azure 볼륨 플러그 인 스토리지 계정 키가 포함됩니다.

Windows 클러스터에서 암호화 인증서를 설정하고 비밀을 암호화하려면 다음을 수행합니다.

비밀을 암호화하기 위한 자체 서명된 인증서를 생성합니다.

New-SelfSignedCertificate -Type DocumentEncryptionCert -KeyUsage DataEncipherment -Subject mydataenciphermentcert -Provider 'Microsoft Enhanced Cryptographic Provider v1.0'

Service Fabric 클러스터 가상 머신 확장 집합에 Key Vault 인증서 배포의 지침에 따라 Key Vault 인증서를 Service Fabric 클러스터의 Virtual Machine Scale Sets에 배포합니다.

다음 PowerShell 명령을 사용하여 비밀을 암호화한 다음, Service Fabric 애플리케이션 매니페스트를 암호화된 값으로 업데이트합니다.

Invoke-ServiceFabricEncryptText -CertStore -CertThumbprint "<thumbprint>" -Text "mysecret" -StoreLocation CurrentUser -StoreName My

Linux 클러스터에서 암호화 인증서를 설정하고 비밀을 암호화하려면 다음을 수행합니다.

비밀을 암호화하기 위한 자체 서명된 인증서를 생성합니다.

openssl req -newkey rsa:2048 -nodes -keyout TestCert.prv -x509 -days 365 -out TestCert.pem
cat TestCert.prv >> TestCert.pem

Service Fabric 클러스터 가상 머신 확장 집합에 Key Vault 인증서 배포의 지침을 Service Fabric 클러스터의 Virtual Machine Scale Sets에 사용합니다.

다음 명령을 사용하여 비밀을 암호화한 다음, Service Fabric 애플리케이션 매니페스트를 암호화된 값으로 업데이트합니다.

echo "Hello World!" > plaintext.txt
iconv -f ASCII -t UTF-16LE plaintext.txt -o plaintext_UTF-16.txt
openssl smime -encrypt -in plaintext_UTF-16.txt -binary -outform der TestCert.pem | base64 > encrypted.txt

보호되는 값이 암호화되면 Service Fabric 애플리케이션에서 암호화된 비밀을 지정하고 서비스 코드에서 암호화된 비밀을 해독합니다.

Service Fabric 애플리케이션에 엔드포인트 인증서 포함

애플리케이션 엔드포인트 인증서를 구성하려면 애플리케이션 매니페스트에 주 계정의 User 요소와 함께 EndpointCertificate 요소를 추가하여 인증서를 포함합니다. 기본적으로 주 계정은 NetworkService입니다. 이렇게 하면 제공된 보안 주체에 대한 애플리케이션 인증서 프라이빗 키 ACL 관리가 제공됩니다.

<ApplicationManifest … >
  ...
  <Principals>
    <Users>
      <User Name="Service1" AccountType="NetworkService" />
    </Users>
  </Principals>
  <Certificates>
    <EndpointCertificate Name="MyCert" X509FindType="FindByThumbprint" X509FindValue="[YourCertThumbprint]"/>
  </Certificates>
</ApplicationManifest>

Service Fabric 애플리케이션에 비밀 인증서 포함

비밀에 대한 액세스 권한을 애플리케이션에 부여하려면 애플리케이션 매니페스트에 SecretsCertificate 요소를 추가하여 인증서를 포함합니다.

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

MSI(관리 서비스 ID)를 사용하여 Azure 리소스에 Service Fabric 애플리케이션 인증

Azure 리소스에 대한 관리 ID에 대한 자세한 내용은 Azure 리소스에 대한 관리 ID란?을 참조하세요. Azure Service Fabric 클러스터는 관리 서비스 ID를 지원하는 Virtual Machine Scale Sets에서 호스팅됩니다. MSI를 인증하는 데 사용할 수 있는 서비스 목록을 가져오려면 Microsoft Entra 인증을 지원하는 Azure 서비스를 참조하세요.

가상 머신 확장 집합 또는 기존 가상 머신 확장 집합을 만드는 동안 시스템 할당 관리 ID를 사용하도록 설정하려면 다음 "Microsoft.Compute/virtualMachinesScaleSets" 속성을 선언합니다.

"identity": { 
    "type": "SystemAssigned"
}

자세한 내용은 Azure 리소스에 대한 관리 ID란?을 참조하세요.

사용자 할당 관리 ID를 만든 경우 템플릿에서 다음 리소스를 선언하여 가상 머신 확장 집합에 할당합니다. \<USERASSIGNEDIDENTITYNAME\>을 직접 만든 사용자 할당 관리 ID의 이름으로 바꿉니다.

"identity": {
    "type": "userAssigned",
    "userAssignedIdentities": {
        "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('<USERASSIGNEDIDENTITYNAME>'))]": {}
    }
}

Service Fabric 애플리케이션에서 관리 ID를 사용하려면 먼저 인증하는 데 필요한 Azure 리소스에 권한을 부여해야 합니다. 다음 명령은 Azure 리소스에 대한 액세스 권한을 부여합니다.

PRINCIPAL_ID=$(az resource show --id /subscriptions/<YOUR SUBSCRIPTON>/resourceGroups/<YOUR RG>/providers/Microsoft.Compute/virtualMachineScaleSets/<YOUR SCALE SET> --api-version 2018-06-01 | python -c "import sys, json; print(json.load(sys.stdin)['identity']['principalId'])")

az role assignment create --assignee $PRINCIPAL_ID --role 'Contributor' --scope "/subscriptions/<YOUR SUBSCRIPTION>/resourceGroups/<YOUR RG>/providers/<PROVIDER NAME>/<RESOURCE TYPE>/<RESOURCE NAME>"

Service Fabric 애플리케이션 코드에서 REST를 모두 다음과 유사하게 설정하여 Azure Resource Manager의 액세스 토큰을 가져옵니다.

ACCESS_TOKEN=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -H Metadata:true | python -c "import sys, json; print json.load(sys.stdin)['access_token']")

그러면 Service Fabric 앱에서 액세스 토큰을 사용하여 Active Directory를 지원하는 Azure 리소스를 인증할 수 있습니다. 다음 예제에서는 Azure Cosmos DB 리소스에 대해 이 작업을 수행하는 방법을 보여 줍니다.

COSMOS_DB_PASSWORD=$(curl 'https://management.azure.com/subscriptions/<YOUR SUBSCRIPTION>/resourceGroups/<YOUR RG>/providers/Microsoft.DocumentDB/databaseAccounts/<YOUR ACCOUNT>/listKeys?api-version=2016-03-31' -X POST -d "" -H "Authorization: Bearer $ACCESS_TOKEN" | python -c "import sys, json; print(json.load(sys.stdin)['primaryMasterKey'])")

Windows 보안 기준

기준을 직접 만드는 것이 아니라 Microsoft 보안 기준과 같이 널리 알려져 있고 잘 테스트된 업계 표준 구성을 구현하는 것이 좋습니다. Virtual Machine Scale Sets에서 이를 프로비저닝하는 옵션은 Azure DSC(Desired State Configuration) 확장 처리기를 사용하여 VM이 온라인으로 전환되어 프로덕션 소프트웨어를 실행하도록 구성하는 것입니다.

Azure Firewall

Azure Firewall은 Azure Virtual Network 리소스를 보호하는 관리되는 클라우드 기반 네트워크 보안 서비스입니다. 고가용성 및 무제한 클라우드 확장성이 내장되어 있는 서비스 형태의 완전한 상태 저장 방화벽입니다.; 이를 통해 아웃바운드 HTTP/S 트래픽을 와일드 카드를 포함한 지정된 FQDN(정규화된 도메인 이름) 목록으로 제한할 수 있습니다. 이 기능에는 TLS/SSL 종료가 필요하지 않습니다. Windows 업데이트에 Azure Firewall FQDN 태그를 이용하고 Microsoft Windows 업데이트 엔드포인트에 대한 네트워크 트래픽이 방화벽을 통해 이동할 수 있도록 하는 것이 좋습니다. 템플릿을 사용하여 Azure Firewall 배포에서는 Microsoft.Network/azureFirewalls 리소스 템플릿 정의의 샘플을 제공합니다. Service Fabric 애플리케이션에 공통적인 방화벽 규칙은 클러스터 가상 네트워크에 대해 다음을 허용하는 것입니다.

  • *download.microsoft.com
  • *servicefabric.azure.com
  • *.core.windows.net

이 방화벽 규칙은 가상 네트워크에서 허용되는 대상으로 ServiceFabric 및 Storage를 포함하는 허용된 아웃바운드 네트워크 보안 그룹을 보완합니다.

TLS 1.2

Microsoft Azure 권장 사항에 따라 모든 고객이 TLS(전송 계층 보안) 1.2를 지원하는 솔루션으로 완전히 마이그레이션하고 TLS 1.2가 기본적으로 사용되는지 확인하는 것이 좋습니다.

Service Fabric을 포함한 Azure 서비스는 TLS 1.0/1.1 프로토콜에 대한 종속성을 제거하는 엔지니어링 작업을 완료했으며, TLS 1.2 연결만 수락하고 시작하도록 워크로드를 구성하려는 고객에게 완전한 지원을 제공합니다.

고객은 기본적으로 TLS 1.2를 사용하도록 Azure 서비스와 상호 작용하는 Azure에서 호스트되는 워크로드와 온-프레미스 애플리케이션을 구성해야 합니다. 특정 TLS 버전을 사용하도록 Service Fabric 클러스터 노드와 애플리케이션을 구성하는 방법은 다음과 같습니다.

Windows Defender

기본적으로 Windows Defender 바이러스 백신은 Windows Server 2016에 설치됩니다. 자세한 내용은 Windows Server 2016의 Windows Defender 바이러스 백신을 참조하세요. 사용자 인터페이스가 기본적으로 일부 SKU에 설치되지만 필요하지는 않습니다. Windows Defender에서 발생하는 성능 영향 및 리소스 사용 오버헤드를 줄이고 보안 정책에서 오픈 소스 소프트웨어에 대한 프로세스와 경로를 제외할 수 있도록 하려면, 다음 Virtual Machine Scale Set 확장 Resource Manager 템플릿 속성을 선언하여 검사에서 Service Fabric 클러스터를 제외시킵니다.

 {
    "name": "[concat('VMIaaSAntimalware','_vmNodeType0Name')]",
    "properties": {
        "publisher": "Microsoft.Azure.Security",
        "type": "IaaSAntimalware",
        "typeHandlerVersion": "1.5",
        "settings": {
            "AntimalwareEnabled": "true",
            "Exclusions": {
                "Paths": "[concat(parameters('svcFabData'), ';', parameters('svcFabLogs'), ';', parameters('svcFabRuntime'))]",
                "Processes": "Fabric.exe;FabricHost.exe;FabricInstallerService.exe;FabricSetup.exe;FabricDeployer.exe;ImageBuilder.exe;FabricGateway.exe;FabricDCA.exe;FabricFAS.exe;FabricUOS.exe;FabricRM.exe;FileStoreService.exe;FabricBRS.exe;BackupCopier.exe"
            },
            "RealtimeProtectionEnabled": "true",
            "ScheduledScanSettings": {
                "isEnabled": "true",
                "scanType": "Quick",
                "day": "7",
                "time": "120"
            }
        },
        "protectedSettings": null
    }
}

참고 항목

Windows Defender를 사용하지 않는 경우 구성 규칙에 대한 맬웨어 방지 설명서를 참조하세요. Linux에서는 Windows Defender가 지원되지 않습니다.

Service Fabric 클러스터에서 신뢰할 수 없는 애플리케이션 호스팅

Service Fabric 클러스터는 의도된 단일 테넌트이며 호스팅된 애플리케이션은 신뢰할 수 있는 것으로 간주됩니다. 따라서 애플리케이션에는 다음과 같은 다양한 형식으로 나타나는 Service Fabric 런타임에 대한 액세스 권한이 부여됩니다. 애플리케이션 및 Fabric 파일에 해당하는 호스트의 파일 경로를 가리키는 환경 변수, 컨테이너 워크로드에 대한 쓰기 권한으로 탑재된 호스트 경로, 애플리케이션별 요청을 수락하는 프로세스 간 통신 엔드포인트 및 클라이언트 인증서 Fabric은 애플리케이션이 자체 인증에 사용할 것으로 예상합니다.

신뢰할 수 없는 애플리케이션 호스팅을 고려 중인 경우 Service Fabric 클러스터에 대한 적대적인 다중 테넌트 환경을 정의하고 소유하기 위한 추가 단계를 수행해야 합니다. 이를 위해서는 시나리오의 컨텍스트에서 다음을 포함하되 이에 국한되지 않는 여러 측면을 고려해야 합니다.

  • 신뢰할 수 없는 애플리케이션과 다른 애플리케이션, 클러스터 자체 및 기본 컴퓨팅 인프라와의 상호 작용에 대해 철저한 보안 검토.
  • 적용 가능한 가장 강력한 샌드박싱 기술 사용(예: 컨테이너 워크로드에 적절한 격리 모드)
  • 다음 신뢰 및 보안 경계는 클러스터 자체이므로 샌드박싱 기술을 벗어나는 신뢰할 수 없는 애플리케이션의 위험 평가.
  • 신뢰할 수 없는 애플리케이션의 Service Fabric 런타임에 대한 액세스 제거.

RemoveServiceFabricRuntimeAccess

애플리케이션 매니페스트의 정책 섹션에서 다음 선언을 사용하여 Service Fabric 런타임에 대한 액세스를 제거할 수 있습니다.

<ServiceManifestImport>
    <Policies>
        <ServiceFabricRuntimeAccessPolicy RemoveServiceFabricRuntimeAccess="true"/>
    </Policies>
</ServiceManifestImport>

다음 단계