CentOS 上的 SELinux 初学者指南
安全增强型 Linux 或 SELinux 是一种基于 Linux 的安全架构,允许系统管理员对系统访问进行额外的控制。 美国国家安全局将该架构开发为一系列安全补丁,利用其内核中的 Linux 安全模块。此安全架构还用于指定用户对系统的访问权限。此外,它还可以帮助 Linux 用户执行与使用系统应用程序、资源和服务相关的策略。
在本指南中,我们将介绍与 SELinux 相关的以下 19 点:
“安全增强”一词是什么意思?
SELinux 是如何工作的?
SELinux 特性
在 CentOS 上设置 SELinux
SELinux 模式
在 CentOS 上启用 SELinux
SELinux 政策
更新 SELinux 布尔设置
展示 SELinux 功能
文件和进程的安全增强结构
SELinux 中的文件上下文
SELinux 中的进程上下文
进程如何访问资源?
配置 HTTP 防火墙
目录和文件上下文继承
测试文件中的上下文错误
修改和恢复文件上下文
SELinux 中的用户设置
限制切换用户的访问
“安全增强”一词是什么意思?
非营利组织、志愿者和公司都在致力于改进 Linux 内核代码。 SELinux 是一个独立的安全模块,充当 Linux 内核的扩展。 2003年,它被正式纳入Linux内核。一些 Linux 发行版包含 SELinux 作为常规功能;但是,如果您不想使用其服务,您可以轻松禁用它。 SELinux 允许系统管理员控制在其计算机上运行的程序。它会阻止所有被认为“必要”的进程。 ” 因此,与用户程序中的安全漏洞相关的风险显着降低。
尽管您信任任何软件,但限制其与访问相关的权限仍然是一个好主意。如果任何第三方劫持您的可信软件,可能会造成严重后果。此外,如果受恶意软件感染的程序具有对进程和系统数据的完全访问权限,则可能会造成很大的损害。 SELinux 通过限制访问来降低损坏风险。
SELinux 是如何工作的?
SELinux 建立对访问系统文件、应用程序和进程的控制。为了强制执行策略授予的访问权限,它使用安全策略,其中包括指示 SELinux 系统访问限制的规则。
SELinux通过存储客体和主体权限的访问向量缓存(AVC)检查访问权限。当任何进程或应用程序请求访问任何对象时,SELinux 都会通过AVC。如果SELinux无法根据缓存的权限做出访问决策,它会将请求传输到安全服务器。之后,安全服务器查找进程或应用程序以及文件安全上下文。 SELinux 策略数据库用于应用安全上下文。之后,给予或拒绝许可。
如果SELinux拒绝该权限,/var/log.messages中将出现“avc:拒绝”消息。
SELinux 特点:
SELinux 包括以下功能:
它为任何基于 Linux 的系统提供了适应性强的安全策略。
政策与执行的明确分离。
它还可以支持查询策略,然后实施其访问控制。
进程的执行、继承及其初始化都在这个安全系统的控制之下。
策略接口在此安全架构中得到了明确定义。
它控制打开的文件描述符、文件系统、目录、网络接口、套接字和相关消息。
具体的安全标签类型和内容并不相互依赖。
策略接口在此安全架构中得到了明确定义。
支持政策变更。
具体政策和政策语言是独立的。
它还控制“功能”的使用方式。
AVC 缓存有关访问决策的信息。
该策略不允许任何未明确定义的内容。
数据机密性和系统完整性分别受到保护。
内核服务和对象有其标签和控件。
在开始之前让我们先了解一些事情。
MAC是强制访问控制的缩写,是SELinux的一项功能。 MAC 构建于自主访问控制 (DAC) 之上,所有 Linux 发行版均已包含该功能。让我们首先看看常规 Linux 文件安全性是如何工作的,以便更好地了解 DAC。我们在标准安全模型中拥有三个实体:UGO(用户、组、其他)。这些实体中的每一个都具有其对目录或文件的权限组合。
例如,我们的主目录中有一个“Linuxhint”用户。这个“Linuxhint”用户具有与其组和其他组相关的某些权限,您可以在下面给出的命令的输出中看到:
“Linuxhint”用户现在可以更改此访问权限。它可以限制和授予其他组、用户对此文件的访问权限,并修改文件的所有者。这些操作可能会将重要文件暴露给不需要访问权限的用户帐户。
现在,让我们考虑以下场景:Linux 进程以 root 用户或具有超级用户权限的用户身份运行。现在,如果黑客获得了正在运行的程序的控制权,他就可以利用它来访问该特定用户的任何可访问资源。
考虑另一种情况,您希望阻止用户从其主目录运行 shell 脚本。当您有一个开发团队在生产系统上工作时,如果您希望您的团队检查日志文件,您可能会遇到这种情况。但在同样的情况下,您不希望开发人员从主目录执行脚本。那么这个问题可能的解决方案是什么?
SELinux 是一个用于微调此类访问控制要求的工具。使用此安全架构,您可以限制用户或进程的访问。它将每个进程隔离到其域中,允许其处理域中的特定进程和文件。这可以防止黑客通过劫持任何进程来访问系统。
在 CentOS 上设置 SELinux
现在,我们将在 CentOS 8 上设置一个安全增强系统。为此,首先我们必须安装SFTP和Apache服务。使用下面给出的命令在您的系统上安装 Apache:
输入“y”以允许进程安装 Apache。
启动“httpd”服务:
我们要在 CentOS 上安装的另一个软件包是“vsftpd”。 ” 按照以下命令进行安装:
现在,启用“vsftpd”服务:
SELinux 使用了很多软件包。其中一些已预安装在 Linux 发行版中。可以在此处找到基于 Red Hat 的发行版的列表:
selinux-policy:发布SELinux参考策略
libselinux-utils:SELinux管理相关工具
setools 是一套工具,用于解决与文件上下文管理、查询策略和审核日志监控相关的问题。
policycoreutils-python 是一个实现 policycoreutils 的 Python 包
setools-console 是 SETools 的命令行界面
mcstrans:它提供了将不同级别翻译成易于理解的格式的工具
policycoreutils 是一组与策略相关的实用程序
selinux-policy-targeted:发布SELinux的针对性策略
setroubleshoot-server:用于对服务器进行故障排除的工具
作为 root 用户,使用以下命令查看 CentOS 8 系统上安装了哪些 SELinux 软件包:
写出以下命令来在您的系统上安装 SELinux 缺少的软件包:
完成安装后,您现在就拥有了一台带有所有必需的 SELinux 实用程序的计算机。
SFTP 和 Apache 服务器 使用默认设置运行。
SELinux 模式:
SELinux 以以下三种模式之一运行:
宽容:宽容模式类似于部分启用状态。在此模式下,安全增强架构不会声明其策略。因此,不会禁止任何访问,但审核文件仍然会记录发生的任何策略违规行为。这种模式被认为是在实施之前对 SELinux 进行测试的绝佳方法。
强制:在此模式下,SELinux将通过拒绝进程和用户的任何未经授权的访问尝试来实施其策略。此模式的附加功能是访问拒绝也将写入适当的日志文件。
禁用:在此模式下,Linux 系统将在没有增强安全性的情况下运行。
要了解系统上当前启用的 SELinux 模式,请使用“getenforce”命令:
“setstatus”将显示与您的SELinux模式相关的详细输出。
现在,让我们使用下面给出的命令来检查 SELinux 配置文件:
该文件包含两个指令。正如我们之前所解释的,SELINUX 将指定 SELinux 模式,并且可以采用三个值之一:Permissive、Disabled 或 Enforcing。
“Targeted”是SELINUXTYPE的默认值。文件的这一部分用于声明策略。 SELinux 允许您使用特定策略微调和修改访问控制权限。另一种选择是多级安全性(MLS),这是一种更高级的安全保护形式。
在 CentOS 上启用 SELinux:
按照此过程在您的系统上启用 SELinux。首先,打开SELinux配置文件进行一些必要的更改:
您可以看到 SELinux 指令的状态设置为“强制”。 ” 将状态修改为值“许可”。 ”
您必须知道每个系统文件都应该有其上下文。在您的系统上强制执行SELinux之前,需要将状态设置为“许可”。标签错误的文件会导致进程严重失败。因此,引导过程可能会失败或开始时出现大量错误。
现在重新启动您的 CentOS 系统:
在重新引导过程中,服务器上存在的所有文件都将使用 SELinux 上下文进行标记。 SELinux 访问拒绝和错误将会被通知,因为系统是允许的,但不会阻止任何事情。
之后,查找 SELinux 正在阻止的字符串:
如果输出中没有显示错误,请转到下一步。
在此过程的另一半中,我们将更改 SELinux 指令值。为此,请打开SELinux 配置文件。
将 SELinux 值更改为“enforcing”,然后按“CTRL+O”保存更改。
现在,再次重新启动您的 CentOS:
现在,检查您的 SELinux 状态:
另外,检查SELinux模式是否更新:
“setenforce”命令用于在SELinux模式之间切换。
要将SELinux模式切换回强制模式,请按以下方式编写“setenforce”命令:
SELinux 的政策:
根据安全增强架构策略,首先必须授予用户指定角色的权限,然后再授予该角色访问域的权限。之后,该域只能访问特定文件。 SELinux 的这一部分实现了基于角色的访问控制(RBAC)。
当启用SELinux系统启动时,该策略会加载到内存中。该安全架构的策略以模块的形式组织。它们还可以在运行时动态添加和从内存中取出,就像内核模块一样。 SELinux 的存储会跟踪加载的模块。 “sestatus”命令显示策略存储的名称。 “semodule -l”工具显示内存中当前加载的SELinux策略模块。
让我们运行 semodule 命令来更好地了解它:
使用 semodule 可以安装、卸载、更新、启用、禁用和重新加载 SELinux 策略模块。
要了解加载的安全策略模块的位置,请在终端中写出以下给出的命令:
更新 SELinux 布尔设置:
执行此命令可查看加载策略中存在的各种开关的状态:
输出将显示每个开关的当前状态:
“getsebool”是查看这些开关状态的命令,“setsebool”将允许您修改当前开关状态。为了演示这些命令,我们将通过一个简单的示例来启用“ftpd.”的写访问权限。
展示 SELinux 功能:
为了跟上我们的步伐,您必须创建四个测试帐户。在我们的例子中,我们创建了以下用户:
“suser”代表切换用户
“restuser”代表受限用户
“用户”代表普通用户
“guser”代表来宾用户
文件和进程的安全增强结构:
SELinux 的目标是保护基于 Linux 的环境中文件和进程的访问。如果未启用SELinux,则启动任何应用程序或进程(例如Apache 守护进程)的用户将在其上下文中执行。因此,假设任何以 root 身份运行的恶意应用程序都可以完全控制您的系统。在这种情况下,该应用程序可以做任何它想做的事情,使 root 完全控制所有文件。 这非常可怕。
SELinux 就是为了消除这种风险。应用程序或进程仅在需要与 SELinux 一起运行时才具有访问权限。应用程序SELinux策略将定义进程和应用程序访问。
SELinux 中的文件上下文:
在Linux系统中,增强安全性的第一步是为每个实体分配一个标签。标签指示资源上下文。现在的问题是,上下文到底是什么?上下文是一组与安全相关的数据,SELinux 使用它来决定访问控制。安全上下文可以分配给 Linux 系统中的任何内容,包括端口、目录、文件和用户帐户。对于不同类型的对象,安全上下文的含义不同。
现在,检查以下命令的执行情况:
现在,在同一命令中添加“-Z”标志,并注意差异:
输出将向您显示有关用户和组所有权的附加列,也称为“文件的安全上下文。”
现在,我们来谈谈上面突出显示的那一行。该行代表安全上下文。它分为4个部分;冒号 (:) 用于分隔各个部分。用户上下文在第一部分,也用“u”表示。每个Linux用户的帐户对应一个SELinux用户。 SELinux 角色“object_r”在第二部分中指定。第三部分是文件类型“etc_t,”,这是最关键的部分。这是指定文件目录类型的部分。 “etc”的文件上下文。 ”目录是“etc_t”类型。类型可以被认为是文件属性或组,可用于对文件进行分类。
SELinux 中的进程上下文:
首先启动SFTP和Apache服务:
现在,使用带有“-Z”标志的“ps”命令来显示安全上下文。
输出将显示带有 PID、父进程 ID 和安全上下文的进程列表。
属于安全上下文的部分是:
用户、角色、域和敏感度是安全上下文的四个部分。用户、角色和敏感度上下文的工作方式与文件的工作方式相同。进程有其域。那么,域如何影响进程呢?它为进程提供了操作的上下文。它指定了进程的功能。此限制确保每个进程域只能处理特定的文件类型。
即使另一个恶意用户或进程劫持了某个进程,最糟糕的情况也是它有权访问的文件被损坏。此限制是在内核级别实现的,因此访问控制至关重要;当 SELinux 策略加载到内存中时,它就会被强制执行。
注意:
“_r”后缀是为角色指定的。
“_u”适用于SELinux用户。
“_t”代表文件类型或进程域。
进程如何访问任何资源?
该方法包括以下步骤:
如果进程属于特定域则允许访问
资源对象(进程寻求访问)属于特定类型和类。
否则,对该资源的访问将被拒绝。
为了进一步发展,我们将在 Web 服务器默认主目录中创建一个名为“index.html”的示例文件。
正如您在输出中看到的,“httpd_sys_content_t”是内容 d 的文件上下文。
将显示在网络上。
使用“sesearch”查看httpd允许的访问类型。输出声明 httpd 对 httpd 文件具有读取、写入、打开、I/O 控制和get_attribute 访问权限强>。
<title>
Testing a web page
</title>
<body>
<h1>Testing a web page</h1>
</body>
</html>
更改“index.html”文件权限:
现在,我们将重新启动“httpd”服务:
另外,检查“httpd”的状态并启用它:
注意:如果您的系统已在端口 80 上配置用于传入 HTTP 流量,请忽略以下部分并继续。在另一种情况下,首先,您必须为 HTTP 流量启用端口 80。
配置 HTTP 防火墙:
首先,检查防火墙当前允许的服务。
现在授权服务的端口:http 和 https
现在,重新加载防火墙设置:
使用以下命令列出防火墙允许的服务:
在这里,您可以看到已配置HTTPS 和 HTTP。
同时打开其他端口,并检查状态:
现在,在浏览器中打开索引文件。它将向您显示以下内容:
一切都进行得很顺利。现在,我们扭转局面并在文件上下文中进行一些更改。 “chcon”命令就是用于此目的。使用“-type,”,您可以指定资源的特定类型。
再次访问这个“index.html”网页。它会向您显示以下错误:
究竟发生了什么?文件访问被拒绝,但是此访问被拒绝给谁呢? Web服务器只能访问SELinux下的特定文件,而“var_t”不是其中之一。由于我们修改了“index.html”文件的文件上下文,Apache 现在无法访问它。利用“restorecon”恢复“index.html”文件上下文。
目录和文件上下文继承:
SELinux 强加了一个称为“上下文继承”的概念。上下文继承表明文件和进程是根据其父上下文生成的,除非 SELinux 指出。
本节将教您这样一个概念:当您从一个目录复制并将其保存到另一个目录时,其文件上下文不会保留为原始目录,而是更改为现在保存的目录上下文。相反,当我们将文件从一个目的地移动到另一个目的地时,其文件上下文将被保留并且不会改变。
查看“www”目录的文件上下文:
现在,使用此命令将文件复制到另一个目标:
现在,再次检查“index.html”文件上下文,您会注意到它已更改为“var_t”,这是“var_t”的文件上下文>var”目录。
但在另一种情况下,当您将此文件移动到另一个目录时,例如在“etc”中。 ”:
“index.html”文件上下文不会改变。
测试文件中的上下文错误:
首先,我们在“www”文件夹中创建一个目录“html”:
查看“www”目录的上下文:
现在,我们将“var/www/html”的内容复制到“/www/html”:
根据上一节,现在应该更改复制文件的文件上下文。进一步,我们将修改“httpd”的配置文件:
将文档根更新为:
我们还必须更新访问权限部分,如下图所示。
您只需将“var/www”文件更改为“/www”。 ”
将我们所做的更改保存到“httpd”配置文件中,并重新启动其服务:
再次访问页面:
我们遇到此错误是因为“index.html”文件上下文已更改。要访问此网页,需要将其设置回原始上下文。
修改和恢复文件上下文:
“restorecon”和“chcon”是用于更改任何文件的上下文的命令。 “restorecon”将任何文件的上下文恢复到原始文件,并且您不必在其命令中指定它。而“chcon”命令用于临时更改文件上下文,您必须确定其命令中的正确上下文。
现在,让我们通过编写以下命令来查看某个文件的上下文:
必须遵循两步方法来永久修改“/www/html”下“index.html”文件的上下文:
首先,我们将执行“semanage fcontext”命令。执行该命令将在本地上下文文件中添加指定的文件上下文。
对其他目录执行相同的执行:
再次检查本地文件存储文件上下文并注意两个目录的更改上下文。
现在,使用“restorecon”命令重新标记文件:
“matchpathcon”命令用于比较本地上下文文件中存在的文件上下文和文件上标记的内容:
“已验证”表明我们具有相同的上下文。
SELinux 中的用户设置:
SELinux 用户(包括 root 帐户)与普通用户帐户不同。启动时,安全增强型 Linux 用户会加载到内存中。 SELinux 用户的价值在于其为系统提供的访问级别。
SELinux 用户在安全上下文的第一部分中说明。用户标签显示正在执行进程的安全增强型 Linux 用户。多个用户帐户可以链接到单个 SELinux 用户。这个映射过程允许标准帐户继承 SELinux 对应帐户的权限。
所有常规用户帐户都映射到“默认”登录名,而第二列的 SELinux 用户由实体“unconfined_u”表示。
要获取有关用户的更多详细信息,请写出以下给出的命令:
此命令将显示策略定义的所有 SELinux 用户以及与他们关联的角色。
如前所述,“默认”登录名所代表的用户被映射到“unconfined_u,”,这意味着他们有权打开任何应用程序。在上面的输出中,我们可以看到“unconfined_user”映射到角色:“unconfined_r”和“system_r”。从这些语句中可以得出结论,如果映射到“confined_u.”,用户将有权执行任何应用程序。
下面提到的命令的输出将证明我们的声明是正确的:
切换到普通用户:
正如我们在文章开头部分提到的,我们创建了四个测试帐户:“ruser”,它象征着普通用户。要切换到“ruser”,请按以下方式使用“su”命令:
现在检查它的映射、角色和域。
限制切换用户的访问:
为了更好地查看SELinux如何限制特定用户对资源、目录和进程的访问,我们将从常规用户帐户切换到“suser”。 ”
注意:“suser”表示切换用户,它是为了测试目的而创建的。
现在,切换回超级用户或 root 并更改 SELinux 常规用户“ruser”映射。
指定“-a”标志会将常规用户“ruser”添加到SELinux用户帐户中。注销然后重新登录以使系统使修改生效。
现在,再次将其切换回切换后的用户帐户“suser”:
它会显示“身份验证失败。”的错误。
限制SELinux用户执行脚本的权限:
现在,修改来宾用户的映射:
确认映射更改:
现在,注销并以“guser”访客用户身份重新登录:
查看当前工作目录:
现在,我们将检查根据我们所做的更改,SELinux 仍将限制“guser”执行脚本的访问权限。为此,首先,我们将创建一个名为“testscript.sh”的测试脚本。
在此脚本中添加一些内容如下:
echo "This is a test script"
更改“testscript.sh”权限:
现在从终端执行创建的测试脚本。
注意:您正尝试以“guser”来宾用户身份执行脚本。
要禁止“guser”执行脚本,请依次执行以下命令:
现在,尝试执行相同的脚本。输出将显示“权限被拒绝错误。”
结论:
SELinux 对于 Linux 初学者来说设置起来可能比较困难,但它很好地介绍了管理系统访问控制的几种方法。本指南从SELinux的理论意义、模式、政策到实际应用对SELinux进行了讨论。此外,我们还向您展示了限制对系统的访问的不同方法。