一、数据库安全性概述
1.数据库的安全性主要包括两个方面的含义:
一方面是防止非法用户对数据库的访问,未授权的用户不能登录数据库;
另一方面是每个数据库用户都有不同的操作权限,只能进行自己权限范围内的操作。
2.Oracle数据安全控制机制
用户管理
权限管理
角色管理
表空间设置和配额
用户资源限制
数据库审计
3.Oracle数据库的安全可以分为两类:
系统安全性
系统安全性是指在系统级控制数据库的存取和使用的机制,包括有效的用户名与口令的组合、用户是否被授权可连接数据库、用户创建数据库对象时可以使用的磁盘空间大小、用户的资源限制、是否启动了数据库审计功能,以及用户可进行哪些系统操作等。
数据安全性
数据安全性是指在对象级控制数据库的存取和使用机制,包括用户可存取的模式对象和在该对象上允许进行的操作等。
二、用户管理
1.用户管理概述
Oracle数据库初始用户
SYS:是数据库中具有最高权限的数据库管理员,可以启动、修改和关闭数据库,拥有数据字典;
SYSTEM:是一个辅助的数据库管理员,不能启动和关闭数据库,但可以进行其他一些管理工作,如创建用户、删除用户等。
SCOTT:是一个用于测试网络连接的用户,其口令为TIGER。
PUBLIC:实质上是一个用户组,数据库中任何一个用户都属于该组成员。要为数据库中每个用户都授予某个权限,只需把权限授予PUBLIC就可以了。
2.用户属性
用户身份认证方式
数据库身份认证
操作系统身份认证
网络身份认证
管理员身份认证
默认表空间
当用户在创建数据库对象时,如果没有显式地指明该对象在哪个表空间中存储,系统会自动将该数据库对象存储在当前用户的默认表空间中。
如果没有为用户指定默认表空间,则系统将数据库的默认表空间作为用户的默认表空间。
临时表空间
当用户进行排序、汇总和执行连接、分组等操作时,系统首先使用内存中的排序区SORT_AREA_SIZE,如果该区域内存不够,则自动使用用户的临时表空间。
在Oracle 11g中,如果没有为用户指定临时表空间,则系统将数据库的默认临时表空间作为用户的临时表空间。
表空间配额
表空间配额限制用户在永久表空间中可以使用的存储空间的大小,默认情况下,新建用户在任何表空间中都没有任何配额。
用户在临时表空间中不需要配额。
概要文件
每个用户都必须有一个概要文件,从会话级和调用级两个层次限制用户对数据库系统资源的使用,同时设置用户的口令管理策略。如果没有为用户指定概要文件,Oracle将为用户自动指定DEFAULT概要文件。
账户状态
在创建用户的同时,可以设定用户的初始状态,包括用户口令是否过期以及账户是否锁定等。Oracle允许任何时候对帐户进行锁定或解锁。锁定账户后,用户就不能与Oracle数据库建立连接,必须对账户解锁后才允许用户访问数据库。
3.创建用户
注意
在创建新用户后,必须为用户授予适当的权限,用户才可以进行相应的数据库操作。例如,授予用户CREATE SESSION权限后,用户才可以连接到数据库。
例 :
创建一个用户user3,口令为user3,默认表空间为USERS,在该表空间的配额为10 MB,初始状态为锁定。
CREATE USER user3 IDENTIFIED BY user3
DEFAULT TABLESPACE USERS QUOTA 10M ON USERS ACCOUNT LOCK;
例:
创建一个用户user4,口令为user4,默认表空间为USERS,在该表空间的配额为10 MB。口令设置为过期状态,即首次连接数据库时需要修改口令。概要文件为example_profile(假设该概要文件已经创建)。
CREATE USER user4 IDENTIFIED BY user4
DEFAULT TABLESPACE USERS
QUOTA 10M ON USERS
PROFILE example_profile
PASSWORD EXPIRE;
4.修改用户
例:
将用户user3的口令修改为newuser3,同时将该用户解锁。
ALTER USER user3
IDENTIFIED BY newuser3 ACCOUNT UNLOCK;
例:
修改用户user4的默认表空间为ORCLTBS1,在该表空间的配额为20 MB,在USERS表空间的配额为10 MB。
ALTER USER user4
DEFAULT TABLESPACE ORCLTBS1
QUOTA 20M ON ORCLTBS1
QUOTA 10M ON USERS;
用户的锁定与解锁
某个用户暂时离开工作
某个用户永久离开工作
示例
ALTER USER user3 ACCOUNT LOCK;
ALTER USER user3 ACCOUNT UNLOCK;
5.删除用户
基本语法
DROP USER user_name [ CASCADE ];
步骤(使用了cascade-用户已经创建模式对象)
先删除用户所拥有的对象
再删除用户
将参照该用户对象的其他数据库对象标志为INVALID
6.查询用户信息
ALL_USERS:包含数据库所有用户的用户名、用户ID和用户创建时间。
DBA_USERS:包含数据库所有用户的详细信息。
USER_USERS:包含当前用户的详细信息。
DBA_TS_QUOTAS:包含所有用户的表空间配额信息。
USER_TS_QUOTAS:包含当前用户的表空间配额信息。
V$SESSION:包含用户会话信息。
V$OPEN_CURSOR:包含用户执行的SQL语句信息。
例:
查看数据库所有用户名及其默认表空间。
SELECT USERNAME,DEFAULT_TABLESPACE
FROM DBA_USERS;
例:
查看数据库中各用户的登录时间、会话号。
SELECT
SID,SERIAL#,LOGON_TIME,USERNAME
FROM V$SESSION;
三、权限管理
1.权限管理概述
概念
所谓权限就是执行特定类型SQL命令或访问其他用户的对象的权利。
用户在数据库中可以执行什么样的操作,以及可以对哪些对象进行操作,完全取决于该用户所拥有的权限。
分类
系统权限:
系统权限是指在数据库级别执行某种操作的权限,或针对某一类对象执行某种操作的权限。例如,CREATE SESSION权限、CREATE ANY TABLE权限。
对象权限:
对象权限是指对某个特定的数据库对象执行某种操作的权限。例如,对特定表的插入、删除、修改、查询的权限。
授权方法
直接授权:利用GRANT命令直接为用户授权。
间接授权:先将权限授予角色,然后再将角色授予用户。
2.系统权限管理
系统权限分类
一类是对数据库某一类对象的操作能力,通常带有ANY关键字。例如,CREATE ANY INDEX,ALTER ANY INDEX,DROP ANY INDEX 。
另一类系统权限是数据库级别的某种操作能力。例如,CREATE SESSION。
系统权限的授权
语法为
GRANT sys_priv_list
TO user_list|role_list|PUBLIC
[WITH ADMIN OPTION];
参数说明:
sys_priv_list:表示系统权限列表,以逗号分隔;
user_list:表示用户列表,以逗号分隔;
role_list:表示角色列表,以逗号分隔;
PUBLIC:表示对系统中所有用户授权;
WITH ADMIN OPTION:表示允许系统权限接收者再把此权限授予其他用户。
系统权限授予时需要注意的几点:
只有DBA才应当拥有ALTER DATABASE 系统权限。
应用程序开发者一般需要拥有CREATE TABLE、CREATE VIEW和CREATE INDEX等系统权限。
普通用户一般只具有CREATE SESSION系统权限。
只有授权时带有WITH ADMIN OPTION子句时,用户才可以将获得的系统权限再授予其他用户,即系统权限的传递性。
例:
为PUBLIC用户组授予CREATE SESSION系统权限。
GRANT CREATE SESSION TO PUBLIC;
为用户user1授予CREATE SESSION,CREATE TABLE,CREATE INDEX系统权限。
GRANT CREATE SESSION,CREATE TABLE,CREATE VIEW TO user1;
为用户user2授予CREATE SESSION,CREATE TABLE ,CREATE INDEX系统权限。user2获得权限后,为用户user3授予CREATE TABLE权限。
GRANT CREATE SESSION,CREATE TABLE,
CREATE VIEW TO user2 WITH ADMIN OPTION;
CONNECT user2/user2 @ORCL
GRANT CREATE TABLE TO user3;
系统权限的回收
语法为
REVOKE sys_priv_list
FROM user_list|role_list|PUBLIC;
注意事项
多个管理员授予用户同一个系统权限后,其中一个管理员回收其授予该用户的系统权限时,该用户将不再拥有相应的系统权限。
为了回收用户系统权限的传递性(授权时使用了WITH ADMIN OPTION子句),必须先回收其系统权限,然后再授予其相应的系统权限。
如果一个用户获得的系统权限具有传递性,并且给其他用户授权,那么该用户系统权限被回收后,其他用户的系统权限并不受影响。
3.对象权限管理
对象权限分类
在Oracle数据库中共有9种类型的对象权限,不同类型的模式对象有不同的对象权限,而有的对象并没有对象权限,只能通过系统权限进行控制,如簇、索引、触发器、数据库链接等。
对象权限的授权
语法
GRANT obj_priv_list|ALL
ON [schema.]object
TO user_list|role_list
[WITH GRANT OPTION];
参数说明
obj_priv_list:表示对象权限列表,以逗号分隔;
[schema.]object:表示指定的模式对象,默认为当前模式中的对象;
user_list:表示用户列表,以逗号分隔;
role_list:表示角色列表,以逗号分隔;
WITH GRANT OPTION:表示允许对象权限接收者把此对象权限授予其他用户。
例:
将scott模式下的emp表的SELECT,UPDATE,INSERT权限授予user1用户。
GRANT SELECT,INSERT,UPDATE
ON scott.emp TO user1;
将scott模式下的emp表的SELECT,UPDATE,INSERT权限授予user2用户。user2用户再将emp表的SELECT,UPDATE权限授予user3用户。
GRANT SELECT,INSERT,UPDATE
ON scott.emp
TO user2
WITH GRANT OPTION;
CONNECT user2/[email protected]
GRANT SELECT,UPDATE
ON scott.emp
TO user3;
对象权限的回收
语法
REVOKE obj_priv_list | ALL ON [schema.]object
FROM user_list|role_list;
注意事项
多个管理员授予用户同一个对象权限后,其中一个管理员回收其授予该用户的对象权限时,该用户不再拥有相应的对象权限。
为了回收用户对象权限的传递性(授权时使用了WITH GRANT OPTION子句),必须先回收其对象权限,然后再授予其相应的对象权限。
如果一个用户获得的对象权限具有传递性(授权时使用了WITH GRANT OPTION子句),并且给其他用户授权,那么该用户的对象权限被回收后,其他用户的对象权限也被回收。
WITH ADMIN OPTION与WITH GRANT OPTION比较
当甲用户授权给乙用户,且**该选项,则被授权的乙用户具有管理该权限的能力:或者能把得到的权限再授给其他用户丙,或者能回收授出去的权限。当甲用户收回乙用户的权限后,乙用户曾经授给丙用户的权限仍然存在
当甲用户授权给乙用户,且**该选项,则被授权的乙用户具有管理该权限的能力:或者能把得到的权限再授给其他用户丙,或者能回收授出去的权限。当甲用户收回乙用户的权限后,乙用户曾经授给丙用户的权限也被回收。
4.查询权限信息
DBA_TAB_PRIVS:包含数据库所有对象的授权信息
ALL_TAB_PRIVS:包含数据库所有用户和PUBLIC用户组的对象授权信息
USER_TAB_PRIVS:包含当前用户对象的授权信息
DBA_COL_PRIVS:包含所有字段已授予的对象权限
ALL_COL_PRIVS:包含所有字段已授予的对象权限信息
USER_COL_PRIVS:包含当前用户所有字段已授予的对象权限信息。
DBA_SYS_PRIVS:包含授予用户或角色的系统权限信息
USER_SYS_PRIVS:包含授予当前用户的系统权限信。
四、角色管理
1.Oracle数据库角色概述
所谓角色就是一系列相关权限的集合(对权限的批量管理)
2.预定义角色
预定义角色概述
预定义角色是指在Oracle数据库创建时由系统自动创建的一些常用的角色,这些角色已经由系统授予了相应的权限。
DBA可以直接利用预定义的角色为用户授权,也可以修改预定义角色的权限。
Oracle数据库中有30多个预定义角色。
可以通过数据字典视图DBA_ROLES查询当前数据库中所有的预定义角色,通过DBA_SYS_PRIVS查询各个预定义角色所具有的系统权限。
3.自定义角色
创建角色
语法为
CREATE ROLE role_name [NOT IDENTIFIED][IDENTIFIED BY password];
参数说明
role_name:用于指定自定义角色名称,该名称不能与任何用户名或其他角色相同;
NOT IDENTIFIED:用于指定该角色由数据库授权,使该角色生效时不需要口令;
IDENTIFIED BY password:用于设置角色生效时的认证口令。
例:
CREATE ROLE high_manager_role;
CREATE ROLE middle_manager_role IDENTIFIED BY middlerole;
CREATE ROLE low_manager_role IDENTIFIED BY lowrole;
4.角色权限的授予与回收
说明
给角色授予适当的系统权限、对象权限或已有角色。
在数据库运行过程中,可以为角色增加权限,也可以回收其权限。
给角色授权时应该注意,一个角色可以被授予另一个角色,但不能授予其本身,不能产生循环授权。
例:
GRANT CONNECT,CREATE TABLE,CREATE VIEW TO low_manager_role;
GRANT CONNECT,CREATE TABLE,CREATE VIEW TO middle_manager_role;
GRANT CONNECT,RESOURCE,DBA TO high_manager_role;
GRANT SELECT,UPDATE,INSERT,DELETE ON scott.emp TO high_manager_role;
REVOKE CONNECT FROM low_manager_role;
REVOKE CREATE TABLE,CREATE VIEW FROM middle_manager_role;
REVOKE UPDATE,DELETE ,INSERT ON scott.emp FROM high_manager_role;
5.修改角色
概念
修改角色是指修改角色生效或失效时的认证方式,也就是说,是否必须经过Oracle确认才允许对角色进行修改。
修改角色的语法
ALTER ROLE role_name
[NOT IDENTIFIED]|[IDENTIFIED BY password];
例:
ALTER ROLE high_manager_role IDENTIFIED BY highrole;
ALTER ROLE middle_manager_role NOT IDENTIFIED;
6.角色的生效与失效
概念
所谓角色的失效是指角色暂时不可用。当一个角色生效或失效时,用户从角色中获得的权限也生效或失效。因此,通过设置角色的生效或失效,可以动态改变用户的权限。
在进行角色生效或失效设置时,需要输入角色的认证口令,避免非法设置。
语法
SET ROLE [role_name[IDENTIFIED BY password ]]|[ALL [EXCEPT role_name]]|[NONE];
参数说明
role_name:表示进行生效或失效设置的角色名称;
IDENTIFIED BY password:用于设置角色生效或失效时的认证口令;
ALL:表示使当前用户所有角色生效;
EXCEPT role_name:表示除了特定角色外,其余所有角色生效;
NONE:表示使当前用户所有角色失效。
例:
SET ROLE NONE;
SET ROLE high_manager_role IDENTIFIED BY highrole;
SET ROLE middle_manager_role,low_manager_low IDENTIFIED BY lowrole;
SET ROLE ALL EXCEPT low_manager_role,middle_manager_role;
7.删除角色
语法结构
DROP ROLE role_name;
说明
如果某个角色不再需要,则可以使用DROP ROLE语句删除角色。角色被删除后,用户通过该角色获得的权限被回收。
8.利用角色进行权限管理
给用户或角色授予角色
语法
GRANT role_list TO user_list|role_list;
例:
将CONNECT,high_manager_role角色授予用户user1,将RESOURCE,CONNECT角色授予角色middle_manager_role。
GRANT CONNECT,high_manager_role TO user1;
GRANT RESOURCE,CONNECT TO middle_manager_role;
从用户或角色回收角色
语法
REVOKE role_list FROM user_list|role_list;
例:
回收角色middle_manager_role的RESOURCE,CONNECT角色。
SQL>REVOKE RESOURCE,CONNECT FROM middle_manager_role;
用户角色的**或屏蔽
语法
ALTER USER user_name DEFAULT ROLE
[role_name]|[ALL [EXCEPT role_name]]|
[NONE];
例:
ALTER USER user1 DEFAULT ROLE NONE;
ALTER USER user1 DEFAULT ROLE CONNECT,DBA;
ALTER USER user1 DEFAULT ROLE ALL;
ALTER USER user1 DEFAULT ROLE ALL EXCEPT DBA;
9.查询角色信息
DBA_ROLES:包含数据库中所有角色及其描述;
DBA_ROLE_PRIVS:包含为数据库中所有用户和角色授予的角色信息;
USER_ROLE_PRIVS:包含为当前用户授予的角色信息;
ROLE_ROLE_PRIVS:为角色授予的角色信息;
ROLE_SYS_PRIVS:为角色授予的系统权限信息;
ROLE_TAB_PRIVS:为角色授予的对象权限信息;
SESSION_PRIVS:当前会话所具有的系统权限信息;
SESSION_ROLES:当前会话所具有的角色信息。
查询角色CONNECT所具有的系统权限信息。
SELECT *
FROM ROLE_SYS_PRIVS
WHERE ROLE='CONNECT';
查询DBA角色被授予的角色信息。
SELECT *
FROM ROLE_ROLE_PRIVS
WHERE ROLE='DBA';