今回は、Oracle Database 23cのセキュリティ新機能として、Schema Privilegesを紹介します。
この機能は、非常に地味・・ではあるんですが、今までアクセス権限の設定でちょっと面倒だった部分を解消してくれる便利な機能ではないかと思います。
通常SELECT ANY TABLEを付与した場合、そのユーザーはデータベース内のすべての表にアクセスできてしまう非常に強力なシステム権限なのですが、23cのSchema Privilegesでは付与する際にON SCHEMAで明示的にスキーマを指定することで範囲を限定することができます。
使い方は非常に簡単です。前回作成したHRスキーマと同様に用意した2つのターミナルを使った動作確認を紹介します。
Schema Privilegesの設定方法
-SYSユーザーでテスト用のユーザーを作成(A)
create user test identified by test;
grant connect to test;
-testユーザでHRスキーマをアクセス(B)
sqlplus test/test@localhost:1521/freepdb1
SQL>select * from hr.employees;
ERROR at line 1:
ORA-41900: missing READ privilege on "HR"."EMPLOYEES"
->権限ないので当然アクセスできない
-Schema PrivilegesでSELECT ANY TABLEを付与する(A)
GRANT SELECT ANY TABLE ON SCHEMA HR TO TEST;
-HRのすべての表にアクセスできる(B)
select * from hr.employees;
select * from hr.jobs;
-HRに新規の表を作成(A)
create table hr.testtbl(col1 number);
insert into hr.testtbl values(100);
commit;
-新規に作成されたHRの表にアクセス(B)
select * from hr.testtbl;
COL1
----------
100
-> SELECT権限を付与しなくてもアクセスできる
-権限は持っていないので、INSERTは当然実行できない(B)
SQL> insert into hr.testtbl values(200);
ERROR at line 1:
ORA-41900: missing INSERT privilege on "HR"."TESTTBL"
-INSERT ANY TABLEを付与する(A)
GRANT INSERT ANY TABLE ON SCHEMA HR TO TEST;
-HRスキーマのすべての表へのINSERTが可能になる(B)
SQL> insert into hr.testtbl values(200);
1 row created.
-権限を取り消す場合(A)
REVOKE SELECT ANY TABLE ON SCHEMA HR FROM TEST;
REVOKE INSERT ANY TABLE ON SCHEMA HR FROM TEST;
上記のように設定動作は非常にシンプルなので、スキーマ内のオブジェクトが頻繁に追加・削除される、もしくはすでにSELECT ANY TABLEを組み込んでいるケースなど、アクセス範囲を最小化してリスク低減に貢献できる機能ではないかと思います。