【oracle】数据库配置用户密码永不过期

需求场景:

对于用户密码这个敏感的字眼,在维护工作中绝对不陌生,定时更新复杂度密码三个月有效期等一次次被提及,事实在工作中,很少有企业能保持高频率的更新密码的。

今天大嘴就遇到这么个情况,oracle下的数据库用户,用户密码过期,导致库连接不上,无法获取数据,所以今天就总结学习一下oracle如何配置用户密码永不过期。

♥oracle配置用户密码永不过期:

首先我们需要了解下用户的资源配置profile文件,oracle中的profile是用来对用户所能使用的数据库资源进行限制的

所以我们需要通过对profile的配置,从而配置oracle用户密码的永不过期;

①、查看用户关联的profile文件:

cSQL> select username,profile from dba_users;
USERNAME       PROFILE
------------- ------------------------------
DBSNMP         MONITORING_PROFILE
SYSMAN         DEFAULT
MGMT_VIEW      DEFAULT
SYS            DEFAULT
、、、、、、

可以看到大部分用户的profile文件是DEFAULT;

②、查看用户默认profile文件DEFAULT指定的密码有效时间:

SQL> select * from dba_profiles s where s.profile = 'DEFAULT' and resource_name = 'PASSWORD_LIFE_TIME';
PROFILE RESOURCE_NAME           RESOURCE    LIMIT
------- ---------------------- ----------- ------------
DEFAULT PASSWORD_LIFE_TIME     PASSWORD    180

注意:DEFAULT和PASSWORD_LIFE_TIME必须大写,可以看到密码有效期是180天;

③、将密码有效期由180天修改为无限期:

SQL> alter profile DEFAULT limit PASSWORD_LIFE_TIME UNLIMITED;
Profile altered.
SQL> select * from dba_profiles s where s.profile = 'DEFAULT' and resource_name = 'PASSWORD_LIFE_TIME';
PROFILE RESOURCE_NAME         RESOURCE    LIMIT
------- -------------------- ----------- ------------
DEFAULT PASSWORD_LIFE_TIME    PASSWORD    UNLIMITED

