我正在尝试设置对D-Bus的远程访问,但我不了解身份验证和授权的工作方式(不)。
我有一台D-Bus服务器在抽象套接字上侦听。
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31
我跑去dbus-monitor
看发生了什么。我的测试用例是notify-send hello
,当从本地计算机执行时可以工作。
从同一台计算机上的另一个帐户,我无法连接到该总线。
otheraccount$ DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31 dbus-monitor
Failed to open connection to session bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
otheraccount$ DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31 notify-send hello
浏览D-Bus规范后,我已复制~/.dbus-keyrings/org_freedesktop_general
到另一个帐户,但这无济于事。
我试图转发d总线插槽通过TCP,灵感来自schedar的访问d-Bus的远程使用socat。
socat TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32 ABSTRACT-CONNECT:/tmp/dbus-g5sxxvDlmz
我可以从我的帐户连接到TCP套接字。
DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
但不能从另一个帐户获得,也不能与dbus-monitor
或一起使用notify-send
。与dbus-monitor
上述抽象套接字相同的错误消息;notify-send
现在发出跟踪:
otheraccount$ DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
** (notify-send:2952): WARNING **: The connection is closed
Stracing揭示此版本的notify-send
不会尝试读取cookie文件,因此我了解为什么它无法连接。
我还尝试了SSH进入另一台计算机并转发TCP连接。
ssh -R 8004:localhost:8004 remotehost
令人惊讶的是,dbus-monitor
没有cookie文件就可以工作!我可以查看来自远程主机的D-Bus通信。我看到有关在本地dbus-monitor
实例中进行监听的通知。
remotehost$ DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 dbus-monitor
signal sender=org.freedesktop.DBus -> dest=:1.58 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string ":1.58"
method call sender=:1.58 -> dest=org.freedesktop.DBus serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "eavesdrop=true"
如果我notify-send
在本地计算机dbus-monitor
上运行,则在远程主机上会看到通知。绝对达到了需要身份验证的访问级别。
notify-send
抱怨找不到饼干。复制cookie文件后,notify-send
可以在远程计算机上工作。
本地计算机运行Debian wheezy。远程机器运行FreeBSD 10.1。
我不了解D-Bus身份验证和授权的工作方式。
- 据我所知,为什么我可以在没有远程计算机凭据的情况下进行监听?将D-Bus转发到TCP连接时我要暴露什么?为什么是授权
dbus-monitor
和notify-send
不同? - 为什么无论是通过抽象套接字还是通过TCP连接,都无法从同一计算机上的另一个帐户进行窃听?
- 我注意到cookie文件每隔几分钟就会更改一次(我不确定是否有规律的间隔)。为什么?
(我知道我可以启动一个侦听TCP的D-Bus守护程序。这不是我提出问题的目的,我想了解为什么我做到了却没起作用。)
SCM_CREDENTIALS
专门使用。在Linux上,它改用SO_PEERCRED
socket选项。