2021SC@SDUSC

一、Framework 部分源码分析

(接上一篇文章)

def __shouldRunBackup(self)

该函数的主要功能为检查是否开始运行备份操作

备份时间:默认为每天的 01:00:00

这里又用到了 python 的datatime模块:

  • datetime.replace():用于操作模块 datetime 的 datetime 类的对象。

    它用于用相同的值替换日期和时间,但括号中指定的关键字参数为这些参数赋予新值的参数除外。

    这是一个实例方法,这意味着它可以在类的实例上工作。

  • 模块:import datetime

  • 类:from datetime import datetime

  • 句法:

    replace(
    year=self.year,
    month=self.month,
    day=self.day,
    hour=self.hour,
    minute=self.minute,
    second=self.second,
    microsecond=self.microsecond,
    tzinfo=self.tzinfo,
    * fold=0)
    
  • 参数:

    • year :实例的新年份值(范围:1 <= year <= 9999)
    • month :实例的新月份值(范围:1 <= month <= 12)
    • day :实例的新日期(范围:1 <= day <= 31)
    • hour:范围(24)
    • minute:范围(60)
    • second:范围(60)
    • microsecond: 范围(1000000)
    • tzinfo: 作为tzinfo参数传递给datetime构造函数的对象,如果没有传递则为None。
    • fold:[0,1]
def __shouldRunBackup(self):now = datetime.now()backup_hour = now.replace(year=self.__bkConfig['last_run'].year,month=self.__bkConfig['last_run'].month,day=self.__bkConfig['last_run'].day,hour=1,minute=0,second=0) + timedelta(days=1)if 'backup_hour' in self.__bkConfig:try:(config_backup_hour, config_backup_minute) = self.__bkConfig['backup_hour'].split(':')backup_hour = backup_hour.replace(hour=int(config_backup_hour),minute=int(config_backup_minute))except Exception, e:print str(e)logger.warning("Bad parameter in backup_hour config table, using default time (01:00:00 Local time)")

在以下三种情况时运行备份:

  1. 到达备份时间
  2. alienvault-reconfig 没有运行
  3. alienvault-update 没有运行
if backup_hour > now:return False
if self.__is_process_running('alienvault-reconfig'):logger.info("There is a alienvault-reconfig proccess running. Cannot run a Backup at this time")return False
if self.__is_process_running('alienvault-update'):logger.info("There is a alienvault-update proccess running. Cannot run a Backup at this time")return Falsereturn True

def __delete_events_older_than_timestamp(self, limit_date)

该函数主要功能为删除所有大于时间戳的事件

deletes:存储将要删除的事件对应的SQL语句

def __delete_events_older_than_timestamp(self, limit_date):deletes = []total_events = 0

从数据库中获取最早的事件的日期(__get_oldest_event_in_database_datetime这个函数在后面进行分析)

begin_date = self.__get_oldest_event_in_database_datetime()

接下来就是具体的删除事件操作

while begin_date < limit_date:end_date = begin_date.replace(hour=23, minute=59, second=59, microsecond=0)if end_date > limit_date:end_date = limit_datequery = "SELECT COUNT(id) AS total FROM alienvault_siem.acid_event WHERE timestamp BETWEEN '%s' AND '%s';" % (begin_date, end_date)query_result = self.__myDB.exec_query(query)if len(query_result) == 1:events_to_delete = query_result[0]['total']total_events += events_to_deleteif events_to_delete != 0:logger.info("Events to delete: '%s' events from %s to %s" % (events_to_delete, begin_date, end_date))block = 100000delete_tmp_table = "alienvault_siem.backup_delete_temporal"delete_mem_table = "alienvault_siem.backup_delete_memory"

获取从开始日期到结束日期要删除的事件ID

deletes.append("CREATE TABLE IF NOT EXISTS %s (id binary(16) NOT NULL, PRIMARY KEY (id));" % delete_tmp_table)
deletes.append("TRUNCATE TABLE %s;" % delete_tmp_table)
deletes.append("INSERT IGNORE INTO %s SELECT id FROM alienvault_siem.acid_event WHERE timestamp BETWEEN '%s' and '%s';" % (delete_tmp_table, begin_date, end_date))
deletes.append("CREATE TEMPORARY TABLE %s (id binary(16) NOT NULL, PRIMARY KEY (`id`)) ENGINE=MEMORY;" % delete_mem_table)

按块删除

