以非 root 身份运行闪亮的服务器

Posted

技术标签:

【中文标题】以非 root 身份运行闪亮的服务器【英文标题】:run shiny server as non-root 【发布时间】:2016-07-12 02:13:25 【问题描述】:

我在虚拟机中安装了闪亮的服务器(VirtualBox 中的 ubuntu 服务器 14.04.4)

shiny-server --version

Shiny Server v1.4.2.786
Node.js v0.10.40

总而言之,服务器运行良好并按预期启动应用程序。

我唯一缺少且未能实现的是闪亮的服务器以非特权用户身份运行。我什至完全设置了一个新的虚拟机和闪亮的服务器,以确保没有任何试用配置更改仍然生效。

我将配置更改为不包含任何需要 root 权限的文件夹:

$ cat /etc/shiny-server/shiny-server.conf
# Instruct Shiny Server to run applications as the user "shiny"
run_as shiny;

# Define a server that listens on port 3838
server 
  listen 3838;

  # Define a location at the base URL
  location / 

    # Host the directory of Shiny Apps stored in this directory
    # site_dir /srv/shiny-server;
    site_dir /home/shiny/shiny_sitedir/apps; 

    # Log all Shiny output to files in this directory
    # log_dir /var/log/shiny-server;
    log_dir /home/shiny/shiny_sitedir/logs;

    # When a user visits the base URL rather than a particular application,
    # an index of the applications available in this directory will be shown.
    directory_index on;
  



# privileges of shiny user
uid=1000(shiny) gid=1000(shiny) groups=1000(shiny),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lpadmin),111(sambashare)

# owner of /etc/shiny-server
-rw-r--r--  1 root root shiny-server.conf

# trying to start shiny server as user shiny without sudo
$ start shiny-server 
start: Rejected send message, 1 matched rules; type="method_call", sender=":1.6" (uid=1000 pid=1134 comm="start shiny-server ") interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)" requested_reply="0" destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init ")

服务器日志告诉我,我从 htop 输出中看到,闪亮的服务器以 root 身份运行。 (附注:shiny server 仍然使用/var/log/shiny-server.log 而不是/home/shiny/shiny_sitedir/logs,这也让我很恼火)

[...] [INFO] shiny-server - Shiny Server v1.4.2.786 (Node.js v0.10.40)
[...] [INFO] shiny-server - Using pidfile /var/run/shiny-server.pid
[...] [INFO] shiny-server - Using config file "/etc/shiny-server/shiny-server.conf"
[...] [WARN] shiny-server - Running as root unnecessarily is a security risk! You could be running more securely as non-root.
[...] [INFO] shiny-server - Starting listener on 0.0.0.0:3838

闪亮的服务器文档http://docs.rstudio.com/shiny-server/#running-shiny-server-with-root-privileges 提供了一个非 root 用户需要满足的要求列表。实际上,它定义了闪亮服务器需要以 root 身份运行的状态:

    如果为任何位置启用了 user_apps 或 user_dirs。为了以不同用户的身份托管应用程序,Shiny Server 必须具有 root 权限。 检查。我的 shiny-server.conf 既不使用 user_apps 也不使用 user_dirs 如果您的配置使用 run_as 将应用程序生成为多个不同的用户。 检查。 run_as 将 shiny 定义为唯一用户 如果您在特权端口(1-1024 范围内的端口)上运行任何服务器。 检查。闪亮的服务器侦听端口 3838

虽然我认为安装满足要求,但闪亮的服务器仍然以 root 身份运行。

如何强制闪亮服务器以闪亮用户甚至不属于 sudoers 组的用户身份运行? shiny-server.conf 是否需要定位到其他任何地方? 那么我如何让 shiny-server 知道这个新位置? 我是否需要更改 /opt/shiny-server/config/ 中的任何内容或 /etc/shiny-server/ 上的任何权限?

在@warmoverflow 发表评论后进行编辑,我将/etc/init/shiny-server.conf 移至~/.init。现在,闪亮的服务器不会在启动时自动启动。但是start shiny-server 也没有成功,因为暴发户不知道~/.init 文件夹。从一些论坛帖子看来,dbus 需要启动,它通常通过启动图形环境来完成。当我运行 Ubuntu 服务器时,这不会发生。创建新贵手册http://upstart.ubuntu.com/cookbook/#session-init 中提到的两个文件也无济于事,因为作业无法启动。

