我有一个post-receive钩子,它调用我的bash脚本(它会拉动本地仓库并重新启动Java服务器)。
这是收件后挂钩的所有者信息:
-rwsr-x--x 1 cyril devs 676 19 dec. 14:45 post-receive
正如您所看到的,我在此脚本上设置了setuid bit
,以便其他用户也可以cyril/devs
运行。
此脚本的内容非常简单:
echo "Running post-receive hook"
echo "Server will be up and running in about 1 minute"
/home/project/start_dev restart &
我的脚本start_dev
拥有这些权利:
-rwsr-x--- 1 cyril devs 1515 19 dec. 14:41 start_dev
注意:setuid.
如果我使用帐户cyril
向服务器推送内容,则效果非常好。
如果其他人使用其他帐户推送到服务器,他们会:
remote: /home/project/start_dev: line 52: kill: (11490) - Operation not allowed
(kill用于停止实例。)
为什么他们有这个错误,脚本应该以{{1}}而不是用户运行,因此他们应该有权杀死这个实例,对吗?
我做错了什么?
感谢您的帮助!
答案 0 :(得分:1)
显然,大多数Linux发行版都会为shell脚本禁用setuid
,因为它可能导致大量安全漏洞。更多信息here和setuid Wikipedia page。
虽然setuid功能在许多情况下非常有用,但它的不当使用可能会带来安全性 如果将setuid属性分配给不仔细的可执行程序,则存在风险 设计的。由于潜在的安全问题,许多操作系统忽略了setuid 应用于可执行shell脚本时的属性。
Tuxation页面的一个可能解决方案是执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid( 0 );
system( "/path/to/script.sh" );
return 0;
}
然后setuid
生成的C程序并将其用作钩子。之后在Tuxation页面上也有这个评论:
尽管如此,使用setuid运行shell脚本并不是非常安全,而且发行版也是如此 当很多人禁用它时,设计师非常清楚他们在做什么。