D-Bus認証および許可


13

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 を使用してリモートでschedarAccess 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-senddbus-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-sendCookieファイルを読み取ろうとしないことを明らかにしているため、接続できない理由を理解しています。

また、別のマシンにSSHで接続し、TCP接続を転送しようとしました。

ssh -R 8004:localhost:8004 remotehost

驚いたことに、dbus-monitorCookieファイルがなくても機能します!リモートホストからの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の認証と承認の仕組みがわかりません。

  1. 私が知る限り、リモートマシンからの資格情報なしで盗聴できるのはなぜですか?D-BusをTCP接続に転送すると、何が公開されますか?なぜ権限のためのものdbus-monitornotify-send違うのですか?
  2. 抽象ソケット経由でもTCP接続経由でも、同じマシン上の別のアカウントから盗聴できないのはなぜですか?
  3. Cookieファイルは数分ごとに変更されることに気付きました(定期的に更新されるかどうかはわかりません)。どうして?

(TCPをリッスンするD-Busデーモンを起動できることは知っています。それは私の質問の目的ではありません。どうしてやったのか、動かなかったのかを理解したいです。)

回答:


7

D-BusはここでマジックCookieファイルを使用していません。UNIXドメインソケットを介して資格情報を渡します(SCM_CREDENTIALS)。

マジッククッキーファイルは、いくつかのD-Bus認証メカニズムの1つにすぎません。D-Busは SASL準拠のインターフェース(RFC4422を参照)を広範囲の認証メカニズムをサポートします。これらのメカニズムの1つは「EXTERNAL」認証と呼ばれ、認証を保証するためにトランスポートチャネル自体を使用する必要があることを意味します。少なくともUNIXソケット上のD-Busの場合、これが最初に試行される認証メカニズムのようです。

D-Bus仕様から:

特別な資格情報を渡すヌルバイト

サーバーに接続した直後に、クライアントは単一のヌルバイトを送信する必要があります。このバイトには、SCM_CREDSまたはSCM_CREDENTIALSでsendmsg()を使用してUNIXドメインソケットを介して資格情報を渡す一部のオペレーティングシステムの資格情報が付随する場合があります。ただし、nulバイトは、他の種類のソケットでも送信する必要があり、資格情報を送信するためにバイトを送信する必要のないオペレーティングシステムでも送信する必要があります。このドキュメントで説明されているテキストプロトコルは、単一のヌルバイトの後に始まります。クライアントから受信した最初のバイトがヌルバイトでない場合、サーバーはそのクライアントを切断する場合があります。

初期バイト以外のコンテキストのヌルバイトはエラーです。プロトコルはASCIIのみです。

nullバイトとともに送信された資格情報は、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

質問に答えるには:

  1. D-Busデーモンは、カーネルで検証されたユーザーIDを使用してIDを検証しています。socatプロキシ接続に使用することにより、UIDを使用して誰でもD-Busデーモンに接続できます。

  2. 別のUIDからソケットに直接接続しようとすると、デーモンは、接続するUIDが接続が許可されているUIDではないことを認識します。デフォルトでは、デーモン自身のUIDのみが許可されますが、正式には検証されていません。構成ファイルを参照してください:あなたは、しかし、他のユーザーを許可することができ/etc/dbus-1/、また、とman dbus-daemon

  3. これは、古い/期限切れのCookieを新しいものに置き換えるD-Busサーバーです。D-Bus仕様のDBUS_COOKIE_SHA1セクションによると、Cookieはその作成時間とともに保存され、サーバーは古すぎると判断したCookieを削除することになっています。どうやら寿命は「かなり短い」ことがあります。


D-Busのリファレンス実装はSCM_CREDENTIALS特に使用しません。Linuxでは、SO_PEERCRED代わりにソケットオプションを使用します。
ワシリーファロノフ

@VasiliyFaronovその通り-なんて面白い!さらに、SCM_CREDENTIALS送信者が自分の資格情報を積極的に提示する必要があるため、SO_PEERCRED単に接続を行った人を確認するだけなので、使用するとこのような単純なプロキシが妨げられるように見えます。彼らがなぜこの選択​​をしたのだろうか。
ジャンダー

どうやら「ピアの協力を必要としない」ため、「これははるかに脆弱ではありません」(のコメントからdbus-sysdeps-unix.c)。
ヴァシリーファロノフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.