一、数据字典保护
启用数据字典保护,只有SYSDBA用户才能访问数据字典基础表
使用show parameters命令来检查参数O7_DICTIONARY_ACCESSIBILITY是否为FALSE。
二、账号安全管理
1、根据用户的业务需要,配置最小权限
使用以下SQL查询具有DBA权限的用户
select grantee as usern from dba_role_privswhere granted_role ='DBA' intersect select username from dba_users; 使用以下SQL查询具有DBA权限的角色
select grantee as usern from dba_role_privswhere granted_role ='DBA' minus (select grantee as usern from dba_role_privswhere granted_role ='DBA' intersect select username from dba_users); 2、使用数据库角色(ROLE)来管理对象的权限
使用select * from dba_role_privs或dba_tab_privs; select* from user_role_privs;查看帐号角色;确定帐号权限划分是否明确。
3、对用户的属性进行控制,包括密码策略、资源限制等。
为不同的业务用户建立不同的profile,设置数据库口令复杂度,有效期及锁定配置等,Profile参数解释如下:
A.对数据库资源做限制
SESSIONS_PER_USER 每个用户名所允许的并行会话数
CPU_PER_SESSION 一个会话一共可以使用的CPU时间,单位是百分之一秒
CPU_PER_CALL 一次SQL调用(解析、执行和获取)允许使用的CPU时间
CONNECT_TIME 限制会话连接时间,单位是分钟
IDLE_TIME 允许空闲会话的时间,单位是分钟
LOGICAL_READS_PER_SESSION 限制会话对数据块的读取,单位是块
LOGICAL_READS_PER_CALL 限制SQL调用对数据块的读取,单位是块
COMPOSITE_LIMIT 指定一个会话的总的资源消耗,以serviceunits单位表示
PRIVATE_SGA 限制会话在SGA中Shared Pool中私有空间的分配
B.对密码做限制
FAILED_LOGIN_ATTEMPTS 帐户被锁定之前可以错误尝试的次数
PASSWORD_LIFE_TIME 密码可以被使用的天数,单位是天,默认值180天
PASSWORD_REUSE_TIME 密码可重用的间隔时间(结合PASSWORD_REUSE_MAX)
PASSWORD_REUSE_MAX 密码的最大改变次数(结合PASSWORD_REUSE_TIME)
PASSWORD_LOCK_TIME 超过错误尝试次数后,用户被锁定的天数,默认1天
PASSWORD_GRACE_TIME 当密码过期之后还有多少天可以使用原密码
PASSWORD_VERIFY_FUNCTION 密码复杂度设置,至少8个字符大写字母+小写字母+数字+特殊符号
具体用法举例:
alter profile profile_name limitPASSWORD_VERIFY_FUNCTION verify_function_11g; --设置数据库口令复杂度
alter profile profile_name limit FAILED_LOGIN_ATTEMPTS5 --设置数据库口令输错5次被锁
4、根据业务限制具备数据库超级管理员(SYSDBA)权限的用户远程登录
使用show parameters命令来检查参数REMOTE_LOGIN_PASSWORDFILE是否为NONE。(搭建DG,RMAN备份等都需要管理员权限,根据业务设置)
5、限制在DBA组中的操作系统用户数量
限制除oracle,grid之外的其它操作系统用户在dba组中,以防止其用户串改或删除oracle软件文件内容。
三、可信IP地址访问控制
通过数据库所在操作系统或防火墙限制,只有信任的IP地址才能通过监听器访问数据库,可通过设置$ORACLE_HOME/network/admin/sqlnet.ora文件中参数tcp.validnode_checking和tcp.invited_nodes实现限制,需重启监听。
四、默认端口及实例名修改
对于默认的1521端口,应该修改掉默认的监听端口;对于 Oracle TNS Listener SID 可以被猜测,不应该使用安装Oracle时默认的SID(ORCL),应该设置复杂度较高的SID。
五、记录操作事件
1、创建触发器对用户登录进行日志记录
建表LOGIN_CHECK_LOG
create table login_check_log(session_idnumber(8,0) not null,login_on_time date,user_in_db varchar(50), ip_addressvarchar(20)); 建触发器LOGIN_CHECK
create trigger login_check
after logon on database
begin
insert into login_check_log(session_id,login_on_time,user_in_db,ip_address)select audsid,sysdate,sys.login_user,sys_context('userenv','ip_address') from v$session where audsid=userenv('sessionid');