当前位置: 首页 > article >正文

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)》


http://www.kler.cn/news/331059.html

相关文章:

  • 风扇模块(直流5V STM32)
  • 怎么将bash(sh)的所有输出保存到log/txt中?
  • Shell脚本基础——实训项目任务
  • AI学习指南深度学习篇-批标准化的实现机制
  • 解决pycharm中matplotlab画图不能显示中文的错误
  • MeterSphere压测配置说明
  • Vue CLI项目创建指南:选择预设与包管理器(PNPM vs NPM)
  • 平面电磁波(解麦克斯韦方程)
  • JS基础练习|动态创建多个input,并且支持删除功能
  • 【C++】模拟实现红黑树
  • JDBC原生事务管理,类比超市购物来讲解(不常用,但作为基础还是要了解一下)
  • django搭建一个AI博客进行YouTube视频自动生成文字博客
  • 14-函数返回指针
  • electron出现乱码和使用cmd出现乱码
  • 主流前端框架的详细对比和选择建议
  • express,MySQL 实现登录接口
  • 2024.9.28更换启辰R30汽车火花塞
  • 如何给一张图像判断失真类型?
  • vscode安装及c++配置编译
  • 【PostgreSQL】提高篇——深入了解不同类型的 JOIN(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)应用操作