禁用非必要内核模块加载需分层封堵用户态入口、内核请求机制和服务依赖链:替换/sbin/modprobe为/bin/true,清理udev规则,设置kernel.modules_disabled=1或kernel.modprobe="/bin/true",清除/etc/modules等配置中自动加载指令,并停用avahi-daemon等非必要服务。

禁用非必要内核模块加载,核心是切断外部自动触发路径,同时保留管理员对模块的显式控制权。这不是简单删模块,而是分层封堵:用户态入口、内核请求机制、服务依赖链三者都要覆盖。
拦截用户态模块加载入口
绝大多数攻击通过 udev、systemd-udevd 或普通进程调用 /sbin/modprobe 触发模块加载。这是最需优先封堵的面:
- 用符号链接替换原程序:sudo ln -sf /bin/true /sbin/modprobe,使所有 modprobe 调用立即返回成功但不执行任何操作
- 验证是否生效:运行 modprobe dummy 应无输出、无日志;再查 dmesg | tail 确认无新模块加载痕迹
- 若系统依赖 udev 热插拔,不要直接 mask systemd-udevd,改为清理其规则:grep -r "modprobe\|load_module" /etc/udev/rules.d/ /lib/udev/rules.d/,注释或删除相关行
限制内核主动请求模块行为
内核自身在识别文件系统、加密算法等场景会调用 request_module(),可通过 sysctl 控制:
- 临时关闭(重启失效):echo 1 | sudo tee /proc/sys/kernel/modules_disabled
- 永久关闭(仅适用于只读系统或安全容器):在 /etc/sysctl.conf 中添加 kernel.modules_disabled = 1,再运行 sudo sysctl -p
- 更灵活方式:重定向内核 modprobe 路径,如 sudo sysctl -w kernel.modprobe="/bin/true",既禁用自动加载,又不影响手动 insmod
清理配置与服务级冗余加载
很多模块是通过配置文件或服务脚本悄悄加载的,必须逐项排查:
- 检查 /etc/modules 和 /etc/modprobe.d/*.conf,移除所有 install module_name /sbin/modprobe 类指令;改用 blacklist module_name 仅阻止自动加载,不够彻底时改写为 install module_name /bin/false
- 搜索定时任务和启动脚本:grep -r "modprobe\|insmod" /etc/cron* /etc/init.d/ /etc/systemd/system/,统一清除或替换为预加载逻辑
- 确认无业务依赖后,停用并禁用非必要服务:systemctl stop avahi-daemon rpcbind bluetooth,再 systemctl disable,避免其间接触发模块加载
加固前提:先评估再操作
盲目禁用会导致网卡失联、存储不可用等故障。操作前务必完成三项检查:
- 运行 lsmod 和 dmesg | grep -i "loading",确认当前哪些模块实际被使用
- 用 lshw -class network,storage 核对硬件型号,比对模块名(如 igb 对应 Intel 千兆网卡、nvme 对 NVMe 盘)
- 检查关键服务依赖:systemctl list-dependencies --reverse multi-user.target | grep -E "(nfs|selinux|cgroup)",避免禁用影响容器或安全策略的模块

















