Trusted Solaris 開発ガイド

有効な特権のブラケット化

デフォルトで、有効な特権はオンに設定され許可セットと一致します。特権のブラケット化は、この有効特権をオフにし、続いて一定のインタフェース呼び出しに必要な許可された特権だけをオン (有効) にし、特権呼び出しが完了したときにそれらをオフにする、という手順で行われます。

インタフェースにどの特権が必要かを分析する場合、そのインタフェースのマニュアルページに説明されているインタフェースの動作と特権の目的を参照してください。特権の中には、ほかの特権と比べ「影響力が大きい」ものがあります。そのような特権は、扱いに十分気をつける必要があります。

たとえば、コードセグメントを調べ、そのコードが mount(1M) システムコールで特権を使用していることを確認し、その特権の使用が何らかの形で不正に利用される可能性があるかについては、比較的容易に判断できます。しかし、制限されたファイルにアクセスする必須または任意のアクセスポリシーを無効にする特権の使用が、不正に利用される可能性があるか判断するのは困難です。

コード内で特権のブラケット化を実行し正しく動作させるのは、開発者の責任で行います。特権は、トラステッド以外のプロセスには許されていない、ポリシーの無効化を行うことができます。この点に十分注意して、特権を扱うようにしてください。

手順

この節では、setfpriv(1) システムコールのブラケット化の手順と、有効セットに対するブラケット化の効果の概要を示します。コードは、次の節で示します。

ブラケット化を行う前の実行開始時には、許可セットと有効セットには次の特権が含まれています。

Permitted = file_mac_write$file_setpriv$proc_setid

Effective = file_mac_write$file_setpriv$proc_setid

有効セットのクリア

この例は、set_effective_priv(3) を使用して、アプリケーションの開始時に有効セットをクリアします。PRIV_SET パラメータは、有効特権セットをクリアします。ゼロ (0) は、特権 ID のパラメータリストが存在しないことを意味します。

if (set_effective_priv(PRIV_SET, 0) == -1)
 	perror("Cannot clear effective privileges");

アプリケーションコードの継続

すべての有効特権セットをオフにした後、特権が必要になるまでアプリケーションコードを継続します。

呼び出しのブラケット化

この例は、set_effective_priv(3) を使用してブラケット化を行なっています。最初の呼び出しは、有効セット内で file_setpriv 特権をオンにして (表明して) います。2 番目の呼び出しはその特権をオフにします。1 は、特権パラメータリストに、特権定数が 1 つ (PRIV_FILE_SETPRIV) 含まれることを意味します。

/* 有効セット内で file_setpriv を表明 (オン) にする */
 	if (set_effective_priv(PRIV_ON, 1, PRIV_FILE_SETPRIV) == -1)
 			perror("Cannot assert PRIV_FILE_SETPRIV");

/* インタフェースを呼び出す */
 	retval = setfpriv(execfile, PRIV_SET, PRIV_ALLOWED, &priv_get);

/* file_setpriv 特権をオフ (無効) にする */
 	if (set_effective_priv(PRIV_OFF, 1, PRIV_FILE_SETPRIV) == -1)
 			perror("Cannot clear PRIV_FILE_SETPRIV");

/* アプリケーションコードを続ける */

ブラケット化の例

次に、setfpriv(1) をブラケット化すべき位置を示すコメントが入った、アプリケーションコードの本体の例を示します。

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

/* 有効セット内で file_setpriv をオン (有効) にする */
 	retval = setfpriv(execfile, PRIV_SET, PRIV_ALLOWED, &priv_get);
/* file_setpriv 特権をオフ (無効) にする */

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

/* 有効セット内で file_setpriv をオン (有効) にする */
 	retval = setfpriv(execfile,PRIV_ON, PRIV_ALLOWED, &priv_set);
/* file_setpriv 特権をオフ (無効) にする */

 	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);
 	PRIV_ASSERT(&priv_set, PRIV_FILE_MAC_WRITE);

/* 有効セット内で file_setpriv をオン (有効) にする */
 	retval = setfpriv(execfile, PRIV_ON, PRIV_FORCED, &priv_set);
/* file_setpriv 特権をオフ (無効) にする */

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