53 lines
4.5 KiB
Markdown
53 lines
4.5 KiB
Markdown
# 云桌面图形电源操作限制(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)。
|