用户管理的安全(profile)

管理用户的安全常规的方法是对用户权限,角色的管理,本文讨论一下通过profile来提高用户的安全性和数据库性能

 

Proflie是口令限制,资源限制的命名集合.建立oracle数据库时,oracle会自动建立名为DEFAULTPROFILE,初始化的DEFAULT没有进行任何口令和资源限制

 

1,建立PROFILE,如果只设置了部分口令或资源限制选项,其他选项会自动使用默认值(DEFAULT的相应选项)
2,建立用户时,如果不指定PROFILE选项,oracle会自动将DEFAULT分配给相应的数据库用户.
3,一个用户只能分配一个PROFILE.如果要同时管理用户的口令和资源,那么在建立PROFILE时应该同时指定口令和资源选项.
4,使用PROFILE管理口令时,口令管理选项总是处于被激活状态,但如果使用PROFILE管理资源,必须要激活资源限制.

 

激活资源限制:


SQL> show parameter resource_limit;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

resource_limit                       boolean     FALSE

 

SQL> alter system set resource_limit=true;

System altered.

 

SQL> show parameter resource_limit;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

resource_limit                       boolean     TRUE

 

创建一个profile

SQL> create profile profile_test limit;

 

具体的参数配置:

 

CPU_PER_SESSION

用户在一次数据库会话期间可以占用的CPU时间总量(单位为:1%)。当达到该时间限制之后,用户就不能在会话中执行任何操作了。

用户必须断开与Oracle 的连接再重新建立连接以使该CPU 累计器复位。

 

SQL> alter user test profile profile_test;

User altered.

 

SQL> alter profile profile_test limit cpu_per_session 2;

Profile altered.

 

查看当前创建的概要文件的详细配置:

SQL> select * from dba_profiles;

 

PROFILE         RESOURCE_NAME                            RESOURCE LIMIT

--------------- ---------------------------------------- -------- -------------

PROFILE_TEST    CPU_PER_SESSION                          KERNEL   2

PROFILE_TEST    CPU_PER_CALL                             KERNEL   DEFAULT

PROFILE_TEST    LOGICAL_READS_PER_SESSION                KERNEL   DEFAULT

PROFILE_TEST    LOGICAL_READS_PER_CALL                   KERNEL   DEFAULT

PROFILE_TEST    IDLE_TIME                                KERNEL   DEFAULT

PROFILE_TEST    CONNECT_TIME                             KERNEL   DEFAULT

PROFILE_TEST    PRIVATE_SGA                              KERNEL   DEFAULT

PROFILE_TEST    FAILED_LOGIN_ATTEMPTS                    PASSWORD DEFAULT

PROFILE_TEST    PASSWORD_LIFE_TIME                       PASSWORD DEFAULT

PROFILE_TEST    PASSWORD_REUSE_TIME                      PASSWORD DEFAULT

PROFILE_TEST    PASSWORD_REUSE_MAX                       PASSWORD DEFAULT

 

PROFILE         RESOURCE_NAME                            RESOURCE LIMIT

--------------- ---------------------------------------- -------- -------------

PROFILE_TEST    PASSWORD_VERIFY_FUNCTION                 PASSWORD DEFAULT

PROFILE_TEST    PASSWORD_LOCK_TIME                       PASSWORD DEFAULT

PROFILE_TEST    PASSWORD_GRACE_TIME                      PASSWORD DEFAULT

 

48 rows selected.

 

或者登入用户后查看自己的资源限制:

SQL> select * from user_resource_limits;

 

RESOURCE_NAME                            LIMIT

---------------------------------------- -------------

COMPOSITE_LIMIT                          UNLIMITED

SESSIONS_PER_USER                        UNLIMITED

CPU_PER_SESSION                          UNLIMITED

CPU_PER_CALL                             UNLIMITED

LOGICAL_READS_PER_SESSION                UNLIMITED

LOGICAL_READS_PER_CALL                   UNLIMITED

IDLE_TIME                                UNLIMITED

CONNECT_TIME                             1

PRIVATE_SGA                              UNLIMITED

 

9 rows selected.

 

登入test用户,测试会发现,占用cpu超出2%的会话将被终止:

SQL> conn test/oracle

Connected.

SQL> select tname from tab;

 

TNAME

------------------------------

TEST

 

SQL> select count(*) from test;

select count(*) from test

*

ERROR at line 1:

ORA-02392: exceeded session limit on CPU usage, you are being logged off

 

SQL> conn / as sysdba

Connected.

SQL> alter profile profile_test limit cpu_per_session default;

Profile altered.

 

SQL> conn test/oracle

Connected.

 

SQL> select count(*) from test;

  COUNT(*)

----------

   8388608

 

CPU_PER_CALL

该资源表示用户可用的CPU时间总量(单位为:1%),与 CPU_PER_SESSION不同,该资源是以每次调用(SQL语句)为基准来限制的,

