必须执行utlpwdmg.sql脚本并显式绑定函数到profile才能生效,oracle不会自动调用同名函数;需以sys as sysdba连接、resource_limit=true、使用@命令准确路径执行,再alter profile default limit password_verify_function指定函数名。
oracle 默认不强制任何密码强度,必须手动启用并配置 profile 限制和验证函数,否则所有用户都能设“123”或用户名本身作为密码。
怎么让 PASSWORD_VERIFY_FUNCTION 生效
Oracle 自带的密码复杂度校验函数 verify_function 不是开箱即用的——它只存在于脚本里,没运行就不会进数据库。关键动作是执行 utlpwdmg.sql 脚本,它会创建函数、并默认绑定到 DEFAULT profile。
- 路径必须准确:Linux 下通常是
$ORACLE_HOME/rdbms/admin/utlpwdmg.sql;Windows 下注意反斜杠转义(如C:\app\oracle\product\12.1.0\dbhome_1\rdbms\admin\utlpwdmg.sql) - 必须用
sys用户(AS SYSDBA)连接后执行:@?/rdbms/admin/utlpwdmg.sql(?代表$ORACLE_HOME) - 执行后检查是否生效:
SELECT limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_VERIFY_FUNCTION';—— 返回值应为VERIFY_FUNCTION或类似名称(如VERIFY_FUNCTION_11G) - 常见坑:脚本执行报
PLS-00201: identifier 'DBMS_RANDOM' must be declared,说明当前用户缺少EXECUTE权限,需先运行GRANT EXECUTE ON DBMS_RANDOM TO PUBLIC;
FAILED_LOGIN_ATTEMPTS 和 PASSWORD_LOCK_TIME 怎么配才合理
这两个参数组合决定账户防暴力破解的实际效果,但配错会导致运维锁死自己。
-
FAILED_LOGIN_ATTEMPTS设太小(如 3),容易被误锁;设太大(如 60)等于形同虚设。推荐值是5,兼顾安全与可用性 -
PASSWORD_LOCK_TIME单位是“天”,不是分钟。想锁 30 分钟,得写30/1440;写成0.5就是锁半天 - 必须用
ALTER PROFILE DEFAULT LIMIT ...修改,且修改后**新密码策略只对后续新建/修改密码生效**,已有弱密码不会自动失效 - 别忘了确认 profile 已应用:
SELECT username, profile FROM dba_users WHERE username = 'SCOTT';,确保用户没被单独 assign 到其他 profile
为什么改了 PASSWORD_LIFE_TIME 还没强制改密码
密码过期策略依赖两个参数协同:过期时间 + 宽限期。只设 PASSWORD_LIFE_TIME 不够,用户登录时不会立刻提示改密。
-
PASSWORD_LIFE_TIME控制密码最大使用天数(如设为90) -
PASSWORD_GRACE_TIME是宽限期(如7),过期后还能登录7天,但每次登录都弹警告,第8天起直接拒绝登录 - 必须同时设置:
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 90 PASSWORD_GRACE_TIME 7; - 注意:该策略对
SYS用户无效(Oracle 硬编码绕过),所以SYS密码仍需人工强管控
自定义验证函数时最容易漏掉的兼容性点
如果你删改了 utlpwdmg.sql 或手写函数(比如要求必须含特殊字符),要注意 Oracle 版本对函数签名和返回值的严格要求。
- 函数必须返回
BOOLEAN,不能用NUMBER或VARCHAR2替代,否则CREATE PROFILE会报ORA-28030 - Oracle 12c+ 对大小写敏感,函数名写成
verify_function和VERIFY_FUNCTION是两个东西;profile 绑定时必须完全一致 - 如果用了
DBMS_CRYPTO或正则(REGEXP_LIKE),要确认用户有对应权限:GRANT EXECUTE ON DBMS_CRYPTO TO PUBLIC; - 测试时别只测新用户——用已有用户改密:
ALTER USER scott IDENTIFIED BY weak;应该失败;ALTER USER scott IDENTIFIED BY Strong@123;才成功
真正生效的密码策略,不是改完参数就完事。它依赖 profile 绑定、函数存在、用户归属、甚至版本兼容性四个环环相扣的环节。少一个,scott 还能用 tiger 登录。











