非特权,非root用户,用于启动或重新启动webserver服务器,例如没有root或sudo的nginx

时间:2014-02-17 13:41:18

标签: ruby-on-rails ubuntu permissions capistrano sudo

我使用capistrano部署rails web app。我想尽可能少地为网络服务器上的部署用户提供权限。除了重启网络服务器之外,我能够以非特权用户的身份做我需要做的一切。

我在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 man页面,但据我了解,第一列是给予sudo权限的用户,在本例中为“deploy”。 ALL提供来自所有类型的终端/登录的部署访问(例如,通过ssh)。最后,/ etc / init.d / nginx,ONLY赋予部署用户root权限以运行/etc/init.d/nginx(在这种情况下,NOPASSWD意味着没有密码,这是我无人值守部署所需的) 。部署用户无法编辑脚本以使其变得邪恶,他们需要 FULL sudo访问才能执行此操作。事实上,没有人可以除非他们有root权限,在这种情况下会出现更大的问题。 (我测试过用户部署在执行此操作后无法编辑脚本,所以你应该这样做!)

你们觉得怎么样?这有用吗?有没有更好的方法来做到这一点?我的问题类似于thisthis,但提供了比我在那里找到的更多解释,抱歉,如果它过于重复,如果是,我会删除它,尽管我&# 39;我也要求采用不同的方法。

1 个答案:

答案 0 :(得分:30)

最佳做法是使用/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脚本   如果您希望能够轻松运行自己的服务,那么值得一试。

<强>说明:

在所有命令中,将 myuser 替换为您要用于启动,重新启动和停止不使用sudo的nginx的用户名。

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

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

    $ myusername ALL=(ALL) NOPASSWD: /usr/sbin/service nginx start,/usr/sbin/service nginx stop,/usr/sbin/service nginx restart
    
  3. 通过点击 ctrl + o 进行保存。它将询问您要保存的位置,只需按输入即可确认默认值。然后使用 ctrl + x 退出编辑器。