|
Почтовый сервер NextMail
Страница в разработке
Общие сведения о почтовой службе NextMail
Почтовая служба NextMail, одна из старейших в РУнете, ведет свое начало с марта 2001 года, когда группа разработчиков (в то время эта почтовая система называлась www.mail2k.ru) приступила к реализации идей по совершенно новому подходу к организации сервиса бесплатной электронной почты в интернете.
С самого начала разработчики задумывали такие, по тем временам небывалые, возможности, как собственное файловое хранилище для каждого пользователя, возможность предоставлять прямые ссылки на свои файлы, почтовый ящик без ограничений объёма хранящихся данных, встроенный антивирус и антиспам-фильтр, и многое другое.
Многие считают, что первый "безлимитный ящик" с неограниченным объёмом появился в почтовой службе поисковика Google, однако это не так! Ещё в 2002 году Nextmail.ru (в то время www.mail2k.ru) предоставлял своим пользователям полностью неограниченный объём ящика электронной почты и целых 150 Мб для файлового хранилища (или собственного сайта).
Кроме того, Nextmail.ru стал одним из первых сетевых сервисов бесплатной электронной почты, который внедрил понятие "платной электронной почты", в рамках которой предоставлялся максимально эффективный, на тот момент, сервис отсева нежелательной корреспонденции (СПАМа) и вредоносных программ-вирусов во входящей электронной почте пользователей.
На данный момент времени почтовая система NextMail имеет порядка 120 тысяч пользователей, 8000 посетителей ежедневно проверяют почту через веб-интерфейс.
Сервис NextMail оказывает следующие услуги:
-
Сервис отправки, получения почты по протоколам SMTP/POP3
-
Доступ к почте по протоколу IMAP
-
Почтовый веб-клиент, обеспечивающий работу не только с локальной почтой, но и с почтой других провайдеров
-
Файловое хранилище
-
Услуги хостинга (доступ через веб-интерфейс и по протоколу ftp)
Вследствие разнообразия предоставляемых услуг и относительно высокой популярности почтовой службы NextMail оборудование страдает от следующих нагрузок:
-
Большой объем писем, включая нежелательную корреспонденцию рекламного содержания (СПАМ)
-
Работа с письмами через браузер является достаточно ресурсоемкой задачей, особенно для такого количества пользователей
-
Увеличение нагрузки особенно заметно в утренние часы, когда большинство пользователей проверяют почту
-
Дос-атаки различного рода, включающие попытку подбора пароля методом перебора (брудфорс)
В 2009 году была произведена модернизация почтового движка NextMail, что позволило решить следующие задачи:
-
Повысить пропускную способность серверов в области работы с письмами
-
Повысить скорость выдачи страниц пользователю при работе с почтой через веб-интерфейс
-
Повысить максимальную пропускную способность работы пользователей почты через веб-интерфейс
-
Повысить защищенность системы, максимально затруднив возможность подбора паролей методом перебора
-
Повысить устойчивость серверов к различного рода сетевым атакам
Модернизация затронула только программную часть серверов, а не аппаратную. Заметим, что при проведении такой модернизации, включающей конвертацию данных под новый формат, время простоя системы было минимальным.
Топология сети
Прием почтового сообщения
В ранних версиях программного обеспечения NextMail Server примерная топология почтовых сегментов на прием почты была следующей:

Схема 1. Топология сети при приеме почтового сообщения в ранних версиях NextMail Server
Приведенная выше схема иллюстрирует этапы приема почтового сообщения на уровне серверов. Почтовая служба NextMail предоставляет пользователям адреса на нескольких доменах, каждый сервер отвечает за определенный домен (или несколько доменов), а вся информация о пользователях до модернизации почтового движка хранилась в одной общей базе данных.
Работа через веб-интерфейс
Узким местом такой схемы была общая база данных, а также большой объем СПАМ-рассылок. Проблема с базой данных была решена ее кластеризацией, т.е. разбиением: общая базовая информация о пользователях и личная база данных для каждого пользователя. Для борьбы со СПАМом были использованы различные методы, в частности, метод серых списков, что позволило значительно сократить нежелательный сетевой трафик и снизить количество вхолостую обрабатываемых писем.
Логику работы серверов до модернизации программного обеспечения при взаимодействии с пользователем через браузер можно проиллюстрировать следующей схемой:

