Python CGI su micro-istanza Amazon AWS EC2: una guida!


23

Come si può fare in modo che una microistanza EC2 serva script CGI da lighthttpd? Ad esempio Python CGI?

Bene, ci è voluta mezza giornata, ma ho fatto funzionare Python cgi su una microistanza gratuita di Amazon AWS EC2, usando il server lighttpd. Penso che aiuterà i miei compagni di studio a mettere tutti i passaggi in un unico posto. Grazie ai semplici passaggi di seguito, ci vorranno solo 15 minuti per impostare le cose!

La mia domanda per gli utenti più esperti che leggono questo è: ci sono dei difetti di sicurezza in quello che ho fatto? (Vedi le autorizzazioni per file e directory.)

Passaggio 1: avvia l'istanza EC2 e ssh in essa.

[Ovviamente, dovrai registrarti ad Amazon EC2 e salvare le tue coppie di chiavi in ​​un file * .pem. Non andrò oltre, poiché Amazon ti dice come farlo.]

  1. Accedi al tuo account AWS e avvia l'istanza EC2. Il web ha tutorial su come farlo. Nota che la dimensione dell'istanza predefinita che Amazon ti presenta è "piccola". Questo non è "micro" e quindi ti costerà denaro. Assicurati di scegliere manualmente "micro". (Le microistanze sono gratuite solo per il primo anno ...)

  2. Trova il codice DNS pubblico per l'istanza in esecuzione. Per fare ciò, fai clic sull'istanza nel riquadro superiore della dashboard e alla fine vedrai il campo "DNS pubblico" popolato nel riquadro inferiore. (Potrebbe essere necessario giocherellare un po '.) Il DNS pubblico è simile a:
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. Avvia il tuo programma di console Unix. (Su Max OS X, si chiama Terminal, e vive nella cartella Applicazioni -> Utilità.)

  4. cd nella directory del sistema desktop in cui è presente il file * .pem contenente i file chiave AWS.

  5. ssh alla tua istanza EC2 usando un comando come:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    Quindi, per me, questo era:
    ssh -i amzn_ec2_keypair.pem ec2-user@ec2-174-129-110-23.compute-1.amazonaws.com

  6. La tua istanza EC2 dovrebbe farti entrare.

Passaggio 2: scarica lighttpd nell'istanza EC2.

  1. Per installare lighttpd, avrai bisogno dell'accesso root sulla tua istanza EC2. Il problema è: Amazon non ti consentirà di accedere come root. (Non direttamente, almeno.) Ma c'è una soluzione alternativa. Digita questo comando:
    sudo /bin/bash

  2. Il carattere di richiesta del sistema cambierà da $ a #. Non usciremo da "sudo" fino all'ultimo passo dell'intero processo.

  3. Installa l'applicazione lighttpd (versione 1.4.28-1.3.amzn1 per me):
    yum install lighttpd

  4. Installa le librerie FastCGI per lighttpd (non necessario, ma perché no?):
    yum install lighttpd-fastcgi

  5. Verifica che il tuo server funzioni:
    /etc/init.d/lighttpd start

Passaggio 3: consenti al mondo esterno di vedere il tuo server.

  1. Se ora provassi a colpire il tuo server dal browser sul desktop, fallirebbe. Il motivo: per impostazione predefinita, Amazon AWS non apre alcuna porta all'istanza EC2. Quindi, devi aprire le porte manualmente.

  2. Vai alla dashboard EC2 nel browser del desktop. Fai clic su "Gruppi di sicurezza" nel riquadro a sinistra. Uno o più gruppi di sicurezza appariranno nel riquadro in alto a destra. Scegli quello assegnato alla tua istanza EC2 quando hai lanciato la tua istanza.

  3. Una tabella chiamata "Connessioni consentite" apparirà nel riquadro in basso a destra. Un menu a comparsa ti consentirà di scegliere "HTTP" come metodo di connessione.

  4. Gli altri valori in quella riga della tabella dovrebbero essere: tcp, 80, 80, 0.0.0.0/0

  5. Ora colpisci il server della tua istanza EC2 dal desktop nel browser. Utilizzare l'indirizzo DNS pubblico utilizzato in precedenza per SSH. Dovresti vedere la pagina Web generica lighttpd. Se non lo fai, non posso aiutarti perché sono un tale noob. :-(

Passaggio 4: configura lighttpd per servire CGI.

  1. Di nuovo nel programma della console, cd nella directory di configurazione per lighttpd:
    cd /etc/lighttpd

  2. Per abilitare CGI, si desidera decommentare una riga nel file <modules.conf>. (Avrei potuto abilitare Fast CGI, ma i piccoli passi sono i migliori!) Puoi farlo con l'editor "ed" come segue:
    ed modules.conf
    /include "conf.d\/cgi.conf"/
    s/#//
    w
    q

  3. Creare la directory in cui vivranno i programmi CGI. (Il file /etc/lighttpd/lighttpd.conf determina dove sarà.) Creeremo la nostra directory nella posizione predefinita, quindi non dovremo effettuare alcuna modifica dei file di configurazione:
    cd /var/www/lighttpd
    mkdir cgi-bin
    chmod 755 cgi-bin

  4. Quasi lì! Naturalmente è necessario inserire un programma CGI di prova nella directory cgi-bin. Eccone uno:
    cd cgi-bin
    ed
    a
    #!/usr/bin/python
    print "Content-type: text/html\n\n"
    print "<html><body>Hello, pyworld.</body></html>"
    .
    w hellopyworld.py
    q
    chmod 655 hellopyworld.py

  5. Riavvia il tuo server lighttpd:
    /etc/init.d/lighttpd restart

  6. Metti alla prova il tuo programma CGI. Nel browser del desktop, premi questo URL, sostituendo l'indirizzo DNS pubblico dell'istanza EC2:
    http://<<Public DNS>>/cgi-bin/hellopyworld.py

    Per me questo era:
    http://ec2-174-129-110-23.compute-1.amazonaws.com/cgi-bin/hellopyworld.py

Passaggio 5: tutto qui! Pulisci e ringrazia!

  • Per uscire dal comando "sudo / bin / bash" fornito in precedenza, digitare:
    exit

  • Ringraziamenti: Mille grazie a:

    wiki.vpslink.com/Install_and_Configure_lighttpd

    www.cyberciti.biz/tips/lighttpd-howto-setup-cgi-bin-access-for-perl-programs.html

    aws.typepad.com/aws/2010/06/building-three-tier-architectures-with-security-groups.html

  • Buona fortuna, amigos! Mi scuso per la natura non tradizionale di questa "domanda", ma ho ricevuto così tanto aiuto da Stackoverflow che non vedevo l'ora di dare qualcosa in cambio.


4
Ti applaudo per aver pubblicato una guida, ma SO è per porre domande. Consiglierei blogspot o qualcosa di simile per questo. Se sei ansioso di restituire, dovresti rispondere alle domande :)

