OSSIM开源安全信息管理系统(十)
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)")
在以下三种情况时运行备份:
- 到达备份时间
- alienvault-reconfig 没有运行
- 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开源安全信息管理系统(十)相关推荐
- OSSIM开源安全信息管理系统(十六)
2021SC@SDUSC 本周继续对OSSIM系统中,关联分析部分进行源码分析. 关联分析部分源码目录:\ossim\alienvault-ossim\src\alienvault-ossim\os- ...
- OSSIM开源安全信息管理系统(十五)
2021SC@SDUSC 目录 五.OSSIM关联分析的部分源代码分析 1.sim-directive.c 1.1.初识 glib 1.2.glib 基本类型定义 1.3.glib 函数 1.4.源码 ...
- OSSIM开源安全信息管理系统(十二)
2021SC@SDUSC 本周主要分析的内容为 Framework 模块中,Listener.py 文件.然后衔接上周内容,继续对 OSSIM 系统的日志分析部分进行简单分析. 1.Listener. ...
- OSSIM开源安全信息管理系统(十四)
2021SC@SDUSC 从本周开始,进入一个全新的模块,开始对 OSSIM 的关联分析机制进行分析.首先对管理分析机制进行简介. 关联分析 在 OSSIM 中,关联分析这部分应该算是这个系统的较为关 ...
- OSSIM开源安全信息管理系统(六)
2021SC@SDUSC (接上一篇文章:) __daemonize__(self) : 守护进程方法 如果收到信号 signal.SIGTERM(终止进程),调用 self.stop 当用户输入 k ...
- OSSIM开源安全信息管理系统(一)
2021SC@SDUSC 一.项目综述 项目背景: 本项目为山东大学软件学院2021-2022学年秋季学期 "软件工程应用与实践" 课程项目 小组成员: 网安工学 李宏伟.网安工学 ...
- OSSIM开源安全信息管理系统(二)
2021SC@SDUSC 一.OSSIM功能分析(Web UI) OSSIM系统功能较多,界面较为复杂,而web端界面为全英文,中文汉化包并不完善,所以仔细研究一下各个模块对应的功能是非常有利于后续的 ...
- OSSIM开源安全信息管理系统(九)
2021SC@SDUSC 本周继续分析 OSSIM 系统 Framework 部分的源代码,对 Framework.py 所引用的其他类进行进一步分析. 同时,会对 OSSIM 的可疑流量检测技术进行 ...
- OSSIM开源安全信息管理系统(十七)
2021SC@SDUSC 七.Agent部分源代码分析 1.Agent 简介 OSSIM Agent中所有脚本采用 Python 编写,负责从安全设备采集相关信息(比如报警日志等),并将采集到的各类信 ...
最新文章
- 【ACM】杭电OJ 2048 2049
- 算法函数:得到一个字符串中的最大长度的数字
- Codeu_576_问题 D: 查找
- struts2操作json成字符串格式错误被转义及其前台访问json对象的方法
- 编程语言中的Lambda 函数是如何产生的 它究竟有什么用
- PingUtil in Android
- 神器-unity插件-Odin
- mysql出现ERROR 1054 (42S22): Unknown column 'password' in 'field list'如何解决?
- linux中显示目录名,在linux下显示中文目录和文件名
- 【UVA - 10038】Jolly Jumpers (模拟,水题,标记)
- python函数可以提高运行效率吗_python 多进程如何提高函数效率?
- HDU 1242 Rescue
- Oracle 屠刀下的 Java 软件公司怎么活?
- java frame linux_JAVA环境(下) - Android框架简介_Linux编程_Linux公社-Linux系统门户网站...
- 190422每日一句
- zigbee协议栈串口收发 From zigbee菜鸟笔记(十 二)
- 二极管计算机原理,二极管逻辑电路
- 哪些人适合学大数据分析
- 如何重设思科路由器密码并保持配置不丢失?
- application配置文件读取!
热门文章
- ASEMI代理ADAU1961WBCPZ-R7原装ADI车规级ADAU1961WBCPZ-R7
- 可变参数实现工厂模式
- 牛客面经 |这可能不只是一篇面经
- 【满分】【华为OD机试真题2023 JAVAJS】查找单入口空闲区域
- python资源整合(粉丝福利),公众号获取资源分享
- 四面阿里Java开发岗,字节跳动Java实习面试凉凉经
- 华为悦盒ec6108v9c使用ADB通过U盘刷Linux(Ubuntu)并使用docker部署alist服务器
- iOS调试之LLDB命令
- 爱数SMART 2022峰会开启,分享数据战略与建设数据驱动型组织方法论
- html怎么保存文档,html保存