Comments
Description
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