共用方式為


HealthAttestation CSP

Windows 測試人員的標誌。

重要

此 CSP 包含一些正在開發且僅適用于 Windows Insider Preview 組建 的設定。 這些設定可能會變更,而且可能相依于預覽中的其他功能或服務。

裝置健康狀態安裝設定服務提供者 (DHA-CSP) 可讓企業 IT 系統管理員評估裝置是否已開機到受信任且符合規範的狀態,並採取企業原則動作。

下列清單說明裝置 HealthAttestation CSP 所執行的函式:

  • 從受控裝置收集裝置開機記錄、信賴平臺模組 (TPM) 稽核記錄和 TPM 憑證 (DHA-BootData)
  • 將 DHA-BootData 轉送至裝置健康情況證明服務 (DHA-Service)
  • 從 DHA-Service 接收已加密的 Blob (DHA-EncBlob) ,並將它儲存在裝置上的本機快取中
  • 接收來自 DHA-Enabled MDM (DHA-Requests) 的證明要求,並使用裝置健康情況證明數據 (DHA-Data)

下列清單顯示 HealthAttestation 設定服務提供者節點:

AttestErrorMessage

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows Insider Preview
./Vendor/MSFT/HealthAttestation/AttestErrorMessage

如果證明服務傳回,AttestErrorMessage 會維護最後一個證明會話的錯誤訊息。

描述架構屬性:

屬性名稱 屬性值
格式 chr (字串)
存取類型 [取得]

AttestStatus

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 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
    

憑證

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 10,版本 1511 [10.0.10586] 和更新版本
./Vendor/MSFT/HealthAttestation/Certificate

指示 DHA-CSP 將 DHA-Data 轉送到 MDM 伺服器。

實值類型是base64字串。

描述架構屬性:

屬性名稱 屬性值
格式 chr (字串)
存取類型 [取得]

CorrelationID

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 10,版本 1511 [10.0.10586] 和更新版本
./Vendor/MSFT/HealthAttestation/CorrelationID

識別唯一的裝置健康情況證明會話。 CorrelationId 可用來將 DHA-Service 記錄與 MDM 伺服器事件和用戶端事件記錄檔相互關聯,以進行偵錯和疑難解答。

描述架構屬性:

屬性名稱 屬性值
格式 chr (字串)
存取類型 [取得]

CurrentProtocolVersion

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 10,版本 1709 [10.0.16299] 和更新版本
./Vendor/MSFT/HealthAttestation/CurrentProtocolVersion

提供客戶端用來與健康情況證明服務通訊的目前通訊協定版本。

描述架構屬性:

屬性名稱 屬性值
格式 int
存取類型 [取得]

ForceRetrieve

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 10,版本 1511 [10.0.10586] 和更新版本
./Vendor/MSFT/HealthAttestation/ForceRetrieve

指示用戶端起始對 DHA-Service 的新要求,並取得新的 DHA-EncBlob (由 DHA-Service) 發出的開機狀態摘要。 只有在 MDM 伺服器強制執行憑證有效期限原則時,才應該使用此選項,此原則需要強制裝置從 DHA-Service 取得全新加密的 Blob。

描述架構屬性:

屬性名稱 屬性值
格式 bool
存取類型 取得、取代
預設值 False

允許的值:

描述
false (預設) 假。
true 真。

GetAttestReport

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 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

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 11 版本 21H2 [10.0.22000] 和更新版本
./Vendor/MSFT/HealthAttestation/GetServiceCorrelationIDs

如果存在,請擷取服務相互關聯標識碼。

如果有多個相互關聯標識碼,它們在字串中會以 “;” 分隔。

描述架構屬性:

屬性名稱 屬性值
格式 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

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 10,版本 1511 [10.0.10586] 和更新版本
./Vendor/MSFT/HealthAttestation/HASEndpoint

識別指派來執行證明之 DHA-Service 的完整功能變數名稱 (FQDN) 。 如果未指派 FQDN,DHA-Cloud (Microsoft 擁有和營運的雲端服務) 將作為預設證明服務。

描述架構屬性:

