ITPub博客

首页 > 数据库 > Oracle > 基础知识6——安全和最小权限原则

基础知识6——安全和最小权限原则

原创 Oracle 作者:与刃争锋 时间:2014-01-08 10:11:20 0 删除 编辑
数据库安全和最小权限原则
用户只拥有执行其任务所需的最小权限,并禁止所有未被允许的权限.
默认下SYS和SYSTEM拥有所有权限.

除了使用口令配置文件外,还需要遵循一些最佳实践,特别熟授予public账户的权限以及一些实例参数.

public角色隐式授予每个用户,为public授予任何权限,相应的权限就授予连接到数据库的每个人.
默认下public有很多权限,尤其有能执行PL/SQL使用程序包的权限

select count(*) from dba_tab_privs
where grantee='PUBLIC'
---------
21521

select table_name from dba_tab_privs
where grantee='PUBLIC' and privilege='EXECUTE' and table_name like 'UTL%';

TABLE_NAME
----------------
UTL_FILE
UTL_RAW
UTL_TCP
UTL_INADDR
UTL_SMTP
UTL_HTTP
UTL_URL
UTL_ENCODE
UTL_GDK
UTL_COMPRESS
UTL_I18N
UTL_LMS
UTL_NLA_ARRAY_DBL
UTL_NLA_ARRAY_FLT
UTL_NLA_ARRAY_INT
UTL_NLA
UTL_REF
UTL_COLL
UTL_MATCH
UTL_DBWS


虽然应用软件可以为public用户授予执行UTL包的权限,但应取消public用户的这个权限:

revoke execute on utl_file from public;

public是授予所有人的角色——但在使用as sysoper语法连接到实例时,看似是连接到public账户.   --这句话我不太理解

某些实例参数非常重要,默认值通常是合理的,但某些情况下可能需要修改参数值.以下所列参数都是静态的,需要重启实例才会生效.

utl_file_dir --默认为null,此参数允许PL/SQL通过utl_file包来访问服务器计算机的文件系统,utl_file包具有打开并读写文件的过程,唯一的限制是oracle拥有者必须能够访问所列出的目录.
使用这个实例参数难点在于:因为在实例层次进行设置,所以不允许某些用户访问一些目录而其他用户访问另外一些目录,对utl_file包具有执行权限的所有用户有权访问utl_file_dir参数中列出的所有目录.utl_file_dir参数接受一个用逗号分隔的目录列表,并且是静态的,使用下列语法可设置这个参数(此示例允许对两个目录进行访问,并重启实例)

alter system set utl_file_dir='/oracle/tmp','/oracle/interface' scope=spfile;

可使用通配符,但不要将参数设置为*,这样会允许所有用户访问数据库的所有目录和文件

remote_os_authent   --默认false,此参数控制某个用户是否能够在不需要给出口令的情况下从远程计算机连接数据库.

o7_dictionary_accessibility --实例参数控制使用any关键字授予对象权限的效果,默认为false,使用下列语法能为用户harrogath授予查看数据库中所有表的权限

grant select any table to harrogath;

harrogath目前看不到数据字典表与用户表,o7_dictionary_accessibility默认为false,这说明any权限不被授予SYS拥有的对象,从而保护数据字典,此时harrogath能看到所有用户的数据,但无法看SYS拥有的对象,如果o7_dictionary_accessibility修改为true那么所有对象被授予了any权限,此时harrogath就能看数据字典和所有的用户数据了.如果希望o7_dictionary_accessibility不改时让用户访问数据字典,就给这些用户授予select any dictionary的权限,这样用户能看数据字典和动态性能视图,但在没有进行专门的指定时无法看到任何用户数据.

remote_login_passwordfile   --此参数控制具有sysdba或sysoper权限的用户能否通过网络连接实例






练习,生成一个脚本,以便从public删除一些危险的权限

system用户连接,编辑SQL*Plus,从其输出中删除无关字符:

set headers off;
set pagesize 0;
set feedback off;

将输出打印到适当目录的文件中

spool $HOME/oracle/scripts/clear_public_privs.sql   --unix平台
spool d:\oracle\clear_public_privs.sql  --windows平台

通过运行以下语句生成sql命令文件:

select 'revoke execute on '||table_name||' from public;'
from dba_tab_privs where table_name like 'UTL_%';


停止输出打印
spool off












来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25025926/viewspace-1068222/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-12-25

  • 博文量
    89
  • 访问量
    132412