今天检查数据库发现一个问题,一个用户仅有connect权限,居然可以查询所有的用户表。
查询视图:
DBA_SYS_PRIVS
DBA_TAB_PRIVS
DBA_TAB_PRIVS
DBA_ROLE_PRIVS
SQL> set linesize 1000
SQL> set pagesize 0
SQL> select * from DBA_TAB_PRIVS where grantee='READONLY_NN';
SQL> set pagesize 0
SQL> select * from DBA_TAB_PRIVS where grantee='READONLY_NN';
no rows selected
SQL> select * from DBA_SYS_PRIVS where grantee='READONLY_NN';
no rows selected
SQL> select * from DBA_ROLE_PRIVS where grantee='READONLY_NN';
GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ --- ---
READONLY_NN CONNECT NO YES
------------------------------ ------------------------------ --- ---
READONLY_NN CONNECT NO YES
READONLY_NN 仅有CONNECT角色权限,开始怀疑CONNECT角色被人赋予了SELECT ANY TABLE权限:
SQL> select * from DBA_SYS_PRIVS where grantee='CONNECT';
GRANTEE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
CONNECT CREATE SESSION NO
------------------------------ ---------------------------------------- ---
CONNECT CREATE SESSION NO
失望。
做个测试,建一个用户TEST_AAA,仅赋与CONNECT权限,同样也可以SELECT ANY TABLE.
不的其解.
想起有个SCHEMA名称PUBLIC,该SCHEMA可以理解为所有用户的集合。如果某个权限赋予PUBLIC,则所有用户均有该权限。
查询:
SQL> select * from DBA_SYS_PRIVS where grantee='PUBLIC';
GRANTEE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
PUBLIC SELECT ANY TABLE NO
------------------------------ ---------------------------------------- ---
PUBLIC SELECT ANY TABLE NO
估计是开发商,上线时,图方便加上的。
解决办法就是:
SQL>revoke select any table from public;
使用revoke select any table from public 用户会造成数据库中所有的procedure、package、function失效。
在生产库使用要非常谨慎,建议在可停机条件下回收。$ORACLE_HOME/rdbms/admin/utlrp.sql编译失效对象。
该库为生产库,安全第一,暂不回收。
后面查询相关资料才知道,有一个视图:
SQL>select * from session_privs;
可以查看当前会话的权限。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/703237/viewspace-673209/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/703237/viewspace-673209/