各プロセスには、プロセスが特定の特権を使用できるかどうかを判断する 4 つの特権セットがあります。カーネルは、特権「有効セット」を自動的に計算します。初期の特権「継承可能セット」は変更できます。特権を使用するように作成されているプログラムは、そのプログラムで使用する特権の「許可されたセット」を減らすことができます。特権「制限セット」は縮小できます。
有効特権セット (E) – 現在有効である特権の集合です。プロセスは、許可されたセット内の特権を有効セットに追加できます。プロセスは、E から特権を削除することもできます。
許可された特権セット (P) – 使用できる特権の集合です。プログラムは、継承または割り当てを通して特権を使用できます。実行プロファイルは、プログラムに特権を割り当てる方法の 1 つです。setuid コマンドは、root が持つすべての特権をプログラムに割り当てます。許可されたセットから特権を削除することはできますが、追加することはできません。P から削除された特権は、E からも自動的に削除されます。
特権を認識するプログラムは、そのプログラムがまったく使用することのない特権をそのプログラムの許可されたセットから削除します。この方法では、不要な特権がそのプログラムや悪質なプロセスによって悪用されることが防止されます。特権を認識するについての詳細は、Oracle Solaris 11 セキュリティー開発者ガイド の第 2 章特権付きアプリケーションの開発を参照してください。
継承可能な特権セット (I) – exec への呼び出しでプロセスが継承できる特権の集合です。exec への呼び出しのあと、継承された特権は許可されたセットと有効セット内に配置されるため、setuid プログラムという特殊なケースを除き、これらのセットが等しくなります。
setuid プログラムの場合は、exec への呼び出しのあと、継承可能セットがまず制限セットによって制限されます。続いて、継承された特権のセット (I) から制限セット (L) が除かれたものが、そのプロセスの P と E に割り当てられます。
制限特権セット (L) – プロセスとその子プロセスでどの特権が利用できるかを示す上限を定義する集合です。デフォルトでは、制限セットはすべての特権です。プロセスは制限セットを縮小することはできますが、制限セットを拡張することはできません。L は I の制限に使用されます。このため、L は exec の時点で P と E を制限します。
特権が割り当てられたプログラムを含むプロファイルがユーザーに割り当てられている場合、通常そのユーザーはそのプログラムを実行できます。未変更のシステムでは、プログラムの割り当て済み特権はユーザーの制限セットの範囲内です。プログラムに割り当てられている特権は、ユーザーの許可されたセットの一部になります。特権を割り当てられたプログラムを実行するには、ユーザーはプロファイルシェルからそのプログラムを実行する必要があります。
カーネルは、基本特権セットを認識します。変更されていないシステムの場合、各ユーザーの初期の継承可能セットはログイン時の基本セットと同じです。基本セットを変更することはできませんが、ユーザーが基本セットからどの特権を継承するかは変更できます。
未変更のシステムでは、ログイン時のユーザーの特権セットは次のようになります。
E (Effective): basic I (Inheritable): basic P (Permitted): basic L (Limit): all
ログイン時には各ユーザーの基本セットは、それぞれの継承可能セット、許可されたセット、および有効セットに含まれます。ユーザーの制限セットは、ゾーン (大域または非大域) のデフォルトの制限セットと同等です。
追加の特権をユーザー、正確にはユーザーのログインプロセスに直接割り当てるか、権利プロファイルを介して複数のユーザーに間接的に割り当てるか、またはユーザーに対して特権付きコマンドを割り当てることで間接的に割り当てることができます。また、ユーザーの基本セットから特権を削除できます。手順と例については、Chapter 3, Oracle Solaris での権利の割り当てを参照してください。