最小权限原则,即每个用户和进程只给完成任务所需的最低权限,并区分属主、属组、其他人三类角色的读写执行范围。这篇文章不谈空泛理论,直接讲清楚不同服务场景下怎么设、为什么这么设,以及踩坑后怎么排查和恢复。

先搞清楚权限体系里三个角色的游戏规则
文件权限本质是一场”身份识别”游戏,Linux系统对每个文件都记录了三个维度的身份:属主(user)、属组(group)和其他人(other),每个维度下又分三种操作类型:读(r,值4)、写(w,值2)和执行(x,值1),权限值不是装饰,它是数字运算结果。
举个例子:权限644等于属主可读写(4+2=6)、属组可读(4)、其他人可读(4)。755就多了一个执行位,属主能读能写能执行,其余两组只能读和执行,老运维闭着眼睛写chmod 644 file和chmod 755 dir,不是死记硬背,而是理解了两条规律:
- 普通文件默认不能给执行权,除非是脚本或二进制程序。
- 目录必须要有执行权,否则别人进不了目录,读权限形同虚设。
不少新手栽在”目录给了644″上,结果页面报403,执行位对目录意味着”穿越权”,没有x,目录的r只是列出文件名,却无法cd进入,也无法cat里面的文件。
不同服务形态的权限策略是两条平行线
静态网站与静态资源
静态HTML、CSS、JS、图片这类文件,运行过程只读不写,建议统一设为644,目录设为755,属主是部署用户(比如www-data或nginx),这套组合的逻辑是:属主拥有完全控制权,但这只是为了让FTP或CI上传时能覆盖文件;属组和游客只读,绝不开放写入。
以Nginx为例,假设站点目录在/var/www/html,依次执行:
chown -R www-data:www-data /var/www/html
find /var/www/html -type f -exec chmod 644 {} ;
find /var/www/html -type d -exec chmod 755 {} ;
第一步改属主属组,后两步分别锁文件权限和目录权限,这套操作跑完,静态站基本没有可写入口,入侵者即便上传了脚本也执行不了,如果网站启用OPcache这类缓存,临时目录还要单独处理,一般给/var/www/html/wp-content/cache设755,属主保持部署用户。
PHP动态脚本特有的”写”需求
PHP站点跟静态站有个关键差异:运行时需要写缓存目录、日志目录、上传目录,于是权限方案要分化:
- 脚本类文件(.php):一律
644,只保留读权限。 - 上传目录(uploads):
755或775,Nginx运行用户需有读权限,PHP-FPM进程需有读加写权限。 - 缓存目录(cache/tmp):
755,运行用户写入受限。
具体操作里,很多开发者直接把整个目录chmod -R 777,省事但危险,一个普通的PHP远程代码执行漏洞就能让攻击者往任何可写目录丢webshell,稳妥的做法是先确认PHP-FPM工作用户:
ps aux | grep php-fpm
多数发行版下是www-data,然后将缓存和上传目录的属主改成www-data:
chown -R www-data:www-data /var/www/site/cache /var/www/site/uploads chmod -R 755 /var/www/site/cache
用755而不是777,是因为属主已经能写,其他人只要能读和执行就行,Windows服务器(IIS)则要注意IUSR和IIS_IUSRS组权限,目录写权限同样只给运行池对应的身份,不给Everyone。

文件属主与目录属主:改错方向等于白设权限
chmod改的是权限位,chown改的是归属对象,很多权限问题不是权限数值不对,而是对象搞错了。
排查场景很典型:网站上传图片报”无法写入”,你检查了upload目录是755,权限数值没问题,但上传还是失败,此时先看属主属组:
ls -ld upload
如果显示root root,而PHP-FPM以www-data运行,那么www-data在”其他人(other)”这一层,755模式下只有读执行权限,自然写不了,修正命令:
chown -R www-data:www-data upload
之后再ls -ld确认一下,这个习惯值得养成。权限数值是刻度,属主属组是方向,方向错了再好的刻度也白搭。
批量操作、特殊权限位和ACL:把精细权限控制玩明白
find配合chmod批量改
网站文件多时,手动改每层目录不现实,用find一次搞定:
# 将所有目录设为755
find /var/www/html -type d -exec chmod 755 {} ;
# 将所有普通文件设为644
find /var/www/html -type f -exec chmod 644 {} ;
这两个命令要多熟悉,执行完用ls -lR抽样检查,重点看边界目录(隐藏目录、符号链接)。
chattr加锁:对付篡改和勒索的硬手段
如果文件重要又不想被任何进程写(包括root),可以上chattr,对网页文件加上不可变属性:
chattr +i /var/www/html/index.php
加锁后,就算拿到root权限,也没法直接rm或echo >覆盖,解除时把+i换成-i即可,这个命令对目录同样生效,加在目录上整个目录树都不可增减文件。
需要精细给多个用户分配权限时用ACL
默认的ugo三元组没法应对”某文件让A用户只读、B用户可写、C用户完全不可见”这类复杂场景,ACL(访问控制列表)能精确到每个指定的用户或组,设置方法:
# 给指定用户设置读写权限 setfacl -m u:zhangsan:rw /var/www/html/report.txt # 查看ACL规则 getfacl /var/www/html/report.txt # 删除指定用户ACL setfacl -x u:zhangsan /var/www/html/report.txt
注意,ACL生效时ls -l的权限位尾部会出现加号,这是正常的,代表该文件启用ACL扩展项,很多新一代服务器托管方案默认在核心目录预置ACL策略,比如酷番云提供的云服务器模板中就封装了针对Web目录的基础ACL规则,开箱即用,省去手工摸索的时间,据其官方文档,这类模板配合ISO9001+ISO27001双认证的数据中心交付流程,能在服务器初始化阶段就规避掉权限配置的常见坑。

