HealthAttestation CSP

Windows 참가자의 로고입니다.

중요

이 CSP에는 개발 중인 일부 설정이 포함되어 있으며 Windows Insider Preview 빌드에만 적용됩니다. 이러한 설정은 변경될 수 있으며 미리 보기의 다른 기능 또는 서비스에 대한 종속성이 있을 수 있습니다.

DHA-CSP(Device HealthAttestation 구성 서비스 공급자)를 사용하면 엔터프라이즈 IT 관리자가 디바이스가 신뢰할 수 있고 규격 상태로 부팅되었는지 평가하고 엔터프라이즈 정책 작업을 수행할 수 있습니다.

다음 목록은 Device HealthAttestation CSP에서 수행하는 함수에 대한 설명입니다.

  • 관리되는 디바이스에서 디바이스 부팅 로그, TPM(신뢰할 수 있는 플랫폼 모듈) 감사 내역 및 TPM 인증서(DHA-BootData)를 수집합니다.
  • 디바이스 상태 증명 서비스(DHA-Service)에 DHA-BootData 전달합니다.
  • DHA-Service에서 암호화된 Blob(DHA-EncBlob)을 수신하고 디바이스의 로컬 캐시에 저장합니다.
  • DHA-Enabled MDM에서 증명 요청(DHA-Requests)을 수신하고 디바이스 상태 증명 데이터(DHA-Data)로 회신합니다.

다음 목록에서는 HealthAttestation 구성 서비스 공급자 노드를 보여 줍니다.

AttestErrorMessage

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows Insider Preview
./Vendor/MSFT/HealthAttestation/AttestErrorMessage

증명 서비스에서 반환된 경우 AttestErrorMessage는 마지막 증명 세션에 대한 오류 메시지를 유지 관리합니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 chr (문자열)
액세스 유형 가져오기

AttestStatus

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 11, 버전 21H2 [10.0.22000] 이상
./Vendor/MSFT/HealthAttestation/AttestStatus

AttestStatus는 마지막 증명 세션의 성공 또는 실패 상태 코드를 유지 관리합니다.

상태 항상 삭제된 후 서비스 호출을 확인합니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 int
액세스 유형 가져오기

:

  • 템플릿화된 SyncML 호출:

    <SyncML xmlns="SYNCML:SYNCML1.2">
        <SyncBody>
        <Get>
            <Item>
            <Target>
                <LocURI>
                ./Device/Vendor/MSFT/HealthAttestation/AttestStatus
                </LocURI>
            </Target>
            </Item>
        </Get>
        <Final/>
        </SyncBody>
    </SyncML>
    
  • 샘플 응답:

    If Successful: 0
    If Failed: A corresponding HRESULT error code. Example: 0x80072efd,  WININET_E_CANNOT_CONNECT
    

Certificate

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 10 버전 1511 [10.0.10586] 이상
./Vendor/MSFT/HealthAttestation/Certificate

DHA-CSP에 MDM 서버에 DHA-Data 전달하도록 지시합니다.

값 형식은 base64 문자열입니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 chr (문자열)
액세스 유형 가져오기

Correlationid

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 10 버전 1511 [10.0.10586] 이상
./Vendor/MSFT/HealthAttestation/CorrelationID

고유한 디바이스 상태 증명 세션을 식별합니다. CorrelationId는 디버그 및 문제 해결을 위해 DHA-Service 로그를 MDM 서버 이벤트 및 클라이언트 이벤트 로그와 상호 연결하는 데 사용됩니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 chr (문자열)
액세스 유형 가져오기

CurrentProtocolVersion

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 10 버전 1709 [10.0.16299] 이상
./Vendor/MSFT/HealthAttestation/CurrentProtocolVersion

클라이언트가 상태 증명 서비스와 통신하는 데 사용하는 현재 프로토콜 버전을 제공합니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 int
액세스 유형 가져오기

ForceRetrieve

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 10 버전 1511 [10.0.10586] 이상
./Vendor/MSFT/HealthAttestation/ForceRetrieve

클라이언트에 DHA-Service에 대한 새 요청을 시작하고 새 DHA-EncBlob(DHA-Service에서 발급한 부팅 상태 요약)를 받도록 지시합니다. 이 옵션은 MDM 서버가 DHA-Service에서 새로 암호화된 Blob을 가져오기 위해 디바이스를 강제로 가져와야 하는 인증서 새로 고침 정책을 적용하는 경우에만 사용해야 합니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 bool
액세스 유형 가져오기, 바꾸기
기본 값 False

허용되는 값:

설명
false(기본값) False.
true 사실.

GetAttestReport

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 11, 버전 21H2 [10.0.22000] 이상
./Vendor/MSFT/HealthAttestation/GetAttestReport

증명 세션 보고서가 있는 경우 검색합니다.

보고서는 해당 MDM 등록 저장소의 레지스트리 키에 저장됩니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 chr (문자열)
액세스 유형 가져오기

:

  • 템플릿화된 SyncML 호출:

    <SyncML xmlns="SYNCML:SYNCML1.2">
    <SyncBody>
        <Get>
        <Item>
            <Target>
            <LocURI>
                ./Device/Vendor/MSFT/HealthAttestation/GetAttestReport
            </LocURI>
            </Target>
        </Item>
        </Get>
        <Final/>
    </SyncBody>
    </SyncML>
    
  • 샘플 데이터:

    If Success: JWT token: aaaaaaaaaaaaa.bbbbbbbbbbbbb.cccccccccc
    If failed: Previously cached report if available (the token may have already expired per the attestation policy).
               OR Sync ML 404 error if no cached report available.
    

GetServiceCorrelationIDs

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 11, 버전 21H2 [10.0.22000] 이상
./Vendor/MSFT/HealthAttestation/GetServiceCorrelationIDs

서비스 상관 관계 ID(있는 경우)를 검색합니다.

둘 이상의 상관 관계 ID가 있는 경우 문자열에서 ";"로 구분됩니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 chr (문자열)
액세스 유형 가져오기

:

  • 템플릿화된 SyncML 호출:

    <SyncML xmlns="SYNCML:SYNCML1.2">
      <SyncBody>
        <Get>
        <Item>
          <Target>
          <LocURI>
            ./Device/Vendor/MSFT/HealthAttestation/GetServiceCorrelationIDs
          </LocURI>
          </Target>
        </Item>
        </Get>
        <Final/>
      </SyncBody>
    </SyncML>
    
  • 샘플 데이터:

    If success: GUID returned by the attestation service: 1k9+vQOn00S8ZK33;CMc969r1JEuHwDpM
    If Trigger Attestation call failed and no previous data is present: The field remains empty.
    Otherwise, the last service correlation id will be returned.
    In a successful attestation there are two calls between client and MAA and for each call the GUID is separated by semicolon.
    

HASEndpoint

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 10 버전 1511 [10.0.10586] 이상
./Vendor/MSFT/HealthAttestation/HASEndpoint

증명을 수행하도록 할당된 DHA-Service FQDN(정규화된 도메인 이름)을 식별합니다. FQDN이 할당되지 않은 경우 DHA-Cloud(Microsoft 소유 및 운영 클라우드 서비스)가 기본 증명 서비스로 사용됩니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 chr (문자열)
액세스 유형 가져오기, 바꾸기
기본 값 has.spserv.microsoft.com.

MaxSupportedProtocolVersion

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 10 버전 1709 [10.0.16299] 이상
./Vendor/MSFT/HealthAttestation/MaxSupportedProtocolVersion

이 클라이언트가 지원할 수 있는 최대 프로토콜 버전을 반환합니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 int
액세스 유형 가져오기

Nonce

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 10 버전 1511 [10.0.10586] 이상
./Vendor/MSFT/HealthAttestation/Nonce

MDM을 사용하면 MDM 서버에서 생성된 암호화된 임의 값으로 MITM(Man-in-the-middle) 공격으로부터 디바이스 상태 증명 통신을 보호할 수 있습니다. nonce는 최소 크기가 8바이트이고 최대 크기가 32바이트인 16진수 형식입니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 chr (문자열)
액세스 유형 가져오기, 바꾸기
기본 값 \0

PreferredMaxProtocolVersion

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 10 버전 1709 [10.0.16299] 이상
./Vendor/MSFT/HealthAttestation/PreferredMaxProtocolVersion

클라이언트가 통신하도록 구성된 최대 기본 프로토콜 버전을 제공합니다. 클라이언트에서 지원하는 프로토콜 버전보다 높은 경우 사용 가능한 가장 높은 프로토콜 버전을 사용합니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 int
액세스 유형 가져오기, 바꾸기
기본 값 3

상태

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 10 버전 1511 [10.0.10586] 이상
./Vendor/MSFT/HealthAttestation/Status

디바이스 상태 요청의 현재 상태 제공합니다. 상태 값의 전체 목록은 HealthAttestation CSP 상태 및 오류 코드를 참조하세요.

설명 프레임워크 속성:

속성 이름 속성 값
형식 int
액세스 유형 가져오기

TpmReadyStatus

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 10, 버전 1607 [10.0.14393] 이상
./Vendor/MSFT/HealthAttestation/TpmReadyStatus

TPM 상태를 설명하는 정보의 비트 마스크를 반환합니다. 디바이스의 TPM이 준비되고 신뢰할 수 있는 상태인지 여부를 나타냅니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 int
액세스 유형 가져오기

TriggerAttestation

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 11, 버전 21H2 [10.0.22000] 이상
./Vendor/MSFT/HealthAttestation/TriggerAttestation

디바이스에 증명 세션을 비동기적으로 트리거하도록 알린다.

증명 프로세스가 성공적으로 시작되면 이 노드는 요청이 수신되고 처리되고 있음을 나타내는 코드 202를 반환합니다. 그렇지 않으면 오류가 반환됩니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 chr (문자열)
액세스 유형 Exec

:

  • 템플릿화된 SyncML 호출:

    <SyncML xmlns="SYNCML:SYNCML1.2">
        <SyncBody>
            <Exec>
                <CmdID>VERIFYHEALTHV2</CmdID>
                <Item>
                    <Target>
                        <LocURI>
                            ./Vendor/MSFT/HealthAttestation/TriggerAttestation
                        </LocURI>
                    </Target>
                    <Data>
                        {
                        rpID : "rpID", serviceEndpoint : "MAA endpoint",
                        nonce : "nonce", aadToken : "aadToken", "cv" : "CorrelationVector"
                        }
                    </Data>
                </Item>
            </Exec>
            <Final/>
        </SyncBody>
    </SyncML>
    
  • 데이터 필드:

    • rpID(신뢰 당사자 식별자): 이 필드에는 호출자를 확인하는 데 사용할 수 있는 식별자가 포함되어 있습니다.
    • serviceEndpoint: 이 필드는 평가에 사용할 Microsoft Azure Attestation 공급자 instance 전체 URL을 포함합니다.
    • nonce: 이 필드는 암호화 통신에서 한 번만 사용할 수 있는 임의의 숫자를 포함합니다. 이전 통신을 재생 공격에 재사용할 수 없도록 하기 위해 인증 프로토콜에서 발급된 임의 또는 의사 난수인 경우가 많습니다.
    • aadToken: Microsoft Azure Attestation 서비스에 대한 인증에 사용할 Microsoft Entra 토큰입니다.
    • cv: 이 필드에는 서비스 호출에 전달되고 진단 용도로 사용할 수 있는 식별자(상관 관계 벡터)가 포함되어 있습니다.
  • 샘플 <Data>:

    {
      "rpid" : "https://www.contoso.com/attestation",
      "endpoint" : "https://contoso.eus.attest.azure.net/attest/tpm?api-version=2020-10-01",
      "nonce" : "5468697320697320612054657374204e6f6e6365",
      "aadToken" : "dummytokenstring",
      "cv" : "testonboarded"
    }
    

VerifyHealth

범위 에디션 적용 가능한 OS
✅ 장치
❌ 사용자
✅ 프로
✅ Enterprise
✅ Education
✅ Windows SE
✅ IoT Enterprise/IoT Enterprise LTSC
✅Windows 10 버전 1511 [10.0.10586] 이상
./Vendor/MSFT/HealthAttestation/VerifyHealth

