Oracle用户密码系列

0    65    1

👉 本文共约4792个字,系统预计阅读时间或需19分钟。

前言部分

导读和注意事项

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,\~O(∩_∩)O\~:

① 用户的9种状态含义(重点)

② 如何解锁账户

③ 如何修改密码无效状态

④ 如何获取密码的密文,如何利用密文修改用户的密码(重点)

⑤ 如何查询失败的登陆次数

⑥ 11g 密码大小写问题

⑦ 11g 密码延迟验证

⑧ 密码复杂性校验

本文简介

客户的一个账户密码过期了,但是客户设置了永不过期,问到我为什么。我当时觉得设置了永不过期那肯定是生效的,只是这个部分的内容忘得差不多了,当时还想到可能是resource_limit这个参数没有设置为TRUE的缘故,后来查了官方文档才知道并不是这个原因。于是下决心把这部分的内容系统学习一下,自己总结的内容分享给大家。

使用profile管理用户口令

Oracle用户的状态是由密码来决定的,而Oracle中的密码是由PROFILE来配置的。PROFILE是口令限制、资源限制的命令集合。当建立数据库时,Oracle会自动建立名称为DEFAULT的PROFILE。当创建用户而没有指定PROFILE选项时,Oracle就会将DEFAULT分配给用户。

通过如下的命令可以查出与密码相关的PROFILE的值:

Oracle用户密码系列

每个参数的含义如下所示:

  • FAILED_LOGIN_ATTEMPTS 设定登录到Oracle数据库时可以失败的次数。一旦某用户尝试登录数据库的达到该值时,该用户的帐户就被锁定,只能由DBA能解锁。
  • PASSWORD_LIFE_TIME 设定口令的有效时间(天数),一旦超过这一时间,必须重新设口令。缺省为180天。
  • PASSWORD_REUSE_TIME 许多系统不许用户重新启用过去用过的口令。该资源项设定了一个失效口令要经过多少天,用户才可以重新使用该口令,缺省为UNLIMITED。
  • PASSWORD_REUSE_MAX 重新启用一个先前用过的口令前必须对该口令进行重新设置的次数(重复用的次数)。
  • PASSWORD_LOCK_TIME 设定帐户被锁定的天数(当登录失败达到FAILED_LOGIN_ATTEMPTS时)。
  • PASSWORD_GRACE_TIME 设定在口令失效前,给予的重新设该口令的宽限天。当口令失效之后回,在登录时会出现警告信息显示该天数。如果没有在宽限天内修改口令,口令将失效。
  • PASSWORD_VERITY_FUNCTION 该资源项允许调用一个PL/SQL来验证口令。Oracle已提供该应用的脚本,为\$ORACLE_HOME/rdbms/admin/utlpwdmg.sql。但是,用户可以制定自己的验证脚本。该参数的设定就是PL/SQL函数的名称,缺省为NULL。

修改密码为永不过期

ACCOUNT_STATUS的九种状态

Oracle用户密码系列

以上九种可以分为两大类:1.基本状态;2.组合状态。

前五种是基本状态:

0 OPEN

1 EXPIRED

2 EXPIRED(GRACE)

4 LOCKED(TIMED)

8 LOCKED

后四种是组合状态:

5 EXPIRED & LOCKED(TIMED)

6 EXPIRED(GRACE) & LOCKED(TIMED)

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

9 EXPIRED & LOCKED

10 EXPIRED(GRACE) & LOCKED

规律是这样的:后四种的组合状态可以通过状态号STATUS#获得它是哪两种状态的组合,例如10=2+8(10 EXPIRED(GRACE) & LOCKED = 2 EXPIRED(GRACE) + 8 LOCKED)。因此只要了解基本状态的含义其他便可无师自通。

这五种基本状态又可以分为三类:1.正常状态;2.锁定状态;3.密码过期状态。

1)OPEN表示用户处于正常状态。

2)用户被锁定状态,LOCKED和LOCKED(TIMED)两种状态都属于锁定状态

用户被锁定一般分为两种:一种是DBA显式的通过SQL语句对用户进行锁定;另外一种是被动的锁定,例如默认情况下如果密码输入错误超过10次(这个限制是由PROFILE中的FAILED_LOGIN_ATTEMPTS控制的,该信息可以通过DBA_PROFILES视图查询),用户将被锁定。

Oracle用户密码系列

锁定状态

LOCKED

显式锁定LHRSYS用户LOCKED状态演示

Oracle用户密码系列

LOCKED(TIMED)

输入10次错误密码后被动锁定LOCKED(TIMED)状态演示

尝试输入10次错误密码后再次查询用户状态。

过期状态

用户密码过期状态,EXPIRED和EXPIRED(GRACE)两种状态都属于密码过期状态。

Oracle用户密码系列

EXPIRED

密码是否过期是通过修改PROFILE中的PASSWORD_LIFE_TIME实现的,密码过期后还可以使用的天数是通过PROFILE中的PASSWORD_GRACE_TIME控制的。

关于密码过期我们也可以使用SQL显式的去完成,简单演示一下。

下面通过修改系统的日期来演示:

EXPIRED(GRACE)

当设置了PASSWORD_GRACE_TIME以后,第一次成功登录后到口令到期后有多少天时间可改变口令,在这段时间内,帐户被提醒修改口令并可以正常登陆,account_status显示为EXPIRED(GRACE)。expired(grace) 与 locked(timed)是由系统的profile来进行控制的。

组合状态

关于四种组合状态的解释

