#nitro
overview
改新昂木增加了VMI到KVM hypervisor来监控一个运行的虚拟机,而且不需要客户机代理。
项目四个组件:
- kvm: linux 4.9.0, 修改kvm模块支持vmi
    
- 必须手动安装内核,因为不是单独针对kvm模块的修改
 
 - qemu:qemu 2.8.0,修改使支持内省
 - nitro:用户空间库,用来接收事件、内省虚拟机状态,弥补语义鸿沟
 - libvmi:跨Xen和kvm的统一API的vmi库
 
安装
kvm下编译新内核nitro下设置用户空间内容,拦截系统调用- 编译
qemu 
nitro
依赖
python 3docopt,Python命令行参数解释器libvirt,提供一种虚拟机监控程序不可知的 API 来安全管理运行于主机上的来宾操作系统。ioctl-opt Python 3cffi Python3(optional)libvmi(optional)rekall(optional)
使用
- 确保已加载修改的kvm模块,
cd kvm-vmi && make modules && make reload - 开启要监控的虚拟机
 - 开启nitro 
./main.py <vm_name> 
"""Nitro.
Usage:
	nitro [options] <vm_name>
	
Options:
  -h --help     Show this screen
  --nobackend   Don't analyze events
  -o --output   Output file (stdout if not specified)
"""
Nitro通过激活kvm里面的陷阱来监控<vm_name>的系统调用。
只安装了必须的依赖的话,需要在运行nitro时添加—nobackend.
CTRL+C打断运行,Nitro重置陷阱并将捕获到的时间写进events.json。--out输出到指定文件。
libvirt
libvirt安装,官网下载源文件编译(http://libvirt.org/)
# 保持对操作系统发型版中安装可执行程序和共享库的目录的一致性
$ ./autogen.sh --system
$ make
$ sudo make install
依赖缺啥装啥,比如gnutls库,
sudo apt-get install gnutls-doc gnutls-bin
sudo apt-get install libgnutls28-dev libneon27-gnutls libcurl4-gnutls-dev
libnl库
sudo apt install libnl-3-dev libnl-route-3-dev
libvmi
专注于读写虚拟机内存的自省库,监视虚拟机底层的运行细节并将其还原,支持Xen和KVM;
针对KVM虚拟化平台,libvmi对QEMU进行修改以提供虚拟机物理内存的读写接口,基于libvmi的自省程序通过本地Unix socket与QEMU通信,实现对特定物理地址内容的读写。
以获取虚拟机某个GPA内容为例,简述在KVM虚拟化平台下使用libvmi自省的流程:
VMI Application创建VMI实例,给出目标虚拟机名称及对应GPA,交由libvmi处理;libvmi初始化vmi实例,然后使用QMP向qemu-kvm-patch发送创建Unix socket的命令,用于和目标虚拟机所在的qemu进程进行通信;qemu-kvm-patch接收到QMP命令后,创建Unix socket,作为服务器端监听libvmi请求;libvmi向socket server发出连接请求,内存读写请求;qemu-kvm-patch接收来自libvmi的请求,调动qemu中相关函数进行自省操作,返回给libvmi;libvmi接收qemu-kvm-patch返回的数据结果,将其返回VMI Application,此次内省操作结束。
./autogen.sh
./configure --disable-xen
make
su -
make install
ldconfig
exit
事先没有安装好libvirt,./configure之后kvm后面显示不支持,缺失libvirt。