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


23

Wie kann man eine EC2-Mikroinstanz dazu bringen, CGI-Skripte von lighthttpd aus 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 zum Laufen gebracht. Ich denke, es wird meinen Noobs helfen, alle Schritte an einem Ort zu platzieren. Mit den folgenden einfachen Schritten können Sie die Dinge in nur 15 Minuten einrichten!

Meine Frage an die erfahreneren Benutzer, die dies lesen, lautet: Gibt es 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 bei Amazon EC2 anmelden und Ihre Schlüsselpaare in einer * .pem-Datei speichern. Ich werde nicht darauf eingehen, da Amazon Ihnen sagt, wie es geht.]

  1. Melden Sie sich in Ihrem AWS-Konto an und starten Sie Ihre EC2-Instanz. Das Web bietet dazu Tutorials. Beachten Sie, dass die Standardinstanzgröße, die Amazon für Sie bereitstellt, "klein" ist. Dies ist kein "Mikro" und kostet Sie Geld. Stellen Sie sicher, dass Sie "micro" manuell auswählen. (Micro-Instanzen sind nur für das erste Jahr kostenlos ...)

  2. Suchen Sie den öffentlichen DNS-Code für Ihre laufende Instanz. Klicken Sie dazu im oberen Bereich des Dashboards auf die Instanz. Schließlich wird im unteren Bereich das Feld "Öffentliches DNS" angezeigt. (Möglicherweise müssen Sie ein wenig fummeln.) 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 Applications -> Utilities.)

  4. Wechseln Sie in das Verzeichnis auf Ihrem Desktop-System, in dem sich Ihre * .pem-Datei befindet, die Ihre AWS-Schlüsselpaare enthält.

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

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

  6. Ihre EC2-Instanz sollte Sie einlassen.

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

  1. Um lighttpd zu installieren, benötigen Sie Root-Zugriff auf Ihrer EC2-Instanz. Das Problem ist: Bei Amazon können Sie sich nicht als root anmelden. (Zumindest nicht direkt.) Es gibt jedoch eine Problemumgehung. Geben Sie diesen Befehl ein:
    sudo /bin/bash

  2. Das System-Eingabeaufforderungszeichen ändert sich von $ in #. Wir werden "sudo" bis zum allerletzten Schritt in diesem gesamten Prozess nicht verlassen.

  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, ob Ihr Server funktioniert:
    /etc/init.d/lighttpd start

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

  1. Wenn Sie jetzt versuchen, Ihren Server über den Browser auf Ihrem Desktop zu erreichen, schlägt dies fehl. Der Grund: Standardmäßig öffnet Amazon AWS keine Ports für Ihre EC2-Instanz. Sie müssen die Ports also manuell öffnen.

  2. Rufen Sie im Browser Ihres Desktops Ihr EC2-Dashboard auf. Klicken Sie im linken Bereich auf "Sicherheitsgruppen". Eine oder mehrere Sicherheitsgruppen werden im oberen rechten Bereich angezeigt. Wählen Sie die aus, die Ihrer EC2-Instanz beim Starten Ihrer Instanz zugewiesen wurde.

  3. Eine Tabelle mit dem Namen "Zugelassene Verbindungen" wird im unteren rechten Bereich angezeigt. In einem Popup-Menü können Sie "HTTP" als Verbindungsmethode auswählen.

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

  5. Schlagen Sie jetzt den Server Ihrer EC2-Instanz vom Desktop in Ihrem Browser aus an. Verwenden Sie die öffentliche DNS-Adresse, die Sie zuvor für SSH verwendet haben. Die allgemeine Webseite lighttpd sollte angezeigt werden. Wenn Sie nicht, kann ich Ihnen nicht helfen, weil ich so ein Noob bin. :-(

Schritt 4: Konfigurieren Sie lighttpd für CGI.

  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 Babyschritte 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 legt fest, wo sich diese befindet.) 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 stellen. 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 die öffentliche DNS-Adresse Ihrer 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 war's! Räumen Sie auf und danken Sie!

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

  • Danksagung: Vielen Dank an:

    wiki.vpslink.com/Install_and_Configure_lighttpd

    www.cyberciti.biz/tips/lighttpd-how-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 unkonventionelle Natur dieser "Frage", aber ich habe so viel Hilfe von Stackoverflow bekommen, dass ich unbedingt etwas zurückgeben wollte.


