【Linux_Unix系统编程】Chapter9 进程凭证

chapter9 进程凭证
每个进程都有一套用数字表示的用户ID(UID)和组ID(GID).有时也将这些ID称子为进程凭证。
1:实际用户ID和实际组ID
2:有效用户ID和有效组ID
3:保存的set-user-ID 和保存的set-group-ID
4:文件系统用户ID和文件系统组ID
5:辅助组ID
9.1 实际用户ID和实际组ID
实际用户ID和实际组ID确定了进程所属的用户和组。作为登录过程的步骤之一,登录shell从/etc/passed文件中读取相应用户密码记录的第三字段和第四字段,置为其实际用户ID和实际组ID。创建新进程,将从其父进程中继承这些ID。

9.2 有效用户ID和有效组ID
有效用户ID为0(root的用户ID)的进程拥有超级用户的所有权限。这样的进程有称为特权级进程。二某些系统调用只能由特权级进程执行。

9.3 Set-User-ID 和Set-Group-ID 程序
set-user-ID程序会将进程的有效用户ID设置为可执行文件的用户ID,从而获得常规情况下并不具有的权限。set-group-ID程序对进程有效组ID实现类似任务。
与其他文件一样,可执行文件的用户ID和组ID决定了改文件的所有权。另外,可执行文件还拥有两个特别的权限位set-user-ID位和set-group-ID位。‘
eg:
$su
Password:
#ls -l prog
-rwxr-xr-x 1 root root 302585 Jun 26 15:05 prog
#chmod u+s prog
#chmod g+s prog

#ls -l prog
-rwsr-xr-x 1 root root 302585 Jun 26 15:05 prog

9.4 保存set-user-ID 和保存set-group-ID

9.5 文件系统用户ID和组ID
在Linux系统中,要进行诸如打开文件,改变文件属主,修改文件权限之类的文件系统操作时,决定其操作权限的是文件系统用户ID和组ID(结合辅助组ID),而非有效用户ID和组ID。

9.6 辅助组ID
辅助组ID用于标识进程所属的若干附加的组。

9.7 获取和修改进程凭证
可以利用Linux系统特有的proc/PID/status文件,通过对其中Uid, Gid和Groups各行信息的检查,来获取任何进程的凭证。
1:CAP_SETUID 能力允许进程任意修改其用户ID
2:CAP_SETGID 能力允许进程任意修改其组ID

9.7.1 获取和修改实际,有效和保存设置标识
获取实际和有效ID
系统调用getuid()和getgid()分别返回调用进程的实际用户ID和组ID。而系统调用geteuid()和getegid()则对进程的有效ID实现类似功能。
#include <unistd.h>
uid_t getuid(void);
uid_t geteuid(void);
gid_t getgid(void);
git_t getegid(void);
修改有效ID:
#include <unistd.h>
int setuid(uid_t uid);
int setgid(git_t gid);
注意:
1:当非特权进程调用setuid()时,仅能修改进程的有效用户ID。
2:当特权进程以一个非0参数嗲用setuid()时,其实际用户ID,有效用户ID和保存set-user-ID 均被置为uid参数所指的值。

进程能够使用seteuid()来修改其有效用户ID,还能使用setegid()来修改其有效组ID
#include <unistd.h>
int seteuid(uid_t euid);
int setegid(git_t egid);
修改实际ID和有效ID;
#include <unistd.h>
int setreuid(uid_t ruid, uid_t euid);
int setrguid(git_t rgid, git_t egid);
第一个参数:新的实际ID
第二个参数:新的有效ID

获取实际,有效和保存设置ID
在大多数UNIX实现中,进程不能直接获取(或修改)其保存set-user-ID和保存set-group-ID的值。然而Linux提供了两个(非标准)系统调用来实现此项功能:getresuid()和getresgid().
#define _GNU_SOURCE
#include <unistd.h>
int getresuid(uid_t *ruid, uid_t *euid, uit_t *suid);
int getresgid(git_t *rgid, gid_t *egid, git_t *sgid);

修改实际,有效和保存设置ID

9.7.2 获取和修改文件系统ID

时间: 2024-11-06 19:31:46

【Linux_Unix系统编程】Chapter9 进程凭证的相关文章

Linux系统编程之进程

