對《unix高級環境編程》書裏面提到的關於用戶ID的內容進行了一下總結,同時在文章後面畫了一個圖,便於自己記憶。
1、與每個進程相關聯的用戶ID和組ID
實際用戶ID 實際組ID |
我們實際上是誰 |
有效用戶ID 有效組ID 附加組ID |
用於文件訪問權限檢查 |
保存的設置用戶ID 保存的設置組ID |
由exec函數保存 |
(1)實際用戶ID和實際組ID標識我們究竟是誰。這兩個字段在登錄時取自口令文件中的登錄項。
(2)有效用戶ID,有效組ID以及附加組ID決定了我們的文件訪問權限。
(3)保存的設置用戶ID和保存的設置組ID在執行一個程序時包含了有效用戶ID和有效組ID的副本。
2、 口令文件/etc/passwd的pw_uid和pw_gid字段,這兩個值是系統管理員在確定一個用戶的登錄名的同時確定的,用戶不能更改其用戶ID,通過每個用戶有一個唯一的用戶ID。組ID的設立允許同一個組內的成員之間共享資源。
root用戶的實際用戶ID和實際組ID是0,非系統用戶的ID從500開始
3、附加組ID:附加組ID是指一個用戶屬於的另外的組
4、文件訪問權限:進程每次打開、創建或刪除一個文件時,內核就進行文件訪問權限測試,而這種測試可能涉及文件的所有者(st_uid和st_gid)、進程的有效ID(有效用戶ID和有效組ID)以及進程的附加組ID(若支持的話)。兩個所有者ID是文件的性質,而兩個有效ID和附加組ID則是進程的性質。內核進行測試的步驟如下:依次查看
進程的有效用戶ID是0(超級用戶)->進程的有效用戶ID等於文件的所有者ID(進程擁有此文件)->進程的有效組ID或進程的附加組ID之一等於文件的組ID->其他用戶適當的訪問權限位被設置
新文件的用戶ID設置爲進程的有效用戶ID。組ID分兩種:
(1) 新文件的組ID可以是進程的有效組ID
(2) 新文件的組ID可以是它所在的目錄的組ID
5、獲取口令文件信息的函數:
struct passwd *getpwuid(uid)和函數structpasswd *getpwnam(const char*name)分別通過uid和用戶登錄名獲取口令文件的信息。其中,在鍵入登錄名時,getpwnam函數由login程序使用。
6、 更改用戶ID和組ID
當執行一個程序文件時,進程的有效用戶ID通常就是實際用戶ID,有效組ID通常是實際組ID。但是可以在文件模式字(st_mode)中設置一個特殊標誌,其含義是“當執行此文件時,將進程的的有效用戶ID設置爲文件所有者的用戶ID(st_uid)”。(passwd命令)可以調用函數setuid(uid)進行修改用戶ID
注意:如果一個進程正以特殊的權限(設置用戶ID或設置組ID)運行,它又想生出另一個進程執行另一個程序,則它應該直接使用fork和exec,而且在fork之後,exec之前要改回到普通權限。設置用戶ID或者設置組ID程序決不應調用system函數。