服务器根目录权限最小化核心是让www-data仅读静态资源、仅写上传目录、不执行代码、不访问敏感文件;典型配置为public/目录750、文件640,uploads/单独750并禁php解析,app/和config/由deploy管理且www-data无权访问。

服务器根目录权限最小化,核心是让 Web 服务进程(如 www-data 或 nginx)只读静态资源、只写上传目录、不执行代码、不接触敏感文件——不是“全给 www-data”,而是“只给它刚好够用的那一点”。
明确 www-data 的实际权限边界
它不该拥有整个网站目录,而应仅具备以下能力:
- 可读:HTML、CSS、JS、图片等公开资源;PHP/Python 脚本文件(但不直接执行)
-
可写:仅限明确设计为动态写入的子目录,如
uploads/、cache/、logs/ - 不可执行:上传目录内禁止解析 PHP、Shell 等脚本(靠 Web 服务器配置+文件权限双重限制)
-
不可访问:源码目录(
app/)、配置目录(config/)、数据库凭证等必须由部署用户(如deploy)持有,www-data对其无任何读写执行权限
典型目录结构与权限分配
以 /var/www/example.com 为例:
-
/var/www/example.com/public/—— Web 根目录(Nginx/Apache DocumentRoot)
属组设为www-data:chgrp -R www-data public/
目录权限750,文件权限640:find public/ -type d -exec chmod 750 {} \; && find public/ -type f -exec chmod 640 {} \; -
/var/www/example.com/public/uploads/—— 单独放开可写
目录权限设为750(组可写),并确保内部文件不被解析:
在 Nginx 中添加:location ~ ^/uploads/.*\.php$ { return 403; }
上线前清理可疑脚本:find uploads/ -type f -name "*.php" -delete -
/var/www/example.com/app/、/var/www/example.com/config/—— 不在 Web 路径下
属主为deploy:deploy,权限700(目录)或600(文件),www-data完全无法进入 -
/var/www/example.com/logs/—— 日志目录
属主www-data:adm,权限750,便于 logrotate 读取归档
Web 服务器层同步加固
权限设置只是基础,必须配合运行时控制:
- Nginx 配置中显式声明
user www-data;,避免以 root 启动 - 禁用非必要解析:对
uploads/、cache/等目录,用location块拒绝所有.php、.sh、.py请求 - 启用
secure_link或limit_except限制 HTTP 方法(如禁止上传目录支持PUT、DELETE) - 确保
open_basedir(PHP-FPM)或chroot(高级场景)进一步隔离脚本可访问路径
验证与持续检查
配置后务必切换用户实测:
-
sudo -u www-data ls -l /var/www/example.com/public/→ 应成功列出 -
sudo -u www-data touch /var/www/example.com/public/test.txt→ 应失败(除非在uploads/内) -
sudo -u www-data cat /var/www/example.com/config/database.php→ 应提示 Permission denied - 定期运行:
find /var/www -type f -perm -o+x 2>/dev/null检查是否意外开放了其他用户可执行权限











