Остаться на плаву. Обвески для Web-сервера, без которых не обойтисьЕвгений Зобнин (j1m@synack.ru) Сегодня Web-серверы играют важнейшую роль в интернет-инфраструктуре. На них держится все, начиная с сайта Марины Петровны с посещаемостью 3 человека в месяц и заканчивая высоконагруженными проектами YouTube и Twitter. От производительности и безопасности Web-серверов во многом зависит конкурентоспособность сервиса, но чтобы выжать из сервера все, недостаточно одной только тонкой настройки Apache и PHP. eAcceleratorИсполнение PHP-скриптов очень сложная задача, создающая огромные нагрузки на Web-сервер. По сути, именно разбор скриптов зачастую является наиболее затратным процессом, происходящим на машине, где крутится сервис. При этом не все Web-дизайнеры и программисты знают, что процесс исполнения PHP-кода (как, впрочем, и кода на любом другом современном интерпретируемом языке) состоит из двух этапов: трансляция кода PHP в байткод виртуальной машины и непосредственное исполнение байткода. Первая операция в большинстве случаев более сложна и ресурсоемка чем вторая, поэтому разумнее хранить прекомпилированный PHP-байткод в кэше и запускать на исполнение именно его, пропуская процедуру трансляции. К сожалению, стандартный интерпретатор PHP не позволяет проделывать такое, поэтому уже давно существует несколько проектов по созданию PHP-ускорителей, наиболее производительный из которых носит имя eAccelerator. eAccelerator (eaccelerator.net) - это PHP-ускоритель, основанный на коде проекта Turck MMCache (sourceforge.net/projects/turck-mmcache). Он не только кэширует PHP-код в виде байткода, но и производит его оптимизацию, позволяет хранить кэш на диске и обладает развитой системой настроек. eAccelerator распространяется в виде PHP-модуля, но доступен в репозиториях далеко не всех дистрибутивов, поэтому мы установим его из исходных текстов. Для этого получим последнюю стабильную версию модуля:
Установим пакеты, необходимые для сборки ПО из исходников (gcc, binutils и т.д.):
Также нам понадобится пакет php-devel (php5-devel), содержащий утилиту phpize:
Запускаем процесс сборки:
Далее узнаем местоположение файла php.ini (в разных дистрибутивах он находится в разных местах):
И добавляем в него следующие строки:
Создаем каталог для файлов кэша:
Перезапускаем apache:
Вот и все. Теперь можно выполнить замер производительности. Разработчики утверждают, что ее прирост может достигать 10-ти раз, однако по личному опыту могу сказать, что зачастую эта цифра становится еще выше. IonCube PHP EncoderИдея хранения и запуска байткода вместо оригинального PHP-кода открывает одну интересную возможность: сокрытие исходного кода. Транслировав PHP-код в байткод, мы не только получим прирост производительности, но и существенно усложним процесс исследования и модификации кода. Сразу оговорюсь: несмотря на то, что eAccelerator и другие аналогичные по функциональности системы и позволяют осуществить трансляцию в байткод, использовать их для защиты PHP-приложения довольно наивно. Стандартная виртуальная машина языка PHP проста, хорошо документирована и не скрывает то, что скрывать бессмысленно, поэтому восстановить изначальный PHP-код из байткода или изменить поведение приложения будет достаточно просто. Для установки настоящей, стойкой защиты на PHP-скрипты принято применять протекторы, наиболее известные из которых называются Zend Optimizer и IonCube PHP Encoder. Первый - это платный проект разработчиков PHP, защитные техники которого однажды уже показали свою нестойкость (в результате доверие к продукту упало). Второй разрабатывается компанией IonCube, обладает в три раза меньшей ценой и использует гораздо более изощренные техники сокрытия оригинального кода. Ему и будет посвящена остальная часть раздела. Основные характеристики IonCube PHP Encoder:
IonCube транслирует PHP-код в байткод для собственной виртуальной машины, проводит оптимизацию, обфускацию, шифрует легко читаемые участки. При этом для исполнения байткода применяется IonCube PHP Loader, включающий в себя виртуальную машину, и потому необходимый везде, где должен быть запущен закодированный PHP-скрипт. Для восстановления кода, зашифрованного PHP Encoder, взломщику придется вслепую произвести дизассемблирование байткода виртуальной машины (естественно, ни документации, ни исходного кода ВМ никто ему не даст), затем расшифровать зашифрованные данные, разобрать и подчистить код от обфускации и только после этого попытаться восстановить исходный PHP-код. При этом даже если взломщик попытается просто изменить код (например, для отключения проверки на регистрацию), приложение перестанет функционировать из-за несовпадения контрольной суммы в цифровой подписи. Тогда придется менять и ее. Не возьмусь говорить, что взломать PHP-скрипты, закодированные PHP Encoder, невозможно, но это как раз тот случай, когда затраты не окупают результатов. IonCube PHP Encoder доступен в виде триальной версии, которую можно получить, следуя инструкциям, опубликованным на странице www.ioncube.com/encoder_eval_download.php. Для установки достаточно выполнить пять шагов: 1. Зарегистрироваться и скачать последнюю версию PHP Encoder. 2. Распаковать полученный архив и скопировать загрузчик в каталог PHP-модулей (он может быть другим):
3. Добавить в секцию [PHP] файла php.ini строку:
4. Перезапустить индейца:
5. Закодировать файлы с помощью команды ioncube_encoder5 (или просто ioncube_encoder в случае PHP4):
Больше информации об аргументах командной строки ioncube_encoder ты узнаешь из официального руководства пользователя. Web OptimizerЛюбой web-дизайнер, разработчик или системный администратор, хоть раз занимавшийся оптимизацией содержимого веб-сайта, знает, что этот процесс требует применения множества самых различных техник и кучу времени, которое приходится тратить на рутинные, однообразные действия. Большую часть этих действий, конечно, можно оптимизировать с помощью скриптов и шаблонов конфигурационных файлов, однако различные CMS и Web-сервера могут внести в подход различия, скрипты придется дорабатывать, а конфиги переписывать. Наверное, именно такие мысли посещали головы российских web-разработчиков из ООО «ВЕБО» незадолго до того, как они приступили к разработке автоматизированной системы оптимизации контента. В результате их работы появился Web Optimizer (code.google.com/p/web-optimizator) - набор PHP-скриптов, которые выполняют всю рутинную работу по оптимизации контента Web-сайта на лету.
Перефразируя слова авторов, можно сказать, что пользователям Web Optimizer больше не придется натравливать компрессор на каждый имеющийся js-файл, удалять комментарии из HTML-файлов и вытягивать их в одну строку, настраивать кэширование и проделывать многие другие рутинные операции. Все это сделает полностью автоматизированная система, которая проста в установке и не требовательна к ресурсам. Опять же, если верить словам разработчиков (подкрепленным внушительной таблицей с замерами производительности), то среднее увеличение скорости загрузки страниц, обработанных Web Optimizer, составляет примерно 250% (а в некоторых случаях и до 500%). "Сайты ускоряются в среднем в 2,5 раза (+21 в оценке YSlow, -34% в размере, -43% в количестве внешних объектов)". Для установки Web Optimizer следует выполнить три простых шага: 1. Обзавестись Web-сервером с поддержкой PHP и SSH-доступом (FTP тоже подойдет). 2. Получить последнюю версию Web Optimizer:
3. Распаковать архив в корневой каталог Web-сервера:
Чтобы Web Optimizer смог сохранять кэшированные версии обработанных им файлов, следует установить права на запись на файл web-optimizer/config.webo.php и каталог web-optimizer/cache для пользователя, под которым работает Web-сервер:
Все, теперь открываем страницу http://сайт/web-optimizer/index.php в браузере и приступаем к настройке фреймворка. Самый простой путь - довериться системе, ввести логин и пароль администратора и нажать кнопку "Быстрая установка". Web Optimizer пройдется по цепочке расположенных на Web-сервере файлов и создаст их закэшированные сжатые версии. Также он произведет необходимую для последующей работы системы модификацию оригиналов или (если они недоступны для записи) выведет инструкцию об их изменении. PHP Intrusion Detection System (PHPIDS)Многие из нас применяют системы обнаружения вторжений на своих серверах. Некоторым достаточно сетевых IDS, другие также устанавливают и локальные, однако мало кто применяет Web IDS, предназначенные для "отлова" попыток взлома Web-сайтов. PHPIDS представляет собой PHP-библиотеку, которую следует подключать к проекту. В результате все входные данные попадают на ее вход, после чего производится их парсинг и проверка на легальность. В случае обнаружения попытки вторжения, принимающий данные скрипт завершается, формируется отчет и отсылается системному администратору (сохраняется на диске, отсылается разработчикам PHPIDS, вписать нужное). Установить систему очень просто: 1. Скачиваем последнюю версию PHPIDS с офсайта и распаковываем:
Обрати внимание, что мы намеренно установили PHPIDS рядом с корневым каталогом Web-сервера (а не в него). Так мы изолировали его каталоги от просмотра посторонними. 2. Открываем конфигурационный файл Config/Config.ini.php и вносим в него необходимые изменения. На данном этапе достаточно модифицировать всего одну опцию:
Все остальные поля файла можно оставить неизменными, PHPIDS и в базовой конфигурации работает на пять с плюсом. 3. Создаем файл phpids.php в корневом каталоге Web-сервера и записываем в него следующее:
4. Чтобы PHPIDS проверял все наши PHP-скрипты, добавим файл phpids.php к каждому из них. Для этого откроем php.ini и внесем в него следующую строку:
То же самое можно сделать при помощи .htaccess:
5. Перезапускаем апач:
Это все. Теперь можешь протестировать PHPIDS, набрав в адресной строке браузера что-нибудь вроде "http://сайт/phpids.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C/script%3E". Интересные Apache-модулиЭтот раздел посвящен сторонним Apache-модулям, которые ты можешь скачать из Интернета и подключить к своему Web-серверу. Среди них есть как известные и повсеместно используемые модули, так и необычные проекты.
Что еще?Рассмотренные в статье обвески далеко не все, что было придумано web-разработчиками и программистами в области разгона и защиты Web-сервера. При должном терпении на просторах интернета ты сможешь найти массу проектов, которые позволят твоему серверу выдерживать большие нагрузки и самые изощренные типы атак. INFOОбфускация — приведение исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции. Другими словами, запутывание кода. PhpSecInfo (phpsec.org/projects/phpsecinfo/) добавляет функцию phpsecinfo(), предоставляющую информацию о безопасности PHP-окружения и советы по ее улучшению. |