SELinux 简介
SELinux(Security-Enhanced Linux) 是一种 Linux 内核安全模块(LSM),旨在增强 Linux 系统的安全性。它由美国国家安全局(NSA)开发,并作为 Linux 内核的一部分提供。SELinux 为 Linux 提供了强制访问控制(MAC),限制和控制进程、文件、网络连接等的访问权限。通过使用 SELinux,系统管理员能够细粒度地定义哪些进程可以访问哪些资源,从而大幅减少系统被攻击的风险。
SELinux 的核心概念
-
强制访问控制(MAC):
- SELinux 与传统的自主访问控制(DAC,Discretionary Access Control)不同,后者允许用户自主设置文件或资源的访问权限。而 SELinux 使用强制访问控制,这意味着系统管理员可以定义每个程序和用户的访问权限,而用户和进程不能随意修改这些权限。
-
策略(Policy):
- SELinux 使用策略文件来定义如何管理访问控制。这些策略定义了系统中每个进程如何访问文件、网络资源等。策略可以根据需要调整,以便在允许合法操作的同时,最大限度地减少潜在的安全风险。
-
上下文(Context):
- 在 SELinux 中,系统资源(如文件、进程、端口等)都与标签(或称上下文)关联。上下文包括三个部分:
- 用户:如
user_u
,表示进程或文件的用户身份。 - 角色:如
staff_r
,指定该资源的角色。 - 类型:如
httpd_t
,表示该资源的类型。类型是 SELinux 中最常用的控制方式,控制资源如何访问和与其他资源互动。
- 用户:如
- 这些标签可以被用来定义哪些进程或用户可以访问特定的资源。
- 在 SELinux 中,系统资源(如文件、进程、端口等)都与标签(或称上下文)关联。上下文包括三个部分:
-
类型强制(Type Enforcement,TE):
- 类型强制是 SELinux 最重要的控制机制。每个资源都有一个类型标签,进程和文件之间的访问权限由这些类型标签决定。通过这种方式,SELinux 确保了只有符合特定条件的进程才可以访问相应的文件或资源。
-
角色强制(Role-Based Access Control,RBAC):
- 在 SELinux 中,角色强制控制不同角色的用户或进程可以访问哪些资源。角色是定义用户权限的高层次集合,它允许管理员通过角色为用户和进程分配权限。
-
多级安全(MLS):
- SELinux 还可以使用多级安全(MLS)机制来控制不同安全级别的资源访问。例如,敏感信息可以被标记为高安全级别,只有具有适当权限的用户或进程才能访问。
SELinux 的工作模式
SELinux 提供了几种工作模式,用于控制和调试安全策略的应用。它们分别是:
-
Enforcing(强制模式):
- 在此模式下,SELinux 强制执行策略,任何违反策略的行为都会被阻止,并记录在日志中。此模式下系统安全性最高,但可能会阻止一些合法的操作,因此需要根据实际情况进行调整。
- 例如,如果一个未授权的进程试图访问某个文件,SELinux 会阻止访问并生成一条日志记录。
-
Permissive(宽容模式):
- 在此模式下,SELinux 允许所有操作,尽管这些操作可能违反策略,但会记录下这些违规操作。此模式适合用于调试和分析问题,管理员可以通过查看日志决定是否调整策略。
- 这种模式下,系统不会强制执行任何安全限制,但会提供相应的警告信息。
-
Disabled(禁用模式):
- 在此模式下,SELinux 完全被禁用,系统不再应用任何 SELinux 策略。禁用 SELinux 会降低系统的安全性,通常不建议这样做,除非在某些特殊情况下需要暂时关闭 SELinux。
SELinux 策略类型
-
Targeted Policy(定向策略):
- 这是 SELinux 默认的策略,适用于大多数常见的 Linux 环境。定向策略仅对特定的进程(例如 web 服务器、数据库等)实施安全控制,而系统中其他不重要的进程则不受 SELinux 限制。
-
MLS Policy(多级安全策略):
- 这是一个更为严格的策略,用于高安全性要求的环境。它适用于需要高度安全隔离的系统,如政府、军事系统等。MLS 策略基于多级安全原则,每个资源和进程都被标记为不同的安全级别。
SELinux 配置与管理
1. 查看 SELinux 状态
查看 SELinux 当前的状态:
sestatus
输出示例:
SELinux status: enabled
SELinuxfs mount: /selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: no
Max kernel policy version: 31
2. 更改 SELinux 模式
临时切换 SELinux 模式为 Permissive(宽容模式):
sudo setenforce 0
切换回 Enforcing(强制模式):
sudo setenforce 1
3. 永久更改 SELinux 模式
要永久更改 SELinux 的模式,修改 /etc/selinux/config
文件中的 SELINUX
变量:
SELINUX=enforcing
更改为 permissive
或 disabled
,然后重启系统使其生效。
4. SELinux 日志
SELinux 会记录所有被拒绝的操作,可以通过查看日志来诊断问题。SELinux 的日志通常存储在 /var/log/audit/audit.log
文件中。可以使用 ausearch
命令来分析这些日志:
ausearch -m avc -ts recent
5. 管理 SELinux 上下文
-
查看文件的 SELinux 上下文:
ls -Z /path/to/file
-
修改文件的 SELinux 上下文:
sudo chcon -t httpd_sys_content_t /path/to/file
这将为文件设置
httpd_sys_content_t
类型标签。
SELinux 的优缺点
优点:
- 增强的安全性:SELinux 强制访问控制(MAC)提供了比传统的自主访问控制(DAC)更强的安全防护,防止了用户和进程修改访问控制设置。
- 防止越权访问:即使攻击者突破了某些漏洞,SELinux 也可以阻止其进一步扩展,限制其对系统的危害。
- 细粒度的安全控制:SELinux 可以为每个进程和资源分配独立的安全上下文,提供更精细的安全策略。
缺点:
- 配置复杂:SELinux 配置和调试较为复杂,对于管理员来说需要有一定的经验。
- 兼容性问题:某些应用程序和服务可能不与 SELinux 策略完全兼容,导致需要进行额外的配置或临时禁用 SELinux。
- 性能开销:虽然 SELinux 的性能开销通常较小,但在高负载环境中,过于复杂的安全策略可能会影响系统性能。
总结
SELinux 是 Linux 系统中一个重要的安全工具,通过强制访问控制来增强系统的安全性,防止未经授权的访问和攻击。尽管它配置和管理起来较为复杂,但对提高系统的安全性有显著作用。了解并正确配置 SELinux 是 Linux 系统管理员的重要技能之一。