Fleet 4.71.0 技术解读:IdP 标签、用户证书部署与软件安装状态改进
【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet
本篇文章围绕 Fleet 4.71.0(开源设备管理平台 Fleet 的月度版本)的核心更新展开,重点解读四大特性:基于身份提供者(IdP)组与部门的动态标签、IdP 外部指标(foreign vitals)在配置描述文件变量中的落地、面向登录(用户)钥匙串的用户证书部署,以及软件安装状态判定与展示的改进。读完本文,你将掌握这些新能力的配置入口、底层实现依据(含源码路径)与升级注意事项,能够直接在 Fleet 控制台中落地对应方案。
Fleet 4.71.0 的完整变更清单见仓库内版本发布说明 articles/fleet-4.71.0.md,升级方式参见 Fleet 官方升级指南。本文以该版本说明为骨架,结合仓库内配套指南与 Go 源码,展开深入讲解。
亮点概览(Highlights)
Fleet 4.71.0 的四大核心能力:
- 基于 IdP 组与部门的标签(Labels):IT 管理员可以根据用户的 IdP 组和部门构建动态标签,从而针对不同组/部门应用不同的应用、操作系统设置、查询等策略。
- IdP 外部指标(Foreign vitals):在配置描述文件变量中引入用户部门信息,使第三方工具(如 Munki)能够基于部门数据自动执行动作。
- 用户证书部署(Deploy user certificates):直接从 Microsoft NDES、DigiCert 以及自定义 SCEP 证书颁发机构(CA)签发并续期证书到用户的登录钥匙串,简化员工接入需要用户级证书的第三方工具。
- 软件安装状态改进:VPP(App Store 批量购买)应用在通过 Apple MDM 清单可见时即标记为已安装,而非 MDM 命令刚被确认时就标记;同时成功的安装/卸载会自动触发 host vitals 重新抓取,加快软件清单与策略状态的刷新。
下文逐一展开。
基于身份提供者(IdP)组与部门的标签
从 4.71.0 起,Fleet 支持将用户的IdP 组(groups)与部门(department)作为标签(label)的判定依据。这带来的直接价值是:不同业务组、不同部门的设备可以获得差异化的应用分发、OS 设置、查询库与自动化,而无需手工维护标签成员。
标签的能力建立在“将 IdP 用户信息映射到主机”这一基础设施之上,完整操作步骤见 articles/foreign-vitals-map-idp-users-to-hosts.md(Fleet Premium 功能)。其要点包括:
- Fleet 支持 Okta、Microsoft Entra ID(Azure AD)、Google Workspace、authentik,以及其他支持 SCIM 协议的任何 IdP。
- Fleet 在以下场景中自动采集 IdP 外部指标:
- Apple(macOS、iOS、iPadOS)与 Windows 主机的自动注册(ABM / 自动注册);
- Apple、Android、Windows、Linux 主机的手动注册。
- 也可以在 Host details 页面手动添加/更新主机的 IdP 用户名,Fleet 会自动将其映射到其他 IdP 外部指标。
以Okta为例,接入过程分为三步:
- 在 Okta 中创建应用:Okta 管理后台 → Applications → Create App Integration,选择SAML 2.0;由于 Okta 要求先配置 SAML 才能启用 SCIM,SSO URL 与 Audience URI 可填任意合法 URL(如
https://example.fleetdm.com);随后在应用的 General 选项卡中将 Provisioning 设置为SCIM。 - 连接 Okta 与 Fleet:在 Provisioning 选项卡中配置 SCIM Connection——
- SCIM connector base URL:
https://<你的fleet服务器地址>/api/v1/fleet/scim; - Unique identifier field for users:
userName; - Supported provisioning actions:Push New Users、Push Profile Updates、Push Groups;
- Authentication Mode:HTTP Header(使用 Fleet API-only 用户令牌)。
- 需要特别注意的是:Fleet 目前要求 SCIM 属性中必须包含
userName、givenName、familyName,可选支持department;其他属性若未移除,payload 会被 Fleet 拒绝。
- SCIM connector base URL:
- 将用户与组映射到 Fleet 主机:创建“Fleet human-device mapping”组,用规则(Rules)把目标用户划入该组,然后将该组 Assign 到 SCIM 应用;最后在Push Groups中按名称推送所有相关组(勾选 Push group memberships immediately),Fleet 便能在 SCIM 侧同步组与用户的隶属关系。
对于Microsoft Entra ID,流程同样分三步:创建企业应用(Non-gallery)→ 在 Provisioning 中将 Tenant URL 设为https://<fleet服务器>/api/v1/fleet/scim?aadOptscim062020、填入 Fleet API token → 配置用户与组的属性映射(保留userName、givenName、familyName、department、active、externalId),并 Assign 用户/组后 Start provisioning。Entra 向 Fleet 推送数据可能长达 40 分钟,可用 "Provision on demand" 加速。
Google Workspace不支持 SCIM,Fleet 改为通过 Google Cloud 服务账号 + 域级授权(domain-wide delegation)直接调用 Admin SDK Directory API 定时拉取用户、组与部门。配置时需在 Fleet 的Settings > Integrations > Identity provider (IdP)填入服务账号 JSON 密钥、主域名与要模拟的管理员邮箱,并确认在服务账号所属的 Google Cloud 项目中启用了 Admin SDK API(否则同步会报 403SERVICE_DISABLED)。
从仓库源码看,4.71.0 为“SCIM 接收部门”提供了数据库层支撑:迁移文件 server/datastore/mysql/migrations/tables/20250626130239_SCIMAddDepartment.go 在scim_users表上新增department VARCHAR(255)列,并在fleet_variables表中注册了FLEET_VAR_HOST_END_USER_IDP_DEPARTMENT变量——这印证了“部门信息经 SCIM 入库、并作为可解析变量使用”的完整链路。
IdP 外部指标:把部门信息注入配置描述文件变量
4.71.0 的另一项能力是IdP 外部指标(foreign vitals):允许在配置描述文件(configuration profile)变量中使用终端用户的IdP 部门信息。典型场景是:通过配置描述文件部署一个属性列表(property list),让 Munki 等第三方工具依据部门数据自动执行动作。
对应的变量名为$FLEET_VAR_HOST_END_USER_IDP_DEPARTMENT。在 server/fleet/mdm.go 中可以看到与 IdP 相关的全部主机变量常量定义:
| 变量名 | 含义 |
|---|---|
$FLEET_VAR_HOST_END_USER_EMAIL_IDP | IdP 邮箱(遗留变量,新方案避免使用) |
$FLEET_VAR_HOST_END_USER_IDP_USERNAME | IdP 用户名 |
$FLEET_VAR_HOST_END_USER_IDP_USERNAME_LOCAL_PART | IdP 用户名中的本地部分 |
$FLEET_VAR_HOST_END_USER_IDP_GROUPS | IdP 组 |
$FLEET_VAR_HOST_END_USER_IDP_DEPARTMENT | IdP 部门(4.71.0 新增) |
$FLEET_VAR_HOST_END_USER_IDP_FULL_NAME | IdP 全名 |
这些变量以$FLEET_VAR_或${FLEET_VAR_}两种形式出现在 profile 中,由正则表达式(如FleetVarHostEndUserIDPDepartmentRegexp,见 server/fleet/mdm.go)识别,并在 profile 下发到主机前按主机替换为实际值。
替换失败的场景也有明确反馈:在 server/mdm/apple/profile_processor_test.go 的测试用例中,当主机没有 IdP 部门时,profile 的 Detail 字段会出现 "There is no IdP department for this host. Fleet couldn't populate$FLEET_VAR_HOST_END_USER_IDP_DEPARTMENT." 的报错文案,管理员可据此在Host details > OS settings中定位原因。
除部门外,IdP 用户名、组、邮箱等信息也能作为标签依据与 profile 变量,相关指南详见 articles/foreign-vitals-map-idp-users-to-hosts.md 与仓库内的 Fleet variables 文档。
部署用户证书:NDES、DigiCert 与自定义 SCEP 到用户钥匙串
4.71.0 允许 Fleet 将Microsoft NDES、DigiCert、自定义 SCEP CA签发的证书直接部署并自动续期到macOS 用户的登录(login)钥匙串,让员工无需人工操作即可接入需要用户级证书的 Wi-Fi / VPN 等第三方工具。完整的分 CA 操作指南见 articles/connect-end-user-to-wifi-with-certificate.md(Fleet Premium)。各 CA 当前支持的平台:
- Okta:macOS、iOS、iPadOS(底层走 NDES)
- DigiCert:macOS、iOS、iPadOS
- Microsoft NDES:macOS、iOS、iPadOS 与 Windows
- Smallstep:macOS、iOS、iPadOS
- Hydrant(EST):Linux
- 任意 SCEP CA:macOS、Windows、iOS、iPadOS、Android
- 任意 EST CA:Linux
部署到用户钥匙串的配置要点
要让证书落到用户作用域,核心是用户级配置描述文件(user-scoped profile):
- macOS:在 profile 中设置
PayloadScope为User。用户级证书只有在login 钥匙串处于解锁状态时才可用;若钥匙串被锁定,MDM 安装命令会一直返回NotNow。可在“钥匙串访问”中确认 login 钥匙串左侧是否出现解锁图标。 - Windows:将 XML 中所有
<LocURI>里的./Device/替换为./User/;用户级 profile 要求设备存在 Azure AD(Entra ID)用户关联,纯设备级 MDM 注册无法处理./User/CSP 命令。 - 自托管 Fleet 实例:需要先配置 server private key,用于加密 NDES 管理员密码等敏感信息。
以NDES为例的典型 SCEP 配置描述文件(macOS)中,变量替换是关键:
<key>Challenge</key> <string>$FLEET_VAR_NDES_SCEP_CHALLENGE</string> <key>URL</key> <string>$FLEET_VAR_NDES_SCEP_PROXY_URL</string> <key>Subject</key> <array>…<string>OU</string><string>$FLEET_VAR_CERTIFICATE_RENEWAL_ID</string>…</array>其中三个变量的作用(对应 server/fleet/mdm.go 中的定义):
$FLEET_VAR_NDES_SCEP_CHALLENGE:由 Fleet 从 NDES 服务器获取的一次性挑战密码;$FLEET_VAR_NDES_SCEP_PROXY_URL:Fleet 作为中间人的 SCEP 代理 URL,主机请求证书时 Fleet 代为与 NDES 通信;$FLEET_VAR_CERTIFICATE_RENEWAL_ID:证书续期标识(36 字符 UUID),必须放入证书的OU,否则自动续期无法工作(NDES 的 OU 最长 64 字符,注意与其它内容合计不要超限)。
此外还有前缀类变量:DigiCert 使用$FLEET_VAR_DIGICERT_DATA_{CA_NAME}与$FLEET_VAR_DIGICERT_PASSWORD_{CA_NAME};自定义 SCEP 使用$FLEET_VAR_CUSTOM_SCEP_CHALLENGE_{CA_NAME}与$FLEET_VAR_CUSTOM_SCEP_PROXY_URL_{CA_NAME};Smallstep 使用$FLEET_VAR_SMALLSTEP_SCEP_CHALLENGE_{CA_NAME}与$FLEET_VAR_SMALLSTEP_SCEP_PROXY_URL_{CA_NAME}——{CA_NAME}需替换为你在Settings > Integrations > Certificate enrollment中添加 CA 时填写的大写蛇形名称(如WIFI_AUTHENTICATION)。上述常量均可从 server/fleet/mdm.go 的变量定义与HasCAVariables判定逻辑中确认。
SCEP 代理与续期机制
Fleet 在主机与 SCEP/NDES 服务器之间充当中间人:主机向 Fleet 请求证书,Fleet 向 SCEP/NDES 服务器申请并取回证书后回传给主机。代理相关的关键行为:
- NDES 代理会从 NDES 拉取一次性挑战密码(管理员密码经 server private key 加密入库,无法通过 API/界面读取);密码假设 60 分钟过期,过期后 Fleet 会重新下发 profile 并携带新的一次性密码。
- 自定义 SCEP 代理会生成一个 60 分钟有效的一次性口令拼入 SCEP URL,主机请求时先经 Fleet 校验,再向上游取证书;静态 challenge 仍保留在 profile 中。
- 自动续期:Apple、Windows、Android 主机在证书到期前30 天自动续期;若整个有效期 ≤ 30 天,则在有效期的一半时间点续期(如 20 天有效期 → 第 10 天续期)。有效期不足 2 天的证书不支持自动续期;Linux 目前不支持自动续期。失败重试次数:Apple/Android 每主机最多 3 次,Windows 每主机 1 次,每 30 秒检查一次待重发证书。
Windows SCEP 证书验证
对 Windows 主机的代理型 SCEP 证书(自定义 SCEP 与 NDES),Fleet 会通过 osquery 观察主机上是否真的出现了签发的证书,并据此给出 profile 状态(Host details > OS settings):
- Pending:profile 排队等待下发;
- Verifying:主机已确认 profile,SCEP 交换进行中,Fleet 尚未观察到证书;
- Verified:Fleet 在主机上观察到证书(通过证书 OU 中的
$FLEET_VAR_SCEP_RENEWAL_ID与 profile 匹配); - Failed:上游 CA 返回错误(如
SCEP PKIOperation failed: HTTP 500),或下发后一小时内未在主机上检测到证书。
验证要求主机的 fleetd 内置osquery 5.23.1 或以上,且 profile 的 SubjectName OU 中含续期 ID 变量。用户级证书在目标用户未登录时无法被观察到,会保持Verifying直到用户登录。
软件安装状态改进:Inventory 与 Library 分离、VPP 验证与自动 refetch
4.71.0 对软件安装的状态判定与页面呈现做了系统性改进:
- VPP 应用的安装判定更准确:App Store(VPP)应用改为在Apple MDM 清单中可见(visible via Apple MDM inventory)时才标记为“已安装”,而不是在安装 MDM 命令刚被设备确认时就标记。这消除了“命令确认但应用并未真正装好”的误报窗口。
- 安装/卸载后自动触发 host vitals refetch:VPP 应用、Fleet-maintained 应用与自定义软件包的成功安装与卸载,都会自动触发主机 vitals 重新抓取,使软件清单与策略状态在操作后快速刷新,而不是默认最长等一小时。
- Host details 页面的软件列表一分为二:Inventory(已安装软件)与Library(可供安装的软件)界限更清晰;该页面与“My device”页的后续改进正在推进中。
- Fleet-maintained 应用的检查频率:从每天一次提升到每小时一次,新版本与补丁能被更快感知;GitOps 在大团队规模下按 hash 管理软件的速度也得到优化。
这些改进在 4.71.0 的 IT 管理员变更中均可对应到:新增“Host Vitals”标签维度(以 IdP 标签起步,安装软件后自动更新)、VPP 应用命令确认后即在 UI 中展示、以及为 Fleet-maintained 应用记录 installer URL 等。
安全工程师与 IT 管理员视角的其余变更
除四大亮点外,4.71.0 还包含大量面向不同角色的变化:
面向安全工程师
- Windows 10 的CIS 基准更新到版本 3;
- 支持基于 IdP 的标签(上一节已述);
- 记录Windows 应用的最后打开时间;
GET /hosts/:id/encryption_key在当前密钥不可用时返回最近归档的加密密钥;- 支持经 SCIM 摄入用户 "Department",并新增
FLEET_VAR_HOST_END_USER_IDP_DEPARTMENT变量; - 清理 Fleet ≤ 4.55 在 Amazon Linux 2 主机上报告的误报漏洞。
面向 IT 管理员
- 新增macOS 用户级 profile 的验证;
- Windows Custom OS Settings(含 Win32/Desktop Bridge ADMX 策略)在主机确认 MDM 安装命令后即标记为已验证;
- Apple MDM 用户通道:
PayloadScope为 User 的 mobileconfig 在下发给具备用户通道连接的主机时,会走用户通道发送; - 新增“Host Vitals”标签维度,IdP 类标签在软件安装后自动更新;
- 禁止上传相同 identifier 但
PayloadScope不同的 Apple profile; - GitOps 场景下可通过 gitops 在 setup experience 中添加 EULA(UI 上传在启用 gitops 时被移除);
- 软件版本页的每页数量从 5 提升到 10。
其他改进与 bug 修复(节选)
- 活动详情增加
api_only用户属性,登录活动改用用户全名展示,并为 API-only 用户新增头像; - 后端依赖从
aws-sdk-gov1 迁移到aws-sdk-go-v2; - SAML 实现替换为 crewjam/saml(
github.com/crewjam/saml); - 优化单主机 MDM 注册检查的数据库查询;优化 osquery config 与分布式读取端点上团队设置的拉取性能;
PATCH策略 API 增加重试,修复“Manage automations”页的死锁错误;/api/v1/fleet/hosts/identifier/:id端点补充缺失的team_name属性;- 修复
fleetctlcodesignature requirements 无法验证自身签名的问题; - 修复 GitOps 导入无 default.yml 的 no-team.yml 时报错、Fleet-maintained 应用更新不拉取最新版 Google Chrome 并显示错误 SHA256、
fleetctl generate-gitops未始终导出macos_setup等问题; - 修复主机 API 在软件标题/版本不存在时返回 404(改为与其它过滤器一致的空数组);
- 修复多种与软件计数、VPP 添加到 macOS setup experience、证书来源记录、日历/Webhook 端点、SSO 设置页 500、Linux 卸载脚本等相关问题。
完整清单请见 articles/fleet-4.71.0.md 的 Changes 小节。
升级到 Fleet 4.71.0
如果你正在运行更早的 Fleet 版本,可以按 Fleet 官方升级指南执行升级。升级前建议关注以下几点:
- 若使用NDES:确保 NDES 一次性密码缓存足够大(默认仅缓存 5 个一次性挑战密码,每次失败的注册都会消耗一个),建议生产环境调大缓存;重启 NDES 会清空密码缓存,可能造成进行中的 SCEP profile 失败。
- 若使用Windows 自定义 SCEP/NDES:主机需 osquery 5.23.1+ 才能获得证书验证能力;profile 中必须含
CAThumbprint(根 CA 的 SHA1 指纹,而非 RA 签名证书)。 - 若依赖IdP 部门变量:需要先在 IdP 侧(Okta/Entra/Google Workspace 等)配置好 SCIM 或目录同步,并确认属性映射中保留了
department。 - 若使用用户级证书:注意 macOS login 钥匙串解锁状态、Windows 需要 Entra 用户关联这两个前提条件。
升级过程中如遇证书续期或 profile 验证相关问题,可参考 articles/connect-end-user-to-wifi-with-certificate.md 中的 Troubleshooting 章节(含 Windows 上0x800B0101的三种成因排查与 CRL 快速验证方法)。
【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考