ฉันกำลังพยายามตั้งค่าการเข้าถึงระยะไกลไปยัง D-Bus และฉันไม่เข้าใจว่าการรับรองความถูกต้องและการอนุญาต (ไม่) ทำงานได้อย่างไร
ฉันมีเซิร์ฟเวอร์ D-Bus ที่ฟังบนซ็อกเก็ตแบบนามธรรม
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31
ฉันวิ่งdbus-monitor
ไปดูว่าเกิดอะไรขึ้น กรณีทดสอบของฉันคือnotify-send hello
ซึ่งทำงานเมื่อดำเนินการจากเครื่องท้องถิ่น
จากบัญชีอื่นในเครื่องเดียวกันฉันไม่สามารถเชื่อมต่อกับรถบัสนั้นได้
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
หลังจากเรียกดูข้อมูลจำเพาะ D-Busฉันคัดลอก~/.dbus-keyrings/org_freedesktop_general
ไปยังบัญชีอื่น แต่ไม่ได้ผล
ฉันพยายามส่งต่อซ็อกเก็ต D-Bus ผ่าน TCP แรงบันดาลใจจากschedar 's เข้าถึง D-Bus ระยะไกลโดยใช้ socat
socat TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32 ABSTRACT-CONNECT:/tmp/dbus-g5sxxvDlmz
ฉันสามารถเชื่อมต่อกับซ็อกเก็ต TCP ได้จากบัญชีของฉัน
DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
แต่ไม่ได้มาจากบัญชีอื่นไม่ได้มีdbus-monitor
หรือnotify-send
ไม่มี ข้อความแสดงข้อผิดพลาดเดียวกันสำหรับdbus-monitor
ข้างต้นกับซ็อกเก็ตที่เป็นนามธรรม; notify-send
ตอนนี้ปล่อยร่องรอย:
otheraccount$ DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
** (notify-send:2952): WARNING **: The connection is closed
สเตรชพบว่ารุ่นนี้notify-send
ไม่ได้พยายามอ่านไฟล์คุกกี้ดังนั้นฉันเข้าใจว่าทำไมมันไม่สามารถเชื่อมต่อได้
ฉันยังลอง SSHing ไปยังเครื่องอื่นและส่งต่อการเชื่อมต่อ TCP
ssh -R 8004:localhost:8004 remotehost
น่าแปลกที่dbus-monitor
ทำงานโดยไม่มีไฟล์คุกกี้! ฉันสามารถรับชม D-Bus จากรีโมทโฮสต์ ฉันเห็นประกาศเกี่ยวกับกำลังดักข้อมูลในdbus-monitor
อินสแตนซ์ในพื้นที่ของฉัน
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"
ถ้าฉันทำงานnotify-send
บนเครื่องโลคัลdbus-monitor
บนรีโมตโฮสต์จะเห็นการแจ้งเตือน ถึงระดับการเข้าถึงที่แน่นอนซึ่งต้องมีการตรวจสอบสิทธิ์
notify-send
บ่นว่าไม่ได้หาคุกกี้ หลังจากคัดลอกไฟล์คุกกี้notify-send
ทำงานจากเครื่องระยะไกล
เครื่องในพื้นที่ทำงาน Debian wheezy เครื่องระยะไกลรัน FreeBSD 10.1
ฉันไม่เข้าใจว่าการพิสูจน์ตัวตนและการอนุญาต D-Bus ทำงานอย่างไร
- ทำไมฉันถึงดักฟังเท่าที่ฉันสามารถบอกได้โดยไม่ต้องมีหนังสือรับรองจากเครื่องระยะไกล ฉันจะเปิดเผยอะไรเมื่อฉันส่งต่อ D-Bus ไปยังการเชื่อมต่อ TCP ทำไมจึงมีการอนุมัติสำหรับ
dbus-monitor
และnotify-send
แตกต่างกันอย่างไร - เหตุใดฉันจึงไม่สามารถดักฟังจากบัญชีอื่นในเครื่องเดียวกันไม่ว่าจะเป็นผ่านซ็อกเก็ตนามธรรมหรือผ่านการเชื่อมต่อ TCP
- ฉันสังเกตเห็นว่าไฟล์คุกกี้เปลี่ยนแปลงทุกสองสามนาที (ฉันไม่ได้คิดออกว่าเป็นช่วงปกติหรือไม่) ทำไม?
(ฉันรู้ว่าฉันสามารถเปิดตัว D-Bus daemon ที่ฟังบน TCP นั่นไม่ใช่จุดประสงค์ของคำถามของฉันฉันต้องการเข้าใจว่าทำไมสิ่งที่ฉันทำและไม่ได้ผล)
SCM_CREDENTIALS
เฉพาะ บน Linux จะใช้SO_PEERCRED
ซ็อกเก็ตตัวเลือกแทน