在介紹Linux粘滯位之前,先來簡單介紹一下文件權限和目錄權限的區別。在linux系統中文件(文件和目錄)的權限有三種(r,w,x),而這三種權限對文件和目錄的意義有所不同。
權限對文件
r (read) :可讀取該文件的實際內容;
w(write):可以編輯,新增或者修改該文件的內容(但不含刪除該文件);
x(execute):代表該文件可以被系統執行
對於文件的r ,w, x來說,主要針對的"文件的內容"而言,與文件名的存在與否沒有關系;
權限對目錄
r (read):表示具有讀取目錄結構列表的權限,不如可以用ls查看一下目錄有什么
w(write):而寫的權限對目錄來說就顯得很強大了,代表具有更改該目錄結構列表的權限。目錄可寫操作包括:新建文件或目錄、刪除文件或目錄(不論文件的權限是什 么)、對文件或目錄重命名、移動文件或目錄等。
x(execute):目錄的X權限代表的是用戶能否進入該目錄稱為工作目錄。擁有此權限,就可以cd進去,否則,將不能進入目錄內部。
一、粘滯位介紹
粘滯位(Stickybit),或粘着位。最常見的用法在目錄上設置粘滯位,如此以來,只有目錄內文件的所有者或者root才可以刪除或移動該文件。如果不為目錄設置粘滯位,任何具有該目錄寫和執行權限的用戶都可以刪除和移動其中的文件。在linux系統的實際應用中,粘滯位一般用於/tmp目錄,以防止普通用戶刪除或移動其他用戶的文件。一個目錄具有粘滯位,則在other的X位會表現為 t,或者T。T和t的區別在於,原來x位上有x權限,有了粘滯位則表現為t,否則,則表現為T。
在Linux系統中比較典型的例子就是"/tmp"、 "/var/tmp"目錄。這兩個目錄作為Linux系統的臨時文件夾,權限為"rwxrwxrwx",即允許任意用戶、任意程序在該目錄中進行創建、刪除、移動文件或目錄等操作。試想一下:若任意一個普通用戶都能夠刪除系統服務運行中使用的臨時文件,將造成什么結果?
粘滯位權限便是針對此種情況設置,當目錄被設置了粘滯位的t權限以后,即便用戶對該目錄有寫入權限,也不能刪除該目錄中其他用戶的文件數據,而是只有該文件的所有者和root用戶才有權將其刪除。設置了粘滯位的t權限之后,正好可以保持這種動態的平衡:允許各用戶在目錄中任意寫入、刪除數據,但是禁止隨意刪除其他用戶的數據。需要注意: 粘滯位權限只能針對⽬錄設置,對於⽂件⽆效。
正常情況下,在Linux系統中,如果對一個目錄具有寫權限,那么就可以在這個目錄下創建刪除文件。現在有這么個需求:如果現在需要創建這樣一個目錄,可以在這個目錄里創建文件,但是其他用戶不能刪除這個文件。這里就要用到Linux這個特殊的權限:粘滯位,也就是t特殊權限!需要注意:粘滯位t權限給其它用戶帶來的安全限制 僅僅在於不能刪除和移動/更名文件 (即粘滯位保護的是文件不被其他用戶rm或mv,即使文件對其他用戶有寫權限,777都不行!),因為它針對的是目錄。
在Linux中有三種特殊權限,分別為:
SetUID = 4:在所有者設置的權限
SetGID = 2:在所屬組設置的權限
粘着位 = 1:在其他人的位置設置的(使用t來表示)
SetUID 、SetGID、t權限的設置,之前已在另一篇文檔中簡單介紹:https://www.cnblogs.com/kevingrace/p/5823003.html,這里重點說下粘滯位的設置,對於授予了粘滯位權限的目錄(目錄權限777)來說:每個用戶都能在這個目錄里面創建文件,但是只能刪除或移動自己創建的文件。
二、粘滯位應用
設置了粘滯位t權限的目錄,使用ls命令查看其屬性時,其他用戶權限位置的"x"將變為"t"。
查看/tmp、 /var/tmp目錄本身的權限,確認存在"t"標記。 [root@ss-server ~]# ll -d /tmp/ drwxrwxrwt. 8 root root 4096 Dec 6 03:46 /tmp/ [root@ss-server ~]# ll -d /var/tmp/ drwxrwxrwt. 3 root root 4096 Dec 3 20:18 /var/tmp/
粘滯位t權限都是針對其他用戶(other)設置,使用chmod命令設置目錄權限時,"o+t"、"o-t"權限模式可分別用於添加、移除粘滯位權限。
設置粘滯位權限方法 # chomd o+t # chomd 1777 刪除粘滯位權限方法 # chomd o-t
設置粘滯位t權限示例:
1)創建粘滯位t權限之前 用root身份創建/opt/kevin目錄,並用參數-m 為它指定權限為777(可讀,可寫,可執行),並且所屬者和所屬組都是root。 [root@ss-server ~]# mkdir -m 777 /opt/kevin/ #-m參數表示mkdir創建時指定目錄權限,省略了創建后再chmod授權("相當於chmod 777 /opt/kevin") [root@ss-server ~]# ll -d /opt/kevin/ drwxrwxrwx 2 root root 4096 Dec 6 16:17 /opt/kevin/ 接着在該目錄下新建兩個文件,權限為默認。因為其他用戶other對/opt/kevin目錄具有w權限,所以可以刪除目錄內容。 [root@ss-server kevin]# touch test1 test2 [root@ss-server kevin]# ll total 0 -rw-r--r-- 1 root root 0 Dec 6 16:19 test1 -rw-r--r-- 1 root root 0 Dec 6 16:19 test2 切換到名為linan的普通用戶,嘗試去刪除剛剛在root下新建的兩個文件test1 和 test2。經過實踐,發現可以刪除。 [root@ss-server ~]# su - linan Last login: Fri Dec 6 16:21:48 CST 2019 on pts/21 [linan@ss-server ~]$ cd /opt/kevin/ [linan@ss-server kevin]$ ll total 0 -rw-r--r-- 1 root root 0 Dec 6 16:33 test1 -rw-r--r-- 1 root root 0 Dec 6 16:33 test2 [linan@ss-server kevin]$ [linan@ss-server kevin]$ ll total 0 -rw-r--r-- 1 root root 0 Dec 6 16:33 test1 -rw-r--r-- 1 root root 0 Dec 6 16:33 test2 [linan@ss-server kevin]$ echo "123" > test1 -bash: test1: Permission denied [linan@ss-server kevin]$ echo "123" >> test1 -bash: test1: Permission denied [linan@ss-server kevin]$ mv test1 test11 [linan@ss-server kevin]$ ll total 0 -rw-r--r-- 1 root root 0 Dec 6 16:33 test11 -rw-r--r-- 1 root root 0 Dec 6 16:33 test2 [linan@ss-server kevin]$ rm -rf test11 [linan@ss-server kevin]$ rm -rf test2 [linan@ss-server kevin]$ ll total 0 [linan@ss-server kevin]$ 需要注意: 1. 這時候其他普通用戶對/opt/kevin目錄下的文件可以進行刪除和更名權限!盡管這些文件的other用戶是r--,因為/opt/kevin目錄在其他用戶這一權限欄是rwx, 即普通用戶對/opt/kevin目錄有可寫權限。目錄可寫權限是指可對目錄下的文件進行刪除、新建和更名操作。 2. 但是此時,普通用戶對/opt/kevin目錄下的文件本身不能進行修改操作,因為/opt/kevin目錄下的文件自身的其他用戶這一權限欄是r--。 如果文件權限對其他普通用戶設置了可寫權限,可就能進行文件修改操作! =========================================================================================================================================== 2)創建粘滯位t權限之后 回到root用戶下,給/opt/kevin目錄加上粘滯位再次查看目錄,發現other的x權限變為t,說明添加粘滯位成功。 [linan@ss-server kevin]$ logout [root@ss-server ~]# cd /opt/kevin/ [root@ss-server kevin]# ll -d drwxrwxrwx 2 root root 4096 Dec 6 16:34 . [root@ss-server kevin]# chmod o+t . #或者直接執行"chmod o+t /opt/kevin" [root@ss-server kevin]# ll -d drwxrwxrwt 2 root root 4096 Dec 6 16:34 . 依舊在該目錄下重新新建兩個文件 test1 和 test2。 [root@ss-server kevin]# touch test1 test2 [root@ss-server kevin]# ll total 0 -rw-r--r-- 1 root root 0 Dec 6 16:37 test1 -rw-r--r-- 1 root root 0 Dec 6 16:37 test2 再次切換到其他普通用戶下,嘗試對在/opt/kevin目錄設置粘滯位權限后創建的文件test1 和 test2進行刪除或更名操作。 結果發現不能刪除或更名文件!! (即使給文件授予777權限也不行) 可以證實粘滯位給其它用戶帶來的安全限制。 [root@ss-server kevin]# su - linan Last login: Fri Dec 6 16:33:29 CST 2019 on pts/22 [linan@ss-server ~]$ cd /opt/kevin/ [linan@ss-server kevin]$ ll total 0 -rw-r--r-- 1 root root 0 Dec 6 16:37 test1 -rw-r--r-- 1 root root 0 Dec 6 16:37 test2 [linan@ss-server kevin]$ rm -rf test1 rm: cannot remove ‘test1’: Operation not permitted [linan@ss-server kevin]$ rm -rf test2 rm: cannot remove ‘test2’: Operation not permitted [linan@ss-server kevin]$ mv test1 test11 mv: cannot move ‘test1’ to ‘test11’: Operation not permitted [linan@ss-server kevin]$ mv test2 test22 mv: cannot move ‘test2’ to ‘test22’: Operation not permitted 即使上面給test1、test1文件授予777權限,那么其他用戶也不能刪除或移動這兩個文件!!! 為了進一步證實文件所有者和root依舊可以刪除。用root對該文件進行刪除操作。結果發現,依舊可以正常刪除。 [linan@ss-server kevin]$ logout [root@ss-server kevin]# ll total 0 -rw-r--r-- 1 root root 0 Dec 6 16:37 test1 -rw-r--r-- 1 root root 0 Dec 6 16:37 test2 [root@ss-server kevin]# rm -rf test1 [root@ss-server kevin]# rm -rf test2 [root@ss-server kevin]# ll -d drwxrwxrwt 2 root root 4096 Dec 6 16:48 . 再來驗證下,當文件對other用戶有可寫權限的時候,粘滯位t權限的保護作用! [root@ss-server kevin]# ll -d drwxrwxrwt 2 root root 4096 Dec 6 17:00 . [root@ss-server kevin]# touch test1 test2 [root@ss-server kevin]# chmod 777 test1 [root@ss-server kevin]# chmod 777 test2 [root@ss-server kevin]# ll total 0 -rwxrwxrwx 1 root root 0 Dec 6 17:00 test1 -rwxrwxrwx 1 root root 0 Dec 6 17:00 test2 [root@ss-server kevin]# su - linan Last login: Fri Dec 6 16:54:47 CST 2019 on pts/20 [linan@ss-server ~]$ cd /opt/kevin/ [linan@ss-server kevin]$ ll -d . drwxrwxrwt 2 root root 4096 Dec 6 17:00 . [linan@ss-server kevin]$ ll total 0 -rwxrwxrwx 1 root root 0 Dec 6 17:00 test1 -rwxrwxrwx 1 root root 0 Dec 6 17:00 test2 [linan@ss-server kevin]$ echo "123" > test1 [linan@ss-server kevin]$ echo "123" >> test2 [linan@ss-server kevin]$ rm -rf test1 rm: cannot remove ‘test1’: Operation not permitted [linan@ss-server kevin]$ mv test2 test22 mv: cannot move ‘test2’ to ‘test22’: Operation not permitted 可以看出,盡管test1、test2文件設置了777權限,但是由於它們所在目錄/opt/kevin設置了粘滯位t權限! 則其他用戶均不能對這兩個文件執行rm和mv操作!!!! 再次回到root賬號下,刪除test1、test2文件 [linan@ss-server kevin]$ logout [root@ss-server kevin]# ll total 8 -rwxrwxrwx 1 root root 4 Dec 6 17:00 test1 -rwxrwxrwx 1 root root 4 Dec 6 17:01 test2 [root@ss-server kevin]# rm -rf test1 [root@ss-server kevin]# rm -rf test2 [root@ss-server kevin]# ll total 0 [root@ss-server kevin]# ll -d . drwxrwxrwt 2 root root 4096 Dec 6 17:01 .
根據以上示例,可以得出結論
當一個目錄被設置為"粘滯位"的t權限后,則該目錄下的文件只能由
1. 超級管理員(root)刪除或移動/更名(rm或mv)
2. 該目錄或文件的所有者刪除或移動/更名(rm或mv)
需要注意
1. 雖然目錄有了粘滯位t權限,other用戶不能對該目錄的文件進行刪除或者移動操作,但是如若other對該文件由w權限,還是可以進行修改文件內容的。
2. 粘滯位只對目錄有效,對文件無效。
刪除粘滯位t權限的設置
[root@ss-server kevin]# chmod o-t /opt/kevin/ [root@ss-server kevin]# ll -d . drwxrwxrwx 2 root root 4096 Dec 6 17:01 .