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?
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:
Sudo
, no admin
ou wheel
groupe)polkitd
empêchant les utilisateurs de suspendre/fermer l'hôtesuid
/sgid
services sur l'hôte ( Voir comment les énumérer )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.
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é.
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:
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.