1、调整默认的安全设置
1.1、默认的用户
查看数据库的用户和状态,可以查询DBA_USERS视图。
SQL> select username,account_status from dba_users; |
1.2、PUBLIC权限
Oracle中存在一个名为PUBLIC的伪用户。只要用PUBLIC授予某个权限,那么所有用户都会被授予这个权限。
SQL> select count(*) from dba_tab_privs where grantee = 'PUBLIC'; COUNT(*) ---------- 1991 SQL> select table_name from dba_tab_privs where grantee = 'PUBLIC' 2 and privilege = 'EXECUTE' and table_name like 'UTL%'; TABLE_NAME ------------------------------ UTL_RAW UTL_TCP UTL_INADDR UTL_SMTP UTL_HTTP UTL_URL UTL_ENCODE UTL_GDK UTL_COMPRESS UTL_I18N UTL_LMS TABLE_NAME ------------------------------ UTL_NLA_ARRAY_DBL UTL_NLA_ARRAY_FLT UTL_NLA_ARRAY_INT UTL_NLA UTL_REF UTL_COLL UTL_MATCH UTL_FILE 19 rows selected. |
针对上面列出的,我们来看下某些使用起来比较危险的程序包:
记住:默认情况下,登入数据库的任何用户都能使用上述程序包。
虽然应用软件可以为PUBLIC用户授予执行UTL程序包的权限,但我们应当取消PUBLIC用户的这个权限。
SQL> revoke execute on utl_file from public; Revoke succeeded. |
2、对安全性至关重要的实例参数
提醒:这里说的参数都是静态的,被修改后必须重启实例才会有效。
2.1、UTL_FILE_DIR实例参数
UTL_FILE_DIR实例参数默认为NULL,因此不是一个安全性问题。但在设置这个参数时,要特别小心。UTL_FILE_DIR参数允许PL/SQL通过UTL_FILE补充程序包来访问服务器的系统。UTL_FILE程序包具有打开并读写文件的过程,唯一的限制是Oracle拥有者必须能够访问所列出的目录。
使用这个实例参数的难点:因为在实例层次上进行设置,所以无法允许某些用户访问一些目录以及其他用户访问另外一些目录。对UTL_FILE程序包具有执行权限的所有用户有权访问UTL_FILE_DIR参数中列出的所有目录。
UTL_FILE_DIR参数接受一个用逗号分隔的目录列表,并且是静态的(参数可以包含通配符,不要将其设置为“*”)。
SQL> alter system set utl_file_dir = '/ora01/tmp', '/dp_dir/dp' 2 scope = spfile; |
2.2、REMOTE_OS_AUTHENT与OS_AUTHEN_PREFIX实例参数
REMOTE_OS_AUTHENT实例参数默认为FALSE。这个参数控制某个用户是否能够在不需要给出口令的情况下从远程计算机上连接数据库。
通常用下面语法创建用户:
SQL> create user jon identified externally; |
这样,身份验证操作就委托给服务器的操作系统完成。
无论本地的还是远程的外部身份验证都涉及到OS_AUTHEN_PREFIX实例参数。该参数有个默认值OPS$。这里我们要清空这个默认值。不然,Oracle的用户名就是OPS$jon了。
SQL> create user jon identified externally; User created. SQL> grant create session to jon; Grant succeeded. SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> exit |
在Oracle建了新的用户后,我们就要在操作系统也建立用户。
$ vi $ORACLE_HOME/dbs/initora.ora #################################### # 最后一行加上 #################################### REMOTE_OS_AUTHENT=true OS_AUTHENT_PREFIX="" $ su - root 口令: # /usr/sbin/useradd jon -m -g oinstall -G dba # rm /home/jon/.bash_profile rm:是否删除 一般文件 “/home/jon/.bash_profile”? y # cp /home/oracle/.bash_profile /home/jon # source /home/jon/.bash_profile $ su - oracle 口令 |
$ sqlplus / as sysdba SQL> create spfile from pfile; File created. SQL> startup SQL> exit SQL> exit $ su - jon 口令: $ sqlplus / SQL*Plus: Release 10.2.0.1.0 - Production on Sun Sep 28 22:00:22 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options |
启用远程操作系统身份验证通常被认为是一种不好的做法。
2.3、O7_DICTIONARY_ACCESSIBILITY实例参数
O7_DICTIONARY_ACCESSIBILITY实例参数控制使用ANY关键字授予对象权限的效果。默认FALSE。
SQL> grant select any talbe to jon; |
授权查看数据库中所有表。
O7_DICTIONARY_ACCESSIBILITY实例参数为FALSE,ANY权限不被授予给SYS拥有的对象,从而保护数据字典,此时JON无法查看SYS拥有的对象。如果为TRUE,则反之,可以查看。
提示:我们可以考虑为有些用户授予SELECT ANY DICTIONARY权限,这样用户可以查看数据字典以及动态性能视图。
2.4、REMOTE_LOGIN_PASSWORDFILE实例参数
远程的REMOTE_LOGIN_PASSWORDFILE实例参数控制具有SYSDBA权限的用户是否能够通过网络连接实例。这个参数在默认值NONE的时候,得到SYSDBA连接的唯一方法是作为拥有Oracle软件的操作系统组的成员登入服务器的操作系统。
将REMOTE_LOGIN_PASSWORDFILE实例参数设置为EXCLUSIVE或SHARED时,用户可以通过下列的不同方法得到SYSDBA连接:即使没有作为Oracle软件拥有组的成员登入服务器或者需要通过网络进行连接,但是只要知道相应的口令,一样能作为SYSDBA连接实例。这个口令以加密形式嵌入$ORACLE_HOME/dbs(Windows是%ORACLE_HOME%/database)系统文件。设置值为SHARED意味着同一个Oracle主目录内运行的所有实例共享一个公有的口令文件,对于所有实例公有的SYS用户来说,这个主目录内只有一个口令。设置值为EXCLUSIVE意味着实例会寻找一个其名称包含实例名的文件(Windows系统PWD.ora,Linux系统orapw)。
3、口令配置文件
3.1、口令配置文件的限制
每个用户(甚至是SYS)都被指派一个配置文件,文件的名称默认情况为DEFALULT。
SQL> select profile, resource_name from dba_profiles 2 where profile = 'DEFAULT'; PROFILE RESOURCE_NAME ------------------------------ -------------------------------- DEFAULT COMPOSITE_LIMIT DEFAULT SESSIONS_PER_USER DEFAULT CPU_PER_SESSION DEFAULT CPU_PER_CALL DEFAULT LOGICAL_READS_PER_SESSION DEFAULT LOGICAL_READS_PER_CALL DEFAULT IDLE_TIME DEFAULT CONNECT_TIME DEFAULT PRIVATE_SGA DEFAULT FAILED_LOGIN_ATTEMPTS DEFAULT PASSWORD_LIFE_TIME PROFILE RESOURCE_NAME ------------------------------ -------------------------------- DEFAULT PASSWORD_REUSE_TIME DEFAULT PASSWORD_REUSE_MAX DEFAULT PASSWORD_VERIFY_FUNCTION DEFAULT PASSWORD_LOCK_TIME DEFAULT PASSWORD_GRACE_TIME 16 rows selected. |
安全性相关的口令限制:
除了用配置文件可以自动终止口令和锁定帐户,还可以通过SQL命令来提示用户。
在下次登录时,修改口令:
SQL> alter user test password expire; User altered. |
锁定帐户:
SQL> alter user test account lock; User altered. |
3.2、口令验证功能
口令配置文件包含对某个PL/SQL函数(口令验证函数)的引用。使用配置文件修改用户的口令或通过管理员修改用户的口令,那么就会执行该函数。这个函数必须驻留在SYS模式中,并接受下列3个实参:用户名、新的口令以及旧的口令。该函数返回值为TRUE或FALSE,如果是FALSE,则拒绝修改口令。
Oracle标准安装过程提供了一个示例函数。为了创建这个函数,必须以SYS进行连接运行一个脚本。
SQL> @?/rdbms/admin/utlpwdmg.sql Function created. Profile altered. |
所创建的口令验证对新的口令执行下列检查,没有通过任何检查的情况下拒绝修改口令:
3.3、创建、指派以及修改口令配置文件
因为所有用户都被自动指派给名为DEFAULT的配置文件,所以实现安全策略的最快方法是更改DEFAULT配置文件。之后,所有用户都可以在其进行下一次登录时获取所做的变化。前面的UTLPWDMG.SQL脚本完成了上述功能,这脚本最后一条命令如下:
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 60 PASSWORD_GRACE_TIME 10 PASSWORD_REUSE_TIME 1800 PASSWORD_REUSE_MAX UNLIMITED FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1/1440 PASSWORD_VERIFY_FUNCTION verify_function; |
运行这条命令的结果是:在6天之后提示所有用户修改口令,并且允许用户在随后的10天内完成修改,否则将锁定帐户;在1800天的时间内,口令无法重用;连续3次输入错误的口令,账户会被锁定一分钟;任何被修改的口令都将通过一个名为SYS.VERIFY_FUNCTION的函数进行检查。