广州玻璃贴膜价格联盟

数据库系统安全防护(上篇)

ITPUB2018-12-30 22:13:37
关于数据库系统安全防护,以下主要从三个方面来阐述一些安全措施。

oracle自身安全----> linux系统安全 ---->硬件防火墙

oracle数据库自身安全
oracle安全加固配置策略:
灾备环境加固------>帐号权限加固------>数据访问控制加固------>网络访问控制加固------>口令策略加固------>审计策略加固------>漏洞加固
灾备环境加固

DataGuard灾备环境部署

DataGuard分为"物理standby"和"逻辑standby",我司环境主要考虑用物理standby方式,采用一主多备方案部署。该方式下,主备库之间物理结构、逻辑结构一致,物理备库等同于生产库。

在主备库之间的同步方式上,主要考虑两种模式,一种为最大性能,一种为最大可用性。

(一)最大性能方式:主备库同步数据采用异步传输,该方式下的数据同步对主库几乎没有任何影响,但是当主库宕机后,主备切换可能会出现部分数据丢失;
   
(二)最大可用方式,该方式介于最大保护和最大性能之间,正常情况下主备之间的是同步的,当网络或者备库出现问题时,主备库同步时等待超时就会自动转为最大性能方式进行异步传输。该方式下对主库性能会有一定的影响,但是当主库宕机时,如果主备库之间是同步方式传输,主备切换几乎不会出现数据丢失,如果主备之间是异步方式传输,主备切换可能会出现部分数据的丢失。

RMAN物理备份
 RMAN(Recovery Manager)是一种用于备份(backup)、还原(restore)和恢复(recover)数据库的 Oracle 工具。它可以备份整个数据库或数据库部件,如表空间、数据文件、控制文件、归档文件以及Spfile参数文件。RMAN可以进行增量数据块级别的备份,增量RMAN备份是时间和空间有效的,因为他们只备份自上次备份以来有变化的那些数据块。增量备份虽然只备份变化的那些数据块,但是也会遍历整个数据库,因此花费的时间也是比较长,并且在备份期间对整个数据库的性能影响较大。
         
在备份的策略上oracle的备份方法主要有全备份、增量备份和差异备份。全备份(Full Backup)是每次转储数据库全部数据,生成所有数据的备份,这种备份比较占用时间和存储空间。增量备份(Incremental Backup)只转储上次转储后更新过的数据。全转储与增量转储相比,从恢复角度看,使用海量转储全备份得到的后备副本进行恢复往往更方便,但对于大型数据库,事务处理又十分频繁,所以增量转储方式更实用更有效。差异备份(Differential Backup)融合以上两种备份的优点,首先进行完全备份,其次在以后的每次备份中只备份每个数据文件较上次完全备份所更新的部分(差异数据),所以,数据文件损坏后,利用该时间点之前最近一次的完全备份进行恢复,然后再使用时间点A的差异数据即可完成所有数据的恢复。在oracle备份策略中,可以考虑多极备份或者采用物理备份和逻辑备份结合。

DataPump Impdp/Expdb逻辑备份
在oracle10g之前,数据库逻辑备份工具主要是exp/imp,10g之后引入了DataPump,提供的是一种基于服务器的数据提取和恢复的实用工具。DataPump在体系结构和功能上与传统的exp/imp工具相比,有了显著的提升。
    
使用impdp/expdb工具进行逻辑备份,备份方式比较灵活,可以只针对某个用户或者某个用户下的对象(表、索引、存储过程、触发器等等)或者针对整个数据库进行逻辑备份。采用逻辑备份方式虽然灵活,但是只能保证数据的备份,无法对数据库底层(表空间、数据文件、控制文件、参数文件等等)进行备份。并且应用逻辑备份进行恢复时,需要完成数据库底层的构建。
    
因为物理备份方式的不灵活,所以在数据库比较庞大的时候,可以采用物理备份和逻辑备份相结合的方式进行备份,针对某些重要的用户或表每天进行逻辑备份。

帐号权限加固

最小权限使用规则
 应该只提供最小权限给用户(包括SYSTEM和OBJECT权限)。从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;


撤销之后可以验证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%';


查看用户user拥有的系统权限:
SQL> select * from dba_sys_privs where grantee='USER';
查看用户user拥有的角色:
SQL> select * from dba_role_privs where grantee='USER';
查看用户user拥有的对象权限:
SQL> select * from dba_tab_privs where grantee='USER';
查看DBA角色拥有权限:
SQL> select * from role_role_privs where role='DBA';

