2021SC@SDUSC
(接上一篇文章)
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)
参数:
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)")
在以下三种情况时运行备份:
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 自带的一个操作文件的相关模块,用它可以查找符合特定规则的文件路径名。模块功能不是很多,还是比较容易掌握的。
使用该模块查找文件,只需要用到: “*”, “?”, “[]”这三个匹配符;
因为这里用到了这个模块里面的方法,来实现文件路径名的查找,所以先简单学习介绍一下这个模块。
这里主要实现通过 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)
主要实现功能为更新备份配置文件
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))
(接上一篇文章)
在 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 就会给这些流量赋予一个较高的值,因为它对于这台服务器是比较少见的。此时,如果该值超过了事先定义好的阈值,系统就会发出报警。
随着恶意代码技术的发展,涌现出了各种恶意代码分析技术。当前主流的恶意代码分析技术是静态分析等技术,分析的目的就是依靠工具找到特征码。
比如,在 2004 年 3 月发现的一种蠕虫,名叫 W32.Netsky.P@mm,它是一种群发邮件蠕虫,它使用自己的 SMTP 引擎将自己发送到在扫描硬盘和映射的眼动哭时块到的由子邮箱。此蠕虫还试图利用各种文件共享程序、通过将自己复制到各个共享文件夹进行传播。我们只要找到它的特征码,即可对其进行编写检测规则。
对于蠕虫样本的提取,主要采用的方式是基于蜜罐系统捕获。在这种可控的模拟环境中,可以消耗黑客精力,并记录黑客来源和犯罪证据。另外, IDS 的特征库需要不断地更新,才能检测到新的攻击行为。
蜜罐系统将记录到的入侵信息传递给入侵检测系统,入侵检测系统收到事件信息后,对其进行分析并提取攻击特征,最后将新的攻击特征添加到系统的攻击特征库中,从而使得入侵检测系统可以检测出未知的攻击手段。利用蜜罐系统与入侵检测系统的联动,可以增强入侵检测系统对网络的防御能力,这个系统的架构如下图所示。
OSSIM 系统中的 Snort 软件支持对报警定制,并支持优先级。可以根据需要添加许多自定义的报警分类。就像特征码一样,报警分类也是通过规则来定义。
到此为止,OSSIM系统中的可疑流量检测技术大体已经分析完毕,接下来的工作是进行代码分析的同时对OSSIM日志收集与分析部分进行分析
上一篇:OSSIM开源安全信息管理系统(九)
下一篇: