本标准适用于Unix/Linux操作系统下的Oracle数据库系统,版本为8i、9i、10g。
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=。 1.Oracle 9i、10g:缺省值是False 2.Oracle 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.ORA和LISTENER.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_VIEW、DBSNMP、SYSMAN帐号或修改密码。(如果要使用DBConsole ,DBSNMP 、SYSMAN不能锁定,请修改密码) DIP、EXFSYS、OUTLN、TSMSYS、WMSYS默认已锁定,请验证。 |
9最小权限使用规则
加固目的 |
1.应该只提供最小权限给用户(包括SYSTEM和OBJECT权限) 2.从PUBLIC组中撤回不必要的权限或角色。(如:UTL_SMTP、UTL_TCP、UTL_HTTP、UTL_FILE、DBMS_RANDON、DBMS_SQL、DBMS_SYS_SQL、DBMS_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”。如果忘记修改该用户的口令,任何人都可以通过该用户存取数据库系统。其他有威胁的帐号还有:CTXSYS,MDSYS,ORDPLUGINS,ORDSYS,OUTLN等。 |
加固方法 |
锁定该账号,或者更换密码 |
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_TRAIL=True。 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监听listener作ip访问限制
修改(需重启监听)
$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_limit为TRUE 限定资源参数(resourceparameters)设置有效;不管resource_limit 的值为TRUE 或FALSE密码参数(passwordparameters)设置始终有效。
alter system set resource_limit=true scope=both;
常用资源参数(除非应用程序有明确的资源规划,一般不需修改):CPU_PER_SESSION、CPU_PER_CALL、LOGICAL_READS_PER_SESSION、LOGICAL_READS_PER_CALL、IDLE_TIME、CONNECT_TIME、PRIVATE_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端口访问。XDB的HTTP 和FTP 服务存在多个缓冲区溢出问题,远程攻击者可以利用这些漏洞对服务进行拒绝服务攻击,精心提交字符串数据可能以服务进程权限在系统上执行任意指令。
show parameter dispatchers如为空,表示无该服务。
去掉相应的数据库的初始化参数中的如下行:
dispatchers='(PROTOCOL=TCP)(SERVICE={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_TCP、DBMS_RANDOM 包
utl_tcp包允许 Oracle 用户通过 TCP 建立连接,从而从网络上得到可执行文件。这个包的使用权限应该受到限制。
DBMS_RANDOM包可被用来加密存储的数据。通常,大多数用户不应该具有加密数据的权限,因为如果没有安全的生成、保存和管理密钥的话被加密的数据将不可恢复。
revoke EXECUTE on sys.utl_tcp from PUBLIC;
revoke EXECUTE on sys.dbms_random from PUBLIC;