实际用户ID,有效用户ID和设置用户ID

摘自http://blog.csdn.net/guosha/article/details/2679334

实际用户ID,有效用户ID和设置用户ID

看UNIX相关的书时经常能遇到这几个概念,但一直没有好好去理清这几个概念,以致对这几个概念一直一知半解。今天好好区分了一下这几个概念并总结如下。说白了这几个UID引出都是为了系统的权限管理。

下面分别用RUID, EUID,SUID来表示实际用户ID,有效用户ID,设置用户ID。另外用户ID是个整型数,为了说明方便真接使用了用户名来代表不同的UID。先解释一下这几个ID的作用:

RUID, 用于在系统中标识一个用户是谁,当用户使用用户名和密码成功登录后一个UNIX系统后就唯一确定了他的RUID.

EUID, 用于系统决定用户对系统资源的访问权限,通常情况下等于RUID。

SUID,用于对外权限的开放。跟RUID及EUID是用一个用户绑定不同,它是跟文件而不是跟用户绑定。

说明SUID的时候很多书都简略的提了一下passwd这个程序,下面就拿这个例子来分析。我们知道linux系统的密码都存在了/etc/shadow这个文件里。这个文件是如此的重要,在做任何修改之前最好先备份一下。查看/etc/shadow文件的属性如下:

[[email protected] ~]# ll /etc/shadow

-r-------- 1 root root 1144 Jul 20 22:33 /etc/shadow

从上可以看出/etc/shadow文件是一个属于root用户及root组的文件,并且只有EUID为root的用户具有读的权限,其它所有EUID都没有任何权限。当你在steve用户(EUID此时也为steve)的shell下试图用vim打开这个文件时会提示权限不允许。至于连root用户也只有读的权限我猜是为了不鼓励root用户使用vim类的编辑器去直接修改它,而要采用passwd命令来修改这个文件。如果你非要直接修改它,那么你可以使用chmod命令修改为属性为root可写,然后就可以修改了。

用过UNIX系统的人都知道,任何一个用户都可以使用passwd这个命令来得新设定自己的密码。但从上面已经知道,非root用记是无法读这个文件的,那么普通用户是如何做到修改这个文件的呢?我们知道passwd这个命令实际执行的程序是/usr/bin/passwd, 查看这个文件属性如下:

-r-s--x--x 1 root root 21944 Feb 12  2006 /usr/bin/passwd;

对应文件存取标志的s位就是通常说的SUID位,另外可以看到所有用户都有执行的这个程序权力。当steve用户执行passwd命令的时候。Shell会fork出一个子进程,此时进程的EUID还是steve,然后exec程序/usr/bin/passwd。exec会根据/usr/bin/passwd的SUID位会把进程的EUID设成root,   此时这个进程都获得了root权限, 得到了读写/etc/shadow文件的权限, 从而steve用户可完成密码的修改。 exec退出后会恢复steve用户的EUID为steve.这样就不会使steve用户一直拥有root权限。

我们可以测试一下,用root用户把/usr/bin/passwd的SUID位去掉,如下:

[[email protected] ~]# ll /usr/bin/passwd

-r-s--x--x 1 root root 21944 Feb 12  2006 /usr/bin/passwd

[[email protected] ~]# chmod u-s /usr/bin/passwd

[[email protected] ~]# ll /usr/bin/passwd

-r-x--x--x 1 root root 21944 Feb 12  2006 /usr/bin/passwd

然后steve用户用命令passwd去更新密码会提示如下错误:

[[email protected] ~]$ passwd

Changing password for user steve.

Changing password for steve

(current) UNIX password:

passwd: Authentication token manipulation error

[[email protected] ~]$

这就是因为/usr/bin/passwd程序的SUID去掉后,steve用户虽然可以执行该程序,但因为/usr/bin/passwd/的SUID没有设置,这样exec后进程的EUID仍为steve的原因。

也许有人会发现root用户却仍可以使用该用命修改密码,那是因为root用户本身的EUID时就是root (也有可能只要发现是RUID是root就不检查EUID了,直接可读写,root就是老大嘛), 可以读取密码文件。

另外也许有人会发现普通的文件文件普通的文本文件会也可以设置SUID位, 但这是没有意义的,因为文件文件没有地方执行seteuid()的系统调用来改变当用用户的EUID。

最后,这里的对用户ID的规则同样也适用了组ID。

时间: 2024-08-26 06:17:27

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

设置用户ID和设置组ID

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

【转】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        (用于文件访

UNIX文件的权限之“设置用户ID位”

用stat函数可以获取一个文件的状态信息,原型是这样的: int stat(const char *path, struct stat *buf); 其中结构体stat的结构: struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of h

实际用户ID,有效用户ID,保存的设置用户ID

Unix中常见的几个概念,下面做一个解释. 首先需要明确一点,这几个概念都是和进程相关的. real user ID表示的是实际上进程的执行者是谁,effective user ID主要用于校验该进程在执行时所获得的文件访问权限,也就是说当进程访问 文件时检查权限时实际上检查的该进程的"effective user ID",saved set-user-ID 仅在effective user ID发生改变时保存. 一般情况下,real user ID就是进程的effective use

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

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

proftp设置用户空间不许其它用户查看等权限设定

1.建立用户和组,设置用户文件夹: sudo groupadd ftpusers sudo useradd -d /www/server/long -g ftpusers -s /sbin/nologin long # 建立用户和用户所使用的目录. sudo passwd long # 设定用户密码. sudo mkdir /www/server/long # 建立用户目录,没有目录,用户也无法访问. sudo chmod  -rxw longg sudo chmod  u=rwx long #

linux和windows互传文件/用户配置文件和密码配置文件/用户组管理/用户管理

2.27linux和windows互传文件 3.1 用户配置文件和密码配置文件 3.2 用户组管理 3.3 用户管理 linux和windows互传文件 显示日期date [[email protected]_1 ~]# date 2017年 11月 21日 星期二 08:38:25 CST 显示系统语言 [[email protected]_1 ~]# echo $LANG zh_CN.UTF-8 [[email protected]_1 ~]# stat 1.txt.bak 文件:"1.tx

Linux实际用户(组)ID,有效用户(组)ID,设置用户(组)ID

实际用户(组)ID: 标识用户是谁,这两个字段在登录时取自口令文件中的登录项. 有效用户(组)ID: 决定了对文件的访问权限,通常有效用户(组)ID等于实际用户(组)ID,谁运行有效ID就等于谁的实际ID,与文件的所有者无关. 如果设置了设置用户(组)ID位,那么有效用户(组)ID则等于文件的所有者(组)ID,这时有效ID与文件所有者ID有关了. 例如: /usr/bin/password,该程序需要写口令文件,但是口令文件只有超级用户才具有写权限,所以需要设置设置用户ID位, 那么当普通用户执

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

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

Oracle RAC中su: ​无法设置用户ID: 资源暂时不可用

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