转自: http://www.linuxidc.com/Linux/2011-09/43194.htmlinux
看UNIX相关的书时常常能遇到这几个概念,但一直没有好好去理清这几个概念,以至对这几个概念一直只知其一;不知其二。今天好好区分了一下这几个概念并总结以下。说白了这几个UID引出都是为了系统的权限管理。shell
下面分别用RUID, EUID,SUID来表示实际用户ID,有效用户ID,设置用户ID。另外用户ID是个整型数,为了说明方便真接使用了用户名来表明不一样的UID。先解释一下这几个ID的做用:vim
RUID, 用于在系统中标识一个用户是谁,当用户使用用户名和密码成功登陆后一个UNIX系统后就惟一肯定了他的RUID.编辑器
EUID, 用于系统决定用户对系统资源的访问权限,一般状况下等于RUID。测试
SUID,用于对外权限的开放。跟RUID及EUID是用一个用户绑定不一样,它是跟文件而不是跟用户绑定。ui
说明SUID的时候不少书都简略的提了一下passwd这个程序,下面就拿这个例子来分析。咱们知道linux系统的密码都存在了/etc/shadow这个文件里。这个文件是如此的重要,在作任何修改以前最好先备份一下。查看/etc/shadow文件的属性以下:htm
[root@localhost ~]# ll /etc/shadowtoken
-r——– 1 root root 1144 Jul 20 22:33 /etc/shadow进程
从上能够看出/etc/shadow文件是一个属于root用户及root组的文件,而且只有EUID为root的用户具备读的权限,其它全部EUID都没有任何权限。当你在steve用户(EUID此时也为steve)的shell下试图用vim打开这个文件时会提示权限不容许。至于连root用户也只有读的权限我猜是为了避免鼓励root用户使用vim类的编辑器去直接修改它,而要采用passwd命令来修改这个文件。若是你非要直接修改它,那么你可使用chmod命令修改成属性为root可写,而后就能够修改了。ip
用过UNIX系统的人都知道,任何一个用户均可以使用passwd这个命令来得新设定本身的密码。但从上面已经知道,非root用记是没法读这个文件的,那么普通用户是如何作到修改这个文件的呢?咱们知道passwd这个命令实际执行的程序是/usr/bin/passwd, 查看这个文件属性以下:
-r-s–x–x 1 root root 21944 Feb 12 2006 /usr/bin/passwd;
对应文件存取标志的s位就是一般说的SUID位,另外能够看到全部用户都有执行的这个程序权力。当steve用户执行passwd命令的时候。Shell会fork出一个子进程,此时进程的EUID仍是steve,而后exec程序/usr/bin/passwd。exec会根据/usr/bin/passwd的SUID位会把进程的EUID设成root, 此时这个进程都得到了root权限, 获得了读写/etc/shadow文件的权限, 从而steve用户可完成密码的修改。 exec退出后会恢复steve用户的EUID为steve.这样就不会使steve用户一直拥有root权限。
咱们能够测试一下,用root用户把/usr/bin/passwd的SUID位去掉,以下:
[root@localhost ~]# ll /usr/bin/passwd
-r-s–x–x 1 root root 21944 Feb 12 2006 /usr/bin/passwd
[root@localhost ~]# chmod u-s /usr/bin/passwd
[root@localhost ~]# ll /usr/bin/passwd
-r-x–x–x 1 root root 21944 Feb 12 2006 /usr/bin/passwd
而后steve用户用命令passwd去更新密码会提示以下错误:
[steve@localhost ~]$ passwd
Changing password for user steve.
Changing password for steve
(current) UNIX password:
passwd: Authentication token manipulation error
[steve@localhost ~]$
这就是由于/usr/bin/passwd程序的SUID去掉后,steve用户虽然能够执行该程序,但由于/usr/bin/passwd/的SUID没有设置,这样exec后进程的EUID仍为steve的缘由。
也许有人会发现root用户却仍可使用该用命修改密码,那是由于root用户自己的EUID时就是root (也有可能只要发现是RUID是root就不检查EUID了,直接可读写,root就是老大嘛), 能够读取密码文件。
另外也许有人会发现普通的文件文件普通的文本文件会也能够设置SUID位, 但这是没有意义的,由于文本文件没有地方执行seteuid()的系统调用来改变当用用户的EUID。
最后,这里的对用户ID的规则一样也适用了组ID。
我的理解:uid是实际用户id,每一个文件都会有一个uid; 用户在登陆的过程当中,使用的是uid。用户在执行文件时,pID对应的uid就是用户的uid; euid是用户的有效id,在执行文件的时候,因为权限的问题,某个进程的uid须要‘变为’其余用户才能够执行,这时‘变身’后的用户id及就是euid。 在没有‘变身’的状况下,euid=uid. suid标示一个文件能够被另外一个文件使用‘变身’的策略使用它的权限 ,好比上面的/etc/passwd 文件,其余用户只有执行的权限,可是没有读取得权限,其余非root用户在执行的时候,因为文件设置了suid,则执行过程当中euid能够被更改成root,这样就能够访问了 。