用户帐号管理
为了安全考虑,应该锁定Oracle当中不需要的用户;或改变缺省用户的密码。
    
锁定不需要的用户,使用SQL语句:ALTER USER user PASSWORD EXPIRE; ALTER USER user ACCOUNT UNLOCK; 注意锁定MGMT_VIEW、DBSNMP、SYSMAN帐号或修改密码。(如果要使用DBConsole,DBSNMP 、SYSMAN不能锁定,那么就需要修改密码)DIP、EXFSYS、OUTLN、TSMSYS、WMSYS默认已锁定,确定是否解锁。

DBSNMP用户的保护
 Oracle数据库系统如果采用典型安装后,自动创建一个DBSNMP的用户,该用户允许Oracle系统的智能代理(intelligent Agent),该用户的缺省密码也是“DBSNMP”。如果忘记修改该用户的口令,任何人都可以通过该用户存取数据库系统。其他有威胁的帐号还有:CTXSYS,MDSYS,ORDPLUGINS,ORDSYS,OUTLN等。处理的方法是锁定该账号,或者更换密码。

SYS用户
Oracle数据库系统安装后,自动创建一个叫做SYS的数据库管理员用户,当该用户sysdba方式连接数据库时,便具有全部系统权限,因而对它的保护尤为重要。因此需要更换SYS用户密码,使其符合密码复杂度要求;新建一个DBA用户,作为日常管理使用。

Oracle 数据字典的保护
 设置保护后,可防止其他用户(具有‘ANY’ system privileges)使用数据字典时,具有相同的‘ANY’权限。更改参数O7_DICTIONARY_ACCESSIBILITY=False 如果用户必须需要该权限,赋予其权限SELECT ANY DICTIONARY。
                   
验证:

 sys@ORCL>show parameter O7_DICTIONARY_ACCESSIBILITY
                   NAME          TYPE      VALUE
                   ----------- -----------------    ------------------------------
                   O7_DICTIONARY_ACCESSIBILITY        boolean    FALSE


数据访问控制加固

$ORACLE_HOME/bin目录权限保护
 确保对$ORACLE_HOME/bin目录的访问权限尽可能少。运行命令:chown –R oracle:dba $ORACLE_HOME/bin。可以使用命令验证:ls –l $ORACLE_HOME/bin 确保该目录下的文件属主为oracle用户,且其他用户没有写权限。

 关闭远程操作系统认证
设置正确识别客户端用户,并限制操作系统用户数量(包括管理员权限、root权限、普通用户权限等)。在数据库的账户管理中删除不必要的操作系统账号。
    
设置参数REMOTE_OS_AUTHENT值为FALSE (SAP 系统不可设置为False)。Oracle允许用户通过采用外部验证的方式登录数据库。默认情况下,只允许本机的用户采用外部验证登录到数据库中。当将remote_os_authent这个参数设置为true时,则允许远端用户采用外部验证的方式登录到数据库中。设置(需重启数据库):

alter system set remote_os_authent=false scope=spfile;

验证:

SQL> show parameter remote_os_authent
NAME                                 TYPE       VALUE
------------------------------------ ---------- ------------------------------
remote_os_authent                    boolean    FALSE


加强服务管理
在不影响业务系统正常运行的情况下,停止或禁用与承载业务无关的服务或组件。用操作系统命令查看有无与业务无关的服务或组件,然后使用系统命令停止或禁用该服务与组件。

加强对业务数据管理
定时检查数据库系统中无效或失效对象,删除数据库中存在无用的、测试的、废弃的表、视图、存储过程等等。

网络访问控制加固

设置TNS登录的ip访问限制
仅允许最少的必要的IP地址可连接TNS监听器。在目录$ORACLE_HOME/network/admin/下修改sqlnet.ora文件,实现TNS登录IP限制,设置下列配置信息:
                   
tcp.validnode_checking=yes                 
#允许访问的IP                  
tcp.invited_nodes=(localhost, 本机ip, 应用服务器ip,管理机ip等)
                   
#不允许访问的IP                  
tcp.excluded_nodes=(ip1,ip2,......)
修改sqlnet.ora后,需要重启listener服务才能生效。

修改默认监听端口
oracle的监听端口默认为1521,可以修改为其他端口,修改后需重启监听才能生效。在目录$ORACLE_HOME/network/admin/下修改listener.ora文件,将默认端口号1521改为3521,如下配置:
  
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
                   
