※ 本記事は2017年8月17日に公開されたものです。
Oracle DatabaseにはSELECTオブジェクト権限やSELECT ANY TABLEシステム権限で表に対するアクセス権限を持っていても、列や行ごとのアクセス制御をおこなう仮想プライベートデータベース(VPD:Virtual Private Database)や、列データをリアルタイムにマスクするData Redactionといった機能があります。これらの機能を活用することで、アプリケーションに影響のないより強力で細かなアクセス制御を実現できます。
しかし、これらのアクセス制御設定を回避するためのシステム権限というものも用意されています。
具体的には仮想プライベートデータベースのアクセス制御を回避するのがEXEMPT ACCESS POLICYシステム権限、Data Redactionのマスキングを回避するのがEXEMPT REDACTION POLICYシステム権限となります。システム権限の一覧はこちらをご参照ください。
デフォルトの状態では、EXEMPT REDACTION POLICYシステム権限がEXP_FULL_DATABASEロール(とこのロールが含まれるDATAPUMP_EXP_FULL_DATABASEロール、さらにこのロールが含まれるDBAロール)に割り当てられています。
SYSユーザーは仮想プライベートデータベースのアクセス制御もData Redactionのマスキングも回避できますが、SYSTEMユーザーであっても仮想プライベートデータベースのアクセス制御は回避できません。しかし、SYSTEMユーザーはDBAロールを持っており、その中にEXEMPT REDACTION POLICYシステム権限が含まれるためData Redactionのマスキングは回避できるということになります。
アプリケーションのユーザーがEXP_FULL_DATABASEロールやDBAロールを持っている場合、Data Redactionは回避されてしまいますので注意が必要です。
なお、これらの権限が誰に割り当てられているかは、DBA_SYS_PRIVSビューから確認できます。
SQL> select grantee from dba_sys_privs 2 where privilege = 'EXEMPT ACCESS POLICY'; no rows selected SQL> select grantee from dba_sys_privs 2 where privilege = 'EXEMPT REDACTION POLICY'; GRANTEE -------------------------------------------------------------------------------- EXP_FULL_DATABASE
また、DBSATレポートの「Access Control Exemption Privileges」セクションからも確認できます。

せっかくアクセス制御を設定しててもこれらの権限によりアクセス制御が聞かないことがありますのでご注意ください。
