Trusted Solaris 管理の手順

プロセス、プログラム、その特権

プロセスは、実行可能プログラムが格納されているファイルから派生し、常にプログラムを実行しています。プロセスは、fork(2) システムコールを使用して作成されます。 fork(2) とは、呼び出し元プロセスの複製を作成するシステムコールです。こうして作成された新しいプロセスは、現在実行中のプログラムを含め、親の属性をすべて継承します。また、プロセスは、exec(2) システムコールを使用して、実行中のプログラムを変更することができます。このシステムコールには、プロセスのアドレス空間全体を、exec コールで指定されたプログラムファイルから派生した新しいバージョンに置き換える働きがあります。

たとえば、pfsh というプロファイルシェルを実行しているプロセスで exec を使用し、mount コマンドを実行することができます。

プロセス特権セット

各プロセスには、次の 4 種類の特権セットが割り当てられます。

プロセスが 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 通常のユーザーシェルで実行時に強制された特権を獲得するプロセス

Graphic

図 16-1 では、中央の四角形は programX を表し、このプログラムには、「強制された特権」と「許容された特権」があります。強制された特権は、1、3、5、許容された特権は、1、3、5、11、12、19 です。右側の円は、programX を実行するプロセスを表しています。ここでは、「許容セット」と「有効セット」に、プログラムファイルに割り当てられた「強制された特権」が与えられています。図 16-1 では、親プロセスが標準のシェルで、「継承可能な特権」はありません。そのため、新しいプロセスに割り当てられる特権セットには、プログラムファイルから獲得した「強制された特権」のみが含まれ、新しいプロセスの「継承可能セット」は空のままになっています。

プロファイルシェルの場合

図 16-2 は、ユーザーや役割アカウントが、プロファイルシェルで programY を実行する場合を表しています。

図 16-2 プロファイルシェルから特権を継承するプロセス

Graphic

上の図 1-2 では、プロファイルシェルは、どのユーザーまたは役割がコマンドを実行しているのかを確認し、そのコマンドがアカウントのプロファイルに含まれていることを確かめます。また、アカウントのプロファイルにそのコマンドに対する特権が指定されているかどうかを確認して、指定された特権だけを自分の「継承可能セット」に追加します。図に示すように、実行可能な programY 自体は「強制された特権」を持たず、「許容セット」には、10、12、19 が含まれています。programY の「許容セット」には 10、12、19 の 3 つの特権が含まれているため、programY を実行するプロセスは、親プロセスから特権 10、12、19 を継承し、プロセスの「有効セット」と「許可セット」には特権 10、12、19 が設定されます。

プログラムファイルの「許容セット」に特権がない場合、そのプログラムを実行するプロセスの「許可セット」と「有効セット」は、常に空になります。

mount コマンドを実行するプロセスが特権を獲得する方法

この節では、「Trusted Solaris で 2 つの標準プログラムが特権を使用する方法」で例に挙げた mount コマンドがプロファイルシェルのプロセスでどのように実行され、どのように特権を獲得するかを説明します。mount がプロファイルシェルで実行されるとき、pfsh を実行しているプロセスは、次の処理を行います。

mount のプロセスでは、「継承可能な特権」は、mount を呼び出したプロファイルシェルのプロセスの「継承可能な特権」と同じに設定されます。次に、mount のプログラムファイルの「強制された特権」と「許容された特権」が「継承可能セット」と組み合わされプロセスの許可された特権、「有効な特権」、「保存された特権」が決定します。

「許可セット」と「有効セット」を決定するためには、まず、プロセスの「継承可能な特権」と、プログラムファイルの「強制された特権」の中の追加特権とが組み合わされます。mount には、「強制された特権」がないため、ここではこの特権は適用されません。「継承可能な特権」と「強制された特権」の組み合わせは、プログラムファイルに指定されている「許容された特権」に制限されますが、mount プログラムファイルに「許容された特権」すべてがあるため、すべての「継承可能な特権」を使用することができます。その結果、mount を実行するプロセスの「許可セット」および「有効セット」は、「継承可能な特権」のセットと同じになります。

mount の「保存セット」には、「継承可能セット」と、mount のプログラムファイルの「強制された特権」および「許容された特権」が設定されます。

継承可能な特権が重要な理由

「継承可能な特権」については、「プロセス特権セット 」で詳しく説明しています。継承可能な特権がセキュリティ管理者役割にとって重要である理由は、特権の継承が次のように使用されるためです。

プログラムファイルが「許容された特権」を持っていない場合

プログラムファイルが「許容された特権」を持っていない場合、プログラムを実行するプロセスの「継承可能な特権セット」は、プログラムの「許容された特権」に合わせて削減されることがありません。「許容された特権」を持たないプログラムを実行するプロセスは、特権を使用することができません。これは、他のトラステッドプロセスから特権を継承したとしても、「有効セット」に特権を設定することができないからです。ただし、このようなプロセスは、「継承可能な特権」を他のプログラムに引き渡すことができます。そのプログラムが「許容された特権」を持っていれば、「継承可能な特権」を使用することができます。次の図を参照してください。

図 16-3 特権を使用できないプログラムが使用できるプログラムに特権を引き渡す 方法

Graphic

プログラムファイルが「強制された特権」を持っていない場合

プロセスの「継承可能セット」が、プログラムの「強制された特権」によって増加することはありません。シェルスクリプトの「強制された特権」が、強制特権シェルスクリプトで呼び出されたコマンドに渡されることはありません。つまり、標準の UNIX シェル sh(1)csh(1)ksh(1) で実行されるシェルスクリプトで特権が使用されることはありません。次の図を参照してください。

図 16-4 強制された特権シェルスクリプトが「強制された特権」をコマンドに渡さないようにする方法

Graphic