Server per le assegnazioni dei codici scuola

17

Un corso introduttivo di C ++ viene offerto ogni anno nella nostra università. Per consentire agli studenti di scrivere in codice in C ++ e inviare i loro compiti, diamo loro l'accesso alla shell a un server Linux. Usano ssh per accedere al server con i loro account, fare la codifica e mantenere il codice compilato nelle loro directory home. Tuttavia, l'accesso alla shell comporta una serie di vulnerabilità. La mia domanda è: esiste un altro modo, oltre a dare l'accesso alla shell agli studenti, in cui possiamo soddisfare lo scopo sopra menzionato? Qualsiasi strumento / applicazione lato server in grado di fornire un'interfaccia agli studenti per eseguire le loro assegnazioni c ++ senza compromettere la sicurezza del server?

    
posta Soban 22.05.2015 - 13:03
fonte

4 risposte

29

Ciò di cui hai bisogno è relativamente semplice: devi assicurarti che gli account non privilegiati dei tuoi studenti siano ben confinati. Se non si dispone di un ambiente grafico, la situazione è relativamente semplice. Dovresti iniziare implementando le seguenti azioni:

  • assicurati che gli utenti vengano creati senza privilegi amministrativi (nessun sudo , nessun admin o wheel gruppo)
  • assicurati che gli utenti non siano in grado di emulare una schermata di accesso per falsificare la schermata di accesso (un classico per l'università, che ho visto accadere)
  • verifica la corretta politica polkitd che impedisce agli utenti di sospendere / arrestare l'host
  • assicurati di non eseguire servizi vulnerabili / obsoleti suid / sgid sull'host ( vedi come elencarli )
  • assicurati che nessun singolo utente possa esaurire le risorse del sistema (configurando Systemd.cgroup imporre limiti di utilizzo delle risorse sull'intera sessione di ciascun utente)
  • rafforza il tuo controllo di accesso obbligatorio installando e configurando correttamente SELinux (per limitare gli studenti a un ruolo da studente in cui possono scrivere solo nella loro casa e in / tmp)
  • scadono gli account quando necessario per evitare indugiare sugli account con password eventualmente compromesse ( vedi questa domanda sul sito Unix )
  • puoi persino eseguire sessioni degli studenti in contenitori separati usando Systemd.nspawn che è progettato per essere eseguito sistemi completamente funzionanti indipendentemente l'uno dall'altro, utilizzando spazi dei nomi Linux . Questo è il modo corretto di imprigionare una sessione, non chroot

Potresti quindi notare che gli studenti usano le macchine per scopi diversi da quelli consentiti. Puoi limitare l'accesso alle macchine a orari specifici utilizzando pam_time sebbene ciò possa intralciare il lavoro degli studenti e dovrebbe essere bilanciato con i benefici che offre. Inoltre, assicurati che gli amministratori di rete sappiano quale traffico aspettarsi su questo host in modo che possano rilevare il traffico indesiderato.

Tutto ciò detto, non vedo il punto in bianco - elencando binari specifici (inutile dato che gli studenti possono compilare ed eseguire il proprio codice) in quanto potrebbe intralciare il modo in cui gli studenti utilizzano strumenti di sviluppo legittimi, ad es. compilatori alternativi, toolchain di costruzione, strumenti di analisi del codice, strumenti per il controllo delle versioni del codice, ecc.

Finché gli utenti possono solo danneggiare se stessi e tu hai delle forti garanzie di ciò, il lavoro è fatto. In ogni caso, questo non è esattamente un sistema di produzione a lungo termine, gli studenti lo usano solo per scherzare con il codice educativo.

    
risposta data 22.05.2015 - 13:42
fonte
3

È tutt'altro che completo, ma un gruppo di compagni di squadra della mia università sta sviluppando Mumuki . La versione inglese sembra essere rotta al momento non ha contenuti in inglese, ma puoi leggerli intenzione lì. Puoi anche partecipare al progetto e farlo funzionare in C ++ (I have iniziato con C ).

L'idea della piattaforma è di creare esercizi con test unitari che li controllino.

Abbiamo iniziato a pensare a come eseguire il codice in modi isolati, ma fino ad ora non è stato implementato nulla.

    
risposta data 22.05.2015 - 19:49
fonte
1

Sì, ci sono. Per cominciare, non è una cattiva idea usare SSH ma per migliorare la sicurezza puoi fare quanto segue:

  • Utilizza le chroot jail per bloccare tutti gli utenti "studenti" che accedono tramite SSH in un ambiente limitato.
  • Non dare loro accesso sudo, usa invece script / comandi specifici nell'elenco di sudoers per consentire un sottoinsieme limitato dei comandi di amministrazione.
  • Rendi il server non pubblicamente accessibile su nessuna porta > 1024. (esegui ssh su un numero di porta alto per impedire l'accesso a script-kiddie).
  • Mentre ci sei, incoraggiali a usare i tasti ssh per accedere. Questi sono da un punto di vista della sicurezza di gran lunga superiore all'accesso username / password (purché criptato con una password).
  • In alternativa potresti usare git e l'integrazione continua per questo. (Combo di Gitlab e Jenkins per esempio) questo ha il vantaggio di essere in grado di fornire loro l'accesso solo attraverso un ambiente Web sicuro (quando si utilizza un'impostazione TLS così 'https', utilizzare un certificato appropriato!) E tutti gli accessi sono verificabili.
risposta data 22.05.2015 - 13:43
fonte
0

Sì, ci sono approcci alternativi. Tuttavia, penso che la tua domanda sia basata su ipotesi errate. Sebbene consentire il login della shell a più persone avrà ovviamente impatti sulla sicurezza, non significa necessariamente per definizione che la sicurezza del sistema risultante non possa essere gestita in modo efficace. Questi sistemi sono progettati per essere sistemi multiutente e hanno la possibilità di gestire questo accesso in modo da non compromettere la sicurezza (o almeno, gestire il livello di rischio in un punto accettabile). La vera sfida in questi ambienti è che in genere non si hanno le risorse per farlo. Ad esempio, è improbabile che un profilo di uno studente sia adeguato: occorrerebbero profili che riflettano le diverse esigenze. Un corso introduttivo di programmazione probabilmente non ha bisogno dello stesso accesso di un corso di programmazione di rete o di programmazione di sistemi. Il problema diventa quindi avere tempo sufficiente per amministrare tutti questi diversi profili e assicurarsi che siano appropriati.

Detto questo, penso che in questo giorno ed età, ci sono approcci alternativi che sono probabilmente più gestibili e più appropriati. Ad esempio, l'utilizzo di macchine virtuali può essere molto produttivo. Questi possono essere impostati in modo che ogni studente sia isolato l'uno dall'altro e possa essere fatto in modo che possano "aggiornare" il proprio ambiente virtuale a uno "stato buono" noto. Poi ci sono soluzioni basate su cose come Docker o Vagrant, che possono essere utilizzate per consentire agli studenti di creare un ambiente standard e coerente sulle proprie macchine. Invece che il tuo server è una piattaforma su cui gli studenti si collegano per fare il loro lavoro, il tuo server diventa un meccanismo di distribuzione che consente agli studenti di scaricare un ambiente di lavoro che possono eseguire autonomamente. Ciò consente anche la possibilità di creare ambienti personalizzati che sono stati ottimizzati per soddisfare i requisiti specifici del corso.

    
risposta data 28.05.2015 - 23:18
fonte

Leggi altre domande sui tag