ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris 11 セキュリティーサービス開発ガイド Oracle Solaris 11 Information Library (日本語) |
1. Oracle Solaris の開発者向けセキュリティー機能 (概要)
3. PAM アプリケーションおよび PAM サービスの記述
8. Oracle Solaris 暗号化フレームワークの紹介
9. ユーザーレベルの暗号化アプリケーションとプロバイダの記述
特権は、通常であれば Oracle Solaris オペレーティングシステムによって禁止されるような操作を実行できるように、特定のプロセスに付与される個別の権利です。 大部分のプログラムは特権を使用しません。というのも、プログラムは一般に、システムのセキュリティーポリシーの境界の内側で動作するからです。
特権は管理者によって割り当てられます。 特権は、プログラムの設計に従って有効化されます。 ログイン時またはプロファイルシェル起動時には、シェル内で実行されるすべてのコマンドに対して、管理者による特権割り当てが適用されます。 アプリケーション実行時には、特権のオン/オフがプログラム的に切り替えられます。 exec(1) コマンドを使用して新しいプログラムが起動されると、そのプログラムは親プロセスの継承可能な特権のすべてを使用できる可能性があります。 ただし、そのプログラムは新しい特権を 1 つも追加できません。
コマンドに特権を割り当てるのは、システム管理者の責任です。 特権の割り当てについての詳細は、『Oracle 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 に設定されます。
特権は、その適用範囲に基づいて論理的に次のように分類されます。
基本特権 – 基本特権は、以前の Oracle Solaris リリースで特権を持たなかったプロセスに付与されます。 デフォルトでは、各プロセスおよび各ユーザーにすべての基本特権が割り当てられます。ただし、基本特権を除去してアクセスをさらに制限することができます。
PRIV_FILE_LINK_ANY – プロセスが自身の実効 UID 以外の UID が所有するファイルへのハードリンクを作成できるようにします。
PRIV_PROC_FORK – プロセスが fork()、fork1()、または vfork() を呼び出せるようにします。
PRIV_PROC_SESSION – プロセスがシグナルを送信したり、セッション外のプロセスを追跡したりできるようにします。
PRIV_PROC_INFO – プロセスが、照会プロセスがシグナルを送信できるプロセス以外のプロセスの状況を調べられるようにします。 この特権がない場合、/proc の下に見ることのできないプロセスは調べることはできません。
PRIV_FILE_READ – プロセスがファイルシステム内のオブジェクトを読み取ることができるようにします。
PRIV_FILE_WRITE – プロセスがファイルシステム内のオブジェクトを変更できるようにします。
PRIV_NET_ACCESS – プロセスが TCP、UDP、SDP、または SCTP ネットワークエンドポイントをオープンできるようにします。
最初は、プログラムに関する基本特権は、個別ではなくセットとして割り当てる必要があります。 そうすれば、Oracle Solaris OS のアップデートでリリースされた基本特権のすべてが、割り当てに含まれることが保証されます。 ただし、プログラムに必要な特権セットを導き出すとき、不要な基本特権を除去し、プログラムに必要な他の特権を追加することが重要です。 たとえば、exec(1) サブプロセスを実行しないプログラムでは、proc_exec 特権をオフにするべきです。
ファイルシステム特権。
Oracle Solaris 特権と説明の完全な一覧については、privileges(5) のマニュアルページを参照してください。
注 - Oracle Solaris は、ゾーン機能を提供します。この機能を使用して管理者はアプリケーション実行用の隔離された環境を設定できます。 zones(5) を参照してください。 そのゾーン外のシステムのほかの動作はゾーン内のプロセスを監視したり干渉したりできないため、そのプロセスに対するすべての特権もゾーンに限定されます。 ただし、必要な場合は、大域ゾーン以外で操作する特権が必要な大域ゾーン内のプロセスに PRIV_PROC_ZONE 特権を適用できます。