且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

关于数据库审计的简介

更新时间:2022-08-17 08:47:22

转自:http://www.itpub.net/thread-178927-1-1.html

创建和实施安全过程有助于保护公司最重要的财富-数据。

创建一个数据库用户:
create user thumper
identified by rabbit
default tablespace users

temporary tablespace temp;


授予资源定额
alter user thumper quota 100M on users;
除了用户名外,create user命令中的全部参数都可以由alter user命令来更改。
撤销用户
可以用drop user命令从数据库中撤销一个用户,这个命令只有一个参数-cascade,在撤销该用户这前,它撤销用户模式中的所有对象。如果用户拥有对象,就必须指定cascade以撤销用户。
drop user thumper cascade;

系统级权限

可以使用系统级角色分派管理数据库的系统级命令,可以用grant命令的with grant option子句把想其他用户授权的能力传递给被授予者。

用户环境文件

可以使用环境文件来限制可由用户使用的系统和数据库资源并管理口令限制。如果数据库没有创建文件,将使用缺省环境文件:缺省环境文件指定对于所有用户资源没有限制。
下面列出了可以通过环境文件限制的资源
SESSION_PER_USER   在一个实例中,一个用户可以同时拥有的会话数量
CPU_PER_SESSION    一个会话可以使用的CPU时间,以百分之一秒为单位
CPU_PER_CALL       语法分析,执行或取可以使用的CPU时间,以百分之一秒为                    单位
CONNECT_TIME       一个会话可以连接到一个数据库的分钟数
IDLE_TIME          一个会话可以连接到一个数据库而没有激活使用的分钟数
LOGICAL_READS_PER_SESSION    可以在一个会话中读取的数据库块数
LOGICAL_READS_PER_CALL       在语法分析,执行或获取期间可以读取的数据                             库块数
PRIVATE_SGA                  在SGA的SQL共享池中,一个会话可以分配的私                             有空间量
COMPOSITE_LIMIT               一个基于前面的限制的复合限制
FAILED_LOGIN_ATTEMPTS        将引起一个帐户被锁定的连续注册失败的次数
PASSWORD_LIFE_TIME           一个口令在其中止前使用的天数
PASSWORD_REUSE_TIME          一个口令在能够被重新使用前所必须经过的天                             数
PASSWORD_REUSE_MAX           一个口令在能够被重新使用之前所必须改变的                               次数
PASSWORD_LOCK_TIME           如果超过FAILED_LOGIN_ATTEMPTS设置值,一个                             帐户将被锁定的天数
PASSWORD_GRACE_TIME          以天为单位的“宽限时间”。在宽限期限内,                               在口令达到PASSWORD_LOGIN_TIME设置值时,仍                             能对其修改
PASSWORD_VERIFY_FUNCTION    一个函数名,用于判断口令的复杂性,由ORACLE                            提供一个口令并可以编辑
环境文件通过create profile命令创建的。下列所示的alter profile命令用于修改现有的环境文件。在这个例子中,数据库的DEFAULT环境文件被修改成允许最大空闲时间为一小时:
alter profile DEFAULT
limit idle_time 60;

口令管理

oracle8i中,可以使用环境文件来管理口令的终止,重新使用和复杂性。列如,可以限制一个口令的寿命,锁定口令过旧的帐户。也可以强制一个口令至少由一定程度的复杂性并锁定一个多次注册失败的帐户。
在下面的例子中,创建一个供用户JANE使用的LIMITED_PROFILE环境文件:
create profile LIMITED_PROFILE limit
FAILED_LOGIN_ATTEMPTS 5;
create user JANE identified by JANE
profile LIMITED_PROFILE;
grant CREATE SESSION TO JANE;
如果连续5次与JANE帐户的连接失败,该帐户将自动由oracle锁定。然后当使用JANA帐户的正确口令时,就会受到一条错误信息:
connect jane/jane
ERRORra-28000:the account is locked
要对帐户解锁,请在数据库管理员帐户中使用alter user命令的account unlock子句:
alter user jane account unlock;

使用户口令过期
alter user jane password expire;
修改用户口令
alter user jana identified by wang;

数据库帐户和主机帐户相连

当用户输入有效的用户名和数据库的口令后,就允许访问该数据库。不过,有可能利用操作系统提供一层附加的用户验证。

在同一服务器中,一个数据库帐户可以和一个操作系统帐户配成对。只是在数据库帐户名的前缀部分两个帐户名有所不同。缺省前缀为"OPS$"的任意值,但可以通过数据库init.ora文件的OS_AUTHENT_PREFIX参数改变成另外的值。




用口令文件进行验证

