Linux係統UID和GID介紹
一個文件都有一個所有者, 表示(shì)該文件是誰創建的. 同時, 該文件還(hái)有一個組編號(hào), 表示該文(wén)件所屬的組, 一(yī)般為文(wén)件所有者所屬的(de)組(zǔ).
如果是一個可執行文件, 那麽在(zài)執(zhí)行時, 一般該文(wén)件隻擁有(yǒu)調用該文件的用戶具有的權限. 而setuid, setgid 可以來(lái)改變(biàn)這種設置(zhì).
setuid: 設置(zhì)使文件在執行階段具有文件所有者的(de)權限(xiàn). 典型的文件是 /usr/bin/passwd. 如果一般用(yòng)戶執行(háng)該文件, 則在執行(háng)過程(chéng)中, 該文件(jiàn)可以獲得root權限, 從而可以更改用戶的密碼(mǎ).
setgid: 該權限隻(zhī)對目錄有效. 目錄被設置(zhì)該位後, 任何用戶(hù)在此目錄下創建(jiàn)的文件(jiàn)都具有和該目錄所屬(shǔ)的組相同的組.
sticky bit: 該(gāi)位可以理解為防刪除位(wèi). 一個文件是否可以被某用(yòng)戶刪除, 主要取決於該文(wén)件所(suǒ)屬的組是否對該用戶具有寫權限(xiàn). 如果沒有(yǒu)寫權限(xiàn), 則這個目(mù)錄下(xià)的(de)所有文(wén)件都不能被刪除, 同時也不能添加(jiā)新的文件. 如果希望用戶能夠添加(jiā)文件但(dàn)同時(shí)不能(néng)刪(shān)除文件, 則可以對文(wén)件使用sticky bit位. 設置該位後, 就算用戶對目錄具有寫權限, 也不(bú)能刪除該文件.
下麵(miàn)說一(yī)下如何(hé)操作這些(xiē)標誌:
操作(zuò)這些標誌與(yǔ)操作(zuò)文件(jiàn)權限的命令是一樣的(de), 都是 chmod. 有兩種方法來操作,
1) chmod u+s temp -- 為temp文件加上setuid標誌. (setuid 隻對文件有效)
chmod g+s tempdir -- 為tempdir目錄加(jiā)上setgid標誌 (setgid 隻對目錄有效)
chmod o+t temp -- 為temp文件加(jiā)上sticky標誌(zhì) (sticky隻對文件有效)
2) 采(cǎi)用(yòng)八進製方式. 對一般(bān)文件通過(guò)三組八(bā)進製數字來置標誌, 如(rú) 666, 777, 644等. 如果設置這些特殊標誌, 則在這組數字之外外加一組八(bā)進製數字(zì). 如 4666, 2777等. 這一組八進製數字三(sān)位的意義如(rú)下(xià):
abc
a - setuid位, 如果(guǒ)該位為1, 則表示設(shè)置setuid
b - setgid位, 如果(guǒ)該位為1, 則表(biǎo)示設置setgid
c - sticky位, 如(rú)果該位為1, 則表示設置(zhì)sticky
設(shè)置完這些標(biāo)誌(zhì)後(hòu), 可(kě)以用(yòng) ls -l 來(lái)查看. 如果有(yǒu)這些標誌, 則會(huì)在原來的執行標誌(zhì)位置(zhì)上顯示. 如
rwsrw-r-- 表示有setuid標誌
rwxrwsrw- 表示有setgid標誌
rwxrw-rwt 表示有sticky標(biāo)誌
那麽原來的執(zhí)行(háng)標誌x到哪(nǎ)裏去了呢(ne)? 係統是這樣規定的, 如果本來在該位上有x, 則這(zhè)些(xiē)特(tè)殊標誌顯示為小寫字母 (s, s, t). 否則, 顯(xiǎn)示為大(dà)寫字母(mǔ) (S, S, T)
要刪除一個文件(jiàn),你(nǐ)不一定要有(yǒu)這個文件的寫(xiě)權限,但你(nǐ)一定要有這個文件的上級目錄(lù)的寫權限。也就是說,你即使(shǐ)沒有一個(gè)文(wén)件的寫權限,但(dàn)你有(yǒu)這個文件的上級目錄(lù)的寫權(quán)限(xiàn),你也(yě)可以把這個文件給刪除,而如(rú)果沒有一(yī)個目錄的(de)寫權限,也就(jiù)不(bú)能在這(zhè)個目錄下創建文件。
如(rú)何才(cái)能使一個目錄既可以讓任何(hé)用戶寫入文件,又不讓用(yòng)戶刪(shān)除這個目錄下他人(rén)的(de)文件,sticky就(jiù)是能起(qǐ)到這個作用。stciky一般隻用在目錄上,用在文件上起不到什麽作用。
在一個目錄上設了sticky位後,(如/tmp,權限(xiàn)為1777)所有的用戶都可以在這個目錄(lù)下創建(jiàn)文(wén)件,但隻能刪除(chú)自己創(chuàng)建的文(wén)件,這就對所(suǒ)有用戶能寫的(de)目錄(lù)下(xià)的用戶文(wén)件(jiàn)啟到了保護的(de)作用(yòng)。(我當時/tmp沒有(yǒu)設sticky位(wèi),而在(zài)文件(jiàn)上(shàng)設了,這也就是(shì)為什麽我為什(shí)麽設了sticky位,還能刪除自己創建的文(wén)件的原因了)
--------------------------------------------------------------------------------
suid/sgid
要了解(jiě) suid/sgid, 必需先(xiān)了解 process 及 permission.
我(wǒ)們需知道: 每個 process 都有其 effective uid/gid , 以決定其在傳統 unix filesystem 中獲得的實際 permission .
再, process 是(shì)由 binary 產(chǎn)生的(de), 而 binary 是從 shell / shell script 載入執行(háng).
在正常的情況下, process 的 effective uid/gid 是從 parent 繼(jì)承(chéng), 或(huò)簡(jiǎn)單說(shuō)是與 shell 的 uid/gid 一樣。
shell 的 uid/gid 則是根據 /etc/passwd 的第 3 與第 4 兩位決定.
當我們有了以上的(de)概(gài)念之後, 再來看 suid 對 effective uid/gid 的影響:
若 binary file 帶(dài)有 suid/sgid 的時候, 其 effective id 就(jiù)不是(shì)從 parent 那邊繼承, 而是以 binary file 本身(shēn)的 user/group 為準。
舉例而言, 若一(yī)個 prog1 的 user/group 都是 root , 但沒(méi)設 suid/sgid ,
那當一個uid(500)/gid(500) 的 parent process 執(zhí)行(háng)這個 prog1 的話,
那 effective uid/gid 就是 500 ...
但若(ruò) prog1 設了 suid/sgid 後, 那其 effective uid/gid 就(jiù)是 root !
一旦這個 process effective 是(shì) root 的話(huà), 那它對 file system 的 permission 就不受任何限製了.
因(yīn)此我才在(zài)前麵提到木(mù)馬程式與病毒的例子...
試想一下: 若病毒的(de) user/group 被設為 root, 然後被一般 user 執行時,
suid/sgid 的有與(yǔ)無(wú)將導致什(shí)麽(me)不同(tóng)結果?
好了, 由於 suid/sgid 在係統上有其(qí)存在的必要性(如 /usr/bin/passwd 與 /etc/shadow 為例(lì)),
但(dàn)同時又有極大(dà)的殺傷力(lì), 在應用上要(yào)異常小(xiǎo)心!
因此, bash shell script 在先天上不支(zhī)援(yuán) suid/sgid .
perl 亦(yì)如此, 除非額外再安裝 suid-perl ....
--------------------------------------------------------------------------------
uid gid euid egid
root 0 0
test 500 500
tset.shell 500 500 500 500 登陸後的shell
test.passwd.process 500 500 0 500 fork後
(-r-s--x--x)
test用戶fork binary文件(jiàn)passwd後,test屬於others,擁有(yǒu)該文件(jiàn)的(de)x權(quán)利,因(yīn)為(wéi)設置了(le)suid,所以fork出來的進程(passwd.process)的euid=
文件(passwd)的owner的uid 也就是
passwd.process.euid=passwd.owner.uid=0
euid和guid是(shì)用來(lái)進程passwd.process發生讀,寫,執(zhí)行文(wén)件shadow的時候確認訪問權限(xiàn)的.
-r-------- 1 root root 855 Sep 4 10:58 /etc/shadow ( passwd.uid=0 有r權限 )
文件shadow.owner.uid為0擁有(yǒu)r權(quán)限(xiàn) 因為passwd.process.euid=shadow.ower.uid=0所以由(yóu)test用戶產生的(de)進程passwd.process擁有文件
shadow的(de)r權限(xiàn)
-r-s--x--x 1 root root 19336 Sep 7 2004 /usr/bin/passwd
關鍵詞:Linux
閱讀本文後您有什麽(me)感(gǎn)想? 已有 人給出評價!
- 0
- 0
- 0
- 0
- 0
- 0