oracle安全加固

本标准适用于Unix/Linux操作系统下的Oracle数据库系统,版本为8i9i10g

1安全补丁的更新

加固目的

及时更新数据库的安全补丁,减少数据库系统可能受到的攻击。

加固方法

查看http://metalink.oracle.com,下载并安装相关的安全补丁。

参考Oracle厂商建议,仅对已发现的特定漏洞或缺陷安装相应补丁。

2$ORACLE_HOME/bin目录权限保护

加固目的

确保对$ORACLE_HOME/bin目录的访问权限尽可能少

加固方法

运行命令:

chown  �CR oracle:dba $ORACLE_HOME/bin

验证ls �Cl $ORACLE_HOME/bin 确保该目录下的文件属主为oracle用户,且其他用户没有写权限。

3Oracle 数据字典的保护

加固目的

设置保护后,可防止其他用户(具有‘ANY’ system privileges)使用数据字典时,具有相同的‘ANY’权限。

加固方法

使用文本方式,打开数据库配置文件init<sid>.ora;更改以下参数O7_DICTIONARY_ACCESSIBILITY=。

1Oracle 9i10g缺省值是False

2Oracle 8i:缺省值是True,需要改成False

3.如果用户必须需要该权限,赋予其权限SELECT ANY DICTIONARY

验证:SQL>  show parameter O7_DICTIONARY_ACCESSIBILITY

NAMETYPEVALUE

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

O7_DICTIONARY_ACCESSIBILITYbooleanFALSE

4加强访问控制

加固目的

设置正确识别客户端用户,并限制操作系统用户数量(包括管理员权限、root权限、普通用户权限等)

加固方法

1.使用文本方式,打开数据库配置文件init<sid>.ora;设置参数REMOTE_OS_AUTHENT值为FALSE(SAP 系统不可设置为False)

2.在数据库的账户管理中删除不必要的操作系统账号

设置(需重启数据库)

alter system set remote_os_authent=false scope=spfile;

验证:

SQL> show parameter remote_os_authent

NAMETYPEVALUE

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

remote_os_authentbooleanFALSE

5监听程序的管理

加固目的

通过设置listener.ora文件中的参数ADMIN_RESTRICTIONS_listener_name来防止远程对监听程序的非授权管理。

加固方法

listener.ora文件中,设置ADMIN_RESTRICTIONS_(listener_name)=ON

LISTENER加访问密码:(only 9i)

$ORACLE_HOME/network/admin/listener.ora

PASSWORDS_LISTENER  =

10g : (监听默认为本地操作系统帐号认证,即禁止远程管理)

验证:

Lsnrctl  status,查看输出

SecurityON: Local OS Authentication


6关闭Extproc功能

加固目的

由于extproc存在安全问题允许用户不进行身份认证就可以调用系统函数,因此,如果不需要该功能必须关闭。

加固方法

修改TNSNAMES.ORALISTENER.ORA文件,删除以下条目

licache_extproc

lPLSExtproc

lExtproc

tnsnames.ora  :

#EXTPROC_CONNECTION_DATA  =

#(DESCRIPTION =

#(ADDRESS_LIST =

#(ADDRESS = (PROTOCOL = IPC)(KEY =  EXTPROC0))

#)

#(CONNECT_DATA =

#(SID = PLSExtProc)

#(PRESENTATION = RO)

#)

#)


listener.ora  :

#(SID_DESC =

#(SID_NAME = PLSExtProc)

#(ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

#(PROGRAM = extproc)

#)


#(ADDRESS = (PROTOCOL = IPC)(KEY =  EXTPROC0))


7密码文件管理

加固目的

配置密码文件的使用方式

加固方法

使用文本方式,打开数据库配置文件init<sid>.ora;设置参数REMOTE_LOGIN_PASSWORD_FILE=NONE.(  只能使用OS)

None: 使得oracle不使用密码文件,只能使用OS认证,不允许通过不安全网络进行远程管理。

Exclusive: 可以使用唯一的密码文件,但只限一个数据库。密码文件中可以包括除了sys用户的其他用户。

Shared: 可以在多个数据库上使用共享的密码文件。但是密码文件中只能包含sys用户。

设置:(需重启数据库)

alter  system set remote_login_passwordfile=none scope=spfile;

验证:

SQL> show parameter  remote_login_passwordfile


NAMETYPEVALUE

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

remote_login_passwordfilestringNONE

8用户账号管理

加固目的

为了安全考虑,应用锁定Oracle当中不需要的用户;或改变缺省用户的密码。

