「Polkit」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎構造: 冒頭を同期)
43行目: 43行目:
 
{{Tip|続ける前に、プロセス一覧を見て自動起動の設定をチェックしてください。例えば、{{ic|pgrep -af polkit-gnome}}。}}
 
{{Tip|続ける前に、プロセス一覧を見て自動起動の設定をチェックしてください。例えば、{{ic|pgrep -af polkit-gnome}}。}}
   
== 構造 ==
+
== 設定 ==
   
  +
{{Warning|パッケージのデフォルトのパーミッションファイルは、パッケージアップデートの際に上書きされうるので、変更しないでください。}}
Polkit の定義は2つに分けることができます:
 
* '''アクション'''は {{ic|/usr/share/polkit-1/actions}} 内に XML の {{ic|.policy}} ファイルで定義します。各アクションにはデフォルトのパーミッションのセットが設定されます (例: GParted のアクションを使うには管理者として認証する必要があります)。デフォルトを上書きすることはできますがアクションファイルを編集するのは正しい方法ではありません。
 
*'''認証ルール'''は JavaScript の {{ic|.rules}} ファイルで定義します。認証ルールは2つの場所に保存されています: サードパーティのパッケージが使用する {{ic|/usr/share/polkit-1/rules.d}} (ただし実際に使用しているパッケージはほとんどありません) とローカル設定用の {{ic|/etc/polkit-1/rules.d}} です。
 
   
  +
Polkit の定義は2種類に分けることができます:
Polkit は Linux にある既存のパーミッションシステム (グループメンバーシップ, アドミニストレータステータス) の上で動作し、それらを置き換えるものではありません。.rules ファイルはユーザーのサブセットを指定して、アクションファイルで指定されているアクションのどれか一つ (または複数) を参照して、そのユーザーによるアクションにどのような制限をかけるか決定します。一例を挙げると、rules ファイルは GParted を使用するときに管理者として全てのユーザーに必要な認証のルールを上書きすることがあり、特定のユーザーの認証が必要ないと決定します。もしくは、GParted を全く使用できなくします。
 
  +
* '''アクション''' (Action) は {{ic|/usr/share/polkit-1/actions}} 内に XML の {{ic|.policy}} ファイルで定義されます。各アクションにはデフォルトのパーミッションがあります (例: GParted のアクションを使うには管理者として認証する必要があります)。デフォルトは上書きできますが、アクションファイルを編集するのは正しい方法ではありません。
  +
* '''許可ルール''' (Authorization rule) は JavaScript の {{ic|.rules}} ファイルで定義されます。このルールは2つの場所に置かれます:
  +
** サードパーティのパッケージは {{ic|/usr/share/polkit-1/rules.d}} を使用できます (あるとしても少数ですが)。
  +
** {{ic|/etc/polkit-1/rules.d}} はローカル設定用です。
   
  +
Polkit は Linux にある既存のパーミッションシステム (グループメンバーシップ、アドミニストレータステータス) の上で動作し、それらを置き換えるものではありません。.rules ファイルはユーザーのサブセットを指定して、アクションファイルで指定されているアクションのどれか一つ (または複数) を参照して、そのユーザーによるアクションにどのような制限をかけるか決定します。例を上げると、rules ファイルを使うことにより、GParted を使用する際に全ユーザが管理者として認証するというデフォルトの要件を上書きし、一部の特定のユーザに対しては認証を不要にできます。また別の例として、特定のユーザの GParted の使用を一切禁止することができます。
{{Note|ユーザーに GParted のアクションを使えないようにする例では、polkit に判断を求めない、コマンドラインなどの方法を使って GParted を動かすことが可能です。したがって、特権ユーザーの権限を減らすのに使うのよりも、特権がないユーザーが特権サービスにアクセス出来るように権限を拡張するのに polkit を使ったほうが良いでしょう。セキュリティ目的で使うなら、[[Sudo|sudoers ファイル]]の方が適しています。}}
 
  +
  +
{{Note|ユーザに GParted のアクションを使えないようにする例では、polkit に判断を求めない、コマンドラインなどの方法を使って GParted を動かすことが可能です。したがって、(準)特権ユーザの権限を減らすのに使うのよりも、特権がないユーザが特権サービスにアクセス出来るように権限を拡張するのに polkit を使ったほうが良いでしょう。セキュリティ目的で使うなら、[[Sudo|sudoers ファイル]]の方が適しています。}}
   
 
=== アクション ===
 
