原文请见:http://netsecurity.51cto.com/art/201110/295978.htm
一、安装SELinux相关的安装包
虽然在有的Linux发行套件中已经缺省安装了SELinux(例如Fedora 10和Red Hat Enterprise Linux 5、6),然而用户还是需要了解具体安装SELinux所需要的安装包,下面对他们进行简要介绍,主要包括如下几个部分:
Policycoreutils:提供与SELinux相关的命令,比如semanage,restorecon,audit2allow,semodule,load_policy,以及setsebool等,来操作和管理SELinux。
Policycoreutils-gui:提供图形化的工具system-config-selinux来管理SELinux。
Selinux-policy:提供SeLinux应用策略。该应用策略包括了所有的SELinux策略,并作为其他诸如目标策略(targeted policy)的基础使用。
Selinux-policy-policy:提供SELinux策略。对于目标策略,安装selinux-policy-targeted包,对于MLS策略,则安装selinux-policy-mls包。需要说明的是:在Fedora 8中,strict策略与目标策略结合在一起。
Setroubleshoot-server:翻译SELinux拒绝操作信息,成为sealert软件可以查看的详细描述信息。
Setools,setools-gui和setools-console:这些安装包提供了与SELinux有关的策略分析和检索、审计日志监控、文件上下文管理等命令和工具。
Libselinux-utils:提供诸如avsstat,getenforce,getsebool,matchpathcon,selinuxconlist,selinuxdefcon,selinuxenabled,setenforce,togglesebools等工具。
Mcstrans:提供对SELinux上下文中级别(比如s0-s0:c0.c1023)信息的翻译工作,在缺省情况下该软件包不安装。
二、使用与SELinux有关的日志文件
SELinux有许多相关的日志文件来记录在运行过程中对操作的拒绝日志,以便用户在后续过程中进行审计评估。在缺省情况下,SELinux将拒绝日志写入到/var/log/audit/audit.log文件中,该文件的部分内容显示如图1所示:
图1 /var/log/audit/audit.log文件的部分内容显示
另外,如果setroubleshooted运行的话,在/var/log/audit/audit.log中的记录将被翻译成容易理解和阅读的方式,保存在/var/log/messages文件中:
图2 var/log/messages文件的部分输出
当然,拒绝信息被送到不同的地方,这要根据不同的守护进程而定表1列出了对应于不同的守护进程的日志文件的路径:
表1 SELinux日志文件列表 守护进程 日志文件 auditd on /var/log/audit/audit.log Auditd off; rsyslogd on /var/log/messages Setroubleshootd, rsylogd, auditd on /var/log/audit/audit.log翻译后存入/var/log/messages为了启动上述的守护进程,需要来分别配置auditd,rsyslogd以及setroubleshootd来使他们在系统启动时自动运行,可以以root身份运行下述命令:
#/sbin/chkconfig -levels 2345 auditd on#/sbin/chkconfig -levels 2345 rsyslogd on
#/sbin/chkconfig -levels 2345 setroubleshootd on
并且,可以使用如下命令检查这些守护进程是否正常运行:
#/sbin/service auditd status#/sbin/service rsyslogd status
#/sbin/service setroubleshootd status
三、启动和禁用SELinux
启动和禁用SELinux的步骤非常简单,只需要修改其配置文件,然后执行重启即可。以下是启动SELinux的详细步骤:
(1)编辑配置文件
根据上面的介绍,编辑确定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 - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
(2)使用getenforce命令和sestatus命令查看SELinux的运行模式和详细上下文信息:
#/usr/sbin/getenforce#/usr/sbin/sestatus
(3)使用root用户身份重启系统即可:
#reboot同理,禁用SELinux的详细步骤如下:
(1) 编辑配置文件
根据上面的介绍,编辑确定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 - No SELinux policy is loaded.
SELINUX=diabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
(2) 使用getenforce命令和sestatus命令查看SELinux的运行模式和详细上下文信息
#/usr/sbin/getenforce#/usr/sbin/sestatus
(3) 使用root用户身份重启系统即可
#reboot四、目标策略原理
Targeted策略是从strict示例策略衍生而来的,它的结构和组织几乎是一样的,但strict策略更趋向于最大化使用SELinux所有特性,为大部分程序提供强壮的安全保护,而targeted策略的目标是隔离高风险程序,使用targeted策略的好处是一方面可以向Linux系统添加大量的安全保护,同时又尽量少影响现有的用户程序,targeted策略主要集中于面向网络的服务(即那些暴露在外任意遭受黑客攻击的组件),targeted策略是RHEL和Fedora系统上标准的策略,因为它在增强安全性和减少对现有应用程序影响之间达到了一个很好的平衡。
如果安装了targeted示例策略,可以在/etc/selinux/targeted/src/policy/目录下看到它的源文件,从各个方面来看,targeted示例策略源与strict示例源都非常相似。
Targeted示例策略和strict示例策略之间主要的差异是使用了无限制的域类型unconfined_t,并移除了所有其他用户域类型,如sysadm_t和user_t,这也意味着基本的角色结构也被移除了,所有用户都以角色system_r运行,几乎所有的用户运行的程序都以unconfined_t域类型执行。当然,无限制域和限制域都需要接受可执行和可写的内存检查。在默认情况下,运行在无限制域下的主体不能分配可写和可执行的内存,这个机制降低了系统遭受缓冲区溢出攻击(buffer overflow attack)的风险。当然,这些内存检查可以通过设置下面需要详细介绍的布尔变量来关掉,它使得SELinux策略可以在运行时得到修改。
用户可以在./domain/unconfined.te中找到unconfined域定义,注意在targeted示例策略中,strict策略文件admin.te和user.te不再位于./domains/目录下,这些文件为strict示例策略定义了各种各样的用户域,每一个都具有受限的特权,在targeted示例策略中,所有程序都以unconfined_t域类型运行,除非它们都明确地指定了域类型(因此称其为targeted),本质上unconfined域可以访问所有的SELinux类型,使它免除SELinux安全控制(因此成为unconfined)。在strict示例策略中,./domains/program/包括许多策略模块,每个模块代表一个或多个域类型和关联的类型,以及为特定程序制定的规则。在targeted示例策略中,这个目录包括的文件要少得多,这些就是目标。
目标示例策略模块与strict策略中策略模块类似,例如:strict ping模块和targeted ping模块是一致的,但有部分targeted模块只是简单地定义类型使域不受限制(不是targeted),例如:如果查看crond的targeted策略(crond.te),会发现有一行unconfined_domain(crond_t)。这个宏在targeted示例中定义在./policy/macros/global_macros.te文件中,它将crond域类型提供了所有SELinux访问权,使得它不受限制,如果用户将其域strict版本(/etc/selinux/strict/src/policy/domains/program/crond.te)crond模块进行比较,会看到它们之间有很大的差异,在targeted策略中,crond被认为是不受限制的域,但在这两个策略中ping却保留是strict域。
五、应用目标策略限制进程运行
几乎所有的服务进程都在限制下运行。并且,大多数以root身份运行的系统进程(比如说passwd进程)都是受限制域性的。当进程受限制时,它只能在自己限制的域内运行,例如Web服务进程httpd只能运行在httpd_t域内。如果一个受限制的进程被黑客攻击并控制了,根据SELinux策略配置,这个黑客也仅仅只能访问这个受限制的域,因此攻击所带来的危害也比传统的Linux小了很多。
以下通过一个具体的限制进程的例子(RHEL或者Fedora系统中的例子)来说明SELinux是如何将进程限制在自己的域内运行的。这个例子以用户非常熟悉且常用的Apache服务器中的httpd进程为例,来介绍SELinux是如何阻止httpd进程来访问由其他域管理的文件类型的。
(1)运行sestatus命令来确认Linux中SELinux是运行的,它运行在enforcing模式下,该模式可以简单理解为SELinux的完全运行模式,它可以进行强制访问控制),且确保采用了目标策略,如图1命令所示:
图1 使用sestatus确认SELinux是否运行
上述运行结果表明SELinux运行在enforcing模式下,且采用了目标策略。
(2)采用Linux中的root用户权限,使用如下命令在httpd的工作目录中创建一个新的文件:
#touch /var/www/html/testfile(3)运行如下命令来查看该文件的SELinux上下文信息:
# ls -Z /var/www/html/testfile
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile
从上述结果可以清楚地看到:在默认情况下,Linux用户是非限制的,因此刚创建的testfile文件的SELinux上下文中的类型标记为unconfined_u。RBAC访问控制机制是用于进程的,不是用于文件。并且,角色对于文件来说也没有什么太大的含义,因此上述结果中的object_r角色也仅仅是一个用于文件的通用角色。在/proc目录下,与进程相关的文件可以采用system_r角色。另外,结果中的httpd_sys_content_t类型允许httpd进程访问该文件。
(4)以Linux的root用户身份,运行下述命令来运行httpd进程,如图2所示:
图2 成功启动httpd进程
(5)切换到一个Linux用户具有权限的目录下,运行如下命令,图3所示结果为该命令能够正确的执行并下载文件:
图3 wget正确执行并下载文件
(6)使用chcon命令来对文件的类型进行重新标识。然而,这样的标识不是永久性的修改,一旦系统重启,该标识就会改变回去。对于文件类型的永久性改变,需要采用semanage命令,这个命令在后面将进行详细介绍。下面,以root用户的身份,运行图4所示chcon命令来将上面步骤中创建的testfile文件的类型改为由Samba进程使用的文件;然后,运行ls -z /var/www/html/testfile命令来查看改变的结果,如图4所示:
图4 chcon命令运行结果
(7)在传统的Linux中httpd进程可以访问testfile文件,下面需要尝试一下在SELinux中,该进程是否能够成功访问testfile文件。如步骤(5)所示,再次运行该命令进行文件下载工作,发现命令运行失败,文件没有权限下载,运行结果如图5所示:
图6 wget命令执行失败
通过上述7个步骤的详细演示可以得知:虽然传统的Linux的DAC机制允许httpd进程访问testfile文件,然而SELinux的MAC机制却拒绝该访问操作。原因在于:该文件的类型(samba_share_t)httpd进程不能访问,因此SELinux拒绝了该操作。同时,SELinux对这些操作日志进行了详细的记载,以方便系统管理员事后进行审计和处理,可以查看/var/log/messages文件,如图7所示:
图7 /var/log/messages文件图示
另外,相关的错误日志也可以查看/var/log/audit/audit.log文件,如图8所示:
type=AVC msg=audit(1241564654.246:26): avc: denied { getattr } for pid图8 /var/log/audit/audit.log文件图示
并且,由于该操作牵涉到httpd服务进程,由于该服务也有自己的日志文件,因此,也可以通过/var/log/httpd/error_log文件进行查看,如图9所示:
图9 /var/log/httpd/error_log文件图示