适用场景
Linux 文件权限加固是服务器安全基线中最基础也最容易被忽视的一环。本方案适用于以下场景:Web 服务器上网站目录被低权限进程共享、运维人员误用 chmod 777 导致任意用户可篡改文件、系统残留可疑 SUID 程序可能被用于本地提权、多用户服务器需要限制敏感配置文件的读取范围。无论运行的是 Nginx、MySQL 还是自研服务,落盘文件的权限都直接决定了攻击者在拿到一个低权限账号后能走多远。
前置条件
- 一台可登录的 Linux 服务器,本文以 CentOS 7+/Ubuntu 20+ 为例
- 具备 root 或 sudo 权限
- 执行前已确认业务对某些目录的特殊权限要求(如 Web 目录需运行用户可写)
- 建议先在测试机演练,生产环境变更权限前做好记录
原理说明
Linux 为每个文件维护三组权限位:所有者(u)、属组(g)、其他人(o),分别对应读(r=4)、写(w=2)、执行(x=1)。权限加固的核心思路是最小权限原则:运行服务的账号只能访问它必须访问的文件,其余一律收紧。除基本权限位外,还有两类特殊权限需要重点关注:SUID(4000) 让执行者临时继承文件所有者身份,若被附加在不该有的程序上就是提权通道;粘滞位(1000) 用于 /tmp 这类共享目录,防止用户互删文件。此外 umask 决定新建文件的默认权限起点,从源头控制权限蔓延。
操作步骤
第一步:全局收紧 umask 默认权限
编辑 /etc/profile 与 /etc/bashrc(Ubuntu 为 /etc/profile 与 /etc/bash.bashrc),将默认 umask 调整为 027,即新建文件属组可读、其他人无任何权限:
# 查看当前 umask
umask
# 在 /etc/profile 末尾统一设置
echo "umask 027" >> /etc/profile
echo "umask 027" >> /etc/bashrc
# 重新登录后生效,验证:
umask
第二步:清理危险的全局可写文件
全局可写文件任何账号都能篡改,是植入后门的常见位置:
# 查找全局可写文件与目录(排除 tmp 系统目录)
find / -xdev -type f -perm -0002 2>/dev/null
find / -xdev -type d -perm -0002 2>/dev/null
# 逐个确认后收紧
chmod o-w /path/to/suspicious_file
# 共享目录如需保留可写,必须加粘滞位
chmod 1777 /tmp
第三步:排查并移除多余 SUID/SGID 程序
# 列出全盘 SUID 程序
find / -xdev -perm -4000 -type f 2>/dev/null
# 列出 SGID 程序
find / -xdev -perm -2000 -type f 2>/dev/null
对照业务清单,确认无需保留的程序移除特殊位。例如普通服务器上通常用不到以下命令的 SUID:
chmod u-s /usr/bin/chage
chmod u-s /usr/bin/gpasswd
chmod u-s /usr/bin/wall
# 注意:/usr/bin/passwd、/usr/bin/sudo 的 SUID 必须保留,移除会导致无法改密和提权
第四步:加固关键配置文件
# SSH 密钥与认证文件权限(错误权限会直接导致登录失败或被篡改)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# 核心认证与调度文件锁定,防止被篡改
chattr +i /etc/passwd /etc/shadow /etc/crontab
# crontab 需要编辑时先解锁
# chattr -i /etc/passwd
第五步:规范 Web 目录权限
以站点目录属于运行用户、配置文件只读为原则:
# 目录 755,文件 644,属主为运行账号
chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
# 上传目录才需要可写,且建议禁止执行
chmod 755 /var/www/html/uploads
chattr +i 不适用于上传目录,改用 Nginx 层禁 PHP 执行
配置验证
# 确认无残留全局可写文件
find / -xdev -type f -perm -0002 2>/dev/null | wc -l
# 确认 SUID 清单只剩业务必需项
find / -xdev -perm -4000 -type f 2>/dev/null
# 确认关键文件已锁定
lsattr /etc/passwd /etc/shadow
# 以普通账号尝试读取 shadow 应被拒绝
su - testuser -c "cat /etc/shadow"
常见问题
FAQ 1:执行 chattr +i 后连 root 也无法修改文件怎么办?
这是预期行为,immutable 属性对 root 同样生效。需要修改时先执行 chattr -i /etc/passwd 解锁,改完再加回。若 chattr 报错 Operation not permitted,检查文件系统是否支持该属性(部分容器和 NFS 挂载不支持)。
FAQ 2:网站上传头像报权限错误,是否要改成 777?
不要。正确做法是把上传目录属主改为 PHP/Nginx 运行用户(如 chown -R www-data:www-data uploads),目录权限 755,并确保 umask 不产生更严限制。改为 777 会让服务器上所有账号都能向该目录写文件,等于给攻击者留了落地入口。
总结
文件权限加固成本极低、收益极高,建议纳入服务器上线检查清单:umask 统一 027、清理全局可写文件、SUID 程序白名单化、关键认证文件 chattr 锁定、Web 目录按运行账号最小授权。配合定期审计脚本对以上项目做例行检查,可有效压缩攻击者在拿到初始权限后的横向移动空间。