Linuxのdbus-daemonプロセスの概要

CentOS6.5ではデフォルトでdbus-daemonというデーモンプロセスが実行されています。このプロセスの概要についてまとめました。

※目次をクリックすると目次の下部にコンテンツが表示されます。

dbus-daemonとは?
1)psコマンドの出力内容は?
 

$ ps -ef
dbus      1324     1  0 May19 ?        00:00:00 dbus-daemon --system

 
2)実行ファイルのPathは?
 
$ which dbus-daemon
/bin/dbus-daemon
 
3)どのパッケージに属する?
 
実行ファイルのパスが分かったのでどのパッケージに属するかみてみます。
 
$ rpm -qf /bin/dbus-daemon
dbus-1.2.24-7.el6_3.x86_64
 
4)dbusパッケージの概要
 
“yum info dbus”コマンドでパッケージの概要を確認しました。
 
①サマリー
D-BUS message bus
 
②URL
http://www.freedesktop.org/software/dbus/
 
③説明
・D-BUSは、アプリエーション間でメッセージを通信するシステム。
・システム全体のメッセージバスシステムとしてやユーザー単位のログインセッションメッセージファシリティとして使用される。

dbus-daemonコマンド
1)dbus-daemonコマンドの概要
 
・dbus-daemonは、D-Busメッセージバスデーモン。
 
・D-Busは2つのアプリケーション間の1対1の通信を提供するライブラリ。
 dbus-daemonはメッセージバスデーモンの機能を提供するためにこのライブラリを使用したアプリケーション。
 複数のプログラムがメッセージバスデーモンに接続し、お互いにメッセージを交換することが出来る。
 
・二つの標準的なメッセージバスインスタンスを持っている。
 システム全体のメッセージバス(”messagebus” initサービス)
 ユーザー単位のログインセッションメッセージバス(ユーザーログイン時に開始される)
 
・dbus-deamonは上記二つのインスタンスで使用されるが、それぞれ異なる設定ファイルを持つ。
 
・SIGHUPによって設定ファイルを部分的にリロードしたり、ユーザー・グループ情報のキャッシュをフラッシュしたりする。
 ある設定値の変更にはすべてのアプリがバスからOffする事が必要で、daemonを再起動する必要があるので注意。ポリシーの変更もSIGHUPによって有効になる。
 
●systemwide daemonインスタンス
 
・システム全体のメッセージバス
 
・デフォルトの設定ファイル
/etc/dbus-1/system.conf
 
・initスクリプトによって起動される。
 
・”messagebus”と呼ばれる。
 
・プリンタキュー、デバイスの追加・削除などのシステムイベントのブロードキャストに使用される事が多い。
 
●per-session daemonインスタンス
 
・ユーザー単位のログインセッションメッセージバス
 
・デフォルトの設定ファイル
/etc/dbus-1/session.conf
 
・デスクトップアプリ間など様々なプロセス間通信に使用される。
 
2)dbus-daemonコマンドのオプション
 
○–config-file=ファイル名
・設定ファイルを指定する。
 
○–session
・per-login-sessionメッセージバスのデフォルトの設定ファイルを使用する。
/etc/dbus-1/session.conf
 
○–system
・systemwideメッセージバスのデフォルトの設定ファイルを使用する。
/etc/dbus-1/system.conf
 
○–fork
・設定ファイルの指定内容に関わらず、メッセージバスをforkし、デーモンとなるように強制する。
 
○–print-address[=DESCRIPTOR]
・メッセージバスのアドレスを標準出力または指定したファイルディスクリプタに出力する。
・メッセージバスによって開始されたプログラムによって使用される。
 
○–print-pid[=DESCRIPTOR]
・メッセージバスのプロセスIDを標準出力または指定したファイルディスクリプタに出力する。
・メッセージバスによって開始されたプログラムによって使用される。

dbus-daemonの設定ファイル
1)dbus-daemonの設定ファイルの概要
 
・メッセージバスデーモンは、ある特定のアプリ用に定義した設定ファイルを持つ。
 
・systemwideメッセージバス(/etc/dbus-1/system.conf)とper-user-login-sessionバス(/etc/dbus-1/session.conf)でそれぞれ専用の設定ファイルを持つ。
 
上記ファイルは通常、system-local.confまたはsession-local.confをインクルードする。
 
メインの設定ファイルを変更しないようにするため、ローカルのファイルを用意してオーバーライドする。
 