而不是以每次会话为基准的。无论何时,只要一个SQL 语句达到该限制,该语句就以错误信息结束。不像CPU_PER_SESSION那样,

用户不需断开与ORACLE的连接。当使用CPU_PER_CALL时,只要没有超出参数限定的时间用户就可以做新的查询。

 

如:

SQL> alter profile profile_test limit cpu_per_call 2;

Profile altered.

 

SQL> conn test/oracle

Connected.

SQL> select count(*) from test;

select count(*) from test

*

ERROR at line 1:

ORA-02393: exceeded call limit on CPU usage

 

 

CONNECT_TIME

 

该资源用于限定用户可以和数据库连接的时间总量。和IDLE_TIME,该资源也是以分钟为单位,

当连接时间超出该设置时,该连接就被终止。

 

SQL> conn / as sysdba

Connected.

 

SQL> alter profile profile_test limit cpu_per_call default;

Profile altered.

 

SQL> alter profile profile_test limit connect_time 1;

Profile altered.

 

SQL> conn test/oracle

Connected.

 

等待一分钟后会发现会话连接已经断开:

 

SQL> select * from tab;

select * from tab

*

ERROR at line 1:

ORA-02399: exceeded maximum connect time, you are being logged off

 

IDLE_TIME

 

利用IDLE_TIME 可以指定用户在数据库被终止之前,可以让连接处于多长的空闲状态(以分钟为单位)。

一个被终止的数据库连接可能不易被用户察觉,因为该资源并不终止任何应用程序。

只有到用户试图下次执行某个操作时(如查询),他才会认识到该连接已被终止。

 

SQL> conn / as sysdba

Connected.

 

SQL> alter profile profile_test limit idle_time 1;

Profile altered.

 

SQL> alter profile profile_test limit connect_time 1;

Profile altered.

 

SQL> conn test/oracle

Connected.

 

等待一分钟后:

SQL> select tname from tab;

select tname from tab

*

ERROR at line 1:

ORA-02396: exceeded maximum idle time, please connect again

 

SESSIONS_PER_USER

 

用户可以同时进行的会话(连接到Oracle)的最大数目。如果用户达到该限制,则在下一次登录时产生一条错误信息。

 

SQL> alter profile profile_test limit sessions_per_user 1;

Profile altered.

 

SQL> conn test/oracle

Connected.

 

打开另一个终端连接:

 

SQL> conn test/oracle

ERROR:

ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit

Warning: You are no longer connected to ORACLE.

 

 

LOGICAL_READS_PER_SESSION

 

在一次给定的数据库会话期间能够进行的逻辑读(以数据库块为单位)的次数。

如果超出该参数的限定,用户仍然可以工作,但只要他不进行读就可以。

要想复位,用户必须断开数据库连接再重新连接才行。

 

SQL> alter profile profile_test limit logical_reads_per_session 1000;

 

Profile altered.

 

SQL> conn test/oracle

Connected.

 

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

TEST                           TABLE

 

SQL> select * from tab;

select * from tab

*

ERROR at line 1:

ORA-02394: exceeded session limit on IO usage, you are being logged off

 

PRIVATE_SGA

表示用户私有的SQL区的大小(以块为单位)。确省为 UNLIMITED,只有在共享服务器下才能用

 

COMPOSITE_LIMIT

COMPOSITE_LIMIT 是一项复杂的资源项。利用该项可以对所有混合资源限定作出设定。

可把它看成资源成本值。该成本值让用户能够确定在设置资源限制时哪些资源项比较重要。

在确定资源成本时,只有以下资源项有用:

 

.CPU_PER_SESSION

.LOGICAL_READS_PER_SESSION

.CONNECT_TIME

.PRIVATE_SGA

 

FAILED_LOGIN_ATTEMPTS

 

设定登录到ORACLE 数据库时可以失败的次数。一旦某用户尝试登录数据库的达到该值时,该用户的帐户就被锁定,只能由DBA能解锁。

 

SQL> alter profile profile_test limit failed_login_attempts 3;

 

SQL> alter profile profile_test limit failed_login_attempts 3;

Profile altered.

 

SQL> conn test/1

ERROR:

ORA-01017: invalid username/password; logon denied

Warning: You are no longer connected to ORACLE.

 

SQL> conn test/1

ERROR:

ORA-01017: invalid username/password; logon denied

 

SQL> conn test/1

ERROR:

ORA-01017: invalid username/password; logon denied

 

SQL> conn test/1

ERROR:

ORA-28000: the account is locked

 

SQL> conn / as sysdba

Connected.

解锁后再次登入:

SQL> alter user test account unlock;

User altered.

 

SQL> conn test/oracle

Connected.

 

PASSWORD_GRACE_TIME

