运行 闪亮的服务器作为非 root
run shiny server as non-root
我在虚拟机中安装了闪亮的服务器(ubuntu VirtualBox 中的服务器 14.04.4)
shiny-server --version
Shiny Server v1.4.2.786
Node.js v0.10.40
总而言之,服务器 运行 运行良好并按预期启动应用程序。
我唯一缺少和未能实现的是闪亮服务器 运行宁作为非特权用户。我什至完全设置了一个新的 VM 和闪亮的服务器,以确保没有试用配置更改仍然生效。
我将我的配置更改为不包含任何需要 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 输出中看到的一样,闪亮的服务器 运行s 是 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 用户需要满足的要求列表。实际上它定义了 shiny 服务器需要 运行 作为 root:
的状态
- 如果为任何位置启用了 user_apps 或 user_dirs。为了以各种用户身份托管应用程序,Shiny Server 必须具有 root 权限。
- 检查。我的 shiny-server.conf 既不使用 user_apps 也不使用 user_dirs
- 如果您的配置使用 run_as 将应用程序生成为多个不同的用户。
- 检查。 run_as 将 shiny 定义为唯一用户
- 如果您运行在特权端口(1-1024 范围内的端口)上连接任何服务器。
- 检查。闪亮的服务器侦听端口 3838
尽管我认为安装满足闪亮服务器的要求,但仍然 运行 是 root。
- 如何强制 shiny 服务器 运行 成为 shiny 用户,甚至是不属于 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 似乎需要启动,它通常通过启动图形环境来完成。因为我是 运行ning Ubuntu 服务器,所以不会发生这种情况。创建 upstart 手册中提到的两个文件 http://upstart.ubuntu.com/cookbook/#session-init
也无济于事,因为作业无法启动。
是否有人提示如何进行或我可以在哪里找到一些信息?
如果您的唯一目标是确保 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用户,日志文件中的警告也会消失。
我正在 运行ning Shiny Server v1.4.4.801 (Node.js v0.10.46)。在这个版本上,闪亮的初始化是通过 systemd 完成的。
要 运行 像 non-root 一样闪亮,必须编辑 /etc/systemd/system/shiny-server.service
文件。
将 setuid shiny
和 setgid 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
以在重新启动时自动启动 shiny-server。
这是使用 systemd 执行此操作的另一种方法,如果您愿意 运行 在更高的端口号 (> 5000) 上启动服务器。
运行 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
启动服务,应该运行宁作为服务帐号user/group。
我在虚拟机中安装了闪亮的服务器(ubuntu VirtualBox 中的服务器 14.04.4)
shiny-server --version
Shiny Server v1.4.2.786
Node.js v0.10.40
总而言之,服务器 运行 运行良好并按预期启动应用程序。
我唯一缺少和未能实现的是闪亮服务器 运行宁作为非特权用户。我什至完全设置了一个新的 VM 和闪亮的服务器,以确保没有试用配置更改仍然生效。
我将我的配置更改为不包含任何需要 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 输出中看到的一样,闪亮的服务器 运行s 是 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 用户需要满足的要求列表。实际上它定义了 shiny 服务器需要 运行 作为 root:
- 如果为任何位置启用了 user_apps 或 user_dirs。为了以各种用户身份托管应用程序,Shiny Server 必须具有 root 权限。
- 检查。我的 shiny-server.conf 既不使用 user_apps 也不使用 user_dirs
- 如果您的配置使用 run_as 将应用程序生成为多个不同的用户。
- 检查。 run_as 将 shiny 定义为唯一用户
- 如果您运行在特权端口(1-1024 范围内的端口)上连接任何服务器。
- 检查。闪亮的服务器侦听端口 3838
尽管我认为安装满足闪亮服务器的要求,但仍然 运行 是 root。
- 如何强制 shiny 服务器 运行 成为 shiny 用户,甚至是不属于 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 似乎需要启动,它通常通过启动图形环境来完成。因为我是 运行ning Ubuntu 服务器,所以不会发生这种情况。创建 upstart 手册中提到的两个文件 http://upstart.ubuntu.com/cookbook/#session-init
也无济于事,因为作业无法启动。
是否有人提示如何进行或我可以在哪里找到一些信息?
如果您的唯一目标是确保 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用户,日志文件中的警告也会消失。
我正在 运行ning Shiny Server v1.4.4.801 (Node.js v0.10.46)。在这个版本上,闪亮的初始化是通过 systemd 完成的。
要 运行 像 non-root 一样闪亮,必须编辑 /etc/systemd/system/shiny-server.service
文件。
将 setuid shiny
和 setgid 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
以在重新启动时自动启动 shiny-server。
这是使用 systemd 执行此操作的另一种方法,如果您愿意 运行 在更高的端口号 (> 5000) 上启动服务器。
运行 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
启动服务,应该运行宁作为服务帐号user/group。