You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:32:38