디바이스에 디바이스 상태 확인 요청을 준비하도록 알 수 있습니다.

설명 프레임워크 속성:

속성 이름 속성 값
형식 null
액세스 유형 Exec

디바이스 상태 증명 Windows 11

Windows 11 디바이스 상태 증명 기능에 대한 업데이트를 소개합니다. 이 업데이트는 디바이스 보안에 대한 제로 트러스트 접근 방식을 지원하여 Windows 부팅 보안에 대한 심층적인 인사이트를 지원하는 데 도움이 됩니다. Windows의 디바이스 상태 증명은 HealthAttestation CSP를 사용하여 액세스할 수 있습니다. 이 CSP는 디바이스가 신뢰할 수 있고 규격 상태로 부팅되었는지 평가한 다음 적절한 조치를 취하는 데 도움이 됩니다. Windows 11 MDM 공급자가 Microsoft Azure Attestation 서비스에 연결할 수 있도록 HealthAttestation 노드에 더 많은 자식 노드를 도입하여 증명에 대한 간소화된 접근 방식을 제공합니다.

증명 보고서는 디바이스가 전원을 켜는 즉시 자동으로 보호되도록 디바이스의 부팅 시간 속성에 대한 상태 평가를 제공합니다. 그러면 상태 증명 결과를 사용하여 디바이스 상태에 따라 네트워크, 앱 또는 서비스에 대한 액세스를 허용하거나 거부할 수 있습니다.

사용된 용어:

  • TPM(신뢰할 수 있는 플랫폼 모듈): TPM은 보호된 스토리지, 난수 생성, 암호화 및 서명 제공을 포함하여 일련의 하드웨어 보호 보안 작업을 수행하는 특수 하드웨어 보호 논리입니다.
  • DHA(Device HealthAttestation) 기능: DHA(Device HealthAttestation) 기능을 사용하면 엔터프라이즈 IT 관리자가 변조 방지 및 변조 방지 통신 채널을 통해 하드웨어(TPM)로 보호되고 증명된 데이터를 사용하여 관리 디바이스의 보안 상태를 원격으로 모니터링할 수 있습니다.
  • MAA 세션(Microsoft Azure Attestation 서비스 기반 디바이스 HealthAttestation 세션): Microsoft Azure Attestation 서비스 기반 디바이스 HealthAttestation 세션(MAA-Session)은 하나의 디바이스 상태 증명 세션에서 수행되는 엔드투엔드 통신 흐름을 설명합니다.
  • MAA-CSP 노드(Microsoft Azure Attestation 기반 Configuration Service Provider): Microsoft Azure Attestation Service와 통합하기 위해 Windows 11 추가된 구성 서비스 공급자 노드입니다. 다음 작업 목록은 MAA-CSP에서 수행됩니다.
    • HealthAttestation이 설정된 MDM 공급자로부터 증명 트리거 요청을 받습니다.
    • 디바이스는 관리되는 디바이스에서 증명 증명 증거(디바이스 부팅 로그, TPM 감사 추적 및 TPM 인증서)를 수집합니다.
    • MDM 공급자가 구성한 대로 증명 증거를 Azure Attestation 서비스 instance 전달합니다.
    • Azure Attestation Service instance 서명된 보고서를 받아 디바이스의 로컬 캐시에 저장합니다.
  • MAA 엔드포인트: Microsoft Azure 증명 서비스는 Azure 리소스이며 서비스의 모든 instance 관리자가 구성한 URL을 가져옵니다. 생성된 URI는 본질적으로 고유하며 디바이스 상태 증명을 위해 MAA 엔드포인트라고 합니다.
  • JWT(JSON 웹 토큰): JWT(JSON Web Token)는 당사자 간에 정보를 JSON(JavaScript Object Notation) 개체로 안전하게 전송하기 위한 개방형 표준 RFC7519 방법입니다. 이 정보는 디지털 서명되어 있으므로 확인 및 신뢰할 수 있습니다. 비밀 또는 퍼블릭/프라이빗 키 쌍을 사용하여 JWT에 서명할 수 있습니다.

Microsoft Azure Attestation Service를 사용하는 증명 흐름

Microsoft Azure Attestation Service를 사용하는 증명 흐름

증명 흐름은 세 가지 기본 단계로 광범위하게 수행할 수 있습니다.

  • Azure Attestation 서비스의 instance 적절한 증명 정책을 사용하여 설정됩니다. 증명 정책을 사용하면 MDM 공급자가 부팅의 특정 이벤트와 보안 기능을 증명할 수 있습니다.
  • MDM 공급자는 증명 서비스에 대한 호출을 트리거한 다음, 디바이스는 증명 검사 수행하여 보고서를 검색할 준비가 된 상태로 유지합니다.
  • 토큰이 증명 서비스에서 오는지 확인한 후 MDM 공급자는 증명 토큰을 구문 분석하여 디바이스의 증명 상태를 반영할 수 있습니다.

자세한 내용은 증명 프로토콜을 참조하세요.

