程序控制之更改使用者ID和組ID

2021-04-25 03:15:09 字數 2952 閱讀 5483

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...