1、说明

setuid和setgid位是让普通用户可以让root用户的角色运行只有root账号才能运行的程序或命令。(注意和su及sudo的区别)

在Linux中,有时执行某个命令时,需要对另一个文件进行操作,而这个文件又不是普通用户有权限进行操作的。例如,修改用户密码的命令passwd,实际上最终更改的是/etc/passwd文件,该文件的所有者和组都是root,同组用户和其他用户具有执行权限,只有root权限的用户才能更改,但是普通用户也可使用该命令修改自己密码(这个不用验证了吧?)

[root@localhost oldboy]# ls -l /etc/``passwd
-rw-r--r-- ``1`` root root ``1496`` Apr ``30`` ``21``:``40`` /etc/passwd

  1. #所有者和组都是root,按照我们学过的知识,普通用户是无法更改这个文件的,但是setuid的功能可以让普通用户做到这个本没有权限的密码文件

按照我们学过的知识,如果普通用户通过修改/etc/passwd修改自己的口令肯定是不可完成的任务。平时我们也不这么做,作为普通用户可以通过passwd来修改自己的口令,既然没权限,为什么还能修改密码呢?在答案揭晓前,我们来看一下passwd命令的权限。

[root@localhost oldboy]# ls -l /usr/bin/``passwd
-rwsr-xr-x ``1`` root root ``23420`` Aug ``3`` ``2010`` /usr/bin/passwd

因为/usr/bin/passwd文件已经设置了setuid权限位(也就是r-s—x—x中的s),所以普通用户在执行/usr/bin/passwd命令时能够使用root用户的权限,间接的修改/etc/passwd,已达到修改自己口令的权限。

我们知道Linux的用户管理是极为严格的,不同的用户拥有不同的权限,为了完成只有root用户才能完成的工作,我们必须为普通用户提升权限,最常用的方法就是su或sudo。为了setuid和setgid也是让普通用户超越自身拥有的普通权限达到使用root权限的方法。但不推荐大家使用,因为它能为系统带来安全隐患!!

特别提醒:setuid和setgid会面临风险,所以尽可能的少用(尤其是使用不当),了解什么回事即可

2、示例演示

我们想让一个普通用户oldboy拥有root用户才拥有的rm删除权限,我除了用su或sudo临时切换到root身份或以root的身份操作外,还可以怎么做呢?

  1. [root@localhost oldboy]# cd /home/ #进入/home目录
  2. [root@localhost home]# touch zgytest.txt #创建一个测试文件
  3. [root@localhost home]# ls -l zgytest.txt #查看文件属性
  4. -rw--w--w- 1 root root 0 May 2 01:04 zgytest.txt #文件的属性
  5. [root@localhost home]# su - zgy #切换普通用户
  6. [zgy@localhost ~]$ cd /home/
  7. [zgy@localhost home]$ rm -f zgytest.txt #以普通用户身份来删除zgytest.txt文件
  8. rm: cannot remove `zgytest.txt': Permission denied #权限不够

那我们怎样才能让zgy这个普通用户也拥有root超级的rm删除功力呢?好,引出本节的主题setuid,setgid。

  1. [root@localhost ~]# ls -l /bin/rm
  2. -rwxr-xr-x 1 root root 46480 Mar 14 2012 /bin/rm
  3. [root@localhost ~]# chmod 4755 /bin/rm #设置rm的权限为4755,这样就把setuid位设置好了
  4. [root@localhost ~]# ls -l /bin/rm
  5. -rwsr-xr-x 1 root root 46480 Mar 14 2012 /bin/rm #属主位置增加了s
  6. [root@localhost ~]# cd /home/
  7. [root@localhost home]# su - zgy #切换到普通用户zgy
  8. [zgy@localhost ~]$ cd /home/
  9. [zgy@localhost home]$ ls -l zgytest.txt #查看文件属性
  10. -rw--w--w- 1 root root 0 May 2 01:04 zgytest.txt #文件属性
  11. [zgy@localhost home]$ rm -f zgytest.txt #轻松的删除了zgytest.txt文件

如上面内容所示,我们设置了rm的setuid位后,就让普通用户在rm指令上有了超级root才能享受的删除权力。

通过这个例子,我们应该能明白setuid和setgid位的应用了,如同前面所说,让普通用户超越本身的能力,让普通用户能执行只有root才能执行的命令。在这一点,我们要和su和sudo区分开来。