编辑手记:最近很多朋友会问关于数据库用户授权的问题,经常问这样的问题,我能不能直接给用户DBA的角色,多方便。恩,方便是方便了,恶意操作和误操作也方便了。今天再苦口婆心告诉你,过度授权有哪些风险。
过度授权的风险
从安全角度考虑,数据库的授权应当遵循最小权限授予法,即仅授予满足用户需要的最小权限。这是因为在数据库中,如果进行了不当授权,则可能为数据库带来安全风险。
在数据库中,EXECUTE/CREATE ANY PROCEDURE都是非常重要的权限,如果被授予普通用户,则可能为数据库带来安全风险。
以下是在Oracle Database 8.1.7中的测试,首先创建了两个测试用户:
当使用测试用户连接后,EXECUTE ANY PROCEDURE的权限使用户具有了访问和执行dbms_sys_sql包的权限,这个Package可以被用户利用来获得更高的权限:
通过如下一段代码,Hacker用户就可以很多DDL语句,诸如修改其他用户的口令,对自我进行授权等:
通过DBMS_SYS_SQL.parse_as_user,hacker可以在数据库内任意为非作歹了。用户loser的口令已被更改:
在Oracle 9i中,如果用户具有EXECUTE/CREATE ANY PROCEDURE的权限,则同样用户可以做出很多跨越常规的授权:
现在CREATE ANY PROCEDURE的权限可以使用户创建任何过程:
现在EXECUTE ANY PROCEDURE的权限,可以使用户执行创建的过程,进行跨越职权的授权:
SQL> execute system.do('grant dba to eygle'); PL/SQL procedure successfully completed.
检查一下当前用户具有的权限:
重新连接会激活角色授权,可以注意到用户已经具备了DBA的职权:
SQL> connect eygle/eygle Connected. SQL> SELECT * FROM SESSION_ROLES; ROLE ------------------------------ PLUSTRACE DBA SELECT_CATALOG_ROLE HS_ADMIN_ROLE EXECUTE_CATALOG_ROLE DELETE_CATALOG_ROLE EXP_FULL_DATABASE IMP_FULL_DATABASE GATHER_SYSTEM_STATISTICS
WM_ADMIN_ROLE JAVA_ADMIN JAVA_DEPLOY 12 rows selected. SQL> SELECT * FROM SESSION_PRIVS; PRIVILEGE ---------------------------------------- ALTER SYSTEM AUDIT SYSTEM CREATE SESSION ALTER SESSION RESTRICTED SESSION CREATE TABLESPACE ALTER TABLESPACE MANAGE TABLESPACE
虽然在不同的版本中,Oracle一直在强化其安全管理,但是仍然需要我们小心谨慎的管理数据库权限,确保数据库安全。