Linux下開發-許可權詳解

啊浪的部落格發表於2017-11-05

許可權的一些基本概念可以檢視《鳥哥的私房菜》,本文只講解跟API相關的許可權問題。


基本概念

UID和GID這樣的識別符號會影響檔案的所有權和訪問許可,以及向其它程式傳送訊號的能力。這些屬性統稱為憑證。 


核心會給每個程式關聯兩個和程式ID無關的使用者ID,一個是真實使用者ID,還有一個是有效使用者IDsetuid、setuserID)。真實使用者ID用於標識由誰為正在執行的程式負責,還用於通過kill系統呼叫向其它程式傳送訊號時的許可檢查有效使用者ID用於為新建立的檔案分配所有權、檢查檔案訪問許可。


有效UID和有效GID影響檔案的建立和訪問。在建立檔案的時候,核心將檔案的所有者屬性設定成建立程式的有效UID和有效GID。在訪問檔案的時候,核心使用程式的有效UID和GID來判斷它是否能夠訪問該檔案。真實UID和真實GID標識程式的真實所有者,會影響到傳送訊號的許可權。對於一個沒有超級使用者許可權的程式來說,僅當它的真實或有效UID等於另一個程式的真實UID匹配時它才能向那個程式傳送訊號。 


當一個使用者登入的時候,login程式會把兩對ID設定成密碼資料庫(/etc/passwd檔案,或某些如SunMicrosystems的NIS之類的分散式機制)中指定的UID和GID。當一個程式fork的時候,子程式將從父程式那兒繼承它的憑證。 

有三個系統呼叫可以改變憑證。如果一個程式呼叫exec執行一個suid模式的程式,核心將把程式的有效UID修改成檔案的所有者。同樣,如果該程式安裝為sgid模式,核心則會去修改呼叫程式的有效GID。

一個使用者還可以通過呼叫setuid或setgid來改變它的憑證超級使用者可以通過這些系統呼叫改變真實的和有效的UID以及GID。普通使用者則只能通過這些呼叫來把它們的有效UID或GID改回到真實的數值
 




chmod和fchmod

<sys/types.h>

<sys/stat.h>

int chmod(const char *path, mode_t mode);

int fchmod(int fildes, mode_t mode);


為了改變一個檔案的許可權位,程式有效使用者ID,必須等於檔案的所有者ID,或者該程式必須具有超級使用者許可權。


chmod要求給出的是檔案或目錄所在的位置,而fchmod主要針對的是檔案的檔案描述符。(chmod函式在制定的檔案進行操作,而fchmod函式則對已經開啟的檔案進行操作


Chmod函式的mode常量

mode

說明

S_ISUID

S_ISGID

S_ISVIX

執行時設定使用者ID

執行時設定組ID

儲存正文(粘住位)

S_IRWXU

S_IRUSR

S_IWUSR

S_IXUSR

使用者(所有者)讀、寫和執行

使用者(所有者)

使用者(所有者)

使用者(所有者)執行

S_IRWXG

S_IRGRP

S_IWGRP

S_IXGRP

組讀、寫和執行

組讀

組寫

組執行

S_IRWXO

S_IROTH

S_IWOTH

S_IXOTH

其他讀、寫和執行

其他讀

其他寫

其他執行





S_ISVTX位(粘住位

檔案粘住位:如果一個可執行程式檔案這一位被設定了,那麼在該程式第一次被執行並結束時,其程式正文部分的一個副本仍被儲存在交換區中,這使得下次執行該程式時能較快地將其裝入記憶體區。交換區佔用連續磁碟空間,可將它視為連續檔案,而且一個程式的正文部分在交換區中也是連續存放的。現今較新的UNIX系統大多都配置有虛擬儲存系統以及快速檔案系統,所以不再需要使用這種技術

 

目錄粘住口:如果對一個目錄設定了粘住位,則只有對該目錄具有寫許可權的使用者在滿足下列條件之一的情況下,才能刪除或更名該目錄下的檔案1.擁有該檔案    2. 擁有該目錄   3. 是超級使用者。

示例:目錄/tmp和/var/spool/uucppublic是設定粘住位的典型候選者——任何使用者都可在這兩個目錄中建立檔案。任一使用者(使用者、組和其他)對這兩個目錄的許可權通常都是讀、寫和執行。但使用者不應刪除或更名屬於其他人的檔案


 


umask

#include <sys/stat.h>

mode_t umask(mode_t cmask);

umask的主要作用是在建立檔案設定或者屏蔽掉檔案的一些許可權。在建立一個檔案時要指明該檔案的許可權,open函式的最後一個引數mode並不是要設定的許可權,它需要執行以下操作mode & (~cmask)

 

 

 

 

 

相關文章