浅谈 Linux 中目录的权限配置问题

一、问题的起因

这周遇到一个需求,Linux 服务器的其他用户需要把数据存在 /data 目录下,但是没有权限,通过 ls -l 指令查询 /data 目录的相关信息发现, /data 目录的 ownergroup 均为 root,这也难怪其他用户没有权限。

既然找到了问题所在,就想着要解决问题,但是解决过程中还是遇到了一些麻烦,让自己又重新思考和理解了 Linux 中关于目录权限配置的一些细节,于是就有了这篇文章。

注:关于为什么要把数据存在 /data 目录下这里做一个简单说明,因为 /home 目录存储空间不够了,/home 目录挂载的是固态硬盘,速度快,但是容量小,而/data 目录下挂载的是机械硬盘,容量大,但是速度慢 ,所以 /home 目录用于临时存放要处理的数据,/data 用于长期存放归档数据。

二、修改目录的 owner 和 group

既然是因为 /data 目录的 ownergroup 均为 root,导致的普通用户没有权限,当时,自己能想到的一个最简单的,也是最直接的解决办法就是,直接修改 /data 目录的 ownergroup ,具体过程如下,

  1. 创建一个新用户(Linux 会默认为该用户创建一个同名的 group

    $ useradd family
    
  2. /data 目录的 ownergroup 均为 family

    $ chown family:family /data
    
  3. 将需要存储数据到 /data 目录下的用户(比如:Tom)添加到 family

    $ usermod -aG family Tom
    
  4. /data 目录的 group 分配 w 权限(Linux 中默认目录的权限为 755,文件的权限为 644

    $ chmod g+w /data
    
  5. Tom Logout 再 Login,这时候就应该可以在 /data 目录进行文件的存储了

本来事情到这,以为问题都圆满解决了,哪曾想就简单的测试了一下(手贱!!),发现这样操作有一个极大的弊端就是,只要是 family 这个群组的用户均可以对 /data 目录下的目录或文件进行删改。

具体来说,比如现在 family 这个群组有 TomJerry 两个用户,/data 目录下的文件结构如下,

drwxr-xr-x 11 Tom    Tom     4096 Feb 10 05:20 Tom_data/
drwxr-xr-x 11 Jerry  Jerry   40sdasdaddaw96 Feb 10 13:14 Jerry_data/

这时候会发现,Jerry 可以将 Tom_data/ 目录删除掉,刚开始发现这个问题的时候,一度让我很困惑,因为 Tom_data/ 目录的 ownergroup 都是 Tom,为什么 Jerry 可以将其删除???

这肯定不是我们想要的效果,理想的效果应该是像 /home 目录那样,在 /home 目录下,每一个用户拥有一个属于自己的目录,能够在该目录下(~/)正常进行文件的存储,并且不能对自己之外的目录进行改写,甚至是删除。

对,只需要像 /home 目录那样!

三、用 root 账户为普通用户创建目录

既然有一个现成的例子,不妨先来看看 /home 目录是如何进行权限配置的,同样通过 ls -l 命令进行查看,

drwxr-xr-x 19 root   root   4096 Dec 14 21:28 .
drwxr-xr-x 21 root   root   4096 Mar 29 01:18 ..
drwxr-xr-x  6 Tom    Tom    4096 Feb 10 05:20 Tom
drwxr-xr-x 24 Jerry  Jerry  4096 Feb 10 13:14 Jerry

其中,. 代表当前的目录,也可以使用 ./ 来表示;.. 代表上一层目录,也可以用 ../ 来表示。

这也就是说,对于 /home 目录,它本身的 ownergroup 均为 root,只不过说在 /home 目录下,又单独为每一个普通用户创建了一个属于他们的目录,这个操作肯定是由 root 用户来处理的,其实也就是在创建用户(useradd)的过程中完成的,而 useraddroot 用户才能完成的操作。

从中也引出了一个结论,对于 Linux 的目录或者文件的权限起到决定性作用的其实是上层目录的权限分配

当意识到了这一点,就可以解释之前那个例子中,为什么 Jerry 可以将 Tom_data/ 目录删除掉,Tom_data/ 目录的 ownergroup 不都是 Tom 吗?

这是因为对于 Tom_data/ 目录的上层目录 /data 来说 Jerry 属于 family 这个群组,而 family 拥有 /dataw 权限,也就是说 Jerry 拥有了 /data 目录下所有目录和文件的 w 权限,所以虽然从 Tom_data/ 目录所在的层面看,Tom_data/ 目录的 ownergroup 都是 Tom,但是 Jerry 也可以将 Tom_data/ 目录删除掉,因为这项权限是由 Tom_data/ 目录的上一层目录 /data 赋予的(可以通俗的理解为 /dataTom_data/ 的上级长官,正所谓“官大一级压死人” )。

既然这样,一开始要解决那个问题就变得简单起来了,只需要用 root 账户为需要在 /data 目录下存储数据的普通用户(比如:Tom)创建一个属于他的目录即可,而 /data 目录的权限保持不变,即:/data 目录的 ownergroup 还是设为 root,权限还是保持默认为 755 即可,具体操作如下,

  1. 使用 root 账户进入 /data 目录下,创建目录

    $ mkdir Tom_data
    
  2. 修改目录的 ownergroupTom

    $ chown Tom:Tom Tom_data/
    

至此,问题得到了完美解决,达到了和 /home 同样的权限分配的效果。

四、Linux 中群组的作用

文章到这本来应该结束了,但是脑子又不由得会去想(实在是管不住它!)既然群组的用法并不是前面尝试的那样,那 Linux 中群组的作用究竟是什么?换句话说,Linux 群组的正确打开方式究竟是什么?

结合前面的实践,能想象到这样一个应用场景,比如:一个公司的一台服务器上,在 /ProjectA 目录下,管理着一个大项目,而这个大项目又由不同的小项目(子模块)构成,分别对于着不同的目录,projectA1projectA2projectA3…,分别由公司不同的团队去完成,这时候就可以为 projectA1projectA2projectA3 设置不同的群组。

当然,上面这个例子,仅仅只是自己臆想的一个结果,可能真实情况和自己的想象有出入,目前还暂时没有遇到过具体的实例,等后面遇到了再来补充。

五、写在最后

文章的最后,简单对文章的内容进行一个总结,

  • 在 Linux 中,对某个目录进行权限配置,大多都可以参考 /home 目录的权限配置;
  • 对于 Linux 的目录或者文件的权限起到决定性作用的其实是上层目录的权限分配;
  • 修改目录所属的群组时需要慎重,尤其是当群组对该目录拥有 w 权限时;
  • Linux 中目录的最高权限是 777,文件的最高权限是 666(因为目录要比文件多一个 x 的权限,这保证了能够进入文件夹 ),创建一个目录或文件的默认权限由 umask 决定。比如:常见的 umaskroot 用户为 0022,普通用户为 0002,那么以 root 用户为例,创建一个目录,该目录的默认权限是 755,创建一个文件,该文件的默认权限是 644

标签:

分类:

更新时间:

留下评论