Oracle数据库的安全保护流程可以分为3个步骤。首先,用户向数据库提供身份识别信息,即提供一个数据库帐号。接下来用户还需要证明他们所给的身份识别信息是有效的,这是通过输入密码来实现的,用户输入的密码经过数据库的核对,确认用户提供的密码是否正确。最后,假如密码是正确的,那么数据库认为身份识别信息是可信赖的。此时,数据库将会在基于身份识别信息的基础上确定用户所拥有的权限,即用户可以对数据库执行什么操作。因此,为了确保数据库的安全,首要问题就是对用户管理。
连接到数据库的用户所具有的权限是不同的,Oracle提供了一些特权用户,如sysdba或sysoper,这类用户主要用于执行数据库的维护操作,如启动数据库,关闭数据库,建立数据库,以及执行备份和恢复的操作。
sysdba和sysoper的区别在于:sysdba不仅具备sysoper的所有权限,而且还可以建立数据库,执行不完全恢复。在Oracle 11g中,Oracle提供了默认的特权用户sys,当以特权用户身份登录数据库时,必须带有AS SYSDBA或AS SYSOPER选项。例如
SQL> connect system/1qaz2wsx as sysdba; 已连接。
与用户密切关联的另一个概念是模式,模式也称作方案(Schema)。模式或方案实际上是用户所拥有的数据库对象的集合。
在Oracle数据库中,对象是以用户来组织的,用户和模式是一一对应的关系,并且两者名称相同。
**** 当访问数据库对象时,需要注意如下一些事项:
(1)在同一个模式中不能存在同名对象,但是不同模式中的对象名称则可以相同。
(2)用户可以直接访问其他模式对象,但如果要访问其他模式对象,则必须具有该对象的相应访问权限。例如,用户scott可以直接查看其模式中的emp表,但如果用户hr要查看soctt模式中的emp表时,则必须在emp表上具有SELECT操作的权限。
(3)当用户要访问其他模式对象时,必须附加模式名作为前缀。
标识用户是Oracle数据库管理的基本要求之一,每一个能够连接到数据库的用户都必须是系统的合法用户。用户想要使用Oracle的系统资源(查询数据,创建表等),必须要拥有相应的权限。创建用户并授予权限是Oracle系统管理员的基本任务之一。
Oracle为用户账号提供了3种身份验证方法。
(1)密码验证:当一个使用密码验证机制的用户试图连接到数据库时,数据库会核实用户名是否是一个有效的数据库账户,并且验证密码与该用户在数据库中存储的密码是否相同。
由于用户信息和密码都存储在数据库内部,所以使用密码验证用户也称为数据库验证用户。
(2)外部验证。外部验证是指当用户试图连接到数据库时,数据库会核实用户名是否是一个有效的数据库账户,并且确认该用户是否已经完成了操作系统级别的身份验证。
注意:外部验证用户并不在数据库中存储一个验证密码。
(3)全局验证。全局验证是指用户不在数据库中存储验证密码,而是通过一种高级安全选项所提供的身份验证服务来进行。
上述3种验证方式中,密码验证是最常使用的验证方法。
要创建一个新的用户(密码验证用户),可采用CREATE USER命令。
其语法格式如下:
CREATE USER user_name IDENTIFIED BY pass_word [or IDENTIFIED EXETERNALLY] [or IDENTIFIED GLOBALLY AS 'CN=user'] [DEFAULT TABLESPACE tablespace_default] [TEMPORARY TABLESPACE tablespace_temp] [QUOTA [integer K[M]] [UNLIMITED]] ON tablespace_specify1 [,QUOTA [integer K[M]] [UNLIMITED]] ON tablespace_specify2 [,...] ... ON tablespace_specifyn [PROFILES profile_name] [ACCOUNT LOCK or ACCOUNT UNLOCK] -- user_name: 用户名,一般为字母数字型和"#", "_"符号。 -- pass_word: 用户口令,一般为字母数字型和"#","_"符号。 -- IDENTIFIED EXETERNALLY: 表示用户名在操作系统下验证,这种情况下要求该用户必须与操作系统中所定义的用户名相同。 -- IDENTIFIED GLOBALLY AS 'CN=user':表示用户名由Oracle安全域中心服务器验证,CN名字表示用户的外部名。 -- [DEFAULT TABLESPACE tablespace_default]:表示该用户在创建数据对象时使用默认的表空间。 -- [TEMPORARY TABLESPACE tablespace_temp]:表示该用户所使用的临时表空间。 -- [QUOTA [integer K[M]] [UNLIMITED]] ON tablespace_specify1:表示该用户在指定表空间中允许占用的最大空间。 -- [PROFILES profile_name]:资源文件的名称。 -- [ACCOUNT LOCK or ACCOUNT UNLOCK]:用户是否被加锁,默认情况下是不加锁的。
(1)创建用户,并指定默认表空间和临时表空间。
*** 创建一个mr用户,口令为mrsoft,并设置默认的表空间为users,临时表空间为temp,代码:
SQL> create user mr identified by mrsoft default tablespace users temporary tablespace temp; 用户已创建。
(2)创建用户,并配置其在指定表空间上的磁盘限额。
有时,为了避免用户在创建表和索引对象时占用过多的空间,可以配置用户在表空间上的磁盘限额。在创建用户时,可通过QUOTA xxxM ON tablespace_specify子句配置指定表空间的最大可用限额。
*** 创建一个用户east,口令为mrsoft,默认表空间为users,临时表空间为temp,并指定该用户在tbsp_1表空间上最多可使用的大小为10MB,代码:
SQL> create user east identified by mrsoft default tablespace users temporary tablespace temp quota 10m on tbsp_1; 用户已创建。
技巧:如果要禁止用户使用某个表空间,则可以通过QUOTA关键字设置该表空间的使用限额为0.
(3)创建用户,并配置其在指定表空间上不受限制。
如果要设置用户在指定表空间上不受限制,可以使用QUOTA UNLIMITED ON tablespace_specifiy子句。
创建一个用户名为df,口令为mrsoft,临时表空间为temp,默认表空间为tbsp_1,并且该用户使用tbsp_1表空间不受限制,代码:
SQL> create user df identified by mrsoft default tablespace tbsp_1 temporary tablespace temp quota unlimited on tbsp_1; 用户已创建。
在创建完用户之后,需要注意以下几点:
*** 如果建立用户时不指定DEFAULT TABLESPACE子句,Oracle会将SYSTEM表空间作为用户的默认表空间。
*** 如果建立用户时不能指定TEMPORARY TABLESPACE子句,Oracle会将数据库默认临时表空间作为用户的临时表空间。
*** 初始建立的用户没有任何权限,所以为了使用户可以连接到数据库,必须授权其CREATE SESSION权限。
*** 如果建立用户时没有为表空间指定QUOTA子句,那么用户在特定表空间上的配额为0,用户将不能在相应的表空间上建立数据对象。
*** 初始建立的用户没有任何权限看,不能执行任何数据库操作。
用户创建完后,管理员可以对用户进行修改,包括修改用户口令,改变用户默认表空间,临时表空间,磁盘配额及资源限制等。修改用户的语法与创建用户的语法基本相似,只是把创建用户语法中的CREATE关键字替换成ALTER。
如果DBA在创建用户时,指定了用户在某个表空间的磁盘限额,那么经过一段时间,该用户使用该表空间已经达到了DBA所设置的磁盘限额时,Oracle系统就会显示如下错误提示:
ORA-01536:SPACE QUOTA EXCEEDED FOR TABLESPACE 'TBSP_1' 表示该用户使用的资源已经超出了限额,DBA需要为该用户适当增加资源。
*** 修改用户east在表空间上的磁盘限额为20MB(原始为10MB,增加10MB),代码: SQL> alter user east quota 20m on tbsp_1; 用户已更改。
用户的口令在使用一段时间之后,根据系统安全的需要或在PROFILE文件(资源配置文件)中设置的规定,用户必须要修改口令。
*** 修改用户east的新口令为123456(原始为mrsoft),代码: SQL> alter user east quota 20m on tbsp_1; 用户已更改。
Oracle默认安装完成后,为了安全起见,很多用户处于LOCKED状态,DBA可以对LOCKED状态的用户解除锁定。 SQL> select username, account_status from dba_users; *** 使用ALTER USER命令解除被锁定的账号SH,代码: SQL> alter user SH account unlock; 用户已更改。
删除用户通过DROP USER语句完成的,删除用户后,Oracle会从数据字典中删除用户,方案及其所有的对象方案,其语法格式如下: DROP USER user_name[CASCADE] user_name:要删除的用户名。 CASCADE:级联删除选项,如果用户包含数据库对象,则必须加CASCADE选项,此时会连同该用户所拥有的对象一起删除。 *** 使用DROP USER语句删除用户df,并连同该用户所拥有的对象一起删除,代码: SQL> drop user df cascade; 用户已删除。
在成功创建用户之后,仅表示该用户在Oracle系统中进行了注册,这样的用户不能连接到数据库,更谈不上进行查询,建表等操作了。要使用该用户能够连接到Oracle系统并使用Oracle资源,如查询表的数据,创建自己的表结构等,必须让具有DBA角色的用户对该用户进行授权。
根据系统管理方式的不同,在Oracle数据库中将权限分为两大类:系统权限和对象权限。
系统权限是在系统级对数据库进行存取和使用的机制,例如,用户是否能够连接到数据库系统(SESSION权限),执行系统级的DDL语句(如CREATE, ALTER 和DROP)等。
对象权限是指某一个用户对其他用户的表,视图,序列,存储过程,函数,包等的操作权限。不同类型的对象具有不同的对象权限,对于某些模式对象,如簇,索引,触发器,数据库链接等没有相应的实体权限,这些权限由系统权限进行管理。
在Oracle 11g中含有200多种系统特权,并且所有这些系统特权均被列举在system_privilege_map数据目录视图中,授权操作使用GRANT命令,其语法格式如下: GRANT sys_privi | role TO user | role | PUBLIC [WITH ADMIN OPTION] sys_privi: 表示Oracle系统权限,系统权限是一组约定的保留字。例如,若能创建表,则为CREATE TABLE。 role: 角色。 user:具体的用户名,或者是一些列的用户名。 PUBLIC: 保留字,代表Oracle系统的所有用户。 WITH ADMIN OPTION: 表示被授权者可以再将权限授予另外的用户。 *** 为用户east授予连接和开发系统的权限,并尝试使用east连接数据库,代码: SQL> connect system/1qaz@wsx 已连接。 SQL> grant connect,resource to east; 授权成功。 SQL> connect east/123456; 已连接。
在上面的代码中,使用east连接数据库后,Oracle显示"已连接",这说明给east授予CONNECT的权限是成功的。另外,如果想要east可以将这两个权限传递给其他用户,则需要再GRANT语句中使用WITH ADMIN OPTION关键字。
*** 在创建用户dongfang和xifang后,首先system将创建SESSION和创建TABLE的权限授权给dongfang,然后,dongfang再将这两个权限传递给xifang,最后通过xifang这个用户创建一个数据表,代码:
SQL> create user dongfang identified by mrsoft default tablespace users quota 10m on users; 用户已创建。 SQL> create user xifang identified by mrsoft default tablespace users quota 10m on users; 用户已创建。 SQL> grant create session,create table to dongfang with admin option; 授权成功。 SQL> connect dongfang/mrsoft 已连接。 SQL> grant create session,create table to xifang; 授权成功。 SQL> connect xifang/mrsoft; 已连接。 SQL> create table tb_xifang ( id number, name varchar2(20) ); 表已创建。
普通用户若被授予过高的权限就可能给Oracle系统带来安全隐患。作为Oracle系统的管理员,应该能够查询当前Oracle系统各个用户的权限,并且能够使用REVOKE命令撤销用户的某些不必要的系统权限,REVOKE命令的语法格式:
REVOKE sys_privi | role FROM user | role | PUBLIC sys_privi:系统权限或角色。 role:角色。 user: 具体的用户名。 PUBLIC: 保留字,代表Oracle系统的所有用户。 *** 撤销east用户的resource系统权限,代码: SQL> connect system/1qaz2wsx; 已连接。 SQL> revoke resource from east; 撤销成功。
如果数据库管理员用GRANT命令给用户A授予系统权限时带有WITH ADMIN OPTION选项,则该用户A有权将系统权限再次授予另外的用户B。在这种情况下,如果数据库管理员使用REVOKE命令撤销A用户的系统权限,则用户B的系统权限仍然有效。
*** 首先撤销用户dongfang的CREATE TABLE权限,然后尝试是否还可以通过用户xifang创建数据表。代码: SQL> revoke create table from dongfang; 撤销成功。 SQL> connect xifang/1qaz2wsx 已连接。 SQL> create table tb_xifang_2 ( id number, name varchar2(10) ); 表已创建。
与将系统权限授予用户基本相同,将对象权限授予用户或角色也使用GRANT命令,其语法格式如下:
GRANT obj_privi | ALL COLUMN ON schema.object TO user | role | PUBLIC [WITH ADMIN OPTION] | [WITH HIERARCHY OPTION] obj_privi: 表示对象的权限,可以是ALTER, EXECUTE, SELECT, UPDATE和INSERT等。 role: 角色名。 user: 被授权的用户名。 WITH ADMIN OPTION: 表示被授权者可再将系统权限授予其他的用户。 WITH HIERARCHY OPTION: 在对象的子对象(在视图上再建立视图)上授权给用户。
*** 给用户xifang授予SELECT, INSERT, DELETE 和 UPDATE表scott.emp的权限,代码: SQL> grant select, insert, delete, update on scott.emp to xifang; 授权成功。
要从用户或角色中撤销对象权限,仍然要使用REVOKE命令,其语法格式: REVOKE obj_privi | ALL ON schema.object FROM user | role | PUBLIC CASCADE CONSTRAINTS obj_privi: 表示对象的权限,可以是ALTER, EXECUTE, SELECT, UPDATE和INSERT等。 PUBLIC: 保留字,代表Oracle系统的所有权限。 CASCADE CONSTRAINTS: 表示有关联关系的权限也被撤销。 *** 从xifang用户撤销scott.emp表的UPDATE和DELETE权限,代码: SQL> connect system/1qaz2wsx 已连接。 SQL> revoke delete,update on scott.emp from xifang; 撤销成功。
说明:如果数据库管理员使用GRANT命令给用户A授予对象权限时带有WITH ADMIN OPTION选项,则该用户A有权将权限再次授予另外的用户B。在这种情况下,如果数据库管理员用REVOKE命令撤销A用户的对象权限时,用户B的对象权限也被撤销。由此可见,在进行系统权限回收和进行对象权限回收时,效果是不同的。
用户被授予的系统权限或对象权限都被记录在Oracle的数据字典里,了解某个用户被授予哪些系统权限和对象权限是确保应用系统安全的重要工作。
Oracle 11g用于存放用户,系统权限,对象权限有关的数据字典: 数据字典表 说明 dba_users 数据库用户基本信息表。 dba_sys_privs 已授予用户或角色的系统权限。 dba_tab_privis 数据库对象上的所有权限。 user_sys_privs 登录用户可以查看自己的系统权限。 role_sys_privs 登录用户查看自己的角色。 all_tables 用户自己可以查询的基本信息。 user_tab_privs 用户自己将哪些权限授予哪些用户。 all_tab_privs 哪些用户给自己授权。
角色就是简化权限管理的一种数据库对象。
角色是一个独立的数据库实体,它包括一组权限。也就是说,角色是包括一个或者多个权限的集合,它并不被哪个用户所拥有。角色可以被授权任何用户,也可以从用户中将角色收回。
使用角色可以简化全新的管理,可以仅用一条语句就能从用户那里授予或回收一组权限,而不必对用户一一授权。使用角色还可以实现权限的动态管理,例如,随着应用的变化可以增加或者减少角色的权限,这样通过改变角色的权限,就实现了改变多个用户的权限。
角色,用户及权限是一组关系密切的对象,既然角色是一组权限的集合,那么,它只有被授予某个用户才能有意义。
作为Oracle的数据库管理员,在创建和管理用户时,必须理解Oracle的权限与角色的关系。在复杂的大型应用系统中,要求对应用系统功能进行分类,从而形成角色的雏形。再使用CREATE ROLE语句将其创建成角色;最后根据用户工作的分工,将不同的角色(包括系统预定义的角色)授予各类用户。
如果应用系统的规模很小,用户数也不多,则可以直接将应用的权限授予用户,即使是这样,用户也必须对Oracle系统的预定义角色有所了解,因为一个用户至少被授予一个以上的预定义角色时才能使用Oracle系统资源。
另外,在创建角色时,可以为角色设置应用安全性。角色的安全性通过为角色设置口令进行保护,必须提供正确的口令才允许修改或设置角色。
所谓系统预定义角色是指在数据库安装完成后由系统自动创建的一些常用角色,这些角色已经由系统授予了相应的系统权限,可以由数据库管理员直接使用。一旦将这些角色授予用户,用户便具有了角色中所包含的系统权限。
下面列出的这几个系统预定义角色是最常被用到的。 ** CONNECT. ** RESOURCE. ** DBA. ** EXP_FULL_DATABASE. ** IMP_FULL_DATABASE.
角色CONNECT,RESOURCE及DBA主要用于数据库管理,这3个角色之间相互没有包含关系(有些系统权限可能有重叠)。数据库管理员需要分别授予CONNECT,RESOURCE和DBA角色。
对于一般的数据库开发人员,则需要授予CONNECT和RESOURCE角色。
角色IMP_FULL_DATABASE和EXP_FULL_DATABASE分别用于操作数据库的导入和导出工具,如操作数据库工具EXPDP, IMPDP,或者系统的EXP,IMP。在使用这些工具进行整个数据库的导出与导入工作时,需要具备这两个角色。
Oracle 11g中部分预定义角色的权限说明:
角色名 包含权限 CONNECT ALTER SESSION CREATE CLUSTER CREATE DATABASE LINK CREATE SEQUENCE CREATE SESSION CREATE SYNONYM CREATE TABLE CREATE VIEW RESOURCE CREATE CLUSTER CREATE INDEXTYPE CREATE OPERATOR CREATE PROCEDURE CREATE SEQUENCE CREATE TABLE CREATE TRIGGER CREATE TYPE DBA 所有权限,不受限制。 EXP_FULL_DATABASE SELECT ANY TABLE BACKUP ANY TABLE EXECUTE ANY PROCEDURE EXECUTE ANY TYPE ADMINISTER RESOURCE MANAGER IMP_FULL_DATABASE EXECUTE_CATALOG_ROLE SELECT_CATALOG_ROLE
不同版本的Oracle预定义的角色不一样多,但都可以从dba_roles数据字典中查询到。
*** 使用SELECT语句查询dba_roles数据字典中的角色信息,代码: SQL> set pagesize 50; SQL> select * from dba_roles;
如果系统预定义的角色不符合用户需要,那么数据库管理员可以创建更多的角色,创建用户自定义角色可以使用CREATE ROLE语句实现,代码:
CREATE ROLE role_name [NOT IDENTIFIED | IDENTIFIED BY [password] | [EXETERNALLY] | [GLOBALLY]] role_name:角色名。 IDENTIFIED BY password:角色口令。 IDENTIFIED BY EXETERNALLY: 表示角色名再操作系统下验证。 IDENTIFIED GLOBALLY: 表示用户是Oracle安全域中心服务器来验证,此角色由全局用户来使用。
*** 创建一个名为designer角色,该角色口令为123456,代码: SQL> connect system/1qaz2wsx 已连接。 SQL> create role designer identified by 123456; 角色已创建。
一旦角色创建完成,就可以对角色进行授权,给角色授权也是使用GRANT...TO语句来完成的。如果系统管理员具有GRANT_ANY_PRVILEGE权限,就可以对某个角色进行授权。例如授权CREATE SESSION, CREATE SYNONYM, CREATE VIEW等。
*** 给designer角色授予CREATE VIEW和CREATE TABLE权限,代码: SQL> grant create view,create table to designer; 授权成功。
在角色获得了权限之后,就可以把这个有使用价值的角色授予给某个用户了。把角色授予给某个用户仍然使用GRANT...TO语句来实现。
*** 把designer角色授予CREATE VIEW和CREATE TABLE权限,代码: SQL> grant create view,create table to designer; 授权成功。
在角色获得了权限之后,就可以把这个有使用价值的角色授予给某个用户了。把角色授予给某个用户仍然使用GRANT...TO语句来实现。
*** 把designer角色授权给用户dongfang,代码: SQL> grant designer to dongfang; 授权成功。
(1)查看角色所包含的权限
查看角色权限通常使用role_sys_privs数据字典。
*** 查询角色designer被授予的权限有哪些,代码: SQL> select * from role_sys_privs where role='DESIGNER';
(2)修改角色密码
修改角色密码包括取消角色密码和修改角色密码两种情况,可以使用ALTER ROLE语句来实现。
*** 首先取消designer角色密码,然后再重新给该角色设置一个密码,代码: SQL> alter role designer not identified; 角色已丢弃。 SQL> alter role designer identified by mrsoft; 角色已丢弃。
(3)设置当前用户要生效的角色
角色的生效是一个什么概念呢?假设用户a有b1,b2,b3三个角色,那么如果b1未失效,则b1所包含的权限对于a来讲是不拥有的,只有角色生效了,角色内的权限才作用于用户。做大可生效角色数由参数MAX_ENABLED_ROLES设定。用户登录后,Oracle将所有直接赋值给用户的权限和用户默认角色中的权限赋给用户。设置角色生效可使用SET ROLE语句。
*** 创建一个无需密码验证的角色queryer,然后设置该角色生效,接下来再设置带有密码的角色designer也生效,代码: SQL> create role queryer; 角色已创建。 SQL> set role queryer; 角色集。 SQL> set role designer identified by mrsoft; 角色集。
说明:如果要设置带有密码的角色生效,则必须在SET ROLE语句后面使用IDENTIFIED BY关键字指定角色的密码。
(4)删除角色
删除角色很简单,使用DROP ROLE语句即可实现。
*** 使用DROP ROLE语句删除角色queryer,代码: SQL> drop role queryer; 角色已删除。 删除角色后,原来拥有该角色的用户将不再拥有该角色,相应的权限也将失去。
创建角色和用户以后,给角色和用户授予的权限被记录在Oracle的数据字典里,作为Oracle数据库管理员,需要了解角色被授予了哪些权限及用户被授予了哪些权限和角色,从而对这个数据库的所有用户进行全面的管理。
如下是Oracle 11g用于存放用户,角色及权限的相关数据字典。
相关数据字典及其说明:
数据字典 说明 dba_col_pirvs 数据库列上的所有权限。 dba_role_privs 显示已经授予用户或其他角色的角色。 dba_tab_privs 数据库对象上的所有权限。 dba_sys_privs 已授予用户或角色的系统权限。
*** 查询hr用户被授予的系统角色,代码: SQL> select granted_role,default_role from dba_role_privs where grantee = 'HR'; 在这个模式中,如果用户要确定当前会话中的所有有效角色,可以通过session_role数据字典来查询。 *** 在scott模式下,查询当前用户的所有有效角色,代码: SQL> connect scott/tiger; 已连接。 SQL> select * from session_roles;
访问Oracle数据库时,必须提供用户名和密码,然后才能连接数据库。为了防止其他人员窃取用户密码,DBA必须充分考虑用户密码的安全性,以防止非法人员连接到数据库执行非法操作。对于大型数据库管理系统而言,数据库用户众多,并且不同用户担负不同的管理任务,为了有效的利用服务器资源,还应该限制不同用户的资源占用。
PROFILE作为用户配置文件,它是密码限制,资源限制的命名集合。PROFILE文件作为Oracle安全策略的重要组成部分,利用它可以对数据库用户进行基本的资源限制,并且可以对用户的密码进行管理。
在安装数据库时,Oracle会自动建立名为DEFAULT的默认配置文件。如果没有为新创建的用户指定DEFAULT文件,Oracle将自动为它指定DEFAULT配置文件。初始的DEFAULT文件没有进行任何密码和资源限制。使用PROFILE文件时需要注意如下事项:
(1)建立用户时,如果不指定PROFILE选项,Oracle会自动将DEFAULT分配给相应的数据库用户。 (2)建立PROFILE文件时,如果只设置了部分密码和资源限制选项,其他选项会自动使用默认值,即使DEFAULT文件中有相应选项的值。 (3)使用PROFILE管理密码时,密码管理选项总是处于被激活状态,但是如果使用PROFILE管理资源,必须要激活资源限制。 (4)一个用户只能分配一个PROFILE文件。如果要同时管理用户的密码和资源,那么在建立PROFILE文件时应该同时指定密码和资源选项。
当操作人员要连接到Oracle数据库时,需要提供用户名和密码。对于黑客或某些人而言,他们可能通过猜测或反复试验来破解密码。为了加强密码的安全性,可以使用PROFILE文件管理密码。PROFILE文件提供了一些密码管理选项,它们提供了强大的密码管理功能,从而确保密码的安全性。为了实现密码限制,必须首先建立PROFILE文件。建立PROFILE文件是使用CREATE PROFILE语句完成的,一般情况下,该语句由DBA执行,如果要以其他用户身份建立PROFILE文件,则要求该用户必须具有CREATE PROFILE系统权限。
使用PROFILE文件可以实现如下4种密码管理功能:账户锁定,密码的过期时间,密码历史和密码的复杂度。
账户的锁定策略是指用户在连续输入指定次数错误密码后,Oracle会自动锁定用户的账户,并且可以规定账户的锁定时间。Oracle为锁定账户提供了以下两个参数。
FAILED_LOGIN_ATEMPTS:该参数限制用户在登录到Oracle数据库时允许失败的次数。一旦某个用户尝试登录数据库的次数达到该值,则系统将该用户账户锁定。 PASSWORD_LOCK_TIME: 该参数用于指定账户被锁定的天数。
*** 创建PROFILE文件,要求设置连续失败次数为5,超过该次数后,账户将被锁定7天,然后使用ALTER USER语句将PROFILE文件(即lock_account)分配给用户dongfang,代码:
SQL> create profile lock_account limit failed_login_attempts 5 password_lock_time 7; 配置文件已配置。 SQL> alter user dongfang profile lock_account; 用户已更改。
在建立lock_account文件并将该文件分配给用户dongfang后,如果以用户dongfang身份连接到数据库,并且连续连接失败次数5次,Oracle将自动锁定该用户账户。此时,即使为用户dongfang提供了正确的密码,也无法连接到数据库。
在建立lock_account文件时,由于指定PASSWORD_LOCK_TIME的参数为7,所以账户锁定天数达到7天后,Oracle会自动解锁账户。
说明:如果建立 PROFILE 文件时没有提供 PASSWORD_LOCK_TIME参数,将自动使用默认值UNLIMITED,这种情况下,需要DBA手动解锁用户账户。
密码的过期时间是指强制用户定期修改自己的密码,当密码过期后,Oracle会及时提醒用户修改密码。密码宽限是指密码到期之后的宽限的使用时间。默认情况下,建立用户并为其提供密码之后,密码会一直生效。为了防止其他人破解用户账户的密码,可以强制普通用户定期改变密码。为了强制用户定期修改密码,Oracle提供了如下参数。
PASSWORD_LIFE_TIME:该参数用于设置用户密码的有效时间,单位为天数。超过这一时间段,用户必须重新设置口令。
PASSWORD_GRACE_TIME:该参数用于设置口令失效的"宽限时间"。如果口令达到PASSWORD_LIFE_TIME设置的失效时间,设置宽限时间后,用户仍然可以继续使用一段时间。
*** 下面创建一个PROFILE文件(即password_file_time),并设置用户的密码有效期为30天,密码宽限期为3天,然后使用ALTER USER语句将PROFILE文件(即password_life_time)分配给用户dongfang,代码: SQL> create profile password_life_time limit password_life_time 30 password_grace_time 3; 配置文件已创建。 SQL> alter user dongfang profile password_life_time; 用户已更改。
密码历史是用于控制账户密码的可重复使用次数或可重用时间。使用密码历史参数后,Oracle会将密码修改信息存放到数据字典中。这样,当修改密码时,Oracle会对新,旧密码进行比较,以确保用户不会重用过去已经用过的密码。关于密码历史有如下两个参数:
PASSWORD_REUSE_TIME: 该参数指定密码可重用的时间,单位是天。 PASSWORD_REUSE_MAX: 该参数设置密码在能够被重用之前,必须修改的次数。
说明:在使用密码历史选项时,只能使用其中的一个参数,并将另一个参数设置为UNLIMITED。
在PROFILE文件中,可以通过指定的函数来强制用户的密码必须具有一定的复杂度。例如,强制用户的密码不能与用户名相同。使用校验函数验证用户密码的复杂度时,只需要将这个函数的名称指定给PROFILE文件中的PASSWORD_VERIFY_FUNCTION参数,Oracle会自动使用该函数对用户密码和格式进行验证。
在Oracle 11g中,验证密码复杂度功能有新的改进。在"$ORACLE_HOME/rdbms/admin"目录下创建了一个新密码验证文件UTLPWDMG.SQL,其中不仅提供了先前的验证函数VERIFY_FUNCTIN,还提供了一个新建的VERIFY_FUNCTION_11G函数。
在大而复杂的多用户数据库环境中,因为用户众多,所以系统资源可能会成为影响性能的主要瓶颈,为了有效地利用系统资源,应该根据用户所承担任务的不同为其分配合理资源。PROFILE不仅可用于管理用户密码,还可以用于管理用户资源。
需要注意,如果是使用PROFILE管理资源,必须将RESOURCE_LIMIT参数设置为TRUE,以激活资源限制。由于该参数是动态参数,所以可以使用ALTER SYSTEM 语句进行修改。
*** 首先使用SHOW命令查看RESOURCE_LIMIT参数的值,然后使用ALTER SYSTEM命令修改该参数的值为TRUE,从而激活资源限制,代码: SQL> show parameter resource_limit; SQL> alter system set resource_limit=true; 系统已更改。
利用PROFILE配置文件,可以对以下系统资源进行限制。
(1)CPU时间:为了防止无休止地使用CPU时间,限制用户每次调用所使用的CPU时间以及在一次会话期间所使用的CPU时间。 (2)逻辑读:为了防止过多的使用系统地I/O操作,限制每次调用即会话读取的逻辑数据块数目。 (3)用户的并发会话数。 (4)会话空闲的限制:当一个会话空闲的时间达到了限制值时,当前事务被回滚,会话被终止并且所占用的资源被释放。 (5)会话可持续的时间:如果一个会话的总计连接时间达到了该限制值,当前事务被回滚,会话被终止并释放所占用的资源。 (6)会话所使用的SGA空间限制。
当一个会话或SQL语句占用的资源超过PROFILE文件中限制时,Oracle将终止并回退当前的事务,然后向用户返回错误的信息,如果受到的限制是会话级的在提交或回退事务后,用户会话将被终止;而受到调用级限制时,用户会话还能够继续进行,只是当前执行的SQL语句将被终止。
PROFILE文件中对各种资源限制的参数:
(1)SESSION_PER_USER: 用户可以同时连接的会话数量。如果用户的连接数达到该限制,则试图登录时将产生一条错误信息。 (2)CPU_PER_SESSION: 限制用户在一次数据库会话期间可以使用的CPU时间,单位为百分之一秒。当达到该时间值系统会终止该会话。如果用户还需要执行操作,则必须重新建立连接。 (3)CPU_PER_CALL: 该参数限制用户每条SQL语句所能使用的CPU时间,参数值是一个整数,单位是百分之一秒。 (4)LOGICAL_READS_PER_SESSION: 限制每个会话所能读取的数据块数量,包括从内存中读取的数据块和从磁盘中读取的数据块。 (5)CONNECT_TIME: 限制每个用户连接到数据库的最长时间,单位为分钟,当链接时间超出该设置时,连接终止。 (6)IDLE_TIME: 该参数限制每个用户会话连接到数据库的最长时间。超过该空闲时间,系统会终止该会话。
在Oracle中,PROFILE文件也是一种数据资源。DBA也可以使用相应的语句对其进行管理,包括修改配置文件,删除配置文件,激活或禁用配置文件。
(1)修改PROFILE文件
在创建PROFILE文件之后,还可以使用ALTER PROFILE语句修改其中的资源参数和密码参数。
*** 对password_life_time文件(即PROFILE文件)的资源限制参数进行修改,代码: SQL> alter profile password_life_time limit cpu_per_session 20000 session_per_user 10 cpu_per_call 500 password_life_time 180 failed_login_attempts 10; 配置文件已更改。
说明:对配置文件所做的修改只有在用户开始新的会话时才会生效。
(2)删除PROFILE文件
使用DROP PROFILE语句可以删除PROFILE文件。如果要删除的配置文件已经被指定给了用户,则必须在DROP PROFILE语句中使用CASCADE关键字。
*** 删除被分配给dongfang这个用户的password_life_time配置文件,代码: SQL> drop profile password_life_time cascade; 配置文件已删除。 说明:如果为用户指定的配置文件被删除,则Oracle将自动为用户重新指定DEFAULT配置文件。
在PROFILE文件被创建后,其信息被存储在数据字典中。通过查询这些数据字典,可以了解PROFILE文件的信息。
(1)显示用户的资源配置信息
建立或修改用户时,可以为用户分配PROFILE文件,如果没有为用户分配PROFILE文件,Oracle会自动将DEFAULT文件分配给用户。通过查询数据字典视图dba_users。可以显示用户使用的PROFILE文件。
*** 显示用户dongfang所使用的PROFILE文件,代码: SQL> select profile from dba_users where username='DONGFANG';
(2)显式指定PROFILE文件的资源配置信息
建立或修改PROFILE文件时,Oracle将PROFILE参数存放在数据字典中。通过查询dba_profile,可以显示PROFILE的密码限制,资源限制信息。
*** 显示lock_account文件的密码和资源限制信息,代码: SQL> column limit for a20; SQL> select resource_name,resource_type,limit from dba_profiles where profile='LOCK_ACCOUNT';