1. 更改用戶ID和組ID
1.1. 設置用戶ID和設置組ID
與進程相關聯的ID有6個或更多,如下:
?
實際用戶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個權限位,取自<sys/stat.h>
?
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 <unistd.h>
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 <unistd.h>
int seteuid(uid_t uid);
int setegid(gid_t gid);
轉自: http://blog.csdn.net/youkuxiaobin/article/details/6876820
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
