Oracle用户密码相关

环境:centos7.6.1810
归类:database/oracle/11.2.0.4.0/users
简介:整理记录一些与Oracle用户密码相关的知识。如密码过期、密码存储、dblink复制等

1.安装完数据库后

1.1.PROFILE文件

  • 安装完Oracle11G数据库后,由于忘记更改数据库用户密码策略,180天后用户密码被锁,导致数据库访问异常

    --查看用户使用的profile文件
    select du.profile from dba_users du where du.username = 'SYS';
    --查看profile文件中关于密码的管理策略
    select *
      from dba_profiles dp
     where dp.profile = 'DEFAULT'
       and dp.resource_name like 'PASSWORD_%';
    
    20210825&001

    其中:
    PASSWORD_LIFE_TIME:该参数设定密码过期时间。
    PASSWORD_REUSE_TIME:该参数设定指定了密码不能重用前的天数。
    PASSWORD_REUSE_MAX:该参数设定为相同密码被重用之前密码改变的次数。
    三者的关系:

  1. PASSWORD_REUSE_TIME=UNLIMITED
    PASSWORD_REUSE_MAX=UNLIMITED
    密码可以随意重用,没有任何限制。
  2. PASSWORD_REUSE_TIME=值
    PASSWORD_REUSE_MAX=值
    必须同时满足两者的条件时才可以重用密码
  3. PASSWORD_REUSE_TIME=UNLIMITED
    PASSWORD_REUSE_MAX=值

    PASSWORD_REUSE_TIME=值
    PASSWORD_REUSE_MAX=UNLIMITED
    密码永远不能重用

PASSWORD_VERIFY_FUNCTION:认证函数
FAILED_LOGIN_ATTEMPTS:错误口令登录的次数,达到这个次数之后账户被自动锁定
PASSWORD_LOCK_TIME:接着FAILED_LOGIN_ATTEMPTS参数,口令被自动锁定的天数,达到这个时间之后,下次登录时系统自动解除对这个账户的锁定
PASSWORD_GRACE_TIME:对口令生命周期的一个grace(宽限或者延续),口令到期之后,继续可以使用的天数,在这段时间内如果我们登录系统,会有提示,提示系统在几天内过期

  • 安装完Oracle11G数据库创建完用户,建议调整密码过期策略,取消180天过期
    --将default对应的profile中的密码过期策略调整为永不过期,不用重启数据库,自动生效
    alter profile default limit password_life_time unlimited;
    

1.2.登录报警

  • 如果登录用户,提示ORA-28002: the password will expire within 7 days。此时能够正常登录,但是需要尽快修改密码或者调整profile文件中password_life_time。如果提示ORA-28001: the password has expired,则需要重新设置密码后才能登录。如果提示ORA-28000: the account is locked,则密码已经被锁定了,不允许登录。需要管理员对用户账户解锁,才能正常登录。
    --修改用户密码
    alter user scott identified by tiger1;
    --解锁用户,使用原密码
    alter user scott account unlock; --密码为原密码
    --解锁用户,使用新设置的密码
    alter user scott identified by tiger2 account unlock; --修改密码为tiger2
    

1.3.账户的几种状态

dba_users中的account_status表示用户账户的状态,具体有9种,通过查看user_astatus_map,其中分为基础状态组合状态
从要实现的效果上看主要有3种,分别是正常状态、过期状态、锁定状态。

select * from user_astatus_map;
/*
0   OPEN
1   EXPIRED
2   EXPIRED(GRACE)
4   LOCKED(TIMED)
8   LOCKED
5   EXPIRED & LOCKED(TIMED)
6   EXPIRED(GRACE) & LOCKED(TIMED)
9   EXPIRED & LOCKED
10  EXPIRED(GRACE) & LOCKED
*/
  • OPEN:正常状态
  • EXPIRED/EXPIRED(GRACE):后者是profile中密码到期后,处于PASSWORD_GRACE_TIME宽限日期时的账户状态。等PASSWORD_GRACE_TIME过后,账户状态变更为前者的状态。同时前者可以被管理员手动设置。
  • LOCKED/LOCKED(TIMED):后者是profile中超过登录口令错误重试次数(FAILED_LOGIN_ATTEMPTS)后,处于PASSWORD_LOCK_TIME密码锁定时的账户状态,等PASSWORD_LOCK_TIME时间过后会自动解锁。前者可以被管理员手动设置。
