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-monitor
oglą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_general
na 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-monitor
ani z notify-send
. Ten sam komunikat o błędzie dbus-monitor
jak powyżej z gniazdem abstrakcyjnym; notify-send
teraz 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-send
nie 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-monitor
działa bez pliku cookie! Mogę obserwować ruch D-Bus ze zdalnego hosta. Widzę powiadomienie o podsłuchiwaniu w mojej lokalnej dbus-monitor
instancji.
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-send
na komputerze lokalnym, dbus-monitor
na hoście zdalnym zobaczy powiadomienie. Zdecydowanie osiągnął poziom dostępu, który powinien wymagać uwierzytelnienia.
notify-send
skarżył się na brak pliku cookie. Po skopiowaniu pliku cookie notify-send
dział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-monitor
inotify-send
róż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).
źródło
SCM_CREDENTIALS
konkretnie. W systemie LinuxSO_PEERCRED
zamiast tego używa opcji gniazda.SCM_CREDENTIALS
uniemożliwiłoby tak prosty serwer proxy, ponieważ wymaga od nadawcy aktywnego przedstawienia swoich danych uwierzytelniających, aSO_PEERCRED
jedynie sprawdzenia, kto nawiązał połączenie. Zastanawiam się, dlaczego dokonali tego wyboru.dbus-sysdeps-unix.c
).