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)")

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

  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 False

return 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_date
    query = "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_delete
        if events_to_delete != 0:
        	logger.info("Events to delete: '%s' events from %s to %s" % (events_to_delete, begin_date, end_date))

             block = 100000
			
             delete_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:
    break

begin_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 = 5
    try:
        #从配置信息中读取backup_day
        bkdays = 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" % dt
    dtstr = 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 - 1
    today = 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开源安全信息管理系统(九)
下一篇:

你可能感兴趣的:(2021SC@SDUSC,安全,运维)