Linux系统编程:(5)进程凭证

一、进程凭证

每个进程都有一套用数字表示的用户ID(UID)组ID(GID),有时将这些ID称之为进程凭证,具体如下图所示:
Linux系统编程:(5)进程凭证
1. 实际用户ID和组ID
实际用户ID和组ID确定了进程所属的组,标识我是谁。

2.有效用户ID和有效组ID
当进程尝试执行各种系统调用的时候,将结合有效用户ID有效组ID辅助ID来确定赋予进程的权限。
例如,当进程访问一些文件、进程间通信对象之类的系统资源时,有效用户ID和有效组ID会决定系统授予进程的权限,这些资源的属主则是由上述所介绍的实际用户ID和实际组ID来决定。

有效用户ID为0的进程拥有超级用户的所有权限,这样的进程称之为特权进程。如果只是为了使进程可以执行某个或某些系统调用而将进程的有效用户ID置为0是非常不安全的,因为root的权限分为很多种,仅为了某一个访问权限而给予别人一切权限,这样使得攻击面变得很大,系统很不安全。

后续会讲到Linux Capability方案,将root权限切割成更细粒度的小权限,对于进程来说可以单独启用或者禁用某个或者某些权限。

3.Set-User-ID和Set-Group-ID程序
set-user-ID程序会将进程的有效用户ID置为可执行文件的用户ID(属主),从而获得常规情况下并不具有的权限。例如,如果可执行文件时root创建,如果执行了set-user-ID权限,那么进程在执行的时候,有效用户ID就是变为0(root的用户ID为0),那么进程在执行过程中就有超级用户root的所有权限了。

set-group-ID程序对进程的有效用户组ID类似。

可执行文件有两个比较特别的权限位:set-user-ID位和set-group-ID位,可以使用chmod来修改这两个位:
Linux系统编程:(5)进程凭证
设置完成后,用来表示文件的可执行文件权限x会被s标识所替换
Linux系统编程:(5)进程凭证

总结 :一般情况下,进程的有效用户ID及组ID与相应的实际ID是相等的,但是当设置了set-user-ID或者set-group-ID时,进程的有效用户ID或者组ID就会变成实际用户ID、实际组ID。

4.保存Set-User-ID和保存Set-Group-ID程序
保存set-user-ID和保存set-group-ID的值由对应的有效ID复制而来。无论只在执行的文件是否设置了set-user-ID或set-group-ID权限位,这一复制行为始终会发生。

二、获取、修改进程凭证

为了获取和变更上述讨论的各种与进程相关的ID,Linux提供了一系列的系统调用和库函数,我们在此处指给出一张表,具体用法还需要自己仔细去研究手册。但是在讨论修改用户ID和组ID的所有系统调用时,要求进程具有CAP_SETUIDCAP_SETGID能力,这两种属于Linux Capability,后续学习将详细介绍。

1. 获取与进程相关ID的getXXX方法集合
Linux系统编程:(5)进程凭证
除了通过系统调用的来查看上述各种ID,可以利用Linux系统特有的/proc/PID/status文件,通过对其中Uid、Gid和Groups各行信息的检查,来获取任何进程的凭证。Uid和Gid各行按照实际、有效、保存设置和文件系统ID的顺序来展示相应的标识符。
Linux系统编程:(5)进程凭证
2. 修改与进程相关ID的setXXX方法集合
修改与进程相关的ID一般分为执行者是特权进程还是非特权进程,不同的角色,结果不一样,具体如下图所示,在使用的时候,需要具体视情况而定。
Linux系统编程:(5)进程凭证