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

13

Notre produit a besoin d'exécuter un script bash inconnu sur un serveur délicat afin d'atteindre un certain objectif. Ce script bash est fourni par l'utilisateur. Nous souhaitons nous assurer que seules des commandes spécifiques sont autorisées et que toutes les autres ne le sont pas. De plus, nous devons 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'autorisez aucune autre commande (nous ne voulons pas fournir de liste spécifique ici).

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

Une idée de comment cela se fait?

Yon
la source

Réponses:

9

Le moyen le plus simple consiste à utiliser une prison chroot contenant uniquement les commandes que vous souhaitez que le script puisse exécuter. Vous exécutez ensuite le script via un wrapper qui appelle chrootdans le répertoire, puis exécute le script.

Ignacio Vazquez-Abrams
la source
17

Il n'y a pas de sécurité à 100% pour exécuter le script dans une machine virtuelle, ce qui empêcherait vraisemblablement le script d'atteindre son objectif. Mais il y a deux fonctionnalités qui peuvent vous aider. Si vous craignez que le script ait été écrit par une personne malveillante, ces fonctionnalités ne suffisent pas; mais si vous craignez seulement que le script puisse nuire à votre système car il a été écrit par un programmeur imprudent ou avec des objectifs différents à l'esprit, l'une ou l'autre de ces deux fonctionnalités fournit un environnement de bac à sable décent.

  • Vous pouvez exécuter un shell restreint en appelant bash as 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 appeler des commandes qui ne sont pas en$PATH , ne peut pas changer $PATH, ne peut pas rediriger vers ou depuis un fichier, et quelques restrictions supplémentaires. C'est assez simple à configurer, mais si le script inconnu est trop compliqué pour que vous puissiez l'examiner, il est probable qu'il utilise beaucoup de choses interdites dans un shell restreint.

  • Vous pouvez mettre en place une prison chroot . L'idée est de mettre en place une arborescence de répertoires /some/rootet d'exécuter le script dans un environnement qui considère qu'il /some/roots'agit de l'ensemble du système de fichiers ( chrootest l'abréviation de change root). Une fois l'arborescence de répertoires configurée, exécutez le script (copié dans /some/root/myscript) sous chroot /some/root /bin/bash /myscript. Par exemple, vous /some/root/bindéfiniriez un répertoire avec les commandes que vous souhaitez autoriser, et le programme chrooté verrait ce répertoire comme /bin. Vous devrez copier tout ce dont vous avez besoin pour l'exécution du programme dans le chroot: bibliothèques, fichiers de données bash, le script lui-même, etc. Le script peut avoir besoin d'être /procmonté à l'intérieur du chroot; vous pouvez le faire avec une commande comme mount -t proc proc /proc.

    Si vous devez mettre une arborescence de répertoires complète à la disposition du script, par exemple /var/example, vous avez plusieurs choix. Vous pouvez en faire une copie sous /some/root. Vous pouvez créer des liens physiques (s'ils fonctionnent pour votre application et que le chroot est dans le même système de fichiers). Sous Linux, vous pouvez faire mount --bind /var/example /some/root/var/examplepour «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 chroot n'offre pas une sécurité absolue, en particulier contre les processus s'exécutant en tant que root. Par exemple, un processus racine pourrait créer un fichier de périphérique à l'intérieur du chroot et accéder à tout le disque à travers celui-ci. Un processus chrooté peut toujours établir des connexions réseau (vous pouvez l'interdire en n'incluant aucun programme de mise en réseau à l'intérieur du chroot et en veillant à ce que le programme non approuvé ne puisse pas créer un fichier et le rendre exécutable ou écraser un exécutable existant).

Gilles 'SO- arrête d'être méchant'
la source
Vous devrez copier tout ce dont vous avez besoin , puis-je créer des liens symboliques ou physiques plutôt que de copier?
kyb du
1
@kyb Lien dur: oui. Lien symbolique: non, un lien symbolique ne peut pointer que vers un fichier que vous pouvez voir, il ne vous permet pas d'échapper à un chroot. Les liens durs sont difficiles à utiliser pour cela et délicatement: ils se cassent si vous remplacez le fichier, ils exposent la copie originale au cas où elle serait inscriptible à l'intérieur du chroot. Si vous souhaitez rendre une arborescence entière disponible, copiez-la ou effectuez un montage de liaison en lecture seule.
Gilles 'SO- arrête d'être méchant'
Je dois faire des commandes communes disponibles comme grep, awk, units, etc. Dois - je besoin de copier tous les fichiers bin et tous manuellement ou il dépendances est une bidouille à portée de main pour dire explicitement ce utils devrait fonctionner dans le chroot?
kyb