有没有人提示如何进行或在哪里可以找到一些信息?

【问题讨论】:

这里的问题是start 命令必须以root 身份运行,即使它启动的实际服务是以非root 用户身份运行的。有一种方法可以在没有 root 的情况下运行 start,但如果您愿意的话,您需要修改您的 upstart 配置文件。见blog.arkency.com/2014/07/… @warmoverflow:感谢您的提示。我想我迈出了一步,但现在我又被卡住了——我添加了一个编辑来记录我所做的事情。 【参考方案1】:

如果您的唯一目标是确保shiny-server 以非root 用户身份运行,并且您可以使用sudo 启动shiny-server(即使它以sudo 启动,它也可以以非root 用户身份运行)。

编辑/etc/init/shiny-server.conf,然后

    在开头添加以下两行

    setuid shiny
    setgid shiny
    

    将倒数第三行改为

    exec shiny-server --pidfile=/home/shiny/shiny-server.pid >> /home/shiny/shiny-server.log 2>&1
    

请注意,Shiny 有两个默认的日志文件位置。

    /var/log/shiny-server.log 包含服务器本身的日志,并在/etc/init/shiny-server.conf中定义

    /var/log/shiny-server/ 是包含应用程序日志文件的文件夹,在/etc/shiny-server/shiny-server.conf 中定义。

完成上述更改并更改run_as 用户后,再次使用sudo start shiny-server 启动shiny-server,您会注意到shiny-server 实际上是以非root 用户身份运行的,并且日志文件中的警告也会消失。

【讨论】:

我已经很近了,但还很远。第二点很关键!我的/etc/init/shiny-server.conf 几乎拥有一切,缺少第二个提示,这使得闪亮服务器无法启动。非常感谢! 为了清楚起见,将其添加到 /etc/init/shiny-server.conf 很重要,而不是类似名称的 /etc/shiny-server/shiny-server.conf :) 答案这里正确地说明了这一点,这对我来说只是一个小困惑 重温一遍说改成/home/shiny/shiny-server.pid的“第2步”其实很重要。否则闪亮将无法在重新启动后启动特别明显(我反复使用sudo service shiny-server restart,但在重新启动时它不会启动。只有在更改 pidfile 位置后,闪亮服务器才会在重新启动时启动)【参考方案2】:

我正在运行 Shiny Server v1.4.4.801 (Node.js v0.10.46)。在这个版本中,闪亮的初始化是通过 systemd 完成的。

要以非 root 用户身份运行 Shiny,必须编辑 /etc/systemd/system/shiny-server.service 文件。 将setuid shinysetgid shiny 命令添加到ExecStart,如下所示:

ExecStart=/bin/bash -c 'setuid shiny; setgid shiny; /opt/shiny-server/bin/shiny-server --pidfile=/var/run/shiny-server.pid >> /var/log/shiny-server.log 2>&1'

现在,可以通过输入systemctl start shiny-server.service 来启动闪亮的服务器。

键入systemctl enable shiny-server.service 以在重新启动时自动启动闪亮服务器。

【讨论】:

【参考方案3】:

如果您愿意在更高的端口号 (> 5000) 上运行闪亮的服务器,这是使用 systemd 执行此操作的另一种方法。

运行systemctl edit shiny-server.service 并添加:

[Service]
User=shiny
Group=shiny
UMask=027

然后systemctl stop shiny-server.service 并编辑/etc/shiny-server/shiny-server.conf 并将其更改为listen 8383;

如果您还没有,请执行以下操作:

chown -R shiny:shiny /var/log/shiny-server* /etc/shiny-server
chmod -R u+rwX,g+rX,o-rwx /var/log/shiny-server* /etc/shiny-server

启动服务,它应该作为服务帐户用户/组运行。

【讨论】:

以上是关于以非 root 身份运行闪亮的服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何以非 root 用户身份使用 CPAN?

以非 root 用户身份运行 Nginx

在 Docker 中以非 root 用户身份运行应用程序

如何在 Docker 容器中以非 root 用户身份启动 cron?

如何在官方 docker php 映像上以非 root 用户身份运行 composer

Firefox headless 不能在 Docker 中以非 root 用户身份工作