ヘッダーをスキップ
Oracle® Label Security管理者ガイド
11gリリース2 (11.2)
E92085-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

5ラベル付きデータの処理

この章では、次の方法について説明します。

この章の内容は、次のとおりです。

5.1 ポリシーのラベル列とラベル・タグ

この項では、表またはスキーマ内でポリシーのラベル列を作成して値を格納する方法について説明します。この項の内容は、次のとおりです。

5.1.1 ポリシーのラベル列

表に適用される各ポリシーにより、データベースに1列が作成されます。デフォルトでは、ポリシーのラベル列はNUMBER型です。


注意:

ポリシーの作成自体は、表やスキーマに影響しません。ポリシーは表またはスキーマにのみ適用されます。次の各項を参照してください。

ポリシーに関する各行のラベルは、文字列書式のラベル値と等価の数値を使用して、その列のタグで表されます。ラベル・タグは、ラベル作成時に管理者が手動で指定しないかぎり自動的に生成されます。

自動ラベル生成には、管理者がラベル・コンポーネントを定義するときに設定したルールが適用されます。第2章「データ・ラベルおよびユーザー・ラベル」を参照してください。

5.1.1.1 ポリシーのラベル列の非表示化

管理者は、表にHIDEオプションを適用して、ポリシーを表す列を非表示にするように決定できます。HIDEを使用するポリシーを表に適用すると、SELECT*またはDESCRIBE操作を実行するユーザーには、ポリシーのラベル列が表示されなくなります。ポリシーのラベル列が非表示でない場合、ラベル・タグはNUMBER型として表示されます。「HIDEポリシー列オプション」を参照してください。

5.1.1.2 例1: 数値列データ型(NUMBER)

SQL> describe emp;
 Name                                      Null?    Type
 ----------------------------------------- -------- --------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              CHAR(10)
 JOB                                                CHAR(9)
 MGR                                                NUMBER(4)
 SAL                                                NUMBER(7,2)
 DEPTNO                                    NOT NULL NUMBER(2)
 HR_LABEL                                           NUMBER(10)

5.1.1.3 例2: 数値列データ型と非表示列

この例では、HR_LABEL列は表示されません

SQL> describe emp;
 Name                                      Null?    Type
 ----------------------------------------- -------- --------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              CHAR(10)
 JOB                                                CHAR(9)
 MGR                                                NUMBER(4)
 SAL                                                NUMBER(7,2)
 DEPTNO                                    NOT NULL NUMBER(2)

5.1.2 ラベル・タグ

第2章「データ・ラベルおよびユーザー・ラベル」で説明したように、管理者は最初にポリシーに使用するラベル・コンポーネントのセットを定義します。ラベルの作成時に、管理者はラベルを構成するコンポーネントの有効な組合せセット、つまり、オプションで1つ以上のグループまたは区分と組み合せたレベルを指定します。ポリシー内で有効なこれらの各ラベルは、管理者により割り当てられた、または初回使用時に自動的に生成された、関連付けられている数値タグによって一意に識別されます。管理者がラベル・タグを手動で定義すると、ソートや論理比較を行うときのラベル値の順序付けを制御できるというメリットがあります。

ただし、ラベル・タグは、データベース内のすべてのポリシー間で一意であることが必要です。データベース内で複数のポリシーを使用する場合、異なるポリシー内で同じ数値ラベル・タグは使用できません。ラベル・タグはそれぞれが1つのラベルを一意に識別すること、およびデータ行に格納されるのはラベルの文字列表現ではなく、この数値タグであることに注意してください。

この項には、次の項目が含まれます。

5.1.2.1 ラベル・タグの手動定義によるラベルの順序付け

ラベル・タグを手動で定義すると、管理者はラベルを意味のある方法でソートし比較できるようなデータ操作方法を実装できます。そのためには、管理者は保護されたデータに関連付けるラベルをすべて事前に定義し、各ラベルに意味のあるラベル・タグ値を割り当てます。手動で割り当てることができるラベル・タグは8桁以内です。ラベル・タグの値は1以上である必要があります。

ラベル・タグ値をラベル・コンポーネントの数値に関連付ける方法を実装すると、メリットが得られる場合があります。これにより、タグを使用してデータ行を意味のある方法でグループ化できます。ただし、このアプローチは必須ではありません。機密性の高いラベルのタグは、機密性の低いラベルのタグより大きい数値に設定することをお薦めします。

表5-1に、管理者が割り当てたラベル・タグのセットを示します。この例で、管理者の設定したラベル・タグ値が、第2章「データ・ラベルおよびユーザー・ラベル」で説明したレベル、区分および行の数値に基づいていることに注意してください。