屬性名稱 屬性值
格式 chr (字串)
存取類型 取得、取代
預設值 has.spserv.microsoft.com。

MaxSupportedProtocolVersion

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 10,版本 1709 [10.0.16299] 和更新版本
./Vendor/MSFT/HealthAttestation/MaxSupportedProtocolVersion

傳回此客戶端可支援的最大通訊協定版本。

描述架構屬性:

屬性名稱 屬性值
格式 int
存取類型 [取得]

Nonce

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 10,版本 1511 [10.0.10586] 和更新版本
./Vendor/MSFT/HealthAttestation/Nonce

可讓 MDM 使用 MDM 伺服器所產生的密碼保護隨機值,保護裝置健康情況證明通訊不受攔截式類型 (MITM) 攻擊。 nonce 是十六進位格式,大小下限為 8 個字節,大小上限為 32 個字節。

描述架構屬性:

屬性名稱 屬性值
格式 chr (字串)
存取類型 取得、取代
預設值 \0

PreferredMaxProtocolVersion

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 10,版本 1709 [10.0.16299] 和更新版本
./Vendor/MSFT/HealthAttestation/PreferredMaxProtocolVersion

提供客戶端設定要進行通訊的最大慣用通訊協定版本。 如果這高於用戶端支援的通訊協定版本,則會使用可用的最高通訊協定版本。

描述架構屬性:

屬性名稱 屬性值
格式 int
存取類型 取得、取代
預設值 3

狀態

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 10 版本 1511 [10.0.10586] 和更新版本
./Vendor/MSFT/HealthAttestation/Status

提供裝置健康情況要求的目前狀態。 如需狀態值的完整清單,請參閱 HealthAttestation CSP 狀態和錯誤碼

描述架構屬性:

屬性名稱 屬性值
格式 int
存取類型 [取得]

TpmReadyStatus

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 10,版本 1607 [10.0.14393] 和更新版本
./Vendor/MSFT/HealthAttestation/TpmReadyStatus

傳回描述 TPM 狀態的資訊位掩碼。 它會指出裝置的 TPM 是否處於就緒且受信任的狀態。

描述架構屬性:

屬性名稱 屬性值
格式 int
存取類型 [取得]

TriggerAttestation

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 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 證明 提供者實例的完整 URL。
    • nonce:此欄位包含的任意數位只能在密碼編譯通訊中使用一次。 這通常是在驗證通訊協定中發出的隨機或虛擬隨機數位,以確保無法在重新執行攻擊中重複使用舊通訊。
    • aadToken:要用於對 Microsoft Azure 證明 服務進行驗證的 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

領域 版本 適用的作業系統
✅ 裝置
❌ 使用者
✅ 專業版
✅ 企業版
✅ 教育版
✅ Windows SE
✅ IoT 企業版 / IoT 企業版 LTSC
✅Windows 10 版本 1511 [10.0.10586] 和更新版本
./Vendor/MSFT/HealthAttestation/VerifyHealth

通知裝置準備裝置健康情況驗證要求。

描述架構屬性:

屬性名稱 屬性值
格式 null
存取類型 Exec

Windows 11 裝置健康情況證明

Windows 11 引進裝置健康情況證明功能的更新。 此更新有助於為 Windows 開機安全性新增更深入見解的支持,支援裝置安全性的零信任方法。 您可以使用 HealthAttestation CSP 來存取 Windows 上的裝置健康情況證明。 此 CSP 可協助評估裝置是否已開機至受信任且符合規範的狀態,然後採取適當的動作。 Windows 11 會將更多子節點導入到 HealthAttestation 節點,讓 MDM 提供者連線到 Microsoft Azure 證明 服務,以提供簡化的證明方法。

證明報告會提供裝置開機時間屬性的健康情況評估,以確保裝置在開機時就會自動受到保護。 健康情況證明結果接著可以用來允許或拒絕網路、應用程式或服務的存取,視裝置的健康情況而定。

