我正在使用capistrano来部署一个rails web应用程序。 我想给尽可能less的权限在web服务器上的部署用户。 除了重新启动Web服务器之外,我能够以非特权用户身份完成所有工作。
我在Ubuntu服务器上这样做,但这个问题不是特定于我的用例(rails,capistrano,部署),我已经看到很多解决这个问题的方法,这些方法似乎涉及到很差的安全实践。 想知道其他人是否可以审核我的解决scheme,并build议是否安全?
首先,没有必要,但是我不知道为什么/etc/init.d/nginx需要其他用户的任何(甚至读取)访问。 如果他们需要阅读,使他们成为根(通过sudo或其他手段),所以我:
chmod 750 /etc/init.d/nginx
由于所有权是所有者root,所以root用户(或者可以使用chown root:root /etc/init.d/nginx来设置),只有root用户,或者用户可以正常启动,可以读取,更改或者运行/ 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权限,在这种情况下,“部署”。 ALL允许从所有types的terminal/login(例如,通过ssh)进行部署访问。 最后,/etc/init.d/nginx只给予部署用户root访问权限来运行/etc/init.d/nginx(在这种情况下,NOPASSWD表示没有密码,我需要一个无人参与的部署) 。 部署用户不能编辑脚本使其变得邪恶,他们将需要完整的 sudo访问来做到这一点。 事实上,除非他们拥有root权限,否则没有人可以解决这个问题。 (我testing过用户部署后无法编辑脚本,所以你应该!)
你们有什么感想? 这是否工作? 有没有更好的方法来做到这一点? 我的问题类似于这个和这个 ,但提供了比我在那里发现更多的解释,对不起,如果它太重复,如果是的话,我会删除它,虽然我也要求不同的方法。
最好的做法是使用/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中如果你想能够轻松地运行自己的服务,那么可以检查一下。
说明:
在所有命令中,将myuser替换为您要用来启动,重新启动并停止nginx而不使用sudo的用户的名称。
为您的用户打开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保存。 它会询问您要保存的位置,只需按回车确认默认即可。 然后用ctrl + x退出编辑器。