1. 更改使用者id和組id
1.1. 設定使用者id和設定組id
實際使用者id
我們實際上是誰
實際組id
有效使用者id
用於檔案訪問許可權檢查
有效組id
附加組id
儲存的設定使用者id
由exec函式儲存
儲存的設定組id
實際使用者id和實際組id標識我們是誰。這兩個欄位在登入時取自口令檔案中的登入項。
有效使用者id、有效組id和附加組id決定了我們的檔案訪問許可權。
儲存的設定使用者id和儲存的設定組id在執行乙個程式時包含了有效使用者id和有效組id的副本。
當執行乙個程式檔案時,程序的有效使用者id通常就是實際使用者id,有效組id就是實際組id。但是如果在檔案模式字(st_mode)中設定乙個特殊標誌,其含義是"當執行此檔案時,將程序的有效使用者id設定為檔案所有者的使用者id(se_uid)"。與此類似,如果在檔案模式字(st_mode)中設定另一位,它使得將執行此檔案的程序的有效組id設定為檔案組所有者id(se_gid)。在檔案模式字中的這兩位被稱為設定使用者id位(set-user-id)和設定使用者組位(set-group-id)。
1.2. 檔案訪問許可權
st_mode值也包含了針對檔案的訪問許可權位。9個許可權位,取自
st_mode遮蔽字
意義
s_irusr
使用者-讀
s_iwusr
使用者-寫
s_ixusr
使用者-執行
s_irgrp
組-讀s_iwgrp
組-寫s_ixgrp
組-執行
s_iroth
其他-讀
s_iwoth
其他-寫
s_ixoth
其他-執行
命令chmod用於修改這9個許可權位。該命令允許用u表示使用者(所有者),用g表示組,用o表示其他。程序每次開啟、建立或刪除乙個檔案時,核心就進行檔案訪問許可權測試,而這種涉及檔案的所有者(st_ui和st_gid)、程序的有效id(有效使用者id和有效組id)以及程序的附加組id(若支援的話)。兩個所有者id是檔案的性質,而兩個有效id和附加組id是程序的性質。核心順序進行的測試是:
1). 如果程序的有效使用者id是0(超級使用者),則允許訪問。
2). 如果程序的有效使用者id等於檔案的所有者id(也就是該程序擁有此檔案),那麼:若所有者適當的訪問許可權位被設定,則允許訪問。
3). 如果程序的有效組id或程序的附加組id之一等於檔案的組id,那麼:若組適當的許可權位被設定,則允許訪問。
4). 如果其他使用者適當的訪問許可權位被設定,則允許訪問。
1.3. setuid和setgid函式
在unix系統中,特權是基於使用者和組id的。當程式需要增加特權,或需要訪問當前並不允許訪問的資源時,我們需要更換自己的使用者id或組id,使得新id具有合適的特權或訪問許可權。與此類似,當程式需要降低其特權或阻止對某些資源的訪問時,也需要更換使用者id或組id,從而使新id不再具有相應的特權或訪問這些資源的能力。
一般而言,在設計應用程式時,我們總是試圖使用最小特權(least privilege)模型。函式setuid設定實際使用者id和有效使用者id;函式setgid設定實際組id和有效組id。
#include
int setuid(uid_t uid);
int setgid(gid_t gid);
關於改變使用者id的規則:
1). 如果程序具有超級使用者特權,則setuid函式將實際使用者id、有效使用者id、以及儲存的設定使用者id設定為uid。
2). 如果程序沒有超級使用者特權,但是uid等於實際使用者id或儲存的設定使用者id,則setuid只將有效使用者id設定為uid。不改變實際使用者id和儲存的設定使用者id。
3). 如果上面兩個條件都不滿足,則將errno設定為eperm,並返回-1。
關於核心所維護的三個使用者id,還要注意以下幾點:
1). 只有超級使用者程序可以更改實際使用者id。實際使用者id實是使用者登入時,由login程式設定的,而且永遠不會改變它。因為login是乙個超級使用者程序,當它呼叫setuid時,會設定所有三個使用者id。
2). 僅僅當對程式檔案設定了設定使用者id位時,exec函式才會設定有效使用者id。任何時候都可以呼叫setuid,將有效使用者id設定為實際使用者id或儲存的設定使用者id。
3). 儲存的設定使用者id是由exec複製有效id而得到的。如果設定了程式檔案的設定使用者id位,則在exec根據檔案的使用者id設定了程序的有效使用者id以後,就將這個副本儲存起來。
注意:getuid和geteuid函式只能獲得實際使用者id和有效使用者id的當前值。改變三個使用者id的不同方法:
id
exec
setuid(uid)
設定使用者id位關閉
設定使用者id位開啟
超級使用者
非特權使用者
實際使用者id不變
不變設為uid
不變有效使用者id不變
程式檔案的使用者id
設為uid
設為uid
儲存的設定使用者id
從有效使用者id複製
從有效使用者id複製
設為uid
不變poix.1包含了兩個函式setuid和setegid。它們類似setuid和setgid,但只更改有效使用者id和有效組id。
#include
int seteuid(uid_t uid);
int setegid(gid_t gid);
更改使用者id
在unix系統中,特權以及訪問控制,是基於使用者id和組id的。當需要增加特權或需要訪問並不允許訪問的資源時,我們需要更換自己的使用者id或組id,使得新id具有合適的特權或訪問許可權。與此類似,當程式需要降低其特權或阻止對某些資源的訪問時,也需要更換使用者id或組id,新id不具有相應特權或訪問這...
使用者和組ID
與程序相關的使用者id有四個 真實的 有效的 被儲存的 檔案系統的使用者id。真實的id是指啟動程序的使用者的id。有效使用者id是指正在執行的程序的使用者id。被儲存的id是程序最初的有效使用者id。有效使用者id最重要,是確認程序憑證期間所檢查的使用者id,真實id和被儲存的id可作為替代品。r...
設定使用者ID和設定組ID
與乙個程序關聯的id有6個或更多,如下圖所示 與每個程序相關聯的使用者id和組id 實際使用者id 實際組id 我們實際是誰 有效使用者id 有效組id 附加組id 用於檔案訪問許可權檢索 儲存的設定使用者id 儲存的設定組id 由exec函式儲存 通常,有效使用者id等於實際使用者id,有效組id...