禁用不必要的内核模块是缩小攻击面最直接有效的手段:编译时裁剪(设config_bt=n等)、启动参数黑名单(module_blacklist=...)、modprobe规则静默拦截(install xxx /bin/true)、运行时禁用模块接口(modules_disabled=1)。

禁用不必要的内核模块是缩小攻击面最直接有效的手段之一。攻击者常利用加载恶意模块实现提权、隐藏进程或绕过安全机制,而很多模块在特定服务器场景下根本用不到——比如 usb-storage 在无 USB 外设的云主机上、bluetooth 在数据中心服务器上,都是潜在风险入口。
编译阶段裁剪模块支持
在定制内核时就移除不需要的功能,比运行时禁用更彻底:
- 将
CONFIG_MODULES=n设为禁用模块机制(适用于完全固化功能的嵌入式或专用系统) - 对非必需模块设为
n(如CONFIG_BT=n、CONFIG_FIREWIRE=n),而非m(模块化)或y(内置) - 启用
CONFIG_MODULE_SIG=y和CONFIG_MODULE_SIG_FORCE=y,确保后续加载的任何模块都必须带有效签名,从源头拒绝未授权代码
启动参数黑名单阻断自动加载
即使模块被编译进内核或作为模块存在,也能阻止其被内核自动调用:
- 在 GRUB 启动参数中添加
module_blacklist=usb-storage,bluetooth,firewire_core,i2c-dev等,按实际硬件和业务需求精简 - 该方式对由 udev、systemd 或驱动探测触发的自动加载生效,但不阻止手动
insmod - 修改
/etc/default/grub中的GRUB_CMDLINE_LINUX,再执行update-grub && reboot
运行时拦截模块加载请求
针对仍可能被手动或脚本触发的加载行为,用 modprobe 规则实现“静默失败”:
- 创建
/etc/modprobe.d/disable-unnecessary.conf,写入:install usb-storage /bin/trueinstall bluetooth /bin/trueinstall nf_conntrack_ftp /bin/true - 每行表示:当系统尝试加载该模块时,执行
/bin/true(立即成功退出),不报错也不加载,应用层感知不到异常,但模块实际未运行 - 配合
lsmod | grep -E 'usb|bt|fire'定期检查,确认无意外残留
彻底关闭运行时模块操作(高保障场景)
对已上线且功能稳定的生产服务器,可进一步锁死模块接口:
- 执行
echo 1 > /proc/sys/kernel/modules_disabled,禁止所有后续insmod/rmmod操作 - 该值不可运行时恢复,需在 initramfs 阶段写入(例如在 init 脚本中提前设置),否则重启后失效
- 适用于容器宿主机、金融交易节点等对稳定性与确定性要求极高的环境











