# Implementing Device Posture Assessment In Zero Trust

> 在零信任访问控制中实施设备态势评估，将来自 CrowdStrike ZTA、Microsoft Intune 和 Jamf 的端点健康信号集成到条件访问策略中，在授予资源访问权限前强制执行合规性。

- Skill: `killvxk/implementing-device-posture-assessment-in-zero-trust` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add killvxk/implementing-device-posture-assessment-in-zero-trust`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/implementing-device-posture-assessment-in-zero-trust/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/implementing-device-posture-assessment-in-zero-trust

---


# 在零信任中实施设备态势评估

## 适用场景

- 将设备健康作为访问企业应用的前提条件时
- 将 CrowdStrike ZTA 评分、Intune 合规性或 Jamf 设备状态集成到访问决策时
- 实施 CISA 零信任成熟度模型设备支柱要求时
- 构建基于实时端点安全态势自适应的条件访问策略时
- 检测并阻断来自受损、未托管或不合规设备的访问时

**不适用于**无法运行态势 Agent 的物联网或无头设备、没有身份验证的独立安全控制，以及实时态势数据不可用而陈旧合规数据会产生虚假信任的场景。

## 前置条件

- 端点检测与响应（EDR）：带 ZTA 模块的 CrowdStrike Falcon，或 Microsoft Defender for Endpoint
- 移动设备管理（MDM）：Microsoft Intune、Jamf Pro 或 VMware Workspace ONE
- 身份提供商：具有条件访问能力的 Microsoft Entra ID、Okta 或 Ping Identity
- ZTNA 平台：Zscaler ZPA、Cloudflare Access、Palo Alto Prisma Access 或云原生 IAP
- EDR/MDM 平台的 API 访问权限，用于态势信号采集

## 工作流程

### 步骤 1：定义设备合规基线

为每个设备类别建立最低安全要求。

```powershell
# Microsoft Intune：通过 Graph API 创建设备合规策略
Connect-MgGraph -Scopes "DeviceManagementConfiguration.ReadWrite.All"

# Windows 10/11 合规策略
$compliancePolicy = @{
    "@odata.type" = "#microsoft.graph.windows10CompliancePolicy"
    displayName = "Zero Trust - Windows Compliance"
    description = "零信任访问的最低设备要求"
    osMinimumVersion = "10.0.19045"
    bitLockerEnabled = $true
    secureBootEnabled = $true
    codeIntegrityEnabled = $true
    tpmRequired = $true
    antivirusRequired = $true
    antiSpywareRequired = $true
    defenderEnabled = $true
    firewallEnabled = $true
    passwordRequired = $true
    passwordMinimumLength = 12
    passwordRequiredType = "alphanumeric"
    storageRequireEncryption = $true
    scheduledActionsForRule = @(
        @{
            ruleName = "PasswordRequired"
            scheduledActionConfigurations = @(
                @{
                    actionType = "block"
                    gracePeriodHours = 24
                    notificationTemplateId = ""
                    notificationMessageCCList = @()
                }
            )
        }
    )
}

New-MgDeviceManagementDeviceCompliancePolicy -BodyParameter $compliancePolicy

# 通过 Jamf Pro API 设置 macOS 合规策略
curl -X POST "https://jamf.company.com/api/v1/compliance-policies" \
  -H "Authorization: Bearer ${JAMF_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{
    "name": "Zero Trust - macOS Compliance",
    "rules": [
      {"type": "os_version", "operator": ">=", "value": "14.0"},
      {"type": "filevault_enabled", "value": true},
      {"type": "firewall_enabled", "value": true},
      {"type": "gatekeeper_enabled", "value": true},
      {"type": "sip_enabled", "value": true},
      {"type": "auto_update_enabled", "value": true},
      {"type": "screen_lock_timeout", "operator": "<=", "value": 300},
      {"type": "falcon_sensor_running", "value": true}
    ]
  }'
```

### 步骤 2：配置 CrowdStrike 零信任评估

启用 ZTA 评分并配置访问层级的评分阈值。

```bash
# CrowdStrike Falcon API：查询所有端点的 ZTA 评分
curl -X GET "https://api.crowdstrike.com/zero-trust-assessment/entities/assessments/v1?ids=${DEVICE_AID}" \
  -H "Authorization: Bearer ${CS_TOKEN}" \
  -H "Content-Type: application/json"

