Apache 的 www-data 用户对 /var/www 的权限怎么设置最合理?
/var/www 推荐权限:属主 root 或部署用户、组 www-data;目录 755、文件 644;需写入的目录(上传/缓存)单独给 www-data 写权限。切忌 777。本文给出命令与安全原则。
推荐基线:站点文件属主给部署者**(如 root 或你的部署用户),组设为 www-data;目录权限 755、文件权限 644;只有 Apache 必须写入的目录(上传、缓存、日志)才把属主或写权限单独给 www-data。底线:绝不 chmod -R 777。**
标准设置
# 1. 属主:root 拥有,组为 www-data(组可读)
sudo chown -R root:www-data /var/www/mysite
# 2. 目录 755(可进入可列出)
sudo find /var/www/mysite -type d -exec chmod 755 {} \;
# 3. 文件 644(可读不可执行写入)
sudo find /var/www/mysite -type f -exec chmod 644 {} \;
Apache(以 www-data 运行)通过组读拿到内容,部署者通过属主写更新内容。
可写目录单独开
# 以上传目录为例
sudo chown -R www-data:www-data /var/www/mysite/uploads
sudo find /var/www/mysite/uploads -type d -exec chmod 755 {} \;
sudo find /var/www/mysite/uploads -type f -exec chmod 644 {} \;
可写目录还应:禁止执行脚本(Apache 配置里 php_admin_flag engine off 或 Nginx 里禁 PHP 解析),防上传木马被执行。
多人/自动化部署场景
部署用户不止一个时,用组协作模型:
sudo groupadd deploy
sudo usermod -aG deploy alice
sudo usermod -aG deploy bob
sudo chown -R root:deploy /var/www/mysite
sudo chmod -R g+rwX /var/www/mysite
# setgid 位让新文件继承组
sudo find /var/www/mysite -type d -exec chmod g+s {} \;
再配合 ACL 让 www-data 保持可读:sudo setfacl -R -m g:www-data:r-X /var/www/mysite。
原则小结
- Apache 只需要读的地方绝不开写
- 必须写的地方最小范围开放+禁执行
- 777 任何时候都不是答案
观测云对照
权限类故障在日志里有签名。 Apache/PHP 的 permission denied、上传失败等报错集中采集到观测云后,与发布/变更时间线对照,可快速定位是哪次部署改错了属主。
常见问题(FAQ)
Q:直接把属主全给 www-data 行不行?
A:能跑但不推荐——应用漏洞(如 webshell)拿到 www-data 就能改写全部代码文件;属主给部署者、组给 www-data 的结构更稳。
Q:FTP/CI 上传后权限又乱了?
A:给目录加 setgid + 配置部署工具的 umask(如 022),让新文件自动继承组与正确权限位。
Q:SELinux 环境(CentOS)还要注意什么?
A:httpd 能读的上下文是 httpd_sys_content_t,可写目录要 httpd_sys_rw_content_t:semanage fcontext + restorecon。