이 문서에서는 보호된 패브릭에서 HGS(호스트 보호 서비스) 서버를 배포하거나 운영할 때 발생하는 일반적인 문제에 대한 해결 방법을 설명합니다.
적용 대상: Windows Server 2022, Windows Server 2019, Windows Server 2016
문제의 특성을 잘 모르는 경우 먼저 HGS 서버 및 Hyper-V 호스트에서 보호된 패브릭 진단을 실행하여 잠재적인 원인을 좁히세요.
인증서
HGS를 작동하려면 관리자가 구성한 암호화 및 서명 인증서와 HGS 자체에서 관리하는 증명 인증서를 비롯한 여러 인증서가 필요합니다. 이러한 인증서가 잘못 구성된 경우 HGS는 보호된 VM에 대한 키 보호기를 증명하거나 잠금을 해제하려는 Hyper-V 호스트의 요청을 처리할 수 없습니다. 다음 섹션에서는 HGS에 구성된 인증서와 관련된 일반적인 문제에 대해 설명합니다.
인증서 사용 권한
HGS는 인증서 지문을 통해 HGS에 추가된 암호화 및 서명 인증서의 퍼블릭 키와 프라이빗 키 모두에 액세스할 수 있어야 합니다. 특히 HGS 서비스를 실행하는 gMSA(그룹 관리 서비스 계정)는 키에 액세스해야 합니다. HGS에서 사용하는 gMSA를 찾으려면 HGS 서버의 관리자 권한 PowerShell 프롬프트에서 다음 명령을 실행합니다.
(Get-IISAppPool -Name KeyProtection).ProcessModel.UserName
프라이빗 키를 사용하기 위해 gMSA 계정에 액세스 권한을 부여하는 방법은 키가 저장된 위치(로컬 인증서 파일로 컴퓨터, HSM(하드웨어 보안 모듈) 또는 사용자 지정 타사 키 스토리지 공급자 사용 여부에 따라 달라집니다.
소프트웨어 지원 프라이빗 키에 대한 액세스 권한 부여
하드웨어 보안 모듈 또는 사용자 지정 키 스토리지 공급자에 저장되지 않은 인증 기관에서 발급한 자체 서명된 인증서 또는 인증서를 사용하는 경우 다음 단계를 수행하여 프라이빗 키 권한을 변경할 수 있습니다.
- 로컬 인증서 관리자(certlm.msc)를 엽니다.
- 개인>인증서를 확장하고 업데이트하려는 서명 또는 암호화 인증서를 찾습니다.
- 인증서를 마우스 오른쪽 단추로 클릭하고 모든 작업>프라이빗 키 관리를 선택합니다.
- 추가를 선택하여 인증서의 프라이빗 키에 대한 새 사용자 액세스 권한을 부여합니다.
- 개체 선택기에서 앞에서 찾은 HGS의 gMSA 계정 이름을 입력한 다음 확인을 선택합니다.
- gMSA에 인증서에 대한 읽기 권한이 있는지 확인합니다.
- [확인]을 선택하여 사용 권한 창을 닫습니다.
Server Core에서 HGS를 실행하거나 서버를 원격으로 관리하는 경우 로컬 인증서 관리자를 사용하여 프라이빗 키를 관리할 수 없습니다. 대신 PowerShell에서 사용 권한을 관리할 수 있는 보호된 패브릭 도구 PowerShell 모듈을 다운로드해야 합니다.
- Server Core 컴퓨터에서 관리자 권한 PowerShell 콘솔을 열거나 HGS에 대한 로컬 관리자 권한이 있는 계정으로 PowerShell 원격을 사용합니다.
- 다음 명령을 실행하여 보호된 패브릭 도구 PowerShell 모듈을 설치하고 gMSA 계정에 프라이빗 키에 대한 액세스 권한을 부여합니다.
$certificateThumbprint = '<ENTER CERTIFICATE THUMBPRINT HERE>'
# Install the Guarded Fabric Tools module, if necessary
Install-Module -Name GuardedFabricTools -Repository PSGallery
# Import the module into the current session
Import-Module -Name GuardedFabricTools
# Get the certificate object
$cert = Get-Item "Cert:\LocalMachine\My\$certificateThumbprint"
# Get the gMSA account name
$gMSA = (Get-IISAppPool -Name KeyProtection).ProcessModel.UserName
# Grant the gMSA read access to the certificate
$cert.Acl = $cert.Acl | Add-AccessRule $gMSA Read Allow
HSM 또는 사용자 지정 공급자 지원 프라이빗 키에 대한 액세스 권한 부여
인증서의 프라이빗 키가 HSM(하드웨어 보안 모듈) 또는 사용자 지정 KSP(키 스토리지 공급자)에 의해 지원되는 경우 사용 권한 모델은 특정 소프트웨어 공급업체에 따라 달라집니다. 최상의 결과를 보려면 공급업체의 설명서 또는 지원 사이트에서 특정 디바이스/소프트웨어에 대한 프라이빗 키 권한을 처리하는 방법에 대한 정보를 참조하세요. 모든 경우에 HGS에서 사용하는 gMSA에는 서명 및 암호화 작업을 수행할 수 있도록 암호화, 서명 및 통신 인증서 프라이빗 키에 대한 읽기 권한이 필요합니다.
일부 하드웨어 보안 모듈은 특정 사용자 계정에 프라이빗 키에 대한 액세스 권한을 부여하는 것을 지원하지 않습니다. 오히려 컴퓨터 계정에서 특정 키 집합의 모든 키에 액세스할 수 있도록 허용합니다. 이러한 디바이스의 경우 일반적으로 컴퓨터에 키에 대한 액세스 권한을 부여하는 것으로 충분하며 HGS는 해당 연결을 활용할 수 있습니다.
HSM에 대한 팁
다음은 Microsoft 및 해당 파트너의 환경을 기반으로 HGS에서 HSM 지원 키를 성공적으로 사용하는 데 도움이 되는 권장 구성 옵션입니다. 이러한 팁은 사용자의 편의를 위해 제공되며, 읽는 시점에 정확하다고 보장되지 않으며 HSM 제조업체의 보증도 받지 않습니다. 추가 질문이 있는 경우 특정 디바이스와 관련된 정확한 정보는 HSM 제조업체에 문의하세요.
HSM 브랜드/시리즈 | 제안 해결 방법 |
---|---|
Gemalto SafeNet | 인증서 요청 파일의 키 사용 속성이 0xa0 설정되어 서명 및 암호화에 인증서를 사용할 수 있는지 확인합니다. 또한 로컬 인증서 관리자 도구를 사용하여 gMSA 계정에 프라이빗 키에 대한 읽기 권한을 부여해야 합니다(위의 단계 참조). |
nCipher nShield | 각 HGS 노드가 서명 및 암호화 키를 포함하는 보안 세계에 액세스할 수 있는지 확인합니다. 로컬 인증서 관리자를 사용하여 gMSA에 프라이빗 키에 대한 읽기 권한을 추가로 부여해야 할 수도 있습니다(위의 단계 참조). |
Utimaco CryptoServers | 인증서 요청 파일의 키 사용 속성이 0x13 설정되어 인증서를 암호화, 암호 해독 및 서명에 사용할 수 있는지 확인합니다. |
인증서 요청
인증 기관을 사용하여 PKI(공개 키 인프라) 환경에서 인증서를 발급하는 경우 인증서 요청에 HGS의 해당 키 사용에 대한 최소 요구 사항이 포함되어 있는지 확인해야 합니다.
서명 인증서
CSR 속성 | 필수 값 |
---|---|
알고리즘 | RSA |
Key size | 2048비트 이상 |
키 사용 | 서명/서명/DigitalSignature |
암호화 인증서
CSR 속성 | 필수 값 |
---|---|
알고리즘 | RSA |
Key size | 2048비트 이상 |
키 사용 | 암호화/암호화/DataEncipherment |
Active Directory 인증서 서비스 템플릿
ADCS(Active Directory Certificate Services) 인증서 템플릿을 사용하여 인증서를 만드는 경우 다음 설정이 있는 템플릿을 사용하는 것이 좋습니다.
ADCS 템플릿 속성 | 필수 값 |
---|---|
공급자 범주 | 키 스토리지 공급자 |
알고리즘 이름 | RSA |
최소 키 크기 | 2048 |
목적 | 서명 및 암호화 |
키 사용 확장 | 디지털 서명, 키 암호화, 데이터 암호화("사용자 데이터 암호화 허용") |
시간 드리프트
서버의 시간이 보호된 패브릭의 다른 HGS 노드 또는 Hyper-V 호스트에서 크게 드리프트된 경우 증명 서명자 인증서 유효성과 관련된 문제가 발생할 수 있습니다. 증명 서명자 인증서는 HGS에서 백그라운드에서 만들어지고 갱신되며 증명 서비스에서 보호된 호스트에 발급된 상태 인증서에 서명하는 데 사용됩니다.
증명 서명자 인증서를 새로 고치려면 관리자 권한 PowerShell 프롬프트에서 다음 명령을 실행합니다.
Start-ScheduledTask -TaskPath \Microsoft\Windows\HGSServer -TaskName
AttestationSignerCertRenewalTask
또는 작업 스케줄러(taskschd.msc)를 열고, 작업 스케줄러 라이브러리>Microsoft>Windows>HGSServer로 이동하고, AttestationSignerCertRenewalTask라는 작업을 실행하여 예약된 작업을 수동으로 실행할 수 있습니다.
증명 모드 전환
Set-HgsServer cmdlet을 사용하여 HGS를 TPM 모드에서 Active Directory 모드로 전환하거나 그 반대로 전환하는 경우 HGS 클러스터의 모든 노드에서 새 증명 모드 적용을 시작하는 데 최대 10분이 걸릴 수 있습니다.
이는 정상적인 동작입니다.
모든 호스트가 새 증명 모드를 사용하여 성공적으로 증명하고 있는지 확인할 때까지 이전 증명 모드에서 호스트를 허용하는 정책을 제거하지 않는 것이 좋습니다.
TPM에서 AD 모드로 전환할 때 알려진 문제
TPM 모드에서 HGS 클러스터를 초기화하고 나중에 Active Directory 모드로 전환하는 경우 HGS 클러스터의 다른 노드가 새 증명 모드로 전환되지 않도록 하는 알려진 문제가 있습니다.
모든 HGS 서버가 올바른 증명 모드를 적용하도록 하려면 HGS 클러스터의 각 노드에서 실행 Set-HgsServer -TrustActiveDirectory
합니다.
TPM 모드에서 AD 모드로 전환하고 클러스터가 원래 AD 모드로 설정된 경우에는 이 문제가 적용되지 않습니다.
Get-HgsServer를 실행하여 HGS 서버의 증명 모드를 확인할 수 있습니다.
메모리 덤프 암호화 정책
메모리 덤프 암호화 정책을 구성하려고 하는데 기본 HGS 덤프 정책(Hgs_NoDumps, Hgs_DumpEncryption 및 Hgs_DumpEncryptionKey) 또는 덤프 정책 cmdlet(Add-HgsAttestationDumpPolicy
)이 표시되지 않는 경우 최신 누적 업데이트가 설치되지 않았을 수 있습니다.
이 문제를 해결하려면 HGS 서버를 최신 누적 Windows 업데이트로 업데이트하고 새 증명 정책을 활성화합니다.
새 덤프 암호화 기능이 설치되지 않은 호스트는 HGS 정책이 활성화되면 증명에 실패할 수 있으므로 새 증명 정책을 활성화하기 전에 Hyper-V 호스트를 동일한 누적 업데이트로 업데이트해야 합니다.
인증 키 인증서 오류 메시지
Add-HgsAttestationTpmHost cmdlet을 사용하여 호스트를 등록하면 제공된 플랫폼 식별자 파일인 EKcert(인증 키 인증서) 및 공개 인증 키(EKpub)의 두 TPM 식별자가 추출됩니다. EKcert는 TPM 제조업체를 식별하여 TPM이 일반 공급망을 통해 인증되고 제조된다는 보증을 제공합니다. EKpub는 특정 TPM을 고유하게 식별하며 HGS가 보호된 VM을 실행하기 위해 호스트 액세스 권한을 부여하는 데 사용하는 조치 중 하나입니다.
다음 두 조건 중 하나에 해당하는 경우 TPM 호스트를 등록하면 오류가 발생합니다.
- 플랫폼 식별자 파일에는 인증 키 인증서가 포함되어 있지 않습니다.
- 플랫폼 식별자 파일에는 인증 키 인증서가 포함되어 있지만 해당 인증서는 시스템에서 신뢰할 수 없습니다.
특정 TPM 제조업체는 TPM에 EKcert를 포함하지 않습니다.
TPM의 경우라고 의심되는 경우 OEM에 TPM에 EKcert가 없어야 하는지 확인하고 플래그를 사용하여 -Force
호스트를 HGS에 수동으로 등록합니다.
TPM에 EKcert가 있어야 하지만 플랫폼 식별자 파일에서 EKcert를 찾을 수 없는 경우 호스트에서 Get-PlatformIdentifier를 실행할 때 관리자(상승된) PowerShell 콘솔을 사용하고 있는지 확인합니다.
EKcert가 신뢰할 수 없다는 오류를 받은 경우 각 HGS 서버에 신뢰할 수 있는 TPM 루트 인증서 패키지를 설치했는지와 TPM 공급업체에 대한 루트 인증서가 로컬 컴퓨터의 "TrustedTPM_RootCA" 저장소에 있는지 확인합니다. 해당하는 중간 인증서는 로컬 컴퓨터의 "TrustedTPM_IntermediateCA" 저장소에도 설치해야 합니다.
루트 및 중간 인증서를 설치한 후에는 성공적으로 실행할 Add-HgsAttestationTpmHost
수 있어야 합니다.
gMSA(그룹 관리 서비스 계정) 권한
HGS 서비스 계정(IIS의 키 보호 서비스 애플리케이션 풀에 사용되는 gMSA)에는 보안 감사 생성 권한(라고도 함SeAuditPrivilege
)이 부여되어야 합니다. 이 권한이 없으면 초기 HGS 구성이 성공하고 IIS가 시작되지만 키 보호 서비스가 작동하지 않으며 HTTP 오류 500("/KeyProtection 애플리케이션의 서버 오류")을 반환합니다. 애플리케이션 이벤트 로그에서 다음 경고 메시지를 확인할 수도 있습니다.
System.ComponentModel.Win32Exception (0x80004005): A required privilege is not held by the client
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.NativeUtility.RegisterAuditSource(String pszSourceName, SafeAuditProviderHandle& phAuditProvider)
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.RegisterAuditSource(String sourceName)
또는
Failed to register the security event source.
at System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app)
at System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers)
at System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context)
at System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context)
at System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)
Failed to register the security event source.
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.RegisterAuditSource(String sourceName)
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.ReportAudit(EventLogEntryType eventType, UInt32 eventId, Object[] os)
at Microsoft.Windows.KpsServer.KpsServerHttpApplication.Application_Start()
A required privilege is not held by the client
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.NativeUtility.RegisterAuditSource(String pszSourceName, SafeAuditProviderHandle& phAuditProvider)
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.RegisterAuditSource(String sourceName)
또한 키 보호 서비스 cmdlet(예 : Get-HgsKeyProtectionCertificate)이 작동하지 않고 오류를 반환하는 것을 알 수 있습니다.
이 문제를 해결하려면 gMSA에 "보안 감사 생성"(SeAuditPrivilege
)을 부여해야 합니다. 이렇게 하려면 HGS 클러스터의 모든 노드에서 로컬 보안 정책 SecPol.msc 또는 그룹 정책을 사용할 수 있습니다. 또는 SecEdit.exe 도구를 사용하여 현재 보안 정책을 내보내고 구성 파일(일반 텍스트)에서 필요한 편집을 한 다음 다시 가져올 수 있습니다.
참고 항목
이 설정을 구성할 때 권한에 대해 정의된 보안 원칙 목록은 기본값을 완전히 재정의합니다(연결되지 않음). 따라서 이 정책 설정을 정의할 때 추가하려는 gMSA 외에도 이 권한의 기본 소유자(네트워크 서비스 및 로컬 서비스)를 모두 포함해야 합니다.