Linux權限管理

文件的訪問權限

當我們要打開一個文件時,分兩種情況:

  • 通過路徑打開,如/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

  1. 如果進程有效用戶ID是0,即root,則允許訪問
  2. 如果進程的有效用戶ID=文件的所有者ID,即進程擁有此文件,則判斷所有者是否被設置相應的訪問權限位,即若進程對該文件的打開方式是讀,則文件的訪問權限位上,用戶讀位應爲[r],否則拒絕訪問
  3. 若進程的有效組ID或附屬組ID=文件的組ID,則判斷文件的組是否被設置相應的訪問權限位,否則拒絕。
  4. 若文件的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章