1. 更改用戶ID和組ID
1.1. 設(shè)置用戶ID和設(shè)置組ID
與進程相關(guān)聯(lián)的ID有6個或更多,如下:
?
|
實際用戶ID |
我們實際上是誰 |
|
實際組ID |
|
|
有效用戶ID |
用于文件訪問權(quán)限檢查 |
|
有效組ID |
|
|
附加組ID |
|
|
保存的設(shè)置用戶ID |
由exec函數(shù)保存 |
|
保存的設(shè)置組ID |
?
實際用戶ID和實際組ID標(biāo)識我們是誰。這兩個字段在登錄時取自口令文件中的登錄項。
有效用戶ID、有效組ID和附加組ID決定了我們的文件訪問權(quán)限。
保存的設(shè)置用戶ID和保存的設(shè)置組ID在執(zhí)行一個程序時包含了有效用戶ID和有效組ID的副本。
當(dāng)執(zhí)行一個程序文件時,進程的有效用戶ID通常就是實際用戶ID,有效組ID就是實際組ID。但是如果在文件模式字(st_mode)中設(shè)置一個特殊標(biāo)志,其含義是"當(dāng)執(zhí)行此文件時,將進程的有效用戶ID設(shè)置為文件所有者的用戶ID(se_uid)"。與此類似,如果在文件模式字(st_mode)中設(shè)置另一位,它使得將執(zhí)行此文件的進程的有效組ID設(shè)置為文件組所有者ID(se_gid)。在文件模式字中的這兩位被稱為設(shè)置用戶ID位(set-user-ID)和設(shè)置用戶組位(set-group-ID)。
1.2. 文件訪問權(quán)限
st_mode值也包含了針對文件的訪問權(quán)限位。9個權(quán)限位,取自<sys/stat.h>
?
|
st_mode屏蔽字 |
意義 |
|
S_IRUSR |
用戶-讀 |
|
S_IWUSR |
用戶-寫 |
|
S_IXUSR |
用戶-執(zhí)行 |
|
S_IRGRP |
組-讀 |
|
S_IWGRP |
組-寫 |
|
S_IXGRP |
組-執(zhí)行 |
|
S_IROTH |
其他-讀 |
|
S_IWOTH |
其他-寫 |
|
S_IXOTH |
其他-執(zhí)行 |
?
命令chmod用于修改這9個權(quán)限位。該命令允許用u表示用戶(所有者),用g表示組,用o表示其他。進程每次打開、創(chuàng)建或刪除一個文件時,內(nèi)核就進行文件訪問權(quán)限測試,而這種涉及文件的所有者(st_ui和st_gid)、進程的有效ID(有效用戶ID和有效組ID)以及進程的附加組ID(若支持的話)。兩個所有者ID是文件的性質(zhì),而兩個有效ID和附加組ID是進程的性質(zhì)。內(nèi)核順序進行的測試是:
1). 如果進程的有效用戶ID是0(超級用戶),則允許訪問。
2). 如果進程的有效用戶ID等于文件的所有者ID(也就是該進程擁有此文件),那么:若所有者適當(dāng)?shù)脑L問權(quán)限位被設(shè)置,則允許訪問。
3). 如果進程的有效組ID或進程的附加組ID之一等于文件的組ID,那么:若組適當(dāng)?shù)臋?quán)限位被設(shè)置,則允許訪問。
4). 如果其他用戶適當(dāng)?shù)脑L問權(quán)限位被設(shè)置,則允許訪問。
?
1.3. setuid和setgid函數(shù)
在UNIX系統(tǒng)中,特權(quán)是基于用戶和組ID的。當(dāng)程序需要增加特權(quán),或需要訪問當(dāng)前并不允許訪問的資源時,我們需要更換自己的用戶ID或組ID,使得新ID具有合適的特權(quán)或訪問權(quán)限。與此類似,當(dāng)程序需要降低其特權(quán)或阻止對某些資源的訪問時,也需要更換用戶ID或組ID,從而使新ID不再具有相應(yīng)的特權(quán)或訪問這些資源的能力。
一般而言,在設(shè)計應(yīng)用程序時,我們總是試圖使用最小特權(quán)(least privilege)模型。函數(shù)setuid設(shè)置實際用戶ID和有效用戶ID;函數(shù)setgid設(shè)置實際組ID和有效組ID。
#include <unistd.h>
int setuid(uid_t uid);
int setgid(gid_t gid);
?
關(guān)于改變用戶ID的規(guī)則:
1). 如果進程具有超級用戶特權(quán),則setuid函數(shù)將實際用戶ID、有效用戶ID、以及保存的設(shè)置用戶ID設(shè)置為uid。
2). 如果進程沒有超級用戶特權(quán),但是uid等于實際用戶ID或保存的設(shè)置用戶ID,則setuid只將有效用戶ID設(shè)置為uid。不改變實際用戶ID和保存的設(shè)置用戶ID。
3). 如果上面兩個條件都不滿足,則將errno設(shè)置為EPERM,并返回-1。
?
關(guān)于內(nèi)核所維護的三個用戶ID,還要注意以下幾點:
1). 只有超級用戶進程可以更改實際用戶ID。實際用戶ID實是用戶登錄時,由login程序設(shè)置的,而且永遠不會改變它。因為login是一個超級用戶進程,當(dāng)它調(diào)用setuid時,會設(shè)置所有三個用戶ID。
2). 僅僅當(dāng)對程序文件設(shè)置了設(shè)置用戶ID位時,exec函數(shù)才會設(shè)置有效用戶ID。任何時候都可以調(diào)用setuid,將有效用戶ID設(shè)置為實際用戶ID或保存的設(shè)置用戶ID。
3). 保存的設(shè)置用戶ID是由exec復(fù)制有效ID而得到的。如果設(shè)置了程序文件的設(shè)置用戶ID位,則在exec根據(jù)文件的用戶ID設(shè)置了進程的有效用戶ID以后,就將這個副本保存起來。
注意:getuid和geteuid函數(shù)只能獲得實際用戶ID和有效用戶ID的當(dāng)前值。改變?nèi)齻€用戶ID的不同方法:
?
|
ID |
exec |
setuid(uid) |
||
|
設(shè)置用戶ID位關(guān)閉 |
設(shè)置用戶ID位打開 |
超級用戶 |
非特權(quán)用戶 |
|
|
實際用戶ID |
不變 |
不變 |
設(shè)為uid |
不變 |
|
有效用戶ID |
不變 |
程序文件的用戶ID |
設(shè)為uid |
設(shè)為uid |
|
保存的設(shè)置用戶ID |
從有效用戶ID復(fù)制 |
從有效用戶ID復(fù)制 |
設(shè)為uid |
不變 |
?
?
POIX.1包含了兩個函數(shù)setuid和setegid。它們類似setuid和setgid,但只更改有效用戶ID和有效組ID。
#include <unistd.h>
int seteuid(uid_t uid);
int setegid(gid_t gid);
轉(zhuǎn)自: http://blog.csdn.net/youkuxiaobin/article/details/6876820
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

