SUID的应用场景和简单见解

在看到apue的进程的时候,我发现一个叫suid的概念,也就是"设置用户ID"。一开始对这个概念十分陌生,单凭从字面来看确实不容易理解,后面通过查阅资料并且了解到它的一些应用场景之后才逐步了解,本文就是简单记录一下我对suid的个人见解。

其实SUID和SGID的作用跟sudo是相似的。当用户A想执行一个原本属于用户B的可执行文件时,若B的文件设置了suid位,则A在执行时是以用户
B的身份来执行。

其实要了解一个抽象东西最好的方法就是:找到它的应用场景,并且获取一个应用的例子,通过例子来了解它。那么suid的应用例子是什么呢?最典型的就是passwd了。

  
 其中一个suid的应用实例就是passwd,在linux中,存储密码的文件是/etc/passwd与/etc/shadow这两个文件,

相信有过一定开发或者运维经验的都知道,passwd就是一个可以用于修改用户密码的linux工具,如果再深入了解一点,就会知道这个工具其实是修改/etc/passwd这个文件的。让我们先简单看一看/etc/passwd这个文件:

   

-rw-r--r-- 1 root root 1537 Jan 12 16:18 /etc/passwd
linuxidc@www.linuxidc.com:~/cpp$ ls -l /etc/passwd -rw-r--r-- 1 root root 1503 2011-03-22 15:03 /etc/passwd linuxidc@www.linuxidc.com:~/cpp$   linuxidc@www.linuxidc.com:~/cpp$ ls -l /etc/shadow -rw-r----- 1 root shadow 1071 2011-03-22 15:03 /etc/shadow linuxidc@www.linuxidc.com:~/cpp$  

这个文件存储的就是linux所有用户的一些密码信息,出于安全的要求,文件的所属用户和所属组均是root,并且只能让root去修改文件。

这两天文件的所属用户
是root,也就是说,只有root用户可以修改这个文件。但是在一个多用户
的系统中,即便是普通用户,也有更改自己的密码的权限吧?但是更改密码就要更改到/etc/passwd这个文件,一般情况下是不被允许的。所以,这就是suid的作用了。

然而,作为一个普通用户,我就想改我自己的密码,难道还得取得root权限或者说让root管理员给我们去修改密码?这很明显是不人性化的。

先看一下设置密码的命令:

当然,你可以想,那既然这样也可以把其他用户设置成可写嘛。那么这就问题大了,如果这个用户乱改怎么办呢?因此最好的解决办法就是我们开发一个程序,这个程序去验证执行用户的修改密码操作是否合法,如果合法则把它的新密码写到/etc/passwd这个文件的对应用户中去。

root@www.linuxidc.com:/tmp/aa# ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 37100 2011-02-15 06:12 /usr/bin/passwd 

但是我们又忽略了这么一点,作为一个普通用户,我们确实可以执行修改密码程序,但是我们执行时候得实际用户id依然不是root,因此即使我们的操作合法,也不能让这个程序去修改/etc/passwd文件,因为这个文件仅仅运行root管理员去修改。

可以看到,/usr/bin/passwd是设置
了sticky位的。也就是说,当普通用户在执行passwd命令时,其实使用是root管理员的身份,当更改完密码时,就恢复到普通用户的身份了。

passwd很好的告诉我们应该怎么解决这个问题,且先看看passwd这个程序的信息:

我想了一个实验来看一下效果 

相关文章

Comment ()
评论是一种美德,说点什么吧,否则我会恨你的。。。