一、概述
- 定义
SELinux(Security - Enhanced Linux)是一种基于 Linux 内核的强制访问控制(MAC)安全机制。它为 Linux 系统提供了更细粒度的安全策略,增强了系统的安全性。 - 目的
主要目的是限制进程对系统资源(如文件、目录、网络端口等)的访问权限,防止恶意软件、非法用户或错误配置导致的安全漏洞,即使应用程序或用户权限被非法提升,也能有效控制其访问范围。
二、工作模式
- 强制模式(Enforcing)
- 在这种模式下,SELinux 会强制执行安全策略。如果违反了安全策略,相应的操作将被阻止,并在系统日志(如
/var/log/messages
)中记录相关的审计信息。这是生产环境中最常用的模式,能最大程度保障系统安全。
- 在这种模式下,SELinux 会强制执行安全策略。如果违反了安全策略,相应的操作将被阻止,并在系统日志(如
- 宽容模式(Permissive)
- 在宽容模式下,SELinux 不阻止违反安全策略的操作,但会记录审计信息。这种模式常用于调试和测试新的安全策略,以便在不影响系统正常运行的情况下检查策略的正确性。
- 禁用模式(Disabled)
- SELinux 完全不工作,系统没有任何 SELinux 相关的安全保护。不建议在生产环境中使用此模式,因为会使系统面临较大安全风险。
三、安全上下文(Security Context)
- 组成部分
安全上下文一般由四个部分组成:用户(user)、角色(role)、类型(type)和级别(level),格式为user:role:type:level
。- 用户(user):SELinux 用户,不是传统 Linux 用户,如
system_u
、user_u
等。不同的 SELinux 用户有不同的访问权限。 - 角色(role):定义了用户在 SELinux 中的角色,如
system_r
、user_r
等。角色用于控制对不同类型资源的访问。 - 类型(type):这是安全上下文的核心部分,决定了对象(如文件、目录、进程)的主要分类和访问规则。例如
httpd_sys_content_t
表示与 HTTP 服务器相关的内容类型。 - 级别(level):用于多级安全策略,如
s0
、s1
等。不同的安全级别可能允许或禁止不同的访问操作。
- 用户(user):SELinux 用户,不是传统 Linux 用户,如
- 查看安全上下文
- 可以使用
ls -Z
命令查看文件和目录的安全上下文。例如,ls -Z /etc
会显示/etc
目录下文件和目录的安全上下文信息。对于进程,可以使用ps -eZ
命令查看进程的安全上下文。
- 可以使用
3.过程
-
解释:
-
当主体(进程)访问目标(文件)时,首先和 SELinux 中定义好的策略进行匹配
-
若符合定义的规则,且主体的安全上下文和目标的安全上下文匹配则允许访问文件
-
若安全上下文比较失败,则拒绝访问,并通过 AVC(Access Vector Cache,访问向量缓存,主要用于记录所有和 SELinux 相关的访问统计信息)生成拒绝访问信息
-
注意:最终是否可以访问到目标文件,还要匹配产生进程(主体)的用户是否对目标文件拥有合理的rwx权限
-
四、策略类型
- 目标策略(Targeted Policy)
- 这是最常用的策略类型。在目标策略中,SELinux 只对特定类型的进程和资源进行保护,而不是对整个系统进行全面控制。例如,它通常会保护网络服务(如 Apache、Nginx、SSH 等)、数据库服务器等关键应用相关的进程和资源,减少了系统的复杂性和管理难度。
- 严格策略(Strict Policy)
- 严格策略对整个系统实施全面的强制访问控制,包括所有的进程、文件、网络等。这种策略提供了最高级别的安全保障,但需要更复杂的配置和管理,因为它可能会影响系统中许多正常的操作,一般用于对安全要求极高的环境。
五、SELinux 相关命令
getenforce
- 用于查看当前 SELinux 的工作模式,输出结果为
Enforcing
、Permissive
或Disabled
。
- 用于查看当前 SELinux 的工作模式,输出结果为
setenforce
- 用于临时改变 SELinux 的工作模式。例如,
setenforce 0
将 SELinux 设置为宽容模式,setenforce 1
将其设置为强制模式。此命令的修改在系统重启后失效。
- 用于临时改变 SELinux 的工作模式。例如,
semanage
- 这是一个功能强大的 SELinux 管理工具。例如:
semanage port -a -t http_port_t -p tcp 8080
:将 TCP 端口 8080 添加到http_port_t
类型,使得相关的 HTTP 服务可以使用该端口(假设安全策略允许)。semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
:为/var/www/html
目录及其下所有文件设置安全上下文类型为httpd_sys_content_t
。
- 这是一个功能强大的 SELinux 管理工具。例如:
restorecon
- 用于恢复文件或目录的默认安全上下文。例如,如果文件的安全上下文被意外修改,可以使用
restorecon -Rv /var/www/html
来恢复/var/www/html
目录及其子目录下所有文件的安全上下文到默认值。
- 用于恢复文件或目录的默认安全上下文。例如,如果文件的安全上下文被意外修改,可以使用
六、故障排除与日志分析
auditd
服务与日志- SELinux 的审计信息通常由
auditd
服务记录。auditd
服务的日志文件一般位于/var/log/audit/audit.log
。当出现 SELinux 相关的访问拒绝问题时,可以通过分析此日志文件来查找原因。
- SELinux 的审计信息通常由
- 常见问题解决步骤
- 首先,查看
/var/log/messages
或/var/log/audit/audit.log
日志,确定是 SELinux 导致的问题(通常会有AVC
(Access Vector Cache)拒绝信息)。 - 然后,根据日志中的提示信息,确定是哪个进程、文件或端口受到了影响,以及违反了哪种安全策略。
- 可以尝试使用
setenforce 0
临时关闭 SELinux(仅用于测试,不建议长期使用),如果问题消失,那么很可能是 SELinux 相关问题。 - 通过
seinfo
、sesearch
等工具进一步分析安全策略,或者使用semanage
等命令调整相关的安全上下文和策略来解决问题。
- 首先,查看