主要参考:
Linux进程的实际用户ID和有效用户ID
实际用户和有效用户
无死角理解保存设置用户ID,设置用户ID位,有效用户ID,实际用户ID
一. 概念
在Unix进程中涉及多个用户ID和用户组ID,包括如下:
- 实际用户ID和实际用户组ID:标识我是谁。也就是登录用户的uid和gid,比如我的Linux以simon登录,在Linux运行的所有的命令的实际用户ID都是simon的uid,实际用户组ID都是simon的gid(可以用id命令查看)。
- 有效用户ID和有效用户组ID:进程用来决定我们对资源的访问权限。一般情况下,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID。当设置-用户-ID(SUID)位设置,则有效用户ID等于文件的所有者的uid,而不是实际用户ID;同样,如果设置了设置-用户组-ID(SGID)位,则有效用户组ID等于文件所有者的gid,而不是实际用户组ID。
以上来自:APUE(《高级UNIX环境编程》)
Unix系统通过进程的有效用户ID和有效用户组ID来决定进程对系统资源的访问权限。
用简单的话来说,实际用户是你的身份证号,临时用户是你的学号,你登录系统时的用户就是实际用户,当你以有效用户执行某程序时,执行期间的用户为有效用户,也就是说你在读大学的时候你的学号就是你的有效用户,你获取了有效用户的所有权限,也就是说你在大学中获得了学生的所有权限。
二. 修改密码的例子
从无死角理解保存设置用户ID,设置用户ID位,有效用户ID,实际用户ID中密码修改的例子再来详细理解一下:
*我们知道用户的密码都是存放在/etc/shadow文件下,我们看下这个文件的权限
root@debian:~# ls -l /etc/shadow
-rw-r—– 1 root shadow 8013 Sep 8 14:58 /etc/shadow
假如我是一个普通用户,显然我是可以修改我的密码的,通过passwd命令,无可厚非。自己修改自己的密码肯定是被允许的。
但是仔细想想你会发现不对啊,我作为一个普通用户登录后,我的实际用户ID和有效用户ID都是我自己的UID。从上面可以看出,显然我不具有修改/etc/shadow文件的权限,那我执行passwd命令时怎么改我的密码的呢?
在上面1,基本概念中我们知道决定我们权限的是执行操作时的有效用户ID,所有我们在执行passwd命令时,我们的有效用户ID肯定被修改了。OK,我们看下面:
root@debian:~# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 43280 Feb 16 2011 /usr/bin/passwd
我们看到了一个s,对的,它就是我们的保存设置用户ID位,上面我们说过这个位的作用就是修改有效用户ID,那我们来看看他是如何修改执行passwd命令时的有效用户ID的。
首先我们看下命令执行的过程,当普通用户执行passwd命令时,shell会fork出一个子进程,此时进程有效用户ID还是普通用户ID,然后exec程序执行/usr/bin/passwd。通过上面的表我们会知道,exec发现