【问题标题】:Non-privileged, non-root, user to start or restart webserver server such as nginx without root or sudo非特权、非 root 用户启动或重启 webserver 服务器,例如没有 root 或 sudo 的 nginx
【发布时间】:2020-06-26 08:58:25
【问题描述】:

我正在使用 capistrano 部署 Rails 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'ed 的用户可以读取、更改或运行 / 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 权限的用户,在本例中为“部署”。 ALL 允许从所有类型的终端/登录(例如,通过 ssh)进行部署访问。最后,/etc/init.d/nginx,仅授予部署用户 root 访问权限以运行 /etc/init.d/nginx(在这种情况下,NOPASSWD 表示没有密码,我需要无人值守部署) .部署用户无法编辑脚本以使其变得邪恶,他们需要 FULL sudo 访问权限才能做到这一点。事实上,除非他们有 root 访问权限,否则没有人可以,在这种情况下会有一个更大的问题。 (我测试了用户部署后无法编辑脚本,你也应该这样做!)

大家怎么看?这行得通吗?有没有更好的方法来做到这一点?我的问题与thisthis 类似,但提供的解释比我在那里找到的要多,如果重复,对不起,如果是这样,我会删除它,尽管我也要求不同的方法。

【问题讨论】:

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


    【解决方案1】:

    最佳做法是使用/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 保存。它将询问您要保存的位置,只需按 enter 确认默认设置。然后使用 ctrl+x 退出编辑器。

    【讨论】:

    • 我猜“没有被root”应该真的是“没有被sudoer”。
    猜你喜欢
    • 2015-04-29
    • 2012-11-07
    • 2013-07-04
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    相关资源
    最近更新 更多