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

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

您认为让这些进程作为我选择的(静态)用户运行的最佳方式是什么?

我想到的唯一方法是这样的:

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

但这看起来有点乱。

是否存在一些隐藏的魔力,提供一种简单的机制,以其他非 root 用户的身份自动启动服务?

编辑: 我应该说,我在这个实例中启动的进程要么是 Python 脚本,要么是 Java 程序。我不想在它们周围编写本地包装器,所以不幸的是,我不能像 黑色建议的那样调用 Setuid ()

261744 次浏览
  • 一些守护进程(例如 apache)通过调用 Setuid ()自己完成这项工作
  • 您可以使用 Setuid-file 标志作为不同的用户运行流程。
  • 当然,您提到的解决方案也是有效的。

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

  1. 利用它的 root 权限(例如,打开日志文件,创建 pid 文件)。
  2. 在启动过程中的某个时刻放弃其根特权。

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

我不熟悉 RedHat,但是您已经在使用的 daemon实用程序(顺便说一下,它是在 /etc/init.d/functions中定义的)在任何地方都被提及为相当于 start-stop-daemon,所以它也可以改变你的程序的 uid,或者你做它的方式已经是正确的。

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

有些事情需要注意:

  • 如前所述,如果您已经是目标用户,su 将提示输入密码
  • 类似地,如果您已经是目标用户(在某些操作系统上) ,setuid (2)将会失败
  • Setuid (2)不安装/etc/limit s.conf (Linux)或/etc/user _ attr (Solaris)中定义的特权或资源控件
  • 如果您使用 setgid (2)/setuid (2)路由,不要忘记调用 initgroups (3)——关于这个 给你的更多信息

我通常使用/sbin/su 在启动守护进程之前切换到适当的用户。

还有一些要注意的事情:

  • D 脚本中的 Sudo 不好,因为它需要一个 tty (“ Sudo: 抱歉,您必须有一个 tty 才能运行 Sudo”)
  • 如果您正在对一个 Java 应用程序进行守护,那么可能需要考虑 JavaServiceWrapper (它提供了一种设置用户 ID 的机制)
  • 另一种选择可能是 Su —— session-command = [ cmd ][ user ]

为什么不在 init 脚本中尝试以下操作:

setuid $USER application_name

这招对我很管用。

在用于 svn 服务器的 CENTOS (Red Hat)虚拟机上: 编辑 /etc/init.d/svnserver 将 pid 更改为 svn 可以编写的内容:

pidfile=${PIDFILE-/home/svn/run/svnserve.pid}

并增加了选项 --user=svn:

daemon --pidfile=${pidfile} --user=svn $exec $args

最初的 pidfile 是 /var/run/svnserve.pid。守护进程没有启动,因为只有 root 用户可以在那里写。

 These all work:
/etc/init.d/svnserve start
/etc/init.d/svnserve stop
/etc/init.d/svnserve restart

我需要运行一个 Spring。Jar 应用程序作为服务,并找到了一种作为特定用户运行它的简单方法:

我将 jar 文件的所有者和组更改为希望作为其运行的用户。 然后在 init.d 中对这个 jar 进行符号链接,并启动服务。

所以:

#chown myuser:myuser /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar


#ln -s /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar /etc/init.d/springApp


#service springApp start


#ps aux | grep java
myuser    9970  5.0  9.9 4071348 386132 ?      Sl   09:38   0:21 /bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar