Solaris Trusted Extensions 開発ガイド

マルチレベル操作

複数の機密レベルで実行される操作を作成する場合、次の問題を考慮する必要があります。

大域ゾーンのプロセスのみが指定ラベルでプロセスを開始できるので、複数の機密レベルで実行される操作は大域ゾーンによって制御されます。

大域ゾーンにおける下位書き込みポリシー

下位のラベルのオブジェクトを書き込むプロセスなどのサブジェクトの機能は「下位書き込み」と呼ばれます。大域ゾーンにおける下位書き込みポリシーは管理のために指定されます。大域ゾーンプロセスは ADMIN_HIGH ラベルで実行されるので、ほかのラベルに関連付けられている特定のファイルシステムは、大域ゾーンで読み取り/書き込みマウントが可能です。ただし、このような特別なファイルシステムマウントは、管理のための自動マウントマップで指定する必要があり、大域ゾーンオートマウンタによってマウントされなければなりません。このマウントには、エクスポートされたファイルシステムと同じラベルを持つゾーンのゾーンパス内にマウントポイントがなければなりません。そのマウントポイントは、ラベル付けされたゾーン内から可視ではあってはいけません。

たとえば、PUBLIC ゾーンに /zone/public のゾーンパスがある場合、/zone/public/home/mydir の書き込み可能なマウントポイントが許可されます。それに対し、/zone/public/root/home/mydir の書き込み可能なマウントポイントは、ラベル付けされたゾーンによってアクセスできるが、大域ゾーンによってはアクセスできないので許可されません。クロスゾーン NFS マウントは許可されません。すなわち、NFS マウントのファイルは、そのファイルシステムをマウントしたゾーンで実行されるプロセスによってのみアクセスできます。大域ゾーンプロセスは、標準の任意アクセス制御 (DAC) ポリシーに従って、そのようなファイルに下位書き込みできます。

ゾーンに関連付けられたローカルファイルシステムは、ファイル「アクセス権」とアクセス制御リスト (ACL) を使用する DAC によって、大域ゾーンプロセスによるアクセスから保護されます。各ゾーンのルート (/) ディレクトリの親ディレクトリは、root プロセスまたは file_dac_search 特権を表明するプロセスのみによってアクセス可能です。

一般に、大域ゾーンから下位書き込みできるかどうかは制限されています。下位書き込みが使用されるのは、通常、setflabel() インタフェースを使用してファイルが再格付けされる場合、または特権ユーザーが異なるゾーンでファイルマネージャーアプリケーション間をファイルをドラッグ&ドロップする場合のみです。

デフォルトのセキュリティー属性

デフォルトのセキュリティー属性は、ほかの「ホストタイプ」から Trusted Extensions ホストに届くメッセージに割り当てられます。この属性の割り当ては、ネットワークデータベースファイルの設定に従って行われます。ホストタイプ、サポートされるセキュリティー属性、およびネットワークデータベースファイルのデフォルト設定については、『Solaris Trusted Extensions 管理の手順』を参照してください。

デフォルトのネットワークポリシー

データを送受信するネットワーク操作の場合、デフォルトポリシーとして、ローカルプロセスと遠隔ピアが同じラベルを持っている必要があります。このポリシーは、ネットワークラベルが ADMIN_LOW である、大域ゾーンを含むすべてのゾーンに適用されます。ただし、このデフォルトのネットワークポリシーは、ファイルシステムをマウントするためのポリシーより柔軟性があります。Trusted Extensions には、デフォルトのネットワークポリシーを上書きするための管理インタフェースおよびプログラマチックインタフェースがあります。たとえば、システム管理者は、大域ゾーンまたはラベル付けされたゾーンに MLP を作成して、異なるラベルでの待機を可能にすることができます。

マルチレベルポート


注意 – 注意 –

マルチレベルポートを使用して MAC ポリシーに違反するには、十分な注意が必要です。このメカニズムを使用する場合、サーバーアプリケーションで MAC ポリシーが強制されていることを確認してください。


マルチレベルポート (MLP) は、tnzonecfg 管理データベースにリストされています。ゾーン内のプロセスは、net_bindmlp 特権を表明する場合、MLP にバインドできます。ポート番号が 1024 より小さい場合、net_privaddr 特権の表明が必要です。このバインドによって、プロセスは、バインドされる IP アドレスに関連付けられているすべてのラベルで接続を受け入れることができます。ネットワークインタフェースに関連付けるラベルは、tnrhdb データベースおよび tnrhtp データベースで指定します。ラベルの指定は、範囲、明示的列挙のラベル、または両方の組み合わせによって行えます。

