拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Fleet Desktop 深度指南:fleetd 自服务门户的安装、安全机制与自定义配置

Fleet Desktop 深度指南fleetd 自服务门户的安装、安全机制与自定义配置【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleetFleet Desktop 是 Fleet 内置的终端用户自服务门户以 macOS 菜单栏、Windows/Linux 系统托盘图标的形式常驻设备让终端用户无需 IT 介入即可查看设备状态、执行自助修复。本文基于当前仓库中 articles/fleet-desktop.md 展开并结合 orbit 客户端、server 服务端与配置文档的源码实现完整讲解其安装升级、透明度链接自定义、UUID 令牌安全机制限流与轮换、菜单栏图标隐藏以及 iOS/iPadOS 的 UUID 认证方式帮助你掌握 Fleet Desktop 从部署到加固的完整实战方案。Fleet Desktop 是什么Fleet Desktop 是一个面向终端用户的自服务门户。它在 macOS 上显示为菜单栏图标在 Windows/Linux 上显示为系统托盘图标由 fleetdFleet 的代理自动随包部署。在 docs/Get started/anatomy.md 中它被描述为作为 fleetd 一部分自动部署的菜单栏图标让终端用户能直观看到自己机器的安全与合规状态。Fleet Desktop 带来两大核心价值自服务self-service终端用户点击托盘图标即可进入 My device 页面查看自己设备的策略合规状态、安装自服务软件、处理需要关注的告警减少 IT 工单透明度transparency通过 About Fleet 菜单项将用户引导至透明度页面向用户说明设备上正在运行什么、采集了什么数据构建安全团队与终端用户之间的信任。从客户端源码 orbit/cmd/desktop/desktop.go 可以看到Fleet Desktop 的托盘菜单包含My device、Self-service、About Fleet透明度以及 macOS 上的Migrate MDM等条目点击后分别通过BrowserPoliciesURL、BrowserSelfServiceURL、BrowserTransparencyURL打开对应页面见 orbit/cmd/desktop/desktop.go#L501-L536。此外Windows 上还会在设备需要 BitLocker PIN 时弹出系统 Toast 通知bitlocker_pin_toast.go。提示如果终端用户难以在 macOS 菜单栏中找到 Fleet Desktop可以可选地部署独立的 Fleet Desktop 应用Apple 原生菜单栏应用同时可部署登录项管理配置描述文件让 Fleet Desktop 在用户每次登录或重启 Mac 时自动打开提醒用户及时处理失败的策略。该描述文件使用com.apple.servicemanagement负载类型管理com.fleetdm.fleet-desktop-hidden登录项可在登录时免提示运行。安装与升级 Fleet Desktop安装Fleet Desktop 并不是一个独立安装的软件它随 fleetd 一起打包分发。安装方式即添加主机Adding Hosts流程——通过fleetctl package生成包含 Fleet Desktop 的安装包再在目标设备上安装。关键参数是在生成包时加入--fleet-desktop标志该标志在 cmd/fleetctl/fleetctl/package.go#L178-L182 中定义Include the Fleet Desktop Application in the package。升级安装完成后Fleet Desktop 会通过 fleetd 的自我管理式代理更新self-managed agent updates机制自动升级无需管理员逐台手动更新。升级由 orbit 的 TUF 更新通道驱动在 orbit/cmd/desktop/desktop.go#L117-L119 中Fleet Desktop 读取FLEET_DESKTOP_TUF_UPDATE_ROOT环境变量获取更新根信息。这也意味着通过修改 LaunchDaemon plist 隐藏图标不会在升级后被还原——因为升级流程不会触碰被脚本修改的 plist详见下文隐藏菜单栏图标。自定义透明度链接对于安全态势复杂的组织可以把 About Fleet 菜单项指向组织自定义的资源页面而不是默认的透明度页。注意自定义透明度链接仅对 Fleet Premium 用户开放。在 Fleet UI 中配置点击右上角个人资料选择Settings进入Organization Settings Fleet Desktop Custom transparency URL填写自定义地址即可。通过 YAML 配置在配置文件的org_settings.fleet_desktop段设置可参考 docs/Configuration/yaml-files.md#L896-L911 的示例org_settings: fleet_desktop: transparency_url: https://example.org/transparency alternative_browser_host: fleet-desktop.example.com参数说明见 docs/Configuration/yaml-files.mdtransparency_url终端用户在 Fleet Desktop 下拉菜单选择About Fleet时被引导到的自定义 URL默认值为https://fleetdm.com/transparencyalternative_browser_host设备访问 Fleet Desktop 页面时使用的自定义主机名该段只能在 All fleetsorg_settings层级配置不能按团队单独设置。在服务端这两个字段定义于 server/fleet/app.go#L2069-L2085 的FleetDesktopSettings结构体TransparencyURL即 About Fleet 链接地址默认值由常量DefaultTransparencyURL提供同时支持alternative_browser_host当它非空时FleetDesktopBrowserUrl()见 server/fleet/app.go#L628-L636会返回该替代主机作为终端用户浏览器访问 Fleet 的基地址适用于需要把 Fleet Desktop 流量与主管理地址分离的部署场景。安全机制UUID 令牌、限流与令牌轮换Fleet Desktop 以及点击 My device 托盘项后打开的网页向服务端发起的请求都使用一个RandomVersion 4UUID令牌来唯一标识每一台主机RFC 4122 §4.4。服务端用该令牌认证请求并返回主机信息同时通过限流与令牌轮换两道防线保护这些信息。服务端认证入口在 server/service/devices.go#L347-L372 的AuthenticateDevice它调用LoadHostByDeviceAuthToken按令牌加载主机令牌为空或未找到时返回invalid device authentication token认证错误同时以deviceAuthTokenTTL time.Hour作为令牌有效期常量参与查询。暴力破解这样一个 UUID 的成功概率与你今年被陨石击中的概率相当——UUID v4 拥有约 122 位随机熵。限流Rate limiting为防止暴力枚举Fleet 对 Fleet Desktop 使用的端点按IP进行限流若某个 IP 在一分钟内请求了超过1000 个连续无效 UUIDFleet 会将该 IP 封禁一分钟期间请求返回HTTP 429Too Many Requests该限流算法专门设计用于支持所有主机位于同一 NAT 之后即多台主机映射到同一个出口 IP的 Fleet 部署避免正常业务被误伤。令牌轮换Token rotation自 Fleet v4.22.0 起Fleet Desktop 引入了令牌轮换机制。从 Fleet v4.22.0 开始服务端将拒绝任何签发时间超过一小时的令牌即上面提到的deviceAuthTokenTTL一小时有效期。这样即使令牌被意外泄露或被暴力尝试其有效窗口也被限制在一小时以内。作为配套Fleet Desktop 会在以下任一情况发生时签发新令牌当前令牌被服务端拒绝返回未认证错误当前令牌已超过一小时未轮换。客户端侧的轮换实现在 orbit/pkg/token/readwriter.goLoadOrGenerate()readwriter.go#L45-L62读取令牌文件不存在则调用Rotate()生成Rotate()readwriter.go#L65-L82通过uuid.NewRandom()生成新 UUID 并写盘写失败会以 5 秒间隔重试最多 3 次StartRotation()readwriter.go#L129-L207启动后台轮换协程本地每30 秒检查一次令牌文件是否过期或被外部修改如 orbit 写入了新令牌远端每5 分钟调用一次checkTokenFunc验证令牌在服务端是否仍有效例如数据库被恢复为备份、或有人手动使令牌失效时令牌会在远端检查中被判无效并触发轮换令牌文件以全局可读权限DefaultWorldReadableFileMode写入并显式更新mtime确保 fleetd 与 Fleet Desktop 两个进程都能读取。这套机制对用户是无感知的点击 My device 托盘项时总是携带有效令牌。如果用户访问了一个携带过期令牌的地址会看到提示信息要求其重新点击托盘项以获取新令牌。在 Fleet Desktop 客户端orbit/cmd/desktop/desktop.go中令牌生命周期与上述机制严格配合令牌文件路径由FLEET_DESKTOP_DEVICE_IDENTIFIER_PATH环境变量指定Fleet 服务器地址由FLEET_DESKTOP_FLEET_URL指定desktop.go#L97-L105启动时用token.Reader读取令牌并注册WithInvalidTokenRetry回调——当 API 请求因令牌无效被拒时会重新从磁盘读取此时可能已被轮换再重试desktop.go#L220-L229主循环每10 秒Ping一次服务器检测连通性每5 分钟拉取一次DesktopSummary含策略失败状态避免对服务器造成不必要的压力desktop.go#L146-L152离线检测采用容错策略连续 6 次 Ping 失败约 1 分钟才显示离线指示避免单次网络抖动误报desktop.go#L371-L379。其他可选环境变量还包括FLEET_DESKTOP_FLEET_TLS_CLIENT_CERTIFICATE/FLEET_DESKTOP_FLEET_TLS_CLIENT_KEY使用客户端证书做 mTLS 认证、FLEET_DESKTOP_FLEET_ROOT_CA自定义根 CA、FLEET_DESKTOP_ALTERNATIVE_BROWSER_HOST以及FLEET_DESKTOP_INSECURE跳过证书校验仅用于测试等desktop.go#L107-L117。高级隐藏 macOS 菜单栏图标部分 Fleet 用户因菜单栏空间有限希望隐藏 macOS 菜单栏图标。有两种场景、两种做法手动注册 Macfleetctl package 打包时排除如果手动注册 Mac在生成 fleetd 安装包时省略--fleet-desktop标志生成的包就不会包含 Fleet Desktop 菜单栏。对应标志定义见 cmd/fleetctl/fleetctl/package.go#L178-L182。通过 Apple Business Manager 自动注册的 Mac如果通过 Apple Business ManagerABM自动注册fleetd 已默认携带 Fleet Desktop可用以下方案隐藏1. 将以下脚本添加到 Fleet#!/bin/sh if [ ! -f /Library/LaunchDaemons/com.fleetdm.orbit.plist ]; then echo Fleets agent (fleetd) is not installed. exit 1 fi /usr/bin/plutil -replace EnvironmentVariables.ORBIT_FLEET_DESKTOP -string false /Library/LaunchDaemons/com.fleetdm.orbit.plist # Reload the LaunchDaemon out-of-band. Bootout-ing it directly from this # script would kill this script too, since orbit is whats running it. cat EOF /private/tmp/fleet-hide-desktop-reload.sh #!/bin/sh /bin/sleep 15 /bin/launchctl bootout system /Library/LaunchDaemons/com.fleetdm.orbit.plist /bin/launchctl bootstrap system /Library/LaunchDaemons/com.fleetdm.orbit.plist /bin/launchctl bootout system /private/tmp/com.fleetdm.reload.plist EOF chmod 744 /private/tmp/fleet-hide-desktop-reload.sh cat EOF /private/tmp/com.fleetdm.reload.plist ?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keyLabel/key stringcom.fleetdm.reload/string keyProgramArguments/key array string/bin/sh/string string/private/tmp/fleet-hide-desktop-reload.sh/string /array keyRunAtLoad/key true/ /dict /plist EOF /bin/launchctl bootstrap system /private/tmp/com.fleetdm.reload.plist echo Fleet Desktop menu bar icon will be hidden in about 15 seconds. exit 0脚本原理用plutil将 LaunchDaemon plist 中的环境变量ORBIT_FLEET_DESKTOP置为false再通过一个辅助 LaunchAgent 在 15 秒后以launchctl bootout/bootstrap重载 orbit 的 LaunchDaemon。该环境变量正是 orbit 判断是否拉起 Fleet Desktop 的标志——orbit/cmd/orbit/orbit.go#L191-L193 中定义了fleet-desktop布尔开关及其对应的ORBIT_FLEET_DESKTOP环境变量orbit 在启动流程中读取该值决定是否执行 fleet-desktoporbit/cmd/orbit/orbit.go#L601 等处的c.Bool(fleet-desktop)判断。注意该脚本会完全停止 Fleet Desktop 进程而不只是隐藏图标。因此终端用户将失去菜单栏自服务入口如果仍需自服务应部署独立的 Fleet Desktop 应用。2. 在目标主机的 Host details 页面选择Actions Run script运行上述隐藏脚本。3.可选通过策略自动化全量执行要跨所有 macOS 主机自动运行该脚本可在 Fleet 中创建策略使用以下查询SELECT 1 FROM plist WHERE path /Library/LaunchDaemons/com.fleetdm.orbit.plist AND key EnvironmentVariables AND subkey ORBIT_FLEET_DESKTOP AND value false;然后将隐藏脚本通过策略自动化运行脚本关联到该策略当主机不满足该查询即ORBIT_FLEET_DESKTOP尚未被置为false时触发脚本实现幂等的批量隐藏。另外fleetd 的自动升级不会让菜单栏图标重新出现因为升级流程不会修改脚本更新过的 plist。iOS/iPadOS 主机如何认证iOS 和 iPadOS 主机不运行 Fleet Desktop 应用。终端用户通过 Web Clip 配置描述文件 打开自服务页面Fleet 通过 URL 中的主机 UUID认证请求。这种基于 UUID 的认证仅适用于 iOS 和 iPadOS 主机并支持所有设备认证 API 路由唯二例外且两者都不适用于 iOS/iPadOS是上报 agent 错误Report an agent error下载设备的 MDM 手动注册描述文件Download devices MDM manual enrollment profile。服务端对应实现为 server/service/devices.go#L377-L401 的AuthenticateIDeviceByURL它通过HostByUUID按 URL 中的 UUID 查找主机并强制校验主机平台必须为ios或ipados否则返回认证错误而常规的AuthenticateDevice反而会拒绝 iOS/iPadOS 平台要求它们走 URL 认证见 devices.go#L366-L369。由于 iOS/iPadOS 仅凭 UUID 认证安全性上弱于令牌 服务端存储的组合因此对于 iOS/iPadOS 主机Fleet 还会在 Get host by Fleet Desktop token 接口的响应中剥离硬件序列号、配置描述文件数据等识别性细节最大限度降低泄露面。小结Fleet Desktop 是 Fleet 终端用户体验的关键一环它让终端用户在自己设备上即可查看策略状态与自助处理同时通过 v4 UUID 令牌、按 IP 限流和一小时令牌轮换构建了完整的安全闭环。部署时通过fleetctl package --fleet-desktop随 fleetd 一并安装、自动升级安全团队可按需自定义透明度链接Premium、用脚本 策略自动化隐藏 macOS 菜单栏图标并理解 iOS/iPadOS 基于 UUID 的 URL 认证差异。结合本文引用的 orbit 客户端、令牌读写实现、服务端认证逻辑 与 YAML 配置示例即可在自己的 Fleet 实例中完整落地这些能力。【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门