selinux(security-enhanced linux)
美国国家安全局
nas)对于强制访问控制的实现,是 linux® 上最杰出的新安全子系统。nsa是在linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。selinux 默认安装在 fedora red hat enterprise linux 上,也可以作为其他发行版上容易安装的包得到。
     selinux 2.6 版本的 linux 内核中提供的强制访问控制 (mac)系统。对于目前可用的 linux 安全模块来说,selinux 是功能最全面,而且测试最充分的,它是在 20 年的 mac 研究基础上建立的。selinux 在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。
     大部分使用 selinux 的人使用的都是 selinux 就绪的发行版,例如 fedorared hat enterprise linux (rhel)debian gentoo。它们都是在内核中启用 selinux 的,并且提供一个可定制的安全策略,还提供很多用户层的库和工具,它们都可以使用 selinux 的功能。
     selinux是一种基于 -类型 模型(domain-type)的强制访问控制(mac)安全系 统,它由nsa编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了selinux的补丁,最后还有一个相应的安全策略。
     众所周知,标准的unix安全模型是"任意的访问控制"dac。就是说,任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在dac情况下没人能阻止他!
     mac情况下的安全策略完全控制着对所有资源的访问。这是macdac本质的区别。
     selinux提供了比传统的unix权限更好的访问控制。
1.背景
selinux是「security-enhanced linux」的简称,是美国国家安全局「nsathe national security agency sccsecure computing corporation)开发的 linux的一个扩张强制访问控制安全模块。原先是在fluke上开发的,2000年以 gnu gpl 发布。
现在以linux作为因特网服务器是越来越普遍的事了。在我这几年作过的项目里,web的开发基本都是基于linux的,这里有给大公司做的,也给政府部门做的,当然更多的是中小企业做的。这其中给政府做的,我们把selinux作为一个卖点,接受了不少项目。
2.我们需要安全操作系统的理由
现在不论是政府还是民间企业,大家对信息安全问题是越来越关心了,因为企业的业务平台的服务器上存储着大量的商务机密,个人资料,个人资料它直接关系到个人的隐私问题。特别是我们政府的网站,作为信息公开的平台,它的安全就更显得重要了。这些连到互联网的服务器,不可避免的要受到来自世界各地的各种威胁。最坏的时候我们的服务器被***,主页文件被替换,机密文件被盗走。除了来自外部的威胁外,内部人员的不法访问,***也是不可忽视的。对于这些***或者说是威胁,当然有很多的办法,有防火墙,***检测系统,打补丁等等。因为linux也和其他的商用unix一样,不断有各类的安全漏洞被发现。我们对付这些漏洞不得不花很多的人力来堵住它。在这些手段之中,提高os系统自身的牢固性就显得非常的重要。
2.1传统的linux os的不足之处
虽然linux 比起 windows 来说,它的可靠性,稳定定要好得多,但是他也是和其他的unix 一样,有以下这些不足之处。
)存在特权用户root
  任何人只要得到root的权限,对于整个系统都可以为所欲为。这一点windows也一样。
)对于文件的访问权的划分不够细
  在linux系统里,对于文件的操作,只有「所有者」,「所有组」,「其他」这3类的划分。
  对于「其他」这一类里的用户再细细的划分的话就没有办法了。
)suid程序的权限升级
  如果设置了suid权限的程序有了漏洞的话,很容易被***者所利用。
)DAC(discretionary access control)问题
  文件目录的所有者可以对文件进行所有的操作,这给系统整体的管理带来不便。