# 响应包含：
# {
#   "aid": "device-agent-id",
#   "assessment": {
#     "overall": 82,
#     "os": 90,
#     "sensor_config": 85,
#     "version": "7.14.16703"
#   },
#   "assessment_items": {
#     "os_signals": [
#       {"signal_id": "firmware_protection", "meets_criteria": "yes"},
#       {"signal_id": "disk_encryption", "meets_criteria": "yes"},
#       {"signal_id": "kernel_protection", "meets_criteria": "yes"}
#     ],
#     "sensor_signals": [
#       {"signal_id": "sensor_version", "meets_criteria": "yes"},
#       {"signal_id": "prevention_policies", "meets_criteria": "yes"}
#     ]
#   }
# }

# 定义访问层级的 ZTA 评分阈值
# 第 1 层（基本访问）：      ZTA >= 50
# 第 2 层（标准访问）：      ZTA >= 65
# 第 3 层（敏感访问）：      ZTA >= 80
# 第 4 层（关键访问）：      ZTA >= 90

# 查询低于最低阈值的设备
curl -X GET "https://api.crowdstrike.com/zero-trust-assessment/queries/assessments/v1?filter=assessment.overall:<50" \
  -H "Authorization: Bearer ${CS_TOKEN}"

# CrowdStrike ZTA 评估的信号：
# - 操作系统补丁级别和版本
# - 磁盘加密（BitLocker/FileVault）
# - 传感器版本和配置
# - 防护策略执行
# - 固件保护（Secure Boot）
# - 内核保护（SIP、Code Integrity）
# - 防火墙状态
```

### 步骤 3：将设备态势与 Entra ID 条件访问集成

创建要求合规设备的条件访问策略。

```powershell
# 创建要求合规设备的条件访问策略
Connect-MgGraph -Scopes "Policy.ReadWrite.ConditionalAccess"

$caPolicy = @{
    displayName = "Zero Trust - Require Compliant Device"
    state = "enabled"
    conditions = @{
        applications = @{
            includeApplications = @("All")
        }
        users = @{
            includeUsers = @("All")
            excludeGroups = @("BreakGlass-Admins-Group-ID")
        }
        platforms = @{
            includePlatforms = @("all")
        }
        clientAppTypes = @("browser", "mobileAppsAndDesktopClients")
    }
    grantControls = @{
        operator = "AND"
        builtInControls = @("mfa", "compliantDevice")
    }
    sessionControls = @{
        signInFrequency = @{
            value = 4
            type = "hours"
            isEnabled = $true
            authenticationType = "primaryAndSecondaryAuthentication"
            frequencyInterval = "timeBased"
        }
        persistentBrowser = @{
            mode = "never"
            isEnabled = $true
        }
    }
}

New-MgIdentityConditionalAccessPolicy -BodyParameter $caPolicy

# 创建基于设备合规性和登录风险的风险策略
$riskPolicy = @{
    displayName = "Zero Trust - Block High Risk Sign-Ins on Non-Compliant Devices"
    state = "enabled"
    conditions = @{
        applications = @{ includeApplications = @("All") }
        users = @{ includeUsers = @("All") }
        signInRiskLevels = @("high", "medium")
        devices = @{
            deviceFilter = @{
                mode = "include"
                rule = "device.isCompliant -ne True"
            }
        }
    }
    grantControls = @{
        operator = "OR"
        builtInControls = @("block")
    }
}

New-MgIdentityConditionalAccessPolicy -BodyParameter $riskPolicy
```

### 步骤 4：配置 Okta 设备信任与 CrowdStrike 集成

使用 CrowdStrike 态势信号设置 Okta 设备信任策略。

```bash
# Okta：配置 CrowdStrike 设备信任集成
# 管理控制台 > 安全 > 设备集成 > 添加集成

