使用 InfoSphere Guardium Universal Feed 创建一个自定义的数据活动监控解决方案,第 1 部分: 为数据库源创建提要

不断创建和采用新的数据库和应用程序以满足特定的组织需求。根据规定,数据保护和审计功能的需求是必需的,并且比以往任何时候都更为重要。InfoSphere® Guardium® 数据保护解决方案可通过扩展来支持将各种新数据库和资源集成到其平台上,从而提供一致的企业级监控解决方案。本文提供了一个如何使用 InfoSphere Guardium 的 Universal Feed 特性将日志和安全事件从数据库源集成到外部系统的示例,以确保职责分离。

Joe DiPietro, IBM InfoSphere 数据治理卓越中心的领导者, IBM

作者 Joe DiPietro 的照片 Joe DiPietro 是 IBM InfoSphere 数据治理卓越中心的领导者。Joe 在安全性以及网络设计和实现方面有着超过 25 年的经验。在加入 IBM 和 Guardium 之前,他从事了 8 年多的 Check Point Software 安全先锋的工作。在此之前,DiPietro 是 SynOptics Communications 公司的企业系统工程师,并且是该公司的全球技术顾问 (World Wide Technical Counsel, WWTC) 的成员。Joe 拥有计算机科学和文学的硕士学位以及机械工程学的学士学位。



2013 年 4 月 01 日

简介

InfoSphere Guardium 提供了一个综合的数据活动监控和保护的解决方案,并包括对广泛的数据库、文件共享和其他系统(比如,Hadoop 和 Microsoft Sharepoint)的支持。大多数情况下,该解决方案依赖轻量级的软件探测器(称作 S-TAP)来监控事务,包括特权用户的事务。该监控活动被发送到 InfoSphere Guardium 设备并存储在其内部数据库中。这些信息可用于审计报告、实时警报等。

安全性和事件日志的关键是将这些日志构建到数据库或应用程序事务中,并将它们存储到外部系统中以确保职责分离。通过 InfoSphere Guardium 将事件数据发送给称之为收集器 的安全设备,并存储在内部数据库中用于报告和警报。使用 InfoSphere Guardium 中包含的 Universal Feed 功能,您就可以将相关的审计数据(可能是 Guardium 不支持的数据库或其他活动)集成到当前的数据活动监控 (DAM) 环境中,通过将其发送到收集器并存储在内部表中得以实现。

Universal Feed 通过以下选项来支持不同类型的活动监控。

  • 本文介绍的第一个选项是针对可以轻松集成到现有内部的 InfoSphere Guardium 表的活动。这通常指的是某种数据库源,因为 InfoSphere Guardium 专门为数据库活动提供支持。有关 InfoSphere Guardium 系统内的实体和属性的更多信息,请参阅该主题的产品帮助附录。本文包含的样例代码提供了一个将发送到 Guardium 设备上的模拟数据库日志。
  • 本系列文章第 2 部分将介绍另一个选项,该选项支持您集成任意数据源活动,通过允许您在 Guardium 数据库中创建自己的表结构来存储提要发送的消息得以实现。在这篇文章中,您将了解如何为 SSH 日志创建一个提要。

在使用 Universal Feed 存储来自受监控的真实设备的审计数据时,您将获得下列益处。

  • 不能通过清除审计和日志信息来覆盖对设备的非法破坏。
  • 维护职责分离以确保捕获正确的审计信息。
  • 如果特权用户决定篡改或更改该信息,他们将不能访问审计日志。

Universal Feed 代理将向 Guardium 设备发送信息,如图 1 所示。

图 1. Universal Feed 概述
UF 向 Guardium 设备收集器发送消息 - 单向。

红色圆点代表正在主机上运行的 Universal Feed 代理,将用于向 Guardium 设备发送审计信息。本文及其附带的样例代码可帮助您开发自己的代理。

