sVirt概述

前面已经对seLInux的基本原理做了分析,seLinux主要就是基于主体和客体的安全上下文,进行访问决策。那么安全上下文是不是又可以理解为一个标签呢?
基于以上seLInux的特性,便可以考虑吧seLinux这种基于标签的思想应用到保障Hypervisor的安全上,这里主要是解决两个问题:
  • 恶意虚拟机攻击Hypervisor
  • 恶意虚拟机攻击其他虚拟机

这样开发者们便想出了一个给虚拟机打标签然后借助于seLinux的策略配置解决上面两个问题。他们开始的想法是给虚拟机和镜像文件打同一个标签,这样一个虚拟机只能访问自身的镜像文件,而一个镜像文件也只能被它对应的虚拟机访问。但是起初他们是让管理员给镜像文件配置标签,这加重了管理员的负担,所以后来他们在libvirt中加入了支持。

准确来说就是在Libvirt中添加了一个安全架构插件,这样Libvirt会自动给镜像文件配置标签并且保证虚拟机以正确的标签启动。这些标签是无法更改的。这样管理员就不需要去记复杂的标签,提高了易用性。默认情况下,在F11中的虚拟机是svirt_t,镜像文件时svirt_image_t。
而seLinux的策略仅仅允许sVIrt_t的进程读写sVIrt_image_t的文件和设备。
这种情况下虚拟机便不能肆意访问宿主机,也就解决了第一个问题,但是这样并不能阻止虚拟机间的恶意访问,即第二个问题。
基于此,开发者便考虑我们要保证虚拟机和镜像的标签一致,同时不能让VM1访问具有相同标签的VM2的镜像文件。
 
这样便出现了MCS(Multiple Category Security)
 
这在red hat 5上默认提供支持,类似于MLS,MCS在seLInux的安全上下文中添加了第四个字段,其实之前我们也介绍过MCS和MLS的区别,MCS只不过是只采用一个敏感度,而MLS又多个敏感度,二者的侧重点是不同的,MCS重在分类,而MLS貌似重在等级。
 
这样MCS便可以用于分离以同一seLinux类型运行的虚拟机,Libvirt在加入支持后,同样也可以自动为虚拟机和其镜像文件分配随机MCS标签,同时保证标签的唯一性。
例如Libvirt为两台虚拟机分配的标签:
 

这样seLinux阻止了VM1( system_u:system_r:svirt_t:s0:c0,c10) 访问VM2的镜像文件 (system_u:object_r:svirt_image_t:s0:c101,c230) ,也就阻止了VM间的相互攻击。
如下是Livvirt分配的标签:

同时对sVirt也加入了静态标签的特性,用户可以为虚拟机选择特定的标签。这样虚拟机便一直以这个标签启动,但是设置静态标签的用户需要为镜像文件设置相应的标签。而Libvirt也永远不会去修改静态配置的标签,这样sVIrt便可以运行于MLS的环境,管理员就可以运行多个不同安全级别的虚拟机。
 
二、sVirt在seLInux中的使用
 
sVIrt其实最主要的还是给虚拟机打标签的过程,而目前主要有静态标签和动态标签两种方式
 
动态分配:
默认状态下,虚拟机运行在自己的被动态配置的域和image文件下,因此和其他的VM隔离开来(每个虚拟机会被随机分配MCS标签用于限制虚拟机活动在自己的域中),这种模式的实现方式如下:
a) 一个对进程的初始上下文是从/etc/selinux/<SELINUXTYPE>/contexts/virtual_domain_context 文件获得,意味着开启虚拟机后,代表虚拟机的qemu进程的安全上下文就是从这个文件中获取的。
b)一个对image镜像文件的安全上下文时从/etc/selinux/<SELINUXTYPE>/contexts/virtual_image_context 文件获得的,那么刚才不是说镜像文件在建立时已经有了安全上下文么??这里我也不太清楚,在虚拟机启动后,镜像文件的类型会被重新标记,至于原因,后续有待考究。
c)当一个镜像文件被用于启动一个虚拟机,selinux系统就生成一个随机的MCS level 并添加到相应qemu进程的安全上下文和image镜像文件的安全上下文。进程和image文件随后被libseLinux API 分别调用 setfilecon 和setexeccon来实现转化到相应的安全上下文(可以参考libvirt源代码中的security_selinux.c文件)。
下面的例子显示了两个运行的VM的安全上下文:
 

上面是Vm运行起来后,虚拟机进程和image镜像文件的安全上下文。
用命令查看VM运行状态和关机状态的相关信息:
 

那么观察上面的结果大致可以得到下面结论:
 
1、在虚拟机启动之前,镜像文件的类型是virt_image_t,而在虚拟机启动之后,镜像文件的类型是svirt_image_t.
2、在虚拟机启动之前是没有配置MCS标签的
3、虚拟机启动之后进程和镜像文件的MCS标签存在一一对应的关系,故因此保证独立性。
 
 
静态分配:
 
动态分配的方式很简单,只要系统安装了selinux模块,并设置seLInux的相关配置文件,建议设置seLinux-Type = targeted,此模式下会默认对网络和虚拟机设置访问控制,假如设置mls的话要考虑的事情太多,系统很有可能起不来(前车之鉴)。
 
