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

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

你们有什么感想?这有用吗?有没有更好的方法来做到这一点?我的问题类似于thisthis,但提供的解释比我在那里找到的更多,抱歉,如果它太复制了,如果是的话,我会删除它,虽然我也要求不同的方法.

解决方法

最佳做法是使用/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

This is also the way I start and stop services my own created upstart scripts that live in /etc/init
It can be worth checking that out if you want to be able to run your own services easily.

说明:

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

>为您的用户打开sudoers文件

$sudo visudo -f /etc/sudoers.d/myuser

>编辑将打开.在那里你粘贴以下行:

$myusername ALL=(ALL) nopASSWD: /usr/sbin/service Nginx start,/usr/sbin/service Nginx restart

>按ctrl o保存.它将询问您要保存的位置,只需按Enter确认认值即可.然后用ctrl x退出编辑器.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...