Python CGI na mikroinstancji Amazon AWS EC2 - poradnik!

23

Jak sprawić, by mikro instancja EC2 obsługiwała skrypty CGI z lighthttpd? Na przykład Python CGI?

Cóż, zajęło to pół dnia, ale udało mi się uruchomić Python cgi na darmowej mikro-instancji Amazon AWS EC2, używając serwera lighttpd. Myślę, że to pomoże moim kolegom noobom umieścić wszystkie kroki w jednym miejscu. Uzbrojeni w poniższe proste czynności, skonfigurowanie zajmie Ci tylko 15 minut!

Moje pytanie dla bardziej doświadczonych użytkowników, którzy to czytają, brzmi: Czy są jakieś błędy w zabezpieczeniach w tym, co zrobiłem? (Zobacz uprawnienia do plików i katalogów.)

Krok 1: Uruchom instancję EC2 i włącz do niej ssh.

[Oczywiście, musisz zarejestrować się w Amazon EC2 i zapisać swoje pary kluczy w pliku * .pem. Nie omówię tego, ponieważ Amazon mówi ci, jak to zrobić.]

  1. Zaloguj się do swojego konta AWS i uruchom instancję EC2. W sieci dostępne są samouczki na ten temat. Zauważ, że domyślny rozmiar instancji, który przedstawia ci Amazon, jest „mały”. To nie jest „mikro” i dlatego będzie cię kosztować. Pamiętaj, aby ręcznie wybrać „mikro”. (Mikro instancje są bezpłatne tylko przez pierwszy rok ...)

  2. Znajdź publiczny kod DNS dla uruchomionej instancji. Aby to zrobić, kliknij instancję w górnym okienku pulpitu nawigacyjnego, a ostatecznie zobaczysz pole „Publiczny DNS” wypełnione w dolnym okienku. (Być może trzeba będzie trochę pogrzebać.) Publiczny DNS wygląda mniej więcej tak:
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. Uruchom program konsoli Unix. (W systemie Max OS X nazywa się Terminal i mieszka w folderze Aplikacje -> Narzędzia).

  4. cd do katalogu na twoim komputerze stacjonarnym, który zawiera plik * .pem zawierający twoje klucze AWS.

  5. ssh do instancji EC2 za pomocą polecenia takiego jak:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    Dla mnie było to:
    ssh -i amzn_ec2_keypair.pem [email protected]

  6. Twoja instancja EC2 powinna cię wpuścić.

Krok 2: Pobierz lighttpd na instancję EC2.

  1. Aby zainstalować lighttpd, będziesz potrzebować dostępu do roota w swoim wystąpieniu EC2. Problem polega na tym, że Amazon nie pozwoli ci zalogować się jako root. (Przynajmniej nie wprost). Istnieje jednak obejście. Wpisz to polecenie:
    sudo /bin/bash

  2. Systemowy znak zachęty zmieni się z $ na #. Nie wyjdziemy z „sudo” aż do ostatniego kroku w tym procesie.

  3. Zainstaluj aplikację lighttpd (dla mnie wersja 1.4.28-1.3.amzn1):
    yum install lighttpd

  4. Zainstaluj biblioteki FastCGI dla lighttpd (nie potrzebne, ale dlaczego nie?):
    yum install lighttpd-fastcgi

  5. Sprawdź, czy serwer działa:
    /etc/init.d/lighttpd start

