2010-12-08 48 views
4

Vous vous demandez simplement s'il existe un moyen de créer un environnement sandbox temporaire pour l'exécution de commandes? Mon exigence est que j'héberge un webservice sous unix et j'ai besoin d'exécuter un outil de virgule pour renvoyer la sortie au client webservice. Puisque je passe les valeurs reçues du client à l'outil commanline, je voudrais exécuter les commandes dans l'environnement sandboxed.Création d'un environnement de sandbox temporaire dans unix

+0

http://stackoverflow.com/questions/4249063/how-can-i-run-an-untrusted-c-program-in-a-sandbox-in-linux – ephemient

Répondre

4

Je ne suis pas sûr, mais vous pouvez essayer d'utiliser la commande « chroot » pour créer un nouveau enviroment « racine », par exemple,

Si vous avez la structure de répertoire et que vous voulez « protéger » la fichier "licence",

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

Vous pouvez créer un environnement chroot comme

[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 

désormais dans l' "partagé lib" requise par les ls commande (en utilisant le ldd nous savons qui sont les nécessaires partagées libs

[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/ 

Maintenant, nous devons copier sur notre nouveau "lib" et usr/lib répertoire

[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 .. 

Ainsi, la structure finale est

[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 

vous devez également le groupe, les fichiers passwd et d'autres

[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 

Maintenant, vous pouvez exécuter la commande chroot, mais si vous essayez d'exécuter comme non racine vous obtiendrez l'erreur

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

Donc, vous devez exécuter comme racine

[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 

J'espère que c'est ce que vous cherchez ...

Urko,

1

Vous n'avez pas dit quel Unix. Les zones Solaris le font facilement. Voici un exemple comment en créer un:

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

+0

essentiellement Je cherche pour centOS, c'est ce que mon fournisseur d'hébergement a.mais ses poux de savoir que solaris a une si belle chose ... – Mahes

+0

Il existe des options similaires pour d'autres systèmes d'exploitation, mais je ne les ai pas utilisés. Un couple que j'ai lu à propos de Linux-VServer et OpenVZ. – JOTN

1

Je développe régulièrement dans des sandbox dans Debian Linux et aime utiliser chroot pour que je ne détruis pas ma machine hôte dans le cas où je fais par hasard quelque chose de stupide (ce qui arrive beaucoup). J'ai mis en place un ensemble de scripts pour Debian et Ubuntu pour que je puisse créer des chroots (à la fois des distributions croisées et x86 en x86-64) que vous pourriez trouver utiles.

https://github.com/vtonehundred/vroot