Estoy tratando de configurar el acceso remoto a D-Bus, y no entiendo cómo funcionan (no) la autenticación y la autorización.
Tengo un servidor D-Bus escuchando en un socket abstracto.
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31
Corro dbus-monitor
a ver lo que está pasando. Mi caso de prueba es notify-send hello
, que funciona cuando se ejecuta desde la máquina local.
Desde otra cuenta en la misma máquina, no puedo conectarme a ese 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
Después de examinar la especificación de D-Bus , copié ~/.dbus-keyrings/org_freedesktop_general
a la otra cuenta, pero no ayuda.
He intentado enviar el zócalo de D-Bus a través de TCP, inspirado por Schedar 's Acceso D-Bus de forma remota utilizando socat .
socat TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32 ABSTRACT-CONNECT:/tmp/dbus-g5sxxvDlmz
Puedo conectarme al socket TCP desde mi cuenta.
DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
Pero no de la otra cuenta, ni con dbus-monitor
ni con notify-send
. Mismo mensaje de error para el dbus-monitor
anterior con el socket abstracto; notify-send
ahora emite un rastro:
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 revela que esta versión de notify-send
no intenta leer el archivo de cookies, por lo que entiendo por qué no podría conectarse.
También probé SSHing en otra máquina y reenvié la conexión TCP.
ssh -R 8004:localhost:8004 remotehost
Sorprendentemente, dbus-monitor
funciona sin un archivo de cookies. Puedo ver el tráfico de D-Bus desde el host remoto. Veo un aviso sobre espionaje en mi dbus-monitor
instancia local .
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"
Si ejecuto notify-send
en la máquina local, dbus-monitor
en el host remoto ve la notificación. Definitivamente ha alcanzado un nivel de acceso que debería requerir autenticación.
notify-send
se quejó de no encontrar una cookie. Después de copiar el archivo cookie, notify-send
funciona desde la máquina remota.
La máquina local ejecuta Debian wheezy. La máquina remota ejecuta FreeBSD 10.1.
No entiendo cómo funcionan la autenticación y autorización de D-Bus.
- ¿Por qué puedo espiar, hasta donde puedo decir, sin credenciales de la máquina remota? ¿Qué expongo cuando reenvío D-Bus a una conexión TCP? ¿Por qué las autorizaciones para
dbus-monitor
ynotify-send
diferentes? - ¿Por qué no puedo espiar desde otra cuenta en la misma máquina, ya sea a través del socket abstracto o por la conexión TCP?
- Noté que el archivo de cookies cambia cada pocos minutos (no he descubierto si es a intervalos regulares o no). ¿Por qué?
(Sé que puedo lanzar un demonio D-Bus que escucha en TCP. Ese no es el propósito de mi pregunta, quiero entender por qué lo que hice y no funcionó).
fuente
SCM_CREDENTIALS
específicamente. En Linux, utiliza laSO_PEERCRED
opción de socket en su lugar.SCM_CREDENTIALS
habría evitado un proxy tan simple, ya que requiere que el remitente presente activamente sus credenciales, mientras queSO_PEERCRED
simplemente verifica quién realizó la conexión. Me pregunto por qué hicieron esta elección.dbus-sysdeps-unix.c
).