コンテンツにスキップ

「Polkit」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
文字列「http://www.freedesktop.org/」を「https://www.freedesktop.org/」に置換
Oech3 (トーク | 投稿記録)
 
(4人の利用者による、間の23版が非表示)
1行目: 1行目:
{{Lowercase title}}
[[Category:セキュリティ]]
[[Category:セキュリティ]]
[[en:Polkit]]
[[de:PolicyKit]]
[[de:PolicyKit]]
[[en:Polkit]]
[[fr:Polkit]]
[[ru:Polkit]]
[[ru:Polkit]]
[[zh-hans:Polkit]]
[[zh-hans:Polkit]]
{{Related articles start}}
{{Related articles start}}
{{Related|セッション}}
{{Related|セッション}}
{{Related|sudo}}
{{Related|Sudo}}
{{Related|ユーザーとグループ}}
{{Related|ユーザーとグループ}}
{{Related articles end}}
{{Related articles end}}
[https://www.freedesktop.org/wiki/Software/polkit/ polkit のホームページ] より:
[https://polkit.pages.freedesktop.org/polkit/ polkit のホームページ]より:


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


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


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


== インストール ==
== インストール ==


Polkit は[[公式リポジトリ]]の {{Pkg|polkit}} パッケージ[[インストール]]することができます
{{Pkg|polkit}} パッケージ[[インストール]]してください


=== 認証エージェント ===
=== 認証エージェント ===


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


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


[[Cinnamon]], [[Deepin]], [[GNOME]], [[GNOME Flashback]], [[KDE]], [[LXDE]], [[LXQt]], [[MATE]], [[Xfce]] には初めから認証エージェントが入っています。他のデスクトップ環境を使っているときは、以下の実装からどれか一つを選んでください:
[[Cinnamon]][[Deepin]]、[[Hyprland]]、[[GNOME]][[GNOME Flashback]][[KDE]][[LXDE]][[LXQt]][[MATE]][[Xfce]] には初めから認証エージェントが入っています。
他の[[デスクトップ環境]]を使っているときは、以下の実装からどれか一つを選ぶ必要があります:
* {{Pkg|lxqt-policykit}} には {{ic|/usr/bin/lxqt-policykit-agent}} が入っています
* {{Pkg|lxsession}} には {{ic|/usr/bin/lxpolkit}} が入っています
* {{AUR|hyprpolkitagent-git}}: {{ic|/usr/lib/hyprpolkitagent}} を提供
* {{Pkg|mate-polkit}} には {{ic|/usr/lib/mate-polkit/polkit-mate-authentication-agent-1}} が入っています
* {{Pkg|lxqt-policykit}}: {{ic|/usr/bin/lxqt-policykit-agent}} を提供
* {{AUR|polkit-efl-git}} は {{ic|/usr/bin/polkit-efl-authentication-agent-1}} が入っています
* {{Pkg|lxsession}} また {{Pkg|lxsession-gtk3}}: {{ic|/usr/bin/lxpolkit}} を提供
* {{Pkg|polkit-gnome}} には {{ic|/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1}} が入っています
* {{Pkg|mate-polkit}}: {{ic|/usr/lib/mate-polkit/polkit-mate-authentication-agent-1}} を提供
* {{Pkg|polkit-kde-agent}} には {{ic|/usr/lib/polkit-kde/polkit-kde-authentication-agent-1}} が入っています
* {{AUR|polkit-efl-git}}: {{ic|/usr/bin/polkit-efl-authentication-agent-1}} を提供
* {{AUR|ts-polkitagent}} には {{ic|/usr/lib/ts-polkitagent}} が入っています
* {{Pkg|polkit-gnome}}: {{ic|/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1}} を提供
* {{AUR|xfce-polkit-git}} には {{ic|/usr/lib/xfce-polkit/xfce-polkit}} が入っています
* {{Pkg|polkit-kde-agent}}: {{ic|/usr/lib/polkit-kde-authentication-agent-1}} を提供
* {{AUR|ts-polkitagent}}: {{ic|/usr/lib/ts-polkitagent}} を提供
* {{AUR|xfce-polkit}} または {{AUR|xfce-polkit-git}}: {{ic|/usr/lib/xfce-polkit/xfce-polkit}} を提供
* {{Pkg|pantheon-polkit-agent}}: {{ic|/usr/lib/policykit-1-pantheon/io.elementary.desktop.agent-polkit}} を提供


{{Tip|続ける前に、プロセス一覧を見て自動起動の設定をチェックしてください。例えば、{{ic|pgrep -af polkit-gnome}}。}}
== 構造 ==


== 設定 ==
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}} です。


