Oracle数据库安全参数优化
上一期发布了关于oracle数据库安装后的参数优化文档,此文档只给出了参考指引,没有给出对应的设置规则,接下来几期文档将详细的写写配置规则相关的给大家参考,这里列举依然是常规设置,实际项目中还是需要根据实际情况灵活调整。
前几期也分享了一些参数相关的优化,本期继续分享数据库安全参数相关部分,主要是密码策略,审计,权限相关的部分。
注意:所有参数的修改都应在测试环境充分验证后再应用于生产环境,避免因分配不当导致数据库性能问题或实例无法启动。
重要提示:不同Oracle版本可能存在差异,生产环境调整前请务必查阅对应版本的官方文档并进行测试。所有修改操作前请做好参数文件备份
-- 创建PFILE备份 CREATE PFILE='/backup/initORCL_20231201.ora' FROM SPFILE; -- 直接复制SPFILE(需要数据库关闭) -- 在操作系统层面复制 -- cp $ORACLE_HOME/dbs/spfileORCL.ora /backup/ `
Oracle数据库安全参数优化
1 密码策略安全配置
1.1 密码复杂度策略
参数说明与配置:
Oracle数据库通过profile管理密码策略,以下为关键参数说明:
参数名称 | 说明 | Oracle默认值 | 推荐值 | 国防安全要求 |
---|---|---|---|---|
FAILED_LOGIN_ATTEMPTS | 最大错误登录次数 | 10 | 5 | 3 |
PASSWORD_LIFE_TIME | 口令有效时间 | 180天 | 90天 | 60天 |
PASSWORD_REUSE_TIME | 口令重用时间间隔 | UNLIMITED | 90天 | 365天 |
PASSWORD_REUSE_MAX | 口令重用前需更改次数 | UNLIMITED | 5 | 5 |
PASSWORD_VERIFY_FUNCTION | 口令复杂度验证函数 | NULL | VERIFY_FUNCTION_11G | ora12c_strong_verify_function |
PASSWORD_LOCK_TIME | 账户锁定时间 | 1天 | 1天 | 1天 |
PASSWORD_GRACE_TIME | 口令过期宽限期 | 7天 | 7天 | 7天 |
配置示例:
-- 创建自定义密码策略profile
CREATE PROFILE secure_profile LIMITFAILED_LOGIN_ATTEMPTS 5PASSWORD_LIFE_TIME 90PASSWORD_REUSE_TIME 90PASSWORD_REUSE_MAX 5PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_functionPASSWORD_LOCK_TIME 1PASSWORD_GRACE_TIME 7;-- 将profile分配给用户
ALTER USER scott PROFILE secure_profile;
密码复杂度验证函数:
Oracle 12c引入了新的密码验证函数:
ora12c_verify_function
- 基本复杂度要求ora12c_strong_verify_function
- 更强的复杂度要求ora12c_stig_verify_function
- 符合安全技术实施指南要求
STIG(安全技术实施指南)要求包括:
- 密码至少9个字符
- 至少2个大写字母
- 至少2个小写字母
- 至少2个数字
- 至少2个特殊字符
- 新密码必须与旧密码至少4个字符不同
1.2 密码大小写敏感性
版本差异说明:
版本 | 默认行为 | 参数可用性 | 说明 |
---|---|---|---|
Oracle 11g | 大小写敏感 | SEC_CASE_SENSITIVE_LOGON=TRUE | 可禁用大小写敏感性 |
Oracle 12cR2 | 大小写敏感 | 已弃用 | 密码大小写敏感性始终强制启用 |
Oracle 19c | 大小写敏感 | 已弃用 | 密码大小写敏感性始终强制启用 |
Oracle 21c | 大小写敏感 | 已移除 | 参数完全移除,无法禁用 |
配置示例:
-- 检查当前设置
SHOW PARAMETER SEC_CASE_SENSITIVE_LOGON;-- 在11g中禁用大小写敏感性(不推荐)
ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;-- 检查用户密码版本
SELECT username FROM dba_users WHERE password_versions NOT LIKE '%12%';-- 批量重置密码以确保使用最新算法
BEGINFOR r IN (SELECT username FROM dba_users WHERE account_status='OPEN') LOOPEXECUTE IMMEDIATE 'ALTER USER '||r.username||' IDENTIFIED BY "TempPass123!"';END LOOP;
END;
/
1.3 渐进式密码轮转(19c/21c新特性)
Oracle 19.12及21c引入了渐进式密码轮转特性,允许在密码更改期间新旧密码同时有效。
配置参数:
PASSWORD_ROLLOVER_TIME
:密码轮转时间,默认0(禁用)
配置示例:
-- 启用渐进式密码轮转(7天)
ALTER PROFILE secure_profile LIMIT PASSWORD_ROLLOVER_TIME 7;-- 手动提前结束轮转期
ALTER USER scott EXPIRE PASSWORD ROLLOVER PERIOD;
密码生命周期阶段:
- 阶段1a:新旧密码同时有效(
PASSWORD_ROLLOVER_TIME
设定时间) - 阶段1b:仅新密码有效,直到
PASSWORD_LIFE_TIME
结束 - 阶段2:密码过期前的正常使用期
- 阶段3:宽限期(
PASSWORD_GRACE_TIME
) - 阶段4:密码完全过期,必须更改
2 数据库审计配置
2.1 审计基础配置
审计参数说明:
-- 启用数据库审计
ALTER SYSTEM SET AUDIT_TRAIL=DB,EXTENDED SCOPE=SPFILE;-- 审计SYSDBA操作
ALTER SYSTEM SET AUDIT_SYS_OPERATIONS=TRUE SCOPE=SPFILE;-- 重启数据库使审计生效
SHUTDOWN IMMEDIATE;
STARTUP;
审计级别类型:
AUDIT_TRAIL=NONE
:禁用审计AUDIT_TRAIL=OS
:审计记录写入操作系统文件AUDIT_TRAIL=DB
:审计记录写入数据库表SYS.AUD$AUDIT_TRAIL=DB,EXTENDED
:包含SQL语句和绑定变量AUDIT_TRAIL=XML
:审计记录写入XML格式操作系统文件
2.2 登录审计配置
监控失败登录尝试:
-- 查看登录失败的审计记录
SELECT os_username, userhost, terminal, username, COUNT(*)
FROM dba_audit_trail
WHERE returncode = 1017
GROUP BY os_username, userhost, username, terminal;
returncode 1017表示无效的用户名/密码,这对于检测暴力破解攻击非常有用。
2.3 细粒度审计策略
配置关键操作审计:
-- 审计所有DDL操作
AUDIT CREATE TABLE, ALTER TABLE, DROP TABLE BY ACCESS;-- 审计数据查询操作
AUDIT SELECT TABLE BY ACCESS;-- 审计用户管理操作
AUDIT CREATE USER, ALTER USER, DROP USER BY ACCESS;-- 审计权限管理操作
AUDIT GRANT, REVOKE BY ACCESS;-- 查看当前审计设置
SELECT * FROM DBA_STMT_AUDIT_OPTS;
3 用户和权限安全
3.1 账户锁定策略
配置示例:
-- 查询所有开放状态的用户
SELECT username, profile FROM dba_users WHERE account_status='OPEN';-- 查询所有profile的密码设置
SELECT * FROM dBA_profiles WHERE resource_type='PASSWORD';-- 设置失败登录尝试
ALTER PROFILE secure_profile LIMIT FAILED_LOGIN_ATTEMPTS 5;
防范用户被锁定的监控:
-- 监控接近锁定阈值的用户
SELECT username, account_status, lock_date
FROM dba_users
WHERE account_status <> 'OPEN';-- 监控失败登录计数
SELECT username, count(*)
FROM dba_audit_trail
WHERE returncode = 1017
AND timestamp > SYSDATE - 1/24 -- 最近1小时
GROUP BY username;
3.2 会话超时控制
配置示例:
-- 设置空闲超时和连接时间限制
ALTER PROFILE secure_profile LIMIT IDLE_TIME 10CONNECT_TIME 60;
参数说明:
IDLE_TIME
:最大空闲时间(分钟)CONNECT_TIME
:最大连接时间(分钟)
4 版本特定安全特性
4.1 Oracle 12c 密码增强
密码哈希算法改进:
12c使用基于PBKDF2的SHA512哈希算法替代简单的SHA1哈希,更安全抵御暴力破解。
密码文件存储到ASM:
-- 在ASM上创建密码文件
orapwd file='+DATA/ORCL/orapworcl' asm=y force=y format=12 password='NewPass123!'
前提条件: COMPATIBLE.ASM
>= 12.1
Data Guard密码自动同步:
12cR2中,主备库的密码文件会自动同步,无需手动维护。
4.2 Oracle 19c/21c 安全增强
认证协议控制:
-- 设置允许的认证协议版本
ALTER SYSTEM SET sqlnet.allowed_logon_version_server=12 SCOPE=SPFILE;
可用值:
12a
:Oracle 12c Release 1 (12.1.0.2) 或更高版本12
:Oracle 11g CPUOct2012 及更高版本认证协议(推荐)11
:Oracle 11g 认证协议(默认)10
:Oracle 10g 认证协议8
:Oracle8i 认证协议
5 操作系统级安全配置
5.1 文件权限控制
推荐umask设置:
# 在shell配置文件中设置
umask 027 # 提供中等文件保护 (740)
# 或
umask 077 # 提供完整文件保护 (700)
5.2 密码复杂性规则(操作系统级)
配置示例:
# 设置密码复杂性策略(符合国防安全要求)
/opt/oracle.cellos/host_access_control pam-auth --passwdqc disabled,disabled,disabled,disabled,15
参数说明:
- 确保密码至少包含四个字符分类(大写、小写、数字和特殊字符)
- 密码长度至少为15个字符
6 监控和维护
6.1 安全状态监控
定期检查项目:
-- 检查开放账户
SELECT username, account_status, profile, expiry_date
FROM dba_users
WHERE account_status = 'OPEN';-- 检查密码即将过期的用户
SELECT username, account_status, expiry_date
FROM dba_users
WHERE expiry_date IS NOT NULL
AND expiry_date < SYSDATE + 7;-- 检查被锁定账户
SELECT username, lock_date, account_status
FROM dba_users
WHERE account_status LIKE '%LOCKED%';-- 检查DBA权限用户
SELECT grantee, granted_role
FROM dba_role_privs
WHERE granted_role IN ('DBA', 'RESOURCE', 'CONNECT')
ORDER BY granted_role, grantee;
6.2 审计日志维护
定期清理审计日志:
-- 检查审计表大小
SELECT segment_name, bytes/1024/1024 MB
FROM dba_segments
WHERE segment_name = 'AUD$';-- 归档并清理旧审计记录
DELETE FROM sys.aud$ WHERE timestamp# < SYSDATE - 90;-- 定期执行表空间重组
ALTER TABLE sys.aud$ MOVE TABLESPACE SYSAUX;
总结
Oracle数据库安全配置是一个持续的过程,需要根据具体业务需求和安全要求进行调整。本文涵盖了从密码策略、审计配置到版本特定特性的全面安全设置指南,可作为DBA进行数据库安全加固的参考手册。
关键最佳实践:
- 定期审查和更新密码策略
- 启用适当的审计级别并定期检查审计日志
- 及时应用安全补丁和版本更新
- 遵循最小权限原则分配用户权限
- 建立定期安全评估和监控机制
通过综合应用这些安全配置措施,可以显著提高Oracle数据库的安全性,保护敏感数据免受未授权访问和恶意攻击。