3.5 创建数据库用户的配置文件
背景 在设计任何安全性系统时,最初都应彻底、准确地了解用户如何访问该系统及其访问模式,否则您将没有比较“基线”。作为一名 DBA,您应了解用户及其应用程序和访问机制(如访问源、涉及的 DDL 等)。
策略 在这种情况下使用 Oracle 审计将非常方便。您不必编写大量登录/注销触发器以及复杂的 PL/SQL 代码片断。相反,只需在数据库初始化参数文件中设置以下参数即可启用审计: audit_trail = db
然后重新利用数据库。设置后,请以 DBA 用户的身份执行以下命令。 audit session;
该语句将对所有会话级的活动(如登录和注销)启用审计。它至少显示了登录用户、登录时间、登录源自的终端、IP 地址、主机等等。
打开审计后,可以通过执行以下 SQL 监视活动。 select to_char(timestamp,'mm/dd/yy hh24:mi:ss') logon_ts,
username,
os_username,
userhost,
terminal,
to_char(logoff_time,'mm/dd/yy hh24:mi:ss') logoff_ts
from dba_audit_trail
where logoff_time is not null;
示例输出如下: LOGON_TS USERNAME OS_USERNAM USERHOST TERMINAL LOGOFF_TS
------------------ --------------- ---------- --------------- --------------- ------------------
01/11/06 20:47:06 DELPHI sgoper stcdelpas01 unknown 01/11/06 20:48:46
01/11/06 20:48:21 DELPHI sgoper stcdelpas01 unknown 01/11/06 20:48:38
01/11/06 20:48:41 DELPHI sgoper stcdelpas01 unknown 01/11/06 20:49:19
01/11/06 20:36:03 STMT crmapps stcdwhpd pts/3 01/11/06 20:36:03
01/11/06 20:36:04 STMT crmapps stcdwhpd pts/3 01/11/06 20:37:40
从该输出中您可以清楚地看到连接到数据库的用户 ID、他们的 OS 用户 ID (OS_USERNAME) 以及他们注销的时间。如果他们从与数据库服务器相同的服务器中连接,则他们的终端 ID 将显示在 TERMINAL 列的下方 (pts/3)。如果他们从其他服务器连接,则此终端 ID 将显示在 USERHOST 列 (stcdelpas01) 中。
了解如何显示该信息后,可以构造查询来获得更有用的信息。例如,一个典型的问题是“用户通常从哪些计算机连接?”以下 SQL 语句将快速获得答案: select userhost, count(1)
from dba_audit_trail
group by userhost
order by 2
/
审计最佳实践
您在本文已经了解了如何使用审计实施某些基础级别的职责。但该方法有一个很大的限制:您必须通过设置初始化参数 AUDIT_TRAIL 来启用审计。该参数不是动态的;因此要启用它,必须重新利用数据库。但如果计划所需的中断比较困难(对于很多 DBA 而言比较困难),那么您将采用哪些方法?
我在创建数据库时始终将该参数设置为 DB(针对 Oracle9i 和更高版本)和 DB_EXTENDED(针对 Oracle 数据库 10g)。且慢,这样做是否会启用审计并填满 SYSTEM 表空间中的 AUD$ 表,从而导致数据库中断?
不会,将 AUDIT_TRAIL 设置为某个值不会启用审计。它只是为审计准备数据库 - 指定将跟踪写入到的位置(如写入到 OS 或数据库)、已完成的审计量和类型以及格式是否为 XML(在 Oracle 数据库 10g 第 2 版中引入)。
要启用审计,必须对对象使用 AUDIT 命令。例如,使用以下命令对表 credit_cards 开始进行审计。 audit select, insert, update, delete on ccmaster.credit_cards;
创建数据库时设置参数 AUDIT_TRAIL 还使您可以针对安全性以外的原因捕获审计,如收集有关会话使用的 CPU 和 IO 的信息(该信息将输入到资源管理器中)。因此,当您下次重新启动数据库时,请先设置 AUDIT_TRAIL 参数。 | 示例输出可能如下所示(直到输出结尾): USERHOST COUNT(1)
--------------- ----------
stccampas01 736
stcdwhpd 1235
stcdelpas01 2498
您可以看到,该输出表明大多数连接均来自客户机 stcdelpas01,而下一个最大连接数来自 stcdwhpd(数据库服务器本身的名称)。您可能对此感到吃惊,因为您可能已经假设连接来自外部。
下一个问题可能是:“哪个用户直接从服务器访问数据库?”另一个 SQL 片断将为您提供该信息: select os_username, username, count(1)
from dba_audit_trail
where userhost = 'stcdwhpd'
group by os_username, username
order by 3
/
示例输出: OS_USERNAME USERNAME COUNT(1)
----------- -------- --------
oracle SYS 100
oracle DBSNMP 123
oracle PERFSTAT 234
infrap DW_ETL 1986
该输出清楚地表明 OS 用户 infrap 在服务器本身中运行了某个程序并以 DW_ETL 的身份连接。这是否正常?请询问该用户。如果未收到合理的响应,则应收集更多信息。关键是要知道有关用户的所有信息:他们的身份、他们来自哪里以及他们执行了什么操作。
另一个可以从审计跟踪中获得的重要信息部分是关于过去可能进行的攻击的证据。当恶意攻击者发起攻击时,他可能不会每次都获得正确的口令,因此他可能采用强行攻击方法,即不断尝试猜测口令,然后登录。
可以通过从审计跟踪中标识用户名/口令组合的模式来检测此类攻击。线索体现在 RETURNCODE 列,该列存储用户在进行连接尝试时引发的 Oracle 错误代码。如果提供了错误口令,则用户将引发以下错误: ORA-1017:invalid username/password; logon denied
因此,应查找 ORA-1017,如以下 SQL 语句所示: select username, os_username, terminal, userhost,
to_char(timestamp,'mm/dd/yy hh24:mi:ss') logon_ts
from dba_audit_trail
where returncode = 1017;
(编辑:aniston)
|