linux进程的用户ID,有效ID,保存的设置ID

来源:互联网 发布:人民币汇率波动率数据 编辑:程序博客网 时间:2024/06/05 16:53
    一个系统启动后,用户login登录后,会产生一个用户进程,该进程和其它进程一样有7个id值:实际用户id,有效用户id,保存的设置ID(set-user-id),实际组id,有效组id,添加组id以及保存的设置组ID。这里只说uid,这三个id都来自登录名。至此我们有了一个用户shell进程,当执行程序时,通常由fork+exec函数来做。由用户进程fork出来的子进程将继承父进程的uid和euid。子进程再调用exec(),这时,若程序的设置ID位没有被置位,那么这个子进程的uid和euid保持不变,而保存的设置ID从euid复制。如果程序的设置ID位被置位了,那么子进程的实际uid保持不变,euid设置为程序文件的uid,保存的设置ID从euid复制。程序的设置ID位只能由所有者去置位,特权用户可以置位所有的程序。  

    下面以apue上的例子access.c来说明一下设置ID位的作用。

#include    <sys/types.h>
#include    <fcntl.h>
#include    "ourhdr.h"int
main(int argc, char *argv[])
{
    if (argc != 2)
      err_quit("usage: a.out <pathname>");   

 

    if (access(argv[1], R_OK) < 0)
      err_ret("access error for %s", argv[1]);
    else
      printf("read access OK/n");   

 

    if (open(argv[1], O_RDONLY) < 0)
      err_ret("open error for %s", argv[1]);
    else
      printf("open for reading OK/n");    exit(0);
}  

 

    假定该源文件是以renshui身份创建的。那么我们执行程序后,进程的
    uid=renshui
    euid=renshui
    set-user-id=renshui  

    如果我们为程序传入的参数是该源文件access.c,则access函数可以读该文件,因为进程的uid等于文件的所有者id;open函数也可以读该文件,因为进程的euid等于文件的所有者id。如果我们为程序传入的参数是 /etc/shadow,该文件的mode为

    -r-------- 1 root root 1325 03-16 18:29 /etc/shadow  

    也就是说只有root可以去读。我们用普通登录名去执行access程序,则无论是access还是open都无法读该/etc/shadow文件。我们切换到超级用户  

    $ su  成为超级用户
  # chown root access 将文件用户id改为root
  # chmod u+s access打开set-user-id
  # exit恢复为正常用户  

    我们再去执行access去访问/etc/shadow,则该进程的  

    uid=renshui
  euid=root
  set-user-id=root  

    用access尝试去读仍然不可以,因为内核是以进程的uid执行访问权限测试的。用open去读就可以了,因为内核是以进程的euid执行访问权限测试的,这时euid等于/etc/shadow的所有者root。

原创粉丝点击