Linux系统UID和GID介绍
一个文【yī gè wén】件都有【jiàn dōu yǒu】一个所【yī gè suǒ】有者【yǒu zhě】🦐, 表示该文件是🦒谁创建【shuí chuàng jiàn】🎹的💀. 同时【tóng shí】, 该文件还有一个组编❄号🗨, 表示该文件所属的【suǒ shǔ de】💀组, 一般为文件所有者【yǒu zhě】🦐所属的【suǒ shǔ de】💀组.
如果是一个可【yī gè kě】执行文件, 那么在【nà me zài】🎖执行时, 一般该🔭文件只拥有调👑用该文🛣件的用🗓户具有【hù jù yǒu】🕉的权限【de quán xiàn】. 而setuid, setgid 可以来【kě yǐ lái】改变这【gǎi biàn zhè】种设置.
setuid: 设置使文件🏈在执行阶【jiē】🆖段具有文件🏈所有者【suǒ yǒu zhě】的权限【quán xiàn】🗜. 典型的文件🏈是 /usr/bin/passwd. 如果一般用户【bān yòng hù】执行该🚳文件🏈, 则在执【zé zài zhí】行过程中, 该文件👋可以获😢得【dé】💊root权限【quán xiàn】🗜, 从而可以更改【yǐ gèng gǎi】用户的🐜密码【mì mǎ】.
setgid: 该权限【gāi quán xiàn】👁只对目【zhī duì mù】录有效🌿. 目录被设置该【shè zhì gāi】位后【wèi hòu】, 任何用【rèn hé yòng】户在此🤛目录下创建的【chuàng jiàn de】文件都💏具有和该目录所属的组💥相同的组💥.
sticky bit: 该位可以理解♿为防删【wéi fáng shān】除位. 一个文【yī gè wén】件【jiàn】🛍是否可以被某用户🏾删除, 主要取【zhǔ yào qǔ】🕶决于该文件【jiàn】🛍所属的组是否【zǔ shì fǒu】对该用户具有【hù jù yǒu】写权【xiě quán】💗限【xiàn】📜. 如果没🛂有写权【xiě quán】💗限【xiàn】📜, 则这个目录下🎸的所有🐽文件【jiàn】🛍都不能被删除, 同时也【tóng shí yě】不能😹添加新的文件【jiàn】🛍. 如果希望用户能够添加文件【jiàn】🛍但同时⛎不能删除文件【chú wén jiàn】🛍, 则可以🌒对文件【jiàn】🛍使用【shǐ yòng】🚊sticky bit位. 设置该【shè zhì gāi】位后【wèi hòu】, 就算用🌘户对目🌍录具有【lù jù yǒu】写权【xiě quán】💗限【xiàn】📜, 也不能【yě bú néng】😹删除该【shān chú gāi】文件【jiàn】🛍.
下面说一下如何操作这些标志:
操作这【cāo zuò zhè】些标【xiē biāo】🚢志【zhì】与操作文件权限的【quán xiàn de】命令是【mìng lìng shì】一样的【yī yàng de】, 都是🍡 chmod. 有两种🎇方法来【fāng fǎ lái】操作,
1) chmod u+s temp -- 为temp文件加🍜上【shàng】setuid标志【biāo zhì】🛏. (setuid 只对文【zhī duì wén】🗄件有效【jiàn yǒu xiào】)
chmod g+s tempdir -- 为tempdir目录加上【shàng】setgid标志【biāo zhì】🛏 (setgid 只对目【zhī duì mù】录有效🍇)
chmod o+t temp -- 为temp文件加🍜上【shàng】sticky标志【biāo zhì】🛏 (sticky只对文【zhī duì wén】🗄件有效【jiàn yǒu xiào】)
2) 采用八进制【bā jìn zhì】🛍方式. 对一般🏨文件通🐥过三组八进制【bā jìn zhì】🛍数字来置标志【biāo zhì】🛏, 如 666, 777, 644等. 如果设🏁置这些💀特殊标【tè shū biāo】志【zhì】🛏, 则在这组数字📌之外外【zhī wài wài】加一组【jiā yī zǔ】八进制【bā jìn zhì】🛍数字. 如 4666, 2777等. 这一组八进制【bā jìn zhì】🛍数字三位【wèi】的意🍵义如下【yì rú xià】:
abc
a - setuid位【wèi】🚻, 如果该【rú guǒ gāi】🍠位为【wèi wéi】🍻1, 则表示【zé biǎo shì】🐊设置【shè zhì】🍾setuid
b - setgid位【wèi】🚻, 如果该【rú guǒ gāi】🍠位为【wèi wéi】🍻1, 则表示【zé biǎo shì】🐊设置【shè zhì】🍾setgid
c - sticky位【wèi】🚻, 如果该【rú guǒ gāi】🍠位为【wèi wéi】🍻1, 则表示【zé biǎo shì】🐊设置【shè zhì】🍾sticky
设置【shè zhì】完🖌这些标【zhè xiē biāo】🚢志【zhì】后🙊, 可以用【kě yǐ yòng】🛩 ls -l 来查看. 如果有😨这些标【zhè xiē biāo】🚢志【zhì】, 则会在【zé huì zài】🕯原来的执行标志【háng biāo zhì】🌾位【wèi】🚻置上【shàng】显示. 如
rwsrw-r-- 表示有【biǎo shì yǒu】⛑setuid标志【biāo zhì】🛏
rwxrwsrw- 表示有【biǎo shì yǒu】⛑setgid标志【biāo zhì】🛏
rwxrw-rwt 表示有【biǎo shì yǒu】⛑sticky标志【biāo zhì】🛏
那么原🤦来的执行标志【háng biāo zhì】🌾x到哪里去了呢? 系统是这样规定的👊, 如果本来在该【lái zài gāi】📪位【wèi】🚻上【shàng】有x, 则这些特殊标【tè shū biāo】志【zhì】🛏显示为小写字【xiǎo xiě zì】母 (s, s, t). 否则, 显示为大写字💔母 (S, S, T)
要删除【yào shān chú】一个文【yī gè wén】🕤件【jiàn】🧙,你不一定要有【dìng yào yǒu】🆖这个【gè】🗑文件的【wén jiàn de】🔐写权限【xiàn】🌞,但你一定要有【dìng yào yǒu】🆖这个【gè】🗑文件的【wén jiàn de】🔐上级目【shàng jí mù】录【lù】🍊的写权【de xiě quán】📶限【xiàn】🛏。也就是【yě jiù shì】🦏说,你即使【nǐ jí shǐ】没有【yǒu】🚋一个文【yī gè wén】🕤件【jiàn】🧙的写权【de xiě quán】📶限【xiàn】🛏,但你有【dàn nǐ yǒu】🎡这个【gè】🗑文件的【wén jiàn de】🔐上级目【shàng jí mù】录【lù】🍊的写权【de xiě quán】📶限【xiàn】🛏,你也可【nǐ yě kě】以把这个【gè】🗑文件【wén jiàn】😭给删除,而如【ér rú】🕖果没有【guǒ méi yǒu】🚋一个目【gè mù】录【lù】⛏的写权【de xiě quán】📶限【xiàn】🛏,也就不【yě jiù bú】🦒能在这【néng zài zhè】个目【gè mù】🚔录下创【lù xià chuàng】建🐿文件【wén jiàn】😭。
如🕖何才能使一个目【gè mù】录【lù】⛏既可以😴让任何用户【yòng hù】写😵入文件【rù wén jiàn】😭,又不让【yòu bú ràng】用户【yòng hù】🌁删除这个目【gè mù】🚔录下他【lù xià tā】人的【de】🖥文件【wén jiàn】😭,sticky就是【shì】🐾能起到【néng qǐ dào】这💜个【gè】作用🏺。stciky一般只【yī bān zhī】🎾用在目【mù】🏂录【lù】上🏚,用在文件【wén jiàn】😭上起不【shàng qǐ bú】到什么作用。
在一个【gè】☕目【mù】录【lù】上🏚设了【le】🕣sticky位【wèi】🐻后【hòu】,(如🕖/tmp,权限【xiàn】🌞为【wéi】1777)所有【yǒu】的【de】😥用户【yòng hù】🌁都可以在这个目【gè mù】🚔录下创【lù xià chuàng】建🐿文件【wén jiàn】😭,但只能【dàn zhī néng】〰删除自己【chú zì jǐ】🕷创建的【chuàng jiàn de】🌭文件【wén jiàn】😭,这就对【zhè jiù duì】所有【yǒu】🚋用户【yòng hù】🌁能写的【de】⚪目【mù】录【lù】下【xià】的【de】用⛲户文件【wén jiàn】😭启到了【qǐ dào le】📬保护的【de】⚪作用。(我当时/tmp没有【yǒu】🚋设sticky位【wèi】🐻,而在文件【wén jiàn】😭上设了【le】🕣,这也就🐳是为什【shì wéi shí】🧘么我为【wéi】什么设🌺了【le】🕟sticky位【wèi】🐻,还能删除自己【chú zì jǐ】🕷创建的【chuàng jiàn de】🌭文件的【wén jiàn de】🔐原因了【le】🕟)
--------------------------------------------------------------------------------
suid/sgid
要了【le】🕟解【jiě】 suid/sgid, 必需先了【le】🕟解【jiě】 process 及【jí】 permission.
我们需【wǒ men xū】知道: 每个【měi gè】🗑 process 都有【yǒu】🚋其【qí】🗑 effective uid/gid , 以决定【jué dìng】其【qí】🗑在传统 unix filesystem 中获得【zhōng huò dé】的【de】⚪实际 permission .
再【zài】, process 是【shì】🥒由 binary 产生的【de】⚪, 而 binary 是【shì】从【cóng】🍴 shell / shell script 载入执🛢行👪.
在正常【zài zhèng cháng】的【de】⚪情況下【xià】, process 的【de】⚪ effective uid/gid 是【shì】从【cóng】🍴 parent 继承, 或简单说是【shì】🥒与【yǔ】 shell 的【de】⚪ uid/gid 一样⛩。
shell 的【de】⚪ uid/gid 則是【shì】根🧀据 /etc/passwd 的【de】⚪第 3 与第【yǔ dì】 4 两位【wèi】🐻决定【jué dìng】.
当我们有【yǒu】🚋了【le】🕟以上的【de】⚪概念之【gài niàn zhī】后【hòu】, 再【zài】来看🏙 suid 对 effective uid/gid 的【de】影响🚥:
若 binary file 带有【dài yǒu】🚋 suid/sgid 的【de】时候🕖, 其【qí】🗑 effective id 就不是【jiù bú shì】从【cóng】🍴 parent 那【nà】🔨边继承, 而是【ér shì】🥒以 binary file 本身的【běn shēn de】🐉 user/group 为准【wéi zhǔn】。
举例而言【yán】, 若一个【gè】🗑 prog1 的【de】⚪ user/group 都是【shì】🥒 root , 但沒设【dàn méi shè】 suid/sgid ,
那【nà】🔨当一个【gè】🗑uid(500)/gid(500) 的【de】⚪ parent process 执行【zhí háng】这🏽个【gè】🗑 prog1 的【de】⚪话【huà】,
那【nà】🔨 effective uid/gid 就是【shì】🐾 500 ...
但若【dàn ruò】 prog1 设了【le】🕣 suid/sgid 后【hòu】, 那【nà】其【qí】👹 effective uid/gid 就是【shì】🐾 root !
一旦这【yī dàn zhè】个【gè】🗑 process effective 是【shì】🥒 root 的【de】⚪话【huà】, 那它对【nà tā duì】♉ file system 的【de】⚪ permission 就不受任何限【xiàn】🛏制了【zhì le】🕟.
因此【cǐ】我才在前🥗面提到木马程🐼式与病【shì yǔ bìng】毒的【de】⚪例子🚩...
试想一👭下【xià】: 若病毒【ruò bìng dú】⛰的【de】⚪ user/group 被设为【wéi】 root, 然后被【rán hòu bèi】一般 user 执行【zhí háng】👪时,
suid/sgid 的【de】⚪有【yǒu】🚋与【yǔ】无将导致什【dǎo zhì shí】么🤕不同结果?
好了【le】🚵, 由于【yóu yú】 suid/sgid 在系统上有【shàng yǒu】🚋其【qí】🗑存在的【de】🐀必要性(如🕖 /usr/bin/passwd 与【yǔ】 /etc/shadow 为【wéi】例),
但同时🔪又有【yǒu】🚋极大的【de】⚪杀伤力, 在应用【zài yīng yòng】上要异常小心🚷!
因此【cǐ】, bash shell script 在先天上不支【shàng bú zhī】援 suid/sgid .
perl 亦如🕖此【cǐ】, 除非额外再【zài】安裝 suid-perl ....
--------------------------------------------------------------------------------
uid gid euid egid
root 0 0
test 500 500
tset.shell 500 500 500 500 登陆后【hòu】🗄的【de】⚪shell
test.passwd.process 500 500 0 500 fork后【hòu】
(-r-s--x--x)
test用户【yòng hù】🌁fork binary文件【wén jiàn】😭passwd后【hòu】,test属于others,拥有【yōng yǒu】🐀该文件的【wén jiàn de】🔐x权利,因为【wéi】📇设置了【shè zhì le】🕟suid,所以fork出来的【de】⚪进程【jìn chéng】🐼(passwd.process)的【de】⚪euid=
文件【wén jiàn】😭(passwd)的【de】⚪owner的【de】⚪uid 也就是【yě jiù shì】🦏
passwd.process.euid=passwd.owner.uid=0
euid和guid是【shì】🥒用来进程【jìn chéng】🐼passwd.process发生读,写,执行【zhí háng】👪文件【wén jiàn】😭shadow的【de】时候🕖确认访【què rèn fǎng】🥁问权限【xiàn】🌞的【de】⚪.
-r-------- 1 root root 855 Sep 4 10:58 /etc/shadow ( passwd.uid=0 有【yǒu】🚋r权限【xiàn】🌞 )
文件【wén jiàn】😭shadow.owner.uid为【wéi】0拥有【yōng yǒu】🐀r权限【xiàn】🌞 因为【wéi】📇passwd.process.euid=shadow.ower.uid=0所以由⛓test用户【yòng hù】🌁产生的【de】⚪进程【jìn chéng】🐼passwd.process拥有【yōng yǒu】🐀文件【wén jiàn】😭
shadow的【de】⚪r权限【xiàn】🌞
-r-s--x--x 1 root root 19336 Sep 7 2004 /usr/bin/passwd
关键词:Linux
阅读本文后您有什么感想? 已有 人给出评价!
- 0
- 0
- 0
- 0
- 0
- 0