2021SC@SDUSC
本周开始对 framework.py 的最后一部分代码进行分析,结束 frameworkd.py 的代码分析后,对 OSSIM 中较为重要的部分日志分析模块进行简单分析。然后预计下周可以完成整个 Frameworkd 模块的分析。
一、framework.py
(接上一篇文章)
def __deleteByBackupDays(self):
该函数主要功能为使用备份天数限制值来执行删除命令
先检查备份日期,从 __bkConfig 中读取备份日期。然后根据得出的备份日期进行计算 limit_day,当前时间减去备份日期
def __deleteByBackupDays(self):
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
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():
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
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开源安全信息管理系统(十) 下一篇:
|