setgid位与粘滞位:目录场景的另外两个开关
- setgid(g+s):目录启用后,新创建的文件自动继承目录的属组,适合团队协作目录。
chmod g+s /var/www/html/team-images
- 粘滞位(o+t):目录内用户只能删自己的文件,典型的
/tmp就是这个权限。
chmod +t /var/www/html/uploads
这两个位在2026年的一线运维里出现频率并不低,多用户共管目录、无人值守上传目录都依赖它们,理解它们的关键在于:特殊权限位调整的是“用户+进程”的联动关系,而不是单纯的文件属性。
命令梳理:权限排查与恢复的五板斧
实际情况中,权限设置完出问题,排查速度决定恢复时间,按顺序过这五步:
- 确认当前身份:
id,先搞清楚当前用户属于哪些组,当前组的权限是哪个层级。 - 查看文件和目录权限:
ls -la 路径,看权限位和属主属组,重点看末尾有没有(SELinux context)或(ACL)。 - 追踪实际运行身份:
ps aux | grep php-fpm或systemctl status nginx,确定服务进程的启动用户。 - 模拟访问验证:
sudo su -s /bin/bash www-data -c "cat /var/www/html/test.php",用服务用户亲自试读或试写。 - 动态监控找回写权限:
auditctl -w /var/www/html/uploads -p wa -k upload_watch,配合ausearch -k upload_watch查看谁在试图写文件。
常见的”上传成功但图片无法访问”问题,多数情况下就是上传路径的目录被设成了600或700,导致Web服务用户读不了文件,快速修正:
chmod 755 /var/www/html/wp-content/uploads chown -R www-data:www-data /var/www/html/wp-content/uploads
权限不是设一次就万事大吉
服务器权限的安全边界,表面在数字三位数上,骨子里却在于有没有人定期审视这套分配,新兴的业务上线前,花10分钟检查一下新增目录的属主和权限;旧业务日常巡检时,随机抽几个文件看看是否混入了多余的可写权限,自动化脚本也能帮上忙——写一个每小时跑一次的find脚本,专门把权限位超过755的目录和超过644的文件列出来,既能保持感知,也不会被海量告警淹没。
经历过权限配置自然明白:把该锁的锁死、该放开的放开,运维的噩梦一半以上都能提前化解。 服务器的安全不靠运气,靠的是每一层目录、每一位权限上的克制。
Q&A模块
服务器文件权限设置,常用命令有哪些?
常用命令就三个组合:chmod(改权限)、chown(改属主和属组)、find(批量定位和更新),日常操作里,目录统一用755、文件统一用644、可执行程序或脚本用755,然后配合ls -l随时校验结果,需要精细到多用户读写时,就用setfacl做ACL扩展,最终用getfacl回查。
文件权限设成777会有什么风险?
777意味着所有身份对该文件可读、可写、可执行,任何被入侵的Web进程都能直接篡改文件内容,同时上传webshell后还能立即获得执行权,绝大多数安全扫描把777列为中高危项,合规审计也普遍不认,实际运维中,没有任何业务环节是必须要777的,即便临时目录也完全可以用chown加755替代。
服务器文件权限设置出现错误,怎么快速恢复?
先停止写操作,用ls -l定位异常文件;然后参照默认Web站点模板重置权限:目录统一find循环执行chmod 755,文件统一644,特殊写目录单独重新chown给Web运行用户,执行后用一个普通HTTP请求验证页面能否正常打开,再验证上传功能,如果拿不准如何分级恢复,且服务器采购自持牌服务商,可以直接参考服务商的模板配置——比如简米科技基于23年IDC运维经验沉淀出的权限基线策略,其自营机房服务器交付时附带基础安全配置白皮书,包含Web目录、日志目录、备份目录等不同类别的标准权限推荐值,按那份文档的表格抄作业,几分钟就能把权限紊乱的站点拉回正常状态。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/553786.html