SUID ?Set User ID, SGID ?Set Group ID的意思?/p>
UNIX下可以用ls -l 命o(h)来看到文件的权限。用ls命o(h)所得到的表C法的格式是cMq样的:(x)-rwxr-xr-x 。下面解析一下格式所表示的意思。这U表C方法一共有十位Q?/p>
9 8 7 6 5 4 3 2 1 0
- r w x r - x r - x
W?位表C文件类?可以为p、d、l、s、c、b?Q?/p>
p表示命名道文g
d表示目录文g
l表示W号q接文g
-表示普通文?/p>
s表示socket文g
c表示字符讑֤文g
b表示块设备文?/p>
W?-6位?-3位?-0位分别表C文件所有者的权限Q同l用L(fng)权限Q其他用L(fng)权限Q其形式为rwxQ?/p>
r表示可读Q可以读出文件的内容
w表示可写Q可以修Ҏ(gu)件的内容
x表示可执行,可运行这个程?/p>
没有权限的位|用-表示
例子Q?/p>
ls -l myfile昄为:(x)
rwxr-x-- 1 foo staff 7734 Apr 05 17:07 myfile
表示文gmyfile是普通文Ӟ文g的所有者是foo用户Q而foo用户属于staffl,文g只有1个硬q接Q长度是7734个字节,最后修Ҏ(gu)???7:07?/p>
所有者f(xi)ooҎ(gu)件有d执行权限Qstaffl的成员Ҏ(gu)件有d执行权限Q其他的用户对这个文件没有权限?/p>
如果一个文件被讄了SUID或SGID位,?x)分别表现在所有者或同组用户的权限的可执行位上。例如:(x)
1?rwsr-xr-x 表示SUID和所有者权限中可执行位被设|?/p>
2?del>rwSrr- 表示SUID被设|,但所有者权限中可执行位没有被设|?/p>
3?rwxr-sr-x 表示SGID和同l用h限中可执行位被设|?/p>
4?del>rw-r-Sr- 表示SGID被设|,但同l用h限中可执行位没有被社
其实在UNIX的实CQ文件权限用12个二q制位表C,如果该位|上的值是
1Q表C有相应的权限:(x)
11 10 9 8 7 6 5 4 3 2 1 0
S G T r w x r w x r w x
W?1位ؓ(f)SUID位,W?0位ؓ(f)SGID位,W?位ؓ(f)sticky位,W?-0位对应于上面的三lrwx位?/p>
11 10 9 8 7 6 5 4 3 2 1 0
上面?rwsr-xr-x的gؓ(f)Q?1 0 0 1 1 1 1 0 1 1 0 1
rw-r-Sr-的gؓ(f)Q?0 1 0 1 1 0 1 0 0 1 0 0
l文件加SUID和SUID的命令如下:(x)
chmod u+s filename 讄SUID?/p>
chmod u-s filename LSUID讄
chmod g+s filename 讄SGID?/p>
chmod g-s filename LSGID讄
另外一U方法是chmod命o(h)用八q制表示Ҏ(gu)的设|。如果明白了前面?2位权限表C法也很单?/p>
二、SUID和SGID的详l解?/p>
׃SUID和SGID是在执行E序Q程序的可执行位被设|)时v作用Q而可执行位只Ҏ(gu)通文件和目录文g有意义,所以设|其他种cL件的SUID和SGID位是没有多大意义的?/p>
首先讲普通文件的SUID和SGID的作用。例子:(x)
如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls命o(h)昄如下Q?/p>
-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfileM用户都可以执行这个程序。UNIX的内核是Ҏ(gu)什么来定一个进E对资源的访问权限的呢?是这个进E的q行用户的(有效QIDQ包?user id和group id。用户可以用id命o(h)来查到自q或其他用L(fng)user id和group id?/p>
除了一般的user id 和group id外,q有两个UC为effective 的idQ就是有效idQ上面的四个id表示为:(x)uidQgidQeuidQegid。内怸要是Ҏ(gu)euid和egid来确定进E对资源的访问权限?/p>
一个进E如果没有SUID或SGID位,则euid=uid egid=gidQ分别是q行q个E序的用L(fng)uid和gid。例如kevin用户的uid和gid分别?04?02Qfoo用户的uid和gid?200Q?01Qkevinq行myfileE序形成的进E的euid=uid=204Qegid=gid=202Q内核根据这些值来判断q程对资源访?的限Ӟ其实是kevin用户对资源访问的权限Q和foo没关pR?/p>
如果一个程序设|了SUIDQ则euid和egid变成被运行的E序的所有者的uid和gidQ例如kevin用户q行myfileQeuid=200Qegid=201Quid=204Qgid=202Q则q个q程h它的属主foo的资源访问权限?/p>
SUID的作用就是这P(x)让本来没有相应权限的用户q行q个E序Ӟ可以讉K他没有权限访问的资源。passwd是一个很鲜明的例子?/p>
SUID的优先比SGID高,当一个可执行E序讄了SUIDQ则SGID?x)自动变成相应的egid?/p>
下面讨论一个例子:(x)
UNIXpȝ有一?dev/kmem的设备文Ӟ是一个字W设备文Ӟ里面存储了核心程序要讉K的数据,包括用户的口令。所以这个文件不能给一般的用户dQ权限设为:(x)cr-r---- 1 root system 2, 1 May 25 1998 kmem
但ps{程序要读这个文Ӟ而ps的权限设|如下:(x)
-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps
q是一个设|了SGID的程序,而ps的用hbinQ不是rootQ所以不能设|SUID来访问kmemQ但大家注意了,bin和root 都属于systeml,而且ps讄了SGIDQ一般用h行psQ就?x)获得systeml用L(fng)权限Q而文件kmem的同l用L(fng)权限是可读,所以一?用户执行ps没问题了。但有些Qؓ(f)什么不把psE序讄为root用户的程序,然后讄SUID位,不也行吗Q这的确可以解决问题Q但实际中ؓ(f)什?不这样做呢?因ؓ(f)SGID的风险比SUID得多,所以出于系l安全的考虑Q应该尽量用SGID代替SUID的程序,如果可能的话。下面来说明一?SGID对目录的影响。SUID对目录没有媄响。如果一个目录设|了SGID位,那么如果M一个用户对q个目录有写权限的话Q他在这个目录所建立的文?的组都会(x)自动转ؓ(f)q个目录的属L在的l,而文件所有者不变,q是属于建立q个文g的用戗?/p>
三、关于SUID和SGID的编E?/p>
和SUID和SGID~程比较密切相关的有以下的头文g和函敎ͼ(x)
#include
#include
uid_t getuid(void);
uid_t geteuid(void);
gid_t getgid (void);
gid_t getegid (void);
int setuid (uid_t UID);
int setruid (uid_t RUID);
int seteuid (uid_t EUID);
int setreuid (uid_t RUID,uid_t EUID);
int setgid (gid_t GID);
int setrgid (gid_t RGID);
int setegid (git_t EGID);
int setregid (gid_t RGID, gid_t EGID);
具体q些函数的说明在q里׃详细列出来了,要用到的可以用man查?/p>
SUID/SGID :
假如你有文ga.txt
#ls -l a.txt
-rwxrwxrwx
#chmod 4777 a.txt
-rwsrwxrwx ======>注意s位置
#chmod 2777 a.txt
-rwxrwsrwx ======>注意s位置
#chmod 7777 a.txt
-rwsrwxswt ======>出现了t,t的作用在内存中尽量保存a.txt,节省pȝ再加载的旉.
现在再看前面讄 SUID/SGID作用:
#cd /sbin
#./lsusb
...
#su aaa(普通用?
$./lsusb
...
是不是现在显C出错?
$su
#chmod 4755 lsusb
#su aaa
$./lsusb
... 现在明白了吗Q本来是只有root用户才能执行的命令,加了SUID?普通用户就可以像root一L(fng)用,权限提升了。上面是对于文g来说的,对于目录也差不多Q?/p>
目录的S属性得在该目录下创徏的Q何文件及(qing)子目录属于该目录所拥有的组Q目录的T属性得该目录的所有者及(qing)root才能删除该目录。还有对 于s与SQ设|SUID/SGID需要有q行权限Q否则用ls -l后就?x)看到S,证明你所讄的SUID/SGID没有起作用?/p>
Why we need suid,how do we use suid?
r -- 读访?/p>
w -- 写访?/p>
x -- 执行许可
s -- SUID/SGID
t -- sticky?/p>
那么 suid/sgid是做什么的Q?Z么会(x)有suid位呢Q?/p>
要想明白q个Q先让我们看个问题:(x)如果让每个用h改自q密码Q?/p>
用户修改密码Q是通过q行命o(h)passwd来实现的。最l必要修改/etc/passwd文gQ而passwd的文件的属性是Q?/p>
#ls -l /etc/passwd
rw-rr- 1 root root 2520 Jul 12 18:25 passwd
我们可以看到passwd文g只有对于root用户是可写的Q而对于所有的他用h说都是没有写权限的?那么一个普通的用户如何能够通过q行passwd命o(h)修改q个passwd文g呢?
Z解决q个问题QSUID/SGID便应q而生。而且AT&T对它甌了专利?呵呵?/p>
SUID和SGID是如何解册个问题呢Q?/p>
首先Q我们要知道一点:(x)q程在运行的时候,有一些属性,其中包括 实际用户ID,实际lID,有效用户ID,有效lID{?实际用户ID和实际组ID标识我们是谁Q谁在运行这个程?一般这2个字D在登陆时决定,在一个登陆会(x)话期_(d) q些值基本上不改变?/p>
而有效用户ID和有效组ID则决定了q程在运行时的权限。内核在军_q程是否有文件存取权限时Q是采用了进E的有效用户ID来进行判断的?/p>
知道了这点,我们来看看SUID的解决途径Q?/p>
当一个程序设|了为SUID位时Q内核就知道了运行这个程序的时候,应该认ؓ(f)是文件的所有者在q行q个E序。即该程序运行的时候,有效用户ID是该E序的所有者。D个例子:(x)
[root@sgrid5 bin]# ls -l passwd
-r-s-s-x 1 root root 16336 Feb 14 2003 passwd
虽然你以test登陆pȝQ但是当你输入passwd命o(h)来更改密码的时候,׃passwd讄了SUID位,因此虽然q程的实际用户ID 是test对应的IDQ但是进E的有效用户ID则是passwd文g的所有者root的ID,因此可以修改/etc/passwd文g?/p>
让我们看另外一个例子?/p>
ping命o(h)应用q泛Q可以测试网l是否连接正常。ping在运行中是采用了ICMP协议Q需要发送ICMP报文。但是只有root用户才能建立ICMP报文Q如何解册个问题呢Q同P也是通过SUID位来解决?/p>
[root@sgrid5 bin]# ls -l /bin/ping
-rwsr-sr-x 1 root root 28628 Jan 25 2003 /bin/ping
我们可以试一下,如果Lping的SUID位,再用普通用户去q行命o(h)Q看?x)怎么栗?/p>
[root@sgrid5 bin]#chmod u-s /bin/ping
[root@sgrid5 bin]# ls -l ping
-rwxr-xr-x 1 root root 28628 Jan 25 2003 ping
[root@sgrid5 bin]#su test
[test@sgrid5 bin]$ ping byhh.net
ping: icmp open socket: Operation not permitted
SUID虽然很好了解决了一些问题,但是同时也会(x)带来一些安全隐(zhn)?/p>
因ؓ(f)讄?SUID 位的E序如果被攻?通过~冲区溢出等斚w),那么hacker可以拿到root权限?/p>
因此在安全方面特别要注意那些讄了SUID的程序?/p>
通过以下的命令可以找到系l上所有的讄了suid的文Ӟ(x)
[root@sgrid5 /]# find / -perm -04000 -type f -ls
对于q里Z么是4000Q大家可以看一下前面的st_mode的各bit的意义就明白了?/p>
在这些设|了suid的程序里Q如果用不上的,最好取消该E序的suid位?/p>
SUID和SGIDQ主要作用是用于当非某个文g的所有?或组)执行(或操作目?文gӞ可以暂时获得该文件所有者的权限?br />
SBIT的作用在于访问控Ӟ当它Ҏ(gu)个目录设|此属性后Q该目录下的所有文Ӟ即其它人有w属性,都不得对其更名、移动、删除?/p>
讄Ҏ(gu)Q?br />
如果你已l掌握了?八进?数字来表C权限的规则Q再l合chmod命o(h)q行讄很单了。以下是SUID/SGID/Sticky BitU定对应的八q制数|(x)
ȝQ?/span>
1QSet UIDQ当文gpȝ?所有者权限组?的可执行位被s(即rws------)取代Ӟ构成Ҏ(gu)权限规定Set UIDQ简USUID。仅对系l中的二q制可执行文件设|有效,而且不可对Shell Script施加讄?br />
2QSet GIDQ当所有者所在的用户l?group)的权限组合中可执行位被s所取代?例如--rws--)Q便构成Set GID的权限设|。SGID可以针对二进制文件或目录q行讄?br />
3QSticky BitQ当文gpȝ"其他(others)"的权限组合中可执行位被t所取代?例如------rwt)Q便构成Sticky Bit的权限设|。它只对目录有效?
SUID Q?4
SGID Q?2
SBIT Q?1
讄时我们把表示Ҏ(gu)权限的数字放在其他三位数字权限的前面?/p>
grub引导中,在kernal 中设|root分区现在?中方?nbsp;
1. 使用h
查看/etc/fstabQ可以看到类?/p>
label=/ / ext3 defaults 1 1
/dev/hda7 /usr ext3 defaults 1 1
W二行的意思很Ҏ(gu)懂,是?dev/hda7 mount?usr 上。第一行没有指明分区,意思是把label(h)? 的分区mount?上。这样写的好处在于即使如果把盘从主板上的ide0(hda) 换到ide2(hdc)上,pȝ仍然可以自动挂蝲正确的分区。通常Linux安装的时候已l自动指定了h?/p>
所以我们可以这栯|root分区 , kernel **** root=LABEL=/
2. 使用UUID
UUID 全称?Universally Unique IdentifierQ也是_(d)每个分区有一个唯一?UUID |q样׃?x)发生分别q问题了?nbsp;
?3 U方法:(x)
1. 通过览 /dev/disk/by-uuid/ 下的讑֤文g信息?
# ls -l /dev/disk/by-uuid/
------
lrwxrwxrwx 1 root root 10 10-13 09:14 0909-090B -> ../../sdb5
lrwxrwxrwx 1 root root 10 10-13 09:13 7c627a81-7a6b-4806-987b-b5a8a0a93645 -> ../../sda4
.....
2. 通过 vol_id 命o(h)?
# vol_id /dev/sdb5
3. 通过 blkid 命o(h)
# sudo blkid
/dev/sdb5: LABEL="SWAP" UUID="0909-090B" TYPE="vfat"
通过q三U方法都可以获得分区?UUIDQUUID 依据分区不同Q长度和格式都不相同?
root=UUID=*****
3. 使用win模式下的/dev/*
通过explore2fs查看root , home对应的分区,昄格式如:(x)/dev/sda2
root=/dev/sda2