找回密码
 注册
搜索

22:进程之二(SetUID和SetGID)

已有 443 次阅读2014-2-7 22:26 |个人分类:Linux编程| SetUID, SetGID, 进程, linux编程, linux编程

( GNU_Linux 编程指南 - 第二版 -p198 )

每个进程有三个用户ID(UID)和三个用户组ID(GID)。它们主要用于安全目的,如为用户赋予访问权限以及限制用户只能运行某种程序。真实用户ID和真实用户组ID代表用户的真实身份。当用户登录时从/etc/passwd文件中读取它们。它们是你的登录名和主用户组成员身份的数字化表示。

         例如在我的系统上,UID500,它对应我的登录名为kwallGID100,它对应users用户组。Getuidgeteuid函数分别返回调用进程的真实ID和有效ID。类似地,getgidgetegid函数返回调用进程的真实GID和有效GID。有效用户ID和有效用户组ID主要用于安全目的,但是在大多数情况下它们和真实用户和用户组ID相同。

         进程的真实ID和有效ID不相同的情况是正在运行的程序设置了setUIDsetGID后才出现的。之所以称为setUIDsetGID程序是因为其有效UIDGID被设置为文件的UIDGID,而不是执行该该程序的所有者或用户组的UIDGIDsetUIDsetGID程序的目的就是让用户能够执行具有特殊权限的程序。

         例如,考虑那个用来改变口令的passwd。大多数Linux系统都把口令保存在/etc/passwd文件中。所有用户都对这个文件具有读权,而仅有超级用户(root)才有写权。当运行ls –l /etc/passwd后就可以清楚的看到这一点。


         结果,为了修改这个文件,passwd程序必须有超级用户权限才行,因为只有超级用户才有对这个文件的写权。但是,因为任何用户都能执行passwd,所以正常情况下它不能修改/etc/passwd文件。解决这个问题的办法是,passwd程序是setUID超级用户的程序。也就是说,当执行该程序时,它的有效UID被设置为超级用户的UID,从而让它能够修改/etc/passwd文件。快速地运行一下命令ls –l /usr/bin/passwd,就可以确认可执行程序passwdsetUID为超级用户。

         在用户可执行权限位上的s表明passwd将作为一个setUID为超级用户的程序来执行。类似地,在组可执行权限位上的意味着程序将作为一个setGID程序运行。

         注意:实际上,大多数现代Linux系统使用隐蔽保密字文件隐蔽口令,所以实际的口令保存在隐蔽保留字文件/etc/shadow中,它只能由超级用户(或具有超级用户权限的用户读写)。

         警告:setUIDsetGID为超级用户的程序具有严重的安全风险,因为即便它只能由普通用户来执行,也会拥有超级用户的权利,所以能访问整个系统。这样的程序能破坏一切,当执行或创建setUIDsetGID为超级用户的程序时要极为小心。

程序清单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(注意你必须以超级用户身份设置程序的setUIDsetGID)。但是为了得到这个结果,在改变了setGID位后,必须以普通用户身份运行该程序。当然,在你的系统上,GIDUID的值可能不同。


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

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.

返回顶部