Amazon AWS EC2 üzerindeki Python CGI mikro örneği - nasıl yapılır!


23

Bir EC2 mikro örneğini, lighthttpd'den CGI betikleri ile nasıl sunabilirsiniz? Örneğin Python CGI?

Yarım gün sürdü, ancak ücretsiz bir Amazon AWS EC2 örneğinde çalışan Python cgi'yi lighttpd sunucusunu kullanarak elde ettim. Sanırım noo arkadaşlarımın bütün adımları bir yere koymasına yardımcı olacak. Aşağıdaki basit adımlarla donanmış, işleri ayarlamak sadece 15 dakikanızı alacak!

Bunu okuyan daha deneyimli kullanıcılar için sorum şu: Yaptıklarımda herhangi bir güvenlik açığı var mı? (Bkz. Dosya ve dizin izinleri.)

Adım 1: EC2 örneğinizi başlatın ve içine ssh.

[Açıkçası, Amazon EC2'ye kaydolmanız ve anahtar çiftlerinizi bir * .pem dosyasına kaydetmeniz gerekir. Amazon size nasıl yapılacağını anlattığı gibi, bunun üzerinden geçmeyeceğim.]

  1. AWS hesabınıza giriş yapın ve EC2 örneğinizi başlatın. Web bu konuda öğreticiler var. Amazon'un size sunduğu varsayılan örnek boyutunun "küçük" olduğuna dikkat edin. Bu "mikro" değildir ve bu yüzden size paraya mal olur. El ile "mikro" yu seçtiğinizden emin olun. (Mikro örnekler yalnızca ilk yıl için ücretsizdir ...)

  2. Çalışan örneğinizin genel DNS kodunu bulun. Bunu yapmak için, kontrol panelinin üst bölmesindeki örneğe tıklayın; sonunda alt bölmede doldurulmuş olan "Genel DNS" alanını göreceksiniz. (Biraz keman yapmanız gerekebilir.) Public DNS şöyle bir şeye benziyor:
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. Unix konsol programınızı başlatın. (Max OS X'te, buna Terminal denir ve Uygulamalar -> Yardımcı Programlar klasöründe bulunur.)

  4. AWS klavyelerinizi içeren * .pem dosyanızın bulunduğu masaüstünüzdeki dizine cd.

  5. EC2 örneğinize ssh gibi bir komut kullanarak:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    Yani, benim için bu şuydu:
    ssh -i amzn_ec2_keypair.pem ec2-user@ec2-174-129-110-23.compute-1.amazonaws.com

  6. EC2 örneğiniz size izin vermelidir.

Adım 2: lighttpd'yi EC2 örneğinize indirin.

  1. Lighttpd'yi kurmak için EC2 örneğinizde root erişimine ihtiyacınız olacak. Sorun şudur: Amazon, root olarak giriş yapmanıza izin vermeyecektir. (En azından basitçe değil.) Ama bir geçici çözüm var. Bu komutu yazın:
    sudo /bin/bash

  2. Sistem bilgi istemi karakteri $ 'dan #' a değişecektir. Bu süreçte en son adıma kadar "sudo" dan çıkmayacağız.

  3. Lighttpd uygulamasını kurun (benim için sürüm 1.4.28-1.3.amzn1):
    yum install lighttpd

  4. Lighttpd için FastCGI kütüphanelerini kurun (gerekli değil, neden olmasın?):
    yum install lighttpd-fastcgi

  5. Sunucunuzun çalıştığını test edin:
    /etc/init.d/lighttpd start

Adım 3: Dış dünyanın sunucunuzu görmesine izin verin.

  1. Şimdi sunucunuzu masaüstünüzdeki tarayıcıdan vurmaya çalıştıysanız, başarısız olur. Sebep: Varsayılan olarak, Amazon AWS, EC2 örneğinize herhangi bir bağlantı noktası açmaz. Bu yüzden portları manuel olarak açmak zorundasınız.

  2. Masaüstünüzün tarayıcısından EC2 panonuza gidin. Sol bölmedeki "Güvenlik Grupları" üzerine tıklayın. Sağ üst bölmede bir veya daha fazla güvenlik grubu görünecektir. Örneğinizi başlattığınızda EC2 örneğinize atanmış olanı seçin.

  3. Sağ alt bölmede "İzin Verilen Bağlantılar" adlı bir tablo görünecektir. Bir açılır menü, bağlantı yöntemi olarak "HTTP" yi seçmenize izin verecektir.

  4. Tablonun bu satırındaki diğer değerler şöyle olmalıdır: tcp, 80, 80, 0.0.0.0/0

  5. Şimdi EC2 örneğinizin sunucusuna tarayıcınızdaki masaüstünden basın. Daha önce kullandığınız Genel DNS adresini SSH'ye kullanın. Lighttpd genel web sayfasını görmelisiniz. Eğer yapmazsan, sana yardım edemem çünkü ben çok asilim. :-(

Adım 4: lighttpd'yi CGI'ye hizmet edecek şekilde yapılandırın.

  1. Konsol programına geri döndüğümde, lighttpd yapılandırma dizinine cd:
    cd /etc/lighttpd

  2. CGI'yı etkinleştirmek için, <module.conf> dosyasındaki bir satırı yorumlamak istemezsiniz. (Fast CGI'ı etkinleştirebilirdim, ancak bebek adımları en iyisidir!) Bunu "ed" editörüyle aşağıdaki gibi yapabilirsiniz:
    ed modules.conf
    /include "conf.d\/cgi.conf"/
    s/#//
    w
    q

  3. CGI programlarının yaşayacağı dizini oluşturun. (/Etc/lighttpd/lighttpd.conf dosyası bunun nerede olacağını belirler.) Dizinimizi varsayılan konumda oluşturacağız, bu nedenle yapılandırma dosyalarında herhangi bir düzenleme yapmamız gerekmez:
    cd /var/www/lighttpd
    mkdir cgi-bin
    chmod 755 cgi-bin

  4. Neredeyse! Elbette cgi-bin dizinine bir test CGI programı eklemeniz gerekir. İşte burada:
    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. Lighttpd sunucunuzu yeniden başlatın:
    /etc/init.d/lighttpd restart

  6. CGI programınızı test edin. Masaüstünüzün tarayıcısında, EC2 örneğinizin genel DNS adresini değiştirerek, bu URL'ye basın:
    http://<<Public DNS>>/cgi-bin/hellopyworld.py

    Benim için bu:
    http://ec2-174-129-110-23.compute-1.amazonaws.com/cgi-bin/hellopyworld.py

Adım 5: İşte bu! Temizleyin ve teşekkür edin!

  • Daha önce verilen "sudo / bin / bash" komutundan çıkmak için şunu yazın:
    exit

  • Teşekkürler: Teşekkür yığınları:

    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

  • İyi şanslar amigos! Bu "sorunun" geleneksel olmayan doğası için özür dilerim ama Stackoverflow'tan çok fazla yardım aldım, bir şeyleri geri vermeye istekliyim.


4
Bir rehber gönderdiğiniz için sizi alkışlarım, ancak SO soru sormak için. Blogspot veya buna benzer bir şey öneririm. Geri vermeye istekliysen, soruları cevaplamalısın :)

