Oracle 11g 新特性 -- 安全性增强 说明

 

一.密码安全

 

为了遵守各种安全性和隐私规定,必须使用更安全的口令。如果口令非常短或仅包含有限的字符,则对于强力攻击就很脆弱,而包含较多不同字符的较长口令就很难被猜出或获得。

 

在Oracle Database 11g中,口令的处理方式与早期版本中的处理方式有所不同:

(1)  口令区分大小写。口令中使用的大写字符和小写字符现在是不同的字符。

(2)  口令可以包含未用引号括起来的多字节字符。如果口令包含除$、_ 或# 外的任何特殊字符,则必须用引号括起来。

(3)  口令始终通过散列算法传递,然后作为用户身份证明进行存储。用户提供口令时,系统会对其进行散列运算,然后将其与存储的身份证明进行比较。在Oracle Database

(4)  11g 中,散列算法是早期版本数据库中使用的公共算法SHA-1。SHA-1 是一种使用160 位密钥的较强算法。

(5)  口令始终使用salt。如果输入内容相同,散列函数将始终生成相同的输出。Salt是添加到输入中的唯一(随机)值,用于确保输出身份证明是唯一的。

 

OracleDatabase 11g 中的口令:

(1)  区分大小写

(2)  包含更多的字符

(3)  使用更安全的散列算法

(4)  在散列算法中使用salt

 

用户名仍是Oracle 标识符(最多30个字符,不区分大小写)。

 

之前整理的Blog:

Oracle10g/11g 密码策略 用户口令 大小写敏感 说明

http://blog.csdn.net/tianlesoftware/article/details/7383110

 

 

二.自动安全配置

Oracle Database11g 使用由Internet 安全中心(CIS) 基准推荐的特定安全功能安装和创建数据库。与10gR2 的默认安装相比,CIS 推荐的配置更安全,而且开放程度足以使大多数应用程序都能成功运行。许多客户已采用了此基准。CIS 基准的一些建议可能与一些应用程序不兼容。

 

2.1 Profile安全默认配置

使用DatabaseConfiguration Assistant (DBCA) 创建自定义数据库时,可以指定Oracle Database11g 的默认安全配置。默认情况下,如果用户使用不正确的口令多次尝试连接Oracle 实例,则在第三次尝试后该实例将延迟每次登录。这种保护措施适用于从不同的IP地址或多个客户机进行的连接尝试。稍后,它将逐渐增加用户可以尝试其它口令的时间间隔,最长时间大约为十秒。

 

创建数据库时,将启用具有如下设置的默认口令概要文件:

PASSWORD_LIFE_TIME 180

PASSWORD_GRACE_TIME 7

PASSWORD_REUSE_TIME UNLIMITED

PASSWORD_REUSE_MAX UNLIMITED

FAILED_LOGIN_ATTEMPTS 10

PASSWORD_LOCK_TIME 1

PASSWORD_VERIFY_FUNCTION NULL

 

Oracle Database 10g 数据库升级后,只有使用ALTER USER… 命令更改口令后,口令才会区分大小写。

创建数据库时,默认情况下口令区分大小写。

 

Oracle 用户 profile 属性

http://blog.csdn.net/tianlesoftware/article/details/6238279

 

默认情况下:

• 启用默认口令概要文件

• 如果连续10 次登录失败,则锁定该帐户

 

在升级过程中:

• 口令不区分大小写(除非进行更改)

• 使用ALTER USER 命令时口令区分大小写

 

创建时:

• 口令区分大小写

 

2.2 密码复杂性检查

在前面提到要求密码的复杂度,但是实际上我们也可以定制自己的密码安全要求。在2.1 节的profile中有一个选项:

PASSWORD_VERIFY_FUNCTION NULL

 

    这里没有启用密码验证函数。我们可以直接使用Oracle自带的脚本创建我们的密码验证函数。 也可以根据自己的需求来修改脚本,在创建函数。

    默认创建口令验证函数的脚本:@?/rdbms/admin/utlpwdmg.sql

 

脚本较长,最后已附录贴出来。   

 

    在Orcle 11g的版本中,该脚本会创建2个函数:verify_function 和 verify_function_11G。

 

如果profile中命名的口令复杂性检查功能中存在错误或此功能不存在,则不能更改口令,也不能创建用户。解决方法是在概要文件中将PASSWORD_VERIFY_FUNCTION 设置为NULL,直到问题得到解决。

 

verify_function_11g功能将检查口令是否至少包含八个字符、是否至少包含一个数字和一个字母字符,以及是否至少有三个字符与以前口令不同。

 

