【问题标题】:How to drop root privileges from a POSIX shell script?如何从 POSIX shell 脚本中删除 root 权限?
【发布时间】:2014-06-16 20:15:20
【问题描述】:

确实存在哪些可移植选项来删除 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。

【问题讨论】:

标签: shell root


【解决方案1】:

如果您想要的是 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 并在失败时中止。

【讨论】:

  • 如果 su 是要走的路,如何让 su 再次工作?升级内核是容易的部分,但 systemd 部分仍然很麻烦。
  • @HelmutGrohne 我不知道。我建议在Unix & Linux 上询问有几个 systemd 爱好者(我没有)。
【解决方案2】:

对于在“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
    

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

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2011-09-15
    • 2011-02-11
    • 2018-12-22
    • 2020-12-31
    相关资源
    最近更新 更多