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
Répondre
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,
Vous n'avez pas dit quel Unix. Les zones Solaris le font facilement. Voici un exemple comment en créer un:
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
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
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.
http://stackoverflow.com/questions/4249063/how-can-i-run-an-untrusted-c-program-in-a-sandbox-in-linux – ephemient