2010-12-08 33 views
4

想知道有什麼方法可以爲運行命令創建臨時沙箱環境嗎?在unix中創建臨時沙箱環境

我的要求是,我在unix中託管一個web服務,我需要執行一個commanline工具來將輸出返回給webservice客戶端。因爲我將從客戶端接收到的值傳遞給commanline工具,所以我想在沙盒環境中執行這些命令。

+0

http://stackoverflow.com/questions/4249063/how-can-i-run-an-untrusted-c-program-in-a-sandbox-in-linux – ephemient 2010-12-08 23:26:24

回答

4

我不知道,但是,你可以嘗試使用「chroot環境」命令來創建新的「根」環境,例如,

如果您有目錄結構,你想「保護」 「許可證」 文件,

/ 
/etc 
+ license 
/bin 
+ ls 
/lib 
+ ... 

您可以創建一個chroot環境作爲

[email protected]:~$ mkdir chroot_example 
[email protected]:~$ cd chroot_example/ 
[email protected]:~/chroot_example$ mkdir -p usr/lib lib bin etc 
[email protected]:~/chroot_example$ cd bin/ 
[email protected]:~/chroot_example/bin$ cp /bin/ls . 
[email protected]:~/chroot_example/bin$ ldd ls 
     libsec.so.1 => /lib/libsec.so.1 
     libnvpair.so.1 =>  /lib/libnvpair.so.1 
     libcmdutils.so.1 =>  /lib/libcmdutils.so.1 
     libcurses.so.1 =>  /lib/libcurses.so.1 
     libc.so.1 =>  /lib/libc.so.1 
     libavl.so.1 => /lib/libavl.so.1 
     libidmap.so.1 =>   /usr/lib/libidmap.so.1 
     libnsl.so.1 => /lib/libnsl.so.1 
     libuutil.so.1 =>   /lib/libuutil.so.1 
     libmp.so.2 => /lib/libmp.so.2 
     libmd.so.1 => /lib/libmd.so.1 
     libm.so.2 =>  /lib/libm.so.2 

現在填充 「共享庫」 要求的LS命令(使用LDD我們知道這是必要的共享庫

[email protected]:~/chroot_example/bin$ ldd ls |awk '{print "cp "$3" lib/"}' 
cp /lib/libsec.so.1 lib/ 
cp /lib/libnvpair.so.1 lib/ 
cp /lib/libcmdutils.so.1 lib/ 
cp /lib/libcurses.so.1 lib/ 
cp /lib/libc.so.1 lib/ 
cp /lib/libavl.so.1 lib/ 
cp /usr/lib/libidmap.so.1 lib/ 
cp /lib/libnsl.so.1 lib/ 
cp /lib/libuutil.so.1 lib/ 
cp /lib/libmp.so.2 lib/ 
cp /lib/libmd.so.1 lib/ 
cp /lib/libm.so.2 lib/ 

現在我們需要複製到我們的新的 「LIB」 和usr/lib中目錄

[email protected]:~/chroot_example/bin$ cd .. 
[email protected]:~/chroot_example$ ldd /bin/ls |awk '{print "cp "$3" lib/"}'|bash 
[email protected]:~/chroot_example$ ls -ltr 
total 9 
drwxr-xr-x 2 itily staff   2 dic 22 14:37 etc 
drwxr-xr-x 2 itily staff   3 dic 22 14:37 bin 
drwxr-xr-x 2 itily staff   14 dic 22 14:38 lib 

[email protected]:~/chroot_example$ cp /usr/lib/libidmap.so.1 usr/lib/ 
[email protected]:~/chroot_example$ cp /usr/lib/ld.so.1 usr/lib/ 
[email protected]:~/chroot_example$ cd lib/ 
[email protected]:~/chroot_example/lib$ ls -l 
total 7615 
-rwxr-xr-x 1 itily staff  14044 dic 22 14:38 libavl.so.1 
-rwxr-xr-x 1 itily staff 1721400 dic 22 14:38 libc.so.1 
-rwxr-xr-x 1 itily staff  26748 dic 22 14:38 libcmdutils.so.1 
-rwxr-xr-x 1 itily staff  293876 dic 22 14:38 libcurses.so.1 
-rwxr-xr-x 1 itily staff  97852 dic 22 14:38 libidmap.so.1 
-rwxr-xr-x 1 itily staff  398704 dic 22 14:38 libm.so.2 
-rwxr-xr-x 1 itily staff  87164 dic 22 14:38 libmd.so.1 
-rwxr-xr-x 1 itily staff  25140 dic 22 14:38 libmp.so.2 
-rwxr-xr-x 1 itily staff  648776 dic 22 14:38 libnsl.so.1 
-rwxr-xr-x 1 itily staff  74776 dic 22 14:38 libnvpair.so.1 
-rwxr-xr-x 1 itily staff  97500 dic 22 14:38 libsec.so.1 
-rwxr-xr-x 1 itily staff  49556 dic 22 14:38 libuutil.so.1 
[email protected]:~/chroot_example/lib$ cd .. 

所以,最後的結構是

[email protected]:~/chroot_example$ ls -l 
total 12 
drwxr-xr-x 2 itily staff   3 dic 22 14:37 bin 
drwxr-xr-x 2 itily staff   5 ene 10 20:43 etc 
drwxr-xr-x 2 itily staff   14 ene 10 20:48 lib 
drwxr-xr-x 3 itily staff   3 ene 10 20:40 usr 

你還需要這個組,passwd和其他文件

[email protected]:~/chroot_example$ echo "this is a test" > etc/license 
[email protected]:~/chroot_example$ cd etc/ 
[email protected]:~/chroot_example/etc$ cat /etc/group |grep staff > group 
[email protected]:~/chroot_example/etc$ cat /etc/passwd |grep itily > passwd 

現在你可以運行的chroot命令,但如果你試圖爲非root身份運行你會得到錯誤

[email protected]:~$ chroot chroot_example bin/ls /etc 
chroot: cannot change root directory to chroot_example: Not owner 

所以,你需要爲root身份運行

[email protected]:~$ pfexec chroot chroot_example /bin/ls -l /etc 
total 6 
-rw-r--r-- 1 101  10   11 Jan 10 19:43 group 
-rw-r--r-- 1 101  10   18 Jan 10 19:42 license 
-rw-r--r-- 1 101  10   49 Jan 10 19:43 passwd 

我希望這是你在找什麼?

Urko,

1

你沒有說哪個Unix。 Solaris區域很容易實現。下面是一個例子如何設置一個:

http://www.solarisinternals.com/wiki/index.php/Zones

+0

基本上我期待爲ce​​ntOS,這就是我的託管服務提供商。但它的蝨子知道solaris有這麼好的東西... – Mahes 2011-01-11 20:32:02

1

我經常在Debian的Linux的沙箱開發和喜歡使用的文件樹根切換,這樣我不會破壞我的主機的情況下,我做了一些愚蠢的意外(這發生了很多)。我爲Debian和Ubuntu製作了一套腳本,用於創建chroots(x86-64中的交叉發行版和x86),您可能會發現它們很有幫助。

https://github.com/vtonehundred/vroot