vdi-cloud/docs/guest-power-policy-20261104.md

53 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 云桌面图形电源操作限制(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](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,无新增凭据。
```powershell
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 生命周期”的管理平台联动。
依据:[Microsoft NoClose 策略](https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-admx-startmenu#noclose)、[login1 电源接口](https://www.freedesktop.org/software/systemd/man/latest/org.freedesktop.login1.html)。