●デフォルトの設定ファイル
 
①/etc/dbus-1/system.conf

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <type>system</type>
  <user>dbus</user>
  <fork/>
  <standard_system_servicedirs/>
  <servicehelper>/lib64/dbus-1/dbus-daemon-launch-helper</servicehelper>
  <pidfile>/var/run/messagebus.pid</pidfile>
  <syslog/>
  <auth>EXTERNAL</auth>
  <listen>unix:path=/var/run/dbus/system_bus_socket</listen>
  <policy context="default">
    <allow user="*"/>
    <deny own="*"/>
    <deny send_type="method_call"/>
    <allow send_type="signal"/>
    <allow send_requested_reply="true" send_type="method_return"/>
    <allow send_requested_reply="true" send_type="error"/>
    <allow receive_type="method_call"/>
    <allow receive_type="method_return"/>
    <allow receive_type="error"/>
    <allow receive_type="signal"/>
    <allow send_destination="org.freedesktop.DBus"/>
    <deny send_destination="org.freedesktop.DBus"
          send_interface="org.freedesktop.DBus"
          send_member="UpdateActivationEnvironment"/>
  </policy>
  <includedir>system.d</includedir>
  <include ignore_missing="yes">system-local.conf</include>
  <include if_selinux_enabled="yes" selinux_root_relative="yes">contexts/dbus_co
ntexts</include>
</busconfig>

 
②/etc/dbus-1/session.conf

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <type>session</type>
  <keep_umask/>
  <listen>unix:tmpdir=/tmp</listen>
  <standard_session_servicedirs />
  <policy context="default">
    <allow send_destination="*" eavesdrop="true"/>
    <allow eavesdrop="true"/>
    <allow own="*"/>
  </policy>
  <includedir>session.d</includedir>
  <include ignore_missing="yes">session-local.conf</include>
  <include if_selinux_enabled="yes" selinux_root_relative="yes">contexts/dbus_co
ntexts</include>
  <limit name="max_incoming_bytes">1000000000</limit>
  <limit name="max_outgoing_bytes">1000000000</limit>
  <limit name="max_message_size">1000000000</limit>
  <limit name="service_start_timeout">120000</limit>
  <limit name="auth_timeout">240000</limit>
  <limit name="max_completed_connections">100000</limit>
  <limit name="max_incomplete_connections">10000</limit>
  <limit name="max_connections_per_user">100000</limit>
  <limit name="max_pending_service_starts">10000</limit>
  <limit name="max_names_per_connection">50000</limit>
  <limit name="max_match_rules_per_connection">50000</limit>
  <limit name="max_replies_per_connection">50000</limit>
</busconfig>

 
2)doctype宣言、Root要素、type
 
①doctype宣言
 
・設定ファイルはXML文書
<!DOCTYPE busconfig PUBLIC “-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN”
“http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd”>
 
②Root要素
 
<busconfig>
 
③タイプ type
 
・メッセージバスのwell-knownタイプ。
・現状は、知られているのは”system”と”session”
・上記以外が設定された場合は、D-Busのspecificationまたはnamespacedに追加される。
・複数設定された場合は最後が優先。
・この要素は、有効にされたクライアントでどのメッセージバス環境変数がセットされたかのみ管理する。
ポリシーは他の要素で管理される。
 
○”session”の場合に設定される環境変数
DBUS_STARTER_BUS_TYPE ”session”
DBUS_SESSION_BUS_ADDRESS セッションバスのアドレス
 
○”system”の場合に設定される環境変数
DBUS_STARTER_BUS_TYPE ”system”
DBUS_SESSION_BUS_ADDRESS システムバスのアドレス
 
3)include、includedir
 
①<include>
 
・指定したファイルをインクルード。
・相対パスの場合は、このインクルードしている設定ファイルを基準
・ignore_missing=(yes|no)
デフォルトはno。ファイルが存在しない場合にエラーにならないようにする。
 
②<includedir>
 
・指定したディレクトリ内でファイル名が”.conf”で終わるファイルをインクルード
 
③デフォルト設定
 
○/etc/dbus-1/system.conf
<includedir>system.d</includedir>
<include ignore_missing=”yes”>system-local.conf</include>
<include if_selinux_enabled=”yes” selinux_root_relative=”yes”>contexts/dbus_contexts</include>
 
○/etc/dbus-1/session.conf
<includedir>session.d</includedir>
<include ignore_missing=”yes”>session-local.conf</include>
<include if_selinux_enabled=”yes” selinux_root_relative=”yes”>contexts/dbus_contexts</include>
 
