Linux 权限模型:rwx 与 umask
chmod 644、chown www:www 天天在用,但很多线上权限事故源于对这套模型理解不完整。
三组身份与三个位
每个文件有三组权限:属主(u)、属组(g)、其他人(o),每组有读(4)、写(2)、执行(1)三个位。
- 文件的
x表示可执行; - 目录的
x表示可进入,r只表示可列出文件名。目录只给r不给x,能看名字但不能 cd 进去、也打不开里面的文件——这是「明明有读权限却 403」的常见原因。
ls -l /var/www/html
drwxr-x--- 5 www www 4096 site/ # www 可读写进入,组内可进可列,其他人无任何权限
umask:新文件的默认权限
新建文件的权限 = 666 - umask,目录 = 777 - umask(x 位对默认创建的文件不生效)。系统 umask 通常是 022,所以文件 644、目录 755。
陷阱在手工创建:某些环境下 umask 是 077 或 027,手工 echo 创建的配置文件会变成 600,Web 服务器(www 用户)读不到——服务无报错地 403/500,很难第一时间想到权限。
umask # 查看当前
umask 022 # 临时修改
install -m 644 /tmp/conf /etc/app/conf # 用 install 写文件,显式指定权限
属主与 SUID
chown user:group 第一个是属主、第二个是属组。web 目录常见做法:属主 root(或部署账号,拥有写权),属组 www(只需读),目录 750、文件 640——这样 web 进程无法修改自己的代码,即使被入侵也写不进可执行目录。
需要 web 进程写入的目录(上传、缓存)单独放开,并禁止执行:
chown -R www:www uploads/
chmod 750 uploads/
# 配合 Apache/Nginx 禁止 uploads 内脚本执行
几条实践
- 权限最小化:宁可遇到「读不到」的报错,也不要先开 777;
- 排查权限问题用
sudo -u www ls /path模拟 web 用户视角,比对着猜快得多; - 定期
find /var/www -perm -o+w找出可被任何人写的文件——它们是入侵后的后门温床; - 改配置前
stat一下原文件,记录属主与权限,改坏了能恢复。