학습
인증
Microsoft 365 Certified: Endpoint Administrator Associate - Certifications
최신 관리, 공동 관리 접근 방식 및 Microsoft Intune 통합의 필수 요소를 사용하여 엔드포인트 배포 전략을 계획하고 실행합니다.
중요
이 CSP에는 개발 중인 일부 설정이 포함되어 있으며 Windows Insider Preview 빌드에만 적용됩니다. 이러한 설정은 변경될 수 있으며 미리 보기의 다른 기능 또는 서비스에 대한 종속성이 있을 수 있습니다.
DHA-CSP(Device HealthAttestation 구성 서비스 공급자)를 사용하면 엔터프라이즈 IT 관리자가 디바이스가 신뢰할 수 있고 규격 상태로 부팅되었는지 평가하고 엔터프라이즈 정책 작업을 수행할 수 있습니다.
다음 목록은 Device HealthAttestation CSP에서 수행하는 함수에 대한 설명입니다.
다음 목록에서는 HealthAttestation 구성 서비스 공급자 노드를 보여 줍니다.
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ IoT Enterprise/IoT Enterprise LTSC |
✅Windows 11, 버전 22H2 및 KB5046732 [10.0.22621.4541] 이상 ✅Windows 11 버전 24H2 및 KB5046617 [10.0.26100.2314] 이상 ✅Windows Insider Preview |
./Vendor/MSFT/HealthAttestation/AttestErrorMessage
증명 서비스에서 반환된 경우 AttestErrorMessage는 마지막 증명 세션에 대한 오류 메시지를 유지 관리합니다.
설명 프레임워크 속성:
속성 이름 | 속성 값 |
---|---|
형식 |
chr (문자열) |
액세스 유형 | 가져오기 |
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ 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
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ IoT Enterprise/IoT Enterprise LTSC |
✅Windows 10 버전 1511 [10.0.10586] 이상 |
./Vendor/MSFT/HealthAttestation/Certificate
DHA-CSP에 MDM 서버에 DHA-Data 전달하도록 지시합니다.
값 형식은 base64 문자열입니다.
설명 프레임워크 속성:
속성 이름 | 속성 값 |
---|---|
형식 |
chr (문자열) |
액세스 유형 | 가져오기 |
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ IoT Enterprise/IoT Enterprise LTSC |
✅Windows 10 버전 1511 [10.0.10586] 이상 |
./Vendor/MSFT/HealthAttestation/CorrelationID
고유한 디바이스 상태 증명 세션을 식별합니다. CorrelationId는 디버그 및 문제 해결을 위해 DHA-Service 로그를 MDM 서버 이벤트 및 클라이언트 이벤트 로그와 상호 연결하는 데 사용됩니다.
설명 프레임워크 속성:
속성 이름 | 속성 값 |
---|---|
형식 |
chr (문자열) |
액세스 유형 | 가져오기 |
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ IoT Enterprise/IoT Enterprise LTSC |
✅Windows 10 버전 1709 [10.0.16299] 이상 |
./Vendor/MSFT/HealthAttestation/CurrentProtocolVersion
클라이언트가 상태 증명 서비스와 통신하는 데 사용하는 현재 프로토콜 버전을 제공합니다.
설명 프레임워크 속성:
속성 이름 | 속성 값 |
---|---|
형식 | int |
액세스 유형 | 가져오기 |
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ 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 | 참. |
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ 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.
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ 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.
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ 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. |
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ IoT Enterprise/IoT Enterprise LTSC |
✅Windows 10 버전 1709 [10.0.16299] 이상 |
./Vendor/MSFT/HealthAttestation/MaxSupportedProtocolVersion
이 클라이언트가 지원할 수 있는 최대 프로토콜 버전을 반환합니다.
설명 프레임워크 속성:
속성 이름 | 속성 값 |
---|---|
형식 | int |
액세스 유형 | 가져오기 |
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ 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 |
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ IoT Enterprise/IoT Enterprise LTSC |
✅Windows 10 버전 1709 [10.0.16299] 이상 |
./Vendor/MSFT/HealthAttestation/PreferredMaxProtocolVersion
클라이언트가 통신하도록 구성된 최대 기본 프로토콜 버전을 제공합니다. 클라이언트에서 지원하는 프로토콜 버전보다 높은 경우 사용 가능한 가장 높은 프로토콜 버전을 사용합니다.
설명 프레임워크 속성:
속성 이름 | 속성 값 |
---|---|
형식 | int |
액세스 유형 | 가져오기, 바꾸기 |
기본 값 | 3 |
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ IoT Enterprise/IoT Enterprise LTSC |
✅Windows 10 버전 1511 [10.0.10586] 이상 |
./Vendor/MSFT/HealthAttestation/Status
디바이스 상태 요청의 현재 상태 제공합니다. 상태 값의 전체 목록은 HealthAttestation CSP 상태 및 오류 코드를 참조하세요.
설명 프레임워크 속성:
속성 이름 | 속성 값 |
---|---|
형식 | int |
액세스 유형 | 가져오기 |
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ IoT Enterprise/IoT Enterprise LTSC |
✅Windows 10, 버전 1607 [10.0.14393] 이상 |
./Vendor/MSFT/HealthAttestation/TpmReadyStatus
TPM 상태를 설명하는 정보의 비트 마스크를 반환합니다. 디바이스의 TPM이 준비되고 신뢰할 수 있는 상태인지 여부를 나타냅니다.
설명 프레임워크 속성:
속성 이름 | 속성 값 |
---|---|
형식 | int |
액세스 유형 | 가져오기 |
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ 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>
데이터 필드:
샘플 <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"
}
범위 | 에디션 | 적용 가능한 OS |
---|---|---|
✅ 장치 ❌ 사용자 |
✅ 프로 ✅ Enterprise ✅ Education ✅ IoT Enterprise/IoT Enterprise LTSC |
✅Windows 10 버전 1511 [10.0.10586] 이상 |
./Vendor/MSFT/HealthAttestation/VerifyHealth
디바이스에 디바이스 상태 확인 요청을 준비하도록 알 수 있습니다.
설명 프레임워크 속성:
속성 이름 | 속성 값 |
---|---|
형식 | null |
액세스 유형 | Exec |
Windows 11 디바이스 상태 증명 기능에 대한 업데이트를 소개합니다. 이 업데이트는 디바이스 보안에 대한 제로 트러스트 접근 방식을 지원하여 Windows 부팅 보안에 대한 심층적인 인사이트를 지원하는 데 도움이 됩니다. Windows의 디바이스 상태 증명은 HealthAttestation CSP를 사용하여 액세스할 수 있습니다. 이 CSP는 디바이스가 신뢰할 수 있고 규격 상태로 부팅되었는지 평가한 다음 적절한 조치를 취하는 데 도움이 됩니다. Windows 11 MDM 공급자가 Microsoft Azure Attestation 서비스에 연결할 수 있도록 HealthAttestation 노드에 더 많은 자식 노드를 도입하여 증명에 대한 간소화된 접근 방식을 제공합니다.
증명 보고서는 디바이스가 전원을 켜는 즉시 자동으로 보호되도록 디바이스의 부팅 시간 속성에 대한 상태 평가를 제공합니다. 그러면 상태 증명 결과를 사용하여 디바이스 상태에 따라 네트워크, 앱 또는 서비스에 대한 액세스를 허용하거나 거부할 수 있습니다.
사용된 용어:
증명 흐름은 세 가지 기본 단계로 광범위하게 수행할 수 있습니다.
자세한 내용은 증명 프로토콜을 참조하세요.
MAA 공급자 설정 instance: 빠른 시작: Azure Portal 사용하여 Azure Attestation 설정의 단계에 따라 MAA instance 만들 수 있습니다.
적절한 정책으로 공급자 업데이트: 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]")));
};
및 Azure Active Directory token
를 사용하여 TriggerAttestationrpid
을 호출하고attestURI
: 1단계에서 생성된 증명 URL을 사용하고 적중하려는 적절한 api 버전을 추가합니다. api 버전에 대한 자세한 내용은 증명 - 증명 Tpm - REST API를 참조하세요.
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 여기에서 확인할 수 있습니다.
사용된 용어:
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 세션 데이터(Device HealthAttestation 세션 데이터): 다음 데이터 목록은 하나의 DHA 트랜잭션에서 생성되거나 사용됩니다.
DHA 지원 MDM(Device HealthAttestation이 설정된 디바이스 관리 솔루션): 디바이스 HealthAttestation enabled(DHA 사용) 디바이스 관리 솔루션은 DHA 기능과 통합된 디바이스 관리 도구입니다. DHA-Enabled 디바이스 관리 솔루션을 사용하면 엔터프라이즈 IT 관리자가 고급 보안 위협에 의해 디바이스가 손상되거나 악성(탈옥) 운영 체제를 실행하더라도 신뢰할 수 있는 TPM(하드웨어) 보호 데이터를 기반으로 관리되는 디바이스에 대한 보안 보호 표시줄을 높일 수 있습니다. 다음 작업 목록은 DHA-Enabled-MDM에서 수행됩니다.
DHA-CSP(Device HealthAttestation Configuration Service Provider): DHA-CSP(Device HealthAttestation Configuration Service Provider)는 디바이스의 TPM 및 펌웨어를 사용하여 디바이스의 BIOS 및 Windows 부팅의 중요한 보안 속성을 측정하므로 커널 수준 맬웨어 또는 루트킷에 감염된 시스템에서도 이러한 속성을 스푸핑할 수 없습니다. 다음 작업 목록은 DHA-CSP에서 수행됩니다.
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-Service 형식 | 설명 | 작업 비용 |
---|---|---|
디바이스 상태 증명 - 클라우드(DHA-Cloud) | DHA-Cloud Microsoft 소유 및 운영 DHA-Service 다음과 같습니다.
|
비용 없음 |
디바이스 상태 증명 - 온-프레미스(DHA-OnPrem) | DHA-OnPrem 온-프레미스에서 실행되는 DHA-Service 나타냅니다.
|
서버 2016 온-프레미스 인스턴스를 하나 이상 실행하는 데 드는 작업 비용입니다. |
디바이스 상태 증명 - Enterprise-Managed Cloud(DHA-EMC) | DHA-EMC는 Microsoft Azure와 같은 엔터프라이즈 관리형 클라우드 서비스에서 호환되는 Windows Server 2016 가상 호스트/서비스로 실행되는 엔터프라이즈 관리형 DHA-Service 나타냅니다.
|
Microsoft Azure와 같은 호환되는 클라우드 서비스에서 Server 2016을 실행하는 데 드는 작업 비용입니다. |
Microsoft Device Health 증명 기능을 Windows Mobile MDM(디바이스 관리 솔루션)과 통합하려면 다음 유효성 검사 및 개발 작업 목록이 필요합니다.
각 단계는 이 항목의 다음 섹션에서 자세히 설명합니다.
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)
DHA-Service에는 다음 세 가지 유형이 있습니다.
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>
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>
클라이언트가 상태 증명 요청을 받은 후 응답을 보냅니다. 다음 목록에서는 권장되는 작업과 함께 응답에 대해 설명합니다.
다음은 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>
Nonce, Certificate 및 CorrelationId 노드에 대한 호출을 만들고 디바이스에서 상태 인증서 및 관련 데이터를 포함하는 암호화된 페이로드를 선택합니다.
예를 들면 다음과 같습니다.
<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>
이전 단계에서 전송된 요청에 대한 응답으로 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)합니다.
https://has.spserv.microsoft.com/DeviceHealthAttestation/ValidateHealthCertificate/v3
https://FullyQualifiedDomainName-FDQN/DeviceHealthAttestation/ValidateHealthCertificate/v3
Microsoft 디바이스 상태 증명 서비스에서 확인 요청을 받으면 다음 단계를 수행합니다.
MDM 서버가 확인된 데이터를 수신한 후에는 데이터를 평가하여 정책을 결정하는 데 정보를 사용할 수 있습니다. 몇 가지 가능한 작업은 다음과 같습니다.
<?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)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
ResetCount (TPM 2.0을 지원하는 디바이스에 대해서만 보고됨): 이 특성은 PC 디바이스가 최대 절전 모드 또는 다시 시작된 횟수를 보고합니다.
RestartCount (TPM 2.0을 지원하는 디바이스에 대해서만 보고됨): 이 특성은 PC 디바이스가 다시 부팅된 횟수를 보고합니다.
DEPPolicy: 디바이스에서 DEP 정책을 사용하는 경우 디바이스를 더 신뢰할 수 있습니다.
DEP(데이터 실행 방지) 정책은 시스템에서 악성 코드가 실행되지 않도록 메모리에 대한 추가 검사를 수행하는 하드웨어 및 소프트웨어 기술 집합을 정의합니다. 보안 부팅을 사용하면 x86/amd64에서 제한된 목록을 허용하고 ARM NTOS에서 잠금을 켭니다.
WMI 또는 PowerShell 스크립트에서 다음 명령을 사용하여 DEPPolicy를 사용하지 않도록 설정하거나 사용하도록 설정할 수 있습니다.
DEPPolicy = 1(켜기)이면 액세스를 허용합니다.
DEPPolicy = 0(끄기)이면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
DEP 정책 평가는 쿼리할 때 이진이 아닌 상태. 그런 다음 켜기/끄기 상태로 매핑됩니다.
DEP 정책 수준 | 설명 | 증명 보고된 수준 | 속성 값 |
---|---|---|---|
OptIn(기본 구성) | Windows 시스템 구성 요소 및 서비스만 DEP를 적용했습니다. | 0 | 2 |
옵트아웃 | 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(끄기)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
BootManagerRevListVersion: 이 특성은 부팅 시퀀스/환경의 보안을 추적하고 관리할 수 있도록 디바이스에서 실행되는 부팅 관리자의 버전을 나타냅니다.
BootManagerRevListVersion = [CurrentVersion]인 경우 액세스를 허용합니다.
= [CurrentVersion]인 경우 BootManagerRevListVersion !
엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
CodeIntegrityRevListVersion: 이 특성은 부팅 시퀀스 중에 무결성 검사를 수행하는 코드의 버전을 나타냅니다. 이 특성을 사용하면 디바이스가 무결성 검사를 수행하는 최신 버전의 코드를 실행하고 있는지 또는 보안 위험에 노출되었는지(해지됨) 감지하고 적절한 정책 작업을 적용하는 데 도움이 될 수 있습니다.
CodeIntegrityRevListVersion = [CurrentVersion]이면 액세스를 허용합니다.
= [CurrentVersion]인 경우 CodeIntegrityRevListVersion !
엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
SecureBootEnabled: 보안 부팅을 사용하도록 설정하면 컴퓨터를 부팅하는 데 사용되는 핵심 구성 요소에는 디바이스를 제조한 organization 신뢰할 수 있는 올바른 암호화 서명이 있어야 합니다. UEFI 펌웨어는 머신을 시작하기 전에 이 요구 사항을 확인합니다. 파일이 변조되어 서명이 끊어지면 시스템이 부팅되지 않습니다.
SecureBootEnabled = 1(True)이면 액세스를 허용합니다.
SecurebootEnabled = 0(False)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
BootDebuggingEnabled: 부팅 디버그 사용은 개발 및 테스트에 사용되는 디바이스를 가리킵니다. 테스트 및 개발에 사용되는 디바이스는 일반적으로 보안이 떨어집니다. 디바이스는 불안정한 코드를 실행하거나 테스트 및 개발에 필요한 더 적은 보안 제한으로 구성할 수 있습니다.
WMI 또는 PowerShell 스크립트에서 다음 명령을 사용하여 부팅 디버깅을 사용하지 않도록 설정하거나 사용하도록 설정할 수 있습니다.
BootdebuggingEnabled = 0(False)이면 액세스를 허용합니다.
BootDebuggingEnabled = 1(True)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
OSKernelDebuggingEnabled: OSKernelDebuggingEnabled는 개발 및 테스트에 사용되는 디바이스를 가리킵니다. 테스트 및 개발에 사용되는 디바이스는 일반적으로 보안이 떨어집니다. 불안정한 코드를 실행하거나 테스트 및 개발에 필요한 보안 제한을 줄이면서 구성할 수 있습니다.
OSKernelDebuggingEnabled = 0(False)인 경우 액세스를 허용합니다.
OSKernelDebuggingEnabled = 1(True)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
CodeIntegrityEnabled: 코드 무결성을 사용하도록 설정하면 코드 실행이 무결성 확인 코드로 제한됩니다.
코드 무결성은 메모리에 로드될 때마다 드라이버 또는 시스템 파일의 무결성을 검사하는 기능입니다. 코드 무결성은 서명되지 않은 드라이버 또는 시스템 파일이 커널에 로드되고 있는지 또는 관리자 권한이 있는 사용자 계정에서 실행하는 악성 소프트웨어에 의해 시스템 파일이 수정되었는지 여부를 검색합니다.
x64 기반 버전의 운영 체제에서는 커널 모드 드라이버를 디지털 서명해야 합니다.
CodeIntegrityEnabled = 1(True)이면 액세스를 허용합니다.
CodeIntegrityEnabled = 0(False)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
TestSigningEnabled: 테스트 서명을 사용하도록 설정하면 디바이스는 부팅 중에 서명 유효성 검사를 적용하지 않으며, 부팅하는 동안 서명되지 않은 드라이버(예: 서명되지 않은 UEFI 모듈)를 로드할 수 있습니다.
WMI 또는 PowerShell 스크립트에서 다음 명령을 사용하여 테스트 서명을 사용하지 않도록 설정하거나 사용하도록 설정할 수 있습니다.
TestSigningEnabled = 0(False)인 경우 액세스를 허용합니다.
TestSigningEnabled = 1(True)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
SafeMode: 안전 모드는 제한된 상태에서 컴퓨터를 시작하는 Windows의 문제 해결 옵션입니다. Windows를 실행하는 데 필요한 기본 파일 및 드라이버만 시작됩니다.
SafeMode = 0(False)인 경우 액세스를 허용합니다.
SafeMode = 1(True)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
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)을 사용해야 하는 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
VSMEnabled: VSM(가상 보안 모드)은 손상된 커널로부터 높은 가치의 자산을 보호하는 컨테이너입니다. VSM에는 약 1GB의 메모리가 필요합니다. 모든 인증 조정에 사용되는 LSA 서비스를 실행할 수 있는 충분한 기능이 있습니다.
VSM은 WMI 또는 PowerShell 스크립트에서 다음 명령을 사용하여 사용하도록 설정할 수 있습니다.
bcdedit.exe /set {current} vsmlaunchtype auto
VSMEnabled = 1(True)이면 액세스를 허용합니다. VSMEnabled = 0(False)인 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
PCRHashAlgorithmID: 이 특성은 TPM에서 사용한 HASH 알고리즘을 식별하는 정보 특성입니다. 규정 준수 작업이 필요하지 않습니다.
BootAppSVN: 이 특성은 테스트된 디바이스에서 초기 부팅 중에 로드된 부팅 애플리케이션의 보안 버전 번호를 식별합니다.
보고된 BootAppSVN이 허용되는 값과 같으면 액세스를 허용합니다.
Reported BootAppSVN이 허용되는 값과 같지 않으면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
BootManagerSVN: 이 특성은 테스트된 디바이스에서 초기 부팅 중에 로드된 부팅 관리자의 보안 버전 번호를 식별합니다.
reported BootManagerSVN이 허용되는 값과 같으면 액세스를 허용합니다.
보고된 BootManagerSVN이 허용되는 값과 같지 않으면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
TPMVersion: 이 특성은 테스트된 디바이스에서 실행 중인 TPM의 버전을 식별합니다. TPMVersion 노드는 회신 "1" 및 "2"를 제공합니다.
TPMVersion 노드에서 받은 회신에 따라:
PCR0: PCR[0]에서 캡처되는 측정값은 일반적으로 부팅 주기 간의 호스트 플랫폼에 대한 일관된 보기를 나타냅니다. 호스트 플랫폼 제조업체에서 제공하는 구성 요소의 측정값을 포함합니다.
엔터프라이즈 관리자는 신뢰할 수 있는 PCR[0] 값의 허용 목록을 만들고, 관리 디바이스의 PCR[0] 값(HAS에서 확인 및 보고한 값)을 허용 목록과 비교한 다음 비교 결과에 따라 신뢰 결정을 내릴 수 있습니다.
엔터프라이즈에 허용된 PCR[0] 값의 허용 목록이 없는 경우 아무 작업도 수행하지 않습니다. PCR[0]이 허용 허용 목록 값과 같으면 액세스를 허용합니다.
PCR[0]이 허용되는 나열된 값과 같지 않으면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
SBCPHash: SBCPHash는 PC를 제외한 Windows 디바이스에서 부팅하는 동안 로드된 SBCP(사용자 지정 보안 부팅 구성 정책)의 지문입니다.
SBCPHash가 없거나 허용되는 허용 목록 값인 경우 액세스를 허용합니다.
SBCPHash가 DHA-Report에 있고 허용 목록 값이 아닌 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
CIPolicy: 이 특성은 부팅 환경의 보안을 제어하는 코드 무결성 정책을 나타냅니다.
CIPolicy가 없거나 허용되는 허용 목록 값인 경우 액세스를 허용합니다.
CIPolicy가 있고 허용 목록 값이 아닌 경우 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
BootRevListInfo: 이 특성은 테스트된 디바이스에서 초기 부팅 중에 로드된 부팅 수정 목록을 식별합니다.
reported BootRevListInfo 버전이 허용되는 값과 같으면 액세스를 허용합니다.
reported BootRevListInfo 버전이 허용되는 값과 같지 않으면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
OSRevListInfo: 이 특성은 테스트된 디바이스에서 초기 부팅 중에 로드된 운영 체제 수정 목록을 식별합니다.
보고된 OSRevListInfo 버전이 허용되는 값과 같으면 액세스를 허용합니다.
보고된 OSRevListInfo 버전이 허용되는 값과 같지 않으면 엔터프라이즈 정책에 맞는 다음 작업 중 하나를 수행합니다.
HealthStatusMismatchFlags: DHA-Service 유효성 검사를 위해 디바이스 관리 솔루션에서 수신하는 DHA-Data 무결성 문제(불일치)를 감지하면 HealthStatusMismatchFlags 특성이 나타납니다.
문제가 검색되면 영향을 받는 DHA 보고서 요소 목록이 HealthStatusMismatchFlags 특성 아래에 나열됩니다.
<?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>
오류 코드 | 오류 이름 | 오류 설명 |
---|---|---|
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 인증을 참조하세요.
학습
인증
Microsoft 365 Certified: Endpoint Administrator Associate - Certifications
최신 관리, 공동 관리 접근 방식 및 Microsoft Intune 통합의 필수 요소를 사용하여 엔드포인트 배포 전략을 계획하고 실행합니다.
설명서
DeviceStatus CSP에 대해 자세히 알아보세요.
자세히 알아보기: 디바이스 상태 증명