在大多数情况下,DBA用户可以由操作系统验证。例如在unix系统上,/etc/group中DBA组的成员可以内部连接。如果DBA用户不能由操作系统验证,就要创建保存一个口令文件。
要创建一个口令文件,请进行下面几步操作:
1)使用ORAPWD使用程序创建口令文件。

> ORAPWD FILE=filename PASSWORD=password ENTERIES=max_users

ORAPWD是一个生成口令文件的oracel实用程序。执行ORAPWD时,除了SYS和INTERNAL访问的口令外,还规定要创建的口令文件的名称。ENTRIES参数通知ORACLE,要在口令文件中创建多少条目。由于不能在以后扩展该文件,因此要把ENTRIES值设得高一些。如果超出口令文件条目得范围限额,就受到一个ORA_1996错误。重建该口令文件时,需要重新授予SYSDBA和SYSOPER权限。


2)将init.ora文件中得REMOTE_LOGIN_PASSWORDFILE初始参数设置成EXCLUSIVE,关闭并重新启动数据库,以便变更得参数其作用。


3)如下面例子所示,将SYSOPER和SYSDBA权限授予需要进行数据库管理得每个用户。

SYSDBA授予用户数据库管理员得权限;

SYSOPER使用户能执行数据库操作支持活动。

为了授予用户SYSOPER或SYSDBA权限,必须在内部连接。被受权用户现在应能通过使用一个与下数述命令类似得命令与数据库连接:

connect george/sdf@prod.world as sysdba

可以用revoke命令撤销一个用户得SYSDBA或SYSOPER权限:
revoke sysdba from george;
若要查看具有SYSDBA或SYSOPER系统权限得用户,可以查询V$PWFILE_USERS.如果用户拥有SYSDBA权限,V$PWFILE_USERS在其SYSDBA列中将有一个TRUE值;如果拥有SYSOPER权限,将在其sysoper列中有一个TRUE值。


列表用户权限

有关已经授予得权限得信息存储在数据字典中。这个数据可以通过数据字典视图进行访问。
可以使用下面列出得数据字典视图来列出数据库中已授予得权限。
DBA_ROLES               角色名及其口令状态
DBA_ROLES_PRIVS                已被授予角色得用户
DBA_SYS_PRIVS                已被授予系统权限得用户
DBA_TAB_PRIVS                已被授予表中权限得用户
DBA_COL_PRIVS                已被授予列中权限得用户
ROLE_ROLE_PRIVS                已被授给其他用户得角色
ROLE_SYS_PRIVS                已被授给角色得系统权限
ROLE_TAB_PRIVS                已被授给角色得表权限

产看那些系统权限已被授予哪些角色,下列查询会显示这些信息:
select
      Role   /*name of the role*/
      Privilege  /*system privilege*/
      Admin_Option  /*was admin option granted?*/
from ROLE_SYS_PRIVS;


还有两个视图列出了当前会话中启用得权限和角色,他们是:
SESSION_PRIVS     privilege列列出了会话中启用得所有系统权限,不论是直                  接授予还是通过角色授予
SESSION_ROLES          role列列出了当前会话启用得所有角色。
SESSION_PRIVS和SESSION_ROLES对所有用户都是可以得。

限制可用的命令:产品用户环境文件

在sql*plus中,提供了一个附加的安全级-对于指定用户禁止使用各个命令,这样就可以防止表上有更新权限的用户在失控情况下利用sql*plus命名接口更新这个表。
这个性能允许数据库管理员防止用户从sql*plus内部访问操作系统(通过host命令)。当应用程序包含一个访问sql*plus的选项并且你不想让用户访问操作系统时,这种预防是很有用的。
除了撤销用户从sql*PLUS中使用host命令的能力外,也可以撤销他们使用connect命令的能力。
若要创建这个安全级,必须先创建product user profile表,创建他们的脚本文件叫做pupbld.sql,可以在oralce软件主目录中找到它。这个脚本创建一些表和视图,需要system帐户中运行。
对于sql*plus,其最重要的表可以通过一个叫PRODUCT_USER_PROFILE的同义词来访问。下面列出了用于安全目的的关键列。通过向该表中插入记录来创建所希望的安全级。
也可以使用Product User Profile表来禁止角色。如要禁止一个角色,应将Attribute列设为ROLES,把角色名放入Char_Value列中,禁止角色通常与禁止set命令相结合。
                  PRODUCT_USER_PROFILE中的列
PRODUCT     设置为SQL*PLUS,如果这里所示,名字必须为混合方式
USERID      被禁止命令的用户名,要求大写,指定多用户时可以使用通配府%               ,只使用%则适用于所有用户
ATTRIBUTE   被禁止的命令名,要求大写。在SQL*PLUS中禁止set命令也就禁止            了set role 和 set transaction
CHAR_VALUE   用大写设为DISABLED