4)user、fork、keep_umask
 
①<user>
 
・そのデーモンを実行するユーザーアカウントを指定。
・起動時にそのUIDに変更できなかった場合は、exitする。
・指定されていない場合は、UIDを変更せず関知しない
・ユーザーは、そのBusが初期化された後に変更される。
従ってソケットなどはユーザー変更前に生成され、クライアントからデータを読まれることもない。
 逆に言うとソケットとPIDファイルはroot権限でないと書き込みできない場所で生成される。
・/etc/dbus-1/system.confでのデフォルト値は<user>dbus</user>。
 
②<fork>
 
・指定されている場合は、そのbusデーモンは真のデーモン(バックグラウンドでfork)となる。
・/etc/dbus-1/system.confでは、デフォルトで指定されている。
 
③<keep_umask>
 
・forkする際、オリジナルのumask値を維持する。
・/etc/dbus-1/session.confでは、デフォルトで指定されている。
 
5)listen
 
●<listen>
 
・そのbusがリッスンするアドレスを追加する。
・形式は下記のようにトランスポート層の名前とパラメータ、オプションを指定する。
<listen>unix:path=/tmp/foo</listen>
<listen>tcp:host=localhost,port=1234</listen>
・複数の<listen>要素を指定する事も可能で、複数のアドレスをリッスンする。
busは起動されたサービスなどに最後に指定されたアドレスから順に渡す。
・tcpソケットは、IPv4アドレス、IPv6アドレス、ホスト名を受け取る事が出来る。
ホスト名が複数のアドレスに名前解決される場合は、すべてがバインドされる。
・IPv4、v6を明示的に指定する場合は、下記のようにfamilyオプションを使用する。
<listen>tcp:host=localhost,port=0,family=ipv4</listen>
・portが0の場合や指定されていない場合は、OSが利用可能なポート番号を割り当てる。
・bind=hostnameオプションを使うと、busによってレポートされるアドレスを変更せずに、tcpのhostオプションでバインドしたアドレスをオーバーライド出来る。
・bind=*を指定するとすべてのローカルアドレス(INADDR_ANY)をリッスンする。
<listen>tcp:host=localhost,bind=*,port=0</listen>
 
●デフォルト設定
 
○/etc/dbus-1/system.conf
<listen>unix:path=/var/run/dbus/system_bus_socket</listen>
 
○/etc/dbus-1/session.conf
<listen>unix:tmpdir=/tmp</listen>
 
6)auth、servicehelper
 
①<auth>
 
・使用が許可された権限メカニズム。
・この要素が指定されていない場合は、すべての既知のメカニズムの利用を許可。
・複数設定されている場合はすべて許可される。順番は意味を持たない。
 
●デフォルト設定
 
○/etc/dbus-1/system.conf
<auth>EXTERNAL</auth>
 
②<servicehelper>
 
・システムデーモンを代替ユーザーを使って起動するのに使用されるsetuidヘルパーを指定する。
・libexec内のdbus-daemon-launch-helperが代表的。
・この要素はper-system busデーモンでのみ意味を持つ。
 
●デフォルト設定
 
○/etc/dbus-1/system.conf
<servicehelper>/lib64/dbus-1/dbus-daemon-launch-helper</servicehelper>
 
7)servicedir
 
①<servicedir>
 
・.serviceファイルをスキャンするディレクトリを追加する。
・複数のディレクトリがある場合は、設定ファイル内の後ろにあるディレクトリが先にスキャンされる。
・サービスファイルはプログラムを自動で起動する方法をbusに示す。
・主にper-user-sessionバスで使用される。
 
②<standard_session_servicedirs/>
 
・サービスファイルを探すディレクトリを指定。
・/etc/dbus-1/session.confで定義されたper-user-session bus daemonでのみ意味を持つ
 
●デフォルト設定
 
○/etc/dbus-1/session.conf
<standard_session_servicedirs />
 
③<standard_system_servicedirs/>
 
・サービスファイルを探すディレクトリを指定。
・/etc/dbus-1/system.confで定義されたper-system bus daemonでのみ意味を持つ
・デフォルトは、/usr/share/dbus-1/system-services
 
●デフォルト設定
 
○/etc/dbus-1/system.conf
<standard_system_servicedirs/>
 
8)limit
 
limitでresourceのリミットを設定できる。
 
