Linux Web安全权限核心是UGO模型与ACL结合:目录必须含执行(x)位才能遍历,静态文件用644、根目录用755,上传目录单独设755并禁用脚本执行,敏感文件移出Web根目录或设600,必要时用setfacl实现多用户细粒度授权。
服务器文件权限与目录访问控制,核心是用好 Linux 的 用户-组-其他(UGO)权限模型 和 ACL(访问控制列表),再配合 Web 服务配置(如 Nginx/Apache)做细粒度隔离。不设对、不配严,轻则目录被遍历、文件被篡改,重则 webshell 落地、数据泄露。
基础权限:用 chmod 和 chown 管住读写执行
每个文件/目录有三类主体(所有者 owner、所属组 group、其他人 others)和三类操作(读 r、写 w、执行 x)。常用命令:
-
chmod 644 file.txt → 所有者可读写,组和其他人只读(适合静态文件)
-
chmod 750 /var/www/app → 所有者全权,组可读+执行(进目录),其他人无权限(防外部访问)
-
chown www-data:www-data /var/www/html → 把 根目录归属 Web 服务用户和组,避免 root 运行进程
- 目录必须有 x 权限 才能进入或列出内容,所以 750 比 640 更合理
敏感目录隔离:禁止 Web 直接访问 config、logs、vendor
Web 根目录下不该暴露的路径,靠 Web 服务器规则屏蔽,而非仅靠文件权限:
- Nginx 中加 location 块:location ~ ^/(config|logs|vendor|.git)/ { return 403; }
- Apache 中用 .htaccess:RedirectMatch 403 ^/(config|logs|.env)
- 把日志目录(/var/log/myapp)和配置目录(/etc/myapp)完全移出 Web 根目录,是最稳妥做法
必要时启用 ACL:突破 UGO 的三人限制
当需要给多个非所属组用户分配不同权限(比如运维、开发、审计各需不同访问),用 setfacl:
-
setfacl -m u:deploy:r-x /var/www/releases → 给 deploy 用户读+执行权限(可进目录、看文件名)
-
setfacl -m g:devs:rw- /var/www/shared/cache → 给 devs 组读写权限,不影响 owner/group 默认权限
- 用 getfacl /path 查看是否生效;注意部分挂载文件系统(如 NFS)可能不支持 ACL
最小权限原则:Web 进程不该有写权限,上传目录另设
Web 服务(如 nginx、php-fpm)运行用户(如 www-data)应只有必要权限:
- 代码目录设为 755 / 644,Web 进程只读,杜绝上传恶意脚本后直接执行
- 上传目录(如 /var/www/uploads)单独设为 755,且 Web 进程属主 + 可写;但禁用该目录内脚本执行(Nginx 加 location ~ .php$ { deny all; })
- 数据库配置文件(.env 或 config.php)权限设为 600,仅 owner 可读写