使用的字詞:

  • TPM (信賴平臺模組) :TPM 是特殊的硬體保護邏輯,可執行一系列受硬體保護的安全性作業,包括提供受保護的記憶體、隨機數產生、加密和簽署。
  • DHA (裝置健康狀態][自動) 功能:裝置健康狀態][自動 (DHA) ] 功能可讓企業 IT 系統管理員使用硬體 (TPM,透過防竄改和防竄改通道,從遠端監視受控裝置的安全性狀態) 受保護和證明的數據。
  • MAA-Session (Microsoft Azure 證明 服務型裝置 HealthAttestation 會話) :Microsoft Azure 證明 服務型裝置 HealthAttestation 會話 (MAA-Session) 描述在一個裝置健康情況證明會話中執行的端對端通訊流程。
  • MAA-CSP 節點 (Microsoft Azure 證明 型設定服務提供者) :新增到 Windows 11 的設定服務提供者節點,以與 Microsoft Azure 證明 Service 整合。 MAA-CSP 會執行下列作業清單:
    • 從已啟用 HealthAttestation 的 MDM 提供者接收證明觸發程式要求。
    • 裝置會從受控裝置收集證明辨識項 (裝置開機記錄、TPM 稽核記錄和 TPM 憑證) 。
    • 將證明辨識項轉送至 MDM 提供者所設定的 Azure 證明 服務實例。
    • 從 Azure 證明 Service 實例接收已簽署的報表,並將它儲存在裝置上的本機快取中。
  • MAA 端點:Microsoft Azure 證明服務是 Azure 資源,而服務的每個實例都會取得系統管理員設定的 URL。 產生的 URI 本質上是唯一的,而且基於裝置健康情況證明的目的,稱為 MAA 端點。
  • JWT (JSON Web 令牌) :JSON Web 令牌 (JWT) 是開放式標準RFC7519方法,可將合作對象之間的資訊安全地傳輸為 JavaScript 物件表示法 (JSON) 物件。 這項資訊可以經過驗證和信任,因為它經過數字簽署。 JWT 可以使用秘密或公開/私鑰組來簽署。

Microsoft Azure 證明 Service 的證明流程

Microsoft Azure 證明 Service 的證明流程

證明流程大致上可在三個主要步驟中執行:

  • Azure 證明 服務的實例是使用適當的證明原則來設定。 證明原則可讓 MDM 提供者證明開機中的特定事件,以及安全性功能。
  • MDM 提供者會觸發對證明服務的呼叫,然後裝置會執行證明檢查,讓報表隨時可供擷取。
  • MDM 提供者在確認令牌來自證明服務之後,可以剖析證明令牌,以反映裝置的證明狀態。

如需詳細資訊,請 參閱證明通訊協定

MAA CSP 整合步驟

  1. 設定 MAA 提供者實例:您可以遵循快速入門:使用 Azure 入口網站 設定 Azure 證明 中的步驟來建立 MAA 實例。

  2. 使用適當的原則更新提供者:MAA 實例應該以適當的原則進行更新。 如需詳細資訊,請參閱如何撰寫 Azure 證明 原則

    範例證明原則:

    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. 使用 您的 rpidAzure Active Directory tokenattestURI和呼叫 TriggerAttestation:使用步驟 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 證明

Windows 10 裝置健康情況][自動安裝]