●デフォルトの設定例
 
○/etc/dbus-1/session.conf
<limit name=”max_incoming_bytes”>1000000000</limit>
<limit name=”max_outgoing_bytes”>1000000000</limit>
<limit name=”max_message_size”>1000000000</limit>
<limit name=”service_start_timeout”>120000</limit>
<limit name=”auth_timeout”>240000</limit>
<limit name=”max_completed_connections”>100000</limit>
<limit name=”max_incomplete_connections”>10000</limit>
<limit name=”max_connections_per_user”>100000</limit>
<limit name=”max_pending_service_starts”>10000</limit>
<limit name=”max_names_per_connection”>50000</limit>
<limit name=”max_match_rules_per_connection”>50000</limit>
<limit name=”max_replies_per_connection”>50000</limit>
 
●limitで設定できる名前
 
“max_incoming_bytes”、”max_outgoing_bytes”、”max_message_size”、”service_start_timeout”、”auth_timeout”、”max_completed_connections”、”max_incomplete_connections”、”max_connections_per_user”、”max_pending_service_starts”、”max_names_per_connection”、”max_match_rules_per_connection”、”max_replies_per_connection”、”reply_timeout”
 
※注意点
・incoming/outgoingのmax以下であれば新しいメッセージをキューイングできるので”max_message_size”を超過する事もできる。
 
・”max_completed_connections”を”max_connections_per_user”で割った値がDOS(denial-of-service)によって他のユーザーがシステムワイドバス上ですべてのコネクションを使い果たしても利用できるユーザー数。
 
9)policyエレメント
 
①<policy>エレメントの概要
 
・バスに対する特定の接続に適用するセキュリティポリシーを定義する。
・ポリシーは、allowとdenyエレメントを使って定義する。
・ポリシーは通常systemwideバスで使用され、ファイアーウォールと似た役割。
・現在システムバスは、メソッドコールの送信とバスの名前を所有する事を禁止するデフォルトのポリシーを持つ。
<deny own=”*”/>
<deny send_type=”method_call”/>
 
・一般的には、システムバスは出来るだけ小さく、プログラムはそれ自身のプロセス内で実行され、一つのバス名を提供する事がベスト。
・<policy>エレメントは下記4つの属性のいずれかを持つ。
context=”(default|mandatory)”
at_console=”(true|false)”
user=”username or userid”
group=”group name or gid”
 
●デフォルト設定
 
○/etc/dbus-1/system.conf
<policy context=”default”>
 
○/etc/dbus-1/session.conf
<policy context=”default”>
 
②policyエレメントのdeny、allow
 
●<deny>と<allow>
 
・denyは、policyエレメントのすぐ下で設定し、禁止するアクションを設定する。
・allowはその前に記述したdenyの設定に対して許可する設定をする。
・上位に記述したdenyの要素がマッチしたらそのアクションは拒否され、下位のルールは無視される。
・設定できる属性は下記の通り。
send_interface=”interface_name”
send_member=”method_or_signal_name”
send_error=”error_name”
send_destination=”name”
send_type=”method_call” | “method_return” | “signal” | “error”
send_path=”/path/name”
 
receive_interface=”interface_name”
receive_member=”method_or_signal_name”
receive_error=”error_name”
receive_sender=”name”
receive_type=”method_call” | “method_return” | “signal” | “error”
receive_path=”/path/name”
send_requested_reply=”true” | “false”
receive_requested_reply=”true” | “false”
 
eavesdrop=”true” | “false”
 
own=”name”
user=”username”
group=”groupname”
 
③デフォルト設定
 
○/etc/dbus-1/system.conf
<allow user=”*”/>
<deny own=”*”/>
<deny send_type=”method_call”/>
<allow send_type=”signal”/>
<allow send_requested_reply=”true” send_type=”method_return”/>
<allow send_requested_reply=”true” send_type=”error”/>
<allow receive_type=”method_call”/>
<allow receive_type=”method_return”/>
<allow receive_type=”error”/>
<allow receive_type=”signal”/>
<allow send_destination=”org.freedesktop.DBus”/>
<deny send_destination=”org.freedesktop.DBus”
send_interface=”org.freedesktop.DBus”
send_member=”UpdateActivationEnvironment”/>
 
○/etc/dbus-1/session.conf
allow send_destination=”*” eavesdrop=”true”/>
<allow eavesdrop=”true”/>
<allow own=”*”/>

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です