一直大概了解 linux 中的文件系统权限, 但没好好整理下总结. 这里就总结一下几个东西:
摘抄一下基本概念:
类Unix系统中的权限管理分为三个不同的类别:文件拥有者 (user, 也成为 owner)、同组用户 (group) 以及其他用户 (other), 既 UGO
在 UGO 权限中, 从用户和权限来制定目录和文件的权限细则.
UGO 权限把用户划分为三种类别: 文件所有者 (u
), 所有者所在组 (g
), 所有其他用户 (o
). 还可以使用 a
来代表所有, 既 ugo
.
权限区分为三种: 读 (r
), 写 (w
), 执行 (x
). 三种权限在目录和文件上使用有所区别.
权限 | 文件 | 目录 |
---|---|---|
r | 读取文件内容 | 读取目录下文件列表, 不包括文件内容 |
w | 编辑文件内容, 不包括删除文件 | 目录下创建/重命名/删除文件 |
x | 文件具有可执行权限 | 可进入目录作为工作目录, 并可读取目录下的文件内容. |
那么直接来看下实例:
vagrant@homestead:/tmp/demo$ ll
total 12
drwxrwxr-x 3 vagrant vagrant 4096 Feb 12 01:53 ./
drwxrwxrwt 10 root root 4096 Feb 12 02:02 ../
drwxrwxr-- 2 vagrant vagrant 4096 Feb 11 09:47 demo/
第一列中的那串字, 代表着:
d rwx rwx r-x
{文件类型} {u} {g} {o}
其中文件类型常见几种:
符号 | 含义 |
---|---|
d | 目录 |
- | 普通文件 |
l | 链接文件 |
b | 块设备文件 |
c | 字符设备文件 |
s | socket 文件 |
而 rwx
就简单明了了, -
则代表没有对应的权限. 在 chmod
函数中, 权限的描述语法有两种: 八进制模式和符号模式.
符号模式中包含用户, 操作符, 模式.
操作符 | 含义 |
---|---|
+ | 为指定用户类型增加权限 |
- | 去除指定用户类型的权限 |
= | 设置指定用户权限的设置,即将用户类型的所有权限重新设置 |
因此, 在符号模式下, 可以用 chmod
来这样设置用户权限
# 给 other 增加 x 权限
chmod o+x test_file
# 给 other 减少 w 权限
chmod o-w test_file
# 给 other 设置权限为 rwx
chmod o=rwx test_file
数值 | 含义 |
---|---|
4 | r |
2 | w |
1 | x |
0 | - |
用 chmod 来设置权限:
chmod 664 test_file
那么问题来了, 在 php 项目中, 以 laravel 为例, 项目目录的权限, 及 storage 目录的权限, 应该怎么设置呢? 首先根据几种类型的目录来区分:
首先无论是 fpm 还是 cli, 对 php 文件都只需要读取权限即可. 因此对于执行用户, 目录需要给到 5 (r-x
), 而文件仅需要需要给到 4 (r--
).
文件缓存需要读取在 cache
目录中创建子目录, 及写入/读取 缓存文件. 因此对于执行用户, 目录需要给到 7 (rwx
), 而文件同样仅需要给到 4 (r--
).
上传文件一般区分两种, 上传后需要提供给用户访问, 以及不需要提供给用户访问的. 前者可能是用户上传的头像或者之类的图片, 我认为仅需要给到执行用户 4 (r--
) 即可.
而对于后者, 可能是用户上传的 excel 文件, 一般情况下是程序读取内容后留存备用, 这种情况下不应该有其他用户可以读取到, 我认为可以考虑给到 0 (---
).
最后总结
强调执行用户, 是因为可能存在代码所有者跟执行用户 (nginx/fpm) 用户一致的情况, 两种情况下的处理方式也不一样:
对于 homestead 或是其他的一键部署的环境, 一般所有者跟执行用户都会共用一个账号例如
www
, 这样会带来一种情况是当存在漏洞时, 黑客可以修改 php 的文件内容, 亦或是上传可执行文件. 所以当用户设置是这样时,x
权限是非常有必要取消的. 当然, 还是推荐 nginx/fpm 的执行用户跟代码所有者用户要区分开.