Herhangi bir “nasıl” sorusunun örtük bir soru içerdiğini, yani “X'i nasıl yaparım?” Olduğunu belirtiyorum. Gelecekte, başlangıçta serserlik gibi gözükse de, sorunu açıkça belirteceğim. Ancak, arama motorlarına yardımcı olabileceği ve okur kitlesindeki karışıklığı önleyebileceği için şimdi bunun faydalı olacağını düşünüyorum. Teşekkürler.

Yeni bir üyeden böyle bir mesaj göndermek için çok naziksiniz. Neyse, henüz sorulmamış soruları yanıtlar. Bu arada, bana birkaç gün önce ihtiyacım olan bilgileri veriyor, şimdi bu tür bir hizmetin varlığını biliyorum. Bu arada, bir kişinin Buluttan çokça bahsettiği bir zamanda, bu yazının birçok insan için çok faydalı olması muhtemel. Demek cesaret kırmayı hak etmiyor ve ben de hakaret ediyorum.

@ user595585 Onaylanan uygulama "Nasıl yaparım" sorusunu sorup kendinize cevap vermektir. Sorununuz için bu şekilde daha fazla itibar bile kazanabilirsiniz. Lütfen SSS bölümüne bakın . “Jeopardy'de olduğunuzu iddia ettiğiniz sürece kendi sorunuzu sormak ve cevaplamak da gayet iyi: bir soru şeklinde ifade edin.”
C. Ross,

3
@user düzenleyin soru o kadar olan bir soru, o zaman tüm detayları ile cevap ver. Ayrıca, bu parenlerin bir kısmını düşürün, lisp değil, EC2'de piton barındırmaktan bahsediyorsunuz.
Off Rip

Yanıtlar:


3

(Garip posta, bu yüzden umarım bu bir cevap kadar garip olmaz).

Güvenlik kusurları konusunda: web sunucusunun belge kökünde cgi-bin betiklerini saklamak genel kötü bir uygulama olarak kabul edilir. W3C bile, World Wide Web Security SSS bölümlerinde "C gibi daha güvenli diller toplanıyor ..." başlığı altında ses çıkardı :

Aşağıdaki senaryoyu inceleyin. Kolaylık olması için, .cgi uzantısını kullanarak sunucuya CGI betiklerini tanımlamaya karar verdiniz. Daha sonra, yorumlanmış bir CGI betiğinde küçük bir değişiklik yapmanız gerekir. Sen Emacs metin editörüyle aç ve senaryoyu değiştir. Maalesef, düzenleme, belge ağacında etrafta bulunan kod kaynak kodunun bir yedek kopyasını bırakır. Uzaktaki kullanıcı komut dosyasını kendisi alarak kaynak kodunu alamamasına rağmen, artık URL'yi istemeyerek yedek kopyasını alabilir:

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

(Bu, CGI betiklerini cgi-bin ile sınırlandırmak ve cgi-bin'in belge kökünden ayrı olduğundan emin olmak için iyi bir nedendir.)

Bu, belge köküne bir dosya yazma yeteneği kadar önemli bir tehdit değildir. Bununla birlikte, bir saldırgan cgi'nin kaynak kodunu alabilir, kendisine yönelik bir saldırı düzenleyebilir ve bunu sunucuya bir basamak taşı olarak kullanabilir.

Bunu hafifletmek için, cgi-bin'yi / var / www / lighttpd belge kök dizininden ayrı bir dizine yönlendirmek için lighttpd.conf dosyasına (veya bazı varyasyonlarda) aşağıdaki satırları ekleyebilirsiniz.

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

Bu, lighttpd için hem cgi hem de alias modüllerini gerektirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.