Схема 2. Топология сети при работе через веб-интерфейс
Каждый веб-сервер отвечает за работу с определенными доменами, причем одна часть информации о пользователях хранится в общей базе данных, другая часть на дисковом массиве (почтовые сообщения, файлы).
Узкие места при такой схеме:
-
Сам веб-сервер, т.к. он построен на базе сервера Apache2, который является достаточно сложным и имеет низкую устойчивость к высоким нагрузкам и к DOS-атакам.
-
Общая база данных. В этой базе хранится не только информация о пользователях, но настройки почтовых ящиков, информация о письмах, почтовых папках и вложениях., поэтому при увеличении количества пользователей появляются таблицы с большим числом записей, что очень сильно снижает пропускную способность серверов.
DoS-атака (от англ. Denial of Service, отказ в обслуживании) - атака на вычислительную систему с целью вывести её из строя, то есть создание таких условий, при которых легитимные (правомерные) пользователи системы не могут получить доступ к предоставляемым системой ресурсам, либо этот доступ затруднён.
Сервер обработки почтовых сообщений NextMail
Почтовый движок NextMail использует следующие программные компоненты: qmail, веб-сервер Apache v.2.2, сервер баз данных MySQL, nginx – веб-сервер и почтовый прокси-сервер, SQLite – встраиваемый движок баз данных.
Процедуры обработки и вывода информации в почтовом движке NextMail написаны на языке программирования PHP версии 5.
1. qmail
В качестве сервера, обрабатывающего письма, в почтовом движке NextMail используется почтовый сервер qmail с надстройкой, называемой vpopmail, которая необходима для того, чтобы почтовый сервер работал с глобальной базой данных MySQL. Все письма хранятся в формате MailDir.
qmail – MTA (Mail Trasfer Agent – агент доставки почты), который работает под Unix. Он был написан Daniel J. Bernstein как более безопасная замена для популярного MTA Sendmail.
vpopmail – свободно распространяемый программный пакет с открытым кодом (под лицензией GPL), предназначенный для управления виртуальными почтовыми доменами и e-mail аккаунтами для почтовых серверов qmail или Postfix.
На момент выпуска первой версии, qmail был первым MTA (Mail Transfer Agent - агент доставки почты), созданным с учетом требований безопасности. Два наиболее популярных предшественника qmail - Sendmail и Smail - не были созданы с оглядкой на безопасность и в результате являлись постоянным целями для атак. В отличие от этих пакетов qmail имеет модульную архитектуру, состоящую из не доверяющих друг другу компонентов; например, компонент qmail, принимающий SMTP-соединения, запускается с UID , отличным от UID'ов для менеджера очереди или модуля, отсылающего почту.
UID – идентификатор пользователя. В Unix-подобных операционных системах, пользователи идентифицируются идентификаторами пользователя (англ. User identifier, UID). То, что пользователя идентифицирует UID, означает, что операционная система различает пользователей именно по UID (а не, например, по логину).
Почтовый сервер qmail поддерживает некоторые нововведения в сфере электронной почты:
-
Формат почтового сообщения – Maildir
-
Имена ящиков с использованием шаблонов (wildcards). Почта, приходящая на адреса вида "пользователь-wildcard" доставляется в отдельные ящики, позволяя пользователю публиковать несколько почтовых адресов, например, один для списка рассылки, другой – для деловой переписки и третий – для публикации в общедоступных местах.
- vpopmail – программный пакет, обеспечивающий хранение информации о пользователях в различных форматах данных (SQL база данных, LDAP каталог).
Преимущества vpopmail:
-
Поддержка от 1 до 23 миллионов виртуальных доменов электронной почты с балансированием дерева каталогов.
-
Поддержка от 1 до 23 миллионов пользователей электронной почты в домене с балансированием дерева каталогов
-
Требует только одного системного пользователя
-
Поддержка виртуальных доменов
-
Поддержка MySQL, Oracle, PostgreSQL, LDAP, Sybase
-
Нет необходимости иметь сотни qmail-файлов для виртуальных доменов. Каждый домен получает свой собственный каталог пользователей под vpopmail с уникальными настройками для каждого домена.
2. Веб-сервер Apache v.2.2
В качестве веб-сервера почтовый движок NextMail использует сервер Apache версии 2.2. Apache является кроссплатформенным программным обеспечением, поддерживая операционные системы GNU/Linux, BSD, Mac OS, Microsoft Windows, Novell NetWare, BeOS.
Основными достоинствами Apache считаются надёжность и гибкость конфигурации. Он позволяет подключать внешние модули для предоставления данных, использовать СУБД для аутентификации пользователей, модифицировать сообщения об ошибках и т. д. Поддерживает IPv6.
IPv6 (англ. Internet Protocol version 6) - новая версия протокола IP, призванная решить проблемы, с которыми столкнулась предыдущая версия (IPv4) при её использовании в интернете, за счёт использования длины адреса 128 бит вместо 32. В настоящее время протокол IPv6 уже используется в нескольких сотнях сетей по всему миру (более 1600 сетей на март 2009), но пока ещё не получил столь широкого распространения в интернете, как IPv4. В России практически не используется.
Веб-сервер Apache разрабатывается и поддерживается открытым сообществом разработчиков под эгидой Apache Software Foundation и включён во многие программные продукты, среди которых СУБД Oracle и IBM WebSphere.
Apache HTTP Server поддерживает модульность. Существует более 400 модулей, выполняющих различные функции. Часть из них разрабатывается командой Apache Software Foundation, но основное количество – отдельными open source-разработчиками.
3. PHP
За обработку и вывод информации в почтовом движке NextMail отвечает скриптовой язык программирования PHP версии 5. PHP (англ. PHP: Hypertext Preprocessor – "PHP: препроцессор гипертекста", англ. Personal Home Page Tools(устар.) – "Инструменты для создания персональных веб-страниц") – скриптовый язык программирования общего назначения, интенсивно применяющийся для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков программирования, используемых для создания динамических веб-сайтов.
Популярность PHP в области построения веб-сайтов, определяется наличием большого набора встроенных средств для разработки веб-приложений.
4. Сервер баз данных
В качестве SQL-сервера в почтовой службе NextMail используется сервер базы данных MySQL. MySQL - свободная система управления базами данных (СУБД).
Свободное программное обеспечение – широкий спектр программных решений, в которых права пользователя ("свободы") на неограниченные установку, запуск, а также свободное использование, изучение, распространение и изменение (совершенствование) программ защищены юридически авторскими правами при помощи свободных лицензий.
MySQL является собственностью компании Sun Microsystems, осуществляющей разработку и поддержку приложения. Продукт распространяется под GNU General Public License и под собственной коммерческой лицензией, на выбор. Помимо этого разработчики создают функциональность по заказу лицензионных пользователей, именно благодаря такому заказу почти в самых ранних версиях появился механизм репликации.
27 января 2010 года Oracle Corporation приобрела Sun Microsystems и включила MySQL в свою линейку СУБД.
MySQL является решением для малых и средних приложений. Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы.
Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типа MyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей. Более того, СУБД MySQL поставляется со специальным типом таблиц EXAMPLE, демонстрирующим принципы создания новых типов таблиц.
Почтовый сервер qmail
Как уже отмечалось, сервер qmail обладает модульной структурой и не является какой-то единой программой, все время запущенной в системе, а состоит из несколько небольших программ, которые выполняют определенную задачу. Преимущества такого подхода:
-
Каждая программа может быть запущена от своего пользователя, что является плюсом в безопасности системы
-
Программу можно заменить аналогичной, но с более обширным функционалом. Таким способом устанавливается АнтиСПАМ в систему или интегрируется vpopmail.

