作为不同用户运行Linux服务的最佳实践

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

您认为最好的方式是让流程像我选择的(静态)用户那样运行?

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

 su my_user -c 'daemon my_cmd &>/dev/null &'

但是这似乎有点不整洁...

是否有一些魔力隐藏起来,提供了一种简单的机制来自动启动其他非root用户的服务?

编辑:我应该说我在这个实例中启动的过程是Python脚本或Java程序。 我宁愿不在周围写一个本地包装器,所以不幸的是,我无法像Black所暗示的那样调用setuid()。


在Debian上,我们使用start-stop-daemon实用程序,该实用程序处理pid文件,更改用户,将守护程序置于后台等等。

我对RedHat并不熟悉,但是您已经使用的daemon实用程序(在/etc/init.d/functions定义)在任何地方都被称为start-stop-daemon的等同物,所以无论是它也可以改变程序的uid,或者你做的方式已经是正确的了。

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


在看了这里的所有建议之后,我发现了一些我希望在我的立场中对其他人有用的东西:

  • hop是正确的,可以指向我/etc/init.d/functionsdaemon功能已允许您设置备用用户:

    daemon --user=my_user my_cmd &>/dev/null &
    

    这是通过用runuser包装进程调用来runuser - 稍后再介绍。

  • Jonathan Leffler是对的:Python中有setuid:

    import os
    os.setuid(501) # UID of my_user is 501
    

    但是,我仍然认为你不能从JVM内部设置setuid。

  • surunuser都不会优雅地处理您要求以您已经是用户的身份运行命令的情况。 例如:

    [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)
    
  • 为了解决surunuser行为,我已经将我的初始化脚本更改为如下所示:

    if [[ "$USER" == "my_user" ]]
    then
        daemon my_cmd &>/dev/null &
    else
        daemon --user=my_user my_cmd &>/dev/null &
    fi
    

    感谢你的帮助!


  • 一些守护进程(例如apache)通过调用setuid()
  • 您可以使用setuid-file标志以不同的用户身份运行该进程。
  • 当然,你提到的解决方案也适用。
  • 如果你打算编写自己的守护进程,那么我建议调用setuid()。 这样,你的过程可以

  • 利用它的根特权(例如打开日志文件,创建pid文件)。
  • 在启动期间的某个时候放弃其root权限。
  • 链接地址: http://www.djcxy.com/p/90037.html

    上一篇: Best practice to run Linux service as a different user

    下一篇: service stopped after reboot