文件与目录权限中的set uid ;set gid;sticky bit

文件与目录权限中的set uid ;set gid;sticky bit

#N3b$e2aK+m/rw ^0 Linux宝库.n3Z+G~(b!}L�s

一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组. #ar'q!iy't*^4|0如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该文件的用户具有的权限. 而setuid, setgid 可以来改变这种设置. Linux宝库"/ jDC;l-mH setuid: 设置使文件在执行阶段具有文件所有者的权限. 典型的文件是 /usr/bin/passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码. %q2qh QJ9c-NzBl0setgid: 该权限只对目录有效. 目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组. Linux宝库7ITCo` Q+E/M sticky bit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位. 设置该位后, 就算用户对目录具有写权限, 也不能删除该文件. 4/1U Z Yh;c"n8[ J0Linux宝库ND;I9jM}d:M0u/G 下面说一下如何操作这些标志: Linux宝库'xG8e /v0Q h 操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作, :[7dGl2O]@6s01) chmod u+s temp -- 为temp文件加上setuid标志. (setuid 只对文件有效) Linux宝库$P{�R6?2?s7J#b$t chmod g+s tempdir -- 为tempdir目录加上setgid标志 (setgid 只对目录有效) Linux宝库(@_!n Y'b0xEK chmod o+t temp -- 为temp文件加上sticky标志 (sticky只对文件有效) $Rv4Wg%H[*j02) 采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等. 这一组八进制数字三位的意义如下, Linux宝库q7lYPugX6t abc Linux宝库(g0D5q~g F a - setuid位, 如果该位为1, 则表示设置setuid _4Gq3L g$/u$b0b - setgid位, 如果该位为1, 则表示设置setgid Linux宝库a,k8G%Bm&sw c - sticky位, 如果该位为1, 则表示设置sticky ip s6V't*x#Fn0Linux宝库;tEL3LE/n.m2CW 设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如 Linux宝库/(ymRt1O rwsrw-r-- 表示有setuid标志 Linux宝库 ?5nIj4f)Z rwxrwsrw- 表示有setgid标志 Linux宝库 E0F)R�Iv:[/b*p2y rwxrw-rwt 表示有sticky标志 ZF r!S9J)W,T"hz0那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)Linux宝库*xoQ(eG

