Fedora Core 5 中 SELinux 的多类别安全
Fedora Core 5 的发布为 SELinux 增加了一些新功能,其中之一是多类别安全 (MCS)。MCS 的目的是保护数据机密性,这意味着它将防止秘密数据泄露,但它并非旨在防止系统被破解。您可能从以前的 Fedora 版本中熟悉的 SELinux 功能(称为域-类型模型)仍然用于保护系统完整性。MCS 是一项额外的功能,用于防止秘密数据的意外或故意泄漏。
早期版本的 SELinux 仅使用域-类型模型进行访问控制。在域-类型模型中,每个进程都有一个域,并且进程可能访问的每个对象(文件、目录等)都有一个类型。系统维护一组规则来指定每个域可以访问哪些类型,以及应该是什么类型的访问。
尽管域-类型可以用于实现系统完整性和数据机密性的所有控制(并且过去曾用于此目的),但如果完整性和机密性的目标分开,则设计会更清晰。MCS 旨在保护数据机密性,从而允许策略的域-类型部分专注于保护系统完整性。MCS 基于多级安全 (MLS) 的一些设计特性。MLS 专为军事用途而设计,不适合大多数用户,因此我在本文中不介绍它。
过去,MLS 的支持很少,因为它难以使用且成本高昂。MCS 是 Fedora Core 5 及更高版本中的默认功能,因此它将获得应用程序开发人员和系统管理员的良好支持。预计为 Fedora Core 5 及更高版本编写的所有应用程序都将支持 MCS,并且在大多数情况下,MCS 支持还将允许这些应用程序支持 MLS。这意味着需要 MLS 功能的组织将比在专有的 UNIX 系统上有更好的应用程序选择。
MCS 为每个安全上下文添加了一个敏感度标签(在本文的其余部分中我将其称为 MCS 标签)。安全上下文是进程或进程可能访问的资源的完整 SELinux 标签。要访问文件,进程必须具有支配要访问文件的 MCS 标签的 MCS 标签。MCS 标签由一组类别组成。进程可能具有带有两个级别的 MCS 标签,称为高级别和低级别;高级别具有低级别的类别的超集。
文件可能具有 MCS 标签 s0:c0.c10。s0 在 MCS 策略中没有任何意义;该字段由 MLS 策略使用,并且相同的内核代码用于 MLS 和 MCS,因此格式无法更改。重要的是 c0.c10 部分,它表示从 c0 到 c10(包括 c10)的类别集(. 字符表示类别范围)。在 Fedora Core 5 中,有 256 个类别,编号从 c0 到 c255。在 Fedora Core 6 中,将有 1,024 个类别,编号从 c0 到 c1023。
进程可能具有 MCS 标签 s0-s0:c0.c100,这意味着标签(或范围)的低级别为 s0(没有类别),而高级别为 s0:c0.c100,这意味着从 c0 到 c100 的所有类别。也允许不相交的类别集。标签 s0:c3,c5 表示类别 c3 和 c5 在标签中。MCS 范围 +s0:c3,c5-s0:c0.c10,c20.c30 表示低级别具有类别 c3 和 c5,而高级别包含类别 c0 到 c10(包括 c10)和 c20 到 c30(包括 c30)。
类别可以命名,并且预计大多数用户将命名所有使用的类别。在 Fedora Core 5 中,您必须编辑文件 /etc/selinux/targeted/setrans.conf 以更改 MCS 标签的人类可读名称。以下是默认 setrans.conf 文件的一部分
# s0:c0=CompanyConfidential # s0:c1=PatientRecord # s0:c2=Unclassified # s0:c3=TopSecret # s0:c1,c3=CompanyConfidentialRedHat s0= s0-s0:c0.c255=SystemLow-SystemHigh s0:c0.c255=SystemHigh
以下是如何使用 semanage 更改 Fedora Core 6 中 MCS 标签的人类可读转换的示例
# semanage translation -a -T ProjectA s0:c0 # semanage translation -l Level Translation s0 s0-s0:c0.c1023 SystemLow-SystemHigh s0:c0 ProjectA s0:c0.c1023 SystemHigh
图 1 显示了对于 HR 和 Financial 类别的所有组合,进程被授予对文件的访问权限。
MCS 的设计主要考虑易用性。目前,其设计仅控制文件访问。它还控制 ptrace(用于 strace、ltrace 和调试器的系统接口),以防止非特权进程使用调试器从更特权的进程捕获秘密数据。
MCS 仅控制文件访问这一事实允许通过文件名泄露信息,并且协作进程可以使用 TCP、UDP、UNIX 域套接字或命名管道来传输数据。这是有意这样设计的,因为限制所有形式的进程间通信会破坏许多程序,并使整个系统更难使用。MLS 策略(在 Fedora Core 5 及更高版本中可用,但默认情况下未启用)限制了此类通信方法,这也是它被认为对大多数人来说太难使用的原因之一。
在设计 MCS 时,我们决定不尝试阻止两个合作用户不恰当地共享数据。我们还决定不阻止用户读取包含秘密数据的文件,然后将该数据写入具有不太秘密标签的文件。同样,MLS 策略限制了这些操作,但对于大多数人来说太难使用了。
MCS 和 MLS 旨在保护数据机密性;它们依赖域-类型模型来保护系统完整性。FC5 带有三个策略。默认策略是 targeted,它提供与 FC4 中大致相同的完整性保护,但增加了 MCS 以保护数据机密性。下一个选项是 strict 策略,它再次与 FC4 中的策略大致相同,但增加了 MCS。最后,FC5 中有一个名为 mls 的新策略;顾名思义,这包括 MLS 系统以保护数据机密性。mls 策略的域-类型部分基于 strict 策略(尽管并非 strict 策略中的所有守护程序都受支持,仅支持 LSPP 认证的评估列表中的守护程序)。
可以编译不包含 MLS 或 MCS 功能的 SELinux 策略,但到目前为止,还没有人选择这样做。它可以节省很少的内存,并且仅对于最小的嵌入式机器才值得考虑。也可以将 MLS 与 targeted 策略一起使用来代替 MCS,但没有人这样做,因为它不会提供太多好处。系统完整性是数据机密性的前提条件。因此,将强大的机密性保护系统(如 MLS)与低于最佳系统完整性保护的任何系统结合使用没有任何好处。strict 策略限制了所有进程,并显着限制了其中大多数进程。这是充分利用 MLS 所需的完整性保护级别。
在 MCS 中,进程具有范围。范围的高级别确定授予文件的访问权限,而低级别确定创建的文件的默认级别(范围仅适用于 MCS 中的进程)。
为了使一个 MCS 级别支配另一个 MCS 级别,它必须具有一个类别集,该类别集是被支配的 MCS 级别的超集。可能存在两个敏感度级别,它们彼此不支配(例如,不相交的类别集)。这被称为不可比较的级别,并且读取和写入访问都将被拒绝。
要使用 MCS,首先需要为用户分配敏感度级别。在以前版本的 SELinux 中,必须编辑策略源并重新编译策略以设置在用户登录时分配给用户的安全上下文,这很不方便且容易出错。FC5 中新的 SELinux 功能之一是 semanage 策略管理工具。这支持更改用户的安全上下文(以及添加和删除用户),而无需编译策略。
Fedora 的默认配置具有 targeted 策略,该策略在 unconfined_t 域(域-类型模型中没有访问限制)中运行所有用户登录会话,因此 MCS 为用户提供了唯一的 SELinux 访问控制。但是,Fedora Core 5 的默认安装需要应用更新后 MCS 才能正常工作。MCS 的开发直到 Fedora Core 5 发布后才完成。
配置 SELinux 系统以使用 MCS 时,您必须做的第一件事是创建 SELinux 身份和登录记录,以将其映射到 UNIX 帐户。
清单 1 是使用 semanage 添加 SELinux 身份 rjc 的示例,其低级别为 s0:c1(这意味着用户创建的每个文件默认都将具有类别 c1),高级别为 SystemHigh,在 Fedora Core 6 中映射到 s0:c0.c1023(从 c0 到 c1023(包括 c1023)的所有类别的范围 - MCS 的最高级别),在 Fedora Core 5 中映射到 s0:c0.c255。-L 参数指定默认级别。使用 MCS 时,您应始终将默认级别设置为范围的低端,以避免混淆。-L 选项与范围分开,以支持 MLS 策略的需求。
清单 1. 使用 semanage 的示例
# semanage user -a -P user -R user_r -L s0:c1 -r s0:c1-SystemHigh rjc # semanage user -l Labeling MLS/ MLS/ SELinux User Prefix MCS Level MCS Range SELinux Roles rjc user s0:c1 s0:c1-SystemHigh user_r root user s0 SystemLow-SystemHigh system_r sysadm_r +user_r system_u user s0 SystemLow-SystemHigh system_r user_u user s0 SystemLow-SystemHigh system_r sysadm_r +user_r
Fedora Core 5 使用进程范围的低端来指定文件的默认上下文。范围参数由 -r 开关指定。使用 Fedora Core 5 时,通常范围中唯一重要的部分是高端,它指定访问权限。您应该使用参数-P user -R system_r在创建具有 targeted 策略的用户时(这是 Fedora Core 5 安装的默认策略)。strict 策略在 MCS 方面与 targeted 策略非常相似。本文的大部分内容适用于 strict 策略,尽管 semanage 命令的 -P 和 -R 选项将需要不同的参数。
添加身份后,您必须添加登录条目以将 UNIX 帐户分配给该身份。登录配置还允许您指定 MCS 范围,因为您可能有许多具有相同 SELinux 身份的 UNIX 帐户,这些帐户在登录时分配了不同的 MCS 范围。您必须使用 -s 参数来指定已经存在的 SELinux 身份的名称。如果您不使用 -r 选项指定范围,则默认情况下,登录条目不使用任何类别(这可能无效,具体取决于身份范围的低级别)。
以下是添加登录条目的示例
# semanage login -a -s rjc -r s0:c1-SystemHigh rjc # semanage login -l Login Name SELinux User MLS/MCS Range __default__ user_u s0 rjc rjc s0:c1-SystemHigh root root SystemLow-SystemHigh
请注意,登录条目的范围必须是 SELinux 用户身份范围的子集。这意味着登录范围的低端不得低于用户身份范围的低端,并且登录范围的高端不得高于用户身份范围的高端。在大多数情况下,您将创建一个与用户身份范围相同的范围的登录条目,因此这不会成为问题。
创建文件后,可以使用chcon -l命令将标签更改为不同的级别。以下是如何使用它的示例
$ touch foo $ ls -lZ foo -rw-r--r-- rjc rjc rjc:object_r:tmp_t foo $ chcon -l s0:c0 foo $ ls -lZ foo -rw-r--r-- rjc rjc rjc:object_r:tmp_t:ProjectA foo
请注意,级别 s0:c0 已转换为 ProjectA;这是我之前创建的翻译。
可以以不同的范围运行进程。以下是使用 id -Z 命令显示 SELinux 上下文(包括末尾的 MCS 范围)的示例,以及使用 runcon -l 命令在不同范围内运行 bash 实例的示例
$ id -Z rjc:system_r:unconfined_t:SystemLow-SystemHigh $ runcon -l s0-s0:c10.c20 bash $ id -Z rjc:system_r:unconfined_t:s0-s0:c10.c20 $ runcon -l s0-s0:c9.c20 bash execvp: Permission denied
MLS 是通过策略语言以灵活的方式实现的。这使我们能够在之后使用相同的语言功能开发 MCS 策略,并且还允许开发其他基于类别和级别的机密性控制,而无需更改内核代码。这方面的一个例子是我新开发的强制 MCS (MMCS)。
强制访问控制 (MAC) 系统是由系统管理员确定并由操作系统强制执行访问控制的系统。不允许用户通过授予对其自身数据文件的过多访问权限来覆盖此访问控制。在 UNIX 权限中,可以在 /tmp 目录中创建一个模式为 777 的文件,该文件授予所有用户完全访问权限。使用 MMCS,我希望防止授予此类访问权限。在 MMCS 策略中,不允许写入级别低于进程低级别的文件。这意味着通过设置用户的低级别,管理员可以确定读取该用户创建的文件所需的最低访问权限。
MCS 和 MLS 策略有几个显着差异。在 MLS 中,访问基于范围的低级别(有效许可),范围的高级别主要用于通过 newrole 程序确定访问。在 MCS 中,读取和写入的访问都基于范围的高级别,而低级别仅用于限制写入访问。另一个区别是 MCS 旨在仅保护文件内容,而 MLS 限制所有数据传输方法。另一个主要区别是,在 MCS 中,进程可以在最小的限制下启动具有不同范围的子进程。
Russell Coker 自 2001 年以来一直致力于安全增强型 Linux (SELinux)。他是一位独立顾问,专门从事 SELinux 和 ISP 管理。