该函数还确认此口令不是以下项:用户名或附加了1 到100 之间任何数字的用户名、反向的用户名、服务器名或附加了1 到100 之间数字的服务器名,或者一组众所周知的常用口令,如“welcome1”、“database1”、“oracle123”或“oracle(附加了1 到100 之间的数字)”等。

 

   

用sysdba权限的用户执行这个脚本后,然后修改profile,启用密码验证:

--创建函数:

SQL> CONNECT / as SYSDBA

SQL> @?/rdbms/admin/utlpwdmg.sql

 

--修改profile

ALTER PROFILE DEFAULT

LIMIT

PASSWORD_VERIFY_FUNCTIONverify_function_11g;

 

2.3 审计

 

(1)检查审计日志:

默认情况下,在OracleDatabase 11g 中将为对安全性非常重要的特定权限启用审计。审计线索默认记录在数据库AUD$ 表中,AUDIT_TRAIL 参数设置为DB。对于大多数站点而言,这些审计不会对数据库性能造成太大影响。Oracle建议使用操作系统审计线索文件。

   

注意:

Oracle 11g的审计记录表SYS.AUD$是放在SYSTEM 表空间。 而且增长巨快。 会占用当量的空间。当SYSTEM表空间因磁盘空间而无法扩展时将导致这部分审计记录无法生成,这将最终导致普通用户的新会话将无法正常创建,普通用户将无法登陆数据库。

如果启用了审计,就要定期的转移审计的历史记录,或者直接truncate 审计表,最好是把审计表迁移到其他的表空间。

 

具体参考:

Oracle 11g 默认审计选项 说明

http://blog.csdn.net/tianlesoftware/article/details/6707887


2.1.4 将审计相关的表移动到其他表空间
http://blog.csdn.net/tianlesoftware/article/details/4712932

 


(2)归档审计记录:

要保留审计记录,请使用Oracle数据泵导出实用程序将其导出,或者使用SELECT 语句将一组审计记录捕获到单独的表中。

 

(3)删除归档审计记录:

在检查并归档审计记录后,会从SYS.AUD$ 表中将其删除。审计记录将占用SYSTEM 表空间中的空间。如果SYSTEM 表空间无法增长,则无法为审计记录提供更多空间,此时会针对每条审计语句生成错误。由于CREATE SESSION 是已审计的权限之一,所以不能创建新的会话(除非用户以SYSDBA身份连接)。可使用QUERY 选项指定带有日期范围或SCN 范围的WHERE 子句,通过导出实用程序归档审计表。然后,使用相同的WHERE 子句从审计表中删除这些记录。

当AUDIT_TRAIL=OS 时,会在由AUDIT_FILE_DEST 指定的目录中为每条审计记录创建单独的文件。可以复制特定时间之前的所有文件,然后删除它们。

 

注:SYSTEM 表空间是使用autoextend on 选项创建的。因此SYSTEM 表空间可以根据需要增长,直到用尽磁盘上的可用空间。

 

系统会按照访问针对成功和失败的操作审核所有用户的以下权限:

CREATE EXTERNAL JOB

CREATE ANY JOB

GRANT ANY OBJECT PRIVILEGE

EXEMPT ACCESS POLICY

CREATE ANY LIBRARY

GRANT ANY PRIVILEGE

DROP PROFILE

ALTER PROFILE

DROP ANY PROCEDURE

ALTER ANY PROCEDURE

CREATE ANY PROCEDURE

ALTER DATABASE

GRANT ANY ROLE

CREATE PUBLIC DATABASE LINK

DROP ANY TABLE

ALTER ANY TABLE

CREATE ANY TABLE

DROP USER

ALTER USER

CREATE USER

CREATE SESSION

AUDIT SYSTEM

ALTER SYSTEM

SYSTEM AUDIT

ROLE

 

 

2.4 调整安全性

 

2.4.1 调整安全性设置

使用DBCA 工具创建数据库时,可以选择以下安全性设置:

a)  保留11g 的默认增强安全设置(建议)。这些设置包括启用审计和新的默认口令概要文件。

b)  还原到11g 之前的默认安全设置。要禁用特定类别的增强设置以实现兼容性,请选择以下设置:

        i.     将审计设置还原为11g 之前的默认设置

      ii.     将口令概要文件设置还原为11g 之前的默认设置

 

也可以使用DBCA 在创建数据库后更改这些设置。在11g 的默认安全设置下,有些应用程序可能无法正常运行。

