polkit
- polkit は、非特権プロセスが特権プロセスと通信できるようにするポリシーを定義および操作するためのアプリケーションレベルのツールキットです: 特権操作へのアクセス許可を非特権アプリケーションに与えるかの判断を集中的に行うフレームワークになります。
Polkit はシステム全体の権限を制御するために使われます。非特権プロセスが特権プロセスと通信するための体系化された手段を提供します。sudo などのシステムと対照的に、Polkit は1つのプロセス全体に root 権限を与えるようなことはせず、一元化されたシステムポリシーをより細かいレベルで制御することができます。
Polkit は、個々のアクション (例: GParted の実行) で区切ったり、ユーザをグループ (例: wheel グループのメンバー) や名前で区切ったりすることで機能します。そして、パスワードの入力でグループのメンバーか確認するなど、ユーザーにアクションを許可する方法を定義します。
目次
インストール
認証エージェント
認証エージェントは、本当に本人であること、或いは管理ユーザであることをセッションのユーザに証明させるために使用されます (本人であることはユーザとして認証することによって、管理ユーザであることは管理者として認証することによって証明されます)。polkit パッケージには 'pkttyagent' という名前のテキスト形式の認証エージェントが含まれており、一般的なフォールバックとして使われます。
グラフィカル環境を使っている場合、グラフィカルな認証エージェントをインストールし、(xinitrc を使うなどして) ログイン時に自動で実行されるようにしてください。
Cinnamon、Deepin、Hyprland、GNOME、GNOME Flashback、KDE、LXDE、LXQt、MATE、Xfce には初めから認証エージェントが入っています。 他のデスクトップ環境を使っているときは、以下の実装からどれか一つを選ぶ必要があります:
- hyprpolkitagent-gitAUR:
/usr/lib/hyprpolkitagent
を提供 - lxqt-policykit:
/usr/bin/lxqt-policykit-agent
を提供 - lxsession または lxsession-gtk3:
/usr/bin/lxpolkit
を提供 - mate-polkit:
/usr/lib/mate-polkit/polkit-mate-authentication-agent-1
を提供 - polkit-efl-gitAUR:
/usr/bin/polkit-efl-authentication-agent-1
を提供 - polkit-gnome:
/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
を提供 - polkit-kde-agent:
/usr/lib/polkit-kde-authentication-agent-1
を提供 - ts-polkitagentAUR:
/usr/lib/ts-polkitagent
を提供 - xfce-polkitAUR または xfce-polkit-gitAUR:
/usr/lib/xfce-polkit/xfce-polkit
を提供 - pantheon-polkit-agent:
/usr/lib/policykit-1-pantheon/io.elementary.desktop.agent-polkit
を提供
設定
Polkit の定義は2種類に分けることができます:
- アクション (Action) は
/usr/share/polkit-1/actions
内に XML の.policy
ファイルで定義されます。各アクションにはデフォルトのパーミッションがあります (例: GParted のアクションを使うには管理者として認証する必要があります)。デフォルトは上書きできますが、デフォルトのアクションファイルを編集するのは正しい方法ではありません。 - 認可ルール (Authorization rule) は JavaScript の
.rules
ファイルで定義されます。このルールは2つの場所に置かれます:- サードパーティのパッケージは
/usr/share/polkit-1/rules.d
を使用できます。 /etc/polkit-1/rules.d
はローカル設定用です。
- サードパーティのパッケージは
Polkit は Linux にある既存のパーミッションシステム (グループメンバーシップ、アドミニストレータステータス) の上で動作し、それらを置き換えるものではありません。.rules ファイルはユーザーのサブセットを指定して、アクションファイルで指定されているアクションのどれか一つ (または複数) を参照して、そのユーザーによるアクションにどのような制限をかけるか決定します。例を上げると、rules ファイルを使うことにより、GParted を使用する際に全ユーザが管理者として認証するというデフォルトの要件を上書きし、一部の特定のユーザに対しては認証を不要にできます。また別の例として、特定のユーザの GParted の使用を一切禁止することができます。
アクション
polkit によって利用できるアクションはインストールしたパッケージ次第です。複数のデスクトップ環境によって使われるアクションもあれば (org.freedesktop.*)、 DE 固有アクションもあり (org.gnome.*)、ある一つのプログラム固有だったりもします (org.gnome.gparted.policy)。pkaction
コマンドはクイックリファレンスとして /usr/share/polkit-1/actions
で定義されているアクションを全て表示します。
polkit で何ができるのかということを理解するために、一般的に使われているアクションのグループを以下に示します:
- systemd-logind (org.freedesktop.login1.policy) のアクションには、(他のユーザーがログインしている時を含む) システムの電源オフ・再起動・サスペンド・ハイバネートが含まれています。
- udisks (org.freedesktop.udisks2.policy) のアクションには、ファイルシステムのマウントや暗号化デバイスのアンロックが含まれます。
- NetworkManager (org.freedesktop.NetworkManager.policy) のアクションには、ネットワーク、wifi、モバイルブロードバンドのオン/オフが含まれています。
それぞれのアクションは .policy ファイルの <action>
タグで定義されます。org.gnome.gparted.policy
には単一のアクションが含まれており、以下のような見た目をしています:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" "http://www.freedesktop.org/software/polkit/policyconfig-1.dtd"> <policyconfig> <action id="org.gnome.gparted"> <message>Authentication is required to run the GParted Partition Editor</message> <icon_name>gparted</icon_name> <defaults> <allow_any>auth_admin</allow_any> <allow_inactive>auth_admin</allow_inactive> <allow_active>auth_admin</allow_active> </defaults> <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/gparted</annotate> <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate> </action> </policyconfig>
id 属性は実際に D-Bus に送信されるコマンド、message タグは認証が必要なときにユーザーに表示する説明、icon_name はその名の通りアイコンです。
defaults タグにはパーミッションのあるなしを記述します。次の3つの設定が含まれます: allow_any, allow_inactive, allow_active。inactive も active もここではローカルコンソールまたはローカルディスプレイのローカルセッションを指します。allow_any は、リモートセッション (SSH、VNV など) を含むその他全てに対して使用します。
それぞれの設定には以下のオプションを使うことができます:
- no: ユーザはアクションを実行する権限を与えられません。したがって認証の必要もありません。
- yes: ユーザは認証をすることなくアクションを実行することができます。
- auth_self: 認証が必要ですが管理者ユーザである必要はありません。
- auth_admin: 管理者ユーザーとしての認証が必須です。
- auth_self_keep: auth_self と同じですが、sudo と同じように、認可の効力は数分間しか続きません。
- auth_admin_keep: auth_admin と同じですが、sudo と同じように、認可の効力は数分間しか続きません。
以上がデフォルト設定であり、後の設定で覆されないかぎり、全てのユーザに対して有効です。
より詳しい説明は polkit(8) man ページを参照してください。
GParted のアクションからわかるように、GParted を使用するには管理者としての認証を求められ、それはセッションがアクティブかそうでないかによりません。
認可ルール
デフォルトの設定をオーバーライドする認可ルールは、(「設定」セクションの冒頭に書かれた) 上記のディレクトリ内に置かれます。単一システムの個人設定に関連する用途の場合は、/etc/polkit-1/rules.d
のみを使用するべきです。
addRule()
メソッドは、アクションと動作主体の認可チェックが行われる時に呼ばれる関数を追加するために使用されます。関数は、追加された順番で呼ばれ、それらの関数のうち1つが値を返すまでその順に呼ばれ続けます。したがって、他のルールより先に処理される認可ルールを追加するには、そのルールを /etc/polkit-1/rules.d
内のファイルに置き、名前順で他のルールよりも前に来る名前を付けてください (例: 00-early-checks.rules
)。
.rules ファイルの構造は一目瞭然です:
/* admin グループ内のユーザが認証無しで GParted を実行できるようにする */ polkit.addRule(function(action, subject) { if (action.id == "org.gnome.gparted" && subject.isInGroup("admin")) { return polkit.Result.YES; } });
この関数内では、指定されたアクション ID (org.gnome.gparted) とユーザのグループ (admin) に対してチェックを行い、その後 "yes" の値を返します。
管理者の識別
addAdminRule()
メソッドは、管理者認証が要求された時に呼ばれる関数を追加するために使用されます。(追加する) 関数は、アクションや動作主体によって識別される認可チェックの管理者認証にどの識別子を使用するかを指定するために使用されます。追加された関数は、追加された順番で呼ばれ、それらの関数のうち1つが値を返すまでその順に呼ばれ続けます。
管理者識別子のデフォルトの設定は、/usr/share/polkit-1/rules.d/50-default.rules
ファイルに含まれています。なので、この設定に対する如何なる変更も、そのファイルを (例えば /etc/polkit-1/rules.d
ディレクトリなどに) コピーし、コピー先のファイルを編集することによって行うべきです:
/etc/polkit-1/rules.d/50-default.rules
polkit.addAdminRule(function(action, subject) { return ["unix-group:wheel"]; });
(コピー後に) 編集すべき部分は関数の return の配列だけです: 管理ユーザとしての認証を要求された時に、ユーザは誰として認証するべきでしょうか? 管理者として指定されたグループのメンバーである場合、ユーザはそのユーザ独自のパスワードを入力するだけで良いです。ある別のユーザ (例えば root) が唯一の管理者である場合、ユーザは root のパスワードを入力する必要があります。ユーザ ID の形式は、権限を指定する時に使用するものと同じです。
Arch のデフォルトでは、wheel グループの全メンバーを管理者にします。以下のようなルールは、管理者認証の際に対象ユーザのパスワードではなく root のパスワードを polkit に尋ねさせます。
/etc/polkit-1/rules.d/49-rootpw_global.rules
/* 管理者を認証する際は常に root パスワードを要求する。 * sudo における rootpw オプションに似ている。 */ polkit.addAdminRule(function(action, subject) { return ["unix-user:root"]; });
サンプル
特定のユーザーに org.freedesktop.timedate1.set-timezone アクションの使用を許可する
archie
という名前のユーザーに org.freedesktop.timedate1.set-timezone
アクションの認証なしの使用を許可するには、以下の polkit ルールを root ユーザーを使って作成してください:
/etc/polkit-1/rules.d/49-allow-archie-set-timezone.rules
polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.timedate1.set-timezone" && subject.user == "archie") { return polkit.Result.YES; } });
このルールファイルを保存したら、ポリシーが即座に有効になるはずです。timedatectl
を使ってタイムゾーンを設定することでテストできます:
[archie]$ timedatectl set-timezone America/New_York
認証を求められずに操作が完了すれば、ルールが意図通りに機能していることを意味します。アクションが許可されていないような場合は、/etc/polkit-1/rules.d/
内のより高い優先度を持つルール (より小さい番号のプレフィックスを持つファイル) と衝突していないか調べてください。
デバッグ・ログ出力
polkit.log()
関数でのログを有効化するには、/usr/lib/systemd/system/polkit.service
ファイルの ExecStart
コマンドから --no-debug
フラグを消してください。
以下のルールは要求されたアクセスの詳しい情報をログ出力します:
/etc/polkit-1/rules.d/00-log-access.rules
polkit.addRule(function(action, subject) { polkit.log("action=" + action); polkit.log("subject=" + subject); });
ルールを手動でテストするには、pkcheck
を使用してください[1]:
$ pkcheck -u -p $$ --enable-internal-agent -a action
サスペンドとハイバネートの無効化
以下のルールは全てのユーザーでサスペンドとハイバネートを無効化します。
/etc/polkit-1/rules.d/10-disable-suspend.rules
polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.login1.suspend" || action.id == "org.freedesktop.login1.suspend-multiple-sessions" || action.id == "org.freedesktop.login1.hibernate" || action.id == "org.freedesktop.login1.hibernate-multiple-sessions") { return polkit.Result.NO; } });
パスワードプロンプトの迂回
sudo の NOPASSWD
オプションのようにユーザー/グループだけに基づいて認可をしたい場合、/etc/polkit-1/rules.d/
にカスタムルールを作って下さい。特定のアクションまたはグローバルでのパスワード認証を上書きすることができます。ルールセットの例は [2] を見て下さい。
グローバル
root として以下のファイルを作成:
/etc/polkit-1/rules.d/49-nopasswd_global.rules
/* Allow members of the wheel group to execute any actions * without password authentication, similar to "sudo NOPASSWD:" */ polkit.addRule(function(action, subject) { if (subject.isInGroup("wheel")) { return polkit.Result.YES; } });
wheel
は別のグループに置き換えることができます。
上記を設定すると Polkit によって管理者権限を要求するアクションがすべて自動的に認証されます。そのため、権限を与えるグループは注意して選ぶようにしてください。
また、認可を5分間キープできるようにする AUTH_ADMIN_KEEP
もあります。しかし、認可はプロセス毎なので、新しいプロセスが5分以内に認可を要求してきた場合、その新しいプロセスはいずれにせよパスワードを要求してきます。
特定のアクション
root として以下のファイルを作成:
/etc/polkit-1/rules.d/49-nopasswd_limited.rules
/* Allow members of the wheel group to execute the defined actions * without password authentication, similar to "sudo NOPASSWD:" */ polkit.addRule(function(action, subject) { if ((action.id == "org.gnome.gparted" || action.id == "org.libvirt.unix.manage") && subject.isInGroup("wheel")) { return polkit.Result.YES; } });
上記のファイルでは例として action.id
が GParted と Libvirt の場合を載せていますが、パッケージに含まれているものや自分で作成したルールを自由に設定することができます。また、wheel
以外のグループを設定することも可能です。
||
演算子はアクションを区切る (論理 OR) ために使用されており、&&
は論理 AND を意味し、最後の演算子として残して置かなければなりません。
Udisks
ストレージデバイスをマウントするときにファイルマネージャがパスワードを要求することがあります。入力しないと Not authorized などのエラーが表示されます。詳しくは Udisks#設定 を見て下さい。
通常ユーザーに個々の systemd ユニットの管理を許可
polkit のポリシーチェックに渡される値をチェックすることで、特定のユニットを管理する権限をユーザーやグループに与えることができます。例えば、標準ユーザーに wpa_supplicant を起動・停止する権限を与えたい場合:
/etc/polkit-1/rules.d/10-wifimanagement.rules
polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.systemd1.manage-units") { if (action.lookup("unit") == "wpa_supplicant.service") { var verb = action.lookup("verb"); if (verb == "start" || verb == "stop" || verb == "restart") { return polkit.Result.YES; } } } });
参照
- Polkit マニュアルページ
- The Polkit authentication framework (openSUSE Leap Security guide)