linux中對檔案除了有讀(r)、寫(w)、執行(x)權限以外,還有3個特殊的權限,分别是setuid、setgid和stick bit
設定了suid的程式檔案,在使用者執行該程式時,使用者的權限是該程式檔案屬主的權限。例如程式檔案的屬主是root,那麼執行該程式的使用者就将暫時獲得root賬戶的權限。sgid與suid類似,隻是執行程式時獲得的是檔案屬組的權限。
例如我們使用root身份建立一個suid.sh檔案
ls -l setuid.sh檔案,可以看到檔案的屬主和屬組都是root,檔案的權限是-rw-------
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauIDN4cGeXFkT20UNBFUQ342Ruh3UWNHSMFTbvl2S39CX4QzLcBDMvwFMw00LcJDMzZWe39CXt92Yu8GdjFTNuMzcvw1LcpDc0RHaiojIsJye.jpg)
再将/bin下的cat複制到tmp下,将權限使用chmod u+s cat添加suid。這樣/tmp下的cat在執行時便讓執行該指令的使用者以該指令擁有者(root)的權限去執行”。
此時我們以一個普通使用者openstack的身份登入去修改這個檔案,由檔案權限-rw-------可知openstack無法檢視suid.sh這個檔案。
是以,我們可以使用/tmp/cat這個程式去檢視,這樣就可以檢視suid.sh這個檔案了。
而sgid的意思和suid是一樣的,即讓執行檔案的使用者以該檔案所屬組的權限去執行。
這裡特别強調 suid僅可用于二進制程式上,不能用于在shellscript上面,這是因為shell script隻是将很多的二進制執行檔案調用進來執行而已。是以suid的權限部分,還是得看shell script調用過來的程式的設定,而不是shell script本身,另外suid對目錄也是無效的。
sticky (粘貼位)僅對目錄有效。
如果你檢視/tmp目錄的權限時,你會發現/tmp目錄的權限是rwxrwxrwt權限,這就是sticky。
sticky (粘貼位)就是:除非目錄的屬主和root使用者有權限删除它,除此之外其它使用者不能删除和修改這個目錄。
也就是說,在/tmp目錄中,隻有檔案的擁有者和root才能對其進行修改和删除,其他使用者則不行,避免了上面所說的問題産生。用途一般是把一個檔案夾的的權限都打開,然後來共享檔案,象/tmp目錄一樣。
如何設定這些特殊權限呢
suid:chmod u+s 檔案名
sgid: chmod g+s 檔案名
sticky: chmod o+t 檔案名
或者使用八進制方式表示
suid guid sticky
1 1 1
suid的二進制串為:100,換算八進制為: 4
guid的二進制串為:010,換算八進制為: 2
sticky 二進制串:001,換算八進制為:1
于是也可以這樣設:
suid:chmod 4644 檔案名
sgid:chmod 2644 檔案名
sticky:chmod 1644 檔案名
而有時候我們會發現,檔案使用suid或者sgid後檔案後面有時候是S或者s,這裡的差別是:
s:屬主原有執行權限
S:屬主無執行權限
同理T和t的差別同上。
此外檔案特殊權限設定還有檔案的acl:
我們使用root建立getfacl.txt,其中other的權限是r--,再以普通使用者opentack身份登入并嘗試修改此檔案,會發現由于沒有w權限,檔案無法修改,那麼如何才能修改呢?
此時就可以用到我們的acl了。
檢視檔案的acl,使用getfacl +檔案名來檢視,
設定facl使用格式
facl -m u:使用者名:[rwx] 檔案名
為openstack添加rw權限後使用getfacl檢視會發現此時多了一個條acl
再次切換到openstack使用者後,向facl.txt寫入hello world後,發現可以成功寫入。