Polkit

提供: ArchWiki
2020年3月5日 (木) 17:34時点におけるHiromi-mi (トーク | 投稿記録)による版 (→‎認証エージェント: filepath更新)
ナビゲーションに移動 検索に移動

関連記事

polkit のホームページ より:

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

Polkit はシステム全体の権限をコントロールするのに使われます。非特権プロセスが特権プロセスと通信するための組織立った手段を提供します。sudo などのシステムと対照的に、Polkit は全てのプロセスに root 権限を与えるようなことはせず、より細かいレベルで中心システムのポリシーを制御することができます。

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

インストール

Polkit は公式リポジトリpolkit パッケージでインストールすることができます。

認証エージェント

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

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

Cinnamon, Deepin, GNOME, GNOME Flashback, KDE, LXDE, LXQt, MATE, Xfce には初めから認証エージェントが入っています。他のデスクトップ環境を使っているときは、以下の実装からどれか一つを選んでください:

  • lxqt-policykit には /usr/bin/lxqt-policykit-agent が入っています
  • lxsession には /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-polkit-gitAUR には /usr/lib/xfce-polkit/xfce-polkit が入っています

構造

Polkit の定義は2つに分けることができます:

  • アクション/usr/share/polkit-1/actions 内に XML の .policy ファイルで定義します。各アクションにはデフォルトのパーミッションのセットが設定されます (例: GParted のアクションを使うには管理者として認証する必要があります)。デフォルトを上書きすることはできますがアクションファイルを編集するのは正しい方法ではありません。
  • 認証ルールは 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-explorerAUR をインストールしてください。

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;
            }
        }
    }
});

参照