CGI Python na micro-instância do Amazon AWS EC2 - um tutorial!

23

Como você pode fazer uma micro instância EC2 servir scripts CGI do lighthttpd? Por exemplo, Python CGI?

Bem, demorou meio dia, mas consegui o Python cgi rodando em uma micro-instância gratuita do Amazon AWS EC2, usando o servidor lighttpd. Acho que vai ajudar meus colegas noobs a colocar todos os passos em um só lugar. Armado com as etapas simples abaixo, você levará apenas 15 minutos para configurar as coisas!

Minha pergunta para os usuários mais experientes que estão lendo isso é: Existem falhas de segurança no que eu fiz? (Veja permissões de arquivo e diretório.)

Etapa 1: Inicie sua instância do EC2 e faça o ssh nela.

[Obviamente, você precisará se inscrever no Amazon EC2 e salvar seus pares de chaves em um arquivo * .pem. Não vou discutir isso, pois a Amazon diz como fazê-lo.]

  1. Entre na sua conta da AWS e inicie sua instância do EC2. A web tem tutoriais sobre como fazer isso. Observe que o tamanho da instância padrão que a Amazon apresenta para você é "pequeno". Isso não é "micro" e, portanto, custará dinheiro. Certifique-se de escolher manualmente "micro". (As micro instâncias são gratuitas apenas no primeiro ano ...)

  2. Encontre o código DNS público para sua instância em execução. Para fazer isso, clique na instância no painel superior do painel e, eventualmente, você verá o campo "DNS público" preenchido no painel inferior. (Talvez você precise se preocupar um pouco.) O DNS público se parece com:
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. Inicie seu programa de console Unix. (No Max OS X, ele se chama Terminal, fica na pasta Aplicativos -> Utilitários.)

  4. cd para o diretório do sistema da área de trabalho que possui o arquivo * .pem contendo os pares de chaves da AWS.

  5. ssh para sua instância do EC2 usando um comando como:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    Então, para mim, isso foi:
    ssh -i amzn_ec2_keypair.pem [email protected]

  6. Sua instância do EC2 deve permitir que você entre.

Etapa 2: faça o download do lighttpd na sua instância do EC2.

  1. Para instalar o lighttpd, você precisará de acesso root na sua instância do EC2. O problema é: a Amazon não permitirá que você entre como root. (Não diretamente, pelo menos.) Mas há uma solução alternativa. Digite este comando:
    sudo /bin/bash

  2. O caractere de prompt do sistema mudará de $ para #. Não sairemos do "sudo" até a última etapa de todo esse processo.

  3. Instale o aplicativo lighttpd (versão 1.4.28-1.3.amzn1 para mim):
    yum install lighttpd

  4. Instale as bibliotecas FastCGI para lighttpd (não necessário, mas por que não?):
    yum install lighttpd-fastcgi

  5. Teste se seu servidor está funcionando:
    /etc/init.d/lighttpd start

