Próbuję skonfigurować zdalny dostęp do D-Bus i nie rozumiem, jak działa (nie) uwierzytelnianie i autoryzacja.
Mam serwer D-Bus nasłuchujący na abstrakcyjnym gnieździe.
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31
Pobiegam dbus-monitoroglądać co się dzieje. Mój przypadek testowy to notify-send hello, który działa po uruchomieniu z komputera lokalnego.
Z innego konta na tym samym komputerze nie mogę się połączyć z tą magistralą.
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
Po przejrzeniu specyfikacji D-Bus skopiowałem ~/.dbus-keyrings/org_freedesktop_generalna inne konto, ale to nie pomaga.
Próbowałem spedycja gniazdo D-Bus przez TCP, inspirowany schedar „s Wejście D-Bus zdalnie przy użyciu socat .
socat TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32 ABSTRACT-CONNECT:/tmp/dbus-g5sxxvDlmz
Mogę połączyć się z gniazdem TCP z mojego konta.
DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
Ale nie z drugiego konta, ani z, dbus-monitorani z notify-send. Ten sam komunikat o błędzie dbus-monitorjak powyżej z gniazdem abstrakcyjnym; notify-sendteraz emituje ślad:
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 ujawnia, że ta wersja notify-sendnie próbuje odczytać pliku cookie, więc rozumiem, dlaczego nie mógł się połączyć.
Próbowałem także SSHing na innym komputerze i przekazywanie połączenia TCP.
ssh -R 8004:localhost:8004 remotehost
Zaskakujące, dbus-monitordziała bez pliku cookie! Mogę obserwować ruch D-Bus ze zdalnego hosta. Widzę powiadomienie o podsłuchiwaniu w mojej lokalnej dbus-monitorinstancji.
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"
Jeśli uruchomię notify-sendna komputerze lokalnym, dbus-monitorna hoście zdalnym zobaczy powiadomienie. Zdecydowanie osiągnął poziom dostępu, który powinien wymagać uwierzytelnienia.
notify-sendskarżył się na brak pliku cookie. Po skopiowaniu pliku cookie notify-senddziała ze zdalnego komputera.
Na lokalnej maszynie działa wheezy Debiana. Na zdalnym komputerze działa FreeBSD 10.1.
Nie rozumiem, jak działa uwierzytelnianie i autoryzacja D-Bus.
- Dlaczego mogę podsłuchiwać, o ile mogę, bez poświadczeń ze zdalnego komputera? Co ujawniam, gdy przesyłam D-Bus do połączenia TCP? Dlaczego są zezwolenia na
dbus-monitorinotify-sendróżne? - Dlaczego nie mogę podsłuchiwać z innego konta na tym samym komputerze, czy to przez gniazdo abstrakcyjne, czy przez połączenie TCP?
- Zauważyłem, że plik cookie zmienia się co kilka minut (nie wiedziałem, czy to w regularnych odstępach czasu, czy nie). Dlaczego?
(Wiem, że mogę uruchomić demona D-Bus, który nasłuchuje na TCP. Nie jest to celem mojego pytania, chcę zrozumieć, dlaczego to, co zrobiłem, a co nie działało).
SCM_CREDENTIALSkonkretnie. W systemie LinuxSO_PEERCREDzamiast tego używa opcji gniazda.