04.04-07 设置用户 id 和设置组 id

进程有哪些用户或组 id?

和一个进程关联的 id 有 6 个或者更多:

  • 实际用户 id 和实际组 id
  • 有效用户 id、有效组 id 和附属组 id
  • 保存的设置用户 id 和保存的设置组 id(由 exec 函数保存)

有效用户(组)决定实际访问权限

什么是有效用户 id?

一个进程在启动时可以以别人的身份启动,从而拥有别人的权限,这个时候真正生效的是有效用户 id。有效组 id 也是类似的。

什么时候需要用别人的身份启动?

passwd 程序就是不需要 root 权限的,但是能够修改 root 才能写入的文件,这是因为 passwd 程序就使用了 root 作为有效用户。其他例子包括:mountunmountsuwall,前三个是设置用户 ID,最后一个是设置组 ID,其作用是向 tty 下辖的所有终端写入一条信息。

如何按文件设置有效用户 id?

可以在文件的模式字(st_mode)中设置特殊标志,用来表示执行此文件时,将进程的有效用户 id 设置为文件所有者的用户 id,这个特殊标志就是设置用户 id 位。同样,还有设置组 id 位

accessfaccessat 函数可以测试用户访问权限

access 函数可以测试实际用户的访问权限。faccess 函数的功能更多,还能设置相对目录的 fd 或者测试有效用户的访问权限。

既然决定进程是否真正具有访问权限的是有效用户 id,我们为什么还需要判断实际用户的访问权限?比如,有些程序是用 root 的身份进行的,但是我们在程序执行过程中想要判断进程所属的用户是否真正拥有访问权限。