SELinux配置文件/etc/selinux/config控制系统下一次启动过程中载入哪个策略,以及系统运行在哪个模式下,我们可以使用sestatus命令确定当前SELinux的状态,清单13-1显示了一个config文件的例子:

清单13-1./etc/selinux/config文件的内容

SELinux配置文件(/etc/selinux/config_linux系统

这个文件控制两个配置设置:SELinux模式和活动策略。SELinux模式(由第6行的SELINUX选项确定)可以被设置为enforcing,permissive或disabled。在enforcing模式下,策略被完整执行,这是SELinux的主要模式,应该在所有要求增强Linux安全性的操作系统上使用。在permissive模式下,策略规则不被强制执行,相反,只是审核遭受拒绝的消息,除此之外,SELinux不会影响系统的安全性,这个模式在调试和测试一个策略时非常有用。

在disabled模式下,SELinux内核机制是完全关闭了的,只有系统启动时策略载入前系统才会处于disabled模式,这个模式和permissive模式有所不同,permissive模式有SELinux内核特征操作,但不会拒绝任何访问,只是进行审核,在disabled模式下,SELinux将不会有任何动作,只有在极端环境下才使用这个模式,例如,当策略错误阻止你登陆系统时,即使在permissive模式下也有可能发生这种事情,或我们不想使用SELinux时。

警告:在enforcing和permissive模式或disabled模式之间切换时要小心,当你返回enforcing模式时,通常会导致文件标记不一致,本章后面我们将会讨论如何修复文件标记问题。

SELinux配置文件中的模式设置由init使用,在它载入初始策略前配置SELinux使用。

SELinux配置文件中的SELINUXTYPE选项告诉init在系统启动过程中载入哪个策略,这里设置的字符串必须匹配你用来存储二进制策略版本的目录名,例如,我们使用strict策略作为例子,因此我们设置SELINUXTYPE=strict,确保我们想要内核使用的策略位于/etc/selinux/strict/policy/,如果我们已经创建了我们自己的自定义策略,如custom_policy,我们应该将这个选项设置为SELINUXTYPE=custom_policy,确保我们编译的策略位于/etc/selinux/custom_policy/policy/。

FC和RHEL系统提供了一个图形工具(system-config-securitylevel),我们可以使用它来设置SELinux配置文件选项,这样就不需要直接编辑文件了,前面两个选择框设置SELINUX选项,策略类型下拉列表允许我们从安装好的策略中选择一个活动策略。

SELinux配置文件(/etc/selinux/config_linux_02

13.1.2.策略目录

和FC 3(RHEL 4)一样,系统上安装的每个策略在/etc/selinux/目录下都它们自己的目录,子目录的名字对应于策略的名字(如,strict,targeted,refpolicy等),在SELinux配置文件中就要使用这些子目录名字,告诉内核在启动时载入哪个策略,在本章中提到的所有路径都是相对域策略目录路径/etc/selinux/[policy]/的,下面是FC 4系统上/etc/selinux/目录的简单列表输出:

SELinux配置文件(/etc/selinux/config_linux_03

正如你所看到的,在我们的系统上安装了两个策略目录:strict和targeted。注意目录和策略子目录都用selinux_config_t类型进行标记的,这些传统的应用给二进制策略和相关文件的类型,你可以使用apol分析适合于这个类型的规则,思考一下什么程序和实用工具可以修改策略文件。

FC 5中的策略目录

FC 5中策略子目录的布局稍微做了一下改动,它引入了可载入策略模块结构,主要的改动是引入了管理策略文件的库和工具,这以改动使得安装和移除可载入模块变得更加简单,通常,在FC 5中不需要直接编辑策略子目录下的文件。

semodule和semanage命令管理策略的许多方面,semodule命令管理可载入策略模块的安装、更新和移除,它对可载入策略包起作用,它包括一个可载入策略模块和文件上下文消息,semanage工具管理添加、修改和移除用户、角色、文件上下文、多层安全(MLS)/多范畴安全(MCS)转换、端口标记和接口标记,关于这些工具的更多信息在它们的帮助手册中。

每个策略子目录包括的文件和文件如何标记必须遵守一个规范,这个规范被许多系统实用程序使用,帮助管理策略,通常,任何设计优良的策略源树都将正确安装策略文件,下面是strict策略目录的列表输出,它就是一个典型:

SELinux配置文件(/etc/selinux/config_默认值_04

一个正在运行的系统不需要src/目录,它包括了安装的策略源树,要么是示例策略,要么是引用策略源树,实际上单片二进制策略文件存储在.policy/目录中的policy.[ver]文件中,这里的[ver]就是策略二进制文件的版本号,如policy.19,这就是系统启动时载入内核的文件。

下面的章节我们将会讨论剩下的文件和目录。

13.1.2.1.安装的布尔变量文件

第9章"条件策略"讨论了在SELinux系统中如何管理布尔变量的,SELinux策略为布尔变量定义默认的值,booleans文件让各发行版能够修改默认值并固定下来,booleans中的值覆盖策略默认值,booleans.local文件提供了额外的固定值,它又会覆盖策略定义的默认值和发行版的固定值,第9章详细介绍了如何设置和控制布尔变量值,查看man 8 booleans也可以,这个帮助页面简要描述了在FC和RHEL系统上如何使用布尔变量。

在FC 5中,booleans文件已经被取消了,但booleans.local文件仍然保留,发行版默认值现在由策略自身进行管理,Red Hat在策略源中设置它们的默认值。

注意:

在RHEL 4中,booleans.local文件被取消了,能够覆盖策略默认值(不是修改策略本身)的是策略目录下的booleans文件,使用单个文件的问题是Red Hat使用它作为发行版的默认值,rpm软件包可能会覆盖它,这样就会造成对本地改变的破坏,在FC 4中,booleans.local文件允许包管理器不影响本地改变。

在Fedora Core 5中,booleans文件被取消,但booleans.local文件仍然保留,发行版默认值由策略自身进行管理,Red Hat在策略源中设置它们的默认值。

system-config-securitylevel工具提供了一个图形接口改变本地固定值(即booleans.local文件),在这个工具的修改SELinux策略列表框中的项目对应定义的策略布尔变量,布尔值也可以使用setsebool命令行工具修改,使用setatus和getsebool命令进行查看。

)系统的,域RHEL 4相比较可能稍微有所不同,而且FC 5中肯定又有很多增强了,因此我们会标明不同的地方。

13.1.2.2 应用程序和文件安全上下文

在策略安全目录下的contexts/子目录包括了许多帮助系统服务和实用程序管理文件安全上下文标记的大量文件,它们也包括登陆进程的默认安全上下文,通常,这些文件只应该由策略开发人员修改,但管理员可能偶尔也需要修改一下,下面列出这些文件的主要用途:

contexts/customizable_types:包括一列当使用restorecon或setfiles实用程序修复文件标记问题时不会被重新标记的类型,这个特性在帮助保护某些文件标记时特别有用,使用SELinux应用程序接口(API)检查上下文是否自定义的是is_context_customizable(3)。

contexts/default_contexts:在初始登陆过程中,用户可能登陆会话可能不止得到一个角色/类型组授权,如管理员就可以以特权用户和非特权用户登陆,这个文件提供了一个方法决定初始登陆使用哪个登陆进程(login,ssh等)作为默认的角色/类型组。

这个文件中的每一行都包括一对角色/类型组,代表登陆进程的安全上下文,后面跟着的就是用户初始登陆进程的默认安全上下文,例如,下面这两行代码:

SELinux配置文件(/etc/selinux/config_linux_05

第一行代表本地登陆进程(通过它的类型login_t登陆),第二个是ssh登陆,通过它的类型sshd_t。登陆进程由每行的第一个角色/类型组决定的,例如,假设这个文件是登陆进程以角色system_r,类型为local_login_t运行的,同一行后面的角色/类型组将作为用户登陆的默认安全上下文。

默认安全上下文的第一个经过授权的角色/类型组作为默认的安全上下文,这个文件不对用户授予角色或类型,因此,在我们的default_contexts文件的本地登陆案例中,如果管理员在本地登陆(管理员通常是经过staff_r:staff_t 和sysadm_r:sysadm_t授权的用户),虽然通过了sysadm_r:sysadm_t授权,但它们的默认安全上下文将是staff_r:staff_t,管理员以后可以修改它们的安全上下文,如使用newrole命令,因为它们都是通过授权了的,但默认是"staff"权限集,注意,对于ssh登陆,默认是"sysadm"权限集。

注意,如果有contexts/users/[USER]文件的话,这些默认值可能会被一个特殊用户覆盖。

contexts/users/[USER]:这个文件和default_contexts文件的格式一样,除了default_contexts是为一个特殊用户设计的外,如果某个用户的文件已经存在,默认的角色/类型组由该文件的第一个决定。

contexts/failsafe_context:如果登陆进程不能决定用户的默认安全上下文,用户将不能登陆进系统,这和default_contexts文件被破坏会改变非常类似,这个文件提供了一个合理的安全上下文故障自动转移机制,至少允许管理员登陆,它提供最后的登陆进程失败前使用的默认安全上下文,通常是:

SELinux配置文件(/etc/selinux/config_linux_06

这样的话,至少管理员可以登陆。

 

contexts/default_type:这个文件包括一列实用程序(如newrole)使用的角色/类型组,如果我们使用newrole修改我们的角色,但不指定类型,实用程序将会咨询这个文件以确定默认的类型和角色,如果我们使用命令newrole -r sysadm_r,而且这个文件有一行的内容为sysadm_r:sysadm_t,这个命令将会尝试使用sysadm_t作为我们的默认用户域类型。

contexts/files/file_contexts:这个文件包括与文件有关的安全上下文标记信息,作为策略构建过程的一部分,为与文件有关的客体使用初始化安全上下文,它安装在这里帮助实用程序修复标记问题。

contexts/files/file_ contexts.home_dirs:这个文件是使用/usr/sbin/genhomedircon脚本自动生成的,它的格式与file_contexts一致,但它只用于标记用户home目录。

contexts/files/homedir_template:这个文件包括一个/usr/sbin/genhomedircon脚本使用它产生标记块的模板。

contexts/files/media:这个文件包括挂载在/media/目录下的存储设备的安全上下文,通过libselinux matchmediacon(3) API使用它。

contexts/initrc_context:这个文件包括一个角色/类型组,用于run_init的安全上下文,即管理员以init相同的方式启动系统服务,这样它就可以执行由init初始化的存储在/etc/rc.d/目录下的脚本,这个角色/类型组通常和init用来启动系统服务的角色/类型组一致。

contexts/removable_context:这个文件包括可移动媒体设备的默认安全上下文,这个安全上下文用于media上下文文件没有标记的设备。

13.1.2.3. SELinux用户定义

user/目录下有两个文件被添加进来支持更好的用户管理,以便不用改变策略本身,这两个文件格式相同,它们列出策略user语句。

users/system.users:这个文件让发行商可以修改与明确定义在策略源中的用户关联的角色,包管理器将会覆盖这个文件,因此它不能做本地修改,我们应该使用local.user文件定义本地用户。

users/local.users:这个文件的功能和system.users一样,除了它不能由发行商修改外,因此,我们可以在这个文件中定义本地用户。

load_policy实用工具在将策略载入内核前读取这些文件并改变二进制策略,改变仅针对内存中的策略版本,磁盘上的二进制策略不会改变,通常,对于任何一个文件,如果用户已经在策略文件中存在,即硬编码进原始策略源中,关联的角色会被改变,否则,在它载入内核前用户就会被添加进策略。

13.1.2.4.SELinux文件系统

SELinux伪文件系统在SELinux内核空间Linux安全模块(LSM)和用户空间程序之间提供了主要的控制接口,参考第3章中的图3-2。这个文件系统通常挂载在/selinux/,许多SELinux实用程序和API(有libselinux库提供)使用SELinux文件系统访问LSM模块,在本节中,我们分析其中一些管理员可能感兴趣的文件,这个文件系统中存在的大部分文件支持libselinux中的API,这里暂时不做讨论,使用这些文件的推荐方法是通过更稳定的libselinux API和对应的工具。

booleans/:这个目录包括了策略中定义的每个布尔变量文件,如果文件被读取,就会返回布尔变量的当前值和待定值,待定值就是布尔变量将要改变成的值,参考commit_pending_booleans命令,文件名和布尔变量的名字一致。

commit_pending_bools:这个文件向内核空间安全服务器发送信号,告知新的策略布尔变量值已经准备就绪,这个特性允许多个策略布尔变量值以原子方式进行改变。

disable:这个文件是init在初始化过程中用来禁用SELinux的接口,当初始SELinux策略载入或SELinux被禁用时,这个接口不再有效,因此,修改成禁用状态总需要重启,通常,启用/禁用SELinux的唯一方法是修改/etc/selinux/config,然后重启系统,只有init能够直接通过这个文件使用该接口。

enforce:这个文件是用来开启或禁用enforce模式的接口,init在启动过程中用它设置模式为enforcing,我们也可以直接使用这个接口修改模式,1表示enforcing模式,0表示permissive模式,模式的改变是立即生效的,setenforce命令不能完全做到这一点。

也可以编写一个策略禁止任何域许可从enforcing模式固定成permissive模式。

load:这个文件是load_policy程序用来载入新的二进制策略的。

mls:这个文件是内核用来代表MLS是否激活。

policyvers:这个文件返回内核支持的策略的最大版本号。

13.2.SELinux对系统管理的影响

和其它Linux系统一样,管理员也需要理解大量的管理SELinux系统的功能,管理SELinux系统的大部分内容都与管理非SELinux系统一样,但SELinux引入了几个新的管理行为,在这一节中,我们讨论SELinux管理新手在管理SELinux系统时经常会遇到的几个问题。

13.2.1.管理用户

在SELinux系统上添加、修改和删除用户将会是一个挑战,如果操作不当,虽然看上去用户是创建了,但用户却无法登陆,通用SELinux用户user_u解决了许多用户管理问题,例如,当一个用户被添加到FC 4系统中时,它就会被自动映射到user_u,因为新用户在策略中还没有定义,关于user_u的更多信息请参考第6章中的内容。

另一个与用户有关的挑战是如何标记用户home目录下的文件,存在几个问题,一个挑战是如何为不同用户域类型统一标记,如sysadm_t,user_t。另一个挑战是当用户被添加到现有系统时,如何为用户确定正确的标记,如果用户的home目录和它下面的文件在初始化时没有正确标记,用户将会遇到各种各样的问题,如不能登陆系统或不能向home目录中写入文件,幸运的是,经过这几年的不断改进,我们可以使用./contexts/files/file_contexts.home_dirs这个文件来管理SELinux用户了。

13.2.1.1 添加普通的非特权用户

仍然是使用useradd命令来添加用户,下面以在FC 4系统中添加jimmy用户的过程为例:

SELinux配置文件(/etc/selinux/config_linux_07

注意安全上下文中的用户标识符是通用用户user_u,那是因为我们没有将jimmy添加为特定的SELinux用户,因此FC 4就使用默认丢的user_u。

对于那些不需要定义大量用户角色系统而言使用通用用户就足够了,目前常见的策略都只有一组角色(系统,管理员和用户),所有新用户都指派为用户角色(user_t域类型,user_r角色),这是通过通用用户user_u实现的,和jimmy一样,为了向SELinux系统添加一个普通非特权用户,除了使用useradd命令外,我们不需要再做额外的事情。

FC 5中的用户管理

在FC 5中,通过引入semanager工具使得用户管理变得更加简单了,semanage工具可以管理SELinux用户、它们的角色授权和普通Linux用户之间的映射,关于SELinux用户和普通linux用户之间的映射请参考第6章中的有关内容,如:

SELinux配置文件(/etc/selinux/config_linux_08

在这个例子中,我们添加了一个新用户staff_u,它被授予sysadm_r和user_r角色,列出所有SELinux用户,将用户joe映射到SELinux用户staff_u,然后列出了所有用户映射情况。

注意,因为FC 5默认使用了非强制的MLS特性,主要是为了实现MCS策略。

13.2.1.2.添加特权用户

定义在SELinux策略中的root用户通常对应具有特权的root用户账号,策略授予这个用户sysadm_r角色和sysadm_t用户域,这样的话它就有足够的特权管理系统,虽然SELinux中的root用户没有标准Linux中root用户那么大的权利,但它有权运行所有需要特权的程序,经授权的用户使用root用户账号(和它关联的特权用户域类型)通常可以获得一个不同的非特权用户域类型(staff_t),这个用户域类型和普通用户域类型user_t基本一样,但staff_t可以转换成特权用户域类型sysadm_t,而user_t则不行。

添加特权用户时仍然使用useradd命令,但我们还需要编辑前面已经讨论过的活动策略中的local.users文件,在这个文件中定义了策略使用到的用户,例如,如果我们想创建一个具有特权的用户"admin":

SELinux配置文件(/etc/selinux/config_linux系统_09


使用useradd命令创建账号和home目录,但需要告诉SELinux这个用户不是普通用户,因此编辑local.users文件,添加下面这样一行内容:

 

SELinux配置文件(/etc/selinux/config_linux_10

   

这一行让SELinux策略知道用户和为该用户授予的角色,为了让这个改变生效,需要运行load_policy重新将策略载入内核,至此,用户就同时定义在系统和SELinux策略中了,当用户的home目录的标记却没有改变,因此需要运行genhomedircon工具为新用户更新home目录文件上下文文件(./contexts/files/file_contexts.home_dirs),然后使用restorecon程序基于当前的角色更新用户的home目录。

至此,用户账号已经创建完毕,并同时授予了非特权管理角色(staff_r)和特权管理角色(sysadm_r),但用户登陆时通过使用的是staff_r角色,因此管理员登陆后默认也就一非特权用户,下面以我们刚刚创建的管理员用户登陆为例进行解释:

SELinux配置文件(/etc/selinux/config_linux_11

注意我们的角色和用户域类型分别是staff_r和staff_t,它们都是非特权的用户角色和类型,通过ssh登陆方式也使用这个角色和类型作为默认的角色/类型,域类型为staff_t的进程相对其它普通用户而言本质上没有啥特权,只不过它可以转换成sysadm_r角色,例如,我们在执行管理任务时:

SELinux配置文件(/etc/selinux/config_linux_12

su程序有它的默认安全上下文,以staff角色/类型运行的用户将会转换成sysadm角色/类型,注意su程序也会提示你是否要提供一个非默认定义的安全上下文,如果策略允许,你还可以在这里尝试其它定义的默认角色和类型。

注意:

在FC 5中,su不会改变安全上下文,相反,用户必须使用newrole命令,例如,newrole -r sysadm_r -t sysadm_t命令就和上面举的在FC 4和RHEL 4中的例子一样,修改了安全上下文。

记住,不同登陆程序的默认安全上下文都只能定义一个。