Python CGI di Amazon AWS EC2 instance mikro - caranya!

23

Bagaimana Anda bisa membuat instance mikro EC2 melayani skrip CGI dari lighthttpd? Misalnya Python CGI?

Yah, butuh setengah hari, tapi saya mendapatkan Python cgi berjalan di Amazon AWS EC2-instance mikro gratis, menggunakan server lighttpd. Saya pikir itu akan membantu sesama noobs saya untuk meletakkan semua langkah di satu tempat. Berbekal langkah-langkah sederhana di bawah ini, Anda hanya perlu 15 menit untuk mengatur segalanya!

Pertanyaan saya untuk pengguna yang lebih berpengalaman yang membaca ini adalah: Apakah ada kelemahan keamanan dalam apa yang saya lakukan? (Lihat izin file dan direktori.)

Langkah 1: Mulai instance EC2 Anda dan ssh ke dalamnya.

[Jelas, Anda harus mendaftar untuk Amazon EC2 dan menyimpan pasangan kunci Anda ke file * .pem. Saya tidak akan membahas ini, karena Amazon memberi tahu Anda bagaimana melakukannya.]

  1. Masuk ke akun AWS Anda dan mulai mesin virtual EC2 Anda. Web memiliki tutorial untuk melakukan ini. Perhatikan bahwa ukuran instance default yang disajikan Amazon kepada Anda adalah "kecil." Ini bukan "mikro" dan karenanya akan dikenakan biaya uang. Pastikan untuk memilih "mikro" secara manual. (Mesin virtual gratis hanya untuk tahun pertama ...)

  2. Temukan kode DNS publik untuk instance Anda yang sedang berjalan. Untuk melakukan ini, klik contoh di panel atas dasbor dan Anda akhirnya akan melihat bidang "DNS Publik" yang terisi di panel bawah. (Anda mungkin perlu bermain-main sedikit.) DNS Publik terlihat seperti:
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. Mulai program konsol Unix Anda. (Pada Max OS X, ini disebut Terminal, dan tinggal di folder Applications -> Utilities.)

  4. cd ke direktori di sistem desktop Anda yang memiliki file * .pem Anda yang berisi keypairs AWS Anda.

  5. ssh ke instance EC2 Anda menggunakan perintah seperti:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    Jadi, bagi saya, ini adalah:
    ssh -i amzn_ec2_keypair.pem [email protected]

  6. Mesin virtual EC2 Anda seharusnya mengizinkan Anda masuk.

Langkah 2: Unduh lighttpd ke instance EC2 Anda.

  1. Untuk menginstal lighttpd, Anda akan membutuhkan akses root pada instance EC2 Anda. Masalahnya adalah: Amazon tidak akan membiarkan Anda masuk sebagai root. (Paling tidak secara langsung, setidaknya.) Tetapi ada solusinya. Ketikkan perintah ini:
    sudo /bin/bash

  2. Karakter sistem prompt akan berubah dari $ ke #. Kami tidak akan keluar dari "sudo" hingga langkah terakhir dalam seluruh proses ini.

  3. Instal aplikasi lighttpd (versi 1.4.28-1.3.amzn1 untuk saya):
    yum install lighttpd

  4. Instal pustaka FastCGI untuk lighttpd (tidak diperlukan, tetapi mengapa tidak?):
    yum install lighttpd-fastcgi

  5. Uji apakah server Anda berfungsi:
    /etc/init.d/lighttpd start