表5-1 管理者が定義したラベル・タグ(例)

ラベル・タグ ラベル文字列

10000

P

20000

C

21000

C:FNCL

21100

C:FNCL,OP

30000

S

31110

S:OP:WR

40000

HS

42000

HS:OP


この例では、PUBLICレベルのラベルは1、CONFIDENTIALレベルのラベルは2、SENSITIVEレベルのラベルは3、HIGHLY_SENSITIVEレベルのラベルは4で始まっています。

FINANCIAL区分を持つラベルは1000番台、OP区分を持つラベルは1100番台になっています。10の桁はグループWRなどを示します。

この他に、グループのみに基づく方法などもあります。その場合、タグは3110、3120、3130などとなります。

ただし、ラベル・タグは、個々のラベル・コンポーネントに割り当てられている数値にかかわらず、ラベル全体を識別します。ラベル・タグは、個別に評価される番号の集まりではなく、全体で1つの整数として使用されます。

5.1.2.2 ラベル・タグの手動定義によるデータの操作

管理者がラベル・タグを定義すると、ラベル・タグでラベル文字列全体(つまり、ラベル・コンポーネントの組合せ)を参照できるような便利な方法を取ることができます。たとえば、表5-1にあるように、タグ31110でラベル文字列S:OP:WR全体を表すことができます。

ラベル・タグは、データをパーティション化する便利な方法として使用できます。たとえば、範囲1000から1999内のラベルを持つすべてのデータを表領域Aに置き、範囲2000から2999内のラベルを持つすべてのデータを表領域Bに置くことができます。

この最も単純な表記法は、ラベル数が限られていて、それに対して各種操作を実行する必要がある場合にも役立ちます。ある会社が他の多数の会社の人事管理システムを管理している状況を考えます。会社YのユーザーはいずれもラベルC:ALPHA:CYを持ち、そのタグ210が設定されているとします。会社Yのアプリケーション・ユーザーの総数を判断するには、ホスト管理者は次のように入力します。

SELECT * FROM tab1
  WHERE hr_label = 210;

5.1.2.3 自動的に生成されるラベル・タグ

表5-2にあるように、動的に生成されるラベル・タグは10桁で、ラベル・コンポーネントに割り当てられている番号とは無関係です。データをラベル別にグループ化する手段はありません。

表5-2 生成されたラベル・タグ(例)

ラベル・タグ ラベル文字列

100000020

P

100000052

C

100000503

C:FNCL

100000132

C:FNCL,OP

100000003

S

100000780

S:OP:WR

100000035

HS

100000036

HS:OP


5.2 データ行へのラベルの割当て

挿入される行については、「ラベル付きデータの挿入」を参照してください。

既存のデータ行の場合は、ラベル付けファンクションを作成してラベルを割り当てることができます。このファンクションでは、挿入するラベルを定義する表と行の条件を正確に指定します。ファンクション名は、表またはスキーマにポリシーを適用するためのコール、または管理者によるUPDATE時に指定できます。

5.3 ラベルの表示

ラベルの検索時に、文字列値を自動的に取得することはありません。デフォルトでは、ラベル・タグの値が戻されます。2つのラベル操作ファンクションを使用すると、ラベル・タグの値と文字列表現の間で変換できます。

5.3.1 CHAR_TO_LABELを使用した文字列からラベル・タグへの変換

文字列をラベル・タグに変換するには、CHAR_TO_LABELファンクションを使用します。このファンクションでは、指定した文字列のラベル・タグが戻されます。

構文:

FUNCTION CHAR_TO_LABEL (
     policy_name     IN VARCHAR2,
     label_string    IN VARCHAR2)
RETURN NUMBER; 

例:

