RunnerLee

unix的文件系统权限 (UGO)

February 11, 2019 · · Updated February 11, 2019

一直大概了解 linux 中的文件系统权限, 但没好好整理下总结. 这里就总结一下几个东西:

  • UGO 权限的内容
  • chmod 命令的使用
  • php 项目中目录和文件的权限设置

摘抄一下基本概念:

类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) 用户一致的情况, 两种情况下的处理方式也不一样:

  • 当所有者跟执行用户不一致时, 目录可以设置 755, 文件 644. 而缓存目录可以设置 777, 文件 644
  • 当所有者跟执行用户一致时, 所有目录设置 755, 文件 644

对于 homestead 或是其他的一键部署的环境, 一般所有者跟执行用户都会共用一个账号例如 www, 这样会带来一种情况是当存在漏洞时, 黑客可以修改 php 的文件内容, 亦或是上传可执行文件. 所以当用户设置是这样时, x 权限是非常有必要取消的. 当然, 还是推荐 nginx/fpm 的执行用户跟代码所有者用户要区分开.

参考

  • https://www.cnblogs.com/vishun/p/6950251.html
  • https://www.cnblogs.com/sparkdev/p/9573355.html
  • File system permissions - Wikipedia








  • About
  • Search
  • Powered by Jekyll using the Trio theme