「Polkit」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎認証ルール: 冒頭を同期)
105行目: 105行目:
 
GParted のアクションからわかるように、GParted を使用するには管理者としての認証を求められ、それはセッションがアクティブかそうでないかによりません。
 
GParted のアクションからわかるように、GParted を使用するには管理者としての認証を求められ、それはセッションがアクティブかそうでないかによりません。
   
=== 認証ルール ===
+
=== 許可ルール ===
   
デフォルトの設定を上書きする認証ツールは上のディレクトリのセットれます。システムの個人設定関連の目的には、{{ic|/etc/polkit-1/rules.d}} だけを使って下さい
+
デフォルトの設定をオーバーライドする許可ルールは、(「設定」セクションの冒頭に書かれた) のディレクトリに置れます。単一システムの個人設定関連する用途場合は、{{ic|/etc/polkit-1/rules.d}} のみを使用するべきです
   
{{ic|addRule()}} メソッドを使ってアクション動作主体の認証チェックが行われ時に呼ばれる関数を追加ます。関数は追加された順番で呼びだされ、関数のどれかが値を返すまで続けられます。故に、他のルールの前に処理される認証ルールを追加したいときは、のルールファイルより前に並ぶ名前で {{ic|/etc/polkit-1/rules.d}} ファイルを配てくださいえば: {{ic|00-early-checks.rules}}。
+
{{ic|addRule()}} メソッドは、アクション動作主体の許可チェックが行われ時に呼ばれる関数を追加するために使用されます。関数は追加された順番で呼れ、それらの関数のうち1つが値を返すまでその順に呼ばれ続けます。したがって、他のルールより先に処理される許可ルールを追加するには、のルール {{ic|/etc/polkit-1/rules.d}} 内のファイルき、名前順で他のルールよりも前に来る名前を付けてください (例: {{ic|00-early-checks.rules}})
   
.rules ファイルの構見ればすぐ分かります:
+
.rules ファイルの構一目瞭然です:
 
/* Allow users in admin group to run GParted without authentication */
 
/* Allow users in admin group to run GParted without authentication */
 
polkit.addRule(function(action, subject) {
 
polkit.addRule(function(action, subject) {
if (action.id == "org.archlinux.pkexec.gparted" &&
+
if (action.id == "org.gnome.gparted" &&
 
subject.isInGroup("admin")) {
 
subject.isInGroup("admin")) {
 
return polkit.Result.YES;
 
return polkit.Result.YES;
120行目: 120行目:
 
});
 
});
   
の関数の中では、アクション ID ''(org.archlinux.pkexec.gparted)'' とユーザのグループ ''(admin)'' チェックしており、それから "yes" という値を返しています。
+
の関数では、されたアクション ID ''(org.gnome.gparted)'' とユーザのグループ ''(admin)'' に対してチェックを行い、その後 "yes" 値を返します。
   
 
==== 管理者の識別 ====
 
==== 管理者の識別 ====

2023年3月24日 (金) 06:26時点における版

関連記事

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 のアクションを表示するには、polkit-explorer-gitAUR パッケージをインストールしてください。

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() メソッドは、アクションと動作主体の許可チェックが行われる時に呼ばれる関数を追加するために使用されます。関数は、追加された順番で呼ばれ、それらの関数のうち1つが値を返すまでその順に呼ばれ続けます。したがって、他のルールより先に処理される許可ルールを追加するには、そのルールを /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.gnome.gparted" &&
        subject.isInGroup("admin")) {
        return polkit.Result.YES;
    }
});

この関数内では、指定されたアクション ID (org.gnome.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;
            }
        }
    }
});

参照