4.5 KiB
云桌面图形电源操作限制(2026-11-04)
本次已通过现有 PVE Guest Agent 在三台正在运行的云桌面部署持久策略,限制当前客户桌面账户的关机、重启、睡眠和休眠入口。此修改发生在客体系统中,不依赖 Moonlight 的键盘过滤补丁是否已编译部署。
| 客体 | 限制账户 | 已应用策略 |
|---|---|---|
| Windows VM100 | test |
当前用户 Explorer NoClose=1,移除开始菜单和 Windows 安全界面的电源命令 |
| 麒麟 VM101 | test1 |
polkit 0.105 .pkla 拒绝电源权限,加系统 D-Bus 用户级电源方法拒绝规则 |
| Ubuntu VM102 | test2 |
polkit .rules 拒绝电源权限,加系统 D-Bus 用户级电源方法拒绝规则 |
Windows 在实际登录用户的交互会话内广播 WM_SETTINGCHANGE/Policy,并调用 SHRestricted(REST_NOCLOSE=2) 验证有效结果为 1。未重启 Explorer、注销用户或重启 Windows。临时验证任务 VDIPowerPolicyProbe 在执行后删除。
Linux 同时限制 login1 的 PowerOff、Reboot、Halt、Suspend、Hibernate、HybridSleep、SuspendThenHibernate、ScheduleShutdown 及对应 WithFlags 方法,并拒绝桌面用户的 Can* 查询。菜单不能再获得电源操作能力,电源请求也会在系统总线被拒绝。D-Bus 仅 ReloadConfig,不重启总线或图形会话。
实测发现两台 Linux 当前图形会话的 pkcheck 仍对基础 reboot 动作返回授权,即使后台 CanReboot 查询已返回 no;因此不能只用 polkit 后台查询宣称重启已屏蔽。此现象的内部原因未确定。本次以额外 D-Bus 用户拒绝规则封住实际请求路径。定位过程中仅在麒麟重启过一次 polkit 服务,Sunshine 和图形会话保持运行。
验证范围
- Windows 注册表读回和交互 Shell 有效策略均为 1。
- 两台 Linux 七项 Can* 查询均被系统总线拒绝;八种电源方法的错误参数探测均返回 Access denied。
- 电源探测故意使用字符串参数
s VDI_INVALID_SIGNATURE;正常方法需要 boolean、flags 或其他签名。即使拒绝规则失效,该参数也无法通过 logind 的签名校验,不会形成有效关机/重启请求。 - 两台 Linux 使用实际 ukui-session/gnome-shell 进程检查 polkit,并记录上述 reboot 授权残留;额外总线拒绝验证通过。两台 vdi-sunshine 均 active,root 的 CanPowerOff 仍 yes。
- 三台 VM 均 running;Windows LastBoot 和 Linux boot ID 与本轮部署前一致。
- 未点击会真实执行关机的按钮,未进行重启后验证,也未逐项验收各桌面的菜单外观或缓存刷新表现。菜单若暂时仍显示旧项目,Linux 后端仍拒绝电源调用。
原始结果位于 evidence/guest-power-policy-20261104。
重复部署与恢复
工具:tools/set-guest-power-policy.ps1(Windows)、tools/set-guest-power-policy.py(Linux)。管理机上的 tools/deploy-guest-power-policy.py 使用已有 PVE 认证和 Guest Agent,无新增凭据。
python tools/deploy-guest-power-policy.py apply --vm 100
python tools/deploy-guest-power-policy.py apply --vm 101 --user test1
python tools/deploy-guest-power-policy.py apply --vm 102 --user test2
把 apply 换成 query 可查询,换成 restore 可恢复本轮首次部署前的值/文件;重复 apply 不覆盖初始备份。新镜像或新客户账户应针对实际账户重新执行,不能假设策略自动覆盖新用户。
Windows 备份:C:\ProgramData\VDI\power-policy\original.clixml。
Linux 备份:/var/lib/vdi/power-policy/。目标文件为:
- 麒麟:
/etc/polkit-1/localauthority/90-mandatory.d/99-vdi-power.pkla。 - Ubuntu:
/etc/polkit-1/rules.d/00-vdi-power.rules。 - 两者:
/etc/dbus-1/system.d/zz-vdi-desktop-power.conf。
本策略限制客户图形电源入口,保留 root、管理员和 PVE 维护能力;不把具有管理员权限的客户账户变成安全隔离账户,不阻止管理员使用命令维护,也不修改自动更新行为。本轮未改变锁屏、注销或切换用户策略。
盒子断电会中断客户端连接,并不自动等于云端 VM 关机;本次未实现“盒子物理开关控制 VM 生命周期”的管理平台联动。