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


142

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

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

Answers:


108

在新贵v1.4中,配置文件本身支持setuidsetgid



10
换句话说,Precise(12.04)和更高版本中都支持它。
爱德华·安德森

8
换句话说,在centos 6中不支持
socketpair 2013年

5
作记录,initctl --version以查找您当前的新贵版本。
Mahn 2014年

4
令人讨厌的是,AWS上的Amazon Linux发行版使用RHEL 6的新贵版本(0.6.5 !!!!),因此使用该版本的任何人都必须使用'su'解决方案。
Asfand Qazi

86

在freenode上的#upstart频道上提问,对此的官方说法是:

Upstart的未来版本将对此提供本机支持,但是现在,您可以使用类似的方法:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

7
这是在Amazon Linue EC2上起作用的唯一答案(我尝试了sudo和su的所有变体,包括--session-command,-c,ad nauseum);一旦启动,它们都不允许停止进程;非常感谢。
加藤

那是一些花哨的贝壳魔法,+ 1。
史蒂夫·凯莱特

6
这在CentOS 6(新贵0.6.5)上对我不起作用。这引发了一系列的分叉(我认为深度为4),su这意味着expect fork甚至expect daemon不捕获最终的PID。
马克·拉卡塔

2
我在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/command [parameters...]
Asfand Qazi

17

如何使用start-stop-daemon?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd

新贵食谱

对于Debian和Ubuntu系统,推荐的方法是使用helper实用程序start-stop-daemon。[…] start-stop-daemon并未对其启动的过程强加PAM(“可插入身份验证模块”)限制。

注意:start-stop-daemonRHEL不支持。


2
如果需要,您也可以使用该组。使用--chuid daemonuser:daemongroup
Evgeny

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因此它们可能是使您惊讶最少的途径。



4

在Amazon EC2上的Ubuntu 10.10实例上,我最好使用该start-stop-daemon命令。

我还与其他一些新贵斗争。我正在调用一个python应用程序,该程序具有virtualenv对我执行的程序的特定参数。

以下是对我有用的。

script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script

PYTHONPATH是让从源代码安装一些包到PYTHON模块路径中的新贵作业运行时。我必须在绝对路径中进行所有操作,因为该chdir节似乎没有起作用。


我也遇到了与exec start-stop-daemon一起使用的env变量的问题。
Thomas Bratt

3

我使用的是CentOS 6,我无法获得推荐的破解工具(适用于Upstart 0.6.5),也无法使用``su''技巧,因为涉及的分叉数量(我认为是4)没有被``期望分叉''跟踪或“期望守护程序”。

我最终只是做了

chown user:group executable
chmod +s executable

(即设置setuid位并更改所有权)。

这可能不是最安全的方法,但是对于内部研发项目而言,在我们的情况下这并不重要。


如果您要在其中执行a chmod 1700或至少执行一次a chmod u+sx,go-x,而不是仅执行+s,那么就算是“足够安全”。:)
dannysauer 2015年

0

根据您要实现的目标,还有第三种可能性。您也许可以放宽有关文件/设备上的访问控制。这可以允许没有特权的用户安装或访问他们通常不被允许的物品。只要确定您没有在此过程中遗失通往王国的钥匙即可。

您还可以更改sudo密码缓存的超时。但是我不建议您这样做,除非您的计算机在物理上是安全的(例如,您认为路人不太可能尝试获得sudo访问权限)。

有充分的理由说明,执行特权操作的方法很少,而且它们执行不必要的 必要日志记录。宽松的限制将对您的系统造成安全隐患,而缺少日志记录将意味着您无法知道受到威胁时所发生的情况。

如果您担心日志文件的大小,则可能是错误的。在正常情况下,Sudo每次使用仅生成一行。


0

在CentOS 6中,新贵0.6.5对我有用。

script

    exec su user_name << EOF
        exec /path/to/command [parameters...]
EOF

end script

要么 :

script

    exec su user_name << EOF
       ..... what you want to do ....
EOF

end script

使用时

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

不能停止工作流程initclt stop。我认为原因是:

1. the job forked and the main process is not tracked.
2. the main process changed its process group,because of `su -c`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.