使用 MDM 命令恢复被删除的 fleetd agent:Fleet 系统管理员实战指南

发布时间:2026/9/19 15:34:13
使用 MDM 命令恢复被删除的 fleetd agent:Fleet 系统管理员实战指南 使用 MDM 命令恢复被删除的 fleetd agentFleet 系统管理员实战指南【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet本指南以 Fleet 开源仓库中的系统管理员系列文章《Sysadmin diaries: restoring fleetd》为主体结合仓库内fleetctl、MDM 命令调度与fleetdbase下载服务等源码实现深入讲解当设备上的fleetdagent 文件被删除后如何通过 MDM 命令完成恢复。读完本文你将掌握三种可落地的恢复方案重发配置描述文件、擦除设备、手动发送安装命令理解 macOS 与 Windows 两条恢复路径的完整命令构造与执行细节并能从源码层面搞清楚这些命令在 Fleet 服务端是如何被生成、入队和下发的。背景fleetd是什么为什么它如此重要fleetd是 Fleet 提供的一组 agent 套件用于采集和管理设备信息它由以下组件构成osquery负责以 SQL 方式采集操作系统遥测数据支撑主机详情、策略、漏洞与软件清单等能力OrbitFleet 的 agent 管理进程负责 osquery 的启动、保活与自动更新对应仓库中的 orbit/ 目录Fleet Desktop面向终端用户的桌面小程序提供 My device、自助服务等功能入口fleetd Chrome 扩展用于采集基于 Chrome 的遥测信息。这些工具共同构成了 Fleet 对设备集群的可见性与控制力。一旦fleetd文件被删除设备将不再向 Fleet 上报状态策略检查、漏洞扫描、软件安装等管理动作都会中断安全与合规基线随之出现缺口。在进入恢复方案之前需要先明确一个重要前提只要设备是通过 ADEAutomated Device Enrollment自动设备注册完成注册的即使fleetd被删除Fleet 仍然可以通过 MDM 通道向主机下发远程锁屏remote lock、远程擦除wipe等命令这是下文所有恢复操作能够成立的基础。场景心怀不满的员工删除了fleetd文件设想如下场景某位情绪不佳的员工把设备上的fleetd文件删了个干净。这一破坏性行为会让 IT 团队失去对该设备的纳管能力甚至可能带来安全风险。幸运的是借助正确的 MDM 命令我们可以重新安装fleetdagent让设备回到受管状态。在 Fleet 中向主机下发 MDM 命令的核心入口是fleetctl的子命令体系。从 cmd/fleetctl/fleetctl/mdm.go 可以看到fleetctl mdm命令下共注册了五个子命令run-command向 ApplemacOS、iOS、iPadOS、Windows 和 Android 主机下发自定义 MDM 命令lock锁定主机unlock解锁主机wipe擦除主机上的所有内容clear-passcode清除 iOS、iPadOS、Android 主机的密码。其中run-command正是本场景下的主力工具后面三种恢复方案都会用到它。恢复方案一重发fleetd配置描述文件最直接的思路是重发fleetd配置描述文件。Fleet 提供了“批量重发配置描述文件”batch-resend configuration profile的 REST API 端点见 server/api_endpoints/api_endpoints.yml配合 MDM 管理界面即可轻松完成。从权限模型看重发配置描述文件并不是所有角色都能执行的。在 server/authz/policy.rego 中resend被定义为仅针对 profile、且只能作用于单个主机的动作权限规则 明确允许全局管理员global admins、维护者maintainers、技术人员technicians以及 gitops 角色对全局或所属团队内的主机执行重发。如果你在调用接口或执行命令时收到权限拒绝可以先核对当前账号的角色是否满足这一要求。需要说明的是重发 profile 的核心价值在于让设备重新拉取并应用fleetd安装相关的配置例如 enroll secret、Fleet 服务器地址等适合fleetd只是被部分破坏、但 MDM 通道仍然完好、设备仍处于纳管状态的情形。如果fleetd的核心二进制已被彻底删除则更稳妥的做法是直接采用下面两种方案。恢复方案二擦除设备EACS当设备状态已不可控时可以采取更彻底的擦除设备方案。该操作会执行 Erase All Contents and SettingsEACS即擦除并重置整台笔记本电脑——清空用户数据卷把设备恢复到开箱out-of-box状态。EACS 不需要重装 macOS因此执行速度很快但这是一个相当激进的动作建议仅在确认必要例如设备可能已被篡改、或者重发 profile 已无法生效时使用。在 Fleet 中擦除操作由fleetctl mdm wipe --hostHOST_IDENTIFIER触发底层会调用client.MDMWipeHost见 cmd/fleetctl/fleetctl/mdm.go。服务端随后会生成 Apple 的EraseDevice命令将其入队并通过 APNs 通知主机主机下次上线时即执行擦除见 server/mdm/apple/commander.go 附近的 DeviceWipe 实现。执行后可用fleetctl get host HOST_IDENTIFIER查看擦除进度。恢复方案三手动发送安装命令默认情况下fleetd的安装 profile 只在设备首次注册时下发之后不会再自动重发。因此当fleetd被删除时可以手动向主机发送一条安装命令来重新部署 agent。这条路径需要手工构造 MDM 命令 payload并通过fleetctl mdm run-command下发下面分别给出 macOS 与 Windows 的完整做法。macOSInstallEnterpriseApplication命令对 macOS 主机需要发送 Apple 的InstallEnterpriseApplication命令通过ManifestURL指向fleetd的安装清单。完整的 XML payload 如下!DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keyCommand/key dict keyManifestURL/key stringhttps://download.fleetdm.com/stable/fleetd-base-manifest.plist/string keyRequestType/key stringInstallEnterpriseApplication/string /dict keyCommandUUID/key stringadc1bc23-abec-4499-b57f-c8755c7ffe3c/string /dict /plist这段 XML 与服务端MDMAppleCommander.InstallEnterpriseApplication生成的结构完全一致它接收manifestURL和uuid两个参数组装出包含ManifestURL、RequestType与CommandUUID的 plist 后入队下发见 server/mdm/apple/commander.go。将上述 XML 保存为本地文件例如restore-fleetd.xml后用以下fleetctl命令发送fleetctl mdm run-command --hostsHOST_IDENTIFIER --payloadpath/to/file.xml从 cmd/fleetctl/fleetctl/mdm.go 的run-command实现可以看到几个关键行为--hosts支持逗号分隔的多个主机每个主机可以用 hostname、UUID 或序列号serial number三种标识中的任意一种指定命令会先去重再逐一解析所有目标主机必须是同一平台要么全是 Apple、要么全是 Windows、要么全是 Android混合平台会直接报错避免 payload 格式不匹配命令执行前会校验主机 MDM 是否已开启ConnectedToFleet未开启的主机会被拒绝提示先用fleetctl get hosts --mdm查看可用主机下发成功后终端会返回一个CommandUUID并提示用下面的命令查询执行结果fleetctl get mdm-command-results --idCOMMAND_UUID命令不会立即生效——主机将在下一次与 Fleet 通信check-in时执行它这与 Apple MDM 的异步模型一致。Windows两步走MSI 安装作业Windows 主机的恢复流程分两步先通过添加Add操作在设备上注册一个 MDM 配置通常用 gitops 或在 Fleet UI 中添加再通过执行Exec操作触发下载与安装。第一步添加Add配置。在 Fleet 中通过 gitops 或 UI 添加如下配置LocURI指向 MSI 的DownloadInstall节点Add CmdIDaddCommandUUID/CmdID Item Target LocURI./Device/Vendor/MSFT/EnterpriseDesktopAppManagement/MSI/%7BA427C0AA-E2D5-40DF-ACE8-0D726A6BE096%7D/DownloadInstall/LocURI /Target /Item /Add其中%7BA427C0AA-E2D5-40DF-ACE8-0D726A6BE096%7D是 URL 编码后的 MSI 产品 GUID{A427C0AA-E2D5-40DF-ACE8-0D726A6BE096}即fleetdWindows 安装包的产品代码。第二步执行Exec命令。保存为 XML 文件后用fleetctl mdm run-command下发Exec CmdIDexecCommandUUID/CmdID Item Target LocURI./Device/Vendor/MSFT/EnterpriseDesktopAppManagement/MSI/%7BA427C0AA-E2D5-40DF-ACE8-0D726A6BE096%7D/DownloadInstall/LocURI /Target Data MsiInstallJob id{A427C0AA-E2D5-40DF-ACE8-0D726A6BE096} Product Version1.0.0.0 Download ContentURLList ContentURLhttps://download.fleetdm.com/stable/fleetd-base.msi/ContentURL /ContentURLList /Download Validation FileHash9F89C57D1B34800480B38BD96186106EB6418A82B137A0D56694BF6FFA4DDF1A/FileHash /Validation Enforcement CommandLine/quiet FLEET_URLREPLACE_WITH_FLEET_URL_HERE FLEET_SECRETREPLACE_WITH_FLEET_SECRET_HERE/CommandLine TimeOut10/TimeOut RetryCount1/RetryCount RetryInterval5/RetryInterval /Enforcement /Product /MsiInstallJob /Data Meta Type xmlnssyncml:metinftext/plain/Type Format xmlnssyncml:metinfxml/Format /Meta /Item /Exec对这段 payload 的参数做一下解读ContentURL指向fleetd-base.msi的官方下载地址FileHash是该 MSI 的 SHA-256 校验值Windows 会在安装前校验文件完整性CommandLine中以/quiet做静默安装并通过FLEET_URL你的 Fleet 服务器地址与FLEET_SECRET设备注册密钥两个属性把设备指向正确的 Fleet 实例——这两处REPLACE_WITH_*占位符必须替换为你自己的实际值否则设备无法完成注册TimeOut10 分钟、RetryCount1 次、RetryInterval5 分钟共同定义了安装作业的超时与重试策略。提示如果你不想手工组装 XML社区里有一个名为 Fleet Agent Installer 的第三方 macOS 小应用可以自动化完成上述 macOS 恢复步骤。它只是社区贡献的辅助工具并非 Fleet 官方发布使用前请自行评估其可信度。从源码看命令的来龙去脉安装命令与 DEP 自动注册的同一套机制你可能已经注意到macOS 恢复用的InstallEnterpriseApplication命令正是 Fleet 在设备首次注册DEP 流程时自动下发的那条命令。在 server/worker/apple_mdm.go 的installFleetd方法中服务端 worker 会调用fleetdbase.GetPKGManifestURL()拿到 manifest 地址然后调用InstallEnterpriseApplication将其入队——这与我们手动构造的 XML 完全同构。fleetd下载元数据从哪来fleetd的安装包与 manifest 统一托管在download.fleetdm.com上相关逻辑位于 pkg/fleetdbase/fleetd_base.go。其中GetPKGManifestURL()返回https://download.fleetdm.com/stable/fleetd-base-manifest.plist正是 macOS 恢复命令中ManifestURL的取值来源fleetd_base.goGetMetadata()会请求https://download.fleetdm.com/stable/meta.json解析出 MSI/PKG 的下载 URL 与 SHA-256 校验值、manifest URL 及版本号fleetd_base.goWindows 恢复命令中的FileHash即对应fleetd_base_msi_sha256开发环境可通过环境变量FLEET_DEV_DOWNLOAD_FLEETDM_URL覆盖默认下载域名便于测试。对应地pkg/fleetdbase/fleetd_base_test.go 中的测试用例验证了在测试与生产环境下GetPKGManifestURL分别返回download-test.fleetdm.com与download.fleetdm.com的完整 URL。理解了这条链路你就明白了恢复命令的本质它复用了 Fleet 在首次注册时安装fleetd的同一套下发机制只是把触发时机从自动改成了手动。因此只要 manifest 地址与产品 GUID 保持稳定它们由 Fleet 的fleetd发布流程维护这条恢复路径就可以长期复用。实验验证与结论在原文档的实验中作者在删除fleetd后执行了上述命令并观察到设备重新上线验证了这些恢复方案的有效性——这正是设备被破坏后仍可通过 MDM 通道自愈这一设计价值的最佳注脚。总结一下三种方案的适用取舍方案操作方式强度适用场景重发配置描述文件UI / 批量重发 profile API温和fleetd配置被破坏但 agent 尚可恢复擦除设备EACSfleetctl mdm wipe激进设备已不可控需要彻底重置手动发送安装命令fleetctl mdm run-command 构造 XML中等最通用的恢复路径macOS 与 Windows 各有标准模板当设备上的fleetd文件被删除时正确使用 MDM 命令可以高效地恢复设备功能并保证安全合规。建议把本文中的 XML 模板与命令流程沉淀到团队的运行手册中并提前在测试设备上演练一遍这样即使下次再遇到心怀不满的员工你也能从容应对。相关延伸阅读设备注册全流程Sysadmin diaries: device enrollment若想深入了解fleetd的自动更新机制可继续阅读 orbit/ 目录下的实现与文档。【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考