概要
PolKit (従来は PolicyKit という名称でした) は、権限を定義し、処理するための ツールキットです。
PolKit は権限を持たないユーザセッションと権限を持つシステムコンテキストとの
間で、仲介を行なうアプリケーションフレームワークです。ユーザセッションの
プロセスが、システムコンテキスト内にある何らかの動作を行なおうとすると、
PolKit への問い合わせが行なわれます。設定内容 (「ポリシー」 と
呼びます) に依存して、問い合わせへの回答は 「はい」,
「いいえ」, 「要認証」 のいずれかが返されます。
sudo のような従来の認可プログラムとは異なり、 PolKit はプロセス全体に
対して root
の許可を与えることはなく、その処理のみに適用します。
ユーザがセッション (デスクトップ環境など) を開始すると、各セッションには 権限 と 認証エージェント が 構成されます。権限は、システムのメッセージバス上で動作するサービスとして 実装されるもので、認証エージェントは現在のユーザ (セッションを開始した ユーザ) を認証するために使用されるものです。また、現在のユーザは、認証情報 (たとえばパスフレーズなど) を利用して正当性の確認を行ないます。
PolKit を設定する際、システム管理者は 権限ルール を 利用して権限ポリシーを設定することができます。どのような 動作 を実行するのかは、アプリケーション側で 設定します。
それぞれの既存のポリシーには名前 (識別子) が付けられています。これは コマンドラインツールやグラフィカルなユーザインターフェイスで利用します。
現時点では、権限を必要とする全てのアプリケーションが PolKit を使用する ようにはできていません。 openSUSE® において、 PolKit が利用されて いる代表的なアプリケーションには、下記のようなものがあります。
表9.1 利用可能なポリシー
アプリケーション |
ポリシー |
---|---|
PulseAudio |
PulseAudio デーモンに対するスケジューリングの優先順位設定 |
CUPS |
プリンタの追加や削除、編集や有効化/無効化の設定 |
GNOME |
|
PolKit |
|
PackageKit |
|
System |
|
YaST |
|
PolKit に対応したプロセスが権限を伴う操作を行なおうとすると、 PolKit に対して そのプロセスが対応する権限を持っているかどうか確認が行なわれます。 PolKit からの回答は、そのプロセスに対して設定されたポリシーに従って行なわれます。 それぞれ 「はい」, 「いいえ」, 「要認証」 のいずれかの回答パターンがあります。既定ではポリシーには 「暗黙の」 権限が設定され、これらは自動的に全てのユーザに対して適用されます。逆に 「明示的な」 権限を設定することもできます。この場合は特定の ユーザに対してのみ権限が適用されます。
暗黙の権限とは、任意のセッション (動作中のもの/一時停止中のものの両方) に対して設定できる権限です。動作中のセッションとは、現在誰かが利用している 最中のセッションのことで、たとえば他のコンソールに切り替えたりすることで、 一時停止状態に移行します。暗黙の権限を 「いいえ」 に切り替えると、 誰に対しても権限が付与されなくなります。逆に 「はい」 に設定する と、全てのユーザに対して権限が付与されるようになります。ただし、多くの場合は 認証を求めておいたほうが便利です。
ユーザに対しては、 root
の認証を行なうことで権限を与えることができる
ほか、自分自身の認証で権限を与えるように設定することもできます。それぞれの
認証方法に対しては、下記の 4 種類のいずれかを設定することができます:
常にユーザに対して認証を求める方法です。
認証を、現在動作中のプログラムに対して 1 回だけ求める方法です。 プログラムを再起動すると、再度認証作業が必要になります。
認証ダイアログボックスには、
(このセッションに対する権限を記憶する) というチェックボックスが存在します。これにチェックを入れると、認証は ログアウトするまでの間、有効であり続けます。認証ダイアログボックスには、
(権限を記憶する) というチェックボックスも存在しています。これにチェック を入れると、認証は一度だけ求められ、以後求められないようになります。明示的な権限は、特定のユーザに対してのみ権限を付与する方法です。無制限に 権限を与えることができるほか、動作中のセッションに対してだけ与えることも できますし、ローカルコンソールに対してだけ与えることもできます。
また、あるユーザに対して権限を与えるだけでなく、あるユーザに対しては権限を 与えないような設定を行なうこともできます。権限を与えないように明示的に 設定されたユーザは、既定の暗黙の権限ポリシーで権限付与が設定されていた場合でも、 権限の必要な処理を行なうことができなくなります。
PolKit に対応している各アプリケーションには、アプリケーションの開発者が規定した 暗黙の権限の既定値が存在します。これらのポリシーは 「提供元の既定値」 と呼ばれます。提供元の既定値は、必ずしも SUSE 製品を既定の設定で利用する 際に必要となるものではありません。 openSUSE では、提供元の既定値ではなく、 独自の既定値を定義しています:
/etc/polkit-default-privs.standard
ほとんどのデスクトップシステムに対して適切に働く設定で 、 こちらを既定値として利用するようになっていま す。
/etc/polkit-default-privs.restrictive
集中管理型のマシンに適切な設定で す。
既定の設定を切り替えたい場合は、 /etc/sysconfig/security
ファイル内にある POLKIT_DEFAULT_PRIVS
の値を、
restrictive
または standard
のいずれかに
設定してください。設定後は root
で
set_polkit_default_privs を実行します。
なお、上記のファイルを書き換えることはしないでください。独自の権限セットを
定義したい場合は、
/etc/polkit-default-privs.local
をご利用ください。
詳しくは 9.2.1.1項 「暗黙の権限を使用するための設定ファイル修正」
をお読みください。
暗黙の権限や明示的な権限を修正するには、 PolKit に同梱されているコマンドラインツールを 利用し、設定ファイルを変更します。設定ファイルの変更は、恒久的な変更を行ないたい場合に お勧めの方法です。
PolKit (PolicyKit
) には、権限を変更したり他のユーザに
成り代わってコマンドを実行したりするためのコマンドラインツールが
用意されています。また、既存のポリシーには識別名が用意されていて、コマンド
ラインツールから利用する際には、この識別名を利用して指定します。
なお、利用可能なポリシーの一覧は、 pkaction
コマンドで取得できます。
何もパラメータを指定しないで pkaction コマンドを
実行すると、利用可能な全てのポリシーを表示します。
--show-overrides
オプションを指定すると、既定値とは異なる
全てのポリシーを表示することができます。特定の処理に対する権限を、提供元の
既定値に戻したい場合は、 --reset-defaults
オプションをお使いください。
詳しくは man 1 polkit-action をお読みください。
処理
指定したポリシー (下記の例では org.freedesktop.login1.reboot
)
に対して、必要な権限情報を表示するには、下記のように pkaction
コマンドを利用します:
pkaction -v --action-id org.freedesktop.login1.reboot org.freedesktop.login1.reboot: description: Reboot the system message: Authentication is required to allow rebooting the system vendor: The systemd Project vendor_url: http://www.freedesktop.org/wiki/Software/systemd icon: implicit any: auth_admin_keep implicit inactive: auth_admin_keep implicit active: yes
auth_admin_keep
というキーワードは、ユーザに対して
パスフレーズの入力を求める、という意味です。
openSUSE における pkaction の制限 | |
---|---|
pkaction コマンドは、提供元の既定値に対してのみ 動作します。 openSUSE における既定値を一覧表示したり、復元したり することはできません。これらを実施したい場合は、 9.2.2項 「既定の権限の復元」 をお読みください。 |
polkit-auth
特定のユーザに対する明示的な権限を一覧表示するには、下記のコマンドを実行します:
polkit-auth --explicit-detail --user USER
上記では USER
を実際のユーザ名に置き換えてください。
--user
オプションを指定せずに実行すると、コマンドを
実行したユーザに対する権限情報を表示します。詳しくは
man 1 polkit-auth をお読みください。
設定ファイルを編集することでの権限調整は、複数のマシン (たとえば特定の チーム内のコンピュータ) に対して同じポリシーを配布するような場合に便利です。 設定ファイルの編集では、暗黙の権限と明示的な権限の両方を変更することが できます。
openSUSE では既定の権限設定を 2 種類用意しています。それぞれ
/etc/polkit-default-privs.standard
と
/etc/polkit-default-privs.restrictive
という
ファイルです。詳しくは 9.1.3項 「既定の権限」
をお読みください。
権限設定を独自に定義して使用したい場合は、
/etc/polkit-default-privs.local
ファイルをご利用
ください。ここで設定した権限は、他の設定ファイルで設定されたものよりも
常に優先して適用されるようになっています。また、権限を定義するには、
ポリシーファイルに行を追加して、下記の書式で記入してください:
<権限の識別子>
<任意のセッション>
:<一時停止中のセッション>
:<動作中のセッション>
たとえば、下記のようになります:
org.freedesktop.policykit.modify-defaults auth_admin_keep_always
利用可能な全ての権限識別子を一覧表示するには、 polkit-action
コマンドを実行してください。また、 セッション
パラメータには
下記の値を設定することができます:
yes
権限を付与します。
no
権限を与えないようにします。
auth_self
権限が必要なとき、常に自分自身の (呼び出したユーザの) パスワードを入力するよう求めます。
auth_self_keep_session
権限が必要なとき、セッション内で一度だけ自分自身の (呼び出した ユーザの) パスワードを入力するよう求めます。 認証後はセッション全体に対して権限を付与します。
auth_self_keep_always
権限が必要なとき、一度だけ自分自身の (呼び出したユーザの) パスワードを入力するよう求めます。 認証後はセッション全体と、今後作成されるセッションに対して 権限を付与します。
auth_admin
権限が必要なとき、常に root
のパスワードを入力するよう求めます。
auth_admin_keep_session
権限が必要なとき、セッション内で一度だけ root
の
パスワードを入力するよう求めます。
認証後はセッション全体に対して権限を付与します。
auth_admin_keep_always
権限が必要なとき、一度だけ root
の
パスワードを入力するよう求めます。
認証後はセッション全体と、今後作成されるセッションに対して
権限を付与します。
/etc/polkit-default-privs.local
ファイルを編集した
あとは、変更内容を反映するために set_polkit_default_privs
を実行してください。
明示的な権限は /etc/PolicyKit/PolicyKit.conf
ファイルで設定します。この設定ファイルは PolKit の DTD に従った XML
の形式になっています。 openSUSE に同梱されているファイルには、
既に必要なヘッダとルート要素 <config>
が
含まれていて、編集を行なう場合は <config>
タグ内に記述します。
match
動作やユーザを指定します。 match
には 2 種類の
属性 (user
, action
) を指定
できますが、いずれか 1 つのみを指定します。 match
を入れ子で指定すると、属性を組み合わせることができます。また、
属性値には POSIX の拡張正規表現を利用することができます。
user=USER
1 つまたは複数のログイン名を指定します。複数の名前を指定する場合 は、 「|」 記号で区切ってください。
action=policy
識別子でポリシーを指定します。利用可能なポリシー識別子の一覧を 表示するには、 polkit-action コマンドを使用 します。
return
PolKit が返却する応答を指定します。 1 つの属性値だけを指定することが
でき、 result=
の形式で指定します。値の一覧は
9.2.1.1項 「暗黙の権限を使用するための設定ファイル修正」
をお読みください。
value
define_admin_auth
通常は root
のパスワード入力が必要な処理について、自分自身の
(呼び出したユーザの) パスワード入力で権限を与えることのできるユーザや
グループを指定します。 user=
または USER
group=
の
属性値を設定することができますが、いずれか 1 つのみを指定します。
複数の属性値を指定する場合は、 「|」 記号で区切って
ください。なお、ここでは POSIX の拡張正規表現を利用することは
できません。トップレベルで使用した場合は全てのポリシーに対して
適用されますが、 GROUP
<match>
内で使用すると
特定のポリシーに対してのみ適用されます。
例9.1 /etc/PolicyKit/PolicyKit.conf
ファイルの例¶
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE pkconfig PUBLIC "-//freedesktop//DTD PolicyKit Configuration 1.0//EN" "http://hal.freedesktop.org/releases/PolicyKit/1.0/config.dtd"> <config version="0.1"> <match action="org.freedesktop.packagekit.system-update"> <match user="tux"> <return result="yes"/> </match> </match> <match action="org.freedesktop.policykit.*"> <match user="tux|wilber"> <return result="no"/> </match> </match> <define_admin_auth group="administrators"/> </config>
設定ファイルの最初の 3 行は XML のヘッダです。これらの行はテンプレート ファイル内に書かれているものであり、これらは編集しないでください。 | |
XML のルート要素は必須の要素です。また、属性 | |
ユーザ | |
ユーザ | |
グループ |
openSUSE で独自の既定値が設定されていて、アプリケーション提供元の既定値を 上書きするようになっています。詳しくは 9.1.3項 「既定の権限」 をお読みください。
PolKit のツールは、グラフィカルなものであってもコマンドラインツールであっても、
いずれも提供元の既定値に対して動作するようになっているため、 openSUSE では、
/etc/polkit-default-privs.*
で定義されている権限に
リセットするためのコマンドラインツール、
set_polkit_default_privs が用意されています。
ただし、 set_polkit_default_privs によるリセットは、
提供元の既定値にリセットするだけの機能であることに注意してください。
PolKit では一般ユーザと管理者の認証を区別して扱います。 「管理者」 は様々な オペレーティングシステムでそれぞれ個別に定義されている仕組みですが、ローカルオーソリティ と呼ばれる仕組みでは、 管理者認証 をどのように設定するのかを指定する ことができます。
既定では、 SUSE システムは root
のパスフレーズを要求しますが、管理者グループの
メンバーであるかどうかを要件にしたい場合は、ローカルオーソリティをそのように設定することも
できます。
PolKit は、下記のディレクトリ内に存在していて、 .pkla
という拡張子のある
ファイルを読み込みます:
/etc/polkit-1/localauthority
. ローカル設定用
/var/lib/polkit-1/localauthority
. サードパーティ製のパッケージ用
上記のディレクトリには、それぞれ特定の用途ごとにサブディレクトリが含まれます:
10-vendor.d
OS の製造元が使用するディレクトリ
20-org.d
OS を配置する企業や団体などが使用するディレクトリ
30-site.d
システムを配置する部署や部門などが使用するディレクトリ
50-local.d
ローカルで使用するディレクトリ
90-mandatory.d
OS を配置する団体などが使用するディレクトリ
それぞれの .pkla
ファイルには、キー/値の対で記述する 1 つまたは
複数の認証項目が含まれます。それぞれのキーワードの意味について、詳しくは
http://www.freedesktop.org/software/polkit/docs/0.105/polkit.8.html
(英語) をお読みください。
下記の例では、 NetworkManager のローカル認証設定例を示しています:
例9.2 NetworkManager でのローカル認証設定 (/var/lib/polkit-1/localauthority/10-vendor.d/org.freedesktop.NetworkManager.enable-disable-network.pkla
)