环境: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:该参数设定为相同密码被重用之前密码改变的次数。
三者的关系:
- PASSWORD_REUSE_TIME=UNLIMITED
PASSWORD_REUSE_MAX=UNLIMITED
密码可以随意重用,没有任何限制。- PASSWORD_REUSE_TIME=值
PASSWORD_REUSE_MAX=值
必须同时满足两者的条件时才可以重用密码- 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';
--此时访问即可正常访问