公司内部
Oracle数据库安全管理
主 题:Oracle数据库安全管理
项目名称:公司内部
撰写单位:创业慧康
作 者:屈毅
版 本 号:V1.0

日 期:2020-03-01

审核

功能 姓名 部门 签名 日期

文档历史

版本 修改原因 修改人 基于版本 日期
0.1 创建 屈毅 2020-03-01

参考文档

编号 文档名(链接)
1. http://blog.51cto.com/luoping/990190


**

概述

本文概要性讲述Oracle数据库安全管理, 使读者对Oracle的数据库安全管理有所了解。
包含内容:
1、 概要文件;
2、 管理用户;
3、 权限和角色;

概要文件

概要文件是Oracle安全策略的重要组成部分,利用概要文件可以对数据库用户进行基本的资源限制,并且可以对用户的口令进行管理。
概要文件是命名的数据库和系统资源限制集合。通过为数据库用户指定概要文件,可以控制用户在数据库和实例中所能使用的资源。通常DBA会将数据库中用户分为几种类型,为每类用户创建概要文件。一个数据库用户只能指定一个概要文件。
在安装数据库时,Oracle会自动建立名为DEFAULT的默认概要文件,如果在创建新的数据库用户时没有为他指定概要文件,Oracle将自动为他指定这个默认概要文件。另外,如果在用户自定义的概要文件中没有指定某项参数,Oracle将使用DEFAULT概要文件中相应的参数作为默认值。
在概要文件中还可以对用户的口令管理策略进行设置。

资源限制参数

  1. 利用概要文件,可以对以下几类数据库和系统资源进行限制:<br />l CPU时间<br />l 逻辑读<br />l 用户的并发会话数<br />l 空闲时间<br />l 连接时间<br />l 私有SGA区<br /> 对这些资源的限制是通过在概要文件中设置资源参数来实现的。资源参数的值可以是一个整数,也可以是UNLIMITED(即不受限制),还可以是DEFAULT(使用默认概要文件中的参数设置)。<br /> 大部分的资源限制都可以在两个级别进行:会话级或调用级。会话级资源限制是对用户在一个会话过程中所能使用的资源进行的限制,而调用级资源限制是对一条SQL语句在执行过程中所能使用的资源进行的限制。<br /> 当会话或一条SQL语句占用的资源超过概要文件中的限制时,Oracle将中止并回退当前的操作,然后向用户返回错误信息。这时用户仍然有机会提交或回退当前的事务。如果受到的是会话级限制,在提交或回退事务后用户会话被中止(断开连接),但是如果受到的是调用级限制,用户会话还能继续进行,只是当前执行的SQL语句被终止。<br /> 下面分别介绍在概要文件中使用的各种资源参数:<br />l SESSIONS_PER_USER 该参数限制每个用户所允许建立的最大并发会话数目。达到这个限制时,用户不能再建立任何数据库连接。<br />l CPU_PER_SESSION 该参数限制每个会话所能使用的CPU时间。参数值是一个整数,单位为百分之一秒。<br />l CUP_PER_CALL 该参数限制每条SQL语句所能使用的CPU时间。参数值是一个整数,单位为百分之一秒。<br />l LAGICAL_READS_PER_SESSION 该参数限制每个会话所能读取的数据块数目,包括从内存中读取的数据块和从硬盘中读取的数据块。<br />l LAGICAL_READS_PER_CALL 该参数限制每条SQL语句所能读取的数据块数目,包括从内存中读取的数据块和从硬盘中读取的数据块。<br />l PRIVATE_SGA 在共享服务器操作模式下,执行SQL语句和PL/SQL语句时Oracle将在SGA中创建私有的SQL区。该参数限制在SGA中为每个会话所能分配的最大私有SQL区大小。参数值是一个整数,单位为KM,如果不指定单位,则表示以字节为单位。在专用服务器操作模式下,该参数不起作用(私有SQL区位于服务进程的PGA中)。<br />l CONNECT_TIME 该参数限制每个会话能连接到数据库的最长时间。当时间达到该参数的限制时,用户会话将自动断开。参数值是一个整数,单位为分钟。<br />l IDLE_TIME 该参数限制每个会话所允许的最大连续空闲时间。当会话不对数据库进行任何操作时,它处于空闲状态。如果一个会话持续的空闲时间达到参数的限制,该会话将自动断开。参数值是一个整数,单位为分钟。<br />l COMPOSITE_LIMIT 该参数用于设置“组合资源限制,为一个会话指定资源总限额。参数值是一个整数,通过资源以加权和的形式进行计算。

