6 votes

Exécuter le code utilisateur en toute sécurité

Je dois marquer le code C et cela implique en partie d'exécuter et de chronométrer leurs soumissions. Le problème est que leur code s'exécute alors en tant que moi et qu'ils peuvent en principe faire ce qu'ils veulent en utilisant mes paramètres d'autorisation. Par exemple, ils pourraient copier ma clé privée ssh.

Je pourrais mettre en place une machine virtuelle et y exécuter leur code (bien que je ne sois pas entièrement sûr de la meilleure façon de verrouiller cela non plus). Le problème est que les performances en termes de vitesse ne seront plus réalistes. Je pourrais fournir la même machine virtuelle à tous les utilisateurs pour qu'ils testent leur code à l'avance, de sorte qu'ils aient au moins la même configuration à tester.

Existe-t-il un bon moyen de mettre en place un environnement dans lequel vous pouvez exécuter du code écrit par d'autres personnes tout en limitant les dégâts qu'il peut causer ?

10voto

Bob Points 58080

Il existe en fait plusieurs types de machines virtuelles, ce que les autres réponses ne mentionnent pas. Vous pouvez avoir ce que l'on appelle la virtualisation de conteneurs - quelque chose comme Linux vServer ou OpenVZ. Ils partagent le noyau de l'hôte et exécutent ce que l'on appelle des "conteneurs" (avec leurs propres environnements) plutôt que de virtualiser du matériel. presque aussi rapide que le métal nu . (OpenVZ est plus courant dans les services VPS moins chers, mais ne prend en charge que le noyau personnalisé 2.6.x, tandis que vServer va jusqu'à la dernière version stable).

A part cela, les frais généraux d'une virtualisation complète sur une machine moderne ne sont pas aussi importants qu'on le pense ! Avec la virtualisation matérielle sur un processeur moyen-haut de gamme, la plupart des utilisateurs ne remarqueront même pas de baisse de performance, à moins qu'il n'y ait une compétition pour les ressources (par exemple, l'hôte ou une autre machine virtuelle utilise beaucoup de ressources). Le système sera un peu plus lent, car certaines ressources sont utilisées par le système d'exploitation invité, mais le coût de la virtualisation elle-même est presque négligeable - en particulier l'utilisation du processeur, puisqu'elle peut être transmise au matériel brut sans (presque) aucune traduction, s'il s'agit d'une accélération matérielle. Vous pouvez essayer, vous pourriez être surpris.


Il convient de noter que chacun d'entre eux est assorti de différents niveaux d'isolation. La virtualisation des conteneurs facilite grandement l'exploitation des bogues du noyau et d'autres bogues pour "sortir" du conteneur - LXC n'est pas du tout sûr, bien qu'OpenVZ soit considéré comme assez mature et sûr (et est couramment utilisé dans les services VPS, où vous vendez des conteneurs à des personnes non fiables). vServer se situe quelque part entre les deux. La virtualisation complète offre une meilleure isolation, mais certaines attaques existent toujours.

Cela dépend jusqu'où vous attendez d'un étudiant malveillant qu'il aille. Il peut suffire de s'exécuter en tant qu'utilisateur différent. Vous pourriez vouloir un conteneur pour plus de sécurité. Il y a de fortes chances qu'un conteneur suffise pour tout ce que vous rencontrerez dans ces circonstances.

8voto

mrjayviper Points 1355

Créez un compte utilisateur unique avec des privilèges limités (ce qui signifie un accès à un ensemble limité de routines de bibliothèque, peut-être même un accès Shell dépouillé).

ssh en tant qu'utilisateur dans votre système, et exécuter leurs programmes.

Vous pouvez même écrire un petit bash Shell Shell (ou tout autre Shell Shell) pour y parvenir.

4voto

Nick T Points 38411
  1. Exécuter le code en tant que nobody ce qui devrait vous donner des privilèges minimaux. En fonction de la complexité de la configuration, il se peut que cette méthode ne soit pas sûre
  2. Courir dans un chroot prison. Selon le code, cela peut modifier le comportement, et il est souvent possible de sortir des prisons. Ils sont pas un dispositif de sécurité.
  3. Exécuter dans une machine virtuelle. I penser il n'y a que très peu de cas connus où l'on peut s'en sortir, mais je n'en suis pas sûr. Vous pouvez utiliser par exemple Vagrant pour mettre en place une virtualisation très simple. Exemple de configuration y commandes .

1voto

user Points 28521

Il existe plusieurs possibilités, en fonction du degré d'isolement souhaité.

Le plus simple est de faire confiance au code. Il semble que ce soit hors de question pour vous, sinon vous ne poseriez pas cette question.

L'étape suivante consiste à exécuter le code sur un compte d'utilisateur distinct, en tant que Vigneshwaren a suggéré . Si vous souhaitez restreindre l'accès au réseau à un compte d'utilisateur particulier, vous pouvez le faire au moyen de la procédure suivante iptables owner matching . Une fois cette opération effectuée, le compte de l'utilisateur peut être laissé en place ou supprimé, et tout processus s'exécutant sous l'égide de cet utilisateur peut être purement et simplement supprimé.

Une étape supplémentaire consiste à ajouter une prison chroot au compte d'utilisateur séparé. Cela peut poser des problèmes avec les bibliothèques ou les fichiers de configuration qui doivent être en place, mais s'il s'agit par exemple d'un pur exercice de calcul, cela peut être pratique. Cela permet de s'assurer que seuls les fichiers auxquels le code de l'élève doit pouvoir accéder sont accessibles à ce code.

L'étape finale consisterait à exécuter le code dans un environnement complètement séparé. On pense ici à une machine virtuelle, bien qu'un ordinateur physique séparé puisse accomplir la même chose. Le code peut s'exécuter dans un environnement totalement isolé, y compris lorsque le câble du réseau virtuel est débranché, et tout dommage qu'il pourrait causer, y compris le remplissage du disque ou l'utilisation d'une bombe à fourche, sera isolé au sein de la machine virtuelle et le pire qui puisse arriver est que vous deviez l'éteindre de force. Étant donné que la machine virtuelle disposera d'une installation de système d'exploitation totalement distincte, en particulier si vous supprimez la connexion réseau avant d'exécuter le logiciel, il ne peut y avoir de fuite de vos données sensibles. Avec une VM, vous pouvez utiliser des instantanés de disque pour vous permettre de revenir rapidement et facilement à un état connu après l'exécution du programme de chaque élève.

Tout dépend de l'endroit où vous placez vos élèves sur l'échelle effort-contre-confiance. Moins de confiance nécessite plus d'efforts de votre part pour veiller à ce que rien de mal ne se produise.

0voto

exussum Points 481

I have to mark C code

Vous avez alors un accès total au code source, examinez-le - il est peu probable qu'ils puissent faire passer quelque chose de malveillant dans le code sans que vous vous en rendiez compte.

Si vous n'êtes pas sûr de vous, utilisez une machine virtuelle, mais dans la plupart des cas, vous saurez ce qui est exécuté.

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