Android系统开发交流群:484966421 OSHome。
微信公众号:oshome2015
一.简介
SELinux全称是Security Enhanced Linux,由美国国家安全部(National Security Agency)领导开发的GPL项目,它拥有一个灵活而强制性的访问控制结构,旨在提高Linux系统的安全性,提供强健的安全保证,可防御未知攻击,相当于B1级的军事安全性能。比MS NT的C2等高得多。
SELinux起源于自1980开始的微内核和操作系统安全的研究,这两条研究线路最后形成了一个叫做的分布式信任计算机(Distribute Trusted Mach (DTMach))的项目,它融合了早期研究项目的成果(LOCK【锁】,它包含一组安全内核类型强制;Trusted Mach【信任计算机】,它将多层安全控制合并到计算机微内核中)。美国国家安全局的研究组织参加了DTMach项目,付出了巨大努力,并且继续参与了大量的后续安全微内核项目。最终,这些工作和努力导致了一个新的项目产生,那就是Flask,它支持更丰富的动态类型的强制机制。
由于不同平台对这这项技术没有广泛使用,NAS认为需要在大量的社团中展示这个技术,以说明它的持久生命力,并收集广泛的使用支持意见。在1999年夏天,NSA开始在Linux内核中实现Flask安全架构,在2000年十二月,NSA发布了这项研究的第一个公共版本,叫做安全增强的Linux。因为是在主流的操作系统中实现的,所以SELinux开始受到Linux社区的注意,SELinux最迟是在2.2.x内核中以一套内核补丁的形式发布的。
随着2001年Linux内核高级会议在加拿大渥太华顺利召开,Linux安全模型(LSM[7])项目开始为Linux内核创建灵活的框架,允许不同的安全扩展添加到Linux中。NSA和SELinux社区是SELinux的主要贡献者,SELinux帮助LSM实现了大量的需求,为了与LSM一起工作,NSA开始修改SELinux使用LSM框架。2002年八月LSM核心特性被集成到Linux内核主线,同时被合并到Linux 2.6内核。2003年八月,NSA在开源社区的帮助下,完成了SELinux到LSM框架的迁移,至此,SELinux进入Linux 2.6内核主线,SELinux已经成为一种全功能的LSM模块,包括在核心Linux代码集中。
数个Linux发行版开始在2.6内核中不同程度使用SELinux特性,但最主要是靠Red Hat发起的Fedora Core项目才使SELinux具备企业级应用能力,NSA和Red Hat开始联合集成SELinux,将其作为Fedora Core Linux发行版的一部分。在Red Hat参与之前,SELinux总是作为一个附加的软件包,需要专家级任务才能进行集成。Red Hat开始采取行动让SELinux成为主流发行版的一部分,完成了用户空间工具和服务的修改,默认开启增强的安全保护。从Fedora Core 2开始,SELinux和它的支持基础架构以及工具得到改进。在2005年早些时候,Red Hat发布了它的Enterprise Linux 4(REL 4),在这个版本中,SELinux默认就是完全开启的,SELinux和强制访问控制已经进入了主流操作系统和市场。
SELinux仍然是一个相对较新和复杂的技术,重要的研究和开发在继续不断地改进它的功能。
应用SELinux后,可以减轻恶意攻击或恶意软件带来的灾难,并提供对机密性和完整性有很高要求的信息很高的安全保障。普通Linux安全和传统Unix系统一样,基于自主存取控制方法,即DAC,只要符合规定的权限,如规定的所有者和文件属性等,就可存取资源。在传统的安全机制下,一些通过setuid/setgid的程序就产生了严重安全隐患,甚至一些错误的配置就可引发巨大的漏洞,被轻易攻击。
而SELinux则基于强制存取控制方法,即MAC,透过强制性的安全策略,应用程序或用户必须同时符合DAC及对应SELinux的MAC才能进行正常操作,否则都将遭到拒绝或失败,而这些问题将不会影响其他正常运作的程序和应用,并保持它们的安全系统结构。
二.Selinux管理配置
1. Selinux控制规则及相关概念
1.1.DAC(自主存取控制)依据程序运行时的身份决定权限,是大部分操作系统的权限存取控制方式。也就是依据文件的own,group,other/r,w,x权限进行限制。Root有最高权限无法限制。r,w,x权限划分太粗糙。无法针对不同的进程实现限制。
1.2.MAC(强制存取控制)依据条件决定是否有存取权限。可以规范个别细致的项目进行存取控制,提供完整的彻底化规范限制。可以对文件,目录,网络,套接字等进行规范,所有动作必须先得到DAC授权,然后得到MAC授权才可以存取。
1.3.TE(类型强制)所有操作系统访问控制都是以关联的客体和主体的某种类型的访问控制属性为基础的。在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯通道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。Selinux对一些命令做了修改.ls –Z ps –Zaux id –Z
例如:[root@localhost ~]# id -Z
root:system_r:unconfined_t:SystemLow-SystemHigh
注:这里的第四部分SystemLow-SystemHigh为安全上下文的扩展属性在后面会有介绍。
在SELinux中,访问控制属性总是安全上下文三人组形式,所有客体和主体都有一个关联的安全上下文, 因为SELinux的主要访问控制特性是类型强制,安全上下文中的类型标识符决定了访问权。如上例中unconfined_t决定访问权限。
1.3.1.安全上下文:安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),"域"和"域类型"意思都是一个.
1.3.2.类型:安全上下文中的用户和角色标识符除了对强制有一点约束之外对类型强制访问控制策略没什么影响,对于进程,用户和角色标识符显得更有意义,因为它们用于控制类型和用户标识符的联合体,这样就会Linux用户账号关联起来;然而,对于客体,用户和角色标识符几乎很少使用,为了规范管理,客体的角色常常是object_r,客体的用户常常是创建客体的进程的用户标识符,它们在访问控制上没什么作用。
用一个例子来解释以上概念:
假如我们设定 1.httpd这个进程使用httpd_t这个域类型运行.
2.将httpd进程使用的端口标记为httpd_port_t类型.
3.将网页目录标记为httpd_sys_content_t类型.
4.限制以httpd_t域运行的httpd程序只能监听httpd_port_t类型的端口,并限制此域的进程只能存取标记为httpd_sys_content_t的网页文件。
1.4.RBAC(基于角色的访问控制)
SELinux提供了一种依赖于类型强制(TE)基于角色的访问控制(RBAC),角色用于组域类型和限制域类型与用户之间的关系,SELinux中的用户关联一个或多个角色,使用角色和用户,RBAC特性允许有效地定义和管理最终授予Linux用户的特权。
注:组域类型指的是将多个域类型关联到一个角色。
SELinux中的角色和用户构成了它的RBAC特性的基础, SELinux中的访问权不是直接授予用户或角色的,角色扮演的是类型强制的一个支持特性,它和用户一起为Linux用户及其允许允许的程序提供了一种绑定基于类型的访问控制,SELinux中的RBAC通过定义域类型和用户之间的关系对类型强制做了更多限制,以控制Linux用户的特权和访问许可,RBAC没有允许访问权,在SELinux中,所有的允许访问权都是由类型强制提供的。
警告:Linux和SELinux有它们自己的用户标识符,如/etc/passwd中定义的用户,那就是"Linux用户"来,SElinux指的是SELinux策略中在安全上下文中定义的用户标识符。
SELinux中的RBAC特性依赖并支持TE特性,我们通过将域类型和一个或多个角色进行关联,而不是直接将权限授给用户,RBAC通过在安全上下文中控制域类型、角色和用户的关联实现对TE策略更多的约束,也就是说,域转换是受用户的角色约束的,最终约束了用户的总体权限。我们不会直接将域类型和用户进行关联,相反,域类型是与角色进行关联的,然后再将角色与SELinux用户进行关联,这就间接增加了两个效果,首先,他简化了管理所有策略的复杂度,一个系统可能只有三或四个角色,但有成千上万的用户和域类型,直接将域类型与用户进行关联,将会导致管理非常困难,将域类型分配给一小撮描述类型(如普通用户域类型)特权集的角色,然后将这些橘色指派给用户,这样就更容易管理了。
SELinux中的角色也允许我们限制用户的访问,对于任何进程,同一时间只有一个角色(即进程安全上下文中的角色)是"活动的",因为域类型是与角色进行关联的,域转换就会受到与它们关联的活动角色的限制了。
限制域转换只对当前活动的角色有效,允许用户关联更多的角色,不会获得所有角色访问权的并集,例如:我们可以将一个用户与系统管理角色和受限的普通用户角色进行关联,在后面进行交互时将会使用普通用户角色,而不是管理角色,在常规使用过程中,普通用户角色将会被激活,阻止访问权授予管理域类型,仅当必需执行系统管理任务时激活管理角色(即通过域转换改变),这与标准Linux下使用普通账户切换到root账户进行系统管理非常类似,但比准Linux方式更精细。
关键要记住角色仅仅是一套域类型的集合,他可以方便地与用户建立联系,它们不是SELinux中独立的访问控制机制。
简单一点说就是,我们可以制定很多角色指定不同的权限规范,那样就可以规范不同的用户又不同的角色,只有切换到特定的角色才有特定的存取权限。对于用户来说,被划分成一些role,即使是ROOT用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。因为,那些role可以执行那些domain也是在策略里设定的。role也是可以迁移的,但是也只能按策略规定的迁移。
1.5.DT(域类型转换)
域类型转换可以实现权限的扩展或者缩小,防止权限升级。例如:A进程运行在A_t域中,B进程运行在B_t域中。当以A_t运行B进程的时候可以规范B进程是要沿用A_t环境呢,还是继承自己的B_t环境。
举个例子进行说明:
1.5.1.环境介绍.察看当前用户的类型,vsftpd启动脚本的类型以及vsftpd执行程序的类型.
[root@localhost ~]# id -Z
user_u:system_r:unconfined_t
[root@localhost ~]# ls -Z /etc/init.d/vsftpd
-rwxr-xr-x root root system_u:object_r:initrc_exec_t /etc/init.d/vsftpd
[root@localhost ~]# ls /usr/sbin/vsftpd -Z
-rwxr-xr-x root root system_u:object_r:ftpd_exec_t /usr/sbin/vsftpd
1.5.2.selinux策略文件里的定义如下:
type_transition unconfined_t initrc_exec_t:process initrc_t
这条定义了以类型为unconfined_t身份执行类型为initrc_t的文件时进程的类型转换为initrc_t.
type_transition initrc_t ftpd_exec_t:process ftpd_t
这条定义了以类型为initrc_t身份执行类型为ftpd_exec_t文件时进程类型转换为ftp_t.
1.5.3.整个运行流程如下:
1.5.3.1.类型为unconfined_t的进程执行类型为initrc_exec_t类型的/etc/init.d/vsftpd文件,根据策略规定执行中的进程运行在initrc_t域中.
1.5.3.2.在initrc_t域中运行的进程会执行类型为ftpd_exec_t的/usr/sbin/vsftpd程序,根据策略文件的规定,/usr/sbin/vsftpd程序会在ftp_t域中运行.
1.5.3.3.最后我们就可以规范ftp_t类型可以存取的类型来限制ftp服务器.
1.5.3.4.小结
1.5.3.4.1./etc/init.d目录下所有文件的类型为initrc_exec_t
1.5.3.4.2.在selinux策略中定义了只能使用/etc/init.d目录下的脚本来启动服务.
1.5.3.4.3.启动的服务会进行类型转换而受到selinux策略里的环境而规范.
1.6.Selinux配置文件及设定
1.6.1.Selinux配置文件主目录是/etc/selinux
[root@localhost targeted]# ls /etc/selinux/
config mls restorecond.conf semanage.conf strict targeted
1.6.1.1.使用config文件来配置selinux
SELINUX=enforcing
#此项定义selinux状态。
#enforcing—是强制模式系统受selinux保护。
#permissive—是提示模式系统不会受到selinux保护,只是收到警告信息。
#disabled—禁用selinux。
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted
#此项定义selinux使用哪个策略模块保护系统。
#targeted—小红帽开发的策略,只对apache ,sendmail, bind,postgresql等网络服务保护,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整体进行保护。
# Strict,是NAS开发的,能对整个系统进行保护,但是设定复杂。
#mls,是一个较新的安全策略。
#以上三种策略配置都放置在/etc/selinux目录中,目录和策略名称相同。
1.6.2.targeted目录是targeted策略配置目录,contexts/子目录包括了许多帮助系统服务和实用程序管理文件安全上下文标记的大量文件,它们也包括登陆进程的默认安全上下文,通常,这些文件只应该由策略开发人员修改,但管理员可能偶尔也需要修改一下,下面列出这些文件的主要用途,你也可以略过这个部分的阅读。
1.6.2.1.contexts/customizable_types:包括一列当使用restorecon或setfiles实用程序修复文件标记问题时不会被重新标记的类型,这个特性在帮助保护某些文件标记时特别有用,使用SELinux应用程序接口(API)检查上下文是否自定义的是is_context_customizable(3)。
1.6.2.2.contexts/default_contexts:在初始登陆过程中,用户可能登陆会话可能不止得到一个角色/类型组授权,如管理员就可以以特权用户和非特权用户登陆,这个文件提供了一个方法决定初始登陆使用哪个登陆进程(login,ssh等)作为默认的角色/类型组。
注意,如果有contexts/users/[USER]文件的话,这些默认值可能会被一个特殊用户覆盖。
1.6.2.3.contexts/users/[USER]:这个文件和default_contexts文件的格式一样,除了default_contexts是为一个特殊用户设计的外,如果某个用户的文件已经存在,默认的角色/类型组由该文件的第一个决定。
1.6.2.4.contexts/failsafe_context:如果登陆进程不能决定用户的默认安全上下文,用户将不能登陆进系统,这和default_contexts文件被破坏会改变非常类似,这个文件提供了一个合理的安全上下文故障自动转移机制,至少允许管理员登陆,它提供最后的登陆进程失败前使用的默认安全上下文,通常是:
sysadm_r:sysadm_t
这样的话,至少管理员可以登陆。
1.6.2.5.contexts/default_type:这个文件包括一列实用程序(如newrole)使用的角色/类型组,如果我们使用newrole修改我们的角色,但不指定类型,实用程序将会咨询这个文件以确定默认的类型和角色,如果我们使用命令newrole -r sysadm_r,而且这个文件有一行的内容为sysadm_r:sysadm_t,这个命令将会尝试使用sysadm_t作为我们的默认用户域类型。
1.6.2.6.contexts/files/file_contexts:这个文件包括与文件有关的安全上下文标记信息,作为策略构建过程的一部分,为与文件有关的客体使用初始化安全上下文,它安装在这里帮助实用程序修复标记问题。
1.6.2.7.contexts/files/file_ contexts.home_dirs:这个文件是使用/usr/sbin/genhomedircon脚本自动生成的,它的格式与file_contexts一致,但它只用于标记用户home目录。
1.6.2.8.contexts/files/homedir_template:这个文件包括一个/usr/sbin/genhomedircon脚本使用它产生标记块的模板。
1.6.2.9.contexts/files/media:这个文件包括挂载在/media/目录下的存储设备的安全上下文,通过libselinux matchmediacon(3) API使用它。
1.6.2.10.contexts/initrc_context:这个文件包括一个角色/类型组,用于run_init的安全上下文,即管理员以init相同的方式启动系统服务,这样它就可以执行由init初始化的存储在/etc/rc.d/目录下的脚本,这个角色/类型组通常和init用来启动系统服务的角色/类型组一致
1.6.2.11.contexts/removable_context:这个文件包括可移动媒体设备的默认安全上下文,这个安全上下文用于media上下文文件没有标记的设备
1.6.3.检查selinux策略相关命令
1.6.3.1.seinfo
1.6.3.2.sesearch –a
1.6.3.3.sesearch –a –t ftpd_t
1.6.4.设置selinux相关命令
1.6.4.1.sestatus 查询selinux工作状态
[root@localhost selinux]# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 21
Policy from config file: targeted
1.6.4.2.selinuxenabled检查selinux是否开启,配合echo $?.传回值是0为开启,1为关闭.
[root@localhost selinux]# selinuxenabled
[root@localhost selinux]# echo $?
0
1.6.4.3.setenforce设定selinux运行状态,1开启,0关闭.
[root@localhost selinux]# setenforce 1
1.6.4.4.selinux的boolean值.selinux策略中定义许多boolean值,用户自定义要让selinux开启保护某些程序,或者是关闭对某些程序,程序中的某个项目的保护.目录位置/selinux/boolean/下相关文件.
1.6.4.4.1.查看boolean值
[root@localhost ~]# getsebool -a
[root@localhost ~]# getsebool -a | grep ftp
1.6.4.4.2.设置boolean值,-P为设置永久生效.
[root@localhost ~]# setsebool ftpd_disable_trans off
[root@localhost ~]# setsebool -P ftpd_disable_trans off
注:不建议使用setsebool -P ftpd_disable_trans off,这样会让ftp服务器失去selinux保护.
试验1:启动vsftp服务器后以本地帐户登陆服务器,你是否看到本地帐号不能切换到家目录的出错信息?使用以下命令允许本地帐户进入家目录.(off是禁止本地帐户切换到家目录)
[root@localhost ~]# setsebool -P ftp_home_dir on
1.6.5.查看安全上下文相关命令
1.6.5.1.查看用户安全上下文,下面是普通用户和超级用户的安全上下文,从第一个字段一次为用户标识,角色,域类型.超级用户的第四字段为扩展的MLS或 MCS.(见附录)
tomyang@localhost ~]$ id -Z
user_u:system_r:unconfined_t
[root@localhost ~]# id -Z
root:system_r:unconfined_t:SystemLow-SystemHigh
1.6.5.2.查看文件安全上下文
[onlyc@localhost ~]$ ls -Z /home/onlyc/
drwxr-xr-x onlyc onlyc user_u:object_r:user_home_t Desktop
1.6.5.3.查看进程的安全上下文
user_u:system_r:ftpd_t 7950 ? Ss 0:00 /usr/sbin/vsftpd
1.6.6.认识安全上下文,安全上下文以用户:角色:类型(域)的形式出现.(这里的用户指的是selinu用户)
1.6.6.1.用户:root表示root帐号身份,user_u表示普通无特权用户(一般用户),system_u表示系统进程.通过用户可以确认身份类型,一般搭配角色使用,身份和不同的角色搭配时权限不同.帐户之间切换时此用户身份不变.但是在targeted策略环境下用户标识没有实质作用.
1.6.6.2.角色:object_r一般为文件目录的角色,system_r一般为进程的角色.在targeted策略环境中用户的角色一般为system_r.在strict策略中用户的角色被细分为sysadm_r,system_r,user_r,staff_r角色.用户的角色类似组的概念,不同的角色具有不同的身份权限.一个用户可以具备多个角色,但是同一时间只能使用一个角色.但是在targeted策略环境下角色没有实质作用.在targeted策略环境中所有的进程文件的角色都是system_r角色.在strict策略环境中,一般用户登录时角色是user_r,root登陆时角色是staff_r,但是没有特权,切换到sysadm_r角色才具备超级用户的权限.只有staff_r角色可以切换成sysadm_r角色.
1.6.6.3.类型(进程的类型又可以称为域):文件和进程都有一个类型,seliunx依据类型的相关组合来限制存取权限.
1.6.7.更改安全上下文
1.6.7.1.chcon [-u –r -t] 如果此命令应用于目录上,则以后再此目录建立的文件都会继承目录的类型.
[root@localhost html]# ls -Z
-rw-r--r-- root root user_u:object_r:home_root_t index.html
[root@localhost html]# chcon -t httpd_sys_content_t index.html
[root@localhost html]# ls -Z
-rw-r--r-- root root user_u:object_r:httpd_sys_content_t index.html
也可以这样做
[root@localhost html]# ls -Z
-rw-r--r-- root root user_u:object_r:home_root_t index.html
[root@localhost html]# chcon --reference=/var/www/html index.html
[root@localhost html]# ls -Z
-rw-r--r-- root root system_u:object_r:httpd_sys_content_t index.html
试验1:启动ftp服务器,在服务器上打开匿名用户上传权限,并给目录可写权限,以匿名帐户登陆服务器看匿名帐户能否上传文件?selinux策略默认是不允许匿名用户上传文件的.
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES
[root@localhost ~]# mkdir /var/ftp/upload
[root@localhost ftp]# chmod 1777 upload/
[root@localhost ftp]# ls -Z
drwxrwxrwt root root user_u:object_r:public_content_t upload
[root@localhost ftp]# lftp ftp@localhost
Password:
lftp ftp@localhost:~> cd upload/
cd ok, cwd=/upload
lftp ftp@localhost:/upload> ls
lftp ftp@localhost:/upload> put /root/install.log
put: Access failed: 553 Could not create file. (install.log)
现在使用以下命令允许匿名帐户可以上传文件
[root@localhost ftp]# chcon -t public_content_rw_t upload/
[root@localhost ftp]# ls -Z
drwxrwxrwt root root system_u:object_r:public_content_t pub
drwxrwxrwt root root user_u:object_r:public_content_rw_t upload
[root@localhost ftp]# lftp ftp@localhost
Password:
lftp ftp@localhost:~> cd upload/
cd ok, cwd=/upload
lftp ftp@localhost:/upload> put /root/install.log
27019 bytes transferred
1.6.7.2.restorecon [-r -F]恢复文件安全上下文的默认值,-r递归 –F强制.默认值在/etc/selinux/targeted/contexts/files/file_contexts文件中定义.
[root@localhost www]# ls -Z
drwxr-xr-x root root system_u:object_r:etc_t html
[root@localhost www]# restorecon html
[root@localhost www]# ls -Z
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t html
1.6.7.3. fixfiles一般是对整个文件系统根据/etc/selinux/targeted/contexts/files定义的进行修复, 后面一般跟 relabel,对整个系统 relabel后,一般我们都重新启动。如果,在根目录下有.autorelabel空文件的话,每次重新启动时都调用 fixfiles relabel.下面介绍三种用法.
check:显示所有与文件上下文文件中安全上下文不匹配的与文件有关的客体。
restore:重新标记那些与文件上下文文件的安全上下文不匹配的与文件有关的客体的安全上下文。
relabel:和restore一样,但它也可以首先从/tmp目录中移除文件。
[root@localhost www]# fixfiles –F relabel /
[root@localhost www]# fixfiles restore /etc/
[root@localhost www]# fixfiles check /etc/
1.6.8.所有的selinux信息都会记录到. /var/log/messages文件中
1.6.8.1.sealert –l 可以察看详细的消息
[root@localhost ~]#cat /var/log/messages
Mar 7 08:07:07 localhost setroubleshoot: SELinux is preventing restorecon (restorecon_t) "write" to /var/www/system_u:object_r:httpd_sys_content_t:s0 (httpd_sys_content_t). For complete SELinux messages.run sealert -l c836e80e-8e05-4d63-a871-3dee9f86a01f
[root@localhost ~]# sealert -l c836e80e-8e05-4d63-a871-3dee9f86a01f
1.6.8.2.GUI界面
1.6.9.GUI界面的selinux管理工具
1.6.9.1.使用GUI管理工具修改boolean值
Admin
在 Admin 类下,你可以允许系统使用未分配的终端(ttys),允许对 root 目录进行写操作,从非标准位置读取文件,禁止任何进程加载内核模块,禁止任何对 SELinux策略的修改,以及提供对缓冲区溢出保护的支持。
Cronn
在这节,你可以启用额外的规则以支持 fcron 调度命令,以及禁用 SELinux对 cron服务的保护。
CVS
如果你使用 CVS 版本控制系统,你可能想使它能够访问密码的影文件。
Databases
如果你安装了 MySQL 或 PostgreSQL 数据库系统,你可以关闭 SELinux对它们的保护。
FTP
这里有6个配置项,RHEL5 的 SELinux 允许 FTP作为独立于 xinetd (第13章对 xinetd服务有描述)的服务允许。即支持 vsftpd 作为常规服务运行,而不与 inetd或 xinetd 有关联。允许目录上传,需使用 public_content_rw_t 指令,前面已有讨论。你可以同样支持使用 CIFS和 NFS进行文件传输,允许读写用户家目录,或禁用 SELinux对 FTP服务的保护。
HTTPD Service
这里有一些 SELinux指令以增强 Apache Web 服务器的安全性,如下列所示。许多是很好理解的,其中一些,我添加了注释。
*允许 Apache 使用 mod_auth_pam (Pluggable Authentication Modules)
*允许 HTTPD 支持 CGI (CGI脚本)
*允许 httpd 守护进程对有 public_content_rw_t 标签的目录与文件写入(类似 FTP)
*允许 HTTPD 脚本和模块连接到网络
*允许 HTTPD 脚本和模块通过网络连接到数据库
*允许 HTTPD 脚本对有 public_content_rw_t 标签的目录与文件写入(类似 FTP)
*允许 HTTPD 读取家目录
*允许 HTTPD 作为 FTP 服务器运行
*允许 HTTPD 运行 SSL 与 CGI 在同一域中
*允许 HTTPD 支持内置脚本
*禁止 SELinux 对 httpd守护进程的保护
*禁止 SELinux 对 httpd suexec(可允许 HTTPD 服务的可执行文件)的保护
*统一 HTTPD 处理的所有内容档案
*统一 HTTPD 连接终端;需要处理证书
Kerberos
这里有3个配置选项。一个选项允许其他进程使用 Kerberos 文件(默认启用)。其他两个选项禁止 SELinux 对 Kerberos 管理进程 (kadmind) 和 Kerberos 键盘控制进程 (krb5kdc) 的保护。
Memory Protection
在目前版本的 Red Hat 考试指南,内存保护选项不与任何服务或系统关联。
Mount
这一类与 automount 服务有关;你可以通过配置它以允许挂载者挂载任何目录或文件,同样也可以禁用 SELinux的保护。
Name Service
名称服务器进程(named)指的是 RHEL DNS 服务。如果你维护一个区域,你会希望允许 named 进程可以覆盖主域文件。你也可以禁用 SELinux 的保护。名称服务器的缓存进程(ncsd)也是如此。
NFS
在NFS启用 SELinux之前,你至少需要启用 NFS 文件系统的读权限。如果你使用 NFS 共享系统,你可能想在 NFS 文件系统上启用读/写/创建功能。如果你配置某个服务器上的家目录作为 NFS 共享,你可能想让 NFS 支持家目录。这些都有通常安全管理服务进程(gssd)提供支持。
NIS
如果你想在 SELinux 系统上运行 NIS,你可能想允许 NIS 运行进程。你可以取消 SELinux对 NIS 密码和 NIS 传输进程的保护。如果还有问题,你可以取消 SELinux对相关进程(ypbind)的保护。
Other
这些选项可以允许完整文件的访问,通过 FTP 和未标签的包。它们同样可以禁止 SELinux 对PC读卡器和特殊时区数据的保护。
Polyinstatiation
Polyinstatiation 是很重要的,这意味着不同的用户在相同的目录下可能会看到不同的东西,如/ tmp。你可以使用 SELinux工具启用这一支持。
pppd
这一进程使用电话调制解调器进行通讯。你可以允许 pppd 在内核中插入支持通信的模块,或禁用 SELinux保护。
Printing
这部分允许你禁用 SELinux 对于不同 CUPS 进程的保护,包括 CUPS 后台服务, cupsd进程,cupsd-lpd服务和 HP 打印机进程(hplip)。你甚至可以用 LPD代替 CUPS。
rsync
这部分允许你为标签为 public_content_rw_t 目录配置写权限,和禁止 SELinux保护。
Samba
这里有一些方法,你可以使用SELinux 保护 Samba。选项如下:
*允许 Samba 共享 nfs目录
*允许 Samba 共享用户家目录
*允许 Samba 对标签为 public_content_rw_t 的目录文件进行写操作
*允许 用户登录到 CIFS家目录
*禁止 SELinux对 nmbd进程(NetBIOS 进程)的保护
*禁止 SELinux对 smbd进程(Samba 进程)的保护
*禁止 SELinux对 winbind进程(WINS 服务进程)的保护
SASL Authentication Server
简单的身份验证和安全层(SASL)服务器是另一个验证方法;通过安全级别配置工具,可以允许它进入您的 /etc/shadow 验证数据库,以及停用SELinux的保护。
在工作中
如上所述,这里有"sasl authentication server" 和 "sasl authentications server"。相关错误见 231868错误文件 https://bugzilla.redhat.com
SELinux Service Protection
这一类允许为大范围的进程禁用 SELinux保护,如从 amanda 到 zebra。这些服务不包含在其他类中。
Spam Protection
这一类作用于 SpamAssassin 服务。对于常规用户需要进入家目录。当然,你依然可以禁用它。
SQUID
如果你想设置 Squid Web代理的缓存,你将需要允许它访问网络。你也可以禁止 SELinux。
Universal SSL Tunnel
如果你要为网络配置一个安全通道,你可以用 SELinux添加保护。你可以使用此工具允许 stunnel 作为单独的服务运行,也可以禁用SELinux的保护。
Zebra
你可以利用这一工具是 Zebra 路由服务对路由表进行写入。
附录:多层安全
1.MLS是另一种强制访问控制方法,特别适合于政府机密数据的访问控制,早期对计算机安全的研究大多数都是以在操作系统内实现MLS访问控制为驱动的,SELinux为MLS提供了可选的支持,即使类型强制保留了SELinux的基础访问控制机制,我们也还是可以开启MLS特性,提供额外的MLS风格的强制访问控制。在SELinux中,MLS是类型强制的一个可选扩展,如果没有类型强制就没有MLS。
2.在开启了MLS后,安全上下文扩展了两个字段:低安全级别和高安全级别。每个安全级别本身有两个字段:灵敏度和一套分类。灵敏度有着严格的分级,它反应了一个有序的数据灵敏度模型,如政府分类控制中的绝密,机密和无密级。分类是无序的,它反应的是数据划分的需要。基本思路是对于要访问的数据你同时需要足够的灵敏度和正确的分类。
警告:不要将安全级别和灵敏度弄混了,一个安全级别是一个灵敏度和一套分类的集合。灵敏度有着严格的分级,可以使用等价关系符(<,=,>)进行比较;安全级别是没有分级的,可以使用控制关系运算符(dom,domby,eq,incomp)进行比较。
3.在SELinux策略中,使用sensitivity语句定义灵敏度,如:
sensitivity s0;sensitivity s1;sensitivity s2;sensitivity s3;
这些语句定义了四个灵敏度,分别是s0,s1,s2和s3。你可以随意给灵敏度命名,还可以在定义灵敏度时给它起别名,别名的待遇和正式名称一样,如:
sensitivity s1 alias unclassified;
因为灵敏度是分层的,我们必须在策略中使用dominance语句指定灵敏度的分级,如:
dominance { s0 s1 s2 s3 } # s0 表示低,s3 表示高
dominance语句按从低到的高的顺序列出了灵敏度的名字,因此,在我们的例子中,s0比s1低,s1比s2低,以此类推。
分类的定义方法与灵敏度类似,它使用category语句进行定义,分类也可以有别名。但与灵敏度不同的是,分类是没有分级的,因此,不需要在分类之间明确定义任何关系,如:
category c0 alias blue;category c1 alias red;category c2 alias green;category c3 alias orange;category c4 alias white;
最后一步是使用level语句定义安全级别,level语句规定了灵敏度如何与分类进行关联,记住一个安全级别是由一个灵敏度加上一套分类组成的,如:
level s0:c0.c4;level s1:c0.c4;level s2:c0.c4;level s3:c0.c4;
在level语句中,可以灵活组织和搭配已经定义好的灵敏度和分类。
在前面这个例子中,我们将定义的所有灵敏度和分类都进行关联,在这个关联中还可以做更多的限制,如:
level s0:c0.c2;level s1:c0.c2,c4;
在这个例子中,s0可能只与分类c0,c1和c2关联,s1与c0,c1,c2和c4关联,但没有c3,现在你应该已经知道这里的点(.)表示一个分类的范围了,而逗号(,)表示一个非连续的分类列表了。
警告:由于分类范围是通过范围操作符(.)来指定的,这并不意味着分类是有分级的,相反,范围操作符只不过是一个引用一套分类的简便方法,分类的顺序也仅仅表示声明时的一个先后次序,并没有其他含义。
因此,如果你按c1,c0和c2的顺序声明的分类,表达式c0.c2等于c0和c2,并不包含c1。
level语句定义了灵敏度和分类的关联,共同组成一个合格的安全级别,成为SELinux中MLS的一部分
4.对于MLS SELinux系统,安全上下文被扩展,新加入两个安全级别:低或当前的安全级别和高安全级别。通常,低安全级别反应的是进程当前的安全级别,或包含在客体内的数据的灵敏度;高安全级别反应的是上下文中用户标识符的许可证级别或那些所谓多层客体允许的数据最大范围,当MLS开启时,对安全上下文的扩展格式如下:
user:role:type:sensitivity[:category,...]
[-sensitivity[:category,...]]
注意安全级别只需要一个灵敏度,可以不要分类或搭配多个分类,即分类是可选的,此外,在指定安全上下文时不需要指定高级级别,如果未指定,高级就等于低级,对于客体而言,这很常见。
对于一个有效的安全上下文,高级级别必须优先于低级级别,此外,与灵敏度关联的分类也必须是有效的,假设我们使用前面的level语句:
level s0:c0.c2;
level s1:c0.c2,c4;
和user_u,user_r和user_t,这些都是有效的用户、角色和类型标识符,下面的安全上下文是无效的:
user_u:user_r:user_t:s0-s0:c2,c4
(c4 is invalid for s0)
user_u:user_r:user_t:s0:c0-s0:c2
(high does not dominate the low)
因为SELinux中的MLS特性扩展了安全上下文,无论在什么地方使用安全上下文都需要指定安全级别信息了,对于一个MLS系统,所有用户都必须要有一个定义好的许可证安全级别(即高安全级别),它代表最高级别进程用户,user语句的语法就被改为:
user 用户名 roles 角色集 level 默认级别 range 允许的范围 ;
这里的用户名和角色集参数和之前的一样,但添加了两个新的关键字,一个定义用户登陆时默认的安全级别(level),另一个定义了用户登陆或可以运行的进程的安全级别的范围(range),默认级别是一个单一有效安全级别,允许的范围是从低到高的安全级别范围,如:
user joe roles user_r level s0 range s0 - s3:c0.c4;
这个语句给用户joe分配的默认安全级别是s0(我们早先定义的最低的敏感度,没有分类),允许用户从无分类的安全级别s0到有分类c0到c4的安全级别s3的任何安全级别登陆,如用户可以以s1:c1.c2安全级别登陆,但不允许以s4:c0安全级别登陆,因为这个级别没有在允许的范围内。
MLS影响的其它主要区域是使用一个安全上下文标记一个客体的地方,你需要记住,在MLS系统中,要扩展客体安全上下文,使其包括低和高安全级别.