![强制远程连接的用户进入 Rails 控制台,并阻止他们访问任何系统命令](https://linux22.com/image/672440/%E5%BC%BA%E5%88%B6%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5%E7%9A%84%E7%94%A8%E6%88%B7%E8%BF%9B%E5%85%A5%20Rails%20%E6%8E%A7%E5%88%B6%E5%8F%B0%EF%BC%8C%E5%B9%B6%E9%98%BB%E6%AD%A2%E4%BB%96%E4%BB%AC%E8%AE%BF%E9%97%AE%E4%BB%BB%E4%BD%95%E7%B3%BB%E7%BB%9F%E5%91%BD%E4%BB%A4.png)
我尝试设置对系统的访问权限,以便 ruby web 开发人员可以远程访问系统并访问 rails 控制台,以便在应用程序出现问题时进行一些测试。他们通常不会通过 ssh 访问这台机器,我们希望严格限制他们在机器上可以执行的操作,他们唯一应该能够做的事情就是运行 rails 控制台并与应用程序交互。我以为我一开始进展顺利,但现在我陷入困境,因为我还需要确保其安全,以便他们无法启动 bash 控制台或调用系统函数。
到目前为止,我的方法是向新用户的authorized_keys文件中添加类似以下内容:
command="/path/to/bash/script.sh" ssh-rsa key user@host
这会强制使用此行上的密钥连接的用户在登录时运行此命令而不执行其他任何操作,当脚本退出时,他们将与会话断开连接。我编写了以下脚本,该脚本查找所有 app_root 文件夹,然后将用户放入他们选择的文件夹中并启动 rails 控制台:
#!/usr/bin/env bash
echo "Please select the Rails folder you with to work in:"
select FOLDER in $(find /path/to/*/app_root -maxdepth 0 -type d); do
echo "You have selected $FOLDER ($REPLY), Rails console starting...."
cd $FOLDER
RAILS_ENV=production bundle exec rails c
exit 0
done
我向开发人员展示了这一点,他非常高兴他可以做他需要做的事情。然后我向我的老板展示了它,他运行了:
`bash`
这给了他一个 bash shell,作为我为测试配置的用户。
`rm -rf *`
由于该用户属于该组,并且该组具有写权限,因此他可以删除文件夹中的所有内容。
这显然不太好。所以我想限制用户,不让他们运行系统命令。
我在 IRC 上的 rails 控制台上询问了有关如何停止系统调用的建议,我得到的答复是在沙盒中运行该进程。但这是一个范围很广的术语,我正在努力寻找一种合适的方法来在此上下文中使用沙盒。
我已经考虑过了chroot,我可以允许用户访问以使用设置 chroot 所需的命令(使用 visudo),但通过在这些文件夹中部署完整隔离的操作系统来设置 chroot 需要相当长的时间(在测试虚拟机中使用 debootstrap 需要超过 10 分钟),而且对于我正在尝试做的事情来说似乎非常繁重。此外,从我在文档中读到的内容来看,它仍然不是 100% 安全的,如果你足够努力,你就会突破。此外,我必须设置 ruby/rails 环境,并将项目移到这个操作系统中供用户测试,他们仍然可以在 chroot 中访问系统命令。
使用安全计算被建议,但我真的不明白在这种情况下(或任何情况下)我该如何使用它。
我已经看过了app-armour和linux系统沙箱,但是这些在 ubuntu 版本中均不可用。
有人能建议一种在应用程序文件夹中运行 rails 控制台的合理轻量级方法吗,这样开发人员就可以测试他们的应用程序,但又能阻止他们运行 bash 或其他系统命令?只要最终结果是安全的,我不介意完全改变我的方法