《(2020)(安全生产)用Python和wxPython开发主机安全监控系统》由会员分享,可在线阅读,更多相关《(2020)(安全生产)用Python和wxPython开发主机安全监控系统(6页珍藏版)》请在金锄头文库上搜索。
1、用Python和wxPython开发主机安全监控系统王世华,沈卫超(北京应用物理与计算数学研究所, 高性能计算中心)摘要:本文简要介绍Python,wxPython语言以及Boa图形界面生成器,以及用Python + wxPython快速开发跨平台图形用户界面的方法。同时描述了主机安全监控系统的功能及结构,主要针对于安全管理员图形界面的开发,详细阐述了其中的几个关键技术。关键词:主机安全,安全审计,Python, wxPython, 图形用户界面Developing Monitoring System of Host-Security with Python and wxPythonWang
2、Shihua, Shen Weichao(High Performance Computing Center, Institute of Applied Physics and Computational Mathematics, Beijing, 100088)Abstract: This paper introduces the Python, wxPython language, and the Boa constructor shortly, then explains some basic methods of these tools for rapidly developing c
3、ross-platform GUI application. We describe structure and functions of host-security monitoring system at the same time, focus on GUI development of the security administrator, and some critical technologies are presented in details.Keywords: host-security, security-audit, Python, wxPython, GUI (Grap
4、hical User Interface)1引言随着来自企业或单位内部的安全风险越来越受到重视,内部资源的滥用是网络安全管理中的焦点问题。本文将要介绍的是我们利用Python和wxPython开发的一套主机安全监控系统,以达到强化主机系统安全的目的,它分为三个部分,即:监控代理程序、监控信息中心和管理员控制台。目前我们所使用的绝大多数计算服务器均基于UNIX或者Linux操作系统,但是它们在图形方面的表现能力欠佳,界面不够友好,如何开发一款具有跨平台能力且界面表现友好的应用程序给我们提出了新的挑战。2开发工具简介2.1Python语言Python是一种解释型、面向对象、动态语义、语法优美的脚本
5、型语言,也是开发具有工业强度的商业应用程序的优秀语言,尤其适合开发基于Internet和Web的、数据库密集型的、多层的客户机/服务器系统。Python是当前移植能力最强的程序语言之一,最初,它是在UNIX上实现的,但之后扩展到了其它许多平台,其中包括MS-Windows、Mac OS X、Linux、Solaris等,而且它的源程序和二进制代码都可以免费获得。2.2 wxPython和BoawxPython是Python语言的一个GUI工具集,它可以使Python程序员简单而轻松的创建一个健壮的、具有高级功能的图形用户界面。它在Python中是以扩展模块的方式实现的,拥有自身的窗体/控制,还
6、加入了许多独立于操作系统的窗体,并且封装了流行的wxWindows跨平台GUI库,并且这些库文件是用C+编写的。wxPython同样具有跨平台能力,这意味着我们编写出来的代码可以不经修改的运行在绝大多数操作系统之上,提高了代码的利用率和生产效率。它的基本结构如下图所示:操作系统Platform GUIwxWidgets 工具包wxPython 扩展模块wxPython 库代理类图1 wxPython体系结构Boa是一款wxPython 图形界面生成器,也是一个Python的集成开发环境,它建立在wxPython、wxWidgets和Python之上。Boa被设计成为一个用于wxPython的简
7、易Delphi,它不仅是Python开发的集成环境,如:wxPython可视化框架的设计、对象浏览、文档生成、调试、源码控制(CVS)等等,而且还集成了其它Python技术,如:Zope、PyChecker、Py2EXE、Distutils以及Cyclops。3 系统结构和功能3.1系统结构主机安全监控系统由三个部分组成:监控代理程序、监控信息中心和管理员控制台。 图2 主机安全监控系统结构图监控代理程序从受监控主机采集并根据安全规则分析日志数据,然后将报警信息和归档日志传送给监控信息中心;监控信息中心负责从各监控主机的代理程序收集报警信息和归档日志,并将这些信息转存到后台数据库中;管理员控制
8、台用于接收来自监控信息中心的实时报警信息,以及对归档日志的查询与统计、分析。3.2监控代理程序读模块负责从操作系统的审计日志文件中读取连续的审计日志数据,并将其转换为一个便于存取操作的通用记录格式,传送给数据分析模块。数据分析模块根据安全规则对收到的审计数据进行分析。如果安全规则给出了明确的响应动作,则向动作响应模块发出动作指令,同时向发送模块传送匹配的数据记录。发送模块负责将接收到的数据传送给监控信息中心服务器。接收模块负责接收控制中心传来的安全规则和动作指令,刷新安全规则和向动作相应模块发送动作指令。动作响应模块负责切断用户与系统的连接和封锁用户系统帐号。各模块关系框图如下: 图3 监控代
9、理程序的功能模块3.3监控信息中心 图4 监控信息中心的功能模块监控信息中心服务器的接收模块负责接收多个监控代理发送的数据,并传送给数据分析模块。数据分析模块根据安全规则对接收到的数据进行分析,通过发送模块将动作响应传送给特定的监控代理。报警信息通过管理模块传送给管理员控制台,同时归档的数据存入数据库中。管理模块为管理员控制台提供安全监控系统的各种管理、监控与数据分析服务,包括修改和部署安全规则,查询和分析数据库的审计数据,并通过发送模块向各个监控代理部署新的安全规则和发起响应动作。3.4管理员控制台监控代理程序监控信息中心接收模块发送模块系统状态模块报警模块策略编辑模块统计分析模块身份认证模
10、块用户界面模块安全管理员管理员控制台 图5 管理员控制台的功能模块管理员控制台可以集中的显示安全报警信息并拥有对归档审计数据的分析和查询功能,并且安全管理员能够对主机安全监控系统进行安全策略的集中配置和部署。主要分为7个模块:用户界面模块、身份认证模块、报警模块、统计分析模块、策略编辑模块,系统状态模块和通信模块(发送与接收)。下面就开发该界面的几个关键技术进行论述。4 关键技术分析4.1用户界面设计用户界面的设计采用前面提到的Boa,需要注意的是各窗体控件之间的包容关系,位于顶层的窗体为wx.Frame、wx.Dialog、wx.MiniFrame、wx.MDIParentFrame、wx.
11、MDIChildFrame,基本窗体为wx.Windows、wx.Panel、wx.ScrolledWindow等等,它们之间的包容关系为先顶层后基本,如果包容关系混乱,将会对以后的窗体布局控制产生影响。另外,如果在界面中使用了图形文件,那么请拷贝到你所保存源码文件的目录下,并手动更改为相对路径,否则在不同平台上运行会出现运行时错误,这是由于Boa默认的保存方式为绝对路径。管理员用户界面如图6、7所示。 图6 开始主界面 图7 显示报警信息时的界面4.2窗体布局的处理图形用户界面应该可以很好的处理各窗体之间的布局问题,在wxPython中通常使用Sizers进行布局控制,它类似于Java中的L
12、ayoutManagers。在图形界面中每个窗体都拥有一个最小尺寸,基于这个尺寸,当包容窗口改变它自身大小或状态时(更改了字体或标签),窗体布局机制就会自动计算子窗体的大小及位置以进行调整,在Boa中内置了wx.BoxSizer,wx.GridSizer,wx.FlexGridSizer,wx.StaticBoxSizer以及wx.NotebookSizer供我们使用。使用Sizers时最重要的一点就是窗体之间的嵌套问题,如果不注意窗体之间的相互关系,既包容窗口和被包容窗口(子窗口)的关系,Sizers可能无法满足你的要求。下面是实现Sizers的一些关键代码,这里还包含了嵌套的Sizers:
13、# 处于最上层的主Sizers,可管理附着于上面的子Sizers。mainSizer = wx.BoxSizer(wx.VERTICAL) # 依次添加位于最上层窗体的各控件mainSizer.Add(topLbl, 0, wx.ALL, 5)mainSizer.Add(wx.StaticLine(panel), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5)# notesSizer是一个Grid控件,它包含了所有用户输入的信息notesSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)# 依次添加位于该层面上的各控件notes
14、Sizer.AddGrowableCol(1)notesSizer.Add(usernameLbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)notesSizer.Add(username, 0, wx.EXPAND)notesSizer.Add(passLbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)notesSizer.Add(pass, 0, wx.EXPAND)# 把notesSizer加入到主Sizers当中去mainSizer.Add(notesSizer, 0, wx.EXPAND|wx
15、.ALL, 10)# 这里并排放置了两个按钮,并且按钮的间隔可以随着主窗体大小的改变而变化。buttonSizer = wx.BoxSizer(wx.HORIZONTAL)buttonSizer.Add(20,20), 1)buttonSizer.Add(OKBtn)buttonSizer.Add(20,20), 1)buttonSizer.Add(quitBtn)buttonSizer.Add(20,20), 1)mainSizer.Add(buttonSizer, 0, wx.EXPAND|wx.BOTTOM, 10) #加入到主Sizers中# 最后,通知wx.Panel,让Sizers进行布局处理panel.SetSizer(mainSizer)# 将Frame放在所需要的Sizer当中,并防止它小于默认尺寸mainSizer.Fit(self)self.SetSizeHints(*self.GetSize()4.3多线程处理wxPython提供一个wxTimer类进行多线程处理,它可