news 2026/9/18 21:40:05

Fleet 4.71.0 技术解读:IdP 标签、用户证书部署与软件安装状态改进

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Fleet 4.71.0 技术解读:IdP 标签、用户证书部署与软件安装状态改进

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为例,接入过程分为三步:

  1. 在 Okta 中创建应用:Okta 管理后台 → Applications → Create App Integration,选择SAML 2.0;由于 Okta 要求先配置 SAML 才能启用 SCIM,SSO URL 与 Audience URI 可填任意合法 URL(如https://example.fleetdm.com);随后在应用的 General 选项卡中将 Provisioning 设置为SCIM
  2. 连接 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 UsersPush Profile UpdatesPush Groups
    • Authentication Mode:HTTP Header(使用 Fleet API-only 用户令牌)。
    • 需要特别注意的是:Fleet 目前要求 SCIM 属性中必须包含userNamegivenNamefamilyName,可选支持department其他属性若未移除,payload 会被 Fleet 拒绝
  3. 将用户与组映射到 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 → 配置用户与组的属性映射(保留userNamegivenNamefamilyNamedepartmentactiveexternalId),并 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_IDPIdP 邮箱(遗留变量,新方案避免使用)
$FLEET_VAR_HOST_END_USER_IDP_USERNAMEIdP 用户名
$FLEET_VAR_HOST_END_USER_IDP_USERNAME_LOCAL_PARTIdP 用户名中的本地部分
$FLEET_VAR_HOST_END_USER_IDP_GROUPSIdP 组
$FLEET_VAR_HOST_END_USER_IDP_DEPARTMENTIdP 部门(4.71.0 新增)
$FLEET_VAR_HOST_END_USER_IDP_FULL_NAMEIdP 全名

这些变量以$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 中设置PayloadScopeUser。用户级证书只有在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 对软件安装的状态判定与页面呈现做了系统性改进:

  1. VPP 应用的安装判定更准确:App Store(VPP)应用改为在Apple MDM 清单中可见(visible via Apple MDM inventory)时才标记为“已安装”,而不是在安装 MDM 命令刚被设备确认时就标记。这消除了“命令确认但应用并未真正装好”的误报窗口。
  2. 安装/卸载后自动触发 host vitals refetch:VPP 应用、Fleet-maintained 应用与自定义软件包的成功安装与卸载,都会自动触发主机 vitals 重新抓取,使软件清单与策略状态在操作后快速刷新,而不是默认最长等一小时。
  3. Host details 页面的软件列表一分为二Inventory(已安装软件)Library(可供安装的软件)界限更清晰;该页面与“My device”页的后续改进正在推进中。
  4. 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 21:39:41

model_not_found?TaoToken + Cline 这样核对模型 ID

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 21:39:26

Roo Code 评测:TaoToken 实测 3000 行 Python 类型标注的 Token 消耗

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 21:38:50

从2.9cm到带号20:测绘基础题库的参数链读法

简介&#xff1a;这份资源是《测绘基础知识考试题答案》PDF文档&#xff0c;面向测绘工程、土木与建筑类专业的在校学生、备考人员及刚入行的测量技术员&#xff0c;用于快速核对试卷答案、梳理核心概念与巩固期末或资格考试的复习要点。整包仅1个PDF文件&#xff0c;体积约124…

作者头像 李华
网站建设 2026/9/18 21:38:47

切到 TaoToken 后,V4.1-Flash 的 KV cache 内存曲线怎么复现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 21:37:21

高校PPT模板工程化:拆解.pptx结构,用python-pptx打造可复用模板

简介&#xff1a;一份适合毕业答辩、开题报告、学术会议、周会汇报等场合的同济大学极简风PPT模板&#xff0c;以「我给母校送模板」为主题&#xff0c;整体采用统一调色板与干净排版&#xff0c;视觉风格正式简洁。模板面向高校学生和科研人员&#xff0c;尤其适合交通运输等工…

作者头像 李华
网站建设 2026/9/18 21:36:30

Deep-Live-Cam 实时换脸快速上手指南:一张照片,十分钟开播

Deep-Live-Cam 实时换脸快速上手指南&#xff1a;一张照片&#xff0c;十分钟开播 【免费下载链接】Deep-Live-Cam real time face swap and one-click video deepfake with only a single image 项目地址: https://gitcode.com/GitHub_Trending/de/Deep-Live-Cam Deep-…

作者头像 李华