Trusted Solaris 開発ガイド

ファイル特権セット用のプログラミングインタフェース

この節で説明する特権マクロとシステムコールは、ファイル特権セットの取得と設定を行います。次のプログラムには、この章のすべての例で使用されるヘッダーファイルと変数宣言が含まれます。また、execfile (実行可能ファイル) に対するファイル特権セットの設定と取得を行うコードも含まれます。この execfile は、後で exec() により使用され、プロセス特権セットに何が起きるかを表示します。

setfpriv(1) システムコールは、execfile に強制特権セットと許容特権セットを設定し、file_setpriv 特権を要求します。file_setpriv 特権は executable の強制セットに含まれるため、この特権は実行中に許可セットで使用できます。デフォルトでは、有効セットは許可セットと同じです。また、すべての有効特権は、特権のブラケット化の準備のために明示的にオフにされるまでは、オンのままです。このコードにおける file_setpriv の使用は、特権のブラケット化 (「有効な特権のブラケット化」を参照) が有効にならないかぎり、セキュリティガイドラインに従いません。

/* cc priv.c -o executable -ltsol */

 #include <tsol/priv.h>
 #include <sys/types.h>
 #include <errno.h>
 #include <stdio.h>

/* 大域変数*/
 extern int errno;
 char buffer [3*1024];

 main()
 {
 	char 					*priv_names = "file_mac_write$proc_setid";
 	char					*string;
 	char					*privilege;
 	char 					*file = "/export/home/zelda/executable";
 	char 					*execfile = "/export/home/zelda/execfile";
 	priv_set_t					priv_set, priv_get, permitted_privs, saved_privs;
 	int 					length = sizeof(buffer);
 	int					retval;
 	pid_t 					pid;

/* 後で exec() に使用する */
 	char 				*argv[8] = {"execfile"};

/* 特権セットのデータ構造を初期化する */

 	PRIV_EMPTY(&priv_get);
 	PRIV_EMPTY(&priv_set);

/* 許容された特権をオフ(無効) にする。詳細は本文を参照 */

 	retval = setfpriv(execfile, PRIV_SET, PRIV_ALLOWED, &priv_get);
/* 特権セット構造体内で、Priv_names に指定した特権を */ 
/* 表明し、execfile に割り当てる。特権の表明のやり方については */
/* 本文を参照 */

 	if((string = str_to_priv_set(priv_names, &priv_set, "$")) != NULL)
 			printf("string = %s errno = %d¥n", string, errno);
 	retval = setfpriv(execfile,PRIV_ON, PRIV_ALLOWED, &priv_set);

/* 許容された特権セットに特権が含まれていることを確認する */

 	retval = getfpriv(execfile, PRIV_ALLOWED, &priv_get);
 	priv_set_to_str(&priv_get, '$', buffer, &length);
 	printf("execfile Allowed = %s¥n", buffer);

/* 特権セットのデータ構造体を初期化する */

 	PRIV_EMPTY(&priv_set);
 	PRIV_EMPTY(&priv_get);

/* 特権セット構造体で file_mac_write を表明する */

 	PRIV_ASSERT(&priv_set, PRIV_FILE_MAC_WRITE);

/* 強制された特権セットを execfile ファイルに対して有効にする */

 	retval = setfpriv(execfile, PRIV_ON, PRIV_FORCED, &priv_set);

/* 強制された特権セットに特権が含まれていることを確認する */

 	retval = getfpriv(execfile, PRIV_FORCED, &priv_get);
 	priv_set_to_str(&priv_get, `$', buffer, &length);
 	printf("execfile Forced =%s¥n", buffer);
 }

printf 文により、execfile に対するファイル特権セットが次のように出力されます。

execfile Allowed = file_mac_write$proc_setid
execfile Forced = file_mac_write

この出力は、ドル記号 (「$」) を使用して許容される特権を分離しています。この区切り文字は、priv_set_to_str(3) に対する呼び出しで指定されます。セット内に特権が 1 つしかない場合には、区切り文字は使用しません。