我们的产品需要在一台精密服务器上执行未知的 bash 脚本,以实现某个目标。此 bash 脚本由用户提供。我们希望确保只允许执行特定命令,不允许执行所有其他命令。此外,我们需要用其他命令替换某些命令。
因此,例如,我们想执行脚本并允许以下命令:echo cat awk
但不允许任何其他命令(我们不想在此提供特定列表)。
此外,如果脚本包含命令 cp,我们希望捕获它并重定向到不同的命令(可以使用别名来完成)。
知道这是怎么做到的吗?
答案1
最简单的方法是使用chroot 监狱仅包含您希望脚本能够运行的命令。然后,您可以通过调用目录的包装器运行该脚本chroot
,然后执行该脚本。
答案2
除了在虚拟机中运行脚本之外,没有 100% 安全的方法,因为虚拟机可能会阻止脚本实现其目标。但有两个功能可能会对您有所帮助。如果您担心脚本是由恶意人员编写的,那么这两个功能还不够;但如果您只是担心脚本可能会对您的系统造成不良影响,因为它是由粗心的程序员编写的,或者出于不同的目的,那么这两个功能中的任何一个都可以提供一个不错的沙盒环境。
您可以运行受限外壳通过以 身份调用 bash
bash -r
。我建议您参阅 bash 手册以获得详细说明;基本思想是脚本不能调用 中不存在的命令$PATH
、不能更改$PATH
、不能重定向到文件或从文件重定向,还有其他一些限制。设置起来相当简单,但如果未知脚本太复杂而您无法查看,则它可能会使用许多在受限 shell 中被禁止的东西。您可以设置一个chrootjail。这个想法是设置一个目录树并在认为它是整个文件系统
/some/root
的环境中运行脚本(是 change root 的缩写)。设置目录树后,将脚本(复制到)作为运行。例如,您将设置一个包含要允许的命令的目录,而 chrooted 程序会将此目录视为。您需要复制 chroot 中程序执行所需的一切:库、数据文件、脚本本身等。脚本可能需要安装在 chroot 内;您可以使用类似 的命令执行此操作。/some/root
chroot
/some/root/myscript
chroot /some/root /bin/bash /myscript
/some/root/bin
/bin
bash
/proc
mount -t proc proc /proc
如果您需要使整个目录树可供脚本使用,例如
/var/example
,您有几种选择。您可以在下进行复制/some/root
。您可以创建硬链接(如果它们适用于您的应用程序并且 chroot 位于同一文件系统中)。在 Linux 上,您可以在 chroot 内进行mount --bind /var/example /some/root/var/example
“嫁接”/var/example
。请注意,符号链接无法工作,因为链接的目标是在 chroot 内确定的。请注意,chroot 并不提供绝对的安全性,特别是对于以 root 身份运行的进程。例如,root 进程可以在 chroot 中创建一个设备文件并通过它访问整个磁盘。chroot 进程仍然可以建立网络连接(您可以通过不在 chroot 中包含任何网络程序来禁止此操作和确保不受信任的程序无法创建文件并使其可执行或覆盖现有的可执行文件)。