Схема 3. Алгоритм получения письма
Обработку сервером qmail очереди из писем можно представить в виде следующей схемы:
Схема 4. Алгоритм обработки очереди писем qmail.
Алгоритм доступа к почте по протоколу POP3 можно схематично изобразить следующим образом:
Схема 5. Алгоритм доступа к почте по протоколу POP3.
Алгоритм доступа к почте через веб-интерфейс можно представить следующей схемой:

Схема 6. Алгоритм доступа к почте через веб-интерфейс.
Модернизация программного обеспечения NextMail Server
Доставка почты
Из схемы 4 видно, что в одним из основных элементов на этапе доставки почты является доставщик, созданный разработчиками NextMail на языке Perl.
Perl - это высокоуровневый интерпретируемый язык программирования, являющийся языком построчного выполнения, и компилляция программы выполняется только во время ее запуска. Следовательно, можно сделать вывод о том, что при большом объеме писем постоянно происходит процесс компиляции доставщика, что очень сильно нагружает сервер.
В новой версии NextMail Server проблема была решена заменой этого модуля новой разработкой на языке С++. Компиляция выполняется один раз и при дальнейшей работе данная операция не требуется.
Модульность qmail
Еще одной заметной проблемой является модульность qmail, который состоит из нескольких небольших модулей, выполняющих определенную задачу. Вызов последующего модуля происходит с помощью команд языка программирования С – exec() и fork().
Логика работы команды fork():
-
операционная система делает копию текущего процесса;
-
указатель счетчика команд перемещается на следующую после fork() команду;
-
продолжается дальнейшее исполнение уже двух одинаковых программ, при помощи логики программы определяется, кто родитель, а кто потомок.
Команда exec() загружает вызываемую программу (один из модулей qmail) и продолжает уже дальнейшее ее исполнение.
На каждую из этих операций затрачивается процессорное время, кроме того, при работе с командой exec() происходит взаимодействие с жестким диском (чтение исходного кода программы). Как известно, скорость работы с жестким диском на несколько порядков ниже, чем скорость работы с оперативной памятью.
При модернизации программного обеспечения NextMail Server данная проблема была решена путем переноса этих программ в оперативную память, в этом случае жесткий диск не участвует в процессе работы серверного ПО.
Формат хранения данных базы данных MySQL
Как известно, MySQL поддерживает несколько форматов хранения данных. Основным форматом является MyISAM, который имеет следующие особенности:
-
оптимизация под запросы выборки SELECT, которые преобладают в большинстве случаев работы с веб-сайтами, причем такая оптимизация выполнена за счет отсутствия поддержки транзакций и внешних ключей;
-
при добавлении данных происходит кратковременная блокировка всей таблицы, что снижает скорость работы базы данных при смешанных запросах – добавления и выборки.
-
отсутствие самовосстановления по журналу при сбоях (заметим, что данная возможность присутствует во всех развитых СУБД);
-
отсутствие блокировок регионов, меньших, чем целые таблицы, что приводит к отсутствию масштабируемости, т.е. к сильному уменьшению производительности с повышением нагрузки;
- слабая реализация сортировки, основой которой является клауза ORDER BY языка SQL при отсутствии подходящего индекса;
- все перечисленные недостатки проявляются в заметной степени на нагрузке порядка 400 клиентов, исполняющих сложные запросы по базе данных размером 2-3 Гб;
- отсутствие внешних ключей служило причиной еще одной проблемы - автоматический контроль целостности, все проверки проводились в коде движка, причем не всегда корректно, что вело к росту объема таблиц базы, причем уже ненужными данными;
Следовательно, можно сделать вывод, что формат данных MyISAM больше подходит для сайтов с небольшой нагрузкой. Более обширным функционалом обладает формат данных InnoDB. Его возможности:
-
наличие транзакций;
-
наличие внешних ключей, что позволяет организовать автоматический контроль целостности - важные данные не удалятся, а связанные данные удаляются автоматически;
-
наличие самовосстановления при сбоях, кроме того, сведено к минимуму крушение таблицы при перезагрузке SQL-сервера, т.к. ведется журнал транзакций;
-
блокировка при добавлении данных только одной записи, а не всей таблицы.
При таком подходе многие группы запросов можно вынести в SQL-функции, что и было применено при разработке нового доставщика почты NextMail Server. Кроме того, этот подход использован в модуле qmail-smtpd, который проводит проверку отправителя, получателя, а также всевозможные квоты.
Преимущества такого подхода:
-
логику SQL-запросов достаточно легко модифицировать, причем перекомпилировать уже работающие программы не потребуется;
-
экономия трафика – не нужно гонять промежуточные данные по сети;
-
процедура работает быстрее, т.к. включает встроенные оптимизации MySQL;
-
налицо преимущества в области безопасности - можно выполнять процедуру от другого пользователя базы данных, тем самым можно пресечь потенциальные SQL-инъекции, т.к. к важным данным доступ закрыт.
Веб-интерфейс
В процессе работ по модернизации программного обеспечения NextMail Server в результате анализа логики работы веб-интерфейса было выявлено следующее.
-
При разборе почты через веб-сервер возникают следующие проблемы:
- Если в ящике много писем, то не всегда удается зайти в ящик с первого раза, т.к. серверу требуется время на выдачу данных.
- Если пользователь подключил дополнительный ящик, то почта забирается с помощью сокет-взаимодействия, а веб-сервер подвисает, если какой-либо из потоков использует сокеты; причина этого – особенность логики работы PHP.
-
Некоторые запросы извлекают из базы данных одни и те же данные на этапе генерации различных страниц, например, информация о пользователях.
-
Необязательно заново генерировать внешние страницы для каждого пользователя, достаточно обновлять их раз в 10 минут. В дополнение получаем устойчивость к ДОС-атакам, направленным на загрузку сервера большим числом запросов.
-
Общую базу данных необходимо разделить на две: глобальную, содержащую информацию о пользователях, и локальную для каждого, в которой содержится информация о письмах, папках, дополнительных учетных записях. Таким образом, можно обойти таблицы общего пользования, которые уже достигли большого размера – около 4 млн записей.
Отделение разбора почты от веб-сервера
Алгоритм работы разборщика почты NextMail Server можно проиллюстрировать следующей схемой:

