Estou tentando configurar o acesso remoto ao D-Bus e não entendo como a autenticação e a autorização estão (não) funcionando.
Eu tenho um servidor D-Bus escutando em um soquete abstrato.
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31
Eu corro dbus-monitor
para ver o que está acontecendo. Meu caso de teste é o notify-send hello
que funciona quando executado a partir da máquina local.
De outra conta na mesma máquina, não consigo me conectar a esse barramento.
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
Depois de navegar na especificação D-Bus , copiei ~/.dbus-keyrings/org_freedesktop_general
para a outra conta, mas isso não ajuda.
Tentei encaminhar tomada de D-Bus através de TCP, inspirado por Schedar de Acesso D-Bus remotamente usando socat .
socat TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32 ABSTRACT-CONNECT:/tmp/dbus-g5sxxvDlmz
Eu posso conectar ao soquete TCP da minha conta.
DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
Mas não da outra conta, nem com dbus-monitor
nem com notify-send
. A mesma mensagem de erro dbus-monitor
como acima com o soquete abstrato; notify-send
agora emite um rastreio:
otheraccount$ DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
** (notify-send:2952): WARNING **: The connection is closed
O Stracing revela que esta versão do notify-send
não tenta ler o arquivo de cookies, então eu entendo por que ele não conseguiu se conectar.
Eu também tentei fazer o SSHing em outra máquina e encaminhar a conexão TCP.
ssh -R 8004:localhost:8004 remotehost
Surpreendentemente, dbus-monitor
funciona sem um arquivo de cookie! Eu posso assistir o tráfego do D-Bus no host remoto. Eu vejo um aviso sobre a escuta na minha dbus-monitor
instância 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"
Se eu executar notify-send
na máquina local, dbus-monitor
o host remoto verá a notificação. Definitivamente, alcançou um nível de acesso que deve exigir autenticação.
notify-send
reclamou por não encontrar um cookie. Depois de copiar o arquivo de cookie, notify-send
funciona a partir da máquina remota.
A máquina local executa o Debian wheezy. A máquina remota roda o FreeBSD 10.1.
Não entendo como a autenticação e autorização do D-Bus funcionam.
- Por que posso escutar, até onde sei, sem credenciais da máquina remota? O que estou expondo quando encaminhar o D-Bus para uma conexão TCP? Por que as autorizações
dbus-monitor
e sãonotify-send
diferentes? - Por que não posso escutar de outra conta na mesma máquina, seja pelo soquete abstrato ou pela conexão TCP?
- Percebi que o arquivo do cookie muda a cada poucos minutos (não descobri se é em intervalos regulares ou não). Por quê?
(Eu sei que posso iniciar um daemon D-Bus que escute no TCP. Esse não é o objetivo da minha pergunta. Quero entender por que o que fiz e o que não fiz).
fonte
SCM_CREDENTIALS
especificamente. No Linux, ele usa aSO_PEERCRED
opção de soquete.SCM_CREDENTIALS
teria impedido um proxy tão simples, pois exige que o remetente apresente ativamente suas credenciais, enquantoSO_PEERCRED
apenas verifica quem fez a conexão. Eu me pergunto por que eles fizeram essa escolha.dbus-sysdeps-unix.c
).