Linux系统SELinux功能介绍

Linux SELinux

SELinux(Security-Enhanced Linux)是一个基于强制访问控制(Mandatory Access Control,MAC)的Linux内核安全模块。它最初由美国国家安全局(NSA)开发,并被集成到主流Linux发行版中,用于加强系统的完全。

一、SELinux的基本概念

  1. SELinux的工作模式

SELinux有三种主要的运行模式:

Enforcing(强制模式):启用SELinux策略,拒绝不符合策略的操作并记录日志。
Permissive(宽容模式):仅记录不符合SELinux策略的操作,不进行阻止。
Disabled(关闭模式):完全关闭SELinux。
# 查看SELinux当前状态sestatus
# 临时修改SELinux模式setenforce 0  # 切换到Permissive模式setenforce 1  # 切换到Enforcing模式
# 永久修改SELinux模式vim /etc/selinux/configSELINUX=enforcing  # 修改为 enforcing、permissive 或 disabled
SELinux的核心概念
安全上下文(Security Context):每个文件、进程或端口都关联一个安全上下文,由user:role:type组成。例如:
system_u:object_r:httpd_sys_content_t:s0
类型(Type):是SELinux最核心的概念,用于指定资源的访问权限。
策略(Policy):定义允许或拒绝哪些操作的规则集。

二、SELinux的基本操作与配置

查看文件和进程的安全上下文
# 查看文件的安全上下文ls -Z /var/www/html
# 查看进程的安全上下文ps -eZ | grep httpd
改变文件的安全上下文
# 改变文件类型chcon -t httpd_sys_content_t /var/www/html/index.html
# 批量修改目录的安全上下文chcon -R -t httpd_sys_content_t /var/www/html/
# 恢复默认的安全上下文restorecon -v /var/www/html/index.html
修改SELinux布尔值

SELinux布尔值(Booleans)用于动态调整SELinux的策略,例如允许或禁止某些操作。

# 列出所有SELinux布尔值getsebool -a
# 修改布尔值(临时)setsebool httpd_enable_homedirs on
# 修改布尔值(永久)setsebool -P httpd_enable_homedirs on
设置策略模块

策略模块(Policy Module)是SELinux策略的可加载单元。可以创建自定义模块以适应特定需求。

# 创建策略模块audit2allow -a -M mycustompolicy
# 加载策略模块semodule -i mycustompolicy.pp
shell语句mysql -uroot -pwan -h127.0.0.1 ccrm <<EOFload data local infile 'sys.del' into table sys.del fields terminated by '|-@|' escaped by '^';show warnings;EOF将show warnings的结果赋值给变量errors


#!/bin/bash
# 使用MySQL命令执行并捕获SHOW WARNINGS的结果errors=$(mysql -uroot -pwan -h127.0.0.1 ccrm <<EOFLOAD DATA LOCAL INFILE 'sys.del' INTO TABLE sys.del FIELDS TERMINATED BY '|-@|' ESCAPED BY '^';SHOW WARNINGS;EOF)
# 打印SHOW WARNINGS的结果echo "Errors or Warnings:"echo "$errors"
shell 将ABC dafefeafse feasf fesaefeasf fea fse 换行符去除

三、SELinux的高级用法

  1. 调试SELinux问题

当某些服务因SELinux限制而无法运行时,通常需要分析日志并调整策略。

# 查看SELinux日志cat /var/log/audit/audit.log | grep AVC
# 使用audit2allow生成策略建议cat /var/log/audit/audit.log | grep AVC | audit2allow -M mypolicysemodule -i mypolicy.pp
自定义SELinux策略

以下是创建自定义SELinux策略的步骤:

(1)定义类型和规则

创建一个策略文件myapp.te:

module myapp 1.0;
require {	type httpd_t;	type var_t;	class file { read write getattr };}
# 允许httpd_t类型的进程访问var_t类型的文件allow httpd_t var_t:file { read write getattr };

(2)编译并加载策略

# 编译策略模块checkmodule -M -m -o myapp.mod myapp.te
# 生成策略包semodule_package -o myapp.pp -m myapp.mod
# 加载策略模块semodule -i myapp.pp

(3)验证新策略

测试服务功能,确认是否正常工作。

四、SELinux与实际场景结合

场景1:Apache Web服务的SELinux配置

问题:Apache无法访问/var/www/custom目录。
解决方案
  1. 确保目录权限正确。
  2. 修改目录安全上下文。
chcon -R -t httpd_sys_content_t /var/www/custom
  1. 检查是否需要启用特定布尔值:
setsebool -P httpd_can_network_connect on

场景2:FTP服务器的SELinux配置

问题:FTP用户无法上传文件。
解决方案
  1. 确认SELinux限制:
audit2allow -w -a
  1. 启用上传相关布尔值:
setsebool -P allow_ftpd_full_access on

五、SELinux的优势与不足

优势

  1. 细粒度控制:SELinux基于类型的强制访问控制可有效限制进程的权限范围。
  2. 动态调整:通过布尔值动态修改策略,无需重新启动服务。
  3. 增强系统安全:有效防止权限提升、目录遍历等攻击。

不足

  1. 复杂性:配置和调试SELinux需要较高的学习成本。
  2. 兼容性问题:某些第三方软件可能与SELinux策略冲突。
  3. 性能问题:在某些高性能环境下,SELinux可能增加系统开销。

六、总结

SELinux是Linux系统中的重要安全机制,能够有效保护系统免受许多类型的攻击。然而,合理配置SELinux需要深入理解其核心概念、策略语言和调试工具。通过掌握上述知识点,结合实际场景中的配置案例,可以更好地在生产环境中使用SELinux,实现安全与性能的平衡。

阅读剩余
THE END
诺言博客