表 1 突出显示了 Universal Feed 代理的开发人员所负责提供的内容。

表 1. Universal feed 职责
Universal Feed 开发人员InfoSphere Guardium
识别适当的审计信息。提供 API 和样例代码来帮助 Universal Feed 开发人员。
使用 Guardium 消息协议打包信息并发送到 Guardium 设备。接收使该数据用于 Guardium 基础架构的信息(报告、警报、报告发布,等等)。

代理需求

编码 Universal Feed 代理的第一步是了解代理需求。需求如下所示。

  • 为了测试和运行提要,需要一个最低级别为 V9.0 的 InfoSphere Guardium 设备。
  • 代理必须使用 Guardium 消息格式发送将要处理到 Guardium 内部表中的信息,或从该表中接收信息。清单 1 所示的消息格式用于数据库类型的 Universal Feed 代理,正如供应商字段中的 “0” 所显示的。一些大于等于 10001 的字段代表非数据库实现,将在本系列文章的第 2 部分中进行介绍。
    清单 1. 数据库源的 Guardium 消息格式
    struct sqlguard_msg {
    unsigned char msg_type;	    // Must be 'G'
        unsigned char pad;	    // Must be 0
        unsigned short data_len;// Length of  data in the "data" fields, network order
        uint32_t mark;		    //
        uint32_t timestamp;	    // Time in UNIX format (retval of time() syscall)
        uint32_t protocol_version;  // Must be 7
        uint32_t vendor;	    // Must be 0
        char identification[40];    // Must be all 0
        char data[MAX_DATA_LEN];    // Put the serialized protobuf message here
    };

    这些信息有两个方向流。
    • 从代理到收集器。
    • 从收集器到代理。
  • 该消息格式必须遵守基于 TCP 的 Guardium 通信协议,且必须按照以下要求发送 Guardium 握手消息。
    • 该握手消息允许收集器注册 UFA 名称。
    • 将 GUI 上的代理变成绿色以便您知道该代理是可操作的。
  • 该消息格式必须每隔 30 秒到 60 秒发送一条 Guardium Ping 消息。表 2 显示了已收到一条 Ping 消息的 Guardium 监控报告。
    图 2. S-TAP 状态监控器为绿色,表明均可操作
    监控器包含 stap 主机名和一个状态列,整行都是绿色。
  • 该消息格式必须能读取 Guardium 设备发送给代理的所有信息,如图 3 所示。
    图 3. 代理负责处理来自设备的消息
    该简图显示了一个箭头,从该设备指向主机上的代理。

    例如,发送握手信息后,Guardium 设备将该设备上的当前审计策略发送到 UFA。然后,代理处理该信息以识别关于如何配置 UFA 行为的相关细节。图 4 是一个消息流示意图。

    图 4. Universal feed 消息处理概述
    该图显示了 tcp 套接字打开、到设备、握手到设备、来自设备的策略规则、到设备的会话开始、到设备的客户端请求等的流程。更多细节在文本..

下面将详细介绍消息流。

  1. 代理使用 GA 在端口 16016 上打开一个 TCP 套接字,这是 Guardium 监听的默认端口。
  2. 打开端口 16016 后,代理发送握手消息,告知设备哪种类型的代理正在通信(使用 msg_type 字段)。
  3. 更高级的代理可以处理设备发送的策略规则。该代理然后可以根据策略规则调整其行为。
  4. 一旦代理想要给设备发送消息,它将发送一条会话开始消息。这就告知设备有新的审计数据需要存储,并将为该消息加盖时间戳。
  5. 然后,代理发送与这个特定会话相关联的更多审计信息。这些消息应使用 Client Request 消息格式来发送。
  6. 另外,也可以根据客户端请求发送服务器应答信息。
  7. 偶尔(每 60 秒或更短时间),代理应发送一个 ping 消息使设备知道该代理是健康的。如果设备没有收到 ping 消息,它将通过 syslog、SMTP 等给操作人员发送一个警报,以便调查该代理无法操作的原因。
  8. 该特定会话的所有信息发送之后,应通过发送会话结束消息关闭该会话。这将告知 Guardium 设备该特定会话的所有审计数据已收到并关闭会话记录。

