Linux-各种UID

作者: Mr_Normal | 来源:发表于2018-03-30 23:26 被阅读0次

    一、UID

    UID是系统中用来表示用户的标识符,启动的进程的uid就是当前登录用户的uid,查看用户uid可使用id -u <username>命令

    需要注意的是,权限检查的时候是对euid检查,通常情况下进程的euid是和uid相同的。

    二、EUID

    euideffective user id ,有效用户ID。

    euid作用

    用于文件访问检查,euid和决定了进程是否有访问某个文件的能力。例如,编写下面代码:

    /* testeuid.c */
    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    
    int main(int argc, char * argv[])
    {
        if (argc != 2)
            return 0;
        printf("uid: %d\teuid: %d\n", getuid(), geteuid());
        printf("trying to open %s\n", argv[1]);
        int fd = open(argv[1], O_RDONLY);
        if (fd < 0)
            perror("open");
        else
            printf("success\n");
        return 0;
    }
    

    编译并运行

    euid.png

    上述执行过程中,将a.file拥有者改为root并修改访问权限为root只读后,我以eureka用户的身份无法访问该文件。

    三、SUID

    看APUE发现自己对suid不是特别了解,查资料之后明白了,记录如下。

    参考文章:

    what is suid

    上面链接中的文章说的很准确,SUID即(Set Owner User ID up on execution)

    在执行时设置为所有者ID,一个例子就是/usr/bin/passwd这个可执行文件。

    $ ls /usr/bin/passwd
    -rwsr-xr-x 1 root root 54256 May 17  2017 /usr/bin/passwd
    

    从上面passwd的属性可以看到,权限位中有个s,这就是suid。

    passwd这个命令是用来修改密码的,而密码文件是/etc/shadow,且查看密码文件的属性可以看到它的拥有者是root,root可读写,用户组可读的。

    /tmp $ ls -l /etc/shadow                                                            │
    -rw-r----- 1 root shadow 1711 Mar 30 17:00 /etc/shadow
    

    既然这个文件是root可读写,那非root用户修改密码要怎么办呢?

    这时候就要说的suid了,当非root用户调用passwd修改密码时,此时的euid将会变为passwd的拥有者用户,即root用户,这样就可以修改密码了。

    与其说suid是一个id,不如说它是文件的一个标志,它标志着这个可执行文件在执行时的euid将会被修改为它拥有者的uid。

    下面编程实验:

    /* testsuid.c */
    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    
    int main(void)
    {
        printf("uid: %d euid:%d", getuid(), geteuid());
    }
    

    编译后执行

    suid.png

    上面的chmod u+s是给文件加上usid标志,而从上面的结果可以看出进程的uid和euid是可以不同的。

    相关文章

      网友评论

        本文标题:Linux-各种UID

        本文链接:https://www.haomeiwen.com/subject/okpwcftx.html