非特权、非root用户如何在无需root或sudo权限的情况下启动或重启Web服务器,例如nginx?

10

我正在使用Capistrano来部署Rails Web应用程序。我想尽可能减少Web服务器上的部署用户的权限。作为非特权用户,我能够完成所有需要完成的工作,除了重启Web服务器。

我在Ubuntu服务器上进行此操作,但这个问题并不特定于我的用例(Rails,Capistrano,部署),我已经看到了很多解决此问题的方法,这些方法似乎涉及糟糕的安全实践。想知道其他人是否可以评估我的解决方案并建议其是否安全?

首先,虽然不是必需的,但我不知道为什么/etc/init.d/nginx需要其他用户(甚至是只读)访问权限。如果他们需要阅读它,请让他们成为root用户(通过sudo或其他方式),所以我:

chmod 750 /etc/init.d/nginx

由于所有权归属于root用户和root用户组(或者可以通过“chown root:root /etc/init.d/nginx”命令设置),所以只有root用户或正确使用sudo权限的用户才能读取、更改或运行/etc/init.d/nginx,我不会给予我的部署用户这样的广泛权限。相反,我只会给予部署用户特定的sudo权限来运行控制脚本/etc/init.d/nginx。他们将无法运行编辑器来编辑它,因为他们只有执行该脚本的能力。这意味着如果某人作为部署用户访问我的服务器,他们可以重新启动和停止nginx进程等操作,但他们不能进行更多的操作,例如更改脚本以执行其他恶意操作。

具体而言,我正在做以下事情:

visudo

visudo是一种特殊的工具,用于编辑sudoers文件,您需要具有sudoer权限才能访问它。

使用visudo,我添加:

# Give deploy the right to control nginx
deploy ALL=NOPASSWD: /etc/init.d/nginx

请查看sudo手册,但据我所知,第一列是被授予sudo权限的用户,本例中为“deploy”。ALL表示deploy可以从所有类型的终端/登录访问(例如,通过ssh)。结尾的/etc/init.d/nginx ONLY允许deploy用户具有以root身份运行/etc/init.d/nginx的权限(在此情况下,NOPASSWD表示无需密码,这对于不需要人工干预的部署非常重要)。deploy用户无法编辑脚本以使其恶意,他们需要完全 sudo访问权限才能这样做。实际上,除非具有root访问权限,否则没有人可以编辑脚本,否则将面临更大的问题。(我测试过用户deploy无法在执行此操作后编辑脚本,您也应该这样做!)

你们认为这个方案可行吗?有更好的方式吗?我的问题类似于这个这个,但提供了比那里更详细的解释,如果重复了太多抱歉,我会删除它,我还在寻求不同的方法。

1个回答

37

最佳实践是使用/etc/sudoers.d/myuser

/etc/sudoers.d/文件夹可以包含多个文件,允许用户使用sudo而不是root调用一些东西。

该文件通常包含一个用户和该用户可以运行的命令列表,而无需指定密码。例如:

sudo service nginx restart

请注意,我们正在使用sudo运行命令。如果没有sudo,则sudoers.d/myuser文件将永远不会被使用。

这样的文件示例:

myuser ALL=(ALL) NOPASSWD: /usr/sbin/service nginx start,/usr/sbin/service nginx stop,/usr/sbin/service nginx restart

这将允许myuser用户调用nginx服务的所有启动、停止和重启。

您可以添加另一行来控制另一个服务,或者继续将它们附加到逗号分隔列表中以进行更多的控制。

还要确保您已运行以下命令以确保安全性:

chmod 0440 /etc/sudoers.d/myuser

这也是我启动和停止自己创建的位于/etc/init目录中的upstart脚本的方式。如果您想轻松运行自己的服务,可以考虑查看一下。

说明:

在所有命令中,用您要用来启动、重启和停止Nginx而不需要sudo权限的用户名替换myuser

  1. 为您的用户打开sudoers文件:


$ sudo visudo -f /etc/sudoers.d/myuser
  • 编辑器将会打开。在那里,您粘贴以下行:

    $ myusername ALL=(ALL) NOPASSWD: /usr/sbin/service nginx start,/usr/sbin/service nginx stop,/usr/sbin/service nginx restart
    
  • 按下 ctrl+o 保存。它会询问您想要保存在哪里,只需按 enter 确认默认选项即可。然后使用 ctrl+x 退出编辑器。


  • 我猜“without being root”应该真正意思是“没有sudo权限”。 - Wernight

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接