ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 保护数据库的安全(一)

保护数据库的安全(一)

原创 Linux操作系统 作者:victorymoshui 时间:2011-05-30 20:57:26 0 删除 编辑

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.

针对上面列出的,我们来看下某些使用起来比较危险的程序包:

  • UTL_FILE:这个程序包允许用户读写操作系统用户可访问的、运行Oracle进程的任务文件和目录,这些文件与目录包括所有的数据库文件以及ORACLE_HOME目录。
  • UTL_TCP:这个程序包允许用户为了连接网络中所有可访问的地址而打开服务机器上的TCP端口。
  • UTL_SMTP:使用UTL_TCP调用编写的这个程序包允许用户发送邮件消息。UTL_SMTP程序包受UTL_SMTP_SERVER实例参数限制,该参数给出了输出邮件服务器的地址。
  • UTL_HTTP:这个程序包同样使用UTL_TCP调用进行编写,并且允许发送HTTP消息和接收响应,结果是将数据库转换为Web浏览器。

记住:默认情况下,登入数据库的任何用户都能使用上述程序包。

虽然应用软件可以为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.

安全性相关的口令限制:

  • FAILED_LOGIN_ATTEMPTS:连续使用不正确口令请求连接的次数达到这个限制所指定的次数之后,帐户会被锁定。
  • PASSWORD_LOCK_TIME:指定达到FAILED_LOGIN_ATTEMPTS限制后帐户被锁定的天数。例如:(30/1440)等价于30分钟。
  • PASS_LIFE_TIME:指定提示用户修改口令之前需要经过的天数。
  • PASSWORD_GRACE_TIME:指定达到PASS_LIFE_TIME限制值后可以维持成功登录的天数。
  • PASSWORD_REUSE_TIME:指定可以重用某个口令之前所经过的天数。这个限制阻止用户修改口令时,修改同样口令来回避PASS_LIFE_TIME限制的设置。
  • PASSWORD_REUSE_MAX:某个口令可以被重用的次数。
  • PASSWORD_VERIFY_FUNCTION:这个限制是一个在修改口令时会执行复杂度检查。

除了用配置文件可以自动终止口令和锁定帐户,还可以通过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.

所创建的口令验证对新的口令执行下列检查,没有通过任何检查的情况下拒绝修改口令:

  • 新口令与用户名不能相同。不区分大小写,比较之前,用户名与口令都会被转换为小写字母。
  • 新口令至少必须具有4个字符。
  • 针对一个包含6个常用口令的硬编码列表,检查同样会被转换为小写字母的新口令。
  • 检查新口令,从而确保其至少包含一个数字、一个大写或小写字母以及一个标点符号。
  • 新口令至少包含3个与旧口令不同的字母,或者至少比旧口令多3个字符。

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的函数进行检查。


原文引自:http://www.dbablog.org/index.php/archives/612

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

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

注册时间:2009-08-26

  • 博文量
    173
  • 访问量
    303806