selinux是内核级强制访问控制(mac)机制,通过安全上下文标签、预设策略规则和决策引擎,在进程访问资源瞬间执行放行或拒绝,并同步审计日志,实现不可绕过、可追溯、可迭代的安全隔离。

操作系统级强制访问审计(Mandatory Access Control, MAC)不是日志开关,而是内核层的访问决策引擎。它能在进程尝试打开文件、绑定端口、加载模块的瞬间就做出放行或拒绝判断,并同步记录完整上下文——这正是业务安全隔离与入侵追踪联动防御的底层支点。
用auditd+SELinux构建可审计的强制访问链
Linux下最成熟落地的组合是auditd(审计日志采集)配合SELinux(强制策略执行)。二者不是并列工具,而是“策略下发→行为拦截→事件归档→规则反哺”的闭环:
- SELinux定义域(domain)与类型(type),比如
httpd_t进程只能读httpd_content_t标记的文件,写httpd_log_t标记的日志,禁止执行bin_t下的任意二进制——这种限制不依赖用户权限,root也无法绕过; - auditd监听所有AVC(Access Vector Cache)拒绝事件,每条记录含:触发时间、源进程PID/PPID、可执行路径、目标文件inode、SELinux上下文、系统调用号(如openat)、返回码;
- 关键操作:把
ausearch -m avc -ts recent结果接入SIEM,设置告警规则——连续3次对/tmp/.X11-unix的写入拒绝,可能指向X11转发提权尝试;对/proc/kcore的读取拒绝,大概率是内存dump探测。
业务进程打标隔离:让Web服务与后台任务互不可见
不能只靠“禁止root登录”这类通用策略。真实业务中,要按功能切分强制域:
- 给Nginx主进程打
nginx_t标签,其worker子进程继承该域,但明确禁止transition到shell_exec_t——这样即使WebShell上传成功,spawn的bash进程无法启动; - 数据库连接池进程单独设为
db_client_t,只允许connect到mysqld_port_t端口,禁止访问/etc/shadow或/root目录,阻断横向提权路径; - 日志收集Agent运行在
logrotate_t域,仅能读var_log_t和写syslogd_var_run_t,即便被劫持也无法窃取业务密钥文件。
入侵痕迹自动反向映射到策略缺口
审计日志不是摆设,要让它驱动策略迭代:
- 发现某次攻击中,恶意脚本通过
curl下载二进制到/dev/shm并执行——检查audit.log里对应AVC拒绝是否缺失,若无拒绝记录,说明该路径未被SELinux标记,立即执行semanage fcontext -a -t bin_t "/dev/shm(/.*)?"并restorecon -Rv /dev/shm; - 溯源时看到大量
execve失败日志,目标路径为/tmp/xxx.so,但SELinux未拦截——说明攻击者利用了LD_PRELOAD等动态链接机制,此时需在策略中增加allow domain_t self:process { execmem execstack }的显式禁止规则; - 所有新发现的恶意行为模式,都应生成对应的
.te策略模块,经checkmodule验证后编译加载,形成“攻击出现→日志暴露→策略补漏→下次自动拦截”的正向循环。
这套机制的价值不在阻止第一次攻击,而在于让每次入侵都留下可定位、可量化、可策略化的数字指纹。攻击者越深入,留下的AVC拒绝日志就越密集,防守方修复策略的速度就越快。










