内核加固是重构系统底层执行逻辑、内存管理与权限边界的系统工程,需联动日志、监控与策略,验证kpti、stack protector、modules_disabled等运行时保护机制真实生效,并通过aslr、mac、审计规则和基线比对实现可追溯的纵深防御。

内核加固不是加几行配置就完事,而是把系统最底层的执行逻辑、内存管理、权限边界重新梳理一遍。它直接决定攻击者能否从用户态突破到内核态、能否篡改关键数据结构、能否绕过审计路径。真正提升防御与审计健壮性,要让加固措施和日志、监控、策略联动起来,而不是孤立启用。
启用运行时保护机制并验证生效
这些机制是内核级“防入侵第一道墙”,必须确认它们实际在运行,而非仅编译进内核。
- KPTI(页表隔离):检查是否启用——cat /sys/devices/system/cpu/vulnerabilities/meltdown 返回 mitigation; PTI 才表示生效;若为 vulnerable,需确认启动参数未含
nopti,且内核版本 ≥ 4.15 - Stack Protector:通过 grep CONFIG_STACKPROTECTOR_STRONG /boot/config-$(uname -r) 确认为
y;再用 readelf -s /vmlinuz | grep __stack_chk_fail 验证符号存在 - 模块加载限制:写入 echo 1 > /sys/module/kernel/parameters/modules_disabled 后,尝试
insmod fake.ko应报 Operation not permitted;该设置需配合modules_disabled=1写入/etc/default/grub的GRUB_CMDLINE_LINUX中实现重启持久化
用 sysctl 参数构建可审计的内核行为边界
单纯关闭某项功能不够,关键是要让异常行为留下可追踪痕迹,并防止绕过。
- 启用完整 ASLR:kernel.randomize_va_space = 2(不是1),同时确保
/proc/sys/kernel/randomize_va_space值为2;搭配 fs.suid_dumpable = 0 防止 setuid 程序泄露内存布局 - 网络层审计增强:除禁用重定向(
net.ipv4.conf.all.accept_redirects = 0)外,开启 net.netfilter.nf_conntrack_log_invalid = all,使无效连接状态被记录到dmesg或journald,便于关联分析 - 限制核心转储范围:fs.suid_dumpable = 0 + kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h,既阻止敏感信息落盘,又将所有崩溃事件统一由 systemd-coredump 捕获并打上 UID/GID 标签,方便审计溯源
强制访问控制(MAC)与审计日志深度绑定
SELinux 或 AppArmor 不只是“拦住进程”,要让它成为审计线索的源头。
- SELinux:启用 audit=1 启动参数,确保所有 AVC 拒绝事件写入
/var/log/audit/audit.log;用 ausearch -m avc -ts recent 实时查看拒绝详情;配合sealert -a /var/log/audit/audit.log自动解析策略冲突 - AppArmor:启用 aa-logprof 持续学习服务行为,生成精准配置;将
abstractions/base中的capability dac_override等高危权限显式注释掉,迫使违规调用触发audit日志而非静默失败 - 关键系统调用审计:在
/etc/audit/rules.d/下添加规则,例如 -a always,exit -F arch=b64 -S execve -k exec_monitor,配合ausearch -k exec_monitor追踪所有程序执行,与 MAC 日志交叉比对可识别绕过行为
最小化暴露面并建立变更基线
加固不是越锁越安全,而是清楚知道“什么不该存在”,才能及时发现异常。
- 禁用非必要模块:用 lsmod 列出当前加载模块,对比
/lib/modules/$(uname -r)/modules.builtin和modules.order,对未在白名单中的模块,在/etc/modprobe.d/disable.conf中写入install module_name /bin/false - 关闭调试接口:确认 kernel.kptr_restrict = 2(隐藏内核指针)、dev.ttyprintk = 0(禁用 tty printk)、debug.kms = 0(关闭内核模式设置调试),避免泄露内核地址或设备状态
- 建立内核对象基线:用 aide --init 初始化文件完整性数据库,特别包含
/boot/vmlinuz*、/lib/modules/$(uname -r)、/proc/sys/下关键参数文件;定期 aide --check 并将结果接入 SIEM,任何内核相关变更即触发告警