--设置用户账户密码过期状态
alter user testa password expire;
--设置用户账户锁定状态
alter user testa account lock;
--解锁用户账户锁定
alter user testa account unlock;
  • 组合状态,就是过期和锁定两种状态组合,共有2×2=4种。例如:EXPIRED & LOCKE:用户账户密码过期并且被管理员手动锁定后,再次登录将会产生报错,用户被锁定。通过账户解锁后变成EXPIRED,还是不能连接,需要重新设置密码。

2.密码存储方式

在Oracle10g中,对于密码的管理相对较松。

--查询密码的hash值
select username,account_status,password from dba_users where username = 'TESTA';

但是在Oracle11g中,用户安全得到加强,隐藏了密码,不过还是可以查询到:

--查询密码的hash值
select USER#,name,PASSWORD from user$ where name = 'TESTA';

这里密码的hash值应用场景,比如应用连接了数据库,等发现密码过期时,想要重新设置密码,但是为了对应用影响较小,还需要应用以前的密码,直接通过查询密码的hash值,然后就可以重新设置原有密码:

--设置用户
create user testa identified by testa;
grant connect to testa;
--查询密码testa的hash值,Oracle11g中hash值为:EE65C0E0B6E5C4B7
select USER#,name,PASSWORD from user$ where name = 'TESTA';
--设置密码
alter user testa identified by values 'EE65C0E0B6E5C4B7';

更进一步,分析dba_users视图中用户状态与user$表的关系,我们发现user$的astatus会影响dba_users中的account_status,从而影响用户账户状态:

--让用户testa密码过期
alter user testa password expire;
--此时查询dba_users,testa用户的account_status='EXPIRED'
select * from dba_users t where t.username = 'TESTA';
--查询user$时,testa用户的astatus='1'
select * from user$ t where t.name ='TESTA';
--变更user$的astatus,会直接影响dba_users
update user$ t set t.astatus = '0' where t.name ='TESTA';
--此时再看dba_users,account_status='OPEN'
select * from dba_users t where t.username = 'TESTA';

3.DBLINK复制

有时候忘记了dblink的密码,但是又想在别的地方重建此dblink,该如何做,按照下列步骤操作即可:

  • Oracle10g

    --get_ddl中第一个参数'DB_LINK',第二个参数是 DBLINK的名称,第三个是创建此DBLINK的用户,全部大写
    select dbms_metadata.get_ddl('DB_LINK','TO130TESTA','SCOTT') from sys.dual;
    --如果没有权限,需要管理员赋予以下权限
    grant select_catalog_role to scott;
    

    获得的是一个CLOB字段,将中间的dblink创建脚本复制粘贴到别的数据库即可重建成功。identified by values '0547D8.....'中显示的是dblink远程连接用户的密码的密文,不用修改,原样复制即可。

  • Oracle11g
    oracle11g加强了安全,此时执行上面的dbms_metadata.get_ddl获取的远程用户密码密文已经隐藏,变成了IDENTIFIED BY VALUES ':1',需要借助sys.link$passwordx

--先使用上面的clob中dblink创建sql
/*需要注意的是,需要将DENTIFIED BY VALUES ':1'中的':1'换成'1'*/
CREATE DATABASE LINK "TO130TESTA"
   CONNECT TO "TESTA" IDENTIFIED BY VALUES '1'
   USING '(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = "192.168.20.130")(PORT = 1521))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = "master")
    )
  )'

--查询当前数据库中sys.link$,获取dblink远程用户的flag,passwordx
select * from sys.link$ s where s.name = 'TO130TESTA';
--获取的 flag=2,passwordx=06E077A0010ED4C81E4F3BFB5A055CB23A1CDAE24214E4E3B206D4515F38152E2F3E664534D864C8AA2B950E9617EABC7657326427F88FF1077CE19283D95BC08A14F6B9A3F9DF6A8283B4180AF7A691B0E2EBC562DE0858CEF051001F891E4C2C8D54AC5DDC827117B1648E7088DC84209D41870E174F657F8C88D23AFB741B
--将复制端的数据库的sys.link$也进行变更
update sys.link$ s set s.flag ='2',s.passwordx = '06E077A0010ED4C81E4F3BFB5A055CB23A1CDAE24214E4E3B206D4515F38152E2F3E664534D864C8AA2B950E9617EABC7657326427F88FF1077CE19283D95BC08A14F6B9A3F9DF6A8283B4180AF7A691B0E2EBC562DE0858CEF051001F891E4C2C8D54AC5DDC827117B1648E7088DC84209D41870E174F657F8C88D23AFB741B'
where s.name = 'TO130TESTA';
--此时访问即可正常访问
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容