内核模块加固是全生命周期行为控制,包括禁用非必要模块加载、限制模块行为边界、强化签名验证及监控异常活动。具体措施涵盖强制签名、黑名单、静默失败、禁止强制卸载、关闭运行时加载、selinux策略、密钥管理、强哈希算法及审计日志等。

内核模块加固不是给现有模块“打补丁”,而是从加载、运行到卸载的全生命周期控制其行为,让模块本身成为防御链的一环,而非潜在突破口。
禁用非必要模块加载
攻击者常通过恶意内核模块提权或隐藏进程。最直接的防御是不让它有机会加载。
- 在内核编译时,将 CONFIG_MODULE_SIG 设为 y,强制所有模块必须带有效签名;同时启用 CONFIG_MODULE_SIG_FORCE,拒绝无签名模块
- 启动参数中加入 module_blacklist=usb-storage,bluetooth,firewire_core(按实际硬件裁剪),直接阻止高风险或冗余模块被自动加载
- 运行时执行 echo 'install usb-storage /bin/true' > /etc/modprobe.d/disable-usb.conf,使模块加载请求静默失败,不报错也不执行
限制模块行为边界
即使模块合法,也需约束其能力,防止被劫持或滥用。
- 启用 CONFIG_MODULE_UNLOAD 并配合 CONFIG_MODULE_FORCE_UNLOAD=n,禁止强制卸载——避免攻击者替换关键模块
- 设置 /proc/sys/kernel/modules_disabled=1(需在 initramfs 阶段写入),彻底关闭运行时模块加载能力,适用于已固化功能的生产服务器
- 若使用 SELinux,为模块加载路径(如 /lib/modules/$(uname -r)/)设置严格类型,例如 semanage fcontext -a -t modules_object_t "/lib/modules/.*",再 restorecon -Rv /lib/modules
强化模块签名与验证流程
签名不是形式,关键在于密钥管理和验证时机。
- 使用独立密钥对签名模块,私钥离线保存,公钥嵌入内核(CONFIG_MODULE_SIG_KEY 指向私钥,CONFIG_SYSTEM_TRUSTED_KEYS 包含公钥证书)
- 启用 CONFIG_MODULE_SIG_ALL,确保构建时自动签名所有模块,避免遗漏
- 配合 CONFIG_MODULE_SIG_SHA512 使用强哈希算法,拒绝 SHA1 等弱摘要签名
监控与响应模块异常活动
防御不止于预防,还要能感知异常。
- 开启 CONFIG_MODULE_SIG_LOG_LEVEL=3,让内核在 dmesg 中记录所有签名验证失败事件
- 用 auditctl -a always,exit -F arch=b64 -S init_module -S delete_module 跟踪模块加载/卸载系统调用,日志送至集中审计系统
- 定期运行 lsmod | awk '{print $1}' | xargs modinfo -F sig_fingerprint 2>/dev/null | sort -u | wc -l,检查是否出现未签名或指纹不一致的模块











