16 votes

Est-il possible d'exécuter un bash script dans une sorte de bac à sable ?

Notre produit a besoin d'exécuter un bash script inconnu sur un serveur délicat afin d'atteindre un certain objectif. Ce bash script est fourni par l'utilisateur. Nous souhaitons nous assurer que seules certaines commandes spécifiques sont autorisées, et que toutes les autres ne le sont pas. De plus, nous avons besoin de remplacer certaines commandes par d'autres.

Ainsi, par exemple, nous aimerions exécuter le script et autoriser les commandes suivantes : echo cat awk

Mais n'autoriser aucune autre commande (nous ne voulons pas fournir une liste spécifique ici).

De plus, si le script contient la commande cp, nous voudrions la capturer et la rediriger vers une commande différente (ce qui peut être fait en utilisant un alias).

Une idée de la manière dont cela se fait ?

19voto

Il n'y a pas de solution sûre à 100%, sauf à exécuter le script à l'intérieur d'une machine virtuelle, ce qui empêcherait vraisemblablement le script d'atteindre son objectif. Mais il existe deux fonctionnalités qui peuvent vous aider. Si vous êtes inquiet que le script ait été écrit par une personne malveillante, ces fonctionnalités ne sont pas suffisantes ; mais si vous êtes seulement inquiet que le script puisse faire de mauvaises choses à votre système parce qu'il a été écrit par un programmeur négligent ou avec des objectifs différents à l'esprit, l'une ou l'autre de ces deux fonctionnalités fournit un environnement de sandboxing décent.

  • Vous pouvez exécuter un restreint Shell en invoquant bash comme bash -r . Je vous renvoie au manuel bash pour une description détaillée ; l'idée de base est que le script ne peut pas invoquer des commandes qui ne sont pas dans $PATH ne peut pas changer $PATH ne peut pas rediriger vers ou depuis un fichier, et quelques autres restrictions. C'est assez simple à mettre en place, mais si le script inconnu est trop compliqué pour que vous puissiez l'examiner, il est probable qu'il utilise beaucoup de choses qui sont interdites dans un script restreint.

  • Vous pouvez configurer un chroot prison. L'idée est de mettre en place une arborescence de répertoires /some/root et exécuter le script dans un environnement qui croit que /some/root est l'ensemble du système de fichiers ( chroot est l'abréviation de "racine de changement"). Une fois que l'arborescence des répertoires est mise en place, exécutez le script (copié dans le fichier /some/root/myscript ) comme chroot /some/root /bin/bash /myscript . Par exemple, vous pouvez créer un répertoire /some/root/bin avec les commandes que vous voulez autoriser, et le programme chrooté verra ce répertoire comme étant /bin . Vous devrez copier tout ce qui est nécessaire à l'exécution du programme dans le chroot : bibliothèques, fichiers de données, bash , le script lui-même, etc. Le script pourrait avoir besoin de /proc monté à l'intérieur du chroot ; vous pouvez faire cela avec une commande comme mount -t proc proc /proc .

    Si vous devez mettre une arborescence entière de répertoires à la disposition du script, disons que /var/example vous avez plusieurs choix. Vous pouvez faire une copie sous /some/root . Vous pouvez créer des liens physiques (s'ils fonctionnent pour votre application et si le chroot est dans le même système de fichiers). Sous Linux, vous pouvez faire mount --bind /var/example /some/root/var/example pour "greffer" /var/example à l'intérieur du chroot. Notez qu'un lien symbolique ne peut pas fonctionner puisque la cible du lien est déterminée à l'intérieur du chroot.

    Notez que le chroot ne fournit pas une sécurité absolue, en particulier contre les processus s'exécutant en tant que root. Par exemple, un processus root pourrait créer un fichier de périphérique à l'intérieur du chroot et accéder à l'ensemble du disque par ce biais. Un processus chrooté peut toujours établir des connexions réseau (vous pouvez l'interdire en n'incluant aucun programme réseau dans le chroot). et garantissant que le programme non approuvé ne peut pas créer un fichier et le rendre exécutable ou écraser un exécutable existant).

10voto

Ignacio Vazquez-Abrams Points 107432

Le moyen le plus simple est d'utiliser un chroot jail contenant uniquement les commandes que vous voulez que le script puisse exécuter. Vous exécutez ensuite le script à travers un wrapper qui appelle chroot dans le répertoire et exécute ensuite le script.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X