首页 > 代码库 > kvm 安全相关:selinux svirt

kvm 安全相关:selinux svirt

selinux(security-enhanced linux)简介:(参考http://blog.csdn.net/flaght/article/details/2973910)

普通的linux采用自由访问控制策略(Discretionary Acces Control ,DAC)策略来限制资源访问。这种策略比较简单薄弱,只要满足规定的权限(文件所有者和文件属性等)就可以使用资源,这很容易引起安全隐患,而且很难支持很多安全特性。

例如,管理员可以只允许一个应用程序添加记录到一个日志文件但不允许其重写或者删除该日志文件的内容。虽然ext2和ext3文件系统有一个append-only标签(使用chattr设置),但是这属性不区分某一个进程(不能在为一个访问 append-only的同时,又允许另一个进程据有完全可写的权利);另一方面,一个应用程序可以被允许在一个文件夹中建立文件和向其写入数据,但不能删除文件,这种特性是DAC做不到的,此时selinux派上用场了

selinux基于强制访问策略(Mandatory Access Control ,MAC)限制资源访问的,应用程序必须同时满足DAC策略和MAC策略才能使用资源。DAC先于MAC生效,如果DAC本身不通过,那么MAC在这个过程没有参与,如果DAC通过,则selinux将对其进行进一步访问控制检查。

selinux的配置文件是/etc/selinux/config,管理selinux的包由libselinux-utils和policycoreutils提供

SELINUX=permissive|enforcing|disabled

permissive:在发现违反mac策略时候发出警告,但是并不阻止

disabled:完全关闭selinux

enforcing:禁止违反selinux的行为

SELINUXTYPE=targeted|mls

targeted:目标进程保护策略

mls:多级安全保护策略

setenforce 

1:开启selinux功能

0:关闭selinux功能

getenforce:查看selinux功能是否开启

sestatus:获取运行selinux的状态,比getenforce输出信息更详细

setsebool:设置selinux策略中配置项的布尔值

chcon:改变文件或目录的selinux安全上下文

-t [type]:设置安全上下文类型

-R:表示递归地更改所有子目录和文件的安全上下文

-u [user]:修改安全上下文的用户

-r [role]:修改安全上下文的角色

安全上下文由用户id、角色、类型三部分组成,用户id提供身份识别功能,一个用户可以具有多个角色,每个角色具有不同的权限,类型则是对程序主体和资源的分类,当类型相匹配时,程序才能正常使用资源

安全上下文的类型有三种:

账号的安全上下文,id -Z 查看

进程的安全上下文,ps -Z 查看

文件或目录的安全上下文,ls -Z查看

sVirt简介

在只使用dac策略虚拟化环境中,因为运行客户机的进程运行身份都是一样的,而且每个客户机都是使用相同的物理设备,当一台客户机被攻陷后,攻击者很可能利用它发起对宿主机的攻击。当然,我们也可以让每台客户机使用不同的运行身份来堤防这个安全隐患,但是这也会带来额外的问题,当客户机数量很多的时候,我们就需要为其提供很多用户账号,在linux中,一个账号要附加很多信息的(bashrc、profile等就是记录这些信息),这会带来很多开销。所以,根据折中的哲学思想,人们并不为每个客户机创建不同用户运行进程,而是借鉴这种思想,为客户机和资源打上唯一的标签,只有资源和客户机标签相匹配的时候,才允许其使用资源,这个思想在linux中的具体实现就是svirt(selinux和虚拟化的结合)。

svir使用基于进程的机制和约束为客户机提供了一个额外的安全保护层,它的一般的工作方式是这样的:在rhel系统中使用libvirt的守护进程(libvirtd)在后头管理客户机,在启动客户机之前,libvirt动态选择一个带有两个分类标志的随机mcs标签如(s0:c1,c2),将客户机使用的所有存储资源都打上相应的标签(svirt_image_t:s0:c1,c2),然后用该标签启动客户机。当客户机试图使用磁盘资源而标签不一致的时候,则禁止访问,返回错误提示

技术分享

例子:

setenforce 1	#svirt是基于selinux的,所以要开启来
	cp /bin/bash  /bin/svirt_bash	#防错哲学..实验前必备份
	chcon  -t qemu_exec_t /bin/svirt_bash 	#指定svirt_bash类型
	runcon	-t svirt_t -l s0:c1,c2 /bin/svirt_bash  #以svirt_t类型和s0:c1,c2标签运行svirt_bash
		svirt_bash: /root/.bashrc: Permission denied	#类型改变后,进程会没有权限读取.bashrc这个文件,不影响本次实验,但是如果实在不喜欢报错的话,可以使用:
		chcon -t  svirt_t  -l s0:c1,c2 /root/.bashrc改变bashrc标签,这样,再次运行就不会报错,改之前要关闭selinux,否则提示无权限修改,这样改后也有问题就是执行其他命令也会报错,因为svirt_t的权限很小,不如默认的admin_home_t
	id -Z	#查看当前进程标签
		unconfined_u:unconfined_r:svirt_t:s0:c1,c2
	svirt_bash-4.1# echo "it just a test" > /tmp/1.txt
	svirt_bash-4.1# ls -Z /tmp/1.txt 		#发现跟svirt_bash 进程一样
	-rw-r--r--. root root unconfined_u:object_r:svirt_tmp_t:s0:c1,c2 /tmp/1.txt
	
	[root@cqhdtest ~]# runcon -t svirt_t -l s0:c1,c3 /bin/svirt_bash 	#换个标签运行
	svirt_bash: /root/.bashrc: Permission denied
	svirt_bash-4.1# id -Z
	unconfined_u:unconfined_r:svirt_t:s0:c1,c3
	svirt_bash-4.1# cat  /tmp/1.txt 		#提示没有权限
	cat: /tmp/1.txt: Permission denied

	[root@cqhdtest ~]# setenforce 0
	[root@cqhdtest ~]# chcon -t svirt_t -l s0:c1,c3 /tmp/1.txt 
	[root@cqhdtest ~]# setenforce 1
	[root@cqhdtest ~]# runcon -t svirt_t -l s0:c1,c3 /bin/svirt_bash 
	svirt_bash: /root/.bashrc: Permission denied
	svirt_bash-4.1# cat  /tmp/1.txt 
	it just a test
	#修改1.txt标签再访问,发现可以,实验成功,注意,我修改参数时的bash不一样



kvm 安全相关:selinux svirt