Oracle Solaris セキュリティーサービス開発ガイド

特権について

特権は、通常であれば Solaris OS によって禁止されるような操作を実行できるように、特定のプロセスに付与される個別の権利です。大部分のプログラムは特権を使用しません。というのも、プログラムは一般に、システムのセキュリティーポリシーの境界の内側で動作するからです。

特権は管理者によって割り当てられます。特権は、プログラムの設計に従って有効化されます。ログイン時またはプロファイルシェル起動時には、シェル内で実行されるすべてのコマンドに対して、管理者による特権割り当てが適用されます。アプリケーション実行時には、特権のオン/オフがプログラム的に切り替えられます。exec(1) コマンドを使用して新しいプログラムが起動されると、そのプログラムは親プロセスの継承可能な特権のすべてを使用できる可能性があります。ただし、そのプログラムは新しい特権を 1 つも追加できません。

管理者が特権を割り当てる方法

コマンドに特権を割り当てるのは、システム管理者の責任です。特権の割り当てについての詳細は、『Solaris のシステム管理 (セキュリティサービス)』「特権 (概要)」を参照してください。

特権の実装方法

すべてのプロセスは次の 4 つの特権セットを備えており、これらによって、特定の特権を使用できるかどうかが決まります。

許可された特権セット

許可されたセットには、プロセスが使用できる可能性のあるすべての特権を含める必要があります。逆に言えば、使用すべきでない特権は、そのプログラムの許可されたセットに含めてはいけません。

プロセスが起動された場合、そのプロセスは親プロセスから許可された特権セットを継承します。一般に、ログイン時や新しいプロファイルシェルが起動される際、許可された特権の初期セットにはすべての特権が含まれます。このセット内の特権は管理者によって指定されます。子プロセスはそれぞれ、許可されたセットから特権を削除することはできますが、許可されたセットにほかの特権を追加することはできません。セキュリティー上、プログラムが決して使用しない特権は、許可されたセットから削除しておく必要があります。そうすることで、誤って割り当てた、または誤って継承された特権をプログラムが使用する心配がなくなります。

許可された特権セットから削除された特権は、実効セットからも自動的に削除されます。

継承可能な特権セット

ログイン時や新しいプロファイルシェルが起動される際、管理者によって指定された特権が継承可能なセットに含められます。これらの継承可能な特権は、exec(1) の呼び出し後に子プロセスに渡される可能性があります。プロセスは不要な特権を削除し、それらの特権が子プロセスに渡されるのを防止すべきです。たいていは、許可されたセットと継承可能なセットの内容は同じになります。ただし、継承可能なセットから削除された特権が許可されたセット内に残される場合もあります。

制限特権セット

制限セットを使えば、開発者は、プロセスが行使したり子プロセスに渡したりできる特権を制御できます。子プロセスや子孫プロセスが取得できるのは、制限セット内に含まれる特権だけです。setuid(0) 関数を実行する場合、そのアプリケーションが使用できる特権は、制限セットによって決まります。制限セットは exec(1) の実行時に適用されます。制限セットから特権を削除しても、exec(1) が実行されるまでは、ほかのセットには影響はありません。

実効特権セット

プロセスが実際に使用できる特権が、プロセスの実効セット内に収められます。プログラム起動時の実効セットは、許可されたセットと等しくなります。その後、実効セットは、許可されたセットと等しいか、あるいはそのサブセットになります。

実効セットを基本特権セットに制限することをお勧めします。中核特権を含む基本特権セットは、「特権の種類」に記述されています。プログラム内で使用しない特権をすべて削除します。必要になるまですべての基本特権をオフにしておきます。たとえば、file_dac_read 特権があれば、すべてのファイルを読み取れます。プログラム内にファイル読み取りルーチンが複数含まれる可能性があります。そうしたプログラムでは、最初にすべての特権をオフにしますが、適切な読み取りルーチンに対して file_dac_read をオンにします。したがって、プログラムが間違った読み取りルーチンに対して file_dac_read 特権を行使することはありえません。こうした方法は「特権の囲い込み」と呼ばれます。特権の囲い込みの例については、「特権のコーディング例」を参照してください。

スーパーユーザーモデルと特権モデルの互換性

従来のアプリケーションにも対応できるように、特権の実装は、スーパーユーザーモデルと特権モデルのどちらでも動作します。この対応は、PRIV_AWARE フラグを使用することで実現されます。このフラグは、プログラムが特権に対応していることを示します。PRIV_AWARE フラグは、オペレーティングシステムによって自動的に処理されます。

特権を認識しない子プロセスについて検討してください。このプロセスの PRIV_AWARE フラグは false になっています。親プロセスから継承された特権のすべてが、許可されたセットと実効セットに含まれます。子プロセスが UID を 0 に設定した場合、その実効セットと許可されたセットは、制限セット内の特権に制限されます。子プロセスはスーパーユーザーの力を完全には行使できません。したがって、特権に対応したプロセスの制限セットが、特権に対応していないすべての子プロセスのスーパーユーザー特権を制限することになります。子プロセスが特権セットをいずれか 1 つでも変更すると、PRIV_AWARE フラグが true に設定されます。

特権の種類

特権は、その適用範囲に基づいて論理的に次のように分類されます。

Solaris 特権と説明の完全な一覧については、privileges(5) のマニュアルページを参照してください。


注 –

Solaris は、ゾーン機能を提供します。この機能を使用して管理者はアプリケーション実行用の隔離された環境を設定できます。zones(5) のマニュアルページを参照してください。そのゾーン外のシステムのほかの動作はゾーン内のプロセスを監視したり干渉したりできないため、そのプロセスに対するすべての特権もゾーンに限定されます。ただし、必要な場合は、大域ゾーン以外で操作する特権が必要な大域ゾーン内のプロセスに PRIV_PROC_ZONE 特権を適用できます。