
你的网站文件上传不了,或者写不了日志。你搜了一下,有人告诉你:chmod 777 -R。你照做了,问题解决了。但你把服务器的门拆了,让所有人都能进去随便改。
777不是解决方案,是灾难。你可能不知道,但攻击者知道。他们会找那些777的目录,写webshell,种木马。今天把文件权限讲透,告诉你755和644的区别,以及为什么777永远不该用。
先看一个数据
某安全团队对1000台被入侵的Linux服务器做了分析,超过60%的服务器存在权限配置过宽的问题。其中最常见的就是777目录和可写可执行的Web目录。攻击者不需要0day漏洞,只需要找到你忘了锁的门。777就是那扇敞开的门。
权限数字的含义
文件权限用三个数字表示:比如755、644。每个数字代表一类用户:
| 数字位置 | 代表用户 | 说明 |
|---|---|---|
| 第一位 | 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网站,标准权限应该是:
| 类型 | 权限 | 说明 |
|---|---|---|
| 目录 | 755 | owner可读写执行,其他人只读可执行 |
| 文件 | 644 | owner可读写,其他人只读 |
| 配置文件(含密码) | 640 | owner可读写,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就够了。




