SELinux策略定制指南
SELinux(Security-Enhanced Linux)通过**强制访问控制(MAC)**机制限制进程与文件的访问权限,默认策略(如targeted)适用于多数场景,但特定应用(如自定义服务、遗留应用)可能需要定制策略以满足安全需求。以下是定制SELinux策略的详细步骤:
policycoreutils-python(包含audit2allow、semanage等工具),执行以下命令安装:sudo yum install policycoreutils-python # CentOS/RHEL
sudo apt-get install policycoreutils libselinux1 # Ubuntu/Debian
sestatus
若状态为Disabled,需修改/etc/selinux/config文件(将SELINUX=disabled改为SELinux=enforcing),并重启系统启用。当应用因SELinux策略被拒绝访问时,系统会记录**AVC(Access Vector Cache)**日志至/var/log/audit/audit.log(或/var/log/messages)。使用以下命令提取相关拒绝信息:
sudo ausearch -m avc -ts recent # 查找最近的AVC拒绝事件
或直接过滤应用名称(如httpd):
grep httpd /var/log/audit/audit.log | audit2why # 分析拒绝原因
audit2allow可根据拒绝日志生成策略模块,步骤如下:
.te)和编译包(.pp):sudo ausearch -m avc -ts recent | audit2allow -M my_custom_policy
此命令会创建my_custom_policy.te(策略源码)和my_custom_policy.pp(编译后的模块)。sudo semodule -i my_custom_policy.pp # 安装模块
若自动生成的策略过于宽松,需手动编写.te文件(策略源码),示例如下:
module my_custom_policy 1.0; # 模块名称与版本
require { # 声明依赖的类型、类
type httpd_t; # 应用进程类型(如httpd)
type myapp_file_t; # 自定义文件类型
class file { read write }; # 允许的操作(读、写)
}
# 定义规则:允许httpd_t类型的进程访问myapp_file_t类型的文件
allow httpd_t myapp_file_t:file { read write };
关键元素说明:
module:模块标识(名称+版本);require:声明策略依赖的类型、类(需提前存在或通过semanage创建);allow:定义权限规则(主体→客体:操作)。checkmodule(编译源码为二进制模块)和semodule_package(打包为可加载文件):checkmodule -M -m -o my_custom_policy.mod my_custom_policy.te # 编译源码
semodule_package -o my_custom_policy.pp -m my_custom_policy.mod # 打包模块
semodule命令安装编译后的模块:sudo semodule -i my_custom_policy.pp # 加载模块
semodule -l | grep my_custom_policy
httpd),验证是否不再出现SELinux拒绝错误。audit2why分析原因,调整策略(如添加缺失的权限):grep my_custom_policy /var/log/audit/audit.log | audit2why
/etc/selinux/targeted/src/policy/下的策略文件(如policy.31),避免误操作导致系统无法启动。semodule -r my_custom_policy移除)。/var/log/audit/audit.log,及时发现新的权限问题。read而非read write execute),降低安全风险。httpd是否允许访问FTP),可使用setsebool(如setsebool -P httpd_can_ftp 1)而非自定义策略,更易维护。