似乎我在理解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(文件的所有者)的用户身份运行。我是否认为整个概念错了或我的错误在哪里?
答案 0 :(得分:8)
在* .py文件上设置SUID位在这里没有任何帮助,因为脚本由Python解释器执行,在这种情况下必须设置SUID。使用'sudo'是你在这里的好朋友。
答案 1 :(得分:4)
设置SUID对脚本不起作用,因为内核看到了#! (shebang - 幻数0x23 0x21 - man magic)并在使用脚本作为输入调用解释器/ usr / bin / python之前删除权限。一种方法是设置python解释器SUID root并添加功能以在执行脚本之前更改拥有脚本的用户的权限,以防设置SUID位。以天真的方式执行此操作会带来安全问题。如何以智能方式进行操作可以在这里找到:http://perldoc.perl.org/perlsec.html
其他链接:
答案 2 :(得分:0)
我在网络上发现了这个link。您可以将SUID设置为此包装并使用此包装。 但个人更喜欢sudo解决方案。 ;)