针对几个特殊的位,前几天与同事一起讨论,整理相关内容如下,以备复习之用。
实际用户ID(RUID):用于标识一个系统中的用户,一般是在登录之后,就被唯一确定的,就是登陆的用户的uid
有效用户ID(EUID):用于系统决定用户对系统资源的权限。也就是说当用户做任何一个操作时,最终看它有没有权限,都是在判断有效用户ID是否有权限,如果有,则OK,否则报错不能执行。在正常情况下,一个用户登录之后(我们假设是A用户),A用户的有效用户ID和实际用户ID是相同的,但是如果A用户在某些场景中想要执行一些特权操作,而上面我们说到用户的任何操作,LINUX内核都是通过检验有效用户ID来判断当前执行这个操作的用户是否具有权限,显然对于特权操作,普通用户A没有权限,所以A用户就只能通过一定的手段来修改当前的有效用户ID使其具有执行特权操作的权限。

设置用户ID位:用于对外的权限的开发,它的作用是我们如何去修改有效用户ID。

保存设置用户ID(SUID):是有效用户ID副本,既然有效用户ID是副本,那么它的作用肯定是为了以后恢复有效用户ID用的。

set-user-ID位

setuid程序的例子:passwd,我们以该例子讲解set-user-ID位。
我们知道用户的密码都是存放在/etc/passwd文件下,我们看下这个文件的权限
52coder@ubuntu:/root$ ls -l /etc/passwd
-rw-r--r-- 1 root root 2338 Mar 11 11:22 /etc/passwd
假如我是一个普通用户52coder,显然我是可以修改我的密码的,通过passwd命令。
但是仔细想想你会发现不对啊,我作为一个普通用户登录后,我的实际用户ID和有效用户ID都是我自己的UID。从上面可以看出,显然我不具有修改/etc/passwd文件的权限,那用户52coder是如何修改密码的呢?
我们知道决定我们权限的是执行操作时的有效用户ID,所有我们在执行passwd命令时,我们的有效用户ID肯定被修改了。
52coder@ubuntu:/root$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 May 17 2017 /usr/bin/passwd
我们看到了一个权限位为s,它就是我们的设置用户ID位即set-user-ID位,该位告诉内核,运行这个程序的时候认为是由文件所有者在运行这个程序,在这里就是root,而root有修改/etc/passwd的权限。那我们来看看他是如何修改执行passwd命令时的有效用户ID的。

首先我们看下命令执行的过程,当普通用户执行passwd命令时,shell会fork出一个子进程,此时进程有效用户ID还是普通用户ID,然后exec程序执行/usr/bin/passwd。exec发现/usr/bin/passwd有SUID位,于是会把进程的有效用户ID设成设置成文件所有者用户ID也就是root, 此时这个进程都获得了root权限, 从而普通用户可完成密码的修改。exec进程退出后会恢复普通用户的EUID为普通用户ID.这样就不会使普通用户一直拥有root权限。

set-group-ID位

第二个特殊属性是用来设置程序运行时所属的组,如果一个程序所属的组为g,而且他的set-group-ID位也被设置,那么程序运行的时候就好像它正被g组中的某一个用户运行一样。set-group-ID位给程序某一个组的访问权限。

sticky位

在UNIX尚未使用请求分页式技术的早期版本中,S_ISVTX位被称为黏着位(sticky bit).
从交换空间装载程序要比从普通的硬盘空间快,在非交换空间的硬盘上,程序可能被分成好几块分别存在多个地方,交换空间上的文件时不分块的。
sticky位告诉内核即使没有人在使用程序,也要把它放在交换空间中。现在,交换技术已经不像以前那么重要了,取而代之的是虚拟内存技术,虚拟内存使得可以以更小的单位,比如页进行交换。