SUID(设置用户ID)的语义

6 投票
3 回答
6215 浏览
提问于 2025-04-16 14:56

看起来我对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 file,chgrp testuser file,chmod u+s,g+x file)。接着,我把我的主用户添加到“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(文件的拥有者)的用户身份运行的。我是不是对这个概念理解错了,或者我的错误在哪里呢?

3 个回答

0

我在网上找到这个链接。你可以把SUID设置在这个包装器上,然后使用它。不过我个人更喜欢用sudo的解决方案。;)

4

设置 SUID(设置用户ID)对脚本不起作用,因为内核在看到脚本开头的 #!(也叫 shebang,魔法数字 0x23 0x21 - man magic)时,会在调用解释器 /usr/bin/python 之前就取消了权限。解决这个问题的方法是将 Python 解释器设置为 SUID root,并在执行脚本之前添加功能,以便在 SUID 位被设置的情况下,将权限更改为拥有该脚本的用户。不过,如果这样做得太简单粗暴,就会带来安全问题。如何聪明地做到这一点,可以参考这里的内容: http://perldoc.perl.org/perlsec.html

附加链接:

8

把SUID位设置在一个*.py文件上并没有什么用,因为这个脚本是由Python解释器来执行的,而这个解释器必须自己设置SUID。这里用'sudo'会更有效。

撰写回答