Я намагаюся налаштувати віддалений доступ до 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, натхненний Шедар «s Access 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
не намагається прочитати файл cookie, тому я розумію, чому він не зміг би з'єднатися.
Я також спробував SSHing в іншу машину і переадресував TCP-з'єднання.
ssh -R 8004:localhost:8004 remotehost
Дивно, але dbus-monitor
працює без файлу cookie! Я можу спостерігати за трафіком 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
скаржився на те, що не знайшов печиво. Після копіювання файлу cookie notify-send
працює з віддаленої машини.
Місцева машина працює за допомогою хрипів Debian. Віддалена машина працює на FreeBSD 10.1.
Я не розумію, як працюють автентифікація та авторизація D-Bus.
- Чому я можу підслуховувати, наскільки я можу сказати, без даних для віддаленої машини? Що я відкриваю, коли пересилаю D-Bus на з'єднання TCP? Чому авторизація
dbus-monitor
і чимnotify-send
відрізняється? - Чому я не можу підслуховувати інший обліковий запис на тій же машині, чи то через абстрактний сокет, так і через TCP-з'єднання?
- Я помітив, що файл файлів cookie змінюється кожні кілька хвилин (я не зрозумів, чи є він через рівні проміжки часу чи ні). Чому?
(Я знаю, що можу запустити демон-D-Bus, який слухає на TCP. Це не мета мого запитання. Я хочу зрозуміти, чому я це зробив і не працював.)
SCM_CREDENTIALS
. У Linux вінSO_PEERCRED
замість цього використовує опцію socket.