OSSIM开源安全信息管理系统(六)
2021SC@SDUSC
(接上一篇文章:)
__daemonize__(self)
: 守护进程方法
如果收到信号 signal.SIGTERM(终止进程),调用 self.stop
当用户输入 kill sigterm pid 。 对应的进程就会收到这个信号,这个信号进程是可以捕获并指定函数处理, 例如做一下程序清理等工作,也可以忽视这个信号
def __daemonize__(self):signal.signal(signal.SIGTERM, self.stop)
创建一个子进程
try: pid = os.fork()#如果是pid>0,表明当前处于父进程(pid的值为子进程的进程号)if pid > 0:#退出第一个父进程sys.exit(0)
#创建子进程失败,输出相应错误信息
except OSError, e:sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))sys.exit(1)
与父环境解耦
os.setsid() :当进程是会话的领头进程时setsid()调用失败并返回(-1)。
setsid()调用成功后,返回新的会话的ID,调用setsid函数的进程成为新的会话的领头进程,并与其父进程的会话组和进程组脱离。
# os.chdir() 方法用于改变当前工作目录到指定的路径。
os.chdir("/")
#调用系统调用 setsid()
os.setsid()
#设置当前的数值 umask 并返回之前的 umask
os.umask(0)
创建第二个子进程,过程与创建第一个子进程时相同
try:pid = os.fork()if pid > 0:#退出第二个父进程sys.exit(0)
except OSError, e:sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))sys.exit(1)
重定向标准文件描述符
sys.stdout.flush()、sys.stderr.flush():标准输出和标准出错流
sys.stdout.flush()
sys.stderr.flush()
file(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None):
r:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
0:报错级别
si = file('/dev/null', 'r')
so = file('/dev/null', 'a+')
se = file('/dev/null', 'a+', 0)
os.dup2() :用于将一个文件描述符 fd 复制到另一个文件描述符 fd2。
fileno() :返回一个整型的文件描述符( file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
将输入、输出、出错文件描述符复制到标准输入、标准输出、标准出错流
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
编写pid文件
atexit.register() :用于在 python 解释器中注册一个退出函数,这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的操作(这里是删除 pid 文件)
atexit.register(self.delpid)
pid = str(os.getpid())
file(self.pidfile, 'w+').write("%s\n" % pid)
os.chmod(self.pidfile, 0644)
delpid(self)
:删除pid文件
def delpid(self):Delete the pid fileos.remove(self.pidfile)
stop(self, sig, params)
:终止 frameworkd 进程
def stop(self, sig, params):try:pf = file(self.pidfile, 'r')pid = int(pf.read().strip())pf.close()except IOError:pid = Noneif not pid:message = "pidfile %s does not exist. Daemon not running? or not in daemon mode?\n"sys.stderr.write(message % self.pidfile)return
终止守护进程
try:while 1:os.kill(pid, signal.SIGTERM)time.sleep(0.1)
except OSError, err:err = str(err)if err.find("No such process") > 0:if os.path.exists(self.pidfile):os.remove(self.pidfile)
else:print str(err)sys.exit(1)
waitforever(self)
: 等待Control-C并终止所有线程
def waitforever(self):while 1:try:time.sleep(1)#isAlive方法是从threading继承而来, is_alive() 方法查询线程是否还在运行if not self.__listener.isAlive():logger.info("Listener in down... exiting...")pid = os.getpid()os.kill(pid, signal.SIGKILL)breakexcept KeyboardInterrupt:pid = os.getpid()os.kill(pid, signal.SIGKILL)
__init_log(self, daemon_mode)
def __init_log(self, daemon_mode):verbose = "info"Logger.add_file_handler('%s/frameworkd.log' % self.__conf[VAR_LOG_DIR])Logger.add_error_file_handler('%s/frameworkd_error.log' % self.__conf[VAR_LOG_DIR])if daemon_mode:Logger.remove_console_handler()
前面解析命令行函数 __parse_options(self)
中 -v参数
parser.add_option("-v", "--verbose", dest="verbose", action="count",help="make lots of noise")
命令行参数
-v -> self.options.verbose = 1
-vv -> self.options.verbose = 2
if self._options.verbose is not None:for i in range(self._options.verbose):verbose = Logger.next_verbose_level(verbose)Logger.set_verbose(verbose)
try:os.chmod('%s/frameworkd.log' % self.__conf[VAR_LOG_DIR], 0644)os.chmod('%s/frameworkd_error.log' % self.__conf[VAR_LOG_DIR], 0644)
except Exception, e:print str(e)
checkEncryptionKey(self)
:检查加密密钥文件。
检查文件是否存在,key 是否存于数据库中
def checkEncryptionKey(self):mydb = OssimDB(self.__conf[VAR_DB_HOST], self.__conf[VAR_DB_SCHEMA],self.__conf[VAR_DB_USER], self.__conf[VAR_DB_PASSWORD])mydb.connect()select_query = "select value from config where conf=\"encryption_key\";"insert_query = "REPLACE INTO config VALUES ('encryption_key', '%s')"data = mydb.exec_query(select_query)
keyFilePath = self.__conf[VAR_KEY_FILE]if keyFilePath == "" or keyFilePath is None:logger.error("Frameworkd can't start. Please check the value of %s in the config table" % VAR_KEY_FILE)sys.exit(2)if not os.path.isfile(self.__conf[VAR_KEY_FILE]) or data is None or data == "" or len(data) == 0:logger.info("Encryption key file doesn't exist... making it at .. %s and save it to db" % self.__conf[VAR_KEY_FILE])output = sub.Popen('/usr/bin/alienvault-system-id', stdout=sub.PIPE)s_uuid = output.stdout.read().upper()reg_str = "(?P<uuid>[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})"pt = re.compile(reg_str, re.M)match_data = pt.search(s_uuid)key = ""extra_data = ""d = datetime.today()if match_data is not None:key = match_data.group('uuid')extra_data = "#Generated using alienvault-system-id\n"else:logger.error("I can't obtain system uuid. Generating a random uuid. Please do backup your encrytion key file: %s" %self.__conf[VAR_KEY_FILE])extra_data = "#Generated using random uuid on %s\n" % d.isoformat(' ')key = uuid.uuid4()newfile = open(self.__conf[VAR_KEY_FILE], 'w')mydb.exec_query(insert_query % key)key = "key=%s\n" % keynewfile.write("#This file is generated automatically by ossim. Please don't modify it!\n")newfile.write(extra_data)newfile.write("[key-value]\n")newfile.write(key)newfile.close()# insert the key in db..pw = pwd.getpwnam('www-data')os.chown(self.__conf[VAR_KEY_FILE], pw.pw_uid, pw.pw_gid)os.chmod(self.__conf[VAR_KEY_FILE], stat.S_IRUSR)
__check_pid(self)
:检查 pid 文件是否存在
def __check_pid(self):try:pf = file(self.pidfile, 'r')pid = int(pf.read().strip())pf.close()except IOError:pid = Noneif pid:message = "pidfile %s already exist. Daemon already running?\n"sys.stderr.write(message % self.pidfile)sys.exit(1)
本篇文章部分内容参考或转载自下列文章及书籍。侵权即删。
参考书籍:
- 《开源安全运维平台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
上一篇(Framework 源码分析(一)):OSSIM开源安全信息管理系统(五)
下一篇(Framework 源码分析(三)):
OSSIM开源安全信息管理系统(六)相关推荐
- OSSIM开源安全信息管理系统(十六)
2021SC@SDUSC 本周继续对OSSIM系统中,关联分析部分进行源码分析. 关联分析部分源码目录:\ossim\alienvault-ossim\src\alienvault-ossim\os- ...
- OSSIM开源安全信息管理系统(一)
2021SC@SDUSC 一.项目综述 项目背景: 本项目为山东大学软件学院2021-2022学年秋季学期 "软件工程应用与实践" 课程项目 小组成员: 网安工学 李宏伟.网安工学 ...
- OSSIM开源安全信息管理系统(十二)
2021SC@SDUSC 本周主要分析的内容为 Framework 模块中,Listener.py 文件.然后衔接上周内容,继续对 OSSIM 系统的日志分析部分进行简单分析. 1.Listener. ...
- OSSIM开源安全信息管理系统(十五)
2021SC@SDUSC 目录 五.OSSIM关联分析的部分源代码分析 1.sim-directive.c 1.1.初识 glib 1.2.glib 基本类型定义 1.3.glib 函数 1.4.源码 ...
- OSSIM开源安全信息管理系统(二)
2021SC@SDUSC 一.OSSIM功能分析(Web UI) OSSIM系统功能较多,界面较为复杂,而web端界面为全英文,中文汉化包并不完善,所以仔细研究一下各个模块对应的功能是非常有利于后续的 ...
- OSSIM开源安全信息管理系统(十四)
2021SC@SDUSC 从本周开始,进入一个全新的模块,开始对 OSSIM 的关联分析机制进行分析.首先对管理分析机制进行简介. 关联分析 在 OSSIM 中,关联分析这部分应该算是这个系统的较为关 ...
- OSSIM开源安全信息管理系统(九)
2021SC@SDUSC 本周继续分析 OSSIM 系统 Framework 部分的源代码,对 Framework.py 所引用的其他类进行进一步分析. 同时,会对 OSSIM 的可疑流量检测技术进行 ...
- OSSIM开源安全信息管理系统(十)
2021SC@SDUSC 一.Framework 部分源码分析 (接上一篇文章) def __shouldRunBackup(self) : 该函数的主要功能为检查是否开始运行备份操作 备份时间:默认 ...
- OSSIM开源安全信息管理系统(十七)
2021SC@SDUSC 七.Agent部分源代码分析 1.Agent 简介 OSSIM Agent中所有脚本采用 Python 编写,负责从安全设备采集相关信息(比如报警日志等),并将采集到的各类信 ...
最新文章
- 关于MYSQL日期 字符串 时间戳互转
- Easyui textbox 组件设置css样式
- python类中的函数_python类中的函数问题
- 扩展--使用队列来优化递归操作完成文件下载
- python对比图片
- Java关键字fymd,JAVA程式碼一直被foritfy檢出有path manipulation
- ssh登录失败处理步骤
- mysql的常用引擎
- 【OpenCV4 官方文档】机器学习概述
- 电机计算机仿真,电机调速系统的计算机仿真
- LiteIDE的sublime黑色 淡绿色 配色文件自定义版本
- php去掉工作日,2014年工作日计算(去除法定假日和周六日,但包括调休日)
- vs2017 c++工程编译解析
- 玩转B2B平台的商业模式你选对了吗?
- Grafana资料搜集
- SpringBoot+Maven 多模块项目的构建、运行、打包实战
- 记录 支付宝口碑--商户会员卡 开发历程
- 计科专业c语言重修,计算中心
- 无线AP打流-TX、RX环境部署
- 从 COM 组件调用 .NET 组件