• 进程控制之更改用户ID和组ID


    在UNIX系统中,特权(例如能改变当前日期的表示法以及访问控制(例如,能否读、写一特定文件))是基于用户ID和组ID的。当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己的用户ID或组ID,使得新ID具有合适的特权或访问权限。与此类似,当程序需要降低其特权或阻止对某些资源的访问时,也需要更换用户ID或组ID,从而使新ID不具有相应特权或访问这些资源的能力。

    一般而言,在设计应用程序时,我们总是试图使用最小特权(least privilege)模型。依照此模型,我们的程序应当只具有为完成给定任务所需的最小特权。这减少了安全性受到损害的可能性。

    可以用setuid函数设置实际用户ID和有效用户ID。与此类似,可以用setgid函数设置实际组ID和有效组ID。

    #include <unistd.h>
    int setuid( uid_t uid );
    int setgid( gid_t gid );
    两个函数返回值:若成功则返回0,若出错则返回-1

    关于谁能更改ID有若干规则。现在先考虑有关改变用户ID的规则(关于用户ID所说明的一切都适用于组ID)。

    与进程关联的ID可参考:http://www.cnblogs.com/nufangrensheng/p/3501832.html

    (1)若进程具有超级用户特权,则setuid函数将实际用户ID、有效用户ID,以及保存的设置用户ID设置为uid。

    (2)若进程没有超级用户特权,但是uid等于实际用户ID或保存的设置用户ID,则setuid只将有效用户ID设置为uid。不改变实际用户ID和保存的设置用户ID

    (3)如果上面两个条件都不满足,则将errno设置为EPERM,并返回-1。

    关于内核所维护的三个用户ID,还要注意下列几点:

    (1)只有超级用户进程可以更改实际用户ID。

    (2)仅当对程序文件设置了设置用户ID位时,exec函数才会设置有效用户ID。如果设置用户ID位没有设置,则exec函数不会改变有效用户ID,而将其维持为原先值。任何时候都可以调用setuid,将有效用户ID设置为实际用户ID或保存的设置用户ID(也只会在这两个ID之间切换)。自然,不能将有效用户ID设置为任意随机值。

    (3)保存的设置用户ID是由exec复制有效用户ID得来的。如果设置了文件的设置用户ID位,则在exec根据文件的用户ID设置进程的有效用户ID以后,就将这个副本保存起来

    注意,http://www.cnblogs.com/nufangrensheng/p/3509352.html中所述的getuid和geteuid函数只能获得实际用户ID和有效用户ID的当前值。我们不能获得所保存的设置用户ID的当前值

                                                        表8-7 改变三个用户ID的不同方法

    20131117170853500

    从表8-7中可明确一点:无论设置用户ID位是关闭还是打开,保存的设置用户ID都是从有效用户ID复制得来的。

     

    1、setreuid和setregid函数

    功能是交换实际用户ID(组ID)和有效用户ID(组ID)的值。

    #include <unistd.h>
    int setreuid( uid_t ruid, uid_t euid );
    int setregid( gid_t rgid, gid_t egid );
    两个函数返回值:若成功则返回0,若出错则返回-1

    如若其中任一参数的值为-1,则表示相应的ID应当保持不变。

    相关规则很简单:一个非特权用户总能交换实际用户ID和有效用户ID。这就允许一个设置用户ID程序转换成只具有普通用户的普通权限,以后又可再次转换回设置用户ID所得到的额外权限。

    2、seteuid和setegid函数

    类似于setuid和setgid,但只更改有效用户ID和有效组ID。

    #include <unistd.h>
    int seteuid( uid_t uid );
    int setegid( gid_t gid );
    两个函数返回值:若成功则返回0,若出错则返回-1

    一个非特权用户可将其有效用户ID设置为其实际用户ID或其保存的设置用户ID。对于一个特权用户,则可将其有效用户ID设置为uid。(这有别于setuid函数,它会更改所有三个用户ID)。

    06205332-a6eec19b9b084c4abcb4c21318015a0e

                                                    图8-3 设置不同用户ID的各函数

    3、组ID

    关于用户ID所说明的一切都适用于组ID。附加组ID不受setgid、setregid或setegid函数的影响。

     

    本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

  • 相关阅读:
    (转)Java 调用 C++ (Java 调用 dll)
    用Gvim建立IDE编程环境 (Windows篇)
    (转)python调取C/C++的dll生成方法
    C/C++协程的实现方式总结
    时钟周期,机器周期,指令周期,总线周期
    (转)MongoDB和Redis区别
    linux cpu占用100%排查
    (转)linux 打开文件数 too many open files 解决方法
    Python下载网页图片
    python抓网页数据【ref:http://www.1point3acres.com/bbs/thread-83337-1-1.html】
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3511227.html
Copyright © 2020-2023  润新知