QubesOS:sys-usb管控USB控制器时如何接入指定键鼠到dom0?
现有配置工作原理
1. RPC策略配置
qubes.InputKeyboard和qubes.InputMouse是Qubes内置的RPC服务,作用是允许指定qube将自身连接的键盘/鼠标输入设备转发给目标qube(此处为dom0)。
sys-usb dom0 allow,user=root:仅允许sys-usb以root身份向dom0转发键盘、鼠标输入$anyvm $anyvm deny:兜底规则,禁止所有其他qube之间的输入设备转发,规避安全风险
2. grub内核参数usbcore.authorized_default=0
这个内核参数会让所有USB设备刚接入时默认处于未授权状态,即设备不会自动启用。核心作用是阻止恶意USB设备(如BadUSB)接入后自动执行代码,必须通过后续规则手动授权或转发设备。
需求实现方案
你的需求完全可以实现,以下是分步配置方法:
第一步:获取目标键盘/鼠标的设备ID(VID/PID)
- 启动sys-usb并打开终端
- 运行命令
lsusb,找到目标设备条目,格式示例:
其中Bus 001 Device 003: ID 1234:5678 Logitech USB Keyboard Bus 001 Device 004: ID abcd:wxyz Microsoft Basic Mouse1234是厂商ID(VID),5678是产品ID(PID),记录这两组值。
第二步:在sys-usb中创建udev规则实现设备分流
udev规则用于识别指定USB设备并转发给dom0,同时自动授权其他设备(蓝牙耳机、未知设备)让sys-usb接管。
- 在sys-usb终端中创建规则文件:
sudo nano /rw/config/usb-input-forward.rules - 写入以下内容(替换为你自己的VID/PID):
# 转发指定键盘到dom0 SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", ACTION=="add", RUN+="/usr/bin/qvm-send-input dom0 keyboard $kernel" # 转发指定鼠标到dom0 SUBSYSTEM=="usb", ATTRS{idVendor}=="abcd", ATTRS{idProduct}=="wxyz", ACTION=="add", RUN+="/usr/bin/qvm-send-input dom0 mouse $kernel" # 自动授权所有其他USB设备(让sys-usb接管) SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{authorized}="1" - 保存文件后重新加载udev规则:
sudo udevadm control --reload-rules && sudo udevadm trigger
第三步:配置sys-usb权限(无网络+限制root)
- 禁用网络:
在Qubes管理器中右键点击sys-usb → 「Settings」→ 「Network」选项卡,将「NetVM」设为「(none)」并保存。 - 限制root权限(可选):
sys-usb需要root权限管理USB设备,完全移除会导致功能失效,可通过sudo规则限制最小权限:- 编辑sudoers文件:
sudo visudo - 添加规则(替换
username为sys-usb的普通用户名):username ALL=(ALL) NOPASSWD: /usr/bin/qvm-send-input, /usr/bin/udevadm, /usr/bin/lsusb
- 编辑sudoers文件:
第四步:调试与验证
- 重启sys-usb或整个系统
- 接入目标键盘/鼠标,确认可在dom0正常使用
- 接入蓝牙耳机或其他未知设备,确认sys-usb可正常识别使用
- 排查问题时可查看sys-usb日志:
sudo journalctl -f,检查udev规则触发情况;在dom0中运行cat /proc/cmdline,确认usbcore.authorized_default=0参数生效
内容的提问来源于stack exchange,提问作者Damian Kęska
相关产品推荐
相关产品推荐

