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
、他のアカウントにコピーしましたが、役に立ちません。
socat を使用してリモートでschedarのAccess D-Busに触発され、TCP経由でD-Busソケットを転送しようとしました。
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ファイルを読み取ろうとしないことを明らかにしているため、接続できない理由を理解しています。
また、別のマシンにSSHで接続し、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ファイルは数分ごとに変更されることに気付きました(定期的に更新されるかどうかはわかりません)。どうして?
(TCPをリッスンするD-Busデーモンを起動できることは知っています。それは私の質問の目的ではありません。どうしてやったのか、動かなかったのかを理解したいです。)
SCM_CREDENTIALS
特に使用しません。Linuxでは、SO_PEERCRED
代わりにソケットオプションを使用します。