首页 > 数据库 > Oracle > 用户管理的安全(profile)
管理用户的安全常规的方法是对用户权限,角色的管理,本文讨论一下通过profile来提高用户的安全性和数据库性能
Proflie是口令限制,资源限制的命名集合.建立oracle数据库时,oracle会自动建立名为DEFAULT的PROFILE,初始化的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;
profile的PASSWORD_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) < 6 then
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博客 ” ,链接:https://blog.itpub.net/29320885/viewspace-1158350/ ,如需转载,请注明出处,否则将追究法律责任。