问: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’选项时,当授予者自身的权限被撤销时,所有它授予权限的被授予者仍将保持其授予的访问权限。当维护许多用户时,这就很容易造成不期望发生的权限授予情况。