应始终设置安全的软件权限。它不受用户选择的“Security Settings(安全设置)”选项所影响。

 

2.4.2 设置安全性参数

Oracle Database11g 增加了一组新参数以加强数据库的默认安全性。这些参数是系统范围的静态参数。

 

(1)使用区分大小写的口令以加强安全性

新参数SEC_CASE_SENSITIVE_LOGON使您可以设置区分大小写的用户口令。Oracle 建议保留默认设置TRUE。将此参数设置为FALSE 可指定不区分大小写的口令以实现向后兼容性。

ALTER SYSTEM SETSEC_CASE_SENSITIVE_LOGON = FALSE

 

注:禁用区分大小写会使口令在强力攻击面前变得更脆弱。

 

(2)防止拒绝服务(DoS) 攻击

SEC_PROTOCOL_ERROR_FURTHER_ACTION参数:指定了要对客户机连接执行的操作:继续、断开连接或延迟接受请求。

SEC_PROTOCOL_ERROR_TRACE_ACTION参数:指定了监视操作:NONE、TRACE、LOG 或ALERT。

 

(3)防止强力攻击

新的初始化参数SEC_MAX_FAILED_LOGIN_ATTEMPTS的默认设置为10,表示在连接尝试达到指定次数后会自动断开连接。即使未启用口令概要文件,也会强制实施此参数。

此参数可以防止程序连接到数据库,然后成百上千次地尝试口令以通过验证。

 

 

附录:utlpwdmg.sql 脚本:

[oracle@dave admin]$ cat utlpwdmg.sql

Rem

Rem $Header: utlpwdmg.sql02-aug-2006.08:18:05 asurpur Exp $

Rem

Rem utlpwdmg.sql

Rem

Rem Copyright (c) 2006, Oracle. All rightsreserved. 

Rem

Rem   NAME

Rem     utlpwdmg.sql - script for Default Password Resource Limits

Rem

Rem   DESCRIPTION

Rem     This is a script for enabling the password management features

Rem     by setting the default password resource limits.

Rem

Rem   NOTES

Rem     This file contains a function for minimum checking of password

Rem     complexity. This is more of a sample function that the customer

Rem     can use to develop the function for actual complexity checks that the

Rem     customer wants to make on the new password.

Rem

Rem   MODIFIED   (MM/DD/YY)

Rem   asurpur     05/30/06 - fix -5246666 beef up password complexity check

Rem   nireland    08/31/00 - Improvecheck for username=password. #1390553

Rem   nireland    06/28/00 - Fix nullold password test. #1341892

Rem   asurpur     04/17/97 - Fix forbug479763

Rem   asurpur     12/12/96 - Changingthe name of password_verify_function

Rem   asurpur     05/30/96 - New scriptfor default password management

Rem   asurpur     05/30/96 - Created

Rem

 

 

-- This script sets the default passwordresource parameters

-- This script needs to be run to enablethe password features.

-- However the default resource parameterscan be changed based

-- on the need.

-- A default password complexity functionis also provided.

-- This function makes the minimumcomplexity checks like

-- the minimum length of the password,password not same as the

-- username, etc. The user may enhance thisfunction according to

-- the need.

-- This function must be created in SYSschema.

-- connect sys/<password> as sysdbabefore running the script

 

CREATE OR REPLACE FUNCTIONverify_function_11G

(username varchar2,

 password varchar2,

 old_password varchar2)

 RETURN boolean IS

   nboolean;

   minteger;

  differ integer;

  isdigit boolean;

  ischar  boolean;

  ispunct boolean;

  db_name varchar2(40);

  digitarray varchar2(20);

  punctarray varchar2(25);

   chararray varchar2(52);

  i_char varchar2(10);

  simple_password varchar2(10);

  reverse_user varchar2(32);

 