# Okta API：创建设备保障策略
curl -X POST "https://company.okta.com/api/v1/device-assurances" \
  -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{
    "name": "Corporate Device Assurance",
    "platform": "WINDOWS",
    "osVersion": {
      "minimum": "10.0.19045"
    },
    "diskEncryptionType": {
      "include": ["ALL_INTERNAL_VOLUMES"]
    },
    "screenLockType": {
      "include": ["BIOMETRIC", "PASSCODE"]
    },
    "secureHardwarePresent": true,
    "thirdPartySignalProviders": {
      "dtc": {
        "browserVersion": {
          "minimum": "120.0"
        },
        "builtInDnsClientEnabled": true,
        "chromeRemoteDesktopAppBlocked": true,
        "crowdStrikeCustomerId": "CS_CUSTOMER_ID",
        "crowdStrikeAgentId": "REQUIRED",
        "crowdStrikeVerifiedState": {
          "include": ["RUNNING"]
        }
      }
    }
  }'

# 创建带设备保障的 Okta 认证策略
curl -X POST "https://company.okta.com/api/v1/policies" \
  -H "Authorization: SSWS ${OKTA_API_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{
    "name": "Zero Trust Application Policy",
    "type": "ACCESS_POLICY",
    "conditions": null,
    "rules": [
      {
        "name": "Managed Device Access",
        "conditions": {
          "device": {
            "assurance": {
              "include": ["DEVICE_ASSURANCE_POLICY_ID"]
            },
            "managed": true,
            "registered": true
          },
          "people": {
            "groups": {"include": ["EMPLOYEES_GROUP_ID"]}
          }
        },
        "actions": {
          "appSignOn": {
            "access": "ALLOW",
            "verificationMethod": {
              "factorMode": "1FA",
              "type": "ASSURANCE"
            }
          }
        }
      },
      {
        "name": "Unmanaged Device - Block",
        "conditions": {
          "device": { "managed": false }
        },
        "actions": {
          "appSignOn": { "access": "DENY" }
        }
      }
    ]
  }'
```

### 步骤 5：实施持续态势监控

设置实时监控设备合规状态变化。

```python
#!/usr/bin/env python3
"""实时监控设备态势合规漂移。"""

import requests
import time
import json
from datetime import datetime, timezone

CROWDSTRIKE_BASE = "https://api.crowdstrike.com"
INTUNE_BASE = "https://graph.microsoft.com/v1.0"

def get_cs_token(client_id: str, client_secret: str) -> str:
    resp = requests.post(f"{CROWDSTRIKE_BASE}/oauth2/token", data={
        "client_id": client_id,
        "client_secret": client_secret
    })
    return resp.json()["access_token"]

def get_low_zta_devices(token: str, threshold: int = 50) -> list:
    resp = requests.get(
        f"{CROWDSTRIKE_BASE}/zero-trust-assessment/queries/assessments/v1",
        headers={"Authorization": f"Bearer {token}"},
        params={"filter": f"assessment.overall:<{threshold}", "limit": 100}
    )
    return resp.json().get("resources", [])

def get_intune_noncompliant(token: str) -> list:
    resp = requests.get(
        f"{INTUNE_BASE}/deviceManagement/managedDevices",
        headers={"Authorization": f"Bearer {token}"},
        params={
            "$filter": "complianceState eq 'noncompliant'",
            "$select": "id,deviceName,userPrincipalName,complianceState,lastSyncDateTime,operatingSystem"
        }
    )
    return resp.json().get("value", [])

def check_posture_drift(cs_token: str, intune_token: str):
    print(f"\n[{datetime.now(timezone.utc).isoformat()}] 设备态势检查")
    print("=" * 60)

    low_zta = get_low_zta_devices(cs_token, threshold=50)
    print(f"CrowdStrike ZTA < 50：{len(low_zta)} 台设备")

    noncompliant = get_intune_noncompliant(intune_token)
    print(f"Intune 不合规：{len(noncompliant)} 台设备")

    for device in noncompliant[:10]:
        print(f"  - {device['deviceName']} ({device['userPrincipalName']}): "
              f"{device['complianceState']} | 上次同步：{device['lastSyncDateTime']}")

    return {"low_zta_count": len(low_zta), "noncompliant_count": len(noncompliant)}