因为锁定的两种状态(LOCKED和LOCKED(TIMED))和密码过期的两种状态(EXPIRED和EXPIRED(GRACE))之间没有关系。因此他们之间可以任意组合,2×2=4,因此有四种组合状态:

5 EXPIRED & LOCKED(TIMED)

6 EXPIRED(GRACE) & LOCKED(TIMED)

9 EXPIRED & LOCKED

10 EXPIRED(GRACE) & LOCKED

EXPIRED & LOCKED

EXPIRED & LOCKED状态表示用户密码过期且同时处于锁定状态

EXPIRED & LOCKED(TIMED)

EXPIRED & LOCKED(TIMED)状态表示用户密码过期后,错误密码尝试次数超过PROFILE中的FAILED_LOGIN_ATTEMPTS的限制

EXPIRED(GRACE) & LOCKED

EXPIRED(GRACE) & LOCKED状态表示用户在密码过期后的有效期内被DBA手工锁定。

EXPIRED(GRACE) & LOCKED(TIMED)

EXPIRED(GRACE) & LOCKED(TIMED)状态表示用户在密码过期后的有效期内,失败登录次数超过PROFILE中的FAILED_LOGIN_ATTEMPTS的限制。

在不知道用户密码的情况下如何更改密码

在Oracle中,若用户的密码变为锁定状态(LOCKED、LOCKED(TIMED))则DBA直接执行ALTER USER用户名 ACCOUNT UNLOCK就可以解锁了。但是,如果用户的状态变成过期状态(EXPIRED、EXPIRED(GRACE)),则DBA必须要更改用户的密码账户才能重新使用。但有些时候,因为各种原因并不知道原密码的明文是什么,这时候可以有如下2种办法来更新密码。

用原密码的密文来更改密码

在Oracle 10g中,DBA_USERS视图的PASSWORD字段提供了密码的密文形式,而在Oracle 11g中,该字段被弃用了,内容为空,但是在基表USER\$中的PASSWORD字段依然有记录密文形式,所以可以通过如下的形式来获取密码的密文形式:

Oracle用户密码系列

另外,可以通过DBMS_METADATA.GET_DDL包或者expdp、exp命令来获取创建用户的语句从而获取密码的密文形式:

获取了密码的密文后就可以用如下的命令来修改了,注意:使用密文的命令中多了一个values关键字:

这种情况下,虽然我们不知道原密码是什么,但可以用它的密文来更改密码,这样,在不知道原密码的情况下,既保持了密码不改变,又可以把expired的状态更改掉。

在MOS The Impact of PASSWORD_LIFE_TIME Database Profile Parameter Default to 180 Days on Network Charging and Control (文档 ID 1543668.1)中搜到了如下的命令也可以直接获取密码:

直接更新USER$基表

不管用户的状态是什么,通过更新USER\$表可以让用户处于OPEN状态:

user$.lCOUNT列记录了失败的登陆次数

登录失败,lcount加1;只要成功登录后,lcount栏位就会置0。

另外,审计表也记录了登陆失败的信息:

Oracle用户密码系列

11g密码区分大小写--sec_case_sensitive_logon

PropertyDescription
Parameter typeBoolean
Default valuetrue
ModifiableALTER SYSTEM
Range of valuestrue | false
BasicNo

从Oracle 11g开始,密码区分大小写,采用参数sec_case_sensitive_logon控制,该参数默认为TRUE。

SEC_CASE_SENSITIVE_LOGON enables or disables password case sensitivity in the database.

Values:

true:Database logon passwords are case sensitive.

false:Database logon passwords are not case sensitive.

注意:从Oracle 12c开始,参数SEC_CASE_SENSITIVE_LOGON已经废弃,无论其值设置为TRUE还是FALSE,用户密码均区分大小写。

密码延迟验证

从11g开始,如果一个用户使用不正确的密码尝试登录数据库,那么随着登录失败次数的增加,每次登录验证前延迟等待的时间也会增加。

通过设置EVENTS 28401可以屏蔽密码延迟验证:

设置该事件后重启数据库即可。

哪些用户密码没有被修改过

Oracle在11g中对于安全方面进行了很大的改进,比如增加了密码大小写验证,增加了密码复杂度的验证等等。在Oracle 11g中还提供了一个视图DBA_USERS_WITH_DEFPWD用来指出那些用户的密码没有被修改过,仍然是数据库默认密码。Oracle并不是简单的监测是否密码被修改,而是检查密码是否修改为别的值,如果新密码和旧密码保持一致,那么即使密码被修改,这个用户仍然在DBA_USERS_WITH_DEFPWD视图中。

Oracle用户密码系列

密码复杂性校验

脚本位置:$ORACLE_HOME/rdbms/admin/utlpwdmg.sql

该脚本中有如下的一段:

更改之后查看:

resource_limit

官方文档资料:

To create a profile, you must have the CREATE PROFILE system privilege.

To specify resource limits for a user, you must:

•Enable resource limits dynamically with the ALTER SYSTEM statement or with the initialization parameter RESOURCE_LIMIT. This parameter does not apply to password resources. Password resources are always enabled.

•Create a profile that defines the limits using the CREATE PROFILE statement

•Assign the profile to the user using the CREATE USER or ALTER USER statement

  1. 用户所有拥有的PROFILE中有关密码的限制永远生效,不受限制。
  2. 用户所有拥有的PROFILE中有关资源的限制与resource_limit参数的设置有关,当为TRUE时生效,当为FALSE时(默认值是FALSE)无效。在Oracle 12c之前该参数默认为FALSE,而从12c开始,该参数默认为TRUE。

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

2 × 2 =

 

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部