SUID和SGID

SUID叫做设置-用户-IDset-user-ID
SGID叫做设置-组-IDset-group-ID

这里我来说一下他们两个到底有什么作用

比方说,现在有一个可执行文件,它的所有者是root,而且设置了该文件的设置-用户-ID位,然后当该程序由一个进程运行时,则该进程具有root权限,不管执行此文件的进程的实际用户ID是什么,意思就是,即使以普通用户的身份去执行这个程序,它依然是以root权限来运行的,这个就是SUID的作用了

再来说一下SGID,其实和上面的SUID是一样的,只不过是把执行设置了SGID位的可执行文件的进程的有效组ID设置为了文件的组所有者ID

现在我们有一个可执行程序a.out,源文件如下:

#include 

#include "ourhdr.h" 
#include "my_err.h" 

int main(int argc, char *argv[])
{
	if(argc != 2)
		err_quit("usage: a.out ");
	
	//R_OK常数用于测试读许可权
	if(access(argv[1], R_OK) < 0)
		err_ret("access error for %s", argv[1]);
	else
		printf("read access OK\n");
	
	//以只读方式打开
	if(open(argv[1], O_RDONLY) < 0)
		err_ret("open error for %s", argv[1]);
	else
		printf("open for reading OK\n");       
	
	exit(0);
}
 

现在我们查看它的所有者:
在这里插入图片描述
我们来找一个当前用户无法读取的文件:
在这里插入图片描述
只有rootroot组用户可以读取该文件。我们尝试使用a.out进行读取
在这里插入图片描述
用户和a.out均无访问权限

然后我们切换至root用户,将a.out的所有者改成root,并激活其SUID位:
SUID和SGID_第1张图片

现在我们切换回普通用户,再使用a.out访问/etc/sudoers文件:
在这里插入图片描述
可以将看到,用户被禁止访问(R_OK判断结果),但是我们的程序中的open函数却可以打开此文件

你可能感兴趣的:(linux)