Highlight
Apple 在现有 MDM 协议中加入声明式设备管理,让 iOS 15 和 iPadOS 15 的用户注册设备在本地判断策略、应用配置,并通过状态通道主动向服务器报告变化。
核心内容
大型组织管理设备,最怕的是来回问。
一台设备的策略变了,服务器要发命令。设备执行后,服务器还要继续查询状态。几千台设备一起更新时,这些往返请求会堆在服务器上。管理员想知道设备是否已经满足密码策略,也只能等下一轮轮询。
Apple 在这场 session 里给出的答案,是声明式设备管理(Declarative Device Management)。服务器不再把每一步操作拆成命令下发,改为把组织想要的策略写成声明,发送给设备。
设备拿到声明后,在本地判断当前状态。状态匹配,就应用策略。状态变化,就重新计算。服务器不用一直追问设备,只订阅自己关心的状态项。
这个变化直接解决了两个痛点。
第一,策略判断靠近设备。设备知道自己的系统版本、硬件型号、声明是否已应用,能立即处理状态变化。
第二,状态报告变成主动推送。设备通过状态通道(status channel)报告关键变化,服务器只接收订阅项和声明状态变化。
Apple 没有要求 MDM 厂商替换协议。声明式能力集成在现有 MDM 协议里,继续使用注册、注销、HTTP 传输、设备认证和用户认证这些已有机制。
详细内容
声明:把组织策略写成 JSON
(03:16)声明(Declaration)表示组织希望设备执行的策略,例如账户、设置和限制。它的结构类似 profile payload,网络传输时使用 JSON object,而非 plist。
所有声明都有三个必需属性:Type、Identifier、ServerToken。Payload 存放和声明类型相关的数据。
{
"Type": "passcode configuration",
"Identifier": "4D2A0F90-1E1B-4B73-9B8D-8C4D6D1C0F11",
"ServerToken": "revision-1",
"Payload": {
"Policy": "device passcode restrictions"
}
}
关键点:
Type定义这条声明代表哪一种策略,session 用密码配置作为例子。Identifier在设备收到的所有声明中唯一标识这一条声明,通常是 UUID 字符串。ServerToken表示这条声明的某个修订版本,同一个Identifier的每次修订都要使用不同值。Payload存放具体策略数据,不同声明类型会有不同字段。
声明分为四类:配置(configuration)、资源(asset)、激活(activation)和管理(management)。这四类合在一起,构成设备本地可执行的策略模型。
配置和资源:把公共策略与用户数据拆开
(05:02)配置(configuration)表示要应用到设备的策略,作用接近现有 MDM profile payload。账户、设置、限制都可以做成配置声明。
资源(asset)表示配置需要引用的辅助数据。大文件可以放在 URL 后面,让设备从 MDM 服务器或内容分发网络(CDN)下载。用户姓名、邮箱、账户密码、证书也可以独立成资源声明。
{
"Type": "user identity asset",
"Identifier": "7B52C2F5-A5D8-46BC-9D31-8C02C4A69A22",
"ServerToken": "revision-3",
"Payload": {
"FullName": "A Managed User",
"EmailAddress": "[email protected]"
}
}
关键点:
Type表示这是一个用户身份资源,session 用它说明用户联系方式这类数据。Identifier让配置可以引用这份资源。ServerToken让设备知道资源是否更新。Payload保存用户相关数据,避免把每个用户的定制数据复制到多个配置里。
(06:41)资源和配置是一对多关系。一个用户凭据资源可以被多个账户配置引用。凭据更新时,只更新资源;引用它的配置保持不变。设备会根据新资源更新策略。
激活:让设备原子性应用一组配置
(07:38)激活(activation)表示设备要原子性应用的一组配置。组内配置和引用资源都有效时,设备才应用整组策略。任何一项无效,激活失败。
激活还可以包含 predicate(谓词)。设备用它判断激活状态是否为 active。session 举了两个例子:只在 iPad 上生效,或只在特定系统版本上生效。
{
"Type": "simple activation",
"Identifier": "0DCC1890-93AA-4F99-81D5-0F7B2E056D5D",
"ServerToken": "revision-1",
"Payload": {
"Configurations": [
"4D2A0F90-1E1B-4B73-9B8D-8C4D6D1C0F11",
"C4712A8E-03F5-4B28-A7F5-35805E4D2F07"
],
"Predicate": "device type is iPad"
}
}
关键点:
Type表示这是一条简单激活声明。Identifier标识这条激活声明。Configurations保存要一起应用的配置标识符。Predicate把业务规则下放到设备,设备状态变化后会重新求值。
(09:16)设备状态变化时,激活谓词会重新求值,不需要服务器介入。新的策略会应用,过期策略会移除。没有 predicate 时,设备总是处理激活引用的配置。
状态通道:设备主动报告变化
(10:23)声明状态和设备实际状态可能不一致。密码策略就是典型场景:策略已经下发,但用户还没有设置符合要求的新密码。
状态通道(status channel)用来补上这个可见性缺口。服务器订阅具体状态项,设备先发送初始报告,之后只在订阅项变化时发送增量报告。
{
"Type": "status subscription configuration",
"Identifier": "F2E64D28-4553-49E6-9380-8D7B50C4630A",
"ServerToken": "revision-1",
"Payload": {
"StatusItems": [
"device.operating-system.version",
"device.model.family",
"device.model.identifier"
]
}
}
关键点:
Type表示这是一条状态订阅配置。StatusItems列出服务器关心的状态 key-path。device.operating-system.version对应设备系统版本。device.model.family和device.model.identifier对应设备类型和型号。
(11:44)状态报告是增量的。设备从 iOS 14.5 升级到 iOS 15 后,只需要报告系统版本这个变化项。声明是否已应用的状态变化会自动报告,服务器无需订阅。
扩展性:设备和服务器互相声明能力
(12:48)声明式管理把扩展性放进数据模型。设备和服务器会互相发布支持的能力,避免服务器硬编码系统版本或硬件依赖。
服务器能力通过管理声明发送给设备。设备能力通过状态项发送给服务器,能力变化时会重新报告。
{
"Type": "server capabilities management",
"Identifier": "A414E797-2ED0-4E76-9B6A-7F634BA18474",
"ServerToken": "revision-2",
"Payload": {
"SupportedFeatures": [
"declarative management feature"
]
}
}
关键点:
Type表示这是一条服务器能力管理声明。SupportedFeatures表示服务器支持的协议功能。- 服务器升级后,会像同步其他声明一样把新能力同步到设备。
- 设备的能力变化会作为状态项报告给服务器。
(13:31)客户端还会发布 supported payloads,列出它支持的声明和状态项。服务器拿到这些信息后,可以立即使用设备新增的特性和 payload。
MDM 集成:用现有协议启动和同步
(14:17)声明式管理集成在现有 MDM 协议中。注册、注销、HTTP 传输、设备认证和用户认证继续沿用已有机制。声明和状态通道可以与现有 MDM commands、profiles 共存。
启动声明式管理需要新的 DeclarativeManagement MDM command。这个命令有两个作用:在设备上激活声明式管理;携带同步 token,在需要时启动同步流程。
{
"Command": {
"RequestType": "DeclarativeManagement",
"SynchronizationTokens": {
"DeclarationsToken": "server-token-value"
}
}
}
关键点:
RequestType使用DeclarativeManagement,对应 session 中新增的 MDM command。- 设备收到命令后会激活声明式管理。
- 激活后不能关闭,但服务器可以移除全部声明,让声明式管理不再产生实际策略效果。
SynchronizationTokens可用于触发同步流程。
(16:16)设备同步声明和发送状态报告时,会使用新的 DeclarativeManagement CheckIn request type。
{
"MessageType": "DeclarativeManagement",
"Endpoint": "declaration-items"
}
关键点:
MessageType设置为DeclarativeManagement。Endpoint设置为declaration-items时,设备请求声明 manifest。- 服务器返回 manifest,列出所有声明的
Identifier和ServerToken。 - 对于新增或变化的声明,设备再用唯一资源路径发起 CheckIn request,获取单条声明 JSON。
(17:22)迁移可以逐步进行。Apple 提供一种把 profile 作为配置安装的声明类型。服务器可以先把现有 profile 通过 URL 交给设备,让设备用声明式流程安装。
{
"Type": "profile configuration",
"Identifier": "2B1B2C10-88D5-4F8B-A2D7-5F5F29D93F31",
"ServerToken": "revision-1",
"Payload": {
"ProfileURL": "https://mdm.example.com/profiles/account.mobileconfig"
}
}
关键点:
Type表示这是一条 profile 配置声明。ProfileURL指向现有 profile。- 激活这条配置后,设备从 URL 获取 profile 并安装。
- 这种方式让 MDM 厂商先迁移策略逻辑,不必一次重写全部 profile 工作流。
iOS 15 首批支持范围
(19:52)iOS 15 和 iPadOS 15 首批支持声明式管理。它只适用于用户注册(User Enrollment)类型,包括 iOS 15 新的 onboarding flow 和 iOS 13 已有流程。
Platform: iOS 15, iPadOS 15
Enrollment: User Enrollment
Configurations: account, passcode, profile, status subscription
Activations: simple activation with optional predicate
Assets: user identity, user credential
Management: organization details, server capabilities
Status: declaration status, device hardware model, operating system
关键点:
- 账号和密码配置覆盖对应的 MDM account 和 passcode profile payload。
- profile 配置可以安装 MDM 支持的完整 profile 集合。
- 状态订阅配置用于声明服务器想接收哪些状态项。
- 简单激活可以原子性应用配置列表,并可带 predicate。
- 每条声明都有自己的状态项,声明状态变化会自动报告。
核心启发
-
做什么:给 MDM 控制台增加“状态订阅模板”。 为什么值得做:状态通道允许服务器只订阅关心的状态项,减少轮询。 怎么开始:先生成 status subscription configuration,订阅
device.operating-system.version、device.model.family、device.model.identifier,把设备初始报告和增量报告写入设备详情页。 -
做什么:把密码策略从传统 profile 迁移到声明式配置。 为什么值得做:密码策略常常需要用户操作,声明状态可以让服务器知道策略是否已应用。 怎么开始:为密码策略生成 configuration declaration,再用 simple activation 引用它,监听对应声明状态变化。
-
做什么:为 iPad 和不同系统版本配置不同策略包。 为什么值得做:activation predicate 让设备本地判断策略是否生效,服务器可以一次下发多套声明。 怎么开始:把策略拆成多个 configuration,用 activation predicate 表达设备类型或系统版本条件。
-
做什么:把用户身份和凭据从账户配置中拆成 asset。 为什么值得做:一个 asset 可以被多个配置引用,用户信息更新时只同步 asset。 怎么开始:创建 user identity asset 和 user credential asset,让账户配置通过标识符引用它们。
-
做什么:先用 profile configuration 包装现有 profile。 为什么值得做:profile 配置让团队在保留现有 profile 的同时,把安装和激活流程迁移到声明式管理。 怎么开始:把现有
.mobileconfig放到服务器 URL,生成 profile configuration,再用 activation 激活它。
关联 Session
- What’s new in managing Apple devices — 了解 2021 年 Apple 设备管理能力的整体变化。
- Manage software updates in your organization — 学习组织如何控制系统更新、延迟策略和强制更新。
- Discover account-driven User Enrollment — 了解 iOS 15 用户注册流程,适合和声明式管理一起规划 BYOD 部署。
- Improve MDM assignment of Apps and Books — 了解组织分配应用和图书时可用的管理 API。
评论
GitHub Issues · utterances