9.Linux/Unix 系统编程手册(上) -- 进程凭证

原本默认 

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

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值