Схема 7. Разделение разборщика почты NextMail Server на два независимых сегмента.
Приведенная выше схема показывает, что разборщик почты через веб-интерфейс при модернизации NextMail Server был разделен на две части. Теперь при наличии менее 6-ти сообщений веб-интерфейс разбирает письма самостоятельно. Это сделано для того, чтобы не создавать лишние неудобства, т.к. длительное отсутствие каких-либо изменений в интерфейсе (пока доставляются все письма) будет нервировать пользователей. Если сообщений больше шести, то система разбирает самые последние пять сообщений, чтобы пользователь мог ознакомиться с ними, пока идет разборка всего остального.
Второй модуль, который и занимается разбором почты, вызывается с помощью программы cron (планировщик заданий) раз в 10 секунд с учетом количества уже запущенных разборщиков. Это сделано для сохранения устойчивости системы и для того, чтобы не перегрузить ее.
В отдельный модуль вынесена логика работы с дополнительными почтовыми ящиками. Если у пользователя имеются дополнительные ящики, то веб-интерфейс обрабатывает только основной и всегда помещает пользователя в очередь на разборку. Такое решение реализовано для того, чтобы не подвешивать веб-интерфейс из-за операций с сокетами, которые могут явно подвесить сервер, если взаимодействие ведется с медленным почтовым сервером.
Преимущества применяемого алгоритма следующие:
-
Ящик пользователя всегда открывается, даже при наличии большого количества неполученных писем.
-
Нет скачка нагрузки на сервер вследствие того, что зашло слишком много пользователей одновременно – разборщиков всегда будет столько, сколько выдержит сервер (лимит определяется для каждого сервера индивидуально).
-
Веб-сервер больше не имеет страниц, которые формируются и отображаются очень долго. Теперь время выдачи всех страниц примерно одинаково.
Выделение более быстрого сервера на выдачу статики
Архитектура обработки запросов веб-сервера в новой версии программного обеспечения NextMail Server была переработана таким образом, чтобы все статические данные (картинки, стили, флэш-файлы) отдавались бы более быстрым сервером и не затрагивали сервер, отвечающий за обработку PHP-скриптов. В качестве такого сервера был выбран nginx.
nginx – веб-сервер и почтовый прокси-сервер, работающий на Unix-подобных операционных системах. Разрабатывается Игорем Сысоевым с 2002-го года для компании Rambler и постоянно модернизируется. Осенью 2004 года вышел первый публично доступный релиз.
Основные функции HTTP-сервера (nginx, в частности):
-
обслуживание статических запросов, индексных файлов, автоматическое создание списка файлов, кеш дескрипторов открытых файлов;
-
акселерированное проксирование без кэширования, простое распределение нагрузки и отказоустойчивость;
-
поддержка кеширования при акселерированном проксировании и FastCGI;
-
акселерированная поддержка FastCGI и memcached серверов, простое распределение нагрузки и отказоустойчивость;
-
модульность, фильтры, в том числе сжатие (gzip), byte-ranges (докачка), chunked ответы, HTTP-аутентификация, SSI-фильтр;
-
несколько подзапросов на одной странице, обрабатываемых в SSI-фильтре через прокси или FastCGI, выполняются параллельно;
-
поддержка шифрования SSL (secure socket layer);
-
экспериментальная поддержка встроенного Perl.
Протокол SSL (secure socket layer) был разработан фирмой Netscape, как протокол обеспечивающий защиту данных между сервисными протоколами (такими как HTTP, NNTP, FTP и т.д.) и транспортными протоколами (TCP/IP).
HTTP-сервер nginx содержит модуль географической классификации клиентов по IP-адресу. В его основу входит база данных соответствия IP-адресов географическому региону, представленная в виде Radix tree в оперативной памяти.
Radix tree – специальный тип двоичного дерева, используемого для хранения строк произвольной длины.

