- 浏览: 797382 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (151)
- Java-Basic (25)
- Java-NIO (3)
- Java-Mybatis (4)
- Java-Web (15)
- DB-oracle (18)
- DB-mysql (29)
- DB-sqlserver (4)
- DB-postgresql (2)
- DB-SQLite (1)
- DB-H2 (6)
- Tool-Flex (1)
- Tool-Ftp (3)
- Tool-Maven (5)
- Netlink (2)
- Web-CSS (3)
- Web-UI (1)
- Web-JavaScript (8)
- NoSQL (3)
- Mina (2)
- TCPUDP (2)
- SEO (2)
- Network (6)
- DataStructure (1)
- Website-test (1)
- Tool-Excel (1)
- Java-Concurrent (2)
- 前辈指点 (0)
- Eclipse plugins (1)
- DB-NoSQL (1)
最新评论
-
18322696278:
My97DatePicker控件显示时分秒 -
dllhenu:
你好,我让ol加载tiptip,但是tiptip没有在点所在的 ...
OpenLayers下使用Jquery tooltip(Qtip)让要素信息自动显示或隐藏 -
boonya:
你所说的是网页上选择文件路径吧,用ServletFileUpl ...
Apache提供的FTP文件上传下载 -
淡然若水:
我也是用这种方法啊。。。但是FileInputStream i ...
Apache提供的FTP文件上传下载 -
liuweihug:
json序列化反序列化插件-json2.js 介绍和使用 - ...
Json 数据反序列化为Java对象
1 问题描述
接到网站运维人员报告说原来的账户不能登录到Oracle数据库了,提示密码过期。
2 原因分析
本次出问题的Oracle版本是11g,11g之前的Oracle版本的默认profile是没有密码过期限制的,而在Oracle 11g中,默认情况下profile启用的密码过期时间是180天。显然登录账号的密码已经超过180天没有修改了,所以出现了上述问题。
3 解决办法
有三种解决办法:
(1)使用sqlplus登录出问题账户,会提示设置新密码,此时重新输入密码即可,新密码可以和原来的密码相同。
(2)使用sqlplus登录管理员账户,执行 alter user 账户名 identified by 新密码,新密码可以和原来的密码相同。
(3)使用sqlplus登录管理员账户,执行 alter profile default limit password_life_time unlimited; 这会让密码没有过期限制。
4 相关知识
与密码相关的表为dba_profiles。
使用sqlplus登录管理员账户,执行 select * from dba_profiles where profile='DEFAULT' and RESOURCE_NAME like 'PASSWORD%'; 会出下如下:
PROFILE RESOURCE_NAME RESOURCE LIMIT
------------------------------ -------------------------------- -------- -----------
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 10
DEFAULT PASSWORD_LIFE_TIME PASSWORD 180
DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL
DEFAULT PASSWORD_LOCK_TIME PASSWORD 1
DEFAULT PASSWORD_GRACE_TIME PASSWORD 7
下面解释其含义:
(1)FAILED_LOGIN_ATTEMPTS 规定了登录可以失败的次数,一旦用户尝试登录错误的次数超过这个值,账户就会被锁定,只能由管理员解锁。
(2)PASSWORD_LIFE_TIME 规定了密码过期的时间长度,11g默认是180天,本文提到的问题就是在这里。
(3)PASSWORD_REUSE_TIME 规定了重新使用原来的密码时必须经过的时间,默认没有限制。
(4)PASSWORD_REUSE_MAX 规定了重新使用原来密码的次数,也就是同一个口令可以被重复设置多少次,本例没有限制,所以可以重复设置相同密码。
(5)PASSWORD_VERIFY_FUNCTION 用户自定义的密码验证规则函数,是一个PL/SQL脚本,一般不需要修改。
(6)PASSWORD_LOCK_TIME 登录失败后被锁定的用户,锁定的天数,本例中是1天。
(7)PASSWORD_GRACE_TIME 指定宽限天数,数据库发出警告到登陆失效前的天数。如果数据库密码在这中间没有被修改,则过期会失效。本例中,会在密码到期前7天开始发出警告。
附:转载一个更详细的文章,讲的非常好
http://space.itpub.net/24070945/viewspace-696077
1.用户创建语句PROFILE选项“引发的血案”
如果大家细心的话,在创建用户的语法中有这么一个选项“PROFILE profile”。
下面是Oracle 11gR2官方文档中关于创建用户的语法描述(较之10g的文档可读性加强了,当然功能也同样有所增加):
CREATE USER user
IDENTIFIED { BY password
| EXTERNALLY [ AS 'certificate_DN' | AS 'kerberos_principal_name' ]
| GLOBALLY [ AS '[ directory_DN ]' ]
}
[ DEFAULT TABLESPACE tablespace
| TEMPORARY TABLESPACE
{ tablespace | tablespace_group_name }
| { QUOTA { size_clause | UNLIMITED } ON tablespace }...
| PROFILE profile
| PASSWORD EXPIRE
| ACCOUNT { LOCK | UNLOCK }
[ DEFAULT TABLESPACE tablespace
| TEMPORARY TABLESPACE
{ tablespace | tablespace_group_name }
| { QUOTA { size_clause | UNLIMITED } ON tablespace }...
| PROFILE profile
| PASSWORD EXPIRE
| ACCOUNT { LOCK | UNLOCK }
| ENABLE EDITIONS
]...
] ;
2.提问:PROFILE选项是做什么用的呢?
回答:简要的说,PROFILE在Oracle数据库对数据库用户能够使用的资源做进一步的限制的一种手段,如对连接到某个用户的session或sql所能使用的CPU资源进行控制,又如控制Oracle用户的密码管理策略等等……
3.查看系统的默认PROFILE
1)通过dba_profiles视图查看一下系统中默认都有哪些PROFILE
数据库创建以后,系统中只会存在一个名为DEFAULT的默认PROFILE,在用户创建之后,如果不做特殊指定,每个用户的PROFILE都会默认的使用个默认的PROFILE。
sys@ora10g> select distinct profile from dba_profiles;
PROFILE
----------
DEFAULT
2)全面查看一下这个PROFILE都包含哪些限制定义
sys@ora10g> select * from dba_profiles;
PROFILE RESOURCE_NAME RESOURCE LIMIT
---------- -------------------------------- -------- -----------------
DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED
DEFAULT SESSIONS_PER_USER KERNEL UNLIMITED
DEFAULT CPU_PER_SESSION KERNEL UNLIMITED
DEFAULT CPU_PER_CALL KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED
DEFAULT IDLE_TIME KERNEL UNLIMITED
DEFAULT CONNECT_TIME KERNEL UNLIMITED
DEFAULT PRIVATE_SGA KERNEL UNLIMITED
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 10
DEFAULT PASSWORD_LIFE_TIME PASSWORD UNLIMITED
DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL
DEFAULT PASSWORD_LOCK_TIME PASSWORD UNLIMITED
DEFAULT PASSWORD_GRACE_TIME PASSWORD UNLIMITED
16 rows selected.
3)结论
通过上面的查看,可以得到这个系统默认的PROFILE “DEFAULT”的配置信息只对密码的错误尝试次数做了限制(最多可以错误输错10次密码),如果我们启用了PROFILE(下面有介绍如何启用和停止PROFILE),默认的限制只有这些。如果想要改变限制条件,有两种方法:第一种方法是可以对这个默认的PROFILE做个性化的调整;第二种方法是再重新定制一个新的PROFILE满足新的需求。
4.对创建PROFILE的标准语法做一下“解剖麻雀”(更多细节可以参考Oracle的官方文档)
1)创建PROFILE的语法如下:
CREATE PROFILE profile
LIMIT { resource_parameters 对资源的限制
| password_parameters 对密码的限制
}...
;
2)对数据库资源做限制时,下面是全部可用的参数:
{ { SESSIONS_PER_USER 每个用户名所允许的并行会话数
| CPU_PER_SESSION 一个会话一共可以使用的CPU时间,单位是百分之一秒
| CPU_PER_CALL 一次SQL调用(解析、执行和获取)允许使用的CPU时间
| CONNECT_TIME 限制会话连接时间,单位是分钟
| IDLE_TIME 允许空闲会话的时间,单位是分钟
| LOGICAL_READS_PER_SESSION 限制会话对数据块的读取,单位是块
| LOGICAL_READS_PER_CALL 限制SQL调用对数据块的读取,单位是块
| COMPOSITE_LIMIT “组合打法”
}
{ integer | UNLIMITED | DEFAULT }
| PRIVATE_SGA 限制会话在SGA中Shared Pool中私有空间的分配
{ size_clause | UNLIMITED | DEFAULT }
}
3)对密码做限制时,下面是全部可用的参数:
{ { FAILED_LOGIN_ATTEMPTS 帐户被锁定之前可以错误尝试的次数
| PASSWORD_LIFE_TIME 密码可以被使用的天数,单位是天,默认值180天
| PASSWORD_REUSE_TIME 密码可重用的间隔时间(结合PASSWORD_REUSE_MAX)
| PASSWORD_REUSE_MAX 密码的最大改变次数(结合PASSWORD_REUSE_TIME)
| PASSWORD_LOCK_TIME 超过错误尝试次数后,用户被锁定的天数,默认1天
| PASSWORD_GRACE_TIME 当密码过期之后还有多少天可以使用原密码
}
{ expr | UNLIMITED | DEFAULT }
| PASSWORD_VERIFY_FUNCTION
{ function | NULL | DEFAULT }
}
5.OK,语法已经了然于胸,那么我们来实际创建一个PROFILE(这里的名字我们称其为:sec_profile),在感性认识的同时一同探索一下在这个过程中会遇到的一些有趣现象。
1)尝试创建一个混合型的PROFILE(包含资源限制和密码限制)
sys@ora10g> CREATE PROFILE sec_profile LIMIT
2 SESSIONS_PER_USER UNLIMITED
3 CPU_PER_SESSION UNLIMITED
4 CPU_PER_CALL 6000
5 CONNECT_TIME 60
6 LOGICAL_READS_PER_SESSION DEFAULT
7 LOGICAL_READS_PER_CALL 6000
8 COMPOSITE_LIMIT 6000000
9 PRIVATE_SGA 66K
10 FAILED_LOGIN_ATTEMPTS 6
11 PASSWORD_LIFE_TIME 60
12 PASSWORD_REUSE_TIME 60
13 PASSWORD_REUSE_MAX 5
14 PASSWORD_LOCK_TIME 1/24
15 PASSWORD_GRACE_TIME 10
16 PASSWORD_VERIFY_FUNCTION verify_function
17 /
CREATE PROFILE sec_profile LIMIT
*
ERROR at line 1:
ORA-07443: function VERIFY_FUNCTION not found
2)报错原因
为什么会报错?错误提示很清楚,VERIFY_FUNCTION这个函数不存在。既然知道不存在,那我们如何创建它呢?
回答:
VERIFY_FUNCTION函数是通过utlpwdmg.sql脚本创建的,该脚本所在的目录是$ORACLE_HOME/rdbms/admin/
3)创建密码复杂性检验函数VERIFY_FUNCTION
我们使用utlpwdmg.sql脚本创建以下这个VERIFY_FUNCTION密码复杂度校验函数
sys@ora10g> @?/rdbms/admin/utlpwdmg.sql
Function created.
Profile altered.
4)utlpwdmg.sql脚本中的小秘密
细心的您在执行utlpwdmg.sql脚本的过程中一定发现了有一个“Profile altered”的提示,难道这个脚本修改了某个PROFILE信息么?正如您所料,它修改了系统的默认PROFILE “DEFAULT”,再次查看一下现在的DEFAULT的定义信息:
sys@ora10g> select * from dba_profiles;
PROFILE RESOURCE_NAME RESOURCE LIMIT
---------- -------------------------------- -------- -----------------
DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED
DEFAULT SESSIONS_PER_USER KERNEL UNLIMITED
DEFAULT CPU_PER_SESSION KERNEL UNLIMITED
DEFAULT CPU_PER_CALL KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED
DEFAULT IDLE_TIME KERNEL UNLIMITED
DEFAULT CONNECT_TIME KERNEL UNLIMITED
DEFAULT PRIVATE_SGA KERNEL UNLIMITED
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 3
DEFAULT PASSWORD_LIFE_TIME PASSWORD 60
DEFAULT PASSWORD_REUSE_TIME PASSWORD 1800
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD VERIFY_FUNCTION
DEFAULT PASSWORD_LOCK_TIME PASSWORD .0006
DEFAULT PASSWORD_GRACE_TIME PASSWORD 10
16 rows selected.
与系统创建时的DEFAULT PROFILE相比较,之前只有10次密码输入错误的限制,执行完成这个函数创建之后,我们发现系统默认的PROFILE已经对系统有了一个非常严格的约束。也就是说现在系统上的每一个用户在默认情况下都多了这些密码方面的限制。
5)验证一下新默认的PROFILE “DEFAULT”关于错误密码输入次数的限制
我们模拟一下错误输错密码三次后的效果,可以看到,在第四次输入后,sec用户被锁定了。
sys@ora10g> conn sec/a
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
sys@ora10g> conn sec/a
ERROR:
ORA-01017: invalid username/password; logon denied
sys@ora10g> conn sec/a
ERROR:
ORA-01017: invalid username/password; logon denied
sys@ora10g> conn sec/a
ERROR:
ORA-28000: the account is locked
6)使用dba_users视图比较一下用户的前后状态
用户sec已经因错误密码输入次数超过3此导致用户被锁定了,进一步比较一下用户的状态。
sys@ora10g> col USERNAME for a10
sys@ora10g> col ACCOUNT_STATUS for a20
sys@ora10g> col PROFILE for a10
sys@ora10g> select USERNAME,ACCOUNT_STATUS,LOCK_DATE,EXPIRY_DATE from dba_users where username = 'SEC';
USERNAME ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE
---------- -------------------- ------------------- -------------------
SEC OPEN
sys@ora10g> select USERNAME,ACCOUNT_STATUS,LOCK_DATE,EXPIRY_DATE from dba_users where username = 'SEC';
USERNAME ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE
---------- -------------------- ------------------- -------------------
SEC LOCKED(TIMED) 2009-10-11 16:05:03 2009-12-09 08:46:36
7)既然默认的PROFILE发生了变化,那么就会面临一个实际问题,如何恢复成原始状态呢?这里给出一个比较简单的方法,就是使用ALTER PROFILE命令修改成原来的模样
sys@ora10g> ALTER PROFILE DEFAULT LIMIT
2 COMPOSITE_LIMIT UNLIMITED
3 SESSIONS_PER_USER UNLIMITED
4 CPU_PER_SESSION UNLIMITED
5 CPU_PER_CALL UNLIMITED
6 LOGICAL_READS_PER_SESSION UNLIMITED
7 LOGICAL_READS_PER_CALL UNLIMITED
8 IDLE_TIME UNLIMITED
9 CONNECT_TIME UNLIMITED
10 PRIVATE_SGA UNLIMITED
11 FAILED_LOGIN_ATTEMPTS 10
12 PASSWORD_LIFE_TIME UNLIMITED
13 PASSWORD_REUSE_TIME UNLIMITED
14 PASSWORD_REUSE_MAX UNLIMITED
15 PASSWORD_VERIFY_FUNCTION NULL
16 PASSWORD_LOCK_TIME UNLIMITED
17 PASSWORD_GRACE_TIME UNLIMITED
18 /
Profile altered.
8)最后我们重新创建一下这个实验PROFILE:sec_profile,可以预测,这次一定会成功滴~~~
sys@ora10g> CREATE PROFILE sec_profile LIMIT
2 SESSIONS_PER_USER UNLIMITED
3 CPU_PER_SESSION UNLIMITED
4 CPU_PER_CALL 6000
5 CONNECT_TIME 60
6 LOGICAL_READS_PER_SESSION DEFAULT
7 LOGICAL_READS_PER_CALL 6000
8 COMPOSITE_LIMIT 6000000
9 PRIVATE_SGA 66K
10 FAILED_LOGIN_ATTEMPTS 6
11 PASSWORD_LIFE_TIME 60
12 PASSWORD_REUSE_TIME 60
13 PASSWORD_REUSE_MAX 5
14 PASSWORD_LOCK_TIME 1/24
15 PASSWORD_GRACE_TIME 10
16 PASSWORD_VERIFY_FUNCTION verify_function
17 /
Profile created.
创建成功鸟~~
在这个实验中,我们使用了PROFILE几乎所有的参数,惟一没有包含的参数是IDLE_TIME,目的仅仅是为了说明一个细节:如果该PROFILE被授权给用户后,这个被省略的IDLE_TIME参数将继承默认PROFILE “DEFALT”中的定义。
对上面我们创建的PROFILE逐行做一下诠释,以便加深理解:
第 2行:对用户的并发连接会话数不做限制
第 3行:对于连接到用户的每一个session的CPU时间的使用不做限制
第 4行:一次调用消耗的CPU时间不能超过60秒(不超过一分钟)
第 5行:连接到用户的每次会话时间不能超过60分钟(不超过一个小时)
第 6行:一次会话使用的物理读与逻辑读数据块总量与DEFAULT profile中定义保持一致
第 7行:一次调用使用的物理读与逻辑读数据块总量不超过6000个数据块
第 8行:一次会话总的资源消耗不超过6000000个服务单元(service units)
第 9行:一次会话在SGA中不能分配超过66K的空间
第10行:帐户被锁定之前允许6次的错误尝试
第11行:超过此生命周期后密码作废
第12行:密码重用时间60天
第13行:密码重用之前密码需要完成5次改变
第14行:超过错误尝试次数后,用户将被锁定1小时
第15行:当密码过期之后原密码还可以使用10天
第16行:使用密码复杂度校验函数verify_function对密码做检查
再单独深入解释一下第12行和13行组合搭配之后的含义:也就是说只有完成了5次的密码修改后并且已经超过60天后,之前的密码才能够再一次被使用。
9)通过dba_profiles视图再一次查看一下此时系统中存在的PROFILE的信息
sys@ora10g> col PROFILE for a12
sys@ora10g> col RESOURCE_NAME for a25
sys@ora10g> col LIMIT for a15
sys@ora10g> select * from dba_profiles order by 1,2;
PROFILE RESOURCE_NAME RESOURCE LIMIT
------------ ------------------------- -------- ---------------
DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED
DEFAULT CONNECT_TIME KERNEL UNLIMITED
DEFAULT CPU_PER_CALL KERNEL UNLIMITED
DEFAULT CPU_PER_SESSION KERNEL UNLIMITED
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 3
DEFAULT IDLE_TIME KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITED
DEFAULT PASSWORD_GRACE_TIME PASSWORD 10
DEFAULT PASSWORD_LIFE_TIME PASSWORD 60
DEFAULT PASSWORD_LOCK_TIME PASSWORD .0006
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
DEFAULT PASSWORD_REUSE_TIME PASSWORD 1800
DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD VERIFY_FUNCTION
DEFAULT PRIVATE_SGA KERNEL UNLIMITED
DEFAULT SESSIONS_PER_USER KERNEL UNLIMITED
SEC_PROFILE COMPOSITE_LIMIT KERNEL 5000000
SEC_PROFILE CONNECT_TIME KERNEL 45
SEC_PROFILE CPU_PER_CALL KERNEL 3000
SEC_PROFILE CPU_PER_SESSION KERNEL UNLIMITED
SEC_PROFILE FAILED_LOGIN_ATTEMPTS PASSWORD 5
SEC_PROFILE IDLE_TIME KERNEL DEFAULT
SEC_PROFILE LOGICAL_READS_PER_CALL KERNEL 1000
SEC_PROFILE LOGICAL_READS_PER_SESSION KERNEL DEFAULT
SEC_PROFILE PASSWORD_GRACE_TIME PASSWORD 10
SEC_PROFILE PASSWORD_LIFE_TIME PASSWORD 60
SEC_PROFILE PASSWORD_LOCK_TIME PASSWORD .0416
SEC_PROFILE PASSWORD_REUSE_MAX PASSWORD 5
SEC_PROFILE PASSWORD_REUSE_TIME PASSWORD 60
SEC_PROFILE PASSWORD_VERIFY_FUNCTION PASSWORD VERIFY_FUNCTION
SEC_PROFILE PRIVATE_SGA KERNEL 15360
SEC_PROFILE SESSIONS_PER_USER KERNEL UNLIMITED
32 rows selected.
10)删除PROFILE
既然有创建,就一定对应着删除,删除方法很简单,语法如下:
DROP PROFILE profile [ CASCADE ] ;
如果创建的PROFILE已经授权给了具体的用户,则需要使用CASCADE选项级联的收回相应的限制信息,在收回这些限制信息之后将会以系统默认的PROFILE对该用户进行限制。
删除示例如下:
sys@ora10g> drop profile SEC_PROFILE cascade;
Profile dropped.
如果该PROFILE已经授权给具体的用户,使用不带有cascade选项的删除命令将得到如下的报错信息:
sys@ora10g> drop profile SEC_PROFILE;
drop profile SEC_PROFILE
*
ERROR at line 1:
ORA-02382: profile SEC_PROFILE has users assigned, cannot drop without CASCADE
6.关于PROFILE内容何时生效的一点注意事项
这里讨论需要谈到一个系统参数,它就是resource_limit。
如果要开启“资源限制”的话,这个参数必须是“TRUE”的状态
sys@ora10g> show parameter resource_limit
NAME TYPE VALUE
--------------- -------------------- ----------------------
resource_limit boolean FALSE
这里有一个小细节不得不提:
之所以称这个参数为resource_limit(资源限制)而没有称作“profile_limit”,是因为这个参数只对PROFILE中的资源限制部分起作用,如果是默认的FALSE状态,表示PROFILE定义中的资源限制条件不起作用,只有该参数为TRUE时,资源限制的定义才生效。
不过,关于PROFILE中密码限制的条件则与这个参数无关,无论这个参数设置为什么值,有关密码限制的条件都会默认生效,从这个细节上可以看出来Oracle对用户密码的重视程度。
因此关于PROFILE的生效情况结论是:
1)用户所有拥有的PROFILE中有关密码的限制永远生效,不受限制。
2)用户所有拥有的PROFILE中有关资源的限制与resource_limit参数的设置有关,当为TRUE时生效,当为FALSE时(默认值是FALSE)无效。
7.一切都OK了,最后我们来演示一下将新创建的PROFILE sec_profile指定给具体用户sec的操作
sys@ora10g> alter user sec profile sec_profile;
User altered.
sys@ora10g> select USERNAME,PROFILE from dba_users where USERNAME = 'SEC';
USERNAME PROFILE
---------- ------------
SEC SEC_PROFILE
8.【附】密码验证函数VERIFY_FUNCTION的创建脚本内容utlpwdmg.sql,供参考。
ora10g@secDB /home/oracle$ cat $ORACLE_HOME/rdbms/admin/utlpwdmg.sql
Rem
Rem $Header: utlpwdmg.sql 31-aug-2000.11:00:47 nireland Exp $
Rem
Rem utlpwdmg.sql
Rem
Rem Copyright (c) Oracle Corporation 1996, 2000. All Rights Reserved.
Rem
Rem NAME
Rem utlpwdmg.sql - script. for Default Password Resource Limits
Rem
Rem DESCRIPTION
Rem This is a script. for enabling the password management features
Rem by setting the default password resource limits.
Rem
Rem NOTES
Rem This file contains a function for minimum checking of password
Rem complexity. This is more of a sample function that the customer
Rem can use to develop the function for actual complexity checks that the
Rem customer wants to make on the new password.
Rem
Rem MODIFIED (MM/DD/YY)
Rem nireland 08/31/00 - Improve check for username=password. #1390553
Rem nireland 06/28/00 - Fix null old password test. #1341892
Rem asurpur 04/17/97 - Fix for bug479763
Rem asurpur 12/12/96 - Changing the name of password_verify_function
Rem asurpur 05/30/96 - New script. for default password management
Rem asurpur 05/30/96 - Created
Rem
-- This script. sets the default password resource parameters
-- This script. needs to be run to enable the password features.
-- However the default resource parameters can be changed based
-- on the need.
-- A default password complexity function is also provided.
-- This function makes the minimum complexity checks like
-- the minimum length of the password, password not same as the
-- username, etc. The user may enhance this function according to
-- the need.
-- This function must be created in SYS schema.
-- connect sys/<password> as sysdba before running the script
CREATE OR REPLACE FUNCTION verify_function
(username varchar2,
password varchar2,
old_password varchar2)
RETURN boolean IS
n boolean;
m integer;
differ integer;
isdigit boolean;
ischar boolean;
ispunct boolean;
digitarray varchar2(20);
punctarray varchar2(25);
chararray varchar2(52);
BEGIN
digitarray:= '0123456789';
chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
punctarray:='!"#$%&()``*+,-/:;<=>?_';
-- Check if the password is same as the username
IF NLS_LOWER(password) = NLS_LOWER(username) THEN
raise_application_error(-20001, 'Password same as or similar to user');
END IF;
-- Check for the minimum length of the password
IF length(password) < 4 THEN
raise_application_error(-20002, 'Password length less than 4');
END IF;
-- Check if the password is too simple. A dictionary of words may be
-- maintained and a check may be made so as not to allow the words
-- that are too simple for the password.
IF NLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password', 'oracle', 'computer', 'abcd') THEN
raise_application_error(-20002, 'Password too simple');
END IF;
-- Check if the password contains at least one letter, one digit and one
-- punctuation mark.
-- 1. Check for the digit
isdigit:=FALSE;
m := length(password);
FOR i IN 1..10 LOOP
FOR j IN 1..m LOOP
IF substr(password,j,1) = substr(digitarray,i,1) THEN
isdigit:=TRUE;
GOTO findchar;
END IF;
END LOOP;
END LOOP;
IF isdigit = FALSE THEN
raise_application_error(-20003, 'Password should contain at least one digit, one character and one punctuation');
END IF;
-- 2. Check for the character
<<findchar>>
ischar:=FALSE;
FOR i IN 1..length(chararray) LOOP
FOR j IN 1..m LOOP
IF substr(password,j,1) = substr(chararray,i,1) THEN
ischar:=TRUE;
GOTO findpunct;
END IF;
END LOOP;
END LOOP;
IF ischar = FALSE THEN
raise_application_error(-20003, 'Password should contain at least one \
digit, one character and one punctuation');
END IF;
-- 3. Check for the punctuation
<<findpunct>>
ispunct:=FALSE;
FOR i IN 1..length(punctarray) LOOP
FOR j IN 1..m LOOP
IF substr(password,j,1) = substr(punctarray,i,1) THEN
ispunct:=TRUE;
GOTO endsearch;
END IF;
END LOOP;
END LOOP;
IF ispunct = FALSE THEN
raise_application_error(-20003, 'Password should contain at least one \
digit, one character and one punctuation');
END IF;
<<endsearch>>
-- Check if the password differs from the previous password by at least
-- 3 letters
IF old_password IS NOT NULL THEN
differ := length(old_password) - length(password);
IF abs(differ) < 3 THEN
IF length(password) < length(old_password) THEN
m := length(password);
ELSE
m := length(old_password);
END IF;
differ := abs(differ);
FOR i IN 1..m LOOP
IF substr(password,i,1) != substr(old_password,i,1) THEN
differ := differ + 1;
END IF;
END LOOP;
IF differ < 3 THEN
raise_application_error(-20004, 'Password should differ by at \
least 3 characters');
END IF;
END IF;
END IF;
-- Everything is fine; return TRUE ;
RETURN(TRUE);
END;
/
-- This script. alters the default parameters for Password Management
-- This means that all the users on the system have Password Management
-- enabled and set to the following values unless another profile is
-- created with parameter values set to different value or UNLIMITED
-- is created and assigned to the user.
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10
PASSWORD_REUSE_TIME 1800
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1/1440
PASSWORD_VERIFY_FUNCTION verify_function;
仔细阅读上面的脚本,您可以得到关于verify_function函数的密码复杂性校验规则如下:
1)密码最小长度为4个字符
2)密码不能和用户名相同
3)密码要包含至少一个字符、一个数字和一个特殊字符
4)密码需要至少有3个字符与之前的口令不相同
9.小结
通过PROFILE对用户的资源和登录密码的限制方法使用起来还是很贴心的,毕竟Oracle提供了这样一种便捷的管理手段,对付数据库方面的一般性审计还是游刃有余的,即使这些规则仍然不能满足需求,Oracle也提供了添加和修改的接口,以便按需定制,当然会有一定的开发周期和成本。
Oracle对数据库的安全性方面提供了非常多的手段来保证,如审计和权限控制等优秀手段。对于一个商业数据库的安全性审计是非常重要的,如果后台的数据库存在安全隐患,可以说必定会带来一场浩劫,只是早晚的事情。如果您是一名维护DBA,一定要从数据库的安全性上多多动脑筋,不要等待问题出现了才恍然大悟:哇塞,原来Oracle同学早就有补救的措施啦!
BTW:关于权限控制的策略在使用前一定要做好充分的测试,确保对每一条限制规则理解透彻,不然会带来不必要的麻烦,另外一个经验就是:将每一步的限制规则记录到一个特定的数据库维护手册中,方便查询,同时也便于知识的传承,利己利人,“好事两桩".
原文地址:
http://blog.csdn.net/smstong/article/details/8055292
接到网站运维人员报告说原来的账户不能登录到Oracle数据库了,提示密码过期。
2 原因分析
本次出问题的Oracle版本是11g,11g之前的Oracle版本的默认profile是没有密码过期限制的,而在Oracle 11g中,默认情况下profile启用的密码过期时间是180天。显然登录账号的密码已经超过180天没有修改了,所以出现了上述问题。
3 解决办法
有三种解决办法:
(1)使用sqlplus登录出问题账户,会提示设置新密码,此时重新输入密码即可,新密码可以和原来的密码相同。
(2)使用sqlplus登录管理员账户,执行 alter user 账户名 identified by 新密码,新密码可以和原来的密码相同。
(3)使用sqlplus登录管理员账户,执行 alter profile default limit password_life_time unlimited; 这会让密码没有过期限制。
4 相关知识
与密码相关的表为dba_profiles。
使用sqlplus登录管理员账户,执行 select * from dba_profiles where profile='DEFAULT' and RESOURCE_NAME like 'PASSWORD%'; 会出下如下:
PROFILE RESOURCE_NAME RESOURCE LIMIT
------------------------------ -------------------------------- -------- -----------
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 10
DEFAULT PASSWORD_LIFE_TIME PASSWORD 180
DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL
DEFAULT PASSWORD_LOCK_TIME PASSWORD 1
DEFAULT PASSWORD_GRACE_TIME PASSWORD 7
下面解释其含义:
(1)FAILED_LOGIN_ATTEMPTS 规定了登录可以失败的次数,一旦用户尝试登录错误的次数超过这个值,账户就会被锁定,只能由管理员解锁。
(2)PASSWORD_LIFE_TIME 规定了密码过期的时间长度,11g默认是180天,本文提到的问题就是在这里。
(3)PASSWORD_REUSE_TIME 规定了重新使用原来的密码时必须经过的时间,默认没有限制。
(4)PASSWORD_REUSE_MAX 规定了重新使用原来密码的次数,也就是同一个口令可以被重复设置多少次,本例没有限制,所以可以重复设置相同密码。
(5)PASSWORD_VERIFY_FUNCTION 用户自定义的密码验证规则函数,是一个PL/SQL脚本,一般不需要修改。
(6)PASSWORD_LOCK_TIME 登录失败后被锁定的用户,锁定的天数,本例中是1天。
(7)PASSWORD_GRACE_TIME 指定宽限天数,数据库发出警告到登陆失效前的天数。如果数据库密码在这中间没有被修改,则过期会失效。本例中,会在密码到期前7天开始发出警告。
附:转载一个更详细的文章,讲的非常好
http://space.itpub.net/24070945/viewspace-696077
1.用户创建语句PROFILE选项“引发的血案”
如果大家细心的话,在创建用户的语法中有这么一个选项“PROFILE profile”。
下面是Oracle 11gR2官方文档中关于创建用户的语法描述(较之10g的文档可读性加强了,当然功能也同样有所增加):
CREATE USER user
IDENTIFIED { BY password
| EXTERNALLY [ AS 'certificate_DN' | AS 'kerberos_principal_name' ]
| GLOBALLY [ AS '[ directory_DN ]' ]
}
[ DEFAULT TABLESPACE tablespace
| TEMPORARY TABLESPACE
{ tablespace | tablespace_group_name }
| { QUOTA { size_clause | UNLIMITED } ON tablespace }...
| PROFILE profile
| PASSWORD EXPIRE
| ACCOUNT { LOCK | UNLOCK }
[ DEFAULT TABLESPACE tablespace
| TEMPORARY TABLESPACE
{ tablespace | tablespace_group_name }
| { QUOTA { size_clause | UNLIMITED } ON tablespace }...
| PROFILE profile
| PASSWORD EXPIRE
| ACCOUNT { LOCK | UNLOCK }
| ENABLE EDITIONS
]...
] ;
2.提问:PROFILE选项是做什么用的呢?
回答:简要的说,PROFILE在Oracle数据库对数据库用户能够使用的资源做进一步的限制的一种手段,如对连接到某个用户的session或sql所能使用的CPU资源进行控制,又如控制Oracle用户的密码管理策略等等……
3.查看系统的默认PROFILE
1)通过dba_profiles视图查看一下系统中默认都有哪些PROFILE
数据库创建以后,系统中只会存在一个名为DEFAULT的默认PROFILE,在用户创建之后,如果不做特殊指定,每个用户的PROFILE都会默认的使用个默认的PROFILE。
sys@ora10g> select distinct profile from dba_profiles;
PROFILE
----------
DEFAULT
2)全面查看一下这个PROFILE都包含哪些限制定义
sys@ora10g> select * from dba_profiles;
PROFILE RESOURCE_NAME RESOURCE LIMIT
---------- -------------------------------- -------- -----------------
DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED
DEFAULT SESSIONS_PER_USER KERNEL UNLIMITED
DEFAULT CPU_PER_SESSION KERNEL UNLIMITED
DEFAULT CPU_PER_CALL KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED
DEFAULT IDLE_TIME KERNEL UNLIMITED
DEFAULT CONNECT_TIME KERNEL UNLIMITED
DEFAULT PRIVATE_SGA KERNEL UNLIMITED
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 10
DEFAULT PASSWORD_LIFE_TIME PASSWORD UNLIMITED
DEFAULT PASSWORD_REUSE_TIME PASSWORD UNLIMITED
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD NULL
DEFAULT PASSWORD_LOCK_TIME PASSWORD UNLIMITED
DEFAULT PASSWORD_GRACE_TIME PASSWORD UNLIMITED
16 rows selected.
3)结论
通过上面的查看,可以得到这个系统默认的PROFILE “DEFAULT”的配置信息只对密码的错误尝试次数做了限制(最多可以错误输错10次密码),如果我们启用了PROFILE(下面有介绍如何启用和停止PROFILE),默认的限制只有这些。如果想要改变限制条件,有两种方法:第一种方法是可以对这个默认的PROFILE做个性化的调整;第二种方法是再重新定制一个新的PROFILE满足新的需求。
4.对创建PROFILE的标准语法做一下“解剖麻雀”(更多细节可以参考Oracle的官方文档)
1)创建PROFILE的语法如下:
CREATE PROFILE profile
LIMIT { resource_parameters 对资源的限制
| password_parameters 对密码的限制
}...
;
2)对数据库资源做限制时,下面是全部可用的参数:
{ { SESSIONS_PER_USER 每个用户名所允许的并行会话数
| CPU_PER_SESSION 一个会话一共可以使用的CPU时间,单位是百分之一秒
| CPU_PER_CALL 一次SQL调用(解析、执行和获取)允许使用的CPU时间
| CONNECT_TIME 限制会话连接时间,单位是分钟
| IDLE_TIME 允许空闲会话的时间,单位是分钟
| LOGICAL_READS_PER_SESSION 限制会话对数据块的读取,单位是块
| LOGICAL_READS_PER_CALL 限制SQL调用对数据块的读取,单位是块
| COMPOSITE_LIMIT “组合打法”
}
{ integer | UNLIMITED | DEFAULT }
| PRIVATE_SGA 限制会话在SGA中Shared Pool中私有空间的分配
{ size_clause | UNLIMITED | DEFAULT }
}
3)对密码做限制时,下面是全部可用的参数:
{ { FAILED_LOGIN_ATTEMPTS 帐户被锁定之前可以错误尝试的次数
| PASSWORD_LIFE_TIME 密码可以被使用的天数,单位是天,默认值180天
| PASSWORD_REUSE_TIME 密码可重用的间隔时间(结合PASSWORD_REUSE_MAX)
| PASSWORD_REUSE_MAX 密码的最大改变次数(结合PASSWORD_REUSE_TIME)
| PASSWORD_LOCK_TIME 超过错误尝试次数后,用户被锁定的天数,默认1天
| PASSWORD_GRACE_TIME 当密码过期之后还有多少天可以使用原密码
}
{ expr | UNLIMITED | DEFAULT }
| PASSWORD_VERIFY_FUNCTION
{ function | NULL | DEFAULT }
}
5.OK,语法已经了然于胸,那么我们来实际创建一个PROFILE(这里的名字我们称其为:sec_profile),在感性认识的同时一同探索一下在这个过程中会遇到的一些有趣现象。
1)尝试创建一个混合型的PROFILE(包含资源限制和密码限制)
sys@ora10g> CREATE PROFILE sec_profile LIMIT
2 SESSIONS_PER_USER UNLIMITED
3 CPU_PER_SESSION UNLIMITED
4 CPU_PER_CALL 6000
5 CONNECT_TIME 60
6 LOGICAL_READS_PER_SESSION DEFAULT
7 LOGICAL_READS_PER_CALL 6000
8 COMPOSITE_LIMIT 6000000
9 PRIVATE_SGA 66K
10 FAILED_LOGIN_ATTEMPTS 6
11 PASSWORD_LIFE_TIME 60
12 PASSWORD_REUSE_TIME 60
13 PASSWORD_REUSE_MAX 5
14 PASSWORD_LOCK_TIME 1/24
15 PASSWORD_GRACE_TIME 10
16 PASSWORD_VERIFY_FUNCTION verify_function
17 /
CREATE PROFILE sec_profile LIMIT
*
ERROR at line 1:
ORA-07443: function VERIFY_FUNCTION not found
2)报错原因
为什么会报错?错误提示很清楚,VERIFY_FUNCTION这个函数不存在。既然知道不存在,那我们如何创建它呢?
回答:
VERIFY_FUNCTION函数是通过utlpwdmg.sql脚本创建的,该脚本所在的目录是$ORACLE_HOME/rdbms/admin/
3)创建密码复杂性检验函数VERIFY_FUNCTION
我们使用utlpwdmg.sql脚本创建以下这个VERIFY_FUNCTION密码复杂度校验函数
sys@ora10g> @?/rdbms/admin/utlpwdmg.sql
Function created.
Profile altered.
4)utlpwdmg.sql脚本中的小秘密
细心的您在执行utlpwdmg.sql脚本的过程中一定发现了有一个“Profile altered”的提示,难道这个脚本修改了某个PROFILE信息么?正如您所料,它修改了系统的默认PROFILE “DEFAULT”,再次查看一下现在的DEFAULT的定义信息:
sys@ora10g> select * from dba_profiles;
PROFILE RESOURCE_NAME RESOURCE LIMIT
---------- -------------------------------- -------- -----------------
DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED
DEFAULT SESSIONS_PER_USER KERNEL UNLIMITED
DEFAULT CPU_PER_SESSION KERNEL UNLIMITED
DEFAULT CPU_PER_CALL KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED
DEFAULT IDLE_TIME KERNEL UNLIMITED
DEFAULT CONNECT_TIME KERNEL UNLIMITED
DEFAULT PRIVATE_SGA KERNEL UNLIMITED
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 3
DEFAULT PASSWORD_LIFE_TIME PASSWORD 60
DEFAULT PASSWORD_REUSE_TIME PASSWORD 1800
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD VERIFY_FUNCTION
DEFAULT PASSWORD_LOCK_TIME PASSWORD .0006
DEFAULT PASSWORD_GRACE_TIME PASSWORD 10
16 rows selected.
与系统创建时的DEFAULT PROFILE相比较,之前只有10次密码输入错误的限制,执行完成这个函数创建之后,我们发现系统默认的PROFILE已经对系统有了一个非常严格的约束。也就是说现在系统上的每一个用户在默认情况下都多了这些密码方面的限制。
5)验证一下新默认的PROFILE “DEFAULT”关于错误密码输入次数的限制
我们模拟一下错误输错密码三次后的效果,可以看到,在第四次输入后,sec用户被锁定了。
sys@ora10g> conn sec/a
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
sys@ora10g> conn sec/a
ERROR:
ORA-01017: invalid username/password; logon denied
sys@ora10g> conn sec/a
ERROR:
ORA-01017: invalid username/password; logon denied
sys@ora10g> conn sec/a
ERROR:
ORA-28000: the account is locked
6)使用dba_users视图比较一下用户的前后状态
用户sec已经因错误密码输入次数超过3此导致用户被锁定了,进一步比较一下用户的状态。
sys@ora10g> col USERNAME for a10
sys@ora10g> col ACCOUNT_STATUS for a20
sys@ora10g> col PROFILE for a10
sys@ora10g> select USERNAME,ACCOUNT_STATUS,LOCK_DATE,EXPIRY_DATE from dba_users where username = 'SEC';
USERNAME ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE
---------- -------------------- ------------------- -------------------
SEC OPEN
sys@ora10g> select USERNAME,ACCOUNT_STATUS,LOCK_DATE,EXPIRY_DATE from dba_users where username = 'SEC';
USERNAME ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE
---------- -------------------- ------------------- -------------------
SEC LOCKED(TIMED) 2009-10-11 16:05:03 2009-12-09 08:46:36
7)既然默认的PROFILE发生了变化,那么就会面临一个实际问题,如何恢复成原始状态呢?这里给出一个比较简单的方法,就是使用ALTER PROFILE命令修改成原来的模样
sys@ora10g> ALTER PROFILE DEFAULT LIMIT
2 COMPOSITE_LIMIT UNLIMITED
3 SESSIONS_PER_USER UNLIMITED
4 CPU_PER_SESSION UNLIMITED
5 CPU_PER_CALL UNLIMITED
6 LOGICAL_READS_PER_SESSION UNLIMITED
7 LOGICAL_READS_PER_CALL UNLIMITED
8 IDLE_TIME UNLIMITED
9 CONNECT_TIME UNLIMITED
10 PRIVATE_SGA UNLIMITED
11 FAILED_LOGIN_ATTEMPTS 10
12 PASSWORD_LIFE_TIME UNLIMITED
13 PASSWORD_REUSE_TIME UNLIMITED
14 PASSWORD_REUSE_MAX UNLIMITED
15 PASSWORD_VERIFY_FUNCTION NULL
16 PASSWORD_LOCK_TIME UNLIMITED
17 PASSWORD_GRACE_TIME UNLIMITED
18 /
Profile altered.
8)最后我们重新创建一下这个实验PROFILE:sec_profile,可以预测,这次一定会成功滴~~~
sys@ora10g> CREATE PROFILE sec_profile LIMIT
2 SESSIONS_PER_USER UNLIMITED
3 CPU_PER_SESSION UNLIMITED
4 CPU_PER_CALL 6000
5 CONNECT_TIME 60
6 LOGICAL_READS_PER_SESSION DEFAULT
7 LOGICAL_READS_PER_CALL 6000
8 COMPOSITE_LIMIT 6000000
9 PRIVATE_SGA 66K
10 FAILED_LOGIN_ATTEMPTS 6
11 PASSWORD_LIFE_TIME 60
12 PASSWORD_REUSE_TIME 60
13 PASSWORD_REUSE_MAX 5
14 PASSWORD_LOCK_TIME 1/24
15 PASSWORD_GRACE_TIME 10
16 PASSWORD_VERIFY_FUNCTION verify_function
17 /
Profile created.
创建成功鸟~~
在这个实验中,我们使用了PROFILE几乎所有的参数,惟一没有包含的参数是IDLE_TIME,目的仅仅是为了说明一个细节:如果该PROFILE被授权给用户后,这个被省略的IDLE_TIME参数将继承默认PROFILE “DEFALT”中的定义。
对上面我们创建的PROFILE逐行做一下诠释,以便加深理解:
第 2行:对用户的并发连接会话数不做限制
第 3行:对于连接到用户的每一个session的CPU时间的使用不做限制
第 4行:一次调用消耗的CPU时间不能超过60秒(不超过一分钟)
第 5行:连接到用户的每次会话时间不能超过60分钟(不超过一个小时)
第 6行:一次会话使用的物理读与逻辑读数据块总量与DEFAULT profile中定义保持一致
第 7行:一次调用使用的物理读与逻辑读数据块总量不超过6000个数据块
第 8行:一次会话总的资源消耗不超过6000000个服务单元(service units)
第 9行:一次会话在SGA中不能分配超过66K的空间
第10行:帐户被锁定之前允许6次的错误尝试
第11行:超过此生命周期后密码作废
第12行:密码重用时间60天
第13行:密码重用之前密码需要完成5次改变
第14行:超过错误尝试次数后,用户将被锁定1小时
第15行:当密码过期之后原密码还可以使用10天
第16行:使用密码复杂度校验函数verify_function对密码做检查
再单独深入解释一下第12行和13行组合搭配之后的含义:也就是说只有完成了5次的密码修改后并且已经超过60天后,之前的密码才能够再一次被使用。
9)通过dba_profiles视图再一次查看一下此时系统中存在的PROFILE的信息
sys@ora10g> col PROFILE for a12
sys@ora10g> col RESOURCE_NAME for a25
sys@ora10g> col LIMIT for a15
sys@ora10g> select * from dba_profiles order by 1,2;
PROFILE RESOURCE_NAME RESOURCE LIMIT
------------ ------------------------- -------- ---------------
DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED
DEFAULT CONNECT_TIME KERNEL UNLIMITED
DEFAULT CPU_PER_CALL KERNEL UNLIMITED
DEFAULT CPU_PER_SESSION KERNEL UNLIMITED
DEFAULT FAILED_LOGIN_ATTEMPTS PASSWORD 3
DEFAULT IDLE_TIME KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED
DEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITED
DEFAULT PASSWORD_GRACE_TIME PASSWORD 10
DEFAULT PASSWORD_LIFE_TIME PASSWORD 60
DEFAULT PASSWORD_LOCK_TIME PASSWORD .0006
DEFAULT PASSWORD_REUSE_MAX PASSWORD UNLIMITED
DEFAULT PASSWORD_REUSE_TIME PASSWORD 1800
DEFAULT PASSWORD_VERIFY_FUNCTION PASSWORD VERIFY_FUNCTION
DEFAULT PRIVATE_SGA KERNEL UNLIMITED
DEFAULT SESSIONS_PER_USER KERNEL UNLIMITED
SEC_PROFILE COMPOSITE_LIMIT KERNEL 5000000
SEC_PROFILE CONNECT_TIME KERNEL 45
SEC_PROFILE CPU_PER_CALL KERNEL 3000
SEC_PROFILE CPU_PER_SESSION KERNEL UNLIMITED
SEC_PROFILE FAILED_LOGIN_ATTEMPTS PASSWORD 5
SEC_PROFILE IDLE_TIME KERNEL DEFAULT
SEC_PROFILE LOGICAL_READS_PER_CALL KERNEL 1000
SEC_PROFILE LOGICAL_READS_PER_SESSION KERNEL DEFAULT
SEC_PROFILE PASSWORD_GRACE_TIME PASSWORD 10
SEC_PROFILE PASSWORD_LIFE_TIME PASSWORD 60
SEC_PROFILE PASSWORD_LOCK_TIME PASSWORD .0416
SEC_PROFILE PASSWORD_REUSE_MAX PASSWORD 5
SEC_PROFILE PASSWORD_REUSE_TIME PASSWORD 60
SEC_PROFILE PASSWORD_VERIFY_FUNCTION PASSWORD VERIFY_FUNCTION
SEC_PROFILE PRIVATE_SGA KERNEL 15360
SEC_PROFILE SESSIONS_PER_USER KERNEL UNLIMITED
32 rows selected.
10)删除PROFILE
既然有创建,就一定对应着删除,删除方法很简单,语法如下:
DROP PROFILE profile [ CASCADE ] ;
如果创建的PROFILE已经授权给了具体的用户,则需要使用CASCADE选项级联的收回相应的限制信息,在收回这些限制信息之后将会以系统默认的PROFILE对该用户进行限制。
删除示例如下:
sys@ora10g> drop profile SEC_PROFILE cascade;
Profile dropped.
如果该PROFILE已经授权给具体的用户,使用不带有cascade选项的删除命令将得到如下的报错信息:
sys@ora10g> drop profile SEC_PROFILE;
drop profile SEC_PROFILE
*
ERROR at line 1:
ORA-02382: profile SEC_PROFILE has users assigned, cannot drop without CASCADE
6.关于PROFILE内容何时生效的一点注意事项
这里讨论需要谈到一个系统参数,它就是resource_limit。
如果要开启“资源限制”的话,这个参数必须是“TRUE”的状态
sys@ora10g> show parameter resource_limit
NAME TYPE VALUE
--------------- -------------------- ----------------------
resource_limit boolean FALSE
这里有一个小细节不得不提:
之所以称这个参数为resource_limit(资源限制)而没有称作“profile_limit”,是因为这个参数只对PROFILE中的资源限制部分起作用,如果是默认的FALSE状态,表示PROFILE定义中的资源限制条件不起作用,只有该参数为TRUE时,资源限制的定义才生效。
不过,关于PROFILE中密码限制的条件则与这个参数无关,无论这个参数设置为什么值,有关密码限制的条件都会默认生效,从这个细节上可以看出来Oracle对用户密码的重视程度。
因此关于PROFILE的生效情况结论是:
1)用户所有拥有的PROFILE中有关密码的限制永远生效,不受限制。
2)用户所有拥有的PROFILE中有关资源的限制与resource_limit参数的设置有关,当为TRUE时生效,当为FALSE时(默认值是FALSE)无效。
7.一切都OK了,最后我们来演示一下将新创建的PROFILE sec_profile指定给具体用户sec的操作
sys@ora10g> alter user sec profile sec_profile;
User altered.
sys@ora10g> select USERNAME,PROFILE from dba_users where USERNAME = 'SEC';
USERNAME PROFILE
---------- ------------
SEC SEC_PROFILE
8.【附】密码验证函数VERIFY_FUNCTION的创建脚本内容utlpwdmg.sql,供参考。
ora10g@secDB /home/oracle$ cat $ORACLE_HOME/rdbms/admin/utlpwdmg.sql
Rem
Rem $Header: utlpwdmg.sql 31-aug-2000.11:00:47 nireland Exp $
Rem
Rem utlpwdmg.sql
Rem
Rem Copyright (c) Oracle Corporation 1996, 2000. All Rights Reserved.
Rem
Rem NAME
Rem utlpwdmg.sql - script. for Default Password Resource Limits
Rem
Rem DESCRIPTION
Rem This is a script. for enabling the password management features
Rem by setting the default password resource limits.
Rem
Rem NOTES
Rem This file contains a function for minimum checking of password
Rem complexity. This is more of a sample function that the customer
Rem can use to develop the function for actual complexity checks that the
Rem customer wants to make on the new password.
Rem
Rem MODIFIED (MM/DD/YY)
Rem nireland 08/31/00 - Improve check for username=password. #1390553
Rem nireland 06/28/00 - Fix null old password test. #1341892
Rem asurpur 04/17/97 - Fix for bug479763
Rem asurpur 12/12/96 - Changing the name of password_verify_function
Rem asurpur 05/30/96 - New script. for default password management
Rem asurpur 05/30/96 - Created
Rem
-- This script. sets the default password resource parameters
-- This script. needs to be run to enable the password features.
-- However the default resource parameters can be changed based
-- on the need.
-- A default password complexity function is also provided.
-- This function makes the minimum complexity checks like
-- the minimum length of the password, password not same as the
-- username, etc. The user may enhance this function according to
-- the need.
-- This function must be created in SYS schema.
-- connect sys/<password> as sysdba before running the script
CREATE OR REPLACE FUNCTION verify_function
(username varchar2,
password varchar2,
old_password varchar2)
RETURN boolean IS
n boolean;
m integer;
differ integer;
isdigit boolean;
ischar boolean;
ispunct boolean;
digitarray varchar2(20);
punctarray varchar2(25);
chararray varchar2(52);
BEGIN
digitarray:= '0123456789';
chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
punctarray:='!"#$%&()``*+,-/:;<=>?_';
-- Check if the password is same as the username
IF NLS_LOWER(password) = NLS_LOWER(username) THEN
raise_application_error(-20001, 'Password same as or similar to user');
END IF;
-- Check for the minimum length of the password
IF length(password) < 4 THEN
raise_application_error(-20002, 'Password length less than 4');
END IF;
-- Check if the password is too simple. A dictionary of words may be
-- maintained and a check may be made so as not to allow the words
-- that are too simple for the password.
IF NLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password', 'oracle', 'computer', 'abcd') THEN
raise_application_error(-20002, 'Password too simple');
END IF;
-- Check if the password contains at least one letter, one digit and one
-- punctuation mark.
-- 1. Check for the digit
isdigit:=FALSE;
m := length(password);
FOR i IN 1..10 LOOP
FOR j IN 1..m LOOP
IF substr(password,j,1) = substr(digitarray,i,1) THEN
isdigit:=TRUE;
GOTO findchar;
END IF;
END LOOP;
END LOOP;
IF isdigit = FALSE THEN
raise_application_error(-20003, 'Password should contain at least one digit, one character and one punctuation');
END IF;
-- 2. Check for the character
<<findchar>>
ischar:=FALSE;
FOR i IN 1..length(chararray) LOOP
FOR j IN 1..m LOOP
IF substr(password,j,1) = substr(chararray,i,1) THEN
ischar:=TRUE;
GOTO findpunct;
END IF;
END LOOP;
END LOOP;
IF ischar = FALSE THEN
raise_application_error(-20003, 'Password should contain at least one \
digit, one character and one punctuation');
END IF;
-- 3. Check for the punctuation
<<findpunct>>
ispunct:=FALSE;
FOR i IN 1..length(punctarray) LOOP
FOR j IN 1..m LOOP
IF substr(password,j,1) = substr(punctarray,i,1) THEN
ispunct:=TRUE;
GOTO endsearch;
END IF;
END LOOP;
END LOOP;
IF ispunct = FALSE THEN
raise_application_error(-20003, 'Password should contain at least one \
digit, one character and one punctuation');
END IF;
<<endsearch>>
-- Check if the password differs from the previous password by at least
-- 3 letters
IF old_password IS NOT NULL THEN
differ := length(old_password) - length(password);
IF abs(differ) < 3 THEN
IF length(password) < length(old_password) THEN
m := length(password);
ELSE
m := length(old_password);
END IF;
differ := abs(differ);
FOR i IN 1..m LOOP
IF substr(password,i,1) != substr(old_password,i,1) THEN
differ := differ + 1;
END IF;
END LOOP;
IF differ < 3 THEN
raise_application_error(-20004, 'Password should differ by at \
least 3 characters');
END IF;
END IF;
END IF;
-- Everything is fine; return TRUE ;
RETURN(TRUE);
END;
/
-- This script. alters the default parameters for Password Management
-- This means that all the users on the system have Password Management
-- enabled and set to the following values unless another profile is
-- created with parameter values set to different value or UNLIMITED
-- is created and assigned to the user.
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10
PASSWORD_REUSE_TIME 1800
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1/1440
PASSWORD_VERIFY_FUNCTION verify_function;
仔细阅读上面的脚本,您可以得到关于verify_function函数的密码复杂性校验规则如下:
1)密码最小长度为4个字符
2)密码不能和用户名相同
3)密码要包含至少一个字符、一个数字和一个特殊字符
4)密码需要至少有3个字符与之前的口令不相同
9.小结
通过PROFILE对用户的资源和登录密码的限制方法使用起来还是很贴心的,毕竟Oracle提供了这样一种便捷的管理手段,对付数据库方面的一般性审计还是游刃有余的,即使这些规则仍然不能满足需求,Oracle也提供了添加和修改的接口,以便按需定制,当然会有一定的开发周期和成本。
Oracle对数据库的安全性方面提供了非常多的手段来保证,如审计和权限控制等优秀手段。对于一个商业数据库的安全性审计是非常重要的,如果后台的数据库存在安全隐患,可以说必定会带来一场浩劫,只是早晚的事情。如果您是一名维护DBA,一定要从数据库的安全性上多多动脑筋,不要等待问题出现了才恍然大悟:哇塞,原来Oracle同学早就有补救的措施啦!
BTW:关于权限控制的策略在使用前一定要做好充分的测试,确保对每一条限制规则理解透彻,不然会带来不必要的麻烦,另外一个经验就是:将每一步的限制规则记录到一个特定的数据库维护手册中,方便查询,同时也便于知识的传承,利己利人,“好事两桩".
原文地址:
http://blog.csdn.net/smstong/article/details/8055292
发表评论
-
Oracle触发器中new&old关键字使用
2014-12-09 12:59 1318选取自:http://apps.hi.baidu.com/sh ... -
ORA-12514(TNS:监听程序当前无法识别...)解决方案
2014-10-21 10:51 3682主要问题如题:“ORA-12514(TNS:监听程序当前无法识 ... -
Oracle出现ORA-28001: 口令已经失效错误处理
2014-09-12 11:08 19731.问题描述【ORA-28001: 口令已经失效错误,程序访问 ... -
Oracle本地或局域网程序不能建立连接处理
2014-09-02 08:52 1557oracle11本地访问局域网不行的解决 访问局域网Ora ... -
Oracle时间格式化查询
2014-05-06 21:37 4767将日期型转换成字符串时,可以按新的格式显示,如 ... -
Oracle数据库创建实例参数记录
2014-02-10 17:12 872非正常关机或服务器突然断电使Oracle丢失数据库控制文件,系 ... -
Oracle操作ORA-02289: 序列不存在 解决方案
2013-12-15 16:20 219751、创建序列 -- Create sequence cre ... -
oracle没有create or replace table
2013-12-15 12:00 14452转自:http://tunps.com/oracle-crea ... -
Oracle两种方式创建自增ID
2013-12-15 11:43 151081、方式一:使用序列和触发器 SQL> CREATE ... -
Oracle 11g 安装时默认用户名和密码
2013-11-26 09:52 2692安装ORACLE时,若没有为下列用户重设密码,则其默认密码如 ... -
Oracle 11g下载项目需列表目录
2013-11-26 09:21 2046Oracle Database 11g Release 2 S ... -
Oracle修改用户密码及授权撤权
2013-11-19 22:51 1453转自:http://www.cnblogs.com/fromc ... -
Oracle创建表空间、创建用户以及授权、查看权限
2013-11-19 22:31 908转自:wolfman,http://www.blogjava. ... -
Oracle数据库备份方法[转]
2013-11-19 17:06 1242转载地址:http://www.cnblo ... -
Oracle数据库备份
2013-11-19 16:53 1039(一)、导出/导入(EXPORT/ ... -
Oracle中数据表查询拷贝
2013-03-12 00:24 2811一、Oracle数据库中,把一张表的查询结果直接生成并导入一 ... -
Oracle数据库权限管理
2013-03-12 00:21 1143------------Oracle分配权限 以管理员身份登录 ...
相关推荐
- 如果sysdba用户密码过期,可以通过操作系统认证的方式启动Oracle数据库服务,然后在命令行中以`sqlplus / as sysdba`登录,无需输入密码。这样可以直接对sys账户进行密码修改。 2. **修改sys账户密码** - 在SQL...
设置、修改oracle用户密码永不过期的处理方法。亲测有效。
通过以上三个步骤,我们可以快速地解决Oracle数据库中用户密码过期的问题。这种方法不仅简单高效,而且适用于大多数情况。需要注意的是,在实际操作中还需根据具体情况调整命令参数,比如用户名、密码等信息。此外,...
Oracle 数据库密码过期问题是指 Oracle 数据库中用户密码的有效期问题。当用户密码达到一定的使用期限时,Oracle 数据库将提示用户修改密码,以确保数据库的安全性。本文将介绍 Oracle 数据库密码过期问题的解决方法...
### Oracle 用户密码过期处理及继续使用原密码的方法 #### 背景介绍 在Oracle数据库管理中,为了确保系统的安全性与合规性,通常会设置用户的密码有效期。一旦用户的密码过期,系统将不允许该用户使用旧密码进行...
其中,Oracle密码过期处理是数据库管理员日常维护中的一个重要环节。本文将深入解析Oracle密码过期的相关知识点,包括密码过期机制、如何检查密码状态、修改密码生命周期以及解锁用户账户等关键操作。 ### Oracle...
在IT领域,数据库的...以上是对“oracle密码过期修改方法”的详细介绍,包括了密码过期的原理、修改密码的方法以及通过SQL命令调整密码有效期的具体步骤,希望对正在处理Oracle数据库密码管理的IT专业人士有所帮助。
每个Oracle用户账户都有一个与之关联的Profile,该Profile定义了一系列资源限制和密码策略,包括密码过期时间。 **命令示例**: ```sql SQL> SELECT username, profile FROM dba_users; ``` 通过执行上述SQL语句...
在使用Oracle数据库时,经常遇到的一个问题是用户密码过期导致无法登录的情况。这种情况下通常会收到一个错误提示ORA-28002: The password will expire in 7 days(密码将在7天后过期),这主要是因为Oracle 11g默认...
重置用户密码也通过SQL命令实现,如`4.修改密码alter user 用户名 identified by 新密码;.txt`所示: ```sql ALTER USER 用户名 IDENTIFIED BY 新密码; ``` 比如,我们要将`system`用户的密码改为`Oracle123`,...
当用户密码过期时,将无法正常登录。解决此问题有几种方法: - **修改密码策略**:通过SQL命令`ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED`可以取消密码有效期限制。 - **密码重置**:在命令行或...
### Oracle数据库账户解锁与密码过期处理方法 #### 背景介绍 在Windows系统下管理Oracle数据库时,经常会遇到数据库账户被锁定或密码过期的情况。这种情况可能会导致用户无法登录数据库,进而影响到数据库的正常...
然而,在使用过程中,用户可能会遇到密码过期的问题,这主要是由于Oracle 11g 默认设置中的密码有效期(`PASSWORD_LIFE_TIME`)限制所致。该限制通常被设置为180天,即大约6个月后,用户的密码将自动过期,用户必须...
【Oracle用户密码管理】 在Oracle数据库管理中,用户密码的管理是安全性的重要组成部分。这篇博客主要探讨了Oracle用户密码的相关知识,包括用户状态、解锁账户、修改密码无效状态、查看密码明文、登录失败次数查询...
本文将详细讲解如何处理Oracle用户密码过期和用户被锁的问题,这对于系统管理员和DBA来说是日常工作中常见的挑战。 首先,我们来看密码过期的问题。在Oracle 11g中,默认情况下,`default`概要文件设置了一个`...
**关于scott用户密码过期的处理:** 在Oracle安装过程中,scott用户通常被预设并带有默认密码tiger。如果密码过期或者在安装后未正确初始化,你将无法使用scott用户登录。 1. 打开命令行,输入`sqlplus /nolog`...
在Oracle数据库管理中,有时会遇到用户密码过期或账户被锁定的问题,这通常是由于数据库安全策略中的密码生命周期设置导致的。默认情况下,Oracle设置了一个密码有效期,例如180天,超过这个期限,用户必须更改密码...
密码问题在Oracle中可能涉及口令策略、口令过期、口令锁定或忘记口令等。解决密码问题通常需要使用Oracle的管理工具,如SQL*Plus、Enterprise Manager或命令行工具。例如,如果忘记数据库管理员(DBA)的口令,可以...