在前面一篇文章中讨论DATABASE VAULT和授权之间的关系,随后想到了一点安全隐患。
DATABASE VAULT对权限的影响:http://yangtingkun.itpub.net/post/468/476369
还是利用上一篇文章的例子:
SQL> SELECT * FROM V$OPTION
2 WHERE PARAMETER = 'Oracle Database Vault';
PARAMETER VALUE
---------------------------------------- ------------------------------
Oracle Database Vault TRUE
SQL> SELECT * FROM V$VERSION;
BANNER
-------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for 32-bit Windows: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production
创建3个用户:
SQL> SHOW USER
USER 为 "DVSYS"
SQL> GRANT CONNECT TO U1 IDENTIFIED BY U1;
授权成功。
SQL> GRANT CONNECT TO U2 IDENTIFIED BY U2;
授权成功。
SQL> GRANT CONNECT TO U3 IDENTIFIED BY U3;
授权成功。
SQL> CONN SYS@YTK111 AS SYSDBA
输入口令: ****
已连接。
SQL> GRANT RESOURCE TO U1;
授权成功。
SQL> GRANT SELECT ANY TABLE TO U3;
授权成功。
SQL> CONN U1/U1@YTK111
已连接。
SQL> CREATE TABLE T (ID NUMBER);
表已创建。
SQL> GRANT SELECT ON T TO U2;
授权成功。
在默认情况下U2和U3都可以访问U1的表,以为U2被U1直接授权访问T表,而U3具有SELECT ANY TABLE系统权限:
SQL> CONN U2/U2@YTK111
已连接。
SQL> SELECT * FROM U1.T;
未选定行
SQL> CONN U3/U3@YTK111
已连接。
SQL> SELECT * FROM U1.T;
未选定行
下面将U1放到REALM中:
SQL> CONN DVSYS@YTK111
输入口令: ****
已连接。
SQL> EXEC DBMS_MACADM.CREATE_REALM('R_U1', 'REALM FOR U1', 'Y', 0)
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_MACADM.ADD_OBJECT_TO_REALM('R_U1', 'U1', '%', '%')
PL/SQL 过程已成功完成。
再次通过U2和U3访问U1的T表:
SQL> CONN U2/U2@YTK111
已连接。
SQL> SELECT * FROM U1.T;
未选定行
SQL> CONN U3/U3@YTK111
已连接。
SQL> SELECT * FROM U1.T;
SELECT * FROM U1.T
*
第 1 行出现错误:
ORA-01031: 权限不足
REALM已经禁止了SELECT ANY TABLE权限,而直接授权仍然可以访问。
SQL> CONN SYS@YTK111 AS SYSDBA
输入口令: ****
已连接。
SQL> GRANT SELECT ON U1.T TO U3;
GRANT SELECT ON U1.T TO U3
*
第 1 行出现错误:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-47401: grant object privilege (在 U1.T 上) 的领域违规
ORA-06512: 在 "DVSYS.AUTHORIZE_EVENT", line 55
ORA-06512: 在 line 31
可以看到,利用SYS来直接授权是被REALM所禁止的。
到目前而止都是重复上一篇文章的例子,而且目前看来数据也是安全的,SYS也好,U3也好都不能通过SELECT ANY TABLE来直接获取REALM所包含的U1用户下的T表。而且SYS也没有权限来将U1的T表的查询权限直接授权给其他用户,那么U1用户下的对象确实是很安全的。
问题不是出在这里,问题在于SYS可以对其他没有被REALM保护的对象授予直接访问的权限:
SQL> GRANT RESOURCE TO U2;
授权成功。
SQL> CONN U2/U2@YTK111
已连接。
SQL> CREATE TABLE T (ID NUMBER);
表已创建。
SQL> CONN SYS@YTK111 AS SYSDBA
输入口令: ****
已连接。
SQL> GRANT SELECT ON U2.T TO U3;
授权成功。
下面将U2用户使用REALM保护起来:
SQL> CONN DVSYS@YTK111
输入口令: ****
已连接。
SQL> EXEC DBMS_MACADM.ADD_OBJECT_TO_REALM('R_U1', 'U2', '%', '%')
PL/SQL 过程已成功完成。
SQL> CONN U3/U3@YTK111
已连接。
SQL> SELECT * FROM U2.T;
未选定行
SQL> SELECT * FROM U1.T;
SELECT * FROM U1.T
*
第 1 行出现错误:
ORA-01031: 权限不足
可以看到,同样是被REALM所保护的U1和U2,由于U2的表在被REALM保护之前,被DBA用户直接授权给其他用户,使得REALM保护后,U2的表仍然可以被其他用户所访问。这种直接授权并不会被取消,Oracle不会判断,这个直接授权是用户自己进行的授权,还是其他权限用户执行的授权。所以这里存在着安全隐患。DBA虽然无法通过ANY权限进行访问,但是可以通过提前显式授权的方式,留下一个后门。
因此用户或对象被REALM保护后,并非一定是安全的,应该在REALM保护发生后,彻底检查所有的授权,确保当前所有的显式授权都是合法的,否则就会留下安全的隐患。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-524926/,如需转载,请注明出处,否则将追究法律责任。