作者:gdy1039
有很用的视图DBA_USERS 显示当前系统的所有用户
session_privs 显示当前用户在当前会话可用的权限(它会受到被启用的角色形影)
USER_TAB_PRIVS
ROLE_TAB_PRIVS 显示授予到角色的表权限
DBA_TAB_PRIVS
USER_ROLE_PRIVS 显示授予到当前用户的角色
ROLE_ROLE_PRIVS 显示被授予到其它角色的角色
DBA_ROLE_PRIVS 显示授予到数据库中的用户和角色的角色
USER_SYS_PRIVS 显示用户被授予的所有权限
ROLE_SYS_PRIVS 显示系统中所有角色被授予那些权限
DBA_SYS_PRIVS 显示授予到所有用户或角色的系统权限
DBA_PROFILE 显示出系统中现有的profile
创建与管理用户账户
密码验证用户
C:/>sqlplus / as sysdba#其实这一句话就很有学问。它的完整表示应该是这样"sqlplus 操作系统当前用户名/操作系统当前用户密码@oracle_sid as sysdba"。如果什么都不写,它就会尝试用外部验证。
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 2月 7 15:53:26 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> create user rajesh identified by welcome;
用户已创建。
SQL>
外部验证式用户
OS_AUTHENT_PREFIX参数影响外部验证式用户名的写法,该参数无法在内存中修改,修改后必需重启数据库SQL> create user ops$oracle identified externally;
用户已创建。
SQL>
#在ORACLE用户下执行以下命令,根本不行,不知道为什么
C:/WINDOWS/system32>sqlplus /
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 2月 7 16:46:11 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
SQL> create user "ops$clay/oracle" identified externally;
#看到某些文章说中间要有计算机名,所以把计算机名加进去
用户已创建。
SQL>
#在ORACLE用户下执行以下命令,还是不行,不知道为什么
C:/WINDOWS/system32>sqlplus /
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 2月 7 16:56:41 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
请输入用户名:
SQL> alter system set os_authent_prefix="OPS$" scope=spfile; #修改os_authent_prefix
系统已更改。
SQL> show parameter os_authent_prefix; #查看os_authent_prefix
NAME TYPE VALUE
------------------------------------ ----------- -------
os_authent_prefix string OPS$
SQL>
全局验证式用户
SQL> create user sp_master identified globally as 'CN=spy_master,OU=tier2,O=security,C=us';#没有实验环境,所以没什么好试的
用户已创建。
SQL>
分配默认表空间
SQL> drop user rajesh;用户已删除。
SQL> create user rajesh identified by welcome default tablespace users; #创建用户的时候指定表空间
用户已创建。
SQL> alter user rajesh default tablespace users; #修改某用户的表空间
用户已更改。
SQL> alter database default tablespace users; #修改数据库的默认表空间
数据库已更改。
SQL>
分配临时表空间
SQL> drop user rajesh;用户已删除。
SQL> create user rajesh identified by welcome default tablespace users temporary
tablespace temp; #创建用户的时候指定临时表空间
用户已创建。
SQL> alter user rajesh temporary tablespace temp; #创建用户的时候指定 临时 表空间
用户已更改。
SQL> alter database default temporary tablespace temp; #修改数据库的默认 临时 表空间,因为默认已经是TEMP,所以出错
alter database default temporary tablespace temp
*
第 1 行出现错误:
ORA-12907: 表空间 TEMP 已经是默认的临时表空间
SQL>
从数据库中删除用户
SQL> drop user rajesh cascade;#CASCADE选项告诉数据库递归删除该用户所有对像用户已删除。
SQL>
授予与取消特权
授予对像特权
SQL> drop table a;表已删除。
SQL> create table a(a int);
表已创建。
SQL> create user rajesh identified by welcome;
用户已创建。
SQL> grant connect to rajesh;#必需要有CONNECT权限才能登录
授权成功。
SQL>
C:/Documents and Settings/Clay>sqlplus rajesh/welcome@orcl
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 2月 7 17:48:20 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> select * from sys.a; #测试默认情况下rajesh能否访问SYS.A表,结果证明不可以
select * from sys.a
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
#在SYS用户下执行以下命令
SQL> grant select on a to rajesh;
授权成功。
SQL>
#在rajesh用户下再查询试试,此时已经变成“未选定行了”,证明已经可以读取
SQL> select * from sys.a;
未选定行
SQL>
#在SYS用户下执行以下命令取消授权
SQL> revoke select on a from rajesh
撤销成功。
SQL>
#在rajesh用户下再查询试试,此时已经变成“表或视图不存在”,证明已经取消特权
SQL> select * from sys.a;
select * from sys.a
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL>
对像特权的继承
ORACLE跟踪对像特权的授权者与被授权者,所以对像特权的取消会发生级联作用。#在SYS用户下执行以下命令,该命令把sys.a的SELECT权限授予rajesh,并允许它把该特权授予其它人
SQL> grant select on a to rajesh with grant option;
授权成功。
SQL> create user bobo identified by welcome;
用户已创建。
SQL> grant connect to bobo;
授权成功。
SQL>
#然后在rajesh用户下执行以下命令,它把sys.a的select权限再授予BOBO用户,但它没有带with grant option选项,所以BOBO不能再把该权限授予其它人。
SQL> grant select on sys.a to bobo;
授权成功。
SQL>
#再在BOBO下测试SELECT,结果是成功的。
SQL> select * from sys.a;
未选定行
SQL>
#然后在SYS用户下再取消掉rajesh的SELECT权限,以测BOBO的权限是否也被取消了
SQL> revoke select on a from rajesh;
撤销成功。
SQL>
#再在BOBO下测试SELECT,结果是失败的。
SQL> select * from sys.a;
select * from sys.a
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL>
当用户用多个源获得对像特权,必须删除所有源才能删除该对像的特权
#在SYS用户下执行以下命令,该命令把sys.a的SELECT权限授予rajesh,并允许它把该特权授予其它人SQL> create user rajesh identified by welcome;
用户已创建。
SQL> grant select on a to rajesh with grant option;
授权成功。
SQL> create user bobo identified by welcome;
用户已创建。
SQL> create user jain identified by welcome;
用户已创建。
SQL> grant connect to bobo;
授权成功。
SQL> grant connect to jain;
授权成功。
SQL> grant connect to rajesh;
授权成功。
SQL>
#然后在rajesh用户下执行以下命令,它把sys.a的select权限再授予BOBO用户,但它没有带with grant option选项,所以BOBO不能再把该权限授予其它人。
SQL> grant select on sys.a to bobo;
授权成功。
SQL>
#然后在jain用户下执行以下命令,它把sys.a的select权限再授予BOBO用户,但它没有带with grant option选项,所以BOBO不能再把该权限授予其它人。
SQL> grant select on sys.a to bobo;
授权成功。
SQL>
#再在BOBO下测试SELECT,结果是成功的。
SQL> select * from sys.a;
未选定行
SQL>
#然后在SYS用户下再取消掉rajesh的SELECT权限,以测BOBO的权限是否也被取消了
SQL> revoke select on a from rajesh;
撤销成功。
SQL>
#再在BOBO下测试SELECT,结果是成功的。由于jain还有权限,所以bobo还能使用SELECT
SQL> select * from sys.a;
未选定行
SQL>
授予系统特权
C:/>sqlplus / as sysdbaSQL*Plus: Release 10.2.0.1.0 - Production on 星期四 2月 7 19:24:17 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> drop user rajesh cascade;
用户已删除。
SQL> drop table a;
表已删除。
SQL> create user rajesh identified by welcome;
用户已创建。
SQL> grant connect to rajesh;
授权成功。
SQL>
#在rajesh用户下测试CREATE TABLE,结果显示不能创建表。
SQL> create table a(a int);
create table a(a int)
*
第 1 行出现错误:
ORA-01031: 权限不足
SQL>
#在SYS用户下添加CREATE TABLE的系统特权,允许用户在自己的模式下创建表
SQL> grant create table to rajesh;
授权成功。
SQL> alter user rajesh quota 10m on users; #由于默认情况下用户在所有表空间均没有磁盘配额,而CREATE TABLE会占用空间,所以必需先分配一定空间给rajesh。如果是类似select这样的权限,则不需要类似这样的操作。数据库默认表空间为users,所以在些空间添加配额。
用户已更改。
SQL>
#在rajesh用户再试,结果表明能成功创建。
SQL> create table c(c int);
表已创建。
SQL>
系统特权的继承
由于数据库不跟踪系统特权的授权者与被授权者,所以取消系统特权不会发生级联作用。C:/>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 2月 7 19:50:45 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> drop table a;
表已删除。
SQL> drop user rajesh cascade;
用户已删除。
SQL> drop user bobo;
drop user bobo
*
第 1 行出现错误:
ORA-01918: 用户 'BOBO' 不存在
SQL> create user rajesh identified by welcome;
用户已创建。
SQL> create user bobo identified by welcome;
用户已创建。
SQL> grant alter system to rajesh with admin option;
授权成功。
SQL> grant connect to rajesh;
授权成功。
SQL> grant connect to bobo;
授权成功。
SQL>
#在rajesh用户下再授权到BOBO
SQL> grant alter system to bobo with admin option;
授权成功。
SQL>
#在用户bobo下测试alter system权限,结果成功
SQL> alter system set os_authent_prefix="OPS$" scope=spfile;
系统已更改。
SQL>
#在SYS用户下去除rajesh的权限,
SQL> revoke alter system from rajesh;
撤销成功。
SQL>
#在用户bobo下测试alter system权限,结果还是成功
SQL> alter system set os_authent_prefix="OPS$" scope=spfile;
系统已更改。
SQL>
角色特权
创建与管理角色
SQL> create role app_dba identified by seekwrit;#创建角色app_dba,并指定密码为seekwrit
角色已创建。
SQL> set role app_dba identified by seekwrit;
#当用户已经连接上后角色未被启用或被禁用时,可能需要启用角色。以上命令使用密码seekwrit(seekwrit为创建角色时指定的密码)来启用角色app_dba,
角色集
SQL>
授予角色特权
角色特权的授予像系统特权,它的授予不被系统跟踪,所以它的取消不会发生级联作用。SQL> drop user gdy;
#先清理环境
用户已删除。
SQL> drop role conn;
#先清理环境
角色已删除。
SQL> drop user rajesh; #先清理环境
drop user rajesh
*
第 1 行出现错误:
ORA-01918: 用户 'RAJESH' 不存在
SQL> create user rajesh identified by welcome; #创建用户rajesh,密码为welcome
用户已创建。
SQL>
SQL> create user gdy identified by welcome;
#创建用户gdy,密码为welcome
用户已创建。
SQL> create role conn identified by welcome;
#创建角色conn,密码为welcome,
角色已创建。
SQL> grant connect to conn;
#授予"connect"的权限给conn
授权成功。
SQL> grant conn to gdy with admin option;
#把角色特权conn授予gdy,并允许gdy把该角色特权授予其它人。
授权成功。
SQL>
--------------------
#测试gdy用户能否连接
C:/Documents and Settings/Clay>sqlplus gdy/welcome
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 2月 27 20:01:07 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>
#由于从conn角色获得connect特权,所以gdy能成功连接
SQL> grant conn to rajesh; #用户gdy把conn角色特权授予rajesh
授权成功。
SQL>
--------------------
C:/Documents and Settings/Clay>sqlplus rajesh/welcome #测试rajesh用户能否连接
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 2月 27 20:13:17 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> #由于从gdy处获得conn角色特权,所以能成功连接
---------------------
SQL> revoke conn from gdy; #在SYS用户下把gdy的conn权限撤消掉,再看看rajesh还能否连接
撤销成功。
SQL>
---------------------
C:/Documents and Settings/Clay>sqlplus rajesh/welcome
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 2月 27 20:20:03 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> #即使gdy已经被撤消conn,但rajesh还是能成功连接
启用角色
一个用户可以拥有多个角色,用户可以有选择性的启用某个角色。set role hr_admin identified by "my!seekrit",employee;
#以密码my!seekrit启用角色hr_admin,不使用密码启用employee
set role all except hr_admin
#启用除了hr_admin以外的角色
标识已启用的角色
select role from session_role; #查看当前连接已被启用的角色(包括直接被授予或继承得到的)select granted_role from user_role_privs where username in (USER,'public'); #查看已经分配给USER或public的角色,因为public的权限会自动分配到所有用户,所以查看权限时应该考虑public
select role from session_roles intersect select granted_role from user_role_privs where username in (user,'public');
#查看当前会话中得到启用和直接授予给user或public的权限,但不包括继承得到的。
禁用角色
不能有选择性禁用单个角色。set role all except是一个间接的禁用。但如果该语法中的all所包含的角色有密码,则该条命令也无用。已知办法是先set role none,取消掉所有角色。然后有选择性的启用某些角色。
设置默认角色
一旦用户被指定默认角色,则默认角色以外的所有角色将不被启用。但如果未指定默认角色,则默认情况下,所有用户的角色都将被启用。
alter user gdy default role all except plustrace; #设置gdy的默认角色为:除plustrace外的所有角色。
--------------------------------------启用角色综合实操-------------------
C:/Documents and Settings/Clay>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 2月 28 07:44:04 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> drop role alter_sys;
角色已删除。
SQL> drop role conn;
角色已删除。
SQL> drop user gdy;
用户已删除。
SQL> create user gdy identified by welcome;
用户已创建。
SQL> create role conn identified by welcome;
角色已创建。
SQL> grant create session to conn;
授权成功。
SQL> create role alter_sys identified by welcome;
角色已创建。
SQL> grant alter system to alter_sys;
授权成功。
SQL> grant alter_sys,conn to gdy;
授权成功。
SQL>
-------------#测试gdy的角色
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 2月 28 08:01:28 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> select role from session_roles; #由于没有设置默认角色,所以被授予的所有角色都被启用
ROLE
------------------------------
CONN
ALTER_SYS
SQL>
++++++++++++++++++++++++++++++++++++++++++++++
SQL> alter user gdy default role conn; #在sys用户下,设置gdy的默认角色为conn
用户已更改。
SQL> create role create_any_table identified by welcome; #添加一个create_any_table角色
角色已创建。
SQL> grant create_any_table to alter_sys; #把create_any_table授予alter_sys,测试得到alter_sys后的角色情况
授权成功。
SQL>
+++++++++++++++++++++++++++++++++++++++++++++++++
C:/Documents and Settings/Clay>sqlplus gdy/welcome #再测试gdy启用的角色
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 2月 28 08:30:20 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> select role from session_roles; #由于已经指定默认角色,所以不是默认角色的alter_sys将不被启用
ROLE
------------------------------
CONN
SQL> set role alter_sys identified by welcome; #启用角色alter_sys,
角色集
SQL> select role from session_roles; #启用角色时必需列出所有希望启用的角色,未列出的角色将不被启用或被禁用。在本例,由于上一句set role未列出conn,所以conn角色未被启用。
ROLE
------------------------------
ALTER_SYS
CREATE_ANY_TABLE
SQL> set role alter_sys identified by welcome,conn identified by welcome; #启用角色alter_sys和conn
角色集
SQL> select role from session_roles; #列出当前会话被启用的角色
ROLE
------------------------------
ALTER_SYS
CREATE_ANY_TABLE
CONN
SQL> select granted_role from user_role_privs where username in (user,'public'); #列出已授予当前用户和public的角色,和被继承到的角色。不知道为什么没有没有显示create_any_table
GRANTED_ROLE
------------------------------
ALTER_SYS
CONN
SQL> select role from session_roles intersect select granted_role from user_role
_privs where username in (user,'public'); #列出已授予当前用户和public的角色,不包括被继承到的角色。
ROLE
------------------------------
ALTER_SYS
CONN
SQL>
按用户控制资源使用
分配表空间限额
create user chip identified by 'seek!r3t' quota 100m on users; #创建chip用户,密码为seek!r3t,并在users表空间分配100M给该用户alter user bart quota unlimited on users; #把用户bart在表空间users的磁盘配额设置为无限制
利用概况分配资源限额
概况允许读者为几种资源设置限制,其中包括CPU时间,内在以及一个会话或数据库调用期间被执行的逻辑读次数。要使用概况来启用资源限额,必需设置resource_limit为true
alter system set resource_limit = true scope=both
connect_time 把一个拥有这个概况的用户所建立的任意一个会话限定在指定的分钟数内
create profile agent limit connect_time 10 #创建一个概况agent,设置限制连接时间为10分钟
alter profile data_analyst limit connect_time unlimited #修改data_analyst的连接时间为无限制
cpu_per_call 限定由拥有这个概况的用户所建立的任意一个会话中的任意一个单独数据库调用所消费的cpu时间量(10毫秒为单位)
cpu_per_session 限定拥有这个概况的用户所建立的任意一个会话中被消费的CPU时间量(百分一秒为单位)
idle_time 把数据库调用之间的持续时间(即空闲时间)限定在指定的分钟数内
LOGICAL_READS_PER_CALL 把任意一个单独数据库调用所完成的工作量限定在指定的逻辑读次数内
LOGICAL_READS_PER_SESSION 把任意一个用户的会话所完成的工作量限定在指定的逻辑读次数内
PRIVATE_SGA 用字节为单位限定一个连接到共享服务器(通过多线程服务器[MTS])的用户能够给PGA(Program Globa Area)中的持久区域分配的SGA(System Global Area)内存量
SESSIONS_PER_USERS 把拥有这个概况的用户限定在指定的数据库会话数量内
COMPOSITE_LIMIT 限定一个用户会话期间能够被消费的服务单元数量
+++++++++++++++++++++++++
SQL> create profile logi_read_per_sess limit LOGICAL_READS_PER_SESSION 1;
#在SYS用户下创建PROFILE,限制每次会话只能进行一次读
配置文件已创建
SQL> alter user gdy profile log_read_per_sess;
#把PROFILE指定给GDY
用户已更改。
SQL> alter system set resource_limit=true scope=both;
#启用资源限额功能
系统已更改。
++++++++++++++++++++++++++++++++++++++++++
C:/Documents and Settings/Clay>sqlplus gdy/welcome
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 2月 29 20:20:56 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-02394: exceeded session limit on IO usage, you are being logged off
#GDY登录时由于限制了读次数,所以不能登录成功
请输入用户名:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
应用最少特权原则
-
确保有SELECT ANY TABLE的用户无法通过设置07_DICTIONARY_ACCESSIBILITY=FALSE 来访问数据目录的基础表。这是默认设置
-
从PUBLIC中取消不必要的特权,以为部份需要取消执行特权的包
- REVOKE EXCUTE ON utl_tcp FROM PUBLIC;
- REVOKE EXCUTE ON utl_smtp FROM PUBLIC;
- REVOKE EXCUTE ON utl_http FROM PUBLIC;
- REVOKE EXCUTE ON utl_file FROM PUBLIC;
- REVOKE EXCUTE ON dbms_obfuscation_toolkit FROM PUBLIC;
- REVOKE EXCUTE ON dbms_crypto FROM PUBLIC;
-
以下命令可以知道PUBLIC用户拥有那些包的执行权限
- select table_name
- FROM DBA_TAB_PRIVS P,DBA_OBJECTS O
- WHERE P.OWNER=O.OWNER
- AND P.TABLE_NAME=O.OBJECT_NAME
- AND P.OWNER='SYS'
- AND P.privilege='EXECUTE'
- AND P.grantee='PUBLIC'
- AND O.object_type='PACKAGE'
-
-
限定拥有管理特权的用户
- SYSDBA 不应授予给SYS外的其它任何账户
- DBA 只应授予给需要的用户
- ANY系统特权 只应授予给需要的用户
-
不要启用REMOTE_OS_AUTHENT
管理默认的用户账户
如果数据库由DBCA创建,通常只有sys,system,sysman和DBSNMP得到打开。SYS和SYSTEM账户分别是数据目录所有者和管理性账户,SYSMAN和DBSNMP账户由ENTERPRISE MANAGER使用。如果使用DBCA以外的方法创建,则需要确保无用的账户被锁定
ALTER USER mdsys PASSWORD EXPIRE ACCOUNT LOCK;
视功能而定,以下用户可能需要被锁定
实现标准密码特性
对于数据库身份骓的用户,密码安全规则利用概况来实施,而密码复杂性规则利用验证函数来实施。如果想让参数使用默认值,设置为DEFAULT即可。FAILED_LOGIN_ATTEMPTS和PASSWORD_LOCK_TIME
FAILED_LOGIN_ATTEMPTS参数在一行中指定用户在执行密码验证时能够失败多少次。如果超过这个限额,该账户被销定在 PASSWORD_LOCK_TIME天数(支持小数位)。如PASSWORD_LOCK_TIME被设置为UNLIMITED,一旦被锁定则必需手动解 锁
PASSWORD_LIFE_TIME和PASSWORD_GRACE_TIME
PASSWORD_LIFE_TIME指定一个密码能够保持有效的最多天数。PASSWORD_GRACE_TIME指在密码期满之前的多少天提示用户修改密码,它设置为UNLIMITED则用户每次登录䨚均会被提示修改密码。
PASSWORD_REUSE_TIME和PASSWORD_REUSE_MAX
PASSWORD_REUSE_TIME设置一个密码被重复使用所需要间隔的最少天数。PASSWORD_REUSE_MAX设置一个密码能被重复使用前 必须发生的最少密码修改次数。如果两个参数中任意一个设置为UNLIMITED,那么密码决不能被重新使用。如果两个参数都设置为UNLIMITED,则 表示禁用这两个参数
PASSWORD_VERIFY_FUNCTION
允许定义一个函数来检查新密码的复杂性。
函数要求:必需在SYS用户下创建,
接口为:(username varchar2
,password varchar2
,old_password varchar2
)return boolen
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
#在SYS用户下创建一个profile测试密码规则
SQL> create profile pro_gdy limit failed_login_attempts 3 #密码可尝试3次
SQL> password_lock_time 1/1440 #密码在1(1天的1440分之一)分钟后自动解锁
配置文件已创建
SQL> alter user gdy profile pro_gdy; #把profile指定给gdy
用户已更改。
SQL>
++++++++++++++++++++++++++++++++
C:/Documents and Settings/Clay>sqlplus gdy/welcom #以错误密码多次尝试
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 3月 1 18:07:38 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
请输入用户名: gdy
输入口令:
ERROR:
ORA-01005: 给出空口令; 登录被拒绝
请输入用户名: gdy
输入口令:
ERROR:
ORA-01017: invalid username/password; logon denied
SP2-0157: 在 3 次尝试之后无法连接到 ORACLE, 退出 SQL*Plus
C:/Documents and Settings/Clay>sqlplus gdy/welcom
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 3月 1 18:07:49 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
请输入用户名: gdy
输入口令:
ERROR:
ORA-28000: the account is locked #3次密码错误后,第4次的密码错误即被锁定
请输入用户名:
+++++++++++++++++++++++++++++++
C:/Documents and Settings/Clay>sqlplus gdy/welcome
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 3月 1 18:13:42 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> #一分钟后自动解锁
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
审计数据库活动
审计包括监视和记录指定的数据库活动。一个ORACLE 10G数据库支持4个级别的审计:语句、特权、对像和精细访问。并给读者提供两个用来记录这些活动的位置。- AUDIT_TRAIL参数告诉数据保存记录的位置。值为DB表示保存记录到数据库,值为OS表示写到操作系统
- 如果AUDIT_TRAIL=DB,大多数审计记录保存在SYS.AUD$。当AUDIT_TRAIL=OS时,并操作系统为UNIX时记录 保存位置由初始化参数audit_file_dest决定,默认为$ORACLE_HOME/RDBMS/AUDIT。当操作系统为WINDOWS时,记 录保存到Event Viewer.
- 修改AUDIT_TRAIL后必需重启数据库
语句审计
AUDIT TABLE #审计SQL语句CREATE TABLE、DROP TABLE或TRUNCATE TABLEAUDIT TABLE BY JUANITA #审计指定用户JUANITA的CREATE、DROP或TRUNCATE语句
AUDIT TABLE BY JUANITA WHENEVER NOT SUCCESSFUL
#审计指定用户JUANITA失败的尝试
AUDIT INSERT TABLE BY JUANITA BY ACCESS; #每一次JUANITA在INSERT TABLE时都产生一条审计记录
AUDIT INSERT TABLE BY JUANITA BY SESSION; #无论 JUANITA执行多少次INSERT TABLE,每次会话只记录一次
识别已启用的语句审计选项
select audit_option,failure,su cces,user_name
from dba_stmt_audit_opts
order by audit_option,user;
禁用语句审计
使用一条NOAUDIT语句
NOAUDIT TABLE BY JUANITA; #取消对JUANITA用户的表审计
检查审计跟踪
select username,timestamp,action_name
from dba_audit_trail
where username='JUANITA';
#查看审计JUANITA用户的记录
++++++++++++++++++++++++++++++++++
SQL> audit table by gdy; #在SYS下设置审计GDY的CREATE,DROP或TRUNCATE动作
审计已成功。
SQL> alter system set audit_trail=db scope=spfile; #启用审计功能,指定审计保存到数据库
系统已更改。
SQL> shutdown immediate; #重启数据库
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> conn
请输入用户名: sys as sysdba
输入口令:
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250452 bytes
Variable Size 247466860 bytes
Database Buffers 360710144 bytes
Redo Buffers 2940928 bytes
数据库装载完毕。
数据库已经打开。
SQL> select audit_option,failure,success,user_name from dba_stmt_audit_opts; #查看数据库中的审计
AUDIT_OPTION FAILURE SUCCESS
---------------------------------------- ---------- ----------
USER_NAME
------------------------------
TABLE BY ACCESS BY ACCESS
GDY
++++++++++++++++++++++++++++++++++++++++++++++
SQL> create table t1(a int); #在GDY下创建一个表,以测试
表已创建。
SQL>
++++++++++++++++++++++++++++++++++++
SQL> select username,timestamp,action_name #再回到SYS,结果显示GDY执行了一次CREATE
2 from dba_audit_trail
3 where username='GDY';
USERNAME TIMESTAMP ACTION_NAME
------------------------------ -------------- ----------------------------
GDY 01-3月 -08 CREATE TABLE
SQL> noaudit table by gdy; #取消审计
审计未成功。
SQL> select audit_option,failure,success,user_name from dba_stmt_audit_opts; #审计已经被取消
未选定行
SQL>
管理特权审计
特权审计可以审计任意一个系统特权。启用特权审计
AUDIT CREATE ANY TABLE #审计CREATE ANY TABLE这个系统特权
AUDIT CREATE ANY TABLE BY JANITA #审计用户JANITA使用CREATE ANY TABLE这个系统特权
AUDIT CREATE ANY TABLE BY JANITA BY ACCESS #不明白
标识已启用的特权审计选项
select privilege,user_name
from dba_priv_audit_opts
order by privilege,user_name
禁用特权审计
NOAUDIT ALTER PROFILE; #禁用审计ALTER PROFILE这个系统特权
管理对象审计
对象审计包括监视和记录需要一个指定对象特权的SQL语句的执行,比如SELECT、INSERT、UPDATE、DELETE或EXECUTE对象特权。对象特权不能被限定于指定用户。
AUDIT SELECT ON HR.EMPLOYEE_SALARY; #审计作用于HR。EMPLOYEE_SALARY表上的SELECT语句
AUDIT SELECT ON HR.EMPLOYEE_SALARY BY ACCESS WHENEVER SUCCESS
#审计在HR.EMPLOYEE_SALARY的SELECT权限的成功执行,每一次审计产生一条记录
AUDIT SELECT ON HR.EMPLOYEE_SALARY BY SESSION WHENEVER NOT SUCCESSFUL
#审计在HR.EMPLOYEE_SALARY的SELECT权限的失败执行,无论审计多少次,一次会话只产生一条记录
标识已经启用的对象审计选项
select owner,object_name,object_type,ins,sel from dba_obj_audit_opts where owner='HR' and object_name='EMPLOYEE_SALARY';
禁用对象审计
NOAUDIT select on hr.employee_salary whenever not successful;
对像审计实操
SQL> alter user hr account unlock; #数据库默认已经有HR账号,只需要解锁
用户已更改。
SQL> alter user hr identified by welcome; #为账号设置密码
用户已更改。
#这个时候用另一个窗口以HR登录,创建一个EMPLOYEE表
SQL> audit insert on hr.employee by access whenever successful;
审计已成功。
SQL> select owner,object_name,object_type,ins,sel from dba_obj_audit_opts where
owner='HR' and object_name='EMPLOYEE';
OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------------------ -----------------
INS SEL
----- -----
HR EMPLOYEE TABLE
A/- -/-
#这时候再回到HR的登录窗口,对EMPLOYEE表插入一行
SQL> select obj_name,action_name from dba_audit_trail;
OBJ_NAME
---------------------------------------------
ACTION_NAME
----------------------------
EMPLOYEE
INSERT
#这时候再回到HR的登录窗口,对EMPLOYEE表再插入一行
SQL> select obj_name,action_name from dba_audit_trail;
OBJ_NAME
--------------------------------------------------------------------------------
ACTION_NAME
----------------------------
EMPLOYEE
INSERT
EMPLOYEE
INSERT
SQL>
清除审计跟踪
审计表没有一个自管理的清除作业,因而将会无限制地增大。
delete from sys.aud$ where timestamp# < SYSDATE-90
管理精细审计
精细审计(fine-grained auditing简称FGA)允许读者基于数据的内容监视和记录数据访问。
object_schema 这是待审计对象的所有者,默认是NULL,即告诉数据库使用权用当前用户
object_name 这是待监视对象的名称
policy_name 这是代表新策略的一个唯一性名称
audit_condition 这是一个计算结果为布尔值的SQL表达式。当条件计算结果为TRUE或NULL时,审计记录得到创建。这个条件不能直接使用SYSDATE,UID,USER或USERENV函数。它不能使用权用子查询或序列。它也不能参考LEVEL,PRIOR或ROWNUM伪列。
audit_column 这是一个由逗号分隔的列列表,数据库将要访问这些列。默认为NULL,这告诉数据库任何一个正补参考的列应该触发审计记录
handler_schema 这是事件处理程序过程的所有者
handle_module 事件处理程序过程和名称。默认值NULL,告诉数据库不要使用权用一个事件处理程序。如果使处理程序是一个打包过程,handle_module必须像下面这样使用权用点表示法同时参数包名与程序
UTL_MAIL.SEND_ATTACH_RAW
enable 告诉数据库策略是否应该生效的布尔值,默认TRUE
statement_types 这告诉数据库要监视哪些类型的语句。有效值是一个含有SWLECT,INSERT,UPDATE和DELETE并用逗号分隔的列表,默认是SELECT
AUDIT_TRAIL 这参数告诉数据库是否把SQL语句和用于触发SQL的赋值变量应该被记录在审计跟踪中。默认值DBMS_FGA.DB_EXTENDED表示SQL语句和赋值变量应该被记录在审计跟踪中。应该把这个参数设置成DBMS_FGA.DB,以便通过不在审计跟踪中记录SQL语句或赋值变更来节省空间。
audit_column_ops 这个参数只有两个有效值:DBMS_FGA.ALL_COLMNS和 DBMS_FGA.ANY_COLUMNS。DBMS_FGA.ALL_COLUMNS表示所有列必须被得到参考,才能触发一个审计记录。DBMS_FGA.ANY_COLUMN表示任意一个列被参考都会记录。默认DBMS_FGA.ANY_COLUMNS
以下新建一个名为COMPENSATION_AUD的禁用审计策略,以便用来查找访问HR.EXPLOYEES表且参考SALARY或COMMISSION_PCT的SELECT语句
DBMS_FGA.ADD_POLICY(object_schema=>'HR'
,object_name=>'EMPLOYEES'
,policy_name=>'compensation_aud'
,audit_column=>'SALARY,COMMISSION_PCT'
,ENABLE=>FALSE
,STATEMENT_TYPES=>'SELECT');
启用FGA策略
DBMS_FGA.ENABLE_POLICY(OBJECT_SCHEMA=>'HR'
,OBJECT_NAME=>'EMPLOYEES'
,POLICY_NAME=>'COMPENSATION_AUD')
禁用FGA策略
DBMS_FGA.DIABLE_POLICY(OBJECT_SCHEMA=>'HR'
,OBJECT_NAME=>'EMPLOYEES'
,POLICY_NAME=>'COMPENSATION_AUD')
删除FGA策略
DBMS_FGA.DROP_POLICY(OBJECT_SCHEMA=>'HR'
,OBJECT_NAME=>'EMPLOYEES'
,POLICY_NAME=>'COMPENSATION_AUD')
识别数据库中的FGA策略
以下查询显示HR.EMPLOYEES表内的SALARY列上的COMPENSATION_AUD策略.
select policy_name, object_schema ||'.'|| object_name object_name,policy_column,enable,audit_trail
from dba_audit_policies;
制作FGA审计跟踪数据项的报表
select db_user,timetamp,userhost from dba_fga_audit_trail
where policy_name='compensation_aud'