服务器文件权限详解:777为什么是灾难?

服务器文件权限详解:777为什么是灾难?

你的网站文件上传不了,或者写不了日志。你搜了一下,有人告诉你:chmod 777 -R。你照做了,问题解决了。但你把服务器的门拆了,让所有人都能进去随便改。

777不是解决方案,是灾难。你可能不知道,但攻击者知道。他们会找那些777的目录,写webshell,种木马。今天把文件权限讲透,告诉你755和644的区别,以及为什么777永远不该用。


先看一个数据

某安全团队对1000台被入侵的Linux服务器做了分析,超过60%的服务器存在权限配置过宽的问题。其中最常见的就是777目录和可写可执行的Web目录。攻击者不需要0day漏洞,只需要找到你忘了锁的门。777就是那扇敞开的门。


权限数字的含义

文件权限用三个数字表示:比如755644。每个数字代表一类用户:

数字位置代表用户说明
第一位owner(文件所有者)通常是创建文件的用户
第二位group(所属组)和owner同组的用户
第三位others(其他用户)任何人

每个数字是三种权限的和:

权限数字文件含义目录含义
读(r)4看文件内容列出目录内容
写(w)2修改文件创建/删除目录内文件
执行(x)1执行文件进入目录

7 = 4+2+1(读+写+执行)
6 = 4+2(读+写)
5 = 4+1(读+执行)
4 = 4(只读)

755:owner有所有权限(7),group只能读和执行(5),others只能读和执行(5)。标准目录权限。

644:owner可读可写(6),group只读(4),others只读(4)。标准文件权限。

777:所有人可读可写可执行。门开着,钥匙挂在外面。


755 vs 644:网站文件的标准配置

一个典型的PHP网站,标准权限应该是:

类型权限说明
目录755owner可读写执行,其他人只读可执行
文件644owner可读写,其他人只读
配置文件(含密码)640owner可读写,group可读,others无权限
上传目录755需要写入,但只对owner开放写入
缓存目录755需要写入,web用户需是owner或group成员

设置目录权限:

bash

find /var/www/html -type d -exec chmod 755 {} \;

设置文件权限:

bash

find /var/www/html -type f -exec chmod 644 {} \;

上传目录(如/uploads)web用户需要写入。正确做法是把目录owner改成web用户,仍然用755:

bash

chown -R www-data:www-data /var/www/html/uploads
chmod 755 /var/www/html/uploads

chmod 777 /uploads能工作,但任何用户都能删别人上传的文件。


为什么777是灾难

风险一:任意用户可写

攻击者通过Web漏洞上传一个PHP文件到777目录,然后访问这个文件,就能执行任意系统命令、拖走数据库、种挖矿程序。

风险二:任意用户可改系统文件

如果把/etc/passwd设成777,任何用户都能添加root权限账号。

风险三:权限提升跳板

普通用户找到一个777的可执行文件,替换成自己的恶意程序,等root用户执行时就被提权。


其他危险权限

权限危险正确做法
777任何人可写可执行目录用755,文件用644
666任何人可读写配置文件放web目录外
/tmp 1777粘滞位是正常的,但里面文件不能777保持默认
suid二进制文件普通用户以root执行非必要不设suid

安全配置原则

最小权限原则:只给完成任务所需的权限,不多给一分。

Web目录不要有配置文件:数据库密码文件放web目录外。Nginx配置open_basedir限制PHP只能访问特定目录。

上传目录禁止执行脚本:Nginx配置里对/uploads目录禁止解析PHP:

nginx

location /uploads {
    location ~ \.php$ {
        return 403;
    }
}

即使攻击者上传了webshell,也执行不了。


实用命令

bash

# 查看文件权限
ls -l

# 查看目录权限
ls -ld /var/www/html

# 找出777的文件
find / -perm 0777 -type f 2>/dev/null

# 找出777的目录
find / -perm 0777 -type d 2>/dev/null

# 找出没有owner的文件
find / -nouser -o -nogroup 2>/dev/null

# 递归修改目录权限
find . -type d -exec chmod 755 {} \;

# 递归修改文件权限
find . -type f -exec chmod 644 {} \;

真实案例

一个开发为了方便,给整个网站目录chmod 777 -R。攻击者通过一个上传漏洞,在/uploads目录写了webshell,然后通过webshell读取了数据库配置文件(也是777),拿到了数据库密码,拖走了整个用户表。

事后分析:如果目录权限是755,webshell虽然能上传,但执行不了。即使能执行,权限不够读配置文件。一层权限挡一层风险。


最后一句

chmod 777不是解决问题,是绕过问题。权限不对,应该去找哪个用户需要写入,而不是让所有人能写。

记住:目录755,文件644。上传目录设对owner,配置目录放对位置。定期扫一遍全站,找出777的文件和目录。

下次你遇到权限问题,别敲777。停下来想想:到底哪个用户需要写?把它设成owner,755就够了。

知识库

API网关入门:Nginx实现灰度发布与流量切分

2026-6-4 16:35:21

知识库

云手机操作系统升级:如何顺利迁移,避免数据丢失与功能受限

2025-7-16 12:11:48

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