我正在使用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无法在执行此操作后编辑脚本,您也应该这样做!)
你们认为这个方案可行吗?有更好的方式吗?我的问题类似于这个和这个,但提供了比那里更详细的解释,如果重复了太多抱歉,我会删除它,我还在寻求不同的方法。