📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の21版が非表示)
7行目: 7行目:
<br>
<br>
<code>sudo</code>のような古典的な権限承認プログラムとは異なり、PolKitはセッション全体に対してroot権限を与えるのではなく、各アクションに対してのみ権限を与える。<br>
<code>sudo</code>のような古典的な権限承認プログラムとは異なり、PolKitはセッション全体に対してroot権限を与えるのではなく、各アクションに対してのみ権限を与える。<br>
<br><br>
== PolKitのインストール ==
多くのLinuxディストリビューションには、初期状態でPolKitがインストールされている。<br>
もし、別途インストールする必要がある場合、ソースコードからPolKitをインストールする。<br>
<br>
PolKitのビルドに必要なライブラリをインストールする。<br>
sudo zypper install dbus-1-devel libexpat-devel systemd-devel glib2-devel gtk3-devel gobject-introspection-devel mozjs78-devel pam-devel duktape-devel
<br>
[https://www.freedesktop.org/software/polkit/releases/ PolKitの公式Webサイト] または [https://github.com/polkit-org/polkit GitHub]にアクセスして、ソースコードをダウンロードする。<br>
<u>なお、[https://gitlab.freedesktop.org/polkit/polkit/-/tags GitLab]は、アーカイブされているため注意すること。</u><br>
<br>
ダウンロードしたファイルを解凍する。<br>
tar xf polkit-<バージョン>.tar.gz
cd polkit-<バージョン>
<br>
また、<code>git clone</code>コマンドを実行して、PolKitのソースコードをダウンロードする。<br>
git clone https://github.com/polkit-org/polkit
cd polkit
<br>
PolKitをビルドおよびインストールする。<br>
設定可能なオプションの一覧は、<code>meson configure</code>コマンドで取得することができる。<br>
meson setup build --prefix=<PolKitのインストールディレクトリ> -Dos_type=suse -Dexamples=true -Dman=true -Dgtk_doc=true
meson compile -C build
meson install -C build
<br><br>
<br><br>


17行目: 42行目:
<br><br>
<br><br>


== PolKitの構造 ==
== PolKitの構成 ==
PolKitの構成は、アクションと認可ルールに依存する。<br>
PolKitの構成は、アクションと認可ルールに依存する。<br>
<br>
<br>
* アクション (拡張子 : .policy)
* アクション : Action (拡張子 : .policy)
*: XMLファイルとして記述されており、/usr/share/polkit-1/actionsディレクトリに存在する。
*: XMLファイルとして記述されており、/usr/share/polkit-1/actionsディレクトリに存在する。
*: 各ファイルは1つまたは複数のアクションを定義して、各アクションには説明とデフォルトのパーミッションが含まれている。
*: 各ファイルに1つまたは複数のアクションを定義されており、各アクションには説明とデフォルトのパーミッションが含まれている。
*: システム管理者は、独自のルールを記述することができるが、システム既存のPolKitのファイルは編集してはならない。
*: システム管理者は、独自のルールを記述することができるが、システム既存のPolKitのファイルは編集してはならない。
*: <br>
*: <br>
* 認証ルール (拡張子 : .rules)
* 認証ルール : Authorization rules (拡張子 : .rules)
*: JavaScriptファイルとして記述されており、以下に示す2つのディレクトリに配置される。
*: JavaScriptファイルとして記述されており、各ルールファイルは、アクションファイルで定義されたアクションを参照する。
*: 各ルールファイルは、アクションファイルで指定されたアクションを参照する。
*: ルールは、ユーザのサブセットに対してどのような制限を許可するかを決定する。
*: ルールは、ユーザのサブセットに対してどのような制限を許可するかを決定する。
*: 例えば、ルールファイルで制限的なパーミッションを無効にして、一部のユーザにのみ許可を与えること等を行うことができる。
*: <br>
** /usr/share/polkit-1/rules.dディレクトリ
*: 例えば、ルールファイルで制限的なパーミッションを無効にして、一部のユーザまたはグループにのみ許可を与えること等を行うことができる。
**: 主にパッケージ管理システムからインストールするサードパーティのソフトウェアに使用される。
*: <br>
** /etc/polkit-1/rules.dディレクトリ
*: 認証ルールファイルは、以下に示す2つのディレクトリのいずれかに配置される。
**: ユーザの独自の設定に使用される。
*:* /etc/polkit-1/rules.dディレクトリ
*:*: ユーザまたはシステム管理者の独自の設定に使用される。
*:*: <u>このディレクトリに、ユーザまたはシステム管理者がファイルを作成することを推奨する。</u>
*:*: <br>
*:* /usr/share/polkit-1/rules.dディレクトリ
*:*: 主に、システムやパッケージ管理システムからインストールするソフトウェアに使用される。
*:*: このディレクトリに、ユーザまたはシステム管理者がファイルを作成することは非推奨である。
<br>
PolKitは、特権ユーザの権利を抑制しようとするものではなく。非特権ユーザの特権サービスへのアクセスを拡張するために使用されるべきである。<br>
セキュリティの観点からは、<code>sudoers</code>を使用することを推奨する。<br>
<br><br>
<br><br>


41行目: 74行目:
* pkactionコマンド
* pkactionコマンド
*: 定義されたアクションの詳細を取得する。
*: 定義されたアクションの詳細を取得する。
*: 例. org.freedesktop.login1.rebootに対して、必要な認可を表示する。
*: <code>pkaction -v --action-id=org.freedesktop.login1.reboot</code>
*: <br>
*: また、<code>pkaction</code>コマンドを実行することにより、定義された全てのアクションを表示することができる。<br>
*: <br>
*: <br>
* pkcheckコマンド
* pkcheckコマンド
96行目: 133行目:
PolKitが有効なプロセスが特権的な操作を実行するごとに、PolKitはこのプロセスにその権限があるかどうかを尋ねる。<br>
PolKitが有効なプロセスが特権的な操作を実行するごとに、PolKitはこのプロセスにその権限があるかどうかを尋ねる。<br>
<br>
<br>
PolKitは、このプロセスに対して定義されたポリシーに従って、"yes"、"no"、"要認証"のいずれかを選択する。
PolKitは、このプロセスに対して定義されたポリシーに従って、"yes"、"no"、その他4種類の値のいずれかを選択する。
<br>
<br>
デフォルトでは、ポリシーは暗黙の特権を含んでおり、自動的に全てのユーザに適用される。<br>
デフォルトでは、ポリシーは暗黙の特権を含んでおり、自動的に全てのユーザに適用される。<br>
また、特定のユーザに適用される明示的な特権を指定することも可能である。<br>
また、特定のユーザに適用される明示的な特権を指定することも可能である。<br>
<br>
<br>
==== 暗黙の特権 REPORT DOCUMENTATION BUG#EDIT SOURCE
==== 暗黙の特権 ====
暗黙の特権は、アクティブなセッションと非アクティブなセッションのいずれに対しても定義することができます。アクティブなセッションとは、現在作業しているセッションのことです。例えば、他のコンソールに切り替えた場合は、非アクティブになります。暗黙の特権を "no" に設定すると、どのユーザーも認証されませんが、 "yes" に設定すると、すべてのユーザーが認証されます。しかし、通常、認証を要求することが有用です。
暗黙の特権は、アクティブなセッションと非アクティブなセッションのいずれに対しても定義することができる。<br>
 
<br>
ユーザは、rootとして認証するか、selfとして認証するか、どちらかの方法で認証することができます。どちらの認証方法も、4種類のバリエーションがあります。
アクティブなセッションとは、現在作業しているセッションのことである。
例えば、他のコンソールに切り替えた場合は、非アクティブになる。<br>
<br>
暗黙の特権を<code>no</code>に設定する場合、いずれのユーザも認証されない。<br>
<code>yes</code>に設定する場合、全てのユーザが認証される。<br>
しかし、一般的には、認証を要求することが有用である。<br>
<br>
ユーザは、rootとして認証するか一般ユーザとして認証するか、いずれかの方法で認証することができる。
どちらの認証方法も、4種類の値が存在する。<br>
<br><br>
<br><br>


115行目: 160行目:
*: ユーザの独自の特権(カスタム特権)を行う場合に使用する。(優先順位は最優先)
*: ユーザの独自の特権(カスタム特権)を行う場合に使用する。(優先順位は最優先)
*: <br>
*: <br>
* /etc/polkit.d/rules.d/<ファイル名>.rulesファイル
*: ユーザの独自の特権を定義または変更する場合、以下に示すように記述する。<br>
*: パッケージ管理システムからインストールしたサードパーティのソフトウェアが使用する。
*: <code><権限を付与するID>    <any session>:<inactive session>:<active session></code>
*: <br>
* /usr/share/polkit-1/rules.d/<ファイル名>.rulesファイル
*: パッケージ管理システムからインストールしたサードパーティのソフトウェアが使用する。
<br>
<br>
ユーザの独自の特権(カスタム特権)は、/etc/polkit-default-privs.localファイルで定義する。<br>
ユーザの独自の特権(カスタム特権)は、/etc/polkit-default-privs.localファイルで定義する。<br>
このファイルで定義された特権は、他の設定ファイルで定義されたものよりも優先される。<br>
このファイルで定義された特権は、他の設定ファイルで定義されたものよりも優先される。<br>
<br>
ユーザの独自の特権を定義または変更する場合、以下に示すように記述する。<br>
<権限を付与するID>    <any session>:<inactive session>:<active session>
<br>
<br>
定義または変更を有効にするためには、<code>/sbin/set_polkit_default_privs</code>コマンドを実行する必要がある。<br>
定義または変更を有効にするためには、<code>/sbin/set_polkit_default_privs</code>コマンドを実行する必要がある。<br>
135行目: 174行目:
  sudo set_polkit_default_privs
  sudo set_polkit_default_privs
<br>
<br>
==== アクションルールの追加 ====
==== ルールファイル ====
* /etc/polkit.d/rules.d/<ファイル名>.rulesファイル (優先順位は最優先)
*: ユーザが独自の特権を追加する場合、または、パッケージ管理システムからインストールしたソフトウェアが使用する。
*: 各ルールファイルは、アクションファイルで指定されたアクションを参照し、ユーザのサブセットに対してどのような制限を許可するかを決定する。
*: 例えば、ルールファイルは制限的なパーミッションを無効にして、一部のユーザにのみ許可する等、設定することができる。
*: <br>
*: <code>addRule</code>メソッドは、アクションとサブジェクトの認可チェックが実行されるたびに呼び出される関数を追加するために使用される。
*: メソッドは、追加された順番に、いずれかの関数が値を返すまで呼び出される。
*: <u>したがって、他のルールよりも先に処理される認可ルールを追加する場合は、、他のルールファイルよりも前にソートする名前(例えば、00-early-checks.rulesファイル)を付ける。</u>
*: <br>
*: 以下の例では、GParted/usr/share/polkit-1/rules.d/<ファイル名>.rulesファイルのルールファイル(拡張子 : .rules)を作成して、adminグループのユーザは認証なしでGPartedを実行できるようにしている。
*: <code>polkit.addRule(function(action, subject) {</code>
*: <code>  if (action.id == "org.gnome.gparted" &&</code>
*: <code>      subject.isInGroup("admin")) {</code>
*: <code>      return polkit.Result.YES;</code>
*: <code>  }</code>
*: <code>});</code>
*: <br>
* /usr/share/polkit-1/rules.d/<ファイル名>.rulesファイル
*: パッケージ管理システムからインストールしたソフトウェアが使用する。
<br>
==== アクションルール ====
利用可能なアクションは、システムにインストールされている追加パッケージにより異なる。<br>
利用可能なアクションは、システムにインストールされている追加パッケージにより異なる。<br>
また、<code>pkaction</code>コマンドを実行することにより、定義された全てのアクションを表示することができる。<br>
<br>
<br>
独自のアクションルールを追加するには、以下の例に示すような構造を持つ.policyファイルを作成して、<code>id</code>属性に適切な値を追加して、特権を定義する。<br>
独自のアクションルールを追加するには、以下の例に示すような構造を持つ.policyファイルを作成して、<code>id</code>属性に適切な値を追加して、特権を定義する。<br>
<br>
<br>
以下の例では、GParted(GNOMEパーティションエディタ)のアクションルールを記載する。<br>
以下の例では、GParted(GNOMEパーティションエディタ)のアクションルールを記載している。<br>
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
  # /usr/share/polkit-1/actions/org.opensuse.policykit.gparted.policyファイル
  # /usr/share/polkit-1/actions/org.opensuse.policykit.gparted.policyファイル
   
   
199行目: 258行目:
#: GUIがXディスプレイを開くことを許可するかどうかを記述する。
#: GUIがXディスプレイを開くことを許可するかどうかを記述する。
<br><br>
<br><br>
== PolKitの設定例 ==
==== GTKで開発されたGUIソフトウェアの場合 ====
PolKitにカスタムアクションを追加することにより、GTKで開発されたGUIソフトウェアをroot権限で実行することができる。<br>
<br>
例えば、<code>pkexec</code>コマンドを使用してgeditを実行する場合、<br>
/usr/share/polkit-1/actions/org.freedesktop.policykit.gedit.policyファイルを作成する必要がある。<br>
<syntaxhighlight lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
    <action id="org.freedesktop.policykit.pkexec.gedit">
    <description>Run gedit program</description>
    <message>Authentication is required to run the gedit</message>
    <icon_name>accessories-text-editor</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/gedit</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
    </action>
</policyconfig>
</syntaxhighlight>
<br>
詳細を知りたい場合は、以下に示すURLにアクセスして、リファレンスマニュアルを参照すること。<br>
http://www.freedesktop.org/software/polkit/docs/0.105/pkexec.1.html<br>
<br>
==== Qtで開発されたGUIソフトウェアの場合 ====
<u>Qtで開発されたGUIソフトウェアにおいては、PolKitにカスタムアクションを追加してもroot権限で実行することはできない。</u><br>
これは、Qt GUIソフトウェア全体をroot権限で実行することは非推奨とされているからである。<br>
<br>
非推奨であるが、Qt GUIソフトウェア全体をroot権限で実行する場合は、<br>
PolKitのカスタムアクションは作成せずに<code>env</code>オプションを付加することにより、<code>pkexec</code>コマンドで実行することができる。<br>
<br>
<u>ただし、動作には、/usr/share/polkit-1/actions/org.freedesktop.policykit.policyファイルが必要である。</u><br>
# Qtで開発されたGUIソフトウェアをpkexecコマンドで実行する場合
export SHELL=/usr/bin/bash; \  # ログインシェルとターミナルのシェルが異なる場合 (例. ログインシェルがbashでターミナルのシェルがzshの場合等)
pkexec --disable-internal-agent \
env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY XDG_RUNTIME_DIR=<任意のディレクトリ  例. $XDG_RUNTIME_DIR または /tmp/tmp-runtime等> \
<Qtで開発されたGUIソフトウェアのパス>
<br>
<u>また、QtベースのGUIソフトウェアからD-Busを通じてroot権限で実行されるQtベースのCUIソフトウェアを呼び出すことにより、PolKitを使用することができる。</u><br>
<br>
==== SkiaSharpで開発されたGUIソフトウェアの場合 ====
<u>SkiaSharpで開発されたGUIソフトウェアも、PolKitにカスタムアクションを追加してもroot権限で実行することはできない。</u><br>
その場合、<code>gnomesu</code>コマンドまたは<code>kdesu</code>コマンドで実行することができる。<br>
gnomesu <SkiaSharpで開発されたGUIソフトウェアのパス>
# または
kdesu  <SkiaSharpで開発されたGUIソフトウェアのパス>
<br><br>
== X11 ==
デフォルトでは、セキュリティ上の理由から、rootは非rootユーザのXサーバに接続することができない。<br>
しかし、必要であれば、rootユーザとして接続できるようにする方法が複数存在する。<br>
<br>
X11上でGUIソフトウェアを昇格権限で実行するための推奨される方法は、PolKitポリシーファイルを作成することである。<br>
しかし、<code>pkexec</code>コマンドが注意喚起しているように、これは、<u>レガシープログラムにのみ使用されるべき</u>である。<br>
<br>
GUIソフトウェアは、<u>特権的な操作を、監査可能で、自己完結した、最小限のコード片に委ね、特権昇格を行った後に実行され、必要ない時には削除する</u>べきである。<br>
<br>
X11を使用している場合、GUIソフトウェアを昇格フレームワークでラップして、終了時に取得した特権を削除する。<br>
gnomesu <GUIソフトウェアのパス>
kdesu  <GUIソフトウェアのパス>
<br><br>
== Wayland および XWayland ==
Waylandセッションにおいて、<code>su</code>コマンド、<code>sudo</code>コマンド、<code>pkexec</code>コマンドを使用して、GUIソフトウェアを実行する場合、以下に示すようなエラーが発生する。<br>
No protocol specified
Unable to init server: Could not connect: Connection refused
(gedit:2349): Gtk-WARNING **: cannot open display: :0
<br>
X11では、昇格した特権でGUIソフトウェアを実行する場合は、PolKitポリシーファイルの作成、または、<code>sudo</code>コマンドでターミナルから実行することができたが、<br>
WaylandおよびXWaylandでは、Xサーバを起動したユーザのみがクライアントに接続できるよう設定されているため、これらの方法は使用できない。<br>
<br>
安全性は劣るが、<code>xhost</code>コマンドを実行して、rootユーザがローカルユーザのセッションに一時的にアクセスできる方法がある。<br>
これを行う場合は、現在の(非特権)ユーザにおいて、以下に示すコマンドを実行する。<br>
xhost si:localuser:root
<br>
GUIソフトウェアの終了後は、特権を削除する必要がある。<br>
xhost -si:localuser:root
<br><br>
== PolKitを使用したサンプルコード ==
C/C++を使用したPolKitのサンプルコードを知りたい場合は、[[C++の応用 - PolKit]]のページを参照すること。<br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]]