Polkit はグラフィカルな Linux デスクトップ環境で使用される認可フレームワークで、システムでの権限管理をより精密に行うための仕組みです。従来の Linux システムでは、最高位のシステム権限を持つユーザとして root
を規定し、それ以外のユーザやグループと分離していましたが、サウンドハードウエアにアクセスするための audio
グループなどのように、 root
とは別の権限構成も存在していました。このような構成では、特定の状態にある場合にのみ許可したり、一時的に許可したりするようなことが実現できませんでした。
このような場合、通常は sudo
コマンドなどで root
に成り代わり、特権を得て作業を行うことになりますが、 Polkit では要件に応じて特定のユーザやグループに対して、必要な権限のみを与えることができます。権限は処理と権限内容を記した設定ファイル内で動的に対応することができます。
Polkit は複数のコンポーネント (部品) から構成されています。まず polkitd
は裏で動作する特権サービスで、 Polkit の設定ファイルを読み込んで必要な認証チェックを実施します。 Polkit 対応のアプリケーションは認証要求を polkitd
に送信しますが、このとき特権を持たない Polkit 認証エージェントが動作して、 polkitd
が求める認証要求を表示します。ここでユーザが対話的に入力した値は、エージェントを介して polkitd
に送信されます。
Polkit での アクション は、 Polkit の認可ルールに記された 1 つの処理を意味します。このアクションはたとえば、コンピュータを再起動したいなどの意図を表します。それぞれのアクションには唯一の ID が設定され、たとえばコンピュータの再起動であれば org.freedesktop.login1.reboot
という名称が割り当てられています。
ユーザが完全機能のデスクトップ環境内でグラフィカルなセッションを開始すると、認可エージェントが裏で自動的に起動されます。このエージェントは何らかの認証が必要となった場合にのみ表に現れるだけで、それ以外の状況では表には全く現れません。なお、テキストモードで起動した場合や SSH 経由でログインした場合は自動で起動されませんので、以降はグラフィカルなセッションを想定して記しています。
Polkit の設定は、 アクション と 認可ルール を元にして作られています:
*.policy
)XML ファイル形式で記述され、 /usr/share/polkit-1/actions
内に配置されます。それぞれのファイルは 1 つ以上のアクションを定義していて、それぞれのアクションには説明と既定のアクセス許可が設定されます。システム管理者側では独自のルールを作成することができますが、 Polkit 側が提供するファイルについては、編集してはなりません。
*.rules
)ルールは JavaScript プログラミング言語で記述され、 2 箇所に配置されます。システムが提供するパッケージの場合は /usr/share/polkit-1/rules.d
に、独自に作成するファイルの場合は /etc/polkit-1/rules.d
にそれぞれ配置します。それぞれのルールファイルには既定の認可設定のほか、複雑なロジックで権限を判断するようなことができます。たとえばルールファイルでは制限の厳しいアクセス許可を上書きすることができるほか、特定のユーザには認証 無しで実行できるようにしたりすることができます。
Polkit には、特定の作業を行うためのコマンドが用意されています (より詳しい説明については、それぞれのマニュアルページをお読みください):
pkaction
設定済みのアクションに対して詳細を取得します。詳しくは 18.3項 「権限の問い合わせ」 をお読みください。
pkcheck
特定の Polkit のアクションに対して、プロセスが認可されているかどうかを確認します。
pkexec
Polkit の認可設定に従って、異なるユーザでプログラムを実行できるようにします。 su
や sudo
に似た仕組みです。
pkttyagent
テキスト型の認証エージェントを起動します。このエージェントは、デスクトップ環境側に独自の認証エージェントが存在しない場合に使用されます。
Polkit を有効化したプロセスが権限操作を行うと、このプロセスに対して権限が設定されているかどうかを Polkit に尋ねる処理を行います。 Polkit はそのプロセスに対して設定されているポリシーを元にして、応答を返します。応答は yes
(はい), no
(いいえ), authentication needed
(要認証) のいずれかとなります。 authentication needed
(要認証) の場合はユーザに対して認証ダイアログを表示し、必要な認可を得る処理を行います。
特定のアクションに対して専用の Polkit JavaScript ルールが記述されていない場合、その結果は、 Polkit のポリシーファイルの各アクションに対して設定されている暗黙の認可設定に従って決定されます。この暗黙の認可設定には allow_active
, allow_inactive
, allow_any
の 3 種類があります。 allow_active
は動作中のセッション内にいるユーザに適用されるもので、テキストモードやグラフィカルユーザインターフェイスでログインしているユーザに適用されます。なお、ログイン中であっても、ユーザがコンソールを切り替えるなどして動作中でなくなると、 allow_inactive
が適用されます。また、 allow_any
は SSH や VNC などでログインしているリモートのユーザなど、それ以外の状況下で適用されます。これらそれぞれに対して、下記に示すいずれかの認可を割り当てることができます:
そのアクションに対して決して認可を与えないようにします。
認証情報を入力することなく、そのアクションに対して常に認可を与えるようにします。
権限を要求した際、自分自身のパスワードを入力させるようにします。
auth_self
に似ていますが、認証情報を一定時間だけ保持します。つまり、同じアプリケーションから繰り返し同じアクションを実行した場合、パスワードの入力を求めなくなります。
権限を要求した際、管理者 (root
) のパスワードを入力させるようにします。
auth_self_keep
と同様に、管理者 (root
) のパスワードを一定時間だけ保持します。
ここまでに説明してきた Polkit のポリシーファイル内の暗黙の認可設定は、アプリケーションの開発者が規定した既定の暗黙ポリシーセットが元になっています。このようなポリシーは 「提供元の既定値」 と呼ばれます。提供元の既定値で設定された権限は、既定の SUSE システムで有効化されていない場合もあります。 openSUSE Leap では、提供元の既定値を上書きする独自の権限セットを用意していますが、これには 3 種類のセットが含まれています:
/etc/polkit-default-privs.easy
利用者が管理者自身であり、それ以外には誰も使用しないような、単一のデスクトップシステム向けの権限セットです。使いやすさを重視した設定であるため、セキュリティという観点では弱い設定です。
/etc/polkit-default-privs.standard
ほとんどのシステムに対して適用できる均衡の取れた権限セットです。
/etc/polkit-default-privs.restrictive
使いやすさを犠牲にして、考えられる攻撃手法をできる限り無効化することを目指した、より保守的な権限セットです。
既定の権限を切り替えたい場合は、 /etc/sysconfig/security
ファイル内にある POLKIT_DEFAULT_PRIVS
の値を、 easy
, standard
, restrictive
のいずれかに設定してください。設定が終わったら、 root
で set_polkit_default_privs
を実行します。
上述のファイルについては変更してはなりません。独自の権限セットを構築したい場合は、 /etc/polkit-default-privs.local
で設定してください。詳しくは 18.4.3項 「SUSE 既定の権限設定の変更」 をお読みください。
権限を問い合わせたい場合は、 Polkit に含まれている pkaction
コマンドを使用します。
Polkit には権限を変更したり、他のユーザでコマンドを実行したりするためのコマンドラインツールが付属しています (概要は 18.1.3項 「Polkit のユーティリティ」 で説明しています) 。またそれぞれの既存のポリシーには、識別のための名前が設定されています。利用可能なポリシーを一覧で表示したい場合は、 pkaction
コマンドをお使いください。詳しくは man pkaction
をお読みください。
特定のポリシー (例: org.freedesktop.login1.reboot
) に対して、必要な認可情報を表示したい場合は、 pkaction
を下記のように実行します:
>
pkaction -v --action-id=org.freedesktop.login1.reboot
org.freedesktop.login1.reboot: description: Reboot the system message: Authentication is required to allow rebooting the system vendor: The systemd Project vendor_url: http://www.freedesktop.org/wiki/Software/systemd icon: implicit any: auth_admin_keep implicit inactive: auth_admin_keep implicit active: yes
pkaction
の制限事項についてpkaction
は提供元の既定値に対してのみ作用するもので、提供元の既定値を上書きする SUSE の既定値に対しては作用しないことに注意してください。そのため、出力結果は注意して解釈する必要があります。
たとえば特定のチーム内に配布するコンピュータをセットアップするような場合など、複数のマシンに同じポリシーセットを設定したいような場合、 Polkit の設定を修正する必要があります。このほか、 Polkit の認可設定をカスタマイズすることで、特定のアクションに対するセキュリティを強化したり、よく使用されるアクションに対して繰り返しのパスワード入力を省略したりなどを行うこともできます。ただし、認証無しで Polkit のアクションを不用意に実行できるように設定してしまうと、設定によっては完全な root
権限を得る結果になってしまうこともあります。そのため、 Polkit で認証設定を弱くする場合は、お使いの環境下でシステムのセキュリティを侵さない範囲でのみ設定するようにしてください。
お使いのシステムでどのようなアクションが利用できるのかは、どのパッケージをインストールしているのかによって決まります。概要を表示したい場合は、 pkaction
を実行して、定義済みの全ルールを一覧で表示させてください。
下記では、例として gparted
コマンド ( 「GNOME パーティションエディタ」 ) における Polkit との連携例を示しています。
/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-polkit-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 key="org.freedesktop.policykit.exec.allow_gui">true</annotate> </action> </policyconfig>
ポリシーファイルの XML ルート要素です。 | |
このポリシー内で唯一設定されたアクションの開始位置です。 | |
ここには暗黙の認可が設定されています。 | |
|
独自のポリシーを追加したい場合は、上記のような構造で .policy
ファイルを作成し、 id
属性に適切な値を設定して、既定のアクセス許可を記述してください。
Polkit 認可フレームワークは以前、 PolicyKit という名称で呼ばれていました。このことから、 XML 文書の属性値などには古い名称が残っている場合があります。
独自の認可ルールを作成することで、暗黙の認可を上書きして動作させることができます。独自のルールを作成する場合は、 /etc/polkit-1/rules.d/
ディレクトリ内にファイルを作成してください。
このディレクトリにファイルを配置する場合、ファイル名は 2 桁の数字ではじめ、ハイフンで区切ってその後ろにわかりやすい名前を続けて、末尾は .rules
で終わらせるようにしてください。これらのファイル内の関数は、並べ替えられた順に実行されます。たとえば 00-foo.rules
ファイルは 60-bar.rules
や 90-default-privs.rules
ファイルの前に実行されます。
ルールファイル内はスクリプト形式で、まずアクション ID (.policy
ファイルで定義されている値) が特定のものであるかどうかをチェックします。たとえば gparted
というコマンドを admin
グループ内の任意のユーザに対して許可したい場合は、 org.opensuse.policykit.gparted
のアクション ID に対して、下記のような処理を記述します:
/* Allow users in admin group to run GParted without authentication */ polkit.addRule(function(action, subject) { if (action.id == "org.opensuse.policykit.gparted" && subject.isInGroup("admin")) { return polkit.Result.YES; } });
Polkit API 内で提供されている全てのクラスとメソッドについて、詳しくは https://www.freedesktop.org/software/polkit/docs/latest/ref-api.html をお読みください。
18.2.2項 「SUSE 既定の権限」 で説明しているとおり、 SUSE では、提供元の開発者が設定した Polkit の暗黙の認可設定を上書きする設定を提供しています。それ以外の独自の権限については、 /etc/polkit-default-privs.local
ファイル内に記述してください。ここで定義された権限は、その他の設定ファイル内に書かれているものよりも常に優先して適用されます。独自の権限セットを定義したい場合は、下記のようにして行います:
/etc/polkit-default-privs.local
ファイルを編集します。権限を定義するには、下記のような形式で各アクション向けの行を記述します:
<アクション-ID> <任意のセッションに対する認可指定>:<非動作中のセッションに対する認可指定>:<動作中のセッションに対する認可指定>
3 種類全てのカテゴリに対して同じ設定を適用したい場合は、下記のように 1 つだけ値を指定してもかまいません:
<アクション-ID> <全てのセッションに対する認可指定>
たとえば、下記のように指定します:
org.freedesktop.color-manager.modify-profile auth_admin_keep
あとは設定を反映させるため、 root
で下記を実行します:
#
/sbin/set_polkit_default_privs
SUSE での Polkit 既定値に関する詳しいドキュメンテーションについては、 man polkit-default-privs
をお読みください。
認可設定を SUSE 提供の既定値に戻したい場合は、下記の手順を実施します:
まずは 18.2.2項 「SUSE 既定の権限」 で説明している設定値のいずれかを選択します。
/etc/polkit-default-privs.local
に記述している全ての上書き設定を削除します。
あとは set_polkit_default_privs
を実行すると、既定値に戻すことができます。