サンドボックスは、承認されたユーザーが、システムのほかのプロセスから保護されたアプリケーションを実行できる分離された環境です。サンドボックスは、ファイル、プロセス、および共有メモリーに対してセキュリティー上の分離を提供し、ファイル割り当て、メモリー割り当て、および CPU に対してリソース上の分離を提供します。
サンドボックスは軽量の環境です。 では、これらはラベルを使用して実装されます。サンドボックスは、その認可上限や特権などのアプリケーションのプロセス属性を制限することによってアプリケーションを分離します。標準ユーザーは sandbox コマンドを使用して、一時的なサンドボックスを作成できます。管理者は sandboxadm コマンドを使用して、特定のセキュリティー属性を持つ永続的な名前付きサンドボックスを作成できます。承認されたユーザーは sandbox コマンドを使用して、名前付きサンドボックスを作成できます。
名前付きサンドボックスは、それらの認可上限に対応する、階層化された無関係なプロパティーを持っています。たとえば、親サンドボックスは最大 4096 個の子サンドボックスを持つことができ、互いに分離されています。最大 8 個の無関係な親サンドボックスをシステムに作成できます。さらに、ほかのすべてのサンドボックスよりも優位な最上位の親サンドボックスを作成できます。名前付きサンドボックスは、関連付けられたユーザー ID、プライマリグループ ID および補助グループ ID、プロジェクトを持つこともできます。管理者には、名前付きサンドボックスを作成および構成するための Sandbox Management 権利プロファイルを割り当てる必要があります。
次の階層例では、CDBall-SandboxAll が最上位の親サンドボックスです。これには CDB1-SandboxAll および CDB2-SandboxAll という 2 つの無関係な子サンドボックスがあります。省略記号は最上位の親サンドボックスがさらに多くの子を持つことができることを示しています。それぞれの子サンドボックスは名前付きの子を持つことができ、最大 4096 個まで増やせます。最上位の親サンドボックスから子サンドボックスに移るにつれて、プロセス特権および認可上限が減少します。子サンドボックスは、最上位サンドボックスに付与された特権よりも少ない特権しか必要としない操作に使用されます。それぞれのサンドボックスはサンドボックスに関連付けられた固有のプロジェクト名を持つことができ、リソースを割り当てることができます。
図 4 サンドボックス階層の例
sandbox コマンドを使用すると、一時的なサンドボックスまたは名前付きサンドボックスのいずれかに入ることができます。このコマンドに特権はありませんが、呼び出しプロセスのセキュリティー属性はターゲットサンドボックスのセキュリティー属性と一貫性がなければなりません。たとえば、現在のプロセスの認可上限は、ターゲットサンドボックスの認可上限より優位である必要があります。サンドボックスに入る前に、ターゲットサンドボックスの方が優位となるラベルを持つディレクトリに現在の作業ディレクトリを設定するようにします。詳細は、sandbox(1) のマニュアルページを参照してください。
名前付きの親サンドボックスに入るには、現在の有効な UID が、ターゲットサンドボックスに割り当てられた UID と一致する必要があります。名前付きの子サンドボックスに入る前に、呼び出し側はその親サンドボックスに入ったことがなければなりません。サンドボックスに入ったあと、プロセスプロジェクトはそのサンドボックスのプロセスプロジェクトに設定され、認可上限はサンドボックスの認可上限に設定されます。詳細は、sandbox_create(3SANDBOX) のマニュアルページを参照してください。
名前付きサンドボックスを作成するには sandboxadm コマンドを使用します。このコマンドは、特殊バージョンのエンコーディングファイル「Sandbox Labels v1.0」と一緒に機能します。このファイルのインストールおよび使用については、sandboxadm(8) のマニュアルページを参照してください。
sandboxadm コマンドを使用して名前付きサンドボックスを作成する場合は、コマンドで指定する関係によって、適切な認可上限をサンドボックスに自動的に割り当てることができます。親サンドボックスは、そのいずれかの子サンドボックスを作成する前に作成される必要があります。親サンドボックスが指定された場合、新しいサンドボックスは、親サンドボックスの方が優位となる認可上限が割り当てられ、最上位サンドボックスを除くほかのすべてのサンドボックスと無関係になります。それぞれの子サンドボックスは固有のユーザー名を持つ必要がありますが、複数の親サンドボックスを同じユーザーが所有できます。この場合、そのユーザーの認可上限は、そのユーザーが所有するすべてのサンドボックスより優位となる認可上限に自動的に設定されます。
すべての名前付きサンドボックスには、サンドボックスに入ったときに自動的に適用される、同じ名前を持つ対応するプロジェクトがあります。名前付きサンドボックスに関連付けられたユーザーには、そのプロジェクトが自動的に割り当てられます。projmod コマンドによってリソース管理属性をサンドボックスに割り当てることができます。
子サンドボックス内のプロセスは、そのサンドボックス外のプロセスを監視できません。親サンドボックス内のプロセスは、自身のサンドボックスおよびその子のサンドボックス内のプロセスのみ監視できます。ファイルアクセスについても同様に、サンドボックスの認可上限によって優位となるファイルとディレクトリのみが認識されるように制限されています。shmctl システム呼び出しによってラベルが付けられた共有メモリーも、個々のサンドボックスに分離できます。
名前付きサンドボックスは、承認されたユーザーにデフォルトで割り当てられる特権レベルが不要な操作を実行するとき、これらのユーザーがログインできる永続的なサンドボックスを提供します。サンドボックス用ではない名前付き環境では、承認されたユーザーは sandbox コマンドを使用してサンドボックスを作成し、低い認可上限でアプリケーションまたはプロセスを実行できますが、これらのサンドボックスはセッションを閉じたあとに残りません。
永続的な名前付きサンドボックスの場合、特殊なラベルエンコーディングファイルを構成する必要があります。そのあと、管理者またはサンドボックスへのアクセスが承認されたユーザーが、サンドボックスのラベルでファイルシステム上のディレクトリを作成する必要があります。サンドボックスには 1 人のユーザーのみがアクセスでき、サンドボックスはそのユーザーのための分離された環境です。ラベル付きのディレクトリおよびファイルシステムの作成については、Oracle Solaris 12 でのファイルのセキュリティー保護とファイル整合性の検証 の 第 2 章, データ損失保護のためのファイルのラベル付けを参照してください。