以不同用户身份运行Linux服务的最佳实践

Jam*_*ady 137 linux sysadmin rhel init.d

服务默认root在我的RHEL框上启动时启动.如果我没记错的话,对于使用init脚本的其他Linux发行版也是如此/etc/init.d.

您认为最好的方法是让流程作为我选择的(静态)用户运行?

我到达的唯一方法是使用类似的东西:

 su my_user -c 'daemon my_cmd &>/dev/null &'
Run Code Online (Sandbox Code Playgroud)

但这似乎有点凌乱......

是否有一些隐藏的魔法可以提供一种简单的机制来自动启动服务,就像其他非root用户一样?

编辑:我应该说我在这个实例中开始的过程是Python脚本或Java程序.我宁愿不在它们周围写一个原生包装器,所以不幸的是我无法像Black建议的那样调用setuid().

小智 67

在Debian上,我们使用该start-stop-daemon实用程序,它处理pid文件,更改用户,将守护进程放入后台等等.

我不熟悉RedHat,但是daemon你已经使用的实用程序(在/etc/init.d/functionsbtw中定义)在任何地方都被提到等同于start-stop-daemon,所以它既可以改变程序的uid,也可以改变你的方式它已经是正确的了.

如果您环顾网络,可以使用几种现成的包装纸.有些甚至可能已经包装在RedHat中.daemonize例如,看一看.

  • 在Debian上看到`/ etc/init.d/skeleton`.添加UID,GID变量并在`do_start()`use:`start-stop-daemon --start --quiet --pidfile $ PIDFILE --exec $ DAEMON --chuid $ UID:$ GID - $ DAEMON_ARGS` (10认同)
  • 在upstart脚本中如何使用/etc/init.d/functions中的守护进程功能?你能举个例子吗? (4认同)

Jam*_*ady 52

看了这里的所有建议后,我发现了一些我希望对我这个位置的其他人有用的东西:

  1. hop是正确的指向我/etc/init.d/functions:该 daemon功能已经允许您设置备用用户:

    daemon --user=my_user my_cmd &>/dev/null &
    
    Run Code Online (Sandbox Code Playgroud)

    这是通过包装进程调用来实现的runuser- 稍后将详细介绍.

  2. Jonathan Leffler是对的:Python中有setuid:

    import os
    os.setuid(501) # UID of my_user is 501
    
    Run Code Online (Sandbox Code Playgroud)

    但是,我仍然认为你不能从JVM内部进行setuid.

  3. 既没有su也没有runuser 优雅地处理你要求以你已经用户身份运行命令的情况.例如:

    [my_user@my_host]$ id
    uid=500(my_user) gid=500(my_user) groups=500(my_user)
    [my_user@my_host]$ su my_user -c "id"
    Password: # don't want to be prompted!
    uid=500(my_user) gid=500(my_user) groups=500(my_user)
    
    Run Code Online (Sandbox Code Playgroud)

要解决的这种行为surunuser,我已经改变了我的初始化脚本是这样的:

if [[ "$USER" == "my_user" ]]
then
    daemon my_cmd &>/dev/null &
else
    daemon --user=my_user my_cmd &>/dev/null &
fi
Run Code Online (Sandbox Code Playgroud)

感谢你的帮助!


Bla*_*ack 5

  • 一些守护进程(例如apache)通过调用setuid()自己完成
  • 您可以使用setuid-file标志以另一个用户身份运行该进程.
  • 当然,您提到的解决方案也适用.

如果您打算编写自己的守护进程,那么我建议调用setuid().这样,您的流程就可以

  1. 利用其root权限(例如,打开日志文件,创建pid文件).
  2. 在启动期间的某个时刻删除其root权限.