《UNIX环境高级编程》笔记--更改用户ID和组ID
在unix系统中,特权是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己
用户ID或组ID,使的新ID具有合适的特权或访问权限。与此类似,当程序需要降低其特权或阻止对某些资源的访问时,也需要
更换用户ID或组ID,从而使新ID不具有相应特权或访问这些资源的能力。
可以用setuid函数设置实际用户ID和有效ID,与此类似,可以使用setgid函数设置实际组ID和有效组ID。
#include <unistd.h>
int setuid(uid_t uid);
int setgid(gid_t gid);
//两个函数返回值:若成功则返回0,出错则返回-1。
POSIX.1包含了两个函数seteuid和setegid,它们类似于setuid和setgid,但是只更改有效用户ID和有效组ID。
#include <unistd.h>
int seteuid(uid_t uid);
int setegid(gid_t gid);
//两个函数返回值,若成功则返回0,出错则返回-1.
关于改变用户ID的规则如下:(用户ID所说明的一切都适用于组ID)
1.若进程具有超集用户特权,则setuid函数将实际用户ID,有效用户ID,以及保存的设置用户ID设置为uid。
2.若进程没有超级用户特权,但是uid等于实际用户ID或保存的设置用户ID,则setuid只将有效用户ID设置为uid,不改变实际用户ID
和保存的设置用户ID。
3.如果上面两个条件都不满足,则将errno设置为EPERM,并返回-1.
关于内核所维护的三个用户ID,还要注意下列几点:
1.只有超级用户进程可以更改实际用户ID,通常实际用户ID是在用户登录时,由login程序设置的,而且永远不会改变它。
2.仅当对程序文件设置了设置用户ID位后,exec函数才会设置有效用户ID。任何时候都可以调用setuid,将有效用户ID设置为实际
用户ID或保存的设置用户ID。自然,不能将有效用户ID设置为任何随机值。
3.保存的设置用户ID是由exec复制有效用户ID而来的,如果设置了文件的设置用户ID,则在exec根据文件的用户ID设置了进程的有效
用户ID后,将这个副本保存起来。
下表列出了改变这三个用户ID的不同方法。
下面通过一个例子说明保存的设置用户ID的用法。
man程序可能要执行许多其他命令,以处理包含需显示手册页的文件。为了防止被欺骗运行错误的命令或重写错误的文件,man命令
不得不在两种权限之间切换:运行man命令用户的权限,以及拥有man可执行文件用户的权限。下面是其工作步骤:
1.man程序文件是由名为man的用户拥有的,并且其设置用户ID位已设置。当我们exec此程序时,关于用户ID得到:
实际用户ID=我们的用户ID
有效用户ID=man
保存的设置用户ID=man
2.man程序访问需要的配置文件和手册页,这些文件是由名为man的用户所拥有的,因为有效用户ID是man,所以
可以访问这些文件。
3.在man代表我们运行任一命令后,它调用setuid。因为我们不是超级用户进程,所以仅仅改变有效用户ID。此时:
实际用户ID=我们的用户ID
有效用户ID=我们的用户ID(已改变)
保存的设置用户ID=man
现在,man进程是以我们的用户ID作为其有效用户ID而运行的。它可以代表我们安全地执行任意过滤器程序。
4.当执行完过滤器操作后,man调用setuid(euid),其中euid是用户man的数值用户ID。因为setuid的参数等于
保存的设置用户ID,所以这种调用时允许的。现在得到:
实际用户ID=我们的用户ID
有效用户ID=man(已改变)
保存的设置用户ID=man
5.因为man程序的有效用户ID是man,所以现在它可对其文件进行操作。
《UNIX环境高级编程》笔记--更改用户ID和组ID的更多相关文章
- UNIX环境高级编程笔记之文件I/O
一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...
- UNIX环境高级编程笔记 目录
每一章的重点会使用加粗字体 第一章:UNIX基础知识:UNIX体系结构:文件和目录:输入和输出:程序和进程:出错处理:信号:时间值:系统调用和库函数 第三章:文件I/O:文件描述符:文件操作函数:文件 ...
- UNIX环境高级编程笔记之高级I/O
本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 readv和writev函数,以及存储映射I/O ...
- UNIX环境高级编程笔记之标准I/O库
一.总结 文件I/O一章讲了不带缓冲的I/O,本章讲的是带缓冲的I/O.不带缓冲针对的是内核的系统调用,而带缓冲针对的是用户空间的标准库函数,是基于带缓冲的I/O实现的.不带缓冲的I/O通过文件描述符 ...
- UNIX环境高级编程笔记之线程
本章涉及到线程的一些基本知识点,讨论了现有的创建线程和销毁线程的POSIX.1原语,此外,重点介绍了线程同步问题,讨论了三种基本的同步机制:互斥量.读写锁.条件变量.
- UNIX环境高级编程笔记之进程控制
本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序 ...
- UNIX环境高级编程笔记之进程环境
本章讲的都是一些非常基础的知识,目的是为了下一章讲进程控制做铺垫,所以,本章就不做过多的总结了,直接看图吧.
- 《unix环境高级编程》学习笔记【原创】
本文基于unix环境高级编程的学习的笔记,写的比较简如有不对,欢迎指点. 简单的描述下面函数的功能改变ctr+c信号原本的作用终止程序,在按下中断键的时候输出一句话. while循环主要读取用户的输入 ...
- Unix环境高级编程学习笔记——fcntl
写这篇文正主要是为了介绍下fcntl,并将我自己在学习过程中的一些理解写下来,不一定那么官方,也有错误,希望指正,共同进步- fcntl: 一个修改一打开文件的性质的函数.基本的格式是 int fcn ...
- 《UNIX环境高级编程》(APUE) 笔记系列
本系列笔记主要是对于 <UNIX环境高级编程>(APUE) 各章节内容 概念性的总结 ,不涉及代码解读 . 目录 : 第一章 UNIX基础知识 第二章 UNIX标准及实现 第三章 文件I/ ...
随机推荐
- UVa 1475 (二分+半平面交) Jungle Outpost
题意: 有n个瞭望塔构成一个凸n边形,敌人会炸毁一些瞭望台,剩下的瞭望台构成新的凸包.在凸多边形内部选择一个点作为总部,使得敌人需要炸毁的瞭望塔最多才能使总部暴露出来.输出敌人需要炸毁的数目. 分析: ...
- Leap Motion 开发笔记
Leap Motion 体系架构 Leap Motion支持所有主流操作系统,leap motion在Windows系统下是作为一个服务运行的,在Mac和Linux是后台守护进程.软件通过USB线连接 ...
- Java [Leetcode 203]Remove Linked List Elements
题目描述: Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> ...
- poj 3260 The Fewest Coins
// 转载自http://blog.163.com/benz_/blog/static/18684203020115721917109/算法不难看出,就是一个无限背包+多重背包.问题在于背包的范围.设 ...
- linux lnmp编译安装
关闭SELINUX vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉 SELINUX=disabled ...
- [Papers]MHD, $\pi$, Lorentz space [Suzuki, DCDSA, 2011]
$$\bex \sen{\pi}_{L^{s,\infty}(0,T;L^{q,\infty}(\bbR^3))} +\sen{{\bf b}}_{L^{\gamma,\infty}(0,T;L^{\ ...
- golang学习遭遇duang...duang...duang
初学golang时,在windows上使用liteIDE进行,很多语法都能自己调整. 后来使用linux桌面,再次编写时,发现很多东西都忘掉了.这难道就是习惯gocode后的弊端吗?还是人到 前中年 ...
- Redis源码分析系列
0.前言 Redis目前热门NoSQL内存数据库,代码量不是很大,本系列是本人阅读Redis源码时记录的笔记,由于时间仓促和水平有限,文中难免会有错误之处,欢迎读者指出,共同学习进步,本文使用的Red ...
- QT4.7.4-vs2008和vs2010的安装并编写测试程序
QT的安装着实费了我好大的劲,之前试过QT5.1.0与VS2010的安装,但是因为设置的地方太多,程序运行总是不成功,所以最后选用QT4.7.4和VS2008与VS2010来编写程序.写这篇文章来总结 ...
- CodeForce---Educational Codeforces Round 3 D. Gadgets for dollars and pounds 正题
对于这题笔者无解,只有手抄一份正解过来了: 基本思想就是 : 二分答案,对于第x天,计算它最少的花费f(x),<=s就是可行的,这是一个单调的函数,所以可以二分. 对于f(x)的计算,我用了nl ...