web-dev-qa-db-fra.com

Serveur pour les assignations de codage scolaire

Un cours d'introduction C++ est offert chaque année dans notre université. Pour que les étudiants codent en C++ et soumettent leurs missions, nous leur donnons un accès Shell à un serveur Linux. Ils utilisent SSH pour vous connecter au serveur avec leurs comptes, effectuez le codage et conservez le code compilé dans leurs répertoires à domicile. Cependant, donner à Shell Access apporte un certain nombre de vulnérabilités avec elle. Ma question est là, y a-t-il une autre solution, à part de donner accès à Shell aux étudiants, dans laquelle nous pouvons remplir l'objectif mentionné ci-dessus? Tout outil/application côté serveur pouvant fournir une interface aux élèves pour faire leurs affectations C++ sans compromettre la sécurité du serveur?

16
Soban

Ce dont vous avez besoin est relativement simple: vous devez vous assurer que les comptes non privilégiés de vos étudiants sont bien confinés. Si vous n'avez pas d'environnement graphique impliqué, votre situation est relativement simple. Vous devriez commencer par mettre en œuvre les actions suivantes:

  • s'assurer que les utilisateurs sont créés sans privilèges administratifs (no Sudo, no admin ou wheel groupe)
  • assurez-vous que les utilisateurs ne parviennent pas à imiter un écran de connexion pour spoiser votre écran de connexion (un classique pour l'université que j'ai vu)
  • assurer une stratégie appropriée polkitd empêchant les utilisateurs de suspendre/fermer l'hôte
  • assurez-vous de ne pas exécuter vulnérable/obsolète suid/sgid services sur l'hôte ( Voir comment les énumérer )
  • s'assurer qu'aucun utilisateur individuel ne peut épuiser les ressources du système (en configurant Systemd.cgroup pour imposer des limites d'utilisation des ressources sur toute la session de chaque utilisateur)
  • renforcer votre contrôle d'accès obligatoire en installant et configurez correctement SELINUX (pour limiter les élèves à un rôle d'étudiant où ils ne peuvent écrire que dans leur domicile et dans/TMP)
  • expire les comptes lorsque cela est nécessaire pour éviter des comptes persistants avec des mots de passe non compromis ( Voir cette question sur le site UNIX )
  • vous pouvez même exécuter des sessions d'élèves dans des conteneurs séparés à l'aide de Systemd.nspawn qui est conçu pour exécuter des systèmes entièrement de travail indépendamment les uns des autres, à l'aide de Espaces de noms Linux . C'est la bonne façon de prendre en prison une session, pas chroot

Vous pourriez alors remarquer que les étudiants utilisent les machines à d'autres fins que celles autorisées. Vous pouvez limiter l'accès aux machines à des heures spécifiques utilisant pam_time Bien que cela puisse se mettre dans la voie des élèves d'obtenir leur travail et qu'il devrait être équilibré contre les avantages qu'il fournit. Assurez-vous également que vos administrateurs de réseau savent quel trafic attendre sur cet hôte afin de pouvoir détecter un trafic indésirable.


Tout cela étant dit, je ne vois pas le point dans des fichiers binaires spécifiques à la liste blanche (inutile car les élèves peuvent compiler et gérer leur propre code) car il peut se mettre dans la voie des étudiants utilisant des outils de développement légitimes, par ex. Compilateurs alternatifs, boîtes à outils de construction, outils d'analyse de code, outils de vérification de code, etc.

Tant que les utilisateurs ne peuvent blesser que eux-mêmes et vous avez des garanties solides de cela, le travail est effectué. Ce n'est pas tout à fait un système de production à long terme, les étudiants ne l'utilisent que pour s'occuper d'un code éducatif.

29

Il est loin d'être complet, mais un groupe de coéquipiers de mon université se développe Mumuki . La version anglaise semble être brisé N'a pas de contenu en anglais pour le moment, mais vous pouvez la lire. Vous pouvez également Joindre le projet et le faire exécuter C++ (j'ai démarré avec c ).

L'idée de la plate-forme est de créer des exercices avec des tests unitaires qui les vérifient.

Nous avons commencé à réfléchir à la façon de gérer le code de manière isolée, mais jusqu'à présent, il n'y a rien d'implémenté.

3
mgarciaisaia

Oui il y en a. Pour commencer, ce n'est pas une mauvaise idée d'utiliser SSH mais d'améliorer la sécurité que vous pouvez procéder comme suit:

  • Utilisez Chroot Jails pour verrouiller tous les utilisateurs "étudiants" qui se connectent via SSH dans un environnement limité.
  • Ne leur donnez pas d'accès au sudo, utilisez plutôt des scripts/commandes spécifiques dans la liste Sudoers pour autoriser un sous-ensemble limité des commandes d'administration.
  • Effectuez le serveur non accessible publiquement sur aucun port> 1024. (Exécutez SSH sur un numéro de port élevé pour empêcher l'accès Script-Kiddie).
  • Pendant que vous êtes à cela, encouragez-les à utiliser des touches SSH pour vous connecter. Celles-ci sont d'un point de vue de la sécurité très supérieures à l'accès nom d'utilisateur/mot de passe (à condition qu'il y ait chiffré avec un mot de passe).
  • Comme alternative, vous pouvez utiliser Git et intégration continue pour cela. (Gitlab et Jenkins Combo par exemple) Cela dispose de l'avantage supplémentaire de pouvoir ne pas donner accès à un environnement Web sécurisé (lorsque vous utilisez une configuration TLS afin de "https", utilisez un certificat approprié!) Et tout accès est auditable.
1
LvB

Oui, il existe des approches alternatives. Cependant, je pense que votre question est basée sur des hypothèses imparfaites. Tout en permettant aux connexions de Shell à plus de personnes aura évidemment des impacts de sécurité, cela ne signifie pas nécessairement par définition que la sécurité du système résultant ne peut pas être gérée efficacement. Ces systèmes sont conçus pour être des systèmes multi-utilisateurs et disposent de la possibilité de gérer cet accès de manière à ne pas compromettre la sécurité (ou au moins, gérer le niveau de risque à un point acceptable). Le défi réel de ces envieux envieux est que vous n'avez généralement pas les ressources nécessaires pour le faire. Par exemple, il est peu probable qu'un seul profil d'étudiant soit adéquat - vous auriez besoin de profils pour refléter les différents besoins. Un cours d'introduction programmation n'a probablement pas besoin du même accès en cours sur la programmation de réseau ou de programmation des systèmes. Le problème devient alors l'un des temps suffisants pour administrer tous ces profils différents et s'assurer qu'ils sont appropriés.

Après avoir dit tout cela, je pense que, dans l'âge de nos jours, il existe des approches alternatives susceptibles d'être à la fois plus faciles à gérer et plus appropriées. Par exemple, l'utilisation de machines virtuelles peut être très productive. Ceux-ci peuvent être configurés de telle sorte que chaque élève est isolé de l'autre et peut être fait afin qu'ils puissent " rafraîchir " leur environnement virtuel à un connu " bon état ". Ensuite, il y a des solutions basées autour des choses comme Docker ou Vagrant, qui peuvent être utilisés pour permettre aux étudiants de créer un environnement standard et cohérent sur leurs propres machines. Au lieu de votre serveur étant une plate-forme que les élèves se connectent à faire leur travail, votre serveur devient un mécanisme de distribution qui permet aux étudiants de télécharger un environnement de travail qu'ils peuvent se dérouler. Cela permet également la possibilité de créer des environnements personnalisés qui ont été modifiés pour répondre aux exigences spécifiques du cours.

0
Tim X