初识声明式设备管理
Meet declarative device management
2021年6月10日
一句话判断
Declarative Device Management 是 Apple 设备管理领域这几年最重要的架构转变——如果你做 MDM 开发,现在不搞懂 DDM,两年后你会发现自己维护的是一个过时的系统。
这场 Session 讲了什么
这个 Session 系统性地介绍了 Declarative Device Management(DDM)的设计理念和具体实现。DDM 把传统的”命令-响应”模式换成了”声明-同步”模式:MDM 服务器不再一条条发送指令,而是推送一组目标状态声明(Declarations),设备自行计算差异并执行。
Session 详细拆解了 DDM 的三层结构:Configuration(配置,比如 WiFi、VPN 设置)、Asset(资源,比如证书、脚本文件)和 Management(管理策略,比如软件更新计划)。每层都有自己的 identifier 和 server token,设备通过对比 token 来判断是否需要更新。状态上报通道(Status Channel)是另一个关键设计——设备在声明变更或定时周期内主动上报当前状态,MDM 服务器不需要轮询。整个架构的最终目标:减少 MDM 服务器的负载,提升设备管理在大规模部署下的可靠性。
值得深挖的点
Declaration 的版本管理机制
每个 Declaration 都有一个 ServerToken,MDM 服务器每次修改声明内容时需要更新这个 token。设备在 check-in 时对比本地存储的 token 和服务器端的 token,只拉取有变化的声明。这个设计看似简单,但它解决了 MDM 的一个大痛点:之前每次 check-in 都要推送完整的 profile,即使内容没变。对于管理 10 万台设备的企业来说,这意味着大量的无效网络传输被消除了。
Status Channel 的实时性和幂等性
Status 上报不是一次性的,而是持续的。设备在声明应用成功、失败、或者配置被用户修改时都会上报。更重要的是,Status 是幂等的——设备可以重复上报同一个状态,MDM 服务器不需要做去重。这让网络不稳定场景下的管理变得可靠:设备断网又恢复后,重新上报一次状态就行了,不需要 MDM 服务器猜测”上次命令到底成功了没有”。
代码片段
// 一个完整的 Declaration 集合示例
// 包含配置、资源和策略三种类型的声明
{
"Declarations": [
{
"Type": "com.apple.configuration.wifi",
"Identifier": "com.example.wifi-corporate",
"ServerToken": "20210607-v3",
"Payload": {
"SSID": "Corp-Network",
"SecurityType": "WPA2Enterprise",
"EAPClientConfiguration": {
"EAPType": "TTLS",
"TLSAllowTrustExceptions": false
}
}
}
]
}
// 资源声明(Asset Declaration)示例
// 用于分发证书文件,被配置声明引用
{
"Type": "com.apple.asset.certificate",
"Identifier": "com.example.corp-root-ca",
"ServerToken": "20210101-v1",
"Payload": {
"Reference": "https://mdm.example.com/assets/root-ca.der",
"Hash": "sha256-abc123..."
}
}
// 设备主动上报的 Status Items
// MDM 服务器可以订阅感兴趣的状态类型
{
"StatusItems": [
{
"Type": "com.apple.status.device.identity",
"Identifier": "device-identity",
"Status": {
"SerialNumber": "C02ZW1XXMD6P",
"OSVersion": "12.0",
"EnrollmentID": "user@example.com"
}
}
]
}
最佳实践
- 迁移策略采用双轨制:新的设备管理需求用 DDM 实现,旧的命令式管理保持不变。两者可以共存,不需要一刀切。
ServerToken的管理要严谨——建议使用时间戳+版本号的格式(如20210607-v1),避免用自增整数,因为在多 MDM 服务器集群场景下自增 ID 容易冲突。- Status Channel 的数据可以存入时序数据库,用来做设备合规性趋势分析,这比传统的”最后 check-in 时间”有价值得多。
还有什么值得关注
- DDM 目前支持 macOS Monterey 和 iOS 15,但不支持所有 MDM payload 类型,第一批支持的主要是 WiFi、VPN、Passcode 等基础配置。
DeclarationItemsendpoint 让设备可以主动查询自己应该有哪些声明,这是实现”设备自主拉取”的基础。- Apple 开源了一个 DDM 的参考实现(DDM-Tool),值得 MDM 厂商用来验证自己的服务器实现是否合规。