激活和禁用资源限制

  1. 通过概要文件实现的资源限制并不总是有效的,资源限制可以具有激活和禁用两种状态。只有在资源限制处于激活状态时,Oracle才会对用户会话和SQL语句所使用的资源进行检查和限制。<br /> 修改数据库的资源限制状态有两种方式:<br />l 在数据库启动之前,可以通过设置初始化参数RESOURCE_LIMIT来决定资源限制的状态。如果RESOURCE_LIMIT参数设置为TRUE,启动数据库后资源限制将处于激活状态。如果RESOURCE_LIMIT参数设置为FALSE,启动数据库后资源限制将处于禁用状态。默认情况下,RESOURCE_LIMIT参数为FALSE。<br />l 在数据库启动之后(处于打开状态),可以使用ALTER SYSTEM语句来改变资源限制的状态:<br />ALTER SYSTEM SET RESOURCE_LIMIT = TRUE;

口令策略参数

  1. 概要文件除了可以用于资源管理外,还可以对用户的口令策略进行控制。使用概要文件可以实现如下三种口令策略:<br />l 账户的锁定。锁定策略是指用户在连续输入多次错误的口令后,将由Oracle自动锁定用户的账户,并且可以设置账户锁定的时间。<br />l 口令的过期时间。口令过期策略用于强制用户定期修改自己的口令。当口令过期后,Oracle将随时提醒用户修改口令。如果用户仍然不修改自己的口令,Oracle将使他的口令失效。<br />l 口令的复杂度。在概要文件中可以通过指定的函数来强制用户的口令必须具有一定的复杂度。比如强制用户的口令不能与用户名相同,或者不能在口令中包含常用英文单词,或者在口令中必须包含一定数量的特殊字符。<br />下面分别介绍在概要文件中使用的各种口令参数(所有指定时间的口令参数都以天为单位):<br />l FAILED_LOGIN_ATTEMPTS 该参数指定允许的输入错误口令的次数,超过该次数后用户账户被自动锁定。<br />l PASSWORD_LOCK_TIME 该参数指定用户账户由于口令输入错误而被锁定后,持续保持锁定状态的时间。<br />l PASSOWRD_LIFE_TIME 该参数指定同一个用户口令可以持续使用的时间。如果达到这个限制之前用户还没有更换另外一个口令,他的口令将失效。这时必须由DBA为他重新设置新的口令。<br />l PASSWORD_GRACE_TIME 该参数指定用户口令过期的时间。如果在达到这个限制之前用户还没有更换另外一个口令,Oracle将对他提出警告。在口令过期之后,用户在达到PASSOWRD_LIFE_TIME参数的限制之前有机会主动修改口令。<br />l PASSWORD_REUSE_TIME 该参数指定用户在能够重复使用一个口令之前必须经过的时间。<br />l PASSWORD_REUSE_MAX 该参数指定用户在能够重复使用一个口令之前必须对口令修改的次数。PASSWORD_REUSE_TIMEPASSWORD_REUSE_MAX只能设置一个,而另一个参数必须指定为UNLIMITED。<br />l PASSWORD_VERIFY_FUNCTION 该参数指定用于验证用户口令复杂度的函数。Oracle提供了一个名称为VERIFY_FUNCTION的默认口令复杂度验证的函数,他的脚本保存在ORACLE_HOME\rdbms\admin目录中,脚本名称为utlpwdmg.sql

创建并使用概要文件

  1. 使用CREATE PROFILE语句可以创建概要文件,执行该语句的用户必须具有CREATE PORFILE系统权限。下面是创建例子:<br />create profile ACCOUNTING_USER limit<br /> sessions_per_user 6 --每个用户最多只能建立6个数据库会话<br /> cpu_per_session unlimited<br /> cpu_per_call 6000 --会话中执行的每条SQL语句最多只能占用6000个单位(百分之一秒)的CPU时间<br /> connect_time 1440 --每个会话持续连接到数据库的最长时间为24个小时<br /> idle_time 120 --保持2个小时的空闲状态后会话将自动断开连接<br /> logical_reads_per_session unlimited<br /> logical_reads_per_call 1000000 --会话中执行的每条SQL语句最多只能读取 1000000个数据块<br /> composite_limit unlimited<br /> private_sga unlimited<br /> failed_login_attempts 6 --允许连续6次输入错误的口令,如果第7次错误,账户自动锁定,由DBA来解除锁定<br /> password_life_time 31 --同一个口令连续使用的时间不能超过31天<br /> password_reuse_time 90 90天后才允许重复使用同一个口令<br /> password_reuse_max unlimited<br /> password_lock_time unlimited<br /> password_grace_time 30 --每隔30天修改一次口令<br /> password_verify_function verify_function; --使用默认的口令复杂度验证函数对用户口令进行检查。<br />DBA可以根据需要使用下面的语句来修改DEFAULT概要文件中的参数设置:<br />ALTER PROFILE DEFAULT LIMIT …;<br />使用CREATE USER语句创建用户时,可以通过PROFILE子句为新建用户指定概要文件。另外在使用ALTER USER 语句修改用户时也可以为他指定概要文件:<br />ALTER USER SCOOT PROFILE ACCOUNTING_USER;<br />对概要文件所做的修改只有在用户开始下一个新的会话时才会生效。另外如果使用ALTER PROFILE语句对DEFAULT概要文件进行了修改,则所有概要文件中设置为DEFAULT的参数都会受到影响。<br /> 使用DROP PROFILE语句可以删除概要文件,如果要删除的概要文件已经指定给了用户,则使用CASCADE关键字:<br /> ALTER PROFILE ACCOUNTING_USER CASCADE;<br /> 如果为用户所指定的概要文件已经被删除,Oracle将自动为用户重新指定DEFAULT概要文件。