{{Warning|パッケージのデフォルトのパーミッションファイルは、パッケージアップデートの際に上書きされうるので、変更しないでください。}}
Polkit は Linux にある既存のパーミッションシステム (グループメンバーシップ, アドミニストレータステータス) の上で動作し、それらを置き換えるものではありません。.rules ファイルはユーザーのサブセットを指定して、アクションファイルで指定されているアクションのどれか一つ (または複数) を参照して、そのユーザーによるアクションにどのような制限をかけるか決定します。例をげると、rules ファイルGParted を使用するときに管理者として全てのユーザーに必要な認証のルールを上書きすることがあり、特定のユーザーの認証が必ないと決定します。くは、GParted を全く使用できなくします。


Polkit の定義は2種類に分けることができます:
{{Note|ユーザに GParted のアクションを使えないようにする例では、polkit に判断を求めない、コマンドラインなどの方法を使って GParted を動かすことが可能です。したがって、特権ユーザの権限を減らすのに使うのよりも、特権がないユーザが特権サービスにアクセス出来るように権限を拡張するのに polkit を使ったほうが良いでしょう。セキュリティ目的で使うなら、[[Sudo|sudoers ファイル]]の方が適しています。}}
* '''アクション''' (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 ファイル]]の方が適しています。}}


=== アクション ===
=== アクション ===


{{Tip|グラフィカルインターフェイスで Policykit のアクションを表示するには、[[AUR]] から {{AUR|polkit-explorer}} をインストールしてください。}}
{{Tip|グラフィカルインターフェイスで Policykit のアクションを表示するには、{{AUR|polkit-explorer-git}} パッケージをインストールしてください。}}


polkit によって利用できるアクションはインストールしたパッケージ次第です。複数のデスクトップによって使われるアクションもあれば ''(org.freedesktop.*)''、特定の DE にしかないアクションもあり ''(org.gnome.*)''、場合によってはある一つのプログラム有だったりします ''(org.archlinux.pkexec.gparted.policy)''。{{ic|pkaction}} コマンドは {{ic|/usr/share/polkit-1/actions}} 定義されているアクションを全て表示します。
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)'' のアクションにはネットワークwifi、モバイルブロードバンドのオンオフが含まれています。
* '''[[NetworkManager]]''' ''(org.freedesktop.NetworkManager.policy)'' のアクションにはネットワークwifi、モバイルブロードバンドのオン/オフが含まれています。


それぞれのアクションは .policy ファイルの {{ic|<action>}} タグで定義されます。{{ic|org.archlinux.pkexec.gparted.policy}} には1つのアクションが含まれており、以下の通りです:
それぞれのアクションは .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>"https://www.freedesktop.org/software/polkit/policyconfig-1.dtd"></nowiki>
<nowiki>"http://www.freedesktop.org/software/polkit/policyconfig-1.dtd"></nowiki>
<policyconfig>
<policyconfig>
<action id="org.archlinux.pkexec.gparted">
<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>
82行目: 93行目:
'''id''' 属性は実際に [[D-Bus]] に送信されるコマンド、'''message''' タグは認証が必要なときにユーザーに表示する説明、'''icon_name''' はその名の通りアイコンです。
'''id''' 属性は実際に [[D-Bus]] に送信されるコマンド、'''message''' タグは認証が必要なときにユーザーに表示する説明、'''icon_name''' はその名の通りアイコンです。


'''defaults''' タグにはパーミッションのあるなしを記述します。3つの設定が含まれます: '''allow_any''', '''allow_inactive''', '''allow_active'''。基本的にアクテブでないセッションはリモートセッション (SSH, VNC など) であり、アクティブなセッションは TTY や X ディスプレイでマシン直接ログインすることです。allow_any はどちらの場合でも適される設定になります。
'''defaults''' タグにはパーミッションのあるなしを記述します。次の3つの設定が含まれます: '''allow_any''', '''allow_inactive''', '''allow_active'''。inactive も active もここではローカルコンソールまたはローカルデスプレイのローカルセッションを指します。'''allow_any''' リモートセッション (SSH、VNV など) を含むその他全て対して使ます。


それぞれの設定には以下のオプションを使うことができます:
それぞれの設定には以下のオプションを使うことができます:
* ''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 と同じように、認の効力は数分間しか続きません。
以上がデフォルト設定であり、後の設定で覆されないかぎり、全てのユーザ適用されます。
以上がデフォルト設定であり、後の設定で覆されないかぎり、全てのユーザに対して有効です。

