实际用户ID,有效用户ID,保存的设置用户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中都有涉及.

时间: 2024-10-10 02:52:38

实际用户ID,有效用户ID,保存的设置用户ID的相关文章

[转载]unix环境高级编程备忘:理解保存的设置用户ID,设置用户ID位,有效用户ID,实际用户ID

转载自http://www.cnblogs.com/stemon/p/5287631.html 一.基本概念 实际用户ID(RUID):用于标识一个系统中用户是谁,一般是在登录之后,就被唯一的确定,就是登录的用户的uid. 有效用户ID(EUID):用于系统决定用户对系统资源的权限,也就是说当用户做任何一个操作时,最终看它有没有权限,都是在判断有效用户ID是否有权限.如果有,则ok,否则报错不能执行.在正常的情况下,一个用户登录之后(假设是A用户),A用户的有效用户ID和实际用户ID是相同的,但

linux系统学习笔记:无死角理解保存的设置用户ID,设置用户ID位,有效用户ID,实际用户ID

一.基本概念 实际用户ID(RUID):用于标识一个系统中用户是谁,一般是在登录之后,就被唯一的确定,就是登录的用户的uid. 有效用户ID(EUID):用于系统决定用户对系统资源的权限,也就是说当用户做任何一个操作时,最终看它有没有权限,都是在判断有效用户ID是否有权限.如果有,则ok,否则报错不能执行.在正常的情况下,一个用户登录之后(假设是A用户),A用户的有效用户ID和实际用户ID是相同的,但是如果A用户在某些场景中想要执行一些特权操作,能顺利的执行吗?上面说到了用户的任务操作,linu

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

[转]转自 linux 设置用户id 设置组id 最近看apue,简单记录对设置用户id理解(设置组id同理). 1. 相关的id好像很多,共有哪些? 文件2个id 2个位: 拥有者id             拥有者组id 设置用户id位         设置组id位 进程6个或更多的id(如果有附加组id): 实际用户id             实际组id       (仅仅标志我们是谁,不参与文件访问权限检测) 有效用户id             有效组id        (用于文件访

无死角理解保存设置用户ID,设置用户ID位,有效用户ID,实际用户ID

最近在理解保存设置用户ID时,遇到一些问题,但是发现网上都没能把这个问题说清楚,通过自己的思考和查找资料,终于明白了,现在分享在这里共大家交流学习,如果有不正确的地方,欢迎指正 1,基本概念: 实际用户ID(RUID):用于标识一个系统中用户是谁,一般是在登录之后,就被唯一确定的,就是登陆的用户的uid 有效用户ID(EUID):用于系统决定用户对系统资源的权限.也就是说当用户做任何一个操作时,最终看它有没有权限,都是在判断有效用户ID是否有权限,如果有,则OK,否则报错不能执行.在正常情况下,

设置用户ID和设置组ID

与一个进程关联的ID有6个或更多,如下图所示: 与每个进程相关联的用户ID和组ID 实际用户ID 实际组ID 我们实际是谁 有效用户ID 有效组ID 附加组ID 用于文件访问权限检索 保存的设置用户ID 保存的设置组ID 由exec函数保存 实际用户ID和实际组ID标识我们究竟是谁,这两个字段在登录时取自口令文件中的登录项.通常,在一个登录会话间这些值并不改变,但是超级用户进程有方法改变它们. 有效用户ID,有效组ID以及附加组ID决定了我们的文件访问权限. 保存的设置的用户ID和保存的设置组I

APUE学习笔记——8.11 实际用户ID、有效用户ID、设置用户ID

用户ID的基本概念 在Unix系统中,很多操作涉及到权限问题,这些权限涉及到用户ID和组ID的概念. 组ID和用户ID的原理和相关内容是类似的.下面介绍用户ID. 我们常见见到三种关于用户ID的概念. 实际用户ID:real user ID      (RUID) 有效用户ID:effective user ID    (EUID) 设置用户ID:saved set-user ID    (SUID) 这三个ID实际上都是针对进程而言的. 实际用户ID 标识进程的执行者.可以看做是我们登录的ID

crm SDK 设置用户的上级

/// <summary> /// 设置用户的上级 /// </summary> /// <param name="service">服务</param> /// <param name="userId">用户</param> /// <param name="parentId">上级</param> public void SetUserParent

crm设置用户上级和业务部门

/// <summary> /// 删除用户的上级 /// </summary> public void RemoveParent(IOrganizationService service,Guid userId) { RemoveParentRequest removeRequest = new RemoveParentRequest(); removeRequest.Target = new EntityReference() { LogicalName = "sys

Oracle RAC中su: &#8203;无法设置用户ID: 资源暂时不可用

su: 无法设置用户ID: 资源暂时不可用 问题现象: 问题原因: 问题是出在:在/etc/security/limits.d目录下,rhel6和centos6下面多了个文件:90-nproc.config,以保证root用户无限制.此配置会覆盖主配置文件的设定.内容如下: 解决方法: 删除/etc/security/limits.d/90-nproc.conf 文件中1024那一行,或者将1024值改大,保存退出,立即生效!