在 Linux 中使用 SELinux 或 AppArmor 实施强制访问控制
Linux 内置了对两种类型的强制访问控制 (MAC) 系统的支持:SELinux 和 AppArmor。这两个系统都在 Linux 附带的默认自主访问控制 (DAC) 的基础上添加了额外的访问控制层。在本文中,我们深入研究了这两个系统的实现,提供了实际示例及其各自的输出。
了解 SELinux 和 AppArmor
SELinux是Security-Enhanced Linux的缩写,是一个Linux内核安全模块,提供支持访问控制安全策略的机制。它是一个高度灵活的MAC系统,为系统中的每个对象(文件、目录、端口等)分配标签,并使用策略来定义这些对象之间的交互。 SELinux 通常用于需要强大、复杂的安全策略的情况。
另一方面,AppArmor(应用程序 Armor)是另一个基于路径的 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 状态 - 确保 AppArmor 已安装并使用 sudo systemctl status 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 Server 与任何目标建立网络连接。这可以通过设置 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 会更合适。请记住,保护系统安全不是一次性的操作,而是监视、更新和执行访问控制策略的持续过程。