unix中实际用户ID、有效用户ID、保存的设置用户ID的区别和作用

一、前言

在unix系统中,不是每一个程序都能够访问系统中的所有资源的。(除非程序获取到root权限)在该系统中的程序应遵守最小权限原则,即一个程序只拥有完成任务所需的最小权限就可以了,这个机制是通过三个用户ID的机制来实现的。本文就来介绍何为实际用户ID、有效用户ID以及保存的设置用户ID。将涉及如下内容:
1.这三种用户ID的定义和区别
2.设置这三种ID的规则。
首先需要明确一点:在unix系统中运行的每一个程序都拥有这个三个ID。通过改变程序的用户ID,可以控制程序所拥有的权限。

二、实际用户ID

简单来说,实际用户iD = 调用程序的登录用户的ID。
这个ID表示的是哪个用户调用的该程序,一般来说,实际用户ID就是开机时登录的用户。(unix系统是多用户的,可以登录多个用户)。
实际用户ID最主要的作用就是表示谁调用了该进程。

三、有效用户ID

有效用户ID决定了程序拥有哪些权限,修改程序的权限主要就是通过控制有效用户ID来实现的。

四、保存的设置用户ID

这个ID的作用类似我们在进行两个数据交换时需要用到的中间变量,其也是在进行修改用户ID时使用的。

五、如何修改程序的用户ID

在unix系统中,可以通过setuid函数来修改用户ID,其函数定义如下:

#include <unistd.h>
#include <sys/types.h> int setuid(uid_t uid);

参数:要设置的新用户 ID。
返回值:

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno 以指示错误类型。

使用setuid的规则如下:

1.如果进程拥有超级用户权限(root),则setuid后实际用户id、有效用户id、保存的设置用户id都将变为uid
2.若进程没有超级用户权限,且uid等于实际用户id或者保存的设置用户id,则setuid后有效用户id将变为uid
3.如果上面两个条件都不满足,则返回-1.

按照上面的规则,如果一个进程拥有超级用户权限,它又调用setuid将三个id设置为非超级用户权限,那么它将无法再通过setuid获取超级用户权限。
对于这三个id,内核还设置了如下的规则:

1.只有超级用户进程可以修改实际用户id
2.仅当程序文件设置了ID位时,exec函数才设置有效用户id。如果ID位没有设置,则exec函数不会改变程序的有效ID,将维持原值。
3.保存的设置用户id是在执行exec函数时,复制有效用户id得到的。

规则总结如下:
在这里插入图片描述

(5-1)
如果只想改变有效用户id,可以使用seteuid函数,该函数定义如下:

#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
int seteuid(uid_t euid);
参数:要设置为有效用户ID的值。
返回值:成功返回0,失败返回-1.

如果是超级用户进程,那么调用seteuid能够将进程的有效用户id修改为任意uid。
如果是非超级用户进程,则将有效用户id修改为实际用户id或保存的设置用户id。

参考资料:

《UNIX环境高级编程(第3版) (史蒂文斯 (W.Richard Stevens) 拉戈 (Stephen A.Rago))
(Z-Library)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值