4
Ich begrüße Sie, dass Sie einen Leitfaden veröffentlicht haben, aber SO, dass Sie Fragen gestellt haben. Ich würde dazu Blogspot oder ähnliches empfehlen. Wenn Sie zurückgeben möchten, sollten Sie Fragen beantworten :)

Ich gebe an, dass ein "How to" eine implizite Frage enthält, dh "How do I do X?" Zukünftig werde ich die Frage explizit stellen, obwohl es anfangs wie Pedanterie schien. 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, eine solche Anleitung zu veröffentlichen. Wie auch immer, es beantwortet Fragen, die noch nicht gestellt wurden. Übrigens gibt es mir Informationen, die ich vor ein paar Tagen gebraucht habe, jetzt weiß ich, dass es diese Art von Service gibt. Übrigens, zu einer Zeit, in der man viel über die Cloud spricht, dürfte dieser Beitrag für viele Menschen sehr nützlich sein. Er hat es nicht verdient, entmutigt zu werden, und ich stimme zu.

@ user595585 Die bewährte Methode besteht darin, eine Frage "Wie kann ich" zu stellen und sie selbst zu beantworten. Auf diese Weise erhalten Sie sogar mehr Wiederholung für Ihre Probleme. Bitte lesen Sie die FAQ . "Es ist auch vollkommen in Ordnung, Ihre eigene Frage zu stellen und zu beantworten, solange Sie so tun, als wären Sie in Gefahr: Formulieren Sie sie in Form einer Frage."
C. Ross

3
@user Bearbeiten Sie Ihre Frage so es ist eine Frage, dann antworten sie mit allen Details , die Sie zur Verfügung gestellt. Lassen Sie auch einige dieser Parens fallen, Sie sprechen über das Hosten von Python auf EC2, nicht von Lisp.
abgezockt

Antworten:


3

(Seltsamer Beitrag, hoffentlich ist dies keine so seltsame Antwort).

Zum Thema Sicherheitslücken: Das Speichern von CGI-BIN-Skripten im Dokumentstamm des Webservers wird als allgemeine schlechte Praxis angesehen. Sogar das W3C geht in den FAQ zu World Wide Web Security unter "Sind kompilierte Sprachen wie C sicherer ..." darauf ein :

Stellen Sie sich das folgende Szenario vor. Der Einfachheit halber haben Sie sich entschlossen, CGI-Skripte mit der Erweiterung .cgi für den Server zu identifizieren. Später müssen Sie eine kleine Änderung an einem interpretierten CGI-Skript vornehmen. Sie öffnen es mit dem Emacs-Texteditor und ändern das Skript. Leider hinterlässt die Bearbeitung eine Sicherungskopie des Skript-Quellcodes im Dokumentenbaum. Obwohl der Remotebenutzer den Quellcode nicht durch Abrufen des Skripts selbst erhalten kann, kann er die Sicherungskopie jetzt durch blindes Anfordern der URL erhalten:

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

(Dies ist ein weiterer guter Grund, CGI-Skripte auf cgi-bin zu beschränken und sicherzustellen, dass cgi-bin vom Dokumentstamm getrennt ist.)

Dies ist keine so große Bedrohung wie das Schreiben einer Datei im Dokumentstamm. Ein Angreifer könnte jedoch den Quellcode des CGI erhalten, einen gezielten Angriff darauf planen und ihn als Sprungbrett in den Server verwenden.

Um dies zu vermeiden, können Sie der Datei lighttpd.conf (oder einer Variation davon) die folgenden Zeilen hinzufügen, um cgi-bin in ein Verzeichnis zu verschieben, 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 das cgi-Modul als auch das Alias-Modul für lighttpd.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.