如何使用 Guardium 识别、监测和审计企业应用程序用户行为

当可疑或恶意的数据库行为发生的时候,要识别这些恶意行为是哪个用户在哪个时段访问数据库,是十分困难的事情。本文将系统介绍如何使用 Guardium 来自动识别,监测和审计应用程序用户的数据库访问行为。读者将从本文学习到如何根据自己企业的实际情况,有效配置 Guardium,来帮助他们自动识别应用程序用户,实时监测和保护他们的企业数据库,有效地审计应用程序用户的欺诈行为,进而提高工作效率,保障数据使用安全。

张喜青, 软件工程师, IBM

张喜青,IBM 软件工程师。 2004 年加入 IBM,先后从事数据库工具的设计,开发和测试工作。目前负责 Guardium 的测试工作。



孙盛艳, 软件工程师, IBM

孙盛艳,2010 年 8 月加入 IBM,目前就职于 IBM CDL Guardium 团队。多年数据库 DBA 经验。



2011 年 8 月 25 日

数据安全的挑战

现在许多企业组织都依靠企业应用程序来运营和管理核心业务和高度敏感的数据。这些企业应用程序架构通常由客户端 , 服务器端和数据库等多层组成。 为了提高数据库的访问性能 , 大多应用程序都采用连接池技术,该技术使用特定的一个或多个数据库用户,共享连接的方式来访问数据库,当用户会话需要访问数据库时,它会从池中取得连接,使用该连接,然后将其释放回池中。通过数据库监控工具通常我们可以检测到应用程序如何与数据库交互,但无法知道特定的应用程序用户执行了哪些特定的数据库操作。当可疑或恶意的数据库行为发生的时候 , 要识别这些恶意行为是哪个用户在哪个时段访问数据库,是十分困难的事情。 另外,企业应用程序对数据库的访问同样面对的还有来自审计部门的严格审查。包括各种财务法律法规(比如 Sarbanes-Oxley Act)、行业规定(比如 Payment Card Industry Data Security Standard [PCI DSS])和地方性数据隐私法律。它们都要求组织监测、记录和纠正对敏感数据的未授权访问和更改。对于使用通用服务账号访问数据库的多层架构企业应用程序,更需要提供完备的安全审计跟踪以便检验合规性。

如何自动识别和监测应用程序用户

针对不同的应用程序 , Guardium 提供了四种方法来自动识别应用程序用户。 其中 , 应用程序转换方法适用于 BO-WI,EBS-Oracle 商务套件,PeopleSoft, Observed SAP, SAP DB, Observed SIEBEL, SIEBEL DB 等应用程序。Guardium API 方法比较通用,适用于任何应用程序,缺点是需要在应用程序中加入 Guardium API 调用。 存储过程调用的方法适用于有存储过程调用的应用程序。应用服务器 STAP 的方法适用于 J2EE 程序,比如应用程序服务器为 IBM WAS, WEBLOGIC, JBOSS 等。企业可以根据以上方法的特点,结合自己的实际情况,来选择一种或几种方法来自动识别和监测应用程序用户。

应用程序用户转换方法

