您的位置:首页 > 产品设计 > UI/UE

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

2008-05-16 23:32 363 查看
文件与目录权限中的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

alimama_pid="mm_10809884_1047205_2647629";
alimama_titlecolor="0000FF";
alimama_descolor ="000000";
alimama_bgcolor="FFFFFF";
alimama_bordercolor="E6E6E6";
alimama_linkcolor="008000";
alimama_bottomcolor="FFFFFF";
alimama_anglesize="4";
alimama_bgpic="2";
alimama_icon="1";
alimama_sizecode="16";
alimama_width=658;
alimama_height=60;
alimama_type=2;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: