UNIX では、すべての入出力はファイルインタフェースを介して行われるため、ファイルシステムのセキュリティポリシーは、Trusted Solaris 7 全体に適用されます。
ここでは、ファイルシステムのセキュリティポリシーの次の点について説明します。
プロセスと目的のオブジェクトが含まれているパス名の間の、必須アクセスチェックと任意アクセスチェック
プロセスと目的のオブジェクト間の、必須アクセスチェックと任意アクセスチェック
プロセス間通信 (IPC) のセキュリティポリシーについては、アクセスするプロセスとアクセスされるプロセス間の必須の読み取りアクセスおよび書き込みアクセスのチェックについて説明します。一部の IPC 機構と X ウィンドウシステムオブジェクトはファイルを使用しているので、この節で説明するファイルシステムのセキュリティポリシーがそれらの操作にも適用されます。IPC 機構によっては、下位読み取りと上位書き込みのセキュリティポリシーを持つものがあります。また、制限の強い同位読み取りと同位書き込みポリシーを持つ IPC 機構もあります。X ウィンドウシステムは、同位書き込みと下位読み取りポリシーを持ちます。特定のセキュリティポリシー情報については、次に示す章を参照してください。
第 11 章「プロセス間通信」では、同じホスト上のプロセス間通信とネットワークを介したプロセス間通信のセキュリティポリシーについて説明します。
第 15 章「トラステッド X ウィンドウシステム」では、X11 ウィンドウのプロパティとリソースデータに対するアクセスのセキュリティポリシーについて説明します。
この節では、次に示すファイルオブジェクトに対する必須アクセスチェックと任意アクセスチェックについて説明します。
ディレクトリ - 通常のディレクトリとマルチレベルディレクトリ
ファイル - 通常のファイル、実行可能ファイル、デバイス特殊ファイル、シンボリックリンク
プロセスの所有者には、目的のオブジェクトが含まれているパス内のすべてのディレクトリに対する任意検索 (実行) 権がなければなりません。目的のオブジェクトに到達すると、アクセス操作は次のように実行できます。
ファイルからの読み取りまたはディレクトリ内容の表示 - プロセスに、オブジェクトのパス内のすべてのディレクトリに対する任意検索 (実行) アクセスと、オブジェクトに対する任意読み取りアクセスがある場合、任意読み取りを実行できます。
ファイルに対する書き込み、ファイルまたはディレクトリの作成、ファイルまたはディレクトリの削除 - プロセスに、オブジェクトのパス内のすべてのディレクトリに対する任意検索 (実行)アクセスと、オブジェクトに対する任意書き込みアクセスがある場合、任意書き込みを実行できます。
実行可能ファイル - プロセスに、ファイルのパス内のすべてのディレクトリに対する任意検索 (実行) アクセスと、ファイルに対する任意実行アクセスがある場合、任意実行を実行できます。
任意アクセス制御 (DAC) チェックが済むと、目的のファイルが含まれているパス内のすべてのディレクトリについて、必須検索アクセスが必要となります。ディレクトリに対する必須検索アクセスは、プロセスの機密ラベルがパス内のすべてのディレクトリの機密ラベルより優位な場合に与えられます。目的のファイルに到達すると、アクセス操作は次のように実行されます。
ファイルからの読み取り、ファイルの実行、ディレクトリ内容の一覧、ファイルのセキュリティ属性の表示、セキュリティ属性フラグの表示 - プロセスにパス内のすべてのディレクトリに対する必須検索アクセスがあり、プロセスの機密ラベルが目的のオブジェクトの機密ラベルより優位な場合は、必須読み取りを実行できます。目的のオブジェクトがデバイス専用ファイルの場合、プロセスの機密ラベルはデバイスの機密ラベルと同等でなければなりません。
ファイルへの書き込み、セキュリティ属性の変更、ファイルセキュリティ属性フラグの変更、ファイルの削除 - プロセスにパス内のすべてのディレクトリに対する任意検索アクセスと必須検索アクセスがあり、ファイルの機密ラベルがプロセスの機密ラベルより優位な場合は、必須書き込みを実行できます。目的のオブジェクトがデバイス専用ファイルの場合、プロセスの機密ラベルはデバイスの機密ラベルと同等でなければなりません。
ファイルまたはディレクトリの作成 - 作成アクセスは同位書き込みです。プロセスがファイル、ディレクトリ、シンボリックリンクを作成する場合、プロセスの機密ラベルはファイルまたはディレクトリの機密ラベルと同等でなければなりません。
ファイルシステムオブジェクトに対する任意または必須のアクセスチェックが失敗した場合、プロセスは、セキュリティポリシーの適用を回避する特権を表明できます。また、現行のラベル、またはユーザーに対してその処理を許容すべきでない場合は、エラーを出すことができます。
任意アクセスは、次のように有効になります。
目的のファイルシステムオブジェクトが含まれるパス内のすべてのディレクトリに対する検索アクセスは、プロセスが file_dac_search 特権を表明する場合に有効になります。
目的のオブジェクトに対する読み取りアクセスは、プロセスが file_dac_read 特権を表明する場合に有効になります。
目的のオブジェクトに対する書き込みアクセスは、プロセスが file_dac_write 特権を表明する場合に有効になります。
目的のオブジェクトに対する実行アクセスは、プロセスが file_dac_execute 特権を表明する場合に有効になります。
必須アクセスは、次のように有効になります。
目的のファイルシステムオブジェクトに含まれるパス内のすべてのディレクトリに対する検索アクセスは、プロセスが file_mac_search 特権を表明する場合に有効になります。
目的のオブジェクトに対する実行アクセスを含む読み取りアクセスは、プロセスが file_mac_read 特権を表明する場合に有効になります。
目的のオブジェクトに対する書き込みアクセスは、プロセスが file_mac_write 特権を表明する場合に有効になります。
目的のオブジェクトに対する作成アクセスは、プロセスが file_mac_write 特権を表明する場合に有効になります。
必須アクセスチェックと任意アクセスチェックは、ファイルシステムオブジェクトが開かれるときにパス名に対して実行されます。ほかのシステムコールでそのファイル記述子が使用される場合、それ以上アクセスチェックは行われません。ただし、次の場合を除きます。
ファイルが書き込みのために開かれ、その後記述子が読み取りのために fstat(2) システムコールで使用される。この場合、読み取りに対してアクセスチェックが行われ、アクセスが拒否される場合には特権が必要になる場合があります。
ファイルが読み取りのために開かれ、その後記述子が書き込みのために fchmod(2) システムコールで使用される。この場合、書き込みアクセスに対してアクセスチェックが行われ、アクセスが拒否される場合には特権が必要になる場合があります。
この節の例は、読み取り、書き込み、検索、実行操作のため、プロセスがファイルシステムオブジェクトにアクセスする場合に考慮すべき事項を示しています。
この例では、プロセスが、読み取りと書き込みで /export/home/heartyann/somefile にアクセスし、実行で /export/home/heartyann/filetoexec にアクセスすることを想定します。両方のファイルとも Confidential で保護されています。プロセスの機密ラベルは Secret で、プロセス認可上限は Top Secret です。Confidential は Secret よりも低く、Secret は Top Secret よりも低いラベルです。
次の図に示すように、パス /export/home の機密ラベルは ADMIN_LOW で、heartyann ディレクトリと somefile の機密ラベルは Confidential です。
このプロセスは、somefile と somefile のパス内のディレクトリの所有権は持っていません。
/export に対する任意アクセス権によって、所有者とグループには読み取り、書き込み、検索の権限が与えられ、その他のユーザーには読み取りと検索の権限が与えられます。
/export/home に対する任意アクセス権によって、所有者には読み取り、書き込み、検索の権限が与えられ、グループとその他のユーザーには読み取りと検索の権限が与えられます。
/export/home/heartyann に対する任意アクセス権によって、所有者とグループには読み取り、書き込み、検索の権限が与えられ、その他のユーザーには読み取りと検索の権限が与えられます。
somefile に対する任意アクセス権によって、所有者には読み取りと書き込みの権限が与えられ、グループとその他のユーザーには読み取り権だけが与えられます。
filetoexec に対する任意アクセス権によって、所有者には読み取り、書き込み、実行の権限が与えられ、グループとその他のユーザーには読み取りと実行の権限が与えられます。
プロセスが必須または任意のアクセスチェックに失敗した場合は、プログラムはエラーを表明するか、適切な特権を表明する必要があります。
アクセス制御の適用を回避するため特権を使用する場合の機密ラベルの処理の詳細は、第 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);
open(2) システムコールに対する必須アクセスチェック - プロセスは /export/home/heartyann に対する必須検索アクセスと、somefile に対する必須読み取りアクセスを必要とします。このプロセスは Secret で動作しているので、両方の必須アクセスチェックの条件を満たしています。
open(2) システムコールに対する任意アクセスチェック - プロセスは /export/home/heartyann に対する任意検索アクセスと、somefile に対する任意読み取りアクセスを必要とします。このディレクトリパスと somefile 上のその他ユーザーに対するアクセス権ビットは、必要な任意の検索権と読み取り権を与えます。
read(2) システムコールに対する必須アクセスチェック - 必須アクセスチェックは、somefile が開かれたときに実行されます。ほかにはアクセスチェックは行われません。
read(2) システムコールに対する任意アクセスチェック - 任意アクセスチェックは、somefile が開かれたときに実行されます。ほかにはアクセスチェックは行われません。
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);
open(2) システムコールに対する必須アクセスチェック - プロセスは /export/home/heartyann に対する必須検索アクセスと、somefile に対する必須書き込みアクセスを必要とします。Secret で動作中のプロセスは必須検索のアクセスチェックの条件を満たしますが、必須書き込みのアクセスチェックの条件は満たしていません。必須書き込みアクセスが有効になるためには、somefile の機密ラベルはプロセスの機密ラベルより優位でなければなりませんが、実際には優位ではありません。つまり、Confidential は Secret より優位ではありません。プロセスは、file_mac_write 特権を表明してこの制限を無効にすることも、エラーを表明することもできます。
open(2) システムコールに対する任意アクセスチェック - プロセスは /export/home/heartyann に対する任意検索アクセスと、somefile に対する任意書き込みアクセスを必要とします。このディレクトリパスと somefile 上のその他ユーザーに対するアクセス権ビットは、任意検索アクセスを与えますが、任意書き込みのアクセスチェックの条件をパスしません。プロセスは、file_dac_write 特権を表明してこの制限を無効にすることも、エラーを表明することもできます。
write(2) システムコールに対する必須アクセスチェック - 必須アクセスチェックは、somefile が開かれているときに行われます。ほかのアクセスチェックは行われません。
write(2) システムコールに対する任意アクセスチェック - 任意アクセスチェックは、somefile が開かれているときに行われます。ほかのアクセスチェックは行われません。
Secret プロセスは、Confidential の /export/home/heartyann シングルレベルディレクトリ内の実行可能ファイルを実行します。
retval = execv(file, argv); }
execv(2) システムコールに対する必須アクセスチェック - プロセスは、/export/home/heartyann に対する必須検索アクセスと、file に対する必須読み取りアクセスを必要とします。ファイルに対する必須読み取りアクセスが必要なのは、ファイルを実行するためです。Secret で動作中のプロセスは、これら両方の必須アクセスチェックの条件を満たします。
execv(2) システムコールに対する任意アクセスチェック - プロセスは、/export/home/heartyann に対する任意検索アクセスと、file に対する任意実行アクセスを必要とします。このディレクトリパスと file のアクセス権ビットは、file に対する任意の検索アクセスと実行アクセスを与えます。