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

最近在理解保存设置用户ID时,遇到一些问题,但是发现网上都没能把这个问题说清楚,通过自己的思考和查找资料,终于明白了,现在分享在这里共大家交流学习,如果有不正确的地方,欢迎指正

1,基本概念:

实际用户ID(RUID):用于标识一个系统中用户是谁,一般是在登录之后,就被唯一确定的,就是登陆的用户的uid

有效用户ID(EUID):用于系统决定用户对系统资源的权限。也就是说当用户做任何一个操作时,最终看它有没有权限,都是在判断有效用户ID是否有权限,如果有,则OK,否则报错不能执行。在正常情况下,一个用户登录之后(我们假设是A用户),A用户的有效用户ID和实际用户ID是相同的,但是如果A用户在某些场景中想要执行一些特权操作,而上面我们说到用户的任何操作,LINUX内核都是通过检验有效用户ID来判断当前执行这个操作的用户是否具有权限,显然是特权操作,A用户没有权限,所以A用户就只能通过一定的手段来修改当前的有效用户ID使其具有执行特权操作的权限。这里说明了下面为什么我们需要修改有效用户ID,就是想再某一时刻能够执行一些特权操作。下面在举例说明。

设置用户ID位:用于对外的权限的开发,它的作用是我们如何去修改有效用户ID,在后面的例子中在展开。

保存设置用户ID(SUID):是有效用户ID副本,既然有效用户ID是副本,那么它的作用肯定是为了以后恢复有效用户ID用的。

2,改变三个用户ID的方法

下面这幅图给出了改变实际用户ID,有效用户ID和保存设置用户ID的方法

3,实例1,如何在权限不够的情况下执行特权权限,也就是更改我们的有效用户ID。

我们知道用户的密码都是存放在/etc/shadow文件下,我们看下这个文件的权限

[email protected]:~# ls -l /etc/shadow

-rw-r----- 1 root shadow 8013 Sep  8 14:58 /etc/shadow

假如我是一个普通用户,显然我是可以修改我的密码的,通过passwd命令,无可厚非。自己修改自己的密码肯定是被允许的。

但是仔细想想你会发现不对啊,我作为一个普通用户登录后,我的实际用户ID和有效用户ID都是我自己的UID。从上面可以看出,显然我不具有修改/etc/shadow文件的权限,那我执行passwd命令时怎么改我的密码的呢?

在上面1,基本概念中我们知道决定我们权限的是执行操作时的有效用户ID,所有我们在执行passwd命令时,我们的有效用户ID肯定被修改了。OK,我们看下面:

[email protected]:~# ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root 43280 Feb 16  2011 /usr/bin/passwd

我们看到了一个s,对的,它就是我们的保存设置用户ID位,上面我们说过这个位的作用就是修改有效用户ID,那我们来看看他是如何修改执行passwd命令时的有效用户ID的。

首先我们看下命令执行的过程,当普通用户执行passwd命令时,shell会fork出一个子进程,此时进程有效用户ID还是普通用户ID,然后exec程序执行/usr/bin/passwd。通过上面的表我们会知道,exec发现/usr/bin/passwd有SUID位,于是会把进程的有效用户ID设成设置成文件用户ID,显然就是root,   此时这个进程都获得了root权限,
得到了读写/etc/shadow文件的权限, 从而普通用户可完成密码的修改。exec进程退出后会恢复普通用户的EUID为普通用户ID.这样就不会使普通用户一直拥有root权限。

这就是我们设置用户ID位的作用,它的存在就是为了普通用户在某些需要特权权限时,去临时的改变有效用户ID而获得特权权限。

但是你可能有疑问,为什么我们不用setuid()直接修改呢?何苦绕这么大的弯子。但是如果可以使用setuid()来直接修改有效用户ID来获得特权权限,那么我们的特权权限就会不可控了。这违背了最小权限模型。所以我们Linux特意将setuid设置成在非特权用户下面,有效用户ID只能设置成为实际用户ID和保存设置用户ID,而保存设置用户ID又是来自于有效用户ID的复制,而有效用户ID只能是实际用户ID或者文件所有者ID(在你设置了保存设置用户ID情况下才可以)。这样你就没法将有效用户ID设置成随意值,所以对普通用户创建的任何文件如果没有得到超级用户的授权,那么无论他怎么编写代码来设置自己的有效用户ID,或者设置保存用户ID位,由于你这个可执行文件是你自己编写的,所有你的权限更本没有得到实质性的改变。这里也就是说只有root自己创建的文件才具有这样的特权权限。这样是不是很好的保护了操作系统对权限的控制呢?

4,实例2,保存设置用户ID的作用

那么保存设置用户ID的作用又是什么呢?既然保存用户ID是有效用户ID的副本,那么肯定是为在某个时刻用于恢复我们的有效用户ID。这样就可能实现我们的用户权限的切换。

例如:man(这是AUP上面的例子,当然实际linux上好像不是这样实现,不过为了便于说明,还是直接使用了这个例子)

man程序的实际用户ID是man,有效用户ID也是man

1、首先我们的进程要执行man命令,所以exec发现/usr/bin/man已经设置了用户ID位,于是进程的有效用户ID给改了/usr/bin/man的拥有者,即改成man了,并且复制了man给保存设置用户ID,然后我们就可以顺利执行man命令了。

此时我们进程的ID:

实际用户ID = 我们的用户ID

