摘要:随着云计算的发展, 云虚拟主机不仅面临着传统主机的安全问题, 也面临着云安全问题.针对漏洞入侵、虚拟主机逃逸等问题, 云平台缺乏主机监控方法.Linux系统内核的关键函数位置下插入探测点, 在内核层收集所需要的系统进程信息, 提出了基于内核Kprobe机制的进程信息监控方案的设计思路及实现方法.以上方案有助于保护云虚拟主机的系统安全和数据安全, 完善云平台的监控系统.通过对系统安装应用的前后的系统性能测试, 证明设计的进程监控方法占用系统资源较低, 从而证实了所设计方案有良好的可行性.
关键词:云安全; 系统进程收集; 云平台; Linux; 监控;
Abstract:With the development of cloud computing, cloud hosting is not only facing the security problem of traditional host, but also facing problem of cloud security.For vulnerability intrusion, virtual host escapes and other issues, cloud platform absence of host monitoring methods.Because of inserting the probe point in the key positions of the function of the Linux kernel and collecting the required information of system process in the kernel layer, the implementation method and the design process and of the monitoring system information which based on kernel Kprobe mechanism has been proposed.The scheme above can not only be helpful to keep security of the system and data of the cloud virtual host, but also Improve the monitoring system of the cloud platform.Through the system performance testing before and after the installation of application in the system, that the process monitoring method which designed can be proved to Occupy lower system resource, so that the design scheme of the system is proved to have better feasibility.
Keyword:cloud security; system processes collecting; cloud platform; Linux; surveillance;
1、引言
云计算带来诸多方便的同时也面临着诸多关键性问题, 而安全问题首当其冲.攻击者可以通过虚拟化逃逸进而威胁整个云平台和其他的虚拟主机安全[1], 所以对云虚拟主机的系统进程监控有助于发现入侵者, 从而构成维护云平台安全重要一环.
早期云计算平台上的Linux监控都是在应用层监控, 采用的监控方案基本上是使用Linux操作系统提供的相应系统API接口函数或监控proc文件实现监控, 常用方法是使用Linux系统中的top命令、ps命令等, 这些监控方式都是传统主机监控方式, 不能整合到云平台上, 不但如此, 从应用层获取信息还存在许多缺点.
现有的云平台对云虚拟主机的监控主要为资源和性能监控包括CPU利用率, 内存利用率、磁盘利用率、以及一些服务的可用行和响应时间监控, 利用云虚拟技术对虚拟主机的监控技术正在逐步发展.文献[2]针对云虚拟化技术首次提出了基于VMI (Virtual Machine Intropection) 的虚拟监控技术 (Virtual Machine Monitor) , 但是监控的主要信息只是CPU的状态 (例如寄存器) 和存储器的状态.文献[3]提出了一种基于vmm策略在qemu上实现一种监控方法.该方法只能获取某时刻的进程信息, 而不是该时刻的所有的进程信息.
针对云主机缺少有效的安全监控方法问题, 为获取云虚拟主机上Linux系统内的进程详细信息, 本文提出了一种基于内核机制Kprobe hook的进程监控方法, 该方法可以有效准确的获取云上的Linux系统的进程运行状态.和已有方法相比, 该监控方法性能更好, 效率更高.
2、基于内核机制的系统信息收集
2.1、Kprobe的原理及相关技术
从Linux2.6内核版本起Kprobe成为Linux系统的一个轻量级模块, 可以将断点插入到正在运行的内核中.Kprobe提供了一个可以进入内核函数并从中断处理器无干扰地收集信息的接口, 钩住 (hook in) 断点处理器并收集相关信息.它的基本工作机制是:用户指定一个探测点, 并把用户自定义的处理函数部署到该探测点, 替换为Int 3的指令码, 当内核执行到插入探测点的函数时, 相应的处理函数就会被执行, 然后继续执行正常的内核代码.
Kprobe实现了三种类型返回探测点:Kprobes, Jprobes和Kretprobes.Kprobes探测点点可以置入内核的任意函数指令位置;Jprobes探测点仅可置入内核函数的入口;而Kretprobes是在探测指定内核函数返回时调用.其中Jprobes和Kretprobes都是基于Kprobes的基础上.详细的实现原理, 文献[4-5]有很好的阐述.图1描述了Kprobes探测机制的主要流程.
图1 Kprobes机制的流程
2.2、内核数据结构
根据设计需求和从Linux内核中的有关进程信息的数据结构进行分析, 如内核数据结构task_struct、cred、pid、file、fs_struct、dentry, 确定收集的进程相关信息如表1所示.
表1 获取进程信息表
3、云平台上Linux主机进程监控的原理
进程监控的主要原理是基于Linux内核系统中的既定事实, 即Linux系统在系统启动的时候初始化阶段启动第一个进程Init.然后接下来的系统进程都是从Init派生, 然后其他的进程都是由一个已存在的进程像细菌增殖一样通过do_fork () 系统调用创建出来.而监控进程的主要思想是监控所有进程的创建和已有的进程, 将信息输出到seq_file的文件通道上, 并通过使用守护进程实习读取文件通道的内容得到Linux系统的进程状态.在通过云上的通信方式发到安全域主机存贮起来, 进行安全分析和异常检测.
3.1、进程创建
在Linux中进程的创建主要通过三个系统调用fork () 、vfork () 、clone () [6].
(1) fork () :fork () 函数通过系统调用创建一个与原来进程几乎完全相同的进程
(2) vfork () :vfork () 函数和fork () 函数类似, 但vfork () 的父进程一直阻塞, 直到子进程调用exit () 或exec () 为止
(3) clone () :不同于以上两种, 把一个指向函数的指针和该函数的参数作为自己的参数.
在实际的系统调用过程中fork () 和vfork () 调用会执行sys_fork () , 而clone () 调用的是sys_clone () .分析sys_fork () 和sys_clone () 函数并追踪其系统调用, 最终都会调用do_fork () .所以通过Kporbe追踪do_fork () 的进程创建的信息.
3.2、进程终止
进程终止的一般是调用exit () 和exit_group () 系统函数.exit_group () 系统函数终止的是整个线程组, 即整个基于多线程的应用.exit () 系统函数是终止某个进程.这两种进程最终都会调用do_exit () 函数.可以通过Kporbe追踪do_exit () 获取进程的终止信息.
4、进程监控设计及监控架构性能分析
4.1、进程监控设计
进程监控模块如上所述, 在Linux中进程的创建和消亡最后调用的系统函数主要是do_fork () 和do_exit () .因此只需要针对这两个函数进行跟踪探测就可以把所有的进程创建和消亡监控到.然后通过seq_file接口将获取的信息安全的输出.系统的主要结构如图2所示.
图2 监控系统架构图
守护进程和信息发送模块:系统设计主要目的是通过不断检测监控模块来保证监控模块正常运行, 同时通过seq_file通道读取进程信息, 然后将获取到的进程信息发送到安全域主主机存储和分析.
4.2、监控架构的性能分析
行建模分析.假设云虚拟主机中有任意进程P, 在主机运行一段时间中, 进行过n次进程的创建或终止 (I1, I2, I3, I4, …, In) .该段时间内每次进程创建或终止监控带来的开销是Ci, 那么该段时间内监控进程带来的开销是:.
对于云环境下的主机监控过程, 主要针对以下两种监控方法带来的开销进行分析.
(1) 采用云虚拟技术监控进程方法进程事件的截获和语义重构都在云虚拟机管理器层实现.其开销主要包括从监控云虚拟主机的内核态转换到云虚拟机管理器层的时间Tk, v, 语义重构花费的时间mTr, 其中m表示语义的解析次数, Tr表示每次语义解析花费的时间.此外, 从云虚拟主机管理器返回到安全域接收主机的时间是Tv, d.
从云虚拟主机管理器返回到安全域接收主机的时间
(2) 采用云虚拟主机内部监控进程方法:即文中所述方法, 在云虚拟主机内核中获取进程的监控信息传送到安全域接收主机中.其中主要包括从监控的云虚拟主机内核态 (Kernel Mode) 转到用户态时间是Tk.u, 以及从云虚拟机进程信息传递到安全域主机的时间Ts, d.
从云虚拟机进程信息传递到安全域主机
通过对以上两种方法进程对比.方法 (2) 性能开销比较低, 主要是处理器模式的转换 (从内核态转到用户态) , 耗时相对较少.方法 (1) 性能开销比较高, 相对方法 (2) 主要是语义多次重构带来的性能的损耗.语义重构解析的次数会随着进程的创建或终止次数增多.
5、实验及结果
实验环境为采用x86架构的CPU而且CPU需要支持虚拟化.云主机操作系统为版本CentOS (64) , 内核版本为2.6.32.通过Linux性能测试工具Lmbench2[7]来测试监控程序运行过程中给系统带来的性能损耗.Lmbench2是一个符合ANSI/C标准为Linux/Unix系统而制定并被广泛使用的系统测试套件.衡量两个关键特征:反应时间和带宽.对未载入模块和载入模块的系统分别进行多次性能测试取平均值, 来评估监控模块对虚拟主机带来的性能影响情况.实验结果如表2所示.
表2 Lmbench2进程操作性能对比
从Lmbench2的性能测试结果分析, 与监控函数相关的一些操作都会有一定程度的性能损耗.表2中的fork后退出和fork后执行execve调用再退出的数据可以表明与do_fork () 和do_exit () 函数相关的操作性能有一定程度的损耗.fork进程后增加8μs, fork后执行execve增加了23μs, 相对以前增加7%, 但是仍然在合理的范围内.管道通信延时和10kB文件操作略有增加, 但是都在1μs以内.其中一些不涉及或者极小涉及的相关操作几乎没有任何影响.从图3中可知上下文切换的延时时间在8p/64kB (8个并行处理64kB大小的数据) 、16p/16kB (16个并行处理16kB大小的数据) 的情况下时间有所增加, 分别为0.21μs和0.4μs.总体而言, 利用该方法监控云主机进程信息对系统性能在进程创建和终结时对相关操作有少量影响, 性能损耗在合理的范围内.相对传统的监控方式要迅速和及时, 获取的进程信息更加可靠, 占用的资源更少.相对虚拟主机外部监控获取的信息更全面, 减少了语义还原步骤.
图3 上下文切换损耗
6、结束语
本文针对云平台上云主机安全问题, 提出了云环境下一种基于Kprobe机制的Linux主机的进程实时监控的方法.通过在内核关键函数插入探针的方法, 将进程信息实时获取并收集到远程云安全主机.为以后的安全关联分析, 及时发现来自云平台内的攻击提供数据采集工作, 从而提高云平台的安全性.而在云环境下基于虚拟化技术获取的信息是二进制级的语义, 利用语义转换实现从二进制级的语义转换为系统级语义, 语义转换给系统带来了额外的性能开销.通过实验证明该方法相对云主机外部监控有效可靠, 对系统性能带来很小的开销.对于该监控机制如何通过结合云虚拟化技术加以保护, 防止入侵者修改监控以逃避检测是今后研究的一个方向.
参考文献
[1]邹德清, 金海, 羌卫中, 等.云计算安全挑战与实践[J].中国计算机学会通讯, 2011, 7 (12) :55-61.
[2]Garfinkel T, Rosenblum M.A virtual machine introspection based architecture for intrusion detection[C]∥NDSS, 2003.IEEE, 2003:191-206.
[3]Rhee J, Riley R, Xu D, et al.Defeating dynamic data kernel rootkit attacks via vmm-based guest-transparent monitoring[C]∥Availability, Reliability and Security, 2009.ARES'09.International Conference on.IEEE, 2009:74-81.
[4]李清干, 邵作之.Linux内核调试工具Kprobe机制的研究[J].中国电力教育, 2008, 24 (3) :349-351.
[5]Jim Keniston, Panchamukhi P S, Hiramatsu.Kernel Probes[EB/OL].[2016-06-26].
[6]Rodriguez C S, Fischer G, Smolski S.Linux内核编程[M].陈莉君, 译.北京:人民邮电出版社2006.
[7]Staelin C.lmbench:an extensible micro-benchmark suite[J].Software-Practice and Experience, 2005, 35 (11) :1079.