分页: 1 / 1
SUID权限控制问题
发表于 : 2012-07-16 17:36
由 monkey1992
我们linux的课程设计要用shell做一个作业管理系统,要求实现不同权限的用户(比如管理员,教师,学生等),系统是基于文件的。所以需要一中权限管理机制来实现让用户只能通过我所写的shell脚本才能访问系统中的那些文件,而不能直接去访问。
我一开始想到的是SUID权限,以为这个对shell脚本也适用,但是昨天晚上才发现SUID只对可执行二进制程序有用,对shell脚本是没用的,汗!!!
于是我想到能不能把shell脚本给它转化成二进制程序,然后给二进制程序加上SUID权限。
我在网上找到了一个叫shc软件,可以把sh脚本转化成c语言代码进而转化成二进制程序,但是试验了一下发现对二进制程序设定SUID权限后还是没有用,不知道还有什么其他的方法能够把SUID权限应用到shell上来?SUID权限到底是怎么起作用的?用户在执行二进制程序后产生的子进程中suid权限是不是就没掉了?
如果实在不能应用suid权限的话,那么对于这样的系统来说应该用什么方法来实现:用户直接是不能碰文件,但是透过一个特定的shell就可以碰了……
码字有点多,不知道说的是不是够清楚了,求大大解答
Re: SUID权限控制问题
发表于 : 2012-07-16 17:49
由 lilydjwg
写个二进制Í程序 system 你的 shell 脚本。
当然,专业点的用 execv。
Re: SUID权限控制问题
发表于 : 2012-07-18 10:15
由 monkey1992
lilydjwg 写了:写个二进制Í程序 system 你的 shell 脚本。
当然,专业点的用 execv。
试了system和execvp,结果都不行。
我是这样试的,不知道对么。
代码: 全选
//b.c
#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
char *program = "./a.sh"; /*a.sh是当前目录下面的一个脚本文件,内容是查看一个只有owner才有r权限的文件*/
char *arg_list[] = {NULL};
execvp(program,arg_list);
return 0;
}
/*然后编译,并设置可执行文件的suid*/
cc b.c -o b.out
chmod u+s b.out
结果我切换到其他用户来执行这个可执行文件的时候就提示权限不够了。。。

Re: SUID权限控制问题
发表于 : 2012-07-18 10:32
由 cuihao
Re: SUID权限控制问题
发表于 : 2012-07-18 10:37
由 monkey1992
我没说清楚,这个加了的。
这个程序的所有者运行结果是显示一个文件的内容,而换其他用户运行这个程序会出现提示cat:permission denied。
这说明,其他用户执行这个程序是还是没有获得所有者的权限,看来想通过exec让脚本程序支持suid是不行的了
Re: SUID权限控制问题
发表于 : 2012-07-18 13:14
由 lilydjwg
setuid 和 seteuid 都试试。
另外,arg_list 中少了 argv[0]。
Re: SUID权限控制问题
发表于 : 2012-07-18 16:28
由 monkey1992
lilydjwg 写了:setuid 和 seteuid 都试试。
另外,arg_list 中少了 argv[0]。
我改成如下的代码,然后生效了,对比以前我似乎知道问题所在了。
代码: 全选
#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
execl("/bin/cat","cat","testfile",(char *)0); /*这里必须直接用cat,而不能是shell脚本,否则就没效*/
return 0;
}
即使使用exec等函数族,也不能使得shell脚本获取suid权限,即exec shell脚本是没用的,除非你在exec里面直接去运行二进制程序,比如/bin/cat,/bin/touch等等,这样才行。
看来我以前的想法是彻底不行了。
Re: SUID权限控制问题
发表于 : 2012-07-18 16:45
由 lilydjwg
monkey1992 写了:lilydjwg 写了:setuid 和 seteuid 都试试。
另外,arg_list 中少了 argv[0]。
我改成如下的代码,然后生效了,对比以前我似乎知道问题所在了。
代码: 全选
#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
execl("/bin/cat","cat","testfile",(char *)0); /*这里必须直接用cat,而不能是shell脚本,否则就没效*/
return 0;
}
即使使用exec等函数族,也不能使得shell脚本获取suid权限,即exec shell脚本是没用的,除非你在exec里面直接去运行二进制程序,比如/bin/cat,/bin/touch等等,这样才行。
看来我以前的想法是彻底不行了。
1. 试试 setuid / seteuid。
2. 试试 exec bash、
Re: SUID权限控制问题
发表于 : 2012-07-18 17:19
由 monkey1992
lilydjwg 写了:monkey1992 写了:lilydjwg 写了:setuid 和 seteuid 都试试。
另外,arg_list 中少了 argv[0]。
我改成如下的代码,然后生效了,对比以前我似乎知道问题所在了。
代码: 全选
#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
execl("/bin/cat","cat","testfile",(char *)0); /*这里必须直接用cat,而不能是shell脚本,否则就没效*/
return 0;
}
即使使用exec等函数族,也不能使得shell脚本获取suid权限,即exec shell脚本是没用的,除非你在exec里面直接去运行二进制程序,比如/bin/cat,/bin/touch等等,这样才行。
看来我以前的想法是彻底不行了。
1. 试试 setuid / seteuid。
2. 试试 exec bash、
不行哎,bash是不支持suid的,怎么折腾都不行,我试着换成了zsh,结果可以了。也就是说,zsh支持suid权限
Re: SUID权限控制问题
发表于 : 2012-07-19 9:11
由 link_01
要不试试启用acl试试