免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5134 | 回复: 3
打印 上一主题 下一主题

[C] Linux中,进程组ID和用户组ID以及有效组ID是什么关系? [复制链接]

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:52:30
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-03-13 11:10 |只看该作者 |倒序浏览
与进程关联的ID有6个以上:实际用户ID。实际组ID。有效用户ID。有效组ID。保存的设置用户ID。保存的设置组ID。那进程组ID对应的是其中哪个,还是说它是进程的另一种ID?他们的区别和联系是什么?看书自己住,琢磨不明白,求大神指导。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
2 [报告]
发表于 2015-03-16 13:11 |只看该作者
这几个跟权限配置有关,了解下chroot就知道了。

至于为什么搞那么多数字,跟unix的历史有关,linux是unix的一个分支的子孙,所有这就有点远了。

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
3 [报告]
发表于 2015-03-16 17:36 |只看该作者
回复 1# chen_bo0302
real user/group ID 标识了进程的执行者/创建者,real ID 通常在用户登录系统时,由login(1)进程读取系统passwd/group 文件来设置

effective user/group ID 与supplementary group ID 共同决定了授予进程执行系统调用时的权限,effective ID 通常与real ID 具有相同的值,但可以通过一些系
统调用或执行set-user/group-ID 程序来更改

set-user/group-ID 是文件属性,而不是进程属性;当设置了set-user-ID 权限位的文件被执行时,内核会将进程的effective user ID 设置为可执行文件的属主(拥有了文件
属主的权限)

saved set-user/group-ID 用于set-user/group-ID 程序,在进程执行时保存effective user-user/group ID 当前值的副本,使得进程的effective ID 值可以在
real ID 与saved set ID 之间切换,实现临时提升与降低权限
   
file-system user/group ID 是Linux 进程的特有属性,当执行文件系统相关的操作时,使用file-system ID 和supplementary group ID 来决定授予进程的权限
file-system ID 通常与相应的effective ID 具有相同的值,且随effective ID 的变化而变化

supplementary group ID 是指进程的real user ID 所属的附加组的GID

程序验证:
root用户(id == 0)编辑程序pids.c并编译
  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <unistd.h>

  4. int main(void)
  5. {
  6.     uid_t ruid, rgid, euid, egid, suid, sgid;

  7.     ruid = getuid();
  8.     rgid = getgid();
  9.     euid = geteuid();
  10.     egid = getegid();
  11.    
  12.     getresuid(&ruid, &euid, &suid);
  13.     getresgid(&rgid, &egid, &sgid);

  14.     printf("Real User-ID: %d\n", ruid);
  15.     printf("Real Group-ID: %d\n", rgid);
  16.     printf("Effective User-ID: %d\n", euid);
  17.     printf("Effective Group-ID: %d\n", egid);
  18.     printf("Saved set-user-ID: %d\n", suid);
  19.     printf("Saved set-group-ID: %d\n", sgid);

  20.     return 0;
  21. }
复制代码
  1. # gcc -m32 pids.c -o pids
复制代码
新建普通用户(id != 0)
  1. # useradd user0 -m -s /bin/bash
复制代码
复制pids程序到普通用户的宿主目录,并添加set-user-ID权限位
  1. # cp pids /home/user0/
复制代码
  1. # chmod u+s /home/user0/pids
复制代码
切换到普通用户
  1. # su user0
复制代码
普通用户运行程序
  1. $ id
  2. uid=1000(user0) gid=1000(user0) groups=1000(user0)
  3. $ ./pids
  4. Real User-ID: 1000
  5. Real Group-ID: 1000
  6. Effective User-ID: 0
  7. Effective Group-ID: 1000
  8. Saved set-user-ID: 0
  9. Saved set-group-ID: 1000
复制代码
希望可以为你提供一些思路

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:52:30
4 [报告]
发表于 2015-03-18 12:35 |只看该作者
回复 3# superwujc

感觉有点明白了,谢谢啊


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP