在看linux系统管理技术手册时,遇到一个课后题,提到了find-perm,由此在网上查看了setuid,setgid等知识,做一总结。
       讲这个知识都是从命令passwd开始的,linux系统/etc/passwd文件保存了用户信息,/etc/shadow文件保存了各账户密码,两者权限为:
-rw-r--r-- 1 root root 1703 2011-04-23 23:55 /etc/passwd
-rw-r----- 1 root shadow 1072 2011-04-23 23:55 /etc/shadow

        可以看出,保存密码的文件/etc/shadow文件只有root账户才可以写入,然而在实际中普通账户也可以改变自己的密码,对该文件做了写入。似乎矛盾,这也是这里要讲的重点。

         在linux中,设置或更给密码,是先写到/etc/passwd文件中,然后通过pwconv命令转换到/etc/shadow文件。而/etc/passwd文件中原来打XX的地方变成了真正的加密密码。

        其实,普通用户能够修改密码,不在于是否对/etc/shadow有写入的权限,而在于命令passwd,看一下passwd命令的权限:
       -rwsr-xr-x 1 root root 37100 2011-02-15 06:12 /usr/bin/passwd
       可以看出,这个命令有一个特殊权限 s ,存在与文件所有者权限位上,这就是一类特殊的权限SetUid。可以这样理解:当一个用户执行passwd命令时,在程序执行的瞬间,权限提升到了root,执行结束后就释放root权限。
       在这里以touch命令做一解释:
       首先给touch命令SetUid特殊权限:
       $sudo chmod g+s /bin/touch 或  $sudo chmod 6755 /bin/touch
       看一下touch命令权限:
       修改前:-rwxr-xr-x 1 root root 42592 2010-06-11 15:11 /bin/touch
       修改后:-rwsr-sr-x 1 root root 42592 2010-06-11 15:11 /bin/touch
        看到touch命令权限用户和组都有了特殊权限 s ,SetUid ,SetGid。
       $mkdir text
       $cd text
       $touch file1
       看一下file1权限:
       -rw-r--r-- 1 root root 0 2011-04-29 13:11 file1
       看出用户和组都变为root。
       恢复touch命令原有权限:$sudo chmod 755 /bin/touch,再创建file2文件,对比:
       -rw-r--r-- 1 root      root      0 2011-04-29 13:11 file1
       -rw-r--r-- 1 ubuntu ubuntu  0 2011-04-29 13:14 file2
       可以看出,具有setuid权限的touch命令,创建的文件用户和群组都是root,而在创建该文件的时候我们并没有使用到root账户却创建出了root权限的文件。
       作为系统管理员,应该严格限制SetUid权限的使用。

下面介绍下SetGid和sticky bit
        setgid: 该权限只对目录有效. 目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组.
s CK Rt uo0        sticky bit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位. 设置该位后, 就算用户对目录具有写权限, 也不能删除该文件.
        下面说一下如何操作这些标志:
操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作,
1) chmod u +s temp -- 为temp文件加上setuid标志. (setuid 只对文件有效)
chmod g +s tempdir -- 为tempdir目录加上setgid标志 (setgid 只对目录有效)
chmod o +t temp -- 为temp文件加上sticky标志 (sticky只对文件有效)
2) 采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等. 这一组八进制数字三位的意义如下,
abc
a - setuid位, 如果该位为1, 则表示设置setuid 4xxx
b - setgid位, 如果该位为1, 则表示设置setgid  2xxx
c - sticky位, 如果该位为1, 则表示设置sticky   1xxx

