《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/ ...
随机推荐
- HDU 4746 (莫比乌斯反演) Mophues
这道题看巨巨的题解看了好久,好久.. 本文转自hdu4746(莫比乌斯反演) 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<= ...
- Web Api 中使用 PCM TO WAV 的语音操作
/// <summary> /// 语音[文件.上传.解码.保存(WAV)] /// </summary> [DeveloperEx("Liwei:秘书语音需求单&q ...
- MYSQL查询数据库表索引的硬盘空间占用
查询数据库的占用 SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024), 2), ' MB') AS 'Total Index Size' , CONCA ...
- Spring AOP (上)
工作忙,时间紧,不过事情再多,学习是必须的.记得以前的部门老大说过:“开发人员不可能一天到晚只有工作,肯定是需要自我学习.第一:为了更充实自己,保持进步状态.第二:为了提升技术,提高开发能力.第三:保 ...
- site
http://blog.csdn.net/zgmzyr/article/details/7657126
- UTF-8编码规则
UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所 ...
- .NET Remoting
.NET Remoting .NET Remoting是微软早期的分布式通信技术,虽然微软后来通过WCF通用基础通信框架整合掉了,但是通过回顾学习Remoting,反过来学习理解WCF也是很有帮助 ...
- (原创)LAMP教程1-下载虚拟机软件
(原创)LAMP教程1 从今天开始会在我的博客更新LAMP教程,第一章节就是安装虚拟机,因为不可能所有的人都有机会操作服务器,所以今天我打算教大家用虚拟机安装配置当下比较流行的框架,lamp. 好了费 ...
- <译>Selenium Python Bindings 6 - WebDriver API
本章涉及Selenium WebDriver的所有接口. Recommended Import Style 推荐的导入风格如下: from selenium import webdriver 然后,你 ...
- PHP 系统命令函数
function execute($cmd) { $res = ''; if ($cmd) { if(function_exists('system')) { @ob_start(); @system ...