「Polkit」の版間の差分
(→構造: 冒頭を同期) |
(→アクション: 同期) |
||
59行目: | 59行目: | ||
=== アクション === |
=== アクション === |
||
− | {{Tip|グラフィカルインターフェイスで Policykit のアクションを表示するには、 |
+ | {{Tip|グラフィカルインターフェイスで Policykit のアクションを表示するには、{{AUR|polkit-explorer-git}} パッケージをインストールしてください。}} |
− | polkit によって利用できるアクションはインストールしたパッケージ次第です。複数のデスクトップによって使われるアクションもあれば ''(org.freedesktop.*)''、 |
+ | polkit によって利用できるアクションはインストールしたパッケージ次第です。複数のデスクトップ環境によって使われるアクションもあれば ''(org.freedesktop.*)''、 DE 固有アクションもあり ''(org.gnome.*)''、ある一つのプログラム固有だったりもします ''(org.gnome.gparted.policy)''。{{ic|pkaction}} コマンドはクイックリファレンスとして {{ic|/usr/share/polkit-1/actions}} で定義されているアクションを全て表示します。 |
− | polkit で何ができるのかということを理解するために、 |
+ | polkit で何ができるのかということを理解するために、一般的に使われているアクションのグループを以下に示します: |
− | * '''[[Systemd|systemd-logind]]''' ''(org.freedesktop.login1.policy)'' のアクションには、電源オフ・再起動・サスペンド・ハイバネート |
+ | * '''[[Systemd|systemd-logind]]''' ''(org.freedesktop.login1.policy)'' のアクションには、(他のユーザーがログインしている時を含む) システムの電源オフ・再起動・サスペンド・ハイバネートが含まれています。 |
− | * '''[[udisks]]''' ''(org.freedesktop.udisks2.policy)'' のアクションにはファイルシステムのマウントや暗号化デバイスの |
+ | * '''[[udisks]]''' ''(org.freedesktop.udisks2.policy)'' のアクションには、ファイルシステムのマウントや暗号化デバイスのアンロックが含まれます。 |
− | * '''[[NetworkManager]]''' ''(org.freedesktop.NetworkManager.policy)'' のアクションにはネットワーク |
+ | * '''[[NetworkManager]]''' ''(org.freedesktop.NetworkManager.policy)'' のアクションには、ネットワーク、wifi、モバイルブロードバンドのオン/オフが含まれています。 |
− | それぞれのアクションは .policy ファイルの {{ic|<action>}} タグで定義されます。{{ic|org. |
+ | それぞれのアクションは .policy ファイルの {{ic|<action>}} タグで定義されます。{{ic|org.gnome.gparted.policy}} には単一のアクションが含まれており、以下のような見た目をしています: |
<?xml version="1.0" encoding="UTF-8"?> |
<?xml version="1.0" encoding="UTF-8"?> |
||
<!DOCTYPE policyconfig PUBLIC |
<!DOCTYPE policyconfig PUBLIC |
||
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" |
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" |
||
− | <nowiki>" |
+ | <nowiki>"http://www.freedesktop.org/software/polkit/policyconfig-1.dtd"></nowiki> |
<policyconfig> |
<policyconfig> |
||
− | <action id="org. |
+ | <action id="org.gnome.gparted"> |
<message>Authentication is required to run the GParted Partition Editor</message> |
<message>Authentication is required to run the GParted Partition Editor</message> |
||
<icon_name>gparted</icon_name> |
<icon_name>gparted</icon_name> |
||
92行目: | 92行目: | ||
'''id''' 属性は実際に [[D-Bus]] に送信されるコマンド、'''message''' タグは認証が必要なときにユーザーに表示する説明、'''icon_name''' はその名の通りアイコンです。 |
'''id''' 属性は実際に [[D-Bus]] に送信されるコマンド、'''message''' タグは認証が必要なときにユーザーに表示する説明、'''icon_name''' はその名の通りアイコンです。 |
||
− | '''defaults''' タグにはパーミッションのあるなしを記述します。3つの設定が含まれます: '''allow_any''', '''allow_inactive''', '''allow_active'''。 |
+ | '''defaults''' タグにはパーミッションのあるなしを記述します。3つの設定が含まれます: '''allow_any''', '''allow_inactive''', '''allow_active'''。アクティブでないセッションは基本的にリモートセッション (SSH, VNC など) であり、アクティブなセッションは TTY や X ディスプレイでマシンに直接ログインすることです。allow_any はどちらの場合でも適用される設定になります。 |
それぞれの設定には以下のオプションを使うことができます: |
それぞれの設定には以下のオプションを使うことができます: |
||
− | * ''no'': ユーザ |
+ | * ''no'': ユーザはアクションを実行する権限を与えられません。したがって認証の必要もありません。 |
− | * ''yes'': ユーザ |
+ | * ''yes'': ユーザは認証をすることなくアクションを実行することができます。 |
− | * ''auth_self'': 認証が必要ですが管理者ユーザ |
+ | * ''auth_self'': 認証が必要ですが管理者ユーザである必要はありません。 |
* ''auth_admin'': 管理者ユーザーとしての認証が必須です。 |
* ''auth_admin'': 管理者ユーザーとしての認証が必須です。 |
||
* ''auth_self_keep'': auth_self と同じですが、sudo と同じように、認証の効力は数分間しか続きません。 |
* ''auth_self_keep'': auth_self と同じですが、sudo と同じように、認証の効力は数分間しか続きません。 |
||
* ''auth_admin_keep'': auth_admin と同じですが、sudo と同じように、認証の効力は数分間しか続きません。 |
* ''auth_admin_keep'': auth_admin と同じですが、sudo と同じように、認証の効力は数分間しか続きません。 |
||
− | 以上がデフォルト設定であり、後の設定で覆されないかぎり、全てのユーザ |
+ | 以上がデフォルト設定であり、後の設定で覆されないかぎり、全てのユーザに対して有効です。 |
GParted のアクションからわかるように、GParted を使用するには管理者としての認証を求められ、それはセッションがアクティブかそうでないかによりません。 |
GParted のアクションからわかるように、GParted を使用するには管理者としての認証を求められ、それはセッションがアクティブかそうでないかによりません。 |
2023年3月23日 (木) 21:24時点における版
- polkit は、非特権プロセスが特権プロセスと通信できるようにするポリシーを定義および操作するためのアプリケーションレベルのツールキットです: 特権操作へのアクセス許可を非特権アプリケーションに与えるかの判断を集中的に行うフレームワークになります。
Polkit はシステム全体の権限を制御するために使われます。非特権プロセスが特権プロセスと通信するための体系化された手段を提供します。sudo などのシステムと対照的に、Polkit は1つのプロセス全体に root 権限を与えるようなことはせず、一元化されたシステムポリシーをより細かいレベルで制御することができます。
Polkit は、個々のアクション (例: GParted の実行) で区切ったり、ユーザをグループ (例: wheel グループのメンバー) や名前で区切ったりすることで機能します。そして、パスワードの入力でグループのメンバーか確認するなど、ユーザーにアクションを許可する方法を定義します。
目次
インストール
認証エージェント
認証エージェントは、本当に本人であること、或いは管理ユーザであることをセッションのユーザに証明させるために使用されます (本人であることはユーザとして認証することによって、管理ユーザであることは管理者として認証することによって証明されます)。polkit パッケージには 'pkttyagent' という名前のテキスト形式の認証エージェントが含まれており、一般的なフォールバックとして使われます。
グラフィカル環境を使っている場合、グラフィカルな認証エージェントをインストールし、(xinitrc を使うなどして) ログイン時に自動で実行されるようにしてください。
Cinnamon、Deepin、GNOME、GNOME Flashback、KDE、LXDE、LXQt、MATE、theShell、Xfce には初めから認証エージェントが入っています。 他のデスクトップ環境を使っているときは、以下の実装からどれか一つを選ぶ必要があります:
- 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
を提供 - polkit-dumb-agent-gitAUR (最小主義のデスクトップ非依存のエージェント):
/usr/bin/polkit-dumb-agent
を提供
設定
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。アクティブでないセッションは基本的にリモートセッション (SSH, VNC など) であり、アクティブなセッションは TTY や X ディスプレイでマシンに直接ログインすることです。allow_any はどちらの場合でも適用される設定になります。
それぞれの設定には以下のオプションを使うことができます:
- no: ユーザはアクションを実行する権限を与えられません。したがって認証の必要もありません。
- yes: ユーザは認証をすることなくアクションを実行することができます。
- auth_self: 認証が必要ですが管理者ユーザである必要はありません。
- auth_admin: 管理者ユーザーとしての認証が必須です。
- auth_self_keep: auth_self と同じですが、sudo と同じように、認証の効力は数分間しか続きません。
- auth_admin_keep: auth_admin と同じですが、sudo と同じように、認証の効力は数分間しか続きません。
以上がデフォルト設定であり、後の設定で覆されないかぎり、全てのユーザに対して有効です。
GParted のアクションからわかるように、GParted を使用するには管理者としての認証を求められ、それはセッションがアクティブかそうでないかによりません。
認証ルール
デフォルトの設定を上書きする認証ツールは上述のディレクトリのセットに配置されます。システムの個人設定関連の目的には、/etc/polkit-1/rules.d
だけを使って下さい。
addRule()
メソッドを使ってアクションや動作主体の認証チェックが行われた時に呼ばれる関数を追加します。関数は追加された順番で呼びだされ、関数のどれかが値を返すまで続けられます。故に、他のルールの前に処理される認証ルールを追加したいときは、他のルールファイルより前に並ぶ名前で /etc/polkit-1/rules.d
にファイルを配置してください。例えば: 00-early-checks.rules
。
.rules ファイルの構成は見ればすぐ分かります:
/* Allow users in admin group to run GParted without authentication */ polkit.addRule(function(action, subject) { if (action.id == "org.archlinux.pkexec.gparted" && subject.isInGroup("admin")) { return polkit.Result.YES; } });
上の関数の中では、特定のアクション ID (org.archlinux.pkexec.gparted) とユーザーのグループ (admin) をチェックしており、それから "yes" という値を返しています。
管理者の識別
管理者認証が必要になったときに呼ばれる関数を追加するには addAdminRule()
メソッドを使います。関数はどの識別子を管理者認証に使用するか指定するのに使われ、アクションや動作主体で権限の確認が行われます。関数は追加された順番で呼びだされ、関数のどれかが値を返すまで続けられます。
管理者の識別のデフォルト設定は 50-default.rules
ファイルに含まれており、この設定に変更を加えるときは 40-default.rules
などにファイルをコピーしてから編集してください。
/etc/polkit-1/rules.d/50-default.rules
polkit.addAdminRule(function(action, subject) { return ["unix-group:wheel"]; });
(コピーした後) 編集する部分は関数の return 配列だけです: 管理者ユーザーとして認証するときにユーザーの認証が必要でしょうか?管理者として指定されたグループのメンバーであれば、後はパスワードを入力するだけで良いでしょう。管理者として存在するのが、root などしかいないときは、ユーザーは root のパスワードを入力すればいいのです。ユーザー認証のフォーマットは権限の認証で使われるフォーマットと同じです。
Arch のデフォルトでは wheel グループに入っているユーザーを全て管理者としています。以下のようなルールによって管理者を認証する際に polkit はユーザーのパスワードのかわりに root のパスワードを要求します:
/etc/polkit-1/rules.d/49-rootpw_global.rules
/* Always authenticate Admins by prompting for the root * password, similar to the rootpw option in sudo */ polkit.addAdminRule(function(action, subject) { return ["unix-user:root"]; });
サンプル
デバッグ・ログ出力
以下のルールは要求されたアクセスの詳しい情報をログ出力します:
/etc/polkit-1/rules.d/00-log-access.rules
polkit.addRule(function(action, subject) { polkit.log("action=" + action); polkit.log("subject=" + subject); });
サスペンドとハイバネートの無効化
以下のルールは全てのユーザーでサスペンドとハイバネートを無効化します。
/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/
にカスタムルールを作って下さい。特定のアクションまたはグローバルでのパスワード認証を上書きすることができます。ルールセットの例は [1] を見て下さい。
グローバル
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 によって管理者権限を要求するアクションがすべて自動的に認証されます。そのため、権限を与えるグループは注意して選ぶようにしてください。
特定のアクション
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.archlinux.pkexec.gparted" || action.id == "org.libvirt.unix.manage") && subject.isInGroup("wheel")) { return polkit.Result.YES; } });
上記のファイルでは例として action.id
が GParted と Libvirt の場合を載せていますが、パッケージに含まれているものや自分で作成したルールを自由に設定することができます。また、wheel
以外のグループを設定することも可能です。
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 マニュアルページ
- Authorization with PolKit (openSUSE Leap 42.2 Security guide)