Oracle 19c多租户架构下设置用户密码永不过期及登录锁定策略说明_20260430

在 Oracle 19c 多租户架构中,业务用户通常创建在具体的 PDB 里,而不是 CDB$ROOT 中。因此,查看用户状态、修改密码策略前,必须先进入对应 PDB。否则可能出现"查不到用户"或"改了但没生效"的情况。

一、进入数据库并切换到对应 PDB

先切换到 Oracle 用户,并确认当前实例:

复制代码
su - oracle
echo $ORACLE_SID

如果需要切换实例,例如本次环境使用 UTF8CDB1

复制代码
export ORACLE_SID=UTF8CDB1
sqlplus / as sysdba

进入 SQL*Plus 后,查看当前 CDB 下有哪些 PDB:

复制代码
show pdbs;

示例结果:

复制代码
CON_ID  CON_NAME   OPEN MODE
------  ---------  ----------
3       IETQMS     READ WRITE
5       QMS        READ WRITE

切换到对应 PDB,例如进入 QMS

复制代码
alter session set container=QMS;

确认当前所在容器:

复制代码
show con_name;

如果显示:

复制代码
CON_NAME
------------------------------
QMS

说明已经进入 QMS PDB。后续查询用户、修改 Profile,都只针对当前 PDB 生效。

二、查看用户是否锁定或密码是否过期

复制代码
set lines 200 pages 200
col username for a30
col account_status for a30
col profile for a20
col expiry_date for a20

select
    username,
    account_status,
    profile,
    to_char(expiry_date,'yyyy-mm-dd hh24:mi:ss') expiry_date
from dba_users
where oracle_maintained = 'N'
order by username;

重点看两列:

字段 含义
ACCOUNT_STATUS 用户状态,OPEN 表示正常
EXPIRY_DATE 密码过期时间,空值表示当前不会过期

如果用户状态是 OPEN,并且 EXPIRY_DATE 为空,说明用户当前正常,密码不会因生命周期到期而过期。实际检查中,QMSADMINQMS_ADMIN 等用户状态为 OPEN,且 EXPIRY_DATE 为空,说明密码永不过期已生效。

三、查看 Profile 密码策略

Oracle 用户密码过期和锁定策略由 Profile 控制。常见业务用户一般使用 DEFAULT Profile。

复制代码
set lines 200
col profile for a20
col resource_name for a35
col limit for a30

select profile, resource_name, limit
from dba_profiles
where profile = 'DEFAULT'
  and resource_name in (
    'FAILED_LOGIN_ATTEMPTS',
    'PASSWORD_LOCK_TIME',
    'PASSWORD_LIFE_TIME',
    'PASSWORD_GRACE_TIME'
  )
order by resource_name;

常见推荐结果:

复制代码
FAILED_LOGIN_ATTEMPTS   10
PASSWORD_GRACE_TIME     7
PASSWORD_LIFE_TIME      UNLIMITED
PASSWORD_LOCK_TIME      1

含义如下:

参数 含义
FAILED_LOGIN_ATTEMPTS = 10 连续输错密码 10 次后锁定
PASSWORD_LOCK_TIME = 1 锁定 1 天后自动解锁
PASSWORD_LIFE_TIME = UNLIMITED 密码永不过期
PASSWORD_GRACE_TIME = 7 密码过期宽限期,密码永不过期时基本不触发

四、设置密码永不过期

进入对应 PDB 后执行:

复制代码
alter profile DEFAULT limit PASSWORD_LIFE_TIME unlimited;

如果想一次性整理成推荐策略,可以执行:

复制代码
alter profile DEFAULT limit
    FAILED_LOGIN_ATTEMPTS 10
    PASSWORD_LOCK_TIME 1
    PASSWORD_LIFE_TIME UNLIMITED
    PASSWORD_GRACE_TIME 7;

这套配置的效果是:

复制代码
密码永不过期;
连续输错 10 次会锁定;
锁定 1 天后自动解锁。

五、验证是否生效

查看 Profile:

复制代码
select profile, resource_name, limit
from dba_profiles
where profile = 'DEFAULT'
  and resource_name in (
    'FAILED_LOGIN_ATTEMPTS',
    'PASSWORD_LOCK_TIME',
    'PASSWORD_LIFE_TIME',
    'PASSWORD_GRACE_TIME'
  )
order by resource_name;

确认看到:

复制代码
PASSWORD_LIFE_TIME    UNLIMITED

再查看用户:

复制代码
select
    username,
    account_status,
    profile,
    to_char(expiry_date,'yyyy-mm-dd hh24:mi:ss') expiry_date
from dba_users
where oracle_maintained = 'N'
order by username;

如果业务用户 ACCOUNT_STATUS = OPEN,且 EXPIRY_DATE 为空,就说明密码永不过期已经生效。

六、注意事项

alter profile DEFAULT 只影响当前所在 PDB。比如在 QMS 执行,只影响 QMS;在 IETQMS 执行,只影响 IETQMS。如果有多个 PDB,需要分别切换进去执行:

复制代码
alter session set container=QMS;
alter profile DEFAULT limit PASSWORD_LIFE_TIME unlimited;

alter session set container=IETQMS;
alter profile DEFAULT limit PASSWORD_LIFE_TIME unlimited;

alter session set container=YJXT;
alter profile DEFAULT limit PASSWORD_LIFE_TIME unlimited;

已经处于 EXPIRED & LOCKED 的用户,不会因为修改 Profile 自动变成 OPEN。这类用户大多是 Oracle 组件用户、示例用户或历史遗留用户,生产环境不建议随便解锁。

七、总结

Oracle 用户密码是否过期,不是直接修改 DBA_USERS.EXPIRY_DATE,而是通过 Profile 里的 PASSWORD_LIFE_TIME 控制。

生产环境推荐配置:

复制代码
PASSWORD_LIFE_TIME      UNLIMITED
FAILED_LOGIN_ATTEMPTS   10
PASSWORD_LOCK_TIME      1
PASSWORD_GRACE_TIME     7

应用账号可以设置密码永不过期,但失败登录锁定策略不要关闭。业务要稳,安全的门栓也要留着。

相关推荐
wj3055853785 小时前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
abigriver5 小时前
打造 Linux 离线大模型级语音输入法:Whisper.cpp + 3090 显卡加速与 Rime 中英混输终极调优指南
linux·运维·whisper
wangqiaowq6 小时前
windows下nginx的安装
linux·服务器·前端
星星也在雾里6 小时前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
YYRAN_ZZU6 小时前
Petalinux新建自动脚本启动
linux
charlie1145141916 小时前
嵌入式Linux驱动开发pinctrl篇(1)——从寄存器到子系统:驱动演进之路
linux·运维·驱动开发
Agent手记7 小时前
异常考勤智能预警与处理与流程优化方案 | 基于企业级Agent的超自动化实战教程
运维·人工智能·ai·自动化
于小猿Sup7 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
cen__y7 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
雨辰AI8 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务