加固方法

锁定不需要的用户,使用SQL语句:ALTER USER user PASSWORD EXPIRE;

注意锁定MGMT_VIEWDBSNMPSYSMAN帐号或修改密码。(如果要使用DBConsole DBSNMP SYSMAN不能锁定,请修改密码)

DIPEXFSYSOUTLNTSMSYSWMSYS默认已锁定,请验证。

9最小权限使用规则

加固目的

1.应该只提供最小权限给用户(包括SYSTEMOBJECT权限)

2.PUBLIC组中撤回不必要的权限或角色。(如:UTL_SMTPUTL_TCPUTL_HTTPUTL_FILEDBMS_RANDONDBMS_SQLDBMS_SYS_SQLDBMS_BACKUP_RESTORE

加固方法

撤销不需要的权限和角色,使用SQL语句

REVOKE  EXECUTE ON SYS.UTL_HTTP FROM PUBLIC;

REVOKE  EXECUTE ON SYS.UTL_FILE FROM PUBLIC;

REVOKE  EXECUTE ON SYS.UTL_SMTP FROM PUBLIC;

REVOKE  SELECT ON ALL_USERS FROM PUBLIC;

验证:

OEM管理器中,安全性->用户->PUBLIC->已授予的对象权限

col pp format a35

SELECT s.privilege||' ON  '||s.owner||'.'||NVL(l.longname, s.table_name) pp, s.grantable FROM

sys.dba_tab_privs s, javasnm l WHERE  s.table_name = l.short(+) AND s.grantee='PUBLIC'

and s.privilege = 'EXECUTE' and  s.table_name like 'UTL%';

10DBSNMP用户的保护

加固目的

Oracle数据库系统如果采用典型安装后,自动创建一个叫做DBSNMP的用户,该用户允许Oracle系统的智能代理(intelligent Agent),该用户的缺省密码也是“DBSNMP”。如果忘记修改该用户的口令,任何人都可以通过该用户存取数据库系统。其他有威胁的帐号还有:CTXSYSMDSYSORDPLUGINSORDSYSOUTLN等。


加固方法

锁定该账号,或者更换密码

11SYS用户

加固目的

Oracle数据库系统安装后,自动创建一个叫做SYS的数据库管理员用户,当该用户sysdba方式连接数据库时,便具有全部系统权限,因而对它的保护尤为重要。

加固方法

更换SYS用户密码,符合密码复杂度要求

新建一个DBA用户,作为日常管理使用。

12密码策略

加固目的

Oracle,我们可以通过修改用户概要文件来设置密码的安全策略,可以自定义密码的复杂度。在概要文件中有以下参数是和密码安全有关心的:

FAILED_LOGIN_ATTEMPTS:最大错误登录次数

PASSWORD_GRACE_TIME:口令失效后锁定时间

PASSWORD_LIFE_TIME:口令有效时间

PASSWORD_LOCK_TIME:登录超过有效次数锁定时间

PASSWORD_REUSE_MAX:口令历史记录保留次数

PASSWORD_REUSE_TIME:口令历史记录保留时间

PASSWORD_VERIFY_FUNCTION:口令复杂度审计函数

加固方法

解释:

PASSWORD_LIFE_TIME:口令有效时间

口令使用期限(应用系统帐号暂不修改)。

password_grace_time  指的是在你的密码已经过期以后, 第一次登录时间开始往后统计, 使系统可以使用的日期限度.

PASSWORD_REUSE_TIME是重用密码的最小时间间隔,单位是天。可以给出整数或分数,如1/1440表示1分钟(出于效率的考虑,oracle不会每分钟都去进行检查,一般来说,有5分钟左右的误差,因此如果这个数小于1/144则没有多大的意义)。

PASSWORD_REUSE_MAX是重用密码前更换密码的最小次数。

ALTER  PROFILE default LIMIT FAILED_LOGIN_ATTEMPTS 60;

ALTER  PROFILE default LIMIT PASSWORD_LOCK_TIME 0.5;


修改Oracle提供的验证函数文件$ORACLE_HOME/rdbms/admin/utlpwdmg.sql

其中IF length(password) < 4 一行改为< 8,并将最后一段修改为

ALTER  PROFILE DEFAULT LIMIT

FAILED_LOGIN_ATTEMPTS 60

PASSWORD_LOCK_TIME 30/1440

PASSWORD_VERIFY_FUNCTION  verify_function;


执行start utlpwdmg.sql

设置后,密码复杂度必须包含字母、数字、标点(密码不区分大小写),最小长度为8

最大错误登录次数为60次,账号锁定时间为30分钟


验证:OEM-》安全性-》概要文件

select * from dba_profiles;


创建验证函数:

CREATE OR  REPLACE FUNCTION verify_function

(username  varchar2,

password varchar2,

old_password varchar2)

RETURN boolean IS

n boolean;

m integer;

differ integer;

isdigit boolean;

ischarboolean;

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

IF NLS_LOWER(password) =  NLS_LOWER(username) THEN

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

END IF;


-- Check for the minimum length of the  password

IF length(password) < 8 THEN

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

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.

IF NLS_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;

IF isdigit = FALSE THEN

raise_application_error(-20003,  'Password should contain at least one digit, 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;

IF ischar = FALSE THEN

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

digit, one character and one  punctuation');

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;

IF ispunct = FALSE THEN

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

digit, one character and one  punctuation');

END IF;


<<endsearch>>

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

-- 3 letters

IF old_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;

/


ALTER PROFILE  DEFAULT LIMIT

FAILED_LOGIN_ATTEMPTS  60

PASSWORD_LOCK_TIME  30/1440

PASSWORD_VERIFY_FUNCTION  verify_function;



13数据库操作审计

加固目的

ORACLE数据库具有对其内部所有发生的活动的审计能力,审计日志一般放在sys.aud$表中,也可以写入操作系统的审计跟踪文件中。可审计的活动有三种类型:登录尝试、数据库活动和对象存取,缺省情况下,数据库不启动审计,要求管理员配置数据库后才能启动审计。

加固方法

使用文本方式,打开数据库配置文件init<sid>.ora;更改以下参数配置AUDIT_TRAILTrue

alter system set audit_trail='OS' scope=spfile;

alter  system set Audit_sys_operations=true scope=spfile;

默认为false,当设置为true时,所有sys用户(包括以sysdba,sysoper身份登录的用户)的操作都会被记录


验证:

SQL> show parameter audit


NAMETYPEVALUE

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

audit_sys_operationsbooleanTRUE

audit_trailstringOS



TRANSACTION_AUDITING :

the transaction layer generates a special  redo record which contains session and user information.These records might  be useful if using a redo log analysis tool.

AUDIT_FILE_DEST指定了当审外部审记文件目标存储路径,其缺省值是$ORACLE_HOME/rdbms/audit

http://hi.baidu.com/ipeipei/blog/item/2b3759825da6d4a20cf4d271.html

http://blog.csdn.net/ruixj/archive/2007/04/17/1568095.aspx


audit_file_deststring/opt/oracle/admin/cognos/adump


监听器日志错误登录

/opt/oracle/product/10.2.0/db_1/network/log/listener.log

14本地缓存区溢出防护

加固目的

'oracle'程序存在本地缓冲区溢出。在传递命令行参数给'oracle'程序时缺少充分的边界缓冲区检查,可导致以'oracle'进程权限在系统上执行任意代码,需要进行有效加固。

加固方法

以系统管理员权限登录操作系统,进入Oracle安装目录

运行:chmod o-x oracle加强对Oracle文件的可执行控制

验证非oracle帐号对该文件没有读取、运行权限

ll $ORACLE_HOME/bin/oracle

-rwsr-s---1 oracle dba 110758976 2008-01-23/opt/oracle/product/10.2.0/db_1/bin/oracle

chmod o-x $ORACLE_HOME/bin/oracle


15监听listenerip访问限制

修改(需重启监听)

$ORACLE_HOME/network/admin/sqlnet.ora :

tcp.validnode_checking=yes

tcp.invited_nodes=(localhost,本机ip, 应用服务器ip,管理机ip)

注:对二层结构的应用,不需设置该选项。


16修改默认的监听端口

修改(需重启监听)

$ORACLE_HOME/network/admin/listener.ora:

(ADDRESS = (PROTOCOL = TCP)(HOST= 127.0.0.1)(PORT = 1521))

修改PORT的值为新的监听端口->

(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 3521))


确认:

lsnrctl status


17日志目录

SQL> showparameter dump


NAMETYPEVALUE

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

background_core_dumpstringpartial

background_dump_deststring/opt/oracle/admin/portaldb/bdump

core_dump_deststring/opt/oracle/admin/portaldb/cdump

max_dump_file_sizestringUNLIMITED

shadow_core_dumpstringpartial

user_dump_deststring/opt/oracle/admin/portaldb/udump


SQL> showparameter audit

NAMETYPEVALUE

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

audit_file_deststring/opt/oracle/admin/portaldb/adump


18启用资源限制

Profile 分两部分(资源参数和密码参数)resource_limitTRUE 限定资源参数(resourceparameters)设置有效;不管resource_limit 的值为TRUE FALSE密码参数(passwordparameters)设置始终有效。

alter system set resource_limit=true scope=both;


常用资源参数(除非应用程序有明确的资源规划,一般不需修改)CPU_PER_SESSIONCPU_PER_CALLLOGICAL_READS_PER_SESSIONLOGICAL_READS_PER_CALLIDLE_TIMECONNECT_TIMEPRIVATE_SGA


19监听器跟踪级别

可根据需要设定监听级别,开启跟踪会对性能有所影响。

监听器跟踪级别有四个状态:OFF - 未启用跟踪功能,是默认值。USER- 用户级别,标识用户导致的错误条件。ADMIN- 数据库管理员级别,标识特定的安装问题。SUPPORT- 客户支持人员级别,跟踪文件可能会变得很大。建议在进行网络问题诊断时开启跟踪功能。

LSNRCTL> set trc_directory/network/trace

LSNRCTL> set trc_file .trc

LSNRCTL> set trc_level <级别>

LSNRCTL> save_config

20XDB服务

Oracle XDB Oracle XML 数据库,OracleXDB 数据可以通过基于HTTP 服务的8080端口或者基于FTP 服务的2100端口访问。XDBHTTP FTP 服务存在多个缓冲区溢出问题,远程攻击者可以利用这些漏洞对服务进行拒绝服务攻击,精心提交字符串数据可能以服务进程权限在系统上执行任意指令。

show parameter dispatchers如为空,表示无该服务。

去掉相应的数据库的初始化参数中的如下行:

dispatchers='PROTOCOL=TCPSERVICE={sid}XDB'

说明:sid 为数据库的实例名,再重启数据库。

21SYS.DBMS_DEFER_SYS.DELETE_TRAN存在 SQL 注入漏洞

DELETE_TRAN DESTINATION 参数的处理存在问题,可能导致SQL 注入攻击。攻击者利用该漏洞可以提升权限,还可以以系统管理员权限执行SQL 命令。

查看哪些用户有执行权限:

col pp format a35

SELECT s.privilege||' ON'||s.owner||'.'||NVL(l.longname, s.table_name) pp, s.grantable, s.grantee FROM

sys.dba_tab_privs s, javasnm l WHEREs.table_name = l.short(+)

and s.privilege = 'EXECUTE' ands.table_name like 'DBMS_DEFER_SYS%';

回收权限:

REVOKE EXECUTE ON SYS. DBMS_DEFER_SYS FROM DBA;

REVOKE EXECUTE ON SYS. DBMS_DEFER_SYS FROM WMSYS;


22DBMS_AQELM缓冲区溢出漏洞

由于没有对其传入参数进行缓冲区边界检查,当传入超长字符串时,就会引起缓冲区溢出。攻击者利用此漏洞可以在服务器上执行任意代码。默认情况下,属于AQ_ADMINISTRATOR_ROLE 角色的用户才有 DBMS_AQELM 包的执行权限。

SELECT s.privilege||' ON'||s.owner||'.'||NVL(l.longname, s.table_name) pp, s.grantable, s.grantee FROM

sys.dba_tab_privs s, javasnm lWHERE s.table_name = l.short(+)

and s.privilege = 'EXECUTE' ands.table_name like 'DBMS_AQELM%';

回收权限:

REVOKE EXECUTE ON SYS. DBMS_AQELM FROM AQ_ADMINISTRATOR_ROLE;

REVOKE EXECUTE ON SYS. DBMS_AQELM FROM EXECUTE_CATALOG_ROLE;

REVOKE EXECUTE ON SYS. DBMS_AQELM FROM SYSTEM;


23UTL_TCPDBMS_RANDOM

utl_tcp包允许 Oracle 用户通过 TCP 建立连接,从而从网络上得到可执行文件。这个包的使用权限应该受到限制。
DBMS_RANDOM包可被用来加密存储的数据。通常,大多数用户不应该具有加密数据的权限,因为如果没有安全的生成、保存和管理密钥的话被加密的数据将不可恢复。

revoke EXECUTE on sys.utl_tcp from PUBLIC;

revoke EXECUTE on sys.dbms_random from PUBLIC;



你可能感兴趣的:(oracle,安全加固)