Ruby on rails 无权限、非root用户,无需root或sudo即可启动或重新启动webserver服务器,如nginx

Ruby on rails 无权限、非root用户,无需root或sudo即可启动或重新启动webserver服务器,如nginx,ruby-on-rails,ubuntu,permissions,capistrano,sudo,Ruby On Rails,Ubuntu,Permissions,Capistrano,Sudo,我正在使用capistrano部署rails web应用程序。我想给Web服务器上的部署用户尽可能少的特权。作为一个非特权用户,除了重新启动Web服务器之外,我可以做任何我需要做的事情 我在ubuntu服务器上做这项工作,但这个问题并不特定于我的用例(rails、capistrano、deployment),我见过很多解决这个问题的方法,它们似乎都涉及糟糕的安全实践。想知道其他人是否可以检查我的解决方案并建议它是否安全 首先,没有必要,但我不知道为什么/etc/init.d/nginx需要其他用

我正在使用capistrano部署rails web应用程序。我想给Web服务器上的部署用户尽可能少的特权。作为一个非特权用户,除了重新启动Web服务器之外,我可以做任何我需要做的事情

我在ubuntu服务器上做这项工作,但这个问题并不特定于我的用例(rails、capistrano、deployment),我见过很多解决这个问题的方法,它们似乎都涉及糟糕的安全实践。想知道其他人是否可以检查我的解决方案并建议它是否安全

首先,没有必要,但我不知道为什么/etc/init.d/nginx需要其他用户进行任何(甚至是读取)访问。如果他们需要阅读,让他们成为root(通过sudo或其他方式),因此我:

由于所有权是所有者root,所以组root(或者可以使用chown root:root/etc/init.d/nginx设置)只有root或正确使用的用户才能读取、更改或运行/etc/init.d/nginx,我不会给部署用户任何这样广泛的权限。相反,我只给部署用户特定的sudo权限来运行控制脚本/etc/init.d/nginx。他们将无法运行编辑器对其进行编辑,因为他们只能执行该脚本。这意味着,如果某人以部署用户的身份访问我的邮箱,他们可以重新启动和停止nginx进程,但他们不能做更多的事情,比如更改脚本来做许多其他邪恶的事情

具体来说,我正在这样做:

visudo
是用于编辑sudoer文件的特定工具,您必须具有sudoer权限才能访问它

使用visudo,我添加:

# Give deploy the right to control nginx
deploy ALL=NOPASSWD: /etc/init.d/nginx
查看页面,但据我所知,第一列是被授予sudo权限的用户,在本例中为“deploy”。ALL允许从所有类型的终端/登录(例如,通过ssh)进行部署访问。最后,/etc/init.d/nginx只允许部署用户root访问运行/etc/init.d/nginx(在本例中,NOPASSWD表示没有密码,这是无人参与部署所需的密码)。部署用户无法编辑脚本以使其成为邪恶,他们需要FULLsudo访问权限才能做到这一点。事实上,没有人可以,除非他们有根访问权限,在这种情况下,有一个更大的问题。(我测试过,执行此操作后,用户部署无法编辑脚本,您也应该如此!)


你们怎么看?这行吗?有更好的方法吗?我的问题类似于和,但提供了比我在那里发现的更多的解释,如果太重复,很抱歉,如果是这样,我将删除它,尽管我也要求使用不同的方法。

最佳做法是使用
/etc/sudoers.d/myuser

/etc/sudoers.d/
文件夹可以包含多个文件,允许用户使用
sudo
调用stuff,而不必是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服务的所有start、stop和restart

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

另外,请确保舒尔您已运行以下命令以确保安全

chmod 0440 /etc/sudoers.d/myuser
这也是我启动和停止服务的方式。我自己创建的upstart脚本位于/etc/init中 如果您希望能够轻松地运行自己的服务,那么值得一试

说明:

在所有命令中,将myuser替换为要在没有sudo的情况下启动、重新启动和停止nginx的用户名称

  • 为您的用户打开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退出编辑器

  • 我想“不是根”应该是“不是sudoer”。
    $ myusername ALL=(ALL) NOPASSWD: /usr/sbin/service nginx start,/usr/sbin/service nginx stop,/usr/sbin/service nginx restart