浅谈 Linux 中目录的权限配置问题
一、问题的起因
这周遇到一个需求,Linux 服务器的其他用户需要把数据存在 /data
目录下,但是没有权限,通过 ls -l
指令查询 /data
目录的相关信息发现, /data
目录的 owner
和 group
均为 root
,这也难怪其他用户没有权限。
既然找到了问题所在,就想着要解决问题,但是解决过程中还是遇到了一些麻烦,让自己又重新思考和理解了 Linux 中关于目录权限配置的一些细节,于是就有了这篇文章。
注:关于为什么要把数据存在
/data
目录下这里做一个简单说明,因为/home
目录存储空间不够了,/home
目录挂载的是固态硬盘,速度快,但是容量小,而/data
目录下挂载的是机械硬盘,容量大,但是速度慢 ,所以/home
目录用于临时存放要处理的数据,/data
用于长期存放归档数据。
二、修改目录的 owner 和 group
既然是因为 /data
目录的 owner
和 group
均为 root
,导致的普通用户没有权限,当时,自己能想到的一个最简单的,也是最直接的解决办法就是,直接修改 /data
目录的 owner
和 group
,具体过程如下,
-
创建一个新用户(Linux 会默认为该用户创建一个同名的
group
)$ useradd family
-
将
/data
目录的owner
和group
均为family
$ chown family:family /data
-
将需要存储数据到
/data
目录下的用户(比如:Tom
)添加到family
$ usermod -aG family Tom
-
为
/data
目录的group
分配w
权限(Linux 中默认目录的权限为755
,文件的权限为644
)$ chmod g+w /data
-
让
Tom
Logout 再 Login,这时候就应该可以在/data
目录进行文件的存储了
本来事情到这,以为问题都圆满解决了,哪曾想就简单的测试了一下(手贱!!),发现这样操作有一个极大的弊端就是,只要是 family
这个群组的用户均可以对 /data
目录下的目录或文件进行删改。
具体来说,比如现在 family
这个群组有 Tom
和 Jerry
两个用户,/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/
目录的 owner
和 group
都是 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
目录,它本身的 owner
和 group
均为 root
,只不过说在 /home
目录下,又单独为每一个普通用户创建了一个属于他们的目录,这个操作肯定是由 root
用户来处理的,其实也就是在创建用户(useradd
)的过程中完成的,而 useradd
是 root
用户才能完成的操作。
从中也引出了一个结论,对于 Linux 的目录或者文件的权限起到决定性作用的其实是上层目录的权限分配。
当意识到了这一点,就可以解释之前那个例子中,为什么 Jerry
可以将 Tom_data/
目录删除掉,Tom_data/
目录的 owner
和 group
不都是 Tom
吗?
这是因为对于 Tom_data/
目录的上层目录 /data
来说 Jerry
属于 family
这个群组,而 family
拥有 /data
的 w
权限,也就是说 Jerry
拥有了 /data
目录下所有目录和文件的 w
权限,所以虽然从 Tom_data/
目录所在的层面看,Tom_data/
目录的 owner
和 group
都是 Tom
,但是 Jerry
也可以将 Tom_data/
目录删除掉,因为这项权限是由 Tom_data/
目录的上一层目录 /data
赋予的(可以通俗的理解为 /data
是 Tom_data/
的上级长官,正所谓“官大一级压死人” )。
既然这样,一开始要解决那个问题就变得简单起来了,只需要用 root
账户为需要在 /data
目录下存储数据的普通用户(比如:Tom
)创建一个属于他的目录即可,而 /data
目录的权限保持不变,即:/data
目录的 owner
和 group
还是设为 root
,权限还是保持默认为 755
即可,具体操作如下,
-
使用
root
账户进入/data
目录下,创建目录$ mkdir Tom_data
-
修改目录的
owner
和group
为Tom
$ chown Tom:Tom Tom_data/
至此,问题得到了完美解决,达到了和 /home
同样的权限分配的效果。
四、Linux 中群组的作用
文章到这本来应该结束了,但是脑子又不由得会去想(实在是管不住它!)既然群组的用法并不是前面尝试的那样,那 Linux 中群组的作用究竟是什么?换句话说,Linux 群组的正确打开方式究竟是什么?
结合前面的实践,能想象到这样一个应用场景,比如:一个公司的一台服务器上,在 /ProjectA
目录下,管理着一个大项目,而这个大项目又由不同的小项目(子模块)构成,分别对于着不同的目录,projectA1
,projectA2
,projectA3
…,分别由公司不同的团队去完成,这时候就可以为 projectA1
,projectA2
,projectA3
设置不同的群组。
当然,上面这个例子,仅仅只是自己臆想的一个结果,可能真实情况和自己的想象有出入,目前还暂时没有遇到过具体的实例,等后面遇到了再来补充。
五、写在最后
文章的最后,简单对文章的内容进行一个总结,
- 在 Linux 中,对某个目录进行权限配置,大多都可以参考
/home
目录的权限配置; - 对于 Linux 的目录或者文件的权限起到决定性作用的其实是上层目录的权限分配;
- 修改目录所属的群组时需要慎重,尤其是当群组对该目录拥有
w
权限时; - Linux 中目录的最高权限是
777
,文件的最高权限是666
(因为目录要比文件多一个x
的权限,这保证了能够进入文件夹 ),创建一个目录或文件的默认权限由umask
决定。比如:常见的umask
,root
用户为0022
,普通用户为0002
,那么以root
用户为例,创建一个目录,该目录的默认权限是755
,创建一个文件,该文件的默认权限是644
。
留下评论