Trusted Solaris 開発ガイド

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

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

この例では、プロセスが、読み取りと書き込みで /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);
 }