Krok 3: Niech świat zewnętrzny zobaczy twój serwer.

  1. Jeśli teraz spróbujesz trafić serwer z przeglądarki na pulpicie, zakończy się niepowodzeniem. Powód: domyślnie Amazon AWS nie otwiera żadnych portów dla instancji EC2. Musisz więc ręcznie otworzyć porty.

  2. Przejdź do pulpitu nawigacyjnego EC2 w przeglądarce pulpitu. Kliknij „Grupy bezpieczeństwa” w lewym okienku. Jedna lub więcej grup zabezpieczeń pojawi się w prawym górnym panelu. Wybierz ten, który został przypisany do instancji EC2 podczas uruchamiania instancji.

  3. Tabela o nazwie „Dozwolone połączenia” pojawi się w prawym dolnym panelu. Wyskakujące menu pozwoli ci wybrać „HTTP” jako metodę połączenia.

  4. Pozostałe wartości w tym wierszu tabeli powinny wynosić: tcp, 80, 80, 0.0.0.0/0

  5. Teraz naciśnij serwer instancji EC2 z pulpitu w przeglądarce. Użyj publicznego adresu DNS, którego użyłeś wcześniej do SSH. Powinieneś zobaczyć ogólną stronę lighttpd. Jeśli nie, nie mogę ci pomóc, bo jestem takim noobem. :-(

Krok 4: Skonfiguruj lighttpd do obsługi CGI.

  1. Z powrotem w programie konsoli, przejdź do katalogu konfiguracji lighttpd:
    cd /etc/lighttpd

  2. Aby włączyć CGI, chcesz usunąć komentarz z jednej linii w pliku <modules.conf>. (Mogłem włączyć szybki CGI, ale kroki dziecka są najlepsze!) Możesz to zrobić za pomocą edytora „ed” w następujący sposób:
    ed modules.conf
    /include "conf.d\/cgi.conf"/
    s/#//
    w
    q

  3. Utwórz katalog, w którym będą żyć programy CGI. (Plik /etc/lighttpd/lighttpd.conf określa, gdzie to będzie.) Stworzymy nasz katalog w domyślnej lokalizacji, więc nie będziemy musieli edytować plików konfiguracyjnych:
    cd /var/www/lighttpd
    mkdir cgi-bin
    chmod 755 cgi-bin

  4. Prawie na miejscu! Oczywiście musisz umieścić testowy program CGI w katalogu cgi-bin. Tutaj jest jeden:
    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. Uruchom ponownie serwer lighttpd:
    /etc/init.d/lighttpd restart

  6. Przetestuj swój program CGI. W przeglądarce pulpitu naciśnij ten adres URL, zastępując publiczny adres DNS instancji EC2:
    http://<<Public DNS>>/cgi-bin/hellopyworld.py

    Dla mnie było to:
    http://ec2-174-129-110-23.compute-1.amazonaws.com/cgi-bin/hellopyworld.py

Krok 5: To wszystko! Posprzątaj i podziękuj!

  • Aby wyjść z podanego wcześniej polecenia „sudo / bin / bash”, wpisz:
    exit

  • Podziękowania: Mnóstwo podziękowań dla:

    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-w--security-groups.html

  • Powodzenia, amigos! Przepraszam za nietradycyjny charakter tego „pytania”, ale otrzymałem tak wiele pomocy od Stackoverflow, że chętnie coś oddałem.

595585
źródło
4
Pochwalam cię za opublikowanie przewodnika, ale SO służy do zadawania pytań. Polecam do tego blogspot lub coś podobnego. Jeśli chcesz oddać, powinieneś odpowiedzieć na pytania :)
Zgłaszam, że każde „jak” zawiera ukryte pytanie, tj. „Jak zrobić X?” W przyszłości sformułuję to pytanie wprost, chociaż początkowo wydawało się, że to pedanteria. Ponieważ jednak może to pomóc wyszukiwarkom i uniknąć nieporozumień w zakresie czytelnictwa, teraz uważam, że warto. Dzięki.
To bardzo miłe, że nowy członek opublikował takie instrukcje. W każdym razie odpowiada na pytania, które nie zostały jeszcze zadane. Nawiasem mówiąc, daje mi informacje, których potrzebowałem kilka dni temu, teraz wiem o istnieniu tego rodzaju usług. Nawiasem mówiąc, w czasach, gdy mówi się dużo o chmurze, ten post może być bardzo przydatny dla wielu ludzi. Więc nie zasługuje na zniechęcenie, a ja głosuję za.
@ user595585 Zatwierdzoną praktyką jest zadanie pytania „Jak to zrobić” i samodzielne udzielenie odpowiedzi. W ten sposób zyskujesz nawet więcej przedstawicieli za swoje problemy. Zobacz FAQ . „Zadawanie pytań i udzielanie odpowiedzi na własne pytanie jest również w porządku, pod warunkiem, że udajesz, że jesteś na granicy z Jeopardy: sformułuj je w formie pytania”.
C. Ross
3
@ użytkownik Edytuj swoje pytanie, aby było to pytanie, a następnie odpowiedz na nie ze wszystkimi podanymi szczegółami. Poza tym upuść niektóre z tych parenów, mówisz o hostowaniu Pythona na EC2, a nie lisp.
Zgrane

Odpowiedzi:

3

(Dziwny post, więc mam nadzieję, że nie będzie to tak dziwna odpowiedź).

Jeśli chodzi o wady bezpieczeństwa: za ogólną złą praktykę uważa się przechowywanie skryptów cgi-bin w katalogu głównym serwera WWW. Nawet W3C wymyka się temu pod hasłem „Czy języki kompilowane, takie jak C, są bezpieczniejsze ...” w często zadawanych pytaniach dotyczących bezpieczeństwa w sieci WWW :

Rozważ następujący scenariusz. Dla wygody postanowiłeś zidentyfikować skrypty CGI na serwerze za pomocą rozszerzenia .cgi. Później musisz wprowadzić niewielką zmianę w interpretowanym skrypcie CGI. Otwierasz go za pomocą edytora tekstu Emacsa i modyfikujesz skrypt. Niestety edycja pozostawia kopię zapasową kodu źródłowego skryptu leżącą w drzewie dokumentu. Chociaż zdalny użytkownik nie może uzyskać kodu źródłowego, pobierając sam skrypt, może teraz uzyskać kopię zapasową, ślepo żądając adresu URL:

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

(Jest to kolejny dobry powód, aby ograniczyć skrypty CGI do cgi-bin i upewnić się, że cgi-bin jest oddzielony od katalogu głównego dokumentu.)

Nie jest to tak duże zagrożenie, jak możliwość zapisu pliku w katalogu głównym dokumentu. Jednak osoba atakująca może uzyskać kod źródłowy cgi, wymyślić ukierunkowany atak przeciwko niemu i wykorzystać go jako odskocznię do serwera.

Aby temu zaradzić, możesz dodać następujące wiersze do pliku lighttpd.conf (lub jego odmian), aby skierować cgi-bin do katalogu innego niż katalog główny katalogu / var / www / lighttpd.

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

Wymaga to zarówno modułów cgi, jak i modułów aliasów dla lighttpd.

Jeff Stice-Hall
źródło