diary/Kojima

PolicyKit + ConsoleKit

ここしばらく GNOME-2.26.2 上で,CD-ROM がうまく自動マウントできないので調べてみたメモ

周辺機器に対する権限を,従来の「スーパーユーザー(root)/一般ユーザー」 モデルよりも細かく管理するための仕組み.policy と呼ばれる xml 形式の設定ファイルで, 周辺機器ごとに利用権限を設定できる.

policy ファイルでは,周辺機器は伝統的なUnixにおけるデバイスファイル単位ではなく, HALで定義されるIDにより区別される.例えば,リムーバブルメディアをマウントする権限は, org.freedesktop.hal.storage.mount-removable,エジェクトする権限は org.freedesktop.hal.storage.eject というIDで設定できる.これらの設定は /usr/share/PolicyKit/policy/org.freedesktop.hal.storage.policy に 収められている.このディレクトリ(/usr/share/PolicyKit/policy/)には,記憶装置以外にも, 電源管理やWOL等,さまざまな周辺機器に関する設定が収められている.

上記設定ファイルは標準的な設定があらかじめ行なわれており,特に独自の設定を追加する場合以外は 修正する必要は無く,通常の利用権限の設定は /etc/Policy/PolicyKit.conf ファイルで行なう.

PolicyKit.conf ファイルもxml形式になっており,デフォルトでは

<config version="0.1">

</config>

だけで,この <config> から </config> の間に必要な設定を加えていくことになる. 設定は,条件に応じて result を返す形式で記述し. 例えばリムーバブルメディアのマウント権限をユーザ全てに与えたい場合は,

<match action="org.freedesktop.hal.storage.mount-removable">
   <return result="yes" />
</match>

という設定を行う.

<match action="org.freedesktop.hal.storage.mount-removable">
    <return result="yes"/>
</match>
<match action="org.freedesktop.hal.storage.eject-removable">
    <return result="yes"/>
</match>
<match action="org.freedesktop.hal.storage.mount-fixed">
    <return result="yes"/>
</match>
<match action="hal-storage-mount-fixed-extra-options">
    <return result="yes"/>
</match>
<match action="hal-storage-mount-removable-extra-options">
    <return result="yes"/>
</match>

これくらい設定しておけば,記憶装置に関しては十分なはず.

上記は周辺機器ごとの設定だが,ユーザごとに設定することも可能で,例えば

<match user="kojima">
    <return result="yes"/>
</match>

としておけば,kojima ユーザーは PolicyKit が設定している全ての権限を利用できる.

これらを組み合わせて,

<match action="org.freedesktop.hal.storage.mount-removable">
    <match user="kojima">
        <return result="no"/>
    </match>
</match>

のように,ユーザごとに操作の可否を設定することも可能なはず(要調査)

MacOSやWindos XPに実装されているfast user switch機能を実現するための仕組み.

fast user switchとは,GUI環境で,ログインしているユーザがログアウトせず, 別のユーザに一時的に画面やキーボードを譲って,一時作業が終ればまた元のユーザに戻って, 元の作業の続きができるような機能.元々Unixはマルチユーザで設計されており, 複数の独立したユーザ空間を用意する機能は備わっているものの, それらの切り替えは端末単位になっていて,GUI画面を一時的に切り替えるには新しい仕組みが必要になる.

従来のUnixでは,それぞれのプロセスはログイン時に認証されたユーザ単位で管理されているが, fast user switchを実現するためには,それらをより細かく管理するために, 認証されたプロセスが生み出す子プロセスに共通のcookie(XDG_SESSION_COOKIE)を持たせ, それらを同じシート(Seat)に収まったプロセス群(セッション)として管理するようになっているらしい.

概念的にはPolicyKitとは独立だが,センション単位で周辺機器の利用権限等を適用するために HALがConsoleKitに依存し,その結果Polkitとも関わってくることになる模様. さらに,このあたりの必要な情報をやりとりするためにD-Busを使うので, D-Busが正しく動いている(接続を受けつける)必要もある.

gdmやkdmといったGNOME/KDEのディスプレイマネージャはネィティブにConsoleKitに対応している (gdmのconfigureオプションには--with-console-kitが存在)ので, run level 4のGUIログインモードの場合は気にする必要はないが, 従来の run level 3のマルチユーザモードで使おうとすると,ログイン時にConsoleKitの承認を受ける (XDG_SESSION_COOKIEをもらう)必要がある.

Plamoを含めた最近のLinuxでは,ユーザ認証はPAMで一括管理されているので, ConsoleKitの承認はPAMのログイン認証時に受けるようにすればいい.

具体的には,ConsoleKitが提供している pam_ck_connctor.so(/lib/security/pam_ck_connector.so) モジュールをログイン認証の設定ファイル(/etc/pam.d/login)で読み込むようにすればよく, Plamoの場合,/etc/pam.d/login では

session    include	plamo-default

として,セッション認証は plamo-default ファイルを利用しているので,plamo-default の最後にでも pam_ck_connctor.so を読み込む設定をするのが簡単な気配.

#  added for console kit
session     required     /lib/security/pam_ck_connector.so

この設定をした上で,Xの起動時にWMをD-Busに登録してやればいい.具体的には, 従来は

exec gnome-session

と起動していたWMを

exec /usr/bin/dbus-launch --exit-with-session gnome-session

のようにする.ConsoleKitが提供している ck-launch-session というコマンドも同じような機能を果しそうだが,このコマンドの詳細は調べていない.

このあたりは,昨今のようにPCが普及してユーティリティ化している中では必要になる機能だとは思うものの, 伝統的なUnixの設計哲学には存在しなかった概念だから,ちょっと屋上に屋を架してるような印象はあるところ. まぁ,このあたりの概念を含めた形でカーネルを設計し直すよりは, ユーザ領域のツールとして実現する方が便利なんだろうけど,このヘンを見ていると micro kernelの魅力というのも改めて考えないといけない気がしてくるところ. MacOSにしろWindows XPにしろ,元々はmicro kernel由来のOSだから, このあたりの新機能の実現は得意な分野なんだろうなぁ.



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:41