内核级加固是提升Linux抗攻击能力最底层有效的手段,包括启用KPTI、Stack Protector、CFI,禁用动态模块加载,收紧网络与内存参数,部署SELinux/AppArmor等MAC机制,并最小化内核暴露面。

直接利用内核级加固特性,是提升Linux系统抗攻击能力最底层、最有效的手段之一。它不依赖外围工具或应用层防护,而是从系统运行的核心——内核本身入手,压缩攻击者可利用的路径和空间。
启用关键内核保护机制
现代Linux内核已内置多项硬件协同与软件约束机制,需确认启用并保持默认安全行为:
-
KPTI(Kernel Page Table Isolation):默认开启,防止Meltdown类漏洞导致用户态窥探内核内存;无需额外操作,但可通过
cat /sys/devices/system/cpu/vulnerabilities/meltdown验证状态,输出mitigation即表示生效。 -
Stack Protector(强栈保护):编译时启用
CONFIG_STACKPROTECTOR_STRONG=y,运行时对函数返回地址、局部变量插入canary校验,能有效拦截多数栈溢出利用;可通过grep CONFIG_STACKPROTECTOR /boot/config-$(uname -r)确认配置。 -
Control Flow Integrity(CFI):在ARM64或x86_64支持平台(如内核5.15+),启用
CONFIG_CFI_CLANG=y并配合Clang编译,可阻断ROP/JOP等控制流劫持链;适用于高安全要求场景,部署前需验证驱动兼容性。 -
禁止动态模块加载:写入
echo 1 > /proc/sys/kernel/modules_disabled,或启动参数添加modules_disabled=1,彻底关闭insmod/modprobe,避免恶意ko文件注入。
收紧内核网络与内存行为
通过sysctl参数限制内核对异常网络行为的响应,并强化内存布局随机性:
- 禁用ICMP重定向:
net.ipv4.conf.all.accept_redirects = 0,防止攻击者篡改路由表。 - 启用严格反向路径过滤:
net.ipv4.conf.all.rp_filter = 1,丢弃源IP不可信的数据包。 - 关闭源路由:
net.ipv4.conf.all.accept_source_route = 0,避免IP分片绕过防火墙规则。 - 完全启用ASLR:
kernel.randomize_va_space = 2,使栈、堆、共享库等地址每次加载均随机化。 - 阻止SUID程序生成core dump:
fs.suid_dumpable = 0,防止敏感内存信息泄露到磁盘。
将上述参数写入/etc/sysctl.d/99-kernel-hardening.conf,执行sysctl --system即时生效。
启用强制访问控制(MAC)模块
SELinux或AppArmor不是可选插件,而是内核级访问决策的执行器,能细粒度限制进程行为:
- SELinux:确保
enforcing模式启用(setenforce 1),策略使用targeted或mls,并通过sestatus确认状态;对关键服务(如nginx、sshd)启用对应策略模块。 - AppArmor:安装
apparmor-utils,启用服务systemctl enable --now apparmor,为自定义程序编写profile并加载(aa-enforce /etc/apparmor.d/usr.bin.myapp)。 - Yama子系统(内核自带):启用
kernel.yama.ptrace_scope = 2(限制非父子进程调试)、kernel.yama.odev = 1(禁止未授权设备映射),无需额外安装。
最小化内核暴露面
减少内核“说话”的机会,就是减少被攻击的机会:
- 卸载非必要内核模块:
lsmod | grep -E '(usb|firewire|bluetooth|ipv6)' | awk '{print $1}' | xargs -r modprobe -r,再加入/etc/modprobe.d/blacklist.conf永久屏蔽。 - 关闭内核调试接口:
kernel.kptr_restrict = 2(隐藏内核符号)、kernel.dmesg_restrict = 1(限制普通用户读取dmesg)、dev.kernel.unprivileged_bpf_disabled = 1(禁用无特权eBPF)。 - 禁用未使用的子系统:如不需要容器,设置
kernel.unprivileged_userns_clone = 0;若不用kexec,写入kernel.kexec_load_disabled = 1(仅在启动时生效)。

