使用的字詞:

  • TPM (信賴平臺模組) :TPM 是特殊的硬體保護邏輯,可執行一系列受硬體保護的安全性作業,包括提供受保護的記憶體、隨機數產生、加密和簽署。

  • DHA (裝置健康狀態][自動) 功能:裝置健康狀態][自動 (DHA) ] 功能可讓企業 IT 系統管理員使用硬體 (TPM,透過防竄改和防竄改通道,從遠端監視受控裝置的安全性狀態) 受保護和證明的數據。

  • 已啟用 DHA 功能的裝置 (已啟用裝置健康狀態][自動) : (啟用 DHA 功能的裝置) 裝置是 (手機、桌面電腦、膝上型電腦、平板計算機、伺服器) 的運算裝置,可執行 Windows 10 並支援 TPM 1.2 或 2.0 版。

  • DHA-Session (Device HealthAttestation 會話) :DHA 會話 (裝置健康情況驗證會話) 描述在一個裝置健康情況證明會話中執行的端對端通訊流程。 下列交易清單是在一個 DHA 工作階段中執行:

    DHA 工作階段健全狀況會話圖表

    • DHA-CSP 和 DHA-Service 通訊:
      • DHA-CSP 會將裝置開機數據 (DHA-BootData) 轉送至 DHA-Service
      • DHA-Service 使用加密數據 Blob (DHA-EncBlob)
    • DHA-CSP 和 MDM-Server 通訊:
      • MDM-Server 將裝置健康情況驗證要求傳送至 DHA-CSP
      • DHA-CSP 會使用稱為 DHA-Data 的承載進行回復,其中包含加密的 (DHA-EncBlob) 和已簽署的 (DHA-SignedBlob) 數據 Blob
    • MDM-Server 和 DHA-Service 通訊:
      • MDM-Server 從裝置收到的數據張貼到 DHA-Service
      • DHA-Service 檢閱其收到的數據,並以裝置健康情況報告 (DHA-Report)
  • 裝置健康狀態會話資料 (DHA 工作階段資料) :下列資料清單會在一個 DHA 交易中產生或取用:

    • DHA-BootData:驗證裝置開機健康情況所需的裝置開機數據 (TCG 記錄、PCR 值、裝置/TPM 憑證、開機和 TPM 計數器) 。
    • DHA-EncBlob:加密的摘要報告,會在檢閱從裝置收到的 DHA-BootData 之後,DHA-Service 裝置發生問題。
    • DHA-SignedBlob:這是 DHA-CSP 在裝置健康情況證明時間擷取的裝置運行時間目前狀態的已簽署快照集。
    • DHA-Data:XML 格式化的數據 Blob,裝置會透過 MDM-Server 轉送裝置健康情況驗證以 DHA-Service。 DHA-Data 有兩個部分:
      • DHA-EncBlob:裝置從 DHA-Service 接收的加密數據 Blob
      • DHA-SignedBlob:DHA-CSP 所產生裝置目前安全性狀態的目前快照集
    • DHA-Report:由 DHA-Service 發出以 MDM-Server
    • Nonce:MDM-Server 所產生的密碼編號,可保護 DHA-Session 免於攔截式攻擊
  • 已啟用 DHA 功能的 MDM (已啟用裝置健康狀態的裝置管理解決方案) : (啟用啟用 DHA 功能的裝置健康狀態) 裝置管理解決方案是與 DHA 功能整合的裝置管理工具。 DHA-Enabled 裝置管理解決方案可讓企業IT管理員根據受控裝置的安全性保護列,根據硬體 (TPM) 受保護的數據,即使裝置遭到進階安全性威脅入侵或執行惡意 (破解) 操作系統,仍可信任這些數據。 DHA-Enabled-MDM 會執行下列作業清單:

    • 在 DHA-Enabled 裝置上啟用 DHA 功能
    • 對已註冊/受管理的裝置發出裝置健康情況證明要求
    • 收集 DHA-Data) (裝置健康情況證明數據,並將其傳送至裝置健康情況證明服務 (DHA-Service) 進行驗證
    • 從 DHA-Service 取得 DHA-Report) (裝置健康情況報告,這會觸發合規性動作
  • DHA-CSP (裝置健康情況][自動設定服務提供者) :裝置健康情況][自動設定服務提供者] (DHA-CSP) 使用裝置的 TPM 和韌體來測量裝置 BIOS 和 Windows 開機的重要安全性屬性,因此即使在受到核心層級惡意代碼或 rootkit 感染的系統上,也無法詐騙這些屬性。 DHA-CSP 會執行下列作業清單:

    • 從受控裝置收集裝置開機數據 (DHA-BootData)
    • 將 DHA-BootData 轉送至裝置健康情況證明服務 (DHA-Service)
    • 從 DHA-Service 接收已加密的 Blob (DHA-EncBlob) ,並將它儲存在裝置上的本機快取中
    • 接收來自 DHA-Enabled MDM (DHA-Requests) 的證明要求,並使用裝置健康情況證明數據 (DHA-Data)
  • DHA-Service (裝置健康 狀態][自動服務]) :裝置健康狀態服務 (DHA-Service) 驗證它從 DHA-CSP 接收的數據,併發出高度信任的硬體 (TPM) 保護的報告 (DHA-Report) ,以透過防竄改和竄改的通訊通道 DHA-Enabled 裝置管理解決方案。 DHA-Service 有兩種類型:“DHA-Cloud” 和 “DHA-Server2016”。 DHA-Service 支援各種實作案例,包括雲端、內部部署、空中禁用和混合式案例。 DHA-Service 會執行下列作業列表:

    • 從 DHA-Enabled 裝置接收 DHA-BootData) (裝置開機數據
    • 將 DHA-BootData 轉送至裝置健康情況證明服務 (DHA-Service)
    • 從 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)
  • 裝載於企業擁有及受控伺服器裝置/硬體上
  • 第一方和第三方支援 DHA-Enabled 支持內部部署和混合式 (雲端 + 內部部署) 硬體證明案例的裝置管理解決方案提供者
  • 可透過下列設定存取所有企業管理的裝置:
    • FQDN = (企業指派的)
    • 埠 = (企業指派的)
    • 通訊協定 = TCP
  • 在內部部署執行一或多個 Server 2016 實例的作業成本。
    裝置健康情況證明 - Enterprise-Managed 雲端 (DHA-EMC) DHA-EMC 指的是企業管理的 DHA-Service,該 DHA-Service 在相容的 Windows Server 2016 上以虛擬主機/服務執行,也就是由企業管理的雲端服務,例如 Microsoft Azure。
  • 提供給 Windows Server 2016 沒有額外授權成本的客戶, (啟用/執行 DHA-Service)
  • 第一方和第三方支援 DHA-Enabled 支持內部部署和混合式 (雲端 + 內部部署) 硬體證明案例的裝置管理解決方案提供者
  • 可透過下列設定存取所有企業管理的裝置:
    • FQDN = (企業指派的)
    • 埠 = (企業指派的)
    • 通訊協定 = TCP
  • 在相容的雲端服務上執行 Server 2016 的作業成本,例如 Microsoft Azure。

    DHA-CSP 整合步驟

    整合 Microsoft 裝置健康情況證明功能與 Windows 行動裝置管理解決方案 (MDM) 需要下列驗證和開發工作清單:

    1. 驗證 HTTPS 存取
    2. 指派企業信任的 DHA-Service
    3. 指示客戶端準備 DHA 數據以進行驗證
    4. 根據客戶端回應採取動作
    5. 指示用戶端轉送 DHA 數據以進行驗證
    6. 將 DHA 數據張貼到 DHA-service
    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 企業擁有和營運的雲端 (,在相容的企業管理雲端上 Windows Server 2016 執行)

    DHA-Cloud 是預設設定。 如果企業打算使用 Microsoft DHA-Cloud 作為受信任的 DHA-Service 提供者,則不需要採取任何進一步的動作。

    針對 DHA-OnPrem & DHA-EMC 案例,請將 SyncML 命令傳送至 HASEndpoint 節點,以指示受控裝置與企業信任的 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:指示用戶端轉送健康情況證明數據以進行驗證

    建立 對 NonceCertificateCorrelationId 節點的呼叫,並從裝置挑選包含健康情況憑證和相關數據的加密承載。

    以下是範例:

    <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 用戶端會從 ./Vendor/MSFT/HealthAttestation/Certificate 節點) 轉送 XML 格式化的 Blob (回應,並將稱為 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>
      
    • 向前 (HTTP Post) XML 數據結構 (包括上一個步驟中附加的 nonce,) 至執行所在的指派 DHA-Service:

      • 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 伺服器收到已驗證的數據之後,即可藉由評估數據來使用該資訊來做出原則決策。 一些可能的動作會是:

    • 允許裝置存取。
    • 允許裝置存取資源,但標示裝置以供進一步調查。
    • 防止裝置存取資源。

    DHA-Report V3 架構

    <?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) 出現在裝置上時,它會指出裝置具有簽署密鑰 (EK) 憑證。 可以信任的裝置可以超過沒有 EK 憑證的裝置。

      如果 AIKPresent = True (1) ,則允許存取。

      如果 AIKPresent = False (0) ,請採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 不允許存取 HBI 資產。
      • 根據評估時間存在的其他數據點,允許條件式存取。 例如,健康情況憑證上的其他屬性,或裝置的過去活動和信任歷程記錄。
      • 採取上述其中一個動作,並將裝置放在 watch 清單中,以更密切地監視裝置是否有潛在風險。
    • ResetCount (僅針對支援 TPM 2.0) 的裝置報告:此屬性會報告電腦裝置休眠或繼續的次數。

    • RestartCount (僅針對支援 TPM 2.0) 的裝置報告:此屬性報告電腦裝置重新啟動的次數。

    • 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 (On) ,則允許存取。

      如果 DEPPolicy = 0 (Off) ,請採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 不允許存取 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 (On) ,則允許存取。

      如果 BitLockerStatus = 0 (Off) ,請採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 不允許存取 HBI 資產。
      • 根據評估時間存在的其他數據點,允許條件式存取。 例如,健康情況憑證上的其他屬性,或裝置的過去活動和信任歷程記錄。
      • 採取先前的其中一個動作,並將裝置放在 watch 清單中,以更密切地監視裝置是否有潛在風險。
    • BootManagerRevListVersion:此屬性表示裝置上執行的開機管理程式版本,可讓您追蹤和管理開機順序/環境的安全性。

      如果 BootManagerRevListVersion = [CurrentVersion],則允許存取。

      如果 BootManagerRevListVersion != [CurrentVersion],則採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 不允許存取 HBI 和 MBI 資產。
      • 將裝置放在 watch 清單中,以更密切地監視裝置是否有潛在風險。
      • 觸發更正動作,例如通知技術支援小組連絡擁有者調查問題。
    • CodeIntegrityRevListVersion:此屬性指出在開機順序期間執行完整性檢查的程式碼版本。 使用此屬性可協助您偵測裝置是否執行執行完整性檢查的最新版程式代碼,或是否暴露在安全性風險 (撤銷) ,並強制執行適當的原則動作。

      如果 CodeIntegrityRevListVersion = [CurrentVersion],則允許存取。

      如果 CodeIntegrityRevListVersion != [CurrentVersion],則採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 不允許存取 HBI 和 MBI 資產。
      • 將裝置放在 watch 清單中,以更密切地監視裝置是否有潛在風險。
      • 觸發更正動作,例如通知技術支援小組連絡擁有者調查問題。
    • SecureBootEnabled:啟用安全開機時,用來開機計算機的核心元件必須具有製造裝置的組織所信任的正確密碼編譯簽章。 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 預安裝環境 (Windows PE) 是最低限度的操作系統,其服務有限,可用來準備計算機以進行 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 需要大約 1 GB 的記憶體 – 它有足夠的功能可執行用於所有驗證代理的 LSA 服務。

      您可以在 WMI 或 PowerShell 文稿中使用下列命令來啟用 VSM:

      bcdedit.exe /set {current} vsmlaunchtype auto

      如果 VSMEnabled = 1 (True) ,則允許存取。 如果 VSMEnabled = 0 (False) ,請採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 不允許存取 HBI 資產。
      • 觸發更正動作,例如通知技術支援小組連絡擁有者調查問題
    • PCRHashAlgorithmID:此屬性是資訊屬性,可識別 TPM 所使用的HASH演算法;不需要合規性動作。

    • BootAppSVN:此屬性會識別在證明裝置上初始開機期間載入的開機應用程式安全性版本號碼

      如果回報的 BootAppSVN 等於接受的值,則允許存取。

      如果回報的 BootAppSVN 不等於接受的值,請採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 將裝置導向企業 Honeypot,以進一步監視裝置的活動。
    • BootManagerSVN:此屬性會識別在證明裝置上初始開機期間載入的開機管理員安全性版本號碼。

      如果回報的 BootManagerSVN 等於接受的值,則允許存取。

      如果回報的 BootManagerSVN 不等於接受的值,請採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 將裝置導向企業 Honeypot,以進一步監視裝置的活動。
    • TPMVersion:此屬性會識別在證明裝置上執行的 TPM 版本。 TPMVersion 節點提供 回復 “1” 和 “2”:

      • 1 表示 TPM 規格 1.2 版
      • 2 表示 TPM 規格 2.0 版

      根據您從 TPMVersion 節點收到的回復:

      • 如果回報的 TPMVersion 等於接受的值,則允許存取。
      • 如果回報的 TPMVersion 不等於接受的值,請採取下列其中一個符合企業原則的動作:
        • 不允許所有存取
        • 將裝置導向企業 Honeypot,以進一步監視裝置的活動。
    • PCR0:在 PCR[0] 中擷取的度量通常代表開機周期之間主機平臺的一致檢視。 它包含主機平台製造商所提供的元件測量。

      企業經理可以建立受信任 PCR[0] 值的允許清單、比較受管理裝置的 PCR[0] 值 (HAS) 使用允許清單所驗證和報告的值,然後根據比較結果做出信任決策。

      如果您的企業沒有可接受 PCR[0] 值的允許清單,則不採取任何動作。 如果 PCR[0] 等於接受的允許清單值,則允許存取。

      如果 PCR[0] 不等於任何已接受的列出值,請採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 將裝置導向企業 Honeypot,以進一步監視裝置的活動。
    • SBCPHash:SBCPHash 是 Windows 裝置開機期間載入的自定義安全開機設定原則 (SBCP) 指紋,但電腦除外。

      如果 SBCPHash 不存在,或是已接受的允許列出值,則允許存取。

      如果 SBCPHash 存在於 DHA-Report 中,而且不是允許列出的值,請採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 將裝置放在 watch 清單中,以更密切地監視裝置是否有潛在風險。
    • CIPolicy:此屬性表示控制開機環境安全性的程式代碼完整性原則。

      如果 CIPolicy 不存在,或是已接受的允許列出值,則允許存取。

      如果 CIPolicy 存在且不是允許列出的值,請採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 將裝置放在 watch 清單中,以更密切地監視裝置是否有潛在風險。
    • BootRevListInfo:此屬性會識別在證明裝置上初始開機期間載入的開機修訂清單。

      如果回報的 BootRevListInfo 版本等於接受的值,則允許存取。

      如果回報的 BootRevListInfo 版本不等於接受的值,請採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 將裝置導向企業 Honeypot,以進一步監視裝置的活動。
    • OSRevListInfo:此屬性會識別在證明裝置上初始開機期間載入的作業系統修訂清單。

      如果回報的OSRevListInfo版本等於接受的值,則允許存取。

      如果回報的OSRevListInfo版本不等於接受的值,請採取下列其中一個符合企業原則的動作:

      • 不允許所有存取。
      • 將裝置導向企業 Honeypot,以進一步監視裝置的活動。
    • HealthStatusMismatchFlags:如果 DHA-Service 偵測到完整性問題, (從裝置管理解決方案收到的 DHA-Data 中) 不符,則會顯示 HealthStatusMismatchFlags 屬性,以進行驗證。

      如果偵測到問題,受影響的 DHA-report 元素清單會列在 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 DHA-CSP 無法擷取 Windows AIK
    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 登錄中找不到相互關聯標識碼。
    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 DHA-CSP 無法將 AIK Pub 附加至要求 Blob。
    24 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_APPEND_AIKCERT DHA-CSP 無法將 AIK 憑證附加至要求 Blob。
    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 嘗試取得 HTTP 狀態代碼時,DHA-CSP 無法查詢標頭。
    33 HEALTHATTESTATION_CERT_RETRIEVAL_FAILED_EMPTY_RESPONSE 即使 HTTP 狀態正常,DHA-CSP 還是收到來自 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 認證

    設定服務提供者參考