real user ID:实际用户ID,指的是进程执行者是谁

effective user ID:有效用户ID,指进程执行时对文件的访问权限

saved set-user-ID:保存设置用户ID,作为effective user ID的副本,在执行exec调用时后能重新恢复原来的effectiv user ID.

上面这三个ID是相对于进程而言的.

set-user-ID:设置用户ID,这是相对于文件来说的.设置了set-user-ID位的可执行程序,执行时,进程的effective user ID与saved set-uesr-ID都为程序文件所属用户的ID,些时real user ID与effective user ID就不一定相等了.这类程序称之为SUID程序,这类程序有特殊的用途.典型的例子:passwd程序,ping程序等.

passwd程序是要修改用户密码,此时是要修改/etc/passwd或修改/etc/shadow文件(有必要时),然而一般用户没有修改这两个文件的权限.passwd程序设置了set-user-ID位的,并且该文件的所有都是root,所以,一般用户执行时,也具有了root的权限.

ping程序也如此,因为ping程序要产生原始套接字(raw),所以需要有root的权限.然而一般用户之所以能用ping程序,就是因为ping程序的所有都是root用户,并且它设置了set-user-ID位.

为一可执行程序设置set-user-ID位:

pds@FSSR:~> su root
口令:
FSSR:/home/pds # chown root suid
FSSR:/home/pds # ll suid
-rwxr-xr-x 1 root users 7702 2008-08-10 11:28 suid
FSSR:/home/pds # chmod u+s suid
FSSR:/home/pds # ll suid
-rwsr-xr-x 1 root users 7702 2008-08-10 11:28 suid
FSSR:/home/pds # exit
exit

 

相对的,没有设置set-user-ID位的可执行程序,称之为非SUID程序,该程序执行时,real user ID与effective user ID相等.

setuid可以修改real user ID,effective user ID和saved set-user-ID这三个值,但是要用权限.

这是函数原型:

int setuid(uid_t uid)

1.如果用户(当前调用的用户)有超级用户权限,则real user ID,effective user ID和saved set-user-ID都将设置为参数uid的值.

2.如果用户没有超级用户权限,仅当参数uid等于real user ID或saved set-user-ID时,effective user ID被设置为参数uid的值,real user ID和saved set-user-ID不变;否则返回错误.

这是自己按自己的理解总结的 ^_^

 

Unix中常见的几个概念,下面做一个解释.

首先需要明确一点,这几个概念都是和进程相关的.
real user ID表示的是实际上进程的执行者是谁,effective user ID主要用于校验该进程在执行时所获得的文件访问权限,也就是说当进程访问

文件时检查权限时实际上检查的该进程的"effective user ID",saved set-user-ID 仅在effective user ID发生改变时保存.

一般情况下,real user ID就是进程的effective user ID,但是当要运行的可执行程序设置了"set-user-ID"位之后,进程的effective user ID

变成该文件的属主用户id,同时该进程的"saved set-user-ID"变成此时进程的"effective user ID",也就是该可执行程序的属主用户ID,该进程

在执行一些与文件访问权限相关的操作时系统检查的是进程的effective user ID.

为什么需要一个"saved set-user-ID"?因为当进程没有超级用户权限的时候,进程在设置"effective user ID"时需要将需要设置的ID和该进程

的"real user ID"或者"saved set-user-ID"进行比较.

APUE2中进行的解释是:
1)If the process has superuser privileges, the setuid function sets the real user ID, effective user ID, and saved set-user-

ID to uid.

2)If the process does not have superuser privileges, but uid equals either the real user ID or the saved set-user-ID, setuid

sets only the effective user ID to uid. The real user ID and the saved set-user-ID are not changed.

3)If neither of these two conditions is true, errno is set to EPERM, and 1 is returned
也就是说:
1)当用户具有超级用户权限的时候,setuid 函数设置的id对三者都起效.
2)否则,仅当该id为real user ID 或者saved set-user-ID时,该id对effective user ID起效.
3)否则,setuid函数调用失败.

也就是说,这个saved set-user-ID更多的作用是在进程切换自己的effective user ID起作用.

需要特别提醒的是:并没有任何的API可以获取到进程的saved set-user-ID,它仅仅是系统在调用setuid函数时进行比较而起作用的.
APUE2中关于此事的原话如下:
Note that we can obtain only the current value of the real user ID and the effective user ID with the functions getuid and

geteuid from Section 8.2. We can't obtain the current value of the saved set-user-ID.


举一个例子说明问题,假设这样的一种情况,系统中有两个用户A,B,还有一个由B创建的可执行程序proc,该可执行程序的set-
user-id位已经进行了设置.

当A用户执行程序proc时,
程序的real user ID = A的用户ID,effective user ID = B的用户ID,  saved set-user-ID=B的用户ID.

假如在该进程结束了对某些限制只能由用户B访问的文件操作后,程序将effective user ID设置回A,也就是说此时:
程序的real user ID = A的用户ID,effective user ID = A的用户ID,  saved set-user-ID=B的用户ID.

这个改动之所以能成功,原因在于上面列举出的情况2):该ID为进程的real user ID.

最后,假设由于种种原因进程需要再次切换effective user ID为B,可是因为不能通过API获取进程的saved set-user-ID(该值为B的用户ID),所