清单 2 展示了代理发送的消息,如上文所示的握手、ping、会话开始、客户端请求和会话结束消息。

清单 2. Universal Feed 代理和 Guardium 收集器之间的样例消息交换
*** 1. SEND ***
type: HANDSHAKE
handshake {
    timestamp {
        unix_time: 1331583609
    }
    client_identifier: "NewUniversalFeedLogger"
    current_master: "NewUniversalFeedCollector"
    current_master_ip: 4027124234
}
*** 2. SEND ***
type: PING
ping {
    timestamp {
        unix_time: 1331583609
    }
    client_identifier: "NewUniversalFeedLogger"
    current_master: "NewUniversalFeedCollector"
    current_master_ip: 4027124234
}
                
*** 3. SEND ***
type: SESSION_START
session_start {
    session_id: 56
    session_locator {
        client_ip: 4027124234
        client_port: 1053
        server_ip: 4161341962
        server_port: 1030
    }
    timestamp {
        unix_time: 1331583631
    }
    accessor {
        db_user: "JoeD"
        server_type: "DB2"
        server_os: "ServerOperatingSystem"
        client_os: "ClientOSValue"
        client_hostname: "ClientHostName-Joe\'s Laptop"
        server_hostname: "ServerDBHostName"
        comm_protocol: "CommProtocol"
        db_protocol: "DB Protocol"
        db_protocol_version: "DBProtocolVersion"
        os_user: "OSUSer-JoeDiPietro"
        source_program: "SourceProgramNewApplication"
        client_mac: "clientMac"
        server_description: "ServerDescription"
        service_name: "ServiceName"
        language: DB2
        type: CONSTRUCT
    }
    process_id: "ProcessID String"
    terminal_id: "Terminal ID String"
    db_name: "DatabaseName"
    app_user_name: "AppUserName"
}
                
***4. SEND ***
type: CLIENT_REQUEST
client_request {
    session_id: 1
    data {
        language: DB2
        type: CONSTRUCT
        construct {
         sentences {
          verb: "Select"
           objects {
            name: "PatientTable"
          }
        }
        full_sql: "SELECT * FROM PatientTable"
    }
    timestamp {
      unix_time: 1331583634
    }
    session_locator {
       client_ip: 16777343
       client_port: 1030
       server_ip: 16843009
       server_port: 1030
    }
  }
}

*** 5. SEND ***
type: SESSION_END
session_end {
    session_id: 48013
    timestamp {
        unix_time: 1331583634
    }
    session_locator {
      client_port: 1053
      server_ip: 16843009
      server_port: 1030
  }
}

Universal Feed 样例程序组件

本文包括的样例代码可以轻松地将安全性和审计事件构建到自定义应用程序或数据库中。这将有助于提高这些应用程序的安全性,因为这些事件可存储在特权用户或潜在黑客无法访问这些日志的应用程序或数据库服务器上。

样例审计文件

在样例应用程序中,清单 3 中所示的审计文件将发送到 Guardium 设备。

清单 3. 样例审计文件 (sampleAuditLog.txt)
03/06/2012 16:24|48009|10.10.9.240|10.10.9.248|DB2|IBMUSER|SELECT * FROM CREDITCARD1
03/06/2012 16:26|48009|10.10.9.240|10.10.9.248|DB2|IBMUSER|SELECT * FROM CREDITCARD2
03/06/2012 16:27|48009|10.10.9.240|10.10.9.248|DB2|IBMUSER|SELECT * FROM CREDITCARD3
03/06/2012 16:28|48009|10.10.9.240|10.10.9.248|DB2|IBMUSER|SELECT * FROM CREDITCARD4
03/06/2012 16:29|48009|10.10.9.240|10.10.9.248|DB2|IBMUSER|SELECT * FROM CREDITCARD5