BEGIN

  digitarray:= '0123456789';

  chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

 

   --Check for the minimum length of the password

   IFlength(password) < 8 THEN

     raise_application_error(-20001, 'Password length less than 8');

  END IF;

 

 

   --Check if the password is same as the username or username(1-100)

   IFNLS_LOWER(password) = NLS_LOWER(username) THEN

    raise_application_error(-20002, 'Password same as or similar to user');

  END IF;

  FOR i IN 1..100 LOOP

     i_char := to_char(i);

     if NLS_LOWER(username)|| i_char = NLS_LOWER(password) THEN

       raise_application_error(-20005, 'Password same as or similar to username ');

     END IF;

   END LOOP;

 

   --Check if the password is same as the username reversed

  

  FOR i in REVERSE 1..length(username) LOOP

    reverse_user := reverse_user || substr(username, i, 1);

  END LOOP;

   IFNLS_LOWER(password) = NLS_LOWER(reverse_user) THEN

    raise_application_error(-20003, 'Password same as username reversed');

  END IF;

 

   --Check if the password is the same as server name and or servername(1-100)

  select name into db_name from sys.v$database;

   ifNLS_LOWER(db_name) = NLS_LOWER(password) THEN

     raise_application_error(-20004, 'Password same as or similar to servername');

  END IF;

  FOR i IN 1..100 LOOP

     i_char := to_char(i);

     if NLS_LOWER(db_name)|| i_char = NLS_LOWER(password) THEN

       raise_application_error(-20005, 'Password same as or similar to servername ');

     END IF;

   END LOOP;

 

   --Check if the password is too simple. A dictionary of words may be

   --maintained and a check may be made so as not to allow the words

   --that are too simple for the password.

   IFNLS_LOWER(password) IN ('welcome1', 'database1', 'account1', 'user1234','password1', 'oracle123', 'computer1', 'abcdefg1', 'change_on_install') THEN

     raise_application_error(-20006, 'Password too simple');

  END IF;

 

   --Check if the password is the same as oracle (1-100)

   simple_password := 'oracle';

    FORi IN 1..100 LOOP

     i_char := to_char(i);

     if simple_password || i_char = NLS_LOWER(password) THEN

       raise_application_error(-20007, 'Password too simple ');

     END IF;

   END LOOP;

 

   --Check if the password contains at least one letter, one digit

   --1. Check for the digit

  isdigit:=FALSE;

   m:= length(password);

  FOR i IN 1..10 LOOP

     FOR j IN 1..m LOOP

        IF substr(password,j,1) = substr(digitarray,i,1) THEN

           isdigit:=TRUE;

            GOTO findchar;

        END IF;

     END LOOP;

  END LOOP;

 

   IFisdigit = FALSE THEN

     raise_application_error(-20008, 'Password must contain at least onedigit, one character');

  END IF;

   --2. Check for the character

  <<findchar>>

  ischar:=FALSE;

  FOR i IN 1..length(chararray) LOOP

     FOR j IN 1..m LOOP

        IF substr(password,j,1) = substr(chararray,i,1) THEN

           ischar:=TRUE;

            GOTO endsearch;

        END IF;

     END LOOP;

  END LOOP;

   IFischar = FALSE THEN

      raise_application_error(-20009, 'Passwordmust contain at least one \

              digit, and one character');

  END IF;

 

 

  <<endsearch>>

   --Check if the password differs from the previous password by at least

   --3 letters

   IFold_password IS NOT NULL THEN

    differ := length(old_password) - length(password);

 

    differ := abs(differ);

    IF differ < 3 THEN

      IF length(password) < length(old_password) THEN

        m := length(password);

      ELSE

        m := length(old_password);

      END IF;

 

      FOR i IN 1..m LOOP

        IF substr(password,i,1) != substr(old_password,i,1) THEN

          differ := differ + 1;

        END IF;

      END LOOP;

 

      IF differ < 3 THEN

        raise_application_error(-20011, 'Password should differ from the \

           old password by at least 3 characters');

      END IF;

    END IF;

  END IF;

   --Everything is fine; return TRUE ;  

  RETURN(TRUE);

END;

/

 

-- This script alters the default parametersfor Password Management

-- This means that all the users on thesystem have Password Management

-- enabled and set to the following valuesunless another profile is

-- created with parameter values set todifferent value or UNLIMITED

-- is created and assigned to the user.

 

ALTER PROFILE DEFAULT LIMIT

PASSWORD_LIFE_TIME 180

PASSWORD_GRACE_TIME 7

PASSWORD_REUSE_TIME UNLIMITED

PASSWORD_REUSE_MAX UNLIMITED

FAILED_LOGIN_ATTEMPTS 10

PASSWORD_LOCK_TIME 1

PASSWORD_VERIFY_FUNCTIONverify_function_11G;

 

 

 

-- Below is the older version of the script

 

-- This script sets the default passwordresource parameters

-- This script needs to be run to enablethe password features.

-- However the default resource parameterscan be changed based

-- on the need.

-- A default password complexity functionis also provided.

-- This function makes the minimumcomplexity checks like

-- the minimum length of the password,password not same as the

-- username, etc. The user may enhance thisfunction according to

-- the need.

-- This function must be created in SYSschema.

-- connect sys/<password> as sysdbabefore running the script

 

CREATE OR REPLACE FUNCTION verify_function

(username varchar2,

 password varchar2,

 old_password varchar2)

 RETURN boolean IS

   nboolean;

   minteger;

  differ integer;

  isdigit boolean;

  ischar  boolean;

  ispunct boolean;

  digitarray varchar2(20);

  punctarray varchar2(25);

  chararray varchar2(52);

 

BEGIN

  digitarray:= '0123456789';

  chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

  punctarray:='!"#$%&()``*+,-/:;<=>?_';

 

   --Check if the password is same as the username

   IFNLS_LOWER(password) = NLS_LOWER(username) THEN

    raise_application_error(-20001, 'Password same as or similar to user');

   ENDIF;

 

   --Check for the minimum length of the password

   IFlength(password) < 4 THEN

     raise_application_error(-20002, 'Password length less than 4');

  END IF;

 

   --Check if the password is too simple. A dictionary of words may be

   --maintained and a check may be made so as not to allow the words

   --that are too simple for the password.

   IFNLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password','oracle', 'computer', 'abcd') THEN

     raise_application_error(-20002, 'Password too simple');

  END IF;

 

   --Check if the password contains at least one letter, one digit and one

   --punctuation mark.

   --1. Check for the digit

  isdigit:=FALSE;

   m:= length(password);

  FOR i IN 1..10 LOOP

     FOR j IN 1..m LOOP

        IF substr(password,j,1) = substr(digitarray,i,1) THEN

           isdigit:=TRUE;

            GOTO findchar;

        END IF;

     END LOOP;

  END LOOP;

   IFisdigit = FALSE THEN

     raise_application_error(-20003, 'Password should contain at least onedigit, one character and one punctuation');

  END IF;

   --2. Check for the character

  <<findchar>>

  ischar:=FALSE;

  FOR i IN 1..length(chararray) LOOP

     FOR j IN 1..m LOOP

        IF substr(password,j,1) = substr(chararray,i,1) THEN

           ischar:=TRUE;

            GOTO findpunct;

        END IF;

     END LOOP;

  END LOOP;

   IFischar = FALSE THEN

     raise_application_error(-20003, 'Password should contain at least one \

              digit, one character and onepunctuation');

  END IF;

   --3. Check for the punctuation

  <<findpunct>>

  ispunct:=FALSE;

  FOR i IN 1..length(punctarray) LOOP

     FOR j IN 1..m LOOP

        IF substr(password,j,1) = substr(punctarray,i,1) THEN

           ispunct:=TRUE;

            GOTO endsearch;

        END IF;

     END LOOP;

  END LOOP;

   IFispunct = FALSE THEN

     raise_application_error(-20003, 'Password should contain at least one \

              digit, one character and onepunctuation');

  END IF;

 

  <<endsearch>>

   --Check if the password differs from the previous password by at least

   --3 letters

   IFold_password IS NOT NULL THEN

    differ := length(old_password) - length(password);

 

    IF abs(differ) < 3 THEN

      IF length(password) < length(old_password) THEN

        m := length(password);

      ELSE

        m := length(old_password);

      END IF;

 

      differ := abs(differ);

      FOR i IN 1..m LOOP

        IF substr(password,i,1) != substr(old_password,i,1) THEN

          differ := differ + 1;

        END IF;

      END LOOP;

 

      IF differ < 3 THEN

        raise_application_error(-20004, 'Password should differ by at \

        least 3 characters');

      END IF;

    END IF;

  END IF;

   --Everything is fine; return TRUE ;  

  RETURN(TRUE);

END;

/

 

-- This script alters the defaultparameters for Password Management

-- This means that all the users on thesystem have Password Management

-- enabled and set to the following valuesunless another profile is

-- created with parameter values set todifferent value or UNLIMITED

-- is created and assigned to the user.

 

-- Enable this if you want older version ofthe Password Profile parameters

-- 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_FUNCTIONverify_function;

[oracle@dave admin]$

 

 

注: 内容引自Oracle 11g OCP 教材。

 

 

---------------------------------------------------------------------------------------

Skype:    tianlesoftware

QQ:       tianlesoftware@gmail.com

Email:    tianlesoftware@gmail.com

Blog:     http://blog.csdn.net/tianlesoftware

Weibo:    http://weibo.com/tianlesoftware

Twitter:  http://twitter.com/tianlesoftware

Facebook: http://www.facebook.com/tianlesoftware

Linkedin: http://cn.linkedin.com/in/tianlesoftware

转载于:https://www.cnblogs.com/tianlesoftware/archive/2012/11/26/3609135.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值