Я пытаюсь настроить удаленный доступ к 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, вдохновленный доступом D-Bus от Schedar , с помощью 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
Stracing показывает, что эта версия 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 wheezy. Удаленный компьютер работает с FreeBSD 10.1.
Я не понимаю, как работают аутентификация и авторизация D-Bus.
- Насколько я могу судить, почему я не могу подслушать без учетных данных с удаленного компьютера? Что я вижу, когда пересылаю D-Bus по TCP-соединению? Почему разрешения для
dbus-monitor
иnotify-send
разные? - Почему я не могу прослушать другую учетную запись на том же компьютере, будь то через абстрактный сокет или через соединение TCP?
- Я заметил, что файл cookie меняется каждые несколько минут (я не понял, регулярно ли он или нет). Почему?
(Я знаю, что могу запустить демон D-Bus, который слушает TCP. Это не цель моего вопроса, я хочу понять, почему то, что я сделал, и не сработало.)
источник
SCM_CREDENTIALS
специально. В LinuxSO_PEERCRED
вместо этого используется опция сокета.SCM_CREDENTIALS
помешало бы такому простому прокси-серверу, поскольку оно требует от отправителя активно представлять свои учетные данные, аSO_PEERCRED
просто проверяет, кто установил соединение. Интересно, почему они сделали этот выбор?dbus-sysdeps-unix.c
).