Описание начального этапа работ по созданию интернет-сервера ESIS

(по состоянию на сентябрь 2001 года)

ВВЕДЕНИЕ

С каждым годом сфера применения Интернет расширяется, стремительно растет количество людей, использующих всемирную паутину в своей повседневной деятельности на работе и во время досуга, увеличивается количество установленных в сети серверов, лавинообразно растет пересылаемый по каналам Интернет объем информации.

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

Большое распространение имеют также всякого рода вирусы и сетевые черви, которые в ряде случаев проникали даже на серверы Белого Дома и Даунинг стрит. Подобные факты имеют место и в коммерческой сфере как попытки получения доступа к серверам конкурентов для извлечения информации, представляющей ноу-хау, попытки (порой небезуспешные) паралича работы серверов конкурентов для подрыва их деловой репутации и т.п.

В связи с этим, на наш взгляд в ближайшие годы главной проблемой компьютеризации вообще, и Интернет в частности, будет проблема безопасности и надежности. Существующее в настоящий момент программное обеспечение, на наш взгляд, разрабатывалось исходя из не вполне правильных концептуальных предпосылок. До сих пор не уделялось достаточно внимания данной теме. Мы думаем, и некоторые имеющиеся факты подтверждают это, что в данный момент человечество наконец начинает осознавать важность вопросов надежности и безопасности функционирования компьютерного программного обеспечения, и исходя из наших вышеизложенных убеждений решили внести свой посильный вклад в это общее дело.

Существовала также еще одна предпосылка начатых нами работ, которая заключалась в следующем. Ежегодно производители компьютерной техники выпускают все новые и новые процессоры, растет частота системной шины и разрядность данных, увеличивается объем используемых жестких дисков и оперативной памяти. Иными словами, мощность используемой компьютерной техники растет как на дрожжах. Казалось бы, все хорошо. Однако, вместе с тем катастрофически растут и объемы обрабатываемых данных, что приводит к тому, что серверы Интернет порой "задыхаются" от наплыва запросов, которые им не удается удовлетворить, несмотря на колоссальные вычислительные мощности, которые имеются в их распоряжении. Происходит это, как мы покажем ниже, из-за существенной концептуальной неоптимальности имеющегося на них программного обеспечения.

ПОСТАНОВКА ЗАДАЧИ

Исходя из изложенных выше соображений нами была поставлена задача создать Интернет сервер, который бы соответствовал нынешним стандартам безопасности, надежности и производительности.

Начнем с производительности. Как устроена работа имеющихся сегодня серверов в плане обработки поступающих на них запросов? Нынешние серверы Интернет состоят фактически из двух взаимодействующих между собой частей - собственно сервера и так называемых скриптов. Функция сервера заключается в приеме поступающих от клиентов запросов, их анализе и выполнении. Выполнение запросов, в зависимости от их типа, может выполняться самим сервером (запросы на получение статических файлов различного типа, которые стационарно лежат в различных директориях жесткого диска), а может требовать запуска скрипта (скриптов). Скрипты занимаются разного рода "интеллектуальной" работой - производят различные вычисления, делают выборки из базы данных и т.п. Разумеется, простейший тип сервера, ориентированный исключительно на отдачу статических файлов может и не требовать никаких скриптов, однако этот вырожденный случай, как не представляющий практического значения, рассматриваться нами не будет.

Скрипт фактически представляет собой программу написанную, как правило, на одном из языков высокого уровня. Скрипт получает от сервера в качестве параметров имя запрашиваемой клиентом страницы, адрес клиента, тип используемого последним браузера и т.п. Запуск скрипта сервером фактически (в терминах операционной системы) представляет собой запуск отдельного процесса, что вызывает немалые накладные расходы времени процессора, памяти и т.д. Важно отметить, что такие серьезные жертвы приносятся при выполнении сервером КАЖДОГО нетривиального клиентского запроса (т.е. такого, который не сводится к отсылке клиенту статического файла).

Более того, при работе с базами данных, имеется куда более серьезный изъян скриптовой технологии, который заключается в необходимости при КАЖДОМ запросе устанавливать связь с базой данных, а это уже требует гораздо больше ресурсов и времени, чем простое порождение процесса, указанное выше.

Остановимся также на том, что языки программирования, на которых составляются скрипты бывают двух типов - компиляторы и интерпретаторы. Компиляторы превращают исходный текст программы, составленной программистом на языке высокого уровня в машинный код заранее, так что в момент вызова скрипт представляет собой уже готовую к работе программу. Скрипты, предварительно обработанные компилятором, в дальнейшем уже в компиляторе не нуждаются. По иному работают интерпретаторы (к сожалению, чрезвычайно распространенные в современном Интернете) - они заранее не превращают текст программы в исполняемые процессором коды, а делают это уже в момент вызова скрипта, причем каждый раз. Расход времени, памяти и прочих ресурсов компьютера при обработке КАЖДОГО запроса от клиента при этом еще раз многократно возрастает.

Исходя из вышеизложенного, нами была поставлена задача создать такой сервер Интернет, который совмещал бы в себе одновременно и обычный сервер, и скрипт, составляя одно целое, так чтобы не требовалось каждый раз создавать процесс (в терминах операционной системы) и организовывать подключение к базе данных. Этот единый объект, разумеется должен был быть построен на технологии компилятора, а не интерпретатора. Этот гибрид был нами назван скриптосервером, так чтобы подчеркнуть наличие в нем сразу двух этих составляющих.

