Linux下進程的文件訪問權限

對進程校驗文件訪問權限包括兩個部分,一是確定進程的角色(屬於哪個用戶或者組),二是確定對應的角色是否具有該操作的權限。

首先看第一部分。默認情況下,進程的有效角色就是當前執行這個進程的用戶及其所在組。但是,文件具有設置用戶ID位設置組ID位(stat.st_mode的S_ISUID和S_ISGID),用於改變這種默認的行爲,將進程的有效角色設置爲文件所屬的用戶和組。這主要用於解決執行進程的用戶或組不具備修改這個文件的權限,但卻不得不對文件進行修改的情況。比如,/etc/passwd就是用了設置用戶ID位,因爲passwd允許任意用戶修改其密碼,而只有超級用戶才具有對該文件的寫權限,所以在普通用戶執行passwd修改密碼時,必須將設置用戶ID位置位。這裏只要記住,進程的角色只能是執行它的用戶或者是它要操作的文件的用戶。

文件的權限包括用戶、組和其他角色的r(讀)、w(寫)和x(執行)。在根據進程角色檢驗權限時,可以分爲兩種:文件權限校驗和目錄權限校驗。文件權限校驗比較簡單,在open文件時執行了要對文件進行的操作(O_RDONLY、O_WRONLY和O_RDWR),或者是執行一個文件,只要確定是否具有該權限即可,具體規則後文介紹。目錄也是具有權限的,主要限制其所屬的文件的一些操作,包括:

1. 如果要打開一個文件,必須具有文件路徑中所有目錄的執行權限(即,搜索文件需要目錄的執行權限),比如打開文件/home/work/foo,則必須對/,/home和/home/work三個目錄具有執行權限。

2. 要從一個目錄刪除或者添加一個文件,則必須對這個目錄具有寫權限和執行權限,刪除文件時不需要對該文件具有相關權限。

3. 要獲取一個目錄下所有文件,則需要對該目錄具有讀權限。

在打開、創建和刪除文件時,內核會進行訪問權限的校驗,規則如下:

1. 若進程的有效用戶ID是0(即,超級用戶),則允許訪問。

2. 若進程的有效用戶ID等於文件的所有者ID(即,進程擁有該文件),那麼就要檢驗所有者是否具有進行該操作的權限,若具有該權限,則允許,否則拒絕。

3. 若進程的有效組ID是文件的組ID,那麼檢驗該組是否具有進行該操作的權限,若具有該權限,則允許,否則拒絕。

4. 執行其他角色的權限檢驗,如果具有該權限,則允許訪問,否則拒絕。

這種測試方式使用的是進程的有效用戶ID和組ID,通過access可以測試進程的實際用戶ID和組ID是否具有該權限。但是隻能測試,而不能使用實際角色進行某個文件操作。

在進行創建一個文件時,需要確定這個文件的所有權問題。這個文件的用戶就是進程的有效用戶,而組ID,POSIX允許有兩種實現:

1. 新文件的組ID是進程的有效組ID。

2. 新文件的組ID是它所在目錄的組ID。

發佈了119 篇原創文章 · 獲贊 69 · 訪問量 126萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章