Sto cercando di impostare l'accesso remoto a D-Bus e non capisco come funzionano (non) l'autenticazione e l'autorizzazione.
Ho un server D-Bus in ascolto su un socket astratto.
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31
Corro dbus-monitor
per vedere cosa sta succedendo. Il mio caso di test è notify-send hello
, che funziona quando eseguito dal computer locale.
Da un altro account sullo stesso computer, non riesco a collegarmi a quel bus.
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
Dopo aver consultato le specifiche D-Bus , ho copiato ~/.dbus-keyrings/org_freedesktop_general
l'altro account, ma non aiuta.
Ho provato a inoltrare la presa D-Bus su TCP, ispirato Schedar 's di accesso D-Bus remoto utilizzando socat .
socat TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32 ABSTRACT-CONNECT:/tmp/dbus-g5sxxvDlmz
Posso collegarmi al socket TCP dal mio account.
DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
Ma non dall'altro account, né con dbus-monitor
né con notify-send
. Stesso messaggio di errore dbus-monitor
come sopra con il socket astratto; notify-send
ora emette una traccia:
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 rivela che questa versione di notify-send
non tenta di leggere il file cookie, quindi capisco perché non sia in grado di connettersi.
Ho anche provato SSHing su un'altra macchina e inoltrare la connessione TCP.
ssh -R 8004:localhost:8004 remotehost
Sorprendentemente, dbus-monitor
funziona senza un file cookie! Posso guardare il traffico D-Bus dall'host remoto. Vedo un avviso di intercettazione nella mia dbus-monitor
istanza locale .
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"
Se corro notify-send
sul computer locale, dbus-monitor
sull'host remoto viene visualizzata la notifica. Ha sicuramente raggiunto un livello di accesso che dovrebbe richiedere l'autenticazione.
notify-send
si è lamentato di non aver trovato un cookie. Dopo aver copiato il file cookie, notify-send
funziona dal computer remoto.
Il computer locale esegue Debian wheezy. La macchina remota esegue FreeBSD 10.1.
Non capisco come funzionano l'autenticazione e l'autorizzazione D-Bus.
- Perché posso intercettare, per quanto posso dire, senza credenziali dalla macchina remota? Cosa espongo quando inoltro D-Bus a una connessione TCP? Perché le autorizzazioni sono diverse
dbus-monitor
enotify-send
diverse? - Perché non posso intercettare da un altro account sulla stessa macchina, sia sul socket astratto che sulla connessione TCP?
- Ho notato che il file dei cookie cambia ogni pochi minuti (non ho capito se è a intervalli regolari o meno). Perché?
(So di poter avviare un demone D-Bus in ascolto su TCP. Non è questo lo scopo della mia domanda, voglio capire perché quello che ho fatto e non ha funzionato.)
SCM_CREDENTIALS
specifico. Su Linux, invece utilizza l'SO_PEERCRED
opzione socket.