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-monitorper 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_generall'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-monitorné con notify-send. Stesso messaggio di errore dbus-monitorcome sopra con il socket astratto; notify-sendora 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-sendnon 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-monitorfunziona senza un file cookie! Posso guardare il traffico D-Bus dall'host remoto. Vedo un avviso di intercettazione nella mia dbus-monitoristanza 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-sendsul computer locale, dbus-monitorsull'host remoto viene visualizzata la notifica. Ha sicuramente raggiunto un livello di accesso che dovrebbe richiedere l'autenticazione.
notify-sendsi è lamentato di non aver trovato un cookie. Dopo aver copiato il file cookie, notify-sendfunziona 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-monitorenotify-senddiverse? - 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_CREDENTIALSspecifico. Su Linux, invece utilizza l'SO_PEERCREDopzione socket.