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

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

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

  1. #include <unistd.h>
  2. int setuid( uid_t uid );
  3. int setgid( gid_t gid );
  4. 两个函数返回值:若成功则返回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的不同方法

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

 

1、setreuid和setregid函数

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

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

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

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

2、seteuid和setegid函数

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

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

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

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

3、组ID

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

 

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

进程控制之更改用户ID和组ID的更多相关文章

  1. 《UNIX环境高级编程》笔记--更改用户ID和组ID

    在unix系统中,特权是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己 用户ID或组ID,使的新ID具有合适的特权或访问权限.与此类似,当程序需要降低其特 ...

  2. 更改用户id 和组id

    转自 http://blog.csdn.net/todd911/article/details/16370577 在unix系统中,特权是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许 ...

  3. 【转】linux 设置用户id 设置组id

    linux 设置用户id 设置组id   转自 linux 设置用户id 设置组id   最近看apue,简单记录对设置用户id理解(设置组id同理). 1. 相关的id好像很多,共有哪些? 文件2个 ...

  4. 获取和设置用户id以及组id

    #include<unistd.h> uid_t getuid(void); uid_t geteuid(void);//获取有效用户id gid_t getgid(void); gid_ ...

  5. 用户id,组id和文件访问权限

    实际用户ID和实际组ID:标示了我们究竟是谁,这两个字段在登录时取自口令文件中的登录项 有效用户ID和有效组ID以及附属组ID:决定了我们的文件的访问权限(通常有效用户ID等于实际用户ID,有效组ID ...

  6. Linux id 命令 - 显示用户id和组id信息

    要登入一台计算机,我们需要一个用户名.用户名是一个可以被计算机识别的身份.基于此,计算机会对使用这个用户名的登陆的人应用一系列的规则.在Linux系统下,我们可以使用 id 命令. 什么是 id 命令 ...

  7. 文件模式设置用户ID/设置组ID/sticky bit_转

    S_ISUID  (04000)  set-user-ID (set process effective user ID on execve(2))S_ISGID  (02000)  set-grou ...

  8. linux修改用户id,组id

    一.修改用户uid usermod -u foo 二.修改用户gid groupmod -g 2005 foo usermod -g 2005 foo 三.检查 cat /etc/passwd su ...

  9. 进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端

    摘要:本文主要介绍进程的基本属性,基本属性包含:进程ID.父进程ID.进程组ID.会话和控制终端. 进程基本属性 1.进程ID(PID) 函数定义:      #include <sys/typ ...

随机推荐

  1. bzoj3262

    三维裸的做法是一维排序,剩下树套树,可我好像还没写过树套树先说cdq分治吧,先对一维排序,相当于原来修改询问里的时间线在这上面分治.划分,计算前半部分对后半部分的影响,显然可以按第二维的顺序维护树状数 ...

  2. openlayer调用geoserver发布的地图实现地图的基本功能

    转自:http://starting.iteye.com/blog/1039809 主要实现的功能有放大,缩小,获取地图大小,平移,线路测量,面积测量,拉宽功能,显示标注,移除标注,画多边形获取经纬度 ...

  3. JAX-WS(JWS)发布WebService

    WebService历来都很受重视,特别是Java阵营,WebService框架和技术层出不穷.知名的XFile(新的如CXF).Axis1.Axis2等. 而Sun公司也不甘落后,从早期的JAX-R ...

  4. zookeeper实现分布锁

    分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那一层来挡.当大量的行锁.表锁.事务充斥着数据库的时候.一般web应用很多的瓶颈都在数据库上,这里给大家介绍的是减轻数据库锁负担的一种 ...

  5. 南阳理工OJ 15 括号匹配

    思路:动态规划,设dp[i][j]表示第i个字符到第j个字符所需要的最少匹配数,则:(1),如果从第i到j-1个字符中没有一个与第j个字符匹配,那么状态转移方程为 dp[i][j] = dp[i][j ...

  6. POJ 2570

    思路:floyd + 位运算.map[i][j]的二进制位前26位表示i到j路径里面字母a-z的存在情况,为1说明该字母存在,为0不存在. #include<iostream> #incl ...

  7. SQL Server查询性能优化——覆盖索引(一)

    覆盖索引又可以称为索引覆盖. 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一个方法,当能通过检索索引 ...

  8. Unity3d 巫师3Ciri的渲染

    --wolf96 16/10/6

  9. vim recording

    大家是否有这种经验,“不知道为什么按出recording状态,按ESC貌似无法直接退掉”的情况,个人已经有过好几次了.与其出来烦人还不如了解它,昨天我就花了点时间学习recording.怎么说,还是有 ...

  10. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程06:技能播放的逻辑关系》

    6.技能播放的逻辑关系 技能播放概述: 当完成对技能输入与检测之后,程序就该对输入在缓存器中的按键操作与程序读取的技能表信息进行匹配,根据匹配结果播放相应的连招技能. 技能播放原理: 按键缓存器中内容 ...