第9章 PolKit を利用した権限認可

目次

9.1. 考えかたの概要
9.2. 権限の修正と設定
9.3. ローカルセキュリティポリシーを利用した管理者認証の設定

概要

PolKit (従来は PolicyKit という名称でした) は、権限を定義し、処理するための ツールキットです。

9.1. 考えかたの概要

PolKit は権限を持たないユーザセッションと権限を持つシステムコンテキストとの 間で、仲介を行なうアプリケーションフレームワークです。ユーザセッションの プロセスが、システムコンテキスト内にある何らかの動作を行なおうとすると、 PolKit への問い合わせが行なわれます。設定内容 (ポリシー と 呼びます) に依存して、問い合わせへの回答は はい, いいえ, 要認証 のいずれかが返されます。 sudo のような従来の認可プログラムとは異なり、 PolKit はプロセス全体に 対して root の許可を与えることはなく、その処理のみに適用します。

ユーザがセッション (デスクトップ環境など) を開始すると、各セッションには 権限認証エージェント が 構成されます。権限は、システムのメッセージバス上で動作するサービスとして 実装されるもので、認証エージェントは現在のユーザ (セッションを開始した ユーザ) を認証するために使用されるものです。また、現在のユーザは、認証情報 (たとえばパスフレーズなど) を利用して正当性の確認を行ないます。

PolKit を設定する際、システム管理者は 権限ルール を 利用して権限ポリシーを設定することができます。どのような 動作 を実行するのかは、アプリケーション側で 設定します。

それぞれの既存のポリシーには名前 (識別子) が付けられています。これは コマンドラインツールやグラフィカルなユーザインターフェイスで利用します。

9.1.1. 利用可能なポリシーとサポート対象のアプリケーション

現時点では、権限を必要とする全てのアプリケーションが PolKit を使用する ようにはできていません。 openSUSE® において、 PolKit が利用されて いる代表的なアプリケーションには、下記のようなものがあります。

表9.1 利用可能なポリシー

アプリケーション

ポリシー

PulseAudio

PulseAudio デーモンに対するスケジューリングの優先順位設定

CUPS

プリンタの追加や削除、編集や有効化/無効化の設定

GNOME

  • GConf おけるシステム値と必須値の修正

  • システム時刻の変更

PolKit

  • 他のユーザに対する権限の読み込みと変更

  • 既定値の修正

PackageKit

  • パッケージの更新と削除

  • リポジトリの更新と変更

  • ローカルファイルのインストール

  • ロールバック

  • リポジトリの鍵の取り込み

  • EULA の受け入れ

  • ネットワークプロキシの設定

System

  • Wake on LAN

  • 固定ディスクやホットプラグ、暗号化に対応したデバイスについて、 そのマウントやマウント解除

  • リムーバブルメディアの取り出しや暗号化の解除

  • 無線 LAN の有効化/無効化

  • Bluetooth の有効化/無効化

  • デバイスへのアクセス

  • システムの停止/サスペンド/ハイバネート/再起動

  • ドッキングステーションの取り付け/取り外し

  • 電源管理設定の変更

YaST

  • 製品の登録

  • システム時刻と言語の変更


9.1.2. 権限の種類

PolKit に対応したプロセスが権限を伴う操作を行なおうとすると、 PolKit に対して そのプロセスが対応する権限を持っているかどうか確認が行なわれます。 PolKit からの回答は、そのプロセスに対して設定されたポリシーに従って行なわれます。 それぞれ はい, いいえ, 要認証 のいずれかの回答パターンがあります。既定ではポリシーには 暗黙の 権限が設定され、これらは自動的に全てのユーザに対して適用されます。逆に 明示的な 権限を設定することもできます。この場合は特定の ユーザに対してのみ権限が適用されます。

9.1.2.1. 暗黙の権限

暗黙の権限とは、任意のセッション (動作中のもの/一時停止中のものの両方) に対して設定できる権限です。動作中のセッションとは、現在誰かが利用している 最中のセッションのことで、たとえば他のコンソールに切り替えたりすることで、 一時停止状態に移行します。暗黙の権限を いいえ に切り替えると、 誰に対しても権限が付与されなくなります。逆に はい に設定する と、全てのユーザに対して権限が付与されるようになります。ただし、多くの場合は 認証を求めておいたほうが便利です。

ユーザに対しては、 root の認証を行なうことで権限を与えることができる ほか、自分自身の認証で権限を与えるように設定することもできます。それぞれの 認証方法に対しては、下記の 4 種類のいずれかを設定することができます:

認証

常にユーザに対して認証を求める方法です。