=== アクション ===

2023年3月23日 (木) 18:43時点における版

関連記事

polkit のホームページより:

polkit は、非特権プロセスが特権プロセスと通信できるようにするポリシーを定義および操作するためのアプリケーションレベルのツールキットです: 特権操作へのアクセス許可を非特権アプリケーションに与えるかの判断を集中的に行うフレームワークになります。

Polkit はシステム全体の権限を制御するために使われます。非特権プロセスが特権プロセスと通信するための体系化された手段を提供します。sudo などのシステムと対照的に、Polkit は1つのプロセス全体に root 権限を与えるようなことはせず、一元化されたシステムポリシーをより細かいレベルで制御することができます。

Polkit は、個々のアクション (例: GParted の実行) で区切ったり、ユーザをグループ (例: wheel グループのメンバー) や名前で区切ったりすることで機能します。そして、パスワードの入力でグループのメンバーか確認するなど、ユーザーにアクションを許可する方法を定義します。

インストール

polkit パッケージをインストールしてください。

認証エージェント

認証エージェントは、本当に本人であること、或いは管理ユーザであることをセッションのユーザに証明させるために使用されます (本人であることはユーザとして認証することによって、管理ユーザであることは管理者として認証することによって証明されます)。polkit パッケージには 'pkttyagent' という名前のテキスト形式の認証エージェントが含まれており、一般的なフォールバックとして使われます。

グラフィカル環境を使っている場合、グラフィカルな認証エージェントをインストールし、(xinitrc を使うなどして) ログイン時に自動で実行されるようにしてください。

CinnamonDeepinGNOMEGNOME FlashbackKDELXDELXQtMATE、theShell、Xfce には初めから認証エージェントが入っています。 他のデスクトップ環境を使っているときは、以下の実装からどれか一つを選ぶ必要があります:

ヒント: 続ける前に、プロセス一覧を見て自動起動の設定をチェックしてください。例えば、pgrep -af polkit-gnome

設定

警告: パッケージのデフォルトのパーミッションファイルは、パッケージアップデートの際に上書きされうるので、変更しないでください。

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 の使用を一切禁止することができます。

ノート: ユーザに GParted のアクションを使えないようにする例では、polkit に判断を求めない、コマンドラインなどの方法を使って GParted を動かすことが可能です。したがって、(準)特権ユーザの権限を減らすのに使うのよりも、特権がないユーザが特権サービスにアクセス出来るように権限を拡張するのに polkit を使ったほうが良いでしょう。セキュリティ目的で使うなら、sudoers ファイルの方が適しています。

アクション

ヒント: グラフィカルインターフェイスで Policykit のアクションを表示するには、AUR から polkit-explorer-gitAUR をインストールしてください。

polkit によって利用できるアクションはインストールしたパッケージ次第です。複数のデスクトップによって使われるアクションもあれば (org.freedesktop.*)、特定の DE にしかないアクションもあり (org.gnome.*)、場合によってはある一つのプログラム特有だったりします (org.archlinux.pkexec.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.archlinux.pkexec.gparted.policy には1つのアクションが含まれており、以下の通りです:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
 "https://www.freedesktop.org/software/polkit/policyconfig-1.dtd">
<policyconfig>

  <action id="org.archlinux.pkexec.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;
    }
});

パスワードプロンプトの迂回

sudoNOPASSWD オプションのようにユーザー/グループによる認証だけをしたい場合、/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;
            }
        }
    }
});

参照