一 密码长度和复杂度
Oracle 数据库通过 PASSWORD_VERIFY_FUNCTION 来控制密码复杂度。
1.1 查看当前的密码复杂度设置
SELECT * FROM dba_profiles WHERE resource_name ='PASSWORD_VERIFY_FUNCTION';
LIMIT表示分配给该 PROFILE 的密码验证函数名称。如果为 NULL,表示未设置密码验证函数。
上面输出说明DEFAULT这个配置文件没有配置密码长度和复杂度验证,ORA_STIG_PROFILE配置了ORA12C_STIG_VERIFY_FUNCTION这个密码长度和复杂度验证函数。
ORA12C_STIG_VERIFY_FUNCTION 是 Oracle 数据库 12c 中提供的一种密码验证函数,用于实施符合安全技术实施指南(STIG)的密码策略。
ORA12C_STIG_VERIFY_FUNCTION要求长度至少15,至少一个大写字母,一个小写字母,一个特殊字符。
#验证
当创建用户的时候,没指定profile,则使用默认的default,此时可以创建弱口令账号:
create user baidd_test identified by 123456;
grant connect,resource to baidd_test;
当指定有密码验证函数的配置文件时,无法创建弱口令账号:
create user baidd_test2 identified by 123456 profile ORA_STIG_PROFILE;
#查看用户使用的是哪个配置文件
SQL> select username,profile from dba_users
USERNAME PROFILE
---------- ------------------------------
SYS DEFAULT
SYSTEM DEFAULT
……
1.2 设置密码复杂度
#将default配置文件绑定密码复杂度函数
语法:
ALTER PROFILE your_profile_name LIMIT PASSWORD_VERIFY_FUNCTION 密码复杂度函数;
这里是:
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION ORA12C_STIG_VERIFY_FUNCTION;
这个修改只对新建的用户生效,不影响已建的弱口令账号的正常使用,但若修改老用户的密码,也需要满足密码复杂度:
/*
假如要还原回去,则这样设置:
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;
*/
二 密码有效期
密码有效期通过 PASSWORD_LIFE_TIME 参数控制,可以通过以下查询查看:
SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name = 'PASSWORD_LIFE_TIME';
LIMIT 列:显示密码的有效期(以天为单位)。UNLIMITED 表示密码永不过期。
三 最大尝试登录次数
SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name = 'FAILED_LOGIN_ATTEMPTS';
LIMIT 列:显示允许的最大失败登录次数。
四 新旧密码重复度
SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name IN ('PASSWORD_REUSE_MAX', 'PASSWORD_REUSE_TIME');
PASSWORD_REUSE_MAX:表示密码在多少次更改后可以被重复使用。
PASSWORD_REUSE_TIME:表示密码在多少天后可以被重复使用。
#修改示例
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_MAX 10;
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_TIME 365;
/*
假如要还原回去,则这样修改:
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_MAX UNLIMITED;
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_TIME UNLIMITED;
*/
五 锁定次数,锁定时间
锁定次数:由 FAILED_LOGIN_ATTEMPTS 参数控制,表示用户连续失败登录多少次后会被锁定。
锁定时间:通过 PASSWORD_LOCK_TIME 参数控制。
select * FROM dba_profiles WHERE resource_name IN ('FAILED_LOGIN_ATTEMPTS','PASSWORD_LOCK_TIME');