Схема 8. Алгоритм работы веб-сервера с использованием проксирования данных.
Модернизация работы с сервером базы данных
Во время работы пользователя через веб-интерфейс при перемещении на различные страницы можно выделить группу SQL-запросов, которые возвращают в качестве результата одни и те же данные, например:
-
информация о пользователе;
-
информация о текущем домене;
-
белый, черный списки, фильтры, использующиеся при разборе почты:
-
информация о почтовых папках;
-
адресная книга пользователя;
-
размер ящика;
-
дата последнего входа.
Все эти данные крайне редко изменяются, но нужны практически на каждой странице личного кабинета пользователя. Поэтому можно сохранить где-нибудь результаты таких SQL-запросов и получить к ним доступ во время прорисовки следующий страницы. Конечно, надо предусмотреть алгоритм удаления этого кеша при изменения данных, хранящихся в кеше.
При модернизации программного обеспечения NextMail Server выполнить такую модификацию было несложно, т.к. при все процедуры получения данных хранятся в специальных библиотеках.
В качестве модуля кэширования запросов был использован memcached, который поддерживается самим языком PHP. Эта программа с помощью клиентской библиотеки (для Perl, PHP, Python, Java и др.) позволяет кэшировать данные в оперативной памяти одного или нескольких из множества доступных серверов. Распределение реализуется путем сегментирования данных по значению хэша ключа по аналогии с гнездами хэш-таблицы. Клиентская библиотека, используя ключ данных, вычисляет хэш и использует его для выбора соответствующего сервера. Ситуация сбоя сервера трактуется как промах кэша, что позволяет повышать отказоустойчивость комплекса за счет наращивания количества memcached серверов и возможности производить их горячую замену.
memcached – компьютерная программа, реализующая сервис кэширования данных в оперативной памяти на основе парадигмы распределенной хеш-таблицы.
В интерфейсе программы memcached (API) есть только базовые функции: выбор сервера, установка и разрыв соединения, добавление, удаление, обновление и получение объекта. Для каждого объекта устанавливается время жизни, от 1 секунды до бесконечности. При переполнении памяти более старые объекты автоматически удаляются.
API – это сокращение от Application Programming Interface.
Алгоритм кэширования данных на примере получения информации о пользователе представлен на схеме 9.

