首页 > 解决方案 > 嵌入式硬件上的 DBus 权限被拒绝

问题描述

我是 DBus 的新手,我正在尝试使用sdbus-cpp库在我自己的 C++ 应用程序中调用以下方法:

org.freedesktop.login1.Manager.Suspend

调用的目标是设备切换到挂起模式。

如果应用程序以 root 用户身份运行,则该应用程序到目前为止可以工作!但出于安全原因,我想以非 root 用户身份运行应用程序(可以说为'embuser')。

在网上我发现可以配置DBus。所以我将以下文件放在文件夹 /etc/dbus-1/system.d/suspend.conf 中,内容如下:

root@colibri:/etc/dbus-1/system.d$ cat suspend.conf
<!DOCTYPE busconfig PUBLIC
          "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
          "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>

  <!-- Only root or user embuser can own the login1 service -->
  <policy user="embuser">
    <allow own="org.freedesktop.login1"/>
  </policy>
  <policy user="root">
    <allow own="org.freedesktop.login1"/>
  </policy>

  <!-- Allow anyone to invoke methods on login1 server -->
  <policy context="default">
    <allow send_destination="org.freedesktop.login1"/>
    <allow receive_sender="org.freedesktop.login1"/>
  </policy>
</busconfig>

我重新启动了 dbus 守护程序 ( systemctl restart dbus)。然后,当我启动我的应用程序(作为“embuser”运行)时,会打印出以下内容:

在抛出 'sdbus::Error' what() 的实例后调用终止:[org.freedesktop.DBus.Error.AccessDenied] Permission denied Aborted

如上所述,当应用程序以 root 用户身份启动时,应用程序按预期工作并激活挂起模式。因此,C++ 应用程序本身应该没有问题。

为了以非 root 用户身份调用 DBus 方法,我该怎么做?我错过了配置文件中的某些内容吗?或者我还能做些什么来执行 DBus 调用?

该应用程序在嵌入式 Linux 设备(带有 ARM iMX7d 处理器的 Colibri 模块)上运行。

这是嵌入式设备的 Linux 内核和 systemd 版本:

$ uname -r
5.4.91-5.2.0-devel+git.c59b3c2da1e9

$ systemctl --version
systemd 244 (244.5+)
+PAM -AUDIT -SELINUX +IMA -APPARMOR -SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN2 -IDN -PCRE2 default-hierarchy=hybrid

标签: embedded-linuxdbususer-permissions

解决方案


推荐阅读