问:PUBLIC被授予下列带有‘WITH GRANT OPTION’选项的权限:
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE
PUBLIC SYS PLAN_TABLE$ SYS UPDATE YES
PUBLIC SYS PLAN_TABLE$ SYS INSERT YES
PUBLIC SYS PLAN_TABLE$ SYS DELETE YES
PUBLIC SYS OLAPTABLEVELS SYS UPDATE YES
PUBLIC SYS OLAPTABLEVELS SYS INSERT YES
PUBLIC SYS OLAPTABLEVELS SYS DELETE YES
PUBLIC SYS OLAPTABLEVELTUPLES SYS UPDATE YES
PUBLIC SYS OLAPTABLEVELTUPLES SYS INSERT YES
PUBLIC SYS OLAPTABLEVELTUPLES SYS DELETE YES
Oracle安全指南中提到如下描述:
“注:当将对象权限授予角色时,‘GRANT OPTION’选项是无效的。Oracle数据库禁止对象权限通过角色进行传播,因此角色的被授予者不能将通过角色而获得的对象权限传播出去。”
如果PUBLIC被认定为角色,那么可以得出如下结论:
1、在上述情况下,‘GRANT OPTION’是无效的?
2、PUBLIC(系统公共用户)不能将自己获得的对象权限传播出去?
答:为了回答问题,下面我们用一个实验来验证文档。
首先,我们创建两个用户:USER_ABBIE和USER_BOB。另外,我们还将创建一个角色:USER_BOB_ROLE。然后,我们使用USER_ABBIE用户创建TEST_TABLE表,并将TEST_TABLE表上的SELECT权限以‘GRANT OPTION’选项授予USER_BOB_ROLE角色。
实验在Oracle 10g数据库中进行;实验所使用的SQL脚本,可以在你所使用的Oracle数据库环境中使用。
首先,创建用户和角色,并分配基本权限。注意:对于生产环境,我不建议以这种方式分配权限。最佳实践是使用最小权限原则。
SQL> create user USER_ABBIE identified by ”For#12Testing#12Only”;
2 default tablespace USERS
3 temporary tablespace TEMP;
User created.
SQL> grant CONNECT, RESOURCE to USER_ABBIE;
Grant succeeded.
SQL> create user USER_BOB identified by ”For#345Testing#345Only”;
2 default tablespace USERS
3 temporary tablespace TEMP;
User created.
SQL> grant CONNECT, RESOURCE to USER_BOB;
Grant succeeded.
SQL> create user USER_CHLOE identified by ”For#789Testing#789Only”;
2 default tablespace USERS
3 temporary tablespace TEMP;
User created.
SQL> grant CONNECT, RESOURCE to USER_CHLOE;
Grant succeeded.
SQL> create role USER_BOB_ROLE;
Role created.
现在,我们将为USER_ABBIE用户创建一张表,并将其SELECT权限加上‘GRANT OPTION’选项授予USER_BOB_ROLE角色。
SQL> conn USER_ABBIE/”For#12Testing#12Only”
Connected.
SQL> create table TEST_TABLE
2 as select * from DUAL;
Table created.
SQL> column DUMMY format a10;
SQL> select * from TEST_TABLE;
DUMMY
———-
X
SQL> grant SELECT on TEST_TABLE to USER_BOB_ROLE with GRANT OPTION;
grant SELECT on TEST_TABLE to USER_BOB_ROLE with GRANT OPTION
*
ERROR at line 1:
ORA-01926: cannot GRANT to a role WITH GRANT OPTION
正如你看到的,Oracle数据库抛出ORA–01926错误,防止此类情况发生!
从安全角度来看,如果你没有完全理解对象访问权限是如何传播的以及其复杂程度,就使用GRANT和ADMIN选项是非常危险的。例如,撤销原先使用‘GRANT OPTION’选项分配的对象访问权限时,将级联收回所有被授予者所持有的权限。使用‘ADMIN OPTION’选项时,当授予者自身的权限被撤销时,所有它授予权限的被授予者仍将保持其授予的访问权限。当维护许多用户时,这就很容易造成不期望发生的权限授予情况。
最佳实践:将不带GRANT / ADMIN选项的权限直接分配给角色,然后将这些角色分配给指定的用户