Схема 9. Алгоритм получения данных о пользователе с использованием memcached.
Кэширование внешних страниц почтовой системы
Во время работы почтовой системы довольно часто возникают атаки на почтовую систему, которые представляют собой DDos-атаку, распределенную на достаточное большое количество подсетей. Обычно такая атака направлена на главную страницу сайта или на какую-нибудь другую внешнюю страницу. Например, такой атаке была подвергнута страница для написания письма в службу поддержки почтового сервиса NextMail (форма обратной связи).
DDos-атака – сокращение от Distributed Denial Of Service Attack. Злоумышленники не ставят своей целью незаконное проникновение в защищенную компьютерную систему с целью кражи или уничтожения информации. Цель данной атаки - парализовать работу атакуемого веб-узла.
Скорость изменения информации на внешних страницах сайта (страницы, которые не относятся к личному кабинету пользователя) достаточно мала, поэтому если временно сохранить страницу на жестком диске, а затем выдать его пользователю, он практически ничего и не заметит.
Кэширование данных можно выполнить при помощи правил выдачи страниц в настройках виртуального сервера nginx. Алгоритм обработки HTTP-запроса представлен на схеме10:

Схема 10. Файловое кэширование внешних страниц сайта.
После такой оптимизации на обработку внешних страниц сайта практически не тратится процессорное время, все сводится к проверке нескольких правил и чтение файла с жесткого диска.
Базы данных: общая база данных MySQL и личная для каждого пользователя
Как уже отмечалось, в ранних версиях NextMail Server вся информация о пользователе, его настройках, письмах, папках хранилось в общей базе данных MySQL. Поэтому при большом количестве пользователей возникала следующая проблема: таблица MESSAGES (информация о сообщениях пользователя) и таблица RESOURCES (информация о вложениях) достигли объемов примерно по 4 миллионов записей каждая. Это давало значительную нагрузку на сервер базы данных, особенно при одновременном открытии почтового ящика – возникало множество запросов на выборку и добавление новых записей, что вызывало постоянное пересоздание индексов таблиц, а данная операция выполняется значительно медленнее для больших таблиц.
Для решения этой задачи база данных была разделена на две части – общая база данных, которая хранит базовую информацию о пользователях, их адресную книгу, белый и черный списки (т.к. эти данные использует доставщик почты, поэтому перенести их в базу пользователей нельзя) и личная база данных каждого из пользователей: дополнительные учетные записи, сообщения, вложения.
В результате таких изменений была получена одна база данных умеренного размера, которая в основном отвечает за выборку данных (базовая информация о пользователях меняется редко) и множество небольших баз данных, относящихся к каждому пользователю. Таким образом, удалось избежать больших таблиц, перекрестных запросов и долгую переделку индексов.
В качестве локальной базы данных пользователя был выбран SQLite3. Т.к. SQLite поддерживает SQL-запросы, адаптировать исходный код почтового интерфейса NextMail под данную базу данных оказалось несложной задачей. Единственный трудоемкий процесс, который мог бы создать проблему это конвертация базы данных, но конвертация при переходе на новую версию NextMail Server была выполнена в выходной день, когда сервер загружен не так сильно, как в рабочие дни.
SQLite – встраиваемый движок баз данных. Слово "встраиваемый" означает, что SQLite не использует парадигму клиент-сервер, то есть движок SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а предоставляет библиотеку, с которой программа компонуется и движок становится составной частью программы. Таким образом, в качестве протокола обмена используются вызовы функций (API) библиотеки SQLite. Такой подход уменьшает накладные расходы, время отклика и упрощает программу. SQLite хранит всю базу данных (включая определения, таблицы, индексы и данные) в единственном стандартном файле на том компьютере, на котором исполняется программа. Простота реализации достигается за счёт того, что перед началом исполнения транзакции весь файл, хранящий базу данных, блокируется; ACID-функции достигаются в том числе за счет создания файла-журнала.
Защита от подбора пароля пользователя
Проблема подбора паролей является достаточно острой для всех почтовых служб, и NextMail здесь не исключение. Кроме неприятностей, который получит пользователь в случае, когда его пароль подберут, при подборе паролей создается повышенная нагрузка на сервер.
Разработчиками почтового движка NextMail было проведено исследование и выявлено, что если порядка 10 компьютеров запустят программу подбора паролей с помощью перебора, то нагрузка на сервер в этом случае составит порядка 70% его процессорной мощности.
Можно выделить следующие виды подбора паролей:
-
подбор пароля перебором для одного ящика, возможно, с нескольких компьютеров;
-
подбор ящика по словарю к определенному паролю, может вестись с одного компьютера или с нескольких.
Как уже отмечалось, в качестве промежуточного хранения информации о пользователях и IP-адресах серверов в почтовом движке NextMail используется memcached, т.к. он хранит данные в оперативной памяти, что сводит нагрузку на сервер к минимуму. После внедрения алгоритмов защиты от подбора паролей проведенное тестирование показало, что нагрузка на сервер при подборе паролей снизилась до 20%, что позволило проводить дальнейшую обработку запросов реальных клиентов.
Защита SMTP и POP3 серверов

