「Polkit」の版間の差分
Kusakata.bot (トーク | 投稿記録) (update Pkg/AUR templates) |
(同期) |
||
(5人の利用者による、間の23版が非表示) | |||
1行目: | 1行目: | ||
+ | {{Lowercase title}} |
||
[[Category:セキュリティ]] |
[[Category:セキュリティ]] |
||
− | [[en:Polkit]] |
||
[[de:PolicyKit]] |
[[de:PolicyKit]] |
||
+ | [[en:Polkit]] |
||
+ | [[fr:Polkit]] |
||
+ | [[ru:Polkit]] |
||
+ | [[zh-hans:Polkit]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|セッション}} |
{{Related|セッション}} |
||
− | {{Related| |
+ | {{Related|Sudo}} |
{{Related|ユーザーとグループ}} |
{{Related|ユーザーとグループ}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
− | [ |
+ | [https://polkit.pages.freedesktop.org/polkit/ polkit のホームページ]より: |
− | :''polkit は非特権プロセスが特権プロセスと通信できるようにするポリシーを定義および操作するためのアプリケーションレベルのツールキットです: 特権操作へのアクセス許可を非特権アプリケーションに与えるかの判断を集中的に行うフレームワークになります。'' |
+ | :''polkit は、非特権プロセスが特権プロセスと通信できるようにするポリシーを定義および操作するためのアプリケーションレベルのツールキットです: 特権操作へのアクセス許可を非特権アプリケーションに与えるかの判断を集中的に行うフレームワークになります。'' |
− | Polkit はシステム全体の権限を |
+ | Polkit はシステム全体の権限を制御するために使われます。非特権プロセスが特権プロセスと通信するための体系化された手段を提供します。sudo などのシステムと対照的に、Polkit は1つのプロセス全体に root 権限を与えるようなことはせず、一元化されたシステムポリシーをより細かいレベルで制御することができます。 |
− | Polkit はアクション (例: GParted の実行) |
+ | Polkit は、個々のアクション (例: GParted の実行) で区切ったり、ユーザをグループ (例: wheel グループのメンバー) や名前で区切ったりすることで機能します。そして、パスワードの入力でグループのメンバーか確認するなど、ユーザーにアクションを許可する方法を定義します。 |
== インストール == |
== インストール == |
||
− | + | {{Pkg|polkit}} パッケージを[[インストール]]してください。 |
|
=== 認証エージェント === |
=== 認証エージェント === |
||
− | セッションのユーザ |
+ | 認証エージェントは、本当に本人であること、或いは管理ユーザであることをセッションのユーザに証明させるために使用されます (本人であることはユーザとして認証することによって、管理ユーザであることは管理者として認証することによって証明されます)。{{Pkg|polkit}} パッケージには 'pkttyagent' という名前のテキスト形式の認証エージェントが含まれており、一般的なフォールバックとして使われます。 |
− | グラフィカル環境を使っている場合、グラフィカルな認証エージェントをインストールしてログイン時に[[自動起動|自動で実行]]されるようにしてください。 |
+ | グラフィカル環境を使っている場合、グラフィカルな認証エージェントをインストールし、([[xinitrc]] を使うなどして) ログイン時に[[自動起動|自動で実行]]されるようにしてください。 |
− | [[Cinnamon]] |
+ | [[Cinnamon]]、[[Deepin]]、[[Hyprland]]、[[GNOME]]、[[GNOME Flashback]]、[[KDE]]、[[LXDE]]、[[LXQt]]、[[MATE]]、[[Xfce]] には初めから認証エージェントが入っています。 |
+ | 他の[[デスクトップ環境]]を使っているときは、以下の実装からどれか一つを選ぶ必要があります: |
||
− | * {{Pkg|lxqt-policykit}} には {{ic|/usr/bin/lxqt-policykit-agent}} が入っています |
||
− | * {{ |
+ | * {{AUR|hyprpolkitagent-git}}: {{ic|/usr/lib/hyprpolkitagent}} を提供 |
− | * {{Pkg| |
+ | * {{Pkg|lxqt-policykit}}: {{ic|/usr/bin/lxqt-policykit-agent}} を提供 |
− | * {{ |
+ | * {{Pkg|lxsession}} または {{Pkg|lxsession-gtk3}}: {{ic|/usr/bin/lxpolkit}} を提供 |
− | * {{Pkg|polkit |
+ | * {{Pkg|mate-polkit}}: {{ic|/usr/lib/mate-polkit/polkit-mate-authentication-agent-1}} を提供 |
− | * {{AUR|polkit- |
+ | * {{AUR|polkit-efl-git}}: {{ic|/usr/bin/polkit-efl-authentication-agent-1}} を提供 |
− | * {{ |
+ | * {{Pkg|polkit-gnome}}: {{ic|/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1}} を提供 |
+ | * {{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 のアクションを使うには管理者として認証する必要があります)。デフォルトを上書きすることはできますがアクションファイルを編集するのは正しい方法ではありません。 |
||
+ | {{Warning|パッケージのデフォルトのパーミッションファイルは、パッケージアップデートの際に上書きされうるので、変更しないでください。}} |
||
− | *'''認証ルール'''は JavaScript の {{ic|.rules}} ファイルで定義します。認証ルールは2つの場所に保存されています: サードパーティのパッケージが使用する {{ic|/usr/share/polkit-1/rules.d}} (ただし実際に使用しているパッケージはほとんどありません) とローカル設定用の {{ic|/etc/polkit-1/rules.d}} です。.rules ファイルはユーザーのサブセットを指定して、アクションファイルで指定されているアクションのどれか一つ (または複数) を参照して、そのユーザーによるアクションにどのような制限をかけるか決定します。一例を挙げると、rules ファイルは GParted を使用するときに管理者として全てのユーザーに必要な認証のルールを上書きすることがあり、特定のユーザーの認証が必要ないと決定します。もしくは、GParted を全く使用できなくします。 |
||
+ | |||
+ | Polkit の定義は2種類に分けることができます: |
||
+ | * '''アクション''' (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 のアクションを表示するには、 |
+ | {{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"?> |
||
59行目: | 77行目: | ||
<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> |
||
75行目: | 93行目: | ||
'''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'''。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|addRule()}} メソッド |
+ | {{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. |
+ | if (action.id == "org.gnome.gparted" && |
subject.isInGroup("admin")) { |
subject.isInGroup("admin")) { |
||
return polkit.Result.YES; |
return polkit.Result.YES; |
||
103行目: | 123行目: | ||
}); |
}); |
||
− | + | この関数内では、指定されたアクション ID ''(org.gnome.gparted)'' とユーザのグループ ''(admin)'' に対してチェックを行い、その後 "yes" の値を返します。 |
|
− | + | === 管理者の識別 === |
|
− | 管理者認証が |
+ | {{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) { |
||
115行目: | 136行目: | ||
});</nowiki>}} |
});</nowiki>}} |
||
− | (コピー |
+ | (コピー後に) 編集すべき部分は関数の return の配列だけです: 管理ユーザとしての認証を要求された時に、ユーザは誰として認証するべきでしょうか? 管理者として指定されたグループのメンバーである場合、ユーザはそのユーザ独自のパスワードを入力するだけで良いです。ある別のユーザ (例えば root) が唯一の管理者である場合、ユーザは root のパスワードを入力する必要があります。ユーザ ID の形式は、権限を指定する時に使用するものと同じです。 |
+ | Arch のデフォルトでは、'''wheel''' グループの全メンバーを管理者にします。以下のようなルールは、管理者認証の際に対象ユーザのパスワードではなく root のパスワードを polkit に尋ねさせます。 |
||
− | == 制約 == |
||
+ | {{hc|/etc/polkit-1/rules.d/49-rootpw_global.rules| |
||
− | Polkit は Linux にある既存のパーミッションシステム (グループメンバーシップ, アドミニストレータステータス) の上で動作し、それらを置き換えるものではありません。ユーザー ''jack'' に GParted のアクションを使えないようにする例では、polkit に判断を求めない、コマンドラインなどの方法を使って GParted を動かすことが可能です。したがって、特権ユーザーの権限を減らすのに使うのよりも、特権がないユーザーが特権サービスにアクセス出来るように権限を拡張するのに polkit を使ったほうが良いでしょう。セキュリティ目的で使うなら、[[Sudo|sudoers ファイル]]の方が適しています。 |
||
+ | /* 管理者を認証する際は常に root パスワードを要求する。 |
||
+ | * sudo における rootpw オプションに似ている。 |
||
+ | */ |
||
+ | polkit.addAdminRule(function(action, subject) { |
||
+ | return ["unix-user:root"]; |
||
+ | }); |
||
+ | }} |
||
== サンプル == |
== サンプル == |
||
+ | |||
+ | === 特定のユーザーに 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> |
||
+ | polkit.addRule(function(action, subject) { |
||
+ | polkit.log("action=" + action); |
||
+ | polkit.log("subject=" + subject); |
||
+ | });</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 を本当に無効化するには、[[電源管理/サスペンドとハイバネート#スリープを完全に無効化する]] に書かれてあるようにする必要があります。}} |
||
以下のルールは全てのユーザーでサスペンドとハイバネートを無効化します。 |
以下のルールは全てのユーザーでサスペンドとハイバネートを無効化します。 |
||
139行目: | 204行目: | ||
=== パスワードプロンプトの迂回 === |
=== パスワードプロンプトの迂回 === |
||
− | [[sudo]] の {{ic|NOPASSWD}} オプションのように[[ユーザーとグループ|ユーザー/グループ]] |
+ | [[sudo]] の {{ic|NOPASSWD}} オプションのように[[ユーザーとグループ|ユーザー/グループ]]だけに基づいて認可をしたい場合、{{ic|/etc/polkit-1/rules.d/}} にカスタムルールを作って下さい。[[#特定のアクション|特定のアクション]]または[[#グローバル|グローバル]]でのパスワード認証を上書きすることができます。ルールセットの例は [https://gist.github.com/4013294/ccacedd69d54de7f2fd5881b546d5192d6a2bddb] を見て下さい。 |
+ | |||
+ | ==== グローバル ==== |
||
+ | |||
+ | root として以下のファイルを作成: |
||
+ | {{hc|/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; |
||
+ | } |
||
+ | }); |
||
+ | }} |
||
+ | |||
+ | {{ic|wheel}} は別のグループに置き換えることができます。 |
||
+ | |||
+ | 上記を設定すると Polkit によって管理者権限を要求するアクションが'''すべて'''自動的に認証されます。そのため、権限を与えるグループは注意して選ぶようにしてください。 |
||
+ | |||
+ | また、認可を5分間キープできるようにする {{ic|AUTH_ADMIN_KEEP}} もあります。しかし、認可はプロセス毎なので、新しいプロセスが5分以内に認可を要求してきた場合、その新しいプロセスはいずれにせよパスワードを要求してきます。 |
||
==== 特定のアクション ==== |
==== 特定のアクション ==== |
||
− | 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 |
||
149行目: | 234行目: | ||
*/ |
*/ |
||
polkit.addRule(function(action, subject) { |
polkit.addRule(function(action, subject) { |
||
− | if ((action.id == "org. |
+ | if ((action.id == "org.gnome.gparted" || |
action.id == "org.libvirt.unix.manage") && |
action.id == "org.libvirt.unix.manage") && |
||
subject.isInGroup("wheel")) |
subject.isInGroup("wheel")) |
||
159行目: | 244行目: | ||
上記のファイルでは例として {{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#設定]] を見て下さい。 |
+ | === 通常ユーザーに個々の systemd ユニットの管理を許可 === |
||
− | ==== グローバル ==== |
||
+ | polkit のポリシーチェックに渡される値をチェックすることで、特定のユニットを管理する権限をユーザーやグループに与えることができます。例えば、標準ユーザーに [[wpa_supplicant]] を起動・停止する権限を与えたい場合: |
||
− | root で以下のファイルを作成: |
||
+ | |||
− | {{hc|/etc/polkit-1/rules.d/49-nopasswd_global.rules| |
||
+ | {{hc|/etc/polkit-1/rules.d/10-wifimanagement.rules|<nowiki> |
||
− | /* Allow members of the wheel group to execute any actions |
||
− | * without password authentication, similar to "sudo NOPASSWD:" |
||
− | */ |
||
polkit.addRule(function(action, subject) { |
polkit.addRule(function(action, subject) { |
||
− | if ( |
+ | if (action.id == "org.freedesktop.systemd1.manage-units") { |
+ | if (action.lookup("unit") == "wpa_supplicant.service") { |
||
− | return polkit.Result.YES; |
||
+ | var verb = action.lookup("verb"); |
||
+ | if (verb == "start" || verb == "stop" || verb == "restart") { |
||
+ | return polkit.Result.YES; |
||
+ | } |
||
+ | } |
||
} |
} |
||
− | }); |
+ | });</nowiki> |
}} |
}} |
||
+ | == 参照 == |
||
− | {{ic|wheel}} は別のグループに置き換えることができます。 |
||
+ | * [https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html Polkit マニュアルページ] |
||
− | 上記を設定すると Polkit によって管理者権限を要求するアクションがすべて自動的に認証されます。そのため、権限を与えるグループは注意して選ぶようにしてください。 |
||
+ | * [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}} |
||
− | * [http://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html Polkit マニュアルページ] |
2024年10月23日 (水) 16:10時点における最新版
- polkit は、非特権プロセスが特権プロセスと通信できるようにするポリシーを定義および操作するためのアプリケーションレベルのツールキットです: 特権操作へのアクセス許可を非特権アプリケーションに与えるかの判断を集中的に行うフレームワークになります。
Polkit はシステム全体の権限を制御するために使われます。非特権プロセスが特権プロセスと通信するための体系化された手段を提供します。sudo などのシステムと対照的に、Polkit は1つのプロセス全体に root 権限を与えるようなことはせず、一元化されたシステムポリシーをより細かいレベルで制御することができます。
Polkit は、個々のアクション (例: GParted の実行) で区切ったり、ユーザをグループ (例: wheel グループのメンバー) や名前で区切ったりすることで機能します。そして、パスワードの入力でグループのメンバーか確認するなど、ユーザーにアクションを許可する方法を定義します。
目次
インストール
認証エージェント
認証エージェントは、本当に本人であること、或いは管理ユーザであることをセッションのユーザに証明させるために使用されます (本人であることはユーザとして認証することによって、管理ユーザであることは管理者として認証することによって証明されます)。polkit パッケージには 'pkttyagent' という名前のテキスト形式の認証エージェントが含まれており、一般的なフォールバックとして使われます。
グラフィカル環境を使っている場合、グラフィカルな認証エージェントをインストールし、(xinitrc を使うなどして) ログイン時に自動で実行されるようにしてください。
Cinnamon、Deepin、Hyprland、GNOME、GNOME Flashback、KDE、LXDE、LXQt、MATE、Xfce には初めから認証エージェントが入っています。 他のデスクトップ環境を使っているときは、以下の実装からどれか一つを選ぶ必要があります:
- hyprpolkitagent-gitAUR:
/usr/lib/hyprpolkitagent
を提供 - 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
を提供 - pantheon-polkit-agent:
/usr/lib/policykit-1-pantheon/io.elementary.desktop.agent-polkit
を提供
設定
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。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
サスペンドとハイバネートの無効化
以下のルールは全てのユーザーでサスペンドとハイバネートを無効化します。
/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/
にカスタムルールを作って下さい。特定のアクションまたはグローバルでのパスワード認証を上書きすることができます。ルールセットの例は [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
もあります。しかし、認可はプロセス毎なので、新しいプロセスが5分以内に認可を要求してきた場合、その新しいプロセスはいずれにせよパスワードを要求してきます。
特定のアクション
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; } } } });
参照
- Polkit マニュアルページ
- The Polkit authentication framework (openSUSE Leap Security guide)