使用os.setuid()[python]“不允许操作”

时间:2011-09-23 12:53:38

标签: python operating-system privileges setuid

我正在尝试构建一个平台来启动一些脚本。此脚本放在每个用户的主文件夹中。每次启动都应该使用每个用户ID,所以,我正在为每个用户执行此操作:

user_id = pwd.getpwnam( user )[ 3 ]
user_home = pwd.getpwnam( user )[ 5 ]

os.chdir( user_home )
os.setuid( user_id )

subprocess.Popen( shlex.split( "user_script.py" ) )

但是,当python尝试执行os.setuid( user_id )时,会引发此异常:

Traceback (most recent call last):
  File "launcher.py", line XX, in <module>

OSError: [Errno 1] Operation not permitted

顺便说一句,启动此脚本的用户位于根组(在GNU / linux OS上)并且具有所有root权限。

如果我尝试使用root用户启动相同的代码,我会收到不同的错误:

OSError: [Errno 13] Permission denied

如果有人可以帮助我了解正在发生的事情,请...

5 个答案:

答案 0 :(得分:5)

只有root可以执行setuid,在root-group中是不够的。

答案 1 :(得分:2)

只有超级用户可以随时更改uid,只是将用户添加到根组是不够的。

setuid(2)例如提到:

 The setuid() system call is permitted if the specified ID is equal to the
 real user ID or the effective user ID of the process, or if the effective
 user ID is that of the super user.

在Linux上,还有:

   Under Linux, setuid() is implemented like the POSIX version with the 
   _POSIX_SAVED_IDS feature.  This allows a set-user-ID (other than  root)
   program to drop all of its user privileges, do some un-privileged work, and
   then reengage the original effective user ID in a secure manner.

我甚至不知道Python是否直接实现了这一点,但它并不完全是你想要的。

所以简短的回答是:以root身份开始初始流程。

如果您担心安全性,请启动两个进程,一个作为root用户,一个作为非特权用户,并让非特权进程通过套接字与root进程通信。这是一个更高级的设置,但是......

答案 2 :(得分:0)

OSError: [Errno 1] Operation not permitted表示启动脚本的用户没有足够的权限。进入根组是不够的,它实际上需要 CAP_SETUID 功能。

OSError: [Errno 13] Permission denied可能是一个无关的错误。你应该看看它的堆栈跟踪。

答案 3 :(得分:0)

该行

subprocess.Popen( shlex.split( "user_script.py" ) )

以多种方式让我感到困惑。

  1. shlex.split()似乎是多余的,因为没有什么可以拆分。
  2. 最好将Popen()的参数放在列表中。
  3. 如果user_script.py没有执行权限,即使root也无法执行此操作。

答案 4 :(得分:0)

您还使用setuid权限。那就是,

       chmod 4755 script.py

现在,即使是普通用户,如果执行该程序,它也会切换为特定用途。您不会得到任何许可问题。