Python CGI en la microinstancia Amazon AWS EC2: ¡cómo hacerlo!

23

¿Cómo puede hacer que una micro instancia EC2 sirva scripts CGI desde lighthttpd? Por ejemplo Python CGI?

Bueno, me llevó medio día, pero pude ejecutar Python cgi en una microinstancia gratuita Amazon AWS EC2, utilizando el servidor lighttpd. Creo que ayudará a mis compañeros novatos a poner todos los pasos en un solo lugar. ¡Armado con los simples pasos a continuación, le tomará solo 15 minutos configurar las cosas!

Mi pregunta para los usuarios más experimentados que leen esto es: ¿Hay alguna falla de seguridad en lo que he hecho? (Consulte los permisos de archivo y directorio).

Paso 1: Inicie su instancia EC2 y ssh en ella.

[Obviamente, deberá registrarse en Amazon EC2 y guardar sus pares de claves en un archivo * .pem. No voy a repasar esto, ya que Amazon te dice cómo hacerlo.]

  1. Inicie sesión en su cuenta de AWS e inicie su instancia EC2. La web tiene tutoriales para hacerlo. Observe que el tamaño de instancia predeterminado que Amazon le presenta es "pequeño". Esto no es "micro" y, por lo tanto, le costará dinero. Asegúrese de elegir manualmente "micro". (Las micro instancias son gratuitas solo durante el primer año ...)

  2. Encuentre el código DNS público para su instancia en ejecución. Para hacer esto, haga clic en la instancia en el panel superior del tablero y eventualmente verá el campo "DNS público" en el panel inferior. (Es posible que deba tocar un poco). El DNS público se parece a:
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. Inicie su programa de consola Unix. (En Max OS X, se llama Terminal y vive en la carpeta Aplicaciones -> Utilidades).

  4. cd al directorio en su sistema de escritorio que tiene su archivo * .pem que contiene sus pares de claves AWS.

  5. ssh a su instancia EC2 usando un comando como:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    Entonces, para mí, esto fue:
    ssh -i amzn_ec2_keypair.pem [email protected]

  6. Su instancia EC2 debería permitirle entrar.

Paso 2: descargue lighttpd a su instancia EC2.

  1. Para instalar lighttpd, necesitará acceso root en su instancia EC2. El problema es: Amazon no le permitirá iniciar sesión como root. (No directamente, al menos). Pero hay una solución alternativa. Escriba este comando:
    sudo /bin/bash

  2. El símbolo del sistema cambiará de $ a #. No saldremos de "sudo" hasta el último paso de todo este proceso.

  3. Instale la aplicación lighttpd (versión 1.4.28-1.3.amzn1 para mí):
    yum install lighttpd

  4. Instale las bibliotecas FastCGI para lighttpd (no es necesario, pero ¿por qué no?):
    yum install lighttpd-fastcgi

  5. Comprueba que tu servidor funciona:
    /etc/init.d/lighttpd start

