在Oracle 19c中如何排查谁在何时修改了特定用户的密码?

星杰同学_1685

星杰同学_1685

2026-10-28

549人浏览

原创

Oracle 19c默认不审计密码修改操作,必须显式执行AUDIT ALTER USER WHENEVER SUCCESSFUL;并验证dba_stmt_audit_opts中SUCCESS='YES',启用后才可通过dba_audit_trail中action_name='ALTER USER'且sql_text LIKE '%IDENTIFIED%'定位执行人、时间及目标用户。

在oracle 19c中如何排查谁在何时修改了特定用户的密码?

Oracle 19c本身不记录“谁改了谁的密码”这一操作的明细日志——ALTER USER ... IDENTIFIED BY这类语句不会自动写入审计视图(如dba_audit_trail),除非你**提前启用了对应审计策略**。没开审计,就基本查不到;开了,才能从源头定位。

确认是否启用了密码修改审计

这是排查的前提。Oracle默认不审计密码修改行为,必须显式开启:

  • AUDIT ALTER USER BY ACCESS; —— 审计所有ALTER USER语句(含密码、PROFILE、表空间等变更)
  • AUDIT ALTER USER WHENEVER SUCCESSFUL; —— 只审计成功执行的修改(推荐,减少噪音)

执行后,检查是否生效:

SELECT audit_option, success, failure FROM dba_stmt_audit_opts WHERE audit_option = 'ALTER USER';

若返回空或SUCCESS='NO',说明审计未启用,后续所有查询都无意义。

从DBA_AUDIT_TRAIL中提取密码修改记录

审计开启后,密码修改会作为ALTER USER语句出现在dba_audit_trail中,但需结合SQL文本判断是否为密码操作:

  • 过滤条件必须包含:action_name = 'ALTER USER' 且 sql_text LIKE '%IDENTIFIED%'
  • 关键字段:timestamp(何时)、username(谁执行的命令)、os_username(操作系统用户)、userhost(来源主机)、sql_text(完整语句,可看到目标用户名)
  • 示例查询:
SELECT timestamp, username, os_username, userhost, sql_text
FROM dba_audit_trail 
WHERE action_name = 'ALTER USER' 
  AND sql_text LIKE '%IDENTIFIED%' 
  AND sql_text LIKE '%scott%'  -- 替换为目标用户名
ORDER BY timestamp DESC;

注意:sql_text可能被截断(取决于audit_trail参数设置),且不区分大小写;如果只看到ALTER USER scott ...而没出现IDENTIFIED,可能是用了IDENTIFIED BY VALUES方式,仍算密码修改。

QuantOracle
QuantOracle

63个确定性量化金融计算器 + 10个通过MCP的复合工作流。期权定价、Greeks、奇异衍生品、风险指标、投资组合优化……

下载

没开审计时的补救线索:查SPARE4变更时间(仅限19c)

虽然Oracle不记“谁改的”,但它会在sys.user$里更新密码哈希字段SPARE4。这个字段的更新时间虽不精确到秒,但能锁定大致窗口:

  • 查当前SPARE4值和最后修改时间(需SYS权限):
SELECT name, SPARE4, ctime, mtime 
FROM sys.user$ 
WHERE name = 'SCOTT';

ctime是用户创建时间,mtime是最近一次元数据变更时间(包括密码重置)。如果mtime明显晚于预期,说明密码近期被改过;再结合v$archived_log和LogMiner,可尝试挖掘该时间段内的ALTER USER语句(前提是归档日志未被覆盖)。

但这条路极难走通:LogMiner解析出的DML/DDL不带执行者信息,sql_redo里只有ALTER USER ...,没有os_username或IP。所以mtime只能帮你确认“是否被改过”,无法回答“谁改的”。

为什么ORA-01017登录失败不能反推密码修改人

有人试图从大量ORA-01017错误日志倒推谁在试密码,这是误区:

  • ORA-01017只表示“用户名/密码不匹配”,不区分是输错、密码已过期、还是账户被锁;它不记录失败尝试的源IP或OS用户(除非额外配置了unified auditing并开启FAILED_LOGIN_ATTEMPTS)
  • 即使查dba_audit_session,失败登录记录也只存returncode=1017,字段有限,无法关联到后续成功的密码修改操作
  • 真正有效的线索永远只有一条:审计必须提前打开,且策略要具体到ALTER USER

生产库上线前没配审计,事后就只能靠运维日志、堡垒机操作记录或应用层审计兜底——数据库自身在19c里不提供回溯密码修改责任人的能力。

相关专题

更多
oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

2023.08.16

1041

5

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

2023.09.15

3073

5

oracle怎么分页
oracle怎么分页

实现分页的步骤:1、使用ROWNUM进行分页查询;2、在执行查询之前进行设置分页参数;3、使用"COUNT(*)"函数来获取总行数,并使用"CEIL"函数来向上取整计算总页数;4、在外部查询中使用"WHERE"子句来筛选出特定的行号范围,以实现分页查询。想了解更多oracle怎么分页的文章,可以来阅读本专题先的文章。

2023.09.18

3070

5

Oracle查看表操作历史记录
Oracle查看表操作历史记录

查看操作历史记录的方法:1、使用Oracle内置的审计功能,可以记录数据库中发生的各种操作,包括登录、DDL语句、DML语句等;2、使用Oracle日志文件,其中包含了数据库中发生的各种操作,可以通过查看日志文件来获取操作历史记录;3、使用Oracle的Flashback功能,可以查看数据库在某个时间点的操作历史记录;4、使用第三方工具等。本专题还提供其他查看表操作的文章,大家可以免费阅读。

2023.09.19

1749

3

Oracle中RAC的用法
Oracle中RAC的用法

Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据库请求,从而实现并行处理;6、提供了透明故障切换功能;7、使用了一些技术来确保数据的一致性;8、提供了管理工具来简化RAC环境的管理和维护。本专题还提供RAC相关的其他文章,大家可以免费阅读。

2023.09.19

2373

7

oracle imp
oracle imp

imp是Oracle数据库中的一个命令行工具,用于将导出的数据和对象从一个数据库实例导入到另一个数据库实例。imp命令的一般语法为“imp username/password@connect_string file=file_name [options]”。

2023.09.19

3229

4

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4689

19

oracle通配符有哪些
oracle通配符有哪些

oracle通配符有“%”、“_”、“[]”和“[^]"。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.08

257

5

oracle四舍五入怎么操作
oracle四舍五入怎么操作

oracle四舍五入操作可以使用ROUND函数来实现,其语法为“ROUND(number, decimal_places)”,其中,number是要进行四舍五入的数值,decimal_places是指定的小数位数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.14

846

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程