Trusted Solaris 開発ガイド

セキュリティポリシー

Trusted Solaris 7 上で機密情報の保護、管理、配布がどのように行われるべきかを規定する規則と実用上のガイドラインを「セキュリティポリシー」と言います。Trusted Solaris 7 アプリケーションは、Solaris 7 アプリケーションとは異なり、必須アクセス制御 (MAC) を必要とし、スーパーユーザーにすべての権限が与えられているわけではありません。一方、Solaris 7 アプリケーションが必要なのは任意アクセス制御 (DAC) だけであり、スーパーユーザーにすべての権限が与えられています。

Trusted Solaris 7 は、プロセスに特権を持たせることにより、必須アクセス制御に基づいた読み取り、書き込み、検索の制限、および任意アクセス制御に基づいた読み取り、書き込み、実行、検索の制限を、特権を持つプロセスに対して無効にすることができます。また、特権を設定することで、通常スーパーユーザーのみが実行できるセキュリティ関連の特殊な処理を実行することもできます。

任意アクセスポリシー

Trusted Solaris 7 は、ユーザー、グループ、その他などのアクセス権ビットを使用した任意アクセス制御に基づいた読み取り、書き込み、実行、検索の許可、およびアクセス制御リスト (ACL) をサポートしています。任意アクセス制御とアクセス制御リストによるアクセス制御は Solaris 7 の機能の一部であり、このマニュアルでは詳細については説明していません。アクセス制御リストをファイルシステムのセキュリティ属性として取得する方法は第 2 章「プログラミングインタフェースの概要」を、また任意アクセス制御ポリシーの概要は 「任意アクセス」を参照してください。

必須アクセスポリシー

Trusted Solaris 7 は、必須検索、読み取り、および書き込み操作をサポートしています。プロセスの機密ラベルと認可上限を、そのプロセスがアクセスしようとしているオブジェクトの機密ラベルと比較することにより、MAC が実施されます。オブジェクトに課された MAC ポリシーと比較の結果により、アクセスが認められるか拒否されるかが決定します。

比較の結果、一方が他方に対し優位であるか同等であるかが示され、プロセスの機密ラベルとオブジェクトの機密ラベルの関係が明らかになります。優位と同等の関係の詳細は、第 5 章「ラベル」を参照してください。次に概要を示します。

比較結果は、プロセス認可上限とオブジェクトの機密ラベル間の関係も、優位または同等のいずれかで示します。アクセス操作がオブジェクトの CMW ラベルを変更する場合は、認可上限は機密ラベル部を変更できる最高のレベルに設定します。アクセス操作が上位書き込み (「書き込みアクセス」の項を参照) の場合は、認可上限はプロセスが書き込める最高のレベルに設定します。

Trusted Solaris 7 は、次に示すような、特権を持たないプロセスと、そのプロセスがアクセスするオブジェクト間における必須アクセス制御に基づいた読み取りと書き込み操作をサポートします。オブジェクトに対するこれらの操作の適用の詳細は、「ポリシーの運用」を参照してください。

読み取りアクセス

Trusted Solaris 7 の必須読み取りアクセスの定義には、同位読み取りと下位読み取りがあります。

書き込みアクセス

Trusted Solaris 7 の必須書き込みアクセスの定義には、同位書き込みと上位書き込みがあります。

特権を使用する場合

アプリケーションが特権なしで実行できるかどうかを調べるには、どの処理がどの特権をいつ必要とするかを知る必要があります。次に、アプリケーションに必要な特権を決定するガイドラインを示します。

特権の詳細を述べたマニュアルページの出力方法については、付録 A 「プログラマーズリファレンス」を参照してください。

管理アプリケーションとユーザーアプリケーション

管理アプリケーションは、管理用の機密ラベル ADMIN_HIGH または ADMIN_LOW で動作します。ADMIN_HIGH では、管理アプリケーションは、任意アクセス権のあるすべてのオブジェクトに対し下位読み取りができます。また、ADMIN_LOW では、任意アクセス権のあるすべてのオブジェクトに対し、上位書き込みができます。管理者は、通常、下位読み取り操作を実行する場合は、アプリケーションを ADMIN_HIGH で起動し、上位書き込み操作を実行する場合は、同じアプリケーションを ADMIN_LOW で起動します。これらの場合、アプリケーションに任意アクセス権があるかぎり、特権は必要ありません。

ラベルを ADMIN_HIGHADMIN_LOW に初期化する方法は、第 6 章「ラベルのコード例」「バイナリラベルの初期化と型のチェック」を参照してください。

ユーザーは、通常、アプリケーションを一定の機密ラベルで起動し、同じ機密ラベルのオブジェクトにアクセスします。別の機密ラベルでデータを保持する場合は、通常、ワークスペースの機密ラベルを変更して、この新しい機密ラベルでアプリケーションを起動します。この場合、アプリケーションに任意アクセス権があれば、特権は必要ありません。

ユーザーアプリケーションが、アプリケーションが動作している機密ラベルとは異なる機密ラベルのオブジェクトにアクセスするように設計されている場合で、必須アクセスが拒否された場合は、そのアプリケーションには特権が必要な場合があります。

必須アクセス制御の適用の回避またはプロセスやオブジェクトの機密ラベルの変更を行う特権を使用する上でのガイドラインは、第 5 章「ラベル」「ラベルのガイドライン」を参照してください。

ポリシーの運用

UNIX では、すべての入出力はファイルインタフェースを介して行われるため、ファイルシステムのセキュリティポリシーは、Trusted Solaris 7 全体に適用されます。