前一段时间对文件I/O的基本操作基本操作做了总结,今天这里继续按照我的理解对linux系统编程的进程操作进行总结. 首先我们先理解几个概念:程序.进程.线程. 所谓程序,就是计算机指令的集合,它以文件的形式存储在磁盘上,进程是一个程序在其自身的地址空间中的一次执行活动.而线程进程内的一个执行单元,也是进程内的可调度实体.说完这个不知道大家理解了吗?反正我第一次听到这个概念以后看到的时候可以明白过后就忘记了,现在我给大家举一个例子帮助大家理解,大家都看电视剧吧,所谓程序,就是一个剧本,像什么<西游

Linux系统编程——Daemon进程

目录 Daemon进程介绍 前提知识 Daemon进程的编程规则 Daemon进程介绍 Daemon运行在后台也称作"后台服务进程". 它是没有控制终端与之相连的进程.它独立与控制终端.会话周期的执行某种任务. 那么为什么守护进程要脱离终端后台运行呢? 守护进程脱离终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的任何终端信息所打断. 那么为什么要引入守护进程呢? 由于在linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程

【Linux_Unix系统编程】chapter6 进程

chapter6 进程 重点关注进程虚拟内存的布局及内容.6.1 进程和程序 进程(process)是一个可执行程序(program)的实例. 程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程,所包含的内容如下. (1):二进制格式标识:每个程序文件都包含用于描述可执行文件格式的元信息. (2):机器语言指令:对程序算法进行编码 (3):程序入口地址:标识程序开始执行时的起始指令位置. (4):数据:包含的变量初始值和程序使用的字面量值 (5):符号表以及重定位表:描述程序中

Linux系统编程——特殊进程之僵尸进程

僵尸进程(Zombie Process) 进程已执行结束,但进程的占用的资源未被回收.这种进程称为僵尸进程. 在每一个进程退出的时候,内核释放该进程全部的资源.包含打开的文件.占用的内存等. 可是仍然为其保留一定的信息,这些信息主要主要指进程控制块的信息(包含进程号.退出状态.执行时间等).直到父进程通过 wait() 或 waitpid() 来获取其状态并释放(详细使用方法,请看<等待进程结束>). 这样就会导致一个问题,假设进程不调用wait() 或 waitpid() 的话, 那么保留的

【Linux_Unix系统编程】Chapter4 文件IO

Chapter4 文件IO 4.1 概述 文件描述符 == Windows的句柄 标准文件描述符: 0 标准输入 STDIN_FILENO stdin 1 标准输出 STDOUT_FILENO stdout 2 标准错误 STDERR_FILENO stderr (1):fd = open(pathname, flags, mode) (2):numread = read(fd, buffer, count) (3):numwritten = write(fd, buffer, count) (

Linux系统编程——特殊进程之守护进程

什么是守护进程? 守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件. 守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示.由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都

linux系统编程之进程(七):system()函数使用【转】

本文转载自:http://www.cnblogs.com/mickole/p/3187974.html 一,system()理解 功能:system()函数调用“/bin/sh -c command”执行特定的命令,阻塞当前进程直到command命令执行完毕 原型: int system(const char *command); 返回值: 如果无法启动shell运行命令,system将返回127:出现不能执行system调用的其他错误时返回-1.如果system能够顺利执行,返回那个命令的退出

【Linux_Unix系统编程】Chapter10 时间

chapter10 时间 1:真实时间:度量这一时间的起点有二:(1)某个标准点:(2)进程生命周期内的某个固定时点(通常为程序启动) 2:进程时间:一个进程所使用的CPU时间总量,适用于对程序,算法性能的检查或优化.10.1 日历时间(calendar Time) 日历时间存储于类型为time_t的变量中. 系统调用gettimeofday(),可于tv指向的缓冲区中返回日历时间 #include <sys/time.h> int gettimeofday(struct timeval *t

【Linux_Unix系统编程】chapter5 深入探究文件IO

Chapter5 深入探究文件I/O 本章节将介绍另一个与文件操作相关的系统调用:多用途的fcntl(),并展示其应用之一读取和设置打开文件的状态标志. 5.1 原子操作和竞争条件 所有系统调用都是以原子操作方式执行的.是以为内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行,其间不会为其他进程或线程所中断. 以独占方式创建一个文件: 当同时制定O_EXCL与O_CREAT作为open()标志位时,如果要打开的文件已存在,则open()将返回一个错误.保证了进程是打开文件的创建者.