|
3.6 创建和分析对象访问配置文件 背景 只知道用户名和相关属性(如 OS 用户名、他们的连接源自的终端等)是不够的。要正确锁定数据库,还必须知道哪些用户正在访问。您可以通过此信息创建一个对象“访问配置文件” - 凡是不符合该信息的内容均可能表示攻击或入侵,
策略 此处将再次使用审计的强大功能。在上一步中,您启用了用于查看会话详细信息的会话级审计。现在,您必须启用对象访问审计。
例如,您可以选择对非常机密的对象(如存储信用卡卡号的表或通过加密值返回明文信用卡卡号的属性)进行的访问进行审计。
假设您要对访问 ccmaster 拥有的表 credit_cards 的任何用户进行审计。您可以发出以下命令 audit select on ccmaster.credit_cards by access;
随后,任何从该表中进行选择的用户将留下一个审计跟踪。
您可以采用两种方法记录该信息。在第一种方法(如上面的关键字 access 所示)中,每当某个用户从表中进行选择时,审计跟踪中便会出现一个记录。如果同一用户在同一会话中从表中选择两次,则审计跟踪中将出现两个记录。
如果该信息量太大,无法处理,则可以使用另一个方法,即在每个会话中只记录一次: audit select on ccmaster.credit_cards by session;
在该示例中,当用户在会话中从表中进行多次选择时,审计跟踪中将只出现一个记录。
启用审计后,可以分析审计跟踪以了解访问模式。
在每个方法中,审计跟踪均呈现不同的状态。如果会话启用了审计,则每个对象的每个会话中将只显示一个记录。该示例中的 action_name 列将显示 SESSION REC,且操作将记录到 ses_actions 列中。 select username, timestamp, ses_actions
from dba_audit_trail
where obj_name = 'CREDIT_CARDS'
and action_name = 'SESSION REC'
/
输出结果如下: USERNAME TIMESTAMP SES_ACTIONS
------------------------------ --------- -------------------
ARUP 16-JAN-06 ---------S------
当然,您还可以使用其他列,如 os_username、terminal 等。
注意,ses_actions 列显示了一系列的连字符和一个字母“S”。这表示用户 ARUP 执行了某些操作,这些操作记录在审计跟踪的单个记录中。值遵循某个模式,其中的每个位置均表示一个特定操作:
|
位置 |
操作 |
|
1 |
更改 |
|
2 |
审计 |
|
3 |
注释 |
|
4 |
删除 |
|
5 |
授权 |
|
6 |
索引 |
|
7 |
插入 |
|
8 |
锁定 |
|
9 |
重命名 |
|
10 |
选择 |
|
11 |
更新 |
|
12 |
引用 |
|
13 |
执行 |
|
14 |
未使用 |
|
15 |
未使用 |
|
16 |
未使用 |
在以上示例中,ses_actions 显示了以下内容: ---------S------
“S"”位于第 10 个位置,表示用户 ARUP 从表 credit_cards 中进行了选择。但它并未显示用户在此会话中从该表进行选择的频率,这是因为您只对会话而非访问启用了审计。如果用户还在查询中执行了插入和更新操作,则列值将为: ------S--SS-----
注意,第 7 个位置 (Insert)、第 10 个位置 (Select) 和第 11 个位置 (Update) 分别有一个 S。
为什么会显示“S”?启用审计时,可以指定在访问成功或失败时是否记录跟踪。例如,如果只在访问由于某种原因(如权限不足)而失败的情况下记录审计跟踪,可以按如下所示启用审计。 audit select on ccmaster.credit_cards by session whenever not successful;
随后,当用户 ARUP 成功地从表中进行选择时,审计跟踪中将没有记录。如果访问失败,则将有一个记录。这种情况下,ses_actions 列中的字母将为“F”(表示失败)。
同样,如果只想在访问成功时进行审计,请将子句“whenever not successful”替换为“whenever successful”。默认情况下,如果未指定该子句,则将同时记录成功和失败的访问。那么,如果在单个会话中,某些访问成功,而其他访问失败,则将出现什么情况?这种情况下字母将为“B”(表示成功和失败)。
例如,下面演示了对于用户 ARUP(他没有表 credit_cards 的选择权限)而言,字母值如何随时间而更改。
- ARUP 执行命令语句 select * from CCMASTER.CREDIT_CARDS。
- 该语句失败,从而引发 ORA-00942:table or view does not exist。
- 审计跟踪中出现一个记录,且 ses_actions 值为 ---------F------。(注意,“F”位于第 10 个位置,表示失败。)
- ARUP 未与会话断开连接。表 credit_cards 的拥有者 CCMASTER 将 select 权限授予 ARUP。
- ARUP 现在成功地从表中进行选择。
- ses_action 列值现在将更改为 ---------B------。(注意,第 10 位置已从“F”更改为“B”(成功和失败)。)
对该对象进行了一段时间的审计并开发了它的访问配置文件后,可以针对成功尝试关闭审计,并仅针对失败尝试启用审计。表示潜在攻击的通常是失败尝试。只对失败尝试进行审计还将降低审计跟踪的总长度。
如果按访问启用了审计,则可能使用了一个不同的查询,这是因为每个访问将有一个记录。ses_actions 列将不被填充,而 action_name 列将显示实际操作(如 select 或 insert)而非值 SESSION REC。因此,您将使用: col ts format a15
col username format a15
col userhost format a15
col action_name format a10
select to_char(timestamp,a�?mm/dd/yy hh24:mi:ssa�?) ts,
username, userhost, action_name
from dba_audit_trail
where owner = 'CCMASTER'
and obj_name = 'CREDIT_CARDS';
TS USERNAME USERHOST ACTION_NAM
----------------- ---------- --------------- ----------
01/16/06 00:27:44 ARUP stcdwhpd SELECT
01/16/06 11:03:24 ARUP stcdwhpd UPDATE
01/16/06 12:34:00 ARUP stcdwhpd SELECT
注意,每个访问(select、update 等)均有一个记录,这将为您提供更高的粒度来建立访问模式 - 这与会话级审计相反,该审计只显示 ARUP 从表 credit_cards 中执行了选择和更新操作,但未显示操作次数或时间。
既然如此,应使用哪种类型的审计 - 会话级还是访问级?注意,由于访问级审计针对每个访问写入一个记录,因此写入的审计信息数量明显大于每个会话只写入一个记录时的信息数量。如果只尝试确定表的访问用户和访问方式,则应先打开会话级审计。这将使您可以了解用户如何访问每个对象。要跟踪特定用户的错误使用,可以打开访问级的审计。 可能的影响 根据前面的描述,审计不会影响性能。但审计的好处可能远远超过不利影响,尤其是当您巧妙地启用它时。此外,您不必始终打开它;您可以根据需要动态打开或关闭对象审计。
操作计划
- 在不审计所有对象的情况下,标识要审计的主要对象(表、程序包、视图)
- 对这些对象打开会话级审计。
- 一段时间之后(您认为该段时间代表典型的工作周期),分析审计跟踪。等待收集记录的时间通常取决于特定情况。例如,在零售业中,您可能要等待一个月的时间,在这段时间内通常会捕获所有过程,如月终处理、帐目汇总等。
- 开发配置文件后,请跟踪失败尝试。记录用户以及他们尝试访问的对象。
- 关闭会话级审计并只对这些对象打开访问级审计。
- 通过突出显示失败尝试、时间、尝试源自的终端等信息来分析访问模式,并确定尝试失败的原因。如果没有合理的原因,请将该尝试视为潜在的安全漏洞。
(编辑:aniston)
|