INSERT INTO emp (empno,hr_label) 
VALUES (999, CHAR_TO_LABEL('HR','S:A,B:G5');

HRはラベルのポリシー名、Sは機密性レベル、A,Bは区分、G5はグループです。

5.3.2 LABEL_TO_CHARを使用したラベル・タグから文字列への変換

表またはビューを問い合せて自動的に取得される行は、表またはビュー内の行のうち、問合せの修飾を満たし、問合せを行ったユーザーのラベルに支配される行すべてです。ポリシーのラベル列が非表示に設定されていない場合は、各行のラベル・タグ値が表示されます。各ラベルの文字列値を表示するには、LABEL_TO_CHARファンクションを使用する必要があります。

すべての変換は明示的に行う必要があることに注意してください。タグと文字列表現の間の自動的なキャストはありません。

構文:

FUNCTION LABEL_TO_CHAR (
     label                 IN NUMBER)
RETURN VARCHAR2; 

5.3.2.1 LABEL_TO_CHARの例

以降の各例に、LABEL_TO_CHARの使用を示します。

5.3.2.1.1 例1:

表またはビューの行のラベルを取得するには、次のようにSELECT文でポリシーのラベル列を指定します。

SELECT label_to_char (hr_label) AS label, ename FROM tab1;
  WHERE ename = 'RWRIGHT';

この文では次のように戻されます。

LABEL          ENAME
------------   ----------
S:A,B:G1       RWRIGHT
5.3.2.1.2 例2:

SELECT文のWHERE句でポリシーのラベル列を指定することもできます。次の文では、ポリシー・ラベルS:A,B:G1を持つすべての行が表示されます。

SELECT label_to_char (hr_label) AS label,ename FROM emp
  WHERE hr_label = char_to_label ('HR', 'S:A,B:G1');

この文では次のように戻されます。

LABEL           ENAME
-------------   ---------
S:A,B:G1        RWRIGHT
S:A,B:G1        ESTANTON 

また、次のように、より柔軟な文を使用して、HR_LABEL列のテキストに文字列S:A,B:G1を含むデータを検索することもできます。

SELECT label_to_char (hr_label) AS label,ename FROM emp
  WHERE label_to_char (hr_label) like '%S:A,B:G1%';

LABEL_TO_CHARファンクションを使用しない場合は、ラベル・タグが表示されます。

5.3.2.1.3 例3:

次の例は、数値列データ型(NUMBER)の動的に生成されたラベル・タグですが、LABEL_TO_CHARファンクションを使用していません。LABEL_TO_CHARファンクションを使用しない場合は、ラベル・タグが表示されます。

SQL> select empno, hr_label from emp
     where ename='RWRIGHT';

EMPNO      HR_LABEL
---------- ----------
7839       1000000562

5.3.2.2 ポリシーのラベル列が非表示に設定されている場合の表からのすべての列の取出し

ポリシー・ラベル列が非表示になっている場合、SELECT *コマンドを使用して表からすべての列を選択しても、ポリシー・ラベル列は自動的には戻されません。ラベルを取り出すように明示的に指定する必要があります。たとえば、DEPT表からすべての列を(ポリシーのラベル列の文字列表現を含め)取り出すには、次のように入力します。

SQL> column label format a10
SQL> select label_to_char (hr_label) as label, dept.*
  2  from dept;

これらのSQL文を実行すると、次のデータが戻されます。

表5-3 サンプルSQL文から戻された非表示列のデータ

LABEL DEPTNO DNAME LOC

L1

10

ACCOUNTING

NEW YORK

L1

20

RESEARCH

DALLAS

L1

30

SALES

CHICAGO

L1

40

OPERATIONS

BOSTON


これに対して、HR_LABEL列を明示的に指定しない場合は、ラベルはまったく表示されません。ポリシー列名はポリシーに基づいて設定されますが、HIDEオプションは表単位で設定されることに注意してください。

5.4 ラベルを使用したデータのフィルタリング

SQL文の処理中に、Oracle Label Securityは第7章のOracle Label Securityポリシーの作成および第10章の表およびスキーマへのポリシーの適用で説明した作成および適用手順で、データベースに定義されているセキュリティ・ポリシーを呼び出します。SELECT文の場合、ポリシーはユーザーが表示を認可されているデータ行をフィルタします。INSERT、UPDATEおよびDELETE文の場合、Oracle Label Securityはユーザーの認証に基づいて要求された操作を許可または拒否します。

この項には、次の項目が含まれます。

5.4.1 WHERE句での数値ラベル・タグの使用

この項では、SELECT文のWHERE句に数値ラベル・タグを使用する技法について説明します。

ラベルをNUMBER形式で使用すると、管理者はラベル・タグのリストで様々なレベルが区別されるようにラベルを設定できます。このような数値ラベル・タグの比較を、ORDER BY処理や論理演算子とともに使用できます。

たとえば、管理者がすべてのUNCLASSIFIEDラベルを1000番台、すべてのSENSITIVEラベルを2000番台、すべてのHIGHLY_SENSITIVEラベルを3000番台に割り当てている場合は、次のように入力するとすべてのSENSITIVEレコードをリスト表示できます。

SELECT * FROM emp
WHERE hr_label BETWEEN 2000 AND 2999;

すべてのSENSITIVEレコードとUNCLASSIFIEDレコードをリスト表示するには、次のように入力します。

SELECT * FROM emp
WHERE hr_label <3000;

すべてのHIGHLY_SENSITIVEレコードをリスト表示するには、次のように入力します。

SELECT * FROM emp
WHERE hr_label=3000;

注意:

このような問合せが意味を持つのは、管理者が、最初にラベルに割り当てたラベル・タグに、数値による順序付け方法を適用している場合のみであることに注意してください。この方法により、管理者はデータを簡単に送信できます。ただし、ラベル・タグの値が自動的に生成されると、タグの値とラベルの順序に本質的な関係は存在しません。

または、支配関係を使用して順序付け方法を設定することもできます。

5.4.2 ラベル付きデータ行の順序付け

ポリシーのラベル列を参照してORDER BY句を実行すると、管理者が設定した数値ラベル・タグの値で行を順序付けできます。次に例を示します。

SELECT * from emp
ORDER BY hr_label;

この文にはファンクションは不要であることに注意してください。この文は、管理者が設定したラベル・タグを使用できるようにします。


注意:

この場合も、このような問合せが意味を持つのは、管理者が、最初にラベルに割り当てたラベル・タグに、数値による順序付け方法を適用している場合のみです。

5.4.3 ラベルの文字表現による順序付け

LABEL_TO_CHARファンクションを使用すると、ラベルの文字表現でデータ行を順序付けできます。たとえば、次の文では、ラベルのテキスト順にソートされたすべての行が戻されます。

SELECT * FROM emp
ORDER BY label_to_char (hr_label);

5.4.4 ラベルの上限と下限の決定

この項では、複数のラベルの最小の上限または最大の下限を決定するOracle Label Securityのファンクションについて説明します。2つの単一行ファンクションは、問合せから戻される各行を操作します。結果は行ごとに1つずつ戻されます。

5.4.4.1 LEAST_UBOUNDを使用した最小の上限の検索

LEAST_UBOUND(LUBD)ファンクションは、label1およびlabel2の最小の上限である文字列ラベル、つまり、この2つを支配している単一のラベルを戻します。最小の上限は、最上位レベル、ラベル内の区分の共用部分およびラベル内のグループの共用部分です。たとえば、HIGHLY_SENSITIVE:ALPHAおよびSENSITIVE:BETAの最小の上限は、HIGHLY_SENSITIVE:ALPHA,BETAです。

構文:

FUNCTION LEAST_UBOUND (
     label1                    IN NUMBER,
     label2                    IN NUMBER) 
RETURN VARCHAR2; 

LEAST_UBOUNDファンクションが役立つのは、異なるラベルを持つ行を結合する場合です。これは、結合された行の最高水位標ラベルを提供するためです。

次の問合せでは、各従業員のラベルを所属部署のラベルと比較し、EMP表にあるかDEPT表にあるかに関係なく上位のラベルを戻します。

SELECT ename,dept.deptno, 
  LEAST_UBOUND(emp.hr_label,dept.hr_label) as label
  FROM emp, dept
  WHERE emp.deptno=dept.deptno;

この問合せでは次のデータが戻されます。

表5-4 サンプルSQL文LEAST_UBOUNDから戻されたデータ

ENAME DEPTNO LABEL

KING

10

L3:M:D10

BLAKE

30

L3:M:D30

CLARK

10

L3:M:D10

JONES

20

L3:M:D20

MARTIN

30

L2:E:D30


5.4.4.2 GREATEST_LBOUNDを使用した最大の下限の検索

GREATEST_LBOUND(GLBD)ファンクションを使用すると、2つの異なるラベルがある場合、操作に関連付けることができるデータの最下位ラベルを決定できます。このファンクションは、label1およびlabel2の最大の下限である文字列ラベルを戻します。最大の下限は、最下位レベルであり、ラベルの区分とラベルのグループの共通部分です。たとえば、HIGHLY_SENSITIVE:ALPHAおよびSENSITIVEの最大の下限はSENSITIVEです。

構文:

FUNCTION GREATEST_LBOUND (
     label1                  IN NUMBER,
     label2                  IN NUMBER) 
RETURN VARCHAR2; 

5.4.5 MERGE_LABELファンクションを使用したラベルのマージ

MERGE_LABELファンクションは、2つのラベルをマージするためのユーティリティです。このファンクションは、2つのラベルの文字列書式と、マージ形式の3文字の指定を受け入れます。構文は次のとおりです。

構文:

FUNCTION merge_label (label1 IN number,
                      label2 IN number,
                      merge_format IN VARCHAR2)
RETURN number;

有効なマージ形式を次のように3文字の文字列で指定します。

<highest level or lowest level><union or intersection of compartments><union or intersection of groups>

  • 1文字目には、2つのラベルの最上位レベルと最下位レベルのうち、どちらを使用してマージするかを示します。

  • 2文字目には、2つのラベルにある区分の共用部分と共通部分のうち、どちらを使用してマージするかを示します。

  • 3文字目には、2つのラベルにあるグループの共用部分と共通部分のうち、どちらを使用してマージするかを示します。

次の表に、MERGE_LABELのフォーマット定数の定義を示します。

表5-5 MERGE_LABELのフォーマット定数

フォーマット指定 データ型 定数 意味 フォーマットの使用位置

max_lvl_fmt

CONSTANT varchar2(1)

H

最大レベル。

第1(レベル)

min_lvl_fmt

CONSTANT varchar2(1)

L

最小レベル。

第1(レベル)

union_fmt

CONSTANT varchar2(1)

U

2つのラベルの共用部分。

第2(区分)および第3(グループ)

inter_fmt

CONSTANT varchar2(1)

I

2つのラベルの共通部分。

第2(区分)および第3(グループ)

minus_fmt

CONSTANT varchar2(1)

M

第1のラベルから第2のラベルを削除します。

第2(区分)および第3(グループ)

null_fmt

CONSTANT varchar2(1)

N

区分列に指定すると、区分は戻されません。グループ列に指定すると、グループは戻されません。

第2(区分)および第3(グループ)


たとえば、HUIの場合は、2つのラベルの最上位レベル、区分の共用部分、グループの共通部分を指定したことになります。

MERGE_LABELファンクションが特に役立つのは、開発者がLEAST_UBOUNDファンクションで意図した結果が得られない場合です。LEAST_UBOUNDファンクションをグループを含む2つのラベルに使用すると、予期したよりも機密性の低いデータ・ラベルが得られる場合があります。MERGE_LABELファンクションを使用すると、LEAST_UBOUNDファンクションで得られるグループの共用部分のかわりに、グループの共通部分を計算できます。

たとえば、グループUNITED_STATESを含むデータ・レコードのラベルと、グループUNITED_KINGDOMを含む別のデータ・レコードのラベルがあり、LEAST_UBOUNDファンクションを使用してこの2つのラベルの最小の上限を計算すると、結果として得られるラベルには、UNITED_STATESまたはUNITED_KINGDOMについて認可されているユーザーがアクセスできます。

これに対して、HUIのフォーマット句とともにMERGE_LABELファンクションを使用すると、結果的に得られるラベルには最上位レベルと区分の共用部分は含まれますが、グループは含まれません。これは、UNITED_STATESとUNITED_KINGDOMには共通部分がないためです。

5.5 ラベル付きデータの挿入

Oracle Label Securityでポリシーにより保護されている表にデータを挿入する場合は、通常、INSERT文内で数値のラベル値タグを指定する必要があります。

そのためには、必要なラベルのタグを明示的に指定するか、ラベルの文字列表現を適切なタグに明示的に変換する必要があります。これは新規ラベル・タグの生成を意味するのではなく、適切なラベル・タグの参照を意味することに注意してください。Oracle Label SecurityでOracle Internet Directoryを使用している場合、許可されるラベル(および対応するタグ)は、管理者により事前定義済でOracle Internet Directoryに存在するラベルのみです。

INSERT文でラベル値を省略できるのは、次のいずれかの場合のみです。

  1. ポリシーの適用時にLABEL_DEFAULT施行オプションが指定されている場合

  2. ポリシーの適用時に施行オプションが指定されておらず、ポリシーの作成時にLABEL_DEFAULTが指定されている場合

  3. ポリシー適用分でラベル付けファンクションが指定されている場合

1および2の場合は、ユーザーのセッションのデフォルト行ラベルが、挿入される行のラベルとして使用されます。3の場合、挿入される行のラベルは、そのラベル付けファンクションにより作成されます。

この項では、INSERT文でラベルを指定する様々な方法について説明します。

5.5.1 CHAR_TO_LABELを使用したラベルの挿入

行ラベルを挿入するには、ラベル文字列を指定してから、CHAR_TO_LABELファンクションを使用してラベルに変換できます。次の例に、表empの定義を使用して、明示的なラベルでデータを挿入する方法を示します。

INSERT INTO emp (ename,empno,hr_label)
VALUES ('ESTANTON',10,char_to_label ('HR', 'SENSITIVE'));

5.5.2 数値のラベル・タグ値を使用したラベルの挿入

CHAR_TO_LABELファンクションを使用するのではなく、ラベルの数値ラベル・タグ値を使用して、データを挿入できます。たとえば、SENSITIVEの数値ラベル・タグが3000の場合は、次のようになります。

INSERT INTO emp (ename, empno, hr_label)
VALUES ('ESTANTON', 10, 3000);

5.5.3 ラベルを指定しないデータの挿入

LABEL_DEFAULTが設定されている場合、または表に適用されているラベル付けファンクションがある場合は、INSERT文でラベルを指定する必要はありません。ラベルは自動的に提供されます。次のコマンドを入力できます。

INSERT INTO emp (ename, empno)
VALUES ('ESTANTON', 10);

結果として得られる行ラベルは、デフォルト値に従って(またはラベル付けファンクションにより)設定されます。

5.5.4 ポリシーのラベル列が非表示になっている場合のデータの挿入

ラベル列が非表示の場合、その列の存在はデータの挿入に対して透過的です。表の列を明示的にリスト表示せず、ラベル列の値を含めないINSERT文を記述できます。データのラベル付けには、セッションの行ラベルまたはラベル付けファンクション(表またはスキーマに対するポリシーの適用時に指定した場合)が使用されます。

列名を明示的に指定しなくても、表の非表示でない各列の値を指定すれば、表に挿入できます。次の例では、「例2: 数値列データ型と非表示列」で説明した表に1行を挿入する方法を示します。

INSERT INTO emp
VALUES ('196','ESTANTON',Technician,RSTOUT,50000,10);

ラベルは、次のいずれかになります。

  • 指定したラベル

  • 適用されているポリシーのLABEL_DEFAULTオプションで設定されるラベル

  • 適用されているポリシーで指定されたラベル付けファンクションにより作成されるラベル


    注意:

    ポリシー・ラベル列が非表示でない場合は、INSERT文にラベル値(場合によっては、コンマで示されるnull)を明示的に含める必要があります。

5.5.5 TO_DATA_LABELを使用したラベルの挿入


注意:

Oracle Label SecurityがOracle Internet Directoryで動作するようにインストールされている場合、ラベルはOracle Internet Directoryでolsadmintoolコマンドを使用して集中管理されるため、動的ラベル生成は許可されません。付録B「Oracle Internet Directoryを使用したLabel Security用コマンドライン・ツール」を参照してください。

したがって、Oracle Label SecurityがOracle Internet Directory対応の場合、このTO_DATA_LABELファンクションは使用できず、使用するとエラー・メッセージが生成されます。


データの挿入時に新規ラベルを動的に生成する場合は、TO_DATA_LABELファンクションを使用して、有効なデータ・ラベルが生成されるように保証できます。そのためには、TO_DATA_LABELファンクションに対するEXECUTE認可が必要です。

CHAR_TO_LABELファンクションでは、トランザクションが成功するためにはラベルがすでに存在するデータ・ラベルである必要がありますが、TO_DATA_LABELにはこの要件がありません。有効なデータ・ラベルが自動的に作成されます。

次に例を示します。

INSERT INTO emp (ename, empno, hr_label)
VALUES ('ESTANTON', 10, to_data_label ('HR', 'SENSITIVE'));

注意:

TO_DATA_LABELファンクションを使用するには、個別に明示的に付与する必要があります。また、その使用は厳密に制御する必要があります。


関連項目:

ラベル付きデータの挿入、更新および削除の詳細は、第10章「表およびスキーマへのポリシーの適用」を参照してください。

5.6 SA_SESSIONを使用したセッション・ラベルと行ラベルの変更

特定のセッション中に、ユーザーは管理者により設定された認可の範囲内で各自のラベルを変更できます。

この項には、次の項目が含まれます。

5.6.1 セッション・ラベルと行ラベルを変更するSA_SESSIONファンクション

次のファンクションを使用すると、ユーザーはセッション・ラベルと行ラベルを変更できます。

表5-6 セッション・ラベルを変更するファンクション

ファンクション 用途

SA_SESSION.SET_LABEL

ユーザーは、読取りアクセス権を持つ新規レベル、新規区分およびグループを設定できます。

SA_SESSION.SET_ROW_LABEL

ユーザーは新規の行に適用するデフォルトの行ラベルを設定できます。

SA_SESSION.RESTORE_DEFAULT_LABELS

ユーザーは、現行のセッション・ラベルと行ラベルを、格納されているデフォルト設定にリセットできます。

SA_SESSION.SAVE_DEFAULT_LABELS

ユーザーは、現行のセッション・ラベルと行ラベルを将来のセッションのデフォルトとして格納できます。


5.6.2 SA_SESSION.SET_LABELを使用したセッション・ラベルの変更

SET_LABELプロシージャを使用すると、現行のデータベース・セッションのラベルを設定できます。

構文:

PROCEDURE SET_LABEL (policy_name IN VARCHAR2,
                     label IN VARCHAR2); 
パラメータ 指定
policy_name 既存のポリシーの名前
label ラベルとして設定する値

ユーザーは、セッション・ラベルを次のように設定できます。

  • 最大レベル以下で、かつ最小レベル以上のレベルに設定する。

  • 認可された区分リストにある区分を含むように設定する。

  • 認可されたグループ・リストにあるグループを含むように設定する。(認可グループのサブグループは、認可リストに暗黙的に含まれます。)

セッション・ラベルを変更すると、そのセッションの行ラベルの値に影響する場合があることに注意してください。セッションの行ラベルには、ユーザーが書込みアクセス権を持っている区分とグループのサブセットが含まれています。これは、セッション・ラベルと等価の場合と、等価でない場合があります。たとえば、SA_SESSION.SET_LABELコマンドを使用して現行セッション・ラベルをC:A,B:USに設定した場合に、A区分に対する書込みアクセス権しか持っていなければ、行ラベルはC:Aに設定されます。

5.6.3 SA_SESSION.SET_ROW_LABELを使用した行ラベルの変更

SET_ROW_LABELプロシージャを使用すると、現行データベース・セッションのデフォルトの行ラベル値を設定できます。ラベルの区分とグループは、ユーザーが書込みアクセス権を持つセッション・ラベルの区分およびグループのサブセットであることが必要です。LABEL_DEFAULTオプションが設定されている場合は、ユーザーがラベルを明示的に指定しなければ、この行ラベル値が挿入時に使用されます。

構文:

PROCEDURE SET_ROW_LABEL (policy_name IN VARCHAR2,
                         row_label IN VARCHAR2); 
パラメータ 指定
policy_name 既存のポリシーの名前
label デフォルトの行ラベルとして設定する値

SA_SESSION.SET_ROW_LABELプロシージャを使用してデフォルトの行ラベル値を設定しない場合、この値はセッション・ラベルから自動的に導出されます。これには、セッション・ラベルのレベルと、ユーザーが書込みアクセス認可を持つセッション・ラベルの区分とグループのサブセットが含まれています。

セッション・ラベルに変更があると、行ラベルは自動的にリセットされます。たとえば、セッション・レベルをHIGHLY_SENSITIVEからSENSITIVEに変更すると、行ラベルのレベル・コンポーネントは自動的にSENSITIVEに変更されます。

ユーザーは、独自に行ラベルを設定できますが、含めることができるのは次の要素のみです。

  • セッション・ラベルのレベル以下で、かつ、ユーザーの最小レベル以上のレベル。

  • ユーザーが書込みアクセス権を持つように認可されているセッション・ラベルからの、区分とグループのサブセット。

ユーザーが行ラベルに無効な値の設定を試みると、操作は許可されず、その行ラベル値は変更されません。

5.6.4 SA_SESSION.RESTORE_DEFAULT_LABELSを使用したラベルのデフォルトのリストア

RESTORE_DEFAULT_LABELSプロシージャは、セッション・ラベルと行ラベルを、データ・ディクショナリに格納されているそれらのラベルでリストアします。このコマンドが役立つのは、SA_SESSION.SET_LABELコマンドが処理された後に値をリセットする場合です。

構文:

PROCEDURE RESTORE_DEFAULT_LABELS (policy_name in VARCHAR2); 

policy_nameでは既存のポリシーの名前を指定します。

5.6.5 SA_SESSION.SAVE_DEFAULT_LABELSを使用したラベルのデフォルトの保存

SAVE_DEFAULT_LABELSプロシージャでは、現行のセッション・ラベルと行ラベルが、初期セッション・ラベルおよびデフォルトの行ラベルとして格納されます。また、現行のセッション・ラベルと行ラベルを反映するようにデフォルトを変更できます。保存されたラベルは、将来のセッションの初期デフォルト設定として使用されます。

構文:

PROCEDURE SAVE_DEFAULT_LABELS (policy_name in VARCHAR2); 

policy_nameでは既存のポリシーの名前を指定します。

データベースへのログイン時には、デフォルトのセッション・ラベルと行ラベルを使用して、セッション・ラベルと行ラベルが初期化されます。管理者は最初にユーザーのOracle Label Securityのラベルを認可するときに、ユーザーのデフォルト・レベル、デフォルト区分およびデフォルト・グループも定義しています。セッション・ラベルと行ラベルを変更し、その値をデフォルト・ラベルとして保存する必要がある場合は、SA_SESSION.SAVE_DEFAULT_LABELSプロシージャを使用できます。

このプロシージャが役立つのは、複数のセッションがあり、すべての追加セッションに同じラベルが使用されるようにする必要がある場合です。現行ラベルをデフォルトとして保存し、将来のすべてのセッションに初期ラベルとして使用できます。

Oracle Formsを通じてデータベースに接続し、レポートを実行する必要がある場合を考えます。Oracle Reportsをコールする前に現行セッション・ラベルをデフォルトとして保存すると、Oracle ReportsではOracle Formsで使用中のものと確実に同じラベルで初期化されます。


注意:

SA_SESSION.SAVE_DEFAULT_LABELSプロシージャにより、管理者が設定した設定がオーバーライドされます。

5.6.6 SA_SESSIONファンクションを使用したセッション属性の表示

SA_SESSIONファンクションを使用すると、セッションのポリシー属性を表示できます。

5.6.6.1 すべてのセキュリティ属性を戻すUSER_SA_SESSIONビュー

USER_SA_SESSIONビューを使用すると、セキュリティ属性の値を表示できます。このビューへのアクセスはPUBLICです。このため、現行セッションのセキュリティ属性を表示できます。次に例を示します。

表5-7 セキュリティ属性の名前と型

名前 NULL

POLICY_NAME

NOT NULL

VARCHAR2(30)

SA_USER_NAME


VARCHAR2(4000)

PRIVS


VARCHAR2(4000)

MAX_READ_LABEL


VARCHAR2(4000)

MAX_WRITE_LABEL


VARCHAR2(4000)

MIN_LEVEL


VARCHAR2(4000)

LABEL


VARCHAR2(4000)

COMP_WRITE


VARCHAR2(4000)

GROUP_WRITE


VARCHAR2(4000)

ROW_LABEL


VARCHAR2(4000)


5.6.6.2 個々のセキュリティ属性を戻すファンクション

SA_SESSIONファンクションは、唯一の入力パラメータとしてpolicy_nameを取ります。SQL文で使用できるように、VARCHAR2型の文字列値を戻します。

表5-8 セキュリティ属性を表示するSA_SESSIONファンクション

ファンクション 用途

SA_SESSION.PRIVS

現行セッションの権限セットをカンマ区切りのリスト形式で戻します。

SA_SESSION.MIN_LEVEL

セッションについて認可された最小レベルを戻します。

SA_SESSION.MAX_LEVEL

セッションについて認可された最大レベルを戻します。

SA_SESSION.COMP_READ

ユーザーが読取りを認可されている区分のカンマ区切りのリストを戻します。

SA_SESSION.COMP_WRITE

ユーザーが書込みを認可されている区分のカンマ区切りのリストを戻します。これはSA_SESSION.COMP_READのサブセットです。

SA_SESSION.GROUP_READ

ユーザーが読取りを認可されているグループのカンマ区切りのリストを戻します。

SA_SESSION.GROUP_WRITE

ユーザーが書込みを認可されているグループのカンマ区切りのリストを戻します。これはSA_SESSION.GROUP_READのサブセットです。

SA_SESSION.LABEL

ユーザーが現在作業中のセッション・ラベル(レベル、区分およびグループ)を戻します。ユーザーはSA_SESSION.SET_LABELを使用して、この値を変更できます。「SA_SESSION.SET_LABELを使用したセッション・ラベルの変更」を参照してください。

SA_SESSION.ROW_LABEL

セッションのデフォルトの行ラベル値を戻します。ユーザーはSA_SESSION.SET_ROW_LABELを使用して、この値を変更できます。「SA_SESSION.SET_ROW_LABELを使用した行ラベルの変更」を参照してください。

SA_SESSION.SA_USER_NAME

現行のOracle Label Securityセッションに対応付けられたユーザー名を戻します。


たとえば、次の文では、Human Resourcesポリシーの現行セッション・ラベルが表示されます。

SQL> select sa_session.label ('human_resources')
  2  from dual;

SA_SESSION.LABEL('HUMAN_RESOURCES')                                                                 
---------------------------------------------
L3:M,E 

関連項目:

数値ラベル・タグとブール値を戻す他のファンクションは、「SA_UTLファンクションを使用したラベル情報の設定と戻し」を参照してください。