数据库安全一直以来都是人们关注的热门话题,众所周知,对于Oracle数据库来说,Oracle数据库中的数据信息都是非常重要的,不容泄露,下文中就为大家总结了一些Oracle数据库的安全措施,希望对大家能够有所帮助。
一、数据库安全原则
1.只安装oracle必须的组件;
2.锁定并终止默认用户帐号;
3.改变默认用户密码;
4.激活数据字典保护(oracle9i默认具有此功能);
5.根据实际情况给予最少的权限;
6.强制进行有效的访问控制(oracle9i默认具有此功能);
7.限制操作系统访问;
8.限制网络访问;
9.安装所有的安全补丁;
二、具体安全加强措施
1.对默认用户进行锁定
在oracle安装过程中默认安装会有很多的默认用户,造成安全潜在问题,可以将其锁定,限制对数据库进行连接。
Oracle范例用户:HR,OE,PM,SH,QS_ADM,QS,QS_WS,QS_ES,QS_OS,QS_CBADM,QS_CB,QS_CS
只是用于oracle的范例,没有实际用处;
DBSNMP:负责运行Oracle系统的智能代理(Intelligent Agent),实际中很少使用,几乎不使用;
OUTLN:用于存储Outlines,不使用时可锁定,使用时再打开;
MDSYS, ORDSYS, CTXSYS, ORDPLUGINS:用于支持oracle的Intermedia,默认锁定;
WMSYS:用于存储Oracle Workspace Manager的元数据信息,默认锁定;
ANONYMOUS:用于允许HTTP 访问Oracle XML DB;
XDB:用于存储Oracle XML DB数据和元数据;
此外还有一些系统自带的用户,不再列举,建议对除sys,system,rman,perfstat以外的系统自带用户进行锁定,减少安全隐患。
Sql:select username,account_status from dba_users;
alter user username account lock; 2.安装最新的安全补丁
安全公告和补丁位置如下:
http://otn.oracle.com/deploy/security/alerts.htm
3.密码管理机制
在Oracle,我们可以通过修改用户概要文件来设置密码的安全策略,可以自定义密码的复杂度。在概要文件中有以下参数是和密码安全有关系的:
FAILED_LOGIN_ATTEMPTS:最大错误登录次数
PASSWORD_GRACE_TIME:口令失效后锁定时间
PASSWORD_LIFE_TIME:口令有效时间
PASSWORD_LOCK_TIME:登录超过有效次数锁定时间
PASSWORD_REUSE_MAX:口令历史记录保留次数
PASSWORD_REUSE_TIME:口令历史记录保留时间
PASSWORD_VERIFY_FUNCTION:口令复杂度审计函数。
缺省这个安全策略是没有启用的。
启用安全策略:
以sys用户执行:SQL> @?/rdbms/admin/utlpwdmg.sql
设置举例:
CREATE PROFILE app_user2 LIMIT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 60
PASSWORD_REUSE_TIME 60
PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_VERIFY_FUNCTION verify_function
PASSWORD_LOCK_TIME 1/24
PASSWORD_GRACE_TIME 10;
4.资源管理机制
启用资源管理:
SQL> alter system set resource_limit=true;
设置举例:
CREATE PROFILE app_user LIMIT
SESSIONS_PER_USER UNLIMITED
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL 3000
CONNECT_TIME 45
LOGICAL_READS_PER_SESSION DEFAULT
LOGICAL_READS_PER_CALL 1000
PRIVATE_SGA 15K
COMPOSITE_LIMIT 5000000;
指定profile可以使用create user 或者alter user,举例如下:
CREATE USER test
IDENTIFIED BY aZ7bC2
DEFAULT TABLESPACE data_ts
QUOTA 100M ON test_ts
QUOTA 500K ON data_ts
TEMPORARY TABLESPACE temp_ts
PROFILE profile_name;
ALTER USER test
IDENTIFIED BY A12BDD
DEFAULT TABLESPACE data_ts
TEMPORARY TABLESPACE temp_ts
QUOTA 100M ON data_ts
QUOTA 0 ON test_ts
PROFILE profile_name;
5. 权限管理
根据实际情况,细分权限,建立角色,对于系统权限慎重给予。采用最小授权原则,给用户尽量少的权限。
用户组PUBLIC,顾名思义,表示数据库中的每一位用户,因此,对PUBLIC 用户组授予权限其实也就是对数据库中的每一位用户都授予了相应的权限。这是在授予或撤销权限时非常有用的一条捷径。但也可能带来巨大的安全隐患,尤其是在试图确保以最少权限的方式运行数据库时,更是如此。
撤销Public 组的一些不必要权限,严格限制以下程序包的权限:
UTL_FILE:该程序包允许oralce 用户读取服务器上的文件,如果设置错误的话,可能可以得到任何文件。
UTL_HTTP:该程序包允许oracle 用户通过HTTP 访问外部资源包括恶意的web 代码和文件。
UTL_TCP: 该程序包允许oracle 通过TCP 建立连接,从而从网络上得到可执行文件。
UTL_SMTP: 该程序包允许oracle 通过SMTP 方式进行通信,从而转发关键文件。
撤销以上包的执行权限:
Sql:
revoke EXECUTE on UTL_FILE from public;
revoke EXECUTE on UTL_TCP from public;
revoke EXECUTE on UTL_SMTP from public;
revoke EXECUTE on UTL_HTTP from public; 6.修改认证方式
Oracle默认使用操作系统认证,只要能进入系统可直接以sys进入oracle,存在较大安全隐患,可修改为数据库认证方式。
在$ORACLE_HOME/network/admin中,打开sqlnet.ora,将SQLNET.AUTHENTICATION_SERVICES= (NTS)注释掉,在前面加#即可。 7.限制IP连接
由于Oracle 的TNS 监听器有许多安全漏洞,其中的一些漏洞甚至能让入侵者得到操作系统的超级用户权限或者修改数据库中的数据,因此在打好补丁的同时,对连接IP 的限制也能做到防患于未然。
在$ORACLE_HOME\network\admin 目录下修改SQLNET.ORA文件,
增加如下内容:
tcp.validnode_checking = YES
tcp.invited_nodes = (IP地址, hostname)
IP地址和hostname是允许连接的主机的名字和IP地址。 8.关掉Extproc 功能
由于extproc 存在安全问题允许用户不进行身份认证就可以调用系统函数,因此如果不需要该功能必须关闭。
修改TNSNAMES.ORA 和LISTENER.ORA 文件,删除含有EXTPROC的条目,使两个文件中只含有使用的有效连接信息。 9.启动审计功能
Oracle的审计机制是用来监视用户对ORACLE数据库所做的各种操作。在缺省情况下,系统的审计功能是关闭的。可以在INIT.ORA参数文件中设置参数AUDIT_TRAIL来激活。它的值有:NONE 禁止审计;DB 启用审计,写入SYS.AUD$;OS 启用审计,写入操作系统。
当AUDIT_TRAIL=OS,可设置AUDIT_FILE_DEST指定审计文件的位置,默认情况在$ORACLE_HOME/rdbms/audit下面。
AUDIT_SYS_OPERATIONS, AUDIT_TRAIL, AUDIT_FILE_DEST都是静态参数,需修改参数文件重启后生效。
设置审计水平:
Statement:指定对影响数据库对象的一个特定类型的特定SQL语句进行审计。比如对表的audit table有以下语句:CREATE TABLE, TRUNCATE TABLE, COMMENT ON TABLE, and DELETE [FROM] TABLE等;
Privilege:对由指定系统权限授权的SQL语句进行审计,比如AUDIT CREATE ANY TRIGGER是对由CREATE ANY TRIGGER系统权限授权的语句进行审计;
Object:对特定对象上的特定操作进行审计,比如ALTER TABLE on the emp。
设置审计条件:
BY SESSION/BY ACCESS:BY SESSION使oracle在同一session中的同一类型的SQL语句只写一条记录;BY ACCESS使oracle对每次访问写一条记录。
WHENEVER SUCCESSFUL/WHENEVER NOT SUCCESSFUL:WHENEVER SUCCESSFU只审计那些成功执行的SQL语句;WHENEVER NOT SUCCESSFUL只审计那些失败或结果错误的SQL语句。
审计操作举例:
审计连接:
AUDIT SESSION; AUDIT SESSION BY scott, lori;
审计指定权限:
AUDIT DELETE ANY TABLE BY ACCESS WHENEVER NOT SUCCESSFUL;
AUDIT DELETE ANY TABLE;
AUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE, EXECUTE PROCEDURE BY ACCESS WHENEVER NOT SUCCESSFUL;
审计指定对象:
AUDIT DELETE ON scott.emp;
AUDIT SELECT, INSERT, DELETE ON jward.dept BY ACCESS WHENEVER SUCCESSFUL;
AUDIT SELECT ON DEFAULT WHENEVER NOT SUCCESSFUL;
关闭审计操作:
关闭上面例子中的相应审计:
NOAUDIT session;
NOAUDIT session BY scott, lori;
NOAUDIT DELETE ANY TABLE;
NOAUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE,EXECUTE PROCEDURE;
关闭所有语句审计:
NOAUDIT ALL;
关闭所有权限审计:
NOAUDIT ALL PRIVILEGES;
关闭对象审计:
NOAUDIT DELETE ON emp;
NOAUDIT SELECT, INSERT, DELETE ON jward.dept;
关闭某一对象上的所有审计:
NOAUDIT ALL ON emp;
关闭所有的默认对象审计:
NOAUDIT ALL ON DEFAULT;
相关审计信息视图:
ALL_DEF_AUDIT_OPTS
USER_OBJ_AUDIT_OPTS
DBA_OBJ_AUDIT_OPTS
DBA_STMT_AUDIT_OPTS
DBA_PRIV_AUDIT_OPTS
DBA_AUDIT_TRAIL
USER_AUDIT_TRAIL
DBA_AUDIT_SESSION
USER_AUDIT_SESSION
DBA_AUDIT_STATEMENT
USER_AUDIT_STATEMENT
DBA_AUDIT_OBJECT
USER_AUDIT_OBJECT
DBA_AUDIT_EXISTS
SM$AUDIT_CONFIG
KU$_AUDIT_VIEW
KU$_AUDIT_OBJ_BASE_VIEW
KU$_AUDIT_OBJ_VIEW
DBA_AUDIT_POLICIES
ALL_AUDIT_POLICIES
USER_AUDIT_POLICIES
DBA_FGA_AUDIT_TRAIL
DBA_REPAUDIT_ATTRIBUTE
ALL_REPAUDIT_ATTRIBUTE
USER_REPAUDIT_ATTRIBUTE
DBA_REPAUDIT_COLUMN
ALL_REPAUDIT_COLUMN
USER_REPAUDIT_COLUMN
查看审计信息举例:
列出活动的语句审计操作:
SELECT * FROM DBA_STMT_AUDIT_OPTS;
列出活动的权限审计操作:
SELECT * FROM DBA_PRIV_AUDIT_OPTS;
列出对指定对象的活动对象审计操作:
SELECT * FROM DBA_OBJ_AUDIT_OPTS WHERE OWNER = 'SCOTT' AND OBJECT_NAME LIKE 'EMP%';
列出默认的对象审计操作:
SELECT * FROM ALL_DEF_AUDIT_OPTS;
列出审计记录:
SELECT * FROM DBA_AUDIT_OBJECT;
列出对于AUDIT SESSION审计操作的审计记录:
SELECT USERNAME, LOGOFF_TIME, LOGOFF_LREAD, LOGOFF_PREAD, LOGOFF_LWRITE, LOGOFF_DLOCK FROM DBA_AUDIT_SESSION;
关于Oracle数据库的安全措施就为大家总结了这么多,相信上文中讲到的安全措施一定能够帮助大家实现Oracle数据库的安全,希望大家都能够上文中涉及到的内容中有所收获。