在 Linux 中使用 SELinux 或 AppArmor 实现强制访问控制


Linux 内置支持两种强制访问控制 (MAC) 系统:SELinux 和 AppArmor。这两个系统都在 Linux 自带的默认任意访问控制 (DAC) 基础上增加了额外的访问控制层。在本文中,我们将深入探讨这两个系统的实现,提供实际示例及其各自的输出。

了解 SELinux 和 AppArmor

SELinux,即安全增强型 Linux,是 Linux 内核安全模块,提供了一种支持访问控制安全策略的机制。它是一个高度灵活的 MAC 系统,为系统中的每个对象(文件、目录、端口等)分配标签,并使用策略定义这些对象之间的交互。SELinux 通常用于需要强大、复杂安全策略的场景。

另一方面,AppArmor(应用程序装甲)是另一个基于路径的 MAC 系统,配置和管理起来比 SELinux 简单一些。它根据一组规则限制程序,这些规则指定程序可以访问哪些文件和功能。当易用性和简单性至关重要时,AppArmor 是一个不错的选择。

实现 SELinux

检查 SELinux 状态 - 首先,通过运行 sestatus 确保 SELinux 在您的系统上已启用。输出将显示 SELinux 状态和当前的强制模式。

$ sestatus
SELinux status:         enabled
Current mode:           enforcing

如果 SELinux 已禁用,则需要启用它并将模式设置为“强制”。您可以通过编辑 /etc/selinux/config 文件来实现。

了解 SELinux 上下文 - 在 SELinux 中,每个文件、用户、进程和资源都有一个上下文,用于做出访问决策。使用 ls -Z 列出文件及其 SELinux 上下文。

$ ls -Z /var/www/html/index.html
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html

在上述输出中,system_u:object_r:httpd_sys_content_t:s0 是文件的 SELinux 上下文。

更改文件上下文 - 假设您想从新目录 /var/www/new_dir 提供文件服务。默认情况下,SELinux 将阻止 HTTP 服务器访问这些文件。您可以通过使用 chcon 命令对目录应用正确的上下文来允许访问。

$ chcon -R -t httpd_sys_content_t /var/www/new_dir

使用 ls -Z 验证更改。

$ ls -Z /var/www/new_dir
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/new_dir

实现 AppArmor

检查 AppArmor 状态 - 使用 sudo systemctl status apparmor 确保 AppArmor 已安装并正在运行。输出应显示 AppArmor 处于活动状态(正在运行)。

$ sudo systemctl status apparmor
● apparmor.service - Load AppArmor profiles
   Loaded: loaded (/lib/systemd/system/apparmor.service; enabled; vendor preset: enabled)
   Active: active (exited) since Mon 2023-06-27 12:34:56 UTC; 1h 10min ago

如果 AppArmor 未运行,请使用 sudo systemctl start apparmor 启动它。

AppArmor 配置文件 - AppArmor 通过位于 /etc/apparmor.d/ 中的配置文件控制程序访问。使用 sudo aa-status 列出配置文件。

$ sudo aa-status
apparmor module is loaded.
14 profiles are loaded.
14 profiles are in enforce mode.

创建和实施配置文件:假设您想为 /usr/sbin/nginx 程序创建一个配置文件。首先,使用 aa-complain 将 AppArmor 设置为对此程序的“抱怨”模式。

$ sudo aa-complain /usr/sbin/nginx

接下来,在程序运行时使用 aa-genprof 生成配置文件。

$ sudo aa-genprof /usr/sbin/nginx

最后,使用 aa-enforce 将程序置于“强制”模式。

$ sudo aa-enforce /usr/sbin/nginx

现在,Nginx 在指定的 AppArmor 配置文件下运行,任何违规行为都将被阻止并记录。

超越基本 SELinux 实现

上一节概述了开始使用 SELinux 的基本步骤,但 SELinux 可以提供更细粒度的访问控制和安全功能。

布尔值 - SELinux 中的布尔值启用或禁用对特定功能的访问。例如,假设您想允许 Apache HTTP 服务器建立到任何目的地的网络连接。这可以通过设置 httpd_can_network_connect 布尔值来完成。

$ setsebool -P httpd_can_network_connect on

要查看此布尔值的当前状态,请使用 getsebool。

$ getsebool httpd_can_network_connect
httpd_can_network_connect --> on

用户角色和级别 - 在 SELinux 中,用户与角色关联,角色与域关联。您可以通过为用户分配特定角色来定义用户可以访问哪些资源。此外,SELinux 支持多级安全。这意味着您可以为用户和资源指定安全级别,从而创建一项策略,只允许具有特定级别的用户访问相同级别的资源。

高级 AppArmor 实现

与 SELinux 一样,AppArmor 也提供了超出其基本功能的其他功能 -

子配置文件和子配置文件 - AppArmor 允许创建子配置文件和子配置文件,以更精细地控制应用程序权限。例如,如果您有一个 Web 服务器的父配置文件,则可以为该服务器运行的 CGI 脚本创建一个子配置文件,从而限制这些脚本的权限。

网络访问控制 - AppArmor 可以控制应用程序可以访问哪些网络资源。例如,您可以创建一个配置文件,允许程序仅打开到特定 IP 地址或端口的网络连接。

配置文件堆叠 - AppArmor 支持配置文件堆叠,这意味着您可以将多个配置文件应用于单个任务。这允许您组合来自不同配置文件的规则,从而在访问控制策略中提供更高的自定义程度和粒度。

SELinux 和 AppArmor 都是用于在 Linux 中实现强制访问控制的强大工具。有效使用它们的关键在于了解您的特定需求以及您愿意在访问控制策略中管理的复杂程度。通过研究每个工具的各种功能和特性,您可以选择最适合您情况的工具,并为您的系统提供最大程度的保护。

结论

虽然 SELinux 和 AppArmor 都提供了强大的访问控制机制,但两者之间的选择将取决于您的特定需求。如果您需要对系统的每个方面进行高度灵活和细粒度的控制,则 SELinux 是最佳选择。但是,如果您更喜欢一种更简单、更用户友好的安全方法,则 AppArmor 将更合适。请记住,保护您的系统不是一次性操作,而是一个持续监控、更新和实施访问控制策略的过程。

更新于: 2023-07-17

333 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告