设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如
rwsrw-r-- 表示有setuid标志
rwxrwsrw- 表示有setgid标志
rwxrw-rwt 表示有sticky标志
那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 若无执行权限则显示为大写字母 (S, S, T)DOIT博客 f1@:t'_IO7e:RPDOIT博客v~X ?q8_/b){@xR8V(s g f0DOIT博客"@1h9ip;U&b0dOz_%T6ag/c L!u\7^ oG^0$^3poi#_5@ K0DOIT博客,Io9lxkb ]8f)_aA w _XPo0L.v0DOIT博客jtp:hX(~$B(OF @hs0:a8JQ(s5F I0DOIT博客^[W_6~c+mf$R ^DOIT博客)E@8R)nNvo9p5m*n V~ T0DOIT博客n df"P;z"or nDOIT博客5s+sL8e`_5ZaT
F3W,h%~^J8f/Zdf0要删除一个文件,你不一定要有这个文件的写权限,但你一定要有这个文件的上级目录的写权限。也就是说,你即使没有一个文件的写权限,但你有这个文件的上级目录的写权限,你也可以把这个文件给删除,而如果没有一个目录的写权限,也就不能在这个目录下创建文件。
/P_YqG0如何才能使一个目录既可以让任何用户写入文件,又不让用户删除这个目录下他人的文件,sticky就是能起到这个作用。stciky一般只用在目录上,用在文件上起不到什么作用。
1Q _6Js4ud6?0在 一个目录上设了sticky位后,(如/tmp,权限为1777)所有的用户都可以在这个目录下创建文件,但只能删除自己创建的文件,这就对所有用户能写 的目录下的用户文件启到了保护的作用。(我当时/tmp没有设sticky位,而在文件上设了,这也就是为什么我为什么设了sticky位,还能删除自己 创建的文件的原因了)DOIT博客/X/XH^$c
D+~Tbx IfY}0DOIT博客e.ZXL` S^Ca
DOIT博客+U(nw Be8J*a+s
setuid setgid可能带来安全风险,如何查找系统中属于root用户的setuid文件?
运行find正则来查找
/usr/bin/find/ -user root -perm -4000 -print  ‘从/根目录开始查找root用户setuid的文件
DOIT博客`~m8R*E-Mba4B h:NDOIT博客"WpUqN} ]C"[|;D9k6Z)J0g [@0
/usr/bin/find / -user root -perm -4000 -print | /bin/mail -s "Setuid root files" netadmin 结果邮寄DOIT博客(g5C P+aRoh
/usr/bin/find / \( -perm -4000 -o -perm -2000 \) > setuidfile '查找出的结果导入到文件DOIT博客;gM)Y|W}p

l*Pm%W!vT0DOIT博客dvg*gw8AQT
另外可以在fstab里面禁止分区使用nosettuid参数进行限制  尽管可以设置 但实际没有效果
Ksfk?"` t0在调用mount命令时使用-o nosuid选项,在个别文件系统上禁止setuid和setgid的执行。比较好的想法是,把这个选项用在包含用户主目录的目录上,或者在安装从不太可信的管理域来的文件系统时使用。

这里再介绍下find -perm参数:
         $sudo find  / -type f -perm -6000
;I t&y;EStO0DOIT博客S Kk"R5B Y
         -号表示有1的位置一定要正确匹配,其他无所谓。这里要转成二进制来说,首先6000转成三位的二进制是下面这个样子
         110 000 000 000
也就是要求前两个11必须匹配,后面的无所谓。
         110 000 000 000
         110 110 000 000
         都可以。
      $sudo find / -type f -perm +6000 > /tmp/setuid.bak
   
         +号的意思是,只要有一个1匹配就行了,也就是说前2位中,只要有一个1就行。
       $sudo find / -perm -6000 -o -perm -2000
     命令find选项“-perm”为指定文件权限,SetUID权限位对应数字标识4,SetGID权限位对应数字标识为2 ,后面写为“000”标识对所有者所属组, 其他人三类用户的权限不限制;“-o”表示or,就是文件具有SetUID或者具有SetGID都在
       搜索之后,生成的搜索结果存放在文件/tmp/setuid.bak中。       
        另外,如果在一些数据存放的分区想禁用SetUID功能,还可以做如下设置,编辑配置文件/etc/fstab ,找到要设置的分区(如/home)所对应的设置行:
           vi /etc/fstab
        LABEL=/home   /home  ext3   defaults  1  2
        在设置“defaults”后,添加“nosuid”选项,并重新挂载/home分区    
        vi /etc/fstab
        LABEL=/home       /home     ext3    defaults,nosuid  1     2
        mount -o remount /home
        设置后,分区/home上任何可执行文件即使被设置了SetUID权限也无法执行(读者可自行拷贝一个SetUID命令至/home目录下执行试验),在一些存放数据、用来备份等功能的分区上做此设置,可以保护系统安全。


参考:http://space.doit.com.cn/51460/viewspace-14008.html
          http://blog.wgzhao.com/2008/05/06/find-perm-parameters-of-a-simple-way-to-remember.html