1、 关于操作系统和数据库合规检查漏洞的解决方案Oracle数据库分册 适用软件版本 Oracle10g、11g 适用硬件版本 主题 关于操作系统和数据库合规检查漏洞的解决方案Oracle数据库分册 1、 问题描述与原因: Oracle数据库在合规检查时被扫描出漏洞,要求对这些漏洞进行解决。 2、 应对措施: 对存在漏洞进行定制的安全加固操作。 3、 执行条件/注意事项: Ø 加固前确保服务器、数据库、网管运行均正常。最好重启下服务器、数据库和网管查看重启后网管是否能运行正常。如果加固前服务器本身有问题,加固后服务器运行异常会加大排查难度。 Ø 本解
2、决方案执行完成后,需要重启Oracle数据库来生效某些操作。 Ø 本解决方案不必完全执行,请根据系统扫描出的漏洞选择对应的漏洞条目进行操作。 Ø 如无特殊说明,本文中的执行用户均为oracle 4、 操作步骤: 漏洞清单(单击可跳转): (注:漏洞名称与配置项信息中的配置项名称对应。) 漏洞1. 检查是否对用户的属性进行控制(5) 漏洞2. 检查是否配置Oracle软件账户的安全策略(2) 漏洞3. 检查是否启用数据字典保护 漏洞4. 检查是否在数据库对象上设置了VPD和OLS(6) 漏洞5. 检查是否存在dvsys用户dbms_macadm对象(14)
3、 漏洞6. 检查是否数据库应配置日志功能(11) 漏洞7. 检查是否记录操作日志(13) 漏洞8. 检查是否记录安全事件日志(7) 漏洞9. 检查是否根据业务要求制定数据库审计策略 漏洞10. 检查是否为监听设置密码 漏洞11. 检查是否限制可以访问数据库的地址(1) 漏洞12. 检查是否使用加密传输(4) 漏洞13. 检查是否设置超时时间(15) 漏洞14. 检查是否设置DBA组用户数量限制(3) 漏洞15. 检查是否删除或者锁定无关帐号 漏洞16. 检查是否限制具备数据库超级管理员(SYSDBA)权限的用户远程登录(10) 漏洞17. 检查口令强度设置(17) 漏
4、洞18. 检查帐户口令生存周期(12) 漏洞19. 检查是否设置记住历史密码次数(8) 漏洞20. 检查是否配置最大认证失败次数 漏洞21. 检查是否在配置用户所需的最小权限(9) 漏洞22. 检查是否使用数据库角色(ROLE)来管理对象的权限(16) 漏洞23. 检查是否更改数据库默认帐号的密码 执行Oracle安全加固操作前备份文件: bash-3.2$ cp $ORACLE_HOME/network/admin/listener.ora $ORACLE_HOME/network/admin/listener.ora.org bash-3.2$ cp $ORACLE_H
5、OME/network/admin/sqlnet.ora $ORACLE_HOME/network/admin/sqlnet.ora.org Oracle数据库漏洞的解决方案全部执行完成后,需要重启Oracle实例来生效某些操作。 漏洞1. 检查是否对用户的属性进行控制 类型:Oracle数据库类 问题: SQL> select count(t.username) from dba_users t where profile not in ('DEFAULT','MONITORING_PROFILE'); COUNT(T.USERNAME)-----------------
6、 0 解决方案: 暂时不处理。 漏洞2. 检查是否配置Oracle软件账户的安全策略 类型:Oracle数据库类 问题: 略 解决方案: 暂时不处理 漏洞3. 检查是否启用数据字典保护 类型:Oracle数据库类 问题: SQL> select value from v$parameter where name like '%O7_DICTIONARY_ACCESSIBILITY%';select value from v$parameter where name like '%O7_DICTIONARY_ACCESSIBILITY%' * E
7、RROR at line 1:
ORA-01034: ORACLE not available
Process ID: 0
Session ID: 0 Serial number: 0
解决方案:
在数据库启动的情况下,通过下面的命令检查o7_dictionary_accessibility的参数值:
bash-3.2$ sqlplus system/oracle@
8、 All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> show parameter o7_dictionary_accessibility; NAME TYPE VALUE
9、 ------------------------------------ ----------- ------------------------------ O7_DICTIONARY_ACCESSIBILITY boolean FALSE 检查出默认的结果是FALSE后,使用下面的命令退出SQL*PLUS: SQL> exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partition
10、ing, OLAP, Data Mining and Real Application Testing options 漏洞4. 检查是否在数据库对象上设置了VPD和OLS 类型:Oracle数据库类 问题: SQL> select count(*) from v$vpd_policy; COUNT(*) ---------- 0 解决方案: 暂时不处理。 漏洞5. 检查是否存在dvsys用户dbms_macadm对象 类型:Oracle数据库类 问题: SQL> select count(*) from dba_users where user
11、name='DVSYS'; COUNT(*) ---------- 0 解决方案: 暂时不处理。 漏洞6. 检查是否数据库应配置日志功能 类型:Oracle数据库类 问题: SQL> select count(*) from dba_triggers t where trim(t.triggering_event) = trim('LOGON'); COUNT(*) ---------- 0 解决方案: 暂时不处理。 漏洞7. 检查是否记录操作日志 类型:Oracle数据库类 问题: SQL> select val
12、ue from v$parameter t where t.name = 'audit_trail'; select value from v$parameter t where t.name = 'audit_trail' * ERROR at line 1: ORA-01034: ORACLE not available Process ID: 0 Session ID: 0 Serial number: 0 解决方案: 暂时不处理。 漏洞8. 检查是否记录安全事件日志 类型:Oracle数据库类 问题: SQL> select count(*) from dba_
13、triggers t where trim(t.triggering_event) = trim('LOGON'); COUNT(*) ---------- 0 解决方案: 暂时不处理。 漏洞9. 检查是否根据业务要求制定数据库审计策略 类型:Oracle数据库类 问题: SQL> select value from v$parameter t where t.name = 'audit_trail'; select value from v$parameter t where t.name = 'audit_trail' * ERROR at lin
14、e 1: ORA-01034: ORACLE not available Process ID: 0 Session ID: 0 Serial number: 0 解决方案: 暂时不处理。 漏洞10. 检查是否为监听设置密码 类型:Oracle数据库类 问题: $ cat `find $ORACLE_HOME -name sqlnet.ora` | grep -v "#"|grep -v "^$"find: 0652-081 cannot change directory to :
15、 : The file access permissions do not allow the specified action. $ cat `find $ORACLE_HOME -name listener.ora` | grep -v "#"|grep -v "^$"find: 0652-081 cannot change directory to : : The file access permissions do not allow the specified action.SID_
16、LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /oracle/app/oracle/dbhome_1) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = minos) (ORACLE_HOME = /oracle/app/oracle/dbhome_1) (SID_NAME = minos) ) )LISTENER = (DESCRIPTION
17、LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 100.92.255.141)(PORT = 1521)) ) )ADR_BASE_LISTENER = /oracle/app/oracle 解决方案: bash-3.2$ lsnrctl LSNRCTL for IBM/AIX RISC System/6000: Version 11.2.0.3.0 - Production on 08-JAN-2014 15:11:21 Copyright (c) 1991, 2011, Oracle
18、 All rights reserved. Welcome to LSNRCTL, type "help" for information. LSNRCTL> change_password Old password: <如果之前没有密码则这里不填,直接按Enter键> New password: Reenter new password: Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.92.243.82)(PORT=1521))) Password changed for LISTENER
19、 The command completed successfully LSNRCTL> save_config Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.92.243.82)(PORT=1521))) Saved LISTENER configuration parameters. Listener Parameter File /oracle/app/oracle/11.2.0.3/dbhome_1/network/admin/listener.ora Old Parameter File /or
20、acle/app/oracle/11.2.0.3/dbhome_1/network/admin/listener.bak The command completed successfully LSNRCTL> exit bash-3.2$ 设置完成后通过下面的命令检查: bash-3.2$ cat $ORACLE_HOME/network/admin/listener.ora | grep "^PASSWORDS" 有输出则说明已经设置成功了。 漏洞11. 检查是否限制可以访问数据库的地址 类型:Oracle数据库类 问题: $ cat `find $ORACLE_HOM
21、E -name sqlnet.ora` | grep -v "#"|grep -v "^$"find: 0652-081 cannot change directory to : : The file access permissions do not allow the specified action. $ cat `find $ORACLE_HOME -name listener.ora` | grep -v "#"|grep -v "^$"find: 0652-081 cannot ch
22、ange directory to : : The file access permissions do not allow the specified action.SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /oracle/app/oracle/dbhome_1) (PROGRAM = extproc) ) (SID_DES
23、C = (GLOBAL_DBNAME = minos) (ORACLE_HOME = /oracle/app/oracle/dbhome_1) (SID_NAME = minos) ) )LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 100.92.255.141)(PORT = 1521)) ) )ADR_BASE_LISTENER = /oracle/app/oracle 解决方案: 检查$ORACLE_HOM
24、E/network/admin/sqlnet.ora文件中是否有以下行:
TCP.VALIDNODE_CHECKING = YES
TCP.INVITED_NODES = (
25、t.ora 漏洞12. 检查是否使用加密传输 类型:Oracle数据库类 问题: $ cat `find $ORACLE_HOME -name sqlnet.ora` | grep -v "#"|grep -v "^$"find: 0652-081 cannot change directory to : : The file access permissions do not allow the specified action. $ cat `find $ORACLE_HOME -n
26、ame listener.ora` | grep -v "#"|grep -v "^$"find: 0652-081 cannot change directory to : : The file access permissions do not allow the specified action.SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_H
27、OME = /oracle/app/oracle/dbhome_1) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = minos) (ORACLE_HOME = /oracle/app/oracle/dbhome_1) (SID_NAME = minos) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST
28、 = 100.92.255.141)(PORT = 1521)) ) ) ADR_BASE_LISTENER = /oracle/app/oracle 解决方案: 暂时不处理。 漏洞13. 检查是否设置超时时间 类型:Oracle数据库类 问题: $ cat `find $ORACLE_HOME -name sqlnet.ora` | grep -v "#"|grep -v "^$" find: 0652-081 cannot change directory to
29、 : The file access permissions do not allow the specified action. $ cat `find $ORACLE_HOME -name listener.ora` | grep -v "#"|grep -v "^$" find: 0652-081 cannot change directory to : : The file access permissions do not allow the specified acti
30、on. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /oracle/app/oracle/dbhome_1) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = minos) (ORACLE_HOME = /oracle/app/oracle/dbhome_1) (SID_NAME = minos)
31、 ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 100.92.255.141)(PORT = 1521)) ) ) ADR_BASE_LISTENER = /oracle/app/oracle 解决方案: 通过下面的命令检查是否设置了SQLNET.EXPIRE_TIME的参数值为10: bash-3.2$ grep -i "SQLNET.EXPIRE_TIME" $ORACLE_HOME/network/a
32、dmin/sqlnet.ora 如果没有设置,在$ORACLE_HOME/network/admin/sqlnet.ora文件中添加一行: SQLNET.EXPIRE_TIME=10 随后重新启动监听和数据库。 如果不存在sqlnet.ora文件,请使用以下命令创建此文件后再实施上面的操作: bash-3.2$ touch $ORACLE_HOME/network/admin/sqlnet.ora 漏洞14. 检查是否设置DBA组用户数量限制 类型:Oracle数据库类 问题: 略 解决方案: 手动将其他非oracle的用户从dba组中删除,将oracle用户从roo
33、t或system组中删除。查询用户所属组的命令是groups
34、 1:ORA-01034: ORACLE not availableProcess ID: 0Session ID: 0 Serial number: 0 解决方案: 暂时不处理。 漏洞16. 检查是否限制具备数据库超级管理员(SYSDBA)权限的用户远程登录 类型:Oracle数据库类 问题: SQL> select t.VALUE from v$parameter t where upper(t.NAME) like '%REMOTE_LOGIN_PASSWORDFILE%'; VALUE -----------------------------------------
35、
EXCLUSIVE
解决方案:
在数据库启动时,通过下面的命令检查remote_login_passwordfile的参数值:
bash-3.2$ sqlplus sys/oracle@
36、acle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> show parameters remote_login_passwordfile; NAME TYPE VALUE ------------------------------------ -----
37、 ------------------------------ remote_login_passwordfile string EXCLUSIVE 如果参数值为NONE,则默认满足安全要求。否则,通过下面的SQL语句修改参数值为NONE: SQL> alter system set remote_login_passwordfile=NONE scope=spfile; System altered. 修改后重启数据库: SQL> shutdown immediate Database closed. Database di
38、smounted.
ORACLE instance shut down.
bash-3.2$ export ORACLE_SID=
39、p ORACLE instance started. Total System Global Area 8589934592 bytes Fixed Size 2065744 bytes Variable Size 3238009520 bytes Database Buffers 5301600256 bytes Redo Buffers 48259072 bytes Database mounted. Database opened. SQL> 检查参数值是否修改成功
40、 SQL> show parameters remote_login_passwordfile; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ remote_login_passwordfile string NONE 修改成功后退出SQL*PLUS: SQL> exit Disconnected from Oracle
41、 Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 漏洞17. 检查口令强度设置 类型:Oracle数据库类 问题: SQL> select count(*) from dba_profiles where resource_name = 'PASSWORD_VERIFY_FUNCTION' and limit = 'NULL'; COUNT(*)
42、 ---------- 1 解决方案: 暂时不处理。 漏洞18. 检查帐户口令生存周期 类型:Oracle数据库类 问题: SQL> select limit from dba_profiles t where resource_name = 'PASSWORD_LIFE_TIME'; LIMIT----------------------------------------UNLIMITEDDEFAULTDEFAULT 解决方案: 暂时不处理。 漏洞19. 检查是否设置记住历史密码次数 类型:Oracle数据库类 问题: SQL> select
43、 limit from dba_profiles t where resource_name = 'PASSWORD_REUSE_MAX'; LIMIT ---------------------------------------- UNLIMITED DEFAULT DEFAULT 解决方案: 暂时不处理。 漏洞20. 检查是否配置最大认证失败次数 类型:Oracle数据库类 问题: SQL> select limit from dba_profiles t where resource_name = 'FAILED_LOGIN_ATTEMPTS'; select
44、limit from dba_profiles t where resource_name = 'FAILED_LOGIN_ATTEMPTS'
*
ERROR at line 1:
ORA-01034: ORACLE not available
Process ID: 0
Session ID: 0 Serial number: 0
解决方案:
在数据库启动的情况下,通过下面的命令检查FAILED_LOGIN_ATTEMPTS的值:
bash-3.2$ sqlplus system/oracle@
45、duction on Thu Jan 9 11:33:56 2014 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> SELECT RESOURCE_NAME, LIMIT FROM
46、 DBA_PROFILES WHERE RESOURCE_NAME='FAILED_LOGIN_ATTEMPTS' AND PROFILE='DEFAULT'; RESOURCE_NAME LIMIT -------------------------------- ---------------------------------------- FAILED_LOGIN_ATTEMPTS UNLIMITED 如果LIMIT的值为6,则符合安全要求。否则,通过下面的SQL语句修改参数值: SQL> ALTER PRO
47、FILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 6; Profile altered. 检查参数值是否修改成功: SQL> SELECT RESOURCE_NAME, LIMIT FROM DBA_PROFILES WHERE RESOURCE_NAME='FAILED_LOGIN_ATTEMPTS' AND PROFILE='DEFAULT'; RESOURCE_NAME LIMIT -------------------------------- -------------------------
48、 FAILED_LOGIN_ATTEMPTS 6 修改成功后退出SQL*PLUS: SQL> exit Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 漏洞21. 检查是否在配置用户所需的最小权限 类型:Oracle数据库类 问题: SQL>
49、select count(a.username) from dba_users a left join dba_role_privs b on a.username = b.grantee where granted_role = 'DBA' and a.username not in ('SYS','SYSMAN','SYSTEM','WKSYS','CTXSYS'); COUNT(A.USERNAME) ----------------- 19 解决方案: 暂时不处理。 漏洞22. 检查是否使用数据库角色(ROLE)来管理对象的权限 类型:Or
50、acle数据库类 问题: SQL> select count(a.username) from dba_users a left join dba_role_privs b on a.username = b.grantee where granted_role = 'DBA' and a.username not in ('SYS','SYSMAN','SYSTEM','WKSYS','CTXSYS'); COUNT(A.USERNAME) ----------------- 19 解决方案: 暂时不处理。 漏洞23. 检查是否更改数据库默认帐






