目录
LLL的数据库培训—第二部分—Oracle基础知识培训—第13讲—数据库用户(模式)管理之概要文件
一、用户的安全控制域
当 Oracle数据库管理员创建了一个可以访问 Oracle数据库的用户的同时,也定义了一个用户的安全控制域(security domain)。
1、安全控制域包括:
安全检测机制( authentication mechanism): 用户密码 用户的默认表空间(default tablespace): 指定默认表空间,避免使用系统或其他表空间 用户排序所用的临时表空间(temporary tablespace): 指定临时表空间 表空间的配额(tablespace quotas): 可以限制用户使用表空间的大小 账户上锁(account locking): 可以通过对账户的上锁来阻止用户登录数据库。可以采取自动加锁,也可以由数据库管理员对账户进行手工的加锁和开锁。 资源限制(resource limits): 加在资源使用上的限制,如处理器(CPU)时间,逻辑输入或输出(O)和用户所能打开的会话数等。 直接权限(direct privileges): 这些权限被用来控制用户在数据库中可以进行的操作。 角色权限(role privileges): 通过使用角色所间接授予的权限。
2、Oracle数据库管理系统正是通过以上介绍的安全控制域构筑起了一道又一道安全防线。
--首先是只许那些合法的用户进入 Oracle数据库系统, --之后又对进入 Oracle数据库系统的用户加上了一道又一道资源使用方式和数量上的限制;
通过以上这些安全措施使 Oracle数据库系统的安全可谓是“固若金汤”。
那么 Oracle又是怎样将这些限制方便地加到每个用户上,特别是在用户数量巨大的大型和超大型数据库系统上的?
为了减少数据库管理员的工作量也为了方便系统安全和资源的管理, Oracle系统引入了概要文件(profiles)。
二、概要文件(称用户的配置文件或者更容易理解)
1、概要文件概念
(1)什么是概要文件
概要文件如果称为用户的资源配置文件可能更容易理解。
概要文件是一组命了名的口令和资源限制,通过DDL语句 CREATE USER或ALTER USER赋予用户。
概要文件可以被开启(激活)和关闭(禁止),而且概要文件也可以与默认的概要文件相关。
当一个概要文件被创建后,数据库管理员就可以将它赋予用户。
如果此时资源限制已经开启, Oracle服务器就要按照概要文件的规定来限制用户的资源使用。
(2)使用概要文件的好处
可以将用户按它们的安全控制和资源使用要求分成若干个组,然后为每一组按用户的需求创建一个概要文件,最后再将这些概要文件分别赋予相关的用户。
这样可以大大地减轻数据库管理员的工作负担,提高工作效率,同时减少出错的机会。
当创建数据库的同时, Oracle服务器会自动创建一个名为 DEFAULT的默认概要文件。
任何用户如果没有显式地赋予一个概要文件, Oracle服务器就将默认概要文件赋予这个用户在 Oracle的早期版本中,概要文件的所有限制的初始值都是无限的,但是数据库管理员可以根据情况进行修改。
(3)概要文件的特性
--赋予用户的概要文件并不影响当前的会话。 --只能将概要文件赋予用户,而不能将概要文件赋予角色或其他的概要文件。 --如果在创建用户时没有赋予一个概要文件,默认的概要文件将赋予这个用户。
2、概要文件实现中几类安全控制措施:
(1)口令限制:
口令限制只要在profiles概要文件中定义了就起作用,并不受resource_limit影响。
(2)资源限制:
这种方式必须要resource_limit为true才会生效,否则即使在概要文件中已经定义了资源限制也没有用。
3、概要文件使用步骤:
(1)利用create profile命令创建一个概要文件,在这个概要文件中定义资源和口令的限制;
(2)使用create user或alter user 命令将概要文件赋予用户;
(3)可以用以下方法之一开启资源限制:
--在初始化参数文件中将resource_limit设置true; --使用alter system 命令将resource_limit设置为true;
4、profile的创建语法(16个参数):
CREATE PROFILE profile LIMIT { resource_parameters| password_parameters } [ resource_parameters | password_parameters ]... ; { { SESSIONS_PER_USER | CPU_PER_SESSION | CPU_PER_CALL | CONNECT_TIME | IDLE_TIME | LOGICAL_READS_PER_SESSION | LOGICAL_READS_PER_CALL | COMPOSITE_LIMIT } { integer | UNLIMITED | DEFAULT } | PRIVATE_SGA { integer [ K | M ] | UNLIMITED | DEFAULT } } { { FAILED_LOGIN_ATTEMPTS | PASSWORD_LIFE_TIME | PASSWORD_REUSE_TIME | PASSWORD_REUSE_MAX | PASSWORD_LOCK_TIME | PASSWORD_GRACE_TIME } { expr | UNLIMITED | DEFAULT } | PASSWORD_VERIFY_FUNCTION { function | NULL | DEFAULT } }
Unlimited:分配该profile的用户对资源使用无限制,当使用密码参数时,unlimited意味着没有对参数加限制。 Default:指定为default意味着忽略对profile中的一些资源限制,Default profile初始定义对资源不限制,可以通过alter profile命令来改变。
5、profile的参数详解
(1)resource_parameters参数部分:
SESSIONS_PER_USER --指定限制用户的并发会话的数目 CPU_PER_SESSION --指定会话的CPU时间限制,单位为百分之一秒。 CPU_PER_CALL --指定一次调用(解析、执行和提取)的CPU时间限制,单位为百分之一秒。 CONNECT_TIME --指定会话的总的连接时间,以分钟为单位。 IDLE_TIME --指定会话允许连续不活动的总的时间,以分钟为单位,超过该时间,会话将断开。但是长时间运行查询和其他操作的不受此限制。 LOGICAL_READS_PER_SESSION --指定一个会话允许读的数据块的数目,包括从内存和磁盘读的所有数据块。 LOGICAL_READS_PER_CALL --指定一次执行SQL(解析、执行和提取)调用所允许读的数据块的最大数目。 PRIVATE_SGA --指定一个会话可以在共享池(SGA)中所允许分配的最大空间,以字节为单位。(该限制只在使用共享服务器结构时才有效,会话在SGA中的私有空间包括私有的SQL和PL/SQL,但不包括共享的SQL和PL/SQL)。 COMPOSITE_LIMIT --指定一个会话的总的资源消耗,以service units单位表示。Oracle数据库以有利的方式计算cpu_per_session,connect_time,logical_reads_per_session和private-sga总的service units
(2)Password_parameter参数部分:
FAILED_LOGIN_ATTEMPTS --指定在帐户被锁定之前所允许尝试登陆的的最大次数。 PASSWORD_LIFE_TIME --指定同一密码所允许使用的天数。如果同时指定了password_grace_time参数,如果在grace period内没有改变密码,则密码会失效,连接数据库被拒绝。如果没有设置password_grace_time参数,默认值unlimited将引发一个数据库警告,但是允许用户继续连接 PASSWORD_GRACE_TIME --指定宽限天数,数据库发出警告到登陆失效前的天数。如果数据库密码在这中间没有被修改,则过期会失效。 PASSWORD_REUSE_TIME --PASSWORD_REUSE_TIME和PASSWORD_REUSE_MAX关联设置 PASSWORD_REUSE_MAX --PASSWORD_REUSE_TIME和PASSWORD_REUSE_MAX,这两个参数必须互相关联设置,password_reuse_time指定了密码不能重用前的天数,而password_reuse_max则指定了当前密码被重用之前密码改变的次数。两个参数都必须被设置为整数。 1.如果为这两个参数指定了整数,则用户不能重用密码直到密码被改变了password_reuse_max指定的次数以后在password_reuse_time指定的时间内。 如:password_reuse_time=30,password_reuse_max=10,用户可以在30天以后重用该密码,要求密码必须被改变超过10次。 2.如果指定了其中的一个为整数,而另一个为unlimited,则用户永远不能重用一个密码。 3.如果指定了其中的一个为default,Oracle数据库使用定义在profile中的默认值,默认情况下,所有的参数在profile中都被设置为unlimited,如果没有改变profile默认值,数据库对该值总是默认为unlimited。 4.如果两个参数都设置为unlimited,则数据库忽略他们。 PASSWORD_LOCK_TIME --指定登陆尝试失败次数到达后帐户的缩定时间,以天为单位 PASSWORD_VERIFY_FUNCTION --该字段允许将复杂的PL/SQL密码验证脚本做为参数传递到create profile语句。 Oracle数据库提供了一个默认的脚本,但是自己可以创建自己的验证规则或使用第三方软件验证。 对Function名称,指定的是密码验证规则的名称,指定为Null则意味着不使用密码验证功能。 如果为密码参数指定表达式,则该表达式可以是任意格式,除了数据库标量子查询。
三、概要文件——口令限制管理
1、生效条件
只要在profile加入限制条件,并指向相关用户,就生效了。
2、创建profile并赋予用户
create profile profileLLL limit password_lock_time 1 failed_login_attempts 3;
create/alter user profile profileLLL;
3、更改profile
(1) 在尝试失败登录达到3次后,帐号被锁定1分钟,(1/1440是1分钟)
sql>alter profile profileLLL limit password_lock_time 1/1440 failed_login_attempts 3;
(2)口令经过2天后会提示到期,口令到期的3天后被锁定,这3天内可以对口令做改变。
sql>alter profile profileLLL limit password_life_time 2 password_grace_time 3 ;
(3)口令保留10天,口令最多重用3次。
sql> alter profile profileLLL limit password_reuse_time 10 password_reuse_max 3;
(4)设置密码可以使用180天或无限期
sql > alter profile default limit password_life_time 180; sql > alter profile default limit password_life_time unlimited;
4、口令复杂性函数(VERIFY_FUNTCTION)的使用
(1)口令函数
Oracle服务器提供了一个口令复杂性检验的函数,这是一个默认的PL/SQL函数,函数名VERIFY_FUNCTION。
该函数必须在sys用户中通过运行 utlpwdmgsq脚本文件来生成。
(2)执行脚本,生成函数--10g
在执行 utlpwdmg.sql脚本文件期间, Oracle服务器将创建 VERIFY_FUNCTION函数,并且使用如下的ALTER PROFILE命令来修改 DEFAULT(默认)概要文件:
SQL> 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;
完成后,会有如下口令检查:
a.口令最小长度是4个字节; b.口令不能和用户名相同; c.口令至少有一个字母,一个数字和一个特殊符号; d.口令改变时新口令必须和旧口令保证有三个符号以上的差异。
(3)执行脚本,生成函数--11g
在执行 utlpwdmg.sql脚本文件期间, Oracle服务器将创建 VERIFY_FUNCTION_11G,
完成后,会有如下口令检查:
a.口令的最小长度为8个字符。 b.口令必须包含至少一个字符和一个数字。 c.口令必须至少有3个字母与以前的口令不同。 d.口令不能与用户名相同,也不能是用户名后跟任何1~100的数字; 不能是保留用户名; 不能是服务器名, 也不能是服务器名后跟任何1~100的数字; 不能是任何众所周知的口令,如 welcomel, databasel, oraclel223, oracle后跟任何1~100的数字等。 从以上 VERIFY_FUNCTION_11G对用户口令的检查,可以看出 Oracle1lg进一步强化了数据库的安全性
(4)执行脚本,生成函数--12C
在 Oracle12c上,执行 utlpwdmg.sq脚本文件会创建以下三个口令复杂性检验的函数:
VERIFY_FUNCTION_11G: ora12C_verify_function: 功能与verify_function11G几乎相同,对密码提供最低限度的复杂性检查。 ora12C_strong_verify_function: 对密码提供更强的复杂性检查以符合美国国防部数据库安全技术实施指南的建议。
5、自定义口令复杂性函数的使用
除了 Oracle提供的默认复杂性检验函数之外数据库管理员也可以自己写一个PLSQ函数进行口令的复杂性检验。
(1)用户提供的口令函数一定要在SYS模式下创建并且必须使用以下的函数说明(即函数的接口)
function name ( userid_ parameter IN VARCHAR2 (30), password_parameter IN VARCHAR2 (30), old password parameter IN VARCHAR2(30) ) RETURN BOOLEAN
(2)每当将一个新的口令检验函数加入到 Oracle数据库系统时,数据库管理员必须考虑如下的一些限制:
函数必须使用上面所介绍的说明(接口)。 函数的返回值TRUE为成功, FALSE为失败。 如果口令函数产生异常,系统将返回出错信息,并且相应的 CREATE USER或 ALTER USER语句被终止。 如果口令函数变为无效,系统也将返回出错信息,并且相应的 CREATE USER或 ALTER USER语句也会被终止。 sys用户拥有口令函数。
四、概要文件——资源限制管理
1、生效条件
要使资源限制生效方法: resource_limit 初始化参数需要改为true(默认是default)、 alter system 动态改变命令:
alter system set resource_limit=true;
2、两种级别的生效
session级, call级别(调用级别)两种级别可以分别生效,也可以同时生效。
概要文件的资源限制既可以加在会话一级,也可以加在调用一级。
3、设定资源限制在session级别:
(1)会话级别的概念
在会话级设置的资源限制是强加在每一个连接上的。
(2)触发资源限制条件后的结果
当超过了会话级的资源限制时, Oracle系统将返回出错信息。
例如,ORA-02391 exceeded simultaneous SESSION PER USER limit,服务器与用户的连接断开。
(3)会话级可以设置的资源限制如下。
cpu_per_session --cpu/会话——每个session可以指定多少cpu (单位: 1/100 s); sessions_per_user --每个用户可以开多少session; connect_time --开(单位: min);连接时间——连接多久退出去 (单位: min); idle_time --空闲时间——用户非活动检测时间,多长时间没有做动作就自动断; private_sga --每个用户占用多少内存区域(单位: bytes) logical_reads_per_session --每个session读取多少数据块(物理和逻辑读);
(4)创建举例:
sql>create profile profileLLL limit;
cpu_per_session 10000 ; //100秒
connect_time 60; //连接时间60分钟
idle_time 5; //指定空闲时间为5分钟
sql>alter user test profile profileLLL;
4、设定资源限制call级别:
(1)调用级别的概念
在调用一级设置的资源限制是强加在每一个执行一条SQL语句所作的调用之上的。
(2)触发资源限制条件后的结果
当超过了调用级的资源限制时:
--Oracle系统挂起所处理的语句。 --回滚这条语句。 --所有之前的语句都完好无损。 --用户的会话仍然保持连接状态
(3)在调用级可以设置的资源限制如下。
CPU PERCALL: 每个调用所用的CP时间,其单位是1%秒 LOGICAL READS PERCALL: 每个调用可以读的数据块数
(4)创建举例:
sql>alter profile profileLLL limit
cpu_per_call 1000
logical_reads_per_call 10;
sql>alter user test profile profileLLL;
五、概要文件的管理
1、概要文件更改
sql>alter profile profileLLL limit password_lock_time 1/1440 failed_login_attempts 3;
2、概要文件的查询
sql>select * from dba_profiles;
3、概要文件的删除
sql>drop profiles profileLLL; --没有用户分配时,可以使用这个删除
sql>drop profiles profileLLL cascade ; --有用户分配当前文件时,可以通过cascade使用这个删除,会回收对这些用户的分配,同时oracle会自动将默认的profile配置分配给这些用户