我有一个长期运行的,守护进程的Python进程,它使用子进程在发生某些事件时生成新的子进程.长时间运行的进程由具有超级用户权限的用户启动.我需要它生成的子进程作为不同的用户(例如,"nobody")运行,同时保留父进程的超级用户权限.
我正在使用
su -m nobody -c <program to execute as a child>
Run Code Online (Sandbox Code Playgroud)
但这似乎是重量级的,并不会非常干净地死去.
有没有办法以编程方式完成此操作而不是使用su?我正在查看os.set*uid方法,但Python std lib中的doc在该领域非常稀少.
这是一个set-root-uid程序
$ls -l
-rwsr-sr-x 1 root root 7406 2011-12-13 22:37 ./x*
Run Code Online (Sandbox Code Playgroud)
int main(void) {
printf(
" UID GID \n"
"Real %d Real %d \n"
"Effective %d Effective %d \n",
getuid (), getgid (),
geteuid(), getegid()
);
seteuid(600);
printf(
" UID GID \n"
"Real %d Real %d \n"
"Effective %d Effective %d \n",
getuid (), getgid (),
geteuid(), getegid()
);
setuid(1000);
printf(
" UID GID \n"
"Real %d Real %d \n"
"Effective %d Effective %d \n",
getuid (), getgid (), …
Run Code Online (Sandbox Code Playgroud) 我需要以root身份运行bash脚本(无密码sudo或su不可行),因为你无法在Linux中设置脚本,我想从可执行文件调用它并使其成为 setuid:
$ cat wrapper.c
int main(void)
{
system("/bin/bash ./should_run_as_root.sh");
}
$ gcc -o wrapper wrapper.c
$ sudo chown root wrapper
$ sudo chmod ug+s wrapper
$ ll wrapper
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper
$
Run Code Online (Sandbox Code Playgroud)
这有效 - 就像正确运行脚本一样 - 但脚本以执行"./wrapper"的用户身份运行.
为什么?以及如何正确实现这一点?
谢谢!
我正在尝试运行sudo,它失败了:
gregd@david $ sudo ls
sudo: must be setuid root
gregd@david $ which sudo
/usr/bin/sudo
gregd@david $ ll /usr/bin/sudo
-rwxr-xr-x 1 root root 165K 2012-05-16 00:25 /usr/bin/sudo*
Run Code Online (Sandbox Code Playgroud)
对于如何解决这个问题,有任何的建议吗?
我有一个librandom.so
库和一个main
exectuable,编译如下:
$ clang++ -o main main.o -lrandom -L. -Wl,-rpath,"\$ORIGIN"
Run Code Online (Sandbox Code Playgroud)
它们都在同一目录中.由于main
它$ORIGIN
在其中rpath
,它工作正常 - ./main
返回没有错误.
现在,我设置main
与运行setuid
为root
:
$ sudo chown root main
$ sudo chmod a+s main
$ ./main
Run Code Online (Sandbox Code Playgroud)
我预计main
会失败,因为$ORIGIN
没有在setuid
应用程序中扩展.令人惊讶的是,它有效.
如果我运行main
从另一个目录,但是,它不会如预期失败:
$ cd /tmp
$ /path/to/main
/path/to/main: error while loading shared libraries: librandom.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
当我main
从包含目录运行时为什么它可以工作?
我有一个以root身份运行的程序.我希望该程序作为普通用户执行另一个应用程序.我尝试过setgid()
它可以工作,但我不能再回到root用户或其他用户.目前的计划非常简单;
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[] )
{
if ( argc != 2) {
printf("usage: %s command\n",argv[0]);
exit(1);
}
setgid(100);
setuid(1000);
putenv("HOME=/home/caroline");
putenv("DISPLAY=:0");
system(argv[1]);
seteuid(1001);
putenv("HOME=/home/john");
putenv("DISPLAY=:1");
system(argv[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?这就像命令的行动su $user-c $command
我作为一个没有特权的用户在linux和Solaris上运行这个小的python脚本:
#!/usr/bin/python
import os
print 'uid,euid =',os.getuid(),os.geteuid()
Run Code Online (Sandbox Code Playgroud)
在运行之前,setuid位在脚本上设置(而不是在python解释器上):
chown root:myusergrp getuid.py
chmod 4750 getuid.py
Run Code Online (Sandbox Code Playgroud)
在Solaris上,由于setuid位而设置了有效uid:
uid,euid = 10002 0
Run Code Online (Sandbox Code Playgroud)
但不是在Linux上:
uid,euid = 10002 10002
Run Code Online (Sandbox Code Playgroud)
请注意,Solaris和Linux的python版本均为2.6
是否可以让Python Linux作为Python Solaris运行?
我不得不为某人做一个肮脏的Linux黑客攻击,这样他们就可以cupsenable printername
在非root用户的情况下使用shell命令启动打印机.我不希望他们能够以cupsenable
root 身份使用整个语法,所以我只写了一个C包装器来清理输入argv[1]
和调用system("cupsenable sanitizedprintername")
.
我使程序setuid root,但即便如此,cupsenable
失败了"权限被拒绝".然后我setuid(0)
在之前插入了一个电话system()
,并且看,它起作用了.
忽视有更好的方法让用户控制打印机的问题.可能有更好的方法.我感兴趣的是chmod u+s
vs setuid(0)
vs. 的错综复杂system()
.为什么这样做?
我正在尝试做安全的事情,并且有一个程序需要以root身份运行才能在不需要它时删除它的权限.如果我chmod
的SUID位是二进制,并且它属于root,那么这很有效,因为现在我有UID =某个用户,而EUID = root,所以我可以使用seteuid(0)
和seteuid(getuid())
分别提升和删除管理员权限.
但是,如果我使用sudo
而不是设置SUID,那么UID == EUID == 0,因此调用seteuid(getuid())
不会有任何影响.而且我不能仅仅UID
从一些随机用户那里改变一些价值,因为setuid()
手册页明确指出,如果从以root身份运行的程序调用它,那么就会失去权利,没有希望让他们回来.
那么,如何让我的程序在运行时暂时失去其权限sudo
?
我正在尝试设置一个git post-receive钩子,这样当收到提交时,机器上另一个存储库的克隆会更新(即确实如此git pull origin master
).我正在使用gitosis来服务于存储库,因此我相信post-receive hook将作为gitosis
用户运行,而我想要在receive上更新的存储库是由www-data
.我应该怎么做呢?
我听说过setuid
脚本,但我不确定这是否会带来安全风险?如果这不是安全风险,我将如何做到这一点?我猜我会做一些像脚本所拥有的东西www-data
,让它成为世界可执行的并启用setuid位?我想这个脚本几乎无害,因为它只是更新存储库,但我想确定.谢谢!
编辑:有没有办法使用sudo
?这比那更安全setuid
吗?我的意思是,我不认为setuid
如果用户不是root用户会有很多问题,但是看起来好像我必须跳过一些箍setuid
才能运行脚本.
第二次编辑:似乎我可以通过一些/etc/sudoers
魔术来做到这一点sudo -u
.也许我应该在ServerFault上发布这个,但至少我从这一努力中学到了一些东西.