[转载] 使用Oracle的PROFILE对用户资源限制和密码限制的研究与探索

 


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

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-622421/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-622421/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值