登陆期间的口令安全

当从一个客户机连接到数据库服务器,或者通过数据库连接到另一个数据库时,除非指定其他形式,否则oralce将以非加密的形式传输输入的口令。对于oracle8可以设置参数来强制oracle在传输前将口令加密。若要启用口令加密,需设置以下参数:
对于客户机,把sqlnet.ora文件中的ORA_ENCRYPT_LOGIN参数设置为TRUE.
对于服务器,把init.ora文件中的DBLINK_ENCRYPT_LOGIN参数设置为TRUE.
一旦这些参数被设置(并且关闭和重新启动数据库),口令将以加密的形式在客户机到服务器和服务器到服务器之间传送。


审计

数据库具有审计发生在其内部的所有操作的能力。审计记录可以写入SYS.AUD$表或操作系统的审计跟踪中。使用操作系统审计跟踪的能力依赖于操作系统。

有三种不同的操作类型可以被审计:

登陆企图,对象访问和数据库操作。

这些类型将在下面几节分别描述。当执行审计时,数据库的缺省功能记录下成功和不成功的命令;可以在设置审计类型时对其进行修改。

要允许在一个数据库中进行审计,数据库的init.ora文件必须含有AUDIT_TRAIL参数的条目。AUDIT_TRAIL值为:
NONE     禁止审计
DB       启用审计,写入SYS.AUD$        表
OS       启用审计,写入操作系统的审计跟踪(依赖于操作系统)

无论是否设置AUDIT_TRAIL参数,都可以发出以下几节描述audit命令。除非使用启用审计的AUDIT_TRAIL值启动数据库,否则他们将不被激活。
如果选择把审计记录存储在SYS.AUD$表中,这个表的记录就应当定期归档,然后表也应被截断。由于它是在数据字典中,所以改表在SYSTEM表空间中,如果其记录不进行定期清理就会引起空间问题。可以给用户授予DELETE_CATALOG_ROLE权限,使其能在SYS.AUD$表中进行删除操作。

登陆审计

每个连接数据库的企图都可以被审计,开始审计登陆企图的命令为:
audit session;
若只是审计成功或失败的连接企图,可以用下列命令之一:
audit session whenever successful;
audit session whenever not successful;
如果审计记录存储于SYS.AUD$表中,这时就可以通过DBA_AUDIT_SESSION数据字典视图来查看改表。
下面示出得查询从DBA_AUDIT_SESSION视图中检索登陆审计记录。它列出了使用得操作系统帐户(OS_USERNAEM),ORACLE帐户名(USERNAME)和使用得终端。对RETURNCODE列进行检查:如果为0,连接成功,否则就检查两个常用得错误号,确定失败得原因,登陆和注销得时间也要显示。
select
os_username
terminal
from DBA_AUDIT_SESSION;

如果要禁止审计得话,可以使用noaudit命令:
noaudit session;


操作审计

影响数据库对象得任何操作都可以被审计。影响对象得可能操作(如 create,alter和drop)可以在审计时编成组。这些命令组可以减少建立和维护审计设置值所需管理工作量。
可以审计所有系统级命令并提供命令组。例如,若要审计影响角色得所有命令,可以输入命令:
audit role;
若要禁止这个设置,可输入命令:
noaudit role;      

对象审计

除了系统级的对象操作外,还可以审计对象的数据处理操作。这些操作可能包括对表的选择,插入,更新和删除操作。
对象审计附加的子句是by session 或by access子句。这个子句指定一个审计记录是为每个会话(by session)写入一次,还是每次访问对象(by access)时都写入一次。
例如对EMPLOYEE表的所有insert命令都要进行审计,第二个命令对影响TIME_CARDS表的每个命令都要进行审计。在第三个命令中,对DEPARTMENT表的所有delete操作都要进行审计。
audit insert on THUEPER.EMPOYEE;
audit all on THUMPER.TIME_CARDS;
audit delete on THUMPER.DEPARTMENT by session;
通过对前节所示的DBA_AUDIT_OBJECT视图进行查询,就可以看到最终的审计记录。

保护审计跟踪

由于数据库的审计跟踪表SYS.AUD$是存储在数据库中,所以任何写入这里的审计记录都必须得到保护。否则,用户就可能通过非法操作来删除其审计跟踪记录。
如果审计跟踪信息存储在SYS.AUD$表中,就必须先保护这个表,首先,对这个表的审计操作通过下面明理执行:
audit all on SYS.AUD$ by access;