SELinux策略自定义配置指南
SELinux(Security-Enhanced Linux)通过**强制访问控制(MAC)**机制限制进程对资源的访问,自定义策略可解决默认策略无法满足的特定安全需求(如允许某服务访问非标准目录)。以下是详细的自定义配置步骤:
自定义策略需依赖policycoreutils(基础工具)、auditd(日志收集)、audit2allow(规则生成)等工具。根据系统发行版选择安装命令:
sudo apt update && sudo apt install selinux-basics selinux-policy-default policycoreutils-python auditd libsemanage-python
sudo yum install policycoreutils-python libsemanage-python audit
enforcing/permissive/disabled):sestatus
permissive(仅记录违规,不阻止):sudo setenforce 0enforcing(强制执行):sudo setenforce 1/etc/selinux/config文件,修改SELINUX=值为对应模式(如SELINUX=enforcing),修改后需重启系统生效。自定义策略前需明确“需要允许的操作”,通过audit.log获取拒绝事件的详细信息:
# 查看最近的AVC(访问控制)拒绝事件
sudo ausearch -m avc -ts recent
# 或直接过滤日志(需root权限)
sudo grep "avc: denied" /var/log/audit/audit.log
日志示例:
type=AVC msg=audit(1714567890.123:456): avc: denied { read } for pid=1234 comm="httpd" name="custom.conf" dev="sda1" ino=7890 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:default_t:s0 tclass=file
此日志表明:httpd_t进程(Apache)尝试读取default_t类型的custom.conf文件时被拒绝。
audit2allow自动生成规则根据日志生成.te(类型启用)文件,包含允许操作的规则:
# 从日志生成策略模块(-M指定模块名)
sudo ausearch -m avc -ts recent | audit2allow -M my_custom_policy
执行后会生成两个文件:
my_custom_policy.te:策略源码文件(需手动编辑优化)my_custom_policy.pp:编译后的可加载模块文件.te文件(高级场景)若自动生成的规则过于宽泛,可手动编写.te文件(如允许httpd_t访问/var/www/custom目录):
module my_custom_policy 1.0;
# 声明依赖的类型(需包含在策略中)
require {
type httpd_t; # Apache进程类型
type var_t; # /var目录默认类型
class dir { read write search }; # 允许的操作(读、写、遍历)
class file { read open }; # 文件操作
}
# 自定义规则:允许httpd_t访问/var/www/custom目录及其文件
allow httpd_t var_t:dir { read write search };
allow httpd_t var_t:file { read open };
关键说明:
module:模块名称及版本(需唯一);require:声明依赖的类型和类(避免遗漏);allow:定义允许的操作(主体:客体:类 { 权限 })。.te文件为可加载模块使用checkmodule生成中间文件(.mod),再用semodule_package打包为.pp文件:
# 生成中间文件(.mod)
checkmodule -M -m -o my_custom_policy.mod my_custom_policy.te
# 打包为可加载模块(.pp)
semodule_package -o my_custom_policy.pp -m my_custom_policy.mod
使用semodule命令加载编译好的模块:
sudo semodule -i my_custom_policy.pp
加载后,模块会永久生效(无需重启系统)。
sudo semodule -l | grep my_custom_policy
若输出包含模块名,则说明加载成功。
执行需授权的操作(如让Apache读取/var/www/custom/config.conf),观察是否仍出现拒绝日志:
# 重新触发访问(如重启Apache)
sudo systemctl restart httpd
# 再次检查审计日志
sudo ausearch -m avc -ts recent
若无新的拒绝日志,则说明策略生效。
若仍存在问题,可使用audit2why分析日志原因:
sudo grep "avc: denied" /var/log/audit/audit.log | audit2why
输出会提示拒绝的具体原因(如缺少权限、类型不匹配),帮助优化策略。
若自定义策略涉及新目录或文件,需确保其安全上下文(Security Context)正确,否则策略无法匹配。使用semanage fcontext和restorecon命令管理:
# 添加自定义目录的上下文(如/var/www/custom设为httpd_sys_content_t)
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/custom(/.*)?"
# 应用上下文到目录(递归)
sudo restorecon -Rv /var/www/custom
说明:
semanage fcontext:添加/修改上下文规则(持久化);restorecon:将上下文应用到文件/目录(覆盖现有上下文)。/etc/selinux/config);allow *),减少安全风险;通过以上步骤,可完成SELinux策略的自定义配置,解决默认策略无法满足的特定安全需求。需注意的是,SELinux策略编写需结合系统环境和业务需求,建议在熟悉SELinux概念(如类型强制、安全上下文)后再进行复杂配置。