一、用户管理
1.新建用户
create user user_name identified by pass_word
其中user_name为用户名,pass_word为用户口令
2.修改用户
使用alter user修改用户
下面是修改用户密码的操作
3.删除用户
使用drop user命令删除用户
当用户中有对象时不能直接用drop user删除,应加上参数cascade
二、权限管理
1.系统权限管理
(1)系统权限的授予
grant sys_priv | role to username | role | public [with
admin option]
- sys_priv:表示Oracle系统权限
- role:角色
- username:具体的用户名或一系列用户名
- public:表示Oracle系统的所有用户
- with admin option:表示被授权者可以再将权限授予另外的用户
新创建的用户无法直接登录
需要授予连接数据库的权限
grant create session to zf001;
可以正常登录了
授予zf001在任何模式下创建表和视图的权限,并可以将这些权限授予其他用户
grant create any table,create any view to zf001 with admin option;
(2)系统权限的收回
般用户若被授予过高的权限就可能给 Oracle 系统带来安全隐患。作为 Oracle 系统的管理员,应该能够查询当前 Oracle 系统各个
用户的权限,并且能够使用 REVOKE 命令撤销用户的某些不要的系统权限
语法格式如下:
revoke sys_priv | role from username | role | public
- sys_priv:系统权限或角色
- role:角色
- username:具体的用户名
- public:代表 Oracle 系统所有的用户
2.对象权限管理
(1)对象权限的授予
与将系统权限授予用户基本相同,授予对象权限给用户或角色也使用 GRANT 命令
语法格式如下:
Grant obj_priv | all column on schema.object to username
| role | public [with grant option] | [with hierarchy option]
obj_priv:表示对象的权限,可以是DELETE、ALTER、EXECUTE、SELECT、UPDATE、READ、INDEX、PREFERENCE 和 INSERT 等
- role:角色
- username:被授权的用户名
- with admin option:表示被授权者可再将系统权限授予其他的用户
- with hierarchy option:在对象的子对象(在视图上再建立 视图)上授权给用户
未授权之前zf001用户无法查看system用户中
的ZFT1表
在system中可以正常查看
给用户ZF001 授予 select、insert、delete 和 update 表ZFT1的权限
此时zf001已经可以正常查询表ZFT1的数据
(2)对象权限的回收
语法格式如下:
revoke obj_priv | all on schema.object from username | role
| public cascade constraints
- obj_priv:表示对象的权限
- public:代表 Oracle 系统的所有权限
- cascade constraints:表示有关联关系的权限也被撤销
从zf001用户撤销system.ZFT1表的insert、update和delete权限
需要注意的是和系统权限回收不同:如果数据库管理员 GRANT 命令给用户 A 授予对象权限时带有 WITH ADMIN OPTION 选项,则该用户A 有权将权限再次授予另外的用户 B。在这种情况下,如果数据库管理员用 REVOKE 命令撤销 A 用户的对象权限时,用户 B 的权限也被撤销
3.查询用户与权限
三、角色管理
Oracle 通过角色提供了简单、易于控制的权限管理。角色是一组权限,可以授予用户或其他角色。利用角色管理数据库权限,可将权限添加到角色中,然后将角色授予用户。用户可使该角色起作用,并实施角色授权的权限,一个角色包含所有授予角色权限及授予他的其他角色的全部权限。角色的属性大大简化了数据库中权限的管理。
常用的预定义角色有:connect,resource,dba。
connect 角色具有一般应用开发人员需要的大部分权限,当建立了一个用户后,多数情况下,只要给用户授予 connect 和 resource角色就够了。
connect角色具有的系统权限:
- alter session
- create cluster
- create database link
- create session
- create view
- create sequence
resource 角色具有应用开发人员所需要的其他权限,比如建立存储过程、触发器等。
resource角色具有的系统权限:
- create cluster
- create indextype
- create table
- create sequence
- create type
- create procedure
- create trigger
dba 角色具有所有的系统权限,及 with admin option 选项,默认的 dba 用户为 sys 和 system 他们可以将任何系统权限授予其他用户。但是要注意的是 dba 角色不具sysdba 和 sysoper 的特权(启动和关闭数据库)。
1.创建用户角色
语法格式如下:
CREATE ROLE role_name [not identified|identified by [password]|[externally]|[globally]]
参数说明如下:
- role_name:角色名
- identified by password:角色口令
- identified by externally:表示角色名在操作系统下验证
- identified by globally:表示用户是 Oracle 安全域中心服务器来验证,此角色由全局用户来使用
创建一个用户角色role_zf不设置密码
2.管理用户角色
(1)修改角色
修改角色role_zf的密码为123456
(2)授予角色权限
给角色 role_zf 授予在任何模式创建表和视图的权限
(3)取消角色权限
取消角色role_zf的create view权限
(4)将角色授予用户
将角色授予用户后,用户将拥有角色所拥有的权限。
将角色role_zf授予zf001用户
(5)角色启用和禁用
语法格式如下:
Set role {role_name {[identified by password]|all[except role_name]|none}};
使用 all 选项表示将启用用户被授予的所有角色,但必须保证所有的角色没有设置口令。
使用 except role_name 子句表示启用除指定角色 role_name 外的其他全部角色。
none 选项表示禁用所有角色。
(6)收回用户角色
四、概要文件
概要文件是口令限制和资源限制的命名集合,是 Oracle 安全策略的重要组成部分,利用概要文件可以对数据库用户进行口令管理和资源限制。
例如使用概要文件可以指定口令有效期、口令校验函数、用户连接时间以及最大空闲时间等。
概要文件具有以下一些作用:
- 限制用户执行消耗资源过度的 SQL 操作
- 自动断开空闲会话
- 在大而复杂的多用户数据库系统中合理分配资源
- 控制用户口令的使用
在建立数据库时,Oracle 会自动建立名称为 DEFAULT 的默认概要文件,初始的 DEFAULT 概要文件的所有口令及资源限制选项值均为UNLIMITED,即未进行任何口令及资源限制。当建立用户时,如果不指定概要文件,则 Oracle 会将 DEFAULT 概要文件分配给该用户。
根据用户所承担任务的不同,DBA 应该建立不同的概要文件,并将概要文件分配给相应用户。一个用户只能分配一个概要文件,一个概要文件可以同时包含口令限制和资源限制。
1.口令策略参数
- FAILED_LOGIN_ATTEMPTS:该参数指定允许的输入错误口令的次数,超过该次数后用户帐户被自动锁定
- PASSWORD_LOCK_TIME:用于指定指定账户被锁定的天数(单位:天)
- PASSWORD_LIFE_TIME:指定口令的有效期(单位:天)。如果在达到有效期前用户还没有更换口令,它的口令将失效,这时必须由 DBA 为它重新设置新的口令
- PASSWORD_GRACE_TIME:用于指定口令失效的宽限期(单位:天)
- PASSWORD_REUSE_TIME:指定能够重复使用一个口令前必须经过的时间(单位:天)
- PASSWORD_REUSE_MAX:用于指定在重复使用口令之前必须对口令进行修改的次数(PASSWORD_REUSE_TIME 和PASSWORD_REUSE_MAX 两个参数只能设置一个,另一个必须为UNLIMITED)
- PASSWORD_VERIFY_FUNCTION:指定验证口令复杂度的函数
2.资源限制参数
利用概要文件,可以对以下系统资源进行限制:
- CPU 时间
- 逻辑读
- 用户的并发会话数
- 空闲时间
- 连接时间
- 私有 SGA 区
对这些资源的限制是通过在概要文件中设置参数来实现的,参数的值可以是一个整数,也可以是 UNLIMITED(即不受限制),还可以是 DEFAULT(使用 DEFAULT 概要文件中的参数设置)。
参数详细介绍如下:
- CPU_PER_SESSION:限制每个会话所能使用的 CPU 时间。参数值是一个整数,单位是百分之一秒
- SESSIONS_PER_USER:限制每个用户所允许建立的最大并发会话数
- CONNECT_TIME:限制每个会话能连接到数据库的最长时间,超过这个时间会话将自动断开。参数值是一个整数,单位是分钟
- IDLE_TIME:限制每个会话所允许的最长连续空闲时间,超过这个时间会话将自动断开。参数值是一个整数,单位是分钟
- LOGICAL_READS_PER _SESSION:限制每个会话所能读取的数据块数目
- PRIVATE_SGA:每个会话分配的私有SGA 区大小(以字节为单位)。该参数只对共享服务器模式有效
- CPU_PER_CALL:用于指定每条 SQL 语句可占用的最大 CPU 时间,单位是百分之一秒
- LOGICAL_READS_PER_CALL:用于指定每条 SQL 语句最多所能读取的数据块数目
3.使用概要文件管理口令
建立概要文件是使用CREATE PROFILE 命令来完成的,一般情况下建立概要文件是由 DBA来完成的,如果要以其他用户身份建立概要文件,则要求该用户必须具有 CREATE PROFILE 系统权限。
(1)锁定账户
以管理员身份登录
创建概要文件
分配概要文件给用户zf001
当将概要文件分配给 USER001 用户之后,如果以 USER001 连接到数据库时,连续登录失败次数达到三次,那么系统会自动锁定该用户账户。此时,即使为用户 USER001 提供了正确的口令,也将无法连接到数据库,并显示错误信息。
对用户解锁
然后就可以正常登录了
(2)终止口令
终止口令用于指定用户口令到期,并强制用户改变口令。当建立用户并为其提供了口令之后,默认情况下其口令一直有效。为了加强口令安全,用户应该定期修改口令,以防止口令被泄露或被窃取。通过使用概要文件,DBA 可以强制用户定期改变其自身口令
强制用户 USER001 每隔 10 天修改其自身口令,并设置两天宽限期
创建概要文件,设定相关参数
分配概要文件给用户zf001
当将概要文件分配给用户 USER001 之后,第 10 天登录会显示警告信息(这里通过调整虚拟机的时间来实现)
如果第 10 天未改变口令,那么第 11 天登录时仍然会显示类似警告信息。但用户如果第 11 天仍然未改变口令,那么第 12 天登录时系统会强制你改变口令,并显示信息如图:
(3)口令历史
口令历史用于比较用户的新、旧口令,以确保用户在单位时间或特定次数内不会使用以前曾经用过的口令。当口令终止时用户必须要改变自身口令,然后才能登录,但对新口令没有进行任何限制
创建概要文件,设定相关参数
分配概要文件给用户zf001
值得注意的是当使用口令历史选项时,PASSWORD_REUSE_TIME 和PASSWORD_REUSE_MAX 两 个 参 数 只 能 设 置 一 个 , 另 一 个 必 须 为UNLIMITED。
当将概要文件分配给用户 zf001 之后,如果前 11 天没有修改用户口令,那么在第 12 天登录时,Oracle 会强制终止口令,并要求用户改变口令。但如果仍然使用过去的口令,则口令修改不能成功
(4)口令校验
口令校验是指使用 PL/SQL 函数检查口令的有效性。在设置口令时,多数人都习惯于按照自己易记的方式(如用户名、生日等)来指定口令。但如果其他人很了解用户的各种习惯,那么口令将不再安全。通过使用口令校验函数,可以强制用户使用复杂的口令。尽管这种做法会给用户带来一些小麻烦,但却可以大大加强口令的安全性。
如果要使用口令校验函数,那么必须要以 SYS 用户建立口令校验函数,并且口令校验函数必须满足如下规范:
function_name(
userid_parameter IN VARCHAR2(30),
password_parameter IN VARCHAR2(30),
old_password_parameter IN VARCHAR2(30))
RETURN BOOLEAN
参数解释如下:
- userid_parameter:用户名
- password_parameter:用户的新口令
- old_password_parameter:用户的旧口令
如果函数返回值为 TRUE,则表示新口令可以使用,返回值为 FALSE,则表示新口令不满足函数规则。
Oracle 也提供了默认的口令校验函数 VERIFY_FUNCTION,该口令校验函数具有以下一些功能: - 口令最少为 4 个字符
- 口令不能与用户名相同
- 新口令与旧口令至少有三个字符不同
- 口令至少包含一个阿拉伯字母、一个数字和一个特殊字符
校验函数在安装目录下的dbhome/RDBMS/ADMIN中
运行脚本utlpwdmg.sql建立默认口令校验函数 VERIFY_FUNCTION
创建概要文件,设定相关参数
分配概要文件给用户zf001
这样,当修改 USER001 用户口令时,如果不满足函数规则,会出错:
如 果 不 想 使 用 口 令 校 验 函 数 , 则 可 以 将PASSWORD_VERIFY_FUNCTION 选项设置为 NULL
这样就没有校验函数了,将密码改为111111可以通过
4.使用概要文件管理资源
概要文件不仅可用于管理用户口令,也可用于限制用户的资源占用。概要文件既可以限制整个会话的资源占用,也可以限制调用级(SQL 语句)的资源占用。但大家需要注意,如果要使用概要文件管理资源,则必须要激活资源限制功能,这可以通过设置初始化参数
RESOURCE_LIMIT 为 TRUE 做到:
ALTER SYSTEM SET RESOURCE_LIMIT=TRUE;
(1)限制会话资源
限制会话资源是指限制会话在连接期间所占用的总计资源。当超过会话资源限制时,系统要么自动断开会话并释放其所占用资源,要么不对 SQL 语句进行任何处理并返回错误信息。
设置数据库最多允许两个开发人员以USER001 用户登录进行应用开发,每个会话连接时间不能超过 30min,会话空闲时间不能超过10min。
创建概要文件,设定相关参数
分配概要文件给用户zf001
因为在建立概要文件时指定SESSION_PER_USER 选项为 2,即允
许用户最多可以同时建立两个会话,所以如果用户 zf001 的并发会话个数达到两个,那么当建立第三个会话时则会显示错误信息。因为IDLE_TIME 选项被设置为 10,所以如果会话空闲时间超过 10min,那么 Oracle 会自动断开会话。
注意:如果没启用资源限制的话,那这个参数即使设置了也不会生效的
(2)限制调用资源
通过限制调用资源,可以确保用户不能执行消耗资源过度的 SQL操作。当超出调用级资源限制时,Oracle 会自动终止语句处理并回退该语句操作。
创建概要文件,设定相关参数
分配概要文件给用户
在 建 立 概 要 文 件 profile_test_call 时 指 定 了LOGICAL_READS_PER_CALL 选项为 3,所以如果执行单条 SQL 语句访问的数据块总数超过 3,则会显示错误信息。
5.修改概要文件
当口令和资源限制无法满足用户的实际需求时,你就需要修改概要文件中的口令及资源限制参数。修改概要文件是使用 ALTER PROFILE 命令由 DBA 来完成的;如果要以其它用户身份修改概要文件,则要求该用户必须具有 ALTER PROFILE 系统权限。需要注意,修改概要文件对已存在会话没有影响,而只对新会话起作用。
修改用户 USER001 当前的概要文件后, USER001 重新登录后,其口令和资源限制就发生变化了,如该用户的口令失败次数只能两次
6.删除概要文件
当某个概要文件不需要时,可以删除它。删除概要文件是使用DROP PROFILE 命令由 DBA 来完成的,如果要以其他用户身份删除概要文件,则要求该用户必须具有 DROP PROFILE 系统权限。
需要注意,如果概要文件已经被分配给某个用户,那么当删除概要文件时必须带有CASCADE 选项。如果用户的概要文件已经被删除,Oracle 将自动为用户重新指定 DEFAULT 概要文件。
可以看到上面设置的口令失败两次就锁定账户的概要文件已经删除了
7.显示概要文件信息
(1)显示用户的概要文件
当建立或修改用户时,通过 PROFILE 子句可以为用户分配概要文件。如果没有显式地分配概要文件,那么 Oracle 会将 DEFAULT 概要
文件自动分配给用户。通过查询数据字典视图 DBA_USERS,可以取得用户的概要文件信息。
查询用户zf001的概要文件:
在上面删除了概要文件后zf001使用默认的概要文件
(2)显示概要文件的内容
数据字典视图 DBA_PROFILES 中包含了每个概要文件的内容,通过查询该数据字典视图可以取得用户的口令限制及资源限制信息。
五、数据库审计
对 Oracle DBA 而言,审计就是监视和记录用户对数据库所作的操作,审计记录可以了解用户对数据库做了什么操作,使用了哪些系统权限,在高峰时期有多少用户在使用数据库,每个会话平均持续多长时间以及其它有关事实。
审计能帮助 DBA 完成的操作类型包括:
- 监视用户活动,记录企图闯入数据库的失败尝试
- 确定最繁忙的表,以便对它作额外的调整
- 调查对关键表的可疑更改
- 获得数据库的使用信息,规划资源消耗
Oracle 数据库的审计分为 3 类:
- 语句审计:语句审计用于审计特定类型的 SQL 语句,而不去考虑该语句作用于哪个对象,例如可以审计某个 DDL 语句。可以对特定的数据库用户或数据库的每个用户设置语句审计
- 权限审计:权限审计用于审计系统权限的使用,例如审计 CREATE TABLE系统权限,可以对特定的数据库用户或数据库的每个用户设置权限审计
- 对象审计:对象审计用于审计在特定模式对象上所执行的特定操作,例如审计在表zf001.ZFT1 上的 SELECT 操作。对象审计总是对所有用户设定的
1.设置审计环境
Oracle 11g 审计默认是启用的。对更早版本的Oracle 审计是需要激活的,激活审计是通过设置初始化参数AUDIT_TRAIL 来完成的。初始化参数 AUDIT_TRAIL 具有三种取值
- DB 或 TRUE:表示激活审计并将审计记录存放到 SYS.AUD$表中
- OS:激活审计并将审计记录存放到操作系统文件中
- FALSE 或 NONE:表示禁止审计
查看数据库审计状态
DB 即为 Oracle 的默认值,表示审计为启动状态,若为NONE或者FALSE,需要修改审计状态,重启数据库,开启审计功能
关闭审计功能
开启审计功能
在激活审计之后,进行哪种类型的审计,DBA 必须用命令设置审计操作。设置审计操作是使用 AUDIT 命令来完成的,在设置审计操作
时可以带有以下一些选项:
- WHENEVER SUCCESSFUL | WHENEVER NOT SUCCESSFUL:选项WHENEVER SUCCESSFUL 指要审计成功执行的语句,而 WHENEVER NOT SUCCESSFUL 指要审计执行失败的语句。如果忽略这两个选项,则无论成功与否都要审计
- BY SESSION:该选项表示在同一个会话中对相同类型的语句或同一对象的相同操作只生成一条审计记录。BY SESSION 是默认选项
- BY 用户名:指定审计某个用户的操作
- BY ACCESS:该选项表示每次执行语句都会生成一条审计记录。如果审计 DDL 语句或 DDL 权限,那么无论是否指定 BY ACCSS选项,Oracle 总是使用 BY ACCESS 选项
特权用户和 SYS 用户的操作不会生成审计记录
2.语句审计
语句审计用来审计特定类型的 SQL 语句。设置语句审计一般是由DBA 来完成的,如果要以其他用户身份设置语句审计,那么要求该用户必须具有 AUDIT SYSTEM 系统权限。
注意:当指定了语句审计之后,只会对将来会话起作用,而对当前会话不起作用。
设置语句审计
3.权限审计
权限审计用于审计系统权限的使用。需要注意的是,当指定了权限审计之后,只会对将来会话起作用,而对当前会话不起作用。设置权限审计一般是由 DBA 来完成的,如果要以其他用户身份设置权限审计,那么要求该用户必须具有 AUDIT SYSTEM 系统权限。
设置权限审计
因为在设置权限审计时指定了 WHENEVER SUCCESSFUL 选项,所以只有 create view 权限执行成功后才会将相应信息记载到审计记录中。
4.对象审计
对象审计用于审计在特定模式对象上所执行的 SQL 操作。需要注意,当指定了对象审计之后,不仅对将来会话起作用,而且对当前会话也生效。一般情况下,指定对象审计是由 DBA 来完成的,如果要以其他用户身份设置对象审计,那么要求该用户必须是对象所有者或具有 AUDIT ANY 系统权限。
审计对表 zf001.zf 所作的修改操作
这里出现了一个对表空间无权限的问题
只需要对zf001用户授予resource权限即可
这时可以插入成功了
设置了对象审计后,当每次修改zf001.zf 后,Oracle都会将信息记载到审计记录中。
5.显示审计选项
在使用审计时,用户可能经常需要查看已经设置了哪些审计选项,并根据需要确定要增加的审计选项。
如下一些数据字典视图包含了已经设置的各种审计选项:
- ALL_DEF_AUDIT_OPTS:包含系统默认的审计选项
- DBA_STMT_AUDIT_OPTS:包含已经设置的语句审计选项
- DBA_PRIV_AUDIT_OPTS:包含已经设置的权限审计选项
- DBA_OBJ_AUDIT_OPTS: 包含已经设置的对象审计选项
查询相关数据字典视图
6.显示审计跟踪结果
执行了与审计相关的操作之后,Oracle 会将审计跟踪结果记载到表 SYS.AUD$中,通过查询表 SYS.AUD$可以获得审计跟踪结果。
查询数据字典视图 DBA_AUDIT_TRAIL 也可以获得审计跟踪结果,它是基于表SYS.AUD$的视图。
另外,还有一些数据字典视图也可以获得审计跟踪结果:
- DBA_AUDIT_SESSION:显示与会话相关的审计跟踪结果,例如连接和断开连接等
- DBA_AUDIT_OBJECT:显示审计涉及到的模式对象
- DBA_AUDIT_STATEMENT:显示语句审计的跟踪结果
7.禁止审计
当设置的审计操作完成了相应的审计任务之后,应该禁止审计操作,以免产生太多的审计信息占用系统资源。禁止审计操作是使用NOAUDIT 命令由 DBA 来完成的,如果以其他用户身份禁止语句或权限审计操作,则要求用户必须具有 AUDIT SYSTEM 系统权限;而如果以其他用户身份禁止对象审计操作,则要求用户必须是对象所有者或具有 AUDIT ANY 系统权限。
当执行了以上语句之后,用户所执行的语句审计信息就不会被记载到审计跟踪记录中了
8.删除审计信息
当激活了数据库审计之后,随着时间的推移,审计跟踪信息会越来越多。但是过去审计的信息可能已经不再需要,此时用户应该删除不需要的审计跟踪记录,以释放其所占用的空间。一般情况下,删除审计跟踪记录是由 DBA 来完成的,如果要以其他用户身份删除审计跟踪记录,则要求用户必须具有 DELETE_CATALOG_ROLE 角色。