无法让DBus策略按预期工作,寻求无sudo权限执行方案
DBus策略配置不生效问题排查与解决
问题描述
配置DBus策略允许用户alice调用systemd-resolved的SetLinkDNS方法,但执行命令时提示Call failed: Access Denied,添加sudo前缀可正常运行,需实现无需超级用户权限执行该操作。
现有DBus策略配置
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> <busconfig> <policy user="alice"> <allow send_interface="org.freedesktop.resolve1.Manager" send_member="SetLinkDNS"/> </policy> </busconfig>
执行的命令及报错
创建WireGuard接口:
ip link add abc type wireguard
调用DBus方法:
busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' 3 1 2 4 8 8 8 8
报错信息:
Call failed: Access Denied
解决方案
1. 确认策略文件位置
系统级DBus策略文件必须放置在/etc/dbus-1/system.d/目录下,建议命名为org.freedesktop.resolve1.conf,放置在其他路径不会被DBus加载。
2. 完善DBus策略规则
DBus权限检查会同时验证目标服务、对象路径、接口和方法,补充缺失的规则:
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> <busconfig> <policy user="alice"> <allow send_destination="org.freedesktop.resolve1"/> <allow send_path="/org/freedesktop/resolve1"/> <allow send_interface="org.freedesktop.resolve1.Manager" send_member="SetLinkDNS"/> </policy> </busconfig>
3. 重新加载DBus配置
执行命令使新策略生效:
systemctl reload dbus
4. 添加Polkit权限规则
systemd-resolved修改DNS设置需要CAP_NET_ADMIN权限,仅靠DBus策略无法绕过,需配置Polkit规则授权:
创建文件/etc/polkit-1/rules.d/50-resolved-dns.rules,内容如下:
polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.resolve1.set-link-dns" && subject.user == "alice") { return polkit.Result.YES; } });
5. 验证权限
重新执行原busctl命令,确认可以正常运行。
内容的提问来源于stack exchange,提问作者Sanfer
相关产品推荐
相关产品推荐

