プロセスは、実行可能プログラムが格納されているファイルから派生し、常にプログラムを実行しています。プロセスは、fork(2) システムコールを使用して作成されます。 fork(2) とは、呼び出し元プロセスの複製を作成するシステムコールです。こうして作成された新しいプロセスは、現在実行中のプログラムを含め、親の属性をすべて継承します。また、プロセスは、exec(2) システムコールを使用して、実行中のプログラムを変更することができます。このシステムコールには、プロセスのアドレス空間全体を、exec コールで指定されたプログラムファイルから派生した新しいバージョンに置き換える働きがあります。
たとえば、pfsh というプロファイルシェルを実行しているプロセスで exec を使用し、mount コマンドを実行することができます。
各プロセスには、次の 4 種類の特権セットが割り当てられます。
許可セット (P)
有効セット (E)
継承可能セット (I)
exec(2) によって新しい別のプログラムが呼び出された際に、新しいプロセスに引き渡す特権のセットです。
新しいプログラムを呼び出すとき、継承可能特権セットは最初、現在のプログラムを呼び出したプロセスと同じ継承可能特権に設定されます。
I[new]=I[old] |
保存セット (S)
「保存セット (S)」には、最初は、「既存の継承可能セット」とファイルの「許容された特権」に共通する特権が設定されます。
S=(I[process] intersected by A) |
プロセスが execve(2) システムコールを使用してプログラムを実行すると、「許可セット (P)」と「有効セット (E)」は、プログラムファイルの「許容された特権 (A)」、「強制された特権 (F)」、プロセスの以前に存在していた「継承可能な特権 (I)」のすべてを集めた特権のセットになります。
P=E=(I[process] union F[program] restricted by A[program]) |
実行中のプログラムの「強制された特権」または「許容された特権」を参照せずに「継承可能な特権」を設定する利点については、「継承可能な特権が重要な理由 」を参照してください。
setuid(2) によって元の UID とは異なる実効 UID が設定された場合、「有効セット (E)」が「保存セット (S)」にコピーされ、「有効セット (E)」は消去されます。
S=E; E=0 |
プロセスが実効ユーザー ID を元の値に戻すと、「保存セット (S)」が「有効セット (E)」にコピーされ、特権の状態が復元されます。
E=S |
次の例では、プログラムの実行時にプロセスが特権を獲得する方法を標準の UNIX シェルの場合とプロファイルシェルの場合で比較しています。標準の UNIX シェルで実行される場合、プログラムのプロセスが使用できるのは、プログラムの「強制セット」と「許容セット」両方に (共通に) 含まれる特権だけです。プロファイルシェルで実行される場合、プログラムのプロセスは、シェルの「継承可能セット」から特権を獲得し、このうちプログラム自身の「許容セット」と共通の特権を使用することができます。説明を簡潔にするため、例の中では、特権には、名前ではなく番号が割り当てられています。
図 16-1 の左側の円は標準の UNIX シェルのプロセスを表しています。ここで、ユーザーは programX というコマンドを入力します。シェルのプロセスのものとして示される継承可能セットは、空 (null) になっています。これは、標準シェルのプロセスが特権を持っていないためです。
図 16-1 では、中央の四角形は programX を表し、このプログラムには、「強制された特権」と「許容された特権」があります。強制された特権は、1、3、5、許容された特権は、1、3、5、11、12、19 です。右側の円は、programX を実行するプロセスを表しています。ここでは、「許容セット」と「有効セット」に、プログラムファイルに割り当てられた「強制された特権」が与えられています。図 16-1 では、親プロセスが標準のシェルで、「継承可能な特権」はありません。そのため、新しいプロセスに割り当てられる特権セットには、プログラムファイルから獲得した「強制された特権」のみが含まれ、新しいプロセスの「継承可能セット」は空のままになっています。
図 16-2 は、ユーザーや役割アカウントが、プロファイルシェルで programY を実行する場合を表しています。
上の図 1-2 では、プロファイルシェルは、どのユーザーまたは役割がコマンドを実行しているのかを確認し、そのコマンドがアカウントのプロファイルに含まれていることを確かめます。また、アカウントのプロファイルにそのコマンドに対する特権が指定されているかどうかを確認して、指定された特権だけを自分の「継承可能セット」に追加します。図に示すように、実行可能な programY 自体は「強制された特権」を持たず、「許容セット」には、10、12、19 が含まれています。programY の「許容セット」には 10、12、19 の 3 つの特権が含まれているため、programY を実行するプロセスは、親プロセスから特権 10、12、19 を継承し、プロセスの「有効セット」と「許可セット」には特権 10、12、19 が設定されます。
プログラムファイルの「許容セット」に特権がない場合、そのプログラムを実行するプロセスの「許可セット」と「有効セット」は、常に空になります。
この節では、「Trusted Solaris で 2 つの標準プログラムが特権を使用する方法」で例に挙げた mount コマンドがプロファイルシェルのプロセスでどのように実行され、どのように特権を獲得するかを説明します。mount がプロファイルシェルで実行されるとき、pfsh を実行しているプロセスは、次の処理を行います。
コマンドを呼び出したユーザーのプロファイルに mount コマンドがあることをチェックする
sys_mount 特権と、呼び出し元のユーザーのプロファイルに含まれるその他の特権を、pfsh の「継承可能セット」に指定する
exec を呼び出して、mount コマンドを実行する
mount のプロセスでは、「継承可能な特権」は、mount を呼び出したプロファイルシェルのプロセスの「継承可能な特権」と同じに設定されます。次に、mount のプログラムファイルの「強制された特権」と「許容された特権」が「継承可能セット」と組み合わされプロセスの許可された特権、「有効な特権」、「保存された特権」が決定します。
「許可セット」と「有効セット」を決定するためには、まず、プロセスの「継承可能な特権」と、プログラムファイルの「強制された特権」の中の追加特権とが組み合わされます。mount には、「強制された特権」がないため、ここではこの特権は適用されません。「継承可能な特権」と「強制された特権」の組み合わせは、プログラムファイルに指定されている「許容された特権」に制限されますが、mount プログラムファイルに「許容された特権」すべてがあるため、すべての「継承可能な特権」を使用することができます。その結果、mount を実行するプロセスの「許可セット」および「有効セット」は、「継承可能な特権」のセットと同じになります。
mount の「保存セット」には、「継承可能セット」と、mount のプログラムファイルの「強制された特権」および「許容された特権」が設定されます。
「継承可能な特権」については、「プロセス特権セット 」で詳しく説明しています。継承可能な特権がセキュリティ管理者役割にとって重要である理由は、特権の継承が次のように使用されるためです。
プロファイルシェルで呼び出されたコマンドに特権を引き渡すプロファイル機構
システムシェルで、呼び出されたコマンドに特権を引き渡す
ウィンドウシステムのトラステッドプロセス で、アクションに特権を引き渡す
「プロセス特権セット 」で説明したように、プロセスが新しいプログラムを実行する場合、プロセスの新しい「継承可能な特権セット」は、新しいプログラムが実行される前のプロセスの古い「継承可能な特権」セットと同じに設定されます (I[new]=I[old])。その結果、あるプログラムから他のプログラムに引き渡すことが可能な「継承可能な特権」は、現在実行中のプログラムの「強制された特権」や「許容された特権」の影響を受けません。プログラムファイルの「強制セット」や「許容セット」を参照せずに「継承可能セット」を保守することには、次の 2 つの利点があります。
「許容された特権」を参照せずに I[new]=I[old] を設定すると、特権を使用できないプログラムを実行しているプロセスから特権を使用できるプロセスに特権を引き渡すことができる
詳細については、「プログラムファイルが「許容された特権」を持っていない場合」を参照してください。
「強制された特権」を参照せずに I[new]=I[old] を設定すると、「強制された特権」がシェルスクリプトによって使用されない
詳細については、「プログラムファイルが「強制された特権」を持っていない場合」を参照してください。
プログラムファイルが「許容された特権」を持っていない場合、プログラムを実行するプロセスの「継承可能な特権セット」は、プログラムの「許容された特権」に合わせて削減されることがありません。「許容された特権」を持たないプログラムを実行するプロセスは、特権を使用することができません。これは、他のトラステッドプロセスから特権を継承したとしても、「有効セット」に特権を設定することができないからです。ただし、このようなプロセスは、「継承可能な特権」を他のプログラムに引き渡すことができます。そのプログラムが「許容された特権」を持っていれば、「継承可能な特権」を使用することができます。次の図を参照してください。
プロセスの「継承可能セット」が、プログラムの「強制された特権」によって増加することはありません。シェルスクリプトの「強制された特権」が、強制特権シェルスクリプトで呼び出されたコマンドに渡されることはありません。つまり、標準の UNIX シェル sh(1)、csh(1)、ksh(1) で実行されるシェルスクリプトで特権が使用されることはありません。次の図を参照してください。