Etapa 3: Deixe o mundo externo ver seu servidor.

  1. Se você agora tentasse acessar seu servidor a partir do navegador da área de trabalho, ele falharia. O motivo: por padrão, o Amazon AWS não abre nenhuma porta para sua instância do EC2. Então, você precisa abrir as portas manualmente.

  2. Vá para o painel do EC2 no navegador da área de trabalho. Clique em "Grupos de segurança" no painel esquerdo. Um ou mais grupos de segurança aparecerão no painel superior direito. Escolha o que foi atribuído à sua instância do EC2 quando você a iniciou.

  3. Uma tabela chamada "Conexões permitidas" será exibida no painel inferior direito. Um menu pop-up permitirá que você escolha "HTTP" como método de conexão.

  4. Os outros valores nessa linha da tabela devem ser: tcp, 80, 80, 0.0.0.0/0

  5. Agora acerte o servidor da instância do EC2 na área de trabalho do seu navegador. Use o endereço DNS público usado anteriormente para fazer o SSH. Você deverá ver a página da web genérica lighttpd. Se não, não posso ajudá-lo, porque sou um noob. :-(

Etapa 4: configure o lighttpd para servir CGI.

  1. De volta ao programa do console, cd para o diretório de configuração do lighttpd:
    cd /etc/lighttpd

  2. Para habilitar o CGI, você deseja descomentar uma linha no arquivo <modules.conf>. (Eu poderia ter ativado o Fast CGI, mas os passos do bebê são os melhores!) Você pode fazer isso com o editor "ed" da seguinte maneira:
    ed modules.conf
    /include "conf.d\/cgi.conf"/
    s/#//
    w
    q

  3. Crie o diretório em que os programas CGI residirão. (O arquivo /etc/lighttpd/lighttpd.conf determina onde isso será.) Criaremos nosso diretório no local padrão, para que não seja necessário editar os arquivos de configuração:
    cd /var/www/lighttpd
    mkdir cgi-bin
    chmod 755 cgi-bin

  4. Quase lá! Claro que você precisa colocar um programa CGI de teste no diretório cgi-bin. Aqui está um:
    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 seu servidor lighttpd:
    /etc/init.d/lighttpd restart

  6. Teste seu programa CGI. No navegador da área de trabalho, pressione este URL, substituindo o endereço DNS público da sua instância do EC2:
    http://<<Public DNS>>/cgi-bin/hellopyworld.py

    Para mim, isso foi:
    http://ec2-174-129-110-23.compute-1.amazonaws.com/cgi-bin/hellopyworld.py

Passo 5: É isso aí! Limpe e dê graças!

  • Para sair do comando "sudo / bin / bash" fornecido anteriormente, digite:
    exit

  • Agradecimentos: Agradecimentos 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

  • Boa sorte amigos! Peço desculpas pela natureza não tradicional dessa "pergunta", mas recebi tanta ajuda do Stackoverflow que estava ansiosa para retribuir algo.

user595585
fonte
4
Aplaudo por postar um guia, mas SO é para fazer perguntas. Eu recomendo o blogspot ou algo semelhante para isso. Se você está ansioso para dar a volta, você deve responder a perguntas :)
Eu afirmo que qualquer "como" contém uma pergunta implícita, ou seja, "Como eu faço o X?" No futuro, explicarei a questão explicitamente, embora inicialmente parecesse pedantismo. Mas, como isso pode ajudar os mecanismos de pesquisa e evitar confusão nos leitores, agora acho que vale a pena. Obrigado.
É muito gentil de um novo membro postar esse tutorial. Enfim, ele responde a perguntas que ainda não foram feitas. A propósito, ele me fornece as informações de que precisava alguns dias atrás, agora eu sei a existência desse tipo de serviço. A propósito, em um momento em que se fala muito da nuvem, é provável que este post seja muito útil para muitas pessoas. Então ele não merece desanimar, e eu voto.
@ user595585 A prática aprovada é fazer uma pergunta "Como faço" e responder você mesmo. Você ainda recebe mais rep pelo seu problema dessa maneira. Por favor, consulte o FAQ . "Também é perfeitamente bom fazer e responder sua própria pergunta, desde que você finja estar no Jeopardy: expresse-a na forma de uma pergunta."
C. Ross
3
@user Edite sua pergunta para que seja uma pergunta e responda com todos os detalhes que você forneceu. Além disso, abandone algumas dessas parênteses, você está falando sobre hospedar python no EC2, não o lisp.
Arrancado

Respostas:

3

(Mensagem estranha, espero que não seja uma resposta tão estranha).

Sobre o assunto de falhas de segurança: é considerado uma prática ruim geral armazenar scripts cgi-bin na raiz do documento do servidor web. Até o W3C o escapa em "São linguagens compiladas como C mais seguras ..." nas Perguntas frequentes sobre segurança na World Wide Web :

Considere o seguinte cenário. Por conveniência, você decidiu identificar scripts CGI no servidor usando a extensão .cgi. Posteriormente, você precisará fazer uma pequena alteração em um script CGI interpretado. Você o abre com o editor de texto Emacs e modifica o script. Infelizmente, a edição deixa uma cópia de backup do código-fonte do script na árvore de documentos. Embora o usuário remoto não possa obter o código-fonte buscando o próprio script, agora ele pode obter a cópia de backup solicitando cegamente a URL:

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

(Esse é outro bom motivo para limitar os scripts CGI ao cgi-bin e garantir que o cgi-bin esteja separado da raiz do documento.)

Essa não é uma ameaça tão significativa quanto a capacidade de gravar um arquivo na raiz do documento. No entanto, um invasor pode obter o código-fonte do cgi, planejar um ataque direcionado contra ele e usá-lo como um trampolim para o servidor.

Para atenuar isso, você pode adicionar as seguintes linhas ao lighttpd.conf (ou alguma variação nele) para direcionar o cgi-bin para um diretório separado da raiz do documento / var / www / lighttpd.

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

Isso requer os módulos cgi e alias para o lighttpd.

Jeff Stice-Hall
fonte