发信人: sungang(笨刚) 
整理人: sungang(2003-09-16 12:09:26), 站内信件
 | 
 
 
4.2.3 超级用户root
 
 超级用户是Unix的所有者,拥有所有的权利,因此也具有很大的危险性,不当使用超级用户权力能对系统造成不可挽回的破坏。即使对于个人使用的FreeBSD系统,尽管不需要将系统与其他人共享,但是仍然不要使用root用户作日常处理工作。通常管理员在正常情况下仅仅使用普通帐户进行操作,只有在执行系统管理的必要时候才使用超级用户权限。
 
 从普通用户成为超级用户的标准方法是使用su命令:
 
 $ su
 
 Password:
 
 # 
 
 正确输入root的口令之后,就成为了超级用户,系统提示符也从标准的 “$” 变为root专用的 “#” 提示。
 
 在FreeBSD上要使用su命令成为root用户,不但要知道root的口令,还需要经过特别设置,否则就不能成功使用这个命令。这是因为FreeBSD对执行su命令的用户进行了更严格的限制,能使用su命令的用户必须属于wheel组(root的基本属组,组ID为0),否则就不能通过这个命令成为root用户。因此需要编辑组设置文件/etc/group,将需要超级用户权力的管理成员加入到wheel组中。
 
 如果仅仅要用户执行部分需要超级用户权力的操作,而不想将root的口令泄露出去,更简单的做法是使用sudo,然而这这个程序不是基本系统中包括的命令,而需要另外安装管理工具。
 
 1) 设置用户标识
 使用su命令,可以让普通用户转变为超级用户root,那么su程序是如何做到这一点的呢?
 
 当用户启动su程序的时候,显然su进程首先具备的是用户本身的标识,要完成su操作这类操作,就要求普通用户也能完成特殊权限的任务,那么就必须在进程执行过程中改变进程的身份。
 
 改变进程的身份,即用户标识uid,必须同时具备三个要求:程序文件本身具有SetUID属性,同时程序中需要相应调用setuid()系统调用,并且setuid()的目标必须是程序文件的属主。这样,setuid系统调用能够检查文件的属性,并完成更改进程权限的操作。
 
 同样的方法,可以使用setgid()系统调用来改变进程的组标识gid。
 
 通常只有系统程序才需要利用这两个属性,例如系统程序su允许普通用户成为root用户,就使用的是这个能力。
 
 $ ls -l a*
 
 -rwxr-xr-x   1 user     wheel        3212 Dec  4 12:36 a1
 
 -rwxr-xr-x   1 user     wheel        3212 Dec  4 12:36 a2
 
 $ chmod u+s a1
 
 $ ls -l a*
 
 -rwsr-xr-x   1 user     wheel        3212 Dec  4 12:36 a1
 
 -rwxr-xr-x   1 user     wheel        3212 Dec  4 12:36 a2
 
 $ chmod g+s a2
 
 $ ls -l a*
 
 -rwsr-xr-x   1 user     wheel        3212 Dec  4 12:36 a1
 
 -rwxr-sr-x   1 user     wheel        3212 Dec  4 12:36 a2
 
 上面第一个chmod(chmod u+s a.out)为a.out增加设置属主身份权限,然后列表中对应属主的执行权限位的 “x” 标志将改变为 “s” (文件属性显示为rwsr-xr-x)。第二个chmod (chmod g+s a.out)为a.out增加设置组身份权限,则列表中对应组的执行权限位的 “x” 标志将改变为 “s” (文件属性显示为rwxr-sr-x)。同样,SetUID和SetGID属性也都有相应的八进制表示方式,SetUID为04000,后面的三个八进制位属于文件的读写访问属性设置,相应SetGID为02000,它们两个属性位处于读写属性位之前。下面是一个更改属性设置的例子:
 
 # ls -l /bin/ps 
 
 -r-xr-sr-x  1 bin  kmem  163840 May  6 06:02 /bin/ps
 
 # chmod a=r /bin/ps
 
 # su user
 
 $ ps
 
 bash: ps: Permission denied
 
 $ ^D
 
 # chmod a+x /bin/ps
 
 # su user
 
 $ ps
 
 ps: /dev/mem: Permission denied
 
 $ ^D
 
 # chmod g+s /bin/ps
 
 # su user
 
 $ ps
 
   PID  TT  STAT      TIME COMMAND
 
   226  p2  S      0:00.56 bash
 
   239  p2  R+     0:00.02 ps
 
 $
 
 第一次以user身份执行ps时,ps的文件属性被改为对所有用户只有读权限,因此不能执行,shell报告Permission denied;第二次以user身份执行ps时,ps报告不能打开/dev/mem文件,这是因为普通用户无权存取内存映象文件。而第三次执行ps时,由于设置了setgid位,和kmem同组的进程就能够打开/dev/mem文件,从而正确执行了ps程序。
 
 具有SetUID或SetGID属性的程序,能够在进程执行中调用系统调用setuid()或setgid(),调用成功后这个进程就具有了程序文件属主和组的权限,就可以完成以前改变身份之前不能完成的任务。
 
 因为通过它们,程序可以改变进程的用户标识,绕过系统的权限设置,因此这两个属性对于系统安全非常重要。尤其是属于root,并设置了SetUID属性的程序,更是系统安全中值得注意的地方。为了保证系统安全,必须保证没有非法的SetUID或SetGID程序的存在,通常管理员可以使用find命令来完成这个任务,例如查找具有SetUID的程序,则执行:
 
 # find / -perm 4000 -print
 
 上面命令中的4000为文件属性的八进制表示,其中4就为setuid位。
  | 
 
 
 |