• UID、EUID、GID和EGID


    UID、EUID、GID和EGID

    Linux中id真是太多了进程有pid,然后用户还有UID这种,真是有点绕。

    在Linux当中一个进程(程序)拥有四个ID:真实用户UID、有效用户EUID、真实组GID和有效组EGID

    这里以真实用户UID和有效用户EUID为例,真实组GID和有效组EGID道理是相同的。

    EUID存在的目的是方便资源访问:它使得运行程序的用户拥有该程序的有效用户的权限(太过官方这种说法感觉)。EUID确定进程对某些资源和文件的访问权限。在大多数情况下,进程的UIDEUID是一样的,但是对于一些程序如supasswd这种set-user-id程序,它们有可能是不相同的。对于set-user-id程序而言,程序的EUID会变成程序的所有者UID,也就是说程序执行时,是以程序的所有者身份进行运行的。

    passwd为例。passwd允许用户修改自己的登录密码,这个程序的所有者rootpasswd权限中有s,表明这是一个set-user-id程序。passwd命令需要修改/etc/shadow文件,对于/etc/shadow文件,普通用户是不可写(只有读权限)的,那么用户怎么能够通过passwd修改自己的密码呢,set-user-id程序的标志s就起到了作用,它在程序运行时将EUID会变成程序的所有者UID,那么程序有效的用户就会变成程序的所有者,在这里是root用户,理所当然的可以进行/etc/shadow文件的修改。

    image-20220819104851240

    再比如su程序允许任何用户都可以使用它来修改自己的账户信息,但修改账户时程序不得不访问文件/etc/passwd文件,而访问该文件是需要root权限的。那么以普通用户身份启动的su程序如何能访问/etc/passwd文件呢?

    image-20220819130924743

    su程序的所有者是root,并且它被设置了set-user-id标志。和上面passwd一样,set-user-id标志表示任何普通用户运行su程序时,其有效用户就是该程序的所有者root

    获取和设置真实用户UID、有效用户EUID、真实组GID和有效组EGID的函数如下

    #include 
    #include 
    
    uid_t getuid(void);
    uid_t geteuid(void);
    gid_t getgid(void);
    gid_t getegid(void);
    int setuid(uid_t uid);
    int seteuid(uid_t euid);
    int setgid(gid_t gid);
    int setegid(gid_t egid);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    为了测试上面所说,我们先创建一个普通用户bugcat,目前已经有普通用户ubuntu

    可以看到bugcat的uid是1002

    image-20220819140826977

    我们写下读取程序uideuid的代码如下:

    #include 
    #include 
    
    int main()
    {
        uid_t uid = getuid();
        uid_t euid = geteuid();
        printf( "userid is %d, effective userid is: %d\n", uid, euid );
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    将其编译一下,然后查看查看文件属性,再运行程序,可以看到uideuid输出相同,表示真实用户有效用户都是ubuntu

    image-20220819141010532

    接着再将程序的所有者改为root,再加上s权限,再运行程序,可以看到uideuid输出不相同,表示真实用户ubuntu有效用户root(符合set-user-id程序特点)

    image-20220819141209028

    然后将程序的所有者改为bugcat(s权限不知道为啥自动取消了),再加上s权限,再运行程序,可以看到uideuid输出不相同,表示真实用户ubuntu有效用户bugcat

    image-20220819141405860

    最后我们去掉s权限,运行程序,可以看到uideuid输出相同,表示真实用户有效用户都是ubuntu,也从反面说明s权限的作用。

    image-20220819142209993

  • 相关阅读:
    轻松使用androidstudio交叉编译libredwg库
    关于git版本控制在IDEA中的使用
    聊聊powerjob的执行机器地址
    已经是项目经理了,还有必要考PMP吗?
    OOD Object Oriented Design 面向对象设计 01
    Moonbeam:由开发者制作,为开发者而生
    异步FIFO中格雷码的SDC约束
    Win10怎么禁止自动安装软件
    JavaWeb-WEB请求过程
    进阶笔录-深入理解Java线程之Synchronized
  • 原文地址:https://blog.csdn.net/qq_41474648/article/details/126455613