ラベルは、バイナリから ASCII に変換し、再び元に戻すことができます。呼び出し元プロセスは、そのプロセスの機密ラベルよりも優位のラベルを変換するには、有効セットに sys_trans_label 特権を必要とします。
ASCII 文字は、大文字と小文字のどのような組み合わせででも入力できますが、すべて大文字で出力されます。
ASCII ラベルの入出力フォーマットは、label_encodings ファイルに定義されている格付けと語句から構成されます。label_encodings ファイルでそのように定義されている場合は、空白や句読点、格付け名や語句に含めることができます。
この節の例は、バイナリラベルを ASCII に変換します。この変換では、label_encodings(4) 内のキーワード設定とフラグパラメータ値を使用します。ラベルの種類によって使えるフラグが制限されることはありませんが、すべてのフラグ値が、それぞれのラベルに有効なわけではありません。次の説明は、フラグが使用されるラベルの種類を示します。機密ラベルと情報ラベルに適用される設定は、CMW ラベルにも適用されます。
ACCESS_RELATED - バイナリ情報ラベルのアクセス関連のキーワードだけを変換します。アクセス関連のキーワードは、任意の設定であり、これが情報ラベルに定義されると情報ラベルの階層レベルを増やします。アクセス関連のキーワードは、出力されたバナーページの警告文内に現れます。
VIEW_INTERNAL - システム上の最高位および最低位の機密ラベルと情報ラベルに、内部名である ADMIN_HIGH と ADMIN_LOW を使用します。
VIEW_EXTERNAL - label_encodings(4) の定義に従って、ADMIN_HIGH の機密ラベルまたは情報ラベルを、2 番目に高いラベルに降格し、ADMIN_LOW のラベルを 2 番目に低いラベルに昇格します。
「プロセスのセキュリティ属性フラグの取得と設定」 で説明しているラベル表示プロセス属性には、ラベル表示の状態が含まれます。
情報ラベル [機密ラベル]
次の例は、CMW ラベルを ADMIN_HIGH [ADMIN_HIGH] に初期化し、内部表示と外部表示を出力します。このプロセスは ADMIN_HIGH で動作するため、ADMIN_HIGH [ADMIN_HIGH] ラベルを変換するのに特権を必要としません。
#include <tsol/label.h> main() { int retval, length = 0; char *string1 = (char *)0, *string2 = (char *)0; bclabel_t cmwlabel; bclhigh(&cmwlabel); retval = bcltos(&cmwlabel, &string1, length, VIEW_INTERNAL); printf("View Internal = %s¥n", string1); retval = bcltos(&cmwlabel, &string2, length, VIEW_EXTERNAL); printf("View External = %s¥n", string2); }
View Internal = ADMIN_HIGH [ADMIN_HIGH] View External = TOP SECRET CC SB BRAVO1 BRAVO3 SA ALPHA1 PROJECT X/PROJECT Y LIMDIS ORCON ORG X/ORG Y D/E ALL EYES NOFORN [TS A B SA SB CC] |
bclhigh(3) と、bclmanifest(3) ファミリの他の関数を使用すると CMW ラベルの情報ラベルの値を操作できますが、この値をオブジェクトに対して設定することはできません。デフォルトで、オブジェクトの情報ラベルはすべて ADMIN_LOW です。
インタフェースからの機密ラベルと情報ラベルの ASCII 出力形式を、次に示します。区切り文字には空白文字が使用されます。中括弧はオプション項目を示し、ピリオドは語句の繰り返しを示します。語句は、機密ラベルではコンパートメントを表し、情報レベルではコンパートメントとマーキングを表します。
格付け {語句}...
次のコード例は、さまざまなフラグを使用してバイナリの機密ラベルを ASCII に変換します。このプロセスは、TS A B で動作するので、bslhigh(3) に対する呼び出しの後、変換のため sys_trans_label 特権を必要とします。第 3 章「特権」で説明している特権のブラケット化が必要な位置は、コード内のコメントで示してあります。
#include <tsol/label.h> main() { int retval, length = 0; char *string1 = (char *)0, *string2 = (char *)0, *string3 = (char *)0, *string4 = (char *)0, *string5 = (char *)0, *string6 = (char *)0, *string7 = (char *)0; bclabel_t cmwlabel; bslabel_t senslabel; retval = getcmwplabel(&cmwlabel); getcsl(&senslabel, &cmwlabel); retval = bsltos(&senslabel, &string1, length, LONG_WORDS); printf("Retval1 = %d Long Words = %s¥n", retval, string1); retval = bsltos(&senslabel, &string2, length, SHORT_WORDS); printf("Retval2 = %d Short Words = %s¥n", retval, string2); retval = bsltos(&senslabel, &string3, length, LONG_CLASSIFICATION); printf("Retval3 = %d Long Classifications = %s¥n", retval, string3); retval = bsltos(&senslabel, &string4, length, SHORT_CLASSIFICATION); printf("Retval4 = %d Short Classifications = %s¥n", retval, string4); retval = bsltos(&senslabel, &string5, length, NO_CLASSIFICATION); printf("Retval5 = %d No Classification = %s¥n", retval, string5); bslhigh(&senslabel); /* 有効セット内で sys_trans_label をオン (有効) にする */ retval = bsltos(&senslabel, &string6, length, VIEW_INTERNAL); /* sys_trans_label をオフ (無効) にする */ printf("Retval6 = %d View Internal = %s¥n", retval, string6); retval = bsltos(&senslabel, &string7, length, VIEW_EXTERNAL); printf("Retval7 = %d View External = %s¥n", retval, string7); }
printf 文により、次のように出力されます。
Long Words = TS A B
Short Words = TS A B
Long Classifications = TOP SECRET A B
Short Classifications = TS A B
No Classification = A B
View Internal = ADMIN_HIGH
View External = TS A B SA SB CC
次の例は、次のフラグ値を使用して、ASCII 文字列をバイナリの CMW ラベル、機密ラベル、または情報ラベルに変換します。
NEW_LABEL - 新しいラベルを作成し、そのバイナリラベルが label_encodings(4) に定義されているように、システムに対して完全で有効なラベルとなるように、その文字列を可能なかぎり修正します。修正ができない場合には、エラーが返されます。文字列は、ASCII または 16 進のどちらかです。
NO_CORRECTION - 新しいラベルを作成しますが、文字列の構造は修正しません。文字列が完全でなくシステムに対して無効なラベルである場合は、エラーが返されます。文字列は、ASCII または 16 進のどちらかです。
ASCII の CMW ラベルに使用できる形式を次に示します。
情報ラベル [機密ラベル] - この構造では、情報ラベルと機密ラベルは、空白文字、タブ、コンマ、スラッシュ (/) のいずれかで区切ることができます。この例では、空白文字で区切られています。
[機密ラベル] - この構造では、機密ラベル部だけが指定されており、情報ラベル部はシステムにより ADMIN_LOW に設定されます。
ASCII の機密ラベルと情報ラベルに使用できる形式を次に示します。入力項目は、空白文字、タブ、コンマ、スラッシュ (/) のいずれかで区切ることができます。格付けと語句の名前は、短い形式でも長い形式でもかまいません。
{+} {格付け} {{+|-}語句...}
縦棒 (|) は、2 つの項目から選択することを示します。縦棒の前後の空白は、無視されます。
正と負の符号を使用すると、語句に対応したコンパートメントとマーキングを有効または無効にして、既存のラベルの内容を変更できます。
中括弧は省略可能な項目を示し、ピリオドは語句の繰り返しを示します。語句が指定される場合、機密ラベルではコンパートメントを表し、情報ラベルではコンパートメントとマーキングを表します。
次の例は、NEW_LABEL フラグを使用して、ASCII 文字列をバイナリの CMW ラベル、機密ラベル、情報ラベルに変換し、再び元の ASCII に戻します。また、機密ラベルを指定された長さに変換する (クリッピング) 例も示しています。プロセスが SECRET B A [TS] 以上で作動する場合は、ラベル変換に sys_trans_label 特権を必要としません。
#include <tsol/label.h> main() { int retval, error, length = 0; char *cmwstring ="SECRET A B [TOP SECRET A B]"; char *sensstring = "TOP SECRET A B"; char *string1 = (char *)0, *string2 = (char *)0, *string3 = (char *)0; bclabel_t cmwlabel; bslabel_t senslabel; retval = stobcl(cmwstring, &cmwlabel, NEW_LABEL, &error); retval = bcltos(&cmwlabel, &string1, length, ALL_ENTRIES); retval = stobsl(sensstring, &senslabel, NEW_LABEL, &error); retval = bsltos(&senslabel, &string2, length, ALL_ENTRIES); string3 = sbsltos(&senslabel, 4); printf("CMW label = %s¥nSens label = %s¥nClipped label = %s¥nInf label= %s¥n", string1, string2, string3); }
printf 文により、次のように出力されます。Clipped label (クリッピングされたラベル) 中の矢印 <- は、機密ラベル名の文字がクリッピングされたことを示します。
CMW label = SECRET B A [TS A B]
Sen label = TS A B
Clipped label = TS<-