审计日志中的记录进行如下格式化:
Timestamp | Session ID|Client IP|Server IP|Database type|Database user|SQL statement text

应用程序代码

应用程序代码可以在以下文件中找到:

  • com/guardium/proto/datasource/test/Type1/FilePollingSample1.java
  • com/guardium/proto/datasource/test/Type1/TestUniversalFeed.java

com/guardium/proto/datasource/test/Type1/FilePollingSample1.java 类执行以下操作。

  1. 读取一个平面文件 (sampleAuditLog.txt)。
  2. 解析这些事件。
  3. 将信息格式化为特定的 Guardium 消息。
  4. 将这些消息通过 TCP 套接字发送到 Guardium 设备。

Guardium 设备将信息存储在 Guardium 内部表中以用于报告。

com/guardium/proto/datasource/test/Type1/TestUniversalFeed.java 是一个将 Guardium 消息类型发送给设备的简单程序。

基础架构和实用程序代码

实用程序和基础架构代码可以在以下类中找到:

  • com/guardium/proto/datasource/DatasourceMessageUtil.java
  • com/guardium/proto/datasource/Socket.java
  • com/guardium/proto/datasource/Wrapper.java

com/guardium/proto/datasource/DatasourceMessageUtil.java 用于帮助构建 Guardium Message 并从 Universal Feed 代理发送到该设备上。在这个类中您可以使用其他 Java 类调用该方法,从而轻松地构建 Guardium 消息。

com/guardium/proto/datasource/Socket.java 用于从 Universal Feed Agent 打开 Guardium Appliance 的 TCP Socket。

com/guardium/proto/datasource/Wrapper.java 用于将数据打包成适当的消息格式。

批处理文件

以下文件也包含在附件下载中。

  • compileJava.bat 是一个在 Windows 环境下编译代码的示例。
  • runFilePollingSample1.bat 是一个如何启动程序的样例。

运行样例程序

要运行样例程序,请输入清单 4 中所示的命令(或参见 runFilePollingSample1.bat)。

清单 4. 样例程序
java -jar FilePollingSample1.jar -host 10.70.147.72 -infile sampleAuditLog.txt -outfile
eventFileOut.txt -sendFileOnly true -loopAmount 1

用 InfoSphere Guardium 设备的 IP 地址替代主机 IP。该程序读取 SampleAudit.txt 文件并将信息发送到 Guardium 设备。图 5 是一个显示 Guardium 设备上的结果的样例报告。

图 5. 报告显示消息成功发送到 Guardium
该报告显示了 Guardium 报告中审计日志的内容

结束语

不断创建和采用新数据库及应用程序以满足特定的组织需求。但是,根据规定,数据保护和审计功能的需求应是全面一致的。InfoSphere Guardium 数据保护解决方案是可通过扩展以支持将各种新数据库和资源集成到其平台上,从而提供一致的企业级监控解决方案。本文附带的样例代码也是记录良好的代码,应该可以帮助您按照自己的方式为一个数据库服务器源创建 Universal Feed 代理。


下载

描述名字大小
本文所用的样例程序和实用程序文件UnivFeedSamplePart1.zip172KB

参考资料

学习

获得产品和技术

  • 使用 IBM 试用软件 构建您的下一个开发项目,可直接从 developerWorks 上下载。
  • 以最适合您的方式 评估 IBM 产品:下载产品试用版,在线试用产品,在云环境下使用产品,或在 SOA 沙盒 中花费几个小时来学习如何高效实现面向服务的架构。

讨论

条评论

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=863505
ArticleTitle=使用 InfoSphere Guardium Universal Feed 创建一个自定义的数据活动监控解决方案,第 1 部分: 为数据库源创建提要
publish-date=04012013