2013-02-13 8 views
10

aggiornamento 2: Ho ottenuto questo lavoro ed è vivo :)valutare codice Perl in modo sicuro in una macchina virtuale online

aggiornamento: Si prega di verificare i commenti, la risposta @ikegami sta lavorando, ma con un piccolo problema. Potrei fare qualcosa di abbastanza semplice sbagliato.


di recente ho deciso che dovevo imparare Linux/Perl davvero bene, e poi ho iniziato a costruire questo www.tryperl.com come un progetto di apprendimento. È un Cloud IDE di sorta.

(è stato solo pochi mesi da quando le mani ho messo prima a Perl, Linux, bash, osx, quindi si prega di andare facile su di me)

Attualmente mi eval codice con Safe.pm, ma il mio piano di gioco è :

Un VM Amazon EC2 separato che eval porterà codice perl non valido e restituirà il risultato. La VM verrà bloccata da Internet e caricata in modo bilanciato. Posso quindi resettare questa macchina da un'istantanea di tanto in tanto.

Questo è principalmente il codice Userò a eval codice Perl sul server, io uso Time::Out per la gestione del timeout:

my $code = .. 
my $arg = .. 

#create a file with random name 
my $filename = rand().".pl"; 
open(FILE,">$filename") 
print FILE $code; 
close(FILE); 

#use Time::Out to timeout after 10 secs 

my $ret = timeout 10 => sub { 
    #run the file just created with $arg as an argument. << This is IMP 
    my $r = `perl $filename $arg`; 
    return $r; 
}; 
if ([email protected]){ 
    return [email protected]; 
} 
return $ret; 

mio Problemi

  1. Posso in qualche modo evitare la creazione di file fisici e inserire il codice $ con $ arg? Come open(FILE,"perl <some_magic> | "). .. Potrebbe sembrare stupido, ma ho dovuto chiedere :( Questo è stato risolto da @ikegami nei commenti

  2. io non riesco a utilizzare Capture::Tiny Ho provato a fare questo all'interno del blocco timeout:.
    my ($stdout, $stderr, $count) = capture { system('echo Hello') };
    Ma ho continuato a ottenere le stringhe vuote! :(E 'perché è dentro il timeout? (non mi interessa troppo di questo comunque)

  3. ci sono altri problemi di sicurezza non sto vedendo? Devo fare un limite di forcella ? Come dovrei iniziare a farlo? (Link e alcuni indicatori sarebbero carini)

  4. L'autore di http://www.perltuts.com dice in this article utilizza qemu e un'immagine di debian per eseguire il suo codice. A parte la limitazione della forcella, Il suo approccio è semanticamente simile al mio? (Perdonate la mia ignoranza di nuovo qui, ricordate ho toccato una macchina Linux solo pochi mesi fa)

mia macchina dev è OSX 10.8, server di produzione è RHEL per front-end e Ubuntu per l'eval macchina Perl. Corro su EC2. Vedi lo stack completo details here.

Qualsiasi risposta dettagliata sarà sarà apprezzato e ricompensato con rep e polvere unicorno :)

+2

Take a guarda anche a Linux Containers. Ciò consente di eseguire i processi in un ambiente molto limitato. http://nigel.mcnie.name/blog/a-five-minute-guide-to-linux-containers-for-debian – Dave

+0

+1 Ohh grazie mille @Dave questo è molto interessante. Pensi che io possa eseguire uno di quelli su EC2 però? L'istanza di ec2 è una macchina virtuale stessa. Mi occuperò io :) – gideon

+1

Perl leggerà il codice da STDIN, quindi 'aprirò (my $ fh, '| -', 'perl', '-', @args_for_script)'. – ikegami

risposta

5

Dopo 13 giorni di duro lavoro, finalmente fatto !!

Ho esplorato l'esperienza FreeBSD Jails, il mio lack of networking e il fatto che ho dovuto ricostruire il sistema operativo molte volte mi ha portato via. FreeBSD è davvero fantastico !! Ci tornerò presto.

Ho guardato cupamente allo OpenVZ e poi grazie a @ewwhite ho rivisitato Linux Containers e gli ho dato uno scatto adeguato.

I documenti non sono eccezionali, ma lo this article è davvero di grande aiuto.

  • Ho configurato più contenitori con un sistema di bilanciamento del carico: HAProxy.
  • Ho una installazione perl in ogni contenitore con i moduli cpan di cui ho bisogno.
  • mio PerlExecutor applicazione è un'applicazione che gira su Dancer Starman, che gira sotto di proprietà di un utente limitato che ha meno privilegi e ha dei limiti in limits.conf
  • Il contenitore è bloccato da internet.

Una limitazione: Io non so molto di networking così ho bloccato le carceri da Internet disattivando l'inoltro porta sul server. Tuttavia, le jail devono ancora essere in rete affinché l'host possa comunicare, pertanto è possibile eseguire un ping all'interno della prigione che risolverà il dominio ma esso non risponderà . Quindi tutte le richieste web all'interno falliscono. Faccio anche una scansione delle stringhe per Ping e la blocco.

Eventuali suggerimenti o miglioramenti saranno i benvenuti!

vorrei ringraziare @JakeFeasel@ikegami@ewwhite@chris-s ei ragazzi di ubuntu.SE e unix.SE per il loro aiuto:

Questo è quello che sembra:

TryPerl Architecture Diagram

+0

FYI Re: FreeBSD Jails, non è necessario ricostruire il sistema operativo ripetutamente (forse una volta, e ci sono modi per aggirare anche questo) - cf. http://www.cyberciti.biz/faq/howto-setup-freebsd-jail-with-ezjail/; Anche i contenitori Linux (opportunamente configurati) sono una buona soluzione :) – voretaq7

+0

@ voretaq7 true ma mi manca l'esperienza di unix/networking quindi è stato un po 'difficile. Mi sono sentito davvero bene a giocare con FreeBSD e probabilmente tornerò presto. Per lo più ero bloccato a prendere la prigione per collegarmi a internet. – gideon

Problemi correlati