前言
数据库安全配置中,访问安全是最优先考虑的问题,弱密码是第一杀手。Oracle数据库在不断的发展中,为管理员预设置许多的安全设置,比如Oracle 11g起,密码大小写敏感;默认密码180天会失效;10次密码错误账号会被锁定等。这些都会失效与锁定都会反应在dba_users表的account_status字段,它有9种不同的状态:
STATUS# STATUS
---------- ------------------------------
0 OPEN
1 EXPIRED
2 EXPIRED(GRACE)
4 LOCKED(TIMED)
8 LOCKED
5 EXPIRED & LOCKED(TIMED)
6 EXPIRED(GRACE) & LOCKED(TIMED)
9 EXPIRED & LOCKED
10 EXPIRED(GRACE) & LOCKED
前面四种是基本状态,而后面五种是组合状态。基本状态说明参考如下:
- OPEN: 这个是大家最常见的,就是表示这个是可用的,没有任何限制的帐户。
- LOCKED: 表示这个帐户被DBA锁定. 一般通过如下命令可以接触与锁定账户:
alter user username account lock(unlock); - EXPIRED: 表示该帐户被设置为口令到期,要求用户在下次logon的时候修改口令(系统会在该account被设置为expire后的第一次登陆是提示你修改密码)
- EXPIRED(GRACE): 当设置了grace以后(第一次成功登录后到口令到期后有多少天时间可改变口令,在这段时间内,帐户被提醒修改口令并可以正常登陆,account_status显示为EXPIRED(GRACE).
- LOCKED(TIMED): 这种状态表示失败的login次数超过了FAILED_LOGIN_ATTEMPTS,被系统自动锁定,需要注意的是,在Oracle 10g中,默认的DEFAULT值是10次。
实操步骤
- 开启密码复杂度函数
@?/rdbms/admin/utlpwdmg.sql
※ 密码复杂度函数可以自行调整,详细参考脚本内容。11g函数名:verify_function_11G12c函数名:ora12c_verify_function
密码复杂度包含如下内容:
- 密码长度不低于8位
- 密码不能跟用户名一致
- 密码不能跟用户名反过来的字符一致
- 密码不能跟服务器名一致
- 包含了一些数据字典的验证,不能与其一致,比如(oracle123,database1等)
- 密码不能跟oracle(1…100)一致
- 密码至少包含一个数字与字母
- 密码跟旧密码至少三个以上字符不同
- 设置DEFAULT PROFILE
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFT_TIME UNLIMITED;
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LOCK_TIME UNLIMITED;
ALTER PROFILE DEFAULT LIMIT PASSWORD_GRACE_TIME UNLIMITED;
※ 在执行密码复杂度脚本后,DEFAULT PROFILE将会指定一系列的默认值。如恢复默认密码180天会失效,因此记得要重新设置默认的PROFILE避免业务中断的。
- 新建SYSTEM_PROFILE并设置参数:
create profile SYSTEM_PROFILE limit
// 密码出错次数(超过后账号将锁定)
FAILED_LOGIN_ATTEMPTS 10
// 密码有效期180天
PASSWORD_LIFE_TIME 180
// 密码重用之前修改的最少次数
PASSWORD_REUSE_MAX 5
// 密码不能重新用的天数
PASSWORD_REUSE_TIME 60
// 密码验证函数
PASSWORD_VERIFY_FUNCTION verify_function_11G;
// 超过了1天后,帐号自动解锁
PASSWORD_LOCK_TIME 1
// 密码到期前宽限期30天
PASSWORD_GRACE_TIME 30
- 检查PROFILE配置
SELECT * FROM DBA_PROFILES WHERE PROFILE='SYSTEM_DEFAULT' AND RESOURCE_NAME LIKE 'PASSWORD%';
- 查询业务系统账户当前PROFILE设置
SELECT username,PROFILE FROM dba_users where username="&USERNAME";
- 业务系统账户设置SYSTEM_PROFILE
alter user mesadmin profile SYSTEM_PROFILE;
- 定期变更密码命令
ALTER USER <username> IDENTIFIED BY <newpassword> REPLACE <oldpassword>