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

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

  1. Linux系统编程——Daemon进程

    目录 Daemon进程介绍 前提知识 Daemon进程的编程规则 Daemon进程介绍 Daemon运行在后台也称作"后台服务进程". 它是没有控制终端与之相连的进程.它独立与控制 ...

  2. linux系统编程之进程(六):父进程查询子进程的退出,wait,waitpid

    本节目标: 僵进程 SIGCHLD wait waitpid 一,僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. ...

  3. linux系统编程之进程(五)

    今天继续学习系统编程,学习的主题还是进程,今天主要讨论的是守护进程相关的概念,开始进入正题: 什么是守护进程:       守护进程的创建步骤: 在描述它之前,首先得先了解两个概念:进程组.会话期: ...

  4. linux系统编程之进程(一)

    今天起,开始学习linux系统编程中的另一个新的知识点----进程,在学习进程之前,有很多关于进程的概念需要了解,但是,概念是很枯燥的,也是让人很容易迷糊的,所以,先抛开这些抽象的概念,以实际编码来熟 ...

  5. linux系统编程之进程(二):进程生命周期与PCB(进程控制块)

    本节目标: 进程状态变迁 进程控制块 进程创建 进程撤消 终止进程的五种方法 一,进程状态变迁 进程的三种基本状态 就绪(Ready)状态 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便 ...

  6. linux系统编程--守护进程,会话,进程组,终端

    终端: 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal), 进程中,控制终端是保存在PCB中的信息,而f ...

  7. Linux系统编程之进程概念

    注:本文部分图片来源于网络,如有侵权,请告知删除 1. 什么是进程? 在了解进程概念之前,我们需要先知道程序的概念. 程序,是指编译好的二进制文件,这些文件在磁盘上,并不占用系统资源. 进程,指的是一 ...

  8. 【Linux_Unix系统编程】chapter6 进程

    chapter6 进程 重点关注进程虚拟内存的布局及内容.6.1 进程和程序 进程(process)是一个可执行程序(program)的实例. 程序是包含了一系列信息的文件,这些信息描述了如何在运行时 ...

  9. 【Linux_Unix系统编程】Chapter4 文件IO

    Chapter4 文件IO 4.1 概述 文件描述符 == Windows的句柄 标准文件描述符: 0 标准输入 STDIN_FILENO stdin 1 标准输出 STDOUT_FILENO std ...

随机推荐

  1. grafana查询中的变量templating

    有时我们在管理成百上千台机器的时候,配置grafana无疑是明智的,因为你不需要一个一个的把每个机器的图形都配置一遍,利用templating就可以瞬间实现n台机器的状态显示了. templating ...

  2. 外部获取IndexPath的几种方式(关联对象等)

    1. 一般方式 - (void)buttonAction:(UIButton *)sender { UITableViewCell *cell = (UITableViewCell *)[[sende ...

  3. hog+svm+检测人(代替默认的参数)

    #include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui. ...

  4. Robot Framework 安装笔记

    安装python 自行搜寻安装 安装pip 进入python目录下的Scripts文件夹下,cmd,执行easy_install.exe pip 安装pywin32 pip install pywin ...

  5. Typescript(ES6) ...用法

    简单例子: //数组深拷贝 var arr2 = arr; var arr3 = [...arr]; console.log(arr===arr2); //true, 说明arr和arr2指向同一个数 ...

  6. Java-JDK & Android SDK下载安装及配置教程

    转自:http://blog.csdn.net/dr_neo/article/details/49870587 第一步.安装JDK: 第二步.安装Eclipse: 第三步.下载并安装AndroidSD ...

  7. Windows环境下搭建Nginx和多版本PHP共存

    PHP版本众多,彼此之间兼容性不好,不同程序经常需要的不同版本的PHP版本.这里介绍如何使用NGINX让不同版本的PHP共存. 软件下载地址 与nginx整合的php需要选择Non Thread Sa ...

  8. MySQL Transaction--RC事务隔离级别下加锁测试

    ==============================================================================非索引列更新 在读提交的事务隔离级别下,在非 ...

  9. Selenium(ThoughtWorks公司开发的web自动化测试工具)

    Selenium也是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7.8.9).Mozilla Firefox.Mozill ...

  10. .NET基金会成立

    作者 Jonathan Allen ,译者 臧秀涛 发布于 2014年4月8日 随着.NET基金会的成立,微软在成为主要的开源参与者的道路上又前进了一步.该基金会的宗旨是“成为越来越多的开源.NET项 ...