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バス仕様、別のアカウントにコピーしましたが、~/.dbus-keyrings/org_freedesktop_general
役に立ちませんでした。
私は以下からインスピレーションを得てTCPを介してD-Busソケットを渡そうとします。スケジューラ~のsocatを使用して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
に、クッキーファイルなしで動作します!リモートホストから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デーモンを起動できることを知っています。それは私の質問の目的ではありません。
ベストアンサー1
D-BusはここでMagic Cookieファイルを使用せずにUNIXドメインソケット()を介して資格情報を渡しますSCM_CREDENTIALS
。
マジッククッキーファイルは、いくつかのD-Bus認証メカニズムの1つにすぎません。 D-Busの実装SASL- 互換性のあるインターフェース(参照RFC4422) さまざまな認証メカニズムをサポートします。これらのメカニズムの1つを「外部」認証と呼びます。これは、トランスポートチャネル自体を使用して認証を保証する必要があることを意味します。少なくともUNIXソケットを介したD-Busの場合、これが試みられた最初の認証メカニズムのようです。
D-Bus仕様では:
クライアントはサーバーに接続した直後に nul バイトを送信する必要があります。このバイトには、SCM_CREDSまたはSCM_CREDENTIALSでsendmsg()を使用してUNIXドメインソケットを介して資格情報を渡す一部のオペレーティングシステムの資格情報が含まれている場合があります。ただし、他の種類のソケットと資格情報を送信するためにバイトを送信する必要がないオペレーティングシステムでも、nullバイトを送信する必要があります。この資料に記載されているテキストプロトコルは、単一のヌルバイトの後に開始されます。クライアントから受信した最初のバイトがヌルバイトでない場合、サーバーはクライアントの接続を切断できます。
初期バイト以外のすべてのコンテキストでは、ヌルバイトはエラーです。プロトコルはASCIIのみをサポートします。
nulバイトで送信された資格情報は、SASLメカニズムEXTERNALで使用できます。
インスタンスを追跡すると、dbus-daemon
インスタンスに接続するときに接続しているユーザーの資格情報を確認することがわかります。
$ strace dbus-daemon --session --nofork
...
accept4(4, {sa_family=AF_LOCAL, NULL}, [2], SOCK_CLOEXEC) = 8
...
recvmsg(8, {msg_name(0)=NULL, msg_iov(1)=[{"\0", 1}], msg_controllen=0, msg_flags=0}, 0) = 1
getsockopt(8, SOL_SOCKET, SO_PEERCRED, {pid=6694, uid=1000, gid=1000}, [12]) = 0
したがって、あなたの質問に答えるには:
D-Busデーモンはカーネル検証ユーザーIDを使用してユーザーを認証します。プロキシ接続を使用すると、
socat
誰でもUIDを使用してD-Busデーモンに接続できます。別のUIDからソケットに直接接続しようとすると、デーモンは接続されたUIDが接続を許可する必要があるUIDではないことを認識します。私は基本的にデーモン自身のUIDだけが許可されていると思いますが、これは正式に確認されていません。ただし、他のユーザーを許可できます。
/etc/dbus-1/
との設定ファイルを参照してくださいman dbus-daemon
。これは、古い/期限切れのCookieを新しいCookieに置き換えるD-Busサーバーです。 ~によるとDBUS_COOKIE_SHA1D-Bus仕様の一部によれば、クッキーは作成時間とともに保存され、サーバーは古すぎると思われるクッキーを削除する必要があります。明らかに、寿命は「かなり短いかもしれません。」