for __ in xrange(0, events_to_delete + 1, block):deletes.append("INSERT INTO %s SELECT id FROM %s LIMIT %d;" % (delete_mem_table, delete_tmp_table, block))deletes.append("CALL alienvault_siem.delete_events('%s');" % delete_mem_table)deletes.append("DELETE t FROM %s t, %s m WHERE t.id=m.id;" % (delete_tmp_table, delete_mem_table))deletes.append("TRUNCATE TABLE %s;" % delete_mem_table)deletes.append("DROP TABLE %s;" % delete_mem_table)deletes.append("DROP TABLE %s;" % delete_tmp_table)

删除表条目

deletes.append("DELETE FROM alienvault_siem.ac_acid_event WHERE timestamp <= '%s';" % end_date)
deletes.append("DELETE FROM alienvault_siem.po_acid_event WHERE timestamp <= '%s';" % end_date)next_day = begin_date.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1)
next_date = self.__get_oldest_event_in_database_datetime(next_day.strftime("%Y-%m-%d %H:%M:%S"))if begin_date.day == next_date.day:breakbegin_date = next_date
deletes.append("CALL alienvault_siem.fill_tables('%s', '%s')" % ('1900-01-01 00:00:00', begin_date.strftime("%Y-%m-%d %H:%M:%S")))logger.info("-- Total events to delete: %s" % total_events)

遍历deletes,执行删除操作SQL语句

for delete in deletes:logger.info("Running delete: %s" % delete)try:self.__myDB.exec_query(delete)except Exception, e:logger.error("Error running delete: %s", str(e))

purgeOldBackupfiles(self)

该方法主要功能为清除旧备份文件。

def purgeOldBackupfiles(self):backup_files = []bkdays = 5try:#从配置信息中读取backup_daybkdays = int(_CONF[VAR_BACKUP_DAYS_LIFETIME])except ValueError,e:logger.warning("Invalid value for backup_day in config table")

timedelta :该函数表示两个时间的间隔
参数可选、默认值都为0:
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

通过 while 循环,分别对每天的备份进行处理,在相应目录下,创建 /insert-[经过格式化的时间字符串 today].sql.gz

today = datetime.now() - timedelta(days=1)
while bkdays>0:dt = today.date().isoformat()dtstr = "%s" % dtdtstr = dtstr.replace('-','')str_insert = '%s/insert-%s.sql.gz' % (self.__bkConfig['backup_dir'], dtstr)str_delete = '%s/delete-%s.sql.gz' % (self.__bkConfig['backup_dir'], dtstr)backup_files.append(str_insert)backup_files.append(str_delete)bkdays = bkdays - 1today = today -timedelta(days=1)

glob 是 python 自带的一个操作文件的相关模块,用它可以查找符合特定规则的文件路径名。模块功能不是很多,还是比较容易掌握的。
使用该模块查找文件,只需要用到: “*”, “?”, “[]”这三个匹配符;

  • ”*”匹配0个或多个字符;
  • ”?”匹配单个字符;
  • ”[]”匹配指定范围内的字符,如:[0-9]匹配数字。

因为这里用到了这个模块里面的方法,来实现文件路径名的查找,所以先简单学习介绍一下这个模块。

这里主要实现通过 os.unlink() 方法来删除一些过时的备份文件,如果文件是一个目录则返回一个错误。 os.unlink() 是 python 用来删除指定路径文件的一个函数。

for bkfile in glob.glob(os.path.join(self.__bkConfig['backup_dir'], '[insert|delete]*.sql.gz')):bkfilep=os.path.join(self.__bkConfig['backup_dir'], bkfile)if bkfilep not in backup_files:logger.info("Removing outdated backfile :%s" % bkfilep)try:os.unlink(bkfilep)except Exception,e:logger.error("Error removing outdated files: %s" % bkfilep)

`__updateBackupConfigFile(self)` :

主要实现功能为更新备份配置文件

def __updateBackupConfigFile(self):try:bk_configfile = open(BackupManager.UPDATE_BACKUP_FILE, "wb")pickle.dump(self.__bkConfig, bk_configfile)bk_configfile.close()os.chmod(BackupManager.UPDATE_BACKUP_FILE,0644)except Exception, e:logger.error("Error dumping backup config update_file...:%s" % str(e))

二、可疑流量检测

(接上一篇文章)

4、OSSIM中的Snort规则与SPADE检测

在 OSSIM 系统里的 Snort 软件集成了大约 9000 种规则,看似覆盖面很广,但这是通用规则,有很多规则需要根据网络情况进行“私人定制",OSSIM 平台提供了二次开发的环境,所有规则都可以增、删、改。

