Tôi đang cố gắng thiết lập quyền truy cập từ xa vào D-Bus và tôi không hiểu cách xác thực và ủy quyền (không) hoạt động.
Tôi có một máy chủ D-Bus lắng nghe trên một ổ cắm trừu tượng.
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31
Tôi chạy dbus-monitorđể xem những gì đang xảy ra. Trường hợp thử nghiệm của tôi là notify-send hello, hoạt động khi được thực thi từ máy cục bộ.
Từ một tài khoản khác trên cùng một máy, tôi không thể kết nối với xe buýt đó.
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
Sau khi duyệt đặc tả D-Bus , tôi đã sao chép ~/.dbus-keyrings/org_freedesktop_generalsang tài khoản khác, nhưng không được.
Tôi cố gắng chuyển các ổ cắm D-Bus trên TCP, lấy cảm hứng từ Schedar 's truy cập D-Bus từ xa sử dụng socat .
socat TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32 ABSTRACT-CONNECT:/tmp/dbus-g5sxxvDlmz
Tôi có thể kết nối với ổ cắm TCP từ tài khoản của mình.
DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
Nhưng không phải từ tài khoản khác, dbus-monitorcũng không phải với notify-send. Thông báo lỗi tương tự dbus-monitornhư trên với ổ cắm trừu tượng; notify-sendbây giờ phát ra một dấu vết:
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 tiết lộ rằng phiên bản notify-sendnày không cố đọc tệp cookie, vì vậy tôi hiểu tại sao nó không thể kết nối.
Tôi cũng đã thử SSH vào một máy khác và chuyển tiếp kết nối TCP.
ssh -R 8004:localhost:8004 remotehost
Đáng ngạc nhiên, dbus-monitorhoạt động mà không có một tập tin cookie! Tôi có thể xem lưu lượng D-Bus từ máy chủ từ xa. Tôi thấy một thông báo về việc nghe lén trong dbus-monitortrường hợp địa phương của tôi .
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"
Nếu tôi chạy notify-sendtrên máy cục bộ, dbus-monitortrên máy chủ từ xa sẽ thấy thông báo. Nó chắc chắn đã đạt đến một mức độ truy cập cần phải xác thực.
notify-sendphàn nàn về việc không tìm thấy một cookie. Sau khi sao chép tệp cookie, notify-sendhoạt động từ máy từ xa.
Máy cục bộ chạy Debian wheezy. Máy từ xa chạy FreeBSD 10.1.
Tôi không hiểu cách thức xác thực và ủy quyền của D-Bus.
- Tại sao tôi có thể nghe lén, theo như tôi có thể nói, không có thông tin xác thực từ máy từ xa? Tôi sẽ phơi bày điều gì khi chuyển tiếp D-Bus sang kết nối TCP? Tại sao ủy quyền cho
dbus-monitorvànotify-sendkhác nhau? - Tại sao tôi không thể nghe lén từ một tài khoản khác trên cùng một máy, cho dù qua ổ cắm trừu tượng hay qua kết nối TCP?
- Tôi nhận thấy rằng tệp cookie thay đổi cứ sau vài phút (tôi đã không biết liệu nó có đều đặn hay không). Tại sao?
(Tôi biết rằng tôi có thể khởi chạy một trình nền D-Bus nghe trên TCP. Đó không phải là mục đích của câu hỏi của tôi, tôi muốn hiểu tại sao những gì tôi đã làm và không hoạt động.)
SCM_CREDENTIALScụ thể. Trên Linux, nó sử dụngSO_PEERCREDtùy chọn ổ cắm thay thế.