对于广泛使用的应用程序, 例如 SAP, BO-WI, EBS-Oracle 商务套件,PeopleSoft, SIEBEL 等,Guardium 具有内置支持,以供从应用程序中标识最终用户信息,从而可以将数据库活动关联至应用程序最终用户。 下面以 SAP 为例,说明如何在 Guardium 中配置应用程序转换信息,来获取用户。

  1. 选择“管理控制台”>“应用程序用户转换”。
  2. 单击“添加”按钮以展开“添加应用程序用户转换”面板。
  3. 在应用程序代码框中,输入用来标识应用程序的唯一代码 ( 例如‘ S002 ’ )。
  4. 从应用程序类型列表中,选择应用程序类型 SAP DB。
  5. 在应用程序版本框中,输入应用程序版本号(例如‘ sap test ’)。
  6. 从数据库类型列表中,选择数据库类型(例如‘ ORACLE ’)。
  7. 在服务器 IP 框中,输入应用程序用于连接数据库的 IP 地址。
  8. 在端口框中,输入应用程序用于连接数据库的端口号。
  9. 在实例名称框中,输入应用程序用于连接数据库的实例名称。
  10. 在 DB 名称框中,输入应用程序的数据库名称。(对 SAP 应用程序不是必需的,这里跳过。)。
  11. 选取活动框以启用用户转换。
  12. 输入用户名供 Guardium 访问数据库时使用。
  13. 输入密码供 Guardium 访问数据库时使用。以上配置如图 1 所示。
    图 1. 通过应用程序用户转换配置示例
    图 1. 通过应用程序用户转换配置示例
  14. 单击应用按钮以保存“应用程序用户转换”定义。
  15. 回到“管理控制台”>“监测引擎”,点击“重启监测引擎”按钮,使以上配置生效。
  16. 重新回到“应用程序用户转换”面板,单击“立即运行一次”按钮。 如果是安装“应用程序用户转换”设置后第一次单击该按钮,它会导入该应用程序的用户。如图 2 所示。
    图 2. 通过应用程序用户转换查询报告
    图 2. 通过应用程序用户转换查询报告
  17. 可以查看预定义报告(例如“SAP 应用程序访问”)来确认“应用程序用户转换”的数据导入。选择“工具”>“报告构建”>“报告构建器”并选择报告“SAP 应用程序访问”。重新生成此报告并添加至窗格中,选择日期范围(例如,查看 2002 年 1-3 月的数据)。生成的查询报告如图 3 所示。
    图 3. 导入应用程序用户(查看大图
    图 3. 导入应用程序用户

Guardium API 方法

对于通过内部方式管理用户的一些应用程序,无法从流量来识别应用程序用户。当发生此情况时,可使用 Guardium API 方式。 Guardium API 提供了以下简单的“无操作”调用。应用程序中需要或释放连接时或当发生任何其他相关事件时,调用这些 API 向 Guardium 发出信号。

  1. 通过 GuardAppUser API 设置应用程序用户

    该方法适用于用户获取和释放数据库连接事件。Guardium 自收到数据库连接的信号起,就把该连接上的所有行为和该用户相关联,直至收到另外一个应用程序用户名或者 GuardAppUserReleased 释放应用程序的调用。在 Guardium 建立报告,查看访问期限实体的应用程序用户属性, 即可得到 API 调用所发出的应用程序用户名。 语法:SELECT ‘ GuardAppUser:user_name ’ FROM location

    FROM location 只适用于 Oracle, DB2 和 Informix。注意:不同的数据库有不同格式:

    Oracle: FROM DUAL

    DB2: FROM SYSIBM.SYSDUMMY1

    INFORMIX: FROM SYSTABLES

  2. 通过 GuardAppUserReleased API 清除应用程序用户

    Guardium 收到该 API 发出的信号时,就清除应用程序用户,直到收到另外一个 GuardAppUser API 调用。

    语法:SELECT ‘ GuardAppUserReleased ’ FROM location

    FROM location 只适用于 Oracle, DB2 和 Informix。详细格式同 GuardAppUser API

  3. 通过 GuardAppEvent 设置应用程序事件

    与以上两个 API 相比,这个 API 提供了更通用的方法。当应用程序事件的开始和结束的时候,它允许用户自定义事件类型,并提供文字,数字或日期等与事件有关的信息。Guardium 在未收到其他 GuardAppevent: Start 和 GuardAppEvent: Released 命令之前,都将该数据库连接的所有行为和该事件相关联。

    语法:

    SELECT ‘ GuardAppEvent:Start|Released ’ ,

    ‘ GuardAppEventType:type ’ ,

    ‘ GuardAppEventUserName:name ’ ,

    ‘ GuardAppEventStrValue:string ’ ,

    ‘ GuardAppEventNumValue:number ’ ,

    ‘ GuardAppEventDateValue:date ’ FROM location



    Start|Released – Start 表示该事件获取连接, Released 表示该事件放弃数据库连接。

    type 标识事件类型。它可以是任何字符串值,例如:登录,注销,信用卡,借记卡等。此值作为事件类型属性或事件释放类型属性存储在应用程序事件实体中。

    Name 是事件的用户名。在应用程序事件的实体,这个值作为事件的用户名属性或事件释放用户名称属性在应用程序事件实体中。

    String 是事件任何字符串值。例如,对于登录,您可能会提供一个帐户名。在应用程序事件的实体,这个值作为事件字符串属性或事件释放字符串属性存储在应用程序事件的实体中。

    Number 是事件的任何数字值。例如,对于信用事件,你可能会提供交易量。这个值作为事件的值属性或事件释放的值属性存储在应用程序事件的实体中。

    Date 是事件的日期和时间。它的格式为:YYYY-mm-dd hh:mm:ss,其中 hh:mm:ss 是可选的。这可能是当前的日期和时间,也可以是取自交易进行跟踪。这个值作为事件的日期属性或事件释放的日期属性存储在应用程序事件的实体中。

    From Location 仅适用于 Oracle,DB2 或 Informix。 详细输入格式同 GuardAppUser API。

GuardAppUser API 和 GuardAppUserReleased API 通常配对使用,当用户获取和释放连接时通知 Guardium。GuardAppEvent API 比前两个 API 更通用,当发生相关事件时,调用该 API 向 Guardium 发出信号,给 Guarium 提供更多的信息。GuardAppUser API 调用所传递的信息,会保存在访问期限实体的应用程序用户属性中。GuardAppEventAPI 调用所传递的信息,会保存在应用程序事件实体中,这些信息可以通过创建 Guardium 查询和报表的方法得到。下面以 GuardAppUser 和 GuardAppUserReleased 为例, 来说明如何在应用程序中插入 Guardium API 调用以识别应用程序用户。

  1. 在获取数据数据库连接之后立即调用 GuardAppUser API,在释放数据库连接之前调用 GuardAppUserReleased API。调用示例如以下代码所示。
    清单 1. GuardiumAPI 调用示例
     String ip = ’ 192.168.1.2 ’ ; 
     String port = ‘ 50000 ’ ; 
     String sid = ‘ sample ’ ; 
     String uid = ’ tester ’ ; 
     String pwd = ‘ 123456 ’ ; 
    				    	
     Connection dbConn = DriverManager.getConnection 
        (“jdbc:db2://” + ip + “:” + port + “/” + sid, uid, pwd); 
     String sql = null; 
     Statement stmt = null; 
     ResultSet rs = null; 
    
     StringBuffer sb = new StringBuffer("SELECT 'GuardAppUser:") 
      .append(uid).append("_").append(ip).append("' FROM SYSIBM.SYSDUMMY1"); 
     sql = sb.toString(); 
    				
     try { 
        stmt = dbConn.createStatement(sql); 
        rs = stmt.executeQuery(); 
     } catch (SQLException se) { 
        se.printStackTrace(System.err); 
     } 
     // Here execute application sql statements 
     sql = "SELECT 'GuardAppUserReleased' FROM SYSIBM.SYSDUMMY1"; 
     try { 
        stmt = dbConn.createStatement(sql); 
        rs = stmt.executeQuery(); 
     } catch (SQLException se) { 
        se.printStackTrace(System.err); 
     } 
    
     Stmt.close(); 
     dbConn.close();
  2. 查看创建报告来查看应用程序用户是否和数据库访问行为相关联。选择“工具”>“报告构建”>“报告构建器”,选择访问期限为主实体,创建报告。如下图 4 所示。
    图 4. 通过应用程序用户转换查询报告(查看大图
    图 4. 通过应用程序用户转换查询报告

存储过程方法

应用程序用户除了可以从现有数据库流量中获取之外,也可以从存储过程调用中获取。Guardium 要知道观察哪些调用以及哪些参数包含相关的用户名或其他信息之后,就可以自动识别用户。 下面以存储过程 DB2INST1.SP_TEST 为例,说明如何在 Guardium 中配置存储过程调用信息,来获取用户。

  • 清单 2. 存储过程示例
     CREATE PROCEDURE DB2INST1.SP_TEST 
     (IN p_id INT,IN nameid VARCHAR(10),IN name VARCHAR(10), IN eventype varchar(10), 
      IN eventStr varchar(20),IN eventNum INT) 
     LANGUAGE SQL 
     MODIFIES SQL DATA 
    
     P1:BEGIN 
     declare nm varchar(10); 
     select name into nm from STAFF where ID=p_id; 
     END P1
  1. 选择“管理控制台”>“定制标识过程”,单击 添加映射窗格标题。
  2. 在定制映射名称框中,输入要用于此映射的名称。例如‘ maptest1 ’。
  3. 在过程名称框中,输入将提供信息的数据库存储过程名称。例如 ‘ DB2INST1.SP_TEST ’。
  4. 从“操作”列表中选择设置或清除,以指示过程调用是设置还是清除应用程序值。这里选择设置
  5. 如果只有在一个或两个条件下才能从现有存储过程调用获取应用程序信息,就需要设置条件参数。注意:本例子没有条件要求。
  6. 如果选择设置操作,需要使用“参数位置”窗格来指示哪些存储过程参数映射至哪些 Guardium 应用程序事件属性。第一个过程参数的编号为 1。对于调用过程没有设置的所有属性,使用 0(零,缺省值)。
    • a) 应用程序用户名位置 - 输入要使其与数据库活动相关联的应用程序用户名的参数位置。这里输入 3。
    • b) 事件字符串值位置 - 输入事件的字符串值的参数位置。这里输入 5。
    • c) 事件数字值位置 - 输入事件的数字值的参数位置。这里输入 6。
    • d) 事件类型位置 - 输入事件类型(“登录”、“注销”、“信用请求”等)的名称的参数位置。这里输入 4。
    • e) 事件日期位置 - 输入事件的日期 / 时间值的参数位置。本例的存储过程没有提供日期参数,所以输入 0。
  7. 在“服务器信息”窗格中,执行下列操作:
    • a) 从“服务器类型”列表中选择数据库服务器类型。
    • b) 在“数据库用户名”框中输入数据库用户名。
    • c) 可选:在“数据库名称”框中输入数据库名称。如果省略,那么将监视所有数据库。
    • d) 可选:识别一个或多个服务器。如果未指定任何服务器,那么将监视所有服务器。如果要只选择特定的服务器,请在“服务器 IP”和“服务器网络掩码”框中输入服务器 IP 地址和网络掩码;或者,如果要选择一组服务器,请从“服务器 IP 组”列表中选择一个服务器组,或单击“组”按钮以定义新的服务器组。
  8. 完成之后,请单击添加按钮以将映射添加至列表。以上配置如图 5 所示。
    图 5. 通过存储过程识别应用程序用户配置
    图 5. 通过存储过程识别应用程序用户配置
  9. 完成以上配置后,选择“管理控制台”>“监测引擎”,点击“重启监测引擎”按钮,使以上配置生效。
  10. 要获取存储过程整个调用记录,需要在 Guardium 中安装记录详细日志策略。如图 6 所示。
    图 6. 记录详细日志策略
    图 6. 记录详细日志策略
  11. 接下来调用该存储过程。
    • call DB2INST1.SP_TEST(10, 'userid', 'sptest4', 'login', 'this is a test', 1)
  12. 创建报告查询应用程序用户与其相应的数据库访问操作。该存储过程调用不仅被详细记录下来,其应用程序用户名也存储在访问期限实体的应用程序用户名中,报告如图 7 所示。
    图 7 通过存储过程识别用户查询报告(查看大图
    图 7 通过存储过程识别用户查询报告

应用程序服务器 STAP 方法

为了获得 J2EE 应用程序的用户,首先需要在应用程序服务器上安装 STAP,然后在 STAP 配置文件中设置以下和应用程序服务器相关的参数。

  • appserver_installed 如果 STAP 安装在 J2EE 应用程序服务器上,设为 1;否则,设为 0。
  • appserver_ports 应用程序服务器线程所使用的端口。
  • appserver_login_pattern 用来识别登录事件(发送 / 获取)。appserver_login_pattern 总是在用户名之前,通常是在第一个发送数据包的开始。如果用户名不是在第一个 POST 的包中,那么 appserver_login_pattern(应用程序服务器登录模式前缀)就是 appserver_username_prefix(应用程序服务器用户名前缀)。
  • appserver_username_prefix 应用程序服务器用户名前缀。就是用户名之前的模式。
  • appserver_username_postfix 应用程序服务器用户名后缀。就是用户名后的字符。
  • appserver_session_pattern 用来识别一个“新的会话”的答复。在第一个服务器发给客户端的网络中,先找到会话 ID,然后找到该模式。它在 appserver_session_prefix(应用程序服务器会话前缀)和应用服务器会话之前。例如:Set-Cookie:SESSID = Udsfasdgfddgfdgfdg ==;,其中 Set-Cookie 是 appserver_session_pattern( 应用服务器会话模式 )。
  • appserver_session_prefix 应用程序服务器会话前缀。例如:Set-Cookie:SESSID = Udsfasdgfddgfdgfdg ==;,其中 SESSID = 是 appserver_session_prefix(应用程序服务器会话前缀)。
  • appserver_session_postfix 应用程序服务器会话后缀。 例如:Set-Cookie:SESSID = Udsfasdgfddgfdgfdg ==;,其中‘ ; ’是应用程序服务器会话后缀。
  • appserver_usersess_pattern 如何识别一个现有的会话。在第一个 POST 包中,先找到用户名,再向后查找,找到会话 ID,usersess_prefix(用户会话前缀)之前的模式就是 appserver_usersess_pattern
  • appserver_usersess_prefix 会话 ID 前缀,表示会话从哪里开始。它通常与 appserver_session_prefix 相同
  • appserver_usersess_postfix 会话 ID 后缀,表示会话在哪里结束。通常它是与 appserver_session_postfix 相同

下面以 J2EE 应用程序 Plants By Websphere 为例,说明如何应用该方法在 Guardium 中识别应用程序用户信息,并将其与所执行的数据库访问行为相关联。

  1. 首先在本地 TAP 中配置应用服务器用户标识信息。登录数据服务器,执行该命令(Echo – n ‘ d4 ’ >/usr/local/Guardium/guard_stap/.stap.console)动态提高 STAP 日志的输出等级为 4。
  2. 以‘ amber@cn.ibm.com ’的身份登录应用程序,更新其帐号信息。如下图 8 所示。
    图 8. 登录应用程序
    图 8. 登录应用程序
  3. 打开 STAP 日志文件 ( 缺省为 /tmp/guard_stap.stderr.txt), 根据各参数说明查找所需的参数信息。查找方法如图 9 所示。
    图 9. 获取 STAP 参数配置信息
    图 9. 获取 STAP 参数配置信息
  4. 将所查找到信息配置 STAP 参数。选择“管理控制台”>“本地 STAP”->“STAP 控制”,选择需要配置的 STAP, 单击“应用程序服务器用户识别”窗格,配置所查找到各参数信息。如图 10 所示。
    图 10. 通过 STAP 转换识别用户配置
    图 10. 通过 STAP 转换识别用户配置
  5. 在 Guardium 安装记录详细日志策略,识别该应用程序访问数据库的详细行为。安装策略如图 11 所示。
    图 11. 记录详细日志策略
    图 11. 记录详细日志策略
  6. 创建报告来查看应用程序用户和其访问数据库的行为。选择“工具”>“报告构建”>“报告构建器”,选择访问期限为主实体,创建报告。如图 12 所示。
    图 12. 通过 STAP 方式识别用户查询报告(查看大图
    图 12. 通过 STAP 方式识别用户查询报告

如何自动审计应用程序用户行为

除了可以实时自动监测企业数据库之外,Guardium 还提供了自动化审计流程。该流程允许企业自己定制审计任务,审计结果接收方,查看,签署和向上级反应等一系列操作。审计任务分为多种类型,如报告,安全评估,隐私集和审计实体跟踪等。应用程序用户审计就是审计实体跟踪的一种。下面举例说明如何使用 Guardium 来审计应用程序用户的数据库访问行为。

  1. 创建审计过程。具有 admin 角色的用户,选择“工具”>“配置与控制”>“审计过程构建器”。所有其他用户,选择“遵从”>“审计过程构建器”。输入审计过程名称。
  2. 定义审计任务 。为了审计应用程序用户, 要先定义实体审计跟踪任务,然后选择应用程序用户名。输入需要审计的应用程序用户名,然后输入需要审计的时间范围,最后保存该任务。在保存过程之前,必须至少定义一个审计任务。
  3. 定义接收方。点击下拉框并添加审计任务的接收人。审计过程定义如图 13 所示。
    图 13. 应用程序用户审计过程定义
    图 13. 应用程序用户审计过程定义
  4. 保存审计过程,并运行
  5. 查看审计结果。如下图 14 所示。
    图 14. 应用程序用户审计结果
    图 14. 应用程序用户审计结果

小结

综上所述,企业可以根据 Guardium 所提供方法的特点,结合自身企业的实际环境,合理选用一种或组合多种方法来持续实时监控应用程序层面所有用户活动,包括企业内部人员和外部人员活动,及时发现用户的欺诈和篡改等行为,有效保护数据安全。企业还可以借助于这个自动化审计流程,轻松地满足遵从性指令,在简化审计的同时确保公司数据的隐私性和完整性,从而达到审计部门的安全要求,降低企业遵从性成本。

参考资料

学习

获得产品和技术

  • 使用可直接从 developerWorks 下载的 IBM 产品评估试用软件 构建您的下一个开发项目。
  • 现在可以免费使用 DB2。下载 DB2 Express-C,这是为社区提供的 DB2 Express Edition 的免费版本,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=754135
ArticleTitle=如何使用 Guardium 识别、监测和审计企业应用程序用户行为
publish-date=08252011