修改PORT的值为新的监听端口->
                   
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 3521))
    
修改之后,重启监听后进行确认:lsnrctl status

防止远程监听程序的管理
通过设置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,查看输出
Security                  ON: Local OS Authentication

关闭Extproc功能
默认安装时,会安装一个PL/SQL外部程序(ExtProc)条目在listener.ora中,是oracle为调用外部程序默认配置的监听,它的名字通常是ExtProc或PLSExtProc,但一般不会使用它,可以直接从listener.ora中将这项移除,因为对ExtProc已经有多种攻击手段了,在不使用外部程序时,oracle也是建议删除的。PLSExtPro 是pl/sql   external  procdure 的意思,就是在pl/sql中调用外部语句,如c,java写的过程。现在,Oracle已经全面支持JAVA,这东西早已过时,之所以继续保留是考虑到兼容以前老版本的数据库实例。
    
所以考虑到extproc存在安全问题允许用户不进行身份认证就可以调用系统函数,因此,如果不需要该功能必须关闭。
    
修改目录$ORACLE_HOME/network/admin/下的TNSNAMES.ORA和LISTENER.ORA文件,删除或注释以下条目:

icache_extproc
                   PLSExtproc
                   Extproc
tnsnames.ora :
#EXTPROC_CONNECTION_DATA =
#  (DESCRIPTION =
#    (ADDRESS_LIST =
#      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
#    )
#    (CONNECT_DATA =
#      (SID = PLSExtProc)
#      (PRESENTATION = RO)
#    )
#  )
 
listener.ora :
orclps2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
#      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1523))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.5.232)(PORT = 1523))
    )
  )
ADR_BASE_LISTENER = /u01/app/oracle


关闭XDB服务
Oracle XDB组件是oracle上提供XML服务能力的组件,从Oracle9i之后,会作为缺省安装项。安装完XDB后,在启动Oracle时,有两个服务:HTTP(默认端口为8080)和FTP(默认端口2100)会缺省启动。这里的FTP服务是Oracle自身的FTP服务,不是标准的FTP服务,在这个FTP服务中进行的身份验证,将会使用Oracle数据库的用户名/密码。
    
XDB 的 HTTP 和 FTP 服务存在多个缓冲区溢出问题,远程攻击者可以利用这些漏洞对服务进行拒绝服务攻击,精心提交字符串数据可能以服务进程权限在系统上执行任意指令。当然,在9i时该漏洞只能通过下面的方式进行关闭XDB服务,现在11g后,虽然oracle官方已经提供了相关补丁审计,但是并不能确保不会被溢出的风险。
    
因此,如果不需要oracle的XML数据库功能,可以关闭XDB,关闭方法如下:
    
编辑$ORACLE??_HOME/dbs??/initSID.ora文件,去除如下行: dispatchers='(PROTOCOL=TCP) (SERVICE=XDB);然后重启数据库??。也??可以在Oracle下,以system身份登录,运行:dro??p user xdb cascade;show parameter dispatchers    如为空,表示无该服务。
    
去掉相应的数据库的初始化参数中的如下行:dispatchers='(PROTOCOL=TCP) (SERVICE={sid}XDB)'

口令策略加固

密码文件管理
配置密码文件的使用方式,配置参数REMOTE_LOGIN_PASSWORD_FILE=None: 使得oracle不使用密码文件,只能使用OS认证,不允许通过不安全网络进行远程管理。(安全高,但是如果数据库采用DataGuard等其他特殊设置,会导致无法和数据库通讯)
                   
Exclusive: 可以使用唯一的密码文件,但只限一个数据库。密码文件中可以包括除了sys用户的其他用户。
                   
Shared: 可以在多个数据库上使用共享的密码文件。但是密码文件中只能包含sys用户。
    
设置:(需重启数据库)
alter system set remote_login_passwordfile= Exclusive scope=spfile;
    
验证:

SQL> show parameter remote_login_passwordfile
    NAME                  TYPE       VALUE
    ---------------- ---------- ------------------------------
    remote_login_passwordfile            string     Exclusive


启用资源限制
Profile分两部分(资源参数和密码参数),resource_limit为TRUE限定资源参数(resource parameters)设置有效;不管resource_limit的值为TRUE或FALSE密码参数(password parameters)设置始终有效。
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

密码策略
在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/1440则没有多大的意义)。

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

