Frage Python CGI auf Amazon AWS EC2-Mikroinstanz - eine Anleitung!


Wie können Sie eine EC2-Mikroinstanz dazu bringen, CGI-Skripte von lighthttpd zu bedienen? Zum Beispiel Python CGI?

Nun, es hat einen halben Tag gedauert, aber ich habe Python cgi auf einer kostenlosen Amazon AWS EC2-Mikroinstanz mit dem lighttpd-Server laufen lassen. Ich denke, es wird meinen Kolleginnen und Kollegen helfen, alle Schritte an einen Ort zu bringen. Mit den folgenden einfachen Schritten dauert es nur 15 Minuten, um alles einzurichten!

Meine Frage für die erfahreneren Benutzer, die das lesen, lautet: Gibt es irgendwelche Sicherheitslücken in dem, was ich getan habe? (Siehe Datei- und Verzeichnisberechtigungen.)

Schritt 1: Starten Sie Ihre EC2-Instanz und ssh hinein.

[Natürlich müssen Sie sich für Amazon EC2 anmelden und Ihre Schlüsselpaare in einer * .pem-Datei speichern. Ich werde nicht darüber reden, da Amazon dir sagt, wie es geht.]

  1. Melden Sie sich in Ihrem AWS-Konto an und starten Sie Ihre EC2-Instanz. Das Web hat Tutorials dazu. Beachten Sie, dass die Standardinstanzgröße, die Amazon für Sie darstellt, "klein" ist. Dies ist nicht "Mikro" und so wird es Geld kosten. Achten Sie darauf, manuell "Mikro" zu wählen. (Micro Instances sind nur für das erste Jahr frei ...)

  2. Suchen Sie den öffentlichen DNS-Code für Ihre laufende Instanz. Klicken Sie dazu im oberen Bereich des Dashboards auf die Instanz und das Feld "Öffentliches DNS" wird schließlich im unteren Bereich angezeigt. (Sie müssen möglicherweise ein bisschen herumspielen.) Das öffentliche DNS sieht ungefähr so ​​aus:
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. Starten Sie Ihr Unix-Konsolenprogramm. (Unter Max OS X heißt es Terminal und befindet sich im Ordner Programme -> Dienstprogramme.)

  4. Wechseln Sie in das Verzeichnis auf Ihrem Desktop-System, das Ihre * .pem-Datei mit Ihren AWS-Schlüsselpaaren enthält.

  5. ssh an Ihre EC2-Instanz mit einem Befehl wie:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >> 

    Also für mich war das:
    ssh -i amzn_ec2_keypair.pem ec2-user@ec2-174-129-110-23.compute-1.amazonaws.com 

  6. Ihre EC2-Instanz sollte Sie hereinlassen.

Schritt 2: Laden Sie lighttpd auf Ihre EC2-Instanz herunter.

  1. Um lighttpd zu installieren, benötigen Sie Root-Zugriff auf Ihre EC2-Instanz. Das Problem ist: Amazon lässt dich nicht als root anmelden. (Nicht gerade, zumindest.) Aber es gibt einen Workaround. Gib diesen Befehl ein:
    sudo /bin/bash 

  2. Das System-Eingabeaufforderungszeichen wechselt von $ zu #. Wir werden nicht bis zum allerletzten Schritt in diesem ganzen Prozess von "Sudo" abweichen.

  3. Installieren Sie die Lighttpd-Anwendung (Version 1.4.28-1.3.amzn1 für mich):
    yum install lighttpd 

  4. Installieren Sie die FastCGI-Bibliotheken für Lighttpd (nicht erforderlich, aber warum nicht?):
    yum install lighttpd-fastcgi 

  5. Testen Sie, dass Ihr Server funktioniert:
    /etc/init.d/lighttpd start 