以只能通过两种途径获得(可能还有别的途径):
a)在设置effective user ID变回A之前保存effective user ID,它的值为B的用户ID.
b)调用函数getpwnam( "B"),在返回的struct passwd *指针中成员pw_uid存放的就是用户B的ID.
这样,这个调用setuid(B的用户ID)就会成功,原因也在于上面说的情况2):该ID与进程的saved set-user-ID相同.

APUE2中关于这几个值的相关解释在section4.4和section8.11中都有涉及.

实际用户ID,有效用户ID与保存设置用户ID相关推荐

  1. 微信用户全局唯一标识_分布式系统的唯一ID生成算法对比

    在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 那么如何实现全局唯一id呢?有以下几种方案. (1)方案一:独立数据库自增id 这个方案就是说你的系统每次要生成一个id,都是往一个独立库 ...

  2. APUE学习之三个特殊位 设置用户ID(set-user-ID),设置组ID(set-group-ID),sticky...

    设置用户ID(set-user-ID),设置组ID(set-group-ID),sticky set-user-ID: SUID 当文件的该位有设置时,表示当该文件被执行时,程序具有文件所有者的权限而 ...

  3. 设备描述符请求失败_如果用户发出过多请求 苹果将取消Apple ID帐户恢复

    出于安全原因,恢复丢失的苹果ID帐户可能需要几天时间,但如果用户希望顺利恢复,则该避免采取一些行动.任何人都可能忘记他们的Apple ID密码,因此该公司必须为用户提供一种方法,让用户在他们忘记密码的 ...

  4. java抖音获取用户信息失败_为什么抖音用id搜不到用户?抖音用id搜不到用户的原因与解决方法...

    在抖音短视频上,网友可以通过抖音id来搜索指定的抖音用户,并添加为好友,不过,这几天,不断有网友反映一个问题,那就是:抖音用id搜不到用户,那么,为什么抖音用id搜不到用户?今天,小编就为大家介绍一下 ...

  5. 我们发现您的应用在用户同意隐私政策前申请获取用户个人信息(IMEI, 设备ID, 用户应用安装列表, MAC地址用户数据)

    一.需求 解决应用上架问题 过度获取用户信息 我们发现您的应用在用户同意隐私政策前申请获取用户个人信息(IMEI, 设备ID, 用户应用安装列表, MAC地址用户数据) 自"滴滴" ...

  6. hdfs 创建用户和用户组_hadoop四:linux用户和组命令

    保存帐户信息的目录: /etc/passwd 保存帐户密码信息的目录:/etc/shadow 保存组用户信息的目录:/etc/group 保存组用户密码信息的目录:/etc/gshadow 一.用户相 ...

  7. 家用电器用户行为分析与事件识别_用户行为分析埋点实时数仓实践

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多惊喜 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 大数据真好玩点击右侧关注,大数据真好玩! ...

  8. linux中 用户管理命令,Linux中的常用用户和用户组管理命令

    who:查看当前服务器所有正在登陆中的用户,显示tty表示本地登录,pts表示远程终端.这个命名只能显示简单的登录信息,如果想要查看更为详细的登录信息,使用w命令. w命令除了显示who命令的内容外, ...

  9. mysql切换用户命令_linux基础04:linux用户相关的命令有哪些?怎样切换用户?

    通过前面的几节课,我们在windows系统中安装好了linux虚拟机,也通过xshell远程终端连接上了linux虚拟.从今天开始,我们就可以正式开始学习linux的知识了.今天,我们主要介绍的是用户 ...

最新文章

  1. SpringCloud Alibaba微服务实战(七) - 路由网关(Gateway)全局过滤
  2. PL/SQL中的数据类型隐式转换规则
  3. python gevent
  4. Delphi十进制和十六进制互转 Delphi 自带函数 IntToHex
  5. 引用变量和指针变量初探
  6. 信息学奥赛一本通(1255:迷宫问题)
  7. npm 有用的一些全局包
  8. hdu1596-find the safest road
  9. cve-2020-0796_微软SMBv3 Client/Server远程代码执行漏洞简单分析(CVE20200796)
  10. 抖音怎样做伪原创视频 抖音短视频去水印之后怎么保存
  11. CTFshow 愚人节欢乐赛 部分WP
  12. linux下实现文件双向同步 unsion,unison做数据双向同步
  13. 实现12306全自动下单功能(Python+PyCharm附:主要代码)
  14. Promise和事件循环
  15. C++ windows下判断鼠标点击及获取像素点
  16. Linux下删除文件时出现rm: cannot remove ‘***/.user.ini’: Operation not permitted
  17. [java]已知文件 source.txt 中的内容如下,其中,username、yonghu 都表示用户名,password、mima都表示密码,level、dengji都表示等级
  18. docker 入门 —— docker 镜像命令
  19. 信息物理系统-Rijndael加密算法的实现
  20. Win 10 IME禁用

热门文章

  1. 傻瓜式操作Nagios图解
  2. python -- numpy 基本数据类型,算术运算,组合,分割 函数
  3. (二)nimlang web开发 hello world jester
  4. 像写SQL一样编写Java数据应用-TinySqlDsl
  5. C++下的DLL编程入门
  6. 魅族建立基于M8的Android开源项目
  7. 介绍27款经典的CSS框架
  8. 发布Web应用程序时发生的“xx.aspx.cs文件不存在”错误
  9. 【设计模式】前端控制器模式
  10. Linux常见面试题2