...

6. 柔軟なセキュリティー - 新しい行および列のアクセス制御機能

by user

on
Category: Documents
193

views

Report

Comments

Transcript

6. 柔軟なセキュリティー - 新しい行および列のアクセス制御機能
6. 柔軟なセキュリティー
- 新しい行および列のアクセス制御機能
本資料掲載事項は、ある特定の環境・使用状況においての正確性がIBMによって確認されていますが、すべての環境において同様の結果が得られる保証は
ありません。これらの技術を自身の環境に適用する際には、自己の責任において十分な検証と確認を実施いただくことをお奨めいたします。
1
© 2012 IBM Corporation
内容
• RCAC (Row and Column Access Control) 機能
2
© 2012 IBM Corporation
RCAC
(行および列のアクセス制御)
3
© 2012 IBM Corporation
行および列のアクセス制御機能のポジション
• この機能が必要となる背景
要件
• マネージャーが自分の部下のデータのみを見
れるように、確実に制限したい!
• 許可されていないユーザーに対し、口座情報
や電話番号、カード番号といった情報を確実
にマスキングしたい!
現状
• VIEWやアプリケーションロジックで制限を
行っている
• ただし、DATAACCESS権限を持っている
ユーザーであれば、VIEWやアプリケーション
ロジックの制限をバイパスして参照が可能
4
© 2012 IBM Corporation
行および列のアクセス制御 機能概要
• 機能特徴
• データセキュリティの新しいレイヤー
• 行、列、またはその組合せで、
以下のアクセス制御を実現
• 行に対する参照可否の権限設定
• 列に対するマスキング
• ユーザー、ロール、グループを利用
• お客様にとっての価値
• より詳細なアクセス制御が可能
• より強固なアクセス制御が可能
• 実装が容易
• アプリケーションからは透過的に利用可能
5
© 2012 IBM Corporation
アクセス制御のイメージ
アクセス制御を行う
データは見えない
全ての情報が見える
ADAM
JOHN
CUSTID
EMPNAME
ACCOUNT
BALANCE
001
MARY
SALLY
0123-88888
100000
002
MARY
MICHAEL
1123-99999
5000
003
PETER
EMILY
2123-77777
0
担当顧客の
情報だけ見える
MARY
6
CUSTNAME
ACCOUNT が
‘XXXX-XXXXX’
に見える
BOB
© 2012 IBM Corporation
アクセス制御の作成方法と手順
• 行レベルのアクセス制御(CREATE PERMISSION)
• 誰が、どの行にアクセスできるか
create permission cust on db2admin.sales for rows where
( verify_role_for_user(SESSION_USER,‘ACCOUNTANT’)=1 )
OR
( verify_role_for_user(SESSION_USER,‘CUSTOMER’) =1 )
enforced for all access enable
alter table db2admin.sales activate row access control
• 列レベルのアクセス制御(CREATE MASK)
• 列(データ)に対して、誰に、どのようなマスキングを行うか
create mask account_mask on db2admin.sales for column account return
case when verify_role_for_user(SESSION_USER,'ACCOUNTANT')=1
then 'XXXX-XXXXX‘
else account
end enable
alter table db2admin.sales activate column access control
7
© 2012 IBM Corporation
Note:
• 作成されたアクセス制御に関してはカタログ表に保存される
• SYSCAT.CONTROLS
• SYSCAT.CONTROLSDEP
• アクセス制御の有効/無効については、SYSCAT.TABLES表に保存されている
• CONTROL列
• ブランク
• 何のアクセス制御も有効になっていない
• C
• 列のアクセス制御のみ有効(MASK)
• R
• 行のアクセス制御のみ有効(PERMISSION)
• B
• 行および列のアクセス制御が有効
8
© 2012 IBM Corporation
Note:SYSCAT.CONTROLS
データ・タイ データ・
列の
スケ
列名
プ・スキーマ タイプ名
長さ
ール
------------------------------- --------- ------------------- ---------- ----CONTROLSCHEMA
SYSIBM
VARCHAR
128
0
CONTROLNAME
SYSIBM
VARCHAR
128
0
OWNER
SYSIBM
VARCHAR
128
0
OWNERTYPE
SYSIBM
CHARACTER
1
0
TABSCHEMA
SYSIBM
VARCHAR
128
0
TABNAME
SYSIBM
VARCHAR
128
0
COLNAME
SYSIBM
VARCHAR
128
0
CONTROLID
SYSIBM
INTEGER
4
0
CONTROLTYPE
SYSIBM
CHARACTER
1
0
ENFORCED
SYSIBM
CHARACTER
1
0
IMPLICIT
SYSIBM
CHARACTER
1
0
ENABLE
SYSIBM
CHARACTER
1
0
VALID
SYSIBM
CHARACTER
1
0
RULETEXT
SYSIBM
CLOB
2097152
0
TABCORRELATION
SYSIBM
VARCHAR
128
0
QUALIFIER
SYSIBM
VARCHAR
128
0
FUNC_PATH
SYSIBM
CLOB
2048
0
COLLATIONSCHEMA
SYSIBM
VARCHAR
128
0
COLLATIONNAME
SYSIBM
VARCHAR
128
0
COLLATIONSCHEMA_ORDERBY
SYSIBM
VARCHAR
128
0
COLLATIONNAME_ORDERBY
SYSIBM
VARCHAR
128
0
CREATE_TIME
SYSIBM
TIMESTAMP
10
6
ALTER_TIME
SYSIBM
TIMESTAMP
10
6
REMARKS
SYSIBM
VARCHAR
254
0
NULL
-----いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
いいえ
はい
いいえ
はい
いいえ
いいえ
はい
24 レコードが選択されました。
9
© 2012 IBM Corporation
Note:
select substr(controlname,1,40)controlname, substr(tabname,1,10)tabname, substr(OWNER,1,10)owner,
substr(COLNAME,1,10)colname, controltype as type, enable,implicit,
substr(ruletext,1,100)ruletext from syscat.controls
CONTROLNAME
---------------------------------------CUST
SYS_DEFAULT_ROW_PERMISSION__CUSTOMER
ACCOUNT_MASK
PARTROW
SYS_DEFAULT_ROW_PERMISSION__PARTTBL
PART_MASK
TABNAME
---------CUSTOMER
CUSTOMER
CUSTOMER
PARTTBL
PARTTBL
PARTTBL
OWNER
---------TAKAYA
SYSIBM
TAKAYA
TAKAYA
SYSIBM
TAKAYA
COLNAME
TYPE ENABLE
---------- ---- -----R
Y
R
Y
ACCOUNT
C
Y
R
Y
R
Y
C2
C
Y
IMPLICIT
-------N
Y
N
N
Y
N
RULETEXT
--------------------------------------------------------( verify_role_for_user(SESSION_USER,'ACCOUNTANT')=1 ) OR
1 = 0
case when verify_role_for_user(SESSION_USER,'ACCOUNTANT')=1
( verify_role_for_user(SESSION_USER,'ACCOUNTANT')=1 ) OR
1 = 0
case when verify_role_for_user(SESSION_USER,'ACCOUNTANT')=1
10
© 2012 IBM Corporation
Note:
• 権限をACTIVATEすると、SYS_DEFAULT_* のアクセス制御が自動的に内部的に作
成される。
• それらは、RULE_TEXTで、「(1=0)」となっている。
• (1=0)という条件は、他の行レベルのアクセス制御が作成されてACTIVATEされるまで
そのデータは誰にも見せないというもの(NOACCESS)。
• これにより、不本意なデータ公開を防いでいる。
• 後述で、アクセス制御が有効になっているパーティション表からパーティションをデタッ
チすると、デタッチされた表に「(1=0)」のアクセス制御が自動的に適用される。
• 表をデタッチすることで、データが公開されることを防いでいる。
11
© 2012 IBM Corporation
Note:SYSCAT.CONTROLDEP
• アクセス制御の従属関係を保存する
>db2 describe table syscat.controldep
データ・タイ データ・
列の
スケ
列名
プ・スキーマ タイプ名
長さ
ール NULL
------------------------------- --------- ------------------- ---------- ----- -----DSCHEMA
SYSIBM
VARCHAR
128
0 いいえ
DNAME
SYSIBM
VARCHAR
128
0 いいえ
DTYPE
SYSIBM
CHARACTER
1
0 いいえ
BTYPE
SYSIBM
CHARACTER
1
0 いいえ
BSCHEMA
SYSIBM
VARCHAR
128
0 いいえ
BMODULENAME
SYSIBM
VARCHAR
128
0 はい
BNAME
SYSIBM
VARCHAR
128
0 いいえ
BMODULEID
SYSIBM
INTEGER
4
0 はい
BCOLNAME
SYSIBM
VARCHAR
128
0 はい
9 レコードが選択されました。
12
© 2012 IBM Corporation
Note:
select substr(dname,1,20)dname, dtype,btype,
substr(bname,1,10)bname, substr(bcolname,1,20)bcolname
from syscat.controldep
DNAME
-------------------CUST
CUST
CUST
PARTROW
PARTROW
PARTROW
ACCOUNT_MASK
PART_MASK
CUST
CUST
PARTROW
PARTROW
SYS_DEFAULT_ROW_PERM
SYS_DEFAULT_ROW_PERM
ACCOUNT_MASK
PART_MASK
DTYPE
----y
y
y
y
y
y
2
2
y
y
y
y
y
y
2
2
BTYPE
----C
C
C
C
C
C
C
C
V
T
V
T
T
T
T
T
BNAME
---------DBAUTH
DBAUTH
CUSTOMER
DBAUTH
DBAUTH
PARTTBL
CUSTOMER
PARTTBL
DBAUTH
CUSTOMER
DBAUTH
PARTTBL
CUSTOMER
PARTTBL
CUSTOMER
PARTTBL
BCOLNAME
-------------------GRANTEE
SECURITYADMAUTH
EMPNAME
GRANTEE
SECURITYADMAUTH
C1
ACCOUNT
C2
-
16 レコードが選択されました。
13
© 2012 IBM Corporation
Note:SYSCAT.TABLESのCONTROL
select substr(tabname,1,10)tabname,control from syscat.tables where tabname='CUSTOMER'
TABNAME
CONTROL
--------- ------CUSTOMER
B
alter table customer deactivate column access control
select substr(tabname,1,10)tabname,control from syscat.tables where tabname='CUSTOMER‘
TABNAME
CONTROL
---------- ------CUSTOMER
R
alter table customer deactivate row access control
select substr(tabname,1,10)tabname,control from syscat.tables where tabname='CUSTOMER'
TABNAME
CONTROL
---------- ------CUSTOMER
alter table customer activate column access control
select substr(tabname,1,10)tabname,control from syscat.tables where tabname='CUSTOMER'
TABNAME
CONTROL
---------- ------CUSTOMER
C
14
© 2012 IBM Corporation
アクセス制御の動き
• 基本ルール
• SELECTできないデータはUPDATE/DELETEできない
• エラーにはならず、あたかもデータが存在しないような振る舞いをする
(SQL0110W)
• SELECTできないデータはINSERTできない
• エラー(SQL20471N)になる。詳細はテスト結果を参照。
• UPDATE後にSELECTできなくなるデータはUPDATEできない
• エラー (SQL20471N)になる。詳細はテスト結果を参照。
• マスキングは結果を表示する際に行われる
• DB2が内部的に行う処理はマスキングされない
•
•
•
•
•
15
ORDER BY
GROUP BY
HAVING
SELECT DISTINCT
ORDER BY
• 例えば、ORDER BYで指定されたカラムがマスキングされていた場合、指
定されたカラムのオリジナルデータで order by されるが、ユーザに表示す
る際にはデータはマスキングされる
© 2012 IBM Corporation
アクセス制御が無視される動作
• DB2が内部的に行う処理ではアクセス制御は無視される
• EXPLAIN表への挿入
• EVENTモニター表への挿入
• MQTのリフレッシュ
• MQTのステージング表への挿入
• Temporal履歴表への挿入
• AS OFクエリーでの Temporal履歴表へのアクセス
• Query reroute optimization でMQTにアクセス
• 主キー、ユニークキー、チェック制約のスキャン
• RIスキャン
• トリガー内の変位変数・変位表
16
© 2012 IBM Corporation
Note:
• 例えば、RI制約で親表からデータをDELETEすると子表からもデータを
DELETEする必要がある(cascade deleteの場合)。
もし、子表からDELETEする表がアクセス制御で参照不可能であっても、削除
される。
親表
cascade delete
DELETE
子表
USER1
17
USER1には見えない
データでも削除可能
© 2012 IBM Corporation
Note:テスト結果
create table ptbl(c1 int, c2 int not null unique, c3 char(10));
create table ctbl(c1 int, c2 int references ptbl(c2) on delete cascade, c3 char(10));
insert into ptbl values(1,1,'PDATA');
insert into ctbl values(1,1,'CData');
insert into ctbl values(10,1,'CData');
>db2 select * from ctbl
C1
C2
----------- ----------1
1
10
1
C3
---------CData
CData
2 レコードが選択されました。
>db2 "create permission delperm on ctbl for rows where c1=10 enforced for all access enable“
DB20000I SQL コマンドが正常に完了しました。
>db2 alter table ctbl activate row access control
DB20000I SQL コマンドが正常に完了しました。
>db2 select * from ctbl
C1
C2
C3
----------- ----------- ---------10
1 CData
RCACが有効になっているため、
1行しか参照できていない
1 レコードが選択されました。
18
© 2012 IBM Corporation
Note:テスト結果
>db2 delete from ptbl where c2=1
DB20000I SQL コマンドが正常に完了しました。
このDELETEにより、子表から
(1,1,’CData’)が削除される
>db2 select * from ctbl
C1
C2
C3
----------- ----------- ---------0 レコードが選択されました。
>db2 alter table ctbl deactivate row access control
DB20000I SQL コマンドが正常に完了しました。
>db2 select * from ctbl
C1
C2
C3
----------- ----------- ---------0 レコードが選択されました。
19
ユーザーには(1,1,’CData’)は参照できない
データだが、cascade delete により削除される
データは子表からエラーなく削除された
© 2012 IBM Corporation
自動的に行レベルのアクセス制御が引継がれる操作
• アクセス制御が有効になっている表に対するMQTの作成
• アクセス制御が有効になっている表に対して作成されたMQTのス
テージング表の作成
• MQTの元表に対するアクセス制御の有効化
• アクセス制御が有効になっているTemporal表の履歴表の作成
• 履歴表が存在するTemporal表のアクセス制御の有効化
• アクセス制御が有効になっているパーティション表からデタッチした表
• 下線の表が引き継がれる対象となる表
20
© 2012 IBM Corporation
Note:
• ただし、同じアクセス制御が引き継がれるわけではない
• データ漏れを防ぐためNO ACCESSのアクセス制御が作成される
• 同じアクセス制御を行いたければ再度アクセス制御を定義し、
ACTIVATEしなければならない
21
© 2012 IBM Corporation
Note:テスト結果
• アクセス制御が有効になっているパーティション表からデタッチした場合
パーティション表のCOLUMNとROWのRCACが定義されている
【SYSCAT.CONTROLS】
CONTROLNAME
---------------------------------------PARTR
SYS_DEFAULT_ROW_PERMISSION__PARTTBL
PARTC
TABNAME
---------PARTTBL
PARTTBL
PARTTBL
OWNER
COLNAME
---------- ---------TAKAYA
SYSIBM
TAKAYA
C3
TYPE
---R
R
C
ENABLE
-----Y
Y
Y
IMPLICIT
-------N
Y
N
RULETEXT
----------------( verify_role_for_
1 = 0
case when verify_ro
3 レコードが選択されました。
【SYSCAT.CONTROLDEP】
DNAME
-------------------PARTR
PARTC
PARTR
SYS_DEFAULT_ROW_PERM
PARTC
DTYPE
----y
2
y
y
2
BTYPE
----C
C
T
T
T
BNAME
---------PARTTBL
PARTTBL
PARTTBL
PARTTBL
PARTTBL
BCOLNAME
-------------------C1
C3
-
5 レコードが選択されました。
22
© 2012 IBM Corporation
Note:テスト結果
alter table parttbl detach partition q5 into table dettbl
DB20000I SQL コマンドが正常に完了しました。
【SYSCAT.CONTROLS】
CONTROLNAME
---------------------------------------PARTR
SYS_DEFAULT_ROW_PERMISSION__PARTTBL
PARTC
SYS_DEFAULT_ROW_PERMISSION__DETTBL
【SYSCAT.CONTROLDEP】
DNAME
DTYPE
-------------------- ----PARTR
y
PARTC
2
PARTR
y
SYS_DEFAULT_ROW_PERM y
PARTC
2
SYS_DEFAULT_ROW_PERM y
BTYPE
----C
C
T
T
T
T
BNAME
---------PARTTBL
PARTTBL
PARTTBL
PARTTBL
PARTTBL
DETTBL
select * from dettbl
C1
C2
C3
----------- ---------- ---------0 レコードが選択されました。
23
TABNAME
---------PARTTBL
PARTTBL
PARTTBL
DETTBL
OWNER
COLNAME
---------- ---------TAKAYA
SYSIBM
TAKAYA
C3
SYSIBM
TYPE
---R
R
C
R
ENABLE
-----Y
Y
Y
Y
IMPLICIT
-------N
Y
N
Y
RULETEXT
----------------( verify_role_for_
1 = 0
case when verify_ro
1 = 0
BCOLNAME
-------------------(1=0)のアクセス制御だけ作られる
C1
C3
(1=0)とは、他にアクセス制御を定義する、も
しくはアクセス制御をDEACTIVATEしないと
誰も見れないというもの
-
誰もデタッチした表からデータを見ることはできない。
見るためには、デタッチした表のRCACをDEACTIVATEする、
もしくは新たにRCACをデタッチ表に対して作成する
© 2012 IBM Corporation
ユーティリティとの互換性
• EXPORT
• アクセス制御が有効となる
• Exportしたユーザに応じてExportされる件数が異なる
• IMPORT
• アクセス制御が有効となる
• 権限の無いデータをINSERTしようとするとエラーになる
SQL20471N INSERT または UPDATE ステートメントは、結果の行が行の許可
を満たさないため失敗しました。SQLSTATE=22542
• LOAD
• アクセス制御は無視される
• db2look
• アクセス制御の定義を出力可能
24
© 2012 IBM Corporation
EXPLAIN と NORCAC
• EXPLAINにNORCACオプションが追加された
• オプション無し
• アクセス制御を追加したSQL文に書き換え、実行される
• アクセス制御の定義によってはアクセスプランも変わる
• NORCAC有り
• アクセス制御がないものとして実行される
• SET CURRENT EXPLAIN MODE EXPLAIN NORCAC
25
© 2012 IBM Corporation
Note:
• NORCAC指定無し(RCACを含めたExplain)
• SET CURRENT EXPLAIN MODE EXPLAIN
• 実行SQL:select * from customer
SELECT Q3."CUSTID" AS "CUSTID", Q3."EMPNAME" AS "EMPNAME", Q3."CUSTOMER" AS "CUSTOMER",
$INTERNAL_FUNC$() AS "ACCOUNT", Q3."BALANCE" AS "BALANCE" FROM TAKAYA.CUSTOMER AS Q3
WHERE (((VERIFY_ROLE_FOR_USER(3, $INTERNAL_FUNC$(), USER, 'ACCOUNTANT') = 1) OR
((VERIFY_ROLE_FOR_USER(3, $INTERNAL_FUNC$(), USER, 'CUSTOMER') = 1) AND (Q3."EMPNAME" =
USER))) OR ($INTERNAL_FUNC$() = (SELECT Q1."GRANTEE" FROM SYSIBM.SYSDBAUTH AS Q1 WHERE
(Q1."SECURITYADMAUTH" = 'Y'))))
• NORCAC指定有り(RCACを含めないExplain)
• SET CURRENT EXPLAIN MODE EXPLAIN NORCAC
• 実行SQL:select * from customer
SELECT Q1."CUSTID" AS "CUSTID", Q1."EMPNAME" AS "EMPNAME", Q1."CUSTOMER" AS "CUSTOMER",
Q1."ACCOUNT" AS "ACCOUNT", Q1."BALANCE" AS "BALANCE" FROM TAKAYA.CUSTOMER AS Q1
26
© 2012 IBM Corporation
権限に関する考慮点
• CREATE PERMISSION/MASK にはSECADM権限が必要
• ALTER TABLEにてアクセス制御を有効にするためには
SECADM権限 AND (DBADM権限 OR ALTER特権)が必要
• SECADM権限を持つユーザーにDBADM権限を付与するとオール
マイティになるので注意
• 以下の操作は従属するパッケージを無効にする
• アクセス制御のActivate/Deactivate
• アクセス制御のCreate/Drop/Alter
先に、アクセス制御を作成するようにしましょう
27
© 2012 IBM Corporation
Note:
• SECADM権限なしでALTER TABLE ACTIVATE/DACTIVATEしようとする
と以下のようなエラーになる
> db2 alter table takaya.customer deactivate row access control
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
SQL0551N "DB2ADMIN" は、オブジェクト "TABLE" で処理 "ALTER ACCESS CONTROL“
を実行する必要な権限または特権を持っていません。 SQLSTATE=42501
• SECADM権限のみでALTER TABLE ACTIVATE/DACTIVATEしようとする
と以下のようなエラーになる
> db2 alter table takaya.customer deactivate row access control
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
SQL0551N "DB2ADMIN" は、オブジェクト "TAKAYA.CUSTOMER" で処理 "ALTER TABLE“
を実行する必要な権限または特権を持っていません。 SQLSTATE=42501
28
© 2012 IBM Corporation
考慮点 (1/3)
• アクセス制御を定義できるのは表のみ
• 以下は対象外
•
•
•
•
•
•
•
•
29
ニックネーム
作成済み一時表
宣言済み一時表
ビュー
シノニム
型付き表
別名
カタログ表
© 2012 IBM Corporation
考慮点 (2/3)
• アクセス制御定義内では以下のオブジェクトは参照できない
•
•
•
•
•
•
•
•
•
•
•
•
•
•
30
作成済みのグローバル一時表または宣言済みのグローバル一時表
ニックネーム
表関数
メソッド
パラメーター・マーカー
非セキュアとして定義されているユーザー定義関数
非決定論的である、または外部アクションを持つ関数や式
(ROW CHANGE 式、シーケンス式など)
XMLQUERY スカラー関数
XMLEXISTS 述部
OLAP 指定
SELECT 文節内の * または name.*
疑似列
SELECT 節を指定しない集約関数
前記のいずれかの制限が定義に含まれるビュー
© 2012 IBM Corporation
考慮点 (3/3)
• 以下のデータに関してはマスキングを行えない
• XML
• LOB
• 生成列
• アクセス制御が定義されている表に対してUDFやトリガーを作
成する場合は、SECURE属性が必要
• SQL20470N
31
© 2012 IBM Corporation
Note:トリガーのテスト例
• アクセス制御されている表に対してSECURED指定の無いトリガーを作成使
用とした場合
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
SQL20470N “TRIGGER” の “TAKAYA.SEC_INSTRIG“
がセキュアなものとして定義されておらず、”TABLE” の “TAKAYA.CUSTOMER“
がそれに依存しているため、CREATE または ALTER ステートメントが失敗しました。
LINE NUMBER=3.
SQLSTATE=428H8
• トリガーにより更新される表に対してユーザの許可が無い場合
> db2 “insert into takaya.t1 values(‘222’,‘PETER’)“
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
SQL0723N トリガー ”TAKAYA.SEC_INSTRIG2” のトリガー SQL
ステートメントでエラーが発生しました。 エラーに関して戻された情報には、SQLCODE
“-20471”、 SQLSTATE “22542” およびメッセージ・トークン “” が含まれています。
SQLSTATE=09000
SQL20471N INSERT または UPDATE ステートメントは、結果の行が行
の許可を満たさないため失敗しました。
32
© 2012 IBM Corporation
LBACとの比較
 LBACのセキュリティモデル
USの政府機関や情報機関を対象とした、ラベルベースのセキュリティーモ
デル。例えばUS 国防総省やその関連機関のように、データあるいは組織
に対して、アクセスコントロールを明確に階層定義できるようなモデル。
 RCACのセキュリティーモデル
より一般的なユーザーにも利用可能となるよう、データあるいは組織に対す
る階層構造を必要としないセキュリティーモデル。
 LBACとRCAC
LBACは非常に強固なセキュリティーモデル。
そのため設計や構築において多少手間がかかる。
対して、RCACはより容易に望むセキュリティモデルを実現できる。
33
© 2012 IBM Corporation
参考資料
• DB2 best practices: A practical guide to implementing row and column access
control
• http://www.ibm.com/developerworks/data/bestpractices/rcac/index.html
• 行および列のアクセス制御 (RCAC) の概要
• http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.admin.s
ec.doc/doc/c0057423.html
• SYSCAT.CONTROLS
• http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.sql.ref.d
oc/doc/r0059052.html
• SYSCAT.CONTROLDEP
• http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.sql.ref.d
oc/doc/r0059051.html
• CREATE/ALTER TABLE、CREAT/ALTER PERMISSION、CREATE/ALTER
MASKにも様々な記載あり(マニュアル)
34
© 2012 IBM Corporation
まとめ
RCAC
•新しいセキュリティー・モデル
•容易に行、列、その組合せでアクセス制御が可能
–行のフィルタリング
–列のマスキング
•アプリケーションからは透過的に実装可能
35
© 2012 IBM Corporation
(参考)テスト結果
36
© 2012 IBM Corporation
シンプル・シナリオ
• 登場人物
• ADAM
• セキュリティー管理者
• 権限の管理を行う
• JOHN
• 管理者
• 全てのデータを見ることができる
• BOB
• 経理担当
• 支払い残高のみを管理する
• 顧客の口座番号などはマスキングされ
る
• 役割(ロール)
• CUSTOMER
• 顧客担当者 ⇒ MARY
• 自分が担当する顧客の支払い金額の残
高のみ参照できる権限を持っている
• ACCOUNTANT
• 経理 ⇒ BOB
• 口座番号がマスキングされる
• MANAGER
• 管理者 ⇒ JOHN
• 全てのデータを見ることができる
• MARY
• 販売会社の顧客担当者
• 自分の支払い金額の残高のみ参照で
きる権限を持っている
37
© 2012 IBM Corporation
シンプル・シナリオ 概要図
アクセス制御を行う
データは見えない
全ての情報が見える
ADAM
JOHN
CUSTID
EMPNAME
ACCOUNT
BALANCE
001
MARY
SALLY
0123-88888
100000
002
MARY
MICHAEL
1123-99999
5000
003
PETER
EMILY
2123-77777
0
担当顧客の
情報だけ見える
MARY
38
CUSTNAME
ACCOUNT が
‘XXXX-XXXXX’
に見える
BOB
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (1/12)
• ユーザーをOSユーザーに作成する(例はWindows)
39
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (2/12)
• 権限の付与
C:¥labscript¥rcac>db2 -tvf 01crtuser.sql
connect to rcacdb user Administrator using
データベース接続情報
<省略>
grant secadm,dbadm on database to user adam
DB20000I SQL コマンドが正常に完了しました。
select substr(grantor,1,10)grantor, substr(grantee,1,10)grantee, connectauth,
CREATETABAUTH, dbadmauth, securityadmauth from syscat.dbauth
GRANTOR
---------SYSIBM
SYSIBM
ADMINISTRA
GRANTEE
---------ADMINISTRA
PUBLIC
ADAM
CONNECTAUTH
----------N
Y
N
CREATETABAUTH
------------N
Y
N
DBADMAUTH
--------Y
N
Y
SECURITYADMAUTH
--------------Y
N
Y
3 レコードが選択されました。
40
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (3/12)
• ロールの作成
C:¥labscript¥rcac>db2 -tvf 02crtrole.sql
connect to rcacdb user adam using
データベース接続情報
<省略>
create role ACCOUNTANT
DB20000I SQL コマンドが正常に完了しました。
create role CUSTOMER
DB20000I SQL コマンドが正常に完了しました。
create role MANAGER
DB20000I SQL コマンドが正常に完了しました。
grant role ACCOUNTANT to user BOB
DB20000I SQL コマンドが正常に完了しました。
grant role CUSTOMER to user MARY
DB20000I SQL コマンドが正常に完了しました。
grant role MANAGER to user JOHN
DB20000I SQL コマンドが正常に完了しました。
41
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (4/12)
• テスト表の作成とデータの挿入
C:¥labscript¥rcac>db2 -tvf 03crttbl.sql
connect to rcacdb user db2admin using
<省略>
create table sales(custid char(3), empname char(10), customer char(10), account char(10),
balance int)
DB20000I SQL コマンドが正常に完了しました
insert into sales values('001','MARY','SALLY','0123-88888',100000)
DB20000I SQL コマンドが正常に完了しました。
insert into sales values('002','MARY','MICHAEL','0124-99999',5000)
DB20000I SQL コマンドが正常に完了しました。
insert into sales values('003','PETER','EMILY','0125-33333',0)
DB20000I SQL コマンドが正常に完了しました。
select * from sales
CUSTID
-----001
002
003
EMPNAME
---------MARY
MARY
PETER
CUSTOMER
---------SALLY
MICHAEL
EMILY
ACCOUNT
BALANCE
---------- ----------0123-88888
100000
0124-99999
5000
0125-33333
0
3 42レコードが選択されました。
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (5/12)
• 行のフィルタリング
C:¥labscript¥rcac>db2 -tvf 04crtrcac.sql
connect to rcacdb user adam using
<省略>
create permission cust on db2admin.sales for rows where
( verify_role_for_user(SESSION_USER,‘ACCOUNTANT’)=1 )
OR
( verify_role_for_user(SESSION_USER,‘CUSTOMER’) =1
AND
db2admin.sales.empname=SESSION_USER )
OR
( verify_role_for_user(SESSION_USER,'MANAGER')=1 )
enforced for all access enable
DB20000I SQL コマンドが正常に完了しました。
alter table db2admin.sales activate row access control
DB20000I SQL コマンドが正常に完了しました。
表にアクセスしたユーザーのロールがCUSTOMERの場合は、“SALES表のEMPNAME = アクセスした
ユーザー” の行のみ表示する。
表にアクセスしたユーザーのロールがACCUNTANTやMANAGERであれば全てを表示する。
PERMISSION作成後、ALTER TABLE文にて行のPERMISSIONを有効にする。
43
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (6/12)
• 列のマスキング
create mask account_mask on db2admin.sales for column account return
case when verify_role_for_user(SESSION_USER,'ACCOUNTANT')=1
then 'XXXX-XXXXX‘
else account
end enable
DB20000I SQL コマンドが正常に完了しました。
alter table db2admin.sales activate column access control
DB20000I SQL コマンドが正常に完了しました。
表にアクセスしたユーザーのロールがACCOUNTANTの場合はSALES表のACCOUNT列
を’XXXX-XXXXX’で表示する。
その他のロールに対しては、マスキングは行わない。
MASK作成後、ALTER TABLE文にて列のマスキングを有効にします。
44
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (7/12)
• テスト表へのアクセス権限
C:¥labscript¥rcac>db2 -tvf 05grant.sql
connect to rcacdb user adam using
<省略>
grant select on db2admin.sales to role CUSTOMER
DB20000I SQL コマンドが正常に完了しました。
grant update on db2admin.sales to role CUSTOMER
DB20000I SQL コマンドが正常に完了しました。
grant insert on db2admin.sales to role CUSTOMER
DB20000I SQL コマンドが正常に完了しました。
grant delete on db2admin.sales to role CUSTOMER
DB20000I SQL コマンドが正常に完了しました。
grant select on db2admin.sales to role MANAGER
DB20000I SQL コマンドが正常に完了しました。
<省略>
grant select on db2admin.sales to role ACCOUNTANT
DB20000I SQL コマンドが正常に完了しました。
<省略>
45
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (8/12)
• データの参照
• 各ユーザーが全て同じSQLを実行。ロール別に列フィルタリングや
マスキングが行われているため、同じSQLを実行しても、ユーザー
に応じて見えるデータが異なる 。
C:¥labscript¥rcac>db2 -tvf 06runsql.sql
connect to rcacdb user john using
管理者のJOHNがSALES表に
対して「SELECT * 」を実行。
<省略>
select * from db2admin.sales
CUSTID
-----001
002
003
EMPNAME
---------MARY
MARY
PETER
CUSTOMER
---------SALLY
MICHAEL
EMILY
ACCOUNT
BALANCE
---------- ----------0123-88888
100000
0124-99999
5000
0125-33333
0
管理者のため、全てのデータ
を見ることができる。
3 レコードが選択されました。
46
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (9/12)
• データ参照
connect to rcacdb user mary using
<省略>
MARYは自分が担当する顧客の
情報しか見れない。
select * from db2admin.sales
CUSTID
-----001
002
EMPNAME
---------MARY
MARY
CUSTOMER
---------SALLY
MICHAEL
顧客担当のMARYがSALES表に
対して「SELECT * 」を実行。
ACCOUNT
BALANCE
---------- ----------0123-88888
100000
0124-99999
5000
2 レコードが選択されました。
47
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (10/12)
経理担当のBOBがSALES表に対
して「SELECT * 」を実行。
• データ参照
connect to rcacdb user bob using
<省略>
select * from db2admin.sales
CUSTID
-----001
002
003
EMPNAME
---------MARY
MARY
PETER
CUSTOMER
---------SALLY
MICHAEL
EMILY
ACCOUNT
BALANCE
---------- ----------XXXX-XXXXX
100000
XXXX-XXXXX
5000
XXXX-XXXXX
0
BOBは顧客の口座番号を見ること
は許されていないため、
ACCOUNT列が「XXXX-XXXXX」
にマスキングされている。
3 レコードが選択されました。
48
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (11/12)
• データの更新
• PERMISSIONを作成するだけで、許可の無いデータに対して更新ができ
なくなる
• 例では、MARYが自分の担当する顧客データを表に挿入することはできる
が、自分の顧客以外のデータを挿入しようとした場合や、自分の顧客以外
のデータを更新した場合にエラーになる。
C:¥labscript¥rcac>db2 -tvf 07insert.sql
connect to rcacdb user mary using
自分の顧客情報はINSERT可能
<省略>
insert into db2admin.sales values(‘020’,‘MARY’,‘SAM’,‘0125-33666’,9000)
DB20000I SQL コマンドが正常に完了しました。
insert into db2admin.sales values('010','PETER','SCOTT','0125-33444',500)
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQLステートメ
ントとして処理されました。 SQL 処理中に、次のエラーが返されました。SQL20471N INSERT
または UPDATE ステートメントは、結果の行が行の許可を満たさないため失敗しました。
PETER担当の顧客情報はINSERT
SQLSTATE=22542
できない
49
© 2012 IBM Corporation
シンプル・シナリオ 実行結果 (12/12)
自分の担当顧客情報は更新できない
• データの更新
update db2admin.sales set empname='MARY' where custid='003‘
SQL0100W FETCH、UPDATE または DELETE の対象となる行がないか、または照会の結果が空の表
です。 SQLSTATE=02000
結果、更新できるものは自分のデータのみ
select * from db2admin.sales
CUSTID
-----001
002
020
EMPNAME
---------MARY
MARY
MARY
CUSTOMER
---------SALLY
MICHAEL
SAM
ACCOUNT
BALANCE
---------- ----------0123-88888
100000
0124-99999
5000
0125-33666
9000
3 レコードが選択されました。
50
© 2012 IBM Corporation
Fly UP