用 Fleet 与 1Password Connect 实现 LAPS 本地管理员密码自动轮换
【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet
本地管理员密码管理是设备安全里人人知道重要、却很少有人愿意真正处理的问题:静态密码在团队间共享、被写在便签纸上、甚至同一台机器上反复使用。本文基于 Fleet 官方发布的 LAPS(Local Administrator Password Solution,本地管理员密码解决方案)实践指南,讲解如何用 Fleet 的策略自动化与脚本执行能力,结合 1Password Connect 的凭据托管能力,在 macOS 与 Windows 设备上每 7 天自动轮换本地管理员密码并安全存储。读完本文,你将掌握从部署 1Password Connect、配置 Fleet Secret Variables,到编写 GitOps 策略 YAML 与验证轮换效果的完整闭环方案。
这个方案解决什么问题
痛点:macOS 与 Windows 设备上的本地管理员账户,密码往往从创建那天起就再也不变。一旦有人离职、设备被入侵,IT 只能在一台台(甚至成百上千台)机器上手工重置密码,效率低下且容易遗漏。
方案:这套 LAPS 实现让 Fleet 每 7 天自动轮换一次本地管理员密码,并把新密码安全写入 1Password 保管库(Vault)。Fleet 负责检测与自动化执行,1Password 负责加密存储,只有获得授权的管理员才能取回凭据——既消灭了静态密码风险,又保留了按需取用能力。
工作原理
Fleet 的策略(Policy)持续监控设备,检查本地管理员密码是否在最近一周内完成轮换。当某台主机未通过这项检查时,Fleet 通过策略上的run_script自动化自动触发对应平台的 LAPS 脚本,脚本按顺序完成四件事:
- 生成一个强随机密码;
- 通过 1Password Connect API 将密码写入指定保管库;
- 更新本地管理员账户的密码;
- 用设备主机名、用户名和时间戳为这条凭据打上标签。
关键的安全设计是:密码在脚本将其直接应用到本地账户之前,不会以明文形式离开 1Password Connect 服务器。这也符合文档中对"零信任检索"的描述——即使有人拿到了设备访问权,也找不到散落在系统里的明文密码。
开始部署
前置条件
- Fleet Premium——Secret Variables 与策略自动脚本执行属于 Premium 能力;
- 一台 Fleet 纳管设备可访问的 1Password Connect 服务器;
- 已配置好的 Fleet GitOps 仓库——脚本与策略都通过 GitOps 方式下发。
部署 1Password Connect
首先按照 1Password Connect 官方文档完成服务器部署,你需要拿到三样信息:
- Connect 服务器 URL;
- API Token(用于鉴权);
- 保管库 ID(Vault ID,密码将要写入的保管库)。
这三样信息随后将分别对应 Fleet 侧的三个 Secret Variable。
在 Fleet 中配置 Secret Variables
Fleet 的 Secret Variables 以$FLEET_SECRET_前缀命名,在脚本与配置下发时由服务端完成替换,因此敏感值不会以明文形式写死在 GitOps 仓库或设备上的脚本里。在server/fleet/secrets.go中可以确认前缀常量定义:
const ServerSecretPrefix = "FLEET_SECRET_"为这套 LAPS 方案创建以下四个 Secret Variables:
| 变量名 | 用途 |
|---|---|
FLEET_SECRET_OP_CONNECT_HOST | 1Password Connect 服务器端点 |
FLEET_SECRET_OP_CONNECT_TOKEN | Connect API 鉴权 Token |
FLEET_SECRET_OP_VAULT_ID | 凭据要写入的目标保管库 ID |
FLEET_SECRET_LAPS_ADMIN_USERNAME | 被创建/轮换的用户名(默认laps-admin) |
Secret Variables 的增删查在服务端有完整 API 支撑,对应实现位于 server/fleet/api_secret_variables.go,包括CreateSecretVariablesRequest(支持dry_run预检)、ListSecretVariablesRequest与DeleteSecretVariableRequest,即可以通过 Fleet API 以声明方式管理这些变量。同时,server/fleet/secrets.go 中定义了MissingSecretsError:当脚本引用了数据库中不存在的$FLEET_SECRET_*变量时,Fleet 会直接拒绝保存并提示缺失变量名,这在调试 GitOps 配置时非常有用。
添加脚本与策略
获取laps-1password仓库中的脚本,把它们复制进 Fleet GitOps 仓库的lib/目录,并在其中加入用于检查最近一次密码轮换时间的策略 YAML 文件。
每个策略都通过run_script自动化关联一个平台专属的 LAPS 脚本:任何未通过 7 天轮换检查的主机,都会自动触发对应脚本执行。当 GitOps 变更被推送到仓库后,Fleet 会自动拾取并应用。
从源码看,run_script正是策略失败时的自动化触发机制。在 server/fleet/policies.go 中,Policy结构体上明确声明:
// RunScript is used to trigger script execution when this policy fails. // // Only applies to team policies. RunScript *PolicyScript `json:"run_script,omitempty"`PolicyScript携带关联脚本的ID与Name(见同文件 PolicyScript 定义),策略自动化类型也定义了PolicyAutomationTypeScripts = "scripts"这一分支。也就是说,脚本执行失败会进入策略自动化重试/安装尝试的治理框架——server/fleet/policies.go 中定义了MaxPolicyAutomationRetries = 3、MaxPolicyAutomationInstallAttempts = 10与 24 小时的安装尝试过期时间,用于约束自动化重试行为。
关于脚本本身,Fleet 对可托管脚本有严格校验,相关逻辑在 server/fleet/scripts.go:
- 仅允许
.sh、.ps1、.py三种扩展名; - shell 脚本使用 shell shebang(如
#!/bin/sh)或省略 shebang; - Python 脚本必须以
#!/usr/bin/env python3形式的 shebang 开头; - PowerShell 脚本不允许 shebang(由
powershell.exe直接执行)。
因此 LAPS 的 macOS 脚本应命名为.sh、Windows 脚本为.ps1,并严格遵守上述约束,否则策略保存会被拒绝。脚本执行走POST /api/_version_/fleet/scripts/run接口,该端点在 server/service/handler.go 中注册,并受到MaxScriptSize请求体大小限制。
验证部署是否生效
部署完成后,按以下清单验证:
- 检查 1Password 保管库——应出现带主机名标签的新凭据条目;
- 查看 Fleet 策略页面——确认主机在轮换后转为"通过(Passing)"状态;
- 测试凭据取回——由授权管理员从 1Password 拉取一条凭据,验证端到端可用。
Fleet 的活动流(Activity Feed)也会记录脚本执行活动,ran_script事件类型定义在 server/fleet/activities.go,其中包含script_execution_id与script_name等字段,可作为审计与排障的依据。
为什么这套方案有效
自动化降低风险:不再有共享密码与人工轮换排期,设备按固定节奏自行轮换。
审计追踪:每次轮换都会在保管库中生成一条带元数据(主机名、用户名、时间戳)的新条目,你能精确知道凭据何时变更、属于哪台设备。
零信任取回:凭据在 1Password 中保持加密状态,直到具备权限的管理员取用。即便有人攻入设备,也找不到明文密码。
平台灵活性:同一套工作流同时覆盖 macOS 与 Windows——一套策略、一套脚本集、一致的终端安全姿态。
测试与故障排查
laps-1password仓库自带完整的测试套件,可通过 Docker Compose 在本地运行,并提供了 macOS 与 Windows 两套手动测试清单。
若某次轮换失败,优先做两件事:
- 查看 Fleet 的脚本执行日志(结合上文的活动流
script_execution_id定位单次执行); - 确认设备能否访问 Connect 服务器——防火墙规则与网络分段有时会拦截 API 调用,这是最常见的失败原因。
此外还可借助 Fleet 侧的MissingSecretsError提示(见 server/fleet/secrets.go)快速判断是否为 Secret Variable 缺失或拼写错误导致的配置问题。
落地后的进阶建议
LAPS 上线后,文档建议继续完善:
- 为连续轮换失败配置告警;
- 依据自身安全要求调整轮换间隔(默认 7 天);
- 为 helpdesk 团队文档化凭据取回流程;
- 复核 1Password 的访问策略,确保只有授权管理员可以查看凭据。
本地管理员密码管理本不必痛苦:Fleet 负责自动化编排,1Password 负责加密存储,二者结合即可获得企业级的凭据管理能力。本文所涉及的所有 Fleet 能力(Secret Variables、策略run_script自动化、脚本校验与执行 API)均可在当前仓库对应源码中逐一印证,为你的落地实施提供了完整的实现依据。
【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考