1. 程式人生 > >Linux檔案的特殊許可權:SUID,SGID,SBIT

Linux檔案的特殊許可權:SUID,SGID,SBIT


SUID

具有該許可權的檔案的所有者的x標誌會被s標誌取代。
該許可權僅對二進位制可執行檔案有效。
執行該檔案的使用者(當然這個使用者必須具有對該檔案的可執行許可權)將會暫時獲得該檔案所有者的許可權,這種效果僅在執行該檔案的過程中有效。

例項:
當普通使用者使用命令passwd修改自己的密碼時,命令passwd需要修改檔案/etc/shadow,但是隻有root使用者具有對檔案/etc/shadow的可讀可寫許可權,SUID便可以解決這個問題。由於可執行檔案/usr/bin/passwd具有SUID許可權,它的所有者是root,所以當普通使用者執行命令passwd時,將會暫時獲得root的許可權。

SGID
具有該許可權的檔案的所屬使用者組的x標誌會被s標誌取代。
該許可權對二進位制可執行檔案和目錄檔案有效。


當二進位制可執行檔案具有該許可權時:
執行該檔案的使用者(當然這個使用者必須具有對該檔案的可執行許可權)將會暫時獲得該檔案所屬使用者組的支援,這種效果僅在執行該檔案的過程中有效。
例項:
當普通使用者使用命令locate查詢檔案時,命令locate會去讀取檔案/var/lib/mlocate/mlocate.db,該檔案的所有者是root,所有者具有可讀可寫許可權,該檔案的所屬使用者組是slocate,所屬使用者組的許可權是可讀,其它使用者沒有讀寫許可權,SGID便可以解決這個問題。由於可執行檔案/usr/bin/locate具有SGID許可權,它的所屬使用者組是slocate,所以當普通使用者執行命令locate時,將會暫時獲得使用者組slocate的支援。



當目錄檔案具有該許可權時:

首先要知道目錄檔案的可讀、可寫、可執行許可權的作用:

可讀:當對一個目錄檔案具有可讀許可權時,才可以檢視該目錄下的檔名
可寫:當對一個目錄檔案具有可寫許可權時,才可以在該目錄下新建檔案、刪除檔案、重新命名檔案、轉移檔案
可執行:當對一個目錄檔案具有可執行許可權時,才可以進入該目錄,使其成為工作目錄。注意可執行許可權是可讀和可寫的前提,如果沒有可執行許可權,即使具有可讀和可寫許可權,也無法進行可讀和可寫的相關操作。

其次要知道初始使用者組和有效使用者組的概念:

一個使用者可能同時屬於多個使用者組,當該使用者執行除建立新檔案以外的操作時(如讀、寫、執行檔案),將會得到他屬於的所有使用者組的支援。
可以用命令groups檢視當前使用者屬於的所有使用者組,第一個輸出的使用者組為有效使用者組。
初始使用者組:
在檔案/etc/passwd中的GID就是相應使用者的初始使用者組。
有效使用者組:
當建立一個新檔案時,該檔案的所屬使用者組是當前使用者的有效使用者組。

可以用命令“newgrp 新有效使用者組”切換當前使用者的有效使用者組。需要注意的是,命令newgrp是以子程序的方式在另一個shell中實現有效使用者組切換的,當用命令exit回到原來的shell時,有效使用者組也會自動復原。

下面繼續講當目錄檔案具有SGID許可權時:
當用戶進入該目錄時(當然使用者必須具有對該目錄的可執行許可權),使用者的有效使用者組將會暫時變成該目錄的所屬使用者組(注意該目錄的所屬使用者組必須本來就是該使用者屬於的使用者組之一,但不是該使用者的有效使用者組)。此時,使用者在該目錄下建立的新檔案(當然使用者必須具有對該目錄的可寫許可權)的所屬使用者組將和該目錄檔案的所屬使用者組相同。
例項:
假設使用者warren屬於兩個使用者組warren和project,使用者組warren既是使用者warren的初始使用者組,也是使用者warren的有效使用者組。目錄檔案/srv/project的所屬使用者組是project,所屬使用者組的許可權是可讀可寫和SGID。當用戶warren進入目錄/srv/project後,他的有效使用者組就會暫時變成project,則他在該目錄下建立的新檔案的所屬使用者組將會是project。



SBIT
具有該許可權的檔案的其他使用者的x標誌會被t標誌取代。
該許可權僅對目錄檔案有效。
如果其他使用者對一個目錄檔案具有可讀可寫可執行許可權,則一個使用者在該目錄下面建立的檔案可以被另外一個使用者刪除、重新命名或者轉移。為了解決這個問題,可以將該目錄設定SBIT許可權,這樣某個使用者在該目錄下建立的檔案只能被他自己刪除、重新命名或者轉移(當然root使用者的許可權不會受到約束)。
例項:
所有者、所屬使用者組和其他使用者對目錄檔案/tmp都具有可讀可寫可執行的許可權,但是/tmp同時具有SBIT許可權。這樣所有使用者都可以在/tmp下建立自己的檔案,但是一個使用者不能刪除、重新命名或者轉移其他使用者在/tmp下建立的檔案。