当前位置:首页 > 问答 > 正文

Oracle数据库账号老是被锁,到底啥原因导致的排查思路分享

有朋友在问,Oracle数据库的账号老是莫名其妙被锁住,用户一登录就报错,提示账户已锁定,非常影响工作,这个问题确实很常见,让人头疼,今天我们就来聊聊,当遇到这种情况时,应该按照什么样的步骤去排查,就像侦探破案一样,一步步找到“真凶”。(来源:基于常见的Oracle数据库管理经验总结)

最直接、最常见的一个原因,就是用户输错了太多次密码,Oracle数据库有个安全机制,就像你的手机解锁一样,连续输错几次密码,为了安全起见,系统就会自动把账户锁起来,防止别人恶意尝试,这个规则是可以设置的,叫做“密码策略”。(来源:Oracle数据库安全特性文档)

排查的第一步,就是去检查这个密码策略到底是怎么设置的,你需要用有管理员权限的账号(比如SYSTEM或SYS)登录数据库,然后执行一些查询命令,主要是看一个叫“DBA_PROFILES”的视图,这里面规定了密码相关的参数,你要重点关注两个参数:一个叫“FAILED_LOGIN_ATTEMPTS”,这个意思是允许连续输错密码几次;另一个叫“PASSWORD_LOCK_TIME”,这个意思是如果锁定了,要锁多久才会自动解锁,你可能会发现设置是“连续输错5次密码,账户锁定1天”。(来源:Oracle官方文档关于DBA_PROFILES视图的说明)

查清楚了规则,第二步就是去破案了:看看是谁、在什么时候、从哪里登录,连续输错了密码,这时候你需要去翻数据库的“日志”,也就是查看审计记录,Oracle数据库会记录登录成功和失败的信息,你需要查询像“DBA_AUDIT_TRAIL”这样的视图,筛选出最近一段时间内,针对那个被锁账号的登录失败记录,你可能会看到,在短时间内,从某个特定的IP地址或者电脑名,出现了一连串的失败登录尝试,这就能证实,确实是因为密码错误次数超限导致的锁定。(来源:Oracle数据库审计功能指南)

Oracle数据库账号老是被锁,到底啥原因导致的排查思路分享

有时候查完日志会发现,并没有明显的连续密码错误记录,可账户还是被锁了,这时候就要考虑第三种情况:是不是有程序或者脚本在用这个账号连接数据库?一个定时跑数据的任务(批处理作业),或者一个网站后台的程序,如果这个程序里配置的数据库密码是错的,或者密码已经过期了但它还在用旧密码尝试连接,那么它每次运行,都会触发一次失败的登录尝试,即使这个任务一天只跑一次,连续跑几天,累积的失败次数也足够触发账户锁定了,这种情况比较隐蔽,因为失败尝试是分散开的,不容易被立刻发现,你需要去检查所有使用该数据库账号的应用程序、脚本和任务计划。(来源:应用系统集成与数据库连接常见问题汇总)

第四种可能性,是人为的主动锁定,也许是有管理员手动执行了一条命令,把那个账号给锁住了,这可能是因为人员离职、权限变更或者出于安全考虑,你可以通过查询数据字典视图“DBA_USERS”来确认,这个视图里有一个字段叫“ACCOUNT_STATUS”,如果这里显示的是“LOCKED”,而且不是“LOCKED(TIMED)”(定时锁定),那很可能就是被人为锁定的,这时候你就需要去问问其他数据库管理员,或者查一下有没有相关的操作记录。(来源:Oracle数据库用户管理手册)

Oracle数据库账号老是被锁,到底啥原因导致的排查思路分享

第五,还有一种不太常见但确实存在的情况,就是数据库的密码策略本身被修改了,可能之前策略比较宽松,允许输错10次,后来出于安全加固,改成了只能输错3次,这样一来,那些本来习惯性偶尔输错一两次密码的用户,就很容易瞬间触发新的、更严格的锁账号规则,如果突然有一批账号被锁,可以回想一下最近有没有调整过全局的密码策略。(来源:数据库安全配置变更管理实践)

如果以上所有可能性都排除了,账户还是时不时被锁,那就要考虑更深层次的问题了,是不是数据库的某个内部机制出现了异常?或者是不是有恶意的攻击者在进行低频率、长周期的密码撞库攻击?这时候,可能就需要开启更详细的日志记录,或者寻求Oracle官方支持的帮助了。(来源:资深DBA的故障排查经验谈)

总结一下排查思路,就像过筛子一样,从最常见到最不常见:

  1. 查规则:看密码策略允许错几次。
  2. 查记录:看登录失败日志,找失败源头。
  3. 查应用:检查是否有程序在用错误密码连接。
  4. 查手动:确认是否被管理员手动锁定。
  5. 查变更:回想密码策略最近有无改动。
  6. 求支援:排除所有常见原因后,考虑深层次故障或寻求专家帮助。

按照这个顺序一步步来,大部分账号被锁的问题都能找到原因并解决掉。