这是机器未来的第40篇文章
原文首发地址:https://blog.csdn.net/RobotFutures/article/details/126117336
丹尼尔·J·沃尔什 (RedHat)
译者按:博主借助翻译工具翻译了这篇文章,非常形象地描述了SELINUX的三种策略类型:targeted(TE Enforcement)、mcs、mls。
三种策略的安全级别依次增强,TE, MCS, MLS,MLS最高,每种安全策略都是在上一种安全策略的基础上叠加新的安全策略。
在TE的基础上,针对多个同样的进程,通过在启动进程时在进程和文件对象增加多类别标签MCS,实现权限隔离。
在MCS标签完全匹配的情况下,MLS增加了多级别标签sx(x=0,1,2,…),实现绝密>秘密->…,多级别的访问权限控制。
图片来源:开源网站
今年我们庆祝 SELinux 成立 10 周年。很难相信。 SELinux 最初是在 Fedora Core 3 中引入的,后来在 Red Hat Enterprise Linux 4 中引入。 对于那些从未使用过 SELinux 或想要解释的人…
SElinux 是一个标签系统。每个过程都有一个标签。操作系统中的每个文件/目录对象都有一个标签。甚至网络端口、设备和可能的主机名也有分配给它们的标签。我们编写规则来控制进程标签对对象标签(如文件)的访问。我们称之为政策。内核执行规则。有时这种强制执行称为强制访问控制 (MAC)。
对象的所有者对对象的安全属性没有决定权。标准的 Linux 访问控制,所有者/组 + 权限标志,如 rwx,通常称为自由访问控制 (DAC)。SELinux 没有 UID 或文件所有权的概念。一切都由标签控制。这意味着可以在没有功能强大的根进程的情况下设置 SELinux 系统。
注意: SELinux 不允许您绕过 DAC 控制。 SELinux 是一种并行执行模型。SELinux 和 DAC 都必须允许应用程序执行某些活动。这可能会导致管理员感到困惑,因为该进程会被拒绝权限。管理员看到 Permission Denied 意味着 DAC 有问题,而不是 SELinux 标签。
让我们进一步研究一下标签。SELinux 主要模型或强制执行称为类型强制。基本上,这意味着我们根据进程的类型定义进程的标签,并根据其类型定义文件系统对象的标签。
比喻
想象一个系统,我们在其中定义猫和狗等对象的类型。猫和狗是过程类型。
** Máirín Duffy的所有漫画*
我们有一类他们想要与之交互的对象,我们称之为食物。我想为食物添加类型,cat_food和dog_food。
作为一名政策制定者,我会说狗有权吃dog_chow食物,猫有权吃cat_chow食物。在 SELinux 中,我们会在策略中编写此规则。
允许 cat cat_chow:food 吃;
允许狗 dog_chow:food 吃;
使用这些规则,内核将允许 cat 进程吃标记为cat_chow的食物,而狗吃标记为dog_chow的食物。
但是在 SELinux 系统中,默认情况下一切都会被拒绝。这意味着如果 dog 进程试图吃掉cat_chow ,内核会阻止它。
同样,猫也不允许接触狗食。
真实世界
我们将 Apache 进程标记为httpd_t ,并将 Apache 内容标记为httpd_sys_content_t和httpd_sys_content_rw_t。假设我们将信用卡数据存储在标记为msyqld_data_t的 mySQL 数据库中。如果 Apache 进程被黑客入侵,黑客可以控制httpd_t 进程并被允许读取httpd_sys_content_t文件并写入httpd_sys_content_rw_t。但是即使进程以 root 身份运行,黑客也不会被允许读取信用卡数据 ( *mysqld_data_t )。*在这种情况下,SELinux 已经减轻了入侵。
比喻
上面,我们输入了 dog 进程和 cat 进程,但是如果您有多个 dogs 进程会发生什么:Fido 和 Spot。你想阻止 Fido 吃 Spot 的dog_chow。
一种解决方案是创建许多新类型,例如Fido_dog和Fido_dog_chow。但是,这很快就会变得不守规矩,因为所有的狗都拥有几乎相同的权限。
为了解决这个问题,我们开发了一种新的执法形式,我们称之为多类别安全 (MCS)。在 MCS 中,我们添加了标签的另一部分,我们可以将其应用于 dog 过程和 dog_chow 食物。现在我们将 dog 进程标记为dog:random1 (Fido) 和dog:random2 (Spot)。
我们将狗食物标记为dog_chow:random1 (Fido)和dog_chow:random2 (Spot)。
MCS 规则表示,如果类型强制规则正常且随机 MCS 标签完全匹配,则允许访问,否则拒绝访问。
Fido (dog:random1) 试图吃cat_chow:food被类型强制拒绝。
Fido (dog:random1) 被允许吃dog_chow:random1。
Fido (dog:random1) 拒绝吃 spot ( dog_chow:random2 ) 的食物。
真实世界
在计算机系统中,我们经常有很多进程都具有相同的访问权限,但我们希望它们彼此分离。我们有时将其称为多租户环境。最好的例子是虚拟机。如果我有一台运行大量虚拟机的服务器,其中一个被黑客入侵,我想防止它攻击其他虚拟机和虚拟机映像。但是在类型强制系统中,KVM 虚拟机被标记为svirt_t并且图像被标记为svirt_image_t。我们有规则说svirt_t可以读取/写入/删除标记为svirt_image_t 的内容. 使用 libvirt,我们不仅实现了类型强制分离,还实现了 MCS 分离。当 libvirt 即将启动虚拟机时,它会选择一个随机的 MCS 标签,如s0:c1,c2,然后将svirt_image_t:s0:c1,c2标签分配给虚拟机需要管理的所有内容. 最后,它以svirt_t:s0:c1,c2的形式启动虚拟机。然后,SELinux 内核控制svirt_t:s0:c1,c2不能写入svirt_image_t:s0:c3,c4,即使虚拟机被黑客控制并接管它。即使它以root身份运行。
我们在 OpenShift 中使用类似的分离。每个齿轮(用户/应用程序进程)都使用相同的 SELinux 类型 (openshift_t) 运行。策略定义了控制齿轮类型和唯一 MCS 标签访问的规则,以确保一个齿轮不能与其他齿轮交互。
观看这个简短的视频,了解如果 Openshift 齿轮成为 root 会发生什么。
SELinux 实施的另一种形式,使用频率要低得多,称为多级安全性 (MLS)。它是在 60 年代开发的,主要用于受信任的操作系统,如 Trusted Solaris。
主要思想是根据他们将使用的数据级别来控制流程。秘密进程无法读取绝密数据。
MLS 与 MCS 非常相似,只是它在执行中添加了支配性概念。在 MCS 标签必须完全匹配的情况下,一个 MLS 标签可以支配另一个 MLS 标签并获得访问权。
比喻
我们现在不讨论不同的狗,而是讨论不同的品种。我们可能有一只灰狗和一只吉娃娃。
我们可能想让灰狗吃任何狗粮,但如果吉娃娃试图吃灰狗狗粮,它可能会窒息。
我们要将 Greyhound 标记为dog:Greyhound并将其狗粮标记为dog_chow:Greyhound, 并将 Chihuahua 标记为dog:Chihuahua并将其食物标记为dog_chow:Chihuahua。
使用 MLS 政策,我们将让 MLS Greyhound 标签主导 Chihuahua 标签。这意味着dog:Greyhound可以吃dog_chow:Greyhound 和dog_chow:Chihuahua。
但是dog:Chihuahua不允许吃dog_chow:Greyhound。
当然,dog:Greyhound和dog:Chihuahua通过类型强制仍然被阻止吃cat_chow:Siamese,即使 MLS 类型的 Greyhound 支配 Siamese。
真实世界
我可以有两台 Apache 服务器:一台作为httpd_t:TopSecret运行,另一台作为httpd_t:Secret运行。如果 Apache 进程httpd_t:Secret被黑客入侵,黑客可以读取httpd_sys_content_t:Secret 但无法读取httpd_sys_content_t:TopSecret。
但是,如果运行httpd_t:TopSecret的 Apache 服务器 被黑客入侵,它可以读取httpd_sys_content_t:Secret 数据以及httpd_sys_content_t:TopSecret。
我们在军事环境中使用 MLS,其中可能只允许用户查看机密数据,但同一系统上的另一个用户可以读取绝密数据。
SELinux 是一个强大的标签系统,控制内核授予单个进程的访问权限。其主要特征是类型强制,其中规则根据进程的标记类型和对象的标记类型定义允许对进程的访问。添加了两个额外的控件来将具有相同类型的进程相互分离,称为 MCS、相互完全分离和 MLS,从而允许进程控制。
Máirín Duffy的插图 。 获取着色书!
有关 SELinux 的更多信息,请阅读我在 danwalsh.livejournal.com 上的博客,并在 twitter @rhatdan上关注我。