Solaris Trusted Extensions 開発ガイド

Trusted Extensions セキュリティーポリシー

機密ラベルはデータへのアクセスを制御し、データの格付けを管理します。すべてのプロセスおよびオブジェクトには、MAC の決定に使用される機密ラベルがあります。ラベルは、システムセキュリティーポリシーによって解釈される属性です。「システムセキュリティーポリシー」は、システムで処理される情報を保護するためにシステムソフトウェアによって強制される一連の規則です。

このあとの節で、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 のソースコードを検索します。


ゾーンとラベル

Trusted Extensions が設定されているシステムのすべてのオブジェクトは、ゾーンに関連付けられています。そのゾーンは「ラベル付けされたゾーン」と呼ばれます。ラベル付けされたゾーンは非大域ゾーンであり、一般ユーザーがアクセスできます。複数のラベルでクリアされるユーザーは、その各ラベルでゾーンにアクセスすることができます。

大域ゾーン」は、システムのセキュリティーポリシーを制御するファイルおよびプロセスを含む特別なゾーンです。大域ゾーンのファイルには、役割および特権プロセスのみがアクセスできます。

大域ゾーンのラベル

大域ゾーンはラベルの範囲に割り当てられます。その範囲は ADMIN_LOW から ADMIN_HIGH までです。ADMIN_HIGHADMIN_LOW は「管理ラベル」です。

ほかのゾーンと共有される大域ゾーンのオブジェクトには ADMIN_LOW ラベルが割り当てられます。たとえば、/usr/sbin、および/lib ディレクトリのファイルには ADMIN_LOW ラベルが割り当てられます。これらのディレクトリとその内容はすべてのゾーンで共有されます。これらのファイルおよびディレクトリは、通常、パッケージからインストールされ、パッケージまたはパッチの手順の場合を除いて一般に変更されません。ADMIN_LOW ファイルを変更するには、通常、プロセスがスーパーユーザーによって、またはすべての特権を持つユーザーによって実行される必要があります。

大域ゾーン専用の情報には ADMIN_HIGH ラベルが割り当てられます。たとえば、大域ゾーンのすべてのプロセス、および /etc ディレクトリのすべての管理ファイルには ADMIN_HIGH ラベルが割り当てられます。役割に関連付けられているホームディレクトリには ADMIN_HIGH ラベルが割り当てられます。ユーザーに関連付けられているマルチレベル情報にも ADMIN_HIGH ラベルが割り当てられます。「マルチレベル操作」を参照してください。大域ゾーンへのアクセスは制限されています。システムサービスおよび管理役割のみが大域ゾーンのプロセスを実行できます。

ラベル付けされたゾーン

非大域ゾーンは「ラベル付けされたゾーン」と呼ばれます。ラベル付けされたゾーンにはそれぞれ固有のラベルがあります。ラベル付けされたゾーン内のすべてのオブジェクトのラベルは同じです。たとえば、ラベル付けされたゾーンで実行されるすべてのプロセスのラベルは同じです。ラベル付けされたゾーンの書き込み可能なすべてのファイルのラベルも同じです。複数のラベルでクリアされるユーザーは、ラベル付けされたゾーンに各ラベルでアクセスできます。

Trusted Extensions は、ゾーン用のラベル API のセットを定義します。次の API は、ラベル付けされたゾーンに関連付けられているラベル、およびゾーン内のパス名を取得します。

これらの API の詳細は、「ゾーンのラベルへのアクセス」を参照してください。

ファイルのラベルは、ゾーンのラベル、またはファイルを所有するホストのラベルに基づきます。したがって、ファイルの再ラベル付けを行う場合、該当するラベル付けされたゾーンまたはラベル付けされたホストにファイルを移動する必要があります。ファイルの再ラベル付けのプロセスは、ファイルの「再格付け」とも呼ばれます。setflabel() ライブラリルーチンは、ファイルを移動することによってファイルの再ラベル付けを行います。ファイルの再ラベル付けのためには、プロセスが file_upgrade_sl 特権または file_downgrade_sl 特権を表明する必要があります。getlabel(2) および setflabel(3TSOL) のマニュアルページを参照してください。

特権の設定に関する詳細は、『Solaris セキュリティーサービス開発ガイド』の第 2 章「特権付きアプリケーションの開発」を参照してください。