如此,有效期已经为UNLIMITED永不过期啦;(配置即生效,无需重启数据库

当然这里配置的所以关联了DEFAULT的用户,如果只想单独配置某个用户密码永不过期呢?这就需要给此用户单独配置个密码永不过期的profile文件。

扩展一:给单一用户设置密码永不过期

①、查看TEST这个用户的密码有效期、状态、和用户关联的profile文件,一般默认为DEFAULT;

SQL>select username, user_id, account_status, expiry_date, profile from dba_users where username = 'TEST';

②、同样,我们也可以查看下用户关联的profile文件指定的密码有效期时间:

SQL>select * from dba_profiles s where s.profile = 'DEFAULT' and resource_name = 'PASSWORD_LIFE_TIME';

③、要想给单独的用户配置,需要单独给这个用户创建一个用户profile文件并着个文件指定的密码是永不过期的:

SQL>create profile passwd_unlimit limit PASSWORD_LIFE_TIME unlimited;

④、把上面密码永不过期的profile文件关联到TEST用户:

SQL>alter user TEST profile passwd_unlimit;

⑤、如此,TEST这个用户的密码指定为永不过期,我们可以通过dba_users查看一下TEST的profile是否配置成功:

SQL>select username, user_id, account_status, expiry_date, profilefrom dba_users where username ='TEST';

⑥、我们也可以查看一下passwd_unlimit这个profile文件的附属资源配置:

SQL>SELECT * FROM dba_profiles s WHERE s.profile = 'PASSWD_UNLIMIT';

(从结果阔以得出其中profile文件资源配置PASSWORD_LIFE_TIME设置确实为UNLIMITED)

注意·思考

执行⑥中的语句,会发现,profile文件中除了PASSWORD_LIFE_TIME(指定同一密码所允许使用的天数)外,还有很多的resource附属资源配置限制没有配置,所以我们可以对其它的resource也需要做出相应的调整来满足需求;

1、resource_parameter部分:
ALTER profile passwd_unlimit limit COMPOSITE_LIMIT UNLIMITED;(设置不限制一个会话总的资源消耗以service units单位表示。)
(Oracle数据库以有利的方式计算cpu_per_session,connect_time,logical_reads_per_session和private-sga总的service units)
ALTER profile passwd_unlimit limit SESSIONS_PER_USER UNLIMITED;(设置不限制用户的并发会话的数目)
ALTER profile passwd_unlimit limit CPU_PER_SESSION UNLIMITED;(设置不限制会话的cpu时间限制,单位为百分之一秒)
ALTER profile passwd_unlimit limit CPU_PER_CALL UNLIMITED;(设置不限制一次性调用、解析、执行和提取的cpu时间限制)
ALTER profile passwd_unlimit limit LOGICAL_READS_PER_SESSION UNLIMITED;(指定一个会话允许读的数据块的数目,包括从内存和磁盘读的所有数据块。)
ALTER profile passwd_unlimit limit LOGICAL_READS_PER_CALL UNLIMITED;(指定一次执行SQL(解析、执行和提取)调用所允许读的数据块的最大数目。)
ALTER profile passwd_unlimit limit IDLE_TIME UNLIMITED;(指定会话允许连续不活动的总的时间,以分钟为单位,超过该时间,会话将断开。)
ALTER profile passwd_unlimit limit CONNECT_TIME UNLIMITED;(指定会话的总的连接时间,以分钟为单位。)
ALTER profile passwd_unlimit limit PRIVATE_SGA UNLIMITED;(指定一个会话可以在共享池(SGA)中所允许分配的最大空间,以字节为单位。)
2、password_parameter部分:
ALTER profile passwd_unlimit limit FAILED_LOGIN_ATTEMPTS 10 ;(指定在帐户被锁定之前所允许尝试登陆的的最大次数。)
ALTER profile passwd_unlimit limit PASSWORD_REUSE_TIME UNLIMITED;(指定了密码不能重用前的天数,必须和下面的max互相关联配置)
ALTER profile passwd_unlimit limit PASSWORD_REUSE_MAX UNLIMITED;(指定了当前密码被重用之前密码改变的次数)
ALTER profile passwd_unlimit limit PASSWORD_VERIFY_FUNCTION NULL ;(该字段允许将复杂的PL/SQL密码验证脚本做为参数传递到create profile语句)
注意:Oracle数据库提供了一个默认的脚本,但是自己可以创建自己的验证规则或使用第三方软件验证。 对Function名称,指定的是密码验证规则的名称;
.    指定为Null则意味着不使用密码验证功能。如果为密码参数指定表达式,则该表达式可以是任意格式,除了数据库 量子查询。
ALTER profile passwd_unlimit limit PASSWORD_LOCK_TIME 1 ;(指定登陆尝试失败次数到达后帐户的锁定时间,以天为单位。)
ALTER profile passwd_unlimit limit PASSWORD_GRACE_TIME 7 ;
(指定宽限天数,数据库发出警告到登陆失效前的天数。如果数据库密码在这中间没有被修改,则过期会失效。)

如此,我们可以把其它的用户密码配置成180天有效期,比如其它用户都使用DEFAULT这个profile文件:

SQL> alter profile default limit password_life_time 180; 
Profile altered.
SQL> select * from dba_profiles s where s.profile = 'DEFAULT' and resource_name = 'PASSWORD_LIFE_TIME';
PROFILE  RESOURCE_NAME        RESOURCE        LIMIT
-------- ------------------- --------------- ---------
DEFAULT  PASSWORD_LIFE_TIME   PASSWORD        180

扩展二、oracle12c基于pdb的用户密码永不过期配置

上面的方法事实上适应11g和12c,但是如果oracle12使用是基于pdb的可插播数据库配置,在查看上多了点花样,需要我们先切换到pdb终端中,我们来一起看下吧:

看之前,先了解下pdb的概念,在Oracle 12C中引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库;

oracle 11g中我们使用的实例创建创建数据库,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。

SQL> select name from V$database;
NAME
---------
EXAMPLE

而当进入ORACLE 12C后,通过cdb和pdb的新特性,实例与数据库可以是一对多的关系。

SQL> show pdbs;
 CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
 2 PDB$SEED READ ONLY NO
 3 ORCL MOUNTED
 5 PDB_TEST READ WRITE NO

当然这里我们不深究它具体怎么创建库和用户的关联,从上面可以看到pdbs中有三个pdb,其中PDB$SEED、ORCL为默认模板库,我们不用处理,PDB_TEST显然就是我们要使用的库;

①、切换到目标pdb:

SQL> alter session set container=PDB_TEST;
Session altered.

②、使用select命令查看pdb中所有用户库的account_status是否都是open状态,以及到期expipy_date和创建created的时间:

SQL> select username,expiry_date,account_status,created from dba_users where created > (select created from v$database);
USERNAME           EXPIRY_DATE    ACCOUNT_STATUS    CREATED
----------------- --------------- ------------------ -----------------------------
EWS_001                            OPEN               08-AUG-17
PDB_002                            OPEN               08-AUG-17
PDB_003                            OPEN               08-AUG-17

如果库的用户有效期时间为空,则表示永不过期,否则会显示到期时间;

③、当然我们也可以查看用户的profile文件以及profile文件指定的密码有效期设置:

SQL> select username,PROFILE from dba_users;
USERNAME             PROFILE
------------------- ----------
SYS                  DEFAULT
、、、、、、
SQL> select * from dba_profiles s where s.profile = 'DEFAULT' and resource_name = 'PASSWORD_LIFE_TIME';
PROFILE    RESOURCE_NAME       RESOURCE     LIMIT   
---------- ------------------ ------------ ------------
DEFAULT    PASSWORD_LIFE_TIME  PASSWORD     UNLIMITED
--- --- ---
COM INH IMP
--- --- ---
NO  NO  NO

④、设置password_life_time为永不过期,方法是一样的,配置完后可以通过②的语句查看下;

SQL>alter profile default limit password_life_time unlimited;
Profile altered.
注意·思考

事实上,在正常使用中,如果在起初没有配置成默认永不过期,当需要我们配置的时候,大多已经是除了问题,过了有效期限制:

可以通过上面②中语句来查询pdb用户状态

①、如果account_status状态是LOCKED,要用下面的语句先解锁,然后修改密码,再配置成永不过期;

SQL>alter user <USERNAME> account unlock;(解锁)
SQL>alter user <USERNAME> identified by <OLD_PASSWORD>;(修改密码)

注意这个密码需要使用旧密码,避免对业务的造成影响

②、如果account_status显示的状态是EXPIRED(GRACE),则直接修改密码,再配置成永不过期;

SQL>alter user <USERNAME> identified by <OLD_PASSWORD>;

③、为了更好的显示我们还可以做如下的输出配置:

SQL>set pagesize 200 #设置每面能输出的数据数目
SQL>col username for a35 #设置username的列宽
SQL>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; #设置时间输出格式

扩展三:上面两个故障针对oracle12c的pdbs配置,同样的问题在oracle 11g中思路是一样的:

①、使用如下命令查看用户的状态:(同样expiry过期时间为空则为永不过期)

SQL> select username,account_status,expiry_date,created from user_users;
USERNAME  ACCOUNT_STATUS EXPIRY_DATE   CREATED
--------------- -------------- -------------------------------- ------------
SYS                  OPEN                                                             17-SEP-11
、、、、、、

②、如果account_status显示为expired(grace)期满状态,或是数据库报ORA-28002警告,则直接修改密码在配置成永不过期;

SQL>alter user <USERNAME> identified by <OLD_PASSWORD>;

③、如果account_status显示为locked已锁状态,或是数据库报ORA-28000警告,则需要先解锁并修改密码再配置成永不过期;

SQL>alter user <USERNAME> account unlock;(解锁)
SQL>alter user <USERNAME> identified by <OLD_PASSWORD>;(修改密码)

④、当然警告ORA-28000警告导致locked状态,除了PASSWORD_LIFE_TIME时间限制外,也可能是FAILED_LOGIN_ATTEMPTS限制了密码允许错误的次数导致;

sql> ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;(设置不限制密码错误次数)
SQL>alter user <USERNAME> account unlock;(解锁)
SQL>alter user <USERNAME> identified by <OLD_PASSWORD>;(修改密码)

(好的今天就分享到这里,如果你有高见或好的分享,记得留言哦!)


原创文章,转载请注明:转自于公牛博客

本文链接地址:【oracle】数据库配置用户密码永不过期

3
祝福我们的祖国繁荣昌盛
  • 请尽情挥洒您的笔墨!

    欢迎来到公牛博客更多分享更多精彩记录美丽点亮生活

    公牛博客·统计碑运行:2842 D
    博文:213 P
    评论:1872 S