Saya mencoba mengatur akses jarak jauh ke D-Bus, dan saya tidak mengerti bagaimana otentikasi dan otorisasi (tidak) berfungsi.
Saya memiliki server D-Bus yang mendengarkan pada soket abstrak.
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31
Saya berlari dbus-monitor
untuk menonton apa yang terjadi. Kasing uji saya adalah notify-send hello
, yang berfungsi saat dijalankan dari mesin lokal.
Dari akun lain di mesin yang sama, saya tidak dapat terhubung ke bus itu.
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
Setelah menelusuri spesifikasi D-Bus , saya menyalin ~/.dbus-keyrings/org_freedesktop_general
ke akun lain, tetapi itu tidak membantu.
Saya mencoba meneruskan soket D-Bus melalui TCP, terinspirasi oleh schedar 's Access D-Bus dari jarak jauh menggunakan socat .
socat TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32 ABSTRACT-CONNECT:/tmp/dbus-g5sxxvDlmz
Saya dapat terhubung ke soket TCP dari akun saya.
DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
Tapi bukan dari akun lain, baik dengan dbus-monitor
maupun dengan notify-send
. Pesan kesalahan yang sama dbus-monitor
seperti di atas dengan soket abstrak; notify-send
sekarang memancarkan jejak:
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 mengungkapkan bahwa versi notify-send
ini tidak mencoba membaca file cookie, jadi saya mengerti mengapa itu tidak dapat terhubung.
Saya juga mencoba SSHing ke komputer lain dan meneruskan koneksi TCP.
ssh -R 8004:localhost:8004 remotehost
Anehnya, dbus-monitor
bekerja tanpa file cookie! Saya dapat menonton lalu lintas D-Bus dari host jarak jauh. Saya melihat pemberitahuan tentang menguping dalam dbus-monitor
contoh lokal saya .
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"
Jika saya menjalankan notify-send
di mesin lokal, dbus-monitor
pada host jarak jauh melihat pemberitahuan. Sudah pasti mencapai tingkat akses yang harus memerlukan otentikasi.
notify-send
mengeluh karena tidak menemukan cookie. Setelah menyalin file cookie, notify-send
bekerja dari mesin jarak jauh.
Mesin lokal menjalankan Debian wheezy. Mesin jarak jauh menjalankan FreeBSD 10.1.
Saya tidak mengerti bagaimana otentikasi dan otorisasi D-Bus bekerja.
- Mengapa saya bisa menguping, sejauh yang saya tahu, tanpa kredensial dari mesin jarak jauh? Apa yang saya paparkan ketika saya meneruskan D-Bus ke koneksi TCP? Mengapa otorisasi berbeda
dbus-monitor
dannotify-send
? - Mengapa saya tidak dapat menguping dari akun lain di mesin yang sama, baik melalui soket abstrak atau melalui koneksi TCP?
- Saya perhatikan bahwa file cookie berubah setiap beberapa menit (saya belum tahu apakah itu secara berkala atau tidak). Mengapa?
(Saya tahu saya bisa meluncurkan D-Bus daemon yang mendengarkan TCP. Itu bukan tujuan pertanyaan saya, saya ingin mengerti mengapa apa yang saya lakukan dan tidak berhasil.)
SCM_CREDENTIALS
secara khusus. Di Linux, ia menggunakanSO_PEERCRED
opsi soket sebagai gantinya.