linux 的 unshare 命令

最近有一个需求,就是要在服务器端执行用户传过来的命令。为了防止用户运行一些恶意指令,我们需要构造一个沙箱来运行。这种隔离的需求第一反应就想到了之前写过的 使用 overlayfs 和 chroot 搭建临时环境,但是这需要 root 权限。有没有办法在不需要 root 的情况运行 mountchroot 呢?简单搜了下就找到了想要的答案。

unshare 是 linux 下的一个命令,通过构造一个新的 namespace 来和现有的环境隔离。基本用法很简单,就是一些选项,然后再加上要运行的命令即可,看起来有点像一个精简版的 docker。而且和 docker 一样的是,只要运行的命令退出了,在命令运行期间做的操作都会被自动清除。这个完美符合我们对沙箱的要求。

先来做个测试。通过 unshare 把当前用户映射成 root,并创建一个新的 mount namespace

unshare -rm /bin/bash

运行之后发现我们的用户变成了 root!另外一个不容易发现的内容就是,在我们所创建的这个 mount namespace 中进行 mount

阅读全文…