janneyabc 发表于 2018-9-14 10:33:03

oracle安全加固

  本标准适用于Unix/Linux操作系统下的Oracle数据库系统,版本为8i、9i、10g。
  1安全补丁的更新
  加固目的
  及时更新数据库的安全补丁,减少数据库系统可能受到的***。
  加固方法
  查看http://metalink.oracle.com,下载并安装相关的安全补丁。
  参考Oracle厂商建议,仅对已发现的特定漏洞或缺陷安装相应补丁。
  2$ORACLE_HOME/bin目录权限保护
  加固目的
  确保对$ORACLE_HOME/bin目录的访问权限尽可能少
  加固方法
  运行命令:
  chown–R oracle:dba $ORACLE_HOME/bin
  验证:ls –l $ORACLE_HOME/bin 确保该目录下的文件属主为oracle用户,且其他用户没有写权限。
  3Oracle 数据字典的保护
  加固目的
  设置保护后,可防止其他用户(具有‘ANY’ system privileges)使用数据字典时,具有相同的‘ANY’权限。
  加固方法
  使用文本方式,打开数据库配置文件init.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.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 : (监听默认为本地操作系统帐号认证,即禁止远程管理)
  验证:
  Lsnrctlstatus,查看输出
  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.ora;设置参数REMOTE_LOGIN_PASSWORD_FILE=NONE.(只能使用OS)
  None: 使得oracle不使用密码文件,只能使用OS认证,不允许通过不安全网络进行远程管理。
  Exclusive: 可以使用唯一的密码文件,但只限一个数据库。密码文件中可以包括除了sys用户的其他用户。
  Shared: 可以在多个数据库上使用共享的密码文件。但是密码文件中只能包含sys用户。
  设置:(需重启数据库)
  altersystem set remote_login_passwordfile=none scope=spfile;
  验证:
  SQL> show parameterremote_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语句
  REVOKEEXECUTE ON SYS.UTL_HTTP FROM PUBLIC;
  REVOKEEXECUTE ON SYS.UTL_FILE FROM PUBLIC;
  REVOKEEXECUTE ON SYS.UTL_SMTP FROM PUBLIC;
  REVOKESELECT 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 WHEREs.table_name = l.short(+) AND s.grantee='PUBLIC'
  and s.privilege = 'EXECUTE' ands.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是重用密码前更换密码的最小次数。
  ALTERPROFILE default LIMIT FAILED_LOGIN_ATTEMPTS 60;
  ALTERPROFILE default LIMIT PASSWORD_LOCK_TIME 0.5;
  修改Oracle提供的验证函数文件$ORACLE_HOME/rdbms/admin/utlpwdmg.sql
  其中IF length(password) < 4 一行改为< 8,并将最后一段修改为
  ALTERPROFILE DEFAULT LIMIT
  FAILED_LOGIN_ATTEMPTS 60
  PASSWORD_LOCK_TIME 30/1440
  PASSWORD_VERIFY_FUNCTIONverify_function;
  执行start utlpwdmg.sql
  设置后,密码复杂度必须包含字母、数字、标点(密码不区分大小写),最小长度为8。
  最大错误登录次数为60次,账号锁定时间为30分钟
  验证:OEM-》安全性-》概要文件
  select * from dba_profiles;
  创建验证函数:
  CREATE ORREPLACE FUNCTION verify_function
  (usernamevarchar2,
  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:='!&quot;#$%&()``*+,-/:;?_';
  -- Check if the password is same as theusername
  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 thepassword
  IF length(password) < 8 THEN
  raise_application_error(-20002, 'Passwordlength less than 8');
  END IF;
  -- Check if the password is too simple. Adictionary of words may be
  -- maintained and a check may be made soas 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 leastone 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 onepunctuation');
  END IF;
  -- 2. Check for the character
  
  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 onepunctuation');
  END IF;
  -- 3. Check for the punctuation
  
  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 onepunctuation');
  END IF;
  
  -- Check if the password differs from theprevious 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 PROFILEDEFAULT LIMIT
  FAILED_LOGIN_ATTEMPTS60
  PASSWORD_LOCK_TIME30/1440
  PASSWORD_VERIFY_FUNCTIONverify_function;
  13数据库操作审计
  加固目的
  ORACLE数据库具有对其内部所有发生的活动的审计能力,审计日志一般放在sys.aud$表中,也可以写入操作系统的审计跟踪文件中。可审计的活动有三种类型:登录尝试、数据库活动和对象存取,缺省情况下,数据库不启动审计,要求管理员配置数据库后才能启动审计。
  加固方法
  使用文本方式,打开数据库配置文件init.ora;更改以下参数配置AUDIT_TRAIL=True。
  alter system set audit_trail='OS' scope=spfile;
  altersystem 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 specialredo record which contains session and user information.These records mightbe 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;


页: [1]
查看完整版本: oracle安全加固