||
( GNU_Linux 编程指南 - 第二版 -p198 )
每个进程有三个用户ID(UID)和三个用户组ID(GID)。它们主要用于安全目的,如为用户赋予访问权限以及限制用户只能运行某种程序。真实用户ID和真实用户组ID代表用户的真实身份。当用户登录时从/etc/passwd文件中读取它们。它们是你的登录名和主用户组成员身份的数字化表示。
例如在我的系统上,UID为500,它对应我的登录名为kwall。GID为100,它对应users用户组。Getuid和geteuid函数分别返回调用进程的真实ID和有效ID。类似地,getgid和getegid函数返回调用进程的真实GID和有效GID。有效用户ID和有效用户组ID主要用于安全目的,但是在大多数情况下它们和真实用户和用户组ID相同。
进程的真实ID和有效ID不相同的情况是正在运行的程序设置了setUID或setGID后才出现的。之所以称为setUID和setGID程序是因为其有效UID或GID被设置为文件的UID或GID,而不是执行该该程序的所有者或用户组的UID或GID。setUID和setGID程序的目的就是让用户能够执行具有特殊权限的程序。
例如,考虑那个用来改变口令的passwd。大多数Linux系统都把口令保存在/etc/passwd文件中。所有用户都对这个文件具有读权,而仅有超级用户(root)才有写权。当运行ls –l /etc/passwd后就可以清楚的看到这一点。
结果,为了修改这个文件,passwd程序必须有超级用户权限才行,因为只有超级用户才有对这个文件的写权。但是,因为任何用户都能执行passwd,所以正常情况下它不能修改/etc/passwd文件。解决这个问题的办法是,passwd程序是setUID超级用户的程序。也就是说,当执行该程序时,它的有效UID被设置为超级用户的UID,从而让它能够修改/etc/passwd文件。快速地运行一下命令ls –l /usr/bin/passwd,就可以确认可执行程序passwd的setUID为超级用户。
在用户可执行权限位上的s表明passwd将作为一个setUID为超级用户的程序来执行。类似地,在组可执行权限位上的意味着程序将作为一个setGID程序运行。
注意:实际上,大多数现代Linux系统使用隐蔽保密字文件隐蔽口令,所以实际的口令保存在隐蔽保留字文件/etc/shadow中,它只能由超级用户(或具有超级用户权限的用户读写)。
警告:setUID或setGID为超级用户的程序具有严重的安全风险,因为即便它只能由普通用户来执行,也会拥有超级用户的权利,所以能访问整个系统。这样的程序能破坏一切,当执行或创建setUID为setGID为超级用户的程序时要极为小心。
程序清单13.2中的程序演示了如何检索ID
程序清单13.2 取得真实有效的ID
/*
*ids.c – Print real and effective UIDs and GIDs
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
Int main(void)
{
printf(“Real user ID: %d \n”, getuid());
printf(“Effective user ID: %d \n”, geteuid());
printf(“Real group ID: %d \n”, getgid());
printf(“Effective group ID: %d \n”, getegid());
exit(EXIT_SUCCESS);
}
使用make ids编译这个程序,运行该程序产生的输出和下面的结果类似。
Real user ID: 500
Effective user ID:500
Real group ID: 100
Effective group ID: 100
该变程序使其setGID为超级用户后再次运行的结果如下:
$ su
Password:
#chmod g+s ids
#exit
$ ls –l ids
-rwxr-sr-x 1 root root 5375 Ju1 27 23:19 ids
$ ./ids
Real user ID:500
Effective user ID: 500
Real group ID: 100
Effective group ID: 0
正如你看到的那样,那个程序执行时具有了超级用户的GID(注意你必须以超级用户身份设置程序的setUID或setGID位)。但是为了得到这个结果,在改变了setGID位后,必须以普通用户身份运行该程序。当然,在你的系统上,GID和UID的值可能不同。
Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )
GMT+8, 2024-11-24 08:49 , Processed in 0.029554 second(s), 18 queries , Gzip On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.