OSSIM 3 系统中提供了 SPADE (Statistics Packet Anomaly Detect Engine,统计包异常检测引擎),异常检测的手段可通过 Arpwatch 检测 MAC spoofing,地过 P0f 检测操作系统变化,通过 Pads 和 Nmap 检测新增网络服务,用它还可以检测无匹配特征的一些可疑流量。具体原理是,SPADE 观测网络流量,并建议一张描述网络正常时的流量表作为基准。OSSIM 发展到 5.x 版后用 prads 代替原先 arpwatch 和 pads 的功能。

这张表记载的数据包的类型、源地址、目的地址,当达到一定大小后,SPADE 挑出每个包将被赋值,该数值的大小取决它在表中出现的频率,频率越高,该值越小。当该数值达到某一配置阈值时,就会产生报警。

这种方法对于检测黑客的异常行为非常奏效,有些攻击者会缓慢地扫描服务器端口,企图把自己的扫描数据,淹没在大量合法数据包中,以达到隐蔽目的,即使是使用了多个源地址进行活动,也会被 SPADE 察觉。又如,假定我们使用 SPADE 功能保护一台 WEB 服务器。首先我们把 Web 服务器所有流量镜像到交换机 SPAN 口,我们的 OSSIM 系统在哪里进行监听呢?

SPADE 为进入服务器的流量建立一张表,这些流量大部分是对 80 和 443 端口的 TCP 链接,建立后,对 80 和 443 端口的 TCP 请求就是正常流量,这时会被赋予一个较低的数值。如果这时攻击者想要查明该服务器有哪些开放端口,SPADE 就会给这些流量赋予一个较高的值,因为它对于这台服务器是比较少见的。此时,如果该值超过了事先定义好的阈值,系统就会发出报警。

5、恶意代码行为特征分析

随着恶意代码技术的发展,涌现出了各种恶意代码分析技术。当前主流的恶意代码分析技术是静态分析等技术,分析的目的就是依靠工具找到特征码

比如,在 2004 年 3 月发现的一种蠕虫,名叫 W32.Netsky.P@mm,它是一种群发邮件蠕虫,它使用自己的 SMTP 引擎将自己发送到在扫描硬盘和映射的眼动哭时块到的由子邮箱。此蠕虫还试图利用各种文件共享程序、通过将自己复制到各个共享文件夹进行传播。我们只要找到它的特征码,即可对其进行编写检测规则。

6、蜜罐检测

对于蠕虫样本的提取,主要采用的方式是基于蜜罐系统捕获。在这种可控的模拟环境中,可以消耗黑客精力,并记录黑客来源和犯罪证据。另外, IDS 的特征库需要不断地更新,才能检测到新的攻击行为。

蜜罐系统将记录到的入侵信息传递给入侵检测系统,入侵检测系统收到事件信息后,对其进行分析并提取攻击特征,最后将新的攻击特征添加到系统的攻击特征库中,从而使得入侵检测系统可以检测出未知的攻击手段。利用蜜罐系统与入侵检测系统的联动,可以增强入侵检测系统对网络的防御能力,这个系统的架构如下图所示。

OSSIM 系统中的 Snort 软件支持对报警定制,并支持优先级。可以根据需要添加许多自定义的报警分类。就像特征码一样,报警分类也是通过规则来定义。

到此为止,OSSIM系统中的可疑流量检测技术大体已经分析完毕,接下来的工作是进行代码分析的同时对OSSIM日志收集与分析部分进行分析

本篇文章部分内容参考或转载自下列文章及书籍。侵权即删。

参考书籍:

  • 《开源安全运维平台OSSIM疑难解析(入门篇)》——李晨光著
  • 《开源安全运维平台OSSIM疑难解析(提高篇)》——李晨光著
  • 《开源安全运维平台:OSSIM最佳实践》——李晨光著

参考文章:

  • https://blog.51cto.com/chenguang/2426473
  • https://blog.csdn.net/lcgweb/article/details/101284949
  • https://blog.51cto.com/chenguang/1665012
  • https://www.cnblogs.com/lsdb/p/10000061.html
  • https://blog.51cto.com/chenguang/1691090
  • https://blog.51cto.com/chenguang/category10.html
  • https://blog.51cto.com/topic/ossim.html
  • https://blog.csdn.net/isinstance/article/details/53694361
  • https://blog.51cto.com/chenguang/1332329
  • https://www.cnblogs.com/airoot/p/8072727.html
  • https://blog.51cto.com/chenguang/1738731
  • https://blog.csdn.net/security_yj/article/details/120153992

上一篇:OSSIM开源安全信息管理系统(九)
下一篇:

OSSIM开源安全信息管理系统(十)相关推荐

  1. OSSIM开源安全信息管理系统(十六)

    2021SC@SDUSC 本周继续对OSSIM系统中,关联分析部分进行源码分析. 关联分析部分源码目录:\ossim\alienvault-ossim\src\alienvault-ossim\os- ...

  2. OSSIM开源安全信息管理系统(十五)

    2021SC@SDUSC 目录 五.OSSIM关联分析的部分源代码分析 1.sim-directive.c 1.1.初识 glib 1.2.glib 基本类型定义 1.3.glib 函数 1.4.源码 ...

  3. OSSIM开源安全信息管理系统(十二)

    2021SC@SDUSC 本周主要分析的内容为 Framework 模块中,Listener.py 文件.然后衔接上周内容,继续对 OSSIM 系统的日志分析部分进行简单分析. 1.Listener. ...

  4. OSSIM开源安全信息管理系统(十四)

    2021SC@SDUSC 从本周开始,进入一个全新的模块,开始对 OSSIM 的关联分析机制进行分析.首先对管理分析机制进行简介. 关联分析 在 OSSIM 中,关联分析这部分应该算是这个系统的较为关 ...

  5. OSSIM开源安全信息管理系统(六)

    2021SC@SDUSC (接上一篇文章:) __daemonize__(self) : 守护进程方法 如果收到信号 signal.SIGTERM(终止进程),调用 self.stop 当用户输入 k ...

  6. OSSIM开源安全信息管理系统(一)

    2021SC@SDUSC 一.项目综述 项目背景: 本项目为山东大学软件学院2021-2022学年秋季学期 "软件工程应用与实践" 课程项目 小组成员: 网安工学 李宏伟.网安工学 ...

  7. OSSIM开源安全信息管理系统(二)

    2021SC@SDUSC 一.OSSIM功能分析(Web UI) OSSIM系统功能较多,界面较为复杂,而web端界面为全英文,中文汉化包并不完善,所以仔细研究一下各个模块对应的功能是非常有利于后续的 ...

  8. OSSIM开源安全信息管理系统(九)

    2021SC@SDUSC 本周继续分析 OSSIM 系统 Framework 部分的源代码,对 Framework.py 所引用的其他类进行进一步分析. 同时,会对 OSSIM 的可疑流量检测技术进行 ...

  9. OSSIM开源安全信息管理系统(十七)

    2021SC@SDUSC 七.Agent部分源代码分析 1.Agent 简介 OSSIM Agent中所有脚本采用 Python 编写,负责从安全设备采集相关信息(比如报警日志等),并将采集到的各类信 ...

最新文章

  1. 【ACM】杭电OJ 2048 2049
  2. 算法函数:得到一个字符串中的最大长度的数字
  3. Codeu_576_问题 D: 查找
  4. struts2操作json成字符串格式错误被转义及其前台访问json对象的方法
  5. 编程语言中的Lambda 函数是如何产生的 它究竟有什么用
  6. PingUtil in Android
  7. 神器-unity插件-Odin
  8. mysql出现ERROR 1054 (42S22): Unknown column 'password' in 'field list'如何解决?
  9. linux中显示目录名,在linux下显示中文目录和文件名
  10. 【UVA - 10038】Jolly Jumpers (模拟,水题,标记)
  11. python函数可以提高运行效率吗_python 多进程如何提高函数效率?
  12. HDU 1242 Rescue
  13. Oracle 屠刀下的 Java 软件公司怎么活?
  14. java frame linux_JAVA环境(下) - Android框架简介_Linux编程_Linux公社-Linux系统门户网站...
  15. 190422每日一句
  16. zigbee协议栈串口收发 From zigbee菜鸟笔记(十 二)
  17. 二极管计算机原理,二极管逻辑电路
  18. 哪些人适合学大数据分析
  19. 如何重设思科路由器密码并保持配置不丢失?
  20. application配置文件读取!

热门文章

  1. ASEMI代理ADAU1961WBCPZ-R7原装ADI车规级ADAU1961WBCPZ-R7
  2. 可变参数实现工厂模式
  3. 牛客面经 |这可能不只是一篇面经
  4. 【满分】【华为OD机试真题2023 JAVAJS】查找单入口空闲区域
  5. python资源整合(粉丝福利),公众号获取资源分享
  6. 四面阿里Java开发岗,字节跳动Java实习面试凉凉经
  7. 华为悦盒ec6108v9c使用ADB通过U盘刷Linux(Ubuntu)并使用docker部署alist服务器
  8. iOS调试之LLDB命令
  9. 爱数SMART 2022峰会开启,分享数据战略与建设数据驱动型组织方法论
  10. html怎么保存文档,html保存