システムセキュリティ構成変数は、システム全体の構成を示します。アプリケーションの中には、システムのセキュリティ構成状態に影響を受ける可能性がある動作を実行する前に、システム変数を照会するものがあります。たとえば、情報ラベルの浮上がシステムに設定されていない場合、プロセスには情報ラベルの浮上を停止するための特権は必要ではありません。
ファイルシステムのセキュリティ属性とフラグは、指定されたローカルファイルシステムとマウントされたファイルシステムのセキュリティ関連情報を提供します。アプリケーションは、ファイルシステムのセキュリティ属性とフラグの状態を知ることが必要な場合があります。たとえば、ディレクトリを操作する前にファイルシステムのデフォルトのアクセス制御リスト (ACL) を照会したり、ディレクトリに新しいファイルを作成する前に、そのディレクトリがマルチレベルディレクトリであるかを確認することができます。
プロセスのセキュリティ属性フラグは、呼び出し元プロセスについての情報を示します。たとえば、プロセスが管理役割から開始されたか (トラステッドパスフラグが設定されている)、それとも通常のユーザーによって開始されたか (トラステッドパスフラグは設定されていない) を知るため、場合によってはアプリケーションはプロセスのセキュリティ属性フラグの状態を知る必要があります。
この節では、システムセキュリティ構成とセキュリティ属性情報をチェックするプログラミングインタフェースとコード例を示します。これらの呼び出しにより処理されるデータの説明は、該当する章に示されています。たとえば、第 5 章「ラベル」ではラベルについて、第 3 章「特権」では特権について説明しています。
パス名を使用してファイルにアクセスするインタフェースと、ファイル記述子を使用してファイルにアクセスする別のインタフェースが存在する場合、構文はほとんど変わらないため、例ではパス名だけを示します。
この節で示す例はすべて、-ltsol ライブラリを使用してコンパイルします。
このシステムコールは、システムセキュリティ構成の情報を取得します。詳細は、secconf(2) のマニュアルページを参照してください。
long secconf( int name);
これらのシステムコールは、パス名またはファイル記述子を使用してファイルシステム属性情報を取得します。詳細は、getfsattr(2) のマニュアルページを参照してください。
int getfsattr( char *path, u_long type, void *buf_P, int len); int fgetfsattr( int fd, u_long type, void *buf_P);
これらのシステムコールは、パス名またはファイル記述子を使用してファイルシステムのセキュリティ属性フラグの情報を取得します。詳細は、getfattrflag(2) のマニュアルページを参照してください。
int fgetfattrflag( const char *path, secflgs_t *flags); int setfattrflag( const char *path, secflgs_t which, secflgs_t flags); int fsetfattrflag( int fildes, secflgs_t *flags); int getfattrflag( int fildes, secflgs_t *flags); int mldgetfattrflag( const char *path, secflgs_t *flags) int mldsetfattrflag( const char * path, secflgs_t which, secflgs_t flags))
これらのシステムコールは、プロセスのセキュリティ属性フラグの取得と設定を行います。getpattr(2) のマニュアルページを参照してください。
int getpattr( pattr_type_t type, pattr_flag_t *value); int setpattr( pattr_type_t type, pattr_flag_t value);
システム変数は、システムがどのように構成されているかを示します。システム変数はシステムの起動時に初期化され、system(4) にエントリがない場合にはデフォルト値が使用されます。アプリケーションは、secconf(2) システムコールを使用してシステム変数を照会できます。次に、/etc/system 内で定義される変数を、デフォルト値とともに示します。
_TSOL_ENABLE_IL - アプリケーションに情報ラベルの設定または表示を許容します。デフォルトはオンです。
_TSOL_ENABLE_IL_FLOATING - 情報ラベルの浮上を実行します。デフォルトはオン (ラベルを浮上する) です。オフの場合には情報ラベルは浮上しませんが、プログラム中でコードを記述して浮上するように設定することもできます。この変数を有効にするには、_TSOL_ENABLE_IL をオンにする必要があります。
_TSOL_FLOAT_SYSV_MSG_IL - System V IPC のメッセージ待ち行列に対する情報ラベルの浮上を有効にします。デフォルトはオフです。待ち行列内の各メッセージの情報ラベルには、待ち行列にメッセージを入力するプロセスの情報ラベル、または msgsndl(2) で設定される情報ラベルが入ります。読み取りプロセスの情報ラベルは、読み取られるメッセージの情報ラベルに応じて浮上します。詳細は、第 12 章「System V のプロセス間通信」を参照してください。この変数を有効にするには、_TSOL_ENABLE_IL と _TSOL_ENABLE_IL_FLOATING をオンにする必要があります。
_TSOL_FLOAT_SYSV_SEM_IL - System V IPC のセマフォセットに対する情報ラベルの浮上を有効にします。デフォルトはオフです。読み取りプロセスの情報ラベルは、セマフォセットの情報ラベルに応じて浮上します。セマフォセットの情報ラベルは、書き込みプロセスの情報ラベルに応じて浮上します。詳細は、第 12 章「System V のプロセス間通信」を参照してください。この変数を有効にするには、_TSOL_ENABLE_IL と _TSOL_ENABLE_FLOATING をオンにする必要があります。
_TSOL_FLOAT_SYSV_SHM_IL - System V IPC の共有メモリー領域に対する情報ラベルの浮上を有効にします。デフォルトはオフです。共有メモリー領域の情報ラベルは、領域に連結した書き込みアクセスを持つすべてのプロセスの情報ラベルに応じて常に浮上します。読み取りアクセスに連結したプロセスの情報ラベルは、共有メモリー領域の情報ラベルに応じて浮上します。詳細は、第 12 章「System V のプロセス間通信」を参照してください。この変数を有効にするには、_TSOL_ENABLE_IL と _TSOL_ENABLE_IL_FLOATING をオンにする必要があります。
_TSOL_RESET_IL_ON_EXEC - exec(1) への呼び出しの前に、情報ラベルを ADMIN_LOW にリセットします。デフォルトはオンです。この変数を有効にするには、_TSOL_ENABLE_IL をオンにする必要があります。
_TSOL_HIDE_UPGRADED_NAMES - ディレクトリに、特権プロセスによって昇格された機密ラベルを持つファイルまたはサブディレクトリが含まれる場合、この変数は、昇格されたファイルまたはサブディレクトリが getdents(2) のようなシステムコール要求によって表示または取得できるかどうかを決定します。デフォルトはオフです。オフの場合、ディレクトリを表示すると、昇格されたファイルとサブディレクトリの名前が表示されます。オンの場合、昇格されたファイルまたはサブディレクトリの名前は表示されません。
_TSOL_PRIVS_DEBUG - 特権デバッグを有効にします。デフォルトはオフです。特権デバッグを有効にする方法と使用方法の詳細は、『Trusted Solaris 管理の手順』またはこのマニュアルの 「特権デバッグ」を参照してください。
_TSOL_STR_LINKB - streams ポリシースイッチを設定します。デフォルトはオンです。オンの場合、異なるセキュリティ属性を持つ別の streams メッセージとリンクするときに、linkb(9F) システムコールは streams メッセージを出力します。しかし、情報ラベルだけが異なる場合は、リンク先の streams メッセージの情報ラベルだけが出力されます。
このコードは、システム変数を照会し、それらの現在の値を表示します。
#include <tsol/secconf.h> main() { long retval; retval = secconf(_TSOL_ENABLE_IL); printf("Enable IL = %d¥n", retval); retval = secconf(_TSOL_ENABLE_IL_FLOATING); printf("IL Floating = %d¥n", retval); retval = secconf(_TSOL_FLOAT_SYSV_SEM_IL); printf("Semaphore set IL Floating = %d¥n", retval); retval = secconf(_TSOL_FLOAT_SYSV_MSG_IL); printf("Message queue IL Floating = %d¥n", retval); retval = secconf(_TSOL_FLOAT_SYSV_SHM_IL); printf("Shared memory IL Floating = %d¥n", retval); retval = secconf(_TSOL_HIDE_UPGRADED_NAMES); printf("Hide Names = %d¥n", retval); retval = secconf(_TSOL_PRIVS_DEBUG); printf("Priv Debug = %d¥n", retval); retval = secconf(_TSOL_RESET_IL_ON_EXEC); printf("Reset IL = %d¥n", retval); retval = secconf(_TSOL_STR_LINKB); printf("Streams policy switch = %d¥n", retval); }
printf 文によって、次のように出力されます。retval (戻り値) が 1 の場合、変数はオンです。0 の場合はオフです。-1 の場合は、エラーが発生しています。errno (エラー番号) は、入力された変数が無効な場合にだけ設定されます。
Enable IL = 1
IL Floating = 1
Semaphore set IL floating = 0
Message queue IL floating = 0
Shared memory IL floating = 0
Hide Names = 0
Priv Debug = 0
Reset IL = 1
Streams policy switch = 1
ファイルシステムのセキュリティ属性は、システム管理者が一部のセキュリティ属性を割り当てなかった場合、あるいは作成プロセスで属性を取得していない場合、ローカルまたはマウントされたファイルシステムオブジェクトに対し、欠落しているセキュリティ属性を充てんします。ファイルシステムのセキュリティ属性は、vfstab(4) ファイルと vfstab_adjunct(4) ファイル、あるいはファイルまたはディレクトリの i ノードから取得できます。
vfstab_adjunct(4) ファイルには、遠隔マウントポイントとその関連セキュリティ情報が含まれます。システム管理者は、遠隔ワークステーションからローカルワークステーションにマウントされたファイルシステムが正しいセキュリティ属性を持つように、このファイルの設定と管理を行います。
次の例は、vfstab_adjunct(4) から行を取得して表示します。getvfsaent(3) ルーチンは、初めにファイルの先頭の行を読み取り、それに続く呼び出しごとに次の行を 1 つずつ読み取ります。getvfsaent(3) ルーチンは、入力ファイルに指定されたマウントポイントの行を読み取ります。
このコード例に示すように、stdio.h を必ずインクルードしてください。
#include <stdio.h> #include <tsol/vfstab_adjunct.h> main() { struct vfsaent *entry; char *vfsfile = "/etc/security/tsol/vfstab_adjunct"; char *file = "/shark/doc"; int retval; FILE *fp; fp = fopen(vfsfile, "r"); if (fp == NULL) { printf("Can't open %s¥n", vfsfile); exit(1); } /* ファイルを 1 行ずつ読み取る */ retval = getvfsaent(fp, &entry); if (retval == 0) { printf("Mount Point is %s ¥n Security Info is %s¥n", entry->vfsa_fsname, entry->vfsa_attr); free(entry); } else printf("No entries!¥n"); fseek(fp, 0, 0); /* 指定のマウントポイントの行を読み取る */ retval = getvfsafile(fp, &entry, file); if (retval == 0) { printf("Mount Point is %s ¥nSecurity Info is %s¥n", entry->vfsa_fsname, entry->vfsa_attr); free(entry); } else printf("Mount point not found.¥n"); fclose(fp); }
printf 文によって、次のように出力されます。この vfstab_adjunct ファイルには、/opt/SUNWspro マウントポイントに対するエントリが 1 つだけあります。
Mount Point is /opt/SUNWspro
Security Info is slabel=[C]:allowed all
Mount Point not found
次のコードは、file (ファイル) の CMW ラベル (FSA_LABEL) を取得し、それを buffer (バッファー) に返します。
#include <tsol/fsattr.h> #include <tsol/label.h> main() { char *file = "/export"; char buffer [3*1024], *string = (char *)0; int length, retval; length = sizeof(buffer); retval = getfsattr(file, FSA_LABEL, buffer, length); retval = bcltos((bclabel_t *)buffer, &string, 0, VIEW_INTERNAL); printf("/export CMW label = %s ¥n", buffer); }
printf 文によって、次のように出力されます。
/export CMW label = ADMIN_LOW [ADMIN_LOW]
FSA_ACLCNT - ファイルシステムアクセスのアクセス制御リスト (ACL) 数
FSA_DFACLCNT - ファイルシステムのデフォルト ACL 数
FSA_DFACL - ファイルシステムのデフォルト ACL
FSA_AFLAGS - ファイルシステムの属性フラグ。「ファイルシステムのセキュリティ属性フラグの取得と設定」を参照してください。
FSA_MLDPFX - ファイルシステムのマルチレベルディレクトリの接頭辞文字列
FSA_APSACNT - プロセス監査の事前選択マスク内のクラスの数
FSA_APSA - プロセス監査の事前選択マスク内のクラス。プロセスは、この情報を取得する場合、有効特権セット内で file_audit 特権を必要とする。詳細は、「特権と承認」を参照してください。
CMW ラベル、ファイルシステムのラベル範囲、ファイル特権、およびマルチレベルディレクトリにアクセスするプログラミングインタフェースの概要は、「Trusted Solaris 7 のセキュリティ機構」で述べています。詳細は、該当するそれぞれの章を参照してください。
アクセス制御リスト - アクセス制御リストは Solaris 7 の一部であるため、本書では説明していません。
監査の事前選択属性 - ファイルシステムに対する監査の事前選択属性は、システム管理者がコマンド行から setfsattr(1M) を使用して指定します。この事前選択属性は、ファイルのアクセス権ビットに対して監査を指定します。アクセス (読み取り、書き込み、実行) が試みられた場合に、そのファイルとディレクトリを監査できるようにファイルシステムを構成することができます。
プロセスに対する監査の事前選択属性は、システム管理者がコマンド行から auditconfig(1M) を使用して指定します。ファイルシステムの事前選択属性は、プロセスの事前選択属性を無効にします。たとえば、ファイルの読み取りについて監査されるプロセスは、読み取り監査を行わないことを指定するファイルシステム事前選択監査属性を持つファイルの読み取り時には監査されません。詳細は、『Trusted Solaris の監査管理』を参照してください。
この例は、通常のディレクトリに公開属性フラグを設定し、マルチレベルディレクトリの MLD フラグを取得します。この例を実行するには、プロセスに file_owner 特権と file_audit 特権が必要です。setfpriv(1) を使用してこれらの特権を次のように設定してください。setfpriv(1) は、プロファイルシェルから実行されるとき、file_setpriv 特権を必要とします。
phoenix% setfpriv -s -a file_owner,file_audit executable
#include <tsol/secflgs.h> main() { secflgs_t value; char *file = "/opt/SUNWspro"; /* MLD ではない */ char *file1 = "/export/home/zelda"; /* MLD */ int retval; retval = setfattrflag(file, FAF_PUBLIC, FAF_PUBLIC); retval = getfattrflag(file, &value); printf("Public Attribute Flag = %d¥n", value); retval = mldgetfattrflag(file1, &value); printf("MLD Attribute Flag = %d¥n", value); }
printf 文によって、次のように出力されます。1 は true (真) を、0 は false (偽) を意味します。
Public Attribute Flag = 0
MLD Attribute Flag = 1
FAF_MLD - ディレクトリはマルチレベルディレクトリです。FAF_MLD は、ディレクトリが空で、プロセスの実効ユーザー ID がディレクトリの所有者と一致し、プロセスに必須書き込みアクセスがある場合に、特権なしで設定できます。
FAF_SLD - ディレクトリはシングルレベルディレクトリです。このフラグをプログラムから設定することはできません。
装飾パス名が getfattrflag(1) に渡される場合でディレクトリがマルチレベルディレクトリ (MLD) の場合は、FAF_MLD が返されます。装飾されていないパス名が渡される場合でディレクトリが MLD の場合は、FAF_SLD が返されます。
装飾パス名が mldgetfattrflag(2) に渡される場合でディレクトリが MLD のときは FAF_SLD が返されます。装飾されていないパス名が渡される場合でディレクトリが MLD のときは、FAF_MLD が返されます。
装飾名の詳細は、第 8 章「マルチレベルディレクトリ」を参照してください。
FAF_PUBLIC - ファイルまたはディレクトリは公開です。監査記録は、公開ファイルと公開ディレクトリの読み取り操作に対しては作られません。これは、読み取り操作が事前選択された監査クラスの一部である場合でも同様です。このフラグは、次の読み取り操作に適用されます。access(2)、fstatvfs(2)、 lstat(2)、open(2) (読み取りのみ)、pathconf(2)、readlink(2)、 stat(2)、statvfs(2)。
事前選択された監査クラスに AUE_MAC 監査または AUE_UPRIV 監査の疑似イベントが含まれる場合は、公開属性フラグの設定に関係なく上記のイベントの監査記録は常に作られます。疑似監査イベントの詳細は、『Trusted Solaris の監査管理』を参照してください。
ファイルまたはディレクトリに対し公開属性フラグを取得または設定する場合、プロセスは有効セットに file_audit 特権または file_owner 特権を必要とします。詳細は、「特権と承認」を参照してください。このフラグは、『Trusted Solaris 管理の手順』に述べているように、管理者の権限を使用しても設定できます。
呼び出しプロセスの属性フラグを照会するには、getpattr(2) を使用してください。
#include <tsol/pattr.h> main() { int retval; pattr_flag_t value; retval = getpattr(PAF_TRUSTED_PATH, &value); printf("Trusted Path Value = %d¥n", value); retval = getpattr(PAF_PRIV_DBG, &value); printf("Priv Debug value = %d¥n", value); retval = getpattr(PAF_NO_TOKMAP, &value); printf("Trusted Network Value = %d¥n", value); retval = getpattr(PAF_DISKLESS_BOOT, &value); printf("Diskless Boot Value = %d¥n", value); retval = getpattr(PAF_SELAGNT, &value); printf("Bypass Selection Agent Value = %d¥n", value); retval = getpattr(PAF_PRINT_SYSTEM, &value); printf("Print System Value = %d¥n", value); retval = getpattr(PAF_LABEL_VIEW, &value); printf("Label View Value = %d¥n", value); retval = getpattr(PAF_LABEL_XLATE, &value); printf("Label Translate Value = %x¥n", value); }
printf 文によって、次のように出力されます。値 0 は、フラグがオフであることを示します。値 1 はオンであることを示します。ラベル変換値は、フラグがオフの場合は 0 であり、オンの場合はラベル変換フラグを示す 16 進値です。プロセスの属性フラグの詳細は、「明示的定数の値」を参照してください。
Trusted Path Value = 0
Priv Debug Value = 0
Trusted Network Value = 0
Diskless Boot value = 0
Bypass Selection Agent Value = 0
Print System Value = 0
Label View Value = 1
Label Translate Value = 1
PAF_TRUSTED_PATH: すべての管理役割に対し、トラステッドパスフラグが設定されます。管理役割から開始されたプロセスはすべて、このフラグが 1 に設定されます。それ以外のプロセスでは、このフラグは 0 に設定されます。このフラグは照会と削除はできますが、設定はできません。
PAF_PRIV_DEBUG: プロセスが特権デバッグモードで開始される場合、この特権デバッグフラグが 1 に設定されます。このフラグはどのプロセスからでも照会できますが、設定ができるのはトラステッドパスプロセスからのみです。特権デバッグモードを有効にする方法と使用方法は、付録 A 「プログラマーズリファレンス」 の 「特権デバッグ」と『Trusted Solaris 管理の手順』を参照してください。
PAF_NO_TOKMAP: このトラステッドコンピューティングベースのネットワークフラグは、セキュリティ属性を持つパケットを必要とするワークステーションに対し、セキュリティ属性のないパケットを送るトラステッドコンピューティングベースのアプリケーションだけに対して 1 に設定されます。
PAF_DISKLESS_BOOT: このディスクレスブートフラグは、ディスクレスブートサーバーをサポートします。このフラグが 1 に設定される場合、ネットワークパケットヘッダー内のセキュリティ属性情報は送信されません。
PAF_SELAGNT: このセレクションエージェントフラグが 1 に設定されると、データをあるウィンドウから別のウィンドウに移動させるときに、そのプロセスは「選択マネージャ」の管理の対象から外されます。詳細は、「ウィンドウ間のデータ移動」を参照してください。
PAF_PRINT_SYSTEM: この出力システムフラグが 1 に設定されると、クライアントプロセスが出力サブシステムのメンバーとして認識されます。
PAF_LABELVIEW: ユーザーまたは役割がプロセスを開始するとき、label_encodings ファイル内のラベル表示指定または /etc/security/tsol/tsoluser ファイル内のユーザーラベル表示設定に応じてこのフラグが設定されます。ラベル表示は、ADMIN_HIGH と ADMIN_LOW 管理ラベルがシステム内でユーザーにどのように表示されるかを決定します。tsoluser ファイルが存在する場合、このファイル内の設定が label_encodings ファイル内の設定より優先します。
値 0 は外部表示が使用中であることを示し、値 1 は内部表示が使用中であることを示します。このフラグの値に関係なく、ASCII からバイナリへのラベル変換では、内部名または外部名を使用するために管理ラベルの ASCII 文字列出力を要求できます。詳細は、第 6 章「ラベルのコード例」の 「バイナリから ASCII への変換」を参照してください。
内部表示 - ADMIN_HIGH と ADMIN_LOW を表示する
外部表示 - label_encodings(4) に定義されているように、ADMIN_LOW を 2 番目に低いラベルに設定し、ADMIN_HIGH を 2 番目に高いラベルに設定します。
PAF_LABEL_XLATE: このラベル変換フラグが 1 に設定されている場合、flags= keyword オプションが label_encondings(4) ファイルで使用中であることを示します。このオプションフラグ設定は、このオプションフラグを使用している語句に、15 フラグ中のどのフラグが関連付けられるかを指定します。システムはフラグを使用しませんが、ラベルの使用を具体的に記述したアプリケーションはフラグを使用できます。たとえば、通常のラベルではなくプリンタのバナーラベルだけに現れる特定の語句や、公式な内容のやりとり用のラベルだけに現れる特定の語句を定義できます。このフラグの照会と設定は、トラステッドパスプロセスからだけ行えます。