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

2021SC@SDUSC





本周开始对 framework.py 的最后一部分代码进行分析,结束 frameworkd.py 的代码分析后,对 OSSIM 中较为重要的部分日志分析模块进行简单分析。然后预计下周可以完成整个 Frameworkd 模块的分析。

一、framework.py

(接上一篇文章)

def __deleteByBackupDays(self):

该函数主要功能为使用备份天数限制值来执行删除命令

先检查备份日期,从 __bkConfig 中读取备份日期。然后根据得出的备份日期进行计算 limit_day,当前时间减去备份日期

def __deleteByBackupDays(self):
    #从 __bkConfig 中读取备份天数
    try:
        backupdays = int(self.__bkConfig['backup_day'])
    except Exception, e:
        logger.warning("Invalid value for: Events to keep in the Database (Number of days) -> %s" % self.__bkConfig['backup_day'])
        backupdays = 0
#利用当前时间减去备份的时间计算limit_day
    if backupdays > 0:  
        limit_day = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) - timedelta(days=int(backupdays))
        self.__delete_events_older_than_timestamp(limit_day)
        else:
        logger.info("Unlimited number of events.  Events to keep in the Database (Number of days) = %s" % backupdays)

def __isBackupsEnabled(self):

该函数主要功能为判断是否能启用备份,如果可以启用,则返回 true,否则不能启用,返回 false

def __isBackupsEnabled(self):
    max_events=0
    try:
        max_events = int(self.__bkConfig['backup_events'])
    except Exception,e:
        logger.info("Invalid value for: Events to keep in the Database (Number of events) -> %s" % self.__bkConfig['backup_events'])
        max_events = 0
    backupdays=0
    try:
        backupdays = int(self.__bkConfig['backup_day'])
    except Exception,e:
        logger.warning("Invalid value for: Events to keep in the Database (Number of days) -> %s" % self.__bkConfig['backup_day'])
        backupdays = 0
    backup_enabled = True
    if max_events  ==0 and backupdays == 0:
        logger.info("Backups are disabled  MaxEvents = 0, BackupDays =0")
        backup_enabled = False
    return backup_enabled

def __run_backup(self):

该函数主要功能是执行备份作业相关任务

首先检查一下磁盘空间

def __run_backup(self):
    if not self.checkDiskUsage():
        logger.warning("[ALERT DISK USAGE] Can not run backups due to low free disk space")
        return

然后需要清除旧的备份文件,self.purgeOldBackupfiles() 这个函数前面已经分析过了,主要就是实现了旧的备份文件的删除操作

self.purgeOldBackupfiles()
backupCMD = "ionice -c2 -n7 mysqldump alienvault_siem $TABLE -h %s -u %s -p%s -c -n -t -f --skip-add-locks --skip-disable-keys --skip-triggers --single-transaction --hex-blob --quick --insert-ignore -w $CONDITION" % (_CONF[VAR_DB_HOST], _CONF[VAR_DB_USER], _CONF[VAR_DB_PASSWORD])

接下来就是通过调用函数 self.__shouldRunBackup() ,根据函数返回结果,判断是否进行备份操作

如果函数返回 true,则表明开始进行备份操作

if self.__shouldRunBackup():  # Time to do the backup?
    logger.info("Running backups system...")
    #开始备份
    if not self.__myDB_connected:
        if self.__myDB.connect():
            self.__myDB_connected = True
        else:
            logger.info("Can't connect to database..")
            return
    #设置备份相关的配置参数 last_run 为当前时间
    self.__bkConfig['last_run'] = datetime.now().date()
    firstEventDateTime = '1900-01-01 00:00:00'
    firstEventDateTime = self.__get_oldest_event_in_database_datetime(firstEventDateTime)
    try:
        bkdays = int(_CONF[VAR_BACKUP_DAYS_LIFETIME])
    except ValueError:
        bkdays = 5
        threshold_day = datetime.today()-timedelta(days=bkdays+1)