Schritt 3: Lassen Sie die Außenwelt Ihren Server sehen.

  1. Wenn Sie nun versuchen, Ihren Server über den Browser Ihres Desktops zu erreichen, würde dies fehlschlagen. Der Grund: Amazon AWS öffnet standardmäßig keine Ports für Ihre EC2-Instanz. Also müssen Sie die Ports manuell öffnen.

  2. Gehen Sie in Ihrem Desktop-Browser zu Ihrem EC2-Dashboard. Klicken Sie im linken Bereich auf "Sicherheitsgruppen". Eine oder mehrere Sicherheitsgruppen werden im oberen rechten Bereich angezeigt. Wählen Sie diejenige aus, die Ihrer Instanz beim Start Ihrer Instanz zugewiesen wurde.

  3. Eine Tabelle namens "Erlaubte Verbindungen" wird im unteren rechten Fensterbereich angezeigt. In einem Popup-Menü können Sie "HTTP" als Verbindungsmethode auswählen.

  4. Die anderen Werte in dieser Zeile der Tabelle sollten lauten: tcp, 80, 80, 0.0.0.0/0

  5. Drücken Sie nun den Server Ihrer EC2-Instanz vom Desktop Ihres Browsers aus. Verwenden Sie die öffentliche DNS-Adresse, die Sie zuvor für SSH verwendet haben. Sie sollten die generische lighttp-Webseite sehen. Wenn du es nicht tust, kann ich dir nicht helfen, weil ich so ein Noob bin. :-(

Schritt 4: Konfigurieren Sie Lighttpd, um CGI zu bedienen.

  1. Zurück im Konsolenprogramm, wechseln Sie in das Konfigurationsverzeichnis für lighttpd:
    cd /etc/lighttpd 

  2. Um CGI zu aktivieren, müssen Sie eine Zeile in der Datei <modules.conf> auskommentieren. (Ich hätte Fast CGI aktivieren können, aber Baby Steps sind am besten!) Sie können dies mit dem Editor "ed" wie folgt tun:
    ed modules.conf
    /include "conf.d\/cgi.conf"/
    s/#//
    w
    q 

  3. Erstellen Sie das Verzeichnis, in dem CGI-Programme gespeichert werden. (Die Datei /etc/lighttpd/lighttpd.conf bestimmt, wo dies sein wird.) Wir erstellen unser Verzeichnis am Standardspeicherort, sodass wir keine Konfigurationsdateien bearbeiten müssen:
    cd /var/www/lighttpd
    mkdir cgi-bin
    chmod 755 cgi-bin 

  4. Fast dort! Natürlich müssen Sie ein Test-CGI-Programm in das cgi-bin-Verzeichnis einfügen. Hier ist eine:
    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. Starten Sie Ihren Lighttpd Server neu:
    /etc/init.d/lighttpd restart 

  6. Testen Sie Ihr CGI-Programm. Klicken Sie im Browser Ihres Desktops auf diese URL, und ersetzen Sie dabei die öffentliche DNS-Adresse der EC2-Instanz:
    http://<<Public DNS>>/cgi-bin/hellopyworld.py 

    Für mich war das:
    http://ec2-174-129-110-23.compute-1.amazonaws.com/cgi-bin/hellopyworld.py 

Schritt 5: Das ist es! Aufräumen und Danke sagen!

  • Geben Sie Folgendes ein, um den zuvor angegebenen Befehl "sudo / bin / bash" zu beenden:
    exit 

  • Danksagung: Vielen Dank an:

    wiki.vpslink.com/Install_und_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

  • Viel Glück, Freunde! Ich entschuldige mich für die nicht-traditionelle Art dieser "Frage", aber ich habe so viel Hilfe von Stackoverflow bekommen, dass ich unbedingt etwas zurückgeben wollte.


22


Ursprung


Ich applaudiere Ihnen für die Veröffentlichung eines Leitfadens, aber SO ist für Fragen zu stellen. Ich würde blogspot oder etwas ähnliches dafür empfehlen. Wenn Sie gerne etwas zurückgeben möchten, sollten Sie Fragen beantworten :)
Ich behaupte, dass jedes "wie" eine implizite Frage enthält, d. H. "Wie mache ich X?" In Zukunft werde ich die Frage explizit formulieren, obwohl es zunächst wie Pedanterie aussah. Aber weil es Suchmaschinen helfen und Verwirrung in der Leserschaft vermeiden könnte, denke ich jetzt, dass es sich lohnt. Vielen Dank.
Es ist sehr nett von einem neuen Mitglied, ein solches How-To zu posten. Wie auch immer, es beantwortet Fragen, die noch nicht gestellt wurden. Übrigens gibt es mir Informationen, die ich vor einigen Tagen brauchte, jetzt weiß ich die Existenz dieser Art von Service. Übrigens, zu einer Zeit, wo man viel von der Cloud spricht, wird dieser Beitrag wahrscheinlich für viele Leute sehr nützlich sein. Also verdient er es nicht, entmutigt zu sein, und ich stimme auf.
@ user595585 Die bewährte Praxis besteht darin, die Frage "Wie mache ich" zu stellen und selbst zu beantworten. Sie bekommen sogar mehr Rep für Ihre Probleme auf diese Weise. Bitte sehen Sie sich ... an FAQ. "Es ist auch vollkommen in Ordnung, deine eigene Frage zu stellen und zu beantworten, solange du vorgibst, dass du auf Jeopardy stehst: formuliere es in Form einer Frage." - C. Ross
@user Editiere deine Frage damit ist eine Frage, dann beantworte sie mit allen Details, die du angegeben hast. Lassen Sie auch einige dieser Parens fallen, Sie sprechen davon, Python auf EC2 zu hosten, nicht zu lispeln. - Will


