Linux文件特殊權限 SUID/SGID/Sticky Bit

轉自:http://os.51cto.com/art/200801/64465.htm

前面一直提到文件的重要權限,就是rwx這3個讀、寫、執行的權限。但是,怎麼 /tmp權限有些奇怪?還有, /usr/bin/passwd也有些奇怪,怎麼回事呢?

[root@linux ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt 5 root root 4096 Jul 20 10:00 /tmp
-r-s--x--x 1 root root 18840 Mar 7 18:06 /usr/bin/passwd

不是隻有rwx嗎?爲什麼還有其他的特殊權限呢?不要擔心,我們這裏先不談這兩個權限,只是先介紹一下而已。因爲必須要有賬號的ID概念,以及程序的進程(process)概念後,才能夠進一步瞭解這些特殊權限所表示的意義。

一、 Set UID

創建s權限,是爲了讓一般用戶在執行某些程序的時候,能夠暫時具有該程序擁有 者的權限。舉例來說,我們知道,賬號與密碼的存放文件其實是 /etc/passwd與 /etc/shadow。而 /etc/shadow文件的權限是“-r--------”。它的擁有者是root。在這個權限中,僅有root可以“強制”存儲,其他人是連看都不行 的。 

但是,偏偏筆者使用dmtsai這個一般身份用戶去更新自己的密碼時,使用的就是 /usr/bin/passwd程序,卻可以更新自己的密碼。也就是說,dmtsai這個一般身份用戶可以存取 /etc/shadow密碼文件。這怎麼可能?明明 /etc/shadow就是沒有dmtsai可存取的權限。這就是因爲有s權限的幫助。當s權限在user的x時,也就是類似 -r-s--x--x,稱爲Set UID,簡稱爲SUID,這個UID表示User的ID,而User表示這個程序(/usr/bin/passwd)的擁有者(root)。那麼,我們就 可以知道,當dmtsai用戶執行 /usr/bin/passwd時,它就會“暫時”得到文件擁有者root的權限。

SUID僅可用在“二進制文件(binary file) ”,SUID因爲是程序在執行過程中擁有文件擁有者的權限,因此,它僅可用於二進制文件,不能用在批處理文件(shell腳本)上 。這是因爲 shell腳本只是將很多二進制執行文件調進來執行而已。所以SUID的權限部分,還是要看shell腳本調用進來的程序設置,而不是shell腳本本 身。當然,SUID對目錄是無效的。 這點要特別注意。

二、Set GID

進一步而言,如果s的權限是在用戶組,那麼就是Set GID,簡稱爲SGID。SGID可以用在兩個方面。

文件:如果SGID設置在二進制文件上,則不論用戶是誰,在執行該程序的時候,它的有效用戶組(effective group)將會變成該程序的所有者的用戶組(group id)。

目錄:如果SGID是設置在A目錄上,則在該A目錄內所建立的文件或目錄的用戶組,將會是此A目錄的用戶組。

一般來說,SGID多用在特定的多人團隊的項目開發上,在系統中用得較少。

三、Sticky Bit

這個Sticky Bit當前只針對目錄有效,對文件沒有效果。 SBit對目錄的作用是:“在具有SBit的目錄下,用戶若在該目錄下具有w及x權限,則當用戶在該目錄下建 立文件或目錄時,只有文件擁有者與root纔有權力刪除”。 換句話說:當甲用戶在A目錄下擁有w權限,這表示甲用戶 對該目錄內任何人建立的目錄或文件均可進行“刪除/重命名/移動”等操作。不過,如果將A目錄加上了Sticky bit的權限,則甲只能夠針對自己建立的文件或目錄進行刪除/重命名/移動等操作。

舉例來說,/tmp本身的權限是“drwxrwxrwt”,在這樣的權限內容下,任何人都可以在 /tmp內新增、修改文件,但僅有該文件/目錄的建立者與root能夠刪除自己的目錄或文件。這個特性也很重要。 可以這樣做個簡單測試:

1. 以root登入系統,並且進入 /tmp中。

2. touch test,並且更改test權限成爲777。

3. 以一般用戶登入,並進入 /tmp。

4. 嘗試刪除test文件。

更多關於SUID/SGID/Sticky Bit的介紹,我們會在第11章中再次提及,當前,先有簡單的概念即可。

四、SUID/SGID/SBIT權限設置

前面介紹過SUID與SGID的功能,那麼,如何打開文件使其成爲具有SUID與 SGID的權限呢?這就需要使用數字更改權限了。現在應該知道,使用數字更改權限的方式爲“3個數字”的組合,那麼,如果在這3個數字之前再加上一個數 字,最前面的數字就表示這幾個屬性了(注:通常我們使用chmod xyz filename的方式來設置filename的屬性時,則是假設沒有SUID、SGID及Sticky bit)。

4爲SUID

2爲SGID

1爲Sticky bit

假設要將一個文件屬性改爲“-rwsr-xr-x”,由於s在用戶權限中,所以是 SUID,因此,在原先的755之前還要加上4,也就是使用“chmod 4755 filename”來設置。此外,還有大S與大T的產生。參考下面的範例(注意:下面的範例只是練習而已,所以筆者使用同一個文件來設置,必須知 道,SUID不是用在目錄上,SBIT不是用在文件上)。

[root@linux ~]# cd /tmp
[root@linux tmp]# touch test
[root@linux tmp]# chmod 4755 test; ls -l test
-rwsr-xr-x 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 6755 test; ls -l test
-rwsr-sr-x 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 1755 test; ls -l test
-rwxr-xr-t 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 7666 test; ls -l test
-rwSrwSrwT 1 root root 0 Jul 20 11:27 test

# 這個例子要特別小心。怎麼會出現大寫的S與T呢?不都是小寫的嗎?

# 因爲s與t都是取代x參數的,但是,我們是使用

# 7666。也就是說,user、group以及others都沒有x這個可執行的標誌

# (因爲666)。所以,S、T表示“空的”。

# SUID是表示“該文件在執行時,具有文件擁有者的權限”,但文件

# 擁有者都無法執行了,哪裏來的權限給其他人使用呢?當然就是空的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章