3.7 对未来对象启用审计
背景 到现在为止,您已经了解了如何针对特定的机密对象使用审计。您还可能决定对所有对象而非对象子集启用审计 - 您并不知道哪些对象是机密对象,也许它们全部是机密对象。这种情况下,将出现如下问题:不断在数据库中创建对象,并在对象物化时,您必须记住对它们启用审计。
策略 默认审计在此处非常有用。要对任何尚未创建的对象启用审计,请执行以下命令: audit select on default by session;
随后,当您在任何模式中创建表时,将对该表的 select 自动启用审计选项。要检查在数据库中当前设置的默认审计选项,请执行以下语句: SQL> select * from all_def_audit_opts;
ALT AUD COM DEL GRA IND INS LOC REN SEL UPD REF EXE FBK REA
--- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
-/- -/- -/- -/- -/- -/- -/- -/- -/- S/S -/- -/- -/- -/- -/-
注意 SEL 列下有一个值“S/S”。左侧值表示操作成功时的审计选项。此处该值为“S”,表示“会话级”。右侧部分指示操作何时失败,值也显示为“S”(也表示会话级)。由于您未指定应何时执行审计,从而为成功和失败设置了选项 - 因此值为“S/S”。
假设您要在成功时在会话级以及在失败时在访问级对 select 启用默认审计。您将执行下面的语句: SQL> audit select on default by session whenever successful;
Audit succeeded.
SQL> audit select on default by access whenever not successful;
Audit succeeded.
现在,如果您查看默认选项,则将看到以下语句: SQL> select * from all_def_audit_opts;
ALT AUD COM DEL GRA IND INS LOC REN SEL UPD REF EXE FBK REA
--- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
-/- -/- -/- -/- -/- -/- -/- -/- -/- S/A -/- -/- -/- -/- -/-
此处,请注意列 SEL,该列显示“S/A” - 表示在成功时为会话级(“S”,位于“/”的左侧),在失败时为访问级(“A”,“/”的右侧)。
当您要限制成功访问下的审计条目数时,这样的安排将比较常见,因此对成功访问启用会话级审计。但由于您要跟踪出现的每个失败访问,因此对失败启用了访问级审计。
要禁用默认审计,请执行以下语句: noaudit select on default;
稍后,您应签入 all_def_audit_opts 视图以确保实际上关闭了默认审计选项。 可能的影响 在许多审计中,始终存在性能方面的问题,但针对其中包含的信息而言,代价可能比较小。
但其中也存在一个潜在的危险。由于对随后创建的所有对象均启用了默认审计而与创建它们的用户以及从中进行选择的用户无关,因此作为 DBA 的您将无法控制表的审计选项。恶意攻击者可能会利用这种情况,他可以随意创建对象、插入到对象中、从对象中进行选择,并最终删除对象 - 而所有这些操作恰好在表空间级强制使用的份额中发生。
但由于对每个创建的对象均打开了审计,因此审计跟踪中的记录不断增多,并最终填满 AUD$ 表。由于该表位于 SYSTEM 表空间中,因此它最终将被填满并终止数据库,这实际上相当于创建了一个拒绝服务攻击!
尽管这种情况很少出现,但却完全有可能出现。幸运地是,防范方法比较简单:只需密切监视 SYSTEM 表空间。如果空间很快耗尽,请调查一下审计记录的创建为何如此之快。如果看到大量创建或选择的对象,而这些对象并不属于使用审计构建的配置文件,则必须进行调查。
作为一个立杆见影的措施,您可以关闭默认审计,然后关闭对那些填满审计跟踪条目的对象的审计(可以联机执行)。然后,在将其存储到其他表空间中的某个表之后,您应删除审计跟踪中的记录以便将来分析。 操作计划
- 确定执行哪些操作来启用默认审计。
- 确定所需的默认审计级别 - 会话级或访问级。
- 启用默认审计。
3.8 只限制来自特定节点的访问
背景 在许多情况下,只有指定的客户机集将连接到数据库服务器。以下是一个典型的体系结构:
此处,数据库服务器为 findb01 和 hrdb01,且数据库名为 FINDB(财务数据库)和 HRDB(HR 数据库)。HR 部门中的客户机只连接到 HRDB;如果它们需要 FINDB 中的某些数据,则连接到在财务部门的服务器上运行的应用程序并获取数据。同样,财务部门中的应用服务器从不直接连接到 HRDB。
如果财务部门中的客户机 finas01 尝试连接到 HRDB,则将出现什么情况?只要它知道有效的用户 ID 和口令,便可以成功连接。通常,您应保护用户的口令,但有时存在一些使用已知口令的普通用户。例子包括使用不安全口令(如“hrapp”、“password”甚至“abc123”)的应用程序用户。即使实施了口令管理策略(如第 4 阶段所述),口令仍有可能是为人所熟知的。
因此,必须在服务器周围构建一个防护墙,以防计算机授权列表以外的客户机连接到这些服务器。 策略 如何确保只允许来自 HR 部门的客户连接进入数据库 HRDB?方法有两种,即登录触发器和监听器节点验证。
登录触发器。在该方法中,您将创建一个触发器,它在登录时引发,检查 IP 地址,然后当 IP 地址不在允许的计算机列表中时失败。此触发器如下所示: 1 create or replace trigger valid_ip
2 after logon on database
3 begin
4 if sys_context('USERENV','IP_ADDRESS') not in (
5 '100.14.32.9'
6 ) then
7 raise_application_error (-20001,'Login not allowed from this IP');
8 end if;
9* end;
在第 5 行中,您可以设置有效客户机的所有 IP 地址(括在引号中并由逗号分隔)。在此触发器生效后,当 SCOTT 尝试从触发器列表以外的 IP 地址连接时: $ sqlplus scott/tiger@hrdb
ERROR:
ORA-00604:error occurred at recursive SQL level 1
ORA-20001:Login not allowed from this IP
ORA-06512:at line 5
注意错误 ORA-20001:Login not allowed from this IP,该错误置于触发器中。您可以根据需要使此消息具备说明性。还可以使触发器更强大,以收集有用信息(如将类似尝试记录在表中)。
但请注意一个非常重要的问题:由于登录触发器不会对 DBA 用户触发,因此不要在启用 DBA 角色的情况下禁止某人以用户身份登录。该风险并非想象那样恐怖;实际上,您可能需要让 DBA 从任何客户机登录。
监听器节点验证。另一个方法是在监听器本身禁用登录尝试。监听器禁止指向数据库服务器的连接尝试,因此并不需要触发器。要启用节点验证,只需在服务器 hrdb01 上的文件 $ORACLE_HOME/network/admin/sqlnet.ora 中设置以下行。 tcp.validnode_checking = yes
tcp.invited_nodes = (hrdb01, hras01, hras02)
此处,您已经指定了允许连接到监听器的客户机(hras01 和 hras02)。还可以将主机名指定为 IP 地址。将所有节点名称置于由逗号分隔的单个不中断行中(非常重要)。别忘了添加数据库服务器名称 (hrdb01)。
重新启动后,如果客户端尝试从 hras01 或 hras02 以外的计算机登录,则将收到错误 $ sqlplus scott/tiger@hrdb
ERROR:
ORA-12537:TNS:connection closed
这个非常不直观的错误是由在监听器级发生的过滤导致的。当监听器本身终止连接尝试时,您将收到 connection closed 错误。即使用户具有 DBA 角色也会出现该错误,这是因为该尝试尚未到达数据库。
节点验证是一个非常强大的特性。有关该特性的详细信息,请阅读我撰写的 DBAzine 文章“使用 Oracle Net 构建一个简单的防火墙”。
因此,您应选择哪个方法来防止多余的客户端连接?下面我们将介绍一下这两个方法的优点和缺点。
- 节点验证在监听器级进行,因此将禁止所有用户连接 - 即使具有 DBA 角色的用户也不例外。而这可能并不是所需的。例如,如果您在台式机上安装了一个 DBA 工具并且您的台式机启用了 DHCP(每当该台式机连接到网络时将分配一个新的 IP),则无法将 IP 地址置于有效节点列表中;因此,您将无法连接。
- 节点验证需要重新启动监听器。监听器将在短时间内关闭,因此客户端将无法连接。尽管这可能算不上是问题,但您应该注意它。每当更改有效节点列表时,您必须要重新启动监听器。
- 如果要临时禁用节点验证,则应将 tcp.valid_node_checking=no 置于文件 sqlnet.ora 中并重新启动监听器。对于登录触发器而言,您所要做的就是禁用触发器。您可以在需要时重新启用它。
- 在节点验证中,可以将所有允许的客户端置于一行中,但只能置于一个不中断行中。如果该列表太长无法放在一行中,则您将无法使用该方法。而触发器方法几乎没有限制。您也可以使用另一个名为连接管理器的特性来限制长度超过一行的 IP 地址。
- 必须在节点验证中使用特定 IP 地址或主机名 - 不要使用“10.20.%.%”这样的通配符,因为它们表示子网 10.20 中的所有客户端。在触发器方法中,您可以使用通配符也可以使用连接管理器。
- 通过触发器方法,您可以构建一个复杂的跟踪系统,以针对所有尝试(成功或被拒绝)写入某个跟踪表。而节点验证中不存在这样的功能。
- 在触发器方法中,您可以根据 IP 以外的参数(如一天中的某个时间、用户连接等)控制访问。节点验证只读取 IP 地址。
- 注意,节点验证禁止监听器级的尝试;而数据库连接尚未尝试。因此,如果已经针对失败的尝试启用了审计,则它们将不被注册。
- 由于节点验证在监听器级别起作用,因此潜在的恶意攻击者甚至不会进入数据库,从而使拒绝服务攻击变得更困难。这对节点验证而言是一个巨大的好处。
您在考虑以上差别后应确定方法。通常情况下,如果您的目标只是禁止来自 IP 地址的连接,而不使用任何其他功能(如跟踪这些失败的尝试),则节点验证是一个快速、简单的方法。如果需要更复杂的功能,则应查看登录触发器。
如何知道要阻止哪些 IP 地址以及允许哪些 IP 地址?也许此假设太简单;实际上,客户机的列表将很长并很难攻击。在此处使用前面的调查将比较方便。注意,在第 2 阶段,您通过查看监听器日志捕获了用户连接源自的 IP 地址。在该步骤中,您一定已经生成了一个有效的客户端 IP 地址或主机名列表。该列表就是您需要知道的。
可能的影响 可能的影响可能比较严重;如果尚未执行您的操作,则可能阻止合法客户端。
操作计划
- 从第 2 阶段的第 1 步中,获得客户机的有效 IP 地址或主机名的列表。
- 确定要使用的方法 - 基于触发器或节点验证。
- 实施该计划。
- 密切监视几天,最好是整个周期(如一个月或一周),这对您的企业比较适合。
- 通过添加或删除过滤的节点微调该方法。
(编辑:aniston)
|