1、Setuid 设置和 Solaris 操作系统安全在 Solaris 中,文件除了读、写、执行权限外,还有一些特殊权限。 Setuid 和 setgid 是其中的一类。它与 Solaris 系统的安全关系紧密。Setuid 是指设置程序的有效的执行用户身份(uid)为该文件的主人,而不是调用该程序的进程的uid。Setgid 与之类似。Setuid 和 setgid 用 ls l 显示出来为 s 权限,存在于主人和属组的执行权限的位置上。这种权限的设置方法如下:只设 setuid: chmod 4xxx filename (xxx 为一般读、写、执行权限)只设 setgid: chmod 2x
2、xx filename同时设 setuid 和 setgid: chmod 6xxx filename取消两种权限: chmod 0xxx filename这种权限怎么用?举个例子来说,假如某一命令(程序)的主人是 root 用户,并且该文件有 setuid 属性,但是该文件的读、写、执行权限的属性表明普通用户 user1 可以执行该命令,那么就表示:当该用户执行该命令时,他具有 root 的执行身份,并获得相应的权限。一旦该命令执行完成,该身份也随之消失。为什么系统中需要有这样的权限呢?请执行以下操作:1. $ ls l /etc/shadow /bin/passwd-r-sr-sr-x 3
3、 root sys 99792 1999 2 月 12 /bin/passwd-r- 1 root sys 261 1 月 3 13:12 /etc/shadow/etc/shadow 文件由于存有用户的加密口令信息,对系统的安全至关重要,因此权限很严,只有 root 凭其对系统的至高无上的权限才得以对/etc/shadow 可读可写。但是系统必须允许普通用户也能修改自己的口令。要让他们对/etc/shadow 可写,又不能可读,而且可写又不能允许他们改别人的口令,怎么办?系统就采取这样一个办法:做一个程序, 也就是/bin/passwd,通过它可以在不显示文件内容的情况下直接修改/etc/s
4、hadow 文件。可是这个程序怎么能有这样的权限?因为系统赋予它 setuid 权限,而且它属于 root.这样,用户在使用/bin/passwd 改口令时就有 root 权限.由于/bin/passwd 命令本身功能的局限性,用户并不能用它做更多的不利于系统安全的事。2. 用普通用户身份修改口令$ passwdEnter login password: *New password:*Re-enter new password:*Passwd(SYSTEM): passwd successfully changed for xxx .可以成功。3. 用超级用户修改/bin/passwd 的权限
5、# chmod 0555 /bin/passwd4. 再重复 2,是否还成功?当然不。5把/bin/passwd 的权限恢复原状。# chmod 6555 /bin/passwd对此可以打一个生动的比喻:有一个绝密机关,不得已必须有一些不能见这些秘密的人进来做一些事情。于是授权一些特殊的“车辆” (没有窗户,门紧闭,所以看不到外面。只有一个小洞允许乘坐的人伸出一只手臂) ,带着所乘坐的人开到要去的地方,允许它办完事情马上带他出来。这样是不是很安全?不一定。如果“车辆”没有经过精挑细选是有很多“门窗” ,那系统可就危险了。这种安全威胁在 Solaris 中也有可能出现。比如做一下下面这个实验:6
6、. $ vi /etc/shadow/etc/shadow: Permission denied.7. 用超级用户身份# chmod 6555 /bin/vi# chown root /bin/vi8. 这次再用普通用户身份试一试第 6 步,有什么结果?这次你能以普通用户身份修改/etc/shadow 了!但是$ more /etc/shadow 仍然不成功,说明在执行/bin/passwd 时有超级用户权限,平时仍是普通用户身份。再来看一个令人不安的情况:9用超级用户身份# chmod 6555 /bin/ksh# chown root /bin/ksh10. 用普通用户身份$ ksh#发生
7、了什么情况?普通用户不需要 root 口令就变成了 root!好可怕。如果有一个用户曾有一次获得超级用户权限,并通过类似的方式给自己设置了后门(也可能放了一个类似的文件在他自己的家目录中) ,以后他就可以随时变成超级用户了。怎么能避免 setuid 的不安全影响,又利用其方便的地方?这里有几点建议:关键目录应严格控制写权限。比如/,/usr 等。对不管是 root 帐号还是普通用户帐号的保密都有足够的重视。最好不要设置类似于guest、public、test 之类公用的容易猜出口令的帐号。对系统中应该具有 setuid 权限的文件作一列表,定时检查有没有这之外的文件被设置了 setuid 权限
8、。下面有一个自己编的小程序与大家分享。程序功能描述:检查有没有/usr/secu/masterlist 文件记录之外的其它文件被设置了 setuid 权限事先要求:在系统调试完成,所有需要安装的软件安装好以后,执行下面命令生成检查对照文件# mkdir p /usr/secu# find / -perm 4000 print /usr/secu/masterlist程序: cd /tmp -f secrcheck then echo $f is not in listfidonerm secrcheck 在需要对系统做检查时,执行本 shell 程序。也可以放在定时进程中定时检查。程序由于需要在整个文件系统中做查找操作,需要比较长的时间。请您作完本文中的实验后,别忘把文件的权限改回原状。