www-data 应仅对 /var/www/html 拥有最小权限:文件640、目录750,所有者root、组www-data;上传等需写权限的目录须隔离并显式授权(如 uploads 目录770),且禁用脚本执行;配合禁目录列表、禁用危险函数等纵深防御。

要让 www-data 用户对 Web 根目录(如 /var/www/html)拥有最小必要权限,核心是:只给它读取和执行(进入目录)权限,禁止写入;静态资源可设为只读,动态脚本(如 PHP)无需额外执行权限(由解释器处理);敏感文件(配置、日志、上传目录)必须隔离并单独授权。
明确 www-data 的角色边界
www-data 是 Web 服务器(Apache/Nginx+PHP-FPM)工作进程运行的身份,不是管理员,也不应具备文件修改能力。它的典型行为仅限于:
- 读取 HTML、CSS、JS、图片等静态文件
- 进入目录(需 +x 权限)以遍历路径
- 执行 PHP 脚本(但实际由 PHP 解释器完成,文件本身不需要 +x)
- 向特定目录(如
/var/www/html/uploads或/tmp)写入临时/上传内容(需显式授权)
根目录权限设置(推荐方案)
以 /var/www/html 为例,执行以下命令:
sudo chown -R root:www-data /var/www/html
sudo find /var/www/html -type f -exec chmod 640 {} \;
sudo find /var/www/html -type d -exec chmod 750 {} \;
sudo chmod 640 /var/www/html/.htaccess # 如使用 Apache
说明:
- 所有者为 root,防止应用层代码意外篡改文件
- 所属组为 www-data,便于后续对特定子目录开放写权限
- 文件权限
640:owner 可读写,group 只读,others 无权访问 - 目录权限
750:owner 可读写执行,group 可读执行(必需),others 完全拒绝
为动态功能安全开放有限写权限
若应用需要上传、缓存或生成文件,绝不直接给 /var/www/html 加写权限,而是创建隔离目录并精确授权:
- 新建上传目录:
sudo mkdir /var/www/html/uploads - 设属组为 www-data 并开放组写权限:
sudo chown root:www-data /var/www/html/uploads && sudo chmod 770 /var/www/html/uploads - 在 Web 配置中禁止该目录执行脚本(Nginx 加
location ~ ^/uploads/.*\.(php|pl|py|jsp|sh|cgi)$ { return 403; };Apache 启用php_flag engine off) - 日志、缓存等非 Web 可访问目录(如
/var/www/app/cache)建议放在/var/cache/yourapp等系统标准路径,不置于 Web 根下
补充加固要点
权限只是基础,还需配合其他机制形成纵深防御:
- 禁用目录列表:确保 Web 服务器配置中关闭
Indexes(Apache)或autoindex off(Nginx) - 限制 PHP 危险函数:在
php.ini中设置disable_functions = exec,passthru,shell_exec,system,proc_open,popen,parse_ini_file,show_source - 启用 open_basedir(可选):限制 PHP 脚本能访问的文件系统路径,避免越权读取
- 定期检查异常文件:用
find /var/www/html -type f -perm /o+w排查是否误放开 others 写权限