Antworten:


(Seltsamer Beitrag, also hoffentlich wird das nicht so eine komische Antwort sein).

Zum Thema Sicherheitsmängel: Es gilt als allgemein schlechte Praxis, cgi-bin-Skripte im Dokumentenstamm des Webservers zu speichern. Auch das W3C entzieht sich unter "Sind kompilierte Sprachen wie C sicherer ..." in ihrem World Wide Web-Sicherheits-FAQ:

Betrachten Sie das folgende Szenario. Aus Gründen der Bequemlichkeit haben Sie sich entschieden   um CGI-Skripte zum Server zu identifizieren   Verwenden der Erweiterung .cgi. Später,   Sie müssen eine kleine Änderung an einem vornehmen   CGI-Skript interpretiert. Du öffnest es   mit dem Emacs-Texteditor und modifizieren   das Skript. Leider die Bearbeitung   hinterlässt eine Sicherungskopie des Skripts   Quelltext herumliegen in der   Dokumentbaum. Obwohl die Fernbedienung   Benutzer kann den Quellcode nicht erhalten   das Skript selbst holen, kann er jetzt   erhalte die Sicherungskopie blind   Anfordern der URL:

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

(Dies ist ein weiterer guter Grund zu begrenzen   CGI-Skripte zu cgi-bin und zu machen   sicher, dass cgi-bin ist getrennt von der   Dokument Root.)

Dies ist keine so große Bedrohung wie die Fähigkeit, eine Datei in den Dokumentenstamm zu schreiben. Ein Angreifer könnte jedoch den Quellcode des CGI erhalten, einen gezielten Angriff gegen ihn entwickeln und ihn als Sprungbrett in den Server verwenden.

Um dies zu verringern, können Sie der Datei lighttpd.conf (oder einer darin enthaltenen Variante) folgende Zeilen hinzufügen, um cgi-bin in ein Verzeichnis zu verweisen, das vom Stammverzeichnis / var / www / lighttpd getrennt ist.

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

Dies erfordert sowohl die CGI- als auch die Alias-Module für Lighttpd.


2