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_general
sang 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-monitor
cũng không phải với notify-send
. Thông báo lỗi tương tự dbus-monitor
như trên với ổ cắm trừu tượng; notify-send
bâ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-send
nà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-monitor
hoạ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-monitor
trườ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-send
trên máy cục bộ, dbus-monitor
trê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-send
phàn nàn về việc không tìm thấy một cookie. Sau khi sao chép tệp cookie, notify-send
hoạ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-monitor
vànotify-send
khá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_CREDENTIALS
cụ thể. Trên Linux, nó sử dụngSO_PEERCRED
tùy chọn ổ cắm thay thế.