Z _4`4I/L:l }6B8y'ttd0这三个权限的数字位可以这么理解 [%h-O$nt#o|oj0 Ik3s7K b5pMil0[root@server3 test]# 1 1 1Linux宝库"CM6e)w!l [root@server3 test]# rw s rws rwtLinux宝库X&I:VRaZ%o [root@server3 test]# Linux宝库5Sn R)JcG g,a:^ [root@server3 test]# SUID SGID Sticky cA4dLq&y| K0Linux宝库;t%A1H$r|4m/A8{ 所以,可以得出 .V(S c-?{�c }0Linux宝库]#x5c7BW `)X+m z)s chmod 4777是设sidLinux宝库 hCG$j k^X chmod 2777是设置gidLinux宝库3uN;hJI0c]{w chmod 1777是设sticky -J0G5@~1j{#U0Linux宝库4C3I j,r J~ 常用操作 7e*l `Qu+A'v,@0 /_(D XH+W4D9~^8x'C0找出所有危险的目录(设置目录所有人可读写却没有设置sticky位的目录)Linux宝库%m J^tu find / -perm -0007 -type dLinux宝库 s@4h/d4i5} Linux宝库4L(ys,F'K7C:D,?X(k-D 找出所有设置了suid的文件Linux宝库8/yz ?e#bH wm]D&e1D_,ao1f0find / -perm -4000 -type fLinux宝库(ov't�F4S(GG_5cyd Linux宝库eZe$v2hA9V7Dh{u

'},}nIG `%j0Linux宝库(QV$vD_X.cNP

Linux宝库;aW%s;N*biC

Linux宝库SRp%d gqQ B

要删除一个文件,你不一定要有这个文件的写权限,但你一定要有这个文件的上级目录的写权限。也就是说,你即使没有一个文件的写权限,但你有这个文件的上级目录的写权限,你也可以把这个文件给删除,而如果没有一个目录的写权限,也就不能在这个目录下创建文件。 Linux宝库k|%rx2B2o 如何才能使一个目录既可以让任何用户写入文件,又不让用户删除这个目录下他人的文件,sticky就是能起到这个作用。stciky一般只用在目录上,用在文件上起不到什么作用。 Linux宝库%BR8hYe4c 在 一个目录上设了sticky位后,(如/tmp,权限为1777)所有的用户都可以在这个目录下创建文件,但只能删除自己创建的文件,这就对所有用户能写 的目录下的用户文件启到了保护的作用。(我当时/tmp没有设sticky位,而在文件上设了,这也就是为什么我为什么设了sticky位,还能删除自己 创建的文件的原因了)Linux宝库;Hj!M%MP D

Linux宝库w/4dLDa%N5WdL

Linux宝库Io6^W�wW+I

suid/sgid

Q6i-AB-s0 Linux宝库2u }7D,nOX5d/p

要了解 suid/sgid, 必需先了解 process 及 permission. E/PmW(_ ?0我們需知道: 每個 process 都有其 effective uid/gid , 以決定其在傳統 unix filesystem 中獲得的實際 permission . Linux宝库1A5Jy9_3Y/&p-| E ? 再, process 是由 binary 產生的, 而 binary 是從 shell / shell script. 載入執行. Linux宝库7},~dHD5@:[#O 在正常的情況下, process 的 effective uid/gid 是從 parent 繼承, 或簡單說是與 shell 的 uid/gid 一樣. Linux宝库,Fj(ZM$c(o'd@ shell 的 uid/gid 則是跟據 /etc/passwd 的第 3 與 第 4 欄位決定. y,}5{ f a0 -lV/;AC%M0當我們有了以上的概念之後, 再來看 suid 對 effective uid/gid 的影響: Linux宝库:dK$N&/ xa'q 若 binary file 帶有 suid/sgid 的時候, #k(o�Dq�a0其 effective id 就不是從 parent 那邊繼承, 而是以 binary file 本身的 user/group 為準. ;tL�Jrx0e0Linux宝库H-z0X.b�yNN 舉例而言, 若一個 prog1 的 user/group 都是 root , 但沒設 suid/sgid , Linux宝库:Lq"Ag+Jv k 那當一個 uid(500)/gid(500) 的 parent process 執行這個 prog1 的話, l;Z$aQ hn,_C'R(v0那 effective uid/gid 就是 500 ... Linux宝库#s4ms|0{2m/ 但若 prog1 設了 suid/sgid 後, 那其 effective uid/gid 就是 root ! Linux宝库fo(}Tm@1vh j#X?"f w6l)f0一旦這個 process effective 是 root 的話, 那它對 file system 的 permission 就如脫繮野馬般任意奔騰而不受限制了. Linux宝库2R!LZZ0Z;W0P 因此我才在前面提到木馬程式與病毒的例子... Linux宝库%Q u!Rk-w7hQ@e/Z 試想一下: 若病毒的 user/group 被設為 root, 然後被一般 user 執行時, Linux宝库-Z!fX H9{4@W5d suid/sgid 的有與無將導致甚麼不同結果? Linux宝库&lp-DjeL�XVq 4Q ]�aj#W0好了, 由於 suid/sgid 在系統上有其存在的必要性(舉 /usr/bin/passwd 與 /etc/shadow 為例), Linux宝库l[1S4P ?%Xm 但同時又有極大的殺傷力, 在應用上要異常小心! (R#Y }!D}nJ.[^0因此, bash shell script. 在先天上不支援 suid/sgid . Linux宝库5V{L NN fe{ Ll!{&z perl 亦如此, 除非額外再安裝 suid-perl .... Linux宝库 j!}tW@x Linux宝库4/XHZ;HDjq4@?

fOPP@0

6`(x ]L&J*R-Pz�p*^4}0

$~ZkcxOW;f@+aG0Linux宝库*i }W8zm

Linux宝库,yxM%LDF.Y

                              uid               gid            euid            egidLinux宝库 K+r:c6N%`R1zg7O4h root                         0                 0                                P-{ }%n ~+j&k0                              Linux宝库/_&l UpWK3y/HH test                         500             500                               LA#PFY e0                              2Kc-Cr&C3r0tset.shell                  500             500            500            500       登陆后的shellLinux宝库ph!~?9@b "Y'@4^uc%[x6l0test.passwd.process   500             500             0              500       fork后Linux宝库:s:u MG RO  (-r-s--x--x) ]n`n)Z/^Z0 Y'|4]9k gs0test用户fork binary文件passwd后,test属于others,拥有该文件的x权利,因为设置了suid,所以fork出来的进程(passwd.process)的euid=文件(passwd)的owner的uid 也就是 @/bt*k5OU J8D J0Linux宝库Q,h1SE/W6_D s passwd.process.euid=passwd.owner.uid=0 I }2bjM0Linux宝库�Q9}w(U8Wp3s l euid和guid是用来进程passwd.process发生读,写,执行文件shadow的时候确认访问权限的.

*w]�^q*nxG,QQ0 Linux宝库W�WN1v;^`2L#]i

Linux宝库%t;O*z T^S -r--------  1 root root 855 Sep  4 10:58 /etc/shadow          ( passwd.uid=0 有r权限 ) {jXosA0Linux宝库!m9b`!ynw)I 文件shadow.owner.uid为0拥有r权限  因为passwd.process.euid=shadow.ower.uid=0所以由test用户产生的进程passwd.process拥有文件shadow的r权限

aP_,d?P]�/0 &[QX/9l G H r0 -r-s--x--x  1 root root 19336 Sep  7  2004 /usr/bin/passwd  

你可能感兴趣的:(c,linux,server,shell,File,bash)