Назад | Перейти на главную страницу

Python CGI на микро-экземпляре Amazon AWS EC2 - практическое руководство!

Как сделать так, чтобы микро-экземпляр EC2 обслуживал сценарии CGI из lighthttpd? Например Python CGI?

Ну, это заняло полдня, но я запустил Python cgi на бесплатном микро-экземпляре Amazon AWS EC2, используя сервер lighttpd. Думаю, моим товарищам-новичкам это поможет собрать все шаги в одном месте. Вооружившись простыми шагами, описанными ниже, вы сможете настроить все за 15 минут!

Мой вопрос для более опытных пользователей, читающих это: есть ли недостатки безопасности в том, что я сделал? (См. Разрешения для файлов и каталогов.)

Шаг 1. Запустите экземпляр EC2 и подключитесь к нему по ssh.

[Очевидно, вам необходимо зарегистрироваться в Amazon EC2 и сохранить пары ключей в файле * .pem. Я не буду вдаваться в подробности, поскольку Amazon расскажет, как это сделать.]

  1. Войдите в свою учетную запись AWS и запустите свой экземпляр EC2. В Интернете есть инструкции по этому поводу. Обратите внимание, что размер инстанса по умолчанию, который предлагает вам Amazon, «маленький». Это не «микро», и это будет стоить вам денег. Не забудьте вручную выбрать «микро». (Микроинстансы бесплатны только в течение первого года ...)

  2. Найдите общедоступный код DNS для вашего запущенного экземпляра. Для этого щелкните экземпляр в верхней панели панели инструментов, и в конечном итоге вы увидите поле «Public DNS», заполненное на нижней панели. (Возможно, вам придется немного повозиться.) Общедоступный DNS выглядит примерно так:
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. Запустите консольную программу Unix. (В Max OS X он называется Terminal и находится в папке Applications -> Utilities.)

  4. cd в каталог на настольной системе, в котором находится файл * .pem, содержащий ваши пары ключей AWS.

  5. ssh в свой экземпляр EC2 с помощью такой команды, как:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    Итак, для меня это было:
    ssh -i amzn_ec2_keypair.pem ec2-user@ec2-174-129-110-23.compute-1.amazonaws.com

  6. Ваш экземпляр EC2 должен вас впустить.

Шаг 2: Загрузите lighttpd в свой экземпляр EC2.

  1. Чтобы установить lighttpd, вам понадобится root-доступ к вашему экземпляру EC2. Проблема в том, что Amazon не позволит вам войти в систему как root. (По крайней мере, не сразу.) Но есть обходной путь. Введите эту команду:
    sudo /bin/bash

  2. Системный символ приглашения изменится с $ на #. Мы не выйдем из sudo до самого последнего шага в этом процессе.

  3. Установите приложение lighttpd (у меня версия 1.4.28-1.3.amzn1):
    yum install lighttpd

  4. Установите библиотеки FastCGI для lighttpd (не нужны, а почему бы и нет?):
    yum install lighttpd-fastcgi

  5. Убедитесь, что ваш сервер работает:
    /etc/init.d/lighttpd start

Шаг 3. Позвольте внешнему миру видеть ваш сервер.

  1. Если теперь вы попытаетесь подключиться к своему серверу из браузера на рабочем столе, это не удастся. Причина: по умолчанию Amazon AWS не открывает никаких портов для вашего инстанса EC2. Итак, вам придется открывать порты вручную.

  2. Перейдите на панель управления EC2 в браузере рабочего стола. Щелкните «Группы безопасности» на левой панели. Одна или несколько групп безопасности появятся на верхней правой панели. Выберите тот, который был назначен вашему инстансу EC2 при запуске инстанса.

  3. Таблица под названием «Разрешенные соединения» появится в правом нижнем углу. Всплывающее меню позволит вам выбрать «HTTP» в качестве метода подключения.

  4. Остальные значения в этой строке таблицы должны быть: tcp, 80, 80, 0.0.0.0/0

  5. Теперь перейдите на сервер вашего экземпляра EC2 с рабочего стола в браузере. Используйте публичный DNS-адрес, который вы использовали ранее для SSH. Вы должны увидеть общую веб-страницу lighttpd. Если вы этого не сделаете, я не смогу вам помочь, потому что я такой новичок. :-(

Шаг 4. Настройте lighttpd для обслуживания CGI.

  1. Вернувшись в консольную программу, перейдите в каталог конфигурации для lighttpd:
    cd /etc/lighttpd

  2. Чтобы включить CGI, вы хотите раскомментировать одну строку в файле <modules.conf>. (Я мог бы включить Fast CGI, но лучше всего подходят маленькие шаги!) Вы можете сделать это с помощью редактора "ed" следующим образом:
    ed modules.conf
    /include "conf.d\/cgi.conf"/
    s/#//
    w
    q

  3. Создайте каталог, в котором будут жить программы CGI. (Файл /etc/lighttpd/lighttpd.conf определяет, где это будет.) Мы создадим наш каталог в местоположении по умолчанию, поэтому нам не нужно редактировать файлы конфигурации:
    cd /var/www/lighttpd
    mkdir cgi-bin
    chmod 755 cgi-bin

  4. Почти готово! Конечно, вам нужно поместить тестовую программу CGI в каталог cgi-bin. Вот один из них:
    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. Перезагрузите ваш сервер lighttpd:
    /etc/init.d/lighttpd restart

  6. Протестируйте свою программу CGI. В браузере настольного компьютера нажмите этот URL-адрес, заменив публичный DNS-адрес вашего экземпляра EC2:
    http://<<Public DNS>>/cgi-bin/hellopyworld.py

    Для меня это было:
    http://ec2-174-129-110-23.compute-1.amazonaws.com/cgi-bin/hellopyworld.py

Шаг 5: Вот и все! Уберись и поблагодари!

(Странный пост, надеюсь, ответ будет не таким странным).

Что касается недостатков безопасности: считается плохой практикой хранить скрипты cgi-bin в корневом каталоге документов веб-сервера. Даже W3C уклоняется от этого в разделе «Скомпилированные языки, такие как C, безопаснее ...» в своих Часто задаваемые вопросы о безопасности в Интернете:

Рассмотрим следующий сценарий. Для удобства вы решили идентифицировать сценарии CGI для сервера с помощью расширения .cgi. Позже вам нужно будет внести небольшие изменения в интерпретируемый сценарий CGI. Вы открываете его в текстовом редакторе Emacs и изменяете сценарий. К сожалению, при редактировании в дереве документа остается резервная копия исходного кода скрипта. Хотя удаленный пользователь не может получить исходный код, загрузив сам сценарий, теперь он может получить резервную копию, слепо запросив URL:

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

(Это еще одна веская причина ограничить сценарии CGI до cgi-bin и убедиться, что cgi-bin отделен от корня документа.)

Это не такая серьезная угроза, как возможность записи файла в корень документа. Однако злоумышленник может получить исходный код cgi, разработать направленную атаку против него и использовать его в качестве ступеньки к серверу.

Чтобы смягчить это, вы можете добавить следующие строки в lighttpd.conf (или его вариант), чтобы направить cgi-bin в каталог, отдельный от корня документа / var / www / lighttpd.

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

Для этого требуются модули cgi и alias для lighttpd.