等保要求必须启用PASSWORD_VERIFY_FUNCTION且不能为NULL,需执行utlpwdmg.sql创建验证函数并显式绑定到PROFILE,同时配置失败锁定、有效期、重用限制等配套策略。
oracle密码复杂度策略必须启用 password_verify_function,且不能为 null;否则等保测评直接不通过。
确认当前密码验证函数是否生效
等保要求明确指出:PASSWORD_VERIFY_FUNCTION 值为 NULL 属于高风险项。先查清现状:
SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name = 'PASSWORD_VERIFY_FUNCTION';
常见错误现象:返回 NULL 或空值;或显示为 VERIFY_FUNCTION 但该函数实际未创建/编译失败。
- 若为
NULL,说明未启用任何密码校验逻辑,所有弱密码(如123456、oracle)均可通过 - 若函数名存在(如
ora12c_verify_function),还需确认其是否在dba_objects中状态为VALID - Oracle 12c+ 默认自带
ora12c_verify_function,但 11g 需手动运行@?/rdbms/admin/utlpwdmg.sql才生成
用 utlpwdmg.sql 快速启用合规基础函数
这是最稳妥的起点——官方脚本已适配等保对长度、字符类型、用户名相似性等基本要求。
以 SYS 用户执行:
@?/rdbms/admin/utlpwdmg.sql
执行后会自动创建 ora12c_verify_function(12c/19c)或 verify_function(11g),并绑定到 DEFAULT profile。
- 该函数强制密码至少 8 位,且含大小写字母、数字、特殊字符(仅支持
_、$、#) - 禁止与用户名、实例名相同或倒序,也禁止纯数字、纯字母等模式
- 注意:脚本执行后不会自动修改其他 profile,只影响
DEFAULT;若业务用户用了自定义 profile,需手动设置
修改 profile 时必须显式指定验证函数
很多人以为执行了 utlpwdmg.sql 就万事大吉,但 profile 的 PASSWORD_VERIFY_FUNCTION 字段可能仍为 NULL —— 因为脚本只创建函数,不自动写入 profile 限制。
务必补全这步(以 DEFAULT 为例):
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION ora12c_verify_function;
- Oracle 11g 请用
verify_function;12c/19c/21c 推荐ora12c_verify_function(更严格) - 若创建了自定义 profile(如
SECURE_PROFILE),必须单独执行ALTER PROFILE ... LIMIT PASSWORD_VERIFY_FUNCTION ... - 修改后立即生效:已有用户下次改密时即受约束,新用户建账时即校验
等保硬性参数必须同步配置
仅启用验证函数不够。等保还要求失败锁定、密码有效期、重用限制等配套策略,缺一不可:
ALTER PROFILE DEFAULT LIMIT \ FAILED_LOGIN_ATTEMPTS 5 \ PASSWORD_LOCK_TIME 1/24 \ PASSWORD_LIFE_TIME 90 \ PASSWORD_GRACE_TIME 7 \ PASSWORD_REUSE_TIME 365 \ PASSWORD_REUSE_MAX 5;
-
FAILED_LOGIN_ATTEMPTS 5+PASSWORD_LOCK_TIME 1/24表示 5 次输错锁 1 小时(单位是天,1/24 = 1 小时) -
PASSWORD_LIFE_TIME 90是强制 90 天内必须改密,超期后首次登录即提示修改 - 特别注意:
PASSWORD_REUSE_TIME和PASSWORD_REUSE_MAX必须同时设非零值,否则等保认为“可无限重用旧密码”
最后检查:所有生产用户(尤其是 SYS、SYSTEM、应用账号)的 PROFILE 字段必须指向已配置上述策略的 profile,不能漏掉。


