Схема 11. Алгоритм защиты от подбора пароля для POP3 и SMTP служб.
В случае отсутствия защиты от подбора паролей по словарю при распределенной атаке на сервер создается довольно большая нагрузка. С данным алгоритмом после определенного количества неудачных попыток авторизации блокируется или ящик пользователя, к которому подбирается пароль, или IP-адрес, с которого ведется атака – все зависит от того, какое ограничение сработает раньше. После такой блокировки зайти в ящик с данного IP можно только через веб-интерфейс или после окончания времени блокировки.
Таким образом, при распределенной атаке с течением некоторого времени все IP-адреса, с которых ведется атака, блокируются, т.е. атака заканчивается неудачно.
Защита веб-интерфейса

Схема 12. Алгоритм защиты от подбора пароля в веб-интерфейсе почты.
Если пользователь определенное число раз ввел неправильные данные, то ему придется кроме логина и пароля указывать код с картинки – для обычного пользователя это не является большой проблемой, а подбор пароля при помощи программ подбора паролей уже работать не будет. Если ведется распределенная атака с нескольких IP-адресов, то в течение некоторого времени придется вводить картинку со всех IP-адресов, и алгоритм подбора пароля работать не будет.
Анализ работы серверов после модернизации ПО
После модеринизации программного обеспечения NextMail Server была проведена оценка различных изменений производительности серверов по следующим параметрам:
-
Изменение средней скорости доставки сообщений
-
Среднее время загрузки страниц сайта
-
Нагрузка на сервер (load average – LA)
Средняя скорость доставки сообщений
Для средней скорости доставки сообщений до проведения модернизации почтового движка NextMail были получены следующие результаты:
-
Средний LA при обработке большого объема писем: 8,12 ± 0,25
-
Среднее время обработки писем: 51,42 ± 3,73 мс
До проведения модернизации программного обеспечения результаты были следующими:
- Средний LA при обработке большого объема писем: 11,41 ± 0,32
- Среднее время обработки писем: 130,94 ± 4,61 мс
После проведения оптимизаций на этапе доставки почты было получено уменьшение времени доставки письма с 130,94 мс до 51,42 мс, т.е. примерно пропускная способность сервера увеличилась в 2,55 раза. Нагрузка на сервер уменьшилась с 11,41 до 8,12, примерно в 1,4 раза, причем данные тесты проводились на виртуальной машине, а не на рабочем многопроцессорном сервере, поэтому в реальных условиях разница в производительности еще более высокая, т.к. Linux достаточно хорошо распараллеливает процессы при наличии минимум 3-х процессоров.
Оценка времени отображения страниц веб-интерфейса
Анализ проводился путем замеров скорости отображения страниц на виртуальной машине. По результатам замеров времен отображения различных страниц сайта были вычислены математические ожидание и стандартное отклонение времени отображения страницы. С применением критерия согласия было получено следующее время обработки страницы с применением оптимизаций: 0,5188 ± 0,0926 секунд.
До применения оптимизаций среднее время обработки страницы на виртуальной машине было 1,5563 секунд, и это без учета того, что в системе одновременно бывает несколько пользователей – т.е. тестирование не учитывало одновременную работу с базой данных нескольких человек (для модифицированного интерфейса этот фактор практически не имеет значения, т.к. пользователь работает с локальной базой данных, но имеет значение для старого интерфейса). Но и без учета данных факторов можно сделать вывод, что получен прирост примерно в 3 раза, и это без применения аппаратной модернизации – только модернизация программной части.
Выводы
После проведения модернизации программной части почтового сервера NextMail Server удалось достичь следующих результатов:
- Увеличение скорости обработки одного сообщения в 2,5 раза.
- Уменьшение нагрузки на сервер, создаваемый при обработке почты в 1,4 раза.
- Увеличена скорость выдачи страницы пользователю в 3 раза.
- Ликвидированы узкие места в базе данных и в веб-интерфейсе при большом количестве подключенных к серверу пользователей.
- Добавлена защита веб-интерфейса и POP3/STMP серверов от попыток подбора паролей перебором.
- Внешние страницы сайта стали более устойчивыми к DDos атакам из-за того, что кэшируются в файлы и обрабатываются раз в 10 минут.
Таким образом, получено ускорение выдачи страниц пользователю и повышение отказоустойчивости сервера за счет только программной части.
|
|
|