Sottolineo che qualsiasi "come fare" contiene una domanda implicita, ovvero "Come si fa X?" In futuro esporrò esplicitamente la domanda, sebbene inizialmente sembrasse pedanteria. Ma, poiché potrebbe aiutare i motori di ricerca ed evitare confusione nei lettori, ora penso che ne valga la pena. Grazie.

È molto gentile da parte di un nuovo membro pubblicare un tale how-to. Ad ogni modo, risponde a domande che non sono ancora state poste. A proposito, mi dà le informazioni di cui avevo bisogno qualche giorno fa, ora so l'esistenza di questo tipo di servizio. A proposito, in un momento in cui si parla molto del Cloud, questo post sarà probabilmente molto utile per molte persone. Quindi non merita di essere scoraggiato, e io voto.

@ user595585 La pratica approvata consiste nel porre una domanda "Come faccio" e rispondere da soli. In questo modo avrai anche più rappresentanti per i tuoi problemi. Si prega di consultare le FAQ . "Va anche bene porre e rispondere alla tua domanda, fintanto che fai finta di essere su Jeopardy: esprimilo sotto forma di una domanda."
C. Ross,

3
@utente Modifica la tua domanda in modo che sia una domanda, quindi rispondi con tutti i dettagli che hai fornito. Inoltre, lascia cadere alcune di quelle parentesi, stai parlando di hosting di Python su EC2, non di lisp.
Strappato il

Risposte:


3

(Strano post, quindi speriamo che questa non sia una risposta così strana).

In tema di difetti di sicurezza: è considerata una cattiva pratica generale archiviare gli script cgi-bin all'interno della radice del documento del web server. Anche il W3C sfugge ad esso in "I linguaggi compilati come C più sicuro ..." nelle FAQ sulla sicurezza del World Wide Web :

Considera il seguente scenario. Per comodità, hai deciso di identificare gli script CGI sul server usando l'estensione .cgi. Successivamente, è necessario apportare una piccola modifica a uno script CGI interpretato. Lo si apre con l'editor di testo Emacs e si modifica lo script. Sfortunatamente la modifica lascia una copia di backup del codice sorgente dello script in giro nell'albero del documento. Sebbene l'utente remoto non possa ottenere il codice sorgente recuperando lo script stesso, ora può ottenere la copia di backup richiedendo ciecamente l'URL:

    http://your-site/a/path/your_script.cgi~

(Questa è un'altra buona ragione per limitare gli script CGI a cgi-bin e per assicurarsi che cgi-bin sia separato dalla radice del documento.)

Questa non è una minaccia significativa quanto la possibilità di scrivere un file nella radice del documento. Tuttavia, un utente malintenzionato potrebbe ottenere il codice sorgente del cgi, escogitare un attacco diretto contro di esso e utilizzarlo come trampolino di lancio nel server.

Per mitigare ciò, è possibile aggiungere le seguenti righe a lighttpd.conf (o qualche variazione in esso) per indirizzare cgi-bin in una directory separata dalla radice del documento / var / www / lighttpd.

$HTTP["url"] =~ "/cgi-bin/" { cgi.assign = ( "" => "" ) }
alias.url = ( "/cgi-bin/" => "/usr/lib/cgi-bin/" )

Ciò richiede sia i moduli cgi che alias per lighttpd.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.