非 root 用户通过 DBus 关闭的权限被拒绝 [已关闭]

问题描述 投票:0回答:1

我正在尝试从 Yocto Linux 系统上运行的应用程序执行 PowerOff dbus 命令。为此,我使用 org.freedesktop.login1(systemd-logind 的 D-Bus 接口)。 我可以看到正在执行的命令,但收到权限被拒绝错误。

然后我尝试更改

/etc/dbus-1/system.conf
添加一条允许规则,让用户“user1”执行关机功能。 我在这里尝试了几件事,但不知何故这些允许规则仍然对我不起作用。当出现错误时,我确实注意到 dbus 将无法重新启动。但政策似乎被忽视了。

<busconfig>

<!-- Allow anyone to call methods on the org.freedesktop.login1 interface -->
 <policy user="root">
   <allow own="org.freedesktop.login1"/>
 </policy>

<policy user="user1">
    <allow send_destination="org.freedesktop.login1" send_interface="org.freedesktop.DBus.Properties"/>
    <allow send_destination="org.freedesktop.login1" send_interface="org.freedesktop.login1.Manager"/>
  </policy>

<policy user="user1">
  <allow
     send_destination="org.freedesktop.login1"
     send_interface="org.freedesktop.login1.Manager"
     send_member="PowerOff"/>
  <allow send_interface="org.freedesktop.DBus.ObjectManager"/>
  <allow send_interface="org.freedesktop.DBus.Properties"/>
</policy>
</busconfig>

我也尝试将其添加到

/etc/dbus-1/system.d/logind.conf
/etc/dbus-1/system-local.conf
但没有成功。

我们没有在此系统上运行 Polkit 或 Consolekit。

对允许规则或调试建议有任何反馈吗?

dbus
1个回答
0
投票

D-Bus 策略不是主要访问检查发生的地方。它们更像是 D-Bus 调用的“防火墙”;但与任何其他类型的防火墙一样,该服务在成功接收呼叫后可以自由地实施自己的访问检查。 重要的是,在安装了 Polkit 的系统上,Polkit 访问检查并不像您想象的那样由 D-Bus 完成 - 相反,Polkit 检查是由 logind 本身完成的,而 systemd-logind 的 D-Bus 策略是

默认情况下已经完全打开。

您可以在/usr/share/dbus-1/system.d中看到这一点 - 默认情况下,所有用户都可以发送“PowerOff”方法调用,因为登录本身具有用于权限检查的代码。

事实上,该服务无法了解 D-Bus 策略,就像 Web 服务器不知道存在哪些防火墙规则一样。请求要么达到,要么未达到。
总而言之,这意味着如果未安装 Polkit,服务自身的访问检查必须

失败关闭

– 即它必须在仍然安装相同的“完全开放”D-Bus 防火墙策略的假设下工作,并且必须继续拒绝非特权调用,即使 D-Bus 策略允许它们通过。一旦 Polkit 访问检查服务因任何原因无法启动,服务无法打开(正如您所期望的)可能会导致安全问题,因为系统将使用开放的 D-Bus 策略运行,并且没有 Polkit .

这意味着您无法纯粹通过 D-Bus 策略规则来实现您想要的目标。如果您需要通过 D-Bus 与登录对话(而不是“sudo systemctl”),那么您必须使用 Polkit 并在 /etc/polkit 中编写规则以允许特定用户进行操作。 (您不需要 ConsoleKit – 这实际上就是 systemd-logind 所取代的。)

或者,您需要编写自己的“代理”服务,该服务以 root 身份运行,通过您首选的协议(D-Bus 或其他)接受请求并调用登录。

© www.soinside.com 2019 - 2024. All rights reserved.