ここでは、ファイルシステムのセキュリティポリシーの次の点について説明します。

プロセス間通信 (IPC) のセキュリティポリシーについては、アクセスするプロセスとアクセスされるプロセス間の必須の読み取りアクセスおよび書き込みアクセスのチェックについて説明します。一部の IPC 機構と X ウィンドウシステムオブジェクトはファイルを使用しているので、この節で説明するファイルシステムのセキュリティポリシーがそれらの操作にも適用されます。IPC 機構によっては、下位読み取りと上位書き込みのセキュリティポリシーを持つものがあります。また、制限の強い同位読み取りと同位書き込みポリシーを持つ IPC 機構もあります。X ウィンドウシステムは、同位書き込みと下位読み取りポリシーを持ちます。特定のセキュリティポリシー情報については、次に示す章を参照してください。

ファイルシステムのセキュリティポリシー

この節では、次に示すファイルオブジェクトに対する必須アクセスチェックと任意アクセスチェックについて説明します。

任意アクセス

プロセスの所有者には、目的のオブジェクトが含まれているパス内のすべてのディレクトリに対する任意検索 (実行) 権がなければなりません。目的のオブジェクトに到達すると、アクセス操作は次のように実行できます。

必須アクセス

任意アクセス制御 (DAC) チェックが済むと、目的のファイルが含まれているパス内のすべてのディレクトリについて、必須検索アクセスが必要となります。ディレクトリに対する必須検索アクセスは、プロセスの機密ラベルがパス内のすべてのディレクトリの機密ラベルより優位な場合に与えられます。目的のファイルに到達すると、アクセス操作は次のように実行されます。

ファイルシステムのアクセス特権

ファイルシステムオブジェクトに対する任意または必須のアクセスチェックが失敗した場合、プロセスは、セキュリティポリシーの適用を回避する特権を表明できます。また、現行のラベル、またはユーザーに対してその処理を許容すべきでない場合は、エラーを出すことができます。

任意アクセスは、次のように有効になります。

必須アクセスは、次のように有効になります。

アクセスチェックが実行される場合

必須アクセスチェックと任意アクセスチェックは、ファイルシステムオブジェクトが開かれるときにパス名に対して実行されます。ほかのシステムコールでそのファイル記述子が使用される場合、それ以上アクセスチェックは行われません。ただし、次の場合を除きます。

ファイルシステムポリシーの例

この節の例は、読み取り、書き込み、検索、実行操作のため、プロセスがファイルシステムオブジェクトにアクセスする場合に考慮すべき事項を示しています。

この例では、プロセスが、読み取りと書き込みで /export/home/heartyann/somefile にアクセスし、実行で /export/home/heartyann/filetoexec にアクセスすることを想定します。両方のファイルとも Confidential で保護されています。プロセスの機密ラベルは Secret で、プロセス認可上限は Top Secret です。Confidential は Secret よりも低く、Secret は Top Secret よりも低いラベルです。

機密ラベル

次の図に示すように、パス /export/home の機密ラベルは ADMIN_LOW で、heartyann ディレクトリと somefile の機密ラベルは Confidential です。

図 1-1 ファイルシステムオブジェクトのアクセス

Graphic

プロセスが必須または任意のアクセスチェックに失敗した場合は、プログラムはエラーを表明するか、適切な特権を表明する必要があります。

アクセス制御の適用を回避するため特権を使用する場合の機密ラベルの処理の詳細は、第 5 章「ラベル」「ラベルのガイドライン」を参照してください。

ファイルを開く

Secret プロセスは、読み取りのために somefile を開いて読み取り操作を実行し、このファイルを閉じます。Confidential の /export/home/heartyann シングルレベルディレクトリ内の somefile がアクセスされるように、完全な装飾パス名が使用されます。

完全な装飾パス名は、マルチレベルディレクトリの装飾方法を使用し、どのシングルレベルディレクトリが必要か正確に指定します。代わりに通常のパス名が使用されると、プロセスが Secret で動作しているため Secret のシングルレベルディレクトリがアクセスされます。

完全な装飾パス名の詳細は、「装飾名」を参照してください。マルチレベルとシングルレベルのディレクトリを処理するインタフェースの詳細は、第 8 章「マルチレベルディレクトリ」で説明します。次の例では、わかりやすさのために使われている完全装飾パス名がハードコードされていますが、この方法は第 8 章「マルチレベルディレクトリ」では使いません。

#include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>

 main()
 {
 	int			filedes, retval;
 	ssize_t			size;
 	char			readbuf[1024];
 	char			*buffer = "Write to File.";
 	char			*file = "/export/home/.MLD.heartyann/.SLD.1/filetoexec";
 	char			*argv[10] = {"filetoexec"};

 	filedes = open("/export/home/.MLD.heartyann/.SLD.1/somefile", O_RDONLY);
 	size = read(filedes, readbuf, 29);
 	retval = close(filedes);

ファイルへの書き込み

Secret プロセスは、Confidential の /export/home/heartyann シングルレベルディレクトリ内での書き込みのために somefile を開き、書き込み操作を実行し、このファイルを閉じます。

filedes = open("/export/home/.MLD.heartyann/.SLD.1/somefile", O_WRONLY);
 size = write(filedes, buffer, 14);
 retval = close(filedes);

ファイルの実行

Secret プロセスは、Confidential の /export/home/heartyann シングルレベルディレクトリ内の実行可能ファイルを実行します。

	retval = execv(file, argv);
 }