防范 fork 炸弹需限制高危账号进程数,优先在 /etc/security/limits.d/ 下创建独立配置文件(如 50-ops-temp-nproc.conf),同时设置 soft 和 hard nproc 值(如 150),确保 pam 的 pam_limits.so 已启用,新会话生效后用 ulimit -u 验证,并通过 :(){ :|:& };: 测试拦截效果。

明确目标账号并选择合适的配置位置
防范 fork 炸弹的关键是限制高危账号(如运维临时账号、外包账号、低权限服务账号)的进程总数,避免其被利用发起资源耗尽攻击。生产环境中不建议直接修改 /etc/security/limits.conf 主文件,而应优先使用 /etc/security/limits.d/ 目录下的独立配置文件——这是 Linux 发行版(RHEL/CentOS 6+、Debian/Ubuntu 16.04+)的官方推荐做法,便于隔离管理、版本控制和故障回滚。
例如,为账号 ops_temp 单独设限,可创建:
- /etc/security/limits.d/50-ops-temp-nproc.conf
- 文件名建议含序号(如 50-)以控制加载顺序,避免被其他 .conf 文件覆盖
配置 soft + hard nproc 且确保 root 不被误伤
仅设 hard 限制会导致用户登录后初始值仍为系统默认(如 1024 或更高),起不到即时压制作用;仅设 soft 则用户可自行调高,失去防护意义。必须同时指定 soft 和 hard,且 hard 值 ≤ soft 值才有效(实际是 soft ≤ hard,但策略上 soft 设为略低于 hard 更稳妥)。
在配置文件中写入:
ops_temp soft nproc 150<br>ops_temp hard nproc 150
注意:
• root 用户不受 * 或组规则影响,若需限制 root 自身(如禁止其执行可疑脚本),必须显式写 root hard nproc 2000;
• 使用 @group 语法限制用户组时,同样不作用于 root;
• 避免对系统服务账户(如 daemon、syslog)盲目应用 * 兜底规则,可能干扰 cron、rsyslog 等后台任务。
确认 PAM 模块已启用并验证生效路径
limits.d 下的配置不会自动生效,前提是系统通过 PAM 加载了 pam_limits.so。需检查以下任一登录入口是否包含该模块:
- SSH 登录:/etc/pam.d/sshd
- 本地终端登录:/etc/pam.d/login
- 通用认证链(推荐):/etc/pam.d/system-auth 或 /etc/pam.d/common-session
正确条目格式(路径依发行版而异):
- RHEL/CentOS:session required pam_limits.so
- Debian/Ubuntu:session required pam_limits.so(模块路径通常为 /lib/x86_64-linux-gnu/security/pam_limits.so)
修改后无需重启服务,新登录会话即生效。验证方式:
- 用目标账号重新 SSH 登录或执行 su - ops_temp
- 运行 ulimit -u,输出应为 150
- 运行 ulimit -H -u 和 ulimit -S -u 分别确认硬/软限值
测试防护效果与常见失效点
设置完成后,模拟 fork 炸弹触发行为:
- 在 ops_temp 账号下执行::(){ :|:& };:
- 几秒内应报错:bash: fork: Resource temporarily unavailable,进程数卡在 150 左右不再增长
若未拦截成功,重点排查:
- 是否用 sudo -u ops_temp bash 测试?错误方式是 root 下直接 su ops_temp(未加 - 可能不加载 limits)
- systemd 用户服务(如 systemctl --user start xxx)默认绕过 limits.d,需额外在 /etc/systemd/system.conf 中设置 DefaultLimitNPROC=150
- 容器环境(如 Docker)中,宿主机 limits 对容器内进程无效,须在容器启动时通过 --ulimit nproc=150:150 传入











