核心是用noexec配合nosuid和nodev防护/tmp、web上传目录等可写位置,通过mount -o remount临时生效或修改/etc/fstab永久配置,并辅以chmod去执行位、umask或默认acl控制新文件权限。

核心是用 noexec 配合 nosuid 和 nodev,加在用户可写、但不该执行代码的目录上,不改程序、不装新工具,就能拦住大部分非法脚本落地运行。
临时文件、上传目录、U盘挂载点这些地方,攻击者最爱往里扔脚本。你不需要重写代码或部署复杂系统,只要在挂载时加几个选项,就能从内核层堵住直接执行的路。
先确认哪些目录该加防护
不是所有目录都要限制执行,重点盯住“用户能写、程序能读、但不该跑代码”的位置:
- /tmp 和 /var/tmp:系统临时文件集中地,恶意 payload 常在这里生成并执行
- /var/www/uploads 或类似 Web 上传目录:用户上传的图片、压缩包可能被伪装成 .sh/.py 脚本
- /mnt/usb、/media/* 等可移动设备挂载点:U 盘插入后自动执行风险高
- 独立挂载的数据盘(如 /data、/mnt/data):若用于存放用户生成内容,也建议加限制
用 mount 命令快速试配(临时生效)
不用重启、不改配置文件,一条命令就能验证效果:
- 把 /tmp 临时设为禁止执行:sudo mount -o remount,noexec,nosuid,nodev /tmp
- 给上传目录加更严防护(只读 + 禁执行):sudo mount -o remount,ro,noexec,nosuid,nodev /var/www/uploads
- 验证是否生效:findmnt -o TARGET,OPTIONS /tmp → 看输出里有没有 noexec
如果执行失败,常见原因是该路径不是独立挂载点(比如只是根分区下的子目录)。这时先查清它的实际设备:df -h /tmp,再决定是否要对整个分区操作。
写进 /etc/fstab 实现开机自动防护
临时设置重启就消失,永久防护得改 /etc/fstab。新手注意三点:
- 找到对应行(例如 /dev/sdb1 /mnt/data ext4 defaults 0 2),把第 4 列的 defaults 换成 defaults,noexec,nosuid,nodev
- defaults 默认含 exec 和 suid,必须显式加 noexec,nosuid 才能覆盖
- 改完别直接重启,先测试:sudo mount -o remount /mnt/data 或 sudo mount -a(无报错即成功)
别忘了补上权限和新建文件控制
noexec 能拦住 ./script.sh,但拦不住 python script.py——这时候得配合基础权限管理:
- 批量清理已有脚本的执行位:find /var/www/uploads -type f \( -name "*.sh" -name "*.py" \) -exec chmod a-x {} \;
- 让新上传的文件默认没执行权:在 Web 服务启动脚本里加 umask 022(新建文件权限为 644)
- 更稳妥的做法:对目录设默认 ACL,确保子文件一创建就是 -rw-r--r--:setfacl -d -m u::rw-,g::r--,o::r-- /var/www/uploads











