SUID权限控制问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
monkey1992
帖子: 9
注册时间: 2012-07-16 14:19

SUID权限控制问题

#1

帖子 monkey1992 » 2012-07-16 17:36

我们linux的课程设计要用shell做一个作业管理系统,要求实现不同权限的用户(比如管理员,教师,学生等),系统是基于文件的。所以需要一中权限管理机制来实现让用户只能通过我所写的shell脚本才能访问系统中的那些文件,而不能直接去访问。
我一开始想到的是SUID权限,以为这个对shell脚本也适用,但是昨天晚上才发现SUID只对可执行二进制程序有用,对shell脚本是没用的,汗!!!
于是我想到能不能把shell脚本给它转化成二进制程序,然后给二进制程序加上SUID权限。
我在网上找到了一个叫shc软件,可以把sh脚本转化成c语言代码进而转化成二进制程序,但是试验了一下发现对二进制程序设定SUID权限后还是没有用,不知道还有什么其他的方法能够把SUID权限应用到shell上来?SUID权限到底是怎么起作用的?用户在执行二进制程序后产生的子进程中suid权限是不是就没掉了?
如果实在不能应用suid权限的话,那么对于这样的系统来说应该用什么方法来实现:用户直接是不能碰文件,但是透过一个特定的shell就可以碰了……
码字有点多,不知道说的是不是够清楚了,求大大解答
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: SUID权限控制问题

#2

帖子 lilydjwg » 2012-07-16 17:49

写个二进制Í程序 system 你的 shell 脚本。
当然,专业点的用 execv。
头像
monkey1992
帖子: 9
注册时间: 2012-07-16 14:19

Re: SUID权限控制问题

#3

帖子 monkey1992 » 2012-07-18 10:15

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
结果我切换到其他用户来执行这个可执行文件的时候就提示权限不够了。。。 :em20
头像
cuihao
帖子: 4793
注册时间: 2008-07-24 11:33
来自: 郑州
联系:

Re: SUID权限控制问题

#4

帖子 cuihao » 2012-07-18 10:32

给其他用户加执行权限了么?

代码: 全选

chmod a+x 程序
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 绿
Site: CUIHAO.TK    Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
头像
monkey1992
帖子: 9
注册时间: 2012-07-16 14:19

Re: SUID权限控制问题

#5

帖子 monkey1992 » 2012-07-18 10:37

cuihao 写了:给其他用户加执行权限嘛:

代码: 全选

chmod a+x 程序
我没说清楚,这个加了的。
这个程序的所有者运行结果是显示一个文件的内容,而换其他用户运行这个程序会出现提示cat:permission denied。
这说明,其他用户执行这个程序是还是没有获得所有者的权限,看来想通过exec让脚本程序支持suid是不行的了
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: SUID权限控制问题

#6

帖子 lilydjwg » 2012-07-18 13:14

setuid 和 seteuid 都试试。
另外,arg_list 中少了 argv[0]。
头像
monkey1992
帖子: 9
注册时间: 2012-07-16 14:19

Re: SUID权限控制问题

#7

帖子 monkey1992 » 2012-07-18 16:28

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等等,这样才行。
看来我以前的想法是彻底不行了。
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: SUID权限控制问题

#8

帖子 lilydjwg » 2012-07-18 16:45

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、
头像
monkey1992
帖子: 9
注册时间: 2012-07-16 14:19

Re: SUID权限控制问题

#9

帖子 monkey1992 » 2012-07-18 17:19

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权限
头像
link_01
帖子: 1024
注册时间: 2008-11-05 13:24

Re: SUID权限控制问题

#10

帖子 link_01 » 2012-07-19 9:11

要不试试启用acl试试
笔记
-------------------------------------
http://blog.163.com/wqt_1101
回复