Oracle Database,是甲骨文公司的一款关系数据库管理系统,在数据库领域一直处于领先地位。Oracle数据库可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的适应高吞吐量的数据库,其性能十分强悍。如果你想学习Oracle数据库的使用,请访问我们的Oracle数据库教程。这里我们着重介绍其安全性问题。
本章共分为以下六个小节:
一、安全控制策略概述
安全性是评估一个数据库的重要指标,Oracle数据库从3个层次上采取安全控制策略:
- 系统安全性。在系统级别上控制数据库的存取和使用机制,包括有效的用户名与口令、是否可以连接数据库、用户可以进行哪些系统操作等;
- 数据安全性。在数据库模式对象级别上控制数据库的存取和使用机制。用户要对某个模式对象进行操作,必须要有操作的权限;
- 网络安全性。Oracle通过分发Wallet、数字证书、SSL安全套接字和数据密钥等办法来保证数据库的网络传输安全性。
数据库的安全可以从以下几个方面进行管理:
- 用户账户管理
- 用户身份认证方式管理。Oracle提供多种级别的数据库用户身份认证方式,包括系统、数据库、网络3种类型的身份认证方式
- 权限和角色管理。通过管理权限和角色,限制用户对数据库的访问和操作
- 数据加密管理。通过数据加密来保证网络传输的安全性
- 表空间设置和配额。通过设置用户的存储表空间、临时表空间以及用户在表空间上使用的配额,可以有效控制用户对数据库存储空间的使用
- 用户资源限制。通过概要文件设置,可以限制用户对数据库资源的使用
- 数据库审计。监视和记录数据库中的活动,包括审计所有的SQL语句、审计SQL权限、审计模式对象以及审计网络活动等。
接下来将对数据库安全管理方法进行一一讨论。
二、用户管理
用户是数据库的使用者和管理者,Oracle通过设置用户及安全属性来控制用户对数据库的访问。Oracle的用户分两类,一类是创建数据库时系统预定义的用户,一类是根据应用由DBA创建的用户。
1、预定义用户
在oracle创建时创建的用户,我们称为预定义用户,预定义用户根据作用不同分为3类:
- 管理员用户:包括SYS,SYSTEM,SYSMAN,DBSNMP等。SYS是数据库中拥有最高权限的管理员,可以启动、关闭、修改数据库,拥有数据字典;SYSTEM是一个辅助的数据库管理员,不能启动和关闭数据库,但是可以进行一些管理工作,如创建和删除用户;SYSMAN是OEM的管理员,可以对OEM进行配置和管理;DBSNMP用户是OEM代理,用来监视数据库的。以上这些用户都不能删除。
- 示例方案用户:在安装Oracle或使用odbc创建数据库时,如果选择了”示例方案”,会创建一些用户,在这些用户对应的schema中,有产生一些数据库应用案例。这些用户包括:BI、HR、OE、PM、IX、SH等。默认情况下,这些用户均为锁定状态,口令过期。
- 内置用户:有一些Oracle特性或Oracle组件需要自己单独的模式,因此为他们创建了一些内置用户。如APEX_PUBLIC_USER、DIP等。默认情况下,这些用户均为锁定状态,口令过期。
此外还有2个特殊的用户SCOTT和PUBLIC,SCOTT是一个用于测试网络连接的用户,PUBLIC实际是一个用户组,数据库中任何用户都属于该用户组,如果要为数据库中的全部用户授予某种权限,只需要对PUBLIC授权即可。
2、用户属性
在创建用户时,必须使用安全属性对用户进行限制,用户的安全属性主要包括:
- 用户名:在同一个数据库中,用户名是唯一的,并且不能与角色名相同;
- 用户身份认证:Oracle采用多种方式进行身份认证,如数据库认证、操作系统认证、网络认证等;
- 默认表空间:用户创建数据库对象时,如果没有显式指明存储在哪个表空间中,系统会自动将该数据库对象存储在当前用户的默认表空间,在Oracle 11g中,如果没有为用户指定默认表空间,则系统将数据库的默认表空间作为用户的默认表空间;
- 临时表空间:临时表空间分配与默认表空间相似,如果不显式指定,系统会将数据库的临时表空间作为用户的临时表空间;
- 表空间配额:表空间配额限制用户在永久表空间中可以使用的存储空间的大小,默认新建用户在表空间都没有配额,可以为每个用户在表空间上指定配额,也可授予用户UMLIMITED TABLESPACE系统权限,使用户在表空间的配额上不受限制。不需要分配临时表空间的配额;
- 概要文件:每个用户必须具有一个概要文件,从会话级和调用级两个层次限制用户对数据库系统资源的使用,同时设置用户的口令管理策略。如果没有为用户指定概要文件,Oracle将自动为用户指定DEFAULT概要文件;
- 设置用户的默认角色
- 账户状态:创建用户时,可以设定用户的初始状态,包括口令是否过期和账户是否锁定等。
可以通过数据字典dba_users查询各个用户的属性(这里只截取了前面几列):
- SQL> select * from dba_users;
- USERNAME USER_ID PASSWORD ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE DEFAULT_TABLESPACE TEMPORARY_TABLESPACE CREATED
- ------------ ---------- ---------- ----------------- ----------- ----------- ------------------- ---------------------- -----------
- SCOTT 84 OPEN 2017/8/20 0 USERS TEMP 2009/8/15 0
- LIJIAMAN 91 OPEN 2017/10/31 USERS TEMP 2017/2/25 1
- ORACLE_OCM 21 EXPIRED & LOCKED 2009/8/15 0 2009/8/15 0 USERS TEMP 2009/8/15 0
- XS$NULL 2147483638 EXPIRED & LOCKED 2009/8/15 0 2009/8/15 0 USERS TEMP 2009/8/15 0
3、创建用户
创建用户语法如下:
- CREATE USER user_name IDENTIFIED
- [BY password] |
- [EXTERNALLY [AS ‘certificate_DN’ | ‘kerberos_principal_name'] ] |
- [GLOBALLY [AS 'directory_DN'] ]
- [DEFAULT TABLESPACE tablespace_name]
- [TEMPORARY TABLESPACE tablespace_name | tablespace_group_name]
- [QUOTA n K | M | UNLIMITED ON tablespace_name ]
- [PROFILE profile_name]
- [PASSWORD EXPIRE]
- [ACCOUNT LOCK | UNLOCK];
其中:
- -user_name:新创建的用户的名称;
- -IDENTIFIED:指明用户认证方式;
- -BY password:采用数据库身份认证,password为用户密码;
- -EXTERNALLY:指定用户采用外部认证,其中:①AS ‘certificate_DN’指定用户采用ssl外部身份认证;②AS ‘kerberos_principal_name’指定用户采用kerberos外部身份认证;
- -GLOBALLY AS ‘directory_DN’:指定用户采用全局身份认证;
- -DEFAULT TABLESPACE tablespace_name:设置用户的默认表空间;
- -TEMPORARY TABLESPACE tablespace_name | tablespace_group_name:设置用户临时表空间/表空间组;
- -QUOTA n K|M|UNLIMITED ON tablespace_name:指定用户在特定表空间上的配额;
- -PROFILE profile_name:为用户指定概要文件;
- -PASSWORD EXPIRE:指定用户密码到期,用户首次登陆时系统会要求改密码;
- -ACCOUNT LOCK|UNLOCK:指定用户为锁定/非锁定状态,默认不锁定。
4、修改用户
修改用户采用ALTER实现,语句与CREATE USER基本相同,唯一不同的是多了DEFAULT ROLE选项,用于指定用户的默认角色:
- ALTER USER user_name
- ...
- [DEFAULT ROLE [role_list] | [ALL [EXCEPT role_list]] | NONE ]
- ...
- ;
其中:
- -role_list:指定角色列表;
- -ALL:指定全部角色;
- -EXCEPT role_list:除了role_list指定的角色之外的角色;
- -NONE:不指定角色 .
5、锁定与解锁用户
当用户被锁定后,就不能登录数据库了,但是用户的所有数据库对象仍然可以继续使用,当用户解锁后,用户就可以正常连接到数据库。
在Oracle中,当账户不再使用时,就可以将其锁定。通常,对于不用的账户,可以进行锁定,而不是删除。
例子,锁定与解锁scott用户:
- /*使用SYS锁定SCOTT账户,锁定之后无法在登录*/
- SQL> show user;
- USER 为 "SYS"
- SQL> ALTER USER SCOTT ACCOUNT LOCK;
- 用户已更改。
- SQL> conn scott/tiger
- ERROR:
- ORA-28000: the account is locked
- 警告: 您不再连接到 ORACLE。
- /*解锁SCOTT账户,解锁后登录到数据库*/
- SQL> conn sys as sysdba
- 输入口令:
- 已连接。
- SQL> ALTER USER SCOTT ACCOUNT UNLOCK;
- 用户已更改。
- SQL> conn scott/tiger;
- 已连接。
6、删除用户
使用drop user删除用户,基本语法为:
- DROP USER user_name [CASCADE];
如果用户拥有数据库对象,则必须使用CASCADE选项,Oracle先删除用户的数据库对象,再删除该用户。
7、查询用户信息
在Oracle中,包含用户信息的数据字典如下:
视图名称 | 说明 |
---|---|
DBA_USERS | 包含数据库的所有用户的详细信息(15项) |
ALL_USERS | 包含数据库所有用户的用户名、用户ID和用户创建时间(3项) |
USER_USERS | 包含当前用户的详细信息(10项) |
DBA_TS_QUOTAS | 包含所有用户的表空间配额信息 |
USER_TS_QUOTAS | 包含当前用户的表空间配额信息 |
V$SESSION | 包含用户会话信息 |
V$SESSTAT | 包含用户会话统计信息 |
8、删除无用多余的帐号
删除多余帐号,对于一些测试帐号可以删除掉。如果不使用EM,可以停用MGMT_VIEW,DBSNMP,SYSMAN帐号。
- SQL> drop user kou cascade;
- User dropped.
- SQL>
9、锁定多余用户
对于不明用途的帐号可以采用先锁定一段时间,再删除。锁定多余用户:
- SQL> alter user abc account lock;
- User altered.
解锁用户:
- SQL> alter user abc account unlock;
- User altered.
- SQL> select username,account_status from dba_users;
- USERNAME ACCOUNT_STATUS
- ------------------------------ --------------------------------
- MGMT_VIEW OPEN
- SYS OPEN
- SYSTEM OPEN
- DBSNMP OPEN
- SYSMAN OPEN
- B OPEN
- ABC LOCKED
- OUTLN EXPIRED & LOCKED
- FLOWS_FILES EXPIRED & LOCKED
其它状态参数说明:
- OPEN: 正常的帐户
- LOCKED: 表示这个帐户被锁定;
- EXPIRED: 表示该帐户口令到期,要求用户在下次logon的时候修改口令(系统会在该account被设置为expire后的第一次登陆是提示你修改密码);
- EXPIRED(GRACE): 当设置了grace以后(第一次成功登录后到口令到期后有多少天时间可改变口令,在这段时间内,帐户被提醒修改口令并可以正常登陆,account_status显示为EXPIRED(GRACE);
- LOCKED(TIMED): 这种状态表示失败的login次数超过了FAILED_LOGIN_ATTEMPTS,被系统自动锁定,需要注意的是,在Oracle 10g中,默认的DEFAULT值是10次;
- EXPIRED & LOCKED:表示此账户被设置为口令到期且被锁定;
- EXPIRED(GRACE) & LOCKED(TIMED): 当account_stutus为EXPIRED(GRACE)的时候,用户又尝试失败的login次数超过了FAILED_LOGIN_ATTEMPTS,被系统自动锁定;
- EXPIRED & LOCKED(TIMED): 当设置了account expire后,用户又失败的login次数超过了FAILED_LOGIN_ATTEMPTS,被系统自动锁定;
- EXPIRED(GRACE) & LOCKED: 用户account_status为EXPIRED(GRACE)后,又被DBA 手工锁定帐户后的状态。
三、资源限制与口令管理
在数据库中,对用户的资源限制与用户口令管理是通过数据库概要文件(PROFILE)实现的,每个数据库用户必须具有一个概要文件,通常DBA将用户分为几种类型,为每种类型的用户单独创建一个概要文件。概要文件不是一个具体的文件,而是存储在SYS模式的几个表中的信息的集合。
1、资源限制
概要文件通过一系列资源管理参数,从会话级和调用级两个级别对用户使用资源进行限制。会话资源限制是对用户在一个会话过程中所能使用的资源进行限制,调用资源限制是对一条SQL语句在执行过程中所能使用的资源总量进行限制。资源限制的主要参数如下:
- CPU使用时间:在一个会话或调用过程中使用CPU的总量;
- 逻辑读:在一个会话或一个调用过程中读取物理磁盘和逻辑内存数据块的总量;
- 每个用户的并发会话数;
- 用户连接数据库的最长时间;
下面是scott用户的资源限制信息:

2、口令管理
oracle概要文件用于数据库口令管理的主要参数如下:
- FAILED_LOGIN_ATTEMPTS:限制用户失败次数,一旦达到失败次数,账户锁定;
- PASSWORD_LOCK_TIME:用户登录失败后,账户锁定的时间长度;
- PASSWORD_LIFE_TIME:用户口令的有效天数,达到设定天数后,口令过期,需要重新设置新的口令;
下图是scott用户的口令管理参数设置信息:

3、查询概要文件信息
在Oracle 11g中,包含概要信息的数据字典如下:
视图名称 | 说明 |
---|---|
DBA_USERS | 包含数据库中所有用户属性信息,包括使用的概要文件(profile) |
DBA_PROFILES | 包含数据库中所有的概要文件及其资源设置、口令管理设置等信息 |
USER_PASSWORD_LIMITS | 包含当前用户的概要文件的口令限制参数设置信息 |
USER_RESOURCE_LIMITS | 包含当前用户的概要文件的资源限制参数设置信息 |
RESOURCE_COST | 每个会话使用资源的统计信息 |
4、Oracle 10g密码策略配置初始配置
说明:通常对管理帐号与维护帐号时行密码策略,业务帐号不做策略限制,例如应用帐号过期,会影响业务的正常使用等情况,默认使用DEFAULT策略。
- SQL> SELECT profile FROM dba_users WHERE username='ABC';
- PROFILE
- ------------------------------
- DEFAULT
- SQL>
- SQL> SELECT profile,resource_type,resource_name,limit FROM dba_profiles WHERE resource_type='PASSWORD' AND profile='DEFAULT';
- PROFILE RESOURCE RESOURCE_NAME LIMIT
- ------------------------------ -------- -------------------------------- ----------------------------------------
- DEFAULT PASSWORD FAILED_LOGIN_ATTEMPTS 10
- DEFAULT PASSWORD PASSWORD_LIFE_TIME UNLIMITED
- DEFAULT PASSWORD PASSWORD_REUSE_TIME UNLIMITED
- DEFAULT PASSWORD PASSWORD_REUSE_MAX UNLIMITED
- DEFAULT PASSWORD PASSWORD_VERIFY_FUNCTION NULL
- DEFAULT PASSWORD PASSWORD_LOCK_TIME UNLIMITED
- DEFAULT PASSWORD PASSWORD_GRACE_TIME UNLIMITED
- SQL>
5、修改并启动密码复杂度
说明:utlpwdmg.sql脚本中包括密码策略及帐号策略, 该脚本后面是帐号策略的配置,可以事先注释掉,后面再一一启用。
- SQL> alter system set resource_limit = true;
- SQL> @$ORACLE_HOME/rdbms/admin/utlpwdmg.sql
6、修改账号策略
- 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
- 相关参数说明:
- FAILED_LOGIN_ATTEMPTS: 允许登录失败的次数
- PASSWORD_LOCK_TIME: 达到登录失败次数后,帐户锁定的天数,过了这个天数之后帐户会自动解锁
- PASSWORD_LIFE_TIME: 口令的生存期(天)
- PASSWORD_GRACE_TIME: 口令失效后从第一次成功登录算起的更改口令的宽限期(天)
- PASSWORD_REUSE_TIME: 可以重新使用口令前的天数
- PASSWORD_REUSE_MAX: 可以重新使用口令的最多次数
- PASSWORD_VERIFY_FUNCTION: 检验口令设置的PL/SQL 函数
- 查看结果:
- SQL> set linesize 200;
- SQL> SELECT profile,resource_type,resource_name,limit FROM dba_profiles WHERE resource_type='PASSWORD' AND profile='DEFAULT';
- PROFILE RESOURCE RESOURCE_NAME LIMIT
- ------------------------------ -------- -------------------------------- ----------------------------------------
- DEFAULT PASSWORD FAILED_LOGIN_ATTEMPTS 3
- DEFAULT PASSWORD PASSWORD_LIFE_TIME 60
- DEFAULT PASSWORD PASSWORD_REUSE_TIME 1800
- DEFAULT PASSWORD PASSWORD_REUSE_MAX UNLIMITED
- DEFAULT PASSWORD PASSWORD_VERIFY_FUNCTION VERIFY_FUNCTION
- DEFAULT PASSWORD PASSWORD_LOCK_TIME .0006
- DEFAULT PASSWORD PASSWORD_GRACE_TIME 10
- 7 rows selected.
- SQL>
取消Oracle密码复杂度检查:
- SQL> alter profile default limit password_verify_function null;
- SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
7、针对单个用户进行策略限制
- SQL> CREATE PROFILE ABC_PROFILE LIMIT
- PASSWORD_LIFE_TIME UNLIMITED
- PASSWORD_GRACE_TIME 10
- PASSWORD_REUSE_TIME 1800
- PASSWORD_REUSE_MAX UNLIMITED
- FAILED_LOGIN_ATTEMPTS 3
- PASSWORD_LOCK_TIME 1/1440;
- SQL> alter user abc profile ABC_PROFILE;
- User altered.
- SQL>
- SQL> SELECT profile,resource_type,resource_name,limit FROM dba_profiles WHERE resource_type='PASSWORD' AND profile='ABC_PROFILE';
- PROFILE RESOURCE RESOURCE_NAME LIMIT
- ------------------------------ -------- -------------------------------- ----------------------------------------
- ABC_PROFILE PASSWORD FAILED_LOGIN_ATTEMPTS 3
- ABC_PROFILE PASSWORD PASSWORD_LIFE_TIME UNLIMITED
- ABC_PROFILE PASSWORD PASSWORD_REUSE_TIME 1800
- ABC_PROFILE PASSWORD PASSWORD_REUSE_MAX UNLIMITED
- ABC_PROFILE PASSWORD PASSWORD_VERIFY_FUNCTION NULL
- ABC_PROFILE PASSWORD PASSWORD_LOCK_TIME .0006
- ABC_PROFILE PASSWORD PASSWORD_GRACE_TIME 10
8、操作系统层面限制DBA用户组的用户数量
过多的用户会带来管理的混乱,且会带来安全隐患。
四、权限管理
在Oracle数据库中,用户权限主要分为系统权限与对象权限两类。系统权限是指在数据库基本执行某些操作的权限,或针对某一类对象进行操作的权限,对象权限主要是针对数据库对象执行某些操作的权限,如对表的增删(删除数据)查改等。
1、系统权限
在Oracle 11g中,一共有200多项系统权限,可通过数据字典system_privilege_map获得所有的系统权限。
- SQL> select * from system_privilege_map;
- PRIVILEGE NAME PROPERTY
- ---------- ---------------------------------------- ----------
- -3 ALTER SYSTEM 0
- -4 AUDIT SYSTEM 0
- -5 CREATE SESSION 0
- -6 ALTER SESSION 0
- ... ... ...
- rows selected
授予用户系统权限的SQL语法为:
- GRANT system_privilege_list | [ALL PRIVILEGES]
- TO user_name_list | role_list | PUBLIC [WITH ADMIN OPTION];
其中:
- -system_privilege_list:系统权限列表,以逗号分隔;
- -ALL PRIVILEGES:所有系统权限;
- -user_name_list:用户列表,以逗号分隔;
- -role_list:角色列表,以逗号分隔;
- -PUBLIC:给数据库中所有用户授权;
- -WITH ADMIN OPTION:允许系统权限接收者再将权限授予其它用户
在授予用户系统权限时,需要注意:
- 只有DBA用户才有alter database;
- 应用开发者一般需要拥有create table、create view、create index等系统权限;
- 普通用户一般只需具有create session权限
- 在授权用户时带有with admin option子句时,用户可以将获得的权限再授予其它用户。
回收用户系统权限的SQL语法如下:
- REVOKE system_privilege_list | [ALL PRIVILEGES]
- FROM user_name_list | role_list | PUBLIC
回收用户系统权限需要注意以下3点:
- 多个管理员授予同一个用户相同的权限,其中一个管理员回收其授予用户的系统权限,该用户将不再具有该系统权限;
- 为了回收用户系统权限的传递性(授权时使用了with admin option),须先回收该系统权限,在重新授予用户该权限;
- 如果一个用户的权限具有传递性,并且给其它用户授权,那么该用户系统权限被收回后,其它用户的系统权限并不会受影响;
2、对象权限
对象权限是指对某个特定模式对象的操作权限。数据库模式对象所有者拥有该对象的所有对象权限,对象权限的管理实际上是对象所有者对其他用户操作该对象的权限管理。在Oracle数据库中,不同类型的对象具有不同的对象权限,而有的对象并没有对象权限,只能通过系统权限进行管理,如簇、索引、触发器、数据库链接等。
在Oracle数据库中,用户可以直接访问同名Schema下的数据库对象,如果需要访问其它Schema下的数据库对象,就需要具有相应的对象权限。对象权限授予的SQL语法为:
- GRANT object_privilege_list | ALL [PRIVILEGES] [ (column,...) ]
- ON [schema.]object
- TO user_name_list | role_list | PUBLIC [WITH GRANT OPTION];
其中:
- -object_privilege_list:对象权限列表,以逗号分隔;
- -ALL PRIVILEGES:全部权限;
- -[schema.]object:待授权的对象;
- -user_name_list:用户列表,以逗号分隔;
- -role_list:角色列表,以逗号分隔;
- -PUBLIC:所有用户
回收对象权限的SQL语法为:
- REVOKE object_privilege_list | ALL [PRIVILEGES]
- ON [schema.]object
- FROM user_name_list | role_list | PUBLIC [CASCADE CONSTRAINTS] | [FORCE];
其中:
- -CASCADE CONSTRAINTS:当回收REFERENCE对象权限或回收ALL PRIVILEGES,删除利用REFERENCES对象权限创建的外键约束;
- -FORCE:当回收在表中被使用的用户自定义对象类型的EXECUTE权限时,必须指定FORCE关键字。
回收对象权限需要注意以下3点:
- 多个管理员授予同一个用户相同的对象权限,一个管理员将该对象权限回收后,该用户不再具有该对象权限;
- 为了回收用户对象权限的传递性,须先回收该对象权限,再重新赋予给用户该对象权限;
- 如果一个用户的对象权限具有传递性,并且已经给其它用户授权,那么该用户的对象权限被回收后,其它用户的对象权限也将被收回。(值得注意的是,这一条与系统权限传递性的回收不相同)。
3、查询权限信息
视图名称 | 说明 |
---|---|
DBA_SYS_PRIVS | 包含所有用户和角色获得的系统权限信息 |
ALL_SYS_PRIVS | 包含当前用户可见的全部用户和角色获得的系统权限信息 |
USER_SYS_PRIVS | 当前用户获得的系统权限信息 |
DBA_TAB_PRIVS | 包含所有用户和角色获得的对象权限信息 |
ALL_TAB_PRIVS | 包含当前用户可见的全部用户和角色获得的对象权限信息 |
USER_TAB_PRIVS | 当前用户获得的对象权限信息 |
DBA_COL_PRIVS | 包含数据库中所有列对象的权限信息 |
ALL_COL_PRIVS | 包含当前用户可见的所有列对象的权限信息 |
USER_COL_PRIVS | 当前用户拥有的或授予其它用户的所有列对象的权限信息 |
SESSION_PRIVS | 当前会话可以使用的所有权限信息 |
4、限制超级管理员远程登录
默认状态下系统管理员是可以远程登录的,采用如下方式验证:
- C:\>sqlplus sys/oracle@orcl181 as sysdba;
- SQL*Plus: Release 11.2.0.1.0 Production on 星期一 12月 8 14:51:18 2014
- Copyright (c) 1982, 2010, Oracle. All rights reserved.
- 连接到:
- Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
- With the Partitioning, OLAP, Data Mining and Real Application Testing options
- SQL>
限制超级用户远程登录(说明: 远程登录访问不登录密码文件进行验证):
- SQL> alter system set remote_login_passwordfile=none scope=spfile;
- SQL> shutdown immediate;
- SQL> startup;
限制用户使用本地操作系统认证登录。有些安全配置要求,限制本地操作系统认证登录,配置如下:
- $ vi /u01/app/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora
- SQLNET.AUTHENTICATION_SERVICES=none
测试方式
- sqlplus system/oracle@orcl as sysdba
- sqlplus / as sysdba
说明: 以上两条如果都启的话,SYSDBA用户将无法登录,数据库也无法启动,如果要进行管理操作,需要变通操作。
5、根据帐号分配最小权限
Oracle提供三种标准的角色: connect,resource和DBA,限制DBA权限的用户使用。
帐号拥有的系统权限:
- SQL> select * from dba_sys_privs where grantee='ABC';
- GRANTEE PRIVILEGE ADM
- ------------------------------ ---------------------------------------- ---
- ABC UNLIMITED TABLESPACE NO
帐号拥有的角色:
- SQL> select * from dba_role_privs where grantee='ABC';
- GRANTEE GRANTED_ROLE ADM DEF
- ------------------------------ ------------------------------ --- ---
- ABC CONNECT NO YES
- ABC RESOURCE NO YES
- SQL>
帐号拥有的对象权限:
- SQL> select * from dba_tab_privs where grantee='ABC';
- no rows selected
对于DBA权限,需要判断是否需要DBA权限,否则都应取消dba权限,降为普通权,需要应用方DBA进行调整。
6、启动数据字典保护
只有SYSDBA才能访问数据字典基础表,普通用户不能查看X$开头的表。
- SQL> show parameter O7_DICTIONARY_ACCESSIBILITY
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- O7_DICTIONARY_ACCESSIBILITY boolean FALSE
- SQL>
- SQL> alter system set O7_DICTIONARY_ACCESSIBILITY= TRUE scope = spfile;
- SQL> shutdown immediate;
- SQL> startup;
7、数据库访问控制
只有信任的IP地址才能通过监听器访问数据库,非信任的客户端会被拒绝, 本机IP地址一定要在信任之列。
通常对应用服务与数据库服务器加入信任列表。
- $ vi $ORACLE_HOME/network/admin/sqlnet.ora
- tcp.validnode_checking = yes
- tcp.invited_nodes = (192.168.233.150,192.168.233.151)
- #除以下IP地址之外都允许访问。
- tcp.excluded_nodes = (IP1,IP2,...)
重启监听即可。
8、设置空闲连接时间
- $ vi $ORACLE_HOME/network/admin/sqlnet.ora
- SQLNET.EXPIRE_TIME = 60
说明:客户端连接后在设置的时间内没有任何操作,客户端会自动断开。
五、角色管理
假如我们直接给每一个用户赋予权限,这将是一个巨大又麻烦的工作,同时也不方便DBA进行管理。通过采用角色,使得:
- 权限管理更方便。将角色赋予多个用户,实现不同用户相同的授权。如果要修改这些用户的权限,只需修改角色即可;
- 角色的权限可以激活和关闭。使得DBA可以方便的选择是否赋予用户某个角色;
- 提高性能,使用角色减少了数据字典中授权记录的数量,通过关闭角色使得在语句执行过程中减少了权限的确认。
由于个人接触的数据库用户较少,没有单独创建角色,故角色的创建、修改、删除、激活、禁用、授予、回收不再一一讲述,只要知道如何查询角色信息即可。
在Oracle中,包含角色的数据字典如下:
视图名称 | 说明 |
---|---|
DBA_ROLE_PRIVS | 包含数据库中所有用户拥有的角色信息 |
USER_ROLE_PRIVS | 包含当前用户拥有的角色信息 |
ROLE_ROLE_PRIVS | 角色拥有的角色信息 |
ROLE_SYS_PRIVS | 角色拥有的系统权限信息 |
ROLE_TAB_PRIVS | 角色拥有的对象权限信息 |
DBA_ROLES | 当前数据库中所有角色及其描述信息 |
SESSION_ROLES | 当前会话所具有的角色信息 |
六、Oracle审计
1、审计(Audit)的概念
Audit是监视和记录用户对数据库进行的操作,以供DBA进行问题分析。利用Audit功能,可以完成以下任务:
- 监视和收集特定数据库活动的数据。例如管理员能够审计哪些表被更新,在某个时间点上有多少个并行用户统计数据;
- 保证用户对自己的活动负责。这些活动包括在特定模式、特定表、特定行等对象上进行的操作;
- 审计数据库中的可疑活动。如一个未经授权的用户正从表中删除数据,那么数据库管理员必须审计所有数据库连接,以及在数据库中所有成功和失败的删除操作。
根据审计类型不同,审计记录中的信息也有所不同。通常,一条审计记录中包含用户名、会话标识、终端标识、所操作的模式对象名称、执行的操作、执行的完整语句代码、日期和时间戳、所使用的系统权限。
2、审计的分类
在oracle 11g中,一共有4种审计类型:
- 语句审计(Statement Auditing):对特定的SQL语句进行审计,不指定具体对象;
- 权限审计(Privilege Auditing):对特定的系统权限使用情况进行审计;
- 对象审计(Object Auditing):对特定的模式对象上执行的特定语句进行审计;
- 网络审计(Network Auditing):对网络协议错误与网络层内部错误进行审计。
此外,根据用户是否成功执行,可以分为对执行成功的语句进行审计、对不成功的语句进行审计、无论成功与否都进行审计。
根据对同一个语句审计次数不同,可以分为会话审计和存取审计。会话审计是指对某个用户或所有用户的同一语句只审计一次,形成一条审计记录;存取审计是指对某个用户或所有用户的同一语句每执行一次审计一次,形成多条审计记录。
3.审计环境设置
使用审计功能,需要对数据库初始化参数AUDIT_TRAIL进行设置,其参数值可以为:
- none:不启用审计功能;
- db:启用审计功能,审计信息写入sys.aud$数据字典中,审计的结果只有连接信息(sys用户的记录以及强制性要求的记录都写入操作系统文件中);
- db_extended:审计结果除了有连接信息,还有执行的具体语句。关于db与db_extended的区别,见例子1;
- os:启用审计功能,审计信息写入操作系统文件;
- xml:启用审计功能,审计信息写入xml格式的操作系统文件中;
查看是否启用了审计功能:
- SQL> show parameter audit_trail
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- audit_trail string DB
修改审计环境参数:
- SQL> alter system set audit_trail = 'DB_EXTENDED' scope = spfile;
- System altered
- SQL> shutdown immediate;
- --
- 需要重启数据库
- SQL> startup;
4、语句审计(Statement auditing)
语句审计是对特定的SQL语句进行审计,与具体的对象没有关系。创建语句审计的基本语法为:
- AUDIT
- sql_statement_
- shortcut | ALL |
- ALL STATEMENTS
- [BY user_lists] | [IN SESSION CURRENT] [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
解释:
- - sql_statement_shortcut:被审计的SQL语句的快捷方式;
- - ALL:审计大部分SQL语句,这里不在列出;
- - ALL STATEMENT:对最高级别的SQL语句进行审计,即对直接执行的SQL语句进行审计,而不对包含在PL/SQL程序中的SQL语句进行审计;
- - BY user_lists:指定审计的用户,如果不指定,则审计全部用户;
- - IN SESSION CURRENT:只对当前会话进行审计;
- - BY SESSION:会话审计,同一个SQL语句只审计一次;
- - BY ACCESS:存取审计,同一个SQL语句执行几次就审计几次;
- - WHENEVER SUCCESSFUL:只审计执行成功的SQL语句;
- - WHENEVER NOT SUCCESS:只审计执行不成功的SQL语句;
如果要取消对某个语句的审计,只需将AUDIT命令改为NOAUDIT命令即可,其语法与创建AUDIT相同。
通过数据字典DBA_STMT_AUDIT_OPTS可以了解当前数据库哪些用户进行了语句审计及审计设置信息。例如,查看与scott用户相关的语句审计:
- SQL> select * from dba_stmt_audit_opts where user_name='SCOTT';
- USER_NAME PROXY_NAME AUDIT_OPTION SUCCESS FAILURE
- --------- ----------- --------------- ---------- ----------
- SCOTT TABLE BY ACCESS BY ACCESS
- SCOTT INSERT TABLE BY ACCESS BY ACCESS
例子1.在scott模式下创建表test02,查看其审计信息。
查看audit_trace参数:
- SQL> show parameter audit_trail
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- audit_trail string DB
step1.对scott用户创建语句审计:
- audit table
- by scott
- by access
- audit insert table
- by scott
- by access
step2.创建表test02,插入2行数据:
- SQL> show user;
- User is "SCOTT"
- SQL> create table test02
- (
- id number,
- name varchar(40),
- local varchar(50)
- );
- Table created
- SQL> commit;
- Commit complete
- SQL> insert into test02
- values(1,'lihua','chengdu');
- SQL> insert into test02 values(2,'ll','dd');
- 1 row inserted
- SQL> commit;
- Commit complete
step3.查看sys.aud$和sys.audit_actions视图
- select
- a.userid,
- a.userhost,
- a.terminal,
- a.action#,
- aa.name,
- dbms_lob.substr(a.sqltext) as sqltext,
- dbms_lob.substr(a.sqlbind) as sqlbind,
- a.obj$creator,
- a.obj$name,
- a.ntimestamp#
- from
- sys.aud$ a,
- sys.audit_actions aa
- where
- a.obj$name = 'TEST02'
- and
- a.action# = aa.action
- and
- a.ntimestamp# > to_date('20170412','yyyymmdd');
结果为:
- USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
- ------- -------------------------- ---------------- ------- ------------- -------------------------------------- -------- ----------- -------- ------------------
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST02 2017/4/15 13:58:54
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 14:00:00
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 15:27:26
结合sys.aud$和sys.audit.actions,我们可与看到对数据库进行了create table和2次insert操作,但是我们还是不知道具体信息。接下来,我们将audit_trail参数改为:audit_trail = db_extended。
step4.修改audit_trail参数
- SQL> alter system set audit_trail = 'DB_EXTENDED' scope = spfile;
- System altered
- SQL> shutdown immediate ;
- SQL>startup;
- SQL> show parameter audit_trail
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- audit_trail string DB_EXTENDED
此时,再向test02表插入1行数据:
- SQL> insert into test02 values(3,'cc','vv');
- 1 row inserted
- SQL> commit;
- Commit complete
step5.再次查看sys.aud$和sys.audit_actions视图:
- USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
- ------- -------------------------- ---------------- ------- ------------- -------------------------------------- -------- ----------- -------- ------------------
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST02 2017/4/15 13:58:54
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 14:00:00
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 15:27:26
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT insert into test02 values(3,'cc','vv') SCOTT TEST02 2017/4/15 16:31:53
可以看到,在SQLTEXT栏位有了具体的执行SQL语句。
5、权限审计
权限审计是对特定的系统权限进行审计,语法为:
- AUDIT
- system_privilege |
- [ALL PRIVILEGES] [BY user_lists] | [IN SESSION CURRENT] [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
如果要了解当前数据库中对哪些用户使用了什么权限审计,可以通过数据字典DBA_PRIV_AUDIT_OPTS来查看。
例子2.对scott用户的select any table权限进行审计
step1.查看scott的系统权限
- SQL> select * from dba_sys_privs where grantee = 'SCOTT';
- GRANTEE PRIVILEGE ADMIN_OPTION
- ------------------------------ ---------------------------------------- ------------
- SCOTT CREATE ANY TABLE NO
- SCOTT UNLIMITED TABLESPACE NO
- SCOTT CREATE ANY VIEW NO
step2.使用scott用户,在模式‘LIJIAMAN’下创建表test03,查询其审计信息:
- USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
- ------ ------------------------- --------------- ---------- ------------ ---------------------------- -------- ------------ --------- ------------------
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE create table lijiaman.test03 LIJIAMAN TEST03 2017/4/15 19:08:20
- (
- id number,
- name varchar(20)
- )
step3.使用scott用户,在scott下创建表test05,查询其审计信息:
- USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
- ------- -------------------------- ---------------- ---------- --------------- -------------------- --------- ------------ ---------- ------------------
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST05 2017/4/15 19:38:24
- create table test05
- (
- id number,
- name varchar(30)
- )
通过这个这个例子,我们可以看到,只要scott用户使用select any table权限,我们就可以通过审计得到其操作信息。
6、对象审计
对象审计是指对特定模式对象的操作进行审计,与用户无关,语法为:
- AUDIT
- sql_operation |
- ALL ON [schema.]object] [BY user_lists] | [IN SESSION CURRENT][BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
其中,sql_operation指定了特定对象上要审计的SQL语句。
如果要查看当前数据库哪些模式对象进行了对象审计,可以通过查询DBA_OBJ_AUDIT_OPTS获得。
例子3.对模式scott下的表dept进行对象审计
- SQL> audit all on scott.dept by session;
- Audit succeeded
查看其审计信息:
- USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
- ---------------- -------------------------- ---------------- ---------- ----------- ---------------------------------- -------- ------------ ---------- ------------------
- LIJIAMAN WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 103 SESSION REC select * from scott.dept SCOTT DEPT 2017/4/15 20:13:47
- LIJIAMAN WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 103 SESSION REC audit all on scott.dept by session SCOTT DEPT 2017/4/15 20:13:19
7、网络审计
网络审计对协议错误与网络层内部错误进行审计,网络审计捕获客户端与服务器通信过程中发生的错误,这些错误由SQL*NET网络服务抛出。网络审计的语法为:
- AUDIT NETWORK
- [BY SESSION | ACCESS]
- [WHENEVER [NOT] SUCCESSFUL]
8、清理审计数据
Audit的数据主要存储在sys.aud$表中,该表默认位于system表空间中,我们根据需求,将该表移到了sysaux表空间中。由于审计数据量较大,需要经常关注sysaux表空间的使用情况,同时根据实际情况对sys.aud$表进行数据清理。
清理步骤
(1)使用sys账号登陆数据库,打开计时功能,方便查看每一个命令的执行时间
- SQL> set timing on
(2)在清理数据之前先查看数据量大小
- SQL> select count(*) from sys.aud$;
(3)查看Audit表中最早一笔数据的时间,即审计表中记录的最早的时间
- SQL> select min(ntimestamp#) from sys.aud$;
- MIN(NTIMESTAMP#)
- ----------------------------------------
- 23-11月-16 08.18.54.496893 上午
(4)查看审计数据最后归档时间,只有归档的数据才能删除
- SQL> SELECT * FROM dba_audit_mgmt_last_arch_ts;
- AUDIT_TRAIL RAC_INSTANCE LAST_ARCHIVE_TS
- ----------- ------------ --------------------------------
- STANDARD AUDIT TRAIL 0 14-3月 -17 01.22.49.000000 下午 +00:00
(5)初始化清理Audit的功能,该命令只有在第一次执行时需要运行,default_cleanup_interval =>168代表清理周期为168小时。
- SQL>
- BEGIN
- sys.DBMS_AUDIT_MGMT.init_cleanup(
- audit_trail_type => sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
- default_cleanup_interval => 168);
- END;
- /
(6)确认清除Audit功能是否开启,yes为开启
- SQL>
- SET SERVEROUTPUT ON
- BEGIN
- IF sys.DBMS_AUDIT_MGMT.is_cleanup_initialized(sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD) THEN
- DBMS_OUTPUT.put_line('YES');
- ELSE
- DBMS_OUTPUT.put_line('NO');
- END IF;
- END;
- /
(7)设置需要清理的天数,最后一个数字‘7’代表清理‘7’天前的数据(归档时间大于等于清除时间)
- SQL>
- BEGIN
- sys.DBMS_AUDIT_MGMT.set_last_archive_timestamp(
- audit_trail_type => sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
- last_archive_time => SYSTIMESTAMP-7 /* Day */);
- END;
- /
(8) 执行清除,时间长短受数据量大小影响(经测试600万条数据大约20分钟)
- SQL>
- BEGIN
- sys.DBMS_AUDIT_MGMT.clean_audit_trail(
- audit_trail_type => sys.DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
- use_last_arch_timestamp => TRUE);
- END;
- /
(9)在清理后,sys.aud$表的大小并没有发生改变,需要收回空间
解释:在上面清理表sys.aud$后,实际上,数据还在磁盘上,只是数据不受保护了而已,其空间并没有释放,需要将其释放回收
- SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$'; --查看aud$的大小
- SEGMENT_NAME BYTES/1024/1024
- -------------------------------------------------------------------------------- ---------------
- AUD$ 3456
- SQL> alter table sys.aud$ enable row movement; --激活行移动
- Table altered.
- SQL> SQL> alter table sys.aud$ shrink space cascade; --进行空间回收
- Table altered.
- SQL> alter table sys.aud$ disable row movement; --关闭行移动
- Table altered.
- SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$'; ----再次查看aud$的大小
- SEGMENT_NAME BYTES/1024/1024
- -------------------------------------------------------------------------------- ---------------
- AUD$ 666.8125
经过2次查看空间大小,可以看到空间已经被释放。
本章节参考:
https://www.cnblogs.com/lijiaman/p/6915694.html
https://www.2cto.com/database/201412/359426.html
转载本站内容时,请务必注明来自W3xue,违者必究。