1.setuid的作用
我们知道当给一个命令赋予了setuid权限之后,那么用户在执行这个命令时便暂时拥有了该
命令所有者的权限,也就是说,不管是谁执行的此命令,都是以该命令所有者的身份执行的。
在Linux系统中,最明显的一个例子就是passwd这个命令。
我们查看/etc/shadow这个文件的权限如下:
$ ls -l /etc/shadow
-rw-r----- 1
root shadow 1186 2012-03-09 11:35 /etc/shadow
我们可以看出/etc/shadow这个文件只有root用户可以写,shadow组的用户只能读,其他用
户没有任何权限。
但是每一个用户都可以通过passwd这个命令修改自已的密码,这又是为什么呢?
我们看一下passwd这个命令的属性:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1
root root 42856 2011-02-15 06:11 /usr/bin/passwd
我们注意到passwd这个命令的属性中有一个s位,这就是普通用户能够修改自已的密码
的原因。
passwd这个命令具有setuid权限且其属主是root,所以其他用户在用此命令修改密码时,实
际上是以root的身份修改的密码。
我们可以做个实验验证一下。把passwd命令的s位去掉,看普通用户还能否修改自已的密码。
$ sudo chmod u-s /usr/bin/passwd
$
ls -l
/usr/bin/passwd
-rwxr-xr-x 1
root root 42856 2011-02-15 06:11 /usr/bin/passwd
$
passwd wlxxsj
更改 wlxxsj 的密码。
(当前)UNIX 密码:
输入新的 UNIX 密码:
重新输入新的
UNIX 密码:
passwd:认证令牌操作错误
passwd:
password unchanged
从上面的实验可以看出,当把passwd这个命令的s位去掉后,普通用户便无法修改自已的密码了。
2.
对setuid的误用
下面说一下我对setuid的一个误用。还是通过一个实验来说明。
先建立一个文件夹和两个文件,它们的关系及属性如下图所示:
其中rmtest.sh是一个shell脚本,作用是删除同目录下的rmtest.txt这个文件。
文件夹setuid,文件rmtest.sh和rmtest.txt的属主和属组都是root。
rmtest.sh具有setuid权限。
我期望的是,当用普通用户执行rmtest.sh这个脚本的时候,能够删除rmtest.txt这个文件。但是删除失败。
再来做个实验。
把rmtest.sh的s位去掉,给rm这个命令添加s位,然后用普通用户执行rmtest.sh这个脚本,rmtest.txt这个文件被成功删除。
3.
总结
我对setuid的误解:
当给一个脚本赋予了setuid权限后,脚本中的命令就会以脚本的身份执行。这是错误的。
应该这么理解:
setuid只对命令有效,对脚本无效。或者说只对原子操作(系统命令)有效,对组合操作(用户脚本)无效,除非脚本中
所用到的命令都具有setuid权限且与脚本同属主。
来自为知笔记(Wiz)
Shell编程 之 对setuid的误解,码迷,mamicode.com