ORACLE数据库安全
1.网络安全
在当今应用架构中,多数应用程序都是通过ORACLE提供的监听方式和数据库进行通讯。所以ORACLE的监听程序,成为了数据库是否可以正常提供服务的一个重要环节。
在多数情况下,数据库配置是都是使用了oracle提供的缺省配置或是使用自动注册功能(oracle9i以上)。使用这种配置模式给数据库的安全带来了很大的安全隐患。
隐患1 缺省端口
Oracle的监听服务器程序在缺省启动时,对外的服务端口是1521。
C:>lsnrctl start LSNRCTL for 32-bit Windows: Version 9.2.0.7.0 - Production on 27-12月-2007 10:43:07 Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved. 启动tnslsnr:请稍候... TNSLSNR for 32-bit Windows: Version 9.2.0.7.0 - Production 系统参数文件为C:oracleora92networkadminlistener.ora 写入C:oracleora92networkloglistener.log的日志信息 监听:(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dba)(PORT=1521))) 监听:(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=.pipeEXTPROC0ipc))) 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dba)(PORT=1521))) LISTENER 的 STATUS ------------------------ 别名 LISTENER 版本 TNSLSNR for 32-bit Windows: Version 9.2.0.7.0 - Produc tion 启动日期 27-12月-2007 10:43:07 正常运行时间 0 天 0 小时 0 分 0 秒 跟踪级别 off 安全性 OFF SNMP OFF 监听器参数文件 C:oracleora92networkadminlistener.ora 监听器日志文件 C:oracleora92networkloglistener.log 监听端点概要... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dba)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=.pipeEXTPROC0ipc))) 监听器不支持服务 命令执行成功 |
通过lsnctl工具可以远程连接到监听程序,并可以重新配置和停止监听程序。在日常维护生产备机时,因主机和备机的监听配置一致。在停止备机监听程序时,同时停止了主机的监听程序。
ORACLE数据库现在使用比较普遍,1521端口已经被数据库使用人员所熟知。避免数据库监听遇到网络攻击,在使用监听程序时应改掉缺省端口。
相关配置文件位置是:ORACLE_HOME/network/admin/listener.ora
# LISTENER.ORA Network Configuration File: C:oracleora92networkadminlistener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dba)(PORT = 1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) ) |
将以上1521替换为其他端口,启动后新的监听端口生效。
隐患2 缺省服务名
ORACLE公司提供的netca工具,简化了监听程序的配置过程。同时为生产服务器留下了安全隐患。
在生产环境中,listen_name应该使用自定义的方式,不使用oracle自身提供的listen_name。并在启动过程中指定监听名称。
例如
#LISTENER.ORA Network Configuration File: C:oracleora92networkadminlistener.ora # Generated by Oracle configuration tools. PRODUCT_LSN = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.8.71)(PORT = 2525)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = C:oracleora92) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = demo) (ORACLE_HOME = c:oracleora92) (SID_NAME = demo) ) ) TEST_LSN = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.8.75)(PORT = 1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = C:oracleora92) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = demo) (ORACLE_HOME = c:oracleora92) (SID_NAME = demo) ) ) |
启动过程需要指定相应的监听名称:
启动生产环境监听程序
C:>lsnrctl start product_lsn
启动测试环境监听程序
C:>lsnrctl start test_lsn
通过以上设置非缺省监听名,避免了意外停止服务监听的问题。
隐患3 无口令控制
ORACLE的监听程序可以通过设置口令,避免出现来自系统外的攻击行为。同时避免启停监听服务的误操作行为。
具体操作如下:
LSNRCTL> set password Password: 命令执行成功 LSNRCTL> LSNRCTL> save_config 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dba)(PORT=1521))) 保存的LISTENER配置参数。 监听器参数文件 C:oracleora92networkadminlistener.ora 旧的参数文件C:oracleora92networkadminlistener.bak 命令执行成功 LSNRCTL> |
执行完以上的操作,会在listener.ora文件中加载一行配置。其中口令部分为密文形式存放。
PASSWORDS_LISTENER = F7DA42E8FE26B964 |
在设置完口令后,再停止监听程序。监听程序会报告错误,提示没有识别口令。
C:>lsnrctl stop LSNRCTL for 32-bit Windows: Version 9.2.0.7.0 - Production on 27-12月-2007 14:18:13 Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved. 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dba)(PORT=1521))) TNS-01169: 监听器尚未识别口令 |
正确的停止监听程序的方法:
C:>lsnrctl LSNRCTL for 32-bit Windows: Version 9.2.0.7.0 - Production on 27-12月-2007 14:23:18 Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved. 欢迎来到LSNRCTL,请键入"help"以获得信息。 LSNRCTL> set password Password: 命令执行成功 LSNRCTL> stop listener 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dba)(PORT=1521))) 命令执行成功 LSNRCTL> |
隐患4 在线修改
为了防止通过lsnrctl工具动态修改监听配置,可以使用ADMIN_RESTRICTIONS选项。将此选项配置为ON,所有的配置修改操作,并须受手工修改listener.ora文件所用动态使用set命令的操作都被禁止。
添加完参数的文件:
# Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dba)(PORT = 1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = C:oracleora92) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = demo) (ORACLE_HOME = c:oracleora92) (SID_NAME = demo) ) ) #----ADDED BY TNSLSNR 27-12月-2007 14:03:04--- PASSWORDS_LISTENER = F7DA42E8FE26B964 #--------------------------------------------- #ADMIN_RESTRICTIONS_=ON ADMIN_RESTRICTIONS_LISTENER = ON |
添加完参数后再使用set命令修改配置时,就会收到如下的错误:
LSNRCTL> set save_config_on_stop on 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dba)(PORT=1521))) TNS-12508: TNS:监听器无法分解给定的 COMMAND |
2.用户安全
在应用开发阶段,开发人员为了便于对数据库操作。将数据库DBA的权限直接赋予的应用程序帐户,同时在布置生产环境时将开发阶段的安全隐患直接带入了生产环境。
隐患1:权限过多
在部署生产环境时,应该确认应用用户是否有过多的权限。尤其是ulimited_tablespace和DBA两个角色。
在生产环境中应给与收回,单独赋予应用角色。
隐患2:口令简单
数据库管理员账号和应用程序的帐号过于简单。如sys和system帐号还是缺省帐号,应用程序的的口令和帐号一致。这些都是数据库的安全隐患。
在设置口令时,应以数字和字母组合方式,并且口令长度应大于6位。现在oracle数据库6位以内的口令,可以通过工具在1小时内进行破译(oracle9i/10g)。
隐患3:口令验证方式
在生产数据库中,当对数据库使用sys用户进行维护时应该直接登录到主机中,使用命令行的方式进行维护。避免使用远程的SQLNET方式登录主机。
Oracle数据库提供remote_login_passwordfile参数。当参数设置为NONE方式时,sys用户登录系统时使用操作系统方式进行认证,也是说必须登录到主机才可以使用sys用户登录oracle数据库。
同时修改$ORACLE_HOME/network/admin/sqlnet.ora文件,也可以更改sys用户的登录方式。当SQLNET.AUTHENTICATION_SERVICES参数修改为NO时,使用sys用户登录系统必须输入口令。
Sqlnet.ora文件配置如下:
SQLNET.AUTHENTICATION_SERVICES = (NO) |
此参数可以进行动态修改
修改完成后,使用sys用户登录要求输入口令。
SQL> conn / as sysdba ERROR: ORA-01031: insufficient privileges 警告: 您不再连接到 ORACLE。 SQL> conn sys/oracle as sysdba 已连接。 SQL> |
3.数据安全
在数据库安全中,所有的安全都是围绕在数据的周围。如果没有了数据,也就不涉及安全的问题。所以数据安全是数据安全的重中之重。
隐患1:无备份、备份策略不合理
数据备份是各种数据库平台都提供的一种基本功能。ORACLE数据库提供了两种数据库备份方式:逻辑备份和物理备份方式。
Ø 逻辑备份:使用oracle提供的IMP工具(oracle9i/10g)和impdp(oracle10g),使用此种工具可以按照逻辑(用户)定义进行导出。
Ø Rman备份:rman工具为物理备份方式,最小备份单元为数据块。使用此种备份方式推荐使用catalog方式,并且在每一次备份完成后最好单独备份一次控制文件。因控制文件中包含了rman的备份信息,如果进行恢复也可以通过控制文件找回备份信息。
Rman备份可以在数据归档在线的方式进行备份,但当数据库进行恢复的时候不仅需要备份文件还需要归档文件,所以对归档文件的保护同样重要。尽量将归档文件放置在受保护的共享存储上。
隐患2:只备份无验证
数据库每天都在进行备份操作,每次都都可以看到备份成功的提示。但是由于多种原因,备份的数据不能完成恢复。一种原因是备份的数据不完整,一种是备份的介质损坏。以下提供几种方法,验证介质问题。对于第一种灾难只能靠检查备份策略进行控制。
Ø EXP备份验证
验证exp备份的文件,可以使用IMP方式在没有数据空库中进行数据导入操作,因数据较多可以选取部分数据进行导入。
imp username/password fromuser=username touser=names tables=table_name commit=y |
Ø RMAN备份验证
ORACLE提供了rman备份工具,同时这个工具提供了恢复校验方法。
Rman>Restore database validate;
此方法只是模拟进行数据库恢复,只是读取备份文件但不实际的进行恢复操作。使用此项操作一定不要忘记是用validate参数,不然现有的数据将被覆盖。
以下为恢复验证的过程:
RMAN> restore database validate; 启动 restore 于 27-12月-07 正在使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=16 devtype=DISK 通道 ORA_DISK_1: 正在启动数据文件备份集验证 通道 ORA_DISK_1: 已恢复备份段 1 段 handle=D:ORABAKFULL_DB.LST tag=TAG20071221T105148 params=NULL 通道 ORA_DISK_1: 验证完成 完成 restore 于 27-12月-07 RMAN> |
在验证备份时,将消耗目标数据库IO和CPU资源。可以考虑使用备机将数据库启动到mount状态,进行验证操作。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/19446/viewspace-164236/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/19446/viewspace-164236/