一、引言
SELinux的全称是SecurityEnhancedLinux,是由英国国家安全部NationalSecurityAgency领导开发的GPL项目,于2001年3月发布,它是在Linux内核实现了灵活的和细细度的非自主存取控制,并就能灵活地支持多种安全策略。SELinux的最初实现方式是作为一个特殊的核心补丁。SELinux致力提升Linux的安全性,提供健壮的安全保证,可防御一些功击。SELinux是2.6版本的Linux内核中提供的强制访问控制(MAC)系统。SELinux系统比起一般的Linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,虽然遭到功击,进程或则用户权限被夺去qq linux,也不会对整个系统引起重大影响。
本文档详尽介绍了传统Linux的安全性,SELinux的诞生及技术背景,并结合大量实践,使一个没有接触过SELinux的Linux爱好者才能在看完本篇文档然后,迅速把握基本的SELinux知识,迅速学习因为SELinux造成的操作系统错误调试技能。而且,本篇文档防止大量专业技术词汇,使用浅显易懂的语言描述,是理论和实践最佳结合文档。
二、理论篇2.1传统Linux的不足
1.存在特权用户root
任何人只要得到root的权限,对于整个系统都可以为所欲为。
2.对于文件的访问权的界定不够细
在linux系统里,对于文件的操作,只有“所有者”,“所有者同组人”,“其他人”这3类的界定。对于“其他人”这一类里的用户难以再界定。
3.SUID程序的权限升级
假如设置SUID权限的程序有漏洞,很容易被功击者所借助。
4.DAC(DiscretionaryAccessControl)问题
文件目录的所有者可以对文件进行所有的操作,这给系统整体的管理带来不便。
2.2SELinux的诞生及技术背景
SELinux的全称是SecurityEnhancedLinux,是由英国国家安全部NationalSecurityAgency领导开发的GPL项目,于2001年3月发布linux系统安全级别linux系统安全级别,它是在Linux内核实现了灵活的和细细度的非自主存取控制,并就能灵活地支持多种安全策略。SELinux的最初实现方式是作为一个特殊的核心补丁。SELinux致力提升Linux的安全性,提供健壮的安全保证,可防御一些功击。SELinux是2.6版本的Linux内核中提供的强制访问控制(MAC)系统。SELinux系统比起一般的Linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,虽然遭到功击,进程或则用户权限被夺去,也不会对整个系统引起重大影响。
SELinux的安全体系结构为Flask,安全策略和通用插口一起封装在独立于操作系统的组件中。Flask分为两部份组成,策略policy和施行enforcement,策略封装在安全服务器中,施行由对象管理器具体执行。系统内核的对象管理器执行系统的具体操作,当须要对安全性进行判别时,向安全服务器提出恳求。对象管理器只关心SID。恳求抵达安全服务器后,实现与安全上下文securitycontext的映射并进行估算,之后将决定的结果返回给对象管理器。
系统中关于安全的恳求和决定有3种情况:
1、标签确定Labelingdecision:确定一个新的主体或客体采用安全标签;
2、存取决策accessdecision:确定主体是否能访问客体的某种服务;
3、多实例决策polyinstantiationdecision:确定一个进程在访问某个polyinstantiation客体时,可不可以转为另一个进程。
下边是SELinux安全体系结布光:图1
安全服务器是内核的子系统,用于实现对策略的封装并提供通用插口。SELinux的安全服务器实现了一种混和的安全性策略,包括类型施行typeenforcement,基于角色的访问控制role-basedaccesscontrol和可选的多级别安全性optionalmultilevelsecurity.该策略由另一个称为checkpolicy的程序编译,它由安全性服务器在引导时读取,生成/ss_policy.这意味着安全性策略在每次系统引导时就会有所不同,事实上策略甚至可以通过使用security_load_policy插口在系统操作期间修改。
Flask结构提供访问向量缓存AVC模块,容许对象管理器缓存访问向量,降低整体性能的耗损。在每次进行安全检测的时侯,系统首先检测储存在AVC中的访问向量,假如存在次访问向量,则直接返回在AVC中的访问向量;否则,向安全服务器提出查询申请,在安全服务器中依据主客体的SID及相应的类,针对相关的安全策略对恳求进行检测,之后返回相应的访问向量,并把此访问向量储存在AVC中。
Flask有两个用于安全性标签并且与安全策略无关的数据类型:安全性上下文securitycontext和安全性标示SID。安全性上下文是表示安全性标签的变长字符串,由用户、角色、类型和可选MLS范围几部份组成,如:
xxx_u:xxx_r:xxx_t:MLS
安全性标示SID是由安全服务器映射到安全上下文的一个整数。SID作为实际上下文的简单句柄服务于系统,只能由安全服务器解释。Flask通过称为对象管理器的构造执行实际的系统绑定。它们处理SID和安全上下文,不涉及安全上下文的属性。任何格式上的修改都不应当对对象管理器进行修改。
通常来说,对象管理器根据主体和客体的SID和对象的类来查询安全服务器,目的在于获得访问决定--访问向量。类时标示对象是哪一种类(比如:常规文件、目录、进程、UNIX域套接字还是TCP套接字)的整数。访问向量中的许可权一般由对象可以支持服务和施行的安全性策略定义,但是访问向量许可权基于类来加以解释,由于不同种类的对象有不同服务。向量可以高速缓存在访问向量高速缓存中,以可以和对象一起储存,这样对象管理器就毋须被这些早已执行的决策的恳求淹没。
SELinux系统中的每位主体都有一个域domain,每位客体都有一个类型type。策略的配置决定对类型的存取是否被准许,以及一个域能够转移到另一个域等。类型的概念应用到应用程序中时,可以决定是否可以由域执行;每位类型被执行时,可以从一个域跳转到另一个。这就保证了每位应用属于它们自己的域,避免恶意程序进行破坏。
角色也在配置中进行了定义,每位进程都有一个与之相关的角色:系统进程以system_r角色运行,而用户可以使user_r或sysadmin_r。配置还枚举了可以由角色输入的域。假定用户执行一个程序foobar.通过执行它,用户转移到user_foobar_t域。该域可能只包含一小部份与该用户初始登录相关的user_t域中的许可权。
安全策略配置目标包括控制对数据的原始访问、保护内核和系统软件的完整性、防止有特权的进程执行危险的代码,以及限制由有特权的进程缺陷所造成的伤害。
策略可依照策略文件灵活生成,SELinux中的策略定义十分广泛、灵活。客体的类型定义有:security,device,file,procfs,devpts,nfs,network;主体的域的策略定义有admin,program,system,user。策略是由策略语言来世成的,这个生成过程对用户来说是透明的,SELinux系统中采用m4宏处理语言作为系统策略语言。
三、实践篇3.1RHEL启用及停止SELinux服务
在RedHatEnterpriseLinux缩写RHEL上使用以下命令启用SELinux:
编辑/etc/selinux/config文件,找到句子“SELINUX=disabled”,改为“SELINUX=enforcing”,操作系统重新启动后生效。
在RedHatEnterpriseLinux上使用以下命令停止SELinux:
编辑/etc/selinux/config文件,找到句子“SELINUX=enforcing”,改为“SELINUX=disabled”,操作系统重新启动后生效。
3.2SELinux配置文件及目录解读
下边是/etc/selinux/config文件内容屏幕截图:图2
SELINUX参数值:
enforcing:强制执行SELinux功能;
permissive:只显示警告信息;
disabled:停用SELinux功能。
SELINUXTYPE参数值:
targeted:保护网路相关服务;
strict:完整的保护功能,包括网路服务、一般指令、应用程序。
RHEL目前并不支持strict策略,只支持targeted策略。
SELinux检测方法是独立于传统的使用者的权限,用户必须同时符合使用者的权限和SELinux的权限能够顺利执行操作。SELinux须要一个好的Policy能够发挥最好的疗效,策略太修身会使SELinux毫无益处,太严格又会使系统管理处处麻烦,有些时侯系统服务配置不成功,以为是配置文件弄错了,却不晓得是SELinux限制的问题,虽然配置文件并没有弄错。原先root可以任意重新启动个别服务,并且启用SELinux后,因为SELinux的控制而未能顺利进行。英国国家安全局将安全策略的拟定交由Linux的发行商来做,Redhat自己定制了一套基本的策略。targeted策略是RHEL早已定义好的策略,它保护的系统服务一共是25个,包括ypbind,dhcpd,httpd,mysqld,named,nscd,ntpd,pegasus,portmap,postgresql,snmpd,squid,syslogd,winbind,use_nfs_home_dirs等。
Targetedpolicy的内容在/etc/selinux/targeted/目录下,包括三个文件:booleans,contexts,policy
booleans:储存targetedpolicy中每位限制的布尔值;
contexts/:储存targetedpolicy中的securitycontexts;
policy/:储存二补码policy.包含policy.18文件。
查看和更改/etc/selinux/targeted/booleans文件命令:getsebool,setsebool.
Getsebool:
[root@hacker ~]# getsebool dhcpd_disable_trans
dhcpd_disable_trans --> inactive
Setsebool:
[root@hacker ~]# setsebool httpd_disable_trans=1
[root@hacker ~]# getsebool httpd_disable_trans
httpd_disable_trans --> active
[root@hacker ~]# grep httpd_disable_trans /etc/selinux/targeted/booleans
httpd_disable_trans=0 #不改变booleans文件的内容
[root@hacker ~]# setsebool -P httpd_disable_trans=1
[root@hacker ~]# getsebool httpd_disable_trans
httpd_disable_trans --> active
[root@hacker ~]# grep httpd_disable_trans /etc/selinux/targeted/booleans
httpd_disable_trans=1 #改变booleans文件的内容
右图是/etc/selinux/targeted/booleans文件内容:图3
图3:/etc/selinux/targeted/booleans文件内容
RHEL提供图形管理工具命令:system-config-securitylevel来查询和修改booleans值。
[root@hacker ~]# startx #进入图形模式
在图形模式下运行一个console,在console中输入以下命令:system-config-securitylevelkali linux,打开SecurityLevelConfiguration,选择SELinux标签,在纯console模式下,输入以下命令:system-config-securitylevel时和在图形模式下显示的窗口内容不一样。
下边是图形模式下SecurityLevelConfiguration窗口SELinux标签内容:图4,图5,图6,图7。
图4:图形模式下SecurityLevelConfiguration窗口SELinux标签内容
图5:图形模式下SecurityLevelConfiguration窗口SELinux标签内容续
图6:图形模式下SecurityLevelConfiguration窗口SELinux标签内容续
图7:图形模式下SecurityLevelConfiguration窗口SELinux标签内容续
下边是/etc/selinux/targeted/目录结布光:图8
图8:/etc/selinux/targeted/目录结布光
用户可以使用sestatus命令检测SELinux的状态,
SELinuxstatus:enabledSELinux的状态
SELinuxfsmount:/selinuxselinuxfs装载点
Currentmode:enforcing当前SELinux模式
Modefromconfigfile:enforcingSELinux模式配置文件设定
Policyversion:18SELinuxPolicy版本
Policyfromconfigfile:targetedSELinux模式配置文件设定
Policybooleans:active表示1,inactive表示0。
下边是sestatus命令执行截图:图9,图10
图9:sestatus命令执行截图1
图10:sestatus命令执行截图2
3.3SELinux常用命令
ls -Z
ps -Z
id -Z
分别可以看见文件,进程和用户的SELinux属性。
chcon改变文件的SELinux属性。
getenforce/setenforce查看和设置SELinux的当前工作模式。
restorecon当这个文件在策略里有定义是,可以恢复原先的文件标签。
setfiles跟chcon一样可以修改一部份文件的标签,不须要对整个文件系统重新设定标签。
fixfiles通常是对整个文件系统的,前面通常跟relabel,对整个系统relabel后,通常笔者们都重新启动。假如,在根目录下有.autorelabel空文件的话,每次重新启动时都调用fixfilesrelabel。
star就是tar在SELinux下的互换命令,能把文件的标签也一起备份上去。
cp-Z可以跟-Z,--context=CONTEXT在拷贝的时侯指定目的地文件的securitycontext。
find可以跟-context查特定的type的文件。
run_init在sysadm_t里自动启动一些如Apache之类的程序,也可以让它正常进行。
newrole-rsyadm_r加入新的角色。
audit2allow很重要的一个以python写的命令,主要拿来处理日志,把日志中的违背策略的动作的记录,转换成accessvector,对开发安全策略特别有用。
checkmodule-m-olocal.modlocal.te编译模块。
semodule_package创建新的模块。
semodule可以显示,加载,删掉模块。
semanage这是一个功能强悍的策略管理工具,有了它虽然没有策略的源代码,也是可以管理安全策略的。
3.4PUREFTP服务配置错误缘由及剖析
在RHEL上,笔者使用pure-ftpd作为FTP服务器软件,pure-ftpd通过pureftp进行管理,基于apache服务,mysql服务,pureftp使用PHP开发。
Apache服务配置,不再本文讨论问题之内,略过;
mysql服务配置,不再本文讨论问题之内,略过;
Php运行环境配置,不再本文讨论问题之内,略过;
Pure-ftpd服务的配置,不再本文讨论问题之内,略过;
Zendoptimizer的安装及配置:
pure-ftpd虚拟用户管理软件pureftp使用PHP开发,且其PHP源代码由ZendEncode加密,须要安装Zendoptimizer能够执行pureftp加密的PHP程序。
#tar zxvf ZendOptimizer-2.5.10a-linux-glibc21-i386.tar.gz
#cd ZendOptimizer-2.5.10a-linux-glibc21-i386
#./install.Sh
其他步骤略;
因为开启了SELinux功能,Zendoptimizer安装完成并启动apache服务时,系统会报错。
缘由及剖析:
Zendoptimizer在安装时须要更改/etc/php.ini的内容,并将该文件替换成一个符号链接文件,指向/usr/local/zend/etc/php.Ini,所以导致apache每次启动时都违背了SELinux的规则而出错。解决方式为使用下边的命令设置相关文件的安全属性:
#rm -f /etc/php.ini
#cp /usr/local/Zend/etc/php.ini /etc/
#chcon -u system_u /etc/php.ini
#更改文件的标签
#chcon -t shlib_t /usr/local/Zend/lib/ZendExtensionManager.so
#chcon -t shlib_t /usr/local/Zend/lib/Optimizer-2.5.10/php-4.3.x/ZendOptimizer.so
3.5RHEL操作系统启动错误缘由及剖析
假如在安装RHEL时没有启用SELinux,在安装完成后启用SELinux,当系统重新启动时,显示syslogd及portmap错误信息,
缘由及剖析:
虽然这种信息是由于启动SELinux而形成的,由于targetedpolicy有针对这两个daemon的安全管控。
3.6apache启动失败缘由及剖析