管理用户

用户在访问Oracle数据库时必须提供一个数据库账户,只有具有合法身份的用户才能够访问数据库。因此,如何对数据库中用户进行控制和管理,是DBA安全策略中的重要组成部分。<br />    在Oracle数据库中创建的任何用户都具有如下4个基本属性:<br />l  认证方式  每个用户在连接到数据库时都需要进行身份验证。身份验证可以通过操作系统进行,也可以通过数据库进行,或者是通过独立的网络服务器进行。<br />l  默认表空间与临时表空间  用户在创建数据库对象时如果没有显式地指定对象所处的表空间,Oracle将在用户默认表空间中创建对象。此外,如果用户的操作需要使用临时存储空间,Oracle将在用户的临时表空间中为他分配存储空间。<br />l  空间配额  用户在某个指定的表空间中所能使用的存储空间称为他在这个表空间中的空间配额。<br />l  概要文件  每个用户都必须拥有一个唯一的概要文件。在概要文件中设置了用户的资源限制和口令策略。如果没有为用户指定概要文件,Oracle将为他自动指定DEFAULT概要文件。<br />使用CREATE USER语句可以创建一个新的数据库用户,在创建用户时必须指定用户的认证方式。一般会通过Oracle数据库对用户身份进行验证,既采用数据库认证方式。在这种情况下,创建用户时必须为新用户指定一个口令,口令以加密方式保存在数据库中。当用户连接数据库时,Oracle从数据库中提取口令来对用户身份进行验证。<br />比如,利用下面的语句将创建一个名称为BSOFT的新用户,同时为他指定口令、默认表空间、临时表空间、空间配额和概要文件:<br />    CREATE USER BSOFT IDENTIFIED BY 1#$^^&&<br />      DEFAULT TABLESPACE BSOFT<br />      QUOTA 100M ON BSOFT<br />      QUOTA 500K ON indx<br />      TEMPORARY TABLESPACE temp<br />      PROFILE default;<br />如果没有指定默认表空间,Oracle会把SYSTEM表空间作为用户的默认表空间。为用户指定了默认表空间之后,还必须使用QUOTA子句来为用户在默认表空间中分配的空间配额。分配时可以KB或MB作为单位,也可以指定UNLIMITED,即用户在该表空间中所能使用的存储空间不受限制。如果用户的空间配额已经用完,他将不能再创建任何数据库对象,而且已经创建的数据库对象也不能再获得新的存储空间。<br />如果要回收用户创建数据库对象的权利,可以简单地将他在所有表空间中的配额设置为0。这时该用户已经创建的数据库对象仍然被保留,但是无法再建立新的数据库对象。另外需要注意的一点是,如果用户具有UNLIMITED TABLESPACE系统权限,则能够无限制地使用任何表空间的存储空间,这时他的配额设置被忽略。<br />新创建的用户并不能立即连接到数据库中,因为他还不具有CREATE SESSION系统权限。因此在建立用户之后,通常会需要使用GRANT语句为他授予CREATE SESSION系统权限,使他具有连接到数据库中的能力:GRANT CREATE SESSION TO…;<br />更为便捷的方式是为新用户直接授予Oracle中预定义的CONNECT角色。在CONNECT角色中包含了一些基本的权限,其中包括CREATE SESSION系统权限:GRANT CONNECT TO …;<br />    可以使用ALTER USER语句对用户进行修改:<br />    ALTER USER BSOFT IDENTIFIED BY 0*&&%#<br />      DEFAULT TABLESPACE user<br />      QUOTA 200M ON BSOFT<br />      TEMPORARY TABLESPACE tempqry;<br />    ALTER USER语句最常用的情况是用来修改用户自己的口令,比如<br />ALTER USER BSOFT IDENTIFIED BY 0*&&%#;<br />    任何用户都可以使用ALTER USER … IDENTIFIED BY语句来修改自己的口令,而不需要具有任何其他权限。但是如果要修改其他用户的口令,则必须具有ALTER USER系统权限。<br />    另外,DBA还会经常使用ALTER USER语句进行如下操作:<br />l  锁定或解锁用户账户<br />ALTER USER … ACCOUNT LOCK; ALTER USER … ACCOUNT UNLOCK;<br />l  将用户口令设置为过期<br />ALTER USER … PASSWORD EXPIER;<br />    使用DROP USER语句可以删除已有的用户,执行该语句的用户必须具有DROP USER系统权限。如果用户当前正连接到数据库中,则不能删除这个用户。要删除已连接的用户,首先必须使用ALTER SYSTEM … KILL SESSION语句终止他的会话,然后再将其删除。如果要删除的用户包含对象,必须在DROP USER子句中指定CASCADE关键字,否则Oracle将返回错误信息。<br />比如,删除用户同时删除他所拥有的所有表、索引等对象:<br />DROP USER … CASCADE;