Langkah 3: Biarkan dunia luar melihat server Anda.

  1. Jika sekarang Anda mencoba untuk menekan server Anda dari browser di desktop Anda, itu akan gagal. Alasannya: Secara default, Amazon AWS tidak membuka port apa pun ke instance EC2 Anda. Jadi, Anda harus membuka port secara manual.

  2. Buka dasbor EC2 Anda di browser desktop Anda. Klik pada "Grup Keamanan" di panel kiri. Satu atau lebih grup keamanan akan muncul di panel kanan atas. Pilih yang ditugaskan untuk instance EC2 Anda ketika Anda meluncurkan instance Anda.

  3. Tabel yang disebut "Koneksi yang Diizinkan" akan muncul di panel kanan bawah. Menu pop-up akan memungkinkan Anda memilih "HTTP" sebagai metode koneksi.

  4. Nilai-nilai lain di baris tabel tersebut harus: tcp, 80, 80, 0.0.0.0/0

  5. Sekarang tekan server instance EC2 Anda dari desktop di browser Anda. Gunakan alamat DNS Publik yang Anda gunakan sebelumnya untuk SSH. Anda akan melihat halaman web generik lighttpd. Jika tidak, saya tidak dapat membantu Anda karena saya seorang noob. :-(

Langkah 4: Konfigurasikan lighttpd untuk melayani CGI.

  1. Kembali ke program konsol, cd ke direktori konfigurasi untuk lighttpd:
    cd /etc/lighttpd

  2. Untuk mengaktifkan CGI, Anda ingin menghapus komentar satu baris dalam file <modules.conf>. (Saya bisa mengaktifkan Fast CGI, tetapi langkah bayi yang terbaik!) Anda dapat melakukan ini dengan editor "ed" sebagai berikut:
    ed modules.conf
    /include "conf.d\/cgi.conf"/
    s/#//
    w
    q

  3. Buat direktori tempat program CGI akan hidup. (File /etc/lighttpd/lighttpd.conf menentukan di mana ini akan berada.) Kami akan membuat direktori kami di lokasi default, jadi kami tidak perlu melakukan pengeditan file konfigurasi:
    cd /var/www/lighttpd
    mkdir cgi-bin
    chmod 755 cgi-bin

  4. Hampir sampai! Tentu saja Anda perlu memasukkan program tes CGI ke direktori cgi-bin. Ini satu:
    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. Mulai ulang server lighttpd Anda:
    /etc/init.d/lighttpd restart

  6. Uji program CGI Anda. Di browser desktop Anda, tekan URL ini, gantikan alamat DNS publik instance EC2 Anda:
    http://<<Public DNS>>/cgi-bin/hellopyworld.py

    Bagi saya, ini adalah:
    http://ec2-174-129-110-23.compute-1.amazonaws.com/cgi-bin/hellopyworld.py

Langkah 5: Itu dia! Bersihkan, dan bersyukurlah!

  • Untuk keluar dari perintah "sudo / bin / bash" yang diberikan sebelumnya, ketik:
    exit

  • Ucapan Terima Kasih: Banyak terima kasih kepada:

    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-surity-groups.html

  • Semoga beruntung, amigos! Saya minta maaf atas sifat non-tradisional dari "pertanyaan" ini tetapi saya telah mendapatkan banyak bantuan dari Stackoverflow sehingga saya ingin sekali memberikan sesuatu kembali.

pengguna595585
sumber
4
Saya memuji Anda karena memposting panduan, tetapi SO adalah untuk mengajukan pertanyaan. Saya akan merekomendasikan blogspot atau yang serupa untuk ini. Jika Anda ingin memberi kembali, Anda harus menjawab pertanyaan :)
Saya serahkan bahwa "cara" apa pun mengandung pertanyaan implisit, yaitu "Bagaimana cara saya melakukan X?" Di masa depan saya akan menyatakan pertanyaan secara eksplisit, meskipun awalnya tampak seperti keangkuhan. Tapi, karena mungkin membantu mesin pencari dan menghindari kebingungan dalam jumlah pembaca, saya sekarang berpikir itu bermanfaat. Terima kasih.
Ini sangat baik dari anggota baru untuk memposting cara-seperti itu. Bagaimanapun, itu menjawab pertanyaan yang belum ditanyakan. Ngomong-ngomong, itu memberi saya informasi yang saya butuhkan beberapa hari yang lalu, sekarang saya tahu keberadaan layanan semacam ini. Ngomong-ngomong, pada saat seseorang berbicara banyak tentang Cloud, postingan ini kemungkinan akan sangat berguna bagi banyak orang. Jadi dia tidak pantas berkecil hati, dan saya merasa senang.
@ user595585 Latihan yang disetujui adalah mengajukan pertanyaan "Bagaimana saya" dan menjawabnya sendiri. Anda bahkan mendapatkan lebih banyak perwakilan untuk masalah Anda seperti itu. Silakan lihat FAQ . "Juga baik-baik saja untuk bertanya dan menjawab pertanyaanmu sendiri, selama kamu berpura-pura berada di Jeopardy: frase itu dalam bentuk pertanyaan."
C. Ross
3
@user Sunting pertanyaan Anda sehingga adalah pertanyaan, kemudian menjawab dengan semua rincian yang Anda berikan. Juga, lepaskan beberapa parens itu, Anda berbicara tentang hosting python di EC2, bukan lisp.
Ripped Off

Jawaban:

3

(Posting aneh, jadi semoga ini tidak aneh sebagai balasan)

Mengenai masalah keamanan: dianggap praktik buruk umum untuk menyimpan skrip cgi-bin di dalam root dokumen server web. Bahkan W3C menghindari itu di bawah "Apakah bahasa yang dikompilasi seperti C lebih aman ..." di FAQ Keamanan World Wide Web mereka :

Pertimbangkan skenario berikut. Demi kenyamanan, Anda telah memutuskan untuk mengidentifikasi skrip CGI ke server menggunakan ekstensi .cgi. Kemudian, Anda perlu membuat perubahan kecil ke skrip CGI yang ditafsirkan. Anda membukanya dengan editor teks Emacs dan memodifikasi skrip. Sayangnya hasil edit meninggalkan salinan cadangan kode sumber skrip tergeletak di pohon dokumen. Meskipun pengguna jarak jauh tidak dapat memperoleh kode sumber dengan mengambil skrip itu sendiri, ia sekarang dapat memperoleh salinan cadangan dengan secara membabi buta meminta URL:

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

(Ini adalah alasan bagus lainnya untuk membatasi skrip CGI ke cgi-bin dan untuk memastikan bahwa cgi-bin terpisah dari root dokumen.)

Ini bukan ancaman yang signifikan seperti kemampuan untuk menulis file di dalam root dokumen. Namun, penyerang bisa mendapatkan kode sumber cgi, menyusun serangan terarah terhadapnya, dan menggunakannya sebagai batu loncatan ke server.

Untuk mengurangi ini, Anda dapat menambahkan baris berikut ke lighttpd.conf (atau beberapa variasi di dalamnya) untuk mengarahkan cgi-bin ke direktori yang terpisah dari root dokumen / var / www / lighttpd.

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

Ini membutuhkan modul cgi dan alias untuk lighttpd.

Jeff Stice-Hall
sumber