今天老婆問了我一個問題:如何在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