これらの例は、送信データのセキュリティ属性を指定するためにセキュリティ属性構造とマスクをどのように設定するかを示しています。最初の例は、メッセージに新しいセキュリティ属性を設定し、2 番目の例は通信終端に新しいセキュリティ属性を設定します。
この例では、次の手順によって、msg とともに送信する機密ラベルと認可上限の新しい属性値を設定します。
定義済みの機密ラベルと認可上限だけを使用して、マスク (sendmask) を定義する
sendmask を使用してセキュリティ属性構造 sendattrs を割り当て、属性構造がこれら 2 つの属性だけの領域を含むようにする
sendattrs 内の機密ラベルと認可上限に、Top Secret の属性値を設定する
通信終端との通信を設定する
msg をセキュリティ属性とともに通信終端へ送信する
msg を送信するプロセスは Confidential であるため、認可上限と機密ラベルを変更するために、有効セットに net_setclr と net_upgrade_sl 特権が必要です。新しい機密ラベルと認可上限は、送信プロセスから受け取った msg の機密ラベルと認可上限を無効にします。コード内のコメントは、第 3 章「特権」で説明している特権ブラケットが必要な位置を示します。
#include <tsix/t6attrs.h>
#include <tsol/label.h>
main()
{
int retval, sock, error;
t6attr_t sendattrs
t6mask_t sendmask;
char *msg = "Hello World!";
bslabel_t senslabel;
bclear_t clearance;
/* 機密ラベルとプロセスの認可上限のセキュリティ属性フィールドを */
/* 使用してマスクを初期化する */
sendmask = T6M_SL | T6M_CLEARANCE;
/* マスクを使用して 2 つのセキュリティ属性構造体に */
/* 必要なだけの領域を割り当てる */
sendattrs = t6alloc_blk(sendmask);
/* 機密ラベルと認可上限を Top Secret に初期化する */
stobsl("TOP SECRET", &senslabel, NEW_LABEL, &error);
stobclear("TOP SECRET", &clearance, NEW_LABEL, &error);
/* メッセージと一緒に送られるセキュリティ属性フィールドの属性値を */
/* 設定する */
retval = t6set_attr(T6_SL, &senslabel, sendattrs);
printf("Retval1 = %d¥n", retval);
retval = t6set_attr(T6_CLEARANCE, &clearance, sendattrs);
printf("Retval2 = %d¥n", retval);
/* ソケット通信を設定する */
/* ... */
/* 変更されたセキュリティ属性をメッセージと一緒に送る */
/* 有効セット内で net_setclr と net_upgrade_sl をオン (有効) にする */
retval = t6sendto(sock, msg, sizeof(msg), 0, 0, 0, &sendattrs);
/* net_setclr と net_upgrade_sl をオフ (無効) にする */
printf("Retval3 = %d¥n bytes", retval);
}
printf 文によって、次のように出力されます。
Retval1 = 0
Retval2 = 0
Retval3 = 4 bytes
この例の最初の部分は、sendattrs とともに異なるマスク (endptmask) を使用し、sendattrs に指定された機密ラベルのセキュリティ属性だけを通信終端に設定します。これにより、t6sendto(3N) ルーチン以外の伝送方法を使用して、または機密ラベルを指定しない属性セットを持つ t6sendto(3N) ルーチンを使用して、特権を持つプロセスが通信終端にメッセージを送信する場合に、機密ラベルが通信終端から取得されます。通信終端のセキュリティ属性を設定するプロセスは Secret で動作しているため、有効セットに net_upgrade_sl 特権が必要です。コード内のコメントは、第 3 章「特権」で説明している特権ブラケットが必要な位置を示します。
次の文は、通信終端のマスクを sendmask に変更し、終端マスクを取得して getmask に入れ、認可上限を保持するために getattrs を割り当て、通信終端のデフォルトからバイナリ認可上限を取得して getattrs に格納します。
通信終端のセキュリティ属性は、送信プロセスから取得される属性を無効にします。メッセージのセキュリティ属性は、通信終端から取得される属性を無効にします。
#include <tsix/t6attrs.h>
#include <tsol/label.h>
main()
{ t6mask_t sendmask, endptmask, getmask;
int fd, sock, retval;
t6attr_t sendattrs, getattrs;
sendmask = T6M_SL | T6M_CLEARANCE; sendattrs = t6alloc_blk(sendmask);
/* 機密ラベルを使用してマスクを初期化する */
endptmask = T6M_SL;
/* マスクにより示される属性を sendattrs に設定する */
/* 有効セット内で net_upgrade_sl をオン (有効) にする */
retval = t6set_endpt_default(sock, endptmask, sendattrs);
/* net_upgrade_sl をオフ (無効) にする */
/* 終端マスクを他のマスクに変更する */
retval = t6set_endpt_mask(sock, sendmask);
/* 現在の終端マスクを得る */
retval = t6get_endpt_mask(sock, &getmask);
/* 終端のデフォルトの認可上限を得る */
getmask = T6M_CLEARANCE;
getattrs = t6alloc_blk(getmask);
retval = t6get_endpt_default(fd, &getmask, getattrs);
}