MAA CSP 통합 단계

  1. MAA 공급자 설정 instance: 빠른 시작: Azure Portal 사용하여 Azure Attestation 설정의 단계에 따라 MAA instance 만들 수 있습니다.

  2. 적절한 정책으로 공급자 업데이트: MAA instance 적절한 정책으로 업데이트해야 합니다. 자세한 내용은 Azure Attestation 정책을 작성하는 방법을 참조하세요.

    샘플 증명 정책:

    version=1.2;
    
    configurationrules{
    };
    
    authorizationrules {
        => permit();
    };
    
    issuancerules {
    
        // SecureBoot enabled
        c:[type == "events", issuer=="AttestationService"] => add(type = "efiConfigVariables", value = JmesPath(c.value, "Events[?EventTypeString == 'EV_EFI_VARIABLE_DRIVER_CONFIG' && ProcessedData.VariableGuid == '8BE4DF61-93CA-11D2-AA0D-00E098032B8C']"));
        c:[type == "efiConfigVariables", issuer=="AttestationPolicy"]=> issue(type = "secureBootEnabled", value = JsonToClaimValue(JmesPath(c.value, "[?ProcessedData.UnicodeName == 'SecureBoot'] | length(@) == `1` && @[0].ProcessedData.VariableData == 'AQ'")));
        ![type=="secureBootEnabled", issuer=="AttestationPolicy"] => issue(type="secureBootEnabled", value=false);
    
        // Retrieve bool properties
        c:[type=="events", issuer=="AttestationService"] => add(type="boolProperties", value=JmesPath(c.value, "Events[? EventTypeString == 'EV_EVENT_TAG' && (PcrIndex == `12` || PcrIndex == `13` || PcrIndex == `19` || PcrIndex == `20`)].ProcessedData.EVENT_TRUSTBOUNDARY"));
        c:[type=="boolProperties", issuer=="AttestationPolicy"] => add(type="codeIntegrityEnabledSet", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_CODEINTEGRITY")));
        c:[type=="codeIntegrityEnabledSet", issuer=="AttestationPolicy"] => issue(type="codeIntegrityEnabled", value=ContainsOnlyValue(c.value, true));
        ![type=="codeIntegrityEnabled", issuer=="AttestationPolicy"] => issue(type="codeIntegrityEnabled", value=false);
    
        // Bitlocker Boot Status, The first non zero measurement or zero.
        c:[type=="events", issuer=="AttestationService"] => add(type="srtmDrtmEventPcr", value=JmesPath(c.value, "Events[? EventTypeString == 'EV_EVENT_TAG' && (PcrIndex == `12` || PcrIndex == `19`)].ProcessedData.EVENT_TRUSTBOUNDARY"));
        c:[type=="srtmDrtmEventPcr", issuer=="AttestationPolicy"] => issue(type="bitlockerEnabledValue", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_BITLOCKER_UNLOCK | @[? Value != `0`].Value | @[0]")));
        [type=="bitlockerEnabledValue"] => issue(type="bitlockerEnabled", value=true);
        ![type=="bitlockerEnabledValue"] => issue(type="bitlockerEnabled", value=false);
    
        // Elam Driver (windows defender) Loaded
        c:[type=="boolProperties", issuer=="AttestationPolicy"] => add(type="elamDriverLoaded", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_LOADEDMODULE_AGGREGATION[] | [? EVENT_IMAGEVALIDATED == `true` && (equals_ignore_case(EVENT_FILEPATH, '\\windows\\system32\\drivers\\wdboot.sys') || equals_ignore_case(EVENT_FILEPATH, '\\windows\\system32\\drivers\\wd\\wdboot.sys'))] | @ != `null`")));
        [type=="elamDriverLoaded", issuer=="AttestationPolicy"] => issue(type="WindowsDefenderElamDriverLoaded", value=true);
        ![type=="elamDriverLoaded", issuer=="AttestationPolicy"] => issue(type="WindowsDefenderElamDriverLoaded", value=false);
    
        // Boot debugging
        c:[type=="boolProperties", issuer=="AttestationPolicy"] => add(type="bootDebuggingEnabledSet", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_BOOTDEBUGGING")));
        c:[type=="bootDebuggingEnabledSet", issuer=="AttestationPolicy"] => issue(type="bootDebuggingDisabled", value=ContainsOnlyValue(c.value, false));
        ![type=="bootDebuggingDisabled", issuer=="AttestationPolicy"] => issue(type="bootDebuggingDisabled", value=false);
    
        // Kernel Debugging
        c:[type=="boolProperties", issuer=="AttestationPolicy"] => add(type="osKernelDebuggingEnabledSet", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_OSKERNELDEBUG")));
        c:[type=="osKernelDebuggingEnabledSet", issuer=="AttestationPolicy"] => issue(type="osKernelDebuggingDisabled", value=ContainsOnlyValue(c.value, false));
        ![type=="osKernelDebuggingDisabled", issuer=="AttestationPolicy"] => issue(type="osKernelDebuggingDisabled", value=false);
    
        // DEP Policy
        c:[type=="boolProperties", issuer=="AttestationPolicy"] => issue(type="depPolicy", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_DATAEXECUTIONPREVENTION.Value | @[-1]")));
        ![type=="depPolicy"] => issue(type="depPolicy", value=0);
    
        // Test Signing
        c:[type=="boolProperties", issuer=="AttestationPolicy"] => add(type="testSigningEnabledSet", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_TESTSIGNING")));
        c:[type=="testSigningEnabledSet", issuer=="AttestationPolicy"] => issue(type="testSigningDisabled", value=ContainsOnlyValue(c.value, false));
        ![type=="testSigningDisabled", issuer=="AttestationPolicy"] => issue(type="testSigningDisabled", value=false);
    
        // Flight Signing
        c:[type=="boolProperties", issuer=="AttestationPolicy"] => add(type="flightSigningEnabledSet", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_FLIGHTSIGNING")));
        c:[type=="flightSigningEnabledSet", issuer=="AttestationPolicy"] => issue(type="flightSigningNotEnabled", value=ContainsOnlyValue(c.value, false));
        ![type=="flightSigningNotEnabled", issuer=="AttestationPolicy"] => issue(type="flightSigningNotEnabled", value=false);
    
        // VSM enabled
        c:[type=="events", issuer=="AttestationService"] => add(type="srtmDrtmEventPcr", value=JmesPath(c.value, "Events[? EventTypeString == 'EV_EVENT_TAG' && (PcrIndex == `12` || PcrIndex == `19`)].ProcessedData.EVENT_TRUSTBOUNDARY"));
        c:[type=="srtmDrtmEventPcr", issuer=="AttestationPolicy"] => add(type="vbsEnabledSet", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_VBS_VSM_REQUIRED")));
        c:[type=="srtmDrtmEventPcr", issuer=="AttestationPolicy"] => add(type="vbsEnabledSet", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_VBS_MANDATORY_ENFORCEMENT")));
        c:[type=="vbsEnabledSet", issuer=="AttestationPolicy"] => issue(type="vbsEnabled", value=ContainsOnlyValue(c.value, true));
        ![type=="vbsEnabled", issuer=="AttestationPolicy"] => issue(type="vbsEnabled", value=false);
        c:[type=="vbsEnabled", issuer=="AttestationPolicy"] => issue(type="vbsEnabled", value=c.value);
    
        // HVCI
        c:[type=="srtmDrtmEventPcr", issuer=="AttestationPolicy"] => add(type="hvciEnabledSet", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_VBS_HVCI_POLICY | @[?String == 'HypervisorEnforcedCodeIntegrityEnable'].Value")));
        c:[type=="hvciEnabledSet", issuer=="AttestationPolicy"] => issue(type="hvciEnabled", value=ContainsOnlyValue(c.value, 1));
        ![type=="hvciEnabled", issuer=="AttestationPolicy"] => issue(type="hvciEnabled", value=false);
    
        // IOMMU
        c:[type=="boolProperties", issuer=="AttestationPolicy"] => add(type="iommuEnabledSet", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_VBS_IOMMU_REQUIRED")));
        c:[type=="iommuEnabledSet", issuer=="AttestationPolicy"] => issue(type="iommuEnabled", value=ContainsOnlyValue(c.value, true));
        ![type=="iommuEnabled", issuer=="AttestationPolicy"] => issue(type="iommuEnabled", value=false);
    
        // Find the Boot Manager SVN, this is measured as part of a sequence and find the various measurements
        // Find the first EV_SEPARATOR in PCR 12, 13, Or 14
        c:[type=="events", issuer=="AttestationService"] => add(type="evSeparatorSeq", value=JmesPath(c.value, "Events[? EventTypeString == 'EV_SEPARATOR' && (PcrIndex == `12` || PcrIndex == `13` || PcrIndex == `14`)] | @[0].EventSeq"));
        c:[type=="evSeparatorSeq", value != "null", issuer=="AttestationPolicy"] => add(type="beforeEvSepClause", value=AppendString(AppendString("Events[? EventSeq < `", c.value), "`"));
        [type=="evSeparatorSeq", value=="null", issuer=="AttestationPolicy"] => add(type="beforeEvSepClause", value="Events[? `true` ");
    
        // Find the first EVENT_APPLICATION_SVN.
        c:[type=="beforeEvSepClause", issuer=="AttestationPolicy"] => add(type="bootMgrSvnSeqQuery", value=AppendString(c.value, " && EventTypeString == 'EV_EVENT_TAG' && PcrIndex == `12` && ProcessedData.EVENT_TRUSTBOUNDARY.EVENT_APPLICATION_SVN] | @[0].EventSeq"));
        c1:[type=="bootMgrSvnSeqQuery", issuer=="AttestationPolicy"] && c2:[type=="events", issuer=="AttestationService"] => add(type="bootMgrSvnSeq", value=JmesPath(c2.value, c1.value));
        c:[type=="bootMgrSvnSeq", value!="null", issuer=="AttestationPolicy"] => add(type="bootMgrSvnQuery", value=AppendString(AppendString("Events[? EventSeq == `", c.value), "`].ProcessedData.EVENT_TRUSTBOUNDARY.EVENT_APPLICATION_SVN | @[0]"));
    
        // The first EVENT_APPLICATION_SVN. That value is the Boot Manager SVN
        c1:[type=="bootMgrSvnQuery", issuer=="AttestationPolicy"] && c2:[type=="events", issuer=="AttestationService"] => issue(type="bootMgrSvn", value=JsonToClaimValue(JmesPath(c2.value, c1.value)));
    
        // OS Rev List Info
        c:[type=="events", issuer=="AttestationService"] => issue(type="osRevListInfo", value=JsonToClaimValue(JmesPath(c.value, "Events[? EventTypeString == 'EV_EVENT_TAG' && PcrIndex == `13`].ProcessedData.EVENT_TRUSTBOUNDARY.EVENT_OS_REVOCATION_LIST.RawData | @[0]")));
    
        // Safe mode
        c:[type=="boolProperties", issuer=="AttestationPolicy"] => add(type="safeModeEnabledSet", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_SAFEMODE")));
        c:[type=="safeModeEnabledSet", issuer=="AttestationPolicy"] => issue(type="notSafeMode", value=ContainsOnlyValue(c.value, false));
        ![type=="notSafeMode", issuer=="AttestationPolicy"] => issue(type="notSafeMode", value=true);
    
        // Win PE
        c:[type=="boolProperties", issuer=="AttestationPolicy"] => add(type="winPEEnabledSet", value=JsonToClaimValue(JmesPath(c.value, "[*].EVENT_WINPE")));
        c:[type=="winPEEnabledSet", issuer=="AttestationPolicy"] => issue(type="notWinPE", value=ContainsOnlyValue(c.value, false));
        ![type=="notWinPE", issuer=="AttestationPolicy"] => issue(type="notWinPE", value=true);
    
        // CI Policy
        c:[type=="events", issuer=="AttestationService"] => issue(type="codeIntegrityPolicy", value=JsonToClaimValue(JmesPath(c.value, "Events[? EventTypeString == 'EV_EVENT_TAG' && PcrIndex == `13`].ProcessedData.EVENT_TRUSTBOUNDARY.EVENT_SI_POLICY[].RawData")));
    
        // Secure Boot Custom Policy
        c:[type=="events", issuer=="AttestationService"] => issue(type="secureBootCustomPolicy", value=JsonToClaimValue(JmesPath(c.value, "Events[? EventTypeString == 'EV_EFI_VARIABLE_DRIVER_CONFIG' && PcrIndex == `7` && ProcessedData.UnicodeName == 'CurrentPolicy' && ProcessedData.VariableGuid == '77FA9ABD-0359-4D32-BD60-28F4E78F784B'].ProcessedData.VariableData | @[0]")));
    
        // Find the first EV_SEPARATOR in PCR 12, 13, Or 14
        c:[type=="events", issuer=="AttestationService"] => add(type="evSeparatorSeq", value=JmesPath(c.value, "Events[? EventTypeString == 'EV_SEPARATOR' && (PcrIndex == `12` || PcrIndex == `13` || PcrIndex == `14`)] | @[0].EventSeq"));
        c:[type=="evSeparatorSeq", value != "null", issuer=="AttestationPolicy"] => add(type="beforeEvSepClause", value=AppendString(AppendString("Events[? EventSeq < `", c.value), "`"));
        [type=="evSeparatorSeq", value=="null", issuer=="AttestationPolicy"] => add(type="beforeEvSepClause", value="Events[? `true` "); // No restriction of EV_SEPARATOR in case it's not present
    
        //Finding the Boot App SVN
        // Find the first EVENT_TRANSFER_CONTROL with value 1 or 2 in PCR 12 which is before the EV_SEPARATOR
        c1:[type=="beforeEvSepClause", issuer=="AttestationPolicy"] && c2:[type=="bootMgrSvnSeq", value != "null", issuer=="AttestationPolicy"] => add(type="beforeEvSepAfterBootMgrSvnClause", value=AppendString(AppendString(AppendString(c1.value, "&& EventSeq >= `"), c2.value), "`"));
        c:[type=="beforeEvSepAfterBootMgrSvnClause", issuer=="AttestationPolicy"] => add(type="tranferControlQuery", value=AppendString(c.value, " && EventTypeString == 'EV_EVENT_TAG' && PcrIndex == `12`&& (ProcessedData.EVENT_TRUSTBOUNDARY.EVENT_TRANSFER_CONTROL.Value == `1` || ProcessedData.EVENT_TRUSTBOUNDARY.EVENT_TRANSFER_CONTROL.Value == `2`)] | @[0].EventSeq"));
        c1:[type=="tranferControlQuery", issuer=="AttestationPolicy"] && c2:[type=="events", issuer=="AttestationService"] => add(type="tranferControlSeq", value=JmesPath(c2.value, c1.value));
    
        // Find the first non-null EVENT_MODULE_SVN in PCR 13 after the transfer control.
        c:[type=="tranferControlSeq", value!="null", issuer=="AttestationPolicy"] => add(type="afterTransferCtrlClause", value=AppendString(AppendString(" && EventSeq > `", c.value), "`"));
        c1:[type=="beforeEvSepClause", issuer=="AttestationPolicy"] && c2:[type=="afterTransferCtrlClause", issuer=="AttestationPolicy"] => add(type="moduleQuery", value=AppendString(AppendString(c1.value, c2.value), " && EventTypeString == 'EV_EVENT_TAG' && PcrIndex == `13` && ((ProcessedData.EVENT_TRUSTBOUNDARY.EVENT_LOADEDMODULE_AGGREGATION[].EVENT_MODULE_SVN | @[0]) || (ProcessedData.EVENT_LOADEDMODULE_AGGREGATION[].EVENT_MODULE_SVN | @[0]))].EventSeq | @[0]"));
        c1:[type=="moduleQuery", issuer=="AttestationPolicy"] && c2:[type=="events", issuer=="AttestationService"] => add(type="moduleSeq", value=JmesPath(c2.value, c1.value));
    
        // Find the first EVENT_APPLICATION_SVN after EV_EVENT_TAG in PCR 12.
        c:[type=="moduleSeq", value!="null", issuer=="AttestationPolicy"] => add(type="applicationSvnAfterModuleClause", value=AppendString(AppendString(" && EventSeq > `", c.value), "`"));
        c1:[type=="beforeEvSepClause", issuer=="AttestationPolicy"] && c2:[type=="applicationSvnAfterModuleClause", issuer=="AttestationPolicy"] => add(type="bootAppSvnQuery", value=AppendString(AppendString(c1.value, c2.value), " && EventTypeString == 'EV_EVENT_TAG' && PcrIndex == `12`].ProcessedData.EVENT_TRUSTBOUNDARY.EVENT_APPLICATION_SVN | @[0]"));
        c1:[type=="bootAppSvnQuery", issuer=="AttestationPolicy"] && c2:[type=="events", issuer=="AttestationService"] => issue(type="bootAppSvn", value=JsonToClaimValue(JmesPath(c2.value, c1.value)));
    
        // Finding the Boot Rev List Info
        c:[type=="events", issuer=="AttestationService"] => issue(type="bootRevListInfo", value=JsonToClaimValue(JmesPath(c.value, "Events[? EventTypeString == 'EV_EVENT_TAG' && PcrIndex == `13`].ProcessedData.EVENT_TRUSTBOUNDARY.EVENT_BOOT_REVOCATION_LIST.RawData | @[0]")));
    
    };
    
  3. Azure Active Directory token 를 사용하여 TriggerAttestationrpid을 호출하고attestURI: 1단계에서 생성된 증명 URL을 사용하고 적중하려는 적절한 api 버전을 추가합니다. api 버전에 대한 자세한 내용은 증명 - 증명 Tpm - REST API를 참조하세요.

  4. GetAttestReport를 호출하고 보고서를 디코딩하고 구문 분석하여 증명된 보고서에 필요한 속성이 포함되어 있는지 확인합니다. GetAttestReport는 서명된 증명 토큰을 JWT로 반환합니다. 증명 정책에 따라 정보를 구문 분석하기 위해 JWT를 디코딩할 수 있습니다.

        {
          "typ": "JWT",
          "alg": "RS256",
          "x5c": [
            "MIIE.....=",
            "MIIG.....=",
            "MIIF.....="
          ],
          "kid": "8FUer20z6wzf1rod044wOAFdjsg"
        }.{
          "nbf": 1633664812,
          "exp": 1634010712,
          "iat": 1633665112,
          "iss": "https://contosopolicy.eus.attest.azure.net",
          "jti": "2b63663acbcafefa004d20969991c0b1f063c9be",
          "ver": "1.0",
          "x-ms-ver": "1.0",
          "rp_data": "AQIDBA",
          "nonce": "AQIDBA",
          "cnf": {
            "jwk": {
              "kty": "RSA",
              "n": "yZGC3-1rFZBt6n6vRHjRjvrOYlH69TftIQWOXiEHz__viQ_Z3qxWVa4TfrUxiQyDQnxJ8-f8tBRmlunMdFDIQWhnew_rc3-UYMUPNcTQ0IkrLBDG6qDjFFeEAMbn8gqr0rRWu_Qt7Cb_Cq1upoEBkv0RXk8yR6JXmFIvLuSdewGs-xCWlHhd5w3n1rVk0hjtRk9ZErlbPXt74E5l-ZZQUIyeYEZ1FmbivOIL-2f6NnKJ-cR4cdhEU8i9CH1YV0r578ry89nGvBJ5u4_3Ib9Ragdmxm259npH53hpnwf0I6V-_ZhGPyF6LBVUG_7x4CyxuHCU20uI0vXKXJNlbj1wsQ",
              "e": "AQAB"
            }
          },
          "x-ms-policy-hash": "GiGQCTOylCohHt4rd3pEppD9arh5mXC3ifF1m1hONh0",
          "WindowsDefenderElamDriverLoaded": true,
          "bitlockerEnabled": true,
          "bitlockerEnabledValue": 4,
          "bootAppSvn": 1,
          "bootDebuggingDisabled": true,
          "bootMgrSvn": 1,
          "bootRevListInfo": "gHWqR2F-1wEgAAAACwBxrZXHbaiuTuO0PSaJ7WQMF8yz37Z2ATgSNTTlRkwcTw",
          "codeIntegrityEnabled": true,
          "codeIntegrityPolicy": [
            "AAABAAAAAQBWAAsAIAAAAHsAOABmAGIANAA4ADYANQBlAC0AZQA5ADAAYgAtADQANAA0AGYALQBiADUAYgA1AC0AZQAyAGEAYQA1ADEAZAA4ADkAMABmAGQAfQAuAEMASQBQAAAAVnW86ERqAg5n9QT1UKFr-bOP2AlNtBaaHXjZODnNLlk", "AAAAAAAACgBWAAsAIAAAAHsAYgBjADQAYgBmADYAZAA3AC0AYwBjADYAMAAtADQAMABmADAALQA4ADYANAA0AC0AMQBlADYANAA5ADEANgBmADgAMQA4ADMAfQAuAEMASQBQAAAAQ7vOXuAbBRIMglSSg7g_LHNeHoR4GrY-M-2W5MNvf0o", "AAAAAAAACgBWAAsAIAAAAHsAYgAzADEAOAA5ADkAOQBhAC0AYgAxADMAZQAtADQANAA3ADUALQBiAGMAZgBkAC0AMQBiADEANgBlADMAMABlADYAMAAzADAAfQAuAEMASQBQAAAALTmwU3eadNtg0GyAyKIAkYed127RJCSgmfFmO1jN_aI", "AAAAAAAACgBWAAsAIAAAAHsAZgBlADgAMgBkADUAOAA5AC0ANwA3AGQAMQAtADQAYwA3ADYALQA5AGEANABhAC0AZQA0ADUANQA0ADYAOAA4ADkANAAxAGIAfQAuAEMASQBQAAAA8HGUwA85gHN_ThItTYtu6sw657gVuOb4fOhYl-YJRoc", "AACRVwAACgAmAAsAIAAAAEQAcgBpAHYAZQByAFMAaQBQAG8AbABpAGMAeQAuAHAANwBiAAAAYcVuY0HdW4Iqr5B-6Sl85kwIXRG9bqr43pVhkirg4qM"
          ],
          "depPolicy": 0,
          "flightSigningNotEnabled": false,
          "hvciEnabled": true,
          "iommuEnabled": true,
          "notSafeMode": true,
          "notWinPE": true,
          "osKernelDebuggingDisabled": true,
          "osRevListInfo": "gHLuW2F-1wEgAAAACwDLyDTUQILjdz_RfNlShVgNYT9EghL7ceMReWg9TuwdKA",
          "secureBootEnabled": true,
          "testSigningDisabled": true,
          "vbsEnabled": true
        }.[Signature]
    

자세히 알아보기

TPM 증명에 대한 자세한 내용은 Microsoft Azure Attestation 여기에서 확인할 수 있습니다.

Windows 10 Device HealthAttestation

사용된 용어:

  • TPM(신뢰할 수 있는 플랫폼 모듈): TPM은 보호된 스토리지, 난수 생성, 암호화 및 서명 제공을 포함하여 일련의 하드웨어 보호 보안 작업을 수행하는 특수 하드웨어 보호 논리입니다.

  • DHA(Device HealthAttestation) 기능: DHA(Device HealthAttestation) 기능을 사용하면 엔터프라이즈 IT 관리자가 변조 방지 및 변조 방지 통신 채널을 통해 하드웨어(TPM)로 보호되고 증명된 데이터를 사용하여 관리 디바이스의 보안 상태를 원격으로 모니터링할 수 있습니다.

  • DHA 사용 디바이스(Device HealthAttestation 사용 디바이스): 디바이스 상태이용(DHA 사용) 디바이스는 Windows 10 실행하고 TPM 버전 1.2 또는 2.0을 지원하는 컴퓨팅 디바이스(전화, 데스크톱, 노트북, 태블릿, 서버)입니다.

  • DHA 세션(Device HealthAttestation session): DHA 세션(Device HealthAttestation Session)은 하나의 디바이스 상태 증명 세션에서 수행되는 엔드투엔드 통신 흐름을 설명합니다. 다음 트랜잭션 목록은 하나의 DHA 세션에서 수행됩니다.

    DHA 세션 상태 테스트 세션 다이어그램

    • DHA-CSP 및 DHA-Service 통신:
      • DHA-CSP는 디바이스 부팅 데이터(DHA-BootData)를 DHA-Service 전달합니다.
      • 암호화된 데이터 Blob을 사용하여 DHA-Service 회신(DHA-EncBlob)
    • DHA-CSP 및 MDM-Server 통신:
      • MDM-Server DHA-CSP에 디바이스 상태 확인 요청을 보냅니다.
      • DHA-CSP는 암호화된(DHA-EncBlob) 및 서명된(DHA-SignedBlob) 데이터 Blob을 포함하는 DHA-Data 라는 페이로드로 회신합니다.
    • MDM-Server 및 DHA-Service 통신:
      • MDM-Server 디바이스에서 받은 데이터를 DHA-Service
      • DHA-Service 수신한 데이터를 검토하고 디바이스 상태 보고서(DHA-Report)로 회신합니다.
  • DHA 세션 데이터(Device HealthAttestation 세션 데이터): 다음 데이터 목록은 하나의 DHA 트랜잭션에서 생성되거나 사용됩니다.

    • DHA-BootData: 디바이스 부팅 상태의 유효성을 검사하는 데 필요한 디바이스 부팅 데이터(TCG 로그, PCR 값, 디바이스/TPM 인증서, 부팅 및 TPM 카운터)입니다.
    • DHA-EncBlob: 디바이스에서 수신하는 DHA-BootData 검토한 후 디바이스에 문제를 DHA-Service 암호화된 요약 보고서입니다.
    • DHA-SignedBlob: 디바이스 상태 증명 시 DHA-CSP에 의해 캡처되는 디바이스 런타임의 현재 상태에 대한 서명된 스냅샷.
    • DHA-Data: 디바이스가 MDM-Server를 통해 DHA-Service 디바이스 상태 유효성 검사를 위해 전달하는 XML 형식의 데이터 Blob입니다. DHA-Data 두 부분으로 구성합니다.
      • DHA-EncBlob: 디바이스가 DHA-Service 수신하는 암호화된 데이터 Blob
      • DHA-SignedBlob: DHA-CSP에서 생성된 디바이스의 현재 보안 상태의 현재 스냅샷
    • DHA-Report: MDM-Server 위해 DHA-Service 발행한 보고서
    • Nonce: MDM-Server에서 생성되는 암호화 보호된 숫자로, 중간 유형의 공격으로부터 DHA-Session 보호합니다.
  • DHA 지원 MDM(Device HealthAttestation이 설정된 디바이스 관리 솔루션): 디바이스 HealthAttestation enabled(DHA 사용) 디바이스 관리 솔루션은 DHA 기능과 통합된 디바이스 관리 도구입니다. DHA-Enabled 디바이스 관리 솔루션을 사용하면 엔터프라이즈 IT 관리자가 고급 보안 위협에 의해 디바이스가 손상되거나 악성(탈옥) 운영 체제를 실행하더라도 신뢰할 수 있는 TPM(하드웨어) 보호 데이터를 기반으로 관리되는 디바이스에 대한 보안 보호 표시줄을 높일 수 있습니다. 다음 작업 목록은 DHA-Enabled-MDM에서 수행됩니다.

    • DHA-Enabled 디바이스에서 DHA 기능을 사용하도록 설정
    • 등록된/관리되는 디바이스에 대한 디바이스 상태 증명 요청 문제
    • 디바이스 상태 증명 데이터(DHA-Data)를 수집하고 확인을 위해 DHA-Service(디바이스 상태 증명 서비스)로 보냅니다.
    • 준수 작업을 트리거하는 DHA-Service에서 디바이스 상태 보고서(DHA-Report)를 가져옵니다.
  • DHA-CSP(Device HealthAttestation Configuration Service Provider): DHA-CSP(Device HealthAttestation Configuration Service Provider)는 디바이스의 TPM 및 펌웨어를 사용하여 디바이스의 BIOS 및 Windows 부팅의 중요한 보안 속성을 측정하므로 커널 수준 맬웨어 또는 루트킷에 감염된 시스템에서도 이러한 속성을 스푸핑할 수 없습니다. 다음 작업 목록은 DHA-CSP에서 수행됩니다.

    • 관리되는 디바이스에서 디바이스 부팅 데이터(DHA-BootData)를 수집합니다.
    • 디바이스 상태 증명 서비스(DHA-Service)에 DHA-BootData 전달
    • DHA-Service에서 암호화된 Blob(DHA-EncBlob)을 수신하고 디바이스의 로컬 캐시에 저장합니다.
    • DHA-Enabled MDM에서 증명 요청(DHA-Requests)을 수신하고 디바이스 상태 증명 데이터(DHA-Data)로 회신합니다.
  • DHA-Service(Device HealthAttestation Service): DHA-Service(Device HealthAttestation Service)는 DHA-CSP에서 받은 데이터의 유효성을 검사하고, 변조 방지 및 변조 방지 통신 채널을 통해 디바이스 관리 솔루션을 DHA-Enabled 위해 신뢰할 수 있는 TPM(하드웨어) 보호 보고서(DHA-Report)를 발급합니다. DHA-Service "DHA-Cloud" 및 "DHA-Server2016"의 두 가지 버전으로 제공됩니다. DHA-Service 클라우드, 온-프레미스, 에어 갭 및 하이브리드 시나리오를 비롯한 다양한 구현 시나리오를 지원합니다. 다음 작업 목록은 DHA-Service에서 수행됩니다.

    • DHA-Enabled 디바이스에서 디바이스 부팅 데이터(DHA-BootData)를 받습니다.
    • 디바이스 상태 증명 서비스(DHA-Service)에 DHA-BootData 전달
    • DHA-Service에서 암호화된 Blob(DHA-EncBlob)을 수신하고 디바이스의 로컬 캐시에 저장합니다.
    • DHA-Enabled-MDM에서 증명 요청(DHA-Requests)을 수신하고 디바이스 상태 보고서(DHA-Report)로 회신합니다.

다양한 DHS 서비스에 대한 상태 증명 서비스 다이어그램

DHA-Service 형식 설명 작업 비용
디바이스 상태 증명 - 클라우드(DHA-Cloud) DHA-Cloud Microsoft 소유 및 운영 DHA-Service 다음과 같습니다.
  • Windows에서 무료로 사용 가능
  • 고가용성 및 지역 균형 클라우드 인프라에서 실행
  • 대부분의 DHA-Enabled 디바이스 관리 솔루션에서 기본 디바이스 증명 서비스 공급자로 지원됨
  • 다음을 통해 모든 엔터프라이즈 관리 디바이스에 액세스할 수 있습니다.
    • FQDN = has.spserv.microsoft.com 포트
    • 포트 = 443
    • 프로토콜 = TCP
  • 비용 없음
    디바이스 상태 증명 - 온-프레미스(DHA-OnPrem) DHA-OnPrem 온-프레미스에서 실행되는 DHA-Service 나타냅니다.
  • Windows Server 2016 고객에게 제공됨(DHA-Service 사용/실행을 위한 라이선스 비용이 추가되지 않음)
  • 엔터프라이즈 소유 및 관리형 서버 디바이스/하드웨어에서 호스트됨
  • 온-프레미스 및 하이브리드(클라우드 + OnPrem) 하드웨어 증명 시나리오를 지원하는 자사 및 타사 DHA-Enabled 디바이스 관리 솔루션 공급자에서 지원
  • 다음 설정을 통해 모든 엔터프라이즈 관리 디바이스에 액세스할 수 있습니다.
    • FQDN = (enterprise assigned)
    • Port = (enterprise assigned)
    • 프로토콜 = TCP
  • 서버 2016 온-프레미스 인스턴스를 하나 이상 실행하는 데 드는 작업 비용입니다.
    디바이스 상태 증명 - Enterprise-Managed Cloud(DHA-EMC) DHA-EMC는 Microsoft Azure와 같은 엔터프라이즈 관리형 클라우드 서비스에서 호환되는 Windows Server 2016 가상 호스트/서비스로 실행되는 엔터프라이즈 관리형 DHA-Service 나타냅니다.
  • 추가 라이선스 비용 없이 Windows Server 2016 고객에게 제공됨(DHA-Service 사용/실행을 위한 추가 라이선스 비용 없음)
  • 온-프레미스 및 하이브리드(클라우드 + OnPrem) 하드웨어 증명 시나리오를 지원하는 자사 및 타사 DHA-Enabled 디바이스 관리 솔루션 공급자에서 지원
  • 다음 설정을 통해 모든 엔터프라이즈 관리 디바이스에 액세스할 수 있습니다.
    • FQDN = (enterprise assigned)
    • Port = (enterprise assigned)
    • 프로토콜 = TCP
  • Microsoft Azure와 같은 호환되는 클라우드 서비스에서 Server 2016을 실행하는 데 드는 작업 비용입니다.

    DHA-CSP 통합 단계

    Microsoft Device Health 증명 기능을 Windows Mobile MDM(디바이스 관리 솔루션)과 통합하려면 다음 유효성 검사 및 개발 작업 목록이 필요합니다.

    1. HTTPS 액세스 확인
    2. 엔터프라이즈 신뢰할 수 있는 DHA-Service 할당
    3. 확인을 위해 DHA 데이터를 준비하도록 클라이언트에 지시
    4. 클라이언트 응답에 따라 작업 수행
    5. 확인을 위해 DHA 데이터를 전달하도록 클라이언트에 지시
    6. DHA-서비스에 DHA 데이터 게시
    7. DHA 서비스에서 응답 받기
    8. DHA-Report 데이터를 구문 분석합니다. 평가 결과에 따라 적절한 정책 작업 수행

    각 단계는 이 항목의 다음 섹션에서 자세히 설명합니다.

    1단계: HTTPS 액세스 확인

    MDM 서버와 디바이스(MDM 클라이언트)가 모두 포트 443(HTTPS)을 통해 TCP 프로토콜을 사용하여 has.spserv.microsoft.com 액세스할 수 있는지 확인합니다.

    OpenSSL을 사용하여 DHA-Service에 대한 액세스의 유효성을 검사할 수 있습니다. 다음은 샘플 OpenSSL 명령과 DHA-Service에서 생성된 응답입니다.

    PS C:\openssl> ./openssl.exe s_client -connect has.spserv.microsoft.com:443
    CONNECTED(000001A8)
    ---
    Certificate chain
     0 s:/CN=*.spserv.microsoft.com
       i:/C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Microsoft IT/CN=Microsoft IT SSL SHA2
     1 s:/C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Microsoft IT/CN=Microsoft IT SSL SHA2
       i:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root
    ---
    Server certificate
    -----BEGIN CERTIFICATE-----
    MIIGOTCCBCGgAwIBAgITWgAA1KJb40tpukQoewABAADUojANBgkqhkiG9w0BAQsFA4ICAQCJaKewFQuqQwR5fkAr9kZOmtq5fk03p82eHWLaftXlc4RDvVFp4a2ciSjZL8f3f+XWPVdUj9DAi3bCSddlrcNOPRXNepFC1OEmKtE9jM0r7M8qnqFkIfbNrVNUtPxHoraQeMIgbk0SHEOlShY2GXETVBqZdDZ5Rmk4rA+3ggoeV8hNzm2dfNp0iGSrZzawbLzWU1D2Tped1k5IV63yb+cU/TmM ……………………………………………………………………………………………………………………………………
    ………………………………………………………………………………………………………………………………………………………………………………………………………………………………
    ……………2RXXwogn1UM8TZduCEjz+b05mAkvytugzzaI4wXkCP4OgNyy8gul2z5Gj/51pCTN
    -----END CERTIFICATE-----
    subject=/CN=*.spserv.microsoft.com
    issuer=/C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Microsoft IT/CN=Microsoft IT SSL SHA2
    ---
    No client certificate CA names sent
    Peer signing digest: SHA1
    Server Temp Key: ECDH, P-384, 384 bits
    ---
    SSL handshake has read 3681 bytes and written 561 bytes
    New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA384
    Server public key is 2048 bit
    Secure Renegotiation IS supported
    Compression: NONE
    Expansion: NONE
    No ALPN negotiated
    SSL-Session:
        Protocol: TLSv1.2
        Cipher: ECDHE-RSA-AES256-SHA384
        Session-ID: B22300009621370F84A4A3A7D9FC40D584E047C090604E5226083A02ED239C93
        Session-ID-ctx:
        Master-Key: 9E3F6BE5B3D3B55C070470CA2B62EF59CC1D5ED9187EF5B3D1BBF4C101EE90BEB04F34FFD748A13C92A387104B8D1DE7
        Key-Arg: None
        PSK identity: None
        PSK identity hint: None
        SRP username: None
        Start Time: 1432078420
        Timeout: 300 (sec)
        Verify return code: 20 (unable to get local issuer certificate)
    

    2단계: 엔터프라이즈 신뢰할 수 있는 DHA-Service 할당

    DHA-Service에는 다음 세 가지 유형이 있습니다.

    • 디바이스 상태 증명 - 클라우드(Microsoft 소유 및 운영)
    • 디바이스 상태 증명 - 온-프레미스(엔터프라이즈 소유 및 운영, 온-프레미스 Windows Server 2016 실행)
    • 디바이스 상태 증명 - Enterprise-Managed Cloud(엔터프라이즈 소유 및 운영, 호환되는 엔터프라이즈 관리 클라우드에서 실행 Windows Server 2016)

    DHA-Cloud 기본 설정입니다. 기업이 Microsoft DHA-Cloud 신뢰할 수 있는 DHA-Service 공급자로 사용하려는 경우에는 추가 조치가 필요하지 않습니다.

    DHA-OnPrem & DHA-EMC 시나리오의 경우 HASEndpoint 노드에 SyncML 명령을 보내 관리되는 디바이스에 엔터프라이즈 신뢰할 수 있는 DHA-Service와 통신하도록 지시합니다.

    다음 예제에서는 관리되는 디바이스가 엔터프라이즈 관리형 DHA-Service와 통신하도록 지시하는 샘플 호출을 보여 줍니다.

    <Replace>
        <CmdID>1</CmdID>
        <Item>
          <Target>
              <LocURI>./Vendor/MSFT/HealthAttestation/HASEndpoint</LocURI>
          </Target>
          <Data> www.ContosoDHA-Service</Data>
        </Item>
    </Replace>
    

    3단계: 확인에 대한 상태 데이터를 준비하도록 클라이언트에 지시

    SyncML 호출을 보내 DHA-Data 컬렉션을 시작합니다.

    다음 예제에서는 관리되는 디바이스에서 상태 증명 데이터의 수집 및 확인을 트리거하는 샘플 호출을 보여 줍니다.

    <Exec>
        <CmdID>1</CmdID>
        <Item>
          <Target>
              <LocURI>./Vendor/MSFT/HealthAttestation/VerifyHealth</LocURI>
          </Target>
        </Item>
    </Exec>
    
    <Get>
        <CmdID>2</CmdID>
        <Item>
          <Target>
              <LocURI>./Vendor/MSFT/HealthAttestation/Status</LocURI>
          </Target>
        </Item>
    </Get>
    

    4단계: 클라이언트의 응답에 따라 작업 수행

    클라이언트가 상태 증명 요청을 받은 후 응답을 보냅니다. 다음 목록에서는 권장되는 작업과 함께 응답에 대해 설명합니다.

    • 응답이 HEALTHATTESTATION_CERT_RETRIEVAL_COMPLETE 경우(3) 다음 섹션으로 진행합니다.
    • 응답이 HEALTHATTESTATION_CERT_RETRIEVAL_REQUESTED(1) 또는 HEALTHATTESTATION_CERT_RETRIEVAL_UNINITIALIZED (0)가 경고를 기다리는 경우 다음 섹션으로 진행합니다.

    다음은 DHA_CSP 의해 발급되는 샘플 경고입니다.

    <Alert>
        <CmdID>1</CmdID>
        <Data>1226</Data>
        <Item>
            <Source>
                <LocURI>./Vendor/MSFT/HealthAttestation/VerifyHealth</LocURI>
            </Source>
            <Meta>
                <Type xmlns="syncml:metinf">com.microsoft.mdm:HealthAttestation.Result</Type>
                <Format xmlns="syncml:metinf">int</Format>
            </Meta>
            <Data>3</Data>
        </Item>
    </Alert>
    

    5단계: 확인을 위해 상태 증명 데이터를 전달하도록 클라이언트에 지시

    Nonce, CertificateCorrelationId 노드에 대한 호출을 만들고 디바이스에서 상태 인증서 및 관련 데이터를 포함하는 암호화된 페이로드를 선택합니다.

    예를 들면 다음과 같습니다.

    <Replace>
        <CmdID>1</CmdID>
        <Item>
            <Target>
                <LocURI>./Vendor/MSFT/HealthAttestation/Nonce</LocURI>
            </Target>
            <Data>AAAAAAAAAFFFFFFF</Data>
        </Item>
    </Replace>
    
    <Get>
        <CmdID>2</CmdID>
        <Item>
            <Target>
                <LocURI>./Vendor/MSFT/HealthAttestation/Certificate</LocURI>
            </Target>
        </Item>
    </Get>
    
    <Get>
        <CmdID>3</CmdID>
        <Item>
            <Target>
                <LocURI>./Vendor/MSFT/HealthAttestation/CorrelationId </LocURI>
            </Target>
        </Item>
    </Get>
    

    6단계: 디바이스 상태 증명 데이터를 DHA 서비스에 전달

    이전 단계에서 전송된 요청에 대한 응답으로 MDM 클라이언트는 XML 형식 Blob(./Vendor/MSFT/HealthAttestation/Certificate 노드의 응답) 및 CorrelationId(./Vendor/MSFT/HealthAttestation/CorrelationId 노드에 대한 응답)라는 호출 식별자를 전달합니다.

    MDM-Server 위의 데이터를 수신하는 경우 다음을 수행해야 합니다.

    • 디바이스에서 수신한 CorrelationId(향후 문제 해결/참조용)를 호출과 상관관계로 기록합니다.

    • 디바이스에서 수신하는 XML 형식의 데이터 Blob 디코딩

    • MDM 서비스에서 생성된 nonce(5단계의 디바이스에 전달된 nonce 추가)를 다음 형식으로 디바이스에서 전달한 XML 구조에 추가합니다.

      <?xml version='1.0' encoding='utf-8' ?>
      <HealthCertificateValidationRequest ProtocolVersion='1' xmlns='http://schemas.microsoft.com/windows/security/healthcertificate/validation/request/v1'>
          <Nonce>[INT]</Nonce>
          <Claims> [base64 blob, eg ‘ABc123+/…==’] </Claims>
          <HealthCertificateBlob> [base64 blob, eg ‘ABc123+/...==’]
          </HealthCertificateBlob>
      </HealthCertificateValidationRequest>
      
    • XML 데이터 구조체(이전 단계에서 추가된 nonce 포함)를 다음에 실행되는 할당된 DHA-Service 전달(HTTP Post)합니다.

      • DHA-Cloud(Microsoft 소유 및 운영 DHA-Service) 시나리오: https://has.spserv.microsoft.com/DeviceHealthAttestation/ValidateHealthCertificate/v3
      • DHA-OnPrem 또는 DHA-EMC: https://FullyQualifiedDomainName-FDQN/DeviceHealthAttestation/ValidateHealthCertificate/v3

    7단계: DHA 서비스에서 응답 받기

    Microsoft 디바이스 상태 증명 서비스에서 확인 요청을 받으면 다음 단계를 수행합니다.

    • 수신하는 암호화된 데이터의 암호를 해독합니다.
    • 받은 데이터의 유효성을 검사합니다.
    • 보고서를 만들고 XML 형식의 SSL을 통해 MDM 서버에 평가 결과를 공유합니다.

    8단계: 평가 결과에 따라 적절한 정책 작업 수행

    MDM 서버가 확인된 데이터를 수신한 후에는 데이터를 평가하여 정책을 결정하는 데 정보를 사용할 수 있습니다. 몇 가지 가능한 작업은 다음과 같습니다.

    • 디바이스 액세스를 허용합니다.
    • 디바이스가 리소스에 액세스하도록 허용하지만 추가 조사를 위해 디바이스에 플래그를 지정합니다.
    • 디바이스가 리소스에 액세스하지 못하도록 합니다.

    V3 스키마 DHA-Report

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns="http://schemas.microsoft.com/windows/security/healthcertificate/validation/response/v3"
               targetNamespace="http://schemas.microsoft.com/windows/security/healthcertificate/validation/response/v3"
               elementFormDefault="qualified">
    
        <xs:element name="HealthCertificateValidationResponse" type="HealthCertificateValidationResponse_T"/>
        <xs:complexType name="ResponseCommon_T">
            <xs:attribute name="ErrorCode" type="xs:int" use="required"/>
            <xs:attribute name="ErrorMessage" type="xs:string" use="required"/>
            <xs:attribute name="ProtocolVersion" use="required">
              <xs:simpleType>
                <xs:restriction base="xs:int">
                  <xs:minInclusive value="3"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
        <xs:complexType name="HealthCertificatePublicProperties_T">
            <xs:annotation>
                <xs:documentation>Health certificate non machine identifiable properties </xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <xs:element name="Issued"                       type="xs:dateTime"/>
                <xs:element name="AIKPresent"                   type="Boolean_T" />
                <xs:element name="ResetCount"                   type="xs:unsignedInt"/>
                <xs:element name="RestartCount"                 type="xs:unsignedInt"/>
                <xs:element name="DEPPolicy"                    type="xs:unsignedInt"/>
                <xs:element name="BitlockerStatus"              type="xs:unsignedInt"/>
                <xs:element name="BootManagerRevListVersion"    type="xs:unsignedInt"/>
                <xs:element name="CodeIntegrityRevListVersion"  type="xs:unsignedInt"/>
                <xs:element name="SecureBootEnabled"            type="Boolean_T"/>
                <xs:element name="BootDebuggingEnabled"         type="Boolean_T"/>
                <xs:element name="OSKernelDebuggingEnabled"     type="Boolean_T"/>
                <xs:element name="CodeIntegrityEnabled"         type="Boolean_T"/>
                <xs:element name="TestSigningEnabled"           type="Boolean_T"/>
                <xs:element name="SafeMode"                     type="Boolean_T"/>
                <xs:element name="WinPE"                        type="Boolean_T"/>
                <xs:element name="ELAMDriverLoaded"             type="Boolean_T"/>
                <xs:element name="VSMEnabled"                   type="Boolean_T"/>
                <xs:element name="PCRHashAlgorithmID"           type="xs:unsignedInt"/>
                <xs:element name="BootAppSVN"                   type="xs:unsignedInt"/>
                <xs:element name="BootManagerSVN"               type="xs:unsignedInt"/>
                <xs:element name="TpmVersion"                   type="xs:unsignedInt"/>
                <xs:element name="PCR0"                         type="xs:hexBinary"/>
                <xs:element name="CIPolicy"                     type="xs:hexBinary" minOccurs ="0" maxOccurs ="1"/>
                <xs:element name="SBCPHash"                     type="xs:hexBinary" minOccurs ="0" maxOccurs ="1"/>
                <xs:element name="BootRevListInfo"              type="xs:hexBinary" minOccurs ="0" maxOccurs ="1"/>
                <xs:element name="OSRevListInfo"                type="xs:hexBinary" minOccurs ="0" maxOccurs ="1"/>
    
              <!--
    <xs:element name="PCRCount"                     type="xs:unsignedInt"/>
    <xs:element name="PCRSize"                      type="xs:unsignedShort"/>
    <xs:element name="PCRHashAlgorithmID"           type="xs:unsignedShort"/>
    
    <xs:element name="PCR"                          type="xs:hexBinary"/>
                -->
            </xs:sequence>
        </xs:complexType>
    
        <xs:complexType name="HealthStatusMismatchFlags_T">
            <xs:annotation>
                <xs:documentation>If there's a status mismatch, these flags will be set</xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <!-- Hibernate/Resume count -->
                <xs:element name="ResumeCount"                   type="Boolean_T"/>
                <!-- Reboot count -->
                <xs:element name="RebootCount"                   type="Boolean_T"/>
                <xs:element name="PCR"                           type="Boolean_T"/>
                <xs:element name="BootAppSVN"                   type="Boolean_T"/>
                <xs:element name="BootManagerSVNChain"           type="Boolean_T"/>
                <xs:element name="BootAppSVNChain"              type="Boolean_T"/>
            </xs:sequence>
        </xs:complexType>
    
        <xs:complexType name="HealthCertificateValidationResponse_T" >
            <xs:annotation>
                <xs:documentation>Health certificate validation response </xs:documentation>
            </xs:annotation>
            <xs:complexContent>
                <xs:extension base="ResponseCommon_T">
    <xs:sequence>
        <!--Optional element, present only when the certificate can be verified and decrypted-->
        <xs:element name="HealthCertificateProperties"  type="HealthCertificatePublicProperties_T"  minOccurs="0"/>
        <!--Optional element, present only when the reason for a validation failure is a mismatch between the
                        current health state and the certificate health state-->
        <xs:element name="HealthStatusMismatchFlags"       type="HealthStatusMismatchFlags_T"             minOccurs="0"/>
    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
        <xs:simpleType name="Boolean_T">
            <xs:restriction base="xs:boolean">
                <xs:pattern value="true|false"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:schema>
    

    데이터 포인트의 다음 목록은 DHA-Report 버전 3의 DHA-Service 의해 확인됩니다.

    • 발급됨: DHA 보고서가 평가되거나 MDM에 발급된 날짜 및 시간입니다.

    • AIKPresent: AIK(증명 ID 키)가 디바이스에 있는 경우 디바이스에 EK(인증 키) 인증서가 있음을 나타냅니다. EK 인증서가 없는 디바이스보다 더 신뢰할 수 있습니다.

      AIKPresent = True(1)인 경우 액세스를 허용합니다.

      AIKPresent = False(0)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 자산에 대한 액세스를 허용하지 않습니다.
      • 평가 시간에 있는 다른 데이터 요소를 기반으로 조건부 액세스를 허용합니다. 예를 들어 상태 인증서의 다른 특성 또는 디바이스의 과거 활동 및 신뢰 기록입니다.
      • 이전 작업 중 하나를 수행하고 watch 목록에 디바이스를 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.
    • ResetCount (TPM 2.0을 지원하는 디바이스에 대해서만 보고됨): 이 특성은 PC 디바이스가 최대 절전 모드 또는 다시 시작된 횟수를 보고합니다.

    • RestartCount (TPM 2.0을 지원하는 디바이스에 대해서만 보고됨): 이 특성은 PC 디바이스가 다시 부팅된 횟수를 보고합니다.

    • DEPPolicy: 디바이스에서 DEP 정책을 사용하는 경우 디바이스를 더 신뢰할 수 있습니다.

      DEP(데이터 실행 방지) 정책은 시스템에서 악성 코드가 실행되지 않도록 메모리에 대한 추가 검사를 수행하는 하드웨어 및 소프트웨어 기술 집합을 정의합니다. 보안 부팅을 사용하면 x86/amd64에서 제한된 목록을 허용하고 ARM NTOS에서 잠금을 켭니다.

      WMI 또는 PowerShell 스크립트에서 다음 명령을 사용하여 DEPPolicy를 사용하지 않도록 설정하거나 사용하도록 설정할 수 있습니다.

      • DEP를 사용하지 않도록 설정하려면 bcdedit.exe /set {current} nx AlwaysOff를 입력합니다.
      • DEP를 사용하도록 설정하려면 bcdedit.exe /set {current} nx AlwaysOn을 입력합니다.

      DEPPolicy = 1(켜기)이면 액세스를 허용합니다.

      DEPPolicy = 0(끄기)이면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 자산에 대한 액세스를 허용하지 않습니다.
      • 평가 시간에 있는 다른 데이터 요소를 기반으로 조건부 액세스를 허용합니다. 예를 들어 상태 인증서의 다른 특성 또는 디바이스의 과거 활동 및 신뢰 기록입니다.
      • 이전 작업 중 하나를 수행하고 watch 목록에 디바이스를 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.

      DEP 정책 평가는 쿼리할 때 이진이 아닌 상태. 그런 다음 켜기/끄기 상태로 매핑됩니다.

      DEP 정책 수준 설명 증명 보고된 수준 속성 값
      OptIn(기본 구성) Windows 시스템 구성 요소 및 서비스만 DEP를 적용했습니다. 0 2
      Optout DEP는 모든 프로세스에 대해 사용하도록 설정됩니다. 관리자는 DEP가 적용되지 않은 특정 애플리케이션 목록을 수동으로 만들 수 있습니다. 1 3
      AlwaysOn DEP는 모든 프로세스에 대해 사용하도록 설정됩니다. 3 1
      AlwaysOff DEP는 모든 프로세스에 대해 사용하도록 설정되지 않습니다. 2 0
    • BitLockerStatus (초기 부팅 중에 BitLocker가 활성화되었는지 보고합니다.):

      부팅 시 BitLocker가 "켜짐"으로 보고되면 디바이스는 시스템이 꺼지거나 최대 절전 모드로 전환될 때 드라이브에 저장된 데이터를 무단 액세스로부터 보호할 수 있습니다.

      Windows BitLocker 드라이브 암호화는 Windows 운영 체제 볼륨에 저장된 모든 데이터를 암호화합니다. BitLocker는 TPM을 사용하여 Windows 운영 체제 및 사용자 데이터를 보호하고 컴퓨터가 변조되지 않도록 하는 데 도움이 됩니다.

      컴퓨터에 호환되는 TPM이 장착된 경우 BitLocker는 TPM을 사용하여 데이터를 보호하는 암호화 키를 잠급 수 있습니다. 따라서 TPM이 컴퓨터의 상태를 확인할 때까지 키에 액세스할 수 없습니다.

      BitLockerStatus = 1(켜기)이면 액세스를 허용합니다.

      BitLockerStatus = 0(끄기)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 자산에 대한 액세스를 허용하지 않습니다.
      • 평가 시간에 있는 다른 데이터 요소를 기반으로 조건부 액세스를 허용합니다. 예를 들어 상태 인증서의 다른 특성 또는 디바이스의 과거 활동 및 신뢰 기록입니다.
      • 이전 작업 중 하나를 수행하고 watch 목록에 디바이스를 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.
    • BootManagerRevListVersion: 이 특성은 부팅 시퀀스/환경의 보안을 추적하고 관리할 수 있도록 디바이스에서 실행되는 부팅 관리자의 버전을 나타냅니다.

      BootManagerRevListVersion = [CurrentVersion]인 경우 액세스를 허용합니다.

      = [CurrentVersion]인 경우 BootManagerRevListVersion !엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 및 MBI 자산에 대한 액세스를 허용하지 않습니다.
      • 디바이스를 watch 목록에 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.
      • 기술 지원 팀에 소유자에게 문의하여 문제를 조사하도록 알리는 것과 같은 수정 작업을 트리거합니다.
    • CodeIntegrityRevListVersion: 이 특성은 부팅 시퀀스 중에 무결성 검사를 수행하는 코드의 버전을 나타냅니다. 이 특성을 사용하면 디바이스가 무결성 검사를 수행하는 최신 버전의 코드를 실행하고 있는지 또는 보안 위험에 노출되었는지(해지됨) 감지하고 적절한 정책 작업을 적용하는 데 도움이 될 수 있습니다.

      CodeIntegrityRevListVersion = [CurrentVersion]이면 액세스를 허용합니다.

      = [CurrentVersion]인 경우 CodeIntegrityRevListVersion !엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 및 MBI 자산에 대한 액세스를 허용하지 않습니다.
      • 디바이스를 watch 목록에 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.
      • 기술 지원 팀에 소유자에게 문의하여 문제를 조사하도록 알리는 것과 같은 수정 작업을 트리거합니다.
    • SecureBootEnabled: 보안 부팅을 사용하도록 설정하면 컴퓨터를 부팅하는 데 사용되는 핵심 구성 요소에는 디바이스를 제조한 organization 신뢰할 수 있는 올바른 암호화 서명이 있어야 합니다. UEFI 펌웨어는 머신을 시작하기 전에 이 요구 사항을 확인합니다. 파일이 변조되어 서명이 끊어지면 시스템이 부팅되지 않습니다.

      SecureBootEnabled = 1(True)이면 액세스를 허용합니다.

      SecurebootEnabled = 0(False)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 자산에 대한 액세스를 허용하지 않습니다.
      • 평가 시간에 있는 다른 데이터 요소를 기반으로 조건부 액세스를 허용합니다. 예를 들어 상태 인증서의 다른 특성 또는 디바이스의 과거 활동 및 신뢰 기록입니다.
      • 이전 작업 중 하나를 수행하고 watch 목록에 디바이스를 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.
    • BootDebuggingEnabled: 부팅 디버그 사용은 개발 및 테스트에 사용되는 디바이스를 가리킵니다. 테스트 및 개발에 사용되는 디바이스는 일반적으로 보안이 떨어집니다. 디바이스는 불안정한 코드를 실행하거나 테스트 및 개발에 필요한 더 적은 보안 제한으로 구성할 수 있습니다.

      WMI 또는 PowerShell 스크립트에서 다음 명령을 사용하여 부팅 디버깅을 사용하지 않도록 설정하거나 사용하도록 설정할 수 있습니다.

      • 부팅 디버깅을 사용하지 않도록 설정하려면 bcdedit.exe /set {current} bootdebug off를 입력합니다.
      • 부팅 디버깅을 사용하도록 설정하려면 bcdedit.exe /set {current} bootdebug on을 입력합니다.

      BootdebuggingEnabled = 0(False)이면 액세스를 허용합니다.

      BootDebuggingEnabled = 1(True)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 자산에 대한 액세스를 허용하지 않습니다.
      • 디바이스를 watch 목록에 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.
      • WMI 또는 PowerShell 스크립트를 사용하여 VSM을 사용하도록 설정하는 것과 같은 수정 작업을 트리거합니다.
    • OSKernelDebuggingEnabled: OSKernelDebuggingEnabled는 개발 및 테스트에 사용되는 디바이스를 가리킵니다. 테스트 및 개발에 사용되는 디바이스는 일반적으로 보안이 떨어집니다. 불안정한 코드를 실행하거나 테스트 및 개발에 필요한 보안 제한을 줄이면서 구성할 수 있습니다.

      OSKernelDebuggingEnabled = 0(False)인 경우 액세스를 허용합니다.

      OSKernelDebuggingEnabled = 1(True)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 자산에 대한 액세스를 허용하지 않습니다.
      • 디바이스를 watch 목록에 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.
      • 기술 지원 팀에 소유자에게 문의하여 문제를 조사하도록 알리는 것과 같은 수정 작업을 트리거합니다.
    • CodeIntegrityEnabled: 코드 무결성을 사용하도록 설정하면 코드 실행이 무결성 확인 코드로 제한됩니다.

      코드 무결성은 메모리에 로드될 때마다 드라이버 또는 시스템 파일의 무결성을 검사하는 기능입니다. 코드 무결성은 서명되지 않은 드라이버 또는 시스템 파일이 커널에 로드되고 있는지 또는 관리자 권한이 있는 사용자 계정에서 실행하는 악성 소프트웨어에 의해 시스템 파일이 수정되었는지 여부를 검색합니다.

      x64 기반 버전의 운영 체제에서는 커널 모드 드라이버를 디지털 서명해야 합니다.

      CodeIntegrityEnabled = 1(True)이면 액세스를 허용합니다.

      CodeIntegrityEnabled = 0(False)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 자산에 대한 액세스를 허용하지 않습니다.
      • 평가 시간에 있는 다른 데이터 요소를 기반으로 조건부 액세스를 허용합니다. 예를 들어 상태 인증서의 다른 특성 또는 디바이스의 과거 활동 및 신뢰 기록입니다.
      • 이전 작업 중 하나를 수행하고 watch 목록에 디바이스를 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.
    • TestSigningEnabled: 테스트 서명을 사용하도록 설정하면 디바이스는 부팅 중에 서명 유효성 검사를 적용하지 않으며, 부팅하는 동안 서명되지 않은 드라이버(예: 서명되지 않은 UEFI 모듈)를 로드할 수 있습니다.

      WMI 또는 PowerShell 스크립트에서 다음 명령을 사용하여 테스트 서명을 사용하지 않도록 설정하거나 사용하도록 설정할 수 있습니다.

      • 부팅 디버깅을 사용하지 않도록 설정하려면 bcdedit.exe /set {current} testsigning off를 입력합니다.
      • 부팅 디버깅을 사용하도록 설정하려면 bcdedit.exe /set {current} testsigning on을 입력합니다.

      TestSigningEnabled = 0(False)인 경우 액세스를 허용합니다.

      TestSigningEnabled = 1(True)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 및 MBI 자산에 대한 액세스를 허용하지 않습니다.
      • 디바이스를 watch 목록에 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.
      • WMI 또는 PowerShell 스크립트를 사용하여 테스트 서명을 사용하도록 설정하는 것과 같은 수정 작업을 트리거합니다.
    • SafeMode: 안전 모드는 제한된 상태에서 컴퓨터를 시작하는 Windows의 문제 해결 옵션입니다. Windows를 실행하는 데 필요한 기본 파일 및 드라이버만 시작됩니다.

      SafeMode = 0(False)인 경우 액세스를 허용합니다.

      SafeMode = 1(True)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 자산에 대한 액세스를 허용하지 않습니다.
      • 기술 지원 팀에 소유자에게 문의하여 문제를 조사하도록 알리는 것과 같은 수정 작업을 트리거합니다.
    • WinPE: Windows PE(Windows 사전 설치 환경)는 Windows 설치를 위해 컴퓨터를 준비하고, 네트워크 파일 서버에서 디스크 이미지를 복사하고, Windows 설치 프로그램을 시작하는 데 사용되는 제한된 서비스가 있는 최소 운영 체제입니다.

      WinPE = 0(False)이면 액세스를 허용합니다.

      WinPE = 1(True)인 경우 Windows OS 설치에 필요한 원격 리소스에 대한 액세스를 제한합니다.

    • ELAMDriverLoaded(Windows Defender): 이 보고 기능을 사용하려면 디바이스에서 "하이브리드 다시 시작"을 사용하지 않도록 설정해야 합니다. ELAM(조기 실행 맬웨어 방지)은 타사 드라이버가 초기화되기 전 및 시작할 때 네트워크의 컴퓨터에 대한 보호를 제공합니다.

      현재 릴리스에서 이 특성은 초기 부팅 중에 Microsoft 자사 ELAM(Windows Defender)이 로드된 경우에만 모니터링/보고합니다.

      디바이스가 타사 바이러스 백신 프로그램을 사용해야 하는 경우 보고된 상태를 무시합니다.

      디바이스가 Windows Defender 및 ELAMDriverLoaded = 1(True)을 사용해야 하는 경우 액세스를 허용합니다.

      디바이스에서 Windows Defender 및 ELAMDriverLoaded = 0(False)을 사용해야 하는 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 자산에 대한 액세스를 허용하지 않습니다.
      • 기술 지원 팀에 소유자에게 문의하여 문제를 조사하도록 알리는 것과 같은 수정 작업을 트리거합니다.
    • VSMEnabled: VSM(가상 보안 모드)은 손상된 커널로부터 높은 가치의 자산을 보호하는 컨테이너입니다. VSM에는 약 1GB의 메모리가 필요합니다. 모든 인증 조정에 사용되는 LSA 서비스를 실행할 수 있는 충분한 기능이 있습니다.

      VSM은 WMI 또는 PowerShell 스크립트에서 다음 명령을 사용하여 사용하도록 설정할 수 있습니다.

      bcdedit.exe /set {current} vsmlaunchtype auto

      VSMEnabled = 1(True)이면 액세스를 허용합니다. VSMEnabled = 0(False)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • HBI 자산에 대한 액세스를 허용하지 않습니다.
      • 기술 지원 팀에 소유자에게 문의하여 문제를 조사하도록 알리는 것과 같은 수정 작업을 트리거합니다.
    • PCRHashAlgorithmID: 이 특성은 TPM에서 사용한 HASH 알고리즘을 식별하는 정보 특성입니다. 규정 준수 작업이 필요하지 않습니다.

    • BootAppSVN: 이 특성은 테스트된 디바이스에서 초기 부팅 중에 로드된 부팅 애플리케이션의 보안 버전 번호를 식별합니다.

      보고된 BootAppSVN이 허용되는 값과 같으면 액세스를 허용합니다.

      Reported BootAppSVN이 허용되는 값과 같지 않으면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • 디바이스를 엔터프라이즈 허니팟으로 보내 디바이스의 활동을 추가로 모니터링합니다.
    • BootManagerSVN: 이 특성은 테스트된 디바이스에서 초기 부팅 중에 로드된 부팅 관리자의 보안 버전 번호를 식별합니다.

      reported BootManagerSVN이 허용되는 값과 같으면 액세스를 허용합니다.

      보고된 BootManagerSVN이 허용되는 값과 같지 않으면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • 디바이스를 엔터프라이즈 허니팟으로 보내 디바이스의 활동을 추가로 모니터링합니다.
    • TPMVersion: 이 특성은 테스트된 디바이스에서 실행 중인 TPM의 버전을 식별합니다. TPMVersion 노드는 회신 "1" 및 "2"를 제공합니다.

      • 1은 TPM 사양 버전 1.2를 의미합니다.
      • 2는 TPM 사양 버전 2.0을 의미합니다.

      TPMVersion 노드에서 받은 회신에 따라:

      • 보고된 TPMVersion이 허용되는 값과 같으면 액세스를 허용합니다.
      • 보고된 TPMVersion이 허용되는 값과 같지 않으면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
        • 모든 액세스 허용
        • 디바이스를 엔터프라이즈 허니팟으로 보내 디바이스의 활동을 추가로 모니터링합니다.
    • PCR0: PCR[0]에서 캡처되는 측정값은 일반적으로 부팅 주기 간의 호스트 플랫폼에 대한 일관된 보기를 나타냅니다. 호스트 플랫폼 제조업체에서 제공하는 구성 요소의 측정값을 포함합니다.

      엔터프라이즈 관리자는 신뢰할 수 있는 PCR[0] 값의 허용 목록을 만들고, 관리 디바이스의 PCR[0] 값(HAS에서 확인 및 보고한 값)을 허용 목록과 비교한 다음 비교 결과에 따라 신뢰 결정을 내릴 수 있습니다.

      엔터프라이즈에 허용된 PCR[0] 값의 허용 목록이 없는 경우 아무 작업도 수행하지 않습니다. PCR[0]이 허용 허용 목록 값과 같으면 액세스를 허용합니다.

      PCR[0]이 허용되는 나열된 값과 같지 않으면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • 디바이스를 엔터프라이즈 허니팟으로 보내 디바이스의 활동을 추가로 모니터링합니다.
    • SBCPHash: SBCPHash는 PC를 제외한 Windows 디바이스에서 부팅하는 동안 로드된 SBCP(사용자 지정 보안 부팅 구성 정책)의 지문입니다.

      SBCPHash가 없거나 허용되는 허용 목록 값인 경우 액세스를 허용합니다.

      SBCPHash가 DHA-Report에 있고 허용 목록 값이 아닌 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • 디바이스를 watch 목록에 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.
    • CIPolicy: 이 특성은 부팅 환경의 보안을 제어하는 코드 무결성 정책을 나타냅니다.

      CIPolicy가 없거나 허용되는 허용 목록 값인 경우 액세스를 허용합니다.

      CIPolicy가 있고 허용 목록 값이 아닌 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • 디바이스를 watch 목록에 배치하여 잠재적인 위험에 대해 디바이스를 보다 면밀히 모니터링합니다.
    • BootRevListInfo: 이 특성은 테스트된 디바이스에서 초기 부팅 중에 로드된 부팅 수정 목록을 식별합니다.

      reported BootRevListInfo 버전이 허용되는 값과 같으면 액세스를 허용합니다.

      reported BootRevListInfo 버전이 허용되는 값과 같지 않으면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • 디바이스를 엔터프라이즈 허니팟으로 보내 디바이스의 활동을 추가로 모니터링합니다.
    • OSRevListInfo: 이 특성은 테스트된 디바이스에서 초기 부팅 중에 로드된 운영 체제 수정 목록을 식별합니다.

      보고된 OSRevListInfo 버전이 허용되는 값과 같으면 액세스를 허용합니다.

      보고된 OSRevListInfo 버전이 허용되는 값과 같지 않으면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.

      • 모든 액세스를 허용하지 않습니다.
      • 디바이스를 엔터프라이즈 허니팟으로 보내 디바이스의 활동을 추가로 모니터링합니다.
    • HealthStatusMismatchFlags: DHA-Service 유효성 검사를 위해 디바이스 관리 솔루션에서 수신하는 DHA-Data 무결성 문제(불일치)를 감지하면 HealthStatusMismatchFlags 특성이 나타납니다.

      문제가 검색되면 영향을 받는 DHA 보고서 요소 목록이 HealthStatusMismatchFlags 특성 아래에 나열됩니다.

    DHA-Report 예제

    <?xml version="1.0" encoding="utf-8"?>
    <HealthCertificateValidationResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ErrorCode="0" ProtocolVersion="0"
    xmlns="http://schemas.microsoft.com/windows/security/healthcertificate/validation/response/v3">
    <HealthCertificateProperties>
         <Issued>2016-10-21T02:12:58.6656577Z</Issued>
         <AIKPresent>false</AIKPresent>
         <ResetCount>2107533174</ResetCount>
         <RestartCount>2749041230</RestartCount>
         <DEPPolicy>0</DEPPolicy>
         <BitlockerStatus>0</BitlockerStatus>
         <BootManagerRevListVersion>0</BootManagerRevListVersion>
         <CodeIntegrityRevListVersion>0</CodeIntegrityRevListVersion>
         <SecureBootEnabled>false</SecureBootEnabled>
         <BootDebuggingEnabled>false</BootDebuggingEnabled>
         <OSKernelDebuggingEnabled>false</OSKernelDebuggingEnabled>
         <CodeIntegrityEnabled>true</CodeIntegrityEnabled>
         <TestSigningEnabled>true</TestSigningEnabled>
         <SafeMode>false</SafeMode>
         <WinPE>false</WinPE>
         <ELAMDriverLoaded>true</ELAMDriverLoaded>
         <VSMEnabled>false</VSMEnabled>
         <PCRHashAlgorithmID>0</PCRHashAlgorithmID>
         <BootAppSVN>1</BootAppSVN>
         <BootManagerSVN>1</BootManagerSVN>
         <TpmVersion>2</TpmVersion>
         <PCR0>4ACCBE0ADB9627FFD6285C2E06EC5AC59ABF62C7</PCR0>
         <CIPolicy>00000000000001001A000B00200000005300690050006F006C006900630079002E007000370062000000A4BF7EF05585876A61CBFF7CAE8123BE756D58B1BBE04F9719D15D6271514CF5</CIPolicy>
         <BootRevListInfo>005D447A7CC6D101200000000B00CBB56E8B19267E24A2986C4A616CCB58B4D53F6020AC8FD5FC205C20F2AB00BC</BootRevListInfo>
         <OSRevListInfo>8073EEA7F8FAD001200000000B00A8285B04DE618ACF4174C59F07AECC002D11DD7D97FA5D464F190C9D9E3479BA</OSRevListInfo>
     </HealthCertificateProperties>
    </HealthCertificateValidationResponse>
    

    HealthAttestation CSP 상태 및 오류 코드

    오류 코드 오류 이름 오류 설명
    0 HEALTHATTESTATION_CERT_RETRIEVAL_UNINITIALIZED 이 상태는 DHA 세션에 참여한 적이 없는 디바이스의 초기 상태입니다.
    1 HEALTHATTESTATION_CERT_RETRIEVAL_REQUESTED 이 상태는 노드 VerifyHealth에 대한 MDM 클라이언트의 Exec 호출이 트리거되었고 이제 OS가 DHA-Server에서 DHA-EncBlob 검색하려고 했음을 의미합니다.
    2 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED 이 상태는 디바이스가 DHA-Server에서 DHA-EncBlob 검색하지 못했음을 의미합니다.
    3 HEALTHATTESTATION_CERT_RETRIEVAL_COMPLETE 이 상태는 디바이스가 DHA-Server에서 DHA-EncBlob 성공적으로 검색했음을 나타냅니다.
    4 HEALTHATTESTATION_CERT_RETRIEVAL_PCR_FAIL Windows 10 버전 1607에서는 사용되지 않습니다.
    5 HEALTHATTESTATION_CERT_RETRIEVAL_GETQUOTE_FAIL DHA-CSP가 클레임 견적을 얻지 못했습니다.
    6 HEALTHATTESTATION_CERT_RETRIEVAL_DEVICE_NOT_READY DHA-CSP가 Microsoft 플랫폼 암호화 공급자에 대한 핸들을 열지 못했습니다.
    7 HEALTHATTESTATION_CERT_RETRIEVAL_WINDOWS_AIK_FAIL Windows AIK 검색에 DHA-CSP 실패
    8 HEALTHATTESTATION_CERT_RETRIEVAL_FROM_WEB_FAIL Windows 10 버전 1607에서는 사용되지 않습니다.
    9 HEALTHATTESTATION_CERT_RETRIEVAL_INVALID_TPM_VERSION 잘못된 TPM 버전(TPM 버전이 1.2 또는 2.0이 아님)
    10 HEALTHATTESTATION_CERT_RETRIEVAL_GETNONCE_FAIL 레지스트리에서 Nonce를 찾을 수 없습니다.
    11 HEALTHATTESTATION_CERT_RETRIEVAL_GETCORRELATIONID_FAIL 레지스트리에서 상관 관계 ID를 찾을 수 없습니다.
    12 HEALTHATTESTATION_CERT_RETRIEVAL_GETCERT_FAIL Windows 10 버전 1607에서는 사용되지 않습니다.
    13 HEALTHATTESTATION_CERT_RETRIEVAL_GETCLAIM_FAIL Windows 10 버전 1607에서는 사용되지 않습니다.
    14 HEALTHATTESTATION_CERT_RETRIEVAL_ENCODING_FAIL 인코딩 함수의 실패입니다. (극히 드문 시나리오)
    15 HEALTHATTESTATION_CERT_RETRIEVAL_ENDPOINTOVERRIDE_FAIL Windows 10 버전 1607에서는 사용되지 않습니다.
    16 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_LOAD_XML DHA-CSP가 DHA-Service에서 받은 페이로드를 로드하지 못했습니다.
    17 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_CORRUPT_XML DHA-CSP는 DHA-Service에서 손상된 응답을 받았습니다.
    18 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_EMPTY DHA-CSP는 DHA-Service에서 빈 응답을 받았습니다.
    19 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_DECRYPT_AES_EK DHA-CSP는 EK 챌린지에서 AES 키를 해독하지 못했습니다.
    20 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_DECRYPT_CERT_AES_EK DHA-CSP가 AES 키를 사용하여 상태 인증서의 암호를 해독하지 못했습니다.
    21 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_EXPORT_AIKPUB DHA-CSP가 AIK 공개 키를 내보내지 못했습니다.
    22 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_CREATE_CLAIMAUTHORITYONLY DHA-CSP가 AIK 증명 데이터를 사용하여 클레임을 만들지 못했습니다.
    23 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_APPEND_AIKPUB 요청 Blob에 AIK Pub을 추가하는 데 DHA-CSP가 실패했습니다.
    24 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_APPEND_AIKCERT DHA-CSP가 요청 Blob에 AIK 인증서를 추가하지 못했습니다.
    25 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_INIT_HTTPHANDLE DHA-CSP가 세션 핸들을 가져오지 못했습니다.
    26 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_GETTARGET_HTTPHANDLE DHA-CSP가 DHA-Service에 연결하지 못했습니다.
    27 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_CREATE_HTTPHAND DHA-CSP가 HTTP 요청 핸들을 만들지 못했습니다.
    28 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_SET_INTERNETOPTION DHA-CSP에서 옵션을 설정하지 못했습니다.
    29 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_ADD_REQUESTHEADERS DHA-CSP에서 요청 헤더를 추가하지 못했습니다.
    30 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_SEND_REQUEST DHA-CSP가 HTTP 요청을 보내지 못했습니다.
    31 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_RECEIVE_RESPONSE DHA-CSP가 DHA-Service로부터 응답을 받지 못했습니다.
    32 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_QUERY_HEADERS DHA-CSP는 HTTP 상태 코드를 가져올 때 헤더를 쿼리하지 못했습니다.
    33 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_EMPTY_RESPONSE DHA-CSP는 HTTP 상태 확인되었지만 DHA-Service 빈 응답을 받았습니다.
    34 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_MISSING_RESPONSE DHA-CSP는 DHA-Service의 HTTP 오류 코드와 함께 빈 응답을 받았습니다.
    35 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_IMPERSONATE_USER DHA-CSP가 사용자를 가장하지 못했습니다.
    36 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_ACQUIRE_PDCNETWORKACTIVATOR DHA-CSP는 디바이스가 연결된 대기 모드에 있을 때 네트워크 통신에 필요한 PDC 활성화자를 획득하지 못했습니다.
    0xffff HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_UNKNOWN 알 수 없는 이유로 인해 DHA-CSP가 실패했습니다. 이 오류는 발생할 가능성이 매우 낮습니다.
    400 Bad_Request_From_Client DHA-CSP가 잘못된(잘못된 형식의) 증명 요청을 받았습니다.
    404 Endpoint_Not_Reachable DHA-CSP에서 DHA-Service 연결할 수 없음

    보안 고려 사항

    DHA는 TPM 및 해당 측정값에 대한 신뢰를 고정합니다. TPM 측정값을 스푸핑하거나 변조할 수 있는 경우 DHA는 해당 디바이스에 대한 디바이스 상태를 보장할 수 없습니다.

    자세한 내용은 PC 클라이언트 TPM 인증을 참조하세요.

    구성 서비스 공급자 참조