設定 - PolKit

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

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ディレクトリ
      主に、システムやパッケージ管理システムからインストールするソフトウェアに使用される。
      このディレクトリに、ユーザまたはシステム管理者がファイルを作成することは非推奨である。


PolKitは、特権ユーザの権利を抑制しようとするものではなく。非特権ユーザの特権サービスへのアクセスを拡張するために使用されるべきである。
セキュリティの観点からは、sudoersを使用することを推奨する。


利用可能なコマンド

PolKitには、特定のタスクのためのコマンドが存在する。

  • pkactionコマンド
    定義されたアクションの詳細を取得する。
    例. org.freedesktop.login1.rebootに対して、必要な認可を表示する。
    pkaction -v --action-id=org.freedesktop.login1.reboot

    また、pkactionコマンドを実行することにより、定義された全てのアクションを表示することができる。

  • pkcheckコマンド
    processコマンドまたは--system-bus-nameオプションで指定されたプロセスが認可されているかどうかを確認する。

  • 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>


  1. policyconfigエレメント
    ポリシーファイルのルート要素

  2. actionエレメント
    1つの単一のアクションを含む

  3. 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エレメント
      上記の両方で使用する特権

  4. annotateエレメント
    PolKitがどのようにアクションを実行するかに関する特定の情報が含まれる。
    実行ファイルへの絶対パスを記述する。

  5. 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のページを参照すること。