設定 - PolKit
概要
PolKit(以前は、PolicyKitとして知られていた)は、非特権ユーザセッションと特権システムコンテキストの間のネゴシエータとして機能するアプリケーションフレームワークである。
PolKitは、ユーザ、グループ、名前により特定のアクションを制限する機能を持つ。
ユーザセッションのプロセスが、システムコンテキストでアクションを実行するごとに、PolKitはクエリされる。
所謂、ポリシーで指定された設定に基づいて、"yes"、"no"、"needs authentication"である可能性がある。
sudo
のような古典的な権限承認プログラムとは異なり、PolKitはセッション全体に対してroot権限を与えるのではなく、各アクションに対してのみ権限を与える。
PolKitのインストール
多くのLinuxディストリビューションには、初期状態でPolKitがインストールされている。
もし、別途インストールする必要がある場合、ソースコードからPolKitをインストールする。
PolKitのビルドに必要なライブラリをインストールする。
sudo zypper install dbus-1-devel libexpat-devel systemd-devel glib2-devel gtk3-devel gobject-introspection-devel mozjs78-devel pam-devel duktape-devel
PolKitの公式WebサイトまたはGitLabにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf polkit-<バージョン>.tar.gz cd polkit-<バージョン>
また、git clone
コマンドを実行して、PolKitのソースコードをダウンロードする。
git clone https://gitlab.freedesktop.org/polkit/polkit.git cd polkit
PolKitをビルドおよびインストールする。
設定可能なオプションの一覧は、meson configure
コマンドで取得することができる。
meson setup build --prefix=<PolKitのインストールディレクトリ> -Dos_type=suse -Dexamples=true -Dman=true -Dgtk_doc=true meson compile -C build meson install -C build
利用可能な認証エージェント
ユーザがセッションを開始する時(CUI環境またはGUI環境)、各セッションは権限と認証エージェントで構成される。
権限はシステムメッセージバス上のサービスとして実装されており、一方、認証エージェントはセッションを開始したユーザを認証するために使用される。
現在のユーザは、例えば、パスフレーズを使用して、その信頼性を証明する必要がある。
各デスクトップ環境は、独自の認証エージェントを持っており、通常、どのデスクトップ環境を選択しても自動的に起動する。
PolKitの構成
PolKitの構成は、アクションと認可ルールに依存する。
- アクション : Action (拡張子 : .policy)
- XMLファイルとして記述されており、/usr/share/polkit-1/actionsディレクトリに存在する。
- 各ファイルに1つまたは複数のアクションを定義されており、各アクションには説明とデフォルトのパーミッションが含まれている。
- システム管理者は、独自のルールを記述することができるが、システム既存のPolKitのファイルは編集してはならない。
- 認証ルール : Authorization rules (拡張子 : .rules)
- JavaScriptファイルとして記述されており、各ルールファイルは、アクションファイルで定義されたアクションを参照する。
- ルールは、ユーザのサブセットに対してどのような制限を許可するかを決定する。
- 例えば、ルールファイルで制限的なパーミッションを無効にして、一部のユーザまたはグループにのみ許可を与えること等を行うことができる。
- 認証ルールファイルは、以下に示す2つのディレクトリのいずれかに配置される。
- /etc/polkit-1/rules.dディレクトリ
- ユーザまたはシステム管理者の独自の設定に使用される。
- このディレクトリに、ユーザまたはシステム管理者がファイルを作成することを推奨する。
- /usr/share/polkit-1/rules.dディレクトリ
- 主に、システムやパッケージ管理システムからインストールするソフトウェアに使用される。
- このディレクトリに、ユーザまたはシステム管理者がファイルを作成することは非推奨である。
- /etc/polkit-1/rules.dディレクトリ
PolKitは、特権ユーザの権利を抑制しようとするものではなく。非特権ユーザの特権サービスへのアクセスを拡張するために使用されるべきである。
セキュリティの観点からは、sudoers
を使用することを推奨する。
利用可能なコマンド
PolKitには、特定のタスクのためのコマンドが存在する。
- pkactionコマンド
- 定義されたアクションの詳細を取得する。
- 例. org.freedesktop.login1.rebootに対して、必要な認可を表示する。
pkaction -v --action-id=org.freedesktop.login1.reboot
- また、
pkaction
コマンドを実行することにより、定義された全てのアクションを表示することができる。
- pkcheckコマンド
- processコマンドまたは
--system-bus-name
オプションで指定されたプロセスが認可されているかどうかを確認する。
- processコマンドまたは
- pkexecコマンド
- 認可されたユーザが他のユーザとして特定のプログラムを実行することを許可する。
- pkttyagentコマンド
- テキスト形式の認証エージェントを起動する。
- この認証エージェントは、各デスクトップ環境に独自の認証エージェントが存在しない場合に使用される。
PolKitが使用されているソフトウェアの例
- PulseAudio
- PulseAudioデーモンのスケジューリング優先順位の設定
- CUPS
- プリンタの追加、削除、編集、有効化、無効化
- バックアップマネージャ
- スケジュールの変更
- GNOME
- GConfによるシステムおよび必須値の変更
- システム時間の変更
- libvirt
- ローカルな仮想化システムの管理・監視
- NetworkManager
- 接続の適用と変更
- PolKit
- 他ユーザーの読み取りと権限変更
- デフォルトの変更
- PackageKit
- パッケージの更新と削除
- リポジトリの変更と更新
- ローカルファイルのインストール
- ロールバック
- リポジトリキーのインポート
- EULAを受け入れる
- ネットワークプロキシの設定
- System
- Wake on LAN
- 固定デバイス、ホットプラグ可能なデバイス、暗号化されたデバイスのマウント/アンマウント
- リムーバブルメディアの取り出し、復号化
- WLANの有効化/無効化
- Bluetoothの有効化/無効化
- デバイスアクセス
- システムの停止、サスペンド、ハイバネート、および再起動
- ドッキングステーションのドッキング解除
- パワーマネージメント設定の変更
- YaST
- 製品の登録
- システムの時刻と言語を変更する
権限の種類
PolKitが有効なプロセスが特権的な操作を実行するごとに、PolKitはこのプロセスにその権限があるかどうかを尋ねる。
PolKitは、このプロセスに対して定義されたポリシーに従って、"yes"、"no"、その他4種類の値のいずれかを選択する。
デフォルトでは、ポリシーは暗黙の特権を含んでおり、自動的に全てのユーザに適用される。
また、特定のユーザに適用される明示的な特権を指定することも可能である。
暗黙の特権
暗黙の特権は、アクティブなセッションと非アクティブなセッションのいずれに対しても定義することができる。
アクティブなセッションとは、現在作業しているセッションのことである。
例えば、他のコンソールに切り替えた場合は、非アクティブになる。
暗黙の特権をno
に設定する場合、いずれのユーザも認証されない。
yes
に設定する場合、全てのユーザが認証される。
しかし、一般的には、認証を要求することが有用である。
ユーザは、rootとして認証するか一般ユーザとして認証するか、いずれかの方法で認証することができる。
どちらの認証方法も、4種類の値が存在する。
PolKitの設定
ユーザの独自の特権 (カスタム特権)
設定ファイルを作成または修正して特権を調整することにより、例えば、特定のチームのPC等の異なるPCに同じポリシーセットを配備することができる。
このように、暗黙的および明示的な特権を変更することができる。
- /etc/polkit-default-privs.localファイル
- ユーザの独自の特権(カスタム特権)を行う場合に使用する。(優先順位は最優先)
- ユーザの独自の特権を定義または変更する場合、以下に示すように記述する。
<権限を付与するID> <any session>:<inactive session>:<active session>
ユーザの独自の特権(カスタム特権)は、/etc/polkit-default-privs.localファイルで定義する。
このファイルで定義された特権は、他の設定ファイルで定義されたものよりも優先される。
定義または変更を有効にするためには、/sbin/set_polkit_default_privs
コマンドを実行する必要がある。
このコマンドは、現在、設定されている/etc/polkit-default-privsファイルに従ってPolKitのアクションを設定する。
sudo set_polkit_default_privs
全てのPolicyKitの特権を元に戻す。
sudo rm -r "/var/lib/polkit/*" sudo set_polkit_default_privs
ルールファイル
- /etc/polkit.d/rules.d/<ファイル名>.rulesファイル (優先順位は最優先)
- ユーザが独自の特権を追加する場合、または、パッケージ管理システムからインストールしたソフトウェアが使用する。
- 各ルールファイルは、アクションファイルで指定されたアクションを参照し、ユーザのサブセットに対してどのような制限を許可するかを決定する。
- 例えば、ルールファイルは制限的なパーミッションを無効にして、一部のユーザにのみ許可する等、設定することができる。
addRule
メソッドは、アクションとサブジェクトの認可チェックが実行されるたびに呼び出される関数を追加するために使用される。- メソッドは、追加された順番に、いずれかの関数が値を返すまで呼び出される。
- したがって、他のルールよりも先に処理される認可ルールを追加する場合は、、他のルールファイルよりも前にソートする名前(例えば、00-early-checks.rulesファイル)を付ける。
- 以下の例では、GParted/usr/share/polkit-1/rules.d/<ファイル名>.rulesファイルのルールファイル(拡張子 : .rules)を作成して、adminグループのユーザは認証なしでGPartedを実行できるようにしている。
polkit.addRule(function(action, subject) {
if (action.id == "org.gnome.gparted" &&
subject.isInGroup("admin")) {
return polkit.Result.YES;
}
});
- /usr/share/polkit-1/rules.d/<ファイル名>.rulesファイル
- パッケージ管理システムからインストールしたソフトウェアが使用する。
アクションルール
利用可能なアクションは、システムにインストールされている追加パッケージにより異なる。
独自のアクションルールを追加するには、以下の例に示すような構造を持つ.policyファイルを作成して、id
属性に適切な値を追加して、特権を定義する。
以下の例では、GParted(GNOMEパーティションエディタ)のアクションルールを記載している。
# /usr/share/polkit-1/actions/org.opensuse.policykit.gparted.policyファイル
<?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.0/policyconfig.dtd">
<policyconfig> ...(1)
<action id="org-opensuse-policykit-gparted"> ...(2)
<message>Authentication is required to run the GParted Partition Editor</message>
<icon_name>gparted</icon_name>
<defaults> ...(3)
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>auth_admin</allow_active>
</defaults>
<annotate ...(4)
key="org.freedesktop.policykit.exec.path">/usr/sbin/gparted</annotate>
<annotate 4 ...(5)
key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>
- policyconfigエレメント
- ポリシーファイルのルート要素
- actionエレメント
- 1つの単一のアクションを含む
- defaultsエレメント
- 値
yes
は、認証なしで該当ソフトウェアを実行することが許可されることを意味する。 - 値
no
は、該当のソフトウェアを実行する権限が無いことを意味する。 - 値
auth_self
は、ユーザは特権が要求されるたびに自分のパスワードで認証する必要があることを意味する。 - 値
auth_self_keep
は、auth_self
と同様であるが、認証が一定時間続くことを意味する。 - 値
auth_self_keep_session
は、ユーザはセッションごとに1度だけ自身のパスワードで認証する必要があり、特権はセッション全体に対して付与される。 - 値
auth_self_keep_always
は、ユーザが自身のパスワードで認証する必要があるのは1度だけで、現在と将来のセッションに対して特権が付与される。 - 値
auth_admin
は、管理者として認証が必要であることを意味する。 - 値
auth_admin_keep
は、auth_admin
と同様であるが、認証が一定時間続くことを意味する。 - 値
auth_admin_keep_always
は、管理者として認証が必要であるのは1度だけで、現在と将来のセッションに対して特権が付与される。
- allow_inactiveエレメント
- SSHやVNCのようなリモートセッションでログインした場合の特権
- allow_activeエレメント
- TTYやXディスプレイでマシンに直接ログインした場合の特権
- allow_anyエレメント
- 上記の両方で使用する特権
- 値
- annotateエレメント
- PolKitがどのようにアクションを実行するかに関する特定の情報が含まれる。
- 実行ファイルへの絶対パスを記述する。
- annotate 4エレメント
- GUIがXディスプレイを開くことを許可するかどうかを記述する。
PolKitの設定例
GTKで開発されたGUIソフトウェアの場合
PolKitにカスタムアクションを追加することにより、GTKで開発されたGUIソフトウェアをroot権限で実行することができる。
例えば、pkexec
コマンドを使用してgeditを実行する場合、
/usr/share/polkit-1/actions/org.freedesktop.policykit.gedit.policyファイルを作成する必要がある。
<?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>
詳細を知りたい場合は、以下に示すURLにアクセスして、リファレンスマニュアルを参照すること。
http://www.freedesktop.org/software/polkit/docs/0.105/pkexec.1.html
Qtで開発されたGUIソフトウェアの場合
Qtで開発されたGUIソフトウェアにおいては、PolKitにカスタムアクションを追加してもroot権限で実行することはできない。
これは、Qt GUIソフトウェア全体をroot権限で実行することは非推奨とされているからである。
非推奨であるが、Qt GUIソフトウェア全体をroot権限で実行する場合は、
PolKitのカスタムアクションは作成せずにenv
オプションを付加することにより、pkexec
コマンドで実行することができる。
ただし、動作には、/usr/share/polkit-1/actions/org.freedesktop.policykit.policyファイルが必要である。
# 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ソフトウェアのパス>
また、QtベースのGUIソフトウェアからD-Busを通じてroot権限で実行されるQtベースのCUIソフトウェアを呼び出すことにより、PolKitを使用することができる。
SkiaSharpで開発されたGUIソフトウェアの場合
SkiaSharpで開発されたGUIソフトウェアも、PolKitにカスタムアクションを追加してもroot権限で実行することはできない。
その場合、gnomesu
コマンドまたはkdesu
コマンドで実行することができる。
gnomesu <SkiaSharpで開発されたGUIソフトウェアのパス> # または kdesu <SkiaSharpで開発されたGUIソフトウェアのパス>
X11
デフォルトでは、セキュリティ上の理由から、rootは非rootユーザのXサーバに接続することができない。
しかし、必要であれば、rootユーザとして接続できるようにする方法が複数存在する。
X11上でGUIソフトウェアを昇格権限で実行するための推奨される方法は、PolKitポリシーファイルを作成することである。
しかし、pkexec
コマンドが注意喚起しているように、これは、レガシープログラムにのみ使用されるべきである。
GUIソフトウェアは、特権的な操作を、監査可能で、自己完結した、最小限のコード片に委ね、特権昇格を行った後に実行され、必要ない時には削除するべきである。
X11を使用している場合、GUIソフトウェアを昇格フレームワークでラップして、終了時に取得した特権を削除する。
gnomesu <GUIソフトウェアのパス> kdesu <GUIソフトウェアのパス>
Wayland および XWayland
Waylandセッションにおいて、su
コマンド、sudo
コマンド、pkexec
コマンドを使用して、GUIソフトウェアを実行する場合、以下に示すようなエラーが発生する。
No protocol specified Unable to init server: Could not connect: Connection refused (gedit:2349): Gtk-WARNING **: cannot open display: :0
X11では、昇格した特権でGUIソフトウェアを実行する場合は、PolKitポリシーファイルの作成、または、sudo
コマンドでターミナルから実行することができたが、
WaylandおよびXWaylandでは、Xサーバを起動したユーザのみがクライアントに接続できるよう設定されているため、これらの方法は使用できない。
安全性は劣るが、xhost
コマンドを実行して、rootユーザがローカルユーザのセッションに一時的にアクセスできる方法がある。
これを行う場合は、現在の(非特権)ユーザにおいて、以下に示すコマンドを実行する。
xhost si:localuser:root
GUIソフトウェアの終了後は、特権を削除する必要がある。
xhost -si:localuser:root
PolKitを使用したサンプルコード
C/C++を使用したPolKitのサンプルコードを知りたい場合は、C++の応用 - PolKitのページを参照すること。