有效用户ID = man(为了执行man命令)

保存的设置用户ID = man(exec设置的)

man程序访问需要配置文件和手册页,这些文件时名为man的用户所有的,因为有效用户ID是man,所有我们的操作得以顺利的被执行了。

2,我们的进程要求man执行其他命令(这里不仅我们要执行man命令,我们还会让man代表我们执行一些命令),但是现在我们的有效ID是man,所以需要更改有效ID为我们进程的实际ID,调用setuid(getuid())函数,由于我不是超级用户,所以,

实际用户ID = 我们的用户ID

有效用户ID = 我们的用户ID(setuid改的)

保存的设置用户ID = man

现在man进程是以我们的用户ID而运行的,这就意味着能访问的只有我们通常可以访问的,而没有额外的权限,

3,当man完成代替我们执行的命令后,我们当然要回到我们之前有效用户ID,也就是man,此时我们的保存设置用户ID这个副本就开始发挥它的作用了,我们只需要setuid(geteuid());即可,

通过了这个有效用户ID的副本保存设置用户ID,我们的有效用户ID才能在man->uid->man这样的切换。如果没有保存设置用户ID这个副本,显然,我们是没有办法在man程序代替我们执行完命令之后,在将有效用户ID设置成man的。

时间: 2024-08-07 08:20:53

无死角理解保存设置用户ID,设置用户ID位,有效用户ID,实际用户ID的相关文章

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

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

RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-> Web版本新增新的用户权限设置界面

在实际应用中我们会发现,权限控制会经常变动,如:需要调整角色的分配,需要收回与授予某些角色.用户可访问的模块(菜单)与相应的操作权限.需要给某些角色添加与移除相应的用户等等,如果没有一个灵活可靠的配置管理工具将会使权限控制变得十分麻烦.用户授权管理模块就是为了方便用户.角色权限的集中统一管理而开发的模块.在用户授权管理模块,操作员可以添加或移动用户到指定的角色.可以分配或授予指定用户的模块(菜单)的访问权限.可以收回或分配指定用户的操作(功能)权限.可以对所有用户.角色.模块(菜单).操作(功能

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

金蝶K3,域环境中,无本地用户管理员权限的域用户如何设置注册表权限?

如果该用户是属于Power Users组:只需要给用户添加注册表中的HKEY_LOCAL_MACHINE的SOFTWARE完全控制的权限.(勾选允许父项的继承权限和传播到该对象和所有子对象) 如果该用户是属于Users组:除了需要给用户添加注册表中的HKEY_LOCAL_MACHINE的SOFTWARE完全控制的权限以外,还需要给用户添加注册表中HKEY_CLASSES_ROOTD的APPID以及KdSvrmgr.clsAct完全控制的权限. 金蝶K3,域环境中,无本地用户管理员权限的域用户如何

Linux运维六:用户管理及用户权限设置

Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问:另一方面也可以帮助用户组织文件,并为用户提供安全性保护.每个用户账号都拥有一个惟一的用户名和各自的口令.用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录. 实现用户账号的管理,要完成的工作主要有如下几个方面: · 用户账号的添加.删除与修改. ·

大数据之Linux用户权限设置

用户 是Linux系统工作中重要的一环, 用户管理包括 用户 与 组 管理,在Linux系统中, 不论是由本级或是远程登录系统, 每个系统都必须拥有一个账号, 并且对于不同的系统资源拥有不同的使用权限对 文件 / 目录 的权限包括: 序号 权限 英文 缩写 数字代码 01 读 read r 4 02 写 write w 2 03 执行 execute x 1 04 无权限  -    0 ls -l 可以查看文件夹下文件的详细信息, 从左到右 依次是: 权限,             第一个字符

企业实战脚本案例2:批量创建用户并设置初始密码

批量创建用户并设置初始密码 目录: 1.脚本功能介绍 2.脚本制作技术需求 2.1 useradd命令 2.2 id命令 2.3 passwd命令 2.4 随机密码 2.5 while循环+case+select 3.脚本编写案例 一.脚本功能介绍 在企业中生产或运维中,经常会遇到VPN服务器.企业网盘.企业邮箱.云桌面私有账号等等一系列的服务器.当批量新员工入职时,经常需要批量账号分配给新员工,若此类账号存储在数据库时,管理员可根据公司账号命名规范通过专有图形化系统进行录入账号,若账号存储在系

linux 用户权限设置

# useradd –d /usr/sam -m sam 此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/usr为默认的用户主目录所在的父目录). 假设当前用户是sam,则下面的命令修改该用户自己的口令: # passwd Old password:****** New password:******* Re-enter new password:******* 如果是超级用户,可以用下列形式指定任何用户的口令: # passwd sam New

Servlet之保存用户偏好设置简单功能的实现

写在前面: 先来陈述一下为什么会有这样一个需求和这篇博文. 这是公司的一个项目,我们负责前端,后台服务由其他公司负责.该系统有一个系统偏好设置模块,用户可以设置系统的背景图片等系统样式,因为这是一个比较简单的功能,所以当时没有让后台公司来实现,由自己公司的一个领导编写了一个Servlet.但是由于服务器故障被格式化之后,这个Servlet就丢失了.本来打算跟领导汇报的,但是又怕挨批评,而且这个功能也并不复杂,所以决定自己实现一下吧.但是作为一个对Java一点都不懂的我来说,还是废了不少功夫的,所