MLP にバインドされている特権プロセスが TCP 要求を受信すると、要求元のラベルで応答が自動的に送信されます。UDP データグラムの場合、SO_RECVUCRED オプションによって指定されるラベルで応答が送信されます。

特権プロセスは、要求のラベルとほかのパラメータを比較することによって、より制限の多い MAC ポリシーを実装できます。たとえば、Web サーバーは、要求プロセスのラベルと URL で指定されるファイルのラベルを比較できます。getpeerucred() 関数を使用すると、遠隔ピアの資格が返されるので、遠隔ラベルを決定できます。同じホストのゾーンでピアが実行されている場合、ucred_get() ライブラリルーチンによって資格のフルセットが返されます。ピアがローカルであるか遠隔であるかにかかわらず、ucred_getlabel() 関数を使用することによって、ucred データ構造からピアのラベルにアクセスできます。このラベルは、bldominates() などの関数によってほかのラベルと比較できます。

ゾーンは単一レベルポートおよびマルチレベルポートにすることができます。「マルチレベルポートについて」を参照してください。

MAC 適用外ソケット

Trusted Extensions ソフトウェアには、下位ラベルの終端と通信するためにソケットを使用できるように指定する明示的なソケットオプション SO_MAC_EXEMPT があります。


注意 – 注意 –

SO_MAC_EXEMPT ソケットオプションは絶対に誤って使用しないでください。このソケットオプションを使用して MAC ポリシーを無効にする際には、十分に注意してください。このメカニズムを使用する場合、クライアントアプリケーションで MAC ポリシーが強制されていることを確認してください。


Trusted Extensions ソフトウェアは、SO_MAC_EXEMPT オプションの使用を次のように制限します。

詳細は、user_attr(4) のマニュアルページを参照してください。

ソケットがライブラリによって管理される場合など、このソケットオプションを明示的に設定するのは実用的でないことがあります。このような状況では、ソケットオプションを暗黙に設定できます。setpflags() システムコールによって、NET_MAC_EXEMPT プロセスフラグを設定できます。このプロセスフラグを設定するには、net_mac_exempt 特権も必要です。プロセスフラグが有効な間に開かれているすべてのソケットは、SO_MAC_EXEMPT ソケットオプションが自動的に設定されます。setpflags(2) および getpflags(2) のマニュアルページを参照してください。

変更または再コンパイルできないアプリケーションの場合、ppriv -M コマンドを使用して net_mac_exempt プロセスフラグをアプリケーションに渡します。この場合、そのアプリケーションによって開かれるすべてのソケットは SO_MAC_EXEMPT オプションが設定されます。ただし、アプリケーションの子プロセスには、このプロセスフラグや関連特権はありません。

SO_MAC_EXEMPT ソケットオプションを使用する必要がある場合、可能であれば必ずアプリケーションのソースコードを精査して修正してください。コードをそのように変更できない場合、またより安全な方法がない場合は、ppriv -M コマンドを使用することもできます。

SO_MAC_EXEMPT ソケットオプションは Solaris OS では多用されていません。このオプションは NFS クライアントによって使用されていました。NFS クライアントは、信頼できないオペレーティングシステムで異なるラベルで実行される NFS サーバーと通信する必要のある場合があります。NFS クライアントは MAC ポリシーを強制することによって、不適切な要求が認められないようにします。

Solaris OS では、NFS のサーバーコードとクライアントコードに MAC ポリシーが組み込まれて強制されるので、Solaris クライアントまたはサーバーと信頼できないクライアントまたはサーバーとの通信で MAC ポリシーが有効になります。信頼できないホストが Trusted Extensions を実行するシステムと通信できるようにするには、信頼できないホストのエントリが tnrhdb データベースにある必要があります。詳細は、『Solaris Trusted Extensions 管理の手順』「トラステッドネットワークデータベースの構成 (作業マップ)」を参照してください。


注 –

Trusted Extensions API を Solaris OS で使用する方法の例は、Solaris ソースコードを参照してください。OpenSolaris の Web サイト の左のナビゲーションバーにある「Source Browser」をクリックします。Source Browser を使用して Solaris のソースコードを検索します。