linux /tmp目录安全加固需四步协同:设sticky bit(chmod 1777 /tmp)、挂载tmpfs并启用noexec/nosuid/nodev、改用$xdg_runtime_dir或privatetmp隔离、配合auditd监控与定期清理。

/tmp 目录是 Linux 系统中最常用也最危险的路径之一。它默认对所有用户可读写,若未加固,极易被用于存放恶意程序、窃取敏感临时数据、提权攻击或耗尽磁盘/内存资源。安全加固不是“设个权限就完事”,而是需从权限控制、挂载限制、使用替代、行为监控四方面协同落地。
设置 sticky bit 并规范属主属组
这是最基础且必须的第一步。仅靠 777 权限会允许任意用户删除他人文件;启用 sticky bit(t 位)后,用户只能删自己创建的文件。
- 执行 chmod 1777 /tmp:1 表示 sticky bit,777 保留读写执行能力
- 执行 chown root:root /tmp:确保目录归属为 root,避免非 root 用户意外成为所有者
- 验证命令:ls -ld /tmp,输出应为 drwxrwxrwt(末位 t 即生效)
挂载为 tmpfs 并启用安全选项
优先使用内存型 tmpfs,再通过挂载参数禁用危险行为。这比单纯改权限更彻底——即使上传了恶意二进制,也无法执行或提权。
- 检查当前模式:findmnt /tmp 或 df -hT /tmp,确认是否已是 tmpfs
- 在 /etc/fstab 中添加或修改这一行:
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev,size=1G 0 0 -
noexec:禁止执行任何文件
nosuid:忽略 SUID/SGID 位,阻断提权链
nodev:防止创建设备节点(如 /dev/zero 绕过) - 重载挂载:mount -o remount /tmp,再测试:touch /tmp/test && /tmp/test 应报 Permission denied
改用私有临时路径,减少直接依赖 /tmp
硬编码写 /tmp 是很多脚本和旧服务的风险源头。现代实践应主动规避,转向隔离性更强的方案。
- 用户级程序优先用 $XDG_RUNTIME_DIR(通常是 /run/user/$(id -u)),该目录由 logind 自动创建,权限 0700,生命周期绑定登录会话
- systemd 服务启用 PrivateTmp=yes(在 .service 文件中),每个服务获得独立命名空间下的 /tmp 和 /var/tmp
- 脚本中生成临时文件时,用 mktemp -d 创建私有子目录,例如:
tmpdir=$(mktemp -d) && echo "data" > "$tmpdir/file",用完后 rm -rf "$tmpdir"
启用审计与定期清理机制
加固不是一劳永逸。需持续发现异常写入、长期滞留文件等可疑行为。
- 用 auditd 监控访问:auditctl -w /tmp -p wa -k tmp_access,后续查异常可运行 ausearch -k tmp_access | ausearch -m execve
- 清理策略推荐放入 /etc/cron.daily/tmp-clean:
find /tmp -type f -mtime +7 -delete(避免用 rm -rf /tmp/*,会误删正在使用的 socket 或锁文件) - 如无特殊需求,可进一步收紧:chmod o-w /tmp(禁止其他用户新建目录),但需提前验证不影响数据库 socket、systemd-journal 等关键组件