1 回だけの認証

認証を、現在動作中のプログラムに対して 1 回だけ求める方法です。 プログラムを再起動すると、再度認証作業が必要になります。

セッション認証の維持

認証ダイアログボックスには、 Remember authorization for this session (このセッションに対する権限を記憶する) というチェックボックスが存在します。これにチェックを入れると、認証は ログアウトするまでの間、有効であり続けます。

無期限認証の維持

認証ダイアログボックスには、 Remember authorization (権限を記憶する) というチェックボックスも存在しています。これにチェック を入れると、認証は一度だけ求められ、以後求められないようになります。

9.1.2.2. 明示的な権限

明示的な権限は、特定のユーザに対してのみ権限を付与する方法です。無制限に 権限を与えることができるほか、動作中のセッションに対してだけ与えることも できますし、ローカルコンソールに対してだけ与えることもできます。

また、あるユーザに対して権限を与えるだけでなく、あるユーザに対しては権限を 与えないような設定を行なうこともできます。権限を与えないように明示的に 設定されたユーザは、既定の暗黙の権限ポリシーで権限付与が設定されていた場合でも、 権限の必要な処理を行なうことができなくなります。

9.1.3. 既定の権限

PolKit に対応している各アプリケーションには、アプリケーションの開発者が規定した 暗黙の権限の既定値が存在します。これらのポリシーは 提供元の既定値 と呼ばれます。提供元の既定値は、必ずしも SUSE 製品を既定の設定で利用する 際に必要となるものではありません。 openSUSE では、提供元の既定値ではなく、 独自の既定値を定義しています:

/etc/polkit-default-privs.standard

ほとんどのデスクトップシステムに対して適切に働く設定で 、 こちらを既定値として利用するようになっていま す。

/etc/polkit-default-privs.restrictive

集中管理型のマシンに適切な設定で す。

既定の設定を切り替えたい場合は、 /etc/sysconfig/security ファイル内にある POLKIT_DEFAULT_PRIVS の値を、 restrictive または standard のいずれかに 設定してください。設定後は rootset_polkit_default_privs を実行します。

なお、上記のファイルを書き換えることはしないでください。独自の権限セットを 定義したい場合は、 /etc/polkit-default-privs.local をご利用ください。 詳しくは 9.2.1.1項 「暗黙の権限を使用するための設定ファイル修正」 をお読みください。

9.2. 権限の修正と設定

暗黙の権限や明示的な権限を修正するには、 PolKit に同梱されているコマンドラインツールを 利用し、設定ファイルを変更します。設定ファイルの変更は、恒久的な変更を行ないたい場合に お勧めの方法です。

PolKit (PolicyKit) には、権限を変更したり他のユーザに 成り代わってコマンドを実行したりするためのコマンドラインツールが 用意されています。また、既存のポリシーには識別名が用意されていて、コマンド ラインツールから利用する際には、この識別名を利用して指定します。 なお、利用可能なポリシーの一覧は、 pkaction コマンドで取得できます。

権限の一覧表示と変更 (pkaction)

何もパラメータを指定しないで pkaction コマンドを 実行すると、利用可能な全てのポリシーを表示します。 --show-overrides オプションを指定すると、既定値とは異なる 全てのポリシーを表示することができます。特定の処理に対する権限を、提供元の 既定値に戻したい場合は、 --reset-defaults  処理 オプションをお使いください。 詳しくは man 1 polkit-action をお読みください。

