文件的訪問權限
當我們要打開一個文件時,分兩種情況:
- 通過路徑打開,如/usr/include/stdio.h,此時需要對路徑上的目錄 /、/usr、/include 都具有執行權限,同時需要對stdio.h具有相應權限,這取決於我們如何打開它(只讀、讀寫)。
- 在當前目錄打開,這需要對當前目錄具有執行權限,對要打開的文件具有相應權限。
目錄是文件的一種:
- 目錄的讀權限[r]用於讀取目錄結構列表
- 進入/打開目錄需要執行權限[x] ,[x]表示可以對該目錄進行搜索
- 在目錄中創建、刪除、重命名、移動文件或目錄,需要對該目錄有寫和執行權限[wx]。刪除目錄中的文件,對文件本身不需要具有寫和執行權限。
訪問權限位
ls -al 或 ll
文件的三種身份:owner group others
-rwsr–r-- , 一共10個字符:
- 第1項代表文件類型,如文件是[-],目錄是[d],linkfile是[l]
- 第2-4項3爲owner權限,可讀[r] ,可寫[w],可執行[x]
- 第5-7項爲group權限
- 最後三項爲其他非本組用戶others權限
- root具有全部權限。
對上述四項,可以用八進制數字進行表示,如 rwx = 111(二進制) = 7(八進制),-rwxrwxr-x = 1775
用戶ID和組ID
與一個進程關聯的ID有6個或更多
查看用戶id /etc/passwd
切換用戶 su id/name su操作是在當前的shell中重新啓動了一個shell,並切換了用戶權限
退出 exit
訪問權限判斷
進程打開、刪除、創建文件時,內核對文件進行權限判斷,根據文件的所有者(st_uid、gid),進程的有效用戶ID、有效組ID、附屬組ID
- 如果進程有效用戶ID是0,即root,則允許訪問
- 如果進程的有效用戶ID=文件的所有者ID,即進程擁有此文件,則判斷所有者是否被設置相應的訪問權限位,即若進程對該文件的打開方式是讀,則文件的訪問權限位上,用戶讀位應爲[r],否則拒絕訪問
- 若進程的有效組ID或附屬組ID=文件的組ID,則判斷文件的組是否被設置相應的訪問權限位,否則拒絕。
- 若文件的others設置了相應的訪問權限位,則允許訪問,否則拒絕。
用戶權限改變
-
setuid(uid)
若當前用戶是root,則setuid函數將real id、effective id和saved id改爲uid;
若uid=real id或saved id則將effective id改爲uid;
否則,返回-1 。 -
seteuid(uid), 設置effective id,非root用戶可以將其effective id 改爲real id 或 saved id
-
getuid(), 獲取文件的real id;
-
geteuid(), 獲取e id;
或
chown root:root backdoor //改owner,將backdoor的用戶:用戶組改爲root:root
chmod 775 backdoor //改權限爲 -rwsrwxr-x
例:以root權限打開一個新的shell,替換當前shell
#include <stdio.h>
#include <unistd.h>
int main(){
printf("real id is: %d; effective id is: %d.\n",getuid(),geteuid());
setuid(0);
execlp("/bin/bash","/bin/bash",NULL);
return 0;
}
參考:
《UNIX環境高級編程》
https://zhuanlan.zhihu.com/p/61870331