如何从POSIX shell脚本中删除root权限?

时间:2014-06-16 20:15:20

标签: shell root

有哪些便携式选项可用于删除root权限并以与shell脚本不同的用户身份执行给定命令?

在做了一些研究之后,这里有一些非选择:

  • su $USER -c "$COMMAND"使用PAM堆栈并创建一个新的cgroup(在systemd下运行时)。它也在用户命名空间中失败,因为审计调用在旧版本的Linux上返回-EPERM。
  • 许多系统上默认不安装
  • sudo -u $USER $COMMAND
  • start-stop-daemon --pidfile /dev/null --start --chuid $USER --startas /bin/sh -- -c "$COMMAND"非常难以使用,只能在Debian系统上使用。
  • 许多系统都缺少
  • chpst -u $USER $COMMAND
  • runuser -u $USER -- $COMMAND适用于su不在的地方,但需要最近的util-linux。

2 个答案:

答案 0 :(得分:2)

如果它是你想要的POSIX,那么su是你唯一的选择(除非你想编写一个C程序)。 su有几个优点(或不符合您的要求):

  • 这是一个系统工具,不会忘记在Linux 3.42(用于饮料饮用的UID)中引入的新咖啡UID,并且不会因为在群组权限之前删除用户权限或忘记能力。
  • 它将权限设置为已知状态:用户ID,该用户从用户和组数据库中记录的组,没有额外功能。
  • 记录日志条目。
  • 而且,它是完全标准的,保证可以在任何地方使用,但在最破碎的系统上。

现在实际上有些系统不是POSIX - 就像这个旧的Linux,它在用户命名空间中失败了。他们是休息。

如果你想要一些在实践中相当便携的东西(在非嵌入式平台上)并且为你提供更大的控制权,那就使用Perl(或Python,不太常见的安装)。首选,使用实体模块:Privilege::Drop

perl -e 'use Privileges::Drop; drop_uid_gid(123, 456); exec("/path/to/command", "--option", "an argument")'

Privilege::Drop负责处理事情(删除补充组,检查错误)。然而,它可能并不完整;例如,它不了解能力。

如果你必须手工完成,请注意以下几点:

  • 在用户权限之前删除组权限。
  • 要删除补充组,请设置$) = "456 456",其中456是目标GID($) = 456只会设置EGID而不会影响补充组。)
  • 之后检查(E)[UG] ID并在失败时中止。

答案 1 :(得分:1)

对于在“POSIX shell 脚本”的相关含义是“POSIX sh 脚本,在任意 Linux 系统上运行”,而不是“sh 脚本,在保证能够运行的系统上运行”的上下文中阅读本文的人只有POSIX保证的工具”,还有更多的选择。

借用对UNIX & Linux问题How do I drop root privileges in shell scripts的一个很好的回答:

  • 现代的util-linuxsetpriv,可以这样使用:

    setpriv --reuid=user --regid=group --init-groups --inh-caps=-all yourcommand
    

@JdeBP Don't Abuse su For Dropping Privileges 的优秀文章也值得一读。