指定したポリシー (下記の例では 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

auth_admin_keep というキーワードは、ユーザに対して パスフレーズの入力を求める、という意味です。

[Note]openSUSE における pkaction の制限

pkaction コマンドは、提供元の既定値に対してのみ 動作します。 openSUSE における既定値を一覧表示したり、復元したり することはできません。これらを実施したい場合は、 9.2.2項 「既定の権限の復元」 をお読みください。

明示的な権限の一覧表示/ブロック/取り消し
polkit-auth

特定のユーザに対する明示的な権限を一覧表示するには、下記のコマンドを実行します:

polkit-auth --explicit-detail --user USER

上記では USER を実際のユーザ名に置き換えてください。 --user オプションを指定せずに実行すると、コマンドを 実行したユーザに対する権限情報を表示します。詳しくは man 1 polkit-auth をお読みください。

9.2.1. 設定ファイルの変更

設定ファイルを編集することでの権限調整は、複数のマシン (たとえば特定の チーム内のコンピュータ) に対して同じポリシーを配布するような場合に便利です。 設定ファイルの編集では、暗黙の権限と明示的な権限の両方を変更することが できます。

9.2.1.1. 暗黙の権限を使用するための設定ファイル修正

openSUSE では既定の権限設定を 2 種類用意しています。それぞれ /etc/polkit-default-privs.standard/etc/polkit-default-privs.restrictive という ファイルです。詳しくは 9.1.3項 「既定の権限」 をお読みください。

権限設定を独自に定義して使用したい場合は、 /etc/polkit-default-privs.local ファイルをご利用 ください。ここで設定した権限は、他の設定ファイルで設定されたものよりも 常に優先して適用されるようになっています。また、権限を定義するには、 ポリシーファイルに行を追加して、下記の書式で記入してください:

<権限の識別子>     <任意のセッション>:<一時停止中のセッション>:<動作中のセッション>

たとえば、下記のようになります:

org.freedesktop.policykit.modify-defaults     auth_admin_keep_always

利用可能な全ての権限識別子を一覧表示するには、 polkit-action コマンドを実行してください。また、 セッション パラメータには 下記の値を設定することができます:

yes

権限を付与します。

no

権限を与えないようにします。

auth_self

権限が必要なとき、常に自分自身の (呼び出したユーザの) パスワードを入力するよう求めます。

auth_self_keep_session

権限が必要なとき、セッション内で一度だけ自分自身の (呼び出した ユーザの) パスワードを入力するよう求めます。 認証後はセッション全体に対して権限を付与します。

auth_self_keep_always

権限が必要なとき、一度だけ自分自身の (呼び出したユーザの) パスワードを入力するよう求めます。 認証後はセッション全体と、今後作成されるセッションに対して 権限を付与します。

auth_admin

権限が必要なとき、常に root のパスワードを入力するよう求めます。

auth_admin_keep_session

権限が必要なとき、セッション内で一度だけ root の パスワードを入力するよう求めます。 認証後はセッション全体に対して権限を付与します。

auth_admin_keep_always

権限が必要なとき、一度だけ root の パスワードを入力するよう求めます。 認証後はセッション全体と、今後作成されるセッションに対して 権限を付与します。

/etc/polkit-default-privs.local ファイルを編集した あとは、変更内容を反映するために set_polkit_default_privs を実行してください。

9.2.1.2. 明示的な権限を使用するための設定ファイル修正

明示的な権限は /etc/PolicyKit/PolicyKit.conf ファイルで設定します。この設定ファイルは PolKit の DTD に従った XML の形式になっています。 openSUSE に同梱されているファイルには、 既に必要なヘッダとルート要素 <config> が 含まれていて、編集を行なう場合は <config> タグ内に記述します。

match

動作やユーザを指定します。 match には 2 種類の 属性 (user, action) を指定 できますが、いずれか 1 つのみを指定します。 match を入れ子で指定すると、属性を組み合わせることができます。また、 属性値には POSIX の拡張正規表現を利用することができます。

user=USER

1 つまたは複数のログイン名を指定します。複数の名前を指定する場合 は、 | 記号で区切ってください。

action=policy

識別子でポリシーを指定します。利用可能なポリシー識別子の一覧を 表示するには、 polkit-action コマンドを使用 します。

return

PolKit が返却する応答を指定します。 1 つの属性値だけを指定することが でき、 result=value の形式で指定します。値の一覧は 9.2.1.1項 「暗黙の権限を使用するための設定ファイル修正」 をお読みください。

define_admin_auth

通常は root のパスワード入力が必要な処理について、自分自身の (呼び出したユーザの) パスワード入力で権限を与えることのできるユーザや グループを指定します。 user=USER または group=GROUP の 属性値を設定することができますが、いずれか 1 つのみを指定します。 複数の属性値を指定する場合は、 | 記号で区切って ください。なお、ここでは POSIX の拡張正規表現を利用することは できません。トップレベルで使用した場合は全てのポリシーに対して 適用されますが、 <match> 内で使用すると 特定のポリシーに対してのみ適用されます。

例9.1 /etc/PolicyKit/PolicyKit.conf ファイルの例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkconfig PUBLIC "-//freedesktop//DTD PolicyKit Configuration 1.0//EN"
"http://hal.freedesktop.org/releases/PolicyKit/1.0/config.dtd">1
<config version="0.1">2
  <match action="org.freedesktop.packagekit.system-update">3
    <match user="tux">
      <return result="yes"/>
    </match>
  </match>
  <match action="org.freedesktop.policykit.*">4
    <match user="tux|wilber">
      <return result="no"/>
    </match>
  </match>
  <define_admin_auth group="administrators"/>5
</config>

1

設定ファイルの最初の 3 行は XML のヘッダです。これらの行はテンプレート ファイル内に書かれているものであり、これらは編集しないでください。

2

XML のルート要素は必須の要素です。また、属性 version も必須の要素で、現時点では 0.1 を指定します。 これらもテンプレートファイル内に書かれています。

3

ユーザ tux に対して、 認証無しで PackageKit によるパッケージ更新を許可する設定です。

4

ユーザ tuxwilber に対して、 全ての PolKit 関連ポリシー向けの権限を剥奪する設定です。

5

グループ administrators に 属する全てのメンバーに対して、 root のパスワード入力が必要となった際、 自分自身のパスワードで認証できるようにする設定です。この設定は match 設定の範囲外にあるため、全てのポリシーに 対して適用されます。


9.2.2. 既定の権限の復元

openSUSE で独自の既定値が設定されていて、アプリケーション提供元の既定値を 上書きするようになっています。詳しくは 9.1.3項 「既定の権限」 をお読みください。

PolKit のツールは、グラフィカルなものであってもコマンドラインツールであっても、 いずれも提供元の既定値に対して動作するようになっているため、 openSUSE では、 /etc/polkit-default-privs.* で定義されている権限に リセットするためのコマンドラインツール、 set_polkit_default_privs が用意されています。 ただし、 set_polkit_default_privs によるリセットは、 提供元の既定値にリセットするだけの機能であることに注意してください。

手順9.1 openSUSE の既定値への復元

  1. まずは /etc/polkit-default-privs.local 内に、 独自の既定値が含まれていないことを確認します。

    [Important]独自のポリシー設定

    /etc/polkit-default-privs.local に設定された ポリシーは、次の手順で既定値の上に設定されます。

  2. 全てのポリシーを提供元の既定値に設定したあと、 openSUSE の既定値を 適用するには、下記のように実行します:

    rm -f /var/lib/PolicyKit-public/* && set_polkit_default_privs

9.3. ローカルセキュリティポリシーを利用した管理者認証の設定

PolKit では一般ユーザと管理者の認証を区別して扱います。 管理者 は様々な オペレーティングシステムでそれぞれ個別に定義されている仕組みですが、ローカルオーソリティ と呼ばれる仕組みでは、 管理者認証 をどのように設定するのかを指定する ことができます。

既定では、 SUSE システムは root のパスフレーズを要求しますが、管理者グループの メンバーであるかどうかを要件にしたい場合は、ローカルオーソリティをそのように設定することも できます。

9.3.1. ディレクトリ構造について

PolKit は、下記のディレクトリ内に存在していて、 .pkla という拡張子のある ファイルを読み込みます:

  • /etc/polkit-1/localauthorityローカル設定用

  • /var/lib/polkit-1/localauthorityサードパーティ製のパッケージ用

上記のディレクトリには、それぞれ特定の用途ごとにサブディレクトリが含まれます:

10-vendor.d

OS の製造元が使用するディレクトリ

20-org.d

OS を配置する企業や団体などが使用するディレクトリ

30-site.d

システムを配置する部署や部門などが使用するディレクトリ

50-local.d

ローカルで使用するディレクトリ

90-mandatory.d

OS を配置する団体などが使用するディレクトリ

9.3.2. 例

それぞれの .pkla ファイルには、キー/値の対で記述する 1 つまたは 複数の認証項目が含まれます。それぞれのキーワードの意味について、詳しくは http://www.freedesktop.org/software/polkit/docs/0.105/polkit.8.html (英語) をお読みください。

下記の例では、 NetworkManager のローカル認証設定例を示しています:

例9.2 NetworkManager でのローカル認証設定 (/var/lib/polkit-1/localauthority/10-vendor.d/org.freedesktop.NetworkManager.enable-disable-network.pkla)

[org.freedesktop.NetworkManager.enable-disable-network]
Identity=unix-group:* 1
Action=org.freedesktop.NetworkManager.enable-disable-network 2
ResultAny=auth_admin 3
ResultInactive=auth_admin 4
ResultActive=yes 5

1

全てのユーザに対して認証を許可しています

2

NetworkManager でネットワークを有効にしたり無効にしたりする場合に利用する、アクション名を指定しています

3

全てのクライアントに対する暗黙の認証設定です。ここでは管理者ユーザの 認証を求めています。

4

ローカルコンソール上で、その時点で無効なセッションに適用する暗黙認証です。 ここでは管理者ユーザの認証を求めています。

5

ローカルコンソール上で、その時点で有効なセッションに適用する暗黙認証です。 ここではこの動作に対する結果を認証しています。


openSUSE セキュリティガイド 13.1