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

特権の実装方法

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

許可された特権セット

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

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

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

継承可能な特権セット

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

制限特権セット

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

実効特権セット

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

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