Ich versuche, den Fernzugriff auf D-Bus einzurichten, und verstehe nicht, wie Authentifizierung und Autorisierung funktionieren (nicht).
Ich habe einen D-Bus-Server, der an einem abstrakten Socket lauscht.
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31
Ich renne dbus-monitor
, um zu sehen, was los ist. Mein Testfall ist notify-send hello
, was funktioniert, wenn es vom lokalen Rechner ausgeführt wird.
Von einem anderen Konto auf demselben Computer kann ich keine Verbindung zu diesem Bus herstellen.
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
Nach dem Durchsuchen der D-Bus-Spezifikation habe ich ~/.dbus-keyrings/org_freedesktop_general
auf das andere Konto kopiert , aber es hilft nicht.
Ich habe versucht, den D-Bus-Socket über TCP weiterzuleiten , inspiriert durch die Remote -Verwendung von socat für Access D-Bus von schedar .
socat TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32 ABSTRACT-CONNECT:/tmp/dbus-g5sxxvDlmz
Ich kann von meinem Konto aus eine Verbindung zum TCP-Socket herstellen.
DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
Aber nicht von der anderen Seite, weder mit dbus-monitor
noch mit notify-send
. Gleiche Fehlermeldung dbus-monitor
wie oben beim abstrakten Socket; notify-send
Jetzt wird eine Spur ausgegeben:
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 zeigt, dass diese Version von notify-send
nicht versucht, die Cookie-Datei zu lesen, so dass ich verstehe, warum es nicht in der Lage wäre, eine Verbindung herzustellen .
Ich habe auch versucht, SSH auf einen anderen Computer zu übertragen und die TCP-Verbindung weiterzuleiten.
ssh -R 8004:localhost:8004 remotehost
Funktioniert überraschenderweise dbus-monitor
ohne Cookie-Datei! Ich kann den D-Bus-Verkehr vom Remote-Host aus verfolgen. In meiner lokalen dbus-monitor
Instanz wird ein Hinweis zum Abhören angezeigt.
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"
Wenn ich notify-send
auf dem lokalen Computer ausgeführt werde, wird dbus-monitor
auf dem Remote-Host die Benachrichtigung angezeigt. Es ist definitiv eine Zugriffsebene erreicht, die eine Authentifizierung erfordern sollte.
notify-send
beschwerte sich darüber, dass kein Cookie gefunden wurde. Funktioniert nach dem Kopieren der Cookie-Datei auf notify-send
dem Remote-Computer.
Auf der lokalen Maschine läuft Debian Wheezy. Auf der entfernten Maschine läuft FreeBSD 10.1.
Ich verstehe nicht, wie die D-Bus-Authentifizierung und -Autorisierung funktionieren.
- Warum kann ich, soweit ich das beurteilen kann, ohne Anmeldeinformationen von der Remote-Maschine abhören? Was kann ich tun, wenn ich D-Bus an eine TCP-Verbindung weiterleite? Warum sind Berechtigungen für
dbus-monitor
undnotify-send
unterschiedlich? - Warum kann ich nicht von einem anderen Konto auf demselben Computer abhören, ob über den abstrakten Socket oder über die TCP-Verbindung?
- Ich habe festgestellt, dass sich die Cookie-Datei alle paar Minuten ändert (ich habe nicht herausgefunden, ob sie in regelmäßigen Abständen stattfindet oder nicht). Warum?
(Ich weiß, dass ich einen D-Bus-Daemon starten kann, der auf TCP lauscht. Das ist nicht der Zweck meiner Frage, ich möchte verstehen, warum das, was ich getan und was nicht funktioniert hat.)
SCM_CREDENTIALS
speziell verwendet. Unter Linux wirdSO_PEERCRED
stattdessen die Option socket verwendet.