关闭不必要的内核模块,本质上是把服务器上那些默认开启却用不上的“后门通道”堵死,核心操作就是先查看已加载模块,再用Linux关闭内核模块命令做临时或永久禁用,最后重启验证。
内核模块为什么会变成攻击入口
Linux内核模块本来是为了灵活扩展硬件和文件系统支持,比如插入U盘、挂载特殊格式磁盘、加载虚拟化驱动,但很多云服务器或物理机在安装完系统后,会默认加载一堆业务根本用不到的模块,行业共识认为,默认安装的Linux发行版会加载相当一部分与服务器业务无关的模块,这些模块就像房间里常年不用的插座,虽然平时没人碰,但一旦插座本身存在线路老化或设计缺陷,就可能被利用。
攻击者盯上内核模块,主要走两条路:
- 直接利用某个冷门模块的已知漏洞,比如蓝牙协议栈、老旧文件系统驱动里的内存破坏漏洞,实现本地提权或远程代码执行。
- 先拿到低权限shell,再通过加载恶意内核模块的方式绕过安全软件、隐藏进程、篡改系统调用表。
业内专家指出,内核模块攻击在近年来的漏洞利用中占有一席之地,尤其是容器逃逸和云主机横向移动场景里,模块加载接口常被当作突破口,关闭不必要的内核模块,就是把攻击面从“十几个潜在入口”压缩到“两三个必需入口”。
怎么查看已加载内核模块:先摸清家底
动手禁用之前,得先知道系统里到底加载了什么,最常见的命令是 lsmod,它会列出模块名、大小以及被谁引用,输出里 Used by 这一列非常关键,数值为0说明当前没有任何进程或其他模块依赖它,禁用风险较低;数值大于0说明有依赖关系,需要先理清引用链。
更细的查看方式有三个:
cat /proc/modules:直接读内核模块表,信息比lsmod略微底层,适合脚本处理。modinfo 模块名:查看某个模块的具体描述、依赖、参数和许可证信息,判断它到底管什么硬件或功能。modprobe --showconfig:查看当前内核模块加载器的整体配置,包括已有的blacklist条目和install规则。
一台只跑Nginx或MySQL的云服务器,执行 lsmod 后如果看到 bluetooth、btusb、floppy、snd_hda_intel、iwlwifi 这类模块,基本就可以判定属于多余负载,这些模块对应的硬件在云环境中大概率不存在,纯属内核自带的“通用驱动包”被无脑加载。
Linux关闭内核模块命令实操:从临时禁用到永久生效
很多人误以为执行一条 rmmod 就万事大吉,结果一重启模块又回来了,这是因为
rmmod 只作用于当前运行的内核,重启后系统会重新扫描硬件并加载默认模块,要彻底关闭,必须同时做临时移除和持久化配置。
临时移除模块的适用场景与命令
临时移除适合紧急处置或测试阶段,比如你怀疑某个模块存在风险,想立刻让它消失,但又不确定业务是否受影响,就可以先用临时命令验证。
假设要移除蓝牙模块 bluetooth,先确认它没有被占用:
lsmod | grep bluetooth
Used by 为0,执行:
sudo rmmod bluetooth
或者使用更智能的 modprobe -r,它会自动处理依赖关系:
sudo modprobe -r bluetooth
但要注意,如果该模块被其他模块引用,rmmod 会报错 Module is in use,这时需要先移除依赖它的上层模块,用 lsmod | grep bluetooth 看 Used by 列,依次从最上层开始移除。
临时移除后可以立即用 lsmod 确认模块已经不在列表里,再观察业务运行一段时间,一旦发现异常,重启即可恢复原状。
服务器内核模块禁用方法对比:blacklist与install
永久禁用有两种主流方式,都通过 /etc/modprobe.d/ 目录下的配置文件实现。
| 方法 | 配置示例 | 作用机制 | 适用场景 |
|---|---|---|---|
| blacklist | blacklist bluetooth |
阻止模块被自动加载,但允许手动加载 | 大多数情况下的首选 |
| install 禁用 | install bluetooth /bin/false |
把模块加载命令替换为失败命令,连手动加载也禁止 | 需要彻底封死某个模块时 |
操作方法如下:
创建或编辑配置文件,/etc/modprobe.d/blacklist.conf:
sudo tee /etc/modprobe.d/blacklist.conf <<EOF
blacklist bluetooth
blacklist btusb
blacklist floppy
blacklist pcspkr
blacklist snd_hda_intel
blacklist iwlwifi
EOF
保存后需要更新 initramfs,让配置在内核启动早期就生效:
- Debian/Ubuntu:
sudo update-initramfs -u - CentOS/RHEL:
sudo dracut -f
如果某些模块特别顽固,或者你认为它属于高风险模块,即使有人误操作 modprobe 模块名 也不该加载,就使用 install 方式:
install bluetooth /bin/false
这条配置的意思是把 modprobe bluetooth 这个动作直接替换成执行 /bin/false,也就是永远失败,实际测试时,执行 sudo modprobe bluetooth 会返回错误,模块不会被加载。
两种方式可以同时使用,多数情况下,普通服务器用 blacklist 就够了;对于承载核心数据库或支付接口的机器,建议对高风险模块追加 install 规则。
哪些模块可以安全关闭:场景化清单
关闭模块不能盲目,得结合服务器实际角色,下面按常见场景给出可关闭建议。
通用云服务器(无蓝牙、无线、声卡、软驱硬件)
bluetooth、btusb、bluetooth_6lowpan:蓝牙协议栈及USB蓝牙驱动。iwlwifi、cfg80211、mac80211:无线网卡相关模块。snd_hda_intel、snd_hda_codec、snd_pcm:板载声卡驱动。floppy:软驱驱动,物理服务器也基本绝迹。parport、parport_pc、ppdev:并口设备驱动。pcspkr:主板蜂鸣器驱动,除了开机报警没什么用。firewire_core、firewire_ohci:火线接口驱动。
纯Web/API服务器(不需要U盘和特殊文件系统)
usb_storage、uas:USB存储设备驱动,云服务器通常不允许物理插U盘,可以直接禁用。cramfs、freevxfs、jffs2、hfs、hfsplus、udf:各种冷门文件系统模块,服务器基本不会挂载这些格式。vfat、msdos:FAT文件系统支持,如果不需要读取FAT格式的磁盘镜像,可以关闭。
容器宿主机(需要保留网络和存储核心模块)
- 不要随意禁用
overlay、br_netfilter、ip_vs等容器依赖模块。 - 可以关闭
bluetooth、snd_、floppy、firewire_等与容器无关的硬件模块。 - 如果使用Docker,
nf_conntrack和iptable_nat通常需要保留,不要为了减少攻击面一刀切。
判断一个模块是否安全关闭,最简单的标准是:lsmod 里 Used by 为0,且你明确知道这台服务器永远用不到它对应的硬件或功能。
内核模块攻击防护措施:关闭之后的验证与监控
执行完禁用操作后,必须做两件事:验证和监控。
验证配置是否生效
- 当前运行状态:
lsmod | grep 模块名应无输出,说明模块已从内存中移除。 - 重启后的状态:重启服务器,再次执行
lsmod,确认被禁用的模块没有重新出现。 - 加载测试:对于使用
install /bin/false的模块,手动执行
sudo modprobe 模块名,应该返回失败。 - 配置检查:
modprobe --showconfig | grep blacklist可以看到所有已生效的blacklist条目。
监控模块加载行为
如果服务器已被入侵,攻击者可能会尝试加载恶意内核模块,可以通过审计系统调用来发现这类行为,以 auditd 为例,添加规则监控 init_module 和 finit_module 系统调用:
sudo auditctl -a always,exit -F arch=b64 -S init_module -S finit_module -k kernel_module_load
之后查看审计日志:
sudo ausearch -k kernel_module_load
这样可以记录每一次模块加载动作,包括时间、进程、用户和模块名,对于生产环境,建议把审计日志同步到集中日志平台,一旦出现陌生模块加载,就能快速告警。
关闭模块后,系统的攻击面确实会小很多,但日常运维中仍需保持内核版本更新,因为已关闭的模块不会自动加载,真正被使用的核心模块依然需要及时修补漏洞。
关闭不必要的内核模块不是一次性动作,而是服务器上线前的标配检查项,与其等攻击者利用某个冷门模块漏洞打进来,不如提前把那些默认开启的多余模块从运行内核里请出去,用最小的成本换一个更干净的运行环境。
关闭不必要的内核模块常见问题解答
关闭内核模块会影响服务器性能吗
通常不会,未使用的内核模块只占用少量内存,移除后不会释放明显的CPU或IO资源,性能影响可以忽略,真正需要关注的是别误禁了业务正在使用的模块,比如容器宿主机的 overlay、数据库服务器的 nvme 驱动,禁用前用 lsmod 确认 Used by 为0,就能避开绝大多数风险。
Linux关闭内核模块命令执行后重启又恢复怎么办
说明只做了临时移除,没有写持久化配置。rmmod 和 modprobe -r 的效果仅持续到本次关机,要永久生效,需要在 /etc/modprobe.d/ 下新建 .conf 文件,写入 blacklist 模块名,然后执行 update-initramfs -u 或 dracut -f 更新内核启动镜像,重启后模块就不会自动加载了。
怎么确认某个内核模块是否被实际使用
用 lsmod 查看 Used by 列,如果数值大于0,说明有其他模块或进程正在引用它,不能直接移除;如果数值为0,再用 lsof 或 fuser 检查关联的设备文件是否被进程打开,以 usb_storage 为例,lsmod | grep usb_storage 输出 Used by 为0且没有进程打开 /dev/sd 设备,就可以安全关闭。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/658340.html





