open(2) や creat(2) のような、パス名を受け入れる UNIX システムコールは、通常のパス名に代わって完全な装飾パス名が渡されないかぎり、プロセスと同じ機密ラベルの SLD をアクセスします。完全な装飾パス名には、次のコード例に示すように、MLD の装飾と SLD のディレクトリ名が入ります。プロセスは、mkdir(1) システムコールを使用しても、MLD または SLD 内にファイルやディレクトリを作成できません。
「セキュリティポリシー」で説明している必須アクセス権制御と任意アクセス権制御が適用されます。
次の例では、プロセスは認可上限 Top Secret を使用して Confidential で動作しています。この Confidential プロセスは、Top Secret の SLD にアクセスするためには、有効セットに file_mac_search 特権を必要とします。ファイルが書き込みのために開かれており、セキュリティポリシーによって上位書き込みが許容されるため、この処理がすべての任意アクセス検査の条件を満たすのであれば、ほかに必要な特権はありません。
#include <tsol/label.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> main() { int filedes; /* プロセスが実行されている SLD でファイルを開く */ filedes = open("/export/home/zelda/afile", O_WRONLY); printf("File descriptor for regular path = %d¥n", filedes); /* Top Secret の SLD でファイルを開く */ /* 有効セット内で file_mac_search をオン (有効) にする */ filedes = open("/export/home/.MLD.zelda/.SLD.3/afile", O_WRONLY); /* file_mac_search をオフ (無効) にする */ printf("File descriptor for adorned path = %d¥n", filedes); }
printf 文によって、次のように出力されます。
File descriptor for regular path = 3
File descriptor for adorned path = 4
次の例では、プロセスは認可上限 Top Secret を使用して Confidential で動作しています。 Confidential プロセスは、Top Secret の SLD にアクセスするためには、有効セットに file_mac_search 特権を必要とします。Top Secret SLD 内にまだ afile が存在しない場合、プロセスは file_mac_write 特権を必要とします。これは、このプロセスの機密ラベルが SLD の機密ラベルと同等でないためです。afile がすでに存在する場合は、file_mac_write 特権は必要ありません。
#include <tsol/label.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> main() { int filedes; /* プロセスが実行されている SLD でファイルを開く */ filedes = creat("/export/home/zelda/afile", 660); printf("File descriptor for regular path = %d¥n", filedes); /* Top Secret の SLD でファイルを作成する */ /* 有効セット内で file_mac_search をオン (有効) にする */ filedes = creat("/export/home/.MLD.zelda/.SLD.3/afile", 660); /* file_mac_search をオフ (無効) にする */ printf("File descriptor for adorned path = %d¥n", filedes); }
printf 文によって、次のように出力されます。
File descriptor for regular path = 3
File descriptor for adorned path = 4