最近在學習《unix 高階環境程式設計》這邊書,之前對unix中的檔案訪問還有和檔案訪問相關的設定使用者id(set_user_id)位以及設定組id(set-group-id)位一直沒有弄清楚,今天跟他人討論乙個問題,終於有些明白了,記錄以供溫故。
首先說說檔案的許可權控制位,每乙個檔案都有檔案模式字st_mode,ls -l乙個檔案前面10位就是檔案的型別和許可權說明了。具體可分為使用者讀寫可執行,組讀寫執行,其他讀寫執行位。當乙個程序要訪問某個檔案的時候,會以程序的有效使用者id來進行許可權檢測,看改使用者id具體屬於檔案的哪個部分,是檔案使用者本身,還是屬於使用者組還是屬於其他使用者的。與每個程序相關聯的使用者id和組id包括實際使用者(實際上是誰),id實際組id;有效使用者id(用於檔案訪問許可權檢查),有效組id,附加組id(有時候乙個使用者可能屬於多個組);儲存的設定使用者id(由exec函式儲存),儲存的設定組id。所有者id是檔案的性質,而有效id和附加組id是程序的性質。一般核心進行的檢測是:
(1)若程序的有效使用者id是0(超級使用者),則允許訪問。
(2)若程序的有效使用者id等於檔案的所有者id(即程序擁有此檔案),那麼當所有者適當的訪問許可權位被設定,則允許訪問,否則拒絕訪問。適當的訪問許可權位指的是,若程序為讀而開啟該檔案,則使用者讀位應為1,若程序為寫而開啟該檔案,則使用者的寫位應為1。。。
(3)若程序的有效使用者id或程序的附加組id之一等於檔案的組id,那麼:若組的適當的訪問許可權位被設定,則允許訪問,否則拒絕訪問。
(4)若其他使用者適當的訪問許可權位被設定,則允許訪問,否則拒絕訪問。
按順序執行這四步,若程序擁有此檔案(第2步),則按使用者訪問許可權批准或拒絕該程序對檔案的訪問,不檢視組訪問許可權。類似地,若程序並不擁有該檔案,但程序屬於某乙個適當的組,則按組訪問許可權批准或者拒絕該程序對檔案的訪問,不檢視其他使用者的訪問許可權。當程序既不擁有該檔案,程序也不屬於某個組,就只能檢視其他使用者的訪問許可權了。
當執行乙個程式檔案時,程序的有效使用者id通常就是實際使用者id,有效組id通常就是實際組id。但是當檔案設定了使用者id位後,當執行此檔案時,將程序的有效使用者id設定為檔案所有者的使用者id(st_uid),設定組id類似。下面將以乙個例子來具體說明,其中access函式是按照實際使用者id和實際組id進行訪問許可權測試的,open函式開啟乙個檔案事,核心以進城的有效使用者id和有效組id為基礎進行許可權測試。
access函式例項:
c**
#include "apue.h"
#include
int main(int argc, char *argv)
編譯生成可執行檔案a.out並執行:
chardliu@ubuntu:~/apue.2e/file$ cc access.c
chardliu@ubuntu:~/apue.2e/file$ ls -l a.out
-rwxrwxr-x 1 chardliu chardliu 7839 jun 26 21:01 a.out
chardliu@ubuntu:~/apue.2e/file$ ./a.out a.out
read access ok
open for reading ok
root@ubuntu:/home/chardliu/apue.2e/file# ll /etc/shadow
-r-------- 1 root shadow 1235 apr 11 18:50 /etc/shadow
chardliu@ubuntu:~/apue.2e/file$ ./a.out /etc/shadow
access error for /etc/shadow: permission denied
open error for /etc/shadow: permission denied
此時之所以access和open都出錯,是因為程序的實際使用者id和有效使用者id都為chardliu,而shadow檔案的使用者所有者是root,所以當程序以chardliu身份來對shadow檔案進行訪問許可權檢測時,是根據shadow的其他使用者讀寫執行位來檢測的,由上可知,shadow檔案只有所有者root本身可讀,沒有其他任何許可權。
按理,那麼當給shadow檔案增加其他使用者讀許可權後access和open都應該成功,測試一下果真如此:
chardliu@ubuntu:~/apue.2e/file$ su //以root使用者對shadow檔案進行許可權設定
password:
root@ubuntu:/home/chardliu/apue.2e/file# chmod o+r /etc/shadow //給shadow增加其他使用者可讀許可權
root@ubuntu:/home/chardliu/apue.2e/file# exit
exit
chardliu@ubuntu:~/apue.2e/file$ ll /etc/shadow
-r-----r-- 1 root shadow 1235 apr 11 18:50 /etc/shadow
chardliu@ubuntu:~/apue.2e/file$ ./a.out /etc/shadow //再次訪問shadow檔案,ok
read access ok
open for reading ok
下面說明一下設定使用者id的作用。
在此之前還是將shadow的檔案訪問控制位置為原來的,即清除其他使用者可讀許可權,同時將a.out可執行檔案的所有者改為root,並且設定其使用者id位:
chardliu@ubuntu:~/apue.2e/file$ su
password:
root@ubuntu:/home/chardliu/apue.2e/file# chmod o-r /etc/shadow
root@ubuntu:/home/chardliu/apue.2e/file# ll /etc/shadow
-r-------- 1 root shadow 1235 apr 11 18:50 /etc/shadow
root@ubuntu:/home/chardliu/apue.2e/file# chown root a.out
root@ubuntu:/home/chardliu/apue.2e/file# chmod u+s a.out
root@ubuntu:/home/chardliu/apue.2e/file# ll a.out
-rwsrwxr-x 1 root chardliu 7839 jun 26 21:01 a.out*
退出超級使用者,以正常使用者執行:
root@ubuntu:/home/chardliu/apue.2e/file# exit
exit
chardliu@ubuntu:~/apue.2e/file$ ./a.out /etc/shadow
access error for /etc/shadow: permission denied
open for reading ok
會發現執行結果access失敗,而開啟檔案成功。access是以實際使用者idchardliu對shadow進行訪問許可權檢測的,發現其他使用者讀沒有設定許可權,所以失敗;a.out設定了使用者id,所以當程序執行a.out時,程序的有效使用者id由chardliu設定為了a.out所有者的使用者id root了,所以可以成功開啟檔案,open是以程序的有效使用者id進行訪問許可權檢測的。
通過這個過程,相信會對檔案的訪問許可權控制有乙個比較清晰的理解。
from:
linux檔案訪問許可權
所有檔案型別都有訪問許可權。對於st mode值也包含了對檔案的訪問許可權位。每個檔案有9個訪問許可權,可將它們分為3類。st mode 遮蔽 含義 s irusr 使用者讀 s iwusr 使用者寫 s ixusr 使用者執行 s irgrp組讀 s iwgrp組寫 s ixgrp 組執行 s i...
Linux 檔案訪問許可權含義與chmod
rw r r 對於檔案的訪問許可權。第乙個字元指明檔案型別。在不同型別之間,開頭的 說明是乙個普通檔案,d 表明是一 個目錄。其後三個字元是檔案所有者的訪問許可權,再其後的三個字元是檔案所屬組中成員的訪問許可權,最後三個字元是其他所有人的訪問許可權。採用八進位制chmod檔案模式 octal bin...
linux 關於linux檔案許可權
上圖中可以看到,我們在乙個空的目錄about permission中建立了乙個空的目錄emptydir和乙個空的檔案emptyfile。drwxr xr x 這個字段描述的是檔案和目錄許可權的編碼。該字段的地乙個字元代表了該物件的型別 檔案d 目錄l鏈結c 字元型裝置 b塊裝置 n網路裝置 該字段的...