RedHat Enterprise Linux 4的新安全机制Word文件下载.docx
《RedHat Enterprise Linux 4的新安全机制Word文件下载.docx》由会员分享,可在线阅读,更多相关《RedHat Enterprise Linux 4的新安全机制Word文件下载.docx(16页珍藏版)》请在冰点文库上搜索。
NSA希望有操作系统商能支持其开发的MAC机制,但由于所有的这些工作都是基于实验室,极少可以在实验室之外来进行尝试,以查看这些思想在真实的应用程序的可行性,加之为保密项目,因此很难说服某个系统商采用,谁也不敢头一个吃这个螃蟹。
于是,NSA决定选择开源代码的Linux系统为实际市场试验系统。
NSA把Flask安全体系集成到Linux操作系统中,SELinux便孕育而生,为了真正配合SELinux在Linux系统上的应用实施,NSA将SELinux作为一个开放源码项目发布出来,从而能获得更加广泛的开发者和用户支持。
毫无意外,使用真正的系统让NSA研究人员可以更好的理解SELinux在实际中的应用,而其中体现出的问题是在试验系统中无法找到的。
NSA的这一开源措施,在开源界犹如一颗原子弹,业界普遍对此是欢迎的,但也不能说NSA是为此作出了牺牲,因为这是个双赢的举措,因为没有Linux这个试验田,NSA的SELinux很难修得正果。
另外选择Linux不是毫无理由的:
首先,Linux系统拥有着众多的使用用户,而且很多用户本身具有很高的技术水平;
其次,Linux基于开源,这样使得SELinux不属用任何商业组织或公司,防止依此来牟利,也不利于SELinux的发展;
最后,对于Linux,它作为新兴的操作系统,在桌面领域很难打败Windows,因此它主要面对服务器领域,而安全就显得至关重要,SELinux正好是它所迫切需要的。
RedHat是个很聪明的公司,Fedora是其领导的Linux开源组织。
其实说穿了,Fedora就是其企业发行版的实验田。
RedHat首先选择了FedoraCore2作为第一个SELinux实验操作系统,但是预设为不开启,但SELinux在其平台上的表现还是取得了成功。
到了FedoraCore3,SELinux已经默认为开启,然后经过修改,我们便在RHEL4上也看到SELinux。
另外需要补充说明的是,读者不要以为仅仅存在SELinux这一个MAC项目,还有很多其他的MAC实现项目,用于其他不同的系统中。
四.SELinux原理
在SELinux中,每个对象(程序、档案、进程等)都拥有一个SecurityContext(安全上下文),它就像标签一样,贴在每个对象身上,上面记载着这个对象所具有的权限。
而我们可以通过制定SecurityPolicy(安全策略)来定义这些SecurityContext,从而定义哪种对象具有哪些权限。
当一个对象需要执行某个动作时,系统会依照SecurityPolicy所制定的内容来检查相对应的权限,如果全部权限都符合的话,系统就会允许这个操作的执行,否则都将遭到拒绝或失败。
这些过程不会影响到其它正常运行的对象,系统会保证它们的安全系统结构以及稳定运行。
这里还要说明的是,到目前为止,SELinux系统中的某个对象需要执行某个动作的时,系统权限认证不仅仅单独根据SecurityPolicy所制定的内容来检查,同时还要根据传统DAC来检测,只有DAC以及SELinux全部认证通过了才能进行正常操作。
如果读者了解chroot,那么就能很好的理解SELinux。
chroot
就是把某程序置于文件系统下的某一处,而当运行的时候,就不会离开这个文件系统的部份,也就是不会影响整个的文件系统。
就好比如果把所有的对象都分配到不同的domain(域)中。
而不同的
domain
却彼此独立,而且如果没有经过授权的对象就不可以在domain之间传递数据,也就是说对象不能没有授权就由domain
A
跳到
B中,情况就如
一样。
在传统的类Unix中,root拥有着所有权限,有些用户使用采用SELinux的Linux时发现自己就是root,但为何有些事情却不允许执行。
其实说穿了就是因为
root
所属的
没有授权可以跳到所需要执行某程序的domain下,也就无法做希望的工作了。
在
SELinux系统启动的时候,会加载一个叫做
policy,*
的安全策略权限文件,这文件内中就定义了相关权限。
如果你之前设定了
SELinux
是不能在开机后转回
permissive
模式的话,那你的
则可能无法修改当中的设定!
也就是说root在SELinux中已经不具有默认的所有权限。
那到底这有什么好处呢?
其实好处就如
一样把系统内任何东西都加上一层保护层。
那就算是入侵进入了你的计算机,也只能在他破坏他入侵的这个domain环境!
对于RHEL4系统,如何检测是否已经安装了SELinux呢。
首先检查你的Linux系统的核心是否有支持ACL的功能。
因为Linux系统并不是每一个版本的核心都有支持ACL的功能,而最简单的方法就是检查系统目前的核心能否支持:
#cat/boot/config-2.6.9-11.EL|grepACL
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
注:
config-2.6.9-11.EL位置根据系统的不同而不同,这里用的是RHEL4.1。
此时如果能看到上面的几项则表示已经编译到核心中,ext3文件系统已支持ACL功能,这些功能在编译核心选项中也可以找到。
五.传统Linux
与SELinux
传统Linux的安全认证基于内核的DAC机制,这种机制在遇到一个有缺陷或是恶意编写的程序时就会导致很大的问题出现,尤其是对于setuid/setgid这种权限的设计。
有些程序员在程序设计时,当需要设置执行权限的时候,为了省事就直接用setuidroot,这样的好处是给予程序最大的用户权限root来运行,避免了因权限引起的问题,大大简化程序的设计,但是这种方式是极其危险的。
本文已经提及过,类Unix系统中的root拥有绝对的权限,如果某个有缺陷的程序以root用户运行,可能会破坏系统文件甚至系统核心部分。
如果是网络服务程序,其漏洞很容易被黑客利用并发起攻击,造成不可预知的后果。
SELinux的安全认证基于内核外的MAC机制,这种机制使得系统管理员可以定义整个系统的安全策略,这个策略可以基于其他因素,例如用户的角色、程序的可信性及预期使用、程序将要使用的数据的类型等等,来限制对象所具有的权限。
当你正确配置了SELinux系统,不正常的应用程序只会影响自己权限内的domain,而对其它domain中的对象没有丝毫影响。
其它用户程序的安全性和他们的后台程序仍然可以正常运行,并保持着它们的安全系统结构。
例如你某个服务是以
的权限执行的。
而此服务存在着一个极严重的
bug
,而使得入侵者可以通过这个服务的漏洞进入系统。
但如果你的
Linux
系统有SELinux
保护的话,那么入侵者仍没有办法破坏整个系统,因为它被这个服务所属的
所限制。
但是没有
保护的系统,它就可能因此而入侵整个系统,而产生不可预料的后果。
但是前提是要有好的安全原则,SELinux最麻烦的就是需要配置一个好的Policy才可以让SELinux发挥效果。
制定的太宽松会使SELinux毫无用武之地,而太严格又会让使用者连日常工作都变的麻烦至极。
NSA让制定安全原则的工作由系统地发行者来做,而像Fedora、Redhat、NovellSUSE、Debian、Gentoo等都制定了一套基本的安全原则用于自己的系统。
凭借着SELinux在Linux
上这一个十分重要技术的应用,使其在加强了安全级别,传统的Linux
安全级别一直是
C1
级或
C2
级,和
Windows
服务器的安全级别相同,而
把
的安全级别提升至
B1
级,达到了基本的军事级别。
在RHEL4中,SELinux与一系列因特网服务加以整合,包括BIND、NetworkTimeProtocol(NTP)、Apache等,使得其优点能够更轻易地拓展。
其要求极度安全环境的组织,可以于更多的应用程序上实作更广泛的SELinux功能,甚至为
每一服务制定严格的SELinux原则。
。
比如,传统的Linux系统若遭黑客侵入WebServer,可能导致整个系统的瘫痪;
但有了SELinux的保护,我们可以很容易的建立一个只能在特定程序及特定的安全系络中才能执行的Web服务器,尽管WebServer被入侵,那么他也只能破坏这个WebServer,无法影响到其它的系统区域,将受害范围减至最少。
六.SELinux在RHEL4上的安装
下面对SELinux在RHEL4上的安装过程中加以介绍。
在安装过程中,会出现如图3的画面,询问是否启用SELinux,默认安装选项「Active」。
图2安装时SELinux的选项
这3个选项的不同之处在于:
□已禁用:
停用SELinux功能
□警告:
仅显示警告讯息
□活跃(默认值):
启动SELinux功能
系统是否启用SELinux的设定,记录在/etc/selinux/config文件中(/etc/sysconfig/selinux为此文件的链接),安装完成后,可检查其中的内容,便可得知系统SELinux现在的状态。
文件内容如下:
#ThisfilecontrolsthestateofSELinuxonthesystem.
#SELINUX=cantakeoneofthesethreevalues:
#enforcing-SELinuxsecuritypolicyisenforced.
#permissive-SELinuxprintswarningsinsteadofenforcing.
#disabled-SELinuxisfullydisabled.
SELINUX=enforcing
#SELINUXTYPE=typeofpolicyinuse.Possiblevaluesare:
#targeted-Onlytargetednetworkdaemonsareprotected.
#strict-FullSELinuxprotection.
SELINUXTYPE=targeted
SELINUX参数值:
有「enforcing、permissive、disabled」分别对应安装时的
选项「活跃、警告、已禁用」。
SELINUXTYPE参数值:
有「targeted、strict」两种
SELINUXTYPE=targeted:
保护网络相关服务。
SELINUXTYPE=strict:
完整的保护功能,包含网络服务、一般指令及应用程序
RHEL4目前尚未支持strictpolicy,只提供targetedpolicy,如果您强行的将SELINUXTYPE=targeted改为strict,系统启动时将会出现以下的提示而无法启动。
图3强行修改机制导致无法启动
在/etc/selinux/targeted文件夹中定义的就是targeted属性,它是RHEL4巳定义好的policy,这个targetedpolicy的用途可为保护下列的网络服务:
dhcpd
httpd
mysqld
named
nscd
ntpd
portmap
postgres
snmpd
squid
syslogd
这样,我们的系统便受到了SELinux的保护,但我们知道,通常安全性越高,表示受到限制加多,管理起来也变得更加不方便。
对于我们现在的系统到底有什么样的影响了呢?
你可以发现,很多原本root可任意开启的服务,现今因为受到SELinux控制而无法顺利执行。
在下一章节,笔者会用httpd这个实例来让读者体会启用SELinux会对系统造成什么影响
另外,还有几个基本的SELinux指令:
ls-Z
ps-Z
id-Z
这三个命令的-Z(大写)参数专为SELinux而增加的,可以看到文件,进程和用户的SELinux属性情况.
另外一个重要命令:
chcon,用于改变文件的SELinux属性!
这里就不详细的介绍这些命令的使用了,有兴趣的读者可以查看相关资料。
七:
SELinux对httpd的保护
1、启用SELinux
若读者安装时关闭了SELinux,可再次启动SELinux,点击应用程序—系统设置—安全级别(gnome),勾选即可,或使用命令system-config-securitylevel(如果安装了系统工具对应项),如图4。
其中的强制对应着前边配置文件中的enforcing,亦即安装时的“活跃”,如果不选此项配置文件对应为“permissive”,亦即安装时的“警告”。
图4当前状态
当然,也可以直接修改/etc/selinux/config文件中的内容,把SELINUX参数项设成enforcing即可,然后保存重新开机即可。
重启系统时,读者会发现开机时出现奇怪的错误信息,可看到是关于syslogd启动项失败的提示。
其实这个信息正是因为启动了SELinux而产生的,因为targetedpolicy有针对syslogd的安全控管,所以才会出现这样的提示。
当然如果你启用了其他一些由SELinux控管的服务,亦会出现同样的错误提示。
图5启用SELinux时开机错误提示
2、启动httpd
待开机完成后,请用root身份启动httpddaemon
图6启动httpd失败
出现这样的错误讯息,竟然用root启动httpd也出现权限问题。
读者想
到原因了吗?
对,就是SELinux在作怪!
SELinux默认启用的环境下,root不再具有所有权限了。
下面我们关闭SELinux再试试。
3、停用SELinux,重新启动httpd
可以通过图形界面方式来停用SELinux,位置就在以图形方式启动一样,将启动项勾掉,或修改SELinux设定文件/etc/selinux/config,把SELinux这个参数设成disable(如图),然后重新开机。
图7关闭SELINUX
重启后,我们再次尝试启动httpd,这次便没有任何问题了,如图七。
这样我们便验证了这个问题是由SELinux导致的。
这个问题是很多RHEL4用户遇到的,而往往在论坛中搜到的解决办法就是关闭SELinux,而这里我们要分析一下这里边的原由。
图8成功启动httpd
4.分析:
我们打开安全级别配置看看,展开修改SELinux策略中的HTTPDService,我们会看到其中的DisableSELinuxprotectionforhttpddaemon没有勾选()如图8。
图9SELinux策略
我们也可以使用sestatus命令来查看SELinux的状态:
图10SELinux状态
下面对其中的各项加以注解
SELinuxstatus:
enabled
SELinux启用的状态
SELinuxfsmount:
/selinux
selinuxfs文件系统挂载点
Currentmode:
enforcing
目前SELinux的模式
Modefromconfigfile:
enforcing
目前SELinux模式的设定文件
Policyversion:
18
SELinuxPolicy的版本
Policyfromconfigfile:
targeted
SELinux启用模式的设定文件的名称
Policybooleans:
SELinuxPolicy的布尔值,active即代表为1;
inactive即代表为0。
allow_ypbindactive
dhcpd_disable_transinactive
httpd_disable_transinactive
httpd_enable_cgiactive
httpd_enable_homedirsactive
httpd_ssi_execactive
httpd_tty_comminactive
httpd_unifiedactive
mysqld_disable_transinactive
named_disable_transinactive
named_write_master_zonesinactive
nscd_disable_transinactive
ntpd_disable_transinactive
portmap_disable_transinactive
postgresql_disable_transinactive
snmpd_disable_transinactive
squid_disable_transinactive
syslogd_disable_transinactive
winbind_disable_transinactive
ypbind_disable_transinactive
看其中的httpd_disable_trans项,参数为inactive,即对应上面的DisableSELinuxprotectionforhttpddaemon项。
因此,当我们把这项更改为active后再启动httpd便一切正常了。
作者简介:
李天越,曾任职于美国Ogilvy(奥美)高级客户主任助理、美国honeywell网站项目经理、美国Steeleye高级系统工程师,UPGloble中国区CIO,现任职于中国移动通信联合会。
msn:
li_tianyue@