那么静态分配的话就是手动给某个虚拟机分配标签,一般在用户层的虚拟机管理工具都会提供这个功能,以virt-manager为例:
 

这样配置后,在虚拟机对应的配置文件中会自动添加对标签:
启动虚拟机会以所配置的安全上下文启动,但是注意,因为前面提到过虚拟机运行起来后,镜像文件的安全上下文会被重新标记,而在静态方式下,镜像文件的安全上下文并不自动更改,那那么假如我们不手动修改镜像文件的安全上下文,虚拟机就会因为权限不足而无法启动。
 

那么出现这样情况也是意料之中,我们可以通过添加allow规则或者手动修改镜像文件的类型来解决。目前还没有掌握添加allow规则的方式,所以只能通过chcon命令修改镜像文件的类型。
 

 
这样设置便可以启动系统,但是为了保证镜像文件的安全性,还要把镜像文件的安全上下文设置和VM进程一样的MCS标签。
 

这样VM便可以正常启动了。
然而当我么设置静态标签的域类型为unconfined_t时,即使不修改image镜像文件的安全上下文也可以正常启动,因为unconfined类型具有所有的访问权限。
所以我们再看下两个虚拟机的进程和镜像文件的安全上下文:
 

然后查看系统运行和关闭状态,安全上下文的区别:
 

 注意:并不是所有的virt-manager版本都有静态标签设置的项,在centos下的virt-manager就没有这一项,那么我们可以通过直接修改xml文件的方式给虚拟机指定标签,但是静态标签的实际意义不大,至少我目前没有想到什么需求必须要使用静态标签,毕竟svirt的出现的目的就是要保证虚拟机之间的隔离性,没有必要非要指定一个静态标签。
 

sVIrt概述的更多相关文章

  1. 【AR实验室】ARToolKit之概述篇

    0x00 - 前言 我从去年就开始对AR(Augmented Reality)技术比较关注,但是去年AR行业一直处于偶尔发声的状态,丝毫没有其"异姓同名"的兄弟VR(Virtual ...

  2. Recurrent Neural Network系列1--RNN(循环神经网络)概述

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  3. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  4. .Net 大型分布式基础服务架构横向演变概述

    一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...

  5. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

  6. 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

  7. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  8. [AlwaysOn Availability Groups]健康模型 Part 1——概述

    健康模型概述 在成功部署AG之后,跟踪和维护健康状况是很重要的. 1.AG健康模型概述 AG的健康模型是基于策略管理(Policy Based Management PBM)的.如果不熟悉这个特性,可 ...

  9. μCos-ii学习笔记1_概述

    一.μCos-ii _概述 网上关于μCosii的文章多不胜数,本人学习的过程中也参考了很多人的理解和想法,看的是卢有亮老师的<嵌入式实时操作系统-μC/OS原理与实践>(第2版),同时也 ...

随机推荐

  1. c#开源项目[转]

    一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(as ...

  2. [shell]简单的shell提示和参数脚本

    该shell脚本有如下点: bash or dash case语句的写法 脚本help写法 参数是否为空的写法 算数运算的写法 #! /bin/bash case "$1" in ...

  3. 小贝_redis 高级应用-事务

    redis高级应用-事务 一.redis的事务 二.redis实现事务 三.redis事务问题 一.redis的事务 事务提供了一种"将多个命令打包,然后一次性.按顺序地运行"的机 ...

  4. ES6学习笔记(1,let和const)

    在介绍let和const之前我们先复习一下相关的知识点. 关于函数作用域 开发过程中,在ES6(ECMA2015)标准推出之前,声明变量的方式一直都是var,而变量的作用域一般也只在函数内部,即函数作 ...

  5. CSS:scrollbar的属性及样式分类

    overflow            内容溢出时的设置(设定被设定对象是否显示滚动条) overflow-x         水平方向内容溢出时的设置 overflow-y         垂直方向 ...

  6. 分享在github超酷超炫特效动画,不看你会懊悔的。

    有图有真相直接上效果图,有须要的朋友们能够到连接上去下载. 下载地址:https://github.com/ChrisRenke/DrawerArrowDrawable 下载地址:https://gi ...

  7. c#用run32dll打开系统dll(如系统图片查看器,并置最顶层)

    [DllImport("user32.dll", EntryPoint = "SetWindowPos",CharSet = CharSet.Auto)] st ...

  8. hdu 4722(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722 思路:简单的记忆化搜索,留意一下A==0时的情况就可以了. #include<iostre ...

  9. 你所不知道的CSS

    1.用FONT-SIZE:0来清除间距 inline-block的元素之间会受空白区域的影响,也就是元素之间差不多会有一个字符的间隙.如果在同一行内有4个25%相同宽度的元素,会导致最后一个元素掉下来 ...

  10. webstorm配置内存参数,解决卡顿

    找到WebStorm.exe.vmoptions这个文件,路径如下webstorm安装主目录>bin>WebStorm.exe.vmoptions更改为第二行:-Xms526m第三行:-X ...