Linux下文件權限(一)用戶ID和用戶組ID


最近在讀《unix環境高級編程》,看到文件權限這里比較糊塗,主要設計多個用戶ID和用戶組ID,包括下面兩個:

(1)實際用戶ID和實際用戶組ID:這一部分表示我們究竟是誰。這兩個字段在登錄時取自口令文件中的登錄項。通常,在一個登錄會話期間這些值並不改變,但是超級用戶進程有辦法改變他們。簡單來說,實際用戶ID是登錄用戶的uid,實際用戶組Id是登錄用戶的gid。

(2)有效用戶ID和有效用戶組ID:這一部分用於文件的權限檢查。一般情況下,有效用戶ID等於實際用戶ID,有效用戶組ID等於實際用戶組ID。當設置用戶ID位(SUID)被設置時,有效用戶ID等於文件所有者的uid而不是實際用戶組ID;當設置用戶組ID(SGID)位,有效用戶組ID等於文件所有者的gid,而不是實際用戶組ID。

 

下面在linux下測試上述結論:

在root超級用戶下新建test.c文件,並編譯生成test程序

#include "apue.h"

int main()
{
     printf("uid=%d,gid=%d,euid=%d,egid=%d\n",getuid(),getgid(),geteuid(),getegid());
     exit(0);
}

  查看文件屬性

通過id命令查看當前登錄用戶為root。程序進程並未設置SUID和SGID,執行程序可以看出,實際用戶ID,實際用戶組ID都是0,有效用戶ID,有效用戶組ID也是0(等於實際用戶ID,實際用戶組ID)

下面修改test的用戶和用戶組,再看結果

結果沒有發生變化,仍然是有效用戶ID等於實際用戶ID,有效用戶組ID等於實際用戶組ID(這是因為設置用戶ID位SUID,設置用戶ID位SGID沒有被設置)

 

下面給test程序設置SUID

發現設置SUID位之后,test進程有效用戶ID(1000)不等於實際用戶ID(0)了,而是等於文件所有者的uid(yangang的uid為1000)

如果設置程序的SGID ,會出現類似的結果:

SUID

這樣程序就只能訪問只有yangang才能訪問的資源

若文件的所有者是超級用戶,而且設置了該文件的設置用戶ID位,那么當該程序文件的一個進程執行時,該進程擁有超級用戶權限。不管執行此文件的進程的實際用戶是什么。例如passwd 命令允許任一用戶改變其口令,該程序是一個設置用戶ID的程序,因此該程序能將用戶新口令寫入口令文件中(只有超級用戶才具有對該文件的寫權限)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM