原本默认
1.进程凭证
每个进程都有一套数字表示的用户ID(uid)和组ID(gid)。有时,也将这些ID称之为进程凭证。具体如下:
1.实际用户ID(read user ID)和实际组ID(real group ID)
实际用户ID 和 实际用户组ID 确定了进程所属的用户和组。作为登录过程的步骤之一,登录 shell 从 /etc/passwd
文件中读取相应用户密码记录的第三个和第四个字段,置为其实际用户ID 和 实际组 ID.当创建新进程时,将从其父进程
继承这一属性。
2.有效用户ID(effective user ID)和有效组ID(effective group ID)
当进程尝试各种操作(系统调用)时,将结合有效用户ID, 有效组ID,连同辅助ID 一起来确定授予进程的权限。例如,
当进程访问诸如文件,System V 进程间通信(IPC) 对象之类的系统资源时,此类 ID 会决定系统授予进程的权限,而
这些资源的属主则令由与之相关联的用户 ID 和 组ID 来决定。内核会使用有效用户ID 来决定一个进程是否能向另外一个
进程发送信号。
有效用户ID为0(root 用户ID)的进程拥有超级用户的所有权限。这样的进程又称之为特权级进程(privileged process)。
而某些系统调用只能由特权级进程执行。
通常,有效用户ID及组ID 与其相应的实际ID 相等,但有2种方法能够致使二者不相等,其一就是9.7讨论的系统调用,其二就是
执行 set-user-ID 和 set-group-ID 程序.
3.保存的 set-user-ID(saved set-user-ID)和保存的 set-group-ID(saved set-group-ID)
set-user-ID 程序会将进程的有效用户ID置为可执行文件的用户ID(属主), 从而获得常规情况下不具有的权限。与其他文件一样,
可执行文件的用户ID和组ID决定了该文件的所有权。另外,可执行文件还拥有两个特别的权限位set-user-ID 和 set-group-ID。可
使用 chmod 命令来设置。
chmod u+s 文件名
chmod g+s 文件名
当运行set-user-ID 程序时,内核会将进程的有效用户ID设置为可执行文件的用户ID。通过这种方法修改进程的有效用户ID或者组ID,
能够使进程获得常规情况下所不具备的权限。也可以利用程序的 set-user-ID 和 set-group-ID 机制,将进程的有效ID改为 root
之外的其他用户。例如,为提供对一个受保护文件的访问,采用如下方案就绰绰有余:创建一个具有对该文件访问权限的专用用户ID,然后再
创建一个 set-user-ID 程序,将进程有效用户ID变更为这个专用ID。这样,就无需拥有超级用户的所有权限,程序就能访问该文件了。
若可执行文件的 set-user-ID 权限位已开启,则将进程的有效用户ID置为可执行文件的属主。若未设置set-user-ID 权限位,则进程的
有效用户ID保持不变。
保存set-user-ID 和保存 set-group-ID 的值由对应的有效ID 复制而来。无论正在执行的文件是否设置了 set-user-ID 或者set-group-ID
权限位,这一复制都将进行。
只要 set-user-ID 和 set-group-ID 程序没有执行与特权级ID相关的任何操作,就应将其置于非特权ID 的身份之下。
4.文件系统用户ID(file-system user ID)和文件系统ID(file-system group ID)(Linux专用)
在Linux 系统中,要进行诸如打开文件,改变文件属主,修改文件权限之类的文件系统操作时,决定其操作权限的是文件系统用户ID和组ID。通常,
文件系统用户ID和组ID 等同于相应的有效用户ID和组ID。此外,只要有效用户或组ID发生了变化,无论是通过系统调用,还是 set-user-ID 程序,
则相应的文件系统ID也将随之改变为同一值。只有用 setfsuid(),setfsgid() ,才可以刻意制造出文件系统ID与相应有效ID的不同。
5.辅助组ID
辅助组ID用于标识进程所属的若干附加的组。新进程从其父进程处继承这些ID,登录shell从系统组文件中获取其辅助的组ID。这些ID与有效ID以及文件
系统ID相结合,就能决定对文件,System V IPC 对象和其他系统资源的访问权限。
2.获取和设置进程凭证
1.修改有效ID,也可能修改实际用户ID和保存用户ID
进程使用 setuid()和 setgid() 系统调用能够对其凭证做哪些修改呢?其规则取决于进程是否拥有特权(即有效用户ID 为0)。适用于setuid()系统调用
的规则如下:
1.当非特权进程调用 setuid() 时,仅能修改进程的有效用户ID.而且,仅能将有效用户ID修改成相应的实际用户ID或保存 set-user-ID。这意味着,对非
特权用户而言,仅当执行 set-user-ID 程序时,setuid() 系统调用才起作用,因为当执行普通程序时,进程的实际用户ID,有效用户ID,和保存 set-user-ID
三者之间均相等。
2.当特权进程以一个非0参数调用 setuid() 时,其实际用户ID,有效用户ID和保存 set-user-ID 均被置为 uid 参数所指定的值。这一操作是单向的,一旦特权进程
以此方式修改了其ID,那么所有特权都将丢失,且之后也不能再使用 setuid() 调用将有效用户ID重置为0.如果不希望发生这种情况,请使用稍后的 seteuid()或者 setreuid()
替换setuid()。
使用 setgid() 系统调用修改组 ID 的规则与之类似,仅需要把 setuid() 替换为 setgid(),把用户替换为组。因之,规则1与之前完全一致。但在规则2中,由于对组
ID的修改不会引起进程特权的丢失(拥有特权与否由有效用户ID 决定),特权级程序可以使用 setgid()对组ID进行任意修改。
2.修改有效用户ID
seteuid():
1.非特权级进程仅能将其有效ID修改为相应的实际 ID或者保存设置ID.
2.特权级进程能将其有效ID修改为任意值。若特权进程使用 seteuid()将其有效用户ID修改为非0,那么此进程将不再具有特权(但可以根据规则1恢复)。
3.修改实际ID和有效ID
setreuid();
setregid();
1.非特权进程只能将其实际用户ID设置为当前实际用户ID值(即保持不变)或有效用户ID值,且只能将有效用户ID设置为当前实际用户ID,有效用户ID或保持
set-user-ID
2.特权级进程能够设置实际用户ID和有效ID为任意值。
3.不管进程拥有特权与否,只要如下条件成立,就能将保存set-user-ID 设置为新的有效用户ID。
a) ruid 不为 -1
b) 对有效用户ID所设置的值不同于系统调用之前的实际用户ID
4.获取实际,有效和保存设置ID
getresuid();
getresgid();
5.修改实际,有效和保存ID
setresuid();
setresgid();
1.非特权进程能够将实际ID,有效ID和保存set-user-ID 中的任意ID 设置为实际用户ID,有效用户ID,或保存ser-user-ID中的任意当前值.
2.特权级进程能够对实际用户ID,有效用户ID,和保存set-user-ID 做任意设置
3.不管系统调用是否对其他ID做了修改,总是将文件系统用户ID设置为与有效用户ID相同。
setresuid 和 setresgid() 调用具有0/1效应,要么全部成功,要么全部失败.
6.获取和修改文件系统ID
setfsuid();
setfsgid();
7.获取和修改辅助组 ID
getgroups();
setgroups();
initgroups();
getuid();
getgid();
geteuid();
getegid();
setuid();
setgid();
seteuid();
setegid();
setreuid();
setregid();
getresuid();
getresgid();
setresuid();
setresgid();
setfsuid();
setfsgid();
getgroups();
setgroups();
initgroups();
https://blog.csdn.net/enlyhua/article/details/81008604
Uid: 有效,实际,保存,文件系统ID