より詳しい説明は {{man|8|polkit}} man ページを参照してください。


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 ファイルの構一目瞭然です:
/* admin グループ内のユーザが認証無しで GParted を実行できるようにする */
/* 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;
110行目: 123行目:
});
});


の関数の中では、アクション ID ''(org.archlinux.pkexec.gparted)'' とユーザのグループ ''(admin)'' チェックしており、それから "yes" という値を返しています。
の関数では、されたアクション ID ''(org.gnome.gparted)'' とユーザのグループ ''(admin)'' に対してチェックを行い、その後 "yes" 値を返します。


==== 管理者の識別 ====
=== 管理者の識別 ===


管理者認証がになっときに呼ばれる関数を追加するには {{ic|addAdminRule()}} メソッドを使ます。関数はどの識別子を管理者認証に使用するか指定するに使われ、アクションや動作主体で権限の確認が行われます。関数は追加された順番で呼びだされ、関数のどれかが値を返すまで続けられます。
{{ic|addAdminRule()}} メソッドは、管理者認証が要求されに呼ばれる関数を追加するために使用されます。(追加する) 関数は、アクションや動作主体によって識別される認可チェックの管理者認証にどの識別子を使用するか指定するために使用されます。追加された関数は追加された順番で呼れ、それらの関数のうち1つが値を返すまでその順に呼ばれ続けます。

管理者識別子のデフォルトの設定は、{{ic|/usr/share/polkit-1/rules.d/50-default.rules}} ファイルに含まれています。なので、この設定に対する如何なる変更も、そのファイルを (例えば {{ic|/etc/polkit-1/rules.d}} ディレクトリなどに) コピーし、コピー先のファイルを編集することによって行うべきです:


管理者の識別のデフォルト設定は {{ic|50-default.rules}} ファイルに含まれており、この設定に変更を加えるときは {{ic|40-default.rules}} などにファイルをコピーしてから編集してください。
{{hc|/etc/polkit-1/rules.d/50-default.rules|<nowiki>
{{hc|/etc/polkit-1/rules.d/50-default.rules|<nowiki>
polkit.addAdminRule(function(action, subject) {
polkit.addAdminRule(function(action, subject) {
122行目: 136行目:
});</nowiki>}}
});</nowiki>}}


(コピーした後) 編集す部分は関数の return 配列だけです: 管理ユーザとして認証するときにユーザーの認証が必要でしょうか管理者として指定されたグループのメンバーであればはパスワードを入力するだけで良いでしょう。管理者として存在すのが、root などしかいないときは、ユーザは root のパスワードを入力すればいいのです。ユーザー認証フォーマットは権限の認証で使われフォーマットと同じです。
(コピー後) 編集すべき部分は関数の return 配列だけです: 管理ユーザとして認証を要求された時ユーザは誰として認証するべきでしょうか? 管理者として指定されたグループのメンバーである場合ユーザそのユーザ独自のパスワードを入力するだけで良いである別のユーザ (例えば root) が唯一の管理者であ場合、ユーザは root のパスワードを入力する必要があります。ユーザ ID 形式権限を指定する時に使用すものと同じです。


Arch のデフォルトでは '''wheel''' グループに入っているユーザーを全て管理者ています。以下のようなルールによって管理者認証する際に polkit はユーザのパスワードのかわりに root のパスワードを要求します:
Arch のデフォルトでは'''wheel''' グループの全メンバーを管理者します。以下のようなルールは、管理者認証際に対象ユーザのパスワードではなく root のパスワードを polkit に尋ねさせます


{{hc|/etc/polkit-1/rules.d/49-rootpw_global.rules|
{{hc|/etc/polkit-1/rules.d/49-rootpw_global.rules|
/* 管理者を認証する際は常に root パスワードを要求する。
/* Always authenticate Admins by prompting for the root
* sudo における rootpw オプションに似ている。
* password, similar to the rootpw option in sudo
*/
*/
polkit.addAdminRule(function(action, subject) {
polkit.addAdminRule(function(action, subject) {
136行目: 150行目:


== サンプル ==
== サンプル ==

=== 特定のユーザーに org.freedesktop.timedate1.set-timezone アクションの使用を許可する ===

{{ic|archie}} という名前のユーザーに {{ic|org.freedesktop.timedate1.set-timezone}} アクションの認証なしの使用を許可するには、以下の polkit ルールを root ユーザーを使って作成してください:

{{hc|/etc/polkit-1/rules.d/49-allow-archie-set-timezone.rules|<nowiki>
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.timedate1.set-timezone" &&
subject.user == "archie") {
return polkit.Result.YES;
}
});
</nowiki>}}

このルールファイルを保存したら、ポリシーが即座に有効になるはずです。{{ic|timedatectl}} を使ってタイムゾーンを設定することでテストできます:

[archie]$ timedatectl set-timezone America/New_York

認証を求められずに操作が完了すれば、ルールが意図通りに機能していることを意味します。アクションが許可されていないような場合は、{{ic|/etc/polkit-1/rules.d/}} 内のより高い優先度を持つルール (より小さい番号のプレフィックスを持つファイル) と衝突していないか調べてください。


=== デバッグ・ログ出力 ===
=== デバッグ・ログ出力 ===

{{ic|polkit.log()}} 関数でのログを有効化するには、{{ic|/usr/lib/systemd/system/polkit.service}} ファイルの {{ic|ExecStart}} コマンドから {{ic|--no-debug}} フラグを消してください。


以下のルールは要求されたアクセスの詳しい情報をログ出力します:
以下のルールは要求されたアクセスの詳しい情報をログ出力します:

{{hc|/etc/polkit-1/rules.d/00-log-access.rules|<nowiki>
{{hc|/etc/polkit-1/rules.d/00-log-access.rules|<nowiki>
polkit.addRule(function(action, subject) {
polkit.addRule(function(action, subject) {
145行目: 181行目:
polkit.log("subject=" + subject);
polkit.log("subject=" + subject);
});</nowiki>}}
});</nowiki>}}

ルールを手動でテストするには、{{ic|pkcheck}} を使用してください[https://gist.github.com/grawity/3886114]:

$ pkcheck -u -p $$ --enable-internal-agent -a ''action''


=== サスペンドとハイバネートの無効化 ===
=== サスペンドとハイバネートの無効化 ===

{{Accuracy|logind が利用できない場合、{{man|8|systemctl}}{{Dead link|2024|10|13}} は代わりに {{ic|suspend.target}}/{{ic|hibernate.target}} を直接起動します。systemd-sleep を本当に無効化するには、[[電源管理/サスペンドとハイバネート#スリープを完全に無効化する]] に書かれてあるようにする必要があります。}}


以下のルールは全てのユーザーでサスペンドとハイバネートを無効化します。
以下のルールは全てのユーザーでサスペンドとハイバネートを無効化します。
162行目: 204行目:
=== パスワードプロンプトの迂回 ===
=== パスワードプロンプトの迂回 ===


[[sudo]] の {{ic|NOPASSWD}} オプションのように[[ユーザーとグループ|ユーザー/グループ]]による認証だけをしたい場合、{{ic|/etc/polkit-1/rules.d/}} にカスタムルールを作って下さい。[[#特定のアクション|特定のアクション]]または[[#グローバル|グローバル]]でのパスワード認証を上書きすることができます。ルールセットの例は [https://gist.github.com/4013294/ccacedd69d54de7f2fd5881b546d5192d6a2bddb] を見て下さい。
[[sudo]] の {{ic|NOPASSWD}} オプションのように[[ユーザーとグループ|ユーザー/グループ]]だけに基づいて認可をしたい場合、{{ic|/etc/polkit-1/rules.d/}} にカスタムルールを作って下さい。[[#特定のアクション|特定のアクション]]または[[#グローバル|グローバル]]でのパスワード認証を上書きすることができます。ルールセットの例は [https://gist.github.com/4013294/ccacedd69d54de7f2fd5881b546d5192d6a2bddb] を見て下さい。


==== グローバル ====
==== グローバル ====


root 以下のファイルを作成:
root として以下のファイルを作成:
{{hc|/etc/polkit-1/rules.d/49-nopasswd_global.rules|
{{hc|/etc/polkit-1/rules.d/49-nopasswd_global.rules|
/* Allow members of the wheel group to execute any actions
/* Allow members of the wheel group to execute any actions
180行目: 222行目:
{{ic|wheel}} は別のグループに置き換えることができます。
{{ic|wheel}} は別のグループに置き換えることができます。


上記を設定すると Polkit によって管理者権限を要求するアクションがすべて自動的に認証されます。そのため、権限を与えるグループは注意して選ぶようにしてください。
上記を設定すると Polkit によって管理者権限を要求するアクションが'''すべて'''自動的に認証されます。そのため、権限を与えるグループは注意して選ぶようにしてください。

また、認可を5分間キープできるようにする {{ic|AUTH_ADMIN_KEEP}} もあります。

特に、{{ic|run0}}はpolkit 127以降で認可をデフォルトで保持します。


==== 特定のアクション ====
==== 特定のアクション ====


root 以下のファイルを作成:
root として以下のファイルを作成:
{{hc|/etc/polkit-1/rules.d/49-nopasswd_limited.rules|<nowiki>
{{hc|/etc/polkit-1/rules.d/49-nopasswd_limited.rules|<nowiki>
/* Allow members of the wheel group to execute the defined actions
/* Allow members of the wheel group to execute the defined actions
190行目: 236行目:
*/
*/
polkit.addRule(function(action, subject) {
polkit.addRule(function(action, subject) {
if ((action.id == "org.archlinux.pkexec.gparted" ||
if ((action.id == "org.gnome.gparted" ||
action.id == "org.libvirt.unix.manage") &&
action.id == "org.libvirt.unix.manage") &&
subject.isInGroup("wheel"))
subject.isInGroup("wheel"))
200行目: 246行目:


上記のファイルでは例として {{ic|action.id}} が GParted と [[Libvirt]] の場合を載せていますが、パッケージに含まれているものや自分で作成したルールを自由に設定することができます。また、{{ic|wheel}} 以外のグループを設定することも可能です。
上記のファイルでは例として {{ic|action.id}} が GParted と [[Libvirt]] の場合を載せていますが、パッケージに含まれているものや自分で作成したルールを自由に設定することができます。また、{{ic|wheel}} 以外のグループを設定することも可能です。

{{ic|<nowiki>||</nowiki>}} 演算子はアクションを区切る (論理 OR) ために使用されており、{{ic|&&}} は論理 AND を意味し、最後の演算子として残して置かなければなりません。


==== Udisks ====
==== Udisks ====


ストレージデバイスをマウントするときに[[ファイルマネージャの機能|ファイルマネージャ]]がパスワードを要求することがあります。入力しないと ''Not authorized'' などのエラーが表示されます。詳しくは [[Udisks#設定]] を見て下さい。
ストレージデバイスをマウントするときに[[ファイルマネージャ]]がパスワードを要求することがあります。入力しないと ''Not authorized'' などのエラーが表示されます。詳しくは [[Udisks#設定]] を見て下さい。


=== 通常ユーザーに systemd ユニットの管理を許可 ===
=== 通常ユーザーに個々の systemd ユニットの管理を許可 ===


polkit のポリシーチェックに渡される値をチェックすることで、特定のユニットを管理する権限をユーザーやグループに与えることができます。例えば、標準ユーザーに [[wpa_supplicant]] を起動・停止する権限を与えたい場合:
polkit のポリシーチェックに渡される値をチェックすることで、特定のユニットを管理する権限をユーザーやグループに与えることができます。例えば、標準ユーザーに [[wpa_supplicant]] を起動・停止する権限を与えたい場合:
225行目: 273行目:


* [https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html Polkit マニュアルページ]
* [https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html Polkit マニュアルページ]
* [https://doc.opensuse.org/documentation/leap/security/html/book.security/cha.security.policykit.html Authorization with PolKit] (openSUSE Leap 42.2 Security guide)
* [https://doc.opensuse.org/documentation/leap/security/html/book-security/cha-security-polkit.html The Polkit authentication framework] (openSUSE Leap Security guide)

{{TranslationStatus|Polkit|2024-10-23|819084}}

2025年12月19日 (金) 15:03時点における最新版

polkit のホームページより:

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

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

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

インストール

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

認証エージェント

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

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

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

ヒント 続ける前に、プロセス一覧を見て自動起動の設定をチェックしてください。例えば、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。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

サスペンドとハイバネートの無効化

この記事またはセクションの正確性には問題があります。
理由: logind が利用できない場合、systemctl(8)[リンク切れ 2024-10-13] は代わりに suspend.target/hibernate.target を直接起動します。systemd-sleep を本当に無効化するには、電源管理/サスペンドとハイバネート#スリープを完全に無効化する に書かれてあるようにする必要があります。 (議論: トーク:Polkit#)

以下のルールは全てのユーザーでサスペンドとハイバネートを無効化します。

/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/ にカスタムルールを作って下さい。特定のアクションまたはグローバルでのパスワード認証を上書きすることができます。ルールセットの例は [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 もあります。

特に、run0はpolkit 127以降で認可をデフォルトで保持します。

特定のアクション

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

参照

翻訳ステータス: このページは en:Polkit の翻訳バージョンです。最後の翻訳日は 2024-10-23 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。