6

看来我在理解 SUID 位的语义时遇到了一些麻烦,也许有人可以帮我澄清一下情况。

我对SUID位语义的理解如下:当我用一个文件设置SUID位时,文件将作为文件的所有者而不是文件的调用者来执行。因此,为了测试这种行为,我编写了以下 python 脚本:

#!/usr/bin/python3 -O

import os

def main():
        print('Real UserID: %d' % os.getuid())
        print('Effective UserID: %d' % os.geteuid())

if __name__ == '__main__':
        main()

之后,我使用相应的组“testuser”创建了一个名为“testuser”的用户,并调整了文件权限(chown testuser 文件、chgrp testuser 文件、chmod u+s、g+x 文件)。接下来,我将我的主用户添加到“testuser”组,以便我可以作为该组的成员执行该文件。毕竟文件权限看起来像这样:

-rwsr-xr-- 1 testuser testuser  168 2011-04-02 13:35 procred.py*

因此,当我以 testuser 身份登录时,脚本会产生输出:

Real UserID: 1001
Effective UserID: 1001

...当我以主要用户身份运行脚本时,脚本输出:

Real UserID: 1000
Effective UserID: 1000

现在据我了解,该脚本应该在后面的执行中以具有 uid 1001(文件所有者)的用户身份运行。我是不是把整个概念都弄错了,或者我的错误在哪里?

4

3 回答 3

8

在 *.py 文件上设置 SUID 位在这里没有任何帮助,因为脚本由 Python 解释器执行,在这种情况下必须设置 SUID。在这里使用 'sudo' 是你最好的朋友。

于 2011-04-02T13:02:54.117 回答
4

设置 SUID 对脚本不起作用,因为内核看到 #! (shebang - 幻数 0x23 0x21 - man magic)并在使用脚本作为输入调用解释器 /usr/bin/python 之前放弃特权。一种解决方法是设置 python 解释器 SUID root 并添加功能以在执行脚本之前更改拥有脚本的用户的权限,以防设置 SUID 位。以天真的方式这样做会带来安全问题。如何以聪明的方式做到这一点可以在这里找到:http: //perldoc.perl.org/perlsec.html

附加链接:

于 2011-04-02T16:09:50.177 回答
0

我在网上找到了这个链接。您可以将 SUID 设置为此包装器并使用此包装器。但个人更喜欢 sudo 解决方案。;)

于 2011-05-11T10:07:04.013 回答