| 改訂履歴 | |
|---|---|
| 2024-06-26 | |
Polkit はグラフィカルな Linux デスクトップ環境で使用される認可フレームワークで、システムでの権限管理をより精密に行うための仕組みです。従来の Linux システムでは、最高位のシステム権限を持つユーザとして root を規定し、それ以外のユーザやグループと分離していましたが、サウンドハードウエアにアクセスするための audio グループなどのように、 root とは別の権限構成も存在していました。このような構成では、特定の状態にある場合にのみ許可したり、一時的に許可したりするようなことが実現できませんでした。
このような場合、通常は sudo コマンドなどで root に成り代わり、特権を得て作業を行うことになりますが、 Polkit では要件に応じて特定のユーザやグループに対して、必要な権限のみを与えることができます。権限は処理と権限内容を記した設定ファイル内で動的に対応することができます。
Polkit は複数のコンポーネント (部品) から構成されています。まず polkitd は裏で動作する特権サービスで、 Polkit の設定ファイルを読み込んで必要な認証チェックを実施します。 Polkit 対応のアプリケーションは認証要求を polkitd に送信しますが、このとき特権を持たない Polkit 認証エージェントが動作して、 polkitd が求める認証要求を表示します。ここでユーザが対話的に入力した値は、エージェントを介して polkitd に送信されます。
Polkit での アクション は、 Polkit の認可ルールに記された 1 つの処理を意味します。このアクションはたとえば、コンピュータを再起動したいなどの意図を表します。それぞれのアクションには唯一の ID が設定され、たとえばコンピュータの再起動であれば org.freedesktop.login1.reboot という名称が割り当てられています。
ユーザが完全機能のデスクトップ環境内でグラフィカルなセッションを開始すると、認可エージェントが裏で自動的に起動されます。このエージェントは何らかの認証が必要となった場合にのみ表に現れるだけで、それ以外の状況では表には全く現れません。なお、テキストモードで起動した場合や SSH 経由でログインした場合は自動で起動されませんので、以降はグラフィカルなセッションを想定して記しています。
Polkit の設定は、 アクション と 認可ルール を元にして作られています:
*.policy )XML ファイル形式で記述され、 /usr/share/polkit-1/actions 内に配置されます。それぞれのファイルは 1 つ以上のアクションを定義していて、それぞれのアクションには説明と既定のアクセス許可が設定されます。システム管理者側では独自のルールを作成することができますが、 Polkit 側が提供するファイルについては、編集してはなりません。
*.rules )ルールは JavaScript プログラミング言語で記述され、 2 箇所に配置されます。システムが提供するパッケージの場合は /usr/share/polkit-1/rules.d に、独自に作成するファイルの場合は /etc/polkit-1/rules.d にそれぞれ配置します。それぞれのルールファイルには既定の認可設定のほか、複雑なロジックで権限を判断するようなことができます。たとえばルールファイルでは制限の厳しいアクセス許可を上書きすることができるほか、特定のユーザには認証 無しで実行できるようにしたりすることができます。
Polkit には、特定の作業を行うためのコマンドが用意されています (より詳しい説明については、それぞれのマニュアルページをお読みください):
pkaction設定済みのアクションに対して詳細を取得します。詳しくは 18.3項 「権限の問い合わせ」 をお読みください。
pkcheck特定の Polkit のアクションに対して、プロセスが認可されているかどうかを確認します。
pkexecPolkit の認可設定に従って、異なるユーザでプログラムを実行できるようにします。 su や sudo に似た仕組みです。
pkttyagentテキスト型の認証エージェントを起動します。このエージェントは、デスクトップ環境側に独自の認証エージェントが存在しない場合に使用されます。
Polkit を有効化したプロセスが権限操作を行うと、このプロセスに対して権限が設定されているかどうかを Polkit に尋ねる処理を行います。 Polkit はそのプロセスに対して設定されているポリシーを元にして、応答を返します。応答は yes (はい), no (いいえ), authentication needed (要認証) のいずれかとなります。 authentication needed (要認証) の場合はユーザに対して認証ダイアログを表示し、必要な認可を得る処理を行います。
特定のアクションに対して専用の Polkit JavaScript ルールが記述されていない場合、その結果は、 Polkit のポリシーファイルの各アクションに対して設定されている暗黙の認可設定に従って決定されます。この暗黙の認可設定には allow_active , allow_inactive , allow_any の 3 種類があります。 allow_active は動作中のセッション内にいるユーザに適用されるもので、テキストモードやグラフィカルユーザインターフェイスでログインしているユーザに適用されます。なお、ログイン中であっても、ユーザがコンソールを切り替えるなどして動作中でなくなると、 allow_inactive が適用されます。また、 allow_any は SSH や VNC などでログインしているリモートのユーザなど、それ以外の状況下で適用されます。これらそれぞれに対して、下記に示すいずれかの認可を割り当てることができます:
そのアクションに対して決して認可を与えないようにします。
認証情報を入力することなく、そのアクションに対して常に認可を与えるようにします。
権限を要求した際、自分自身のパスワードを入力させるようにします。
auth_self に似ていますが、認証情報を一定時間だけ保持します。つまり、同じアプリケーションから繰り返し同じアクションを実行した場合、パスワードの入力を求めなくなります。
権限を要求した際、管理者 (root) のパスワードを入力させるようにします。
auth_self_keep と同様に、管理者 (root) のパスワードを一定時間だけ保持します。
ここまでに説明してきた Polkit のポリシーファイル内の暗黙の認可設定は、アプリケーションの開発者が規定した既定の暗黙ポリシーセットが元になっています。このようなポリシーは 「提供元の既定値」 と呼ばれます。提供元の既定値で設定された権限は、既定の SUSE システムで有効化されていない場合もあります。 openSUSE Leap では、提供元の既定値を上書きする独自の権限セットを用意していますが、これには 3 種類のセットが含まれています:
/etc/polkit-default-privs.easy利用者が管理者自身であり、それ以外には誰も使用しないような、単一のデスクトップシステム向けの権限セットです。使いやすさを重視した設定であるため、セキュリティという観点では弱い設定です。
/etc/polkit-default-privs.standardほとんどのシステムに対して適用できる均衡の取れた権限セットです。
/etc/polkit-default-privs.restrictive使いやすさを犠牲にして、考えられる攻撃手法をできる限り無効化することを目指した、より保守的な権限セットです。
既定の権限を切り替えたい場合は、 /etc/sysconfig/security ファイル内にある POLKIT_DEFAULT_PRIVS の値を、 easy , standard , restrictive のいずれかに設定してください。設定が終わったら、 root で set_polkit_default_privs を実行します。
上述のファイルについては変更してはなりません。独自の権限セットを構築したい場合は、 /etc/polkit-default-privs.local で設定してください。詳しくは 18.4.3項 「SUSE 既定の権限設定の変更」 をお読みください。
権限を問い合わせたい場合は、 Polkit に含まれている pkaction コマンドを使用します。
Polkit には権限を変更したり、他のユーザでコマンドを実行したりするためのコマンドラインツールが付属しています (概要は 18.1.3項 「Polkit のユーティリティ」 で説明しています) 。またそれぞれの既存のポリシーには、識別のための名前が設定されています。利用可能なポリシーを一覧で表示したい場合は、 pkaction コマンドをお使いください。詳しくは man pkaction をお読みください。
特定のポリシー (例: org.freedesktop.login1.reboot) に対して、必要な認可情報を表示したい場合は、 pkaction を下記のように実行します:
>pkaction -v --action-id=org.freedesktop.login1.rebootorg.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
pkaction の制限事項についてpkaction は提供元の既定値に対してのみ作用するもので、提供元の既定値を上書きする SUSE の既定値に対しては作用しないことに注意してください。そのため、出力結果は注意して解釈する必要があります。
たとえば特定のチーム内に配布するコンピュータをセットアップするような場合など、複数のマシンに同じポリシーセットを設定したいような場合、 Polkit の設定を修正する必要があります。このほか、 Polkit の認可設定をカスタマイズすることで、特定のアクションに対するセキュリティを強化したり、よく使用されるアクションに対して繰り返しのパスワード入力を省略したりなどを行うこともできます。ただし、認証無しで Polkit のアクションを不用意に実行できるように設定してしまうと、設定によっては完全な root 権限を得る結果になってしまうこともあります。そのため、 Polkit で認証設定を弱くする場合は、お使いの環境下でシステムのセキュリティを侵さない範囲でのみ設定するようにしてください。
お使いのシステムでどのようなアクションが利用できるのかは、どのパッケージをインストールしているのかによって決まります。概要を表示したい場合は、 pkaction を実行して、定義済みの全ルールを一覧で表示させてください。
下記では、例として gparted コマンド ( 「GNOME パーティションエディタ」 ) における Polkit との連携例を示しています。
/usr/share/polkit-1/actions/org.opensuse.policykit.gparted.policy ファイルには、下記のような内容が書かれています:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd"> <policyconfig> 1 <action id="org-opensuse-polkit-gparted"> 2 <message>Authentication is required to run the GParted Partition Editor</message> <icon_name>gparted</icon_name> <defaults> 3 <allow_any>auth_admin</allow_any> <allow_inactive>auth_admin</allow_inactive> < allow_active>auth_admin</allow_active> </defaults> <annotate 4 key="org.freedesktop.policykit.exec.path">/usr/sbin/gparted</annotate> <annotate 4 key="org.freedesktop.policykit.exec.allow_gui">true</annotate> </action> </policyconfig>
ポリシーファイルの XML ルート要素です。 | |
このポリシー内で唯一設定されたアクションの開始位置です。 | |
ここには暗黙の認可が設定されています。 | |
|
独自のポリシーを追加したい場合は、上記のような構造で .policy ファイルを作成し、 id 属性に適切な値を設定して、既定のアクセス許可を記述してください。
Polkit 認可フレームワークは以前、 PolicyKit という名称で呼ばれていました。このことから、 XML 文書の属性値などには古い名称が残っている場合があります。
独自の認可ルールを作成することで、暗黙の認可を上書きして動作させることができます。独自のルールを作成する場合は、 /etc/polkit-1/rules.d/ ディレクトリ内にファイルを作成してください。
このディレクトリにファイルを配置する場合、ファイル名は 2 桁の数字ではじめ、ハイフンで区切ってその後ろにわかりやすい名前を続けて、末尾は .rules で終わらせるようにしてください。これらのファイル内の関数は、並べ替えられた順に実行されます。たとえば 00-foo.rules ファイルは 60-bar.rules や 90-default-privs.rules ファイルの前に実行されます。
ルールファイル内はスクリプト形式で、まずアクション ID (.policy ファイルで定義されている値) が特定のものであるかどうかをチェックします。たとえば gparted というコマンドを admin グループ内の任意のユーザに対して許可したい場合は、 org.opensuse.policykit.gparted のアクション ID に対して、下記のような処理を記述します:
/* Allow users in admin group to run GParted without authentication */
polkit.addRule(function(action, subject) {
if (action.id == "org.opensuse.policykit.gparted" &&
subject.isInGroup("admin")) {
return polkit.Result.YES;
}
});Polkit API 内で提供されている全てのクラスとメソッドについて、詳しくは https://www.freedesktop.org/software/polkit/docs/latest/ref-api.html をお読みください。
18.2.2項 「SUSE 既定の権限」 で説明しているとおり、 SUSE では、提供元の開発者が設定した Polkit の暗黙の認可設定を上書きする設定を提供しています。それ以外の独自の権限については、 /etc/polkit-default-privs.local ファイル内に記述してください。ここで定義された権限は、その他の設定ファイル内に書かれているものよりも常に優先して適用されます。独自の権限セットを定義したい場合は、下記のようにして行います:
/etc/polkit-default-privs.local ファイルを編集します。権限を定義するには、下記のような形式で各アクション向けの行を記述します:
<アクション-ID> <任意のセッションに対する認可指定>:<非動作中のセッションに対する認可指定>:<動作中のセッションに対する認可指定>
3 種類全てのカテゴリに対して同じ設定を適用したい場合は、下記のように 1 つだけ値を指定してもかまいません:
<アクション-ID> <全てのセッションに対する認可指定>
たとえば、下記のように指定します:
org.freedesktop.color-manager.modify-profile auth_admin_keep
あとは設定を反映させるため、 root で下記を実行します:
#/sbin/set_polkit_default_privs
SUSE での Polkit 既定値に関する詳しいドキュメンテーションについては、 man polkit-default-privs をお読みください。
認可設定を SUSE 提供の既定値に戻したい場合は、下記の手順を実施します:
まずは 18.2.2項 「SUSE 既定の権限」 で説明している設定値のいずれかを選択します。
/etc/polkit-default-privs.local に記述している全ての上書き設定を削除します。
あとは set_polkit_default_privs を実行すると、既定値に戻すことができます。