```

## 核心概念

| 术语 | 定义 |
|------|------|
| 设备态势（Device Posture）| 在授予访问权限前评估的端点安全属性集合（操作系统版本、加密、EDR 状态、补丁级别）|
| CrowdStrike ZTA 评分 | CrowdStrike Falcon 根据操作系统信号和传感器配置计算端点安全态势的数值评分（1-100）|
| 设备合规策略 | MDM 定义的规则，指定设备必须满足的最低安全要求（加密、PIN、操作系统版本）|
| 条件访问（Conditional Access）| 在允许访问前评估用户身份、设备合规性、位置和风险的策略引擎（Entra ID、Okta）|
| 设备信任（Device Trust）| 验证端点已托管、已注册且满足安全基线，然后将其视为受信任设备 |
| 态势漂移（Posture Drift）| 设备安全态势随时间退化（补丁过期、加密被禁用），应触发访问撤销 |

## 工具与系统

- **CrowdStrike Falcon ZTA**：基于操作系统和传感器安全信号的实时端点态势评分
- **Microsoft Intune**：执行设备合规策略并向 Entra ID 条件访问报告的 MDM 平台
- **Jamf Pro**：适用于 macOS 和 iOS 端点的 Apple 设备管理，含合规规则
- **Microsoft Entra ID 条件访问**：使用 Intune 合规性和风险信号进行访问决策的策略引擎
- **Okta 设备信任**：与 CrowdStrike、Chrome Enterprise 和 MDM 平台集成的设备保障策略
- **Cloudflare 设备态势**：基于 WARP 客户端的磁盘加密、操作系统版本和第三方 EDR 态势检查

## 常见场景

### 场景：为 2000 台 Windows 和 macOS 端点强制执行设备合规

**场景背景**：一家拥有 2000 台端点（70% Windows、30% macOS）的医疗公司必须在允许访问患者数据系统前强制执行符合 HIPAA 的设备态势。设备由 Intune（Windows）和 Jamf（macOS）管理，所有端点均已部署 CrowdStrike Falcon。

**方法**：
1. 在 Intune 中定义 Windows 合规策略：BitLocker、Secure Boot、TPM、Defender 已启用，操作系统 >= 10.0.19045
2. 在 Jamf 中定义 macOS 合规策略：FileVault、Gatekeeper、SIP、防火墙，操作系统 >= 14.0
3. 配置 CrowdStrike ZTA 阈值：通用应用 >= 70，患者数据系统 >= 85
4. 创建 Entra ID 条件访问策略，要求所有云应用使用合规设备 + MFA
5. 为新不合规设备配置 24 小时宽限期，在封锁前提供修复时间
6. 为 IT 设置每周合规报告，显示不合规设备和修复措施
7. 通过 Intune 实施自动化修复：推送 BitLocker 启用、部署待处理补丁

**常见陷阱**：宽限期必须足够长以便 IT 修复，但又要足够短以限制风险敞口。CrowdStrike ZTA 评分可能随传感器更新而波动；初始阶段避免设置过于激进的阈值。BYOD 设备可能缺乏 MDM 注册；为未托管设备提供功能受限的单独浏览器访问路径。

## 输出格式

```
设备态势评估报告
==================================================
组织：HealthCorp
报告日期：2026-02-23
托管设备总数：2,000

平台合规情况：
  Windows（1,400 台设备）：
    合规：              1,302（93.0%）
    不合规：               98（7.0%）
    主要问题：缺失补丁（45）、BitLocker 已禁用（23）

  macOS（600 台设备）：
    合规：                567（94.5%）
    不合规：               33（5.5%）
    主要问题：操作系统过旧（18）、FileVault 已禁用（8）

CROWDSTRIKE ZTA 评分：
  平均评分：              78.4
  设备 >= 85（关键级）：  1,456（72.8%）
  设备 >= 70（标准级）：  1,812（90.6%）
  设备 < 50（已封锁）：      34（1.7%）

条件访问影响（过去 7 天）：
  总登录尝试：           45,678
  因态势被封锁：            312（0.7%）
  24 小时内已修复：         289（92.6%）
  仍不合规：                 23

态势漂移告警：
  加密已禁用：               5
  EDR 传感器已停止：          3
  操作系统已降级：            1
```

