【问题标题】:Semantics of SUID (Set-User-ID)SUID 的语义(Set-User-ID)
【发布时间】:2011-07-28 06:05:31
【问题描述】:

似乎我在理解 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(文件所有者)的用户身份运行。我是不是把整个概念都弄错了,还是我的错误在哪里?

【问题讨论】:

    标签: python permissions semantics suid


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      其他链接:

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-15
          • 2016-09-05
          • 1970-01-01
          • 1970-01-01
          • 2021-03-19
          • 1970-01-01
          相关资源
          最近更新 更多