今天老婆问了我一个问题:如何在linux 下实现某个目录普通用户能够写入文件,但是不能删除或修改(只能由root 删除或修改)。开始的两分钟里,我初步判断这是做不到的,因为linux 下能 写入(w)
就代表着同时能 修改
和 删除
,命题是矛盾的。后面我又想到 粘滞位和 facl,幸好没有放弃,最后还是想到如何做到这个效果。下面是实验过程
首先起个目录用来做实验
[root@node1 data]# pwd
/data
[root@node1 data]# mkdir sample
接着我们设置好目录的属组和权限
# 修改 sample 目录属组
[root@node1 data]# chown -R root:root sample
# 修改 sample 目录权限,让组和用户都没有任何权限,也就是说
# 只有 root 能
# 1. 进入该目录
# 2. 向该目录写入文件
# 3. 修改或删除该目录中的文件
# 4. 执行该目录中的文件
# 其他组和用户什么都干不了
[root@node1 data]# chmod 700 sample
[root@node1 data]#
[root@node1 data]# ll
total 0
drwx------ 2 root root 6 Apr 20 12:14 sample
做完上面一步,普通用户是不能向进入 sample 目录,也不能修改或执行 sample 目录中的文件。如果有一个程序能够向该目录添加文件,那我们就通过粘滞位来提升一下普通用户的权限,并保证该程序对普通用户可用。程序需要自己编写,这里为了实验就直接用 mv 来替代,为了不影响系统,这里换了个名字叫 add
[root@node1 data]# cp /usr/bin/mv /usr/bin/add
# 给 add 添加粘滞位,这样,其他用户使用 add 的时候就能提升为 root 权限,而 root 可以向 sample 目录写入文件
[root@node1 data]# chmod u+s /usr/bin/add
[root@node1 data]# ll /usr/bin/add
-rwsr-xr-x. 1 root root 130344 Nov 6 2016 /usr/bin/add
好了,到最后了,我们切换到普通用户,进行检验。看看对该目录的查改删是不是都可以(通过mv),看看通过 add(提升为root) 能不能向 sample 目录添加文件。
# 切到普通用户,如 kafka,创建一个文件
[kafka@node1 ~]$ touch file
[kafka@node1 ~]$ ll
total 0
-rw-rw-r-- 1 kafka kafka 0 Apr 20 12:28 file
# 通过mv 添加文件到 sample 目录,失败了,因为普通用户没有权限写入
[kafka@node1 ~]$ mv file /data/sample/
mv: cannot stat ‘/data/sample/file’: Permission denied
# 通过应用程序 add 添加文件到 sample 目录,执行成功了。因为执行时,权限会临时提升为 root
[kafka@node1 ~]$ add file /data/sample/
# 查看和删除也都失败了
[kafka@node1 ~]$ ll /data/sample/
ls: cannot open directory /data/sample/: Permission denied
[kafka@node1 ~]$ rm -f /data/sample/file
rm: cannot remove ‘/data/sample/file’: Permission denied