以非特权用户身份运行新贵工作

aar*_*nsw 145 upstart ubuntu setuid

让新贵工作更改其用户 ID 并以非特权用户身份运行脚本的规范方法是什么?

显然可以使用suor sudo,但这似乎很麻烦(并且会生成不必要的日志行)。

小智 110

使用 upstart v1.4,在配置文件中原生支持setuidsetgid

  • 换句话说,它在 Precise (12.04) 和更新版本中受支持。 (10认同)
  • 换句话说,在centos 6中不支持 (8认同)
  • 有关详细信息,请参阅食谱:http://upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user (7认同)
  • 令人讨厌的是,AWS 上的 Amazon Linux 发行版使用 RHEL 6 的新贵版本 (0.6.5 !!!!),因此任何使用它的人都必须使用“su”解决方案。 (6认同)
  • 作为记录,`initctl --version` 可以找到你当前的 upstart 版本。 (5认同)

小智 88

在 freenode 的#upstart 频道上询问,官方对此事的看法是:

Upstart 的未来版本将对此提供本机支持,但现在,您可以使用以下内容:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
Run Code Online (Sandbox Code Playgroud)

  • 这是适用于 Amazon Linue EC2 的唯一答案(我尝试了 sudo 和 su 的所有变体,包括 --session-command、-c、ad nauseum);他们都不允许进程一旦启动就停止;非常感谢。 (7认同)
  • 这在 CentOS 6(Upstart 0.6.5)上对我不起作用。有一系列由 `su` 发起的 fork(我认为是 4 个深),这意味着 `expect fork` 甚至是 `expect daemon` 都无法捕获最终的 PID。 (7认同)
  • 我在 Amazon Linux (Upstart 0.6.5) 上使用它来启动 Jenkins 进程(谢天谢地,它不会自我守护)并且它起作用了!我不得不稍微改变它以将标准输出重定向到日志文件并设置一些环境变量,但它起作用了!我的版本看起来像:`exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/命令[参数...]` (2认同)

Jas*_*mbs 17

使用 start-stop-daemon 怎么样?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd
Run Code Online (Sandbox Code Playgroud)

新贵食谱

Debian 和 Ubuntu 系统的推荐方法是使用 helper 实用程序start-stop-daemon。[…]start-stop-daemon不会对其启动的进程施加 PAM(“可插拔身份验证模块”)限制。

注意:start-stop-daemon在 RHEL 中不受支持。

  • 如果需要,您也可以使用该组。使用 --chuid daemonuser:daemongroup (2认同)

小智 13

有几种方法可以做到这一点,所有的语义都略有不同,特别是与组成员资格有关:

  • setuidgid 会将您放入您指定的组中。

    • 原来daemontools的setuidgid会把你在该组中,这样你就不能到属于你的成员,其他组的访问文件。
    • setuidgid从daemontools的,安可setuidgid从NOSH工具集都有一个-s(又名--supplementary)选项,这将让你在该组中,也把你所有的补充组为您指定的用户。
  • 使用newgrp一旦你成为少特权用户将添加一个组到您的groupset,而且还创建了一个新的子shell,使其成为棘手的脚本内使用。

  • start-stop-daemon 保留您的组成员资格,并且不仅是 setuid/setgid 还可以做很多事情。

  • chpst -u username:group1:group2:group3... commandname将让您准确指定要采用的组成员身份,但(在Ubuntu 中)它仅随runit包提供,这是upstart.

  • su -c commandname username获取用户名的所有组成员身份,就像 一样sudo -u username commandname,因此它们可能是最不令人惊讶的途径。


aar*_*nsw 8

setuidgid从包中使用daemontools

此处的文档:http : //cr.yp.to/daemontools/setuidgid.html

  • daemontools 不是暴发户的先决条件,所以这似乎不是“规范”的答案 (7认同)
  • 此外,daemontools 在 Universe (ubuntu 10.04) 中,upstart 在 main 中。 (2认同)