if self.__storeBackups() and self.__isBackupsEnabled():
     try:
        today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
        current_backups = self.get_current_backup_files()
        while firstEventDateTime < today:

        	if firstEventDateTime < threshold_day:
            	logger.info("Do not make backup because threshold day: first event datetime: %s, thresholday:%s" % (firstEventDateTime,threshold_day))
                firstEventDateTime = firstEventDateTime + timedelta(days=1)
                insert_backupFile = '%s/insert-%s.sql' % (self.__bkConfig['backup_dir'], dateBackup.replace('-', ''))
            if insert_backupFile+".gz" in current_backups:
                firstEventDateTime = firstEventDateTime + timedelta(days=1)
                logger.info("BACKUP %s Ignoring.... backup has already been done" % insert_backupFile)
            backupACIDEVENT_cmd = backupCMD.replace('$TABLE', 'acid_event')
            condition = '"timestamp BETWEEN \'%s 00:00:00\' AND \'%s 23:59:59\'"' % (dateBackup, dateBackup)
            backupACIDEVENT_cmd = backupACIDEVENT_cmd.replace('$CONDITION', condition)
            backupCmds["%s_%s" % ('acid_event',dateBackup)] = backupACIDEVENT_cmd
            condition = '"event_id in (SELECT id FROM alienvault_siem.acid_event WHERE timestamp BETWEEN \'%s 00:00:00\' AND \'%s 23:59:59\')"' % (dateBackup, dateBackup)
      for table in ['reputation_data', 'idm_data', 'otx_data', 'extra_data']:
            cmd = backupCMD.replace('$TABLE', table)
            cmd = cmd.replace('$CONDITION', condition)
            backupCmds['%s_%s' %(table,dateBackup)] = cmd

            condition = '"day=\'%s\'"' % (dateBackup)

            backup_data = ""
       for table_day, cmd in backupCmds.iteritems():
            cmd = cmd + ">> %s" % insert_backupFile
            status, output = commands.getstatusoutput(cmd)
            if status == 0:
                logger.info("Running Backup for day %s  OK" % table_day)
            else:
                logger.error("Error (%s) running: %s" % (status, table_day))
       return
       try:
            output = commands.getstatusoutput("pigz -f %s" % insert_backupFile)
            if status == 0:
                 logger.info("Backup file has been compressed")                                         os.chmod(insert_backupFile + ".gz", 0640)
		except Exception, e:
            logger.error("Error writting backup file :%s" % str(e))
        	firstEventDateTime = firstEventDateTime + timedelta(days=1)
        except Exception, e:
            logger.error("Error running the backup: %s" % str(e))

		self.__createDeleteBkFile()

def run(self):

该函数的主要功能是开启运行线程,线程的入口点。

每隔一段时间就重新加载一次备份配置文件

def run(self):
	loop = 0
    while not self.__stopE.isSet():
        loop += 1
        if loop >= 20:
            logger.info("Reloading Backup Configuration")
            self.__loadConfiguration()
            loop = 0

        logger.info("BackupManager - Checking....")
        self.__run_backup()
        sleep(30)

def stop(self):

该函数主要功能是停止当前正在执行的线程,这个函数比较简单,主要是调用函数 self.__stopE.set() 来实现相关功能

def stop(self):
    self.__stopE.set()

至此,关于 OSSIM 中较为重要的一个模块 Framework 部分的主要包含代码 Framework.py 、BackupManager.py 都已经分析完了

下面还涉及到了几个其他的类文件,但是代码内容不是很多,也比较容易理解,所以下周我们会简单的进行分析一下,然后就完成了 Frameworkd 整个模块的分析。



二、OSSIM日志收集与分析

当企业网络的规模及应用系统不断增大时,如何确保网络运营环境的稳定、安全、高效呢?

我们先看看系统管理员不得不面临的问题—如何监控用户的网络应用行为?如何跟踪网络应用资源的使用情况?如何识别网络中的异常流量和性能瓶颈?如何有效地规划和部署网络资源?如何迅速响应网络的故障告警?日志技术可以记录系统产生的所有行为,并按照某种规范表达出来。日志系统指收集网络设备的事件信息的一套机制。我们可以使用日志记录的信息为系统进行排错,并优化操作系统性能。

OSSIM 开源安全信息管理系统提供了一个强大的日志分析平台,下面我们就对 OSSIM 的日志分析平台进行简单分析

1、日志分析现状

企业信息系统中会包含多种设备,如路由器、防火墙、IDS/IPS、交换机、服务器和 SQL 数据库等。各种复杂的应用系统和网络设备每天都会产生大量的日志,如果不加以收集,出了问题需要查找如此海量的数据,对于管理员来说如同是一场噩梦。

目前,不少企业网络环境中,日志的存储和分析没有受到重视,往往在平时忙碌的工作中被忽视掉,只有在系统提示磁盘空间不足或者系统瘫痪了才引起管理员注意。例如,在 Windows 服务器中频繁出现报警,这时从 Windows 事件查看器的应用程序日志里看到内容为: "Windows (2592)Windows:由于系统错误112(0x00000070):磁盘空间不足。” 类似上述情况同样会发生在 Linux/Unix 系统中,如果处理不及时,很可能导致系统宕机。例如在一台 Linux 服务器上检查到一段日志信息:

May 20 01:13:00 www.write.com kernel:pdi 1503 (dd),uid 3 inumber 9833 on /var,filesystem full

从上面这段日志就能发现系统的 /var/ 文件系统已满,继续检查发现 /var/spool/、/var/squid/cache、/var/www/、/var/lib/mysql/ 这几个目录占用磁盘空间很大,需要用合适的方法处理。

另一种情况,当磁盘空间不足时,一些管理员首先想到简单地移走文件或直接删除,只考虑日志会占用空间,没考虑到日志今后可以作为司法取证的分析材科,因为在日志里可以发现故障发生的时间等关键信息。




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

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