Virtualizor控制面板依靠 guest-exec: "df -m /" 算磁盘,依靠 guest-file-open: /proc/meminfo 算内存。如果直接在 Agent 里切断这些指令,面板就会变 N/A。(实测virfusion面板也适用)
通过 Systemd 沙盒,我们可以做到:允许 Agent 读取内存和磁盘总量,但绝对禁止它读取你的 /root 目录、/home 目录、密码文件(/etc/shadow)、SSH 密钥或任何保密文件夹。
实现步骤:给 qemu-guest-agent 施加 Systemd 限制
Linux 的 Systemd 可以在内核级别限制某个服务能够“看到”和“访问”哪些目录。即便 QGA 以 root 权限运行,也出不了这个沙盒。
开箱即用的 Shell 脚本 harden-qemu-ga.sh。
这个脚本采用标准的 Systemd Drop-in 配置机制(/etc/systemd/system/qemu-guest-agent.service.d/override.conf),非侵入且易于维护。它支持直接在命令行传入需要额外屏蔽的敏感路径,并会自动完成重载与效果验证。
运维加固脚本 harden-qemu-ga.sh
你可以直接在 VPS 上新建该文件:
#!/bin/bash
# ==============================================================================
# 脚本名称: harden-qemu-ga.sh
# 说明: 为 QEMU Guest Agent 施加 Systemd 内核级沙盒隔离
# 支持系统: Debian / Ubuntu / CentOS / RHEL / AlmaLinux / Rocky Linux
# ==============================================================================
set -e
# 终端颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 1. 检查 root 权限
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}[错误] 请使用 root 权限或 sudo 运行此脚本!${NC}"
exit 1
fi
# 2. 检查 qemu-guest-agent 是否安装
if ! systemctl list-unit-files | grep -q "^qemu-guest-agent\.service"; then
echo -e "${RED}[错误] 系统中未检测到 qemu-guest-agent 服务,请先安装。${NC}"
exit 1
fi
# 3. 设置基础屏蔽路径
# 路径前的 - 符号代表:即便该路径不存在也不抛出错误,保证服务正常启动
BASE_PATHS="-/etc/shadow -/etc/gshadow -/etc/ssh -/etc/sudoers -/var/lib/mysql"
# 处理用户自定义传入的路径
CUSTOM_PATHS=""
if [ $# -gt 0 ]; then
for path in "$@"; do
# 确保路径格式正确(自动补全 - 前缀)
if [[ "$path" != -* ]]; then
path="-$path"
fi
CUSTOM_PATHS="$CUSTOM_PATHS $path"
done
else
# 默认额外屏蔽参数(可根据需求修改此处的硬编码默认值)
CUSTOM_PATHS="-/data -/admin -/secret"
fi
ALL_INACCESSIBLE="${BASE_PATHS}${CUSTOM_PATHS}"
echo -e "${BLUE}[+] 准备应用 QEMU Guest Agent Systemd 沙盒加固策略...${NC}"
echo -e "${YELLOW}[!] 完全屏蔽的路径清单:${NC} ${ALL_INACCESSIBLE}"
# 4. 创建 Drop-in 配置目录并写入 override.conf
OVERRIDE_DIR="/etc/systemd/system/qemu-guest-agent.service.d"
OVERRIDE_FILE="${OVERRIDE_DIR}/override.conf"
mkdir -p "$OVERRIDE_DIR"
cat <<EOF > "$OVERRIDE_FILE"
# Generated by harden-qemu-ga.sh
[Service]
# 1. 彻底隔离用户主目录 (/root, /home 对 Agent 显示为空)
ProtectHome=yes
# 2. 保护系统文件 (/usr, /boot, /etc 挂载为只读)
ProtectSystem=full
# 3. 彻底屏蔽敏感路径(沙盒内覆盖为 0 字节空节点)
InaccessiblePaths=${ALL_INACCESSIBLE}
# 4. 禁用提权与内核修改权限
NoNewPrivileges=yes
ProtectKernelTunables=yes
ProtectControlGroups=yes
EOF
echo -e "${GREEN}[✓] 配置文件已生成: ${OVERRIDE_FILE}${NC}"
# 5. 重载 Systemd 配置并重启服务
echo -e "${BLUE}[+] 重载 Systemd 并重启 qemu-guest-agent...${NC}"
systemctl daemon-reload
systemctl restart qemu-guest-agent
# 6. 验证配置生效状态
echo -e "${BLUE}[+] 正在验证已生效的沙盒规则:${NC}"
echo "----------------------------------------------------------------------"
systemctl show qemu-guest-agent -p ProtectHome -p ProtectSystem -p InaccessiblePaths -p NoNewPrivileges --no-pager
echo "----------------------------------------------------------------------"
echo -e "${GREEN}[✓] 加固完成!qemu-guest-agent 已被限制在沙盒中,服务商控制面板功能不受影响。${NC}"
使用方法
1. 赋权并执行(使用脚本内预设的路径):
chmod +x harden-qemu-ga.sh
sudo ./harden-qemu-ga.sh
2. 灵活传参(直接指定要保护的自定义目录):
如果你有额外的文件夹需要保护,可以在运行脚本时作为参数直接传入:
sudo ./harden-qemu-ga.sh /var/www/html /opt/my-db /backup
日后运维与撤销方法
如果未来需要修改受保护路径,或者彻底还原系统配置:
- 修改保护路径:重新带参数运行一遍脚本即可,它会自动覆盖旧配置。
撤销沙盒规则(恢复默认):
sudo rm -rf /etc/systemd/system/qemu-guest-agent.service.d sudo systemctl daemon-reload sudo systemctl restart qemu-guest-agent