权限和角色

Oracle通过使用系统权限与对象权限来限制用户可以在数据库做什么,不能做什么。而角色则是一个命名的权限集合,DBA可以利用角色来简化权限管理工作。<br />    权限可以通过如下两种方法授予用户:<br />l  直接将权限授予用户(也称为显式地为用户授予权限)<br />l  首先将权限授予角色,然后再将角色授予用户(也称为隐含地为用户授予权限)<br />在Oracle中,权限一共可以分为两类,他们分别是:<br />l  对象权限  对象权限是针对某个特定的对象执行各种操作的权力<br />l  系统权限  系统权限是在数据库级别执行某种操作,或者针对某一类对象执行某种操作的权力

权限

系统权限可以被授予用户、角色或PUBLIC公共用户组。PUBLIC是一个在创建数据库时自动建立的用户组。如果将某个权限授予PUBLIC用户组,数据库中的任何用户都将具有该权限。<br />    系统权限大致上还可以分为两类:<br />l  一类系统权限是针对数据库中某一类型的数据库对象的。比如SELECT ANY TABLE、DROP ANY INDWX<br />l  另一类系统权限是针对某种数据库级别的操作。比如ALTER SYSTEM、CREATE SESSION<br />在使用系统权限时,有以下几点特殊的问题需要注意:<br />l  要连接到数据库中,用户必须具有CREATE SESSION系统权限。<br />l  要删减其他模式中的表,用户必须具有DROP ANY TABLE系统权限。<br />l  如果用户具有CREATE ANY PROCEDURE系统权限(或EXECUTE ANY PROCEDURE系统权限),则能够创建、替换或删除(或执行)任何存储过程、包和函数。<br />l  如果用户具有CREATE TABLE系统权限,则能够在自己的模式中创建、修改、删除或查询任何表。<br />l  SELECT、INSERT、UPDATE与DELETE都是对象权限,他们只是针对某个特定对象的操作权限。但是SELECT ANY、INSERT ANY、UPDATE ANY与DELETE ANY都是系统权限,他们并不是针对某个特定对象的,而是针对数据库中某一类对象的操作权限。<br />另外,如果在授予用户系统权限时使用了WITH ADMIN OPTION子句,被授权的用户还可以将这项系统权限再授予其他用户。<br />在使用对象权限时,有以下几点特殊的问题需要注意:<br />对象权限可以被授予用户、角色或PUBLIC公共用户组<br />用户只有具有某个表的所有对象权限,他才有权锁定这个表<br />SELECT对象权限不能授予表中的字段,只能授予整个表。因此,如果希望用户只能查询到表中的部分字段,唯一的方法是为表创建视图,然后将视图的SELECT对象权限授予用户。

角色

角色可以看做为一组命名的权限,利用角色可以将一组权限一次性授予用户,或者一次性将一组权限回收。因此,通过利用角色,可以大大简化DBA的权限管理操作。<br />    使用CREATE ROLE语句可以创建一个新的角色。在角色刚刚创建时,他并不具有任何权限,这时的角色是没有用处的。因此在创建角色之后,通常会立即为他授予权限。<br />    在GRANT关键字之后指定角色的名称,然后在TO关键字之后指定用户名,即可将角色授予指定的用户:<br />    GREANT … TO …;<br />    使用REVOKE语句可以回收已经授予用户的角色:<br />    REVOKE … FROM …;<br />