Paso 3: deja que el mundo exterior vea tu servidor.

  1. Si ahora trataras de acceder a tu servidor desde el navegador en tu escritorio, fallaría. El motivo: de manera predeterminada, Amazon AWS no abre ningún puerto a su instancia EC2. Por lo tanto, debe abrir los puertos manualmente.

  2. Vaya a su tablero EC2 en el navegador de su escritorio. Haga clic en "Grupos de seguridad" en el panel izquierdo. Aparecerán uno o más grupos de seguridad en el panel superior derecho. Elija el que se asignó a su instancia EC2 cuando inició su instancia.

  3. Aparecerá una tabla llamada "Conexiones permitidas" en el panel inferior derecho. Un menú emergente le permitirá elegir "HTTP" como método de conexión.

  4. Los otros valores en esa línea de la tabla deben ser: tcp, 80, 80, 0.0.0.0/0

  5. Ahora presione el servidor de su instancia EC2 desde el escritorio en su navegador. Use la dirección DNS pública que utilizó anteriormente para SSH. Debería ver la página web genérica lighttpd. Si no lo haces, no puedo ayudarte porque soy un novato. :-(

Paso 4: Configurar lighttpd para servir CGI.

  1. De vuelta en el programa de consola, cd al directorio de configuración para lighttpd:
    cd /etc/lighttpd

  2. Para habilitar CGI, desea descomentar una línea en el archivo <modules.conf>. (¡Podría haber habilitado Fast CGI, pero los mejores pasos son los mejores!) Puede hacer esto con el editor "ed" de la siguiente manera:
    ed modules.conf
    /include "conf.d\/cgi.conf"/
    s/#//
    w
    q

  3. Cree el directorio donde vivirán los programas CGI. (El archivo /etc/lighttpd/lighttpd.conf determina dónde estará). Crearemos nuestro directorio en la ubicación predeterminada, por lo que no tenemos que editar los archivos de configuración:
    cd /var/www/lighttpd
    mkdir cgi-bin
    chmod 755 cgi-bin

  4. ¡Casi allí! Por supuesto, debe poner un programa CGI de prueba en el directorio cgi-bin. Aqui hay uno:
    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. Reinicie su servidor lighttpd:
    /etc/init.d/lighttpd restart

  6. Pon a prueba tu programa CGI. En el navegador de su escritorio, presione esta URL, sustituyendo la dirección DNS pública de su instancia EC2:
    http://<<Public DNS>>/cgi-bin/hellopyworld.py

    Para mí, esto fue:
    http://ec2-174-129-110-23.compute-1.amazonaws.com/cgi-bin/hellopyworld.py

Paso 5: ¡Eso es! ¡Limpia y da gracias!

  • Para salir del comando "sudo / bin / bash" dado anteriormente, escriba:
    exit

  • Agradecimientos: Un montón de gracias a:

    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

  • ¡Buena suerte amigos! Me disculpo por la naturaleza no tradicional de esta "pregunta", pero he recibido tanta ayuda de Stackoverflow que estaba ansioso por devolver algo.

usuario595585
fuente
44
Te aplaudo por publicar una guía, pero SO es por hacer preguntas. Recomiendo blogspot o algo similar para esto. Si está ansioso por devolver, debe responder preguntas :)
Declaro que cualquier "cómo" contiene una pregunta implícita, es decir, "¿Cómo hago X?" En el futuro plantearé la pregunta explícitamente, aunque inicialmente parecía una pedantería. Pero, debido a que podría ayudar a los motores de búsqueda y evitar la confusión en los lectores, ahora creo que vale la pena. Gracias.
Es muy amable de parte de un nuevo miembro publicar tal instructivo. De todos modos, responde preguntas que aún no se han hecho. Por cierto, me da la información que necesitaba hace unos días, ahora sé la existencia de este tipo de servicio. Por cierto, en un momento en el que se habla mucho de la nube, es probable que esta publicación sea muy útil para muchas personas. Entonces él no merece ser desanimado, y yo lo voté.
@ user595585 La práctica aprobada es hacer una pregunta "Cómo lo hago" y responderla usted mismo. Incluso obtienes más reputación por tus problemas de esa manera. Por favor, consulte las preguntas frecuentes . "También está perfectamente bien hacer y responder su propia pregunta, siempre y cuando finja estar en peligro: formúlela en forma de pregunta".
C. Ross
3
@usuario Edite su pregunta para que sea una pregunta, luego responda con todos los detalles que proporcionó. Además, deje caer algunos de esos parens, está hablando de alojar python en EC2, no lisp.
Estafado

Respuestas:

3

(Publicación extraña, así que espero que esta no sea una respuesta tan extraña).

Sobre el tema de fallas de seguridad: se considera una mala práctica general almacenar scripts cgi-bin dentro de la raíz del documento del servidor web. Incluso el W3C lo elude en "Son lenguajes compilados como C más seguro ..." en sus Preguntas frecuentes sobre seguridad en la World Wide Web :

Considere el siguiente escenario. Por conveniencia, ha decidido identificar los scripts CGI para el servidor utilizando la extensión .cgi. Más adelante, debe realizar un pequeño cambio en un script CGI interpretado. Lo abre con el editor de texto de Emacs y modifica el script. Lamentablemente, la edición deja una copia de seguridad del código fuente del script en el árbol de documentos. Aunque el usuario remoto no puede obtener el código fuente recuperando el script en sí, ahora puede obtener la copia de respaldo solicitando ciegamente la URL:

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

(Esta es otra buena razón para limitar los scripts CGI a cgi-bin y para asegurarse de que cgi-bin esté separado de la raíz del documento).

Esto no es una amenaza tan importante como la capacidad de escribir un archivo dentro de la raíz del documento. Sin embargo, un atacante podría obtener el código fuente del cgi, idear un ataque dirigido contra él y usarlo como un trampolín en el servidor.

Para mitigar esto, puede agregar las siguientes líneas a lighttpd.conf (o alguna variación en ellas) para dirigir cgi-bin a un directorio separado de la raíz del documento / var / www / lighttpd.

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

Esto requiere los módulos cgi y alias para lighttpd.

Jeff Stice-Hall
fuente