Касательно подключений к базе данных, нами была поставлена задача, чтобы при своем запуске наш скриптосервер создавал некоторое начальное количество подключений к базе данных, а при необходимости в процессе работы его автоматически наращивал. В ходе обработки поступающих запросов каждой рабочей нити (thread) процесса динамически выделялось (а при отсутствии такового - создавалось новое) свое собственное подключение к базе данных из общего пула имеющихся подключений, а по окончании работы нити (запрос обработан и результат отправлен клиенту) нить делала отметку в пуле подключений о том, что данное подключение к базе данных свободно и может быть назначено для работы другой нити, которая через какое-то время начнет обрабатывать новый запрос от нового клиента.

Рассмотрим теперь вопросы безопасности. Выше было указано на несколько моментов, требующих своего решения в этом аспекте. Для обеспечения бесперебойной работы системы, на наш взгляд, необходимо было предпринять ряд мер. Стандартные системы страдают, как это ни странно звучит, в первую очередь от своей стандартности: их слабые места всем хорошо известны, и даже разработано множество специальных программ для взлома этих стандартных систем, которыми успешно пользуются многочисленные злоумышленники. Наша система, будучи принципиально новой, этого недостатка не имеет. Кроме того, она является, в отличие от наиболее широко используемой в настоящее время системы UNIX, системой с закрытыми кодами, что существенно усложняет взломщикам их деятельность.

Еще один аспект уязвимости существующих систем заключается в их полифункциональности. Имеющиеся серверы Интернет строятся, как правило, на базе универсальных модулей, обеспечивающих одновременное функционирование HTTP, FTP, SMTP, Telnet и ряда других сетевых служб и протоколов, среди которых имеется множество потенциально уязвимых элементов. Их безопасная работа в сильной мере зависит от грамотности и опытности администратора, конфигурирующего такие системы, а человеку, как известно, свойственно ошибаться, что приводит к тому, что довольно часто в работающей системе остаются открытыми различные каналы, через которые опытный взломщик без труда проникает. В связи с этим, нами была поставлена задача создать такой программный комплекс, который бы отличался предельной специализацией, так чтобы в нем просто не было заложено при разработке никаких лишних "входных отверстий". Такая постановка задачи оптимальна с той точки зрения, что никакое последующее ошибочное конфигурирование системы не может создать никаких проблем с безопасностью, поскольку никакие неверные действия не смогут открыть какие-либо опасные каналы ввиду полного отсутствия таковых в самой системе.

В плане вопросов безопасности нам также показалось целесообразным ввести в нашу систему специальный модуль, который бы занимался выявлением клиентов, пытающихся осуществить несанкционированный доступ к серверу. Работа этого модуля основана на ряде разработанных нами оригинальных алгоритмов, позволяющих отличить обращения к серверу со стороны человека, работающего через один из стандартных браузеров от обращения к нашей системе со стороны разного рода автоматов для взлома сайтов. В числе прочего, этот модуль защиты содержит в себе ряд специальных ловушек, которые обычно используются взломщиками, так что при обращении к этим ловушкам (которое никогда не имеет места при обычной работе добросовестного клиента) система сразу заносит адрес, с которого производятся такие подозрительные действия в специальный "черный список". В этот же "черный список" заносятся и все прочие адреса хостов, действия которых не являются обычными, что определяется путем использования упомянутых выше специальных алгоритмов клиентской активности. Как только некий адрес хоста попадет в указанный "черный список", все последующие попытки получить соединение с нашим сервером со стороны такого хоста отвергаются на самой ранней стадии сетевого протокола. Это позволяет осуществить надежную оборону системы при минимальных затратах времени процессора. Пребывание адреса хоста в "черном списке" ограничивается некоторым временем, отсчет которого начинается сразу с момента прекращения его недозволенной активности. Сделано это было потому, что значительная часть адресов является динамически выделяемой, так что адрес, принадлежащий в данный момент злоумышленнику, через какое-то время может оказаться распределенным добросовестному клиенту, которого лишать возможности работы с нашим сервером мы не имеем никаких оснований.

РЕЗУЛЬТАТЫ

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

Испытания безопасности проводились ведущими специалистами *** (выпущено цензурой) с привлечением всех имеющихся стандартных средств взлома, а также средств проверки безопасности, самостоятельно разработанных указанными специалистами и дали положительные результаты.

Испытания производительности проводились нами самостоятельно, для чего специально был создан весь необходимый инструментарий, включающий в себя, помимо прочего, специальную тестовую базу данных из восьми миллионов записей и скрипт для стандартного сервера производства корпорации Microsoft. Сравнение производительности нашего скриптосервера и стандартного сервера Microsoft в паре со стандартным скриптом производилось в абсолютно одинаковых условиях, с соблюдением всех математических требований к статистической достоверности результатов. Измерения производились многократно, и полученные результаты каждый раз повторяли одни и те же цифры: время отклика (формирования страницы) оказалось равным 410 миллисекунд для варианта стандартного сервера и 50 миллисекунд для разработанного нами скриптосервера. При этом нужно отметить, что в качестве сравниваемого скриптосервера использовался рабочий вариант программы, имеющий все описанные выше механизмы отслеживания недозволенной активности, а в качестве стандартного скрипта - простейший вариант, производивший лишь некоторую выборку через SQL из тестовой базы данных (именно такую выборку, разумеется, производил и вариант скриптосервера) и при этом ничего не отслеживавший, что давало стандартному варианту даже некоторую фору. Таким образом, по быстродействию нами был получен выигрыш почти на порядок по сравнению со стандартным скриптовым подходом.

ВЫВОДЫ

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