设定在口令失效前,给予的重新设该口令的宽限天。当口令失效之后,在登录时会出现警告信息显示该天数。

可以指定分钟数(n/1440) ,可以指定秒数(n/86400)

如果没有在宽限天内修改口令,口令将失效。

 

PASSWORD_LIFE_TIME

设定口令的有效时间(天数),可以指定分钟数(n/1440) ,可以指定秒数(n/86400)缺省为UNLIMITED.

一旦超过这一时间,必须重新设口令。(必须把password_grace_time 设成0才能单独生效)

 

 

设置口令的有效期为1分钟,宽限时长为2分钟

 

SQL> alter profile profile_test limit password_grace_time 2/1440 password_life_time 1/1440;

Profile altered.

 

SQL> conn test/oracle

ERROR:

ORA-28002: the password will expire within 0 days

Connected.

 

SQL> password 

Changing password for TEST

Old password: 

New password: 

Retype new password: 

Password changed

 

SQL> conn test/123

ERROR:

ORA-28002: the password will expire within 0 days

Connected.

 

PASSWORD_REUSE_TIME

许多系统不许用户重新启用过去用过的口令。该资源项设定了一个失效口令要经过多少天,用户才可以重新使用该口令。缺省为UNLIMITED.

 

PASSWORD_REUSE_MAX

重新启用一个先前用过的口令前必须对该口令进行重新设置的次数(重复用的次数)。

 

create profile p_t limit

password_life_time 1/1440

password_grace_time 0

password_reuse_time 2/1440

password_reuse_max 2;

 

alter user scott profile p_t;

conn scott/tiger

ERROR:

ORA-28001: the password has expired

conn scott 要求输入密码,输入跟以前相同的报错:

Changing password for scott

New password: 

Retype new password: 

ERROR:

ORA-28007: the password cannot be reused

Password unchanged

两分钟以后,更改过两次密码以后,可以输入与以前相同的密码

 

PASSWORD_LOCK_TIME

 

conn /as sysdba

create profile p_t limit

FAILED_LOGIN_ATTEMPTS 2

password_lock_time 1/1440;

alter user scott profile p_t;

conn scott/a-----连续3次输错密码,账户被锁定。

1分钟后,账户自动解锁。

 

Oracle  服务器提供名为 VERIFY_FUNCTION  的口令复杂性验证函数。此函数是使用 $ORACLE_HOME/rdbms/admin

utlpwdmg.sql  脚本创建的。

必须在 SYS  方案中创建口令复杂性验证函数。此函数可用作自定义口令验证的模板。

除了创建 VERIFY_FUNCTION  以外,在 utlpwdmg  脚本中还使用以下 ALTER PROFILE  命令更改 DEFAULT  概要文件: 

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; 

 

profilePASSWORD_VERIFY_FUNCTION参数,允许我们在创建用户或者更改用户

密码时实施自定义的密码验证规则。

1.首先,我们需要创建一个自己的实现密码验证规则的函数,该函数必须创建在sys模式下,而且必须有三个类型为varchar2的输入参数,

第一个参数,包含我们要修改的用户名,

第二个参数包含新密码,

第三个参数包含旧密码,并且返回类型为布尔类型。

举一个简单的例子,如果我们需要使密码最少保持6位,并在用户修改密码时在sys.passwd_changed表中记录用户的旧密码和新密码:

首先创建表passwd_changed

      

conn /as sysdba

create table passwd_changed

(

user_name  varchar2(20) ,

old_passwd varchar2(100) ,

new_passwd varchar2(100) 

);

 

2.创建实现密码自定义规则的函数my_password_verify

create or replace function my_password_verify(username varchar2,

password varchar2,old_password varchar2)

return boolean is

begin

if length(password) 

raise_application_error(-20001,'passwd must be at least 6 characters long');

end if;

insert into passwd_changed values(username,old_password,password);

return (true);

end;

 

3.创建profile应用刚才创建的函数

create profile test_profile limit password_verify_function my_password_verify; 

 

create user test_user

identified by test

default tablespace users

temporary tablespace temp

profile test_profile

 

create user test_user 

*

ERROR at line 1:

ORA-28003: password verification for the specified password failed

ORA-20001: Password must be at least 6 characters long

 

create user test_user

identified by test12

profile test_profile;

User created.

select * from passwd_changed;

 

 

sql>alter user test_user identified by test;

alter user test_user identified by test

*

ERROR at line 1:

ORA-28003: password verification for the specified password failed

ORA-20001: Password must be at least 6 characters long

 

alter user test_user identified by testtest;

 

select * from passwd_changed;

USER_NAME  OLD_PASSWD NEW_PASSWD

---------- ---------- -----------

TEST_USER             TEST12

TEST_USER             TESTTEST

 

 

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

转载于:http://blog.itpub.net/29320885/viewspace-1158350/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值