FAILED_LOGIN_ATTEMPTS和 PASSWORD_LOCK_TIME通常在一起使用,如下:
ALTER PROFILE default LIMIT FAILED_LOGIN_ATTEMPTS 60;
ALTER PROFILE default LIMIT PASSWORD_LOCK_TIME 0.5;
 
Oracle本身提供一个密码复杂性函数脚本,可以根据需要修改或者直接执行Oracle提供的验证函数脚本$ORACLE_HOME/rdbms/admin/utlpwdmg.sql
执行start utlpwdmg.sql
设置后,密码复杂度必须包含字母、数字、标点(密码不区分大小写),最小长度为4。
最大错误登录次数为10次,账号锁定时间为1天

验证:OEM-》安全性-》概要文件
select * from dba_profiles;
和用户关联:
SQL> select * from dba_profiles where profile='DEFAULT';
SQL> select username, profile from dba_users;
SQL> show parameter resource_limit     资源管理的开关参数
SQL> ALTER USER HR PROFILE limit_verify_function_11G;

审计策略加固

数据库操作审计
Oracle数据库具有对其内部所有发生的活动的审计能力,审计日志一般放在sys.aud$表中,也可以写入操作系统的审计跟踪文件中。可审计的活动有三种类型:登录尝试、数据库活动和对象存取,缺省情况下,数据库不启动审计,要求管理员配置数据库后才能启动审计。
    
如果需要开启审计,可以使用下面命令更改参数配置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身份登录的用户)的操作都会被记录。
    
开启审计跟踪后,可以设置AUDIT_FILE_DEST指定审记文件目标存储路径,其缺省值$ORACLE_HOME/rdbms/audit

SQL> show parameter audit_file_dest
                   NAME            TYPE     VALUE
                   ------------------ -------------   ------------------------------
                   audit_file_dest     string     /u01/app/oracle/admin/orcl/


监听器日志,查看错误登录记录:
[oracle@dg2 ~]$ find $ORACLE_BASE -name listener.log
/u01/app/oracle/diag/tnslsnr/dg2/listener/trace/listener.log

日志目录管理

SQL> show parameter dump
NAME                TYPE        VALUE
------------------------------------ ----------- ------------------------------
background_core_dump       string      partial
background_dump_dest       string       /u01/app/oracle/diag/rdbms/orcl/orcl/trace
core_dump_dest             string       /u01/app/oracle/diag/rdbms/orcl/orcl/cdump
max_dump_file_size          string      unlimited
shadow_core_dump          string      partial
user_dump_dest             string      /u01/app/oracle/diag/rdbms/orcl/orcl/trace
 
SQL> show parameter audit_file_dest
NAME            TYPE     VALUE
------------------ -------------   ------------------------------
audit_file_dest     string     /u01/app/oracle/admin/orcl/
 
SQL> select name from v$archived_log;
SQL> select  member from v$logfile;


数据字典保护
 启用数据字典保护,只有sysdba用户才能访问数据字典基础表。

sys@ORCL>show parameter O7
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
O7_DICTIONARY_ACCESSIBILITY          boolean     FALSE


现在默认参数为FALSE,已经设置保护咯。此时以普通用户登录数据库不能查看X$开头的表,比如:
select * from sys.x$ksppi;

漏洞加固

安全补丁更新
及时更新数据库的安全补丁,减少数据库系统可能受到的攻击。查看MOS https://support.oracle.com/ 下载并安装相关的安全补丁。参考Oracle官方建议,仅对已发现的特定漏洞或缺陷安装相应补丁。这个需要oracle相关支持帐号才能获得支持。

安装防病毒软件
 在运行oracle数据库的主机上安装操作系统防病毒软件,实时关注并更新安全补丁。

下篇明天推出,敬请期待!

作者:彩伦

原文链接:

http://blog.itpub.net/30130773/viewspace-2122041/



只为一场完美的技术盛宴!
SACC2016
作为国内最受欢迎的架构师盛会,2016第八届中国系统架构师大会(SACC)将于2016年10月27日-29日在北京万达索菲特大酒店撼世来袭!

大会以"架构创新之路"为主题,共设置两个主场分享时段,24个技术交流专场时段;邀请来自互联网、电子商务、金融、电信、政府、行业协会等20多个领域,150多位技术专家及行业领袖来分享他们的经验;并将吸引4000多名系统运维、架构师、及各种企业的IT决策人士参会,为他们提供最具价值的交流平台。
最优折扣来袭!
7月28日前,订购SACC2016门票可立享6.8折优惠!团购更有折上折!
点击“阅读原文”立即购票!