是否可以在某种沙箱中运行bash脚本?


13

我们的产品需要在精致的服务器上执行未知的bash脚本,以实现特定目标。此bash脚本是用户提供的。我们有兴趣确保仅允许特定命令,而不允许所有其他命令。此外,我们需要将某些命令替换为其他命令。

因此,例如,我们想执行脚本并允许以下命令:echo cat awk

但不允许任何其他命令(我们不想在此处提供特定列表)。

此外,如果脚本包含命令cp,我们想捕获它并重定向到其他命令(可以使用别名来完成)。

任何想法如何做到这一点?

Answers:



17

在虚拟机中运行脚本并不能百分百安全,这可能会阻止脚本实现其目标。但是有两个功能可能会对您有所帮助。如果您担心脚本是由恶意人员编写的,那么这些功能还不够;但是,如果您只是担心脚本是由粗心的程序员编写的,或者出于不同目的而编写的,那么脚本可能会对系统造成不良影响,那么这两个功能都可以提供一个不错的沙箱环境。

  • 您可以通过将bash调用为来运行受限shellbash -r。我请您参考bash手册以获取详细说明;基本思想是该脚本无法调用不在中的命令,$PATH无法更改$PATH,无法重定向到文件或从文件重定向以及更多限制。设置起来相当简单,但是如果未知脚本过于复杂以至于您无法查看,则很可能会使用受限外壳程序中禁止使用的许多内容。

  • 您可以设置chroot监狱。这个想法是建立一个目录树,/some/root并在一个认为/some/root整个文件系统(chroot是更改根目录的缩写)的环境中运行脚本。设置目录树后,将脚本(复制到/some/root/myscript)运行为chroot /some/root /bin/bash /myscript。例如,您将/some/root/bin使用要允许的命令来设置目录,并且chroot程序会将该目录视为/bin。您需要在chroot内部复制执行程序所需的所有内容:库,数据文件,bash脚本本身等等/proc。您可以使用像这样的命令来执行此操作mount -t proc proc /proc

    如果需要使整个目录树可用于脚本,请说/var/example,您有几种选择。您可以在下进行复制/some/root。您可以进行硬链接(如果它们适用于您的应用程序,并且chroot在同一文件系统中)。在Linux上,您可以mount --bind /var/example /some/root/var/example“移植” /var/example到chroot中。请注意,符号链接不起作用,因为链接的目标是在chroot内部确定的。

    请注意,chroot不能提供绝对的安全性,尤其是对于以root身份运行的进程。例如,根进程可以在chroot内部创建设备文件,并通过该文件访问整个磁盘。chroot进程仍可以建立网络连接(您可以通过在chroot内不包括任何网络程序确保不受信任的程序无法创建文件并将其设置为可执行文件或覆盖现有的可执行文件来禁止此连接)。


您需要复制所需的所有内容,我可以进行符号链接或硬链接而不是复制吗?
kyb

1
@kyb硬链接:是的。符号链接:不,符号链接只能指向您可以看到的文件,它不能让您逃脱chroot。硬链接很难做到这一点,而且很容易:如果您替换文件,硬链接会断开,如果原始副本在chroot中可写,它们就会暴露原始副本。如果要使整个树可用,请复制它或进行只读绑定安装。
吉尔斯(Gillles)“所以-别再作恶了”

我需要像使用普通的命令grepawkunits,等我需要手动复制每个bin文件和所有的依赖关系或有一些方便的黑客告诉明确什么utils的应在chroot环境工作?
kyb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.