对于以上这些的不足,防火墙,***检测系统都是无能为力的。
在这种背景下,对于访问权限大幅强化的os selinux来说,它的魅力的无穷的。
2.2 selinux的优点
selinux系统比起通常的linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,即使受到***,进程或者用户权限被夺去,也不会对整个系统造成重大影响。
接下来我来介绍selinux的一些特点。
特点1mac(mandatory access control)╠╠╠对访问的控制彻底化
对于所有的文件,目录,端口这类的资源的访问,都可以是基于策略设定的,这些策略是由管理员定制的、一般用户是没有权限更改的。
特点2 te type enforcement)╠╠╠ 对于进程只付与最小的权限
te概念在 selinux里非常的重要。它的特点是对所有的文件都赋予一个叫type的文件类型标签,对于所有的进程也赋予各自的一个叫 domain 标签。domain标签能够执行的操作也是由access vector在策略里定好的。
我们熟悉的apache服务器,httpd进程只能在httpd_t 里运行,这个httpd_t domain能执行的操作,比如能读网页内容文件赋予httpd_sys_content_t, 密码文件赋予shadow_t, tcp80端口赋予 http_port_t等等。如果在access vector里我们不允许 http_t来对http_port_t进行操作的花,apache启动都启动不了。反过来说,我们只允许80端口,只允许读取被标为 httpd_sys_content_t的文件,httpd_t就不能用别的端口,也不能更改那些被标为httpd_sys_content_t的文件(read only)
特点3 domain迁移 ╠╠ 防止权限升级
在用户环境里运行点对点下载软件azureus,你当前的domainfu_t, 但是,你考虑到安全问题,你打算让他在azureus_t里运行,你要是在terminal里用命令启动azureus的话,它的进程的domain就会默认继承你实行的shellfu_t
有了domain迁移的话,我们就可以让azureus在我们指定的azureus_t里运行,在安全上面,这种做法更可取,它不会影响到你的fu_t
下面是domain迁移指示的例子:
domain_auto_trans(fu_t, azureus_exec_t, azureus_t)
意思就是,当在 fu_t domain里,实行了 被标为 azureus_exec_t的文件时,domain fu_t迁移到 azureus_t 。下面是apache启动的迁移图。注意了,因为从哪一个domain能迁移到httpd_t是在策略里定好了,所以要是我们手动 (/etc/init.d/httpd start)启动apache的话,可能仍然留在sysadm_t里,这样就不能完成正确的迁移。要用run_init命令来手动启动。
特点4 rbacrole base access control) ╠╠╠╠╠ 对于用户只付与最小的权限
对于用户来说,被划分成一些role,即使是root用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。因为,那些role可以执行那些domain也是在策略里设定的。role也是可以迁移的,但是也只能安策略规定的迁移。
3. 控制切换
fedora core 2开始, 2.6内核的版本都支持selinux.我们看看 fedora core 5 里的/etc/sysconfig/selinux标准设定吧。
# this file controls the state of selinux on the system.
# selinux= can take one of these three values:
# enforcing - selinux security policy is enforced.
# permissive - selinux prints warnings instead of enforcing.
# disabled - selinux is fully disabled.
selinux=enforcing
#selinux=disabled
# selinuxtype= type of policy in use. possible values are:
# targeted - only targeted network daemons are protected.
# strict - full selinux protection.
selinuxtype=targeted
selinux有「disabled」「permissive」,「enforcing3种选择。
disabled就不用说了,permissive就是selinux有效,但是即使你违反了策略的话它让你继续操作,但是把你的违反的内容记录下来。在我们开发策略的时候非常的有用。
相当于debug模式。
enforcing就是你违反了策略,你就无法继续操作下去。
selinuxtype呢,现在主要有2大类,一类就是红帽子开发的targeted,它只是对于,主要的网络服务进行保护,比如 apache ,sendmail, bind,postgresql等,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整体进行保护。
另一类是strict,是nas开发的,能对整个系统进行保护,但是设定复杂,我认为虽然它复杂,但是一些基本的会了,还是可以玩得动的。
我们除了在/etc/sysconfig/selinux设它有效无效外,在启动的时候,也可以通过传递参数selinux给内核来控制它。(fedora 5默认是有效)
kernel /boot/vmlinuz-2.6.15-1.2054_fc5 ro root=label=/ rhgb quiet selinux=0
上面的变更可以让它无效。
[root@python sysconfig]# /usr/sbin/getenforce
enforcing
确认有效后重新对文件系统赋予标签:
[root@python sysconfig]# /sbin/fixfiles relabel
或者
[root@python /]# touch /.autorelabel
然后 reboot ,你就在securelinux环境下工作了。
4. selinux的基本操作
selinux是个经过安全强化的linux操作系统,实际上,基本上原来的运用软件没有必要修改就能在它上面运行。真正做了特别修改的rpm包只要50 多个。像文件系统ext3都是经过了扩展。对于一些原有的命令也进行了扩展,另外还增加了一些新的命令,接下来我们就来看看这些命令。
4.1 文件操作
1ls命令
在命令后加个 z 或者加 context
[root@python azureus]# ls -z
-rwxr-xr-x fu fu user_u:object_r:user_home_t azureus
-rw-r--r-- fu fu user_u:object_r:user_home_t azureus2.jar
-rw-r--r-- fu fu user_u:object_r:user_home_t azureus.png
2chcon
更改文件的标签
[root@python tmp]# ls --context test.txt
-rw-r--r-- root root root:object_r:staff_tmp_t test.txt
[root@python tmp]# chcon -t etc_t test.txt
[root@python tmp]# ls -lz test.txt
-rw-r--r-- root root root:object_r:etc_t test.txt
3)restorecon
当这个文件在策略里有定义是,可以恢复原来的 文件标签。
4setfiles
chcon一样可以更改一部分文件的标签,不需要对整个文件系统重新设定标签。
5fixfiles
一般是对整个文件系统的, 后面一般跟 relabel,对整个系统 relabel后,一般我们都重新启动。如果,在根目录下有.autorelabel空文件的话,每次重新启动时都调用 fixfiles relabel
6star
就是tarselinux下的互换命令,能把文件的标签也一起备份起来。
7cp
可以跟 -z, --context=context 在拷贝的时候指定目的地文件的security context
8find
可以跟 context 查特定的type的文件。
例子:
find /home/fu/ --context fu:fu_r:amule_t -exec ls -z {} \:
9run_init
sysadm_t里手动启动一些如apache之类的程序,也可以让它正常进行,domain迁移。
4.2进程domain的确认
程序现在在那个domain里运行,我们可以在ps 命令后加 z
[root@python /]# ps -ez
label pid tty time cmd
system_u:system_r:init_t 1 ? 00:00:00 init
system_u:system_r:kernel_t 2 ? 00:00:00 ksoftirqd/0
system_u:system_r:kernel_t 3 ? 00:00:00 watchdog/0
4.3role的确认和变更
命令id能用来确认自己的 security context
[root@python ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:staff_r:staff_t
这里,虽然是root用户,但也只是在一般的rolestaff_t里运行,如果在enforcing模式下,这时的root对于系统管理工作来说,是什么也干不了。
[root@python ~]# newrole -r sysadm_r
authenticating root.
口令:
[root@python ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:sysadm_r:sysadm_t
4.4模式切换
1getenforce
得到当前的selinux
[root@python bin]# getenforce
permissive
2setenforce
更改当前的selinux ,后面可以跟 enforcing,permissive 或者 1, 0
[root@python bin]# setenforce permissive
3sestatus
显示当前的 selinux的信息
[root@python bin]# sestatus -v
selinux status: enabled
selinuxfs mount: /selinux
current mode: permissive
mode from config file: permissive
policy version: 20
policy from config file: refpolicy
process contexts:
current context: user_u:user_r:user_t
init context: system_u:system_r:init_t
/sbin/mingetty system_u:system_r:getty_t
/usr/sbin/sshd system_u:system_r:sshd_t
file contexts:
controlling term: user_u:object_r:user_devpts_t
/etc/passwd system_u:object_r:etc_t
/etc/shadow system_u:object_r:shadow_t
/bin/bash system_u:object_r:shell_exec_t
/bin/login system_u:object_r:login_exec_t
/bin/sh system_u:object_r:bin_t -> system_u:object_r:shell_exec_t
/sbin/agetty system_u:object_r:getty_exec_t
/sbin/init system_u:object_r:init_exec_t
/sbin/mingetty system_u:object_r:getty_exec_t
4.5其他重要命令
1audit2allow
很重要的一个以python写的命令,主要用来处理日志,把日志中的违反策略的动作的记录,转换成 access vector,对开发安全策略非常有用。在refpolicy里,它的功能比以前有了很大的扩展。
[root@python log]# cat dmesg | audit2allow -m local > local.te
2checkmodule -m -o local.mod local.te
编译模块
[root@python log]# checkmodule -m -o local.mod local.te
checkmodule: loading policy configuration from local.te
checkmodule: policy configuration loaded
checkmodule: writing binary representation (version 5) to local.mod
3semodule_package
创建新的模块
[root@python log]# semodule_package -o local.pp -m local.mod
4)semodule
可以显示,加载,删除 模块
加载的例子:
[root@python log]# semodule -i local.pp
5semanage
这是一个功能强大的策略管理工具,有了它即使没有策略的源代码,也是可以管理安全策略的。因为我主要是介绍用源代码来修改策略的,详细用法大家可以参考它的man页。
5. 定制策略
fc4,rhel4等都是采用策略1.x版本的,并且是提供策略源代码的rpm包。从fc5开始策略的版本从1.x 升级到2.x2.x版本的refpolicy(reference policy)最大的一个变化就是引进模块(module)这个概念, 同一套策略源代码就可以支持multi-levelsecuritymls)和non-mls
http://serefpolicy.sf.net/
标准的fc5里不提供源代码的rpm包。fc5提供的audit2allow,semanage,semodule也是可以开发一些简单的策略模块的。但是,要是作策略模块的开发,增加一个role之类的,最好还是下载refpolicy的源代码。
5.1策略源文件的安装
cvs服务器下载的源代码是最新的,如果遇到象make的时候出错,那么最好就是把你系统里和selinux有关的那些包更新到最新的状态。
source forgecvs服务器下载源代码
[root@python src]# cd /usr/local/src
[root@python src]# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/serefpolicy login
[root@python src]# cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/serefpolicy co -p refpolicy
[root@python src]# cd refpolicy/
[root@python src]# make install-src
安装好了的源代码目录结构如下图所示:
每一个模块有3个文件构成,比如上图的sudo.fc 就是和 命令sudo相关的文件的定义标签,(file context rabel)sudo.tetype enforcement定义,包括te访问规则等,sudo.if是一个外部模块调用这个模块的接口定义。
[root@python src]# cd /etc/selinux/refpolicy/src/policy
[root@python policy]# cp build.conf build.conf.org
[root@python policy]# vi build.conf
[root@python policy]# diff build.conf build.conf.org
32c32
#distro = redhat
43c43
monolithic=y
[root@python src]# make conf
[root@python src]# make
这样,在/etc/selinux/refpolicy/src/policy下生成很多的以pp为后缀的文件,这些就是selinux模块。接下来我们修改/etc/sysconfig/selinux,设成selinuxtype=refpolicy,然后reboot.
启动后,确认策略的适用情况, 现在的版本是20
[fu@python ~]$ /usr/sbin/sestatus
selinux status: enabled
selinuxfs mount: /selinux
current mode: permissive
mode from config file: permissive
policy version: 20
policy from config file: refpolicy
5.2给程序定制domain
开发程序策略的一般步骤
1.给文件,端口之类的object赋予type 标签
2.设置 type enforcement (domain 迁移,访问许可)
3.策略加载
4.permissive模式下运行程序
5.确认日志,用audit2allow生成访问许可
6.重复12345动作,直到没有违反的日志出现
7.切换到enforcing模式,正式运用
因为我们所常用的那些服务的策略模块都已经有了,修改的时候也比较简单。在这里我就举个一般的例子。用点对点下载的朋友估计都跟我一样,在linux上用 azureusamule来下载东西吧。
接下来以azureus为例,介召如何在fc5里追加一个azureus.pp模块。我们在追加azureus.pp模块之前,azureus是在系统给用户设好的user_t domain里运行。
[fu@python azureus]$ ps -efz|grep azureus
user_u:user_r:user_t fu 1751 1732 0 22:28 pts/3 00:00:00 /bin/bash ./azureus
接下来我们在追加3个文件。
1azureus.fc
在这里我只定义一个文件,实际要是真的用的,还要定义azureus_t能写的目录等。
[root@python apps]# more azureus.fc
/home/fu/azureus -- gen_context(user_u:object_r:azureus_exec_t,s0)
2azureus.te
[root@python apps]# more azureus.te
policy_module(azureus,1.0.0)
type azureus_t;
type azureus_exec_t;
role user_r types azureus_t;
require {
type user_t;
};
domain_type(azureus_t)
domain_entry_file(azureus_t, azureus_exec_t)
domain_auto_trans(user_t, azureus_exec_t, azureus_t)
3)azureus.if
实际上没有别的模块要调用azureus,所以这个文件就是空文件也不要紧。
[root@python apps]# more azureus.if
# policy/modules/apps/azureus.if
## myapp example policy
##
## execute a domain transition to run azureus.
##
##
本贴来自天极网群乐社区--http://q.yesky.com/group/review-17810919.html