Вы находитесь на странице: 1из 98

№1(38) январь 2006

подписной индекс 20780


www.samag.ru

Вы всё ещё не используете

№1(38) январь 2006


WMI?
Современный Linux-сервер:
как планировать
дисковые ресурсы
Малоизвестные подробности
работы NAT
Резервное копирование
конфигураций активного
сетевого оборудования
Штопаем дыры в Ilohamail
Почтовый сервер
на основе реляционной СУБД
Оцените преимущества!
Создаём кластер
для PostgreSQL
Защищаем Windows-системы
с помощью CORE FORCE
Так видит журнал читатель, который забыл оформить подписку:
№5(30) май 2005
подписной индекс 81655

СЬ
www.samag.ru

ЛИ
Почему MS SQL медленно работает?
ЛИ Ищем причины
ТЯ Е

Ж ПИ
Строим защищенную беспроводную сеть:
ЗА ДНИ

WPA-Enterprise, 802.1x EAP-TLS


НУ

РА КУ
Настраиваем UPS под Linux
ЛЫ ГО

ТИ РАС
Как восстановить
удаленные файлы под BSD
КУ ВО

Что важно знать об IP-телефонии

РО
танавливаем Symantec Antivirus 9.0
НИ НО

в корпоративной сети

СТ
Эффективно управляем
полями пользователей в AD

БЫ
Контролируем безопасность сети
с помощью OSSIM
КА

Интервью с Ларри Уоллом –


создателем языка Perl

И
ЬГ
ЬД О
РА СКА
ТЕ
К

ИС НН
ЕН
УС

БО
НА ТПУ

ИЛ ДА
ТП

НЧ ЖИ
ВО

РА Е О

КО ЕО
АВ СЛ
Л

Л
ХА

ЗА Н
ПО
УЕ

Так видит журнал читатель, оформивший подписку:


№5(30) май 2005
подписной индекс 81655
www.samag.ru

Почему MS SQL медленно работает?


Ищем причины
Строим защищенную беспроводную сеть:
WPA-Enterprise, 802.1x EAP-TLS
Настраиваем UPS под Linux
Как восстановить
удаленные файлы под BSD
Что важно знать об IP-телефонии
танавливаем Symantec Antivirus 9.0
в корпоративной сети
Эффективно управляем
полями пользователей в AD
Контролируем безопасность сети
с помощью OSSIM
Интервью с Ларри Уоллом –
создателем языка Perl

ПОДПИШИТЕСЬ И ЧИТАЙТЕ!
Роспечать – 20780, 81655
Пресса России – 87836
Интер-почта – тел. (095) 500-00-60
оглавление

3 ТЕНДЕНЦИИ СЕТИ
АДМИНИСТРИРОВАНИЕ 48 Малоизвестные подробности работы NAT
NAT, поистине, спасение для системного администра-
4 Вы всё ещё не используете WMI? тора, когда нужно быстро подключить к Интернету ло-
Часть 1 кальную сеть. Но всё ли вы о нём знаете?
Основы, необходимые для эффективного использова- Ильяс Кулиев
ния технологии Windows Management Instrumentation, ilia@kuliev.org
и набор рецептов по ее применению в реальных ус-
ловиях. БЕЗОПАСНОСТЬ
Константин Леонтьев
klеоnt@miсrоsоft.соm 54 Защищаем Windows-системы с помощью
CORE FORCE
12 Делаем резервное копирование CORE FORCE – яркий пример того, как можно защи-
конфигураций активного сетевого тить систему, не зная ничего об угрозе.
оборудования Сергей Яремчук
Пример сценария для резервного копирования, напи- grinder@ua.fm
санный на языке Perl.
Андрей Бирюков 60 Расширяем возможности MailScanner
mex_inet@rambler.ru Обзор дополнительных программ, позволяющих про-
смотреть статистику работы системы защиты элект-
16 Современный Linux-сервер: ронной почты. Сергей Яремчук
как планировать дисковые ресурсы grinder@ua.fm
Можно заниматься математическим предсказанием
увеличения объема информации в сети, а выгоднее 66 Судьба shell-кода на системах
использовать технологии хранения, которые позволят с неисполняемым стеком
вам оперативно масштабировать дисковое пространс- Отчаявшись справиться со своими же ошибками, ком-
тво и резервировать данные. пания Microsoft совместно с Intel и AMD реализова-
Алексей Барабанов ла технологию DEP, призванную покончить с удален-
alekseybb@mail.ru ными атаками, но этого не произошло и защиту уда-
лось обойти. Крис Касперски
22 Почтовый сервер на основе реляционной kk@sendmail.ru
СУБД. Оцените преимущества!
Используем DBMail – малоизвестный, но очень эффек-
тивный инструмент для построения сложных и масш- ПРОГРАММИРОВАНИЕ
табируемых почтовых систем, позволяющий приме-
нять реляционные СУБД в качестве серверного хра- 76 Переходим от VBScript к ASP и ASP.NET:
нилища почтовых сообщений вместо традиционных Безопасность и синтаксис
текстовых. Некоторые скрипты на VBScript настолько усложняют-
Евгений Прокопьев ся, что их трудно использовать без графического ин-
eugene_prokopiev@mail.ru терфейса. Оптимальное решение – создать веб-при-
ложение на ASP, ASP.NET.
32 Штопаем дыры в Ilohamail Иван Коробко
Доступ к электронной почте через веб-интерфейс обес- ikorobko@prosv.ru
печивает дополнительные удобства. Но мы не всег-
да задумываемся о потенциальных проблемах бе- IMHO
зопасности, а ведь даже такой безобидный пакет,
как Ilohamail, имеет несколько неприятных дыр. 82 Электронная почта как источник
Сергей Супрунов повышенной опасности
amsand@rambler.ru Не многие задумываются о том, к каким последствиям
может привести небрежное отношение к своему поч-
35 Строим мультидоменный почтовый товому ящику. Сергей Супрунов
сервер с защитой от вирусов и спама amsand@rambler.ru
Система полностью построена на свободном про-
граммном обеспечении: Exim + MySQL + TLS + AUTH + РЕТРОСПЕКТИВА
Courier-Imap + DSPAM + SquirrelMail + ClamAV.
Павел Семенец 84 Сломленная, но не сдавшаяся:
darkman@rusgate.org история операционной системы BeOS
Часть 2
44 Создаём кластер для PostgreSQL Дмитрий Мороз
Мощная СУБД, способная легко конкурировать с таки- akuji@list.ru
ми гигантами, как Oracle и MS SQL. Но, к сожалению,
в ней отсутствует возможность репликации. Что делать, 92 КНИЖНАЯ ПОЛКА
если такая опция необходима?
Андрей Тренин
my_zone@mail.ru 53, 65, 85 BUGTRAQ

№1, январь 2006 1


г. Москва, Хлебный переулок 2/3
тел. 29-161-32, 202-61-43
(круглосуточно)
e-mail: support@redline.ru

Íàøà êîìïàíèÿ 12 ëåò ïðåäîñòàâëÿåò ëèíèè ñâÿçè


â ñàìûõ íåïðîõîäèìûõ ìåñòàõ Ìîñêâû.
10 Ìáèò - $500, âêëþ÷åíî ÌÍÎÃÎ òðàôèêà.
Anything else?

Çâîíèòå, äîãîâîðèìñÿ!
;-)
тенденции
Вышла NetBSD 3.0 Основная цель русского сайта – работа над локализа-
В конце 2005-го года состоялся релиз новой версии по- цией vtiger CRM (уже сейчас можно скачать версию 0.82 ба-
пулярной операционной системы с открытым кодом – зовой русской локализации для vtigerCRM 4.2 в кодировке
NetBSD 3.0. UTF-8) и поддержка русскоязычных пользователей.
Среди ключевых отличий между NetBSD 2.0 и 3.0 мож-
но выделить: Covalent поддержала Geronimo
 работа ОС на платформе iyonix; Компания Covalent, специализирующаяся на программном
 порт xen начал поддержку Xen 2.0; обеспечении с открытым кодом, объявила о начале под-
 поддержка технологии Enhanced SpeedStep Technology держки Geronimo – свободного сервера Java-приложений
(в i386); от организации Apache.
 добавлено устройство ptm(4); Covalent уже распространяет серверное программное
 программный watchdog timer – swwdog(4); обеспечение с открытым кодом, предназначенное для ра-
 интеграция OpenBSD PF (Packet Filter) как альтернатив- боты как с главным продуктом Apache – одноименным веб-
ного фильтра пакетов; сервером, так и другими его свободными разработками,
 появление псевдотерминальной файловой системы среди которых сервер приложений Apache Tomcat и сер-
ptyfs; вер веб-сервисов Apache Axis. Компания продает услуги
 поддержка больших файлов (более 2 Гб) в ext2fs; по технической поддержке на базе подписки.
 появление PAM; обновления в программном обеспече- По словам Марка Брюера (Mark Brewer), исполнитель-
нии. ного директора (CEO) Covalent, компания приняла реше-
ние расширить поддержку на Apache Geronimo в связи
OpenSUSE установили на 750 тысяч ПК с растущим спросом со стороны своих корпоративных за-
Представители компании Novell сообщили о первых успе- казчиков.
хах инициативы OpenSUSE.org: за первые 6 месяцев своего «Компании на протяжении определенного времени рас-
существования зафиксировано более 750 тысяч инсталля- сматривали различные пути ухода с серверного ПО с за-
ций бесплатной версии Linux-дистрибутива на ПК. крытым кодом. Мы заметили огромное количество людей,
Запуск веб-сайта проекта OpenSUSE состоялся в авгус- оставивших Weblogic от BEA Systems и WebSphere от IBM
те 2005 года. Тогда на выставке LinuxWorld в Сан-Францис- и мигрировавших на Tomcat», – пояснил Брюер.
ко и была официально анонсирована сама инициатива.
OpenSUSE предоставляет бесплатный доступ к свобод- Составил Дмитрий Шурупов
ным сборкам и Linux-релизам от Novell. Благодаря сообщес- по материалам www.nixp.ru
тву Open Source и разработчикам создается основа, в том
числе и для корпоративных продуктов компании.

Представлен черновой вариант GPLv3


16 января организация Free Software Foundation (FSF) пред-
ставила первый черновой вариант новой – третьей – вер-
сии свободной лицензии GNU GPL.
Про обсуждавшиеся и обещанные темы DRM (Digital
Restrictions Management) и патентов на программное обес-
печение сообщается даже в преамбуле к лицензии, где ав-
торы проекта однозначно выносят свой вердикт: «DRM фун-
даментально не совместимо с GPL», а «любой программе
постоянно угрожают патенты на программное обеспечение».
Другого отношения, разумеется, и не стоило ожидать.
Полный нынешний «набросок» будущего мира Open
Source доступен для ознакомления на http://gplv3.fsf.org/draft.
На этом же сайте можно и высказать свои комментарии
к увиденному, обсудить спорные моменты – в общем,
все в соответствии с принципами и обещаниями Ричар-
да Столлмана.

Vtiger CRM переводят на русский


23 я н в а р я с о с то я л с я з а п ус к рус с ко г о в е б - с а й т а
(www.vtiger.ru), посвященного vtiger CRM.
ПО vtiger CRM в работе основывается на веб-сервере
Apache, СУБД MySQL и языке программирования PHP. Рас-
пространяется в версиях для Linux, Windows и в исходниках.
CRM оснащена плагинами для Microsoft Outlook, Microsoft
Word и Mozilla Thunderbird.

№1, январь 2006 3


администрирование

Вы всё ещё не используете WMI?


Часть I
Если ты один из большинства админов, ты частенько грустишь,
выглядывая из окна и наблюдая, как некоторые твои собратья
ездят на своих «Ягуарах» и «Порше» или готовятся дернуть
в Монте-Карло или какое-нибудь другое экзотическое место.
И, конечно же, ты говоришь себе: «Я знаю о системном
администрировании столько же, сколько и они, но почему
именно у них есть клёвые тачки, яхты и часы «Ролекс»».
Что ж, мы здесь для того, чтобы приоткрыть тебе небольшой секрет.
Это все потому, что они знают, как писать WMI-скрипты, а ты – нет!

Microsoft TechNet:
Bob Wells, Dean Tsaltas, Ethan Wilansky и Greg Stemp
http://www.microsoft.com/technet/scriptcenter/tools/wmimatic.mspx

Константин Леонтьев

Начиная карьеру системного администратора, вы, вероятно, и не задумывались о том,


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

4
администрирование
Для кого предназначается эта статья?
Вероятнее всего, вы уже немного знакомы с WMI на практи-
ке и используете некоторые готовые сценарии WMI для ре-
шения повседневных задач. Но, согласитесь, что эффек-
тивное использование технологии начинается только тог-
да, когда вы понимаете ее архитектуру и четко представ-
ляете весь спектр возможностей, которые эта технология
может вам предоставить.
Основная моя цель – кратко изложить основы, необхо-
димые для эффективного использования вами этой техно-
логии и представить вам набор рецептов по ее примене-
нию в реальных условиях.
Вы получите практический навык работы со всеми ос-
новными средствами WMI, выполнив несколько простых,
но весьма полезных упражнений. Я предполагаю, что вы не-
много знакомы с программированием на VBScript и с азами
языка SQL, а также имеете общее представление об объ-
ектно-ориентированном программировании. Обратите вни- Рисунок 1. Архитектура WMI
мание на готовые примеры кода, которые помогут вам в ва-
шей работе. этих процедур оформляется, как WMI Provider – специаль-
ная библиотека, являющаяся мостом между любым прило-
Что такое WMI? жением и ядром службы WMI.
Формально: аббревиатура WMI – это Windows Management Таким образом, WMI – это открытая унифицированная
Instrumentation (инструментарий управления Windows). библиотека (репозиторий) однотипных интерфейсов досту-
Из этого названия понятно, для чего создана и применяет- па к параметрам, настройки и свойствам различных сис-
ся эта технология. Стоит лишь добавить, что она давно пе- тем и их компонентов.
решагнула рамки управления только операционной систе- Архитектура WMI представлена на рис. 1.
мой Windows и позволяет контролировать множество дру- Многие производители программного и аппаратного
гих совместимых с ней приложений. обеспечения ведут разработку ПО в соответствии со стан-
По своей сути WMI – это расширенная и адаптирован- дартом WBEM. Как следствие, это ПО совместимо и с WMI,
ная компанией Microsoft реализация стандарта WBEM а значит, может управляться через единый и удобный ин-
(Web-Based Enterprise Management компании DMTF Inc [1]). терфейс.
В основе WBEM лежит идея создания универсального ин-
терфейса мониторинга и управления к различным систе- Классы, объекты, свойства и методы
мам и компонентам распределенной информационной сре- Поскольку WMI построена по объектно-ориентирован-
ды предприятия с использованием объектно-ориентирован- ному принципу, то все данные об операционной системе,
ной идеологии и широко распространенных веб-техноло- ее свойствах, управляемых приложениях и обнаружен-
гий представления информации: протоколов XML и HTTP. ном оборудовании представлены в виде объектов. Каж-
Стандарт WBEM является правопреемником стандарта DMI дый тип объекта описан классом, в состав которого входят
(Desktop Management Interface). свойства и методы. Определения классов описаны в MOF-
В основе структуры представления данных в стандарте файлах, а объекты этих классов с заполненными свойс-
WBEM лежит CIM (Common Information Model – модель ин- твами и доступными методами при их вызове возвраща-
формации общего типа), реализующая объектно-ориен- ются WMI-провайдерами. Управляет созданием и удале-
тированный подход к представлению компонентов систем нием объектов, а также вызовом их методов служба CIM
как классов со своим набором свойств и методов, а также Object Manager.
принципов наследования. Получается, что если мы хотим управлять настройками
Основное средство для описания новых элементов мо- сетевого адаптера, то мы должны запросить у CIM Object
дели CIM – это синтаксис языка Managed Object Format Manager экземпляр объекта нужного нам сетевого адап-
(MOF), который является текстовым и легко понятным че- тера (забегая вперед, скажу, что этот объект принадле-
ловеку. Таким образом, любое приложение или драйвер жит классу Win32_NetworkAdapterConfiguration) и вызвать
в операционной системе, которая поддерживает стандарт нужные нам методы. В частности, для того чтобы обновить
WBEM, может добавить к системной модели CIM свой на- аренду адреса на DHCP сервере, достаточно вызвать ме-
бор классов. Такое расширение модели CIM позволяет лег- тод RenewDHCPLease экземпляра объекта Win32_Network
ко интегрировать в единую систему мониторинга и управ- AdapterConfiguration.
ления все новые и новые приложения. Для этой интегра-
ции приложение должно лишь зарегистрировать свои клас- Обзор средств работы с WMI
сы в существующей модели CIM и обеспечить стандартные для администратора
вызовы встроенных процедур для создания объектов этих Начнем фактическое знакомство с WMI с обзора ути-
классов и наполнения их свойствами и методами. Набор лит, которые позволяют вам работать с WMI на ОС се-

№1, январь 2006 5


администрирование

Рисунок 2. Основное окно утилиты Рисунок 4. Основное окно утилиты


WBEMTEST WBEMTEST после подключения
к репозиторию WMI

Рисунок 3. Окно настройки подключения


к репозиторию WMI утилиты WBEMTEST

Рисунок 6. Окно результатов запроса


Рисунок 5. Окно свойств класса со списком всех классов WMI Рисунок 7. Окно свойств экземпляра
Win32_OperatingSystem пространства имен CIMv2 объекта класса Win32_OperatingSystem

мейства Windows. Условно разделим  mofcomp.exe – компилятор MOF-  Tweakomatic Utility – у тилита
этот набор утилит на поставляемые файлов. Служит для расширения в формате Hyper Text Application
с операционной системой по умол- репозитория WMI и тонких опера- (HTA). Содержит множество на-
чанию и набор утилит, которые пот- ций с библиотекой классов WMI, строек системы, обычно доступных
ребуется скачивать с сайта компа- а также для «ремонта» нарушен- через утилиты-твикеры (например,
нии Microsoft. ного репозитория. Windows XP Power Toys TweakUI),
К первой категории относятся сле- для которых позволяет сгенериро-
дующие утилиты: Ко второй категории средств для вать WMI-скрипты для их автомати-
 wmimgmt.msc – оснастка консоли работы с WMI, которые требуется до- ческой настройки. Весьма полезна
MMC, позволяющая в целом управ- полнительно устанавливать, отно- при разработке сценариев автома-
лять самой системой WMI на вы- сится: тизированной установки и настрой-
бранном компьютере.  WMI Code Creator 1.0 – очень удоб- ки [5].
 Winmgmt.exe – консольная ути- ная и полезная утилита для созда-
лита управления WMI. Выполняет ния готовых сценариев WMI. Под- Все утилиты, относящиеся ко вто-
аналогичные действия, что и кон- держивает языки Visual Basic Script, рой категории, можно бесплатно
соль MMC wmimgmt.msc. Кроме то- C# и Visual Basic .NET [2]. скачать с сайта компании Microsoft
го, является исполняемым файлом  WMI Administrative Tools – комп- по ссылкам, перечисленным в кон-
сервиса WMI в системе. Для запус- лект средств в составе: WMI CIM це статьи. Полезно будет так же посе-
ка из консоли используется с опци- Studio, WMI Event Registration, WMI тить раздел загрузки средств работы
ей /exe (winmgmt.exe /exe). Event Viewer и WMI Object Browser). со скриптами [6] и общий раздел за-
 Wbemtest.exe – графическая ути- Удобная среда разработки и тес- грузки средств работы с WMI [7].
лита для интерак тивной рабо- тирования WMI-классов и мето- Для того чтобы рассмотреть воз-
ты с WMI. Удобна для тестирова- дов [3]. можности и особенности всех средств
ния классов и методов, просмотра  Scriptomatic 2.0 – мастер в фор- работы с WMI, которые перечисле-
свойств и т. п. мате Hyper Text Application (HTA). ны выше, не хватит и целого журна-
 Wmic.exe – консольная утилита для Удобна д ля создания готовых ла, поэтому мы кратко остановимся
вызова объектов и методов WMI сценариев и на различных скрип- на некоторых из них, на мой взгляд,
(WMI Console) – присутствует толь- товых яз ыка х. Под держив ает наиболее полезных и (или) наибо-
ко в Windows XP и Windows Server Visual Basic Script, Perl, Java Script лее употребимых. Собственно, к та-
2003. и Python [4]. ким я отношу следующие утилиты:

6
администрирование
WBEMTEST, WMIC, WMI Administrative ке экземпляров операционных сис-
Tools и довольно новую, но весьма по- тем. В открывшемся окне свойств эк-
лезную и удачную утилиту WMI Code земпляра операционной системы най-
Creator 1.0. ти свойство («Property») с названием
Надо отметить, что существуют «Name», как это показано на рис. 7.
и другие утилиты и средства рабо- И дважды кликнуть по нему кур-
ты с WMI, в том числе разработанные сором мыши. В открывшемся окне ре-
не компанией Microsoft, однако формат дактора свойств, которое, показано
статьи не позволяет нам на них оста- на рис. 8, скопировать отображаемое
навливаться сколько-нибудь подроб- значение в буфер обмена. Оно приго-
но. Об одном из этих средств я считаю дится нам в дальнейшем.
своим долгом хотя бы упомянуть в этой Далее закройте все окна, кроме Рисунок 8. Окно со значением свойства
Name экземпляра объекта класса
статье – это ADSI Scriptomatic [8], поз- основного окна программы wbemtest. Win32_OperatingSystem
воляющее создавать скрипты для уп- В блокноте отредактируйте строку из
равления службой каталогов Microsoft буфера обмена следующем образом:
Active Directory.  Заключите строку в кавычки.
Все примеры в этой статье про-  До первых кавычек добавьте сле-
тестированы на операционной систе- дующий текст: «Win32_Operating-
ме Windows XP Service Pack 2, одна- System.Name=».
ко должны также корректно работать  Замените все одинарные обратные Рисунок 9. Окно вызова метода
и на более ранних версиях OS Windows слеши на двойные. для экземпляра объекта класса
Win32_OperatingSystem утилиты WBEMTEST
вплоть до Windows 2000. Если вам пот-
ребуется использовать WMI на более В итоге у вас должна получиться
ранних версиях ОС Windows, то вам примерно следующая строка (в зави-
необходимо будет установить WMI симости от версии ОС и логического
Core Components 1.5 [9] и последнюю диска, куда она установлена):
версию Windows Scripting Host [10, 11]
на эти ОС. Win32_OperatingSystem.Name= ↵
"Microsoft Windows XP ↵
Professional|C:\\WINDOWS|\\ ↵
Знакомимся с утилитой Device\\Harddisk0\\Partition1"
WBEMTEST
Для того чтобы прямо сейчас посмот- Теперь давайте выполним следую-
реть, какой набор классов определен щее упражнение с утилитой wbemtest.
в репозитории WMI на вашем персо- В уже открытом окне утилиты wbemtest
нальном компьютере, достаточно за- нажмем кнопку «Execute Method…»
пустить утилиту wbemtest.exe и уста- и в окошко «GetObjectPath» вста-
новить флажок «Enable All Privileges», вим строку, которую мы подготови-
как показано на рис. 2. ли в блокноте. В появившемся окне
Далее нажать кнопку «Connect…», (см. рис. 9) вызова метода экземпля- Рисунок 10. Окно подключение
к пространству имен WMI с явным
в поле пространства имен вписать root\ ра объекта выберем метод Reboot и на- указанием имени сервера
CIMv2, как это показано на рис. 3, и на- жмем кнопку «Execute!».
жать кнопку «Connect». Поздравляю, вы только что отпра- нее! Для подключения к удаленной ма-
Затем нажмите кнопку «Enum вили свою операционную систему в пе- шине в окне подключения достаточно
Classes…», выберите «Recursive», не резагрузку, используя WMI. Если вы в поле Name Space указать строку ви-
заполняйте поле суперкласса и на- вдруг получили вместо перезагруз- да \\<computername>\root\CIMv2 и ука-
жмите «Ok». В результате вы получи- ки сообщение об ошибке 0x80041062 зать учетные данные пользователя,
те список классов, определенный в ва- «Privilege not held», то это означает, что обладающего необходимыми права-
шем репозитории WMI, в пространстве вы забыли установить опцию «Enable ми (например, Administrator). Пример
имен CIMv2. Найдите среди всех класс All Privileges» до подключения к репо- этого показан на рис. 10.
с названием Win32_OperatingSystem зиторию WMI. Не пробуйте подключаться к ло-
(CIM_OperatingSystem), как это пока- Теперь в довершение следует ска- кальной машине, на которой запра-
зано на рис. 6. зать (пока ваш Windows перезагру- шиваются объекты и методы WMI (на-
Дважды щелкнув курсором мы- жается), что при подключении к про- пример, на той, на которой сейчас вы-
ши по классу Win32_OperatingSystem, странству имен WMI вы можете под- полняется утилита wbemtest), исполь-
посмотреть его свойства. Пример того, ключаться не только на локальной зуя отличные от текущих учетные дан-
как это выглядит, показан на рис. 5. машине, но и как следует из обзора ные – все равно это у вас не получит-
Далее нажать кнопку «Instances» WMI к любой удаленной. Главное, об- ся. Это специальная защита для повы-
и в открывшемся окне дважды щелк- ладать на той машине необходимы- шения локальной безопасности WMI,
нуть курсором мыши по строке в спис- ми правами. Но об этих правах позд- но о ней мы поговорим позже.

№1, январь 2006 7


администрирование
Теперь список процессов ограничен только теми про-
цессами, в имени исполняемого модуля которых при-
сутствует строка «cmd.exe». Обратите внимание на PID
процесса(ов).
Теперь давайте попробуем отобрать интересующие нас
процессы, используя непосредственно WMI и не прибе-
гая к стандартным средствам командной строки. Для это-
го просто напишите:

wmic process where description='cmd.exe' list brief

Сравните полученные результаты. Запомните PID про-


Рисунок 11. Командное окно с запущенной утилитой WMIC
в интерактивном режиме цесса CMD.EXE.
Теперь давайте вызовем метод Terminate для экземпляра
Изучаем работу утилиты WMIC объекта WMI. Так мы завершим интересующий нас процесс
Для того чтобы воспользоваться этой очень важной и по- в системе. Для того чтобы однозначно определить процесс,
лезной для администратора утилитой, достаточно запустить который мы хотим завершить, нам нужно использовать его
интерпретатор командной строки cmd.exe и в строке при- PID или какой-либо другой набор атрибутов процесса, кото-
глашения набрать WMIC. После этого у вас появится при- рые позволяют его однозначно отличить от множества дру-
глашение консоли WMI, как это показано на рис. 11. гих процессов в системе. Для завершения процесса нам
Для получения справки по всем командам, доступ- нужно вызвать метод WMI. Для этого существует команда
ным из консоли WMIC, достаточно в строке приглашения CALL. Для того чтобы вывести справку по всем методам,
ввести команду «/?». Синтаксис каждой команды или гло- применимым к объектам типа PROCESS (Win32_Process),
бальной опции вы можете посмотреть, введя ее название наберите команду:
и знак вопроса.
Например: wmic process call /?

process list /? Среди них обратите внимание на метод Terminate –


он принимает в качестве единственного входного парамет-
Так мы работаем с утилитой WMIC в интерактивном ре- ра значение типа UINT32 (беззнаковое 32-разрядное целое)
жиме. Однако ничто не мешает нам использовать ее и в па- в качестве индекса причины завершения процесса. В дан-
кетном режиме из наших BAT/CMD-сценариев. Например, ном случае этот параметр аналогичен Exit-коду.
в приглашении командной строки CMD можно написать: Запустите четыре разных экземпляра процесса
cmd.exe (откройте 4 командных окна). Еще раз выполни-
wmic process list /? те команду:

и получить тот же результат. wmic process where description='cmd.exe' list brief


Утилита WMIC создана для удобства использования WMI
прямо из командной строки, поэтому наиболее употреби- В результате вы получите в ответ примерно следую-
мые классы WMI доступны для использования под псев- щее:
донимами (ALIAS). Вы можете самостоятельно определить
HandleCount Name Priority ProcessId ThreadCount WorkingSetSize
псевдонимы для тех классов, для которых это еще не сде- 28 cmd.exe 8 4648 1 2494464
лано, или добавить новые псевдонимы для тех классов WMI, 28 cmd.exe 8 5156 1 2498560
28 cmd.exe 8 4940 1 2498560
которые уже их имеют. 31 cmd.exe 8 612 1 2703360
Список псевдонимов, которые определены на Windows
XP Service Pack 2 по умолчанию с их кратким описанием, Итак, чтобы завершить конкретный процесс, просто на-
приведены в таблице 1. берите:
Теперь давайте попробуем использовать утилиту WMIC
для работы с WMI из командной строки. Для начала выйди- wmic process where processid='****' call terminate(0)
те из интерактивного режима консоли WMIC командой exit.
Вы оказались в среде командного интерпретатора CMD. вместо звездочек укажите PID нужного вам экземпляра
В приглашении наберите команду: процесса cmd.exe.
Теперь давайте одной командой завершим все остав-
wmic process list brief шиеся процессы cmd.exe, для этого просто введите ко-
манду:
Вы получите список процессов, запущенных на вашем
локальном компьютере. Теперь выполните команду: wmic process where description='cmd.exe' call terminate(0)

wmic process list brief | find "cmd.exe" Что за конструкция where и как еще ее можно исполь-

8
администрирование
зовать, мы разберем чуть позже в разделе «Язык запро-
сов WQL».
Для того чтобы подключиться к репозиторию WMI
на другом компьютере и выполнять все те же действия,
при условии, что наша учетная запись обладает достаточ-
ными правами, нам всего лишь нужно немного модифи-
цировать нашу командную строку. Теперь наши команды
должны выглядеть примерно так:

wmic /NODE:server01 /USER:DOMAIN\Administrator ↵


/PASSWORD:qwerty /PRIVILEGES:ENABLE process where ↵
description='cmd.exe' list brief

Если же вы хотите выполнить какие-то действия, ис-


пользуя WMI не с одним, а с целой группой компьютеров,
то достаточно написать команду с использованием WMIC
и ключом «/node:@serverslist.txt»:
Рисунок 12. Окно утилиты WMI CIM Studio с открытыми
wmic /NODE:@serverslist.txt /USER:DOMAIN\Administrator ↵ свойствами класса Win32_OperatingSystem
/PASSWORD:qwerty /PRIVILEGES:ENABLE process ↵
where description='cmd.exe' list brief WMI CIM Studio очень удобный инструмент для поис-
ка классов и свойств в огромном море репозитория WMI.
В файле serverlist.txt в столбец или в строку должны быть Для поиска нажмите кнопку со значком бинокля и введи-
перечислены имена (IP-адреса) хостов, на которых необхо- те шаблон для поиска, например «network». Выберите об-
димо выполнить это действие. ласть поиска (Class names, Class description, Property names)
В довершение краткого описания утилиты WMIC, следу- и нажмите «Go!». В целом WMI CIM Studio очень хороший
ет сказать об еще одной, поистине замечательной, ее осо- инструмент для поиска и исследования репозитория WMI
бенности – форматировании вывода. Практически все ко- и для интерактивного анализа состояния экземпляров объ-
манды WMIC, которые возвращают информацию, могут ее ектов WMI.
форматировать разными способами. Для этого использу-
ется ключ «/format:<frmt>». Форматирование производит- Язык запросов WQL
ся с использованием технологии XSLT (шаблонов для пре- Теперь нам следует разобраться, что же такое WQL, а так-
образования XML). По умолчанию уже определен ряд гото- же каким образом в разделе, где описана работа WMIC,
вых преобразований: CSV, HFORM, HMOF, HTABLE, HXML, мы делали выборку объектов WMI по определенным кри-
RAWXML, TABLE, VALUE. Вы так же сами можете опреде- териям. Разбирая эту тему, полезно вспомнить, что объек-
лить дополнительные шаблоны форматирования в форма- тно-ориентированная модель представления данных хоро-
те XSLT и использовать их совместно с WMIC. шо ложится на структуру реляционных баз данных. В час-
тности можно провести следующие аналогии: определе-
Краткое практическое знакомство ние таблицы данных (поля и их типы) – это классы объек-
c WMI CIM Studio тов, строки в конкретной таблице – это экземпляры объ-
Это набор приложений Microsoft Internet Explorer, который ектов данного класса. Каждое поле (столбец) в таблице –
позволяет с одной стороны очень тонко, с другой сторо- это свойство всех объектов данного класса. Каждая ячей-
ны довольно удобно работать с WMI. При этом вы можете ка в конкретной строке – это свойство (property) конкрет-
как просматривать классы и вызывать методы, так и со- ного экземпляра объекта. Связи таблиц и представления
здавать события и даже модифицировать репозиторий можно рассматривать как частный случай наследования.
WMI. Поэтому будьте очень осторожны. Если вы запускае- Триггеры и встроенные процедуры исходя из этой анало-
те WMI CIM Studio на Windows XP Service Pack 2, то Internet гии – это методы классов.
Explorer предупредит вас о потенциальной угрозе безопас- Собственно, для того чтобы удобно было работать с мно-
ности. Вам следует разрешить заблокированное содержи- жественными экземплярами объектов WMI, используется
мое ActiveX. язык WMI Query Language (WQL), который является под-
На рис. 12 показан вид окна WMI CIM Studio. Слева вы множеством ANSI SQL.
видите набор классов WMI и их иерархии в том пространс- Основное отличие WQL от ANSI SQL состоит в том, что
тве имен WMI, которое вы выбрали при подключении. Спра- WQL не позволяет производить изменения в данных WMI,
ва перечислены все свойства выбранного класса. Все ме- т.е. фактически в WQL поддерживается лишь один опера-
тоды класса перечислены на закладке Methods, а на за- тор SQL: select. Кроме того, в операторе select языка WQL
кладке Associations показана «родословная» этого класса не поддерживаются следующие ключевые слова: DISTINCT,
и других классов, которые выведены из него. COUNT, JOIN, SUBSTRING, ORDER BY, UPPER, LOWER
Если вы хотите посмотреть все экземпляры объектов и DATEPART (эти ключевые слова поддерживаются в ва-
выбранного класса, существующие в вашей системе, то до- рианте Extended WQL (eWQL), реализованном в Microsoft
статочно нажать кнопку со значком списка (четвертая спра- SMS 2.0 и SMS 2003). Не поддерживаются арифметичес-
ва кнопка в правой панели кнопок). кие операторы. Кроме того конструкции IS и IS NOT могут

№1, январь 2006 9


администрирование
Таблица 1. Список псевдонимов утилиты WMIC и соответствие их классам WMI применяться только в сочетании с кон-
Псевдоним Описание Имя клсса WMI стантой NULL. Языком WQL поддержи-
Base board (also known as a motherboard вается оператор LIKE. Более подробно
BASEBOARD Win32_BIOS
or system board) management про шаблоны, применяемые совместно
BIOS Basic input/output services (BIOS) management Win32_BaseBoard с оператором LIKE в WQL, можно оз-
BOOTCONFIG Boot configuration management Win32_BootConfiguration накомиться в оригинальном описании
CDROM CD-ROM management Win32_CDROMDrive WMI на сайте Microsoft [12, 13].
Ниже приведен пример некоторых
COMPUTERSYSTEM Computer system management Win32_ComputerSystem
типичных WQL-запросов:
CPU CPU management WIN32_PROCESSOR

CSPRODUCT
Computer system product information
Win32_ComputerSystemProduct SELECT * FROM Win32_LogicalDisk ↵
from SMBIOS WHERE FileSystem IS NULL
SELECT * FROM Win32_LogicalDisk ↵
DATAFILE DataFile Management CIM_DataFile
WHERE FileSystem IS NOT NULL
DCOMAPP DCOM Application management WIN32_DCOMApplication SELECT * FROM Win32_LogicalDisk ↵
WHERE FileSystem = "NTFS"
DESKTOP User’s Desktop management WIN32_DESKTOP SELECT * FROM Win32_DiskDrive ↵
WHERE Partitions < 2 ↵
DESKTOPMONITOR Desktop Monitor management WIN32_DESKTOPMONITOR OR SectorsPerTrack > 100
DEVICEMEMORYADDRESS Device memory addresses management Win32_DeviceMemoryAddress SELECT * FROM Win32_LogicalDisk ↵
WHERE (Name = "C:" OR ↵
DISKDRIVE Physical disk drive management Win32_DiskDrive Name = "D:") AND FreeSpace > ↵
2000000 AND FileSystem = "NTFS"
DISKQUOTA Disk space usage for NTFS volumes Win32_DiskQuota SELECT * FROM Win32_NTLogEvent ↵
Direct memory access (DMA) channel WHERE Logfile = 'Application'
DMACHANNEL
management
Win32_DMAChannel SELECT * FROM Meta_Class ↵
WHERE __Class LIKE %Win32%
ENVIRONMENT System environment settings management Win32_Environment SELECT * FROM __InstanceCreationEvent ↵
WHERE TargetInstance ISA ↵
FSDIR Filesystem directory entry management Win32_Directory "Win32_NTLogEvent" GROUP ↵
GROUP Group account management Win32_Group WITHIN 600 BY
TargetInstance.SourceName HAVING ↵
IDECONTROLLER IDE Controller management Win32_IDEController NumberOfEvents > 25
IRQ Interrupt request line (IRQ) management Win32_IRQResource
Вы можете поупражняться в запро-
Providesaccess to the jobs scheduled using
JOB
the schedule service
Win32_ScheduledJob сах WMI с помощью уже хорошо извес-
тной вам утилиты WBEMTEST, нажав
Management of system services that define
LOADORDER Win32_LoadOrderGroup кнопку «Query» в ее главном окне.
execution dependencies
LOGICALDISK Local storage device management Win32_LogicalDisk Теперь вспомните утилиту команд-
LOGON LOGON Sessions Win32_LogonSession
ной строки WMIC, функции которой мы
разбирали немного выше. В ее синтак-
MEMCACHE Cache memory management WIN32_CACHEMEMORY
сисе также могут использоваться WQL-
System memory management
MEMLOGICAL
(configuration layout and availability of memory)
Win32_LogicalMemoryConfiguration запросы для удобства работы с набо-
Computer system’s physical memory
рами объектов одного класса. Чтобы
MEMPHYSICAL Win32_PhysicalMemoryArray использовать уже имеющиеся и про-
management
NETCLIENT Network Client management WIN32_NetworkClient веренные WQL-запросы (большинство
Network login information (of a particular user)
из них удобнее всего проверять утили-
NETLOGIN Win32_NetworkLoginProfile
management той WBEMTEST), из командной строки
Protocols (and their network characteristics) достаточно отбросить у WQL-запроса
NETPROTOCOL Win32_NetworkProtocol
management первую часть: «select * from». Затем за-
NETUSE Active network connection management Win32_NetworkConnection менить имя класса на его алиас (псев-
NIC Network Interface Controller (NIC) management Win32_NetworkAdapter доним) из таблицы 1 и при необходи-
NICCONFIG Network adapter management Win32_NetworkAdapterConfiguration мости добавить после запроса вызов
NTDOMAIN NT Domain management Win32_NTDomain метода, формат вывода списка или за-
NTEVENT Entries in the NT Event Log Win32_NTLogEvent
прос свойства объекта. Примеры того,
что при этом получается, я уже приво-
NTEVENTLOG NT eventlog file management Win32_NTEventlogFile
дил выше.
Management of common adapter devices built
ONBOARDDEVICE
into the motherboard (system board)
Win32_OnBoardDevice Если же среди псевдонимов в таб-
OS Installed Operating System/s management Win32_OperatingSystem
лице 1 нет нужного вам класса, то есть
два пути решения. Первый – добавить
PAGEFILE Virtual memory file swapping management Win32_PageFileUsage
новый псевдоним для нового класса.
PAGEFILESET Page file settings management Win32_PageFileSetting
Этот путь хорош, если с этим классом
Management of partitioned areas of a physical из WMIC вы будете работать только
PARTITION Win32_DiskPartition
disk
на этом компьютере. Если же вы хоти-
PORT I/O port management Win32_PortResource
те использовать команду wmic на раз-
PORTCONNECTOR Physical connection ports management Win32_PortConnector
ных компьютерах, в том числе и на тех,
PRINTER Printer device management Win32_Printer на которых такой алиас вы не опреде-

10
администрирование
ляли, то можно воспользоваться вто- Таблица 1. Список псевдонимов утилиты WMIC и соответствие их классам WMI (продолжение)
рым способом. Второй способ позво- Псевдоним Описание Имя клсса WMI
ляет явно использовать настоящее PRINTERCONFIG Printer device configuration management Win32_PrinterConfiguration
имя класса WMI при обращении к не- PRINTJOB Print job management Win32_PrintJob
му с помощью WMIC. Для этого исполь-
PROCESS Process management Win32_Process
зуйте следующий синтаксис:
PRODUCT Installation package task management Win32_Product
wmic path Win32_LogicalDisk ↵ QFE Quick Fix Engineering Win32_QuickFixEngineering
WHERE FileSystem='NTFS' ↵
get /value QUOTASETTING Setting information for disk quotas on a volume Win32_QuotaSetting
Information that will be gathered from memory
RECOVEROS Win32_OSRecoveryConfiguration
when the operating system fails

Заключение REGISTRY Computer system registry management Win32_Registry

На этом хочу прервать изложение пер- SCSICONTROLLER SCSI Controller management Win32_SCSIController
вой части и, предваряя выход очеред- SERVER Server information management Win32_PerfRawData_PerfNet_Server
ного номера, журнала сообщить вам, SERVICE Service application management Win32_Service
краткое содержание следующей час- SHARE Shared resource management Win32_Share
ти статьи. Management of theelements of a software
SOFTWAREELEMENT Win32_SoftwareElement
Мы обсудим написание сценари- product installed on a system
ев с использованием WMI и WSH. Бу- Management of software product subsets
SOFTWAREFEATURE Win32_SoftwareFeature
дут разобраны особенности исполь- of SoftwareElement

зования WMI в скриптах, из тех, кото- SOUNDDEV Sound Device management WIN32_SoundDevice
рые обычно вызывают наибольшие за- Management of commands that run automatically
STARTUP Win32_StartupCommand
труднения у людей, начинающих рабо- when users log onto the computer system

тать с этой технологией. К таким темам SYSACCOUNT System account management Win32_SystemAccount
я отношу: построение moniker string, ис- SYSDRIVER
Management of the system driver for a base
Win32_SystemDriver
service
пользование различных пространств
имен WMI, связка WMI и COM, исполь- SYSTEMENCLOSURE Physical system enclosure management Win32_SystemEnclosure

зование различных языков программи- Management of physical connection points


SYSTEMSLOT including ports,slots and peripherals, Win32_SystemSlot
рования вместе с WMI, имперсонация, and proprietary connections points
аутентификация и привилегии. Нако- TAPEDRIVE Tape drive management Win32_TapeDrive
нец, наиболее интересные моменты,
Data management of a temperature sensor
связанные с подключением к удален- TEMPERATURE Win32_TemperatureProbe
(electronic thermometer)
ным компьютерам и обработкой сис- TIMEZONE Time zone data management Win32_TimeZone
темных событий с помощью WMI. В за- UPS Uninterruptible power supply (UPS) management Win32_UninterruptiblePowerSupply
ключении мы обсудим готовые продук-
USERACCOUNT User account management Win32_UserAccount
ты, использующие WMI и стратегию
Voltage sensor (electronic voltmeter) data
развития этой технологии, а так же ее VOLTAGE
management
Win32_VoltageProbe
применения в информационных сис- Associates the disk quota setting with a specific
темах предприятий. VOLUMEQUOTASETTING Win32_VolumeQuotaSetting
disk volume
Что ж, надеюсь, что первая часть WMISET WMI service operational parameters management Win32_WMISetting
статьи вас не разочаровала, а про-
должение окажется для вас полезным! 5. Twe a ko m at i c U t i l i t y – h t t p : / / w w w. 10. W i n d o w s S c r i p t i n g H o s t 5 . 6 f o r
До скорой встречи… m i c r o s o f t .c o m / d o w n l o a d s / d e t a i l s . W i n d ows 9 x / N T/ M E – ht t p : / / w w w.
aspx?FamilyID =bd328d1e-6c01-4447- m i c r o s o f t .c o m / d o w n l o a d s / d e t a i l s .
Ссылки и литература: bd7c-c09646d722c8&DisplayLang=en. aspx?FamilyID = 0a8a18f6-249c-4a72-
1. Distributed Management Task Force Inc. – 6. Microsoft Scripting Downloads Catalog – bfcf-fc6af26dc390&DisplayLang=en.
http://www.dmtf.org/home. http://msdn.microsoft.com/downloads/list/ 11. M i c r o s o f t W i n d o w s S c r i p t 5 . 6
2. W M I C o d e C r e a t o r 1. 0 – h t t p : / / webdev.asp. Documentation – ht tp: //w w w.
download.microsoft.com/download/0/ 7. W M I D o w n l o a d s c a t a l o g – h t t p : / / m i c r o s o f t .c o m / d o w n l o a d s / d e t a i l s .
c / a / 0 c a7 6 9 1c - 6 3 3 5 - 414 3 - 8 f 9 f - msdn.microsof t.com /librar y/default. aspx?FamilyId=01592C48-207D-4BE1-
6708969f8212/WMICodeCreator.zip. asp?url=/downloads/list/wmi.asp. 8A76-1C4099D7BBB9&displaylang=en.
3. WMI Administrative Tools – ht tp: // 8. A D S I S c r i p t o m a t i c – h t t p : / / w w w. 12. WQL Keywords and description – http://
download.microsoft.com /download /. m i c r o s o f t .c o m / d o w n l o a d s / d e t a i l s . windowssdk.msdn.microsoft.com/library/
NetStandardServer/Install/V1.1/NT5XP/ aspx?FamilyID =39044e17-2490-487d- en-us/wmisdk /wmi /wql_sql_for_wmi.
EN-US/WMITools.exe. 9a92-ce5dcd311228&DisplayLang=en. asp.
4. S c r i p t o m a t i c 2 . 0 – h t t p : / / w w w . 9. WMI Core 1.5 for Windows 9x, NT 4.0 SP4 – 13. Windows Management Instrumentation –
m i c r o s o f t .c o m / d o w n l o a d s / d e t a i l s . http://www.microsoft.com/downloads/ http://msdn.microsoft.com/library/en-us/
aspx?FamilyID = 09dfc342-648b-4119- details.aspx?FamilyID=afe41f46-e213-4cbf- dnanchor/html/anch_wmi.asp.
b7eb-783b0f7d1178& DisplayLang=en. 9c5b-fbf236e0e875&DisplayLang=en.

№1, январь 2006 11


администрирование

Делаем резервное копирование


конфигураций активного сетевого
оборудования

Андрей Бирюков
Конфигурации активного сетевого оборудования, также как и данные, используемые
различными приложениями, нуждаются в резервном копировании. Предлагаем вам пример
сценария для резервного копирования, написанный на языке Perl.

Н
а сегодняшний день резервное гонезависимая память маршрутизато- Для решения поставленной задачи мы
копирование данных стало не- ров и коммутаторов более устойчива воспользуемся небольшим сценари-
отъемлемой частью ежеднев- к сбоям в энергосети и что вполне до- ем на языке Perl, который будет запус-
ных задач, выполняемых системны- статочно, скажем, раз в месяц делать каться по расписанию, удаленно под-
ми администраторами. И это неудиви- вручную копию рабочей конфигура- ключаться к каждому маршрутизато-
тельно, так как убытки, которые ком- ции своего оборудования и сохранять ру или коммутатору по протоколу Telnet
пания может понести в случае потери ее на TFTP-сервер [1]. или SSH и копировать рабочую конфи-
данных или вынужденного простоя, Однако в случае динамически из- гурацию на TFTP-сервер. Для примера
зачастую намного больше стоимости меняющейся конфигурации сети такой в статье будут использоваться коман-
оборудования, используемого для хра- подход будет, мягко говоря, не слиш- ды Cisco IOS, хотя ничто не мешает вам
нения данных. Существует масса раз- ком хорош. Например, на маршрути- использовать активное сетевое обору-
личных программных продуктов, поз- заторах телекоммуникационной компа- дование других фирм, предварительно
воляющих осуществлять автомати- нии, где настройки интерфейсов, ста- настроив на нем удаленный доступ че-
ческое резервное копирование дан- тические маршруты или access-list мо- рез Telnet или SSH.
ных практически в любом формате, гут меняться ежедневно. Осуществлять
от «снимка» состояния операционной резервное копирование вручную в та- Реализация
системы до бэкапа баз данных. Одна- кой сети очень сложно, особенно если Итак, приступим к программной реали-
ко все многообразие применимо лишь количество маршрутизаторов и ком- зации. В качестве операционной сис-
к программным решениям. С аппарат- мутаторов больше пяти. В такой ситу- темы используется FreeBSD, хотя с тем
ными решениями, в частности, с ак- ации нам необходимо осуществлять же успехом можно все описанное да-
тивным сетевым оборудованием, де- ежедневное, автоматическое резерв- лее реализовать и на Linux-клонах. За
ло обстоит немного сложнее. Конеч- ное копирование рабочих конфигура- основу нашего сценария, используе-
но, многие могут возразить, что энер- ций активного сетевого оборудования. мого для выполнения удаленных ко-

12
администрирование
манд, возьмем пример кода с сайта CPAN.org [2]. Данный
ресурс содержит массу примеров кода на языке Perl и бу-
дет весьма полезен при написании собственных сценариев.
Если на вашем сервере нет модуля Telnet.pm, то его мож-
но скачать по адресу http://search.cpan.org/CPAN/authors/
id/J/JR/JROGERS/Net-Telnet-3.03.tar.gz и установить в со-
ответствии с находящейся в архиве инструкцией. При от-
сутствии данного модуля вы просто получите сообщение
об ошибке при выполнении сценария. Сценарий, устанав-
ливающий соединение по протоколу Telnet, выглядит сле-
дующим образом:

Листинг 1. Сценарий, устанавливающий соединение


по протоколу Telnet

#!/usr/bin/perl Рисунок 1. Резервное копирование дампа конфигурации


use Net::Telnet ();
$t = new Net::Telnet ; Таким образом, для решения поставленной задачи нам
$hostname="10.0.1.11"; необходимо написать сценарий, корректно выполняющий
$t->open($hostname);
$t->waitfor('/login:.*$/'); данный диалог сервера и маршрутизатора. Остается толь-
$t->print("user"); ко добавить обработку исключений, на случай если возник-
$t->waitfor('/Password:.*$/');
$t->print("password"); нут ошибки, а также отправку администратору письма о том,
что резервное копирование успешно осуществлено. Для то-
В этом сценарии мы сначала устанавливаем соедине- го чтобы perl-сценарий мог отправлять почтовые сообще-
ние с заданным узлом, затем ожидаем приглашения ввести ния, необходимо наличие модуля sendmail, который в слу-
имя пользователя. Получив его, указываем user (пользова- чае отсутствия можно также найти на CPAN.org.
тель, под именем которого мы подключаемся к маршрути-
затору), потом ждем приглашения ввести пароль и вводим Листинг 2. Отправка почтовых сообщений
password (пароль данного пользователя). Принцип работы use Mail::Sendmail;
нашего сценария прост и понятен, мы дожидаемся появле- %mail = ( To => 'admin@test.local', # кому письмо
From => 'ciscobackup@test.local', # от кого
ния определенной строки и, получив ее, отправляем в от- # текст сообщения
вет команду или данные на удаленный узел. Message => "Backup was finished with result:".$result,
SMTP => 'smtp.mail.ru' # SMTP-рестранслятор
Однако прежде чем двигаться дальше, нам необхо- );
димо определиться с тем, что нужно сделать на удален- sendmail(%mail) or die $Mail::Sendmail::error;
ном активном сетевом оборудовании. Пусть нам необхо-
димо скопировать рабочую конфигурацию маршрутизато- Приведем полный текст данного сценария.
ра Cisco Router 2620 на TFTP-сервер. Выглядеть это долж-
но примерно так: Листинг 3. Полный текст сценария
Router> use Net::Telnet ();
Router>enable use Mail::Sendmail;
Router#copy running-config tftp $t = new Net::Telnet ;
Address or name of remote host []?10.0.1.2 $hostname="10.0.1.11";
Destination filename []?config080106 $t->open($hostname);
!!!!!! $t->waitfor('/login:.*$/')
21519 bytes copied in 1.056 secs (20045 bytes/sec) or die "bad login: ", $t->lastline;
$t->print("user");
$t->waitfor('/Password:.*$/')
Другой вариант резервного копирования для маршру- or die "bad password: ", $t->lastline;
тизаторов Cisco – это полный дамп конфигурации, находя- $t->print("password");
$t->waitfor('/Router>:.*$/')
щейся в флеш-памяти маршрутизатора. Для этого необхо- or die "No router user mode: ", $t->lastline;
димо вначале узнать полное имя файла конфигурации. По- $t->print("enable");
$t->waitfor('/login:.*$/')
лучить список файлов, находящихся в флеш-памяти мож- or die "bad login: ", $t->lastline;
но с помощью команды «show flash». На рис. 1 показан ре- $t->print("user");
$t->waitfor('/Password:.*$/')
зультат действия данной команды. Выделен файл, который or die "bad password: ", $t->lastline;
нам необходимо скопировать. $t->print("password");
$t->waitfor('/Router#:.*$/')
Однако, как видно из данного рисунка, размер дампа or die "No router privilege mode: ", $t->lastline;
конфигурации существенно превышает размер простой $t->print("copy running-config tftp");
$t->waitfor('/Address or name of remote host:.*$/');
копии рабочей конфигурации, которая делалась в первом or die "Wrong copy format" $t->lastline;
примере. Это может иметь значение при использовании $t->print("10.0.1.2");
$t->waitfor('/Destination filename:.*$/');
каналов с небольшой пропускной способностью или если ($sec, $min, $hour, $day, $mon, $year)=gmtime(time);
на TFTP-сервере мало свободного места. В такой ситуации $filename="config".$hour.$min.$sec.$day.$mon.$year;
$t->print($filename);
имеет смысл делать, к примеру, раз в неделю копию дам- $result=$t->getline;
па и ежедневно копию рабочей конфигурации, аналогично $t->waitfor('/Router#:.*$/');
$t->print("logout");
полному и разностному резервному копированию. %mail = ( To => 'admin@test.local',

№1, январь 2006 13


администрирование
From => 'ciscobackup@test.local', торые требуются для корректной работы автоматической
Message => "Backup was finished with result:".$result,
SMTP => 'smtp.mail.ru' системы резервного копирования.
);
sendmail(%mail) or die $Mail::Sendmail::error;
Автоматизируем выполнение
Пользователям, не слишком искушенным в программи- Прежде всего нам потребуется TFTP-сервер. Я не буду
ровании на Perl, следует обратить внимание на ряд техни- описывать процесс установки и настройки данной службы,
ческих моментов. Прежде всего для запуска сценария не- так как все это уже хорошо описано в [1].
обходимы права на выполнение для данного пользовате- Следующим этапом будет настройка утилиты cron. Дан-
ля. Также сценарий можно запускать с помощью команды ная утилита входит в состав UNIX-систем и позволяет вы-
«perl имя_сценария», однако в случае, если первой стро- полнять автоматически различные задачи по расписанию.
кой в тексте идет путь к интерпретатору Perl (например Формат данных, который использует cron, довольно прост.
#!/usr/bin/perl, как в Листинге 1), то тогда можно запускать Поля:
как обычный файл сценария, то есть ./имя_сценария (ана-  Минута – от 0 до 59.
логично chmod +x), но второй вариант также удобен при ис-  Час – от 0 до 23.
пользовании веб-интерфейса. Узнать путь к интерпретато-  Дата –от 1 до 31.
ру Perl можно с помощью команды «which perl».  Месяц – от 1 до 31 или от Jan до Dec.
Наш сценарий соединяется с удаленным устройством  День недели – от 0 до 6 или от Sun до Sat.
по протоколу Telnet, затем выполняет заданный набор ко-  Команда – выполняемая команда (в нашем случае это
манд, сохраняет рабочую конфигурацию в файле с именем, буде файл сценария).
содержащим полную дату создания файла, и потом отправ-
ляет администратору письмо с результатами выполнения Для большей ясности приведем пару примеров:
сценария. Для отправки почты данным сценарием доста-
точно, чтобы был указан SMTP-сервер на котором для дан- 30 2 * * perl /tmp/telnet.pl
ного IP-адреса разрешена ретрансляция почты. В качестве
показателя результата выступает строка, которую возвра- Сценарий telnet.pl, находящийся в каталоге tmp, будет вы-
щает удаленное устройство после попытки сохранить кон- полняться каждый день в 2 часа 30 минут. Поле «день неде-
фигурацию на TFTP-сервер. ли» не используется, вместо него указан лишний пробел.
В случае ошибки результирующая строка может выгля-
деть вот так: 50 18 1,15 * perl /tmp/ssh.pl

Error opening tftp://10.0.12/config080106


В данном случае сценарий будет выполняться в 18:50
Получение такой строки в письме с результатами свиде- 1-го и 15-го числа каждого месяца.
тельствует о том, что на удаленном устройстве все коман- Для того чтобы добавить строку настроек для запуска
ды отработали корректно, но по каким-то причинам TFTP- сценария в таблицу cron, нужно воспользоваться следую-
сервер недоступен. щей командой «crontab -е USER -l», где USER – это пользо-
В последнее время многие модели активного сетевого ватель, от имени которого выполняется данная команда.
оборудования снабжаются поддержкой удаленного доступа Для того чтобы удалить ненужную запись из таблиц, нуж-
с помощью протокола ssh. Данный протокол позволяет ус- но воспользоваться командой «crontab -u USER -r». А для про-
танавливать защищенное соединение с удаленным узлом. стого просмотра таблиц можно воспользоваться командой
В силу специфики протокола ssh perl-сценарий, устанавли- «crontab -u USER -l». Вообще, текстовый файл с настройка-
вающий удаленное соединение, будет иметь более слож- ми таблиц cron можно найти в каталоге /var/cron/tabs, однако
ный вид. В частности, как видно из Листинга 4 (см. листинг редактировать его вручную не рекомендуется. Резервное ко-
на сайте журнала, в разделе «Исходный код»), при соеди- пирование оптимально делать один раз в сутки. Файл конфи-
нении используются псевдотерминалы, которые образуют гурации в среднем занимает около 100 Кб, так что ежеднев-
пары ttyp3 и ptyp3, где pty... – это хозяин или управляющий ные копии конфигураций не займут много места.
терминал, а tty... – подчиненный.
В завершении данной темы хотелось бы отметить, Заключение
что эти сценарии также можно использовать и для выпол- Итак, мы написали сценарии и настроили их автоматичес-
нения других задач на удаленных устройствах. Например, кое выполнение. В статье сознательно не затрагивались ас-
если нам необходимо выполнить обратное действие, за- пекты, связанные с настройкой удаленного доступа на мар-
менить рабочую конфигурацию на ее копию с TFTP-серве- шрутизаторе или коммутаторе, так как это слишком обшир-
ра, но мы не можем это сделать в рабочее время в связи ная тема, требующая отдельной статьи.
с загруженностью сети, то наш сценарий выполнит зада-
чу в нужное время. Для этого достаточно указать команду Литература, ссылки:
«copy tftp running-config». 1. Супрунов С. FreeBSD TIPS: Работаем с TFTP. – Журнал «Сис-
Итак, мы написали сценарии, которые позволяют вы- темный администратор», № 7, июль, 2005 г. – 39-41с.
полнить команды на удаленных сетевых устройствах. Од- 2. CPAN.org. – ресурс содержит большое количество примеров
нако для решения поставленной задачи необходимо также различных сценариев и библиотек Perl.
правильно настроить службы операционной системы, ко- 3. Родерик Смит. Полный справочник по FreeBSD.

14
администрирование

Современный Linux-сервер:
как планировать дисковые ресурсы

Алексей Барабанов
От того, насколько правильно будет учтен и cпрогнозирован рост данных, размещенных
на создаваемом сервере, зависит в самом прямом смысле срок «жизни» самого сервера!
Но можно не заниматься математическим предсказанием увеличения объема информации
в сети, а использовать технологии хранения, допускающие оперативное масштабирование
и резервирование.

Б
ольшинство из представленных «страдания молодого Вертера», ес- вое понятно, второе обосную. Посколь-
далее положений и рекоменда- ли каждый дистрибутив, и SuSE в том ку все, что далее описывается, отно-
ций прошли многолетнюю про- числе, предлагает в процессе установ- сится к области профессиональной
верку практикой. Но тем не менее ки выполнить автоматическое разби- деятельности, то всякая работа име-
не надо все изложенное считать же- ение? Как определить критерии оцен- ет денежный эквивалент, и экономия
сткой схемой. Это всего лишь одно ки правильности решения о типе и спо- средств принимается одним из глав-
из мнений. Воспринимите статью как собе обустройства дисковых ресурсов ных критериев любой профессиональ-
попытку упорядочить подход и поиск сервера? Определим нашу цель так: ной деятельности. Так и здесь. Модер-
общих путей решения проблемы пла- правильным будет такой способ, ко- низация производится не из-за вдруг
нирования дисковых ресурсов. И зада- торый в дальнейшем цикле эксплуа- возникшей тяги системного админис-
ча эта, ранее в эпоху магнитных дисков тации сервера позволит без привле- тратора к новизне, а потому что в ста-
типа RK для PDP-11 решаемая всегда чения избыточных ресурсов провес- рой версии или на старом оборудова-
очень просто и однозначно, а сейчас – ти как комплекс работ по повыше- нии сервер далее работать не может.
уже с привлечением всего разнообра- нию отказоустойчивости, по увеличе- То есть несоответствие стало столь
зия современных технологий, далее нию емкости, так и, наконец, провес- существенным, что решено потратить
будет лишь эволюционировать в слож- ти модернизацию операционной сис- средства на модернизацию. Ну а если
ности и многообразии подходов. Поэ- темы или миграцию сервера на иное так, то существенные изменения поз-
тому эпитет «современный» в назва- оборудование. Это, так сказать, про- воляют считать сервер после модер-
нии надо читать как соответствующий грамма-максимум. Совсем не обяза- низации уже другим и соответствен-
настоящему уровню развития. Выбе- тельно, что все это предстоит. В моей но этому начать отсчет нового цикла,
рем для работы универсальный дист- практике много таких серверов, кото- тем более что и операционная систе-
рибутив, например, SuSE Linux 10.0 вы- рые работают до полного износа обо- ма, и оборудование сервера сами по
пуска конца 2005 года, который и при- рудования (более 5 лет) без каких-ли- себе имеют жизненный цикл, который
мем за эталон современности. Далее бо модернизаций. Но целью выбора оп- нецелесообразно превышать.
рассмотрим, что нам сейчас предлага- тимальной структуры дисковой систе- Во-вторых, зачем нужно увеличе-
ется и какой сложности выбор предсто- мы поставим именно удовлетворение ние отказоустойчивости? Почему при
ит сделать каждому при создании но- перечисленных критериев. Проком- вводе сервера в строй это не счита-
вого сервера. ментируем их. ли необходимым, а вот со временем
Во-первых, что такое цикл эксплу- вдруг озаботились? Будем считать,
Постановка задачи атации сервера. Будем считать тако- что с увеличением срока эксплуата-
Прежде всего зададимся вопросом, вым срок от введения сервера в строй ции возрастает объем внутренних дан-
в чем цель действий, производимых до его демонтажа, или до модерниза- ных сервера и тем самым увеличива-
в процессе разметки дисковых ус- ции (upgrade) операционной системы ется его информационная и абсолют-
тройств. Нужны ли вообще все эти или аппаратного обеспечения. Пер- ная ценность.

16
администрирование
В-третьих, после вышесказанного совершенно очевид-
но, что возрастание внутренних данных приводит к необхо-
димости увеличения емкости хранения рано или поздно.
И, в-четвертых, модернизация сервера или его мигра-
ция на иное оборудование является неотвратимой законо-
мерностью, если только компания-заказчик, где сервер ра-
ботает, не предполагает разориться вместе с завершением
эксплуатации сервера. Поэтому задумываться о том, какой
ценой будет производиться модернизация, надо сразу при
«закладке» сервера.
Перечислив положительные качества, не забудем упо-
мянуть и отрицательные – те, что обозначены в формули-
ровке как «избыточные ресурсы». Избыточным будем счи-
тать все, что привлекается лишь для совершения самой опе-
рации увеличения, улучшения или модернизации. Напри-
мер, если для увеличения дискового пространства потре- Рисунок 1. Схема иерархии уровней представления дисковых
данных
буется не только подключить новый диск, но еще и придет-
ся выкинуть старый, то такой нескомпенсированный обмен  DRB/iSCSI – сетевой диск по соответствующей техно-
надо считать «избыточным ресурсом». Также избыточны- логии;
ми будем считать все траты на подобные операции. Напри-  EXT3... – уровень представления, соответствующий
мер, если модификацию можно осуществить без перерыва файловым системам;
в работе, то это идеал, в противном случае – нет. А на прак-  NFS... – уровень представления, соответствующий се-
тике там, где обсуждаются не идеальные, но реальные ус- тевым файловым системам и протоколам, используе-
ловия, чем меньше ресурсов потребуется для проведения мым для организации сетевого доступа к файлам.
операции, тем лучше.
Резюмируем вышесказанное. Во всех технологических Каждый окрашенный прямоугольник отделяет реги-
выборах следует предпочитать те способы и методы, кото- он, включающий технологии соответствующей категории.
рые снизят стоимость дальнейших преобразований и мо- Их три:
дификаций. Вот такой получается «восточный дракон», ку-  SAS – устройства, физически подключаемые к серве-
сающий собственный хвост. ру;
Теперь, когда цель ясна и определена, обсудим сами  SAN – блочные устройства, подключаемые по сетевым
устройства хранения и те технологии, что предлагаются интерфейсам;
на выбор «из коробки» при сегодняшнем уровне развития  NAS – файловые системы, доступные через сеть.
в SuSE Linux 10.0.
Все перечисленные на схеме технологии могут быть за-
Иерархия уровней представления действованы в пределах одного серверного блока или, точ-
дисковых данных нее, одного хоста. Безусловно, необходимость их исполь-
Современный Linux-сервер является многофункциональ- зования должна диктоваться областью применения. И вот
ным устройством, работающим в сети. Если абстрагиро- здесь для нашего обсуждения будет важно то, какую гиб-
ваться от его прикладного назначения и попытаться пред- кость в настройке и модернизации обеспечивают все изоб-
ставить весь спектр возможных уровней и способов досту- раженные элементы. Для этого рассмотрим подробнее
па к данным, то получится большая схема, напоминающая ту же схему, но с точки зрения операций и их взаимодейс-
многослойный пирог. Иерархию сетевого доступа к данным твия по пути эскалации технологических уровней.
тоже принято изображать в виде многоуровневой схемы ин- Будем далее исходить из предположения, что все ис-
капсуляции. Только если сетевая модель уже давно канони- пользуемые технологии применяются к одному физичес-
зирована, то схема вложенности уровней доступа к диско- кому дисковому устройству. Это не исключает в дальней-
вым данным не имеет привычного вида, что допускает воль- шем использования дополнительных дисков, но задает бо-
ности в ее представлении. Итак, если все доступные в SuSE лее жесткие рамки вариантов выбора. Например, под MD
Linux 10.0 технологии попытаться уложить в единую схему, в дальнейшем будет пониматься исключительно RAID1.
отражающую их взаимосвязь и взаимодействие, то полу-
чится нечто вроде изображенного на рис. 1. Диаграммы переходов
Прокомментирую эту схему. Хотя все аббревиатуры Для того чтобы определить ключевые, или, в нашей терми-
и обозначения являются традиционными в Linux, расшиф- нологии, «дорогостоящие» технологические элементы, пос-
рую их: троим диаграмму переходов в процессе возможных настро-
 DISK – физическое дисковое устройство; ек от самого нижнего уровня DISK до самого верхнего NFS...
 MD – так называемый multiple device или программный Полученная диаграмма представлена на рис. 2.
RAID; Узлы соответствуют технологическим уровням пред-
 LVM – виртуальный диск по технологии Logical Volume ставления данных, а стрелки обозначают возможные на-
Manager; правления в процессе настройки сервера. Нумерация уз-

№1, январь 2006 17


администрирование
щена файловая система – это условно возможная опера-
ция, так как на диске должно оставаться свободное мес-
то для таких манипуляций. Во-вторых, можно перевести
используемый диск в статус RAID1 – это условно возмож-
ная операция, так как в случае наличия свободного мес-
та в файловой системе для размещения суперблока опе-
рацию можно провести «на лету». В-третьих, можно пере-
вести файловую систему под управление LVM – эта опера-
ция проводится с потерей данных, так как LVM использу-
ет размещение суперблоков в теле рабочих разделов так,
что не представляется возможным выделить для этого еди-
ное пространство. Ну и, наконец, можно отключить от ис-
пользуемой файловой системы сетевое блочное устройс-
тво – эта операция приводит только к отключению самого
сервиса и ни к чему более серьезному.
Таким образом, самая серьезная ситуация складывает-
Рисунок 2. Диаграмма настроек ся вокруг переделок, требующих установки LVM. Если под-
ключение RAID или переразметка диска могут быть прове-
дены без резервного копирования всех данных в некото-
рых случаях, то помещение томов с данными под управле-
ние LVM потребует 100% сохранения всей задействован-
ной информации. Здесь можно сделать вывод, что имен-
но LVM является той критической технологией, решение
об использовании которой надо принимать на самом ран-
нем этапе планирования дисковых ресурсов.

Таблица операций
Попробуем поместить все данные из диаграмм в таблицу 1.
Слева в столбце 1 – исходное состояние, сверху в ряду 1 –
конечное, в ячейке на пересечении соответствующих состо-
яний указана операция, переводящая начальное состояние
в конечное. Таким образом, в ячейки левой нижней части
таблицы, разделенной диагональю, попадут операции пе-
ределок и их стоимости, а в ячейки правой верхней части
Рисунок 3. Диаграмма переделок
попадут операции настроек.
Теперь в этой таблице голубым цветом по вертикали,
лов проставлена в порядке самого длинного маршрута на- то есть в целевых столбцах, выделим технологии, допус-
строек. Все очевидно и не нуждается в пояснениях. А вот те- кающие оперативное масштабирование, и салатным, так-
перь повернем стрелки в обратном направлении! Предста- же по вертикали, – те технологии, что позволяют организо-
вим, что некий шаг настройки оказался ошибочным, но ре- вать горячее резервирование по схеме RAID.
шение о его отмене пришло лишь в процессе эксплуатации, Если исходить из условия, что необходимо обеспечить
спустя некоторое время. Например, в процессе установки масштабирование емкостей в оперативном порядке, то вы-
были последовательно пройдены этапы 1 DISK, 5 EXT3..., бор однозначен. Поскольку в предыдущем разделе уже был
6 NFS.... И спустя некоторое время появилась необходи- сделан вывод о том, что технология LVM единственная, ко-
мость перевести работающую систему под LVM. То есть торая требует решения о ее применении на самом раннем
надо последовательно перевести сервер по диаграмме на- этапе, то можно сказать, выбор сделан – LVM непременно
строек 6 NFS..., 5 EXT3... и затем в узел 3 LVM. После чего надо использовать.
снова в поступательном движении по диаграмме настро- Далее, у нас два кандидата для возможного увеличения
ек вернуться в узел 6 NFS..., который соответствует пол- отказоустойчивости путем горячего резервирования. Без-
ностью работоспособному серверу. Вторую диаграмму на- условно, сравнивать RAID и сетевые блочные устройства
зовем диаграммой переделок. В ней все вектора измени- просто некорректно. Но в рамках рассматриваемой моде-
ли направление на противоположное, и рядом с каждым из ли мы не учитываем ничего, кроме возможности перена-
них добавился комментарий, оценивающий стоимость пе- строить нужный уровень представления данных и последс-
ределки. Результат изображен на рис 3. твий такой перенастройки. И следуя этому принципу, полу-
Итак, все возможные стоимости переделок уложились чается, что создание сетевого блочного устройства на ос-
в четыре градации: потеря сервиса, отключение сервиса, нове локального – это лишь запуск соответствующего сер-
условно возможно, потеря данных. Например, рассмотрим виса, а переключение локально подмонтированного диска
возможные переделки для узла файловых систем EXT3... на сетевой режим работы без изменения его объема или
Во-первых, можно переразметить диск, на котором разме- размещения тоже не представляет особой проблемы. Итак,

18
администрирование
Таблица 1. Операции и стоимости
DISK MD LVM DRB/iSCSI EXT3... NFS...
Разметка fs и монти-
DISK Разбиение диска Создание MD и подключение Создание LVM и подключение Запуск drbd/ iscsid
рование
Условно возможна миграция Разметка fs и монти-
MD Создание LVM и подключение Запуск drbd/ iscsid
MD на иной раздел диска рование
Условно возможна мигра- Условно возможно переме- Разметка fs и монти-
LVM Запуск drbd/ iscsid
ция PV щение PV внутрь MD рование
Условно возможна миграция Условно возможно переме- Невозможно без полного ре- Разметка fs и монти-
DRB/iSCSI
раздела DRB/iSCSI щение раздела внутрь MD зервного копирования рование
Условно возможна мигра- Условно возможно переме- Невозможно без полного ре- Отключение от сетевого Запуск
EXT3...
ция FS щение FS внутрь MD зервного копирования блочного устройства nfsd/ smbd
Отключение всех пот-
NFS... ребителей и остановка
сервиса

Таблица 2. Зависимость скорости доступа от разбиения и типа разметки


sda3 sda3,md3 sda3,md3,lvm sda3,md3,amd64 sda3,md3,4096 sda2,md2
Символьная запись 43891 – 0,96 46049 – 1,01 47326 – 1,03 44301 – 0,97 41087 – 0,90 48253 – 1,05
Блочная запись 55173 – 0,94 60449 – 1,03 60397 – 1,03 55792 – 0,95 49368 – 0,84 54367 – 0,93
Перезапись 21288 – 0,99 21768 – 1,01 21618 – 1,00 20570 – 0,95 20688 – 0,96 21839 – 1,01
Символьное чтение 24281 – 1,07 21815 – 0,96 21791 – 0,96 30829 – 1,36 36220 – 1,60 21732 – 0,96
Блочное чтение 54047 – 1,01 53622 – 1,00 53288 – 0,99 51793 – 0,97 51768 – 0,96 54335 – 1.01

из двух технологических подходов, MD и DRB/iSCSI, будем ные результаты представлены в таблице 2. В самом левом
самым неудобным в модификации, и поэтому самым «до- столбце перечислены операции, на которых проводились
рогим», считать MD. измерения, а в самой верхней строке сокращениями обоз-
На этом этапе можно сформулировать первые принци- начены условия тестирования. Опишем их по порядку:
пы планирования дисковых ресурсов.  sda3 – проверка проводится на «чистом» разделе дис-
Принцип 1. Следует, по возможности, переключить все ка, размеченного под ext3;
размеченные разделы жесткого диска в режим работы про-  sda3,md3 – файловая система размечена поверх поло-
граммного RAID, пусть и неполного, что позволит в даль- винки «зеркала» RAID1;
нейшем при необходимости перевести их в режим горяче-  sda3,md3,lvm – раздел, использованный как половин-
го резервирования. ка RAID1, помещен в LVM, и уже поверх него размече-
Принцип 2. Следует, по возможности, объединить все на файловая система ext3;
созданные физические тома под управлением LVM – для то-  sda3,md3,amd64 – случай 2, но в режиме 64 бита;
го, чтобы в дальнейшем, при необходимости, легко манипу-  sda3,md3,4096 – условия как в предыдущем 64-битном
лировать объемом используемых логических томов. варианте, но с размером тестового файла в 4 Гб;
Обращаю внимание на уточнение «по возможности».  sda2,md2 – случай 2, но со смещением к начальным об-
Обсуждение этих «возможностей», а также все, что каса- ластям диска.
ется стратегии разбиения на разделы, оставим для вто-
рой части этой статьи. Сейчас просто учтем эту оговорку Результаты тестов показаны в Кб/сек. Рядом с ними рас-
и просто попытаемся оценить эффект от следования за- считаны индексы отклонений от средней величины, опреде-
явленным выводам, как принципам планирования диско- ленной по первым трем испытаниям. Для наглядности дан-
вых ресурсов. ные таблицы представлены в графическом виде в форме
столбчатой диаграммы (см. рис. 4).
Тестирование Испытания с 1-го по 3-е определяют то, как влияет ис-
Да, именно так – тестирование. Нет ничего проще, чем оце- пользование дополнительных уровней представления дан-
нить издержки использования этих, запасенных впрок, тех- ных на скорость работы. Практически отклонения не пре-
нологических изысков MD и LVM, путем проверки с помо- вышают 5%. Совершенно понятно, что с увеличением чис-
щью самого рядового теста файловой системы bonnie, про- ла «слоев» трансляции уровней представления немного
веряющего символьные и блочные операции чтения-запи- подрастает скорость записи и немного снижается скорость
си, как повлияет на его результаты внесение соответству- чтения. Это объясняется тем, что при записи большее чис-
ющих изменений в настройки. ло программных драйверов создает большую массу кеши-
В тестовом компьютере было установлено 1 Гб опера- рующих механизмов, и в сравнении с тестом на файле 4 Гб
тивной памяти. Это не очень «удобный» объем, так как мак- (колонка 5) видно, как увеличение размера в 2 раза доволь-
симальный размер тестового файла в 32-битном режиме со- но существенно снижает результаты по записи. А вот в про-
ставляет 2 Гб, что несколько снижает точность измерений. цедуре чтения данных увеличение числа уровней пред-
И поэтому дополнительно были сделаны проверки в 64-бит- ставления лишь увеличивает цепочку запросов, если дан-
ном режиме и с размером тестового файла в 4 Гб. Получен- ные не сохранены в кеше, и, значит, немного снижает ско-

№1, январь 2006 19


администрирование
даже на одном диске, в процессе инсталляции системы с
использованием стандартных установщиков не удается так
просто включить в работу. Для исправления этой проблемы
применяются схемы с миграцией готовой системы с обыч-
ных разделов на второе дисковое устройство, как на поло-
винку «зеркала». То есть возникает та самая аппаратная
избыточность, которой мы стремились избежать. Но мож-
но воспользоваться тем, что суперблок MD записывается в
конец используемого раздела, и с точки зрения файловой
системы структура раздела более не меняется. Таким об-
разом, если на этапе установки разместить систему на не-
Рисунок 4. Зависимость скорости доступа от разбиения котором разделе, а потом уменьшить объем файловой сис-
и типа разметки
темы так, чтобы в полученном «хвостике» уместился бы су-
рость. Сравнение результатов тестирования, произведен- перблок RAID1, то при такой трансформации данные никак
ного на другом разделе диска (колонка 6), с аналогичным не должны пострадать. Проверим это.
по условиям (колонка 2) дает основания считать результа- В работе используем раздел /dev/sda3, размеченный
ты последней достаточно достоверными, так как за неболь- как ext3, но можно использовать любую файловую систе-
шим исключением скорости обмена данными схожи. Здесь му, допускающую изменение размера. Все манипуляции
очень интересно отметить, что переход на 64-битную плат- надо производить над немонтированным разделом. Если
форму показывает резкий прирост скорости символьного трансформируется корневой раздел, то надо использовать
чтения. Вероятно, из-за более эффективного использова- или спасательный диск, или альтернативную загрузку. Итак,
ния индексов в кеше. Безусловно, увеличение числа про- вот разметка диска до начала работ:
гонов, изменение соотношения размера тестового файла
к объему оперативной памяти и другие приемы, возмож- # fdisk -l /dev/sda
но, дали бы более стабильные результаты, но, скорее все- Disk /dev/sda: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders
го, общий уровень показателей не изменился бы сущест- Units = cylinders of 16065 * 512 = 8225280 bytes
венно. Можно считать, что уровень отклонения не превысит
Device Boot Start End Blocks Id System
5% и в реальной работе. Поскольку, как видно по резуль- /dev/sda1 1 131 1052226 82 Linux swap / Solaris
/dev/sda2 132 1377 10008495 fd Linux raid autodetect
татам, выигрыш в записи сопровождается потерями в чте- /dev/sda3 * 1378 2683 10490445 83 Linux
нии, то никакого существенного ухудшения работы систе-
мы такой тюнинг не принесет в общем случае. Внутри раздела уже создана файловая система.
Как подтверждение правильности сделанных здесь вы-
водов приведем тот факт, что RHEL (серверная версия Red # fsck /dev/sda3
Hat Linux) по умолчанию устанавливает все данные, кроме fsck 1.38 (30-Jun-2005)
e2fsck 1.38 (30-Jun-2005)
размещаемых в каталоге /boot, именно в раздел под управ- /dev/sda3: clean, 117054/1311552 files, 720522/2622611 blocks
лением LVM. Даже swap помещается на раздел LVM для то-
го, чтобы можно было в дальнейшем манипулировать его По умолчанию использован блок с размером 4 Кб. Уточ-
объемом. Иначе говоря, преимущества технологичности нить действительный размер можно с помощью утилиты
сопровождения создаваемого сервера с лихвой окупают dumpe2fs с ключом -h. Теперь есть возможность сразу рас-
трудноуловимые «жертвы» производительности. считать размер и положение суперблока MD, как указано
Теперь, уверившись в правильности предложенных вы- в usr/include/linux/raid/md_p.h и уменьшить размер файло-
ше принципов, попробуем применить их на практике. вой системы соответственно. После подстановки в форму-
лу для расчета переведем все числа, указанные в блоках,
Практический рецепт миграции на RAID1 в шестнадцатеричные:
Внимание! Используйте описанную ниже технологию Размер устройства MD = (размер физического уст-
на свой страх и риск. Автор не несет ответственности за ройства & ~ (размер суперблока -1) – размер суперблока =
возможные повреждения данных и настоятельно рекомен- 2622611 & ~(15) -16 == 0x280493 & ~(0xF) – 0x10 = 0x280480 =
дует выполнить процедуру резервного сохранения крити- 2622592 блоков.
чески важной информации. Далее все описано примени- Полученное значение составит размер полученного
тельно к SuSE 10.0. Не забудьте сделать поправку под ак- диска MD. Начиная с указанного блока будет размещать-
туальную платформу. ся суперблок MD длиной 64 Кб. Но можно пойти по самому
Как было ранее заявлено, надо стремиться к переводу примитивному пути и заставить систему сообщить нужный
разделов под RAID и LVM с самого раннего этапа. При этом размер, как мы и сделаем далее.
вовсе не обязательно, чтобы в системе было необходимое Создадим RAID1 из раздела /dev/sda3. На предупреж-
количество дисков для построения RAID или присутство- дение о том, что внутри уже найдена размеченная фай-
вала сложная иерархия устройств, управляемая LVM. Вов- ловая система, не обращаем внимания – мы же знаем,
се нет! Все должно быть применимо даже к единственно- что делаем!
му жесткому диску. В отношении LVM проблем нет, даже
если диск один. А вот RAID1, технологически работающий # mdadm -C /dev/md3 -l 1 -n 2 /dev/sda3 missing

20
администрирование
mdadm: /dev/sda3 appears to contain an ext2fs file system И для того чтобы инициировать автоматическое де-
size=10490444K mtime=Mon Jan 9 01:08:28 2006
Continue creating array? y тектирование RAID в процессе загрузки системы, попра-
mdadm: array /dev/md3 started. вим тип раздела (для краткости используем неинтерак-
тивную форму):
Теперь проверим целостность файловой системы внут-
ри полученного MD. Утилита должна указать на несоответс- # fdisk /dev/sda <<EOT
твие размера раздела и размера файловой системы, пос- t
3
ле чего проверку следует прервать: fd
w
EOT
# fsck /dev/md3
fsck 1.38 (30-Jun-2005) Перечитаем таблицы разметки диска:
e2fsck 1.38 (30-Jun-2005)
The filesystem size (according to the superblock) is 2622611 blocks
The physical size of the device is 2622592 blocks # partprobe
Either the superblock or the partition table is likely to be corrupt!
Abort<y>? yes

fsck.ext3 /dev/md3 failed (status 0x8). Run manually! Если обновленный раздел используется в качестве кор-
невого, то есть его имя передается загрузчиком ядру, то на-
Полученный из сообщения «физический» размер до поправить меню загрузки. В нашем случае /boot разме-
в 2622592 блока по 4 Кб, который, кстати сказать, совпа- щен на модифицируемом разделе. Здесь принимается без
дает с заранее рассчитанным, нужно будет использовать объяснений то, что следует использовать загрузчик grub.
при коррекции размера файловой системы. Но предвари- Обоснование этого, а также и многих других правил, ос-
тельно выполним проверку файловой системы на /dev/sda3, тавим для второй части статьи. Итак, проводим такую же
так как иначе утилита resize2fs откажется работать. правку, как и с /etc/fstab:

# e2fsck -f /dev/sda3 # perl -i.orig -p -e 's,/dev/sda3,/dev/md3,g' ↵


/boot/grub/menu.lst
e2fsck 1.38 (30-Jun-2005)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure Теперь все готово к работе. Надо только не забыть,
Pass 3: Checking directory connectivity что initrd должен «понимать» тип нового раздела. И если это
Pass 4: Checking reference counts
Pass 5: Checking group summary information не так, то следует пересобрать initrd, указав в /etc/sysconfig/
/dev/sda3: 117054/1311552 files (0.5% non-contiguous), 720522/2622611 blocks
kernel среди имен модулей в параметре INITRD_MODULES
А вот теперь скорректируем размер самой системы: дополнительно raid1.
Напоследок, если возникают трудности с загрузкой, то
# resize2fs /dev/sda3 $(( 2622592 * 4 ))K продемонстрируем протокол установки загрузчика из мо-
resize2fs 1.38 (30-Jun-2005) дифицированного раздела.
Resizing the filesystem on /dev/sda3 to 2622592 (4k) blocks.
The filesystem on /dev/sda3 is now 2622592 blocks long.
# grub <<EOT
Для контроля снова проверим целостность файловой > root (hd0,2)
> setup (hd0)
системы на /dev/md3: > quit
> EOT
# e2fsck -f /dev/md3 GNU GRUB version 0.96 (640K lower / 3072K upper memory)
...
e2fsck 1.38 (30-Jun-2005)
grub> root (hd0,2)
Pass 1: Checking inodes, blocks, and sizes
Filesystem type is ext2fs, partition type 0xfd
Pass 2: Checking directory structure
grub> setup (hd0)
Pass 3: Checking directory connectivity
Checking if «/boot/grub/stage1» exists... yes
Pass 4: Checking reference counts
Checking if «/boot/grub/stage2» exists... yes
Pass 5: Checking group summary information
Checking if «/boot/grub/e2fs_stage1_5» exists... yes
/dev/md3: 117054/1311552 files (0.5% non-contiguous), 720522/2622592 blocks
Running «embed /boot/grub/e2fs_stage1_5 (hd0)»... 15 sectors are embedded...
succeeded
Если эта система была корневой и/или использова- Running «install /boot/grub/stage1 (hd0) (hd0)1+15 p (hd0,2)/boot/grub/stage2
/boot/grub/menu.lst»... succeeded
лась в процессе загрузки, то надо внести дополнитель- Done.
ные правки в содержимое файлов, управляющих загруз- grub> quit

кой системы.
Монтируем новый раздел: Таким образом, была осуществлена трансформа-
ция «на лету». Условием ее успешного выполнения ста-
# mount /dev/md3 /mnt ло то, что в файловой системе было свободно не менее
# mount | grep md3
2622611-2622592 = 19 блоков или 76 Кб. Для повторения это-
/dev/md3 on /mnt type ext3 (rw)
го «трюка» в другом Linux, не в SuSE, или с другим типом
Сначала исправим /etc/fstab, так как изменилось имя ус- файловой системы надо обеспечить наличие необходимых
тройства, использованного для монтирования раздела: для трансформации файловой системы утилит.
Вопросы выбора типа файловой системы, способа рас-
# perl -i.orig -p -e 's,/dev/sda3,/dev/md3,g' /mnt/etc/fstab пределения данных по разделам, организация процесса за-
# cat /mnt/etc/fstab | grep md3
грузки и многое другое, что осталось за рамками рассмот-
/dev/md3 / ext3 acl,user_xattr 1 1
рения, будут освещены во второй части статьи.

№1, январь 2006 21


администрирование

Почтовый сервер на основе реляционной СУБД.


Оцените преимущества!

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

О
дним из малоизвестных, но  Кластеризация – механизм, с по- в DBMail пока отсутствуют некоторые
очень эффективных инстру- мощью которого можно разместить возможности более распространен-
ментов для построения слож- СУБД на нескольких компьютерах ных и развитых почтовых систем (на-
ных и масштабируемых почтовых сис- (узлах кластера) с доступом к еди- пример, аутентификация с помощью
тем является DBMail – комплекс про- ной БД. SASL, встроенная поддержка SSL/TLS,
грамм для UNIX-подобных систем, поз-  Репликация – возможность авто- механизм фильтрации почтовых сооб-
воляющий использовать реляционные матического переноса сообщений щений, аналогичный Sieve – это пер-
СУБД в качестве серверного хранили- из одной БД в другую, создания вое, что приходит в голову), но реали-
ща почтовых сообщений вместо тради- консолидированной БД из разных зовать их проще (и работы над реали-
ционных mbox, Maildir и прочих тексто- источников и т. д. зацией многих недостающих возмож-
вых хранилищ. Используя DBMail, мож-  Фрагментирование – разделе- ностей ведутся), чем добавить описан-
но добиться: ние одной логической таблицы БД ные выше возможности к традицион-
 Более высокой производитель- на несколько физических для уп- ным почтовым системам.
ности по сравнению с файловы- рощения обслуживания, повыше- DBMail – продукт нидерландской
ми хранилищами – реляционные ния производительности, сжатия компании IC&S, в котором также есть
СУБД гораздо лучше приспособле- архивных данных и т. д. вк лад большого числа независи-
ны к обработке больших объемов  Отказоустойчивость и баланси- мых разработчиков из разных стран.
структурированных данных, чем ровка нагрузки с автоматичес- Он распространяется по лицензии GPL,
любой парсер текстовых файлов. ким переключением на резервный кроме того, IC&S предлагает платную
 Большей гибкости при обработ- сервер при отказе основного. поддержку.
ке и анализе корреспонденции –  Резервное копирование – горя-
возможности SQL опять-таки не- чее (без необходимости останав- Архитектура
соизмеримы с тем, что можно сде- ливать почтовый сервер, чтобы не В дальнейшем я предполагаю, что вы
лать, обрабатывая mbox или Maildir получить поврежденное хранили- знакомы с общими принципами пост-
различными самописными скрип- ще сообщений) и инкременталь- роения почтовых систем, и термины
тами на Perl/Python/Ruby для из- ное (копирование изменений вмес- MTA, MDA и MUA вас не пугают. Если
влечения какой-либо статистики. то копирования всего хранилища). это не так, то всю необходимую инфор-
 Дополнительная логика обработ- мацию вы можете найти в моей статье
При этом администратор почтовой ки почты, построенную на триг- «Круговорот почты в сети, или Архи-
системы может задействовать различ- герах, представлениях и т. д. тектура современных почтовых сис-
ные механизмы, предоставляемые тем», опубликованной в предыдущем
СУБД (при условии, что выбранная Похоже на голубую мечту сисадми- номере журнала. Принципиальная схе-
им СУБД это позволяет), например: на. Конечно, не все так замечательно: ма работы DBMail, которую нарисовал

22
администрирование
чем указать можно только одну СУБД. В будущем планиру-
ется реализовать динамическую подгрузку модулей для ра-
боты с различными СУБД, описываемую в конфигурацион-
ном файле, – это должно упростить создание и поддержку
пакетов DBMail для различных дистрибутивов Linux.
В качестве СУБД в настоящее время поддерживаются
только PostgreSQL и MySQL, кроме того, в текущей неста-
бильной версии появилась поддержка SQLite. Однако реа-
лизованный в DBMail уровень абстракции для доступа к БД
позволяет добавлять поддержку других СУБД без внесе-
ния каких-либо изменений в основной код, отвечающий за
логику обработки почтовых сообщений.

Рисунок 1. DBMail big picture Установка и настройка


Последней стабильной версией DBMail является 2.0.7,
Wolfram A. Kraushaar, вдохновленный примером Postfix big а нестабильной – 2.1.3. Обе можно загрузить с http://www.
picture, выглядит так (см. рис. 1). dbmail.org, кроме того, самый свежий вариант можно выгру-
Теперь небольшой комментарий к изображению. В осно- зить из CVN. Для FreeBSD, Debian Linux и Gentoo Linux сущес-
ве DBMail лежит реляционная БД – хранилище учетных за- твуют готовые порты/пакеты DBMail, для прочих систем пред-
писей пользователей, почтовых ящиков, сообщений и про- лагается следующая стандартная процедура установки:
чей вспомогательной информации. Также в состав DBMail
входят две категории MDA: # ./configure –-with-pgsql (либо -–with-mysql)
# make
 Предназначенные для доставки сообщений от MTA # make install
в хранилище.
 Предназначенные для доставки MUA из хранилища. Я использую ALT Linux и считаю этот способ приемле-
мым только на тестовых машинах, а для использования
К первым относятся: на рабочих серверах предпочитаю собирать любое ПО, от-
 dbmail-smtp – исполняемый файл, использующий pipe- сутствующее в дистрибутиве, в пакеты и помещать в собс-
интерфейс: читает почтовое сообщение от MTA со стан- твенный репозитарий. Соответственно, установка DBMail
дарного входа (stdin) и сохраняет его в БД. Таким обра- в этом случае сведется к:
зом, на каждое входящее сообщение создается отде-
льный процесс UNIX и подключение к СУБД. # apt-get install dbmail
 dbmail-lmtpd – UNIX-демон, принимающий клиентские
подключения через UNIX-сокет или TCP-сокет. Для при- Бинарный RPM-пакет и пакет с исходниками DBMail
ема почтовых сообщений используется протокол LMTP. для ALT Linux желающие могут загрузить из коллекции бэ-
На каждое входящее сообщение MTA создает толь- кпортов для ALT Linux 2.4 Master (http://backports.altlinux.ru).
ко клиентский сокет, необходимое количество процес- Пользователям прочих дистрибутивов Linux или других UNIX-
сов и подключений к БД создается заранее. Таким об- систем предлагается на выбор установить DBMail стандарт-
разом, этот вариант обеспечивает лучшую производи- ным образом или собрать пакет для своей системы.
тельность при высокой нагрузке, но при низкой он пот- Мы будем настраивать DBMail в связке с Postfix (в ка-
ребляет больше системных ресурсов, чем необходимо. честве MTA) и PostgreSQL (в качестве СУБД – c подде-
ржкой PostgreSQL собран пакет для ALT Linux) – предпо-
Ко вторым относятся: лагается, что они уже установлены, настроены и работают.
 dbmail-pop3d – демон для доступа по протоколу POP3. Для начала сначала создадим БД и пользователя (имеется
 dbmail-imapd – демон для доступа по протоколу IMAP. в виду не системный пользователь, а пользователь СУБД
PostgreSQL)– владельца этой БД:
Кроме того, в состав DBMail входят следующие вспо-
могательные утилиты: # createuser -s -U postgres dbmail
# createdb -U dbmail dbmail
 dbmail-users – инструмент для управления пользовате- # psql -U dbmail dbmail < /usr/share/doc/dbmail-2.0.7 ↵
лями и их псевдонимами (возможно, многим из вас бу- /sql/postgresql/create_tables.pgsql
дет привычнее термин alias).
 dbmail-util – инструмент для очистки, оптимизации Затем создадим конфигурационный файл /etc/dbmail.conf
и проверки корректности БД. со следующим содержимым (или слегка отредактируем
уже существующий):
Общая часть функциональности всех рассматри-
ваемых исполняемых файлов реализована в разделя- [DBMAIL]
host=localhost
емых библиотеках: libdbmail, libauthdbmail, libsortdbmail sqlport=5432
и lib[rdms-name]dbmail. В настоящее время тип поддержи- sqlsocket=
user=dbmail
ваемой СУБД жестко определяется на этапе ./configure, при- pass=dbmailpwd

№1, январь 2006 23


администрирование
db=dbmail dbmail-smtp unix - n n - - pipe
postmaster=postmaster@mydomain.com flags= user=mail:mail
trace_level=2 argv=/usr/sbin/dbmail-smtp -d ${recipient} ↵
-r ${sender}
[SMTP]
sendmail=/usr/sbin/sendmail
auto_notify=no А затем задействовать этот транспорт в /etc/postfix/
auto_reply=no
trace_level=2 main.cf:

[LMTP] mailbox_transport = dbmail-smtp:


effective_user=mail
effective_group=mail
bindip=*
port=24 Описание транспорта LMTP будет выглядеть так:
nchildren=10
maxchildren=10 dbmail-lmtp unix - - n - - lmtp
minsparechildren=2
maxsparechildren=4
maxconnects=10000
timeout=300 Или так (если требуется большая детализация в логах):
resolve_ip=yes
trace_level=2 dbmail-lmtp unix - - n - - lmtp -v
max_errors=500

[POP]
effective_user=mail Или так (если имена некоторых доменов назначения вхо-
effective_group=mail дящих почтовых сообщений не описаны в DNS):
bindip=*
port=110
nchildren=10 dbmail-lmtp unix - - n - - lmtp
maxchildren=10 -o disable_dns_lookups=yes
minsparechildren=2
maxsparechildren=4 Во всех этих случаях новый транспорт нужно будет за-
maxconnects=10000
timeout=300 действовать следующим образом:
resolve_ip=yes
pop_before_smtp=no mailbox_transport = dbmail-lmtp:localhost:24
trace_level=2

[IMAP]
effective_user=mail Разумеется, можно задействовать доставку почтовых
effective_group=mail сообщений в хранилище DBMail только для определенных
bindip=*
port=143 доменов, но это уже не имеет никакого отношения к DBMail
nchildren=10 и настраивается исключительно средствами Postfix.
maxchildren=10
minsparechildren=2 Кроме того, необходимо поставить Postfix в известность
maxsparechildren=4 о тех почтовых ящиках, для которых он должен принимать
maxconnects=10000
timeout=4000 сообщения. Создадим для этого файл /etc/postfix/dbmail-
resolve_ip=yes mailboxes.cf со следующим содержимым:
imap_before_smtp=no
trace_level=2
user = dbmail
password = dbmailpwd
Небольшой комментарий к содержимому конфигураци- hosts = localhost
онного файла. Он состоит из следующих секций: dbname = dbmail
table = dbmail_aliases
 DBMAIL – в ней описываются глобальные настрой- select_field = alias
ки, применимые ко всем сервисам DBMail (в основном where_field = alias
это параметры подключения к БД).
 SMTP – здесь описываются параметры взаимодействия И задействуем его в /etc/postfix/main.cf:
с MTA, которому DBMail передает почтовые сообщения
для дальнейшей обработки. local_recipient_maps = pgsql:/etc/postfix ↵
/dbmail-mailboxes.cf $alias_maps
 LMTP, POP3, IMAP – в этих секциях описываются на-
стройки соответствующих демонов: на каких адресах Для того чтобы это работало, Postfix должен быть соб-
и портах принимать подключения, под какой учетной ран с поддержкой PostgreSQL. В Debian и ALT Linux (воз-
записью работать, сколько дочерних процессов поро- можно, не только в них) поддержка PostgreSQL в Postfix вы-
дить и т. д. несена в пакет postfix-pgsql, который необходимо доустано-
вить, если он еще не установлен.
Пример конфигурационного файла, поставляемого Пользователи прочих дистрибутивов Linux или дру-
в комплекте с DBMail, содержит поясняющие комментарии гих UNIX-систем, в которых Postfix собран без подде-
для большинства настраиваемых параметров. ржки PostgreSQL, либо вообще отсутствует, могут перед
Теперь необходимо настроить механизм взаимодейс- компиляцией включить его самостоятельно, указав ключ
твия с Postfix. Как уже было сказано, таких механизмов -DHAS_PGSQL и пути к соответствующим заголовкам и биб-
два: pipe-интерфейс и LMTP. лиотекам:
В первом случае потребуется в файле /etc/postfix/master.
cf описать следующий транспорт: # make tidy

24
администрирование
# make -f Makefile.init makefiles \ # telnet localhost 110
'CCARGS=-DHAS_PGSQL -I/usr/local/include/pgsql' \
'AUXLIBS=-L/usr/local/lib -lpq' Trying 127.0.0.1...
# make Connected to localhost.
Escape character is ‘^]’.
+OK DBMAIL pop3 server ready to rock <3b1d246c241825db052940bc65a
Наконец, последний штрих – ежедневные плановые 6a39b@mydomain.com>
работы по очистке БД от удаленных записей и проверке user test
корректности БД. Их будет выполнять файл /etc/cron.daily/ +OK Password required for test
pass testpwd
dbmail-clean со следующим содержимым: +OK test has 1 messages (355 octets)
stat
#!/bin/sh +OK 1 355
list
/usr/sbin/dbmail-util -cturpd -l 24h -qq +OK 1 messages (355 octets)
1 355
.
Теперь можно запустить демоны dbmail-lmtpd (в том слу- retr 1
чае, если для доставки мы планируем использовать LMTP), +OK 355 octets
Return-Path: john@mydomain.com
dbmail-imapd и dbmail-pop3d (можно запустить только тот, ко-
Received: by mydomain.com (Postfix, from userid 502)
торый будет использоваться для извлечения почты из хра- id 7E8E617762; Sun, 20 Nov 2005 15:03:04 +0300 (MSK)
нилища, если он будет один). В пакет для ALT Linux вклю- To: test@mydomain.com
Subject: Test Message
чены соответствующие стартовые скрипты, которые мо- Message-Id: <20051120120304.7E8E617762@mydomain.com>
гут быть вызваны вручную с помощью service или настро- Date: Sun, 20 Nov 2005 15:03:04 +0300 (MSK)
ены на автоматическое выполнение при загрузке с помо- From: john@mydomain.com

щью chkconfig/ntsysv. Если для вашей ОС или вашего дис- hello


трибутива Linux таких скриптов нет, вам придется настро-
.
ить автозапуск вручную. dele 1
На этом настройку связки Postfix + DBMail + PostgreSQL +OK message 1 deleted
можно считать законченной. quit
+OK see ya later
Создадим тестового пользователя почтовой системы Connection closed by foreign host.
следующим образом:
Итак, DBMail настроен и в первом приближении рабо-
# dbmail-users -a test -w testpwd -s test@mydomain.com тает именно так, как нам нужно.
Opening connection to database...
Opening connection to authentication...
Ok. Connected
Внутреннее устройство
Adding user test with password type ,0 bytes mailbox limit and хранилища DBMail
clientid 0... Ok, user added id [3] После удачного запуска DBMail имеет смысл взглянуть
Adding INBOX for new user
Ok. added
на устройство его хранилища более внимательно. Уже зна-
[test@mydomain.com] комый нам по «DBMail big picture» Wolfram A. Kraushaar на-
Done рисовал ER (Entity-Relationship) модель БД DBMail, смот-
рите рис. 2.
В этом примере с помощью параметра -a указывается Теперь краткое пояснение. Центральной таблицей являет-
имя пользователя, с помощью -w – пароль, а с помощью -s – ся dbmail_users, в которой хранится вся информация о поль-
почтовый ящик, принадлежащий пользователю (у одного зователях: их имена, пароли, текущий и максимальный раз-
пользователя их может быть несколько). мер всех почтовых ящиков, а также дата и время последне-
Отправим созданному пользователю тестовое письмо: го подключения. Каждому пользователю могут соответс-
твовать один или несколько почтовых адресов из таблицы
# echo hello | mail -s «Test Message» test@mydomain.com dbmail_aliases. Впрочем, с помощью алиасов в DBMail мож-
но также пересылать сообщения другим адресатам или пе-
В логах мы должны увидеть нечто вроде: редавать внешним программам на стандартный вход (stdin)
для дальнейшей обработки. Каждому пользователю при-
postfix/qmgr[29149]: 432B01774F: from=<john@mydomain.com>,
size=301, nrcpt=1 (queue active) надлежит один или несколько почтовых ящиков (каталогов
dbmail/lmtpd[29359]: serverchild.c,PerformChildTask: IMAP) из таблицы dbmail_mailboxes, по умолчанию доставка
incoming connection from [127.0.0.1 (localhost.localdomain)]
dbmail/lmtpd[29359]: db.c, db_get_mailbox_from_filters:
осуществляется в ящик по имени INBOX. Кроме владельца,
default mailbox [(null)] с ящиком могут работать и другие пользователи (такие ящи-
dbmail/lmtpd[29359]: sort.c, sort_and_deliver: message id=4, ки называются shared folders) – они описаны в таблице dbmail_
size=333 is inserted
postfix/lmtp[29710]: 432B01774F: to=<test@mydomain.com>, subscription, соответствующие права доступа описаны в таб-
orig_to=<test>, relay=localhost[127.0.0.1], delay=1341, лице dbmail_acl. В каждом ящике хранятся сообщения, IMAP-
status=sent (215 Recipient <test@mydomain.com> OK)
postfix/qmgr[29149]: 432B01774F: removed
флаги сообщений находятся в таблице dbmail_messages,
а содержимое сообщений разбивается на блоки не боль-
Это значит, что письмо успешно доставлено. ше 512 Кб и располагается в таблице dbmail_messageblks –
Попытаемся получить его по протоколу POP3, чтобы каждый блок в отдельной записи. Для увеличения произ-
удостовериться в том, что это действительно так: водительности размер и дата получения сообщения выне-

№1, январь 2006 25


администрирование
новлен. Кроме того, в ALT Linux PostgreSQL выполняется
в chroot-окружении, поэтому нужно проследить за тем, что-
бы все модули Python, которыми мы собираемся воспользо-
ваться, находились там же. Проще всего будет полностью
перенести каталог /usr/lib/python2.3/ в /var/lib/pgsql-root/usr/
lib, а правильнее будет делать это не регулярно при необхо-
димости установить или удалить некоторые модули Python,
а один раз описать необходимую последовательность дейс-
твий в скрипте /etc/chroot.d/postgresql.lib.
Теперь создадим и протестируем функцию, которая будет
извлекать нужный нам заголовок почтового сообщения:

# psql -U dbmail dbmail

dbmail=# create function mailheader(varchar, varchar) ↵


returns varchar as $$
dbmail$# import email.Parser
dbmail$# parser = email.Parser.Parser()
dbmail$# message = parser.parsestr(args[0])
dbmail$# return message.get(args[1])
dbmail$# $$ language plpythonu;
CREATE FUNCTION

dbmail=# select mailheader(messageblk, 'To') ↵


from dbmail_messageblks where is_header=1;
mailheader
---------------------------------------------------
test@mydomain.ru
(записей: 1)

Для того чтобы оценить возможности этого механиз-


ма, у нас слишком маленькая БД. Конечно, можно напи-
сать скрипт, генерирующий множество почтовых сообще-
Рисунок 2. DBMail Entity-Relationship Model
ний, но мы поступим иначе. Допустим, что у нас уже есть
сены в отдельную таблицу dbmail_physmessage. Таблицы архив списка рассылки DBMail-Users в формате Maildir.
dbmail_auto_replies и dbmail_auto_notifications используются С помощью MUA создадим IMAP-каталог, а затем с помо-
для автоматической отправки ответов и уведомлений, а таб- щью скрипта mailbox2dbmail импортируем в него все сооб-
лица dbmail_pbsp – для POP/IMAP-before-SMTP (механизма, щения из архива:
аналогичного SMTP-авторизации, но менее распространен-
ного и менее надежного). # /usr/share/doc/dbmail-2.0.7/contrib/mailbox2dbmail ↵
/mailbox2dbmail -u test -t maildir -m maillist/ ↵
Довольно неудобным обстоятельством является то, что -b INBOX/DBMail-Users -p /usr/sbin/dbmail-smtp
все заголовки каждого сообщения целиком хранятся в од- Processed Message 1
ной строке таблицы dbmail_messageblks – у таких строк зна- ...
чение поля is_header = 1. В нестабильной версии DBMail Processed Message 558
All Done!
заголовки вынесены в отдельную таблицу, и для каждого
выделена собственная запись. Однако вместо того чтобы Теперь можно провести анализ содержимого IMAP-ка-
ждать выхода новой ветки DBMail или использовать неста- талога:
бильную, мы можем реализовать эту функциональность са-
мостоятельно средствами PostgreSQL. # psql -U dbmail dbmail
Воспользуемся тем, что PostgreSQL позволяет созда- dbmail=# select user_idnr, userid from dbmail_users;
вать функции на языке PL/Python и богатыми возможнос-
тями Python в области обработки почтовых сообщений (ра- user_idnr | userid
-----------+--------------------------------
зумеется, этот выбор субъективен: желающие могут реа- 1 | __@!internal_delivery_user!@__
лизовать аналогичную функциональность на PL/PgSQL, 2 | anyone
3 | test
PL/Perl, PL/Tcl или даже на С). Сначала включим подде- (записей: 3)
ржку PL/Python для выбранной БД:
dbmail=# select mailbox_idnr, owner_idnr, ↵
# createlang -U dbmail plpythonu dbmail name from dbmail_mailboxes where owner_idnr = 3;

mailbox_idnr | owner_idnr | name


Для того чтобы эта команда выполнилась, PostgreSQL --------------+------------+--------------------
необходимо собрать с поддержкой PL/Python. В ALT Linux 1 | 3 | INBOX
3 | 3 | Trash
поддержка PL/Python вынесена в пакет postgresql-python, 4 | 3 | INBOX/DBMail-Users
который необходимо доустановить, если он еще не уста- (записей: 3)

26
администрирование
dbmail=# select mailheader(messageblk, 'User-Agent'), ↵  Личные общие каталоги в пространстве имен
count(*)
dbmail=# from dbmail_messages inner join ↵ #Users – настраиваются как администратором, так
dbmail_messageblks и владельцами каталогов средствами MUA (при усло-
dbmail-# on dbmail_messages.physmessage_id = ↵
dbmail_messageblks.physmessage_id вии, что MUA поддерживают эту функциональность).
dbmail-# where mailbox_idnr = 4 and is_header = 1
dbmail-# group by 1
dbmail-# order by 2 desc; Как мы уже выяснили, универсальный инструмент ад-
министратора DBMail – это SQL-консоль выбранной им
mailheader | count
---------------------------------------------------------------------+------ СУБД. Создадим системный общий каталог News и пре-
| 194 доставим доступ к нему пользователю test с помощью это-
Debian Thunderbird 1.0.6 (X11/20050802) | 104
Mozilla Thunderbird 1.0.6 (Windows/20050716) | 49 го инструмента. Сначала необходимо создать пользовате-
Mozilla Thunderbird 1.0.2 (Windows/20050317) | 32
Debian Thunderbird 1.0.2 (X11/20050602) | 30 ля с именем __public__. Мы уже создавали пользователя
Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.7.2) Gecko/20040808 | 15 test с помощью dbmail-users, сделаем теперь то же самое
Mozilla Thunderbird 1.0.6 (X11/20050716) | 12
Mozilla Thunderbird 1.0 (X11/20041206) | 11 средствами SQL:
Mozilla Thunderbird 1.0.7 (X11/20051014) | 9
Mozilla Thunderbird 1.0.7 (Windows/20050923) | 9
Debian Thunderbird 1.0.2 (X11/20050331) | 8 # psql -U dbmail dbmail
Mozilla Thunderbird 1.0 (Windows/20041206) | 8
SquirrelMail/1.4.4 | 7 dbmail=# insert into dbmail_users (userid, passwd)
Mozilla Thunderbird 1.0.6 (Macintosh/20050716) | 7 dbmail-# values ('__public__', 'abracadabra');
Debian Thunderbird 1.0.7 (X11/20051017) | 6
Opera M2/8.50 (Win32, build 7700) | 6 INSERT 0 1
Mozilla Thunderbird 1.0.7 (X11/20051010) | 5
KMail/1.8.2 | 4 dbmail=# select user_idnr from dbmail_users where ↵
Thunderbird 1.4 (Windows/20050908) | 4 userid='__public__';
Mozilla Thunderbird 1.0.5 (Windows/20050711) | 3
Mozilla Thunderbird 1.0.7 (X11/20051013) | 2 user_idnr
Thunderbird 1.5 (Windows/20051025) | 2 -----------
SquirrelMail/1.5.1 [CVS] | 2 5
SquirrelMail/1.4.5 | 2
(1 запись)
Pan/0.14.2.91 (As She Crawled Across the Table (Debian GNU/Linux)) | 2
Mozilla Thunderbird 1.0.7 (X11/20051031) | 2
Mozilla Thunderbird 1.0.6 (X11/20050727) | 2 Теперь создадим каталог News, владельцем которого
Mozilla Thunderbird 1.0.6 (X11/20050826) | 2
SquirrelMail/1.4.3a | 1 будет пользователь __public__:
SquirrelMail/1.4.3a-12.EL4.centos4 | 1
Mozilla Thunderbird 1.0.6 (X11/20050721) | 1
Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.7) Gecko/20041221 | 1 # psql -U dbmail dbmail
Mozilla Thunderbird 1.0.7 (Macintosh/20050923) | 1
Microsoft-Entourage/11.1.0.040913 | 1 dbmail=# insert into dbmail_mailboxes
Mozilla Thunderbird 1.0.7 (X11/20051017) | 1 dbmail=# (owner_idnr, name, seen_flag, answered_flag, ↵
Mozilla Thunderbird 1.0.6-1.4.1.centos4 (X11/20050721) | 1 deleted_flag, flagged_flag,
Mozilla Thunderbird 1.0.7 (X11/20050923) | 1 dbmail=# recent_flag, draft_flag, no_inferiors, ↵
Mozilla Thunderbird 1.0 (X11/20041207) | 1 no_select, permission)
Microsoft-Entourage/11.2.1.051004 | 1
(записей: 39)
dbmail-# values (5, 'News', 1, 1, 1, 1, 1, 1, 0, 0, 2);
INSERT 0 1

Итак, мы получили распределение сообщений в спис- dbmail=# select mailbox_idnr from dbmail_mailboxes ↵
ке рассылки по MUA (точнее, по заголовку User-Agent). За- where name='News';
прос выполнился не слишком быстро, что и не удивитель- mailbox_idnr
но: для каждой строки пришлось вызывать функцию раз- --------------
7
бора содержимого. Чтобы уменьшить время выполнения, (1 запись)
можно создать триггер на вставку записей с сообщениями
и сохранять результаты mailheader в отдельную проиндек- А теперь опишем права доступа для пользователя test
сированную таблицу. Тем самым за счет уменьшения вре- к этому каталогу:
мени анализа сообщений мы получим увеличение време-
ни, затрачиваемого на добавление сообщений, – что важ- # psql -U dbmail dbmail
нее, решать администратору почтовой системы. Впрочем, dbmail=# select user_idnr from dbmail_users ↵
здесь из области администрирования почтового серве- where userid='test';
ра мы переходим в область администрирования баз дан- user_idnr
-----------
ных вообще и администрирования PostgreSQL в частнос- 3
ти – последнему посвящен цикл статей Сергея Супрунова,
уже публиковавшийся в нашем журнале. (1 запись)

dbmail=# insert into dbmail_acl


Shared folders dbmail=# (user_id, mailbox_id, lookup_flag, read_flag, ↵
seen_flag, write_flag,
Трудно представить себе полноценный IMAP-сервер без dbmail=# insert_flag, post_flag, create_flag, delete_flag, ↵
поддержки механизма shared folders, обеспечивающего сов- administer_flag)
dbmail-# values (3, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1);
местный доступ различных пользователей к общим катало-
гам с сообщениями. В DBMail поддерживаются: INSERT 0 1

 Системные общие каталоги в пространстве имен Все, пользователю test осталось только подписаться
#Public – настраиваются администратором почтового на каталог #Public/News средствами своего MUA. Впрочем,
сервера. и это тоже можно выполнить средствами SQL:

№1, январь 2006 27


администрирование
# psql -U dbmail dbmail

dbmail=# select user_idnr from dbmail_users ↵


where userid='test';
user_idnr
-----------
3
(1 запись)

dbmail=# select mailbox_idnr from dbmail_mailboxes ↵


where name='News';

mailbox_idnr
--------------
7
(1 запись)

dbmail=# insert into dbmail_subscription values (3, 7);


INSERT 0 1 Рисунок 3. DbMail Administrator

Возможности перенаправления почты получил около 500 сообщений в течение нескольких секунд
Мы не станем рассматривать эти возможности так же де- на машине с довольно скромной аппаратной конфигураци-
тально, как и shared folders, т.к. общий принцип админист- ей. Прекращать это безобразие пришлось вручную с помо-
рирования DBMail уже понятен. Упомянем только таблицы, щью инструмента postsuper из комплекта Postfix.
принимающие участие в перенаправлении почты:
 dbmail_aliases – в этой таблице каждому почтовому ад- Прочие возможности DBMail
ресу (или нескольким адресам) можно поставить в соот- К числу прочих возможностей почтового сервера, часто
ветствие один или несколько идентификаторов пользо- востребованных администраторами, относятся:
вателей, уже заведенных в DBMail, произвольных адре-  Квоты на размер почтового ящика – поддерживаются
сов и внешних программ, которые получат сообщение в DBMail непосредственно: максимальный размер ящи-
на stdin. Перед именем программы должен быть сим- ка можно указать как при вызове утилиты dbmail-users
вол «|» (в этом случае программа получит сообщение ключом -m, так и изменив значение поля maxmail_size
в необработанном виде) или «!» (к сообщению будет в таблице dbmail_users.
добавлен mbox-заголовок). Вместо непосредственно-  SMTP-авторизация – вообще-то это задача MTA, но пос-
го редактирования таблицы можно также использовать кольку в DBMail уже хранится соответствие имен поль-
утилиту dbmail-users (Примечание: примерно то же зователей и их паролей, есть смысл настроить SASL
самое можно сделать средствами MTA, но не всегда. на использование этой информации.
Postfix, например, обрабатывает собственную табли-  POP/IMAP before SMTP – это альтернатива SMTP-авто-
цу алиасов только в том случае, если в доставке при- ризации, которая опирается на использование таблицы
нимает участие его собственный MDA local. Это не са- dbmail_pbsp и должна быть включена в /etc/dbmail.conf
мый эффективный способ доставки, и при настройке параметрами pop_before-smtp/imap_before_smtp.
DBMail во многих случаях предпочтительнее использо-  SSL/TLS – DBMail не поддерживает этот механизм не-
вать LMTP). посредственно, но есть возможность организовать про-
 dbmail_auto_notifications – в этой таблице для каждо- зрачный с точки зрения клиентов SSL-доступ с помощью
го пользователя DBMail можно указать несколько адре- внешнего ПО, например, stunnel – работа с этим инс-
сов, на которые придут уведомления о получении поль- трументом подробно рассматривалась в цикле статей
зователем сообщения. По умолчанию такая функцио- Андрея Бешкова.
нальность отключена, чтобы ее включить, необходимо  Фильтрация почтовых сообщений на основании
в файле /etc/dbmail.conf в секции SMTP исправить зна- их содержимого – эту задачу и способы ее решения
чение параметра auto_notify с no на yes. мы обсудим позже.
 dbmail_auto_replies – в этой таблице для каждого поль-
зователя DBMail можно указать текст сообщения для Кроме того, DBMail не обошелся без GUI-конфигуратора
автоматического ответа на все приходящие сообще- DbMail Administrator (DBMA), написанного на Perl и ориенти-
ния. По умолчанию такая функциональность также от- рованного на веб. Он доступен на http://library.mobrien.com/
ключена, и чтобы ее включить, необходимо в файле dbmailadministrator и выглядит так (см. рис. 3).
/etc/dbmail.conf в секции SMTP исправить значение па- Есть еще один веб-интерфейс к DBMail – swiftMail (http://
раметра auto_reply с no на yes. www.obfuscatedcode.com/swiftmail/trac), написанный на PHP.
Его можно было бы отнести к классу webmail-приложений,
Использование описанных механизмов требует аккурат- если бы не одна особенность: для чтения почты использу-
ного подхода, иначе очень легко получить зацикливание поч- ется не POP3/IMAP, а прямой доступ к БД DBMail. В насто-
ты. Так я по невнимательности указал для почтового пользо- ящее время доступна альфа-версия swiftMail, поддержи-
вателя в качестве адреса для уведомлений один из его же вающая только MySQL. Поддержка PostgreSQL обещает-
алиасов. После этого вместо одного письма пользователь ся в ближайшем будущем.

28
администрирование
Таблица 1. Способы фильтрации почтовых сообщений средствами DBMail
Способ Преимущества Недостатки
Теряются все преимущества DBMail в производительности. Кроме то-
Использование традиционных MDA Простота, привычность го, все пользователи в DBMail – виртуальные, а не системные, т.е. по-
являются проблемы с разделением доступа к фильтрам
Необходимо отслеживать побочные эффекты при написании фильтров
Использование фильтров MTA + RFC3589 Приемлемая производительность MTA, писать фильтры труднее, чем правила для procmail и maildrop.
Аналогичные проблемы с разделением доступа к фильтрам
Во всех СУБД поддержка триггеров существенно отличается – придет-
ся либо ограничиться поддержкой одной СУБД, либо поддерживать
Высокая производительность, возможность хранить несколько реализаций одной и той же функциональности для каж-
Использование триггеров фильтры в таблице БД и легко разделить доступ к ним дой СУБД. В текущей стабильной версии DBMail на каждый заголовок
с помощью представлений письма не выделяется отдельной записи, т.е. заголовки не очень удоб-
но анализировать – хотя в случае использования PostgreSQL эту про-
блему мы уже решили
Переносимость между различными СУБД, высокая про-
изводительность, возможность хранить фильтры в таб-
Необходимо изучение исходного кода DBMail, возможно внесение
Написание собственного патча лице БД и разделить доступ к ним, простота анализа
ошибок в код
заголовков (это стало ясно только после изучения ис-
ходного кода)

Фильтрация почтовых сообщений Сравним их (см. таблицу 1). После недолгих раздумий
средствами DBMail выбор был сделан в пользу последнего варианта. Самым
Общеизвестным преимуществом IMAP является то, что поч- трудным оказалось не реализовать нужную функциональ-
товый пользователь может работать со своей и общей кор- ность, а найти место в коде, куда ее необходимо вставить,
респонденцией с разных рабочих мест с помощью совер- не нарушив при этом работоспособности всего остально-
шенно различных MUA: как традиционных, так и ориенти- го. Решение задачи сильно упростило то, что в DBMail хо-
рованных на веб. Это означает, что правила, в соответствии рошо организовано ведение логов. Для каждого демона в
с которыми сообщения распределяются по каталогам IMAP, конфигурационном файле можно задать уровень отладки
должны определяться не на уровне MUA, а на уровне MDA. (параметр trace_level), определяющий степень детализа-
В настоящее время в DBMail отсутствуют штатные спо- ции выводимых отладочных сообщений.
собы решения этой задачи. В будущих версиях планирует- При максимальном уровне отладки (trace_level=5 в сек-
ся использование специализированного языка программи- ции LMTP) во время доставки сообщения в логах можно
рования для фильтрации почтовых сообщений Sieve (опи- увидеть очень много сообщений, но наиболее интересным
сан в RFC 3028, активно используется в Cyrus IMAP), код является следующий фрагмент:
поддержки Sieve даже есть в текущей стабильной версии, dbmail/lmtpd[5327]: pipe.c, insert_messages: temporary msgidnr is [11]
но он не завершен и недостаточно протестирован, поэто- dbmail/lmtpd[5327]: pipe.c, insert_messages: calling sort_and_deliver
for useridnr [7]
му при компиляции по умолчанию поддержка Sieve отклю- dbmail/lmtpd[5327]: dbpgsql.c,db_query: executing query
чена. Кроме того, для большинства случаев Sieve являет- [SELECT mailbox_idnr FROM dbmail_mailboxes WHERE name='INBOX'
AND owner_idnr='7']
ся слишком мощным инструментом. dbmail/lmtpd[5327]: db.c, db_find_create_mailbox: mailbox [INBOX] found
Сформулируем, что нам требуется от простейшего ме- dbmail/lmtpd[5327]: dbpgsql.c,db_query: executing query
[SELECT pm.messagesize FROM dbmail_physmessage pm, dbmail_messages msg
ханизма фильтрации почтовых сообщений: WHERE pm.id = msg.physmessage_id AND message_idnr = '11']
 Каждый пользователь может задать собственный спи- dbmail/lmtpd[5327]: dbpgsql.c,db_query: executing query [SELECT 1 FROM
dbmail_users WHERE user_idnr = '7' AND (maxmail_size > 0)
сок фильтров и назначить их приоритеты. AND (curmail_size + '363' > maxmail_size)]
 Фильтр представляет из себя соответствие названия dbmail/lmtpd[5327]: misc.c,create_unique_id: created:
62ee468abbec0e64995295a02f0dcd5d
заголовка письма и его значения IMAP-каталогу, в ко- dbmail/lmtpd[5327]: dbpgsql.c,db_query: executing query [INSERT INTO
торый должно попасть письмо. dbmail_messages (mailbox_idnr,physmessage_id, seen_flag, answered_flag,
deleted_flag, flagged_flag, recent_flag, draft_flag, unique_id, status)
 Письмо попадает в каталог, если значение заголовка SELECT '9', physmessage_id, seen_flag, answered_flag, deleted_flag,
в письме содержит в себе значение заголовка в филь- flagged_flag, recent_flag, draft_flag, '62ee468abbec0e64995295a02f0dcd5d',
status FROM dbmail_messages WHERE message_idnr = '11']
тре. dbmail/lmtpd[5327]: dbpgsql.c,db_query: executing query
[SELECT currval('dbmail_message_idnr_seq')]
dbmail/lmtpd[5327]: db.c,db_add_quotum_used: adding 363 to mailsize
А теперь перечислим те способы решения задачи, ко- dbmail/lmtpd[5327]: db.c.user_idnr_is_delivery_user_idnr: no need to
торые пришли мне в голову: look up user_idnr for __@!internal_delivery_user!@__
dbmail/lmtpd[5327]: dbpgsql.c,db_query: executing query
 Использование традиционных MDA (procmail, maildrop) [UPDATE dbmail_users SET curmail_size = curmail_size + '363'
и dbmail-smtp. WHERE user_idnr = '7']
dbmail/lmtpd[5327]: sort.c, sort_and_deliver: message id=12,
 Использование фильтров MTA и патча для поддержки size=363 is inserted
RFC 3589 (Sieve Email Filtering – Subaddress Extension: dbmail/lmtpd[5327]: pipe.c, insert_messages: successful sort_and_
deliver for useridnr [7]
user+folder@server) в dbmail-lmtpd. Патч можно взять
здесь – http://www.dbmail.org/mantis/bug_view_advanced_ Похоже, что именно здесь и происходит сохранение со-
page.php?bug_id=0000057. общения. Код, выводящий это сообщение, выглядит так:
 Использование средств СУБД (триггеров) для модифи-
кации записей, соответствующих сообщению, в БД. trace(TRACE_DEBUG,
"%s, %s: calling sort_and_deliver for useridnr [%llu]",
 Написание собственного патча. __FILE__, __func__, useridnr);

№1, январь 2006 29


администрирование
dsn_result = sort_and_deliver(tmpmsgidnr, msgsize, ↵ struct element *el = list_getstart(headerfields);
useridnr, delivery->mailbox); char *filter_field = db_get_result(i, 0);
char *filter_value = db_get_result(i, 1);
Можно заглянуть в реализацию sort_and_deliver и най- char *mailbox = db_get_result(i, 2);
ти там подтверждение догадки. trace(TRACE_MESSAGE,
В delivery->mailbox по умолчанию передается [null]. Таким "%s, %s: processing filter [%s : ↵
\"%s\" => %s]",
образом, задача сводится к тому, чтобы, проанализировав __FILE__, __func__, filter_field, ↵
заголовки сообщения, передать в delivery->mailbox имя ката- filter_value, mailbox);
лога IMAP. Заголовки сообщения функция insert_messages while (el) {
получает в виде структуры headerfields. struct mime_record *record = ↵
(struct mime_record *) el->data;
После того как исходные данные для определения ка-
талога назначения и параметр, в который нужно передать trace(TRACE_MESSAGE,
"%s, %s: processing header ↵
имя каталога, определены, можно реализовать функцию, [%s : \"%s\"]",
которая и будет выполнять эту задачу. __FILE__, __func__, ↵
record->field, ↵
Вызов функции будет выглядеть так: record->value);

trace(TRACE_DEBUG, if (!strcmp(record->field,
"%s, %s: calling sort_and_deliver for useridnr [%llu]", filter_field) && ↵
__FILE__, __func__, useridnr); strstr(record->value, ↵
filter_value)) {
dsn_result = sort_and_deliver(tmpmsgidnr, msgsize, ↵
useridnr, db_get_mailbox_from_filters(useridnr, ↵ trace(TRACE_MESSAGE,
headerfields, delivery->mailbox)); "%s, %s: header [%s : ↵
\"%s\"] accept filter ↵
[%s : \"%s\" => %s]",
__FILE__, __func__, ↵
Прототип функции, который мы поместим в db.h: record->field, ↵
record->value, ↵
char *db_get_mailbox_from_filters(u64_t useridnr, ↵ filter_field, ↵
struct list *headerfields, const char *mailbox); filter_value, ↵
mailbox);
При реализации функции необходимо использовать return mailbox;
следующую таблицу: }

el = el->nextnode;
CREATE TABLE dbmail_filters ( }
user_id INT8 REFERENCES dbmail_users(user_idnr) ↵
ON DELETE CASCADE ON UPDATE CASCADE, trace(TRACE_MESSAGE,
filter_id INT8, "%s, %s: no header accept filter ↵
filter_field varchar(128) NOT NULL, [%s : \"%s\" => %s]",
filter_value varchar(255) NOT NULL, __FILE__, __func__, filter_field, ↵
mailbox varchar(100) NOT NULL, filter_value, mailbox);
PRIMARY KEY (user_id, filter_id) }
);
CREATE INDEX dbmail_user_id_idx ON dbmail_filters(user_id); db_free_result();
CREATE INDEX dbmail_filter_id_idx ON dbmail_filters(filter_id);
return NULL;
В качестве образца чтения таблицы из БД можно исполь- }
else
зовать функцию db_get_users_from_clientid из db.c. В ре- {
зультате реализация функции db_get_mailbox_from_filters return mailbox;
}
в файле db.c будет выглядеть так: }

char *db_get_mailbox_from_filters(u64_t useridnr, ↵ После внесения изменений в код, перекомпиляции, созда-


struct list *headerfields, const char *mailbox)
{ ния таблицы фильтров в БД и ее заполнения новый механизм
trace(TRACE_MESSAGE, "%s, %s: default mailbox [%s]", ↵ фильтрации был тщательно протестирован. Ошибок выявле-
__FILE__, __func__, mailbox);
но не было. Фрагмент лога, в котором виден процесс анализа
if (mailbox == NULL) заголовков почтового сообщения, теперь выглядит так:
{
unsigned i = 0; dbmail/lmtpd[5329]: pipe.c, insert_messages: temporary msgidnr is [13]
unsigned num_filters = 0; dbmail/lmtpd[5329]: pipe.c, insert_messages: calling sort_and_deliver
for useridnr [7]
snprintf(query, DEF_QUERYSIZE, dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters:
"SELECT filter_field, filter_value, mailbox ↵ default mailbox [(null)]
FROM dbmail_filters WHERE user_id = '%llu' ↵ dbmail/lmtpd[5329]: dbpgsql.c,db_query: executing query
ORDER BY filter_id", [SELECT filter_field, filter_value, mailbox FROM dbmail_filters
useridnr); WHERE user_id = '7' ORDER BY filter_id]
dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters:
if (db_query(query) == -1) { processing filter [Subject : "Test" => MyFolder]
trace(TRACE_ERROR, "%s,%s: error gettings dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters:
filters for " processing header [From : "test@mydomain.com"]
"user_id [%llu]", __FILE__, __func__, dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters:
useridnr); processing header [Date : "Mon, 24 Oct 2005 10:42:25 +0400 (MSD)"]
return NULL; dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters:
} processing header [Message-Id :
"<20051024064225.588B73BED@mydomain.com>"]
num_filters = db_num_rows(); dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters:
for (i = 0; i < num_filters; i++) {

30
администрирование
processing header [Subject : "Test Message"]  использование нескольких критериев, объединенных
dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters:
header [Subject : "Test Message"] accept filter
с помощью операций AND и OR, в одном фильтре;
[Subject : "Test" => MyFolder]  дополнительные функции обработки сообщений (на-
dbmail/lmtpd[5329]: dbpgsql.c,db_query: executing query
[SELECT mailbox_idnr FROM dbmail_mailboxes WHERE name='MyFolder'
пример, обработка сообщений внешними программа-
AND owner_idnr='7'] ми по pipe-интерфейсу).
dbmail/lmtpd[5329]: dbpgsql.c,db_query: previous result set is
possibly not freed.
dbmail/lmtpd[5329]: dbpgsql.c,db_query: executing query Итоги
[INSERT INTO dbmail_mailboxes (name, owner_idnr,seen_flag,
answered_flag, deleted_flag, flagged_flag, recent_flag, draft_flag,
Проекту DBMail придется пройти еще долгий путь, чтобы за-
permission) VALUES ('MyFolder', '7', 1, 1, 1, 1, 1, 1, 2)] служить признание и получить такую же популярность, как,
dbmail/lmtpd[5329]: dbpgsql.c,db_query: executing query
[SELECT currval(‘dbmail_mailbox_idnr_seq’)]
например, Courier IMAP или Cyrus IMAP. Но уже сейчас вид-
dbmail/lmtpd[5329]: db.c, db_find_create_mailbox: mailbox но, что его потенциальные возможности очень широки.
[MyFolder] created on the fly
dbmail/lmtpd[5329]: db.c, db_find_create_mailbox: mailbox
В будущих версиях планируется реализовать следую-
[MyFolder] found щее (часть уже реализована в версии 2.1.3):
dbmail/lmtpd[5329]: dbpgsql.c,db_query: executing query
[SELECT pm.messagesize FROM dbmail_physmessage pm, dbmail_messages msg
 Использование LDAP для аутентификации – это
WHERE pm.id = msg.physmessage_id AND message_idnr = '13'] уже поддерживается ведущими POP3/IMAP-сервера-
dbmail/lmtpd[5329]: dbpgsql.c,db_query: executing query
[SELECT 1 FROM dbmail_users WHERE user_idnr = '7' AND
ми и очень удобно для ведения единой БД пользовате-
(maxmail_size > 0) AND (curmail_size + '363' > maxmail_size)] лей, единой адресной книги и т. д.
dbmail/lmtpd[5329]: misc.c,create_unique_id: created:
701c6fdeea62fbc2ed575ff730561c80
 Организация пользователей в группы – поможет уп-
dbmail/lmtpd[5329]: dbpgsql.c,db_query: executing query ростить управление пользователями и раздавать пол-
[INSERT INTO dbmail_messages (mailbox_idnr,physmessage_id, seen_flag,
answered_flag, deleted_flag, flagged_flag, recent_flag, draft_flag,
номочия не отдельным пользователям, а целым груп-
unique_id, status) SELECT '10', physmessage_id, seen_flag, пам.
answered_flag, deleted_flag, flagged_flag, recent_flag, draft_flag,
'701c6fdeea62fbc2ed575ff730561c80', status FROM dbmail_messages
 Хранение разных заголовков и вложений отдельно –
WHERE message_idnr = '13'] позволит значительно упростить анализ корреспонден-
dbmail/lmtpd[5329]: dbpgsql.c,db_query: executing query
[SELECT currval('dbmail_message_idnr_seq')]
ции посредством написания SQL-запросов. Примерно
dbmail/lmtpd[5329]: db.c,db_add_quotum_used: adding 363 to mailsize то же самое мы сегодня реализовали самостоятельно,
dbmail/lmtpd[5329]: db.c.user_idnr_is_delivery_user_idnr: no need to
look up user_idnr for __@!internal_delivery_user!@__
но только для PostgreSQL.
dbmail/lmtpd[5329]: dbpgsql.c,db_query: executing query  Sieve – как средство фильтрации почтовых сообщений,
[UPDATE dbmail_users SET curmail_size = curmail_size + '363'
WHERE user_idnr = '7']
очень примитивный аналог которого мы также сегодня
dbmail/lmtpd[5329]: sort.c, sort_and_deliver: message id=14, size=363 реализовали.
is inserted
dbmail/lmtpd[5329]: pipe.c, insert_messages: successful sort_and_
 Индивидуальные черные списки и фильтры для
deliver for useridnr [7] пользователей – позволят пользователям самостоя-
тельно указывать, письма от кого им не хотелось бы чи-
При этом содержимое таблицы фильтров таково: тать.
 Графические средства администрирования – пока
# psql -U dbmail dbmail многие возможности DBMail можно задействовать толь-
dbmail=# select * from dbmail_filters; ко путем внесения исправлений в БД– с помощью на-
user_id | filter_id | filter_field | filter_value | mailbox писания SQL-инструкций (хотя DbMail Administrator ре-
---------+-----------+--------------+--------------+---------- шает большинство проблем такого рода).
6 | 0 | Subject | Test | MyFolder
(1 запись)  Средства администрирования по протоколам XML-
RPC/SOAP – основные настройки DBMail хранятся
Изменения были оформлены как .diff (с помощью утилиты не в БД, а в файле /etc/dbmail.conf (например, там ука-
gendiff – после этого они могут быть использованы утилитой зывается имя БД и логин/пароль для доступа к ней).
patch для автоматического внесения изменений в оригиналь- К этим настройкам, а также к настройкам, хранящим-
ный исходный код) и отправлены в списки рассылки пользо- ся в БД, было бы очень удобно иметь унифицирован-
вателей и разработчиков DBMail. По согласованию с лидером ный доступ.
проекта эти изменения не внесены в основную стабильную
ветку, но патч включен в архив с кодом, и пакет DBMail для Посмотрим, что ожидает DBMail в будущем.
Debian Linux собран с этим патчем (т.к. лидер проекта по сов-
местительству еще и мантейнер этого пакета в Debian). Па- Литература, ссылки:
кет DBMail для ALT Linux также собран с этим патчем. Поль- 1. http://dbmail.org/dokuwiki/doku.php.
зователи прочих дистрибутивов Linux или других UNIX-сис- 2. Бешков А. Защита сетевых сервисов с помощью stunnel (1-3
тем могут собрать DBMail с ним самостоятельно. части). – Журанал «Системный администратор», №12, 2004 г.,
Разумеется, патч не идеален, и в будущем, может быть, №1, 2005 г., №3, 2005 г.
придется усовершенствовать его, добавив: 3. Супрунов С. PostgreSQL: первые шаги. Журнал «Системный
 использование регулярных выражений POSIX вместо администратор», №7, 2004 г. – 26-33 с.
простого поиска подстроки; 4. Супрунов С. PostgreSQL: функции и триггеры. – Журнал «Сис-
 кэширование содержимого таблицы фильтров, чтобы темный администратор», №10, 2004 г. – 42-47 с.
не выполнять SQL-запрос при анализе каждого сооб- 5. Супрунов С. PostgreSQL 8.0: новые возможности. – Журнал
щения; «Системный администратор», №3, 2005 г. – 7 с.

№1, январь 2006 31


администрирование

Штопаем дыры в Ilohamail


Доверяй, но проверяй

(народная мудрость)

Сергей Супрунов
Доступ к электронной почте через веб-интерфейс обеспечивает дополнительные удобства.
Однако мы не всегда задумываемся о потенциальных проблемах безопасности, а ведь даже
такой безобидный пакет, как Ilohamail имеет несколько неприятных дыр.

Знакомство с Ilohamail цы проекта (http://ilohamail.org/main. вому ящику осуществляется по прото-


Ilohamail – это разработанный на PHP4 php?page=Downloads, см. также http:// колу POP3 или IMAP (в зависимости
пакет, обеспечивающий возмож- sourceforge.net/projects/ilohamail). от выбора пользователя, сделанного
ность работать с POP3- и IMAP-сер- Отличительной особенностью этой во время аутентификации, или конфи-
верами непосредственно с интернет- программы от многих других (наподо- гурационных параметров), и все сце-
страницы. Во FreeBSD вы найдете его бие OpenWebMail) является то, что она нарии исполняются от имени пользо-
в коллекции портов (mail/ilohamail), не использует для работы небезопас- вателя, с чьими правами работает веб-
для Linux можете скачать исходные ных методов, таких как suexec или suid- сервер (для Apache это, как правило,
коды, rpm- или deb-пакет, со страни- perl. В данном случае доступ к почто- пользователь www).

32
администрирование
Установка по крайней мере на на, и разобраться при необходимости Нужно заметить, что в Apache вы-
FreeBSD при использовании коллек- в ней не составит особого труда. вод содержимого каталога при отсутс-
ции портов никаких сложностей не вы- Кажется, что проще и быть не мо- твии в нем индексного файла по умол-
зывает – в /usr/local/www будет создан жет, но именно эта простота влечет за чанию запрещен. При попытке досту-
каталог ilohamail со всеми необходи- собой несколько не слишком опасных, па к нему будет выведена ошибка «403
мыми файлами. Скопируйте его в нуж- но все же неприятных проблем безо- Forbidden». Однако при подключен-
ный каталог в иерархии вашего веб- пасности, о решении которых мы и по- ном модуле mod_autoindex возмож-
сайта, и можно сразу вызывать старто- говорим. но построение так называемого авто-
вую страничку из вашего браузера. Для определенности будем считать, матического индекса, что достигается
Предельно аскетический дизайн что базовый адрес для доступа к стра- включением параметра Indexes в стро-
(минимум графики и вообще немно- ницам ilohamail – http://www.myserver. ку Options.
гословность) придется по вкусу поль- ru/ilohamail, а веб-сервер работает Например, чтобы разрешить авто-
зователям, работающим по комму- от имени пользователя www. индекс для корневого каталога (и всех
тируемым соединениям, да и «выде- вложенных), можно использовать сле-
ленщики» по достоинству оценят воз- Настраиваем доступ дующую запись:
можность немного сэкономить на тра- к пользовательским
фике и не рыскать по страничке в по- данным <Directory />
Options Indexes
исках нужной кнопки среди множест- Хотя работа с почтовым ящиком ведет- </Directory>
ва подсказок. Единственное, что мне ся непосредственно с помощью одно-
сразу же захотелось изменить, – это го из протоколов, Ilohamail все же со- При необходимости в этой же стро-
используемый по умолчанию цвет фо- храняет несколько последних сооб- ке можно указать и другие опции. Та-
на. Его (а также некоторые другие на- щений, считанных в предыдущем се- ким образом, в большинстве случа-
стройки) можно поменять в файле ансе работы в каталоге data/cache/ ев вам достаточно убедиться, что та-
conf/defaults.generic.inc и в некоторых <адрес_пользователя>. Поскольку кая опция не распространяется на
файлах в каталогах source/themes. каталог data по умолчанию хранится «проблемный» каталог. Не забывай-
По умолчанию пользователь мо- в дереве каталогов веб-сервера, то те, что она может находиться и в фай-
жет при входе задать протокол (POP3 простое обращение по адресу http:// ле .htaccess данного или одного из вы-
или IMAP), по которому будет произво- www.myserver.ru/ilohamail/data/cache/ шестоящих каталогов.
диться подключение к серверу, а также serg.myserver.ru выведет список фай- Кстати, еще один способ избежать
адрес сервера. Кроме того, можно вы- лов кэша, где хранятся сообщения указанной выше проблемы с выда-
брать из огромного количества языков пользователя serg@myserver.ru. Ко- чей содержимого каталога – создать
интерфейса тот, с которым вам удоб- нечно, если настройки веб-сервера за- в нем любой индексный файл, можно
нее работать (в списке присутствует прещают просмотр содержимого ката- даже пустой.
и русский). Если вы хотите обеспечить лога при отсутствии в нем индексно- Кроме того, точно так же мож-
пользователям возможность работать го файла, то задача для злоумышлен- но просмотреть настройки пользо-
только с вашим сервером по конкрет- ника усложняется, т.к. имя кэш-файла вателя в каталоге data/users/<адрес_
ному протоколу, в файле conf/login.inc представляет собой случайный иден- пользователя>/. Действительно инте-
задайте параметр $default_host, а так- тификатор, угадать который не так уж ресного здесь не так уж и много (раз-
же присвойте значение «1» перемен- и легко. Например, он может называть- ве что файл key.inc, содержащий пе-
ным, отвечающим за отображение ся так: 007c01c60c52%24fed21430%24 ременную $passkey, которая содержит
соответствующих подписей к полям 30003d0a%40RGSUFO.local. в зашифрованном виде имя пользова-
($hide_protocol, $hide_host и др.) Вы-
бор протокола осуществляется указа- «Бедная кошечка» сервер (протокол IMAP вообще не подде-
нием порта ($default_port), кроме того, В этой же статье уместно рживается) – его имя жестко прописыва-
протокол и номер порта можно указать несколько слов сказать об еще одном по- ется в конфигурации (файл inc/config.php).
и в переменной $default_host (см. ком- добном проекте со странным названием Поэтому проблемы, связанные с аноним-
ментарии в конфигурационном файле). UebiMiau (порт mail/uebimiau, сайт: http:// ной отправкой сообщения или взломом
Здесь же вы можете указать и исполь- www.uebimiau.org). Данный пакет работа- почтового ящика, для UebiMiau не столь
зуемый по умолчанию язык интерфей- ет по тому же принципу, разработан тоже актуальны.
са ($default_lang). на PHP, и ему присущи некоторые из опи- Однако пользовательские данные по-
Вы можете подстроить в других санных проблем. прежнему хранятся (по умолчанию) в де-
файлах в каталоге conf еще некоторые Наиболее заметные отличия от Ilohamail реве веб-сайта, так что перенос катало-
параметры. Однако если возникнет же- в этом плане – для всех файлов, включая га database за его пределы также край-
лание внести более серьезные измене- конфигурационные, используется расши- не желателен (новый путь прописывает-
ния в интерфейс (например, добавить рение php, что при правильной настройке ся в параметре $temporary_directory фай-
на стартовую страницу свой логотип), веб-сервера должно уберечь от чтения их ла inc/config.php).
то придется заняться непосредствен- содержимого через обычный http-запрос. Ну и если вас беспокоит репутация ва-
ной правкой php-файлов. Впрочем, К тому же здесь не предусмотрена возмож- шей компании, то логотип на странице ау-
структура пакета не слишком слож- ность использовать произвольный POP3- тентификации тоже придется сменить…

№1, январь 2006 33


администрирование
воспользоваться вашим сайтом для взлома чужого ящика
методом подбора пароля, причем с точки зрения постра-
давшего сервера, источником атаки будет являться имен-
но ваш IP-адрес.
Таким образом, если вы не строите сознательно сер-
вис для анонимного доступа к любым почтовым ящикам,
то имеет смысл принудительно указать в настройках пакета
ваш сервер и исключить возможность указывать имя про-
извольного сервера. Для этого нужно указать разрешен-
Рисунок 1. Ilohamail с более приятным цветом фона ный адрес (или список адресов, если серверов несколь-
ко) в переменной $default_host в файле conf/login.inc; так-
теля и пароль для доступа к почтовому серверу). Тем не ме- же потребуется установка $hide_host = 1, чтобы скрыть не-
нее даже такая информация, как любимый цвет человека, нужную подпись в форме.
может рассматриваться как конфиденциальная (особенно К счастью, этого оказывается достаточно, посколь-
если он использует это в «секретном вопросе» в какой-ни- ку Ilohamail проводит проверку введенного имени серве-
будь системе напоминания паролей). ра, и если оно отличается от прописанного в $default_host,
Однако чтобы не искушать судьбу, лучше вынести ка- то значение хоста обнуляется, что приводит к ошибке «Could
талог data за пределы иерархии каталогов, доступных веб- not connect to …». Благодаря этому злоумышленник не смо-
серверу (например, /var/db/ilohamail выглядит подходящим жет выполнить авторизацию из внешней формы (сохранив
местом). Обеспечьте пользователю www (и только ему) бес- файл source/index.php, точнее, тот html-код, который этим
препятственный доступ к этому каталогу и его внутрен- сценарием формируется, локально, и изменив/добавив до-
ностям на чтение и запись, а в конфигурационном фай- полнительные параметры). Точнее, внешние формы работа-
ле conf/conf.inc измените соответствующие пути к файлам ют, но в рамках указанных в конфигурации ограничений.
(переменные $UPLOAD_DIR, $CACHE_DIR, $USER_DIR,
$SESSION_DIR). Возможность анонимной рассылки
Вместо «плоских» файлов для хранения некоторых дан- сообщений от вашего имени
ных может использоваться и база данных MySQL (см. файл Если вы все же оставили пользователю возможность са-
conf/db_conf.php). мостоятельно указывать сервер входящих сообщений, то
он сможет войти в интерфейс управления, введя аутен-
Раскрытие конфигурации тификационные данные любого своего ящика, например,
По умолчанию конфигурационные и прочие настроеч- размещенного на одном из бесплатных серверов. Одна-
ные файлы имеют расширение inc (исключение составля- ко отправка сообщения будет осуществляться через smtp-
ет лишь db_conf.php), однако Ilohamail в процессе инстал- сервер, указанный в переменной $SMTP_SERVER файла
ляции не предпринимает никаких действий, чтобы ограни- conf/conf.inc. Если к этому прибавить возможность указы-
чить к ним доступ через веб-браузер. Учитывая, что файлы вать в настройках произвольный адрес отправителя, то по-
конфигурации могут хранить в открытом виде логин/пароль лучается, что любой пользователь, имеющий где-либо ящик
для авторизации на smtp-сервере, опасность этого доста- электронной почты, сможет отправить сообщение от ваше-
точно высока. Да и вообще, не очень хорошая идея – пре- го имени (или от имени пользователя, у которого зарегист-
доставить всем возможность видеть настройки пакета, на- рирован почтовый ящик на вашем сервере). И при этом все
пример, пути доступа к пользовательским файлам. параметры заголовка, такие как IP-адрес, будут однозначно
Поэтому нужно озаботиться ограничением доступа указывать на ваш сервер, что усилит в глазах получателя
к inc-файлам силами веб-сервера. Для Apache соответс- достоверность сообщения, а, следовательно, сделает ата-
твующий фрагмент файла httpd.conf может выглядеть та- ку более успешной, а вас – первым подозреваемым.
ким образом: Для снижения этой опасности ограничьте возмож-
ность использования произвольных серверов для автори-
<Files ~ "\.inc$"> зации в Ilohamail так, как это описано в предыдущем под-
Order allow,deny
Deny from all разделе.
</Files>
Выводы
Аналогичное ограничение можно наложить и только Как видите, даже такой простой пакет, как Ilohamail, кото-
на нужный каталог, например, используя .htaccess (хотя, ес- рый, казалось бы, не дает даже поводов усомниться в его
ли вы единственный, кому может понадобиться менять на- безопасности, требует к себе пристального внимания и кри-
стройки сервера, то по соображениям быстродействия луч- тического отношения. Естественно, я не ставил своей це-
ше от использования файлов .htaccess отказаться). лью запугать вас и заставить отказаться от использования
веб-интерфейсов или вообще Интернета. При учете всех
Возможность анонимного доступа описанных «мелочей» Ilohamail сможет послужить вам ве-
к почтовому ящику рой и правдой. Просто, когда вам доведется устанавли-
Если пользователю разрешено самостоятельно указы- вать что-то подобное, не забывайте, что на самом деле все
вать POP3- или IMAP-сервер, то злоумышленник может не так уж и просто.

34
администрирование

Строим мультидоменный почтовый


сервер с защитой от вирусов и спама

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

№1, январь 2006 35


администрирование

С
разу хотелось бы отметить, что данный труд не пред- # make WITH_CHARSET=koi8_ru WITH_CHARSET=cp1251 ↵
WITH_CHARSET=utf8 WITH_CHARSET=latin1 ↵
назначен для новичков в мире UNIX. Несмотря на мои WITH_XCHARSET=all all install clean
старания излагать всё как можно подробнее, мно-
гие вещи, очевидные для любого подкованного UNIX-ад- Настраиваем запуск так, чтобы MySQL стартовал пе-
мина, остались за бортом, иначе пришлось бы писать це- ред всеми сервисами.
лый сериал. По ходу повествования я буду кратко объяс- Создаем скрипты для запуска MySQL:
нять, что и зачем мы делаем. Надеюсь, такого уровня под-
робностей хватит большинству читателей. # cd /usr/local/etc/rc.d/
# mv 000.mysql-client.sh 010.mysqlc.sh
Итак, наша почтовая система будет использовать толь- # mv mysql-server.sh 015.mysqls.sh
ко свободное программное обеспечение. Для выполнения
поставленной задачи нам понадобится следующее: При стандартной установке FreeBSD создается слиш-
 Exim – MTA (Mail Tranfer Agent), на момент написания ком маленький раздел /var для хранения базы нашего поч-
статьи доступная версия 4.53. тового сервера, этого не достаточно, для этого переместим
 MySQL – реляционная СУБД требуется для более удоб- БД MySQL в /usr/local/database/mysql во избежание проблем
ного управления пользователями и доменами, которые с нехваткой места для базы в дальшейшем.
будет поддерживать наш почтовый сервер. Добавляем в файл /etc/rc.conf:
 Courier-Imap – один из самых быстрых и защищенных
серверов для работы с почтовыми ящиками, поддержи- mysql_enable="YES"
mysql_dbdir="/usr/local/database/mysql"
вающий работу по протоколу SSL.
 DSPAM – быстрый и очень гибкий в настройке антиспам Создадим директорию для хранения базы MySQL и пере-
фильтр. дадим права пользователю, от которого работает MySQL:
 SquirrelMail – один из самых лучших веб-интерфейсов
для работы с почтовыми ящиками. # mkdir -p /usr/local/database/mysql
# chown -R mysql:mysql /usr/local/database/mysql
 ClamAV – наиболее зрелый из бесплатных антивирус-
ных фильтров. Запускаем сервер баз данных:
 ОС FreeBSD версии 5.4 с последними патчами.
# /usr/local/etc/rc.d/010.mysqlc.sh start
# /usr/local/etc/rc.d/015.mysqls.sh start
В принципе можно взять любую другую UNIX-подобную
ОС. Немного изменится принцип установки программного Все должно пройти без сучка и без задоринки, если
обеспечения, но в целом все остальное будет актуально. что-то пошло не так, проверьте права на папку /usr/local/
Надеюсь, у всех присутствует подключение к Интерне- database/mysql, она должна принадлежать пользователю
ту, имеется последняя обновленная версия портов, DNS mysql, иначе сервер откажется запускаться.
настроен верно, MX-записи не кривые, и имя хоста отве- Производим первичную настройку и защиту нашего
чает вашим желаниям для использования его в качестве SQL-сервера. Вместо «testpassword» и «youpassword» сле-
почтового сервера. дует использовать пароли, которые вы придумаете сами.
Предупреждение: использование мультидоменного Выполнив вышеуказанные действия, можно хотя бы ми-
почтового сервера накладывает определенные правила на нимально обезопасить себя от взлома. В случае если ба-
формат учетных записей пользователя, которые использу- за MySQL находится на удаленной машине, нужно вмес-
ются для аутентификации. Аутентификация пользователей то «exim@localhost» использовать имя с указанием хоста,
производится по полному почтовому адресу, включая назва- от которого будет производиться соединение.
ние домена (к примеру, user@test.com).
Для создания файлов будем использовать следующую # /usr/local/bin/mysqladmin -u root password 'testpassword';
конструцию: «cat > filename << "EOF"». Записывать данные
в файл, пока не встретится слово EOF. Запускаем клиент mysql и попадаем в консоль сервера
MySQL, дальнейшие команды выполняем в нем:
Установка MySQL
Установить СУБД MySQL несложно, требуется лишь соблю- # mysql -u root -ptestpassword
дать определенные правила при сборке. Нужно точно оп-
ределиться, будут ли база сервера и сам почтовый сервер Удаляем тестовую базу:
на одном хосте или на разных (я всегда держу отдельной
машиной сервер баз данных, к которому произвожу подклю- mysql> drop database test;
чение, дабы разгрузить основной сервер, но это на ваше ус-
мотрение). Если БД будет на другом хосте, требуется поза- Подключаемся к базе с именем mysql:
ботиться об удаленном доступе к хосту с базой, а для хоста
с почтовым сервером достаточно собрать только клиента. mysql> use mysql;
В нашем случае все работает на одной машине.
Собираем MySQL: Удаляем все записи о правах на базы данных:

# cd /usr/ports/databases/mysql41-server/ mysql> delete from db;

36
администрирование
Удаляем все учетные записи, которые не относятся к ру- Далее пока оставляем настройку Exim (вернемся к ней
ту и локальному хосту: позже). Продолжим подготавливать нашу базу данных
для работы Exim.
mysql> delete from user where not (user='root' ↵ Созаем файл exim.sql (см. содержание файла в прило-
and host='localhost');
жении [9]):
Создаем базу данных для Exim:
# cd /usr/local/databases
mysql> create database mail; # cat > exim.sql << "EOF"
...
EOF
Передаем права пользователю Exim на почтовую ба-
зу данных: Выполняем команды, записанные в файл. Существует
несколько способов сделать это.
mysql> grant all on mail.* to exim@localhost identified ↵ Вариант 1:
by 'youpassword';

Выходим из консоли сервера: # mysql -u root -ptestpassword exim < exim.sql

mysql> \q Вариант 2:

MySQL мы подготовили, теперь приступим к установке # mysql -u root -ptestpassword


mysql> use exim
собственно самого Exim. Зачем нужны приведенные ниже mysql> ./exim.sql
опции, разобраться будет несложно, достаточно вниматель- mysql> \q
но прочитать файл EDITME, находящийся в папке src кор-
невого каталога с исходными текстами Exim. Возвращаемся к настройке Exim, SSL-соединения и ау-
тентификации на SMTP-сервер:
# cd /usr/ports/mail/exim
# make fetch # cd /etc/mail/
# cd /usr/ # mkdir ssl
# mkdir Install # cd ssl
# cd Install # openssl req -x509 -newkey rsa:1024 -keyout mail.pem ↵
# tar -xvjpf /usr/ports/distfiles/exim/exim-4.53.tar.bz2 -out mail.pem -days 3650 -nodes
# cd exim-4.53/Local # chmod 400 mail.pem
# chown exim:mail mail.pem
Создаем пользователя, от имени которого будет рабо-
тать Exim. В директории /etc/mail создаем файл exim.conf (содер-
жание см. в [9]) (FQDN mail.test.com взят для примера):
# pw adduser exim -g mail -d /var/spool/mqueue ↵
-C "Exim Server" -s /usr/sbin/nologin
#cat > exim.conf << "EOF"
...
Затем требуется просмотреть файл /etc/passwd или EOF
с помощью команды id выяснить, какой UID и GID у поль-
зователя exim. В моем случае – это 1001 и 6 соответствен- Приступим к сборке и настройке антивирусного фильтра.
но. Нам это понадобится для конфигурационного файла Что означает каждая опция, можно найти в том же файле
Exim, описанного ниже. конфигурации или в документации к ClamAV:
Настроить ключи сборки Exim через configure не пред-
ставляется возможным, об этом прямо сказано в докумен- # cd /usr/ports/security/clamav
# make all install clean
тации, идущей с пакетом. Поэтому создаем файл Makefile, # cd /usr/local/etc
содержание которого смотрите на сайте журнала в разде-
ле «Исходный код» [9]. Создаем файл clamd.conf следующего содержания:
Собираем и устанавливаем Exim и создаем необходи-
мые ссылки. # cat > clamd.conf << "EOF"
LogFile /var/log/clamav/clamd.log
LogTime
# cd ../ LogClean
# make LogSyslog
# make install PidFile /var/run/clamav/clamd.pid
# ln -fs /usr/sbin/exim /usr/lib/sendmail TemporaryDirectory /var/tmp
# ln -fs /usr/sbin/exim /usr/sbin/sendmail DatabaseDirectory /var/db/clamav
# ln -fs /usr/sbin/exim /usr/bin/mailq FixStaleSocket
# ln -fs /usr/sbin/exim /usr/bin/runq TCPSocket 3310
TCPAddr 127.0.0.1
User clamav
Этот шаг не обязателен. Данное действие удалит все от- AllowSupplementaryGroups
ScanPE
ладочные символы, тем самым уменьшив размер исполня- ScanOLE2
емых файлов: ScanMail
ScanHTML
ScanArchive
# strip /usr/sbin/exim* ScanRAR

№1, январь 2006 37


администрирование
ArchiveMaxFiles 10000 # /usr/local/etc/rc.d/030.exim.sh start
EOF
Trying 127.0.0.1...
И файл freshclam.conf следующего содержания: Connected to localhost.
Escape character is '^]'.
# cat > freshclam.conf << "EOF" 220 mail.test.com ESMTP Exim 4.53 Wed, 19 Oct 2005 16:49:58 +0400
DatabaseDirectory /var/db/clamav ehlo mail.test.com
UpdateLogFile /var/log/clamav/freshclam.log 250-mail.test.com Hello localhost.test.com [127.0.0.1]
LogVerbose 250-SIZE 10485760
PidFile /var/run/clamav/freshclam.pid 250-PIPELINING
DatabaseOwner clamav 250-AUTH PLAIN LOGIN CRAM-MD5
AllowSupplementaryGroups 250 HELP
DatabaseMirror database.clamav.net mail from:user@test.com
MaxAttempts 5 250 OK
Checks 3
rcpt to:user@test.com
NotifyClamd
EOF 250 Accepted
data
354 Enter message, ending with "." on a line by itself
Запускаем ClamAV: test
.
250 OK
# cd /usr/local/etc/rc.d
quit
# mv clamav-clamd.sh 020.clamav.sh
# mv clamav-freshclam.sh 025.freshclam.sh
В подкаталоге /usr/local/vmail после отправки письма
Добавляем в файл rc.conf следующие строки: должна создаться директория test.com. Проверим это, вы-
полнив команду «ls /usr/local/vmail».
clamav_freshclam_enable="YES" Следующим этапом проверяем методы аутентифика-
clamav_clamd_enable="YES"
ции. Для каждой проверки с помощью Perl будем кодиро-
Запускаем антивирусный фильтр: вать аутентификационный запрос согласно используемо-
му методу.
# ./020.clamav.sh start Метод PLAIN. Для этого метода нужно получить специ-
# ./025.freshclam.sh start
альную строку, которая используется в процессе аутенти-
Далее создаем директорию, в которой собственно бу- фикации. Создадим ее следующей командой:
дем хранить почту наших пользователей. Для этих целей
я выбрал директорию vmail, созданную в подкаталоге local # perl -MMIME::Base64 -e 'print encode_base64( ↵
"user\@test.com\0user\@test.com\0password");'
каталога usr.
DXNlckB0ZXN0LmNvbQB1c2VyQHRlc3QuY29tAHBhc3N3b3Jk
# mkdir -p /usr/local/vmail Полученная строка и является нашей строкой аутен-
# chown -R exim:mail /usr/local/vmail /var/spool/mqueue
# chmod 0770 /usr/local/vmail тификации.

Создаем скрипт для запуска Exim: # telnet 127.0.0.1 25

ehlo mail.test.com
# cat > /usr/local/etc/rc.d/030.exim.sh << "EOF" ...
# !/bin/sh ...
AUTH PLAIN dXNlckB0ZXN0LmNvbQB1c2VyQHRlc3QuY29tAHBhc3N3b3Jk
case "$1" in 235 Authentication succeeded
start) quit
echo "starting Exim..."
/usr/sbin/exim -bd -q15m
;;
restart) Метод LOGIN:
echo "restarting Exim..."
kill -HUP `cat /var/spool/mqueue/exim-daemon.pid` # perl -MMIME::Base64 -e 'print encode_base64( ↵
;; "user\@test.com");'
stop)
echo "stopping Exim..." dXNlckB0ZXN0LmNvbQ==
kill -TERM `cat /var/spool/mqueue/exim-daemon.pid`
;; # perl -MMIME::Base64 -e 'print encode_base64("password");'
*)
echo "Usage: $0 {start|stop|restart}" cGFzc3dvcmQ=
exit 1
;;
esac Смотрим:
EOF
# telnet 127.0.0.1 25
# chmod +x /usr/local/etc/rc.d/030.exim.sh
ehlo mail.test.com
Запускаем Exim: ...
AUTH LOGIN
334 VXNlcm5hbWU6
# /usr/local/etc/rc.d/030.exim.sh start dXNlckB0ZXN0LmNvbQ==
334 UGFzc3dvcmQ6
cGFzc3dvcmQ=
Проверяем правильность настройки и работоспособность 235 Authentication succeeded
Exim. Для этого отправим тестовое письмо сами себе. quit

38
администрирование
Метод CRAM-MD5: [X] OPENSSL Build with OpenSSL support
[X] TRASHQUOTA Include deleted mails in the quota
# telnet 127.0.0.1 25 [X] AUTH_MYSQL MySQL support

ehlo mail.test.com Нажимаем <TAB>, потом <Enter>. Ждем, пока процесс


AUTH CRAM-MD5 дойдет до сборки Courier-AuthLib и отмечаем поодержку
334 PDUwNy4xMTI5Nzk3MzkyQG1haWwucnVzZ2F0ZS5vcmc+ MySQL:
[X] AUTH_MYSQL MySQL support
А здесь нам понадобится дополнительная манипуля-
ция, так как для этого метода требуется еще знать и оче- И так же, как с Courier-IMAP: <TAB>, потом <Enter>.
редь сообщения. Ждем окончания сборки. Переходим в директорию
Предупреждение: cпецификация метода Cram-MD5 /usr/local/etc/authlib/:
не допускает криптованные пароли.
Декодируем имя очереди следующей командой: # cd /usr/local/etc/authlib
# cat > authdaemonrc << "EOF"
authmodulelist="authmysql"
# perl -MMIME::Base64 -e 'print ↵ authmodulelistorig="authuserdb authvchkpw authpam ↵
MIME::Base64::decode_base64(shift), ↵ authldap authmysql authpgsql"
"\n"' PDUwNy4xMTI5Nzk3MzkyQG1haWwucnVzZ2F0ZS5vcmc+ daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
Получаем очередь письма: DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"
<507.1129797392@mail.test.com> LOGGEROPTS=""
EOF
После кодируем строку для аутентификации, исполь-
зуя данные об очереди, логин и пароль: С authmysql немного сложнее, так как мы с вами авто-
ризуем пользователя по схеме «username@domain», то нам
# perl -MMIME::Base64 -MDigest::HMAC_MD5 -e 'print ↵ с вами придется переписать запрос авторизации:
MIME::Base64::encode_base64($ARGV[0] . " " . ↵
Digest::HMAC_MD5::hmac_md5_hex($ARGV[2], $ARGV[1]))' ↵
'user@test.ru' 'password' ↵ #cat > authmysqlrc << "EOF"
'<507.1129797392@mail.test.com>' MYSQL_SERVER localhost
MYSQL_USERNAME exim
Используем полученную последовательность символов MYSQL_PASSWORD youpassowrd
MYSQL_PORT 3306
для аутентификации: MYSQL_OPT 0
MYSQL_DATABASE mail
Z2luZ2VyQGV4YW1wbGUucnUgYjllN2Q1OTUxMGMxNjE0YzIwYjU4N2JkNmFkODk2MDI=
MYSQL_SELECT_CLAUSE SELECT CONCAT(id,'@',mbox_host), ↵
235 Authentication succeeded
crypt, "", 1001, 6, home, CONCAT(home,'/Maildir'), ↵
"", id, "" FROM users WHERE CONCAT(id,'@', ↵
quit
mbox_host) = ‘'$(local_part)@$(domain)’'
EOF
Проверяем антивирусный фильтр. Для этого отправим
как тело сообщения тестовую сигнатуру EICAR-вируса: Далее приступаем к настройке собственно самих сер-
ehlo mail.test.com
висов POP3 и IMAP (содержание файлов pop3d и imapd
mail from:user@test.com см. в [9]):
250 OK
rcpt to:user@test.com
250 Accepted # cd /usr/local/etc/courier-imap
data # cat > pop3d << "EOF"
354 Enter message, ending with «.» on a line by itself ...
X5O!P%@APX5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* EOF
.
550-Messege rejected: Virus (Eicar-Test-Signature) Found. Your message was # cat > imapd << "EOF"
550 successfully trashed. ...
EOF
Как мы видим, антивирусный фильтр работает нормаль-
но, далее приступаем к проверке SSL-соединения. Для это-
го тербуется подключиться через SSL-клиента на порт Настраиваем SSL
к TCP-порту 465: Для этого редактируем файлы imapd.cnf и pop3d.cnf. Пер-
вый из них должен выглядеть следующим образом:
# openssl
OpenSSL> s_client -host localhost -port 465 # cat > imapd.cnf << "EOF"
RANDFILE = /usr/local/share/courier-imap/imapd.rand
Если SSL-соединение прошло успешно, вы увидите при-
глашение Exim. [ req ]
default_bits = 1024
Ну вот настройку Exim и проверку работоспособнос- encrypt_key = yes
ти почти закончили, приступим к сборке и настройке distinguished_name = req_dn
x509_extensions = cert_type
Courier-IMAP. prompt = no

[ req_dn ]
# cd /usr/ports/mail/courier-imap C=RU
# make all install clean ST=Russia Federaton
L=Moscow
В открывшемся меню отмечаем: O=Exim Super Server

№1, январь 2006 39


администрирование
OU=IT DEpartament Escape character is '^]'.
CN=mail.test.com +OK Hello there.
emailAddress=abuse@test.com user user@test.com
+OK Password required.
[ cert_type ] pass password
nsCertType = server
+OK logged in.
list
Второй файл pop3d.cnf отличается первой строкой: quit

RANDFILE = /usr/local/share/courier-imap/pop3d.rand Проверяем работу Courier-IMAP по протоколу IMAP:

Создаем самоподписанные сертификаты: # telnet 127.0.0.1 143


Trying 127.0.0.1...
# cd /usr/local/share/courier-imap Connected to mail.test.com.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE
# ./mkimapdcert THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL
# ./mppop3dcert ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2005
Double Precision, Inc. See COPYING for distribution information.
a001 login user@test.com password
Копируем полученные сертификаты в директорию /usr/ a001 OK LOGIN Ok. // ответ сервера
local/etc/courier-imap: a001 logout
* BYE Courier-IMAP server shutting down
a001 OK LOGOUT completed
# cd /usr/local/etc/courier-imap Connection closed by foreign host.
# mkdir ssl && cd ssl
# cp /usr/local/share/courier-imap/*.pem .
Проверяем работу Courier-IMAP по протоколу POP3 че-
Настраиваем SSL-соединения для imap и pop3: рез SSL-соединение:

# cd ../ # openssl
OpenSSL> s_client -host localhost -port 995

Создаем файлы imapd-ssl и pop3d-ssl следующего со- .....


.....
держания (содержание файлов см. в [9]): .....
Connected to mail.test.com.
# cat > imapd-ssl << "EOF" +OK Hello there.
... quit
EOF
Проверяем работу Courier-IMAP по протоколу IMAP че-
# cat > pop3d-ssl << "EOF"
... рез SSL-соединение:
EOF
OpenSSL> s_client -host localhost -port 993
Создаем скрипты для запуска: ......
......
# cd /usr/local/etc/rc.d ......
# mv courier_authdaemond.sh 035.courier-auth.sh * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE
# mv courier_imap_imapd.sh 040.courier-imap.sh THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE
# mv courier_imap_pop3d.sh 045.courier-pop3d.sh AUTH=PLAIN ACL ACL2=UNION] Courier-IMAP ready.
# mv courier_imap_imapd_ssl 050.courier-imaps.sh Copyright 1998-2005 Double Precision, Inc.
# mv courier_imap_pop3d_ssl 055.courier_pop3ds.sh See COPYING for distribution information.
a001 login user@test.com password
a001 OK LOGIN Ok. // ответ сервера
Добавляем записи в rc.conf для запуска скриптов в про- a001 logout
цессе загрузки: * BYE Courier-IMAP server shutting down
a001 OK LOGOUT completed
closed
courier_authdaemond_enable-"YES"
courier_imap_imapd_enable-"YES"
courier_imap_pop3d_enable-"YES" Ну вот, в общем, все почти готово. Приступим к настрой-
courier_imap_imapd_ssl_enable-"YES" ке DSPAM и свяжем его с Exim, а заодно установим веб-ин-
courier_imap_pop3d_ssl_enable-"YES"
терфейс для администрирования спам-фильтра. Послед-
Запускаем Courier-IMAP: ним стабильным дистрибутивом на дату написания статьи
была версия 3.4.8.
# /usr/local/etc/rc.d/035.courier-auth.sh start
# /usr/local/etc/rc.d/040.courier-imapd.sh start
# /usr/local/etc/rc.d/045.courier-pop3d.sh start # cd /usr/ports/mail/dspam
# /usr/local/etc/rc.d/050.courier-imaps.sh start # make fetch
# /usr/local/etc/rc.d/055.courier-pop3ds.sh start # cd /usr/Install
# tar -xvzf /usr/ports/distfiles/dspam-3.4.8.tar.gz
# cd dspam-3.4.8
Проверяем работу Courier-IMAP по протоколу POP3: # ./configure –prefix=/usr/local/dspam ↵
--includedir=/usr/local/dspam/include ↵
--mandir=/usr/local/dspam/share/man ↵
# telnet 127.0.0.1 110 --infodir=/usr/local/dspam/share/info ↵
Trying 127.0.0.1...
--sysconfdir=/usr/local/dspam/etc ↵
--localstatedir=/usr/local/dspam/var ↵
Connected to mail.test.com. --libexecdir=/usr/local/dspam/lib ↵

40
администрирование
--with-dspam-home=/usr/local/dspam/var/spool ↵ фильтр распознал нормальное письмо как спам. Мар-
--enable-debug ↵ шрут создает виртуальный адрес вида «ham@domain»
--enable-domain-scale ↵
--enable-signature-headers ↵ и nospam@domain, где domain – имя вашего домена
--with-delivery-agent="/usr/sbin/exim ↵ (test.com) по умолчанию, на который и следует пересы-
-oi -oMr spam-scanned" ↵
--enable-whitelist ↵ лать вышеуказанные письма.
--enable-virtual-users ↵
--enable-experimental ↵
--with-logdir=/var/log/dspam ↵ spamscan_router:
--enable-neural-networking ↵ no_verify
--with-storage-driver=mysql_drv ↵ headers_remove = X-FILTER-SPAM : X-Spam-Score : ↵
--with-mysql-includes=/usr/local/include/mysql ↵ X-Spam-Score-Gate : X-Spam-Report : ↵
--with-mysql-libraries=/usr/local/lib/mysql ↵ X-Spam-Gate-Subject : X-Spam-Flag : X-S
--enable-preferences-extension condition = "${if and {{!eq ↵
# make {$received_protocol}{spam-scanned}} ↵
# make install {!def:h_X-FILTER-SPAM:}} {1}{0}}"

Создаем файл конфигурации. Что означают приве- driver = accept


headers_add = X-FILTER-SPAM: ICF Team Spam Filter ↵
денные ниже опции, вы сможете узнать из официальной on $primary_hostname, $tod_full\n ↵
документации по DSPAM (содержание файла dspam.conf X-SENDER-INFO: ${if def:authenticated_id ↵
{ID - ${authenticated_id},}} ↵
см. в [9]): ${if def:authenticated_sender ↵
{authenticated_sender - ↵
${authenticated_sender},}} ↵
# cd /usr/local/dspam/etc/ ${if def:sender_ident ↵
# cat > dspam.conf << "EOF" {rfc1413(ident) - ${sender_ident},}} ↵
... ${if def:originator_uid {UID - ↵
EOF ${originator_uid},}} ↵
${if def:originator_gid {GID - ↵
${originator_gid}}}
Создаем базу данных для DSPAM: local_parts = !addham:!addspam:!ham: ↵
!spam:!sexy
transport = spamcheck_transport
# mysql -u root -ppassword require_files = /usr/local/dspam/var/spool: ↵
mysql> create database dspam; /usr/local/dspam/bin/dspam
mysql> grant all on dspam.* to exim@localhost identified ↵
by 'youpassword';
mysql> \quit
Следующий маршрут используется для прохождения
Далее заносим данные в базу: и проверки всей входящей и исходящей почты.

# cd /usr/Install/dspam-3.4.8/src/tools.mysql_drv spam_reject:
# mysql -u exim -pyoupassowrd dspam < ↵ driver = redirect
mysql_objects-4.1.sql check_local_user
# mysql -u exim -pyoupassowrd dspam < neural.sql user = exim
# mysql -u exim -pyoupassowrd dspam < virtual_users.sql group = mail
headers_add = "X-DSPAM-Rreport: Rejected"
Итак, приступаем собственно к настройке Exim для ра- condition = ${if eq ↵
{$h_X-DSPAM-Result:}{Spam}{yes}{no}}
боты с dspam. Для этого открываем /etc/mail/exim.conf
и ищем такую строчку begin routers. После вписываем сле- allow_fail = true
require_files = $local_part:/usr/local/vmail ↵
дующие строки: /${domain}/spam/$local_part
errors_to = ""
data = :blackhole:
dspam_addspam: more = false
driver = accept
expn = false
domains = +local_domains Включает удаление писем, классифицированных
local_parts = spam
transport = addspam как спам для каждого пользователя индивидуально, путем
headers_add = "X-DSPAM-REPORT: Missclassified" создания файла /usr/local/vmail/domainname/spam/usernamе.
Если файл присутствует, то письма удаляются без какого-
Этот маршрут используется для отправки писем о спаме либо уведомления, если нет, то только помечаются как спам
спам-фильтру в случаях, если спам-фильтр не распознал и доставляются как обычно.
спам и пропустил письмо как нормальное. Маршрут созда- Ищем следующую строку begin transports. После опи-
ет виртуальный адрес вида «spam@domain», где «domain» – сываем транспорты:
имя вашего домена (test.com) по умолчанию, на который
и следует пересылать вышеуказанные письма. spamcheck_transport:
driver = pipe
command = "/usr/sbin/exim -oi -oMr ↵
dspam_falsepositive: spam-scanned -bS"
driver = accept transport_filter = /usr/local/dspam/bin/dspam ↵
expn = false --stdout --deliver=innocent,spam --user ↵
domains = +local_domains $local_part@$domain --mail-from ↵
local_parts = ham:nospam "${lc:$sender_address}" ↵
transport = falsepositive --rcpt-to "${lc:$local_part}@${lc:$domain}"
headers_add = "X-DSPAM-REPORT: Falsepositive" user = exim
group = mail
use_bsmtp = true
Применяется д ля отправки писем при ошибоч - home_directory = "/usr/local/dspam/var/spool"
current_directory = "/usr/local/dspam/var/spool"
ных срабатываниях спам-фильтра, то есть когда спам- delivery_date_add = true

№1, январь 2006 41


администрирование
return_path_add = true После того как вы выполните эту команду, выйдет до-
envelope_to_add = true
log_fail_output = true статочно длинный список выбора модулей. Каждый может
log_defer_output = true выбрать по вкусу, но обязательные модули – это session
return_fail_output = true
message_prefix = "" gd mysql iconv.
message_suffix = "" Редактируем файл /usr/local/etc/apache/httpd.conf.
temp_errors = *
Ищем строчку «ServerName» и пишем там fqdn-имя на-
Этот транспор запускает спам-фильтр и классифици- шего сервера, в данном случае «mail.test.com».
рует входящие и исходящие письма. Ищем строчку «AddType application/x-tar .tgz» и после
нее вписываем две строки:
addspam:
driver = pipe AddType application/x-httpd-php .php .phtml
command = /usr/local/dspam/bin/dspam ↵ AddType application/x-httpd-php-source .phps
--user ${lc:$sender_address} ↵
--class=spam --source=error
return_path_add = false Теперь настроим два виртуальных хоста для SquirrelMail
return_fail_output = true и для dspam.
log_output = true
home_directory = "/usr/local/dspam/var/spool" В самом конце конфигурационного файла вписываем
current_directory = "/usr/local/dspam/var/spool" следующее:
user = exim
group = mail
message_prefix = "" NameVirtualHost *
message_suffix = ""
# CGI-интерфейс DSPAM
Выполняет обучение спам-фильтра при отправке пи- <VirtualHost *>
ServerName dspam.test.com
сем, ошибочно класифицированных как нормальное ServerAlias dspam.test.com
письмо. Options Includes Indexes FollowSymLinks ExecCGI
DocumentRoot /usr/local/www/vhosts/dspam.test.com
User exim
falsepositive: Group mail
driver = pipe <Directory "/usr/local/www/vhosts/dspam.test.com">
command = /usr/local/dspam/bin/dspam ↵ Options Includes Indexes FollowSymLinks ExecCGI
--user ${lc:$sender_address} ↵ AllowOverride All
--class=innocent --source=error Order allow,deny
return_path_add = false Allow from all
return_fail_output = true DirectoryIndex index.html
log_output = true AddHandler cgi-script .cgi
home_directory = "/usr/local/dspam/var/spool" <IfModule mod_perl.c>
current_directory = "/usr/local/dspam/var/spool" PerlSendHeader On
user = exim AddHandler cgi-script .cgi
group = mail PerlHandler Apache::Registry
message_prefix = "" </IfModule>
message_suffix = "" </Directory>
ErrorLog /usr/local/www/logs/dspam.test.com/errors.log
Обучает спам-фильтр при отправке писем, ошибочно CustomLog /usr/local/www/logs/dspam.test.com/access.log common
</VirtualHost>
классифицированных как спам.
Перезапускаем Exim: #Веб-интерфейс SquirrelMail
<VirtualHost *>
ServerName mail.test.com
# /usr/local/etc/rc.d/030.exim.sh restart ServerAlias test.com
Options Includes Indexes FollowSymLinks MultiViews
DocumentRoot /usr/local/www/vhosts/mail.test.com
Смотрим в /var/log/maillog, если видим ошибки, то еще DirectoryIndex index.php index.phtml index.html
ErrorLog /usr/local/www/logs/mail.test.com/errors.log
раз проверяем действия по всем пунктам с начала CustomLog /usr/local/www/logs/mail.test.com/access.log common
статьи. </VirtualHost>
Приступаем к настройке CGI-интерфейса для отсле-
живания работы спам-фильтра и веб-интерфейса для ра- Сохраняем, выходим и переходим в директорию наших
боты с почтовыми ящиками. Для этого нам понадобит- будущих виртуальных хостов:
ся WWW-сервер Apache с поддержкой suexec и mod_perl,
для желающих можно использовать ssl. Я предлагаю на- # cd /usr/local/www
строить отдельный виртуальный хост для просмотра ста-
тистики по отработке фильтра. Создаем каталоги для контента и протоколов:

# cd /usr/ports/www/apache13-modssl # mkdir -p vhosts/dspam.test.com vhosts/mail.test.com ↵


# make WITH_APACHE_SUEXEC=yes ↵ logs/dspam.test.com logs/mail.test.com
APACHE_SUEXEC_DOCROOT=/usr/local/www/vhosts ↵
APACHE_SUEXEC_UIDMIN=50 ↵ Создаем файлы логов, я предлагаю использовать
APACHE_SUEXEC_GIDMIN=5
# make на каждый виртуальный хост свой журнал обращений
# make install и ошибок, дабы облегчить поиск ошибок в дальнейшем.
# cd /usr/ports/www/mod_perl
# make all install clean
# cd /usr/ports/graphics/p5-GD-Graph3d/ # touch logs/dspam.test.com/access.log ↵
# make all install clean logs/mail.test.com/access.log ↵
# cd /usr/ports/lang/php4-extensions logs/dspam.test.com/errors.log ↵
# make all install clean logs/mail.test.com/errors.log

42
администрирование
Передаем права пользователю www на директорию # cp -R ../../squirrelmail/* .
# cd ../
logs: # chown -R www:www mail.test.com
# cd mail.test.com
# chown -R www:www logs # ./configure

Настраиваем для наших потребностей.


Копируем содержимое /usr/Install/dspam-3.4.8/cgi в ди- Рассказывать про конфигурацию SquirrelMail не вижу
ректорию, предназначенную для анитиспам-фильтра: смысла, так как там все до банальности просто. Здесь на-
ходится исчерпывающая документация по настройке и кон-
# cd vhosts/dspam.test.com фигурированию этого сервиса – http://www.squirrelmail.org/
# cp -R /usr/Install/dspam-3.4.8/cgi/* .
wiki/SquirrelMail.
Передаем права пользователю Exim: Добавляем в rc.conf следующую строчку для запуска
Apache:
# cd ../
# chown -R exim:mail dspam.test.com apache_enable="YES"
Cледующие команды выполняются в директории /usr/
local/www/vhosts/dspam.test.com. Создаем скрипт для запуска Apache:
Создаем файл .htpasswd следующего содержания:
# cd /usr/local/etc/rc.d
# cp apache.sh 060.apache.sh
#cat > .htaccess << "EOF"
AuthType Basic
AuthName "DSPAM Statistic Server" Запускаем Apache:
AuthUserFile /usr/local/www/passwd/htpaasswd
# ./060.apache.sh start
require valid-user
EOF
Ну вот вроде и все.
После правим файл admins, убираем запись суперполь-
зователя и вписываем адреса пользователей, которые име- Заключение
ют право администрировать сервер статистики (в нашем За время эксплуатации (примерно полтора года) дан-
случае user@test.com). ный комплекс показал себя как надежный почтовый сер-
Выставляем права на файл .htaccess: вер. При грамотном обучении DSPAM начинает распозна-
вать 99% процентов спама, делая одну ошибку примерно
# chown www:www .htaccess на 50-60 тысяч проходящих писем. Задержка при обработке
# chmod 640 .htaccess
каждого письма составляет примерно 1-2 секунды.
Создаем директорию для хранения файла паролей:
Благодарности
# mkdir /usr/local/etc/apache/htpasswd Выражаю благодарность Сергею Супрунову за его заме-
чательную статью по описанию работы DSPAM в журна-
Передаем права на директорию пользователю www: ле «Системный администратор», которая послужила руко-
водством для использования DSPAM в место Spamassasin +
# chown www:www /usr/local/etc/apache/htpasswd Amavisd.

Создаем файл паролей: Ссылки:


1. http://www.exim.org – официальный сайт MTA Агента Exim.
# htpasswd -c /usr/local/etc/apache/htpasswd/htpasswd ↵ 2. http://www.clamav.com – официальный сайт антивирусного
user@test.com
фильтра.
Вводим пароль такой же, который использовали при со- 3. http://dspamwiki.woozle.org/DspamWithExim – Wiki-сайт по на-
здании почтового. стройке Dspam.
Устанавливаем права на файл: 4. http://www.mysql.com – jфициальный сайт cервера баз дан-
ных.
# chown www:www /usr/local/etc/apache/htpasswd/htpasswd 5. http://www.php.net – официальный сайт языка програмирова-
# chmod 640 /usr/local/etc/apache/htpasswd/htpaswd
ния PHP.
Выполняем сборку и устанавливаем SquirrelMail: 6. http://www.apache.com– официальный сайт веб-сервера
Apache.
# cd /usr/ports//mail/squirrelmail 7. http://www.squirrelmail.org – официальный сайт веб-интерфей-
# make all install clean
са написанного на языке PHP для работы с почтовыми ящи-
После установки нужно скопировать полученный ками.
при сборке SquirrelMail в предназначенную для него ди- 8. http://www.freebsg.org – официальный сайт операционной сис-
ректорию: темы FreeBSD.
9. http://www.samag.ru/cgi-bin/go.pl?q=source – сайт журнала
# cd /usr/local/www/vhosts/mail.test.com «Системный администратор», раздел «Исходный код».

№1, январь 2006 43


администрирование

Создаём кластер
для PostgreSQL

Андрей Тренин
PostgreSQL – мощная СУБД с конвейера Open Source, способная легко конкурировать с такими
гигантами, как Oracle и MS SQL. К сожалению, наряду с полезными утилитами, такими
как pg_autovacuum, в нем отсутствует возможность репликации. Что делать, если такая опция
вам необходима?

Э
та статья будет интересна чи- Немного о PostgreSQL есть несколько способов. Начинаем
тателям, имеющим начальные Это мощная система управления ре- его использовать как хранилище одно-
знания в области РБД, и бу- ляционными базами данных, подде- типных данных для сайта, или покупа-
дет полезна системным администра- рживающая расширенное подмножес- ем систему класса CRM, ERP отечест-
торам организаций, использующим тво стандарта SQL. Включает в себя: венной сборки, в принципе это не важ-
PostgreSQL (http://www.postgresql.org) транзакции, внешние ключи, подза- но. Важно то, что данных становится со
для хранения достаточно большо- просы, триггеры, пользовательские ти- временем все больше, от этого увели-
го объема информации (1 Гб и бо- пы данных, функции и многое другое. чивается их важность, и даже за крат-
лее), которая является не статичес- Причем функции могут быть написа- ковременную паузу в доступе к данным
кой, а наоборот, динамично изменя- ны на C, Perl, Python, Tcl и JDBC. Так- вам «стучат по голове» и не дают дол-
ющейся и дополняющейся, которую же следует учесть, что это чудо разра- гожданную премию.
очень легко потерять и трудно вос- ботано не на «коленках», а в University Простои в работе любого хранили-
становить в установленные руководс- of California at Berkeley (UCB). ща данных неизбежны (плановая про-
твом сроки. Как PostgreSQL «попадает в дом» – филактика, замена комплектующих

44
администрирование
или «уборщица пробралась в сервер- бутивными pg_dump/pg_restore и пос-
ную») и встает вопрос: «Как сделать ле этого все опять включить.
так, чтобы доступ к данным был воз- Преимущество данной схемы оче-
можен всегда?». Ответ прост – нуж- видно – система отключается не тог-
но иметь как минимум две параллель- да, когда она хочет, а тогда, когда за-
ные системы, взаимозаменяющие друг планируем мы, конечно же, при усло-
друга, чтобы во время простоя одной – вии низкой вероятности отказа двух
другая работала как ни в чем не быва- серверов в течение, скажем, 4-12 ча-
ло. Однако наряду с преимуществами сов, столько времени вполне хватит
данной схемы, мы получаем сопутству- для прибытия на работу и неспешно-
Рисунок 1. Общая схема работы
ющие недостатки, а именно: го восстановления работоспособнос- PGCluster
 систем становится как минимум ти программных средств.
больше одной – надо думать над Ус танавливать и нас траивать
синхронизацией данных; PgPool очень легко. Допустим, у нас
 поломка одной из систем – нуж- есть два сервера PostgreSQL. На один
но сделать период времени меж- из них устанавливаем демон и в кон-
ду сбоем и отключением вышед- фигурационном файле выставляем
шей из строя системы как можно ему master, другому – slave, еще не-
менее продолжительным для вне- много правим его (он всего один!), ес-
шних приложений. ли необходимо, и все – мы имеем в на-
личии репликационный сервер.
Рисунок 2. Схема репликации
Эти проблемы и некоторые менее в PGCluster
важные призвано решать реплициру- PGCluster
ющее программное обеспечение, речь PGCluster – синхронизирующаяся реп- один из кластеров БД «падает», балан-
о котором пойдет далее. ликационная система с мультимас- сер и репликационный сервер, посто-
терной композиционной схемой для янно отслеживающие жизнедеятель-
PgPool PostgreSQL. Сейчас проект имеет пог- ность кластеров БД, отделяют сломан-
PgPool – подсоединяемый пул/реп- раничный статус между стадией тести- ный кластер БД от работоспособной
ликационный сервер для PostgreSQL. рования и работающей без видимых части системы и продолжают работу
Он написан Tatsuo Ishii (t-ishii@sra. ошибок, но будем считать, что проект с оставшимися кластерами БД. После
co.jp). На сегодняшний день проект можно использовать, ибо програм- этого необходимо устранить неисправ-
имеет оттестированную версию. Раз- мных продуктов без скрытых дефек- ность упавшего сервера и подсоеди-
решается использовать по BSD-ли- тов все равно не бывает. Лицензия – нить к системе в режиме репликации.
цензии (бесплатно), можно ставить на BSD. Устанавливается на FreeBSD, После этого репликационный сервер
FreeBSD, Linux, SunOS/Solaris и собс- Linux, SunOS/Solaris. запишет данные с работающих серве-
твенно написан программный продукт Схема работы гораз до более ров поверх имеющихся на реплициру-
на всеми любимом C. сложная, чем в предыдущем случае. емом сервере плюс выполнит запросы
При ближайшем рассмотрении PGCluster состоит из трех видов серве- за время простоя в автоматическом ре-
выясняется, что PgPool представляет ров (в данном случае я советую не ис- жиме, останется только включить сер-
из себя прослойку-демон, то есть за- пользовать контексты, а разнести все вер в обычном режиме.
пускается между клиентами и хранили- по разным машинам), а именно: балан- Как мы видим, наряду с преиму-
щем данных, причем клиентов допол- сер (front-end), кластер БД (здесь дан- ществами PgPool, мы имеем еще и го-
нительно настраивать не надо, что без- ные), репликационный сервер. Хотя рячую замену, что позволяет не выклю-
условно хорошо. Этот демон может об- схема, показанная на следующем ри- чать систему целиком. В заключение
разовывать пул к PostgreSQL для огра- сунке, довольно проста (рис. 1), для то- лишь добавлю, что по начальным на-
ничения предоставленных соединений го чтобы привести систему в рабочее стройкам можно использовать макси-
самой базой данных. И, наконец, мо- состояние, может потребоваться очень мально 128 кластеров БД.
жет объединить два сервера в систе- много времени.
му (master – slave). Установка PGCluster есть установка Slony-I
PgPool посылает одинаковые SQL- PostgreSQL, ибо PGCluster и есть мо- Slony-I – это репликационная систе-
команды на оба сервера, тем самым дифицированный PostgreSQL, а вот ма по схеме «один master плюс много
достигается эффект репликации. Ес- настройка трех типов конфигураци- slave». Запускается на POSIX и этим
ли один из серверов ломается/отклю- онных файлов (по одному на каж- все сказано. Лицензия – BSD. Забе-
чается – демон пытается продолжить дый тип серверов) является задачей гая вперед, скажу – поддерживает
работу с оставшимся в живых. К сожа- не тривиальной. Сколько нужно на- динамическое реконфигурирование
лению, чтобы ввести сервер обратно строить параметров, станет очевид- кластера.
в строй, придется остановить всю сис- ным после рассмотрения схемы реп- Данный проект задумывался как
тему, провести синхронизацию данных, ликации (рис. 2). репликационная система, независя-
например утилитой rsync или дистри- Рассмотрим самое тяжелое. Когда щая от какой-то конкретной версии

№1, январь 2006 45


администрирование
Таблица показателей от себя лишь добавлю, что оно ввиду чеством ставок при стресс-тестах
PgPool PGCluster Slony-I чрезмерной сложности заслуживает порядка 430 тысяч в день и базой
Установка 3 1 2 отдельной статьи. данных на 8 Гб.
Системные
требования
3 2 2 Сравниваем продукты Результаты оценки сведены в таб-
Документация 3 2 2 Перейдем к оценке этих изделий. Оп- лицу.
Скорость работы 3 2 2 ределим её параметры, так как систе-
Стабильность
мы три, то и оценивать будем по трех- Подведем итог
2 2 3 балльной шкале (3 – хорошо, 2 – мог- Как мы видим, в таблице нет колонки
работы
Широта области ло быть и лучше, 1 – плохо). «Итого», потому что если просуммиро-
2 3 1
применения  Установка – данный показатель вать проставленные оценки, то полу-
оценивает возможность установ- чим лидера PgPool, если введем вес
PostgreSQL, и одновременно с этим ки на максимальное количество для каждого показателя, то, безуслов-
не требующая перезапуска серверов типов ОС, простоту процесса ин- но, выиграет PGCluster, так как вес бу-
БД, для того чтобы начать или прекра- сталляции, размер дистрибутива ду проставлять я.
тить работу. Однако, как и все универ- и сложность постинсталляционной Целью данной статьи является
сальные системы, Slony-I имеет очень настройки. не выдвижение вперед какого-то од-
много недостатков. Первое – неуме-  Системные требования – следу- ного продукта или занижение ценнос-
ние определить недоступность базы ющий показатель, оценивающий ти другого. Наоборот, статья явным
данных и как следствие отстранить ее количество серверов и его мощ- образом показывает, что все продук-
от работы. Второе – Slony-I не являет- ность, необходимые для нормаль- ты достойны использования, но имен-
ся мультимастерной репликационной ного функционирования системы но там, где они будут наиболее эф-
системой, что в совокупности с невоз- в целом. фективны. Например, у вас есть сайт
можностью автоматического перехода  Документация – этот показатель информационного значения, его про-
сервера с режима slave на master де- ставит оценку наличию, доступнос- стои не несут ощутимых убытков, вы не
лает область ее применения доволь- ти и понятности изложения всех ис- можете позволить себе дополнитель-
но узкой. точников информации (сайт про- ное оборудование, да и желания раз-
Вот лишь некоторые примеры, где изводителя, документация на про- бираться с новым софтом, быть мо-
данная система не будет работать: дукт, mail-листы) необходимых для жет, не имеете, то PgPool – ваш выбор.
 коннект между серверами БД час- установки и обслуживания систе- Или же у вас есть мощная корпоратив-
то внезапно пропадает; мы. ная система, остановка работы кото-
 реплицирование БД с центрально-  Скорость работы – данный пока- рой пользователи воспримут как вы-
го сервера в разбросанные по мес- затель количественно в ходе опы- ходной, а вы как увольнение, содер-
тности локальные сервера, кото- та оценить не удалось ввиду того, жание отдела программно-техничес-
рые делают коннект только на вре- что составленный стресс-тест про- кого обеспечения не несет серьезных
мя сбора данных; верял в основном надежность, к то- трат для компании, то ваш выбор оче-
 системы, где пользователи могут му же на сайтах производителей ко- виден – PGCluster. Это и мой выбор,
менять схему БД, ибо изменения личественная оценка есть (резуль- ведь для приемлемой работы проекта
схемы тоже не отслеживаются. таты pgbench). Однако качествен- вполне достаточно использовать кон-
ную оценку скорости каждому про- фигурацию по умолчанию – большая
Однако настройка репликации хоть дукту поставить получилось на ос- часть необходимых параметров уже
и сложна, но позволяет реплицировать нове их архитектурных особеннос- инициализированы. А при необходи-
даже отдельные таблицы, чего не мо- тей и визуальных наблюдений в хо- мости вы всегда сможете изменить на-
гут все вышеперечисленные системы. де опытов (браузер, «ps ax» и т. д.). стройки на нужные вам.
Ситуация напоминает извечный спор:  Стабильность работы – здесь обе- Постараюсь объяснить, где можно
что лучше, система, где для выполне- щанное в документации я сравни- использовать Slony-I. Данный програм-
ния любого задания достаточно нажать вал с действительностью, то есть мный продукт необходимо использо-
кнопку «ОК», или же система, где нуж- с тем, что я видел на системе, ус- вать в совокупности с другими средс-
но настроить пару конфигурационных тановленной мною лично. твами, как хорошо настраиваемую,
файлов, но зато по кнопке «ОК» будут  Широта области применения – с большим запасом интегрируемости
произведены именно те действия, ко- при оценке данного показателя я часть какой-то большой системы. Ско-
торые хотел пользователь. Другими принимал во внимание следую- рее всего, проект будет полезен боль-
словами: экскаватор копает глубоко щие параметры: количество ра- ше разработчикам информационных
и быстро, зато лопатой сложно про- ботающих одновременно серве- систем, чем их пользователям.
бить газопровод. ров БД, возможность горячего ис-
Примерное описание репликации ключения/подключения серверов Ссылки:
приведено в документации – http:// БД. Все тесты и оценки делались 1. http://pgpool.projects.postgresql.org.
slony1.projects.postgresql.org/slony_tip/ на тестовом полигоне крупного за- 2. http://pgcluster.projects.postgresql.org.
adminguide/slonyadmin.html#FIRSTDB, рубежного online-аукциона c коли- 3. http://slony1.projects.postgresql.org.

46
сети

Малоизвестные
подробности
работы NAT

Ильяс Кулиев
NAT, поистине, спасение для системного администратора, когда нужно быстро подключить
к Интернету локальную сеть. Но все ли вы о нём знаете?

NAT и его реализации  Inside Global (IG). Это внешний  Outside Local (OL). Это адрес,
Используя терминологию Cisco, в кон- адрес, при отправлении пакетов под которым адреса внешних хос-
тексте NAT есть четыре основных опре- на который они будут доставлены тов видны внутри локальной се-
деления для IP-адресов. Рассмотрим на хост с адресом IL. В данном слу- ти. В данном случае, если мы от-
их на примере, показанном на рис. 1. чае для хоста 10.0.0.100 адресом IG правляем пакет от 10.0.0.100 для
На обоих маршрутизаторах делается является 111.222.0.1. 172.16.0.100, для хоста 172.16.0.100
NAT (network address translation).  Outside Global (OG). Внешний ад- это будет выглядеть так, будто па-
При этом: рес хоста, доступ к которому мы кет пришёл от 172.16.0.1 (адрес
 Inside Local (IL). Это адрес, присво- хотим получить из нашей локаль- OL).
енный хосту, находящемуся в ло- ной сети. В данном случае, если
кальной сети. В данном случае ад- мы отправляем пакет от 10.0.0.100 Простейший случай NAT – это
реса 10.0.0.100 и 172.16.0.100 – ад- для 172.16.0.100, адресом OG будет трансляция адресов IL в IG и наоборот.
реса IL. 111.222.0.2. При этом маршрутизатор, выполняю-

48
сети

Рисунок 1. Определение IP-адресов в контексте NAT Рисунок 2. Пример сети с NAT

щий NAT, модифицирует поле адреса в заголовке IP сле- !


дующим образом: ! Last configuration change at 09:29:45 UTC someday by
TheAllmightyMaster
 в исходящих пакетах адрес источника IL заменяется на ! NVRAM config last updated at 19:27:46 UTC some other day by
IG, и пакет отправляется дальше по роутингу к хосту с TheAllmightyMaster
адресом OG; !
version 12.2
 во входящих пакетах адрес приемника IG заменяется ...
на IL и отправляется в локальную сеть для хоста с ад- interface Serial0
ip address 11.22.33.44 255.255.255.252
ресом IL. ip nat outside
...
Таким образом, в таблице сопоставлений NAT каждая interface Ethernet0
ip address 192.168.0.1 255.255.255.0
запись состоит из двух значений – IL и IG. ip nat inside
Эта или подобная схема иногда применяется для обес- ...
ip nat inside source list MyNetwork interface Serial0 overload
печения доступа снаружи к хостам, находящимся в локаль- ...
ной сети (например, к веб-серверу или FTP-серверу). Она ip access-list extended MyNetwork
может также применяться для балансировки нагрузки пу- permit ip 192.168.0.0 0.0.0.255 any

тем динамического распределения пакетов, приходящих


на публичный адрес маршрутизатора, между нескольки- Предположим, компьютер с адресом IL 192.168.0.141 от-
ми серверами, находящимися в локальной сети, и еще в правляет DNS-запрос на внешний хост 1.2.3.4 (порт 53, про-
некоторых случаях. токол UDP). Как следует из конфигурации, наш внешний
Более распространённый случай – это NPAT, network and адрес IG – 11.22.33.44.
port address translation. При использовании NPAT в таблице В результате этого в таблице NAT появится примерно
сопоставлений каждая запись имеет не два (как в простом такая запись:
NAT), а пять значений:
Proto Inside global Inside local Outside local Outside global
 транспортный протокол; UDP 11.22.33.44:1053 192.168.0.141:1053 1.2.3.4:53 1.2.3.4:53
 локальный адрес (IL);
 локальный порт; Допустим, после появления такой записи в таблице, дру-
 глобальный адрес (IG); гой хост, 1.2.3.5, отправляет пакет UDP с адресом назначе-
 глобальный порт. ния 11.22.33.44 и портом назначения 1053. Вопрос – полу-
чит ли наш хост 192.168.0.141 этот пакет?
Это позволяет использовать единственный публичный Здравый смысл подсказывает, что вроде бы не дол-
адрес для предоставления доступа в Интернет компьюте- жен. С другой стороны, налицо факт: в нашей таблице NAT
рам, находящимся в локальной сети. В документации Cisco черным по белому записано, что пакет с адресом назначе-
такая схема обычно называется «NAT with port overload» или ния 11.22.33.44 и портом назначения 1053 нужно принять
короче – «NAT overload». и транслировать в локальную сеть для хоста 192.168.0.141
Исторически сложилось так, что именно его, как прави- (который его примет и молча уничтожит, поскольку на этом
ло, имеют в виду, когда употребляют термин «NAT», и о нём компьютере не запущено сетевого приложения, которому
мы и будем говорить в дальнейшем, ввиду его распро- был бы предназначен этот пакет.)
странённости. Кстати говоря – ну хорошо, допустим такого приложе-
До сих пор речь шла о вещах общеизвестных. Однако, ния нет, а если бы оно было? Как хорошо известно поль-
если посмотреть на NAT поближе, возникают новые воп- зователям таких программ, как eMule и eDonkey, они тре-
росы. Возьмём простейшую сеть, с одним компьютером буют, чтобы им была предоставлена возможность беспре-
и одним маршрутизатором, выполняющим NAT. Модель пятственно получать UDP пакеты с портом назначения 4661,
маршрутизатора в данном случае не слишком важна – до- или 4242, или 4321 – точный номер порта зависит от настро-
пустим, что это давно устаревшая, но все еще популярная ек. И, что также хорошо известно их пользователям, эти
Cisco 1601R (см. рис. 2). программы плохо работают, будучи запущены из локаль-
В конфигурации маршрутизатора указано, что он дол- ной сети, находящейся за NAT. Так вот, это может происхо-
жен выполнять NAT для всех пакетов, с адресами источни- дить, в том числе и потому, что несмотря на успешное ус-
ка 192.168.0.0/24, пришедших через интерфейс Ethernet0 и тановление локальным клиентом соединения с сервером,
отправляемых далее через интерфейс Serial0, а также для из-за специфики данной конкретной реализации NAT дру-
ответных пакетов, пришедших через Serial0, для которых гие клиенты, находящиеся во внешнем мире, не могут ус-
есть соответствующая запись в таблице трансляций: танавливать соединение с локальным клиентом.

№1, январь 2006 49


сети
По этой же причине может не работать DCC chat в кли- сом источника, но порт источника при этом обязан быть
ентах IRC, передача файлов в ICQ и тому подобные вещи, 53, в противном случае пакет будет уничтожен маршру-
для которых требуется обеспечение беспрепятственного тизатором.
прохождения пакетов непосредственно между пользова-
тельскими компьютерами. Как видим, реализации NAT – это настоящий зоопарк,
Итак, отвечая на вопрос, «получит ли наш хост в котором каждой твари по паре. Положение смягчается
192.168.0.141 пакет, направленный на 11.22.33.44 от посто- тем, что для большинства сетевых приложений подробности
роннего хоста», – может быть, получит, а может быть, и нет; реализации NAT большого значения не имеют (в особеннос-
ответ на этот вопрос зависит от реализации NAT на погра- ти для приложений, использующих транспорт TCP, как из-
ничном маршрутизаторе. вестно, это протокол, использующий сессии, поэтому ска-
Реализаций же насчитывается четыре: занное выше для TCP неактуально. Тем не менее с разви-
 Symmetric NAT. До недавнего времени это была наибо- тием приложений Peer-to-Peer (eDonkey, eMule, Skype), IP-те-
лее распространённая реализация. Его характерная лефонии и разнообразной сетевой мультимедии (зачастую
особенность – в таблице NAT маппинг адреса IL на ад- использующих транспорт на основе UDP) различия в реа-
рес IG жёстко привязан к адресу OG, то есть к адресу лизациях NAT постепенно начинают играть заметную роль.
назначения, который был указан в исходящем пакете, Поэтому для разработчиков таких приложений пришла по-
инициировавшем этот маппинг. При указанной реализа- ра задуматься над тем, как их детище будет работать, на-
ции NAT в нашем примере хост 192.168.0.141 получит от- ходясь в локальной сети за NATом. Одним из плодов та-
транслированные входящие UDP-пакеты только от хоста ких раздумий стал протокол STUN (Simple Traversal of UDP
1.2.3.4 и строго с портом источника 53 и портом назна- through NAT), описанный в RFC 3489.
чения 1053 – ни от кого более. Пакеты от других хостов,
даже если указанные в пакете адрес назначения и порт STUN
назначения присутствуют в таблице NAT, будут уничто- Некоторым приложениям, особенно предназначенным для
жаться маршрутизатором. Это наиболее параноидаль- IP-телефонии (поскольку там это наиболее актуально), важ-
ная реализация NAT, обеспечивающая более высокую но знать, находится ли компьютер, на котором они запуще-
безопасность для хостов локальной сети, но в некото- ны, в локальной сети за NAT или на компьютере с публич-
рых случаях сильно усложняющая жизнь системных ад- ным IP адресом, и в случае NAT – определить, какого он
министраторов. Да и пользователей тоже. типа. Для этого в настоящее время широко используется
 Full Cone NAT. Эта реализация NAT – полная противо- протокол STUN, который позволяет также определить на-
положность предыдущей. При Full Cone NAT входящие личие блокирующего firewall на пограничном маршрутиза-
пакеты от любого внешнего хоста будут оттранслирова- торе или самом компьютере.
ны и переправлены соответствующему хосту в локаль- Идея STUN несложна – клиент отправляет на находя-
ной сети, если в таблице NAT присутствует соответс- щийся снаружи сервер зондирующие сообщения, используя
твующая запись. Более того, номер порта источника транспорт UDP. В теле этих сообщений содержатся IP-адре-
в этом случае тоже не имеет значения – он может быть са и номера портов источника и приемника. Непременным
и 53, и 54, и вообще каким угодно. Например, если не- условием работы сервера является использование им двух
кое приложение, запущенное на компьютере в локаль- IP-адресов – дальше станет понятно, для чего.
ной сети, инициировало получение пакетов UDP от вне- Процесс определения типа NAT с использованием STUN
шнего хоста 1.2.3.4 на локальный порт 4444, то пакеты протекает следующим образом. Допустим, наш клиент на-
UDP для этого приложения смогут слать также и 1.2.3.5, ходится за NAT, его локальный адрес 192.168.0.111, публич-
и 1.2.3.6, и вообще все до тех пор, пока запись в табли- ный адрес NAT – 1.2.3.4, адреса сервера STUN – 11.22.33.1
це NAT не будет по какой-либо причине удалена. Ещё и 11.22.33.2, номера портов 3478.
раз: в этой реализации NAT во входящих пакетах про- Происходит следующее:
веряется только транспортный протокол, адрес назна-  Клиент отправляет запрос на основной адрес сер-
чения и порт назначения, адрес и порт источника зна- вера (11.22.33.1), при этом в теле отправленного за-
чения не имеют. проса указаны адреса и порты: 192.168.0.111:1055 ->
 Address Restricted Cone NAT (он же Restricted NAT). 11.22.33.1:3478. Эти же адреса и порты фигурируют в за-
Эта реализация занимает промежуточное положение головке IP-пакета, содержащего запрос, но после про-
между Symmetric и Full Cone реализациями NAT – мар- хождения NAT адрес источника изменится на 1.2.3.4,
шрутизатор будет транслировать входящие пакеты толь- а номер порта в зависимости от реализации NAT может
ко с определенного адреса источника (в нашем случае измениться или остаться неизменным. Если клиент не
1.2.3.4), но номер порта источника при этом может быть получает никакого ответа в течение тайм-аута, он дела-
любым. ет вывод, что находится за блокирующим firewall, и за-
 Port Restricted Cone NAT (или Port Restricted NAT). вершает работу.
То же, что и Address Restricted Cone NAT, но в этом слу-  Сервер отвечает клиенту со своего адреса 11.22.33.1
чае маршрутизатор обращает внимание на соответс- сообщением, в теле которого также указаны адре-
твие номера порта источника и не обращает внимания са и порты: 11.22.33.1:3478 -> 1.2.3.4:1055. Если бы ад-
на адрес источника. В нашем примере маршрутизатор рес, с которого клиент отправлял своё первое сообще-
будет транслировать входящие пакеты с любым адре- ние (192.168.0.111), и адрес в полученном от сервера

50
сети
сообщении (1.2.3.4) совпали, клиент сделал бы вывод,
что на пути пакетов NAT отсутствует. В этом случае кли-
ент и сервер обменялись бы еще парой запросов-отве-
тов, на основании которых можно было бы определить,
не находится ли по пути между ними firewall, блокиру-
ющий входящие пакеты UDP. Поскольку они не совпа-
дают, очевидно, что на пути между клиентом и серве-
ром находится NAT. В этом же сообщении сервер ин-
формирует клиента о своем альтернативном IP-адресе
(11.22.33.2) и номере порта (3478).
 После этого клиент отправляет второе зондирующее со-
общение, в котором установлен специальный флажок,
указывающий серверу, что клиент ожидает ответа с аль-
тернативного IP-адреса сервера (11.22.33.2), и с другим
номером порта источника. Если клиент получает ответ
на этот запрос, делается вывод, что находящийся по пу-
ти между ними NAT относится к Full Cone типу. Рисунок 3. Алгоритм работы STUN
 Если ответ на предыдущий запрос не был получен, кли-
ент повторяет свое первое зондирующее сообщение на
альтернативный адрес STUN сервера. Если в получен-
ном ответе адрес и номер порта отличаются от указан-
ных в первом ответе, это означает, что этот запрос ини-
циировал появление в таблице NAT новой записи. Такое
поведение характерно исключительно для Symmetric
NAT.
 Если адрес и номер порта в полученном ответе остались Рисунок 4. Пример FTP-сессии
такими же, какими они были в первом ответе, то NAT от-
носится к типу Restricted Cone. Осталось установить, яв- Такой же результат получен для маршрутизатора, пос-
ляется ли он Address Restricted или Port Restricted. Для троенного на основе FreeBSD 4.9, на которой NAT выпол-
этого клиент отсылает четвертое сообщение, в котором нялась демоном natd.
установлен флажок, указывающий серверу, что он дол- Осталось объяснить, что такое «random port», «preserves
жен ответить, используя порт источника с другим номе- ports» и «no hairpin» в приведенных выше результатах.
ром. Если ответ был получен, NAT относится к Address Посмотрим еще раз на строчку из таблицы NAT в на-
Restricted Cone, если нет – то к Port Restricted Cone. шем примере:

Proto Inside global Inside local Outside local Outside global


Для иллюстрации работы STUN см. рис. 3 (взят из статьи UDP 11.22.33.44:1053 192.168.0.141:1053 1.2.3.4:53 1.2.3.4:53
«Anatomy: A Look Inside Network Address Translators» в «The
IP Journal» Vol.7 Num. 2 за сентябрь 2004 г.). «Random port» означает, что данная реализация NAT
Клиент STUN встроен в некоторые приложения IP-теле- не заботится о том, чтобы номер порта источника в исходя-
фонии, например, X-Pro и X-Lite от компании CounterPath, щем наружу пакете оставался таким же, каким он был по-
и в некоторые другие. Консольный клиент STUN под ОС лучен от хоста локальной сети, и заменяет его на случай-
Windows может быть загружен отсюда: http://prdownloads. ное значение в диапазоне от 1024 до 65535. Можно пред-
sourceforge.net/stun/client.exe?download. положить, что по замыслу автора идеи «random ports» та-
Запустив его и указав в качестве параметра команд- кая замена уменьшает вероятность конфликта между за-
ной строки один из публичных STUN-серверов, вы узнае- писями, если несколько хостов локальной сети одновре-
те тип вашего NAT: менно попытаются отправить наружу пакеты с совпада-
ющим номером порта источника. Поскольку номер пор-
C:\>client.exe stun.xten.com
STUN client version 0.94 та источника в исходящих пакетах формируется хостами
… локальной сети также случайным образом, преимущест-
Primary: Full Cone Nat, random port, no hairpin
Return value is 0x9
ва такой замены сомнительны, из недостатков же можно
назвать хотя бы потенциальную проблему с протоколом
Приведённый выше результат получен на компьютере, RPC, да и не только.
находящемся за маршрутизатором ZyXEL Prestige 645R. Как видно из примера, наш маршрутизатор старает-
Результат для маршрутизатора Cisco 1721 с IOS версии ся сохранять номер порта неизменным (11.22.33.44:1053
12.2 в свою очередь выглядит так: и 192.168.0.141:1053), из чего следует, что запущенный в его
C:\>client.exe stun.xten.net локальной сети STUN-клиент сообщил бы о нем «preserves
STUN client version 0.94 ports». К слову, на FreeBSD этот результат достигается клю-
...
Primary: Port Restricted Nat, preserves ports, no hairpin чом «-same_ports» или «-s» в строчке запуска или конфи-
Return value is 0x1b гурационном файле демона natd.

№1, январь 2006 51


сети
«Hairpin» же означает следующее. Допустим, при нали- но поэтому в Microsoft Internet Explorer, как и консольный
чии в таблице NAT приведенной выше строчки другой хост FTP-клиент, встроенный в Windows, используют по умол-
нашей локальной сети (например, 192.168.0.241) отправ- чанию пассивный режим (они автоматически вставляют пе-
ляет UDP-пакет с адресом назначения 11.22.33.44, пор- ред командами RETR и NLST команду PASV, переключаю-
том назначения 1053 и портом источника 53. Что произой- щую сервер в пассивный режим).
дет в результате? Второй случай. Пользователь, находящийся в локальной
Ответ на этот вопрос зависит от того, поддерживает мар- сети за NAT, использует FTP-клиент для того, чтобы полу-
шрутизатор функцию «hairpin» или не поддерживает. Если чить доступ к FTP-серверу, который также находится за NAT.
он ее поддерживает, пакет будет обычным образом обра- В этом случае, очевидно, не поможет и пассивный режим,
ботан и (если на маршрутизаторе используется реализа- так как в команде PORT независимо от того, клиент или
ция NAT Full Cone или Port Restricted) попадет по назначе- сервер ее отдает, всегда будет указан приватный IP-адрес,
нию – на хост 192.168.0.141. Если же нет («no hairpin»), па- и соединение данных никогда не будет установлено.
кет будет уничтожен маршрутизатором. Название функции Для разрешения этой проблемы в некоторых реализаци-
«hairpin» (шпилька для волос) произошло от того, что, если ях NAT существует специальная функция – трансляция ад-
изобразить прохождение такого пакета на рисунке, форма ресов на уровне приложений, называемая также NAT ALG
его траектории будет похожа на U-образную шпильку. Дру- (Application Level Gateways). При задействованной функции
гое объяснение – слово «hairpin» переводится так же, как ALG маршрутизатор отслеживает и модифицирует данные
«разворот на 180 градусов». При поддержке маршрутизато- уровня приложений некоторых сетевых протоколов.
ром функции «hairpin» подпадающие под ее действие паке- Так, в приведенном выше примере, если предположить,
ты, действительно, будут развернуты на 180 градусов и от- что публичный IP-адрес маршрутизатора с NAT 1.2.3.4 и что
правлены обратно в локальную сеть. он сохраняет номер порта источника неизменным, коман-
да PORT 192,16,0,101,4,211 была бы изменена маршрутиза-
NAT и шлюзы приложений тором на PORT 1,2,3,4,4,211. Благодаря этому в обоих ука-
К сожалению, не у всех сетевых протоколов взаимодейс- занных выше случаях соединение данных будет успешно
твие с NAT протекает безболезненно. Наиболее часто установлено.
встречающийся пример – это FTP. Здесь возможны два Функция ALG в маршрутизаторах Cisco позволяет осу-
случая. ществлять трансляцию адресов уровня приложений не толь-
Первый случай. Пользователь, находящийся в локаль- ко для протокола FTP, но также и для протоколов SIP, H.323,
ной сети за NAT, использует FTP-клиент для того, чтобы Skinny и некоторых других (благодаря этому можно, напри-
получить доступ к FTP-серверу с публичным IP-адресом мер, размещать в локальной сети серверы DNS). Для боль-
(см. рис. 4). шего удобства функция ALG в маршрутизаторах Cisco вклю-
Проблема здесь возникает, когда клиент пытается ис- чена по умолчанию.
пользовать активный режим FTP. Сессия протекает при Аналогичную ALG функциональность в маршрутизато-
этом следующим образом. В некоторый момент по управ- рах на основе ОС Linux обеспечивают дополнительные за-
ляющему соединению серверу передается команда FTP- гружаемые модули и патчи к ядру (такие, как ip_masq_ftp,
клиента: PORT 192,16,0,101,4,211. ip_masq_irc и т. п.).
Дальнейший диалог выглядит примерно так:
Server: 200 PORT command successful. Consider using PASV.
Заключение
Client: RETR file.zip Понимание принципов работы различных реализаций NAT
Server: 150 Opening BINARY mode data connection for file.zip может оказаться полезным при поиске причины неудов-
(1334109 bytes).
летворительной работы некоторых приложений, исполь-
Наибольший интерес здесь представляет первая ко- зующих транспортный протокол UDP. Так, например, со-
манда от клиента, которая информирует сервер о том, что четание ALG и Symmetric или Port Restricted NAT и IP-теле-
хост с адресом 192.168.0.101 открыл для приема соедине- фонов, использующих протокол установки соедиенения
ния данных порт номер (4*256) + 211 = 1235. В ответ на это SIP, может порой давать самые причудливые результаты
сервер должен установить соединение данных со своего (спорадические отказы в регистрации на сервере, одно-
порта номер 20 на указанный порт хоста 192.168.0.101. Пос- сторонняя слышимость между абонентами и т. п.), причем
кольку этот адрес является приватным, такое соединение это зависит не только от настроек IP-телефона, но и от на-
не может быть установлено. В результате наблюдается зна- строек сервера. Другой пример: компания Microsoft сооб-
комый многим системным администраторам эффект, ког- щает в своей статье KB817778, что их реализация тунне-
да клиент вроде бы успешно подключается к FTP-серверу, ля IPv6 over UDP не будет работать через Symmetric NAT
но не может скачивать с него файлы или даже просматри- (адрес статьи в Интернете: http://support.microsoft.com/kb/
вать содержимое текущего каталога (это происходит пото- 817778/EN-US). Таких примеров можно найти ещё много,
му, что передача листинга файлов с сервера на клиент так- и во всех случаях понимание различий в реализациях NAT
же осуществляется по соединению данных). если и не поможет немедленно устранить проблему, то хо-
Для борьбы с описанной проблемой может использо- тя бы укажет на возможные пути решения (например, заме-
ваться переключение сервера в так называемый пассив- нить firmware маршрутизатора на такое, где NAT реализо-
ный режим. Поскольку в этом режиме инициатором соеди- ван в виде Full Cone, если, конечно, оно существует, или за-
нения данных выступает клиент, проблема исчезает. Имен- менить сам маршрутизатор).

52
bugtraq

Выполнение произвольного кода


в Microsoft Windows при обработке
WMF-файлов
Программа: Microsoft Windows 2000, XP, 2003.
Множественные уязвимости Опасность: Критическая.
в VisNetic Mail Server Описание: Уязвимость существует в «Windows Picture and
Программа: VisNetic Mail Server 8.3.0 build 1, возможно бо- Fax Viewer» при обработке Windows-метафайлов (.wmf), со-
лее ранние версии. держащих специально сформированные SETABORTPROC
Опасность: Критическая. Escape-записи. Эти записи позволяют выполнить произ-
Описание: 1. Уязвимость существует из-за недостаточ- вольные функции, если процесс генерации WMF-файла за-
ной обработки входных данных в переменных language канчивается неудачно. Удаленный пользователь может с по-
и lang_settings в сценариях /accounts/inc/include.php мощью специально сформированного WM- файла выпол-
и /admin/inc/include.php. Удаленный пользователь может пе- нить произвольный код на целевой системе с привилегия-
реопределить глобальные переменные и с помощью спе- ми пользователя, открывшего злонамеренный файл.
циально сформированного URL выполнить произвольный Примечание: Уязвимость может быть эксплуатирована
PHP-сценарий на целевой системе. Пример: посредством Windows Explorer, даже если расширение зло-
намеренного файла было изменено на .jpg, .gif, .tif, .png и
http://[host]:32000/accounts/inc/include.php? ↵
language=0&lang_settings[0][1]=http://[host]/ другие форматы.
http://[host]:32000/admin/inc/include.php?language=0& ↵ URL производителя: http://www.microsoft.com.
lang_settings[0][1]=http://[host]/
Решение: Установите обновление с сайта производите-
Удачная эксплуатация уязвимости позволит злоумыш- ля.
леннику выполнить PHP-сценарий с привилегиями SYSTEM
в конфигурации по умолчанию. Выполнение произвольного
2. Уязвимость существует из-за недостаточной об- кода при обработке архивов
работки входных данных в параметре lang сценария в F-Secure Anti-Virus
/dir/include.html. Удаленный пользователь может просмот- Программа: F-Secure Anti-Virus for Workstation version 5.44
реть произвольные файлы на системе. Пример: и более ранние, F-Secure Anti-Virus for Windows Servers
version 5.52 и более ранние, F-Secure Anti-Virus for Citrix
http://[host]:32000/dir/include.html?lang=[file]%00
Servers version 5.52, F-Secure Anti-Virus for MIMEsweeper
3. Уязвимость существует из-за недостаточной обра- version 5.61 и более ранние, F-Secure Anti-Virus Client
ботки входных данных в параметре language в сценарии Security version 6.01 и более ранние, F-Secure Anti-Virus for
/mail/settings.html. Удаленный пользователь может с помо- MS Exchange version 6.40 и более ранние, F-Secure Internet
щью специально сформированного URL выполнить произ- Gatekeeper version 6.42 и более ранние, F-Secure Anti-Virus
вольный PHP-сценарий на целевой системе с привилегиями for Firewalls version 6.20 и более ранние, F-Secure Internet
SYSTEM в конфигурации по умолчанию. Пример: Security 2004, 2005 и 2006, F-Secure Anti-Virus 2004, 2005
и 2006, Solutions based on F-Secure Personal Express version
http://[host]:32000/mail/settings.html? ↵
id=[current_id]&Save_x=1&language=TEST 6.20 и более ранние, F-Secure Anti-Virus for Linux Workstations
http://[host]:32000/mail/index.html?id=[current_id]& ↵ version 4.52 и более ранние, F-Secure Anti-Virus for Linux
lang_settings[TEST]=test;http://[host]/;
Servers version 4.64 и более ранние, F-Secure Anti-Virus for
4. Уязвимость существует из-за недостаточной инициа- Linux Gateways version 4.64 и более ранние, F-Secure Anti-
лизации переменных default_layout и layout_settings при об- Virus for Samba Servers version 4.62, F-Secure Anti-Virus
работке неизвестного HTTP_USER_AGENT. Удаленный Linux Client Security 5.11 и более ранние, F-Secure Anti-Virus
пользователь может просмотреть произвольные файлы Linux Server Security 5.11 и более ранние, F-Secure Internet
на системе. Пример: Gatekeeper for Linux 2.14 и более ранние.
Опасность: Высокая.
Example (using non-IE/Mozilla/Firefox browser):
http://[host]:32000/mail/index.html?/mail/index.html? Описание: 1. Уязвимость существует при обработке ZIP-ар-
default_layout=OUTLOOK2003&layout_settings[OUTLOOK2003]= ↵ хивов. Удаленный пользователь может с помощью специ-
test;[file]%00;2
ально сформированного архива вызвать переполнение бу-
URL производителя: www.deerfield.com/products/visnetic- фера и выполнить произвольный код на целевой системе.
mailserver. 2. Уязвимость в модуле сканирования при обработке RAR
Решение: Установите последнюю версию (8.3.5) с сайта и ZIP-архивов может позволить злоумышленнику скрыть на-
производителя. личие злонамеренного ПО в сканируемых архивах.
URL производителя: www.f-secure.com/products/anti-virus/
avhome.
Решение: Установите исправление с сайта производите-
ля.

Составил Александр Антипов

№1, январь 2006 53


безопасность

Защищаем Windows-системы
с помощью CORE FORCE
Сергей Яремчук
Несмотря на все заявления разработчиков, Windows так и не стала сверхзащищенной
системой, способной противостоять современным угрозам. И вряд ли кто-то уверен,
что традиционно используемые средства защиты способны полноценно защитить компьютер
от неизвестных 0-day-атак. Только комплексный подход способен решить эту проблему.

В
UNIX-подобных операционных ся не только в разные ветки реест- тыре основных параметра: входящие
системах давно известны ре- ра, но и в индивидуальных конфигу- и исходящие сетевые пакеты, доступ
шения, позволяющие остано- рационных файлах. Все это порожда- к файловой системе и реестру, целос-
вить неизвестную атаку путем прину- ет некий бардак, так как программа тность исполняемых файлов. Эти воз-
дительного ограничения рабочего про- должна иметь доступ во множество можности могут быть сконфигурирова-
странства приложения, глобально че- мест, что отследить гораздо труднее, ны как на системном, так и приклад-
рез chroot или более тонко RSBAC, LIDS да и пользователь традиционно имеет ном уровнях для специфических про-
и пр. В последнем случае поступают самые высокие права в системе. Так- грамм (почтовых клиентов, веб-бра-
очень просто. Запускают приложение же не вызывает сомнений, что UNIX- узеров, видео- и аудиопроигрывате-
и наблюдают, к каким файлам проис- пользователь, подготовлен на поря- лей и пр.). Каждому приложению мож-
ходит обращение и какой режим – чте- док лучше пользователя Windows, ко- но дать доступ к определенным час-
ние/запись – требуется. Затем в резуль- торый обычно полностью полагается тям файловой системы и реестра, со
тате создается профиль приложения, на работу мастеров, часто не вникая строгим ограничением прав, только на
который и описывается в виде правил, в подробности. Поэтому последний чтение или возможность модификации
контролируемых на уровне ядра. Если скорее всего не будет в восторге от то- объектов. Также определяется разре-
приложение попробует выйти за ука- го, что придется описывать поведение шенная конкретному приложению се-
занные рамки, то такое действие в за- для каждой устанавливаемой им про- тевая активность.
висимости от настроек может быть за- граммы. А если их десятки? Но должен CORE FORCE бесплатен как для
прещено. Безотказно в UNIX действуют же быть выход? некоммерческого, так и для коммер-
и утилиты контроля целостности. Стоит ческого использования. Распростра-
только измениться какому-то важному Подход CORE FORCE няется по лицензии Apache 2.0 (http://
файлу, как администратор будет опове- Вероятно, разработчиков CORE FORCE [1] www.apache.org/licenses/LICENSE-2.0).
щен. Но для Windows реализовать та- эти и другие проблемы не смогли ос- Все профили безопасности, доступные
кую вроде бы довольно простую систе- тановить, и была создана система, ко- в сообществе CORE FORCE или по-
му как-то не решались. Причин здесь, торая при правильной настройке спо- данные зарегистрированными поль-
вероятно, много, и сказать, какая из них собна решить задачу по защите пер- зователями, распространяются по
является решающей довольно трудно. сонального компьютера от вирусов, Creative Commons лицензии (http://
В UNIX и Windows не только разные известных и неизвестных уязвимос- creativecommons.org/licenses/by-nc-sa/
архитектуры, но и строение файло- тей, шпионских программ, червей, 2.5), гарантирующей, что все могут
вой системы. Так, в UNIX все исполня- троянских программ и прочих подар- пользоваться этими профилями и со-
емые файлы согласно стандарта фай- ков, которыми традиционно богат се- здавать на их основе свои.
ловой системы традиционно собраны годняшний Интернет. CORE FORCE
в одном месте (/bin, /sbin и пр.), стати- представляет собой несколько нетра- Принцип работы
ческие конфигурационные – в другом, диционное решение по обеспечению CORE FORCE
а растущие журналы – в третьем, поль- безопасности персональных компью- CORE FORCE состоит из нескольких
зователи также ограничены своим ра- теров, работающих под управлением модулей, контролирующих определен-
бочим пространством. Это все доволь- Windows 2000 и XP. ные компоненты на предмет имеющих-
но легко описать при помощи простых Это узловая система предотвраще- ся разрешений. В настоящее время до-
правил. В Windows все несколько слож- ния атак (host-based Intrusion Prevention ступны три таких модуля, работающих
нее. Файлы раскиданы по разным ка- System – H-IPS) с интегрированным се- в режиме ядра контролирующих сете-
талогам, настройки могут сохранять- тевым экраном. Контролируется че- вых соединений, защищающих файло-

54
безопасность
вую систему и реестр (рис. 1). Кроме В качестве фильтра пакетов исполь-
того, имеются два дополнительных мо- зуется порт OpenBSD Packet Filter (PF).
дуля Policy Developer и Force Repository, Реализация CORE FORCE включает
работающих в пространстве пользо- два драйвера. Основную функциональ-
вателя. Первый обеспечивает пользо- ность берет на себя miniport driver (croxy.
вательский интерфейс для настройки sys), использующий стандарт NDIS
профилей защиты программ, запус- (Network Driver Interface Specification)
каемых на компьютере. Работающий API для связи драйверов сетевых карт
в виде системного сервиса LocalCPA. с приложениями операционной систе-
exe модуль Force Repository предназна- мы. Этот драйвер, располагаясь внизу
чен для хранения конфигураций обо сетевого стека, контролирует все вхо-
всех разрешениях для всех профилей дящие и исходящие сетевые пакеты,
безопасности, обеспечивает подде- защищая в том числе и стек операци-
ржание базы в целостности, обновле- онной системы.
ние ее через Policy Developer, импорт и Другой драйвер (tdifilter.sys, TDI –
экспорт профилей безопасности. Transport Dispatch Interface) работает Рисунок 1. Взаимодействие модулей
CORE FORCE
Централизованное управление за- на более высоком транспортном уров-
грузкой в память базы данных, которая не, помогая NDIS отслеживать сете-
содержит все разрешения, обеспечи- вые связи каждого процесса, синхро-
вает диспетчер (dispant.sys), также ра- низировать запросы для разрешенных
ботающий в пространстве ядра. Кро- пользовательских соединений. Драй-
ме того, диспетчер обеспечивает API, вера, защищающие файловую систему
позволяя подключить при необходи- и реестр, имеют аналогичное функци-
мости любые другие модули контро- ональное назначение для своих типов
ля. Диспетчер играет роль посредни- объектов. Располагаются в alpha2.sys
ка между модулями защиты, выполня- и alpha2r.sys. Из-за своей позиции Рисунок 2. Выбор уровня безопасности
ющимися в пространстве ядра, и мо- в операционной системе они могут пе- мя иметь доступ только к разрешен-
дулями, работающими в пространстве рехватывать системные вызовы про- ным объектам. Но в разных условиях
пользователя. цессов, пытающихся получить доступ (доверенная сеть, Интернет, запуск не-
Например, сетевой модуль полу- к любому файлу или объекту реестра, понятной утилиты) могут потребовать-
чает сведения о попытке получения а также вызовы, которые были сдела- ся различные разрешения, как более
доступа программой, запрос на под- ны компонентами ядра. жесткие блокирующие, всякую подоз-
тверждение этого действия отсылает- рительную деятельность, так и легкие,
ся диспетчеру. Если в базе данных дис- Организация профилей не отвлекающие при работе.
петчера записано, что такое действие безопасности Для более гибкой их организации
необходимо запретить или разрешить, Описание работы будет неполным без каждый профиль безопасности име-
ответ отсылается обратно. Если реше- рассказа об организации профилей бе- ет набор уровней безопасности: High,
ние принимает пользователь, то дис- зопасности. Действительно, установка Medium, Medium-Low, Low и Custom.
петчер связывается с Policy Developer всех разрешений для большого коли- Каждый сконфигурирован с таким
и ожидает ответа. Диспетчер миними- чества приложений при неправильном расчетом, чтобы обеспечить необхо-
зирует использование памяти, загру- подходе может свести на нет все уси- димый баланс. Пользователю в боль-
жая только необходимые в данный мо- лия. Пользователь может просто запу- шинстве случаев достаточно просто
мент разрешения для текущего уровня таться и либо забросить настройку сис- выбрать необходимый уровень, не вни-
безопасности. Хранение разрешений темы, либо настроить ее неправильно. кая в подробности, а просто почитав
на том же уровне, на котором работа- В CORE FORCE конфигурация разре- описание (рис. 2). Гибкости этой схе-
ют модули защиты, позволяет миними- шений сделана таким образом, чтобы ме добавляет то, что уровень безопас-
зировать потери на переключение кон- обеспечить максимальную гибкость ности выставляется не один на всех,
текста из режима ядра в режим поль- и возможность их повторного исполь- а используется более индивидуаль-
зователя. Кроме того, диспетчер пере- зования. Так, для установки разреше- ный подход. То есть можно систем-
водит переменные в свои фактические ний, которые могут быть применены ный уровень выбрать одним, програм-
величины, т.е. например, расшифровы- к любой программе, можно использо- мам же выставить другие уровни. И те-
вает полный путь к файлу. вать 2 комплекта: системный и индиви- перь при открытии документа Acrobat
Модуль межсетевого экрана филь- дуальный. Если конкретной программе Reader не будет каждый раз запраши-
трует сетевые пакеты, основываясь не указаны разрешения, то будет ис- ваться разрешение, а почтовый клиент
на инструкциях, соединяет програм- пользоваться встроенный, т.е. систем- для отправки и приема почты будет ис-
му с соответствующим текущему про- ный набор разрешений. Такие наборы пользовать только указанные сервера
филю безопасности набором правил, разрешений группируются в профили и спрашивать подтверждение на боль-
которые загружаются во время запус- безопасности, позволяющие програм- шинство потенциально опасных опера-
ка программы. ме нормально работать, но в то же вре- ций (запись в реестр, например).

№1, январь 2006 55


безопасность
Кирпичиками, на которых строятся профили безопас- личных программ. Такие многократно используемые поли-
ности, являются разрешения. Разрешения применяются тики создаются и сохраняются в отдельной вкладке «Shared
к сетевым ресурсам, файлам, реестру, обеспечивая полно- Policies». Итак, текущая конфигурация безопасности при-
ценную основу для защиты программ. Если запрос подхо- ложения и системы будет определена исходя из настро-
дит под правило, то к объекту могут быть применены раз- ек трех уровней: Security Profile (Program/System) – Security
личные действия block или no (блокировать), pass или yes Levels – Policies.
(разрешить), ask (спросить подтверждение), inherit (насле- Как видите, создание профиля безопасности хоть и мак-
довать системные настройки). Не говоря уже об опциях за- симально продумано, но обычный пользователь вряд ли
проса. Здесь и протокол, TCP-флаг, IP-адрес и порт источ- будет этим заниматься. Поэтому одной из задач проекта
ника/приемника, сетевой интерфейс, каталог, файл, ветка было создание общества экспертов, в обязанность кото-
реестра и пр., которым необходимо разрешить определен- рых будет входить и разработка готовых профилей безо-
ные действия: получение списка файлов, чтение, запись, пасности. Сейчас в репозитории проекта можно найти око-
удаление или выполнение. Дополнительно можно вклю- ло сотни профилей для наиболее популярных программ
чать журналирование определенных событий и еще много (ICQ, IE, GPG, Mozilla Firefox и Thunderbird, FlashGet и дру-
других полезных опций. гие). Каждый из них включает имя профиля (часто назва-
Поэтому конфигурирование при помощи разрешений ние программы), ник разработчика, рейтинг, дату послед-
является несколько непрактичным. Ведь если программа него изменения и краткое описание. В Policy Developer ре-
не должна писать в системную область, то в Windows при- ализован импорт и экспорт профилей безопасности пос-
дется описывать довольно много объектов. А если то же са- редством удобных для восприятия человеком XML-фай-
мое затем придется делать и для другой программы? Про- лов с расширением CFX.
ще сгруппировать все разрешения, предназначенные для Например, политика, запрещающая модификацию сис-
определенных целей в некий блок, который затем можно темных файлов, выглядит так.
многократно использовать. И если придется изменять некие
параметры (добавить каталоги, указать правила фильтра- <Policy Name="General. Don’t modify the Operating System">
<Documentation>This policy denies to write and ↵
ции и т. п.), то это необходимо будет сделать только в одном delete files and folder inside the windows ↵
месте. Такие блоки называются «политики» (policies). and programs folder.</Documentation>
<Permissions>
Теперь при создании нового профиля безопасности до- <FileSystem>
статочно собрать подходящие политики и указать уровень <Permission Delete="No" Log="Failed" ↵
Recursive="Yes" Write="No">
безопасности, для которого они должны применяться. CORE <PredefinedFolder Name=»ProgramFiles»/>
FORCE уже имеет некоторое количество встроенных поли- </Permission>
<Permission Delete="No" Log="Failed" ↵
тик, предназначенных для самых разнообразных операций. Recursive="Yes" Write="No">
Конечно же, их можно создавать и самому, как самостоя- <PredefinedFolder Name="Windows"/>
</Permission>
тельно, так и используя уже имеющиеся и связывая их че- </FileSystem>
рез Assigned Policies. При создании политике желательно </Permissions>
</Policy>
дать название, которое будет описывать его функциональ-
ное назначение. Например, такие имена говорят сами за А сетевая политика, разрешающая исходящие соеди-
себя «Network. Send and receive mails» или «Cannot execute нения по протоколу SMB, выглядит так.
from temp (confirmation required)».
Разрешения конфигурируются только в политиках, ес- <Policy Name="Network. Outgoing SMB">
<Documentation>This policy enables outgoing ↵
ли две политики (разрешения) назначены на один и тот же SMB connections.</Documentation>
объект, последний аннулирует предыдущий, то есть фак- <Permissions>
<Firewall>
тически политики прилагаются в порядке объявления. На- <Rule Direction="Both">
пример, если в одной политике запрещен доступ к каталогу, <Allow Stateful="No"/>
<UDP>
а в последующем разрешен, то в итоге доступ будет все-та- <Source Port="netbios-ns"/>
ки разрешен. Именно поэтому в некоторых политиках (чаще <Target Port="netbios-ns"/>
</UDP>
в сетевых) доступ сначала запрещается для всего (Protocol – </Rule>
Any, Address – Any, Direction – Any и т. д.). А в последующих <Rule Direction=»Outgoing»>
<Allow/>
правилах разрешения ослабляются, открывая доступ к то- <TCP>
му, что действительно необходимо. Для файлов чаще про- <Target Port="smb"/>
</TCP>
ще поступить наоборот, т.е. сначала все разрешить, а по- </Rule>
том запретить доступ к системным каталогам. При необхо- <Rule Direction="Outgoing">
<Allow/>
димости очередность разрешений в политике можно изме- <TCP>
нять при помощи стрелок. В отдельном пункте «Permissions» <Target Port="netbios-ssn"/>
</TCP>
можно указать свои параметры, которые будут иметь бо- </Rule>
лее высокий приоритет перед всеми остальными вне зави- </Firewall>
</Permissions>
симости от выставленного уровня безопасности. Разреше- </Policy>
ния можно копировать в другие профили.
Естественно, созданные политики могут многократно Более сложные политики занимают несколько экранов,
использоваться для описания профилей безопасности раз- но на общей читаемости это не сказывается, всегда можно

56
безопасность
понять принцип его работы. Для удобс- ность, но нормально работать он на-
тва переноса между компьютерами ис- чал только после полной очистки сис-
пользуются переменные, как общесис- темы от следов CORE FORCE. И еще
темные вроде [ProgramFiles], так и ус- один неприятный момент, о котором
танавливаемые пользователем. Напри- написано на сайте, и эксперименты это
мер, моя локальная сеть выглядит так. подтвердили. CORE FORCE игнориру-
ет работу с PPPoE, в том числе и ADSL.
<Alias Confidential="Yes" ↵ Сетевой модуль защиты просто не ви-
Name="Local Network">
<Address> дит это соединение, хотя соответству-
<Single Value="192.168.1.0"/> ющий драйвер во вкладке «Свойс-
</Address>
</Alias> тва» просматривается, но модули за- Рисунок 3. Во время установки
щиты файлов и реестра по-прежнему необходимо подтвердить неподписанный
драйвер
После переноса в новую систему работают. В текущей версии 0.70.105
достаточно только изменить значе- не предусмотрена какая-либо защита
ние переменных на актуальные для настроек или привязки к конкретному
текущего компьютера. Для программ, пользователю, поэтому защитить сис-
еще не имеющих подготовленный про- тему от действий пользователя, обла-
филь безопасности, предусмотрен ре- дающего какими-либо правами в сис-
жим обучения. теме, при помощи CORE FORCE не по-
лучится. Такие возможности плани-
Совместимость руются в будущих релизах. Хотя со-
и системные требования четание системных настроек и CORE
Компьютер Celeron 633 с 256 ОЗУ и ус- FORCE на порядок поднимает общую
тановленным Windows XP SP2 заметно защищенность компьютера.
притормаживает при работе с CORE Рисунок 4. Программа установки ищет
известные программы
FORCE. Поэтому предложенные раз- Установка CORE FORCE
работчиками минимальные системные Установка является стандартной для ма не совпадает. Это не означает нали-
требования – Pentium III 800 и 128 ОЗУ, – Windows. Скачиваем исполняемый чие вируса или чего-нибудь еще. Ско-
можно считать, выбраны обоснованно. файл размером 8,72 Мб и запускаем. рее всего дело в другой версии утили-
Но это еще не все неприятности. CORE В процессе установки программа ав- ты. Обновить сигнатуры для всех най-
FORCE вмешивается в работу сетевых томатически скачивает пакет Windows денных программ можно, поставив га-
и системных сервисов, что не может Installer [3], если нет соединения с Ин- лочку в «Update unrecognized signatures
нравиться антивирусным программам тернетом, либо планируется примене- to match those found on your computer».
и межсетевым экранам. На странице ние CORE FORCE на нескольких ком- Следующим шагом программа запро-
проекта [4] имеется список совмести- пьютерах, этот пакет необходимо ска- сит указать сетевые настройки (Local
мости (и несовместимости тоже) та- чать и установить самостоятельно. Network, Broadcast, DNS), которые
ких программ. В последний попали та- В процессе установки появится сооб- можно затем отредактировать, зайдя
кие продукты, как Norton Antivirus 2004, щение о кратковременном отключе- в Aliases. После перезагрузки в трее
Sophos Anti-Virus 5.05 и Panda Titanium нии соединений с Интернетом и про- появится еще один значок , по щел-
2006 Anti-Virus + Antispyware v5.0.1.00 сьбе закрыть все соединения. В моем чку на нем можно активировать, де-
(на сайте указано, что не работает случае соединение с Интернетом так активировать CORE FORCE и вы-
в Windows 2000 SP4, зато работает и не восстановилось (вероятно, из-за звать Policy Developer для настройки.
с Windows XP SP2). Разработчики обе- проблем с Outpost). А во вкладке «Свойства сетевого со-
щают постепенно устранить проблемы. Если установка производилась единения» появится новый драйвер
Список совместимых программ немно- в Windows XP, то появится еще одно «Сore Force Network Driver».
го больше: AVG Anti-Virus (на сайте ука- сообщение (рис. 3) о том, что нет сер- В особо тяжелых случаях систе-
зана версия 7.0.334, у меня более ста- тифицированной подписи на ПО. Здесь ма после установки CORE FORCE мо-
рая 6.0.754 работала также без про- подтверждаем установку. В процессе жет не захотеть загружаться. Для ус-
блем), Kaspersky Anti-Virus Personal установки будет проведен поиск из- транения этого необходимо перейти
v5.0.388, BitDefender Free Edition v8, вестных программе утилит и сравнение в Safe Mode, нажав <F8> при загрузке,
MCAFEE VirusScan 2006 v10, Sophos сигнатур, в результате пользователю и воспользоваться Core Force Recovery
Anti-Virus v5.05, NODE32 v2.5, eTrust EZ будет выведен результат (рис. 4). От- Console (RecoveryConsole.exe), кото-
Antivirus v7.0.8.1, F-Prot Antivirus v3.16c вет «No» говорит, что такая программа рый поможет деактивировать драйве-
и Trend Micro PC-Cillin Internet Security не найдена, «Yes» – программа найдена ра и отключить автоматический старт
2005 v12.0 и 2006 v14.0. и контрольная сумма совпадает с име- CORE FORCE при загрузке.
Как видите, в списках одни анти- ющейся в базе данных. Но, скорее все-
вирусы. Но у меня после установки го, вы получите ответ «Yes, but signature Работа с CORE FORCE
CORE FORCE намертво завис Outpost is invalid», говорящий о том, что про- Окно Policy Developer, показанное
версий 2.5 и 3.0. Возможно, и случай- грамма найдена, а контрольная сум- на рис. 5, визуально разделено на две

№1, январь 2006 57


безопасность
в разделе Programs Mozilla Thunderbird.
Если его нет в списке найденных про-
грамм, например, она устанавлива-
лась позже, сначала прописываем ее.
Для этого нажимаем на панели инстру-
ментов «Create» либо щелкаем правой
кнопкой, и появляется меню «Add new
program…».
Запускается мастер, помогающий
добавить новую программу в список.
Первым шагом указываем на испол-
няемый файл (рис. 7).
Далее мастер предлагает два ва-
рианта действий: найти профиль бе-
зопасности на сайте CORE FORCE
(Search in CORE FORCE Community
(recommended)) или создать его са-
мому (Add new program configuration)
(рис. 8). При выборе первого пункта
будет произведен поиск на сайте, в ре-
Рисунок 5. Окно настройки Policy Developer зультате чего может быть предложено
Если выбран режим настройки несколько вариантов профилей. В на-
разрешений, то правое окно будет со- шем случае их два, с одинаковым рей-
стоять из трех вкладок: Firewall, File тингом (рис. 9).
System и Registry, в которых выстав- Если готового профиля нет, то вы-
ляются разрешения для соответству- бираем самостоятельное создание
ющих модулей. В каждой вкладке до- профиля безопасности. При этом бу-
ступны два режима просмотра. На- дет предложен запуск Learning Wizard с
пример, для межсетевого экрана раз- тремя вариантами использования про-
решения можно просматривать в ви- граммы (рис. 10).
де правил PF либо их расшифровку. Итак, после закачки профиля пе-
Пункт System – Aliases покажет все пе- реходим к настройке в основном ок-
ременные, известные программе (от- не программы. Выбираем Mozilla
дельно сетевые и файловые). Здесь Thunderbird в Programs и заходим в
же по двойному щелчку их можно ре- Launch Control (рис. 11).
дактировать. Контрольная сумма в установлен-
Например, на рис. 6 показан про- ном профиле не совпадает с нашей,
Рисунок 6. Настройка сетевой
переменной цесс настройки одной из сетевых пе- т.к. профиль безопасности создавался
ременных. В качестве параметра мож- для версии 1.0.2, я использую более но-
но ввести значение, имеющее смысл вую 1.0.7. Нажатием на «Add Signature»
(IP-адрес компьютера или сети, се- добавляем новую контрольную сумму
тевую маску, имя) или Any, означа- в базу. Для контроля настроек выби-
ющее любое. Если выставить галоч- раем пункт «Permissions». Если зайти
ку в «Confidential (Don’t save content во вкладки «File System» и «Registry»,
on export)», то при экспорте настроек то можно обнаружить, что разреше-
эта переменная не будет выводить- ния запрещают записывать, удалять,
ся в результирующий файл. Отсле- выполнять, а в некоторых случаях и
дить текущие события можно, зайдя читать файлы в основных системных
в Activity Monitor, имеющую две вклад- каталогах.
Рисунок 7. Выбор исполняемого файла ки Logs и Processes. Для удобства от- Правила фильтрации сетевых па-
добавляемой программы
бора определенных событий можно кетов смотрим в Firewall. Разрешения,
части. В левой части, состоящей воспользоваться фильтром. Кроме то- установленные по умолчанию, показа-
из двух вкладок General и Shared го, все программы, доступные из Policy ны на рис. 12.
Policies, выбираются профили безопас- Developer, также имеют свой Activity Все, что подсвечено серым цве-
ности, политики, разрешения, добав- Monitor, показывающий события, отно- том, изменять нельзя, если какое-ли-
ляются и убираются новые программы сящиеся к конкретной программе. бо из них вас не устраивает, то его
в список контроля. В правой части про- Для примера настроим прави- можно переопределить, добавив но-
изводятся просмотр и настройка соот- ла для почтового клиента Mozilla вое правило и поместив ниже. Теперь
ветствующих параметров. Thunderbird. Выбираем в левом окне если правило требует подтверждение

58
безопасность

Рисунок 8. Выбор вариантов создания Рисунок 9. Некоторые приложения имеют Рисунок 10. Выбор уровня исследования
профиля безопасности несколько вариантов профилей программы мастером самообучения

Рисунок 12. Правила фильтрации


для Mozilla Thunderbird

Рисунок 13. Запрос при изменении


сигнатуры Mozilla Firefox
Рисунок 11. Установка контрольной суммы
действия пользователя, то ему будет му со стороны приложения, а не кон-
выведено соответствующее сообще- кретной уязвимости. Очевидно, ра-
ние (рис. 13, 14, 15). бочую среду приложения проще пре-
Пользователь может его однократ- дугадать, чем сигнатуру неизвест-
но подтвердить (Allow) или запретить ного вируса. Создание сообщества
(Deny). Выбрав «Add a permanent rule CORE FORCE только упрощает эту
in System» (здесь могут быть вариан- процедуру, а пользователю теперь нет
ты, но сводятся они к одному и тому необходимости в каждодневном об-
же), можно создать новое разреше- новлении системы и антивирусных баз.
ние на основе вашего ответа. В этом CORE FORCE – яркий пример того, как
случае при совпадении запроса CORE можно защитить систему, не зная ни-
FORCE следующий раз не будет вас чего об угрозе.
беспокоить. Рисунок 14. Запрос на подтверждение
Все настройки в пределах одной Ссылки: изменения ветки реестра
статьи описать невозможно. На сай- 1. Сайт программы CORE FORCE – http://
те проекта найдете несколько поша- force.coresecurity.com.
говых руководств, описывающих со- 2. Яремчук С. Проактивные системы за-
здание разрешений для простейших щиты, или Есть ли жизнь без антивиру-
приложений, которые помогут во всем са? – Журнал «Системный админист-
разобраться. ратор», №7, 2005 г. – 9-13 с.
3. Пакет Windows Installer – http://www.
Вывод installengine.com/cert02/isengine/isscript.
В последнее время явно наметилось msi.
оживление «альтернативных» прило- 4. Known Issues & Compatibility List –
жений, защищающих Windows, в кото- http://force.coresecurit y.com /index.
Рисунок 15. Подтверждение сетевой
рых разработчики смотрят на пробле- php?module=articles. активности программы

№1, январь 2006 59


безопасность

Расширяем возможности
MailScanner

Сергей Яремчук
В прошлой статье [1] вы рассмотрели возможности и установили почтовый сканер MailScanner.
Сегодня мы познакомим вас с дополнительными программами, позволяющими просмотреть
статистику работы системы защиты электронной почты.

Веб-интерфейс MailWatch  Просмотр статуса работы вирус- рые параметры объяснены плохо, по-
MailWatch [2] представляет собой инс- сканера (пока только для Sophos), этому пройдем все три этапа. Для ра-
трумент, предназначенный для рабо- базы данных MySQL и вывод фай- боты потребуются права суперпользо-
ты и настройки MailScanner, использу- ла настроек MailScanner. вателя. Распаковываем файл с архи-
ющий веб-технологии. Написан на PHP,  При работе с Sendmail имеется воз- вом в рабочий каталог.
MySQL и JpGraph, распространяется можность проверить и вывести раз-
под лицензией GNU GPL. Для запи- меры очереди почты и информа- # tar xzvf mailwatch-1.0.2.tar.gz
# su mailwatch
си в базу данных применяются свои цию о пересылке.
собственные функции пользователя  Разграничение информации для И приступаем к созданию баз и таб-
(CustomFunctions). пользователей, домена и админис- лиц.
Основные возможности: тратора. Поддержка XML-RPC поз-
 Отображение очереди входящей воляет использовать несколько ин- # /etc/init.d/mysqld start
и исходящей почты (пока только сталляций MailScanner/MailWatch Starting safe_mysqld service: [ DONE ]
для Sendmail/Exim), вывод инфор- как единое целое.
мации о средней загрузке и коли-  Вывод самых разнообразных отче- Таблицы можно создавать и вруч-
честве сообщений за текущий день, тов. ную, но проще воспользоваться гото-
спаме, вирусах и блокированного вым скриптом.
контента. Настройка MailWatch
 Подсвечивание недавно обрабо- Процесс настройки MailWatch мож- # mysql –u root -p < create.sql
танной почты. но условно разделить на три час- Enter password: ******
 Вывод подробной информации по ти: создание необходимых баз и таб-
каждому сообщению. лиц в MySQL, изменение парамет- Создаем пользователя, от имени
 Управление почтой, попавшей в ка- ров доступа веб-сервера и редакти- которого MailWatch будет работать с
рантин (т.е. ее можно просматри- рование конфигурационного файла базой данных.
вать, разрешать, удалять, переобу- MailScanner.conf. В документации этот
чать спам-фильтры). процесс описан подробно, но некото- # mysql –u root -p

60
безопасность
Enter password: ****** mysql> INSERT INTO users VALUES ↵
mysql> GRANT ALL ON mailscanner.* TO mailwatch@localhost ('grinder@test.ru',md5('pasword'),'sergej','A','1');
IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.12 sec) Query OK, 1 row affected (0.46 sec)

Для интереса посмотрим созданные таблицы. С базой все, выходим.

mysql> SHOW TABLES; mysql> quit


+----------------------------+
| Tables_in_mailscanner | Теперь файл MailWatch.pm, в котором редактируем сле-
+----------------------------+
| audit_log | дующие параметры (по умолчанию почему-то использует-
| blacklist | ся root).
| geoip_country |
| inq |
my($db_name) = 'mailscanner';
| maillog |
my($db_host) = 'localhost';
| mcp_rules | my($db_user) = 'mailwatch';
| mtalog | my($db_pass) = 'password';
| outq |
| sa_rules |
| saved_filters |
Затем перемещаем его в каталог CustomFunctions.
| user_filters |
| users |
| whitelist | # mv MailWatch.pm /opt/MailScanner/lib ↵
+----------------------------+ /MailScanner/MailScanner/CustomFunctions
13 rows in set (0.00 sec)
Аналогичные параметры редактируем и в скрипте
Все пользователи для доступа через веб-интерфейс SQLBlackWhiteList.pm, который позволяет пользователю са-
должны иметь запись в таблице users. мому создавать белый и черный списки и заносить их в ба-
зу данных. После чего помещаем его на место:
mysql> DESCRIBE users;
+-------------------+---------------------------+------+-----+---------+-------+ # mv SQLBlackWhiteList.pm /opt/MailScanner/lib ↵
| Field | Type | Null | Key | Default | Extra | /MailScanner/MailScanner/CustomFunctions
+-------------------+---------------------------+------+-----+---------+-------+
| username | varchar(60) | | PRI | | |
| password | varchar(32) | YES | | NULL | |
И переходим к следующему этапу.
| fullname | varchar(50) | | | | | Папку mailscanner, содержащую php-скрипты, помеща-
| type | enum('A','D','U','R','H') | YES | | NULL | |
| quarantine_report | tinyint(1) | YES | | 0 | | ем в рабочий каталог веб-сервера.
+-------------------+---------------------------+------+-----+---------+-------+
5 rows in set (0.10 sec)
# mv mailscanner /var/www/html/
Поле username должно устанавливаться в зависимос-
ти от значения поля type. Для обычных пользователей оно И устанавливаем необходимые права доступа для ката-
содержит почтовый адрес и используется при регистрации логов, в которых будут создаваться и храниться графики.
и работе с почтой. Поле password, думаю, понятно без объ-
яснений, а в fullname заносят реальное имя пользователя. # chown root:apache /var/www/html/mailscanner/images
# chmod ug+rwx /var/www/html/mailscanner/images
Поле type указывает на привилегии, которые будет иметь # chown root:apache /var/www/html/images/cache
пользователь. Так, U (User) означает обычные привилегии, # chmod ug+rwx /var/www/html/images/cache
такой пользователь будет способен работать с почтой, ре-
дактировать черный и белый списки только для указанно- Для настройки параметров доступа к базе данных ис-
го почтового адреса, совпадающего с username. При уста- пользуется файл conf.php. Берем в качестве основы conf.
новке типа D (Domain Administrator) в поле username в та- php.example и редактируем его.
ком случае указывается домен, а пользователь может ра-
ботать с письмами и спам-листами для всего домена. Тип // Database settings
define(DB_TYPE, 'mysql’);
A (Administrator) – администратор предназначен для работы define(DB_USER, 'mailwatch');
с самим MailWatch, H зарезервирован для остальных случа- define(DB_PASS, 'password');
define(DB_HOST, 'localhost');
ев. И наконец R (user Regular expression) предназначен для define(DB_NAME, 'mailscanner');
тех случаев, когда у пользователя имеется несколько почто-
вых адресов, используя этот тип, он получает возможность Также следует проверить значение переменной MS_LIB_
работать одновременно с несколькими. Поле quarantine_ DIR, которая должна указывать на каталог, в который ус-
report позволяет просматривать данные карантина. Для тановлен MailScanner, в нашем случае это /opt/MailScanner.
первоначальной работы достаточно создать администра- А переменная MS_CONFIG_DIR на каталог, в котором рас-
тора, для всех остальных можно использовать веб-интер- положен конфигурационный файл MailScanner.conf, т.е. /opt/
фейс (остальные подробности смотрите в файле USER_ MailScanner/etc/, иначе может произойти такая ошибка.
FILTERS документации). К сожалению, готовых скриптов,
позволяющих импортировать пользователей в комплек- Warning: fopen(/etc/MailScanner/MailScanner.conf):
failed to open stream: No such file or directory in
те, нет, что при большом их количестве неудобно. Поэтому /var/www/html/mailscanner/functions.php on line 860
этим придется заниматься самому. Cannot open MailScanner configuration file

№1, январь 2006 61


безопасность
Переименовываем файл.  Mail Relayed – общее число сообщений, обработанных
системой, синяя линия указывает на количество полу-
# mv conf.php.example conf.php ченных сообщений, затененная область – количество
получателей (одно сообщение может иметь многочис-
Для MailScanner версии 4.43 и выше можно использо- ленных получателей).
вать флаг управления карантином, но в этом случае необ-  Spam Identified – число сообщений, определенных как
ходимо отключить используемый самим MailScanner скрипт спам. Затененная область включает все сообщения, за-
clean.quarantine, запускаемый через cron. Далее активиру- блокированные всеми возможными средствами: пра-
ем QUARANTINE_USE_FLAG, т.е. меняем false на true. Ни- вилами MTA, RBL в MailScanner и SpamAssassin. Синяя
же настраиваем параметры отправки сообщения по элек- линия показывает сообщения, заблокированные толь-
тронной почте о поступлении письма в карантин. ко на уровне MTA.
Для вывода очереди сообщений (Sendmail и Exim) не-  Spam as Percentage of Total Mail – процент представлен-
обходимо активировать переменную MAILQ. Затем скрипт ной почты, определенной как спам. Отличие заключает-
mailq.php запускаем через cron. ся в том, что представленная почта включает сообщения,
отвергнутые MTA, т.е. не дошедшая до MailScanner.
# cp /var/www/html/mailscanner/mailq.php /usr/local/bin  Mail Containing a Virus or Failing Content Checks – об-
# crontab -e
0-59 * * * * /usr/local/bin/mailq.php щее число обнаруженных сообщений, содержащих
вредный контент. Затененная область представляет за-
Редактируем MailScanner.conf: блокированные, изолированные, удаленные сообщения,
содержащие вирусы, запрещенные расширения, имена
Always Looked Up Last = &MailWatchLogging и типы файлов, html-код. Синяя линия показывает обна-
Detailed Spam Report = yes
Quarantine Whole Message = yes руженные вирусными сканерами.
Quarantine Whole Message As Queue Files = no  MTA Processes Running и Copies Of MailScanner
Include Scores In SpamAssassin Report = yes
Quarantine User = root Running – индикаторы работы MTA и MailScanner.
QuarantineGroup = apache # т.е. та же что и у веб-сервера  Bytes of Mail Transferred – этот граф, показывающий
Quarantine Permissions = 0660
# И для редактирования спам-списков. количество информации, прошедшей через MTA, поз-
Is Definitely Not Spam = &SQLWhitelist воляет оценить нагрузку, вызванную внешней почтой.
Is Definitely Spam = &SQLBlacklist
В течение дня график должен расти равномерно, рез-
После чего запускаем MailScanner: кие всплески или плоский график могут свидетельство-
вать о проблемах.
# /opt/MailScanner/bin/check_mailscanner  Ram Usage – использование памяти. Затененная линия
показывает количество ОЗУ с используемым дисковым
В /var/log/maillog должна появится запись о работе кешем, синяя область – общее количество затребован-
с MailWatch и соединении с MySQL. ной памяти, включая своп.
Jan 2 10:48:12 grinder MailScanner[26388]: MailScanner E-Mail
 Number Of Files In Incoming Queue и Number Of Files In
Virus Scanner version 4.45.4-1 starting... Outgoing Queue – вывод количества файлов во входя-
Jan 2 10:48:13 grinder MailScanner[26388]: Config: calling custom щей и исходящей очередях, резкие изменения в любом
init function MailWatchLogging
Jan 2 10:48:14 grinder MailScanner[26388]: Initialising database
из этих графиков могут свидетельствовать о проблеме.
connection  Number Of Files / Messages In Quarantine – количес-
Jan 2 10:48:14 grinder MailScanner[26388]: Finished initialising тво файлов (затененная область) и сообщений (синяя
database connection
линяя) в карантине.
Теперь пробуем зайти на MailWatch, набрав в строке веб-  Machine Load Average и CPU Utilization Percentage –
браузера http://localhost/mailscanner/ и использовав в ка- показатели загрузки системы.
честве логина и пароля данные администратора, создан-  Processing Speed – скорость обработки почты
ного ранее и занесенного в таблицу users. Все, теперь мо- MailScanner. Для работы этого параметра необходимо
жете заводить пользователей (рис. 1), просматривать от- выставить Log Speed = yes в MailScanner.conf. В отли-
четы, редактировать спам-листы и прочее. В документации чие от большинства других графов, низкий показатель
довольно подробно описан процесс настройки MailScanner предполагает проблему.
и MailWatch для работы с байесовскими фильтрами и на-  Average Number of Messages Per Batch – среднее ко-
стройка просмотра релейных сообщений для Sendmail, по- личество сообщений при обработке пакета помогает ра-
этому говорить о них не будем. зобраться в Processing Speed, поскольку скорость обра-
ботки зависит и от размера.
Мониторинг почтового сервера  Viruses and Blocked Content as Percentage of Total
при помощи MRTG Mail – показывает процент обработанной почты, со-
Если MailWatch больше ориентирован на работу и более тон- держащей запрещенный контент или вирус. Синяя ли-
кую настройку самого MailScanner, то mailscanner-mrtg [3] ния указывает на вирусы, затененная область суммар-
помогает разобраться с работой почтового сервера в це- но запрещенный контент и вирус.
лом, выводя различные статистики о работе последнего.  Disk Space Used in / – занятость в процентном отноше-
Используя его, можно получить следующую информацию: нии корневой файловой системы.

62
безопасность
 Disk Space Used in Work Filesystem – занятость в про-
центном отношении файловой системы рабочего ка-
талога MailScanner (на него указывает переменная
MailScanner Work Directory в конфигурационном файле).
Чаще всего его значение совпадает со следующим, но
введен из-за того, что часто рабочий каталог для уско-
рения обработки выносят в tmpfs.
 Disk Space Used in Spool Filesystem – занятость в про-
центном отношении файловой системы рабочего ката-
лога MTA (на него указывает переменная Spool Directory
в конфигурационном файле).
 Server Network Traffic – общий сетевой трафик для ука-
занных сетевых интерфейсов (определяется перемен-
ной Interfaces to Monitor в конфигурационном файле).

С работой этой системы можно ознакомиться, обратив- Рисунок 1. Создание нового пользователя для доступа
к MailWatch
шись к [7], правда, на момент написания статьи там была ус-
тановлена более ранняя версия (текущая 0.10). Установка ни-
каких сложностей не представляет. Скачиваем архив разме-
ром 64 Кб, распаковываем и даем команду ./install.pl внутри
каталога (некоторые опции можно просмотреть, используя
ключ-help). После чего скрипт выведет текущие настройки.
Location of perl: /usr/bin
Installation Prefix: /usr
Program Location: ${prefix}/sbin
Libraries Location: ${prefix}/lib
Documentation Location: ${prefix}/share/doc
Man pages Location: ${prefix}/share/man
MRTG Config directory: /etc/mrtg
MailScanner Config directory: /etc/MailScanner
WWW root: /var/www/html
Apache configuration dir: /etc/httpd/conf
Location of mrtg: /usr/bin/mrtg
Location of uptime: /usr/bin/uptime
Use SNMP: n
Cron job in cron.d: /etc/cron.d
Рисунок 2. Вывод статистики MailScanner-MRTG
Далее все файлы будут скопированы на свои места,
и будет предложено отредактировать конфигурационный Анализ почты с Vispan
файл mailscanner-mrtg.conf, который затем будет помещен Vispan (VIrus and SPam ANalyser), представляющий собой
на свое место, т.е. в /etc/mrtg. Файл хорошо комментиро- Perl-скрипт, анализирующий файлы журналов и использу-
ван, имеются готовые шаблоны, некоторые опции приведе- ющий библиотеку GD для построения графиков (полный
ны выше, некоторые совпадают с MailScanner.conf, поэтому список зависимостей найдете на сайте). Последняя версия
особенных трудностей при его редактировании возникнуть 2.0.2 датирована 6 января 2004 года, поэтому можно пред-
не должно. Обязательно проверьте правильность всех путей положить о приостановке работ. Тем не менее Vispan имеет
в файле и установки MTA. В крайнем случае картинки с не- свои особенности, о которых следует рассказать. Проект [4]
правильными параметрами будут пустыми, и вы сами смо- немного похож по возможностям на предыдущий, только его
жете быстро определить проблему. Главным является Perl- графики больше ориентированы на статистику сообщений,
скрипт /usr/sbin/mailscaner-mrtg с модулями, расположенны- и меньше выводят системную информацию. С его помощью
ми в каталоге /usr/lib/MailScanner-MRTG/MSMRTG. MRTG получите полную статистику о размере очереди входящих
традиционно генерирует графики через определенное вре- и исходящих сообщений, включая спам и вирусы (количес-
мя. Для этого используется скрипт mailscanner-mrtg.crond, тво и процент от общего числа), времени прохождения по
который после установки должен лежать в /etc/cron.d. MailScanner, количестве блокированных IP-адресов, време-
ни последнего обновления антивирусных баз. Кроме того,
*/5 * * * * root /usr/bin/mrtg /etc/mrtg/mailscanner-mrtg будет выведен список наиболее часто попадающихся ви-
русов и спама. Кроме вывода статистики сценарий может
То есть скрипт будет выполняться каждые 5 минут. автоматически добавлять адреса спамеров в конфигура-
Для проверки работоспособности лучше выполнить эту ко- ционный файл sendmail или в правила iptables. Этот адрес
манду в консоли и проследить за отсутствием ошибок. может автоматически удаляться после указанного проме-
Перезапускаем веб-сервер и заходим по адресу жутка времени. Если с этого адреса спам будет получен
http://localhost/mailscanner-mrtg (рис. 2). По щелчку на кон- вторично, то промежуток времени нахождения в черном
кретном графике будет выдана статистическая информа- списке будет каждый раз удваиваться. Ознакомительная
ция за день, неделю, месяц и год. версия доступна по адресу [8].

№1, январь 2006 63


безопасность
И приступаем к редактированию конфигурационно-
го файла /etc/Vispan.conf. Основные параметры которого
приведены ниже.

# Использование sendmail для блокировки спамерских адресов


UseAccess = 0
# Использование IPtables для блокировки спамерских адресов.
# Одновременное использование UseAccess и UseIPTables
# смысла не имеет
UseIPTables = 1

# Использование эвристического удаления адресов из


# блокировки. Иначе будет сохраняться весь список спамеров
UseHeuristics = 1

# Первичная блокировка адреса в минутах, далее время


# будет постоянно удваиваться
BlockTime = 7200 # 5 дней

# Адреса, которые не будут блокироваться. Можно задать


# одиночный IP или диапазон:
Рисунок 3. Вывод статистики Vispan # 192.168.0.0-192.168.0.10 или 192.168.0.1/24
WhiteList = 192.168.0.1 192.168.0.2

Далее проверяем правильность путей в переменных,


выставляем почтовый адрес, на который будут высылать-
ся уведомления. Perl-скрипт Vispan запускается при помо-
щи cron. После установки в каталоге /etc/cron.d должен ле-
жать файл vispan.cron следующего содержания.

*/10 * * * * root /usr/local/bin/Vispan

Первый раз его также желательно запустить самому


и отследить ошибки. После этого в веб-браузере набираем
http://localhost/vispan/, результат смотрите на рис. 3.
Рисунок 4. Модуль webmin позволяет настроить работу Задачу настройки самого MailScanner может существен-
MailScanner но упростить модуль для Webmin [5], который после установ-
ки появится в закладке «Службы». Далее необходимо его
сконфигурировать, прописав в настройках пути к конфигу-
рационному и исполняемым файлам и месту, куда установ-
лен сам MailScanner. После этого выбираем необходимый
пункт (рис. 4) и редактируем параметры, в большинстве
случаев, только устанавливая кнопки в «Да» или «Нет».
MailScanner является мощным средством для защиты
электронной почты, а имеющиеся дополнения позволяют
заметно упростить работу с ним и расширить его возмож-
ности. Да, кстати, 1 января 2006 года вышла новая 4.49
версия MailScanner.

Литература и ссылки:
Рисунок 5. При помощи модуля webmin настройка многочисленных 1. Яремчук С. Защищаем электронную почту средствами
параметров заметно упрощена
MailScanner. – Журнал «Системный администратор», №12, де-
Установка также проста. кабрь 2005 г. – 45-51 с.
2. Сайт проекта MailWatch – http://mailwatch.sourceforge.net.
# wget -c http://www.while.homeunix.net/mailstats/ 3. Сайт проекта mailscanner-mrtg – http://mailscannermrtg.
Vispan-2.0.2.tar.gz
# tar xzvf Vispan-2.0.2.tar.gz sourceforge.net.
# cd Vispan-2.0.2 4. Сайт проекта Vispan – http://www.while.homeunix.net/mailstats.
# perl Makefile.PL
5. Сайт проекта mailscanner-webmin – http://lushsoft.dyndns.org/
Checking if your kit is complete... mailscanner-webmin или http://sourceforge.net/projects/msfrontend.
Looks good
Writing Makefile for Vispan 6. Яремчук С. Упрощаем себе жизнь с Webmin. – Журнал «Сис-
темный администратор», №7, июль 2004 г. – 34-37 с.
Здесь могут быть сообщения о ненайденных модулях, 7. О з н а ко м и те л ьн а я в е р с и я M ailS c anner- mr tg – ht tp : / /
их необходимо будет установить. mailscannermrtg.sourceforge.net/mailscanner-mrtg.
8. Ознакомительная версия Vispan – http://hosting.boys-brigade.
# make install org.uk/mrtg.

64
bugtraq

Отказ в обслуживании при обработке


EIGRP-пакетов в Cisco
Программа: Cisco EIGRP 1.2. Множественные уязвимости
Опасность: Средняя. в продуктах Oracle
Описание: 1. Уязвимость существует в реализации EIGRP- Программа: JD Edwards EnterpriseOne 8.x, Oracle Application
протокола. Удаленный пользователь может получить доступ Server 10g, Oracle Collaboration Suite Release 1, Oracle
к потенциально важным данным в EIGRP UPDATE Reply-па- Collaboration Suite Release 2, Oracle Database 8.x, Oracle
кетах или вызвать отказ в обслуживании с помощью боль- Database Server 10g, Oracle Developer Suite 10g, Oracle E-
шого количества HELLO-собщений. Business Suite 11i, Oracle Enterprise Manager 10.x, Oracle9i
2. Уязвимость существует при обработке Goodbye-со- Application Server, Oracle9i Database Enterprise Edition,
общений, если не используется MD5-аутентификация. Уда- Oracle9i Database Standard Edition, Oracle9i Developer Suite,
ленный пользователь может послать большое количество PeopleSoft Enterprise Portal 8.x.
специально сформированных EIGRP-пакетов и вызвать от- Опасность: Средняя.
каз в обслуживании устройства. Описание: Обнаружено 82 уязвимости в различных про-
URL производителя: www.cisco.com. дуктах Oracle, которые позволяют удаленному пользовате-
Решение: В настоящее время способов устранения уязви- лю получить доступ к потенциально важным данным, пе-
мости не существует. резаписать произвольные файлы на системе и выполнить
SQL-команды.
Переполнение динамической памяти 1. Уязвимость существует из-за недостаточной обра-
в Clam AntiVirus ботки входных данных в различных параметрах в проце-
Программа: Clam AntiVirus (clamav) версии до 0.88. дурах DBMS_DATAPUMP, DBMS_REGISTRY, DBMS_CDC_
Опасность: Средняя. UTILITY, DBMS_CDC_PUBLISH, DBMS_METADATA_UTIL
Описание: Переполнение динамической памяти обнару- и DBMS_METADATA_INT в пакетах Oracle PL/SQL. Зло-
жено в файле libclamav/upx.c при обработке UPX-архивов. умышленник может выполнить произвольные SQL-коман-
Удаленный пользователь может с помощью специально ды в базе данных.
сформированного UPX-файла вызвать отказ в обслужи- 2. Уязвимость существует из-за недостаточной обработ-
вании приложения. ки входных данных в процедурах ATTACH_JOB, HAS_PRIVS
URL производителя: www.clamav.net. и OPEN_JOB в пакете SYS.KUPV$FT. Злоумышленник мо-
Решение: Установите последнюю версию (0.88) с сайта жет выполнить произвольные SQL-команды в базе данных.
производителя. Уязвимость обнаружена в Oracle 10g Release 1.
3. Уязвимость обнаружена в нескольких процедурах
Уязвимость форматной строки в модуле в пакете SYS.KUPV$FT_INT. Злоумышленник может вы-
auth_ldap в Apache полнить произвольные SQL-команды в базе данных. Уяз-
Программа: auth_ldap 1.6.0 и более ранние версии. вимость обнаружена в Oracle 10g Release 1.
Опасность: Высокая. 4. Ошибка дизайна обнаружена в Oracle TDE (Transparent
Описание: Уязвимость форматной строки обнаруже- Data Encryption) wallet, которая позволяет сохранить пароль
на в функции auth_ldap_log_reason(). Удаленный пользо- и главный ключ в незашифрованном виде. Уязвимость су-
ватель может с помощью специально сформированного ществует в Oracle Database 10g Release 2 version 10.2.0.1.
имени пользователя выполнить произвольный код на це- 5. Обнару жены ошибки в компонента х Repor ts
левой систме. в Application Server, которые позволяют злоумышленни-
URL производителя: www.rudedog.org/auth_ldap. ку перезаписать произвольные файлы на системе. Уязви-
Решение: Установите последнюю версию (1.6.1) с сай- мость существует в версиях 1.0.2.0 по 10.1.0.2.
та производителя: http://www.rudedog.org/auth_ldap/auth_ 6. Уязвимость обнаружена при обработке входных дан-
ldap-1.6.1.tar.gz. ных в атрибуте AUTH_ALTER_SESSION в аутентификаци-
онном сообщении TNS. Удаленный пользователь может вы-
Отказ в обслуживании в FreeBSD ipfw полнить произвольные SQL-команды в базе данных при-
Программа: FreeBSD 6.x. ложения с привилегиями пользователя SYS. Уязвимость
Опасность: Средняя. существует в Oracle 8i (8.1.7.x.x), Oracle 9i (9.2.0.7), Oracle
Описание: Уязвимость обнаружена в модуле ipfw при об- 10g Release 1 (10.1.0.4.2) и Oracle 10g Release 2 (10.2.0.1.0).
работке IP-фрагментов. Удаленный пользователь может URL производителя: www.oracle.com.
послать ICMP IP-фрагменты, отвечающие действиям reset, Решение: Установите исправления с сайта производите-
reject или unreach и аварийно завершить работу межсете- ля.
вого экрана.
URL производителя: www.freebsd.org. Составил Александр Антипов
Решение: Установите исправление с сайта производителя:
ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-06:04/
ipfw.patch.

№1, январь 2006 65


безопасность

Cудьба shell-кода на системах


с неисполняемым стеком

Не ошибается то, что не работает

(c) Windows

Крис Касперски
Отчаявшись справиться со своими же собственными ошибками, компания Microsoft совместно
с Intel и AMD реализовала технологию DEP, призванную покончить с удаленными атаками раз
и навсегда, но этого не произошло, и защиту удалось обойти.

Н
есмотря на все усилия, выры- ный опыт реальных атак»). Львиная до- тузиазма и встала на коммерческий
тые рвы и воздвигнутые защит- ля таких ошибок находится в Internet поток с большими вложениями. Сто-
ные сооружения, интенсивность Explorer, что, в частности, и явилось имость гарантированно работающего
удаленных атак не снижается, и отра- причиной перехода NASA на FireFox эксплоита зачастую доходит до $2 000.
жать их становится все труднее. Хаке- (http://www.securitylab.ru/news/242844. Можно только догадываться, кому и за-
ры научились маскировать вредонос- php?R1=RSS&R2=allnews), что можно чем это нужно…
ные процессы под LINUX/BSD и NT, ра- только приветствовать. Однако FireFox В очередной раз возникло понима-
зобрались с брандмауэрами и освои- (как и все остальные браузеры) не сво- ние, что «дальше так жить нельзя» (c)
лись с распределенными системами – боден от ошибок, и в нем присутствует и нужно что-то решать. Попытки по-
сотни тысяч зараженных машин, уп- большое количество критических уяз- кончить с удаленными атаками неод-
равляемых через IRC, – это настоя- вимостей, позволяющих злоумышлен- нократно предпринимались еще с 80-х
щая армия, очень мощная и разруши- нику выполнить свой код (далее по тек- годов, особенно после Червя Морриса,
тельная. Интересы отдельных пользо- сту называемый shell-кодом). Вот но все безуспешно. Как говорят в этих
вателей, пострадавших от атаки, от- только одна из таких дыр: http://www. случаях американцы: серебряной пу-
ходят на задний план, уступая место securitylab.ru/vulnerability/240254.php. ли нет! Оборотня не убить! Тем не ме-
вопросам безопасности всей инфра- Никакое программное обеспече- нее, Microsoft решилась на отчаянный
структуры в целом. А инфраструкту- ние небезопасно! Даже если своевре- шаг и возродила старые идеи, отры-
ра – это уже серьезно. менно устанавливать свежие заплат- тые на помойке истории и реализо-
Анализ показывает, что подавля- ки, всегда существует риск, что хакер ванные без учета понимания ситуа-
ющее большинство атак использу- найдет новую дыру, о которой еще ник- ции наших дней.
ют ошибки переполнения, фундамен- то не знает, и с успехом воспользуется Технология DEP (Data Execution
тальную природу которых мы уже об- ею. Кстати говоря, разработка атакую- Protection – защита от выполнения дан-
суждали (см. «Ошибки переполнения щих программ за последние несколь- ных), реализованная в Windows XP SP2
буфера извне и изнутри как обобщен- ко лет поднялась с колен чистого эн- и Server 2003 SP1, делает секцию дан-

66
безопасность
ных, стек и кучу неисполняемыми, только там он называется NX (от No-
что (теоретически) предотвращает eXecute – не выполняемый). Кому-то
засылку shell-кода и отсекает целый в компании пришла в голову «здравая»
класс удаленных атак, основанных мысль объявить x-атрибут «технологи- Рисунок 1. Схематичное изображение
на переполнении. ей», и вокруг NX-бита тут же развер- стека. Стрелка показывает направление,
в котором растет стек. Локальный буфер
В чем же революционность та- нулась рекламно-маркетинговая ак- «растет» в противоположном направлении
кого решения? Ведь еще со времен ция «Enhanced Virus Protection» (рас- и при определенных обстоятельствах
может затирать адрес возврата
Windows 95 (не говоря уже про стан- ширенная вирусная защита), или со-
дарт POSIX, принятый в 1985 году) x-ат- кращенно EVP. На сайте компании вы-
рибут (от eXecutable – исполняемый) ложено множество красочных роликов,
имеется только у кодовой секции и от- демонстрирующих, как AMD борется
сутствует у всех остальных. Достаточ- с вирусами на уровне процессора (!).
но взять любой ELF/PE-файл и посмот- Неудивительно, что 64-битная редак-
реть! Так-то оно так, но… у x86-процес- ция NT от рождения имеет неисполня-
Рисунок 2. «Эмуляция» NX/XD-битов
соров на этот счет имеется свое собс- емую кучу и стек! Microsoft просто под- на x86-процессорах
твенное мнение: на уровне страниц хватила брошенный ей атрибут защи-
процессор поддерживает всего лишь ты и встроила его в систему, чтобы
два атрибута защиты: -a- (от accessed – лишний раз продемонстрировать, что
страница доступна для чтения/испол- она не отстает от прогресса. В этом-то
нения) и -w- (от write – запись в стра- и заключается сущность аппаратного
ницу разрешена). Никакого x-атрибу- (hardware-enforced) DEP.
та в PTE нет, и он присутствует толь- Воспользовавшись шумихой, раз-
ко в таблице селекторов, а это зна- вернутой AMD, компания Intel внед-
чит, что мы не можем выборочно раз- рила поддержку XD-бита в 32-раз-
решать/запрещать исполнение кода рядные Pentium, сделав эту «техноло-
для отдельных страниц, а только для гию» доступной всем и каждому (же-
всего сегмента целиком. Вот потому лающих пересесть на AMD-64 ради
Рисунок 3. Организация виртуальной
Windows с ее плоской моделью памяти одного лишь DEP набралось не так уж памяти
вынуждена трактовать атрибут -r- как и много). Строго говоря, Nx присутс-
-x-, а -x- как -r-. То есть, право на чтение твует не только в «настоящих» 64-бит-
страницы дает неявное право на ее ис- ных процессорах от AMD, но и в соб-
полнение и наоборот. ранных на 64-битном ядре 32-битных
На самом деле, никакого произвола (т.е. работающих в состоянии перма- Рисунок 4. NX-бит — новый атрибут
защиты в PDE/PTE
со стороны процессора здесь нет: про- нентной эмуляции i386) процессо-
блему можно решить и в рамках плос- рах – например, Sempron (около 99$ Если процессор не поддерживает
кой модели. Достаточно «всего лишь» за штуку). Достаточно лишь воткнуть NX/XD-битов, система активирует про-
перегруппировать сегменты и устано- последний Pentium-4 и обновить яд- граммный (software-enforced) DEP, ко-
вить правильные лимиты (см. рис. 2). ро, чтобы Windows могла задейство- торый даже и не пытается эмулировать
Естественно, это требует больших те- вать новые аппаратные возможности, неисполняемый стек/кучу (а ведь мог
лодвижений со стороны разработчиков и тогда при попытке выполнения при- бы!). Технология, которую продвигает
ядра (необходимо использовать разде- кладного кода в куче, секции данных Microsoft, в действительности пред-
льные ITLB/DTLB и т. д.), что их совсем или в стеке возбуждается исключе- ставляет собой примитивную защиту
не вдохновляет. ние типа STATUS_ACCESS_VIOLATION обработчика структурных исключений,
Почему же в x86 не была предус- (C0000005h), и если только програм- ранее известную под именем SafeSEH.
мотрена возможность задания x-ат- мист не установил свой обработчик Она никак не препятствует выполне-
рибута на уровне страниц? Ритори- SEH, выполнение программы аварий- нию shell-кода, но затрудняет исполь-
ческий вопрос… Скорее всего, во вре- но завершается с выдачей сообщения зование им структурных исключений,
мена проектирования 80386 это было «to help protect your computer, Windows если тот вдруг решит их использовать.
никому не нужно, вот и решили не ус- has closed this program» (см. рис. 5). Подробнее об этом можно прочитать в
ложнять логику процессора без необ- В режиме ядра при попытке вы- статье «SEH на службе контрреволю-
ходимости. А вот в Itanium этот атри- полнения кода в неисполняемой об- ции», электронная копия которой ле-
бут присутствует изначально, и специ- ласти памяти возбуждается исклю- жит на сервере ftp://nezumi.org.ru.
альный бит, известный под аббревиа- чение ATTEMPTED_EXECUTE_OF_ Мы будем обсуждать только ап-
турой XD (от eXecute Disable – выпол- NOEXECUTE_MEMORY c BugCheck- паратный DEP, поскольку его слож-
нение запрещено), определяет, раз- кодом FCh, обрушивающим систе- нее всего обойти. Некоторые даже
решено ли выполнение кода в данной му в «синий экран». 64-битные вер- считают, что это невозможно вооб-
странице или нет. сии NT защищают от исполнения стек ще: «…на сегодняшний день не су-
Аналогичный бит имеется и в про- ядра, paged- и session pool, а 32-бит- ществует ни одного хотя бы концеп-
цессорах AMD-64 (Opteron и Athlon 64), ные – только стек. туального эксплойта, на практике до-

№1, январь 2006 67


безопасность
ное количество уже написанного ПО, ется, и они по-прежнему остаются за-
трактующего атрибут -r- как -x- и от- щищены.
казывающегося работать, если это Ключ /noexecute=уровень_полити-
не так. Поэтому для сохранения об- ки позволяет конфигурировать DEP
ратной совместимости Microsoft пре- по своему усмотрению, выбирая тре-
дусмотрела возможность отключе- буемый уровень защищенности. Пара-
ния DEP для 32-битных редакций NT метр «уровень_политики» может при-
и 32-битных приложений, исполняю- нимать одно из следующих значений:
Рисунок 5. Реакция DEP на попытку щихся в 64-битных редакциях NT. AlwaysOn, AlwaysOff, OptIn и OptOut,
выполнения кода на стеке
Чтобы задействовать механизм описанных в таблице 1.
DEP, необходимо иметь процессор, Если редактирование boot.ini при-
поддерживающий NX/XD-биты, при- водит вас в ужас (что в общем-то впол-
чем 32-битные процессоры подде- не закономерно, поскольку после этого
рживают NX-бит только в режиме PAE система может перестать загружать-
(Physical Address Extension – расшире- ся), воспользуйтесь интерактивным
Рисунок 6. Регионы памяти, защищенные ние физических адресов). 32-битные конфигуратором:
от выполнения кода
редакции NT автоматически распоз-  В ко м а н д н о й с т р о ке в в е д и те
нают тип процессора, при необходи- «start sysdm.cpl» или нажмите
мости добавляя ключ /PAE в файл boot. <win>+<break>.
ini. 64-битные редакции не имеют от-  На вк ла дке «Дополнительно»
дельного PAE-ядра (они работают че- в группе «Быстродействие» нажми-
Рисунок 7. Конфигурирование DEP рез технологию расширения окна ад- те кнопку «Параметры».
через редактирование файла boot.ini ресации Address Windowing Extension –  Перейдите на вкладку «Предотвра-
в Notepad
AWE), поэтому добавлять ключ /PAE щение выполнения данных».
казывающего возможность пораже- для них не нужно.  Выберите пункт «Включить DEP
ния Windows XP с установленным па- Если не указывать никаких допол- только для основных программ
кетом обновления Service Pack 2» нительных ключей, то в 32-битных ре- и служб Windows», чтобы добавить
(www.computerra.ru/softerra/36652). Ес- дакциях NT будет запрещено выпол- в boot.ini, параметр OptIn или выбе-
ли бы DEP проектировался головой, нение кода на стеке, в ядре и в неко- рите «Включить DEP для всех про-
все так бы и было. Однако Microsoft торых системных службах приклад- грамм и служб, кроме выбранных
идет своим особым путем, который ного уровня. Все остальные приложе- ниже», чтобы добавить параметр
умом не понять, и DEP обходится без ния будут исполняться в обычном ре- OptOut. Другие параметры через
труда, а вот у легальных пользовате- жиме. 64-битные версии по умолча- интерактивный конфигуратор до-
лей возникает множество проблем, нию разрешают выполнение кода на бавить невозможно.
о которых мы еще поговорим. стеке/куче только для 32-битных при-  Если был выбран параметр OptOut,
Неправильно называть DEP защит- ложений, а для 64-битных они запре- нажмите кнопку «Добавить» и ука-
ным механизмом. До «защитного меха- щены (см. рис. 6). жите программы, на которые DEP
низма» ему так же далеко, как одиноко Ключ /execute полностью отклю- распространяться не должна.
торчащему рулю до самосвала. DEP – чает DEP для 32-битных редакций NT
это всего лишь поддержка атрибутов и 32-битных приложений, исполняю- Список программ, для которых от-
защиты страниц и ничего более! щихся под 64-битными редакциями ключен DEP, можно сформировать
NT, но на «родные» 64-битные прило- и через реестр (чисто хакерский путь,
Конфигурирование DEP жения его влияние не распространя- экономящий массу времени). Прос-
64-битные редакции NT при рабо- то откройте ключ HKLM\SOFTWARE\
те в native-режиме всегда задейству- Кто поддерживает XD-бит Microsoft\Windows NT\CurrentVersion\
ют DEP и не позволяют его отключать. По данным компании Intel, XD-бит подде- AppCompatFlags\Layers и создайте но-
Если разработчику хочется выполнить рживают следующие операционные сис- вый ключ типа «строка». Его имя долж-
код на стеке или в куче (а хочется это темы, предотвращая непреднамеренное но содержать полный путь к exe-фай-
достаточно часто), он должен явно на- исполнение кода в неисполняемых облас- лу, защиту которого мы хотим отклю-
значить атрибуты доступа к данному тях памяти (однако преднамеренных хаке- чить, поместив внутрь ключа значе-
региону памяти путем вызова API-фун- ров эта мера не остановит, и все системы ние «DisableNXShowUI». Только не пе-
кции VirtualAlloc или VirtualProtect. Ни- могут быть атакованы, Windows – проще, репутайте их местами – иначе ничего
каких прав для этого не нужно, так что Red Hat – сложнее): не получится.
мы получаем лишь видимость безопас-  Microsoft Windows Server 2003 with
ности – защиту от непреднамеренного Service Pack 1; Проблемы совместимости
доступа, но не более того, и чуть поз-  Microsoft Windows XP with Service Исполняемый стек необходим очень
же мы покажем, как ее обойти. Pack 2; многим приложениям: защитным ме-
С 32-битными приложениями все  SUSE Linux 9.2; ханизмам, эмуляторам, just-in-time-
намного сложнее. Существует огром-  Red Hat Enterprise Linux 3 Update 3. компиляторам и т. д. Попытки сделать

68
безопасность
стек неисполняемым неоднократно Со сторонними производителя- Таблица 1. Влияние уровня политики
на безопасность
предпринимались еще в 70-80-х го- ми дело обстоит еще хуже. Навес-
дах, когда никакого Windows и в про- ные упаковщики и протекторы, ис- Параметр Значение

екте не существовало, но… они как- пользующие самомодифицирующий- OptIn


DEP включена только для огра-
ниченных системных процессов
то не прижились. А все из-за проблем ся код и другие антихакерские трюки, (по умолчанию)
Windows и ядра
совместимости. Кому нужна операци- не могут работать с неисполняемым DEP включена для всех процессо-
онная система, если на ней нельзя за- стеком, а это значит, что защита DEP OptOut
ров и ядра, однако можно сформи-
ровать список приложений, на ко-
пускать свои любимые приложения? для них должна быть отключена. Кое- торые защита не распространяется
Выхода нет. Или безопасность, или кто может возразить, что все пробле-
DEP включена для всех процессо-
совместимость. Компромисс невозмо- мы от «неправильного» стиля програм- AlwaysOn ров и ядра. Отключить защиту для
жен. Разве только что… рассказывают мирования и использования «недоку- выборочных приложений нельзя

(врут, конечно), что давным-давно ста- ментированных» особенностей систе- AlwaysOff


DEP отключена для всех процес-
сов и ядра
ли греки строить баню. И озадачились мы (которые на самом деле очень да-
они вопросом: стоит ли строгать доски же документированные), однако про-
или нет? Ведь если не построгать, мож- блемы встречаются не только у куста-
но легко занозиться, а если постро- рей, но и весьма именитых фирм, на-
гать… попробуй тут не поскользнуть- пример, Borland.
ся мыльной пяткой. Поразмыслив, они Заходим в «Базу Знаний», набира-
поступили так: построгали и прибили ем «DEP» и тут же получаем множест-
обстроганным на низ. Аналогичным пу- во ссылок, типа:
тем пошла и Microsoft: разработала не-  http://qc.borland.com/wc/qcmain.
которую пародию на защиту и тут же aspx?d=21249
ее отключила, чтобы у пользователей  http://qc.borland.com/wc/qcmain.
не возникло лишних проблем. aspx?d=10827
Тем не менее проблемы все-та-  http://support.borland.com/entry.jspa
ки возникли. Наберите «DEP» в «Ба- ?externalID=1522&categoryID=108
зе Знаний», чтобы посмотреть, какие
конфликты обнаруживаются только Таким образом, DEP очень конф-
с продуктами самой Microsoft, которая ликтная вещь, создающая множество Рисунок 8. Редактирование файла
по всем понятиям должна была обес- проблем и ни от чего не защищающая. boot.ini через интерактивный
конфигуратор
печить надлежащую преемственность Microsoft допустила множество серьез-
и совместимость. Вот, например: ных просчетов, позволяющих прони-
 Hardware (DEP)-enabled computer кать сквозь DEP даже на максималь-
may unexpectedly quit after you ном уровне защищенности.
resume from standby or from Все дальнейшие рассуждения при-
hibernation in Windows XP Service менимы как к 32-, так и к 64-битным ре-
Pack 2 (при активном аппаратном дакциям NT и не зависят от настройки
DEP компьютер может неожидан- системы. Будем для определенности
но зависать при выходе из спя- считать, что ключ /noexecute установ-
щего или hibernation-режима): лен в положение AlwaysOn.
http://support.microsoft.com/default.
aspx?scid=kb;en-us;889673. Атака на DEP
 You receive a «Data Execution Microsoft подтвердила возможность
Prevention» error message when обхода DEP еще в январе 2005, когда
you start Live Meeting 2005 (при за- на maxpatrol появилась статья Алек-
пуске Live Meeting 2005 появля- сандра Анисимова «Defeating Microsoft
ется сообщение об ошибке ти- Windows XP SP2 Heap protection and
па «Data Execution Prevention»): DEP bypass», однако не придала это-
http://support.microsoft.com/default. му большего значения, заявив, что
aspx?scid=kb;en-us;894643. реализовать удаленную атаку все
 You receive error messages when you равно не удастся: «An attacker cannot Рисунок 9. Интерактивное конфигури-
install Windows CE 4.x Emulator on use this method by itself to attempt to рование DEP
a computer that is running Windows run malicious code on a user’s system. трировано ни одной атаки, использую-
XP Service Pack 2 and the computer There is no attack that utilizes this, щей этот трюк, и потребители находят-
has DEP hardware (при установ- and customers are not at risk from the ся вне риска – http://www.eweek.com/
ке эмулятора Windows CE 4.x, воз- situation» (Атакующий не может ис- article2/0,1759,1757786,00.asp).
никает сообщение об ошибке): пользовать этот метод для запуска Это наглая ложь! Механизм DEP
http://support.microsoft.com/default. зловредного кода на целевой систе- легко пробивается с любого расстоя-
aspx?scid=kb;en-us;891667. ме. До сих пор не было продемонс- ния, хоть из Антарктики. Результатом

№1, январь 2006 69


безопасность
этом он будет очень ограничен в сво- «ненастоящая» атака, поскольку в ней
их возможностях, поскольку среди го- отсутствует явная передача shell-кода
товых функций полезных для хакерс- через стек, а ведь именно на это DEP
твования не так уж и много, однако ес- и рассчитан! Мысль, конечно, умная,
Рисунок 10. Классическая удаленная ли как следует подумать головой, про- но забавная. И какой это хакер бро-
атака — засылка shell-кода в стек
с последующей передачей на него блему удается решить путем вызова сится на амбразуру, если можно схо-
управления путем модификации адреса API-функции CreateProcess или функ- дить в обход? Неужели в Microsoft все-
возврата
ции System из библиотеки CRT, запус- рьез считают, что атакующий играет по
атаки становится переданный и успеш- тив штатную программу типа tftp.exe «правилам» и идет по пути наибольше-
но выполненный shell-код, выполняю- и закачав на атакуемый компьютер го сопротивления, карабкаясь по изви-
щий команды, заранее подготовлен- двоичный файл, который можно ис- листой горной тропинке, напичканной
ные злоумышленником. Чтобы понять, полнить с помощью CreateProcess/ патрулями, когда столбовая дорога ни-
как это делается, сначала необходимо System (атака типа return-to-libc). Ме- кем не охраняется?!
разобраться с классическими метода- ханизм DEP этому сценарию никак не В качестве разминки для мозгов
ми переполнения, подробно разобран- препятствует, поскольку в этом случае рассмотрим альтернативный сцена-
ными в статье «Ошибки переполнения shell-код передается не через стек/ку- рий атаки, передающий shell-код че-
буфера извне и изнутри как обобщен- чу, а через легальный исполняемый рез стек. Засунуть shell-код в локаль-
ный опыт реальных атак». файл. На стеке содержатся лишь ар- ный буфер – не проблема, подменить
Напомним читателю ее основные гументы вызываемых функций и «под- адрес возврата тоже, но… при попыт-
положения: отсутствие контроля гра- дельные» адреса возврата, указыва- ке передачи управления на shell-код
ниц локальных буферов позволяет ющие на них. при активном DEP будет возникать ис-
затирать адрес возврата из функции, Таким образом, даже при включен- ключение, ведь x-атрибута у нас нет,
помещая сюда указатель на shell-код, ном DEP у хакера сохраняется возмож- хотя… это смотря, что мы переполня-
который находится здесь же, в стеке. ность забрасывать на атакуемую ма- ем. Как уже говорилось выше, некото-
Другой тип переполнения связан с ку- шину свой код и передавать на него уп- рые приложения (в том числе и брау-
чей. С его помощью хакер может мо- равление. Наличие tftp.exe не является зеры) нуждаются в исполняемом сте-
дифицировать любую writable ячейку необходимым условием для атаки. Да- ке, в который они складывают отком-
в адресном пространстве уязвимого же если его удалить, хакер может вы- пилированный java-код. Но не будем
процесса (например, подменить ука- звать cmd.exe и… нет, удалять все фай- смягчать себе условия. Давайте счи-
затель на виртуальную функцию или лы с диска необязательно (хотя и воз- тать, что никаких исполняемых стра-
подделать адрес возврата). Имеют- можно), достаточно перенаправить вы- ниц в нашем стеке нет. Чтобы их за-
ся и другие возможности (в частнос- вод в файл и с помощью ECHO создать получить, необходимо либо сбросить
ти, атакующий может изменить обыч- крохотный com, делающий что-то «по- NX/XD-бит (но это можно делать толь-
ный порядок выделения блоков памяти лезное». Да и в самой уязвимой про- ко система), либо… вызывать функ-
из кучи, разместив следующий выде- грамме наверняка содержатся функ- цию VirtualProtect, назначая атрибуты
ляемый блок поверх ключевых струк- ции, через которые можно загрузить защиты по своему желанию! Но как
тур данных), но для простоты изложе- файл из Интернета… Словом, воз- же мы вызовем VirtualProtect без воз-
ния мы ограничимся модификацией можностей – море! Атаки этого типа можности выполнения shell-кода?
адреса возврата. хорошо изучены хакерами и описаны Да очень просто – скорректируем ад-
Существует множество защитных в литературе. Только специалисты из рес возврата так, чтобы он указывал
механизмов, контролирующих целость Microsoft похоже об этом ничего не зна- на VirtualProtect, тогда при выполнении
кучи и адреса возврата, но… со своей ют, иначе как можно объяснить тот за- команды return она передаст на нее уп-
задачей они не справляются. Это от- гадочный факт, что успешность атаки равление!
дельная большая тема, никак не свя- данного типа никак не зависит от ак- На самом деле, это только идея.
занная ни с NX/XD-битами, ни с техно- тивности DEP и старые эксплоиты пол- До практической реализации ей еще
логией DEP. В следующих статьях мы ностью сохраняют свою работоспособ- далеко. В жизни все намного сложнее
подробно рассмотрим ее, но… это бу- ность. Распространение червей оста- и… элегантнее. Допустим, вызвали мы
дет потом. Сейчас же ограничимся тем, навливается только потому, что вмес- VirtualProtect. А дальше что? Куда она
что DEP никак не препятствует моди- те с DEP пакет обновлений включает возвратит управление? И как узнать
фикации адреса возврата и существу- в себя заплатки на все известные ды- адрес выделенного блока? Это ве-
ет множество программ, действитель- ры. Однако стоит хакерам найти еще ликолепная головоломка, на реше-
но позволяющих это делать (Internet одну ошибку переполнения (а это все- ние которой автор этой статьи пот-
Explorer, FireFox и др.). го лишь вопрос времени), как Интер- ратил целый день и был очень разо-
Манипулируя адресом возврата, нет захлестнет новая эпидемия, и ни- чарован, когда узнал, что он не один
хакер может вызывать произвольные какой DEP ее не остановит. (Вообще- такой умный, и все загадки разгада-
функции уязвимой программы (в том то, нет, не захлестнет, ведь автомати- ли еще до него. Взгляните на рис. 11.
числе и API-функции операционной ческое обновление теперь включено Специалисты поймут идею с первого
системы), передавая необходимые по умолчанию.) взгляда, неспециалистам мы сейчас
параметры через стек. Конечно, при Некоторые могут сказать, что это все объясним.

70
безопасность
значить нужные права, скопировать memcpy(REMOTE_BASE, SHELLCODE_BASE, ↵
туда свой shell-код и передать ему уп- SHELLCODE_LENGTH);
GOTO shell_code;
равление. С выделением никаких про-
блем нет – берем VirtualAlloc и вперед. Маленький нюанс – 64-битные
Как прочитать возвращенный указа- редакции NT передают аргументы
тель – вот в чем вопрос! Функция пе- API-функциям через регистры, и по-
редает его в регистре EAX, и заранее тому вызывать VirtualAlloc на них уже
предсказать его значение невозмож- не удастся (разумеется, речь идет толь-
но. А ведь хакер должен сформировать ко о 64-битных приложениях). То есть
указатель и затолкать его в стек еще вызывать-то удастся, а вот передать
на стадии проектирования shell-кода, аргументы – нет, поэтому этот сцена-
то есть задолго до вызова VirtualAlloc. рий уже не сработает, однако вызов
Ну теперь уж точно тупик… А вот и нет! функций уязвимой программы через
Рисунок 11. Подготовка стека для Внимательное чтение SDK (или Рихте- подмену адреса возврата будет дейс-
реализации атаки типа commit-n-copy
ра) показывает, что Windows позволяет твовать по-прежнему (то есть запус-
Итак, все по порядку. Начнем с от- COMMIT (то есть передавать) уже пе- тить tftp.exe мы все-таки сможем, вы-
вета на вопрос: куда возвращает уп- реданную память по заданному адре- зывая ее через функцию System, кото-
равление VirtualProtect? Ответ очеви- су и хотя последствия такого выде- рая по-прежнему принимает аргумен-
ден: по указателю, который лежит за ления могут быть очень печальными ты через стек).
модифицированным адресом возвра- (для кучи) – кого это волнует?! Глав- Подведем итог: стечение ряда не-
та! В момент выхода из VirtualProtect, ное, чтобы shell-код получил управле- благоприятных для DEP обстоятельств
процессор сталкивает текущий адрес ние, и он его получит! Выбираем про- делает эту технологию практически
возврата с вершины стека и удаляет извольный адрес, который с высокой полностью бесполезной. Да, она от-
переданные ей аргументы. Так проис- степенью вероятности не занят ничем секает целый класс атак, основан-
ходит потому, что VirtualProtect (как и полезным (например, 191000h), и пе- ных на переполнении, однако дает пи-
все API-функции) придерживается со- редаем его функции VirtualAlloc вмес- щу для новых, и в целом ситуация ни-
глашения о передаче параметров типа те с флагом MEM_COMMIT и атрибу- как не меняется. Забавно, но боль-
stdcall, при котором аргументы удаля- тами PAGE_EXECUTE_READWRITE. шинство людей (в том числе и адми-
ются самой вызываемой функцией. Все! Первая стадия атаки благополуч- нистраторов!) совершенно не пони-
Таким образом, мы можем вызы- но завершилась, и теперь можно глот- мают, что такое DEP, зачем он нужен,
вать столько stdcall-функций, сколько нуть пива. какие цели преследует и в чем за-
захотим. Процессор будет послушно На втором шаге мы вызываем фун- ключается взлом. Достаточно почи-
стягивать их со стека, поступательно кцию memcpy и копируем shell-код тать дискуссию, развернувшуюся на
двигаясь от вершины вглубь. Техника в только что выделенный регион па- http://www.mastropaolo.com/?p=13, что-
вызова cdecl-функций выглядит чуть мяти, целевой адрес которого зара- бы убедиться, что оба предложенных
сложнее. Они не очищают аргументы нее известен. После этой операции сценария обхода DEP не считаются
при выходе, и атакующему приходит- shell-код оказывается в области памя- взломом, поскольку x-атрибут присва-
ся это делать самостоятельно. Проще ти, где разрешено выполнение, и нам ивается «легальным» способом через
всего перенаправить адрес возврата остается только засунуть в стек еще вызов VirtualAlloc. На самом деле суть
на код типа «ADD ESP,n/RET», распо- один подложный адрес возврата, ко- взлома вовсе не в том, чтобы выпол-
ложенный где-то внутри уязвимой про- торый будет указывать на shell-код нить код в области памяти без x-атри-
граммы, где n – количество байт, заня- (внимание! функция memcpy в отличие бута (это действительно невозможно),
тых аргументами. Такую комбинацию от VirtualAlloc придерживается cdecl со- а в том, чтобы использовать уязвимое
можно встретить практически в любом глашения, поэтому после нее мы уже ПО в своих хакерских целях. В идеале
оптимизированном эпилоге. Ну а нуж- не можем выполнять никакие другие DEP должен представлять собой це-
ное n подобрать совсем несложно! функции, предварительно не удалив лый комплекс защитных мер, предо-
Теперь мы знаем, как вызывать аргументы со стека). твращающих это, но ничего подобно-
функцию для изменения атрибутов Последовательность вызовов, ре- го он не делает, ограничиваясь простой
доступа и вернуться обратно в shell- ализующих атаку, выглядит так (на- формальной поддержкой NX/XD-атри-
код, но это еще не все. Функция поминаем: это не shell-код, это имен- бутов. Перечислим те обстоятельства,
VirtualProtect требует, чтобы ей пере- но последовательность вызовов API- которые ему мешают:
дали адрес уже выделенного региона, функций, осуществляемая путем под-  параметры API-функций передают-
а shell-коду он неизвестен. К тому же, мены адресов возврата): ся через стек;
по слухам, Microsoft собирается встро-  адреса API-функций и положение
ить в VirtualProtect дополнительную Листинг 1. Последовательность вызова вершины стека легко предсказуе-
функций, реализующих атаку типа
проверку, запрещающую назначать x- commit-n-copy мы;
атрибут, если он не был присвоен еще
VirtualAlloc(REMOTE_BASE, ↵
 всякий процесс может пометить
при выделении. Тупик? Не совсем, ведь SHELLCODE_LENGTH, MEM_COMMIT, ↵ любой регион памяти как «испол-
мы можем выделить новый регион, на- PAGE_EXECUTE_READWRITE); няемый»;

№1, январь 2006 71


безопасность
ности, которые предоставляет попу-
Прототип функции VirtualAlloc Назначение аргументов в функции лярный пакет PaX, распространяемый
Функция VirtualAlloc занимается выделением следующее: на бесплатной основе вместе с исход-
(allocate) и передачей (commit) виртуальной ными текстами и подробной техничес-
Таблица 2. Аргументы функции
памяти, с одновременной установкой прав VirtualAlloc кой документацией, из которой можно
доступа на чтение/запись/выполнение: Аргумент Значение
почерпнуть массу интересного.
Листинг 2. Функция VirtualAlloc Первое и главное – PaX не требу-
Указатель на передаваемый регион
и ее прототип lpAddress
памяти ет специальной поддержи со стороны
LPVOID VirtualAlloc dwSize Размер передаваемого региона оборудования и не нуждается в битах
( NX/XD. Вместо этого он группирует сег-
LPVOID lpAddress, flAllocationType
Тип запроса, MEM_COMMIT (1000h) –
SIZE_T dwSize, передача памяти менты, как показано на рис. 2, и ус-
WORD flAllocationType, Атрибуты защиты, PAGE_EXECUTE_ танавливает лимиты так, чтобы они
DWORD flProtect flProtect
READWRITE (40h) – rwx
); не пересекались. Несомненный плюс
такого решения в том, что для защиты
 функция VituallAlloc позволяет вы- мам. В общем, большой популярности от хакеров нам не нужно приобретать
делять/передавать уже передан- это решение не получило. новый процессор – это раз. Shell-код
ную память. Неисполняемый стек – это всего не сможет выделить исполняемый ре-
лишь одна из защитных мер, которая гион в области кучи или стека – это два.
В лагере UNIX оправдывает себя только в совокуп- Тоже самое, впрочем, относится и к just-
Ошибки переполнения не являются ности с целым комплексом остальных. in-time компиляторам, поэтому с сов-
«собственностью» Windows. Это об- Так, например, бессмысленно ставить местимостью будут проблемы, которые
щая проблема для всех программ бронированную дверь, если можно за- PaX обходит довольно элегантным пу-
С/С++, родиной которых был и остает- лезть через окно. Рассмотрим возмож- тем. При аппаратной поддержке со сто-
ся UNIX. Уязвимые приложения в изо-
билии встречаются и там. С ними ак- BufferShield или PaX на NT  распознает выполнение кода на стеке,
тивно борются путем хитроумных из- Пакет BufferShield – это достойный кон- куче, виртуальной памяти и сегменте
вращений и оригинальных техничес- курент штатному DEP, не требующий ус- данных;
ких решений, о которых мы и собира- тановки SP2, работающий без аппарат-  запрашивает подтверждение на завер-
емся сейчас рассказать. ной поддержки со стороны процессора, шение, если обнаружено переполнение
Начнем с того, что существуют использующий рандомизацию расклад- буфера;
процессорные архитектуры (SPARC, ки адресного пространства и задействую-  ведет отчет обнаруженных перепол-
SPARC64, Alpha, HPPA), на которых щий NX/XD-биты, если они есть. Он значи- нений в протоколе событий (Windows
UNIX имеет неисполняемый стек еще тельно превосходит DEP по защищенности event log);
от рождения. Существуют архитекту- и атаковать его очень сложно (тем не менее  позволяет вк лючать защиту даже
ры, использующие раздельные сте- некоторые лазейки все-таки есть, в част- для отдельных частей выбранных при-
ки для хранения адресов возврата ности, из-за отсутствия GOT рандомиза- ложений (!!!);
и локальных переменных. Подменить ция выполняется не полностью, оставляя  поддерживает NX-бит и задействует
адрес возврата на них невозможно, в памяти значительное количество пред- его, если доступен (но может работает
но легко затереть указатель на функ- сказуемых адресов). и без него);
цию, при вызове которой управление Защищать можно как отдельные при-  поддерживает симметричные много-
получит shell-код (правда, передача ложения (например, пресловутый Internet процессорные системы (SMP) с одно-
аргументов представляет собой боль- Explorer), так и определенный диапазон полыми ЦП;
шую проблему, особенно если они пе- памяти внутри конкретного приложения.  рандомизует раскладку адресного про-
редаются через регистры, тем не ме- Так же поддерживаются и многопроцес- странства (технология ASLR).
нее атаковать такую систему все-та- сорные системы (правда, только для «од-
ки возможно, пусть и на концептуаль- нополых» процессоров, то есть если один
ном уровне). процессор имеет поддержку NX/XD-битов,
На IBM-совместимых машинах а другой нет, NX/XD-биты остаются неза-
LINUX/BSD по умолчанию ведут себя действованными для всех процессоров).
точно так же, как XP без SP2. То есть Короче говоря, BufferShield реализу-
трактуют r-атрибут как -x-, позволяя ис- ет те же самые возможности, что и па-
полнять код там, где вздумается. Пер- кет PaX, фактически являясь его портом
вой ласточкой, ринувшейся на встре- на NT. Однако в отличие от бесплатно-
чу буре, стал патч от Solar Designer, де- го PaX BufferShield распространяется на
лающий стек неисполняемым. Хакеров коммерческой основе, а для ознакомле-
это ничуть не смутило (ведь осталась ния предлагается только 30-дневная про-
возможность вызова функций через бная версия: http://www.sys-manage.com/
адрес возврата return-to-libc), но зато sites/D_BuffShld.html. Рисунок 12. Окно настройки
помешало многим «честным» програм- Основные свойства продукта: BufferShiled

72
безопасность
роны ЦП (биты NX/XD) он может защи-
щать не только весь процесс целиком, Глоссарий 4. PAE (Physical Address Extension – ре-
но и его отдельную часть. Допустим, 1. A S L R ( A d d r e s s S p a c e L a y o u t жим расширения физических адре-
мы имеем приложение, нуждающееся Randomization – рандомизация рас- сов): специальный режим 32-разряд-
в исполняемом стеке, но не присваива- кладки адресного пространства): ных x86-процессоров, в котором они
ющее x-атрибут явно. Под Windows мы мощная технология защиты против могут адресовать больше памяти и ис-
будем вынуждены занести его в список shell-кода, основанная на непредска- пользовать дополнительные возмож-
программ, на которые механизм DEP зуемом изменении адресов систем- ности (в частности, атрибут NX);
не распространяется, со всеми вытека- ных функций, расположения стека, ис- 5. PTE (Page Table Entry – элемент ката-
ющими отсюда последствиями. А PaX пользуется в пакете PaX и Exec Shield, лога страниц): структура данных, опи-
позволяет отключить защиту лишь для но только не в DEP: http://en.wikipedia. сывающая свойства «своей» страницы
части стека! Конечно, это снижает им- org/wiki/ASLR. виртуальной памяти и задающая пра-
мунитет системы, но не так радикаль- 2. DEP (Data Execution Prevention – пре- ва доступа.
но, как полное отключение DEP. К то- дотвращение выполнения данных): 6. NX (Not executable – не исполняе-
му же рандомизация адресов не поз- совокупность программных и аппа- мый): AMD64: специальный бит в PTE,
воляет shell-коду добраться до этой ис- ратных технологий, призванных пре- разрешающий/запрещающий выпол-
полняемой области и использовать ее дотвратить выполнение shell-кода, нение машинного кода в данной стра-
в своих целях. но в действительности с этим не справ- нице.
Вторым китом является техноло- ляющихся. DEP может быть как аппа- 7. XD (execution Disabled – исполнение
гия рандомизации адресного про- ратным (hardware-enforced), так и про- запрещено): Intel: специальный бит
странства – Address Space Layout граммным (software-enforced). Аппарат- в PTE, разрешающий/запрещающий
Randomization или сокращенно ASLR. ный DEP фактически сводится к подде- выполнение машинного кода в данной
Если при каждом запуске программы ржке NX/XD-бита, программный пред- странице.
непредсказуемым образом менять по- ставляет собой SafeSEH. 8. SafeSEH (безопасный SEH): набор за-
ложение всех сегментов, хакер не смо- 3. EVP (Enhanced Virus Protection – рас- щитных мер, разработанных Microsoft
жет определить ни расположение shell- ширенная вирусная защита): марке- для предотвращения использования
кода, ни адреса API-функций (это ут- тинговый трюк AMD, выдающий XD-бит обработчика структурных исключений
верждение справедливо даже для тех за «технологию защиты против виру- (SEH) shell-кодом, позднее был пере-
клонах UNIX, в которых вызов API-фун- сов». именован в software-enforced DEP.
кций происходит через прерывание,
например в Linux/i386, поскольку при- Третий кит – PaX «дорабатывает» Другой популярный пакет – Exec
кладные процессы общаются с ядром функцию mprotect так, чтобы назна- Shield (http://people.redhat.com/mingo/
не напрямую, а через разделяемые чать x-атрибут могла только система. exec-shield), входящий в состав Red
библиотеки, придерживающиеся со- Никакой прикладной процесс не мо- Hat Enterprise Linux v.3, update 3, также
глашения stdcall, и являющиеся свое- жет изменить атрибуты региона памя- использует неисполняемую кучу/стек,
образным аналогом KERNEL32.DLL), ти с -x на +x. Также никакой регион па- замечательно работая на всем семейс-
следовательно, подмена адреса воз- мяти не может иметь -x- и -w- атрибуты тве x86 процессоров без NX/XD-битов,
врата не дает ничего кроме DoS. Па- одновременно. Пакет PaX портирован и частично рандомизует адресное про-
кет PaX позволяет рандомизовать ос- на множество систем, в том числе и… странство, произвольным образом из-
новные сегменты ELF-файла (code, под Windows. Существует по меньшей меняя базовый адрес стека, располо-
data, bss), кучу, библиотечные фун- мере два приличных порта для NT – жение разделяемых библиотек и на-
кции, стек потока, разделяемую па- BufferShield (см. одноименную врезку) чало области кучи. Остальная память
мять и стек ядра, короче устраивает и StackDefender (http://www.ngsec.com/ остается нетронутой, однако для отра-
настоящий хаос, в котором не оста- ngproducts/stackdefender), которые в от- жения большинства атак и этого ока-
ется ничего постоянного, за что мож- личие от штатного DEP действительно зывается вполне достаточно. Факти-
но было бы уцепиться. Ну или практи- защищают компьютер от вторжения, чески, Exec Shield представляет уре-
чески ничего. и преодолеть их ну очень трудно. занный вариант PaX и не несет в себе
ничего нового.
Еще хуже дела обстоят в OpenBSD.
Начиная с версии 3.3 ядро поддержи-
вает механизм W^X (произносится как
«W xor X»), который по своему назва-
нию предотвращает одновременную
установку атрибутов -x- и -w- на любую
область памяти, что по замыслу разра-
ботчиков должно серьезно озадачить
хакеров (http://marc.theaimsgroup.com/
?l=openbsd-announce&m=1051754750
Рисунок 13. Окно конфигурации пакета StackDefender 06905&w=2).

№1, январь 2006 73


безопасность
чень процессоров от Intel, поддерживаю-
щих XDбит (на английском языке): http://
support.intel.com/products/processor_
number/proc_info_table072505.pdf.
10. nx: how well does it say NO to attacker’s
eXecution Attempts: презентация с Black
Hat, раскрывающая принципы рабо-
ты механизма DEP и перечисляю-
щая его основные уязвимости (на ан-
глийском языке): http://www.blackhat.
com/presentations/bh-usa-05/bh-us-05-
maynor.pdf.
Рисунок 14. Окно протокола пакета StackDefender 11. Buffer overflow attacks bypassing DEP
(NX/XD bits) – part 2 : Code injection: об-
На самом деле эта защита элемен- смогут только гуру, да и то с кучей ог- ход DEP, основанный на выделении
тарно обходится множественным вызо- раничений, делающих червей практи- региона памяти посредством вызова
вом функции mprotect. Сначала shell- чески нежизнеспособными. VirtualAlloc с последующим копирова-
код вызывает mprotect, устанавливая нием shell-кода (на английском языке):
один лишь атрибут записи (если он не Ссылки: http://www.mastropaolo.com/?p=13.
был установлен ранее), затем копиру- 1. PaX (лучший бесплатный проектор 12. Defeating Microsoft Windows XP SP2
ет shell-код через memcpy и вызыва- для LINUX/BSD): http://www.ngsec.com/ Heap protection and DEP bypass: обход
ет mprotect еще раз, сбрасывая атри- ngproducts/stackdefender. DEP, основанный на переполнении ку-
бут записи и присваивая себе права 2. BufferShield 1.01k (коммерческий порт чи с последующей подменой адре-
исполнения. Кстати говоря, в версии PaX на NT): http://www.sys-manage.com/ са возврата из функции main на фун-
3.3 W^X не работал на x86, поскольку index10.htm. кцию crt!system (на английском язы-
у того отсутствует возможность зада- 3. S t a c k d e f e n d e r ( е щ е о д и н п о р т ке): http://www.maxpatrol.com/defeating-
ния x-атрибута на уровне страниц, од- PaX на NT): http://www.ngsec.com/ xpsp2-heap-protection.htm.
нако, начиная с версии 3.4, этот недо- ngproducts/stackdefender. 13. Windows Heap Overflows: презентация с
статок был исправлен. 4. Exec Shield (усеченный клон PaX для Black Hat, описывающая общие принци-
Короче говоря, в штатной конфигу- In Red Hat Enterprise Linux v.3, update пы переполнения кучи под NT (на ан-
рации, без установки пакета PaX, все 3): http://people.redhat.com/mingo/exec- глийском языке): http://www.blackhat.
UNIX-подобные системы потенциаль- shield. com/presentations/win-usa-04/bh-win-04-
но уязвимы и допускают выполнение 5. W^X (простой и бесполезный защит- litchfield/bh-win-04-litchfield.ppt;
shell-кода по сценарию, описанному ный пакет для OpenBSD): http://marc. 14. DEP evasion technique: замечательный
в разделе «атаки на DEP». theaimsgroup.com/?l=openbsd-announc блог, демонстрирующий технику об-
e&m=105175475006905&w=2. хода DEP и сравнивающий его с ана-
Заключение 6. A detailed description of the Data Execution логичными защитными механизмами
DEP – это не защита! Это рекламный Prevention (DEP): официальное описа- из UNIX (на английском языке): http://
трюк! Если только Microsoft не создаст ние технологии DEP от Microsoft, край- woct-blog.blogspot.com/2005/01/review-
свой собственный клон PaX, реализо- не поверхностное и неконкретное, of-microsofts-dep.html; http://woct-blog.
ванный по всем правилам (что очень но почитать все-таки стоит (на рус- blogspot.com /2005/ 01/dep-evasion-
навряд ли), черви и хакеры продол- ском и английском языках): http:// technique.html.
жат свое существование. Так что слу- support.microsoft.com/kb/875352/ru; 15. Касперски К. Ошибки переполнения
хи об их кончине в очередной раз ока- http://support.microsoft.com/kb/875352; буфера извне и изнутри как обобщен-
зались преждевременными и силь- 7. AMD64 Enhanced Virus Protection: офи- ный опыт реальных атак. – Журнал
но преувеличенными. По этому пово- циальная презентация «EVP-техно- «Системный администратор», №3, март
ду вспоминается один анекдот «Не- логии» от компании AMD. Куча роли- 2004 г. Уже устаревавшая статья, под-
достаток у танка ровно один: через ков и никакой технической информа- робно описывающая причины и следс-
триплексы ни хрена не видно, ку- ции (на английском языке): http://www. твия ошибок переполнения различных
да едешь. Но когда ты едешь на тан- amd.com/us-en/Weblets/0,,7832_11104_ типов.
ке, это не очень большой недостаток». 11105,00.html. 16. SEH на службе контрреволюции: еще
Так вот, Microsoft едет в танке, при- 8. Execute Disable Bit Functionality Blocks одна моя статья, демонстрирующая
крываясь толстой броней монополиз- Malware Code Execution: детальная тех- технику обхода программного DEP:
ма, и ее совершенно не волнует, ку- ническая информация от Intel, касаю- ftp://nezumi.org.ru/pub/zq-buf-SEH.zip;
да она едет и что творит. Не полагай- щаяся XD-бита, ориентированная на 17. eWEEK.com Special Report: Windows
тесь на Microsoft! Для надежной оборо- системных программистов (на англий- XP Service Pack 2: Microsoft подтверж-
ны своего компьютера (рабочей стан- ском языке): http://cache-www.intel.com/ дает возможность обхода DEP (на анг-
ции, сервера) используйте BufferShield cd/00/00/14/93/149307_149307.pdf; лийском языке): http://www.eweek.com/
или StackDefender, «пробить» который 9. Processor Number Feature Table: пере- article2/0,1759,1757786,00.asp.

74
программирование

Переходим от VBScript к ASP и ASP.NET


Безопасность и синтаксис

Иван Коробко
Многие программисты используют VBScript для создания сценариев, предназначенных
для управления серверами. Некоторые скрипты настолько усложняются, что их трудно
использовать без графического интерфейса. Оптимальным решением этой задачи
является создание веб-приложения на ASP, ASP.NET.

С
оздавая сценарии на VBScript для обслуживания сер- <%Script Language="VBScript"%>
веров, таким образом автоматизируя работу систем-
ного администратора и службы технической подде- или
ржки, сводя до минимума влияние человеческого факто-
ра, программисты приходят к выводу, что некоторые из <%Script Language="JScript"%>
их скриптов стали неудобными и им необходим графичес-
кий интерфейс. Например, веб-интерфейс, выбор которого Программный код, находящийся между <% и %>, выполня-
объясняется соображениями безопасности и удобством экс- ется на сервере и подчинен синтаксису одного из выбран-
плуатации. Для решения этой задачи рекомендуется ASP, а ных языков. Весь остальной код представляет собой HTML-
лучше всего – ASP.NET, который позволяет на порядок по- страницу в явном виде.
высить безопасность работы приложения. Листинг типовой ASP-страницы выглядит следующим
образом:
От VBScript к ASP
У вас может возникнуть вопрос: «Зачем мне переходить на <%@ Language=VBScript CODEPAGE=1251%>
<HTML>
ASP, когда я просто могу использовать DHTML с VBS встав- <TITLE> Заголовок страницы </TITLE>
ками?» Использовать DHTML или HTA для этих целей не по- <HEAD>
<LINK href="../style.css" type=text/css rel=stylesheet>
лучится, поскольку они основаны на HTML, который дейс- <meta http-equiv="Content-Type" content="text/html" ↵
твительно позволяет делать вставки на VBScript, однако не charset=windows-1251>
</HEAD> <BODY>
поддерживают работу с OLE-объектами. Для программис- <FONT FACE="Arial">
та, создающего приложения для обслуживания серверов, …
<%
поддержка OLE-объектов используемой им средой – основ- …
ное требование, поскольку формирование отчетов, доступ ' отображение на экране содержимого переменной
Response.write variable
к Active Directory и др. базируется на их использовании. %>
ASP представляет собой решение, которое поддержива-
ет HTML, OLE-объекты и позволяет делать вставки на раз- После обработки интерпретатором IIS программного кода
личных скриптовых языках: VBScript, JScript. и преобразования результатов его работы в HTML/DHTML не-
Переход от VBScript к ASP достаточно прост и безбо- обходимо дать команду на отображение страницы в браузере
лезнен: исходный код на VBScript остается практически клиента. Такой командой является «Response.Write q», где q –
без изменений. имя переменной, содержащей фрагмент HTML-кода.
ASP-страницы – это сценарии, программный код кото- Необходимо отметить, что ASP имеет свою, хотя и скром-
рых выполняется при их запросе. Результатом действия ную объектную модель, описание которой можно найти прак-
скрипта является DHTML-страница, которая формирует- тически в любой книге, посвященной программированию
ся на сервере, а затем отображается в браузере клиента. на ASP в разделе «Приложения».
Структура документа на ASP проста: в первой строке всег-
да указывается язык, с помощью которого созданы скрипто- Настройка IIS для ASP
вые вставки ASP-страницы. Первая строка любого из сце- При создании веб-приложений на основе ASP необходимо
нариев на ASP выглядит следующим образом: учитывать некоторые особенности этого языка.

76
программирование
Первая особенность: поскольку код ASP-страниц испол-
няется на сервере и только результат в виде HTML-страни-
цы пересылается на клиентскую машину, то для успешно-
го запуска приложения на сервере пользователь должен
обладать соответствующими правами. IE, IIS и запускае-
мые им сервисы представляют собой трехзвенную систе- Рисунок 1. Трехзвенная система
му (см. рис. 1).
Пусть IIS имеет настройки по умолчанию. В этом случае
при загрузке любой ASP-страницы она стартует от имени
встроенного пользователя (см. рис. 2). Если страница ра-
ботает с некими базами данных, например с Active Directory,
то пользователь, запускающий данную страницу, должен
обладать соответствующими правами системного адми-
нистратора.
Существует несколько способов соблюсти эти условия.
Первый – учетную запись встроенного пользователя заме-
нить учетной записью администратора сети. При таком рас-
кладе любой пользователь в сети сможет посетить данную
страницу, т.к. она будет запускаться от имени системного
администратора. Этот способ предоставляет всем доступ
к данной странице, что, согласитесь, неправильно: резко
снижается безопасность всей системы. В случае ошибок
на странице злоумышленник может легко запустить вре-
доносный код с правами администратора.
Поэтому разумно использовать другой способ, с помо-
щью которого можно ограничить доступ к ресурсам. В на-
стройках IIS необходимо сбросить флажок (см. рис. 2)
с Enable anonymous access и установить его напротив Basic
Authentication. Также следует изменить права на файловую
структуру используемого сайта, исключив оттуда группу Рисунок 2. Настройка безопасности IIS
Everyone и добавив соответствующие группы безопаснос-
ти и назначить им соответствующие права. При такой на- ку ASP-страница выполняется на сервере, то для запуска
стройке IIS только системные администраторы получат до- приложения необходимы соответствующие права. Управ-
ступ к данной странице. При попытке любого пользовате- ление этой учетной записью пользователя осуществляет-
ля, не являющегося администратором сети, получить до- ся в Application Tools (см. рис. 3).
ступ к странице, IIS будут запрошены имя и пароль поль-
зователя. Переход от VBScript и ASP к ASP.NET
Если необходимо расширить круг лиц, которым должен Теперь, когда мы знакомы c ASP и разобрались с настрой-
быть доступен данный сайт, и при этом пользователи не яв- кой IIS для ASP-проектов, подведем промежуточный итог,
ляются системными администраторами, то можно восполь- а он не утешителен! Дело в том, что в построенной системе
зоваться вариантом, являющимся синтезом двух ранее из- большая брешь в безопасности; поскольку для доступа к АD
ложенных решений. Ограничить доступ на сайт с помощью в ASP-файле в явном виде надо указать имя и пароль сис-
Basic Authentication и правами на файловую структуру, за- темного администратора, еще одним недостатком являет-
пускать скрипт, инкапсулированный в страницу, с правами ся указание пароля в разделе «Аnonymous Аccess» вместо
администратора. встроенной учетной записи указать имя и пароль систем-
Только что мы рассмотрели механизм взаимодействия ного администратора. Конечно, системный администратор
первого и второго звена в трехзвенной системе. Первым постарается защитить файловую систему соответствующим
звеном является рабочая станция пользователя, вторым – распределением прав, однако принятых мер недостаточно.
сервер, на котором установлен IIS. Взаимосвязь этих звень- Необходимо сделать так, чтобы система сама определяла
ев осуществляется с помощью одного пользователя. Меж- и подставляла имя и пароль пользователя между вторым
ду вторым и третьим звеном (сервер iis-процессы, порож- и третьим звеном, т.е. запускала сервисы от имени поль-
даемые из asp-процесса) взаимодействие осуществляет- зователя, который вошел на сайт. Поставленная задача ус-
ся с помощью другого пользователя. пешно решается переходом с помощью ASP.NET и включе-
Рассмотрим взаимодействие второго и третьего зве- нием режима имперсонализации.
на подробнее.
При запуске из кода ASP-страницей какого-либо при- Установка Visual Studio
ложения осуществляется взаимодействие между вторым Перед установкой Visual Studio .NET должен быть пред-
и третьим звеном. IIS порождает процесс, запускаемый варительно установлен пакет программ, необходимых
от имени другого встроенного пользователя. Посколь- для ее установки:

№1, январь 2006 77


программирование
Таблица 1. Необходимые компоненты для установки грамм следует запустить процесс установки студии, после
Visual Studio завершения которого необходимо перезапустить ОС и про-
Продукт Источник верить ее работоспособность, создав проект.
Microsoft IIS 5 Входит в состав Windows 2000 – ver 5.0, XP – ver 5.1 Замечание. Для установки Visual Studio без проверки
Microsoft IIS 6 Входит в состав Windows 2003 Server
установленных компонентов необходимо запустить про-
цесс установки с ключом:
http://www.microsoft.com/downloads/details.aspx?
Microsoft .NET Framework 1.1 FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&
displaylang=en X:\SETUP\SETUP.EXE /NO_BSLN_CHECK
http://www.microsoft.com/downloads/details.aspx?
Microsoft .NET Framework 2.0 familyid=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&
displaylang=en
Microsoft FrontPage Server
Что такое FRAMEWORK
Входит в состав Windows 2000, XP Компания Microsoft поддерживает одновременно несколь-
Extensions 2000
Входит в состав Windows 2003 Server; KB13380: ко языков программирования: Visual Basic, C++, C#. Боль-
Microsoft FrontPage Server http://www.microsoft.com/downloads/details.aspx? шая часть функциональных возможностей этих языков
Extensions 2002 FamilyId=3E8A21D9-708E-4E69-8299-86C49321EE25&
displaylang=en совпадает: в каждом из них реализована работа с фай-
http://www.microsoft.com/downloads/details.aspx?
ловой системой, с базами данных, обработка строк, мате-
Microsoft Visual J# .Net
Redistributable Package 1.1
FamilyID=e3cf70a9-84ca-4fea-9e7d-7d674d2c7ca1& матические функции. Более того, некоторые из них под-
DisplayLang=en
держивают идентичные функции, операторы цикла и ус-
http://www.microsoft.com/downloads/details.aspx? ловные операторы. Наконец, многие из них имеют похо-
Microsoft Visual J# .Net
FamilyID=90cef3f3-9eaf-4d41-bad3-9f44fe8e5e81&
Redistributable Package 2 жие типы данных.
DisplayLang=en
http://www.microsoft.com/downloads/details.aspx? Поддержка одних и тех же функциональных возмож-
Microsoft Windows Installer 2 FamilyID=4b6140f9-2d36-4977-8fa1-6f8a0f5dca8f& ностей для нескольких языков программирования требует
DisplayLang=en
немалых усилий от разработчика, поэтому программисты
http://www.microsoft.com/downloads/details.aspx?
Microsoft Windows Installer 3.1 FamilyID=889482fc-5f56-4a38-b838-de776fd4138c&
компании Microsoft задумались над тем, как уменьшить тру-
DisplayLang=en дозатраты. Результатом их деятельности является библио-
тека классов .Net Framework Class Library, которая состоит
из множества классов, предназначенных для решения раз-
личных задач, которые могут встать перед программистом.
В настоящее время активно используется .Net Framework,
однако все большую популярность приобретает недавно
вышедший .Net Framework 2.0.
Пространство имен платформы .Net содержит более
3400 классов, которые организованы в иерархию про-
странств имен. Например, пространство имен, связанных
с работой файловой системы, называется System.IO.
Существует два способа импорта пространств имен
в зависимости от метода программирования. Оба они бу-
дут рассмотрены ниже на примере импорта пространства
имен System.Security.Principal для проверки режима импер-
сонализации.

Управление доверительными
отношениями в ASP NET
Для конфиденциальной работы приложения IIS всегда важ-
Рисунок 3. Настройка безопасности IIS но идентифицировать процесс, в котором она выполняет-
ся. По умолчанию в IIS 5.0 процессы запускаются утили-
 Microsoft IIS 5/6 той ASPEN_WP.EXE от имени встроенной учетной записи
 Microsoft .NET Framework 1.1/2.0 «PC_NAME\ASPNET», а в IIS 6.0 – от имени «NT AUTHORITY\
 Microsoft FrontPage Server Extensions 2000/2002 NETWORK SERVICE».
 Microsoft Visual J# .Net Redistributable Package 1.1/2 По умолчанию режим имперсонализации выключен. Для
 Microsoft Windows Installer 2/3(.1) его включения необходимо сделать изменения в конфигу-
рационном файле: C:\Windows\Microsoft.NET\FrameWork\V
В полном дистрибутиве перечисленные компоненты на- номер версии\Config\Machine.Config.
ходятся в папке WCU, в которой присутствуют соответствую- Необходимо присвоить следующие значения:
щие компонентам подпапки. Если же папки WCU нет, то ком-
поненты необходимо загрузить с сайта Microsoft или уста- comAuthenticationLevel= PktPrivacy
comImpersonationLevel= Impersonate
новить с дистрибутива соответствующей версии операци-
онной системы. Список возможных значений этих параметров приве-
После завершения установки необходимых подпро- ден ниже:

78
программирование
comAuthenticationLevel="Default|None|Connect|Call|Pkt| ↵
PktIntegrity|PktPrivacy";
comImpersonationLevel="Default|Anonymous|Identity| ↵
Impersonate|Delegate"

Для IIS6 необходимо сделать изменения в реест-


ре. В ветви реестра «HKEY_LOCAL_MACHINE\SYSTEM\
CurrentControlSet\Services\W3SVC\Parameters» необ- Рисунок 4. Параметры имперсонализации для IIS6
ходимо добавить четыре параметра: AuthentionLevel,
CoInitializeSecurityParam, ImpersonationLevel, Authentication
Capabilities (см. риc. 4).
Параметр CoInitializeSecurityParam принимает значения
0 и 1. Отвечает за включение/отключение использования
остальных трех. Все параметры имеют тип REG_DWORD.
Описания остальных трех параметров см. в таблице 2.
Для включения имперсонализации рекомендует-
ся присвоить перечисленным параметрам следующие
значения: CoInitializeSecurityParam=1, AuthentionLevel=6,
ImpersonationLevel=3, AuthenticationCapabilities=12352. Рисунок 5. Пример импортирования пространства имен
В каждом создаваемом проекте автоматически гене- System.Security.Principal в ASPX-файле
рируется файл Web.Config, в который также необходимо
внести изменения, чтобы включить режим имперсонали-
зации:

<?xml version=»1.0» encoding=»utf-8» ?>


<configuration>
<system.web>
<identity impersonate =»true»/> Рисунок 6. Пример импортирования пространства имен
<authentication mode=»Windows» /> System.Security.Principal в VB-файле
</system.web>
</configuration> личие от HTML, работает с OLE-объекты. Это принципи-
альная разница между ASP и DHTML. Вставки на VBScript
Если необходимо, чтобы механизм имперсонализации практически не претерпели изменений за некоторым ис-
работал от имени одного и того же пользователя, то не- ключением. Переход от ASP к ASP.NET также достаточно
обходимо указать логин и пароль учетной записи в поле прост, однако есть ряд принципиальных отличий. Об осо-
<identity>: бенностях перехода между этими тремя языками и пой-
дет речь.
<identity impersonate ="true" username="user/domain" ↵
password="" />
Файлы ASP корректно работают
Проверка имперсонализации осуществляется с помо- под ASP.NET
щью функции WindowsIdentity.GetCurrent().Name, которая Для страниц ASP.NET фактически приемлемы любые рас-
возвращает имя учетной записи пользователя, от которой ширения, в том числе и ASP. Для того чтобы ASP-страни-
будут запускаться процессы. цы распознавались файлами платформы ASP.NET, необ-
Если программный код формируется непосредственно ходимо проделать следующие манипуляции. Изменить ас-
в ASPX-файл, то в его заголовке необходимо импортиро- социацию ASP-файлов:
вать пространство имен System.Security.Principal (2-я строч-  Запустить Internet Services Manager («Start → Programs
ка примера – см. рис. 5). → Administrative Tools → Internet Services Manager»).
В случае обработки событий в виде функций, необхо-  Открыть страницу свойств нужного веб-узла, щелкнув
димо перед описанием класса импортировать пространс- правой кнопкой мыши по нужному узлу и выбрав пункт
тво имен, о котором уже шла речь, и привязать код к собы- «Properties».
тию, например, к нажатию на кнопку. Для этого сначала не-  В появившемся диалоговом окне войти во вкладку «Home
обходимо создать в ASPX-файле кнопку (Button1) и в теле Directory».
соответствующей функции, по умолчанию Button1_Click()  В разделе «Application Settings» нажать на кнопку
добавить функцию WindowsIdentity.GetCurrent().Name «Configuration».
(см. рис. 6).  В п о я в и в ш е м с я д и а л о го в о м о к н е «Applic ation
При включенной имперсонализации на странице должно Configuration» выбрать вкладку «App Mapping».
отобразиться текущее доменное имя пользователя в фор-  Ассоциировать файлы с расширением ASP с библиоте-
мате Domain/LogonUser. кой aspnet_isapi.dll. При этом предварительно необхо-
димо удалить предыдущую ассоциацию ASP.
Переход от VBScript к ASP.NET
По своей сути ASP представляет собой HTML со вставками Внести изменения в конфигурационный файл .NET
VBScript или Jscript (в общем случае), при этом ASP, в от- Framework:

№1, январь 2006 79


программирование
Таблица 2. Принимаемые значения System.Web, ↵ <Compilation>
параметров имперсонализации для IIS6 Version=1.0.2411.0, ↵ Explicit = "False"
Culture=neutral, ↵ </Compilation>
Имя параметра Значение PublicKeyToken=b03f5f7f11d50a3a ↵
"/>
AuthentionLevel
Default 0
Преобразование типов
None 1
Оператор Option Explicit данных
Рассмотрим использование опера- В языке VBScript отсутствуют требо-
Connect 2
тора Option Explicit для VBScript, ASP вания жестко привязать переменную
Call 3 и ASP.NET. к определенному типу. В нем нельзя
Pkt 4 объявить тип переменной, в результа-
PktIntegrity 5 VBScript, ASP те чего все создаваемые переменные
PktPrivacy 6 По умолчанию в VBScript допускает- принадлежат к типу Variant. В ASP.NET
ImpersonationLevel ся неявное объявление переменных. этот тип данных не поддерживается.
Default 0
При этом переменная создается без ее Своеобразным его эквивалентом яв-
предварительного объявления опера- ляется тип object. Рассмотрим пример
Anonymous 1
торами Dim, Private, Public или ReDim. сценария, в котором объявим перемен-
Identity 2
Однако, разрешив неявное объявле- ную, и присвоим ей значение, после
Impersonate 3
ние переменных в сценариях, велик чего выведем его на экран. В качест-
Delegate 4 риск пропустить допущенную синтак- ве шаблона воспользуемся примером
AuthenticationCapabilities сическую ошибку в имени переменной из предыдущего параграфа:
None 0x0 во время программирования.
В том случае, если допущена ошиб- <%
Mastual_Auth 0x1 Dim strMsgBox
Secure_Refs 0x2
ка, VBScript просто объявит новую пе- strMsgBox="Привет"
ременную и создаст ее, вследствие че- response.write(strMsgBox)
Access_Control 0x4 %>
го программа будет работать некор-
APPID 0x8
ректно. Для обнаружения ошибок-опе- Обратите внимание, что при объяв-
Dynamic 0x10
чаток такого рода в первую строку про- лении переменной strMsgBox не ука-
Static_Cloaking 0x20 граммы необходимо поместить опера- зан ее тип явным образом, поэтому
Dynamic_Cloaking 0x40 тор Option Explicit, который сигнализи- считается, что она принадлежит к типу
ANY_Authority 0x80 рует оператору о переменных, которые Object. При присвоении значения пере-
Make_FullSic 0x100 не были объявлены явно. менной осуществляется автоматичес-
Require_FullSic 0x200 кое преобразование к типу String.
Auto_Impersonate 0x400
ASP.NET Автоматическое преобразование
Опция Explicit, выключенная по умол- к нужному типу данных очень удоб-
Default 0x800
чанию в предыдущих версиях ASP, но, однако оно негативно сказывается
Disable_Aaa 0x1000
на платформе ASP.NET включена. на скорости работы сценария.
No-Custom_Marshal 0x1200 При включении перед использованием Для определения типа перемен-
переменной ее необходимо объявить. ной используйте функцию VarType(),
Таблица 3. Сопоставления вызываемых
файлов соответствующим приложениям Например, приведенный ниже сцена- возвращающую число, которому со-
рий успешно работает на ASP, но на ответствует подтип (см. таблицу 4).
VBScript ASP ASP.NET
ASP.NET он вызовет ошибку – «The Синтаксис:
Расширение *.vbs *.asp *.aspx
name ‘strMsgBox’ is not declared»:  VarType(VarName);
Обработчик
cscript.exe,
wscript.exe
Asp.dll Aspnet_isapi.dll  Varname – имя переменной, содер-
<% жащей значение.
strMsgBox="Привет"
 Открыть файл machine.config с ус- response.write(strMsgBox)
тановленным на компьютере IIS, %> При работе с массивами функция
который находится в C:\Windows\ VarType() никогда не возвращает зна-
Microsoft.NET\Framework\[version]\ Исправить ошибку можно дву- чение 8192. Это связано с тем, что эле-
config. мя способами. Первый способ – объ- менты массива содержат данные, ко-
 В разделе [httpHandlers] приведены явить переменную strMsgBox явным торые также соответствуют одному
обработчики для файлов с различ- образом: из типов данных. Например, если эле-
ными расширениями. В нем долж- ментами массива являются числа типа
ны присутствовать «.asp, .aspx». <% Integer, то функция будет возвращать
Dim strMsgBox As String
 Необходимо добавить обработчик strMsgBox="Привет" значения 2 + 8192, т.е. 8194.
System.Web.Ui.PageHandlerFactory: response.write(strMsgBox) VBScript:
%>

<add Второй способ – отключить на всех Dim Array(100)


verb="*.*" T=""
path="*.asp" страницах ASP.NET в файле machine. T=VarType(Array)
type=" Web.Ui.PageHandlerFactory, ↵ config опцию Explicit: MsgBox T

80
программирование
ASP, ASP.NET: Таблица 4. Расшифровка принимаемых значений функцией
VarType()
<%
Response.Write(VartType(Parametr)) Константа Значение Описание
%> vbEmpty 0 Empty (пустое значение)
vbNull 1 Null (не содержит данных)
Приведенный пример возвращает значение 8204 = 8192 + 12.
vbInteger 2 Integer
Элементы массива не определены, поэтому они имеют тип дан-
vbLong 3 Long integer
ных Variant (12).
Процесс автоматического преобразования типов дан- vbSingle 4 Single (число с плавающей точкой)

ных называется динамическим связыванием (late binding). vbDouble 5 Double (число с плавающей точкой)
Избежать динамического связывания можно с помощью vbCurrency 6 Currency
опции Striсt: vbDate 7 Date
vbString 8 String
<%@ Striсt="True" %>
vbObject 9 Объект
vbError 10 Error
При включении опции Striсt автоматически включается
vbBoolean 11 Boolean
Explicit. Кроме того, опцию Striсt можно включить для всех
vbVariant 12 Variant (используется только с массивами)
страниц ASP.NET в файле machine.config:
vbDataObject 13 Object
<Compilation> vbByte 17 Byte
Striсt = "True"
</Compilation> vbArray 8192 Array

В отличие от VBScript-сценариев и классических Таблица 5. Описания часто используемых параметров


для обработки ошибки
ASP-страниц в ASP.NET при передаче параметров под-
программам или методам всегда должны использовать- Свойство Описание

ся скобки. Err Краткое описание ошибки


Например, приведенный ниже сценарий без ошибок бу- Err.Message Полное описание ошибки
дет выполняться под ASP: Err.GetType.ToString Тип ошибки
Err.Source Источник ошибки (имя библиотеки)
<%
Response.Write "Привет"
%> Также не поддерживается оператор LET.

Но в ASP.NET он вызовет ошибку, поскольку метод Write Поддержка многопоточных компонентов


необходимо использовать со скобками: По умолчанию в ASP.NET не поддерживаются многопоточ-
ные методы, такие как ADO Connection, Scripting Dictionary.
<% Для включения их поддержки в заголовке файла необхо-
Response.Write ("Привет")
%> димо использовать директиву:

<%@ PageASPCompat="True" %>


Операторы SET и LET
В VBScript и ASP для присвоения переменных необходимо
было использовать переменную SET. Обработка ошибок в ASP.NET
VBScript: Для обработки ошибок предназначен класс System.
Exception. Анализируемый на ошибки код заключается
Set obj=CreateObject("Adodb.Connection") внутрь конструкции Try:

ASP: Tru Code


<Sample Code>
Cath err as Exception
<% Response.write(err)
Set obj=Server.CreateObject("Adodb.Connection") End Try
%>
Для конкретизации ошибки рекомендуется использо-
На страницах ASP.NET он больше не используется. Син- вать встроенные свойства (см. таблицу 5).
таксис присвоения переменной объекта выглядит следую-
щим образом. Вместо заключения
ASP.NET: Рассмотрев основные этапы перехода с языка VBscript
и ASP к ASP.NET, изучив различные подводные камни,
<% вы можете приступить к изучению более сложных вещей,
obj=Server.CreateObject("Adodb.Connection")
%> касающихся программирования на ASP.NET: управления
файловой системой, Active Directory и т. д.

№1, январь 2006 81


IMHO

Электронная почта как источник


повышенной опасности

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

В
се сказанное в данной статье веры можно было пересчитать по паль- ля, идентифицировать которого мож-
следует рассматривать исклю- цам, а их администраторы хорошо зна- но разве что по его IP-адресу, который
чительно как мое личное мне- ли каждого своего пользователя. Воп- редко можно однозначно сопоставить
ние, основанное на некотором опыте росы безопасности и доверия к отпра- с конкретным человеком, да и даже
и, в какой-то степени, личных эмоци- вителю тогда не имели сегодняшнего на достоверность этого параметра то-
ях. Я не пытался сделать какие-то гло- уровня актуальности, и потому в це- же нельзя положиться, – все это при-
бальные выводы или выработать уни- лях экономии протокол SMTP получил- вело к тому, что человек в сети чувс-
версальные рекомендации решения ся на самом деле настолько простым, твует себя гораздо более свободным,
проблем. Это всего лишь мой взгляд что не поддерживал ни авторизации, и, как следствие, позволяет себе порой
на ситуацию, если хотите – приглаше- ни средств подтверждения подлиннос- то, на что в «оффлайне» никогда не ре-
ние к дискуссии. ти отправителя. Он умел лишь отправ- шился бы. Интернет давно превратил-
лять электронные сообщения указан- ся из простого средства для общения
Основной источник ному адресату. коллег и единомышленников в инстру-
проблем Сейчас сеть Интернет стала дру- мент ведения бизнеса. И указанная вы-
Как вы знаете, протоколы электрон- гой. Децентрализация, простота и де- ше степень свободы позволила приме-
ной почты создавались в те «золотые» шевизна подключения к сети, практи- нять для достижения своей цели весь-
времена зарождения сети, когда сер- чески полная анонимность пользовате- ма агрессивные методы, не считаясь

82
IMHO
с последствиями этих методов для дру- напастью посвящено множество ста- правлять электронные сообщение на-
гих участников сети. А протокол SMTP тей в Интернете. А порождено это яв- много проще и дешевле. Да и за поч-
остался при этом практически тем же ление в первую очередь возможнос- товый ящик, прибитый к калитке, по-
самым, что и десятилетия назад. тью отправлять сообщения практи- лучатель ничего не платит…
В частности, согласно базовому чески анонимно, что не позволяет од-
RFC 821, лежащему в основе совре- нозначно выявить отправителя и его «Не виноватые мы…»
менной электронной почты, различные наказать. Не меньшую угрозу представляет и об-
агенты доставки (MTA) взаимодейству- Одним из правил защиты, которое ратная ситуация – когда в результа-
ют, по сути, на доверительных отноше- упоминается, пожалуй, наиболее час- те заражения ваша машина сама ста-
ниях. Даже для команды HELO, кото- то, является совет никогда не остав- новится источником спама и вирусов.
рой SMTP-клиент (так будем называть лять свой реальный почтовый адрес И такая несложная операция, как бло-
программу, инициирующую SMTP-со- на веб-страницах (в форумах, ново- кирование с помощью персонального
единение, по аналогии с другими про- стных лентах, даже на своих домаш- брандмауэра 25-го порта (как на прием,
токолами) представляется серверу, ни- них сайтах). Изворотливый челове- так и на отправку), кроме порта на том
как не проверяется достоверность со- ческий ум придумал массу способов сервере, с которым мы действительно
держащейся в ней информации. И уж замаскировать свой адрес и спрятать работаем, может заметно снизить «на-
тем более не предусмотрено основа- его от назойливых роботов-сборщи- пряженность», но почему-то мы не спе-
ний, по которым сервер может откло- ков – от банального «vasya (at) petrov шим это делать. Да еще и предъявля-
нить соединение. Более того, если (dot) ru» до всевозможных скриптов, ем претензии своему провайдеру, ес-
письмо не предназначено пользова- отдающих адрес из базы только в слу- ли он пытается сделать это за нас. Ви-
телям, обслуживаемым данным сер- чае явного щелчка по ссылке. димо, сказывается убеждение, что са-
вером, то согласно протоколу он дол- Определенный смысл в этом есть, ма по себе электронная почта безвред-
жен выполнить передачу сообщения поскольку если спамер не будет знать на, к тому же бесплатность исходяще-
дальше, в соответствии со значением вашего адреса, то и отправить вам ни- го трафика позволяет не обращать на
поля «To», т.е. фактически, должен ра- чего не сможет. него никакого внимания.
ботать в режиме Open Relay. Но, с другой стороны, адрес на-
Различными расширяющими до- подобие приведенного выше доста- «А вас здесь не стояло…»
кументами вводятся дополнительные точно легко угадывается, а постольку Сильно удивляет и то, насколько лег-
процедуры, такие как SMTP-аутенти- SMTP позволяет указывать в качест- ко мы относимся к заполнению различ-
фикация, запрет на транзитную пере- ве обратного адреса практически лю- ных регистрационных форм, где требу-
дачу сообщений, и т. д., призванные бой, то спамер может не беспокоить- ется указать адрес электронной поч-
ограничить проблемы, возникающие ся, что после очередного сканирова- ты. Здесь мы довольно часто, наобо-
при использовании базового протоко- ния его ящик будет завален сообще- рот, желая (в виду описанных выше
ла. Однако их применение до сих пор ниями «Undeliverable message». причин) скрыть свой почтовый адрес
не является обязательным, и каждый А вот нам с вами по этому пово- от любопытных глаз, указываем что-
администратор принимает решение об ду беспокоиться можно и даже нуж- нибудь наподобие qwe@qweasdzxc.ru.
их поддержке исключительно по свое- но – в качестве такого обратного ад- Именно на этом основан один из на-
му усмотрению. Таким образом, сейчас реса вполне может быть выбран (слу- иболее популярных методов кражи
мы все более отчетливо ощущаем не- чайно или специально) именно ваш ад- аккаунтов ICQ – нетрудно догадаться,
достатки почтового протокола SMTP: рес. Согласитесь, что это не самая луч- что злоумышленнику теперь остает-
 возможность подделать практичес- шая перспектива – обнаружить в по- ся лишь зарегистрировать на себя до-
ки любой параметр отправляемого недельник свой почтовый ящик заби- мен qweasdzxc.ru, создать там почто-
сообщения; тым такими «возвратами» вперемешку вый ящик qwe и воспользоваться сис-
 отсутствие механизмов для одно- с возмущениями и угрозами потрево- темой напоминания пароля. Причем
значной идентификации отправи- женных пользователей. Особенно ес- этот метод работает достаточно хоро-
теля; ли ваша плата провайдеру за подде- шо не только в случае с ICQ, но и везде,
 отправка любого количества любых ржку ящика зависит от объемов тра- где при регистрации вы должны ука-
сообщений какому-либо пользова- фика или размера сообщений, храня- зать свой электронный адрес, но его
телю не требует никакого разреше- щихся на сервере. принадлежность или хотя бы сущест-
ния со стороны последнего, но пла- И опять-таки, SMTP не предостав- вование никак не проверяются.
тит за почту при этом именно он. ляет никаких способов эффективно Конечно, можно успокаивать себя
этому противодействовать. Конечно, тем, что ваш UIN вряд ли будет обла-
Рассмотрим немного подробнее приближение работы электронной поч- дать ценностью, способной компен-
некоторые из возникающих при этом ты к обычной (когда в ваш ящик могут сировать трату двадцати долларов
проблемы. положить любую корреспонденцию) на регистрацию домена. Но кто зна-
имело определенный смысл, по край- ет, насколько ценную информацию вы
«Нам чужого не надо…» ней мере в том плане, что не нужно будете передавать по ICQ лет через
О спаме мы у же много говорили было придумывать новую концепцию. пять. В любом случае нельзя забывать
на страницах журнала, борьбе с этой Но при этом не было учтено, что от- об этом методе получения пароля.

№1, январь 2006 83


IMHO
ке (см. рисунок). Да даже и без близ-
кого знакомства иногда за вечер не-
трудно перебрать несколько десятков
«любимых цветов». А когда, желая из-
бежать шаблонности, пользователи са-
ми «придумывают» свой вопрос и от-
вет на него (типа «qwe – qwe»), то это
вообще песня.

«Спасайся, кто может…»


Как видите, электронная почта от-
нюдь не так уж безобидна, как может
показаться на первый взгляд. И если
опытный компьютерщик еще спосо-
бен предвидеть возможные пробле-
мы и попытаться их избежать, то тре-
бовать того же самого от начинающе-
suprunov@mail.ru – это не мой ящик. Однако если я «подружусь» с его владельцем го пользователя, только что купивше-
(тем более что одинаковая фамилия – неплохой повод, а наступивший год собаки
дает возможность поговорить и на действительно интересующую меня тему), то он го свою первую интернет-карту и рву-
вполне может стать моим… щегося в необъятный и полный воз-
Кстати, с этой точки зрения при на- твия, которое должно быть выполнено. можностей мир «глобальной паутины»,
поминании пароля по электронной поч- Например, когда вы меняете свой па- как правило, не приходится.
те на том или ином сервисе более безо- роль к почтовому ящику на веб-стра- Да, пользователей в сети с каждым
пасной выглядит генерация нового па- нице, вы пересылаете и всю информа- годом становится все больше и боль-
роля по запросу пользователя, а не от- цию (к примеру, идентификатор сес- ше, притом, что уровень технической
правка существующего – это позволит сии), перехвата которой достаточно, подготовленности среднестатистичес-
законному пользователю (который все чтобы воспроизвести это же действие кого пользователя неуклонно снижа-
еще будет использовать старый па- с другими параметрами. ется. Это вполне правильная тенден-
роль) в случае кражи доступа, по край- Вывод напрашивается сам собой – ция, поскольку врач или адвокат долж-
ней мере, вовремя обнаружить пробле- везде, где это возможно, используй- ны хорошо знать свое дело, а не изу-
му. Правда, у этой медали есть и об- те для работы с электронной почтой чать работу межсетевых экранов или
ратная сторона – пользователя, ука- протоколы SMTP и POP3/IMAP (тоже заниматься дефрагментацией. Но та-
завшего свой реальный адрес, можно не лишенные недостатков, но все же кими темпами уже через пару лет Ин-
буквально «задолбать» постоянными это меньшее из зол), а не HTTP. Прак- тернет может превратиться в действу-
запросами напоминания пароля. тически все популярные почтовые ющую модель древнегреческого Хао-
Таким образом, чуть ли не самым серверы предоставляют такую воз- са (правда, с меньшими шансами, что
удачным решением в данной ситуации можность. из него родится что-то сущее), и жиз-
будет вообще отказаться от использо- неспособность электронной почты –
вания системы напоминания пароля, а «Язык мой - враг мой…» одного из основных сервисов – может
сам пароль (достаточно сложный для Но все же самыми популярными ос- оказаться под вопросом.
того, чтобы держать его в память) за- таются социальные методы, основан- И более-менее реальными выхода-
писать у себя в блокноте. ные на все той же системе напомина- ми из создавшегося положения кажут-
ния пароля, но теперь уже к самому ся либо жесткие ограничения свободы
«Лучше меньше, почтовому ящику. В большинстве слу- пользователей со стороны их провай-
да лучше…» чаев человек, регистрируя себе «чет- деров (например, запрет соединяться
Кстати говоря, веб-интерфейс к элек- вероногого друга» где-нибудь на mail. с 25-м портом любого сервера, кро-
тронной почте сам по себе представ- ru, без должного внимания относится ме провайдерского), либо переход на
ляет для злоумышленника некоторые к выбору «секретного вопроса», счи- другие, более соответствующие совре-
дополнительные пути завладеть чу- тая, что ничего важного все равно от- менным реалиям протоколы. Плюс на-
жим ящиком. Но здесь уже исполь- правлять/получать не будет. Но идут стойчивая пропаганда среди пользова-
зуются недостатки другого, не менее годы, человек становится каким-ни- телей «здорового образа жизни».
«наивного» протокола – HTTP. Как вы будь высокопоставленным чиновни- Ну а простому пользователю ос-
знаете, он не поддерживает соедине- ком или успешным предпринимате- тается лишь уделять больше внима-
ния, то есть каждый новый запрос рас- лем, продолжая по привычке пользо- ния настройкам своего брандмауэ-
сматривается как совершенно не зави- ваться тем же почтовым ящиком. И ха- ра, аккуратнее относиться к веб-ин-
сящий от предыдущих, и, следователь- керу остается лишь собрать о нем не- терфейсам и бороться, бороться, бо-
но, должен содержать всю информа- которую информацию (имена родных роться со спамом. По крайней мере,
цию, необходимую для аутентифика- и их родословная, кличка кота и т. д.), до тех пор, пока это не начнет делать
ции пользователя и определения дейс- чтобы получить доступ к его перепис- его провайдер…

84
bugtraq

Отказ в обслуживании при обработке


SGBP-протокола в Cisco IOS
Программа: IOS 12.x, R12.x. Отказ в обслуживании в ядре Linux
Опасность: Средняя. Программа: Linux kernel версии до 2.6.15.1.
Описание: Уязвимость существует при обработке SGBP Опасность: Средняя.
(Stack Group Bidding Protocol)-протокола. Удаленный поль- Описание: 1. Отсутствует проверка входных данных в пе-
зователь может послать специально сформированную ременной nlmsg_len в функции netlink_rcv_skb(). Локаль-
UDP-датаграмму на порт 9900 и вызвать отказ в обслужи- ный пользователь может установить значение 0 и вызвать
вании устройства. бесконечный цикл.
URL производителя: www.cisco.com. 2. Уязвимость обнаружена в PPTP NAT-хелпере при об-
Решение: Установите исправление с сайта производите- работке входящих PPTP_IN_CALL_REQUEST-пакетов. Уда-
ля. ленный пользователь может с помощью специально сфор-
мированного пакета вызвать ошибку при расчете смеще-
Отказ в обслуживании в Eudora ния и повредить случайную область памяти ядра. Успеш-
Internet Mail Server при обработке ная эксплуатация уязвимости позволит злоумышленнику
NTLM-запросов аварийно завершить работу системы.
Программа: Eudora Internet Mail Server версии до 3.2.8. 3. Обнаружена ошибка в PPTP NAT-хелпере при подсче-
Опасность: Средняя. те смещения, основанного на разнице между двумя указа-
Описание: Уязвимость существует при обработке запро- телями на заголовок. Удаленный пользователь может вы-
сов для NTLM-аутентификации. Удаленный пользователь звать отказ в обслуживании системы.
может с помощью специально сформированных NTLM-за- URL производителя: www.kernel.org.
просов аварийно завершить работу приложения. Решение: Установите последнюю версию (2.6.15.1) с сай-
URL производителя: www.eudora.co.nz. та производителя.
Решение: Установите последнюю версию (3.2.8) с сайта
производителя.
Переполнение буфера в FreeBSD
Отказ в обслуживании при обработке IEEE 802.11
соединений в Cisco CallManager Программа: FreeBSD 6.x.
Программа: Cisco CallManager 3.2 и более ранние вер- Опасность: Средняя.
сии, Cisco CallManager 3.3, версии до 3.3(5)SR1a, Cisco Описание: Целочисленное переполнение обнаружено в мо-
CallManager 4.0, версии до 4.0(2a)SR2c, Cisco CallManager 4.1, дуле net80211 при обработке некорректных IEEE 802.11-со-
версии до 4.1(3)SR2. общений во время поиска беспроводной сети. Удаленный
Опасность: Средняя. пользователь может выполнить произвольный код на це-
Описание: 1. Уязвимость существует из-за недостаточной левой системе.
обработки тайм-аутов для соединений на порт 2000/tcp. URL производителя: www.freebsd.org.
Удаленный пользователь может открыть много соедине- Решение: Установите исправление с сайта производите-
ний и потребить большое количество памяти и ресурсов ля.
процессора.
2. Обнаружена ошибка при обработке соединений
к портам 2001, 2002 и 7727. Удаленный пользователь мо- Отказ в обслуживании при обработке
жет создать большое количество соединений и заполнить GTP-протокола в Ethereal
Windows message queue, что приведет к перезагрузке Cisco Программа: Ethereal версии 0.9.1 – 0.10.13
CallManager. Опасность: Средняя.
URL производителя: www.cisco.com. Описание: Уязвимость существует при обработке входных
Решение: Установите исправление с сайта производите- данных в диссекторе GTP-протокола. Удаленный пользова-
ля. тель может с помощью специально сформированного паке-
та вызвать зацикливание приложения и заставить систему
Переполнение буфера в Golden FTP Server потреблять все доступные ресурсы процессора.
Программа: Golden FTP Server 1.92. URL производителя: www.ethereal.com.
Опасность: Высокая. Решение: Установите последнюю версию (0.10.14) с сай-
Описание: Уязвимость существует из-за ошибки при об- та производителя.
работке входных данных в APPE FTP-команде. Удаленный
пользователь может с помощью слишком длинной строки Составил Александр Антипов
вызвать переполнение буфера и выполнить произвольный
код на целевой системе.
URL производителя: www.goldenftpserver.com.
Решение: В настоящее время способов устранения уязви-
мости не существует.

№1, январь 2006 85


ретроспектива

Сломленная, но не сдавшаяся:
история операционной системы BeOS
Часть 2

Дмитрий Мороз

Решение Стива Джобса покончить с производителями клонов Macintosh больно ударило


по самолюбию Жана-Луи Гассе, лишив Be Inc. сразу всех потенциальных клиентов. Компании
не оставалось ничего другого, как искать новые рынки для сбыта своей ОС, пользовательская
база которых бы исчислялась шести- или даже семизначными числами. А единственным
подобным «рынком» являлись, несомненно, компьютеры архитектуры x86.

Суровое время перемен ла и на обычном Pentium. Управляю- Pentium/Pentium II, специальная вер-
На проходившей 11 февраля 1998 го- щий Intel Энди Грув тогда честно при- сия программы PartitionMagic для ди-
да выставке Software Development’98 знался: «Я даже не думал, что произ- намического разбиения жёстких дис-
компания Be Inc. представила обще- водимое нами аппаратное обеспече- ков, изменены некоторые элементы
ственности версию BeOS 3.0, работав- ние может гарантировать такой уро- интерфейса, а также расширены се-
шую на компьютерах с процессорами вень производительности». тевые возможности.
Intel. Несмотря на то что эта корпора- Сама BeOS 3.0 являлась «выли- Одновременно с выходом BeOS
ция в то время представила новейшие занной до блеска» PR2, в которую бы- третьей версии Be Inc. анонсировала
чипы Pentium II, BeOS отлично работа- ли добавлены поддержка процессоров свою интегрированную среду разра-

86
ретроспектива
ботки под названием BeIDE, компиля- истечении шести месяцев управляю-
торы, линкеры и библиотеки для кото- щий Be Inc. решил рискнуть. «Я до сих
рого поставляла компания Metrowerks. пор помню, как мы продавали коробки
«Благодаря» BeIDE собственный па- с BeOS v.3, на которых крупными бук-
кет компании CodeWarrior стал неак- вами было написано «Не для прода-
туален (он стоил денег, в то время как жи!» – вспоминает Ланц.
аналогичный продукт от Be Inc. пос- В дальнейшем дистрибьютора-
тавлялся вместе с ОС), и его разра- ми BeOS стали: Gobe Software (аме-
ботка в версии для BeOS была приос- риканский рынок, а также англоязыч-
тановлена. ные территории Азии), Hitachi (Япония
Старт продаж BeOS 3.0 был за- и остальная часть Азии), а также Koch Рисунок 1. Программа для нелинейного
видеомонтажа personalStudio
планирован на 20 марта 1998 г. Начи- Media и Apacabar (Европа).
ная с этого дня поддержка существую- Как только Be Inc. выпустила вер-
щего и нового аппаратного обеспече- сию своей ОС для архитектуры х86,
ния стала для программистов Be Inc. её главной задачей стало налажива-
настоящей головной болью. Выпу- ние контактов и заключение партнёр-
щенная 16 июня, BeOS 3.1 содержа- ских соглашений с производителя-
ла в основном дополнительные драй- ми ПК с целью установки BeOS на их
веры для материнских плат, звуко- компьютеры. К сожалению, почти все
вых карт, SCSI-адаптеров и внутрен- компании отвечали отказом, но это не-
них модемов. мудрено, ведь Be Inc. была «зелёным
Кроме слабой аппаратной подде- новичком» на рынке, который всеце-
ржки BeOS 3.0 для архитектуры х86 ло лежал у ног корпорации Microsoft
не могла «похвастаться» какими-ли- и её Windows. Рисунок 2. Прототип IPAD, демонс-
трировавшийся Be Inc. на выставке
бо интересными приложениями. В день Тем не менее один производитель PC Expo’99
старта продаж ОС для неё было до- ПК всё же откликнулся на зов Be Inc.
ступно всего 20 программ. Им стала компания Hitachi Ltd., про- в лицензионном ОЕМ-соглашении
Данные обстоятельства тем не ме- изводящая компьютеры для японско- Microsoft, которое подписывает каж-
нее не помешали Intel, а также дру- го рынка. Впечатлённая возможнос- дая компания-производитель ПК, гово-
гим фирмам вложить 25 млн. $ в ком- тями BeOS, она согласилась преуста- рится: «После того, как пользователь
панию Be Inc., финансовые дела у ко- навливать BeOS на три модели своих включит компьютер и пройдёт стадия
торой опять шли плохо. «Be Inc. – компьютеров, выпускавшихся под мар- инициализации BIOS, запрещается из-
компания, которой смерть дышала кой Hitachi Flora Prius. И, казалось бы, менять или модифицировать последо-
практически в самую спину, – гово- всё будет хорошо… вательность появления экранов, отоб-
рил в то время аналитик компании Ещё в 1996 году на вопрос коррес- ражаемых Windows 98, вплоть до по-
Zona Research Грег Блатник. – Я ду- пондента известного журнала Wired явления надписи «Добро пожаловать
маю, благодаря финансированию Intel, «Что вы думаете о Билле Гейтсе» Гас- в Windows 98». Таким образом, Hitachi,
она (Be Inc. – Прим. авт.) скоро снова се ответил: «Биллу постоянно сопутс- равно как и другие производители ПК,
встанет в строй. Если же у неё на уме твует успех. Билл – это Билл. Microsoft не могли установить специальный за-
ещё несколько других сделок – это пой- очень хорошо управляется. И ещё од- грузчик, позволявший пользовате-
дёт компании только на пользу». но: компания – отличный террорист, лю выбрать, какая ОС, Windows или
Кроме того, Intel также предоста- когда дело касается её интеллекту- BeOS, будет загружаться на его ком-
вила компании Гассе своих инженеров альной собственности». И он не про- пьютере.
для обеспечения наиболее полной сов- гадал. Результат оказался плачевным. Не-
местимости с процессорами семейств Как только Be Inc. наладила парт- смотря на то что BeOS была установ-
Pentium/Celeron. Так, например, Be Inc. нёрские соглашения с Hitachi и обе лена на ПК, пользователь мог узнать
была одной из первых компаний, про- компании выпустили пресс-релизы о её существовании лишь по загрузоч-
демонстрировавших на примере сво- о совместном сотрудничестве, бук- ной дискетке, входившей в комплект
ей ОС, а также некоторых других при- вально на следующий день в офис поставки. Попытка Be Inc. закрепиться
ложений преимущества новых инс- японской компании прибыли юристы в качестве OEM-лицензиата операци-
трукций SSE, появившихся в процес- Microsoft и ясно дали понять, что, ес- онной системы производителя компью-
сорах Pentium III. ли Hitachi будет устанавливать BeOS теров провалилась. Позже, в 1999 году,
В июне 1998 года BeOS, можно ска- и Windows на свои компьютеры, лицен- компания даже предлагала бесплат-
зать, увидела мир. Именно в это вре- зия на их операционную систему будет ные лицензии на свою ОС, но «мыши
мя Microdata AB стала первым офици- отнята. Это же предупреждение полу- на бесплатный сыр не пошли».
альным дистрибьютором BeOS. Пат- чили все известные и не очень произ- Во время походившей 10 ноября
рик Ланц, сотрудник Microdata, пред- водители ПК. 1998 года выставки COMDEX 98 Be
ложил Гассе продавать BeOS в Шве- Как Microsoft могла запретить ус- Inc. анонсировала новую, четвёртую
ции ещё в начале 1998 года, и лишь по танавливать BeOS? Очень просто: версию BeOS. Среди её основных нов-

№1, январь 2006 87


ретроспектива
фессионалов (A-Studio) от компании 15 апреля 1999 года Be Inc. с гор-
Adamation, растровый редактор Easel достью заявила, что количество заре-
(Human Touch), пакет для создания гистрированных разработчиков для
«классической» мультипликации Moho BeOS перевалило за отметку 10 000.
(Lost Marble) и др. Кроме того, компа- Но несмотря на такой внушительный
ния Wildcard Design стала первым раз- показатель, большие компании не спе-
работчиком игр для BeOS. Её «старто- шили рисковать с выходом на BeOS-
выми» продуктами стали перенесён- рынок. И их можно было понять.
ные с других операционных систем иг-
ры Axia и Abuse. Пчела демонстрирует
Рисунок 3. Многозадачность BeOS 5.0 – Спустя пару месяцев после выхода своё жало
одновременная работа десяти игр
BeOS 4.0 состоялась первая публич- Выход BeOS 4.5, конечно же, не оказал-
ная демонстрация возможностей ап- ся незамеченным, но померк на фоне
паратного ускорения OpenGL, над ко- анонса Be Inc. 3 марта 1999 года об из-
торым инженеры Be Inc. работали на менении своей стратегии и анонсе но-
протяжении полутора лет. Специаль- вой ОС под названием BeIA (кодовое
но для этого программист Be Inc. Эн- название Stinger – жало). Компания,
дрю Кимптон портировал на BeOS иг- ранее делавшая ставки на операцион-
ру Quake II. ную систему BeOS, решила попытать
Зоркий глаз присутствовавших, счастья на только начавшем зарож-
внимательно следивших за демонс- даться рынке так называемых персо-
трацией, заметил, что чип Pentium III, нальных устройств для доступа в Ин-
установленный на тестовом компьюте- тернет – Internet Apliances. Целевая ау-
ре, работал на частоте 400 МГц, тогда дитория IA – люди, желающие приоб-
Рисунок 4. Офисный пакет как официально частота этих процес- щиться к миру высоких технологий,
GobeProductive 2.0
соров стартовала на отметке 450 МГц. но опасающиеся большой сложности
шеств стоит отметить: Этот факт лишний раз доказывает, в освоении компьютеров. Для приме-
 новую библиотеку Media Kit, пред- что инженеры Be Inc. имели доступ ра типичного устройства рассмотрим
назначенную для выполнения ком- к прототипам нового чипа Intel задолго собственный прототип Be Inc. под на-
плексных операций над потоковы- до его публичной демонстрации. званием IPAD (Internet Personal Access
ми медиа-данными; Кстати, стоит отметить работу Device – персональное устройство для
 в очередной раз расширенную под- OpenGL на BeOS, вернее, её скорость. доступа в Интернет), продемонстри-
держку нового аппаратного обеспе- Тот факт, что операционная система рованный компанией на выставке PC
чения; возможность работы с раз- демонстрировала двух-, а в некоторых Expro в июне 1999 г. Это устройство,
делами FAT16/32 (чтение/запись тестах трёхкратное превосходство пе- по форме напоминающее LCD-мони-
данных из-под BeOS); ред Windows 95/98, говорил о возмож- тор с «деформированной» стойкой, бы-
 увеличившуюся на 30% производи- ной будущей любви разработчиков игр ло предназначено для использования
тельность ОС, а также расширен- к этой ОС. BeOS даже начали назы- на кухне и позволяло бы своему вла-
ные сетевые возможности. вать «игровой платформой будуще- дельцу смотреть видеорецепты приго-
го». Ах, мечты… товления различных блюд, наблюдать
Сама Be Inc. считала BeOS 4.0 Тем временем постоянно разви- за детьми в соседней комнате, слушать
первой версией системы, полностью вающийся компьютерный рынок тре- музыку, читать новости, получать и от-
удовлетворяющей потребности обыч- бовал от BeOS новых возможнос- правлять почту и, конечно же, бороз-
ного пользователя, а также готовой тей. Прекрасно осознавая это, Be Inc. дить просторы Интернета. Если вспом-
для OEM-предустановки на персональ- не стала медлить, и в апреле 1999 г. нить основную концепцию BeOS (быст-
ные компьютеры. По словам аналити- объявила о скором выходе новой вер- рая, надёжная, компактная, с широки-
ка исследовательской фирмы IDC Уи- сии своей операционной системы под ми мультимедийными возможностями),
льяма Петерсона, у Be Inc. наконец-то номером 4.5. Вкратце перечислим ос- получается, что она, как никакая другая
появилась очень быстрая и стабиль- новные нововведения BeOS 4.5: но- ОС в мире, была предназначена для та-
ная ОС. вый экран загрузки, показывающий кого устройства. Гассе с товарищиами
Приблизительно в это время для загружающиеся в данный момент ком- подумал так же и решил рискнуть.
BeOS начали появляться програм- поненты ОС, обновлённую панель на- BeIA является «урезанной» верси-
мы «второго поколения», по сво- строек для лёгкой конфигурации зву- ей обычной BeOS, в которую для улуч-
им возможностям не уступающие ковых и видеокарт, появившиеся хра- шения мультимедийных и сетевых воз-
Windows или MacOS-аналогам. Сре- нители экрана, а также полные либо можностей были добавлены: новый се-
ди них стоит отметить: офисный па- демонстрационные версии программ: тевой стек BONE (BeOS Network Stack),
кет GobeProductive (Gobe Inc.), про- 3dsound (позже изменившей название браузер Opera 4.0, медиаплеер Real
граммы нелинейного видеомонтажа на 3dmix) SoundRecorder, Moho, BePlan, Player, а также виртуальная машина
для любителей (personalStudio) и про- поставлявшиеся в комплекте. Java. Кроме того, каждый производи-

88
ретроспектива
тель, лицензировавший BeIA, мог са- ций компании после объявления BeIA
мостоятельно создать внешний вид стал расти, многие именитые разра-
системы, подстраивая его под нужды ботчики ПО, понимая, что дальней-
конкретного устройства. В результате шая судьба BeOS теперь под вопро-
усечения некоторых библиотек новая сом, приостановили либо прекрати-
ОС могла спокойно разместиться на ли процесс переноса своих приложе-
флэш-карте объёмом 16 Мб и комфор- ний. В их число вошли: Steinberg (ау-
тно чувствовать себя на тех же 16 Мб диоредактор NUENDO), Emagic (ау-
ОЗУ. По мнению Be Inc., BeIA могла бы диоредактор Logic Audio), Maxon (па-
с успехом применяться в веб-планше- кет для создания трёхмерной графи-
тах, медиа-серверах, хранящих раз- ки Cinema 4D) и др. Также были при- Рисунок 5. Интерфейс прототипа
цифрового музыкального сервера Aura
личную фото-, аудио- и видеоинфор- остановлены работы по переносу при-
мацию, миниатюрных ПК, игровых кон- ложений внутри самой Be Inc. BeOS-
солях и т. д. версии генератора трёхмерных ланд-
Вместе с заявлением об измене- шафтов Bryce 4 (MetaCreations), паке-
нии стратегии Гассе объявил о том, что тов для создания трёхмерной графи-
Be Inc. становится открытой акционер- ки Strata3D и StudioPro, а также про-
ной компанией. Выпуск шести милли- граммы нелинейного видеомонтажа
онов акций по цене 6 долл. за акцию VideoShop (C-3D Digital) так и остались
должен был, по мнению управляюще- незаконченными.
го, принести Be Inc. 57 млн. долл., не- Изменение стратегии Be Inc. боль-
обходимых на развитие и продвиже- но ударило и по тем немногим ком-
ние проекта BeIA (суммарная прибыль паниям, осмелившимся начать рабо- Рисунок 6. Программа для финального
компании в 1998 году составила все- ты по переносу своих игровых прило- мастеринга песен T-RackS
го 1,2 млн. долл.). Первым «внешним» жений на BeOS. Со временем опера- Technology, National Semiconductor,
акционером Be Inc. стала, как нетруд- ционная система лишилась: Tribes II, First Computer International, Metricom и
но догадаться, корпорация Intel, купив- Neverwinter Nights, Worms Armageddon, др. Большинство из устройств, анон-
шая 10% её акций. Shogo: Mobile Armor Division, Unreal сированных этими компаниями, пред-
Сразу после объявления Жаном-Луи Tournament, Quake III, Black & White ставляли собой маломощные ПК, веб-
Гассе новой стратегии развития компа- и SimSity 3000. Хотя ещё одним нема- планшеты, а также «интеллектуальные
нии среди пользователей BeOS подня- ловажным аспектом, препятствовав- пульты» для дистанционного управле-
лась буря негодования, вызванная опа- шим появлению игровых продуктов ния бытовой электроникой.
сением, что Be Inc. перестанет уделять на BeOS, стали постоянные задержки «Засмотрелась» на BeIA и Compaq
должное внимание версии своей ОС с тестированием аппаратного ускоре- Computer. По словам представителей
для настольных компьютеров. Павел ния OpenGL и нового сетевого BONE. компании, для её персонального ус-
Цислер, создатель Tracker, предложил Из дошедших до пользователя игр ос- тройства, предназначенного для до-
Стиву Сакоману открыть исходные ко- тались лишь Civilization: Call to Power ступа в Интернет, новая ОС от Be Inc.
ды некоторых частей системы, чтобы и Corumn III: Chaotic Magic. подходила как нельзя лучше. Компа-
сообщество программистов для BeOS Кроме программ, BeOS начала «те- нии заключили партнёрское соглаше-
могло дальше улучшать возможности рять» и инженеров, работавших над ние, и Compaq стала официальным
операционной системы. Поскольку Са- ней. Так, в течение 1999 года из Be Inc. лицензиатом BeIA. Однако в октябре
коман и Гассе сами думали над подоб- ушли практически все создатели опе- 1999 года компания объявила о раз-
ным шагом, идея Цислера была воп- рационной системы: Доминик Джиам- рыве соглашения и лицензировании
лощена в жизнь, и на свет появились поло (автор BFS), Джейсон Семс (ра- Windows CE от корпорации Microsoft.
проекты OpenTracker и OpenDeskbar. ботавший над OpenGL), Говард Бирки В это же время в Интернет просочи-
Тем не менее циркулировавшие вплоть (BONE), Павел Цислер (Tracker) и др. лись слухи о том, что Compaq неза-
до середины 2000 года слухи об откры- Из положительных событий, после- конно предоставила конфиденциаль-
тии исходного кода всей BeOS таковы- довавших вслед за роковым заявлени- ную информацию относительно BeIA
ми и остались. Причина, по словам Гас- ем Жана-Луи Гассе, стало объявление Microsoft, за что та обеспечила компа-
се, заключалась в большом количест- в августе 1999 г. Be Inc. финансовых ре- нии скидку на Windows CE. Таким об-
ве чужих технологий, лицензирован- зультатов второго квартала. Прибыль разом, бывший партнёр подло предал
ных Be Inc. для своей ОС. Их изыма- компании составила 537 000 долл., Be Inc. и пошёл под суд, закончивший-
ние из системы потребовало бы очень что на 74% больше (309 000 долл.), ся, правда, безрезультатно.
много времени, которого у компании чем за первый квартал.
с её ограниченными ресурсами прос- Окрылённая успехом, Be Inc. нача- BeOS 5 Personal Edition:
то не было. ла усиленно продвигать свою новую ОС преодолевая миллионный
Изменение стратегии Be Inc. ко- на рынок. Среди компаний, лицензиро- рубеж
ренным образом повлияло на весь ры- вавших BeIA на протяжении 1999 года, Несмотря на некоторые успехи Be Inc.
нок BeOS. Несмотря на то, что курс ак- стоит отметить: Intel, Microworkz, Qubit в деле лицензирования BeIA, пользо-

№1, январь 2006 89


ретроспектива
программ NetPositive, BeMail, Camera, за другой компании, ранее лицензиро-
3dmiX и среды разработки BeIDE. вавшие новую ОС, объявляли о пере-
BeOS 5 Pro Edition помимо этого со- ходе на другие альтернативные реше-
держала несколько лицензированных ния: кто – на WindowsCE, кто – на QNX,
Be Inc. компонентов: лицензирован- а кто – на Linux.
ный mp3-кодек, медиа-проигрыватель Be Inc. помогали удержаться на пла-
RealPlayer G2, видеоэнкодер Indeo 5, ву лишь продажи BeOS 5 Pro, принёс-
а также руководство по эксплуатации шие за последний квартал 2000 года
и техническую поддержку. При этом из 480 000 долларов, которых едва хвата-
ОС пятой версии были убраны экспе- ло на выплату зарплаты своим сотруд-
риментальные драйверы аппаратно- никам. Понимая, что каждый новый
го ускорения OpenGL, присутствовав- день приближает Be Inc. к банкротству,
шие в BeOS 4.5. Гассе и компания продолжали усилен-
Главное же отличие между PE и Pro- но продвигать BeIA в массы.
версиями заключалось в том, что бес- На выставке CES 2001, ежегодно
платная BeOS 5.0 поставлялась в ви- проходящей в Лас-Вегасе, Be Inc. пред-
де инсталлятора и устанавливалась ставила миру прототип Aura – мульти-
в Windows, создавая полугигабайтный медийного домашнего центра, пред-
Рисунок 7. Интернет-терминал Sony образ BFS внутри файловой системы назначенного для кодирования, про-
eVilla, работающий на базе BeIA
FAT32. Be Inc. надеялась использовать слушивания, а также хранения музы-
BeOS 5 PE в качестве «троянского ко- ки в формате mp3. Устройство под-
ня», который позволил бы пользова- ключалось к телевизору и обладало
телям, не желающим или не умеющим интуитивно-понятным пользователь-
устанавливать операционную систе- ским интерфейсом, позволявшим ор-
му на отдельный раздел, тем не менее ганизовывать композиции в плейлис-
попробовать её. ты, просматривать информацию о пес-
В результате «Интернет-бума» нях, дополнительные данные об ис-
Personal Edition всего за три месяца полнителях, а также в будущем поку-
было скачано более миллиона копий пать музыку через интернет-магази-
BeOS 5 PE. Кроме того, практически ны. Идея с Aura так понравилась са-
Рисунок 8. Интерфейс BeOS Zeta каждый компьютерный журнал счи- мой Be Inc., что компания букваль-
ватели BeOS продолжали негодовать тал обязательным включить бесплат- но сразу же объявила о создании це-
и требовать выпустить новую версию ную версию ОС на свой компакт-диск. лой платформы под названием HARP
системы, содержавшую долго ожи- Так, по словам Стива Сакомана, в од- (Home Audio Reference Platform – базо-
даемые аппаратную акселерацию ной только Европе более 65 журналов вая платформа), предназначенной для
OpenGL, сетевой стек BONE, а так- распространили BeOS 5 PE количест- создания «умных» мультимедийных ус-
же виртуальную машину Java. Дабы вом в шесть миллионов копий. тройств. На HARP сразу же объявился
хоть как-то успокоить своих клиентов, Стоит также отметить появление на- первый потенциальный покупатель –
Be Inc. в марте 2000 года объявила о протяжении 2000 года качественного но- Music Republic, но дальше «постного»
выходе сразу двух версий BeOS 5.0 – вого ПО для BeOS: новой версии офис- релиза о сотрудничестве с Be Inc. дело,
Personal Edition и Professional Edition. В ного пакета GobeProductive 2.0 с воз- как в случае с абсолютным большинс-
пятой версии ОС содержалось меньше можностью чтения документов Microsoft твом лицензиатов BeIA, не пошло.
улучшений, чем в BeOS 4.5, да и они Office, программ для создания музы-
были не такими важными. Судите са- кальных композиций (GrooveMaker), ди- Прощальный вздох
ми: благодаря проектам OpenTracker джеинга (FinalScratch), а также финаль- 2001 год стал последним годом жизни
и OpenDeskbar обновились Tracker ного мастеринга песен (T-RackS), про- Be Inc. Финансовые показатели ком-
и Deskbar; новый драйвер для фай- граммы для нелинейного видеомонта- пании держались на уровне «ватер-
ловых систем NTFS и ext2fs позво- жа (UltraDV) и др. линии» лишь благодаря Sony, лицен-
лил читать (но не записывать) данные BeOS была у всех на виду. О ней зировавшей BeIA для своего ново-
в разделах Windows 2000 и Linux; бы- заговорил весь компьютерный мир. го интернет-терминала eVilla. Убытки
ла улучшена производительность ОС Тем не менее дела у Be Inc. шли всё Be Inc. достигли к 31 декабря 2000 г.
при проигрывании MPEG-файлов; по- хуже и хуже. Если компанию предста- (конец финансового года) 94 млн.
явилась простая программа для запи- вить в качестве мяча и подкинуть его долл., в то время как прибыль соста-
си CD-дисков под названием CDBurner, высоко вверх, момент, когда он до- вила лишь 14 миллионов. Эти финан-
была добавлена поддержка колёсика стигнет максимальной высоты и на- совые показатели заставили компа-
прокрутки на мыши, расширен список чнёт стремительно падать вниз, настал нию пойти на крайние меры – уволить
поддерживаемого аппаратного обес- для Be Inc. именно в 2000 году. 27 человек. Несмотря на то, что боль-
печения (в основном принтеров), а так- На протяжении 2000 года стратегия шинство из них занимали должнос-
же несколько улучшены возможности BeIA начала «давать трещины». Одна ти менеджеров по продажам, Be Inc.

90
ретроспектива
лишилась и нескольких инженеров, зователей продолжает активно подде-
«не вовлечённых в разработку основ- рживать систему. Постоянно выпуска-
ного продукта компании», то бишь про- ются новые программы, совершенс-
граммистов BeOS. твуются старые. На основе бесплат-
В феврале 2001 года, отчаявшись, ной BeOS 5 PE, а также патчей, драй-
компания подала в суд на корпорацию веров и программ, народ собирает раз-
Microsoft, обвиняя её в монополиза- личные дистрибутивы.
ции рынка операционных систем сво- Например, BeOS, ранее не «дру-
ей Windows, а также в давлении на про- жившая» с процессорами Pentium 4/
изводителей ПК. В то время судебный Athlon, а также видеокартами стар-
антимонопольный процесс касательно ше первого ATI Radeon, благодаря по-
Microsoft длился уже три года (в част- явлению BeOS Max и BeOS Developer
Рисунок 9. Графический растровый
ности, вспомните «войну» браузеров Edition может спокойно работать на но- редактор Refraction
Netscape Navigator и Internet Explorer вых компьютерах.
в 1998 г.). Be Inc., лишённая возмож- Кроме того, на основе просо- На данный момент Zeta является
ности поставлять свою ОС произво- чившейся тайком в 2001 году беты, наиболее продвинутой версией BeOS.
дителям компьютеров, чтобы те могли следующей за BeOS пятой версии Она включает в себя:
спокойно устанавливать её на свои ПК, BeOS 5.1d0 (кодовое название Dan0),  обновлённое ядро;
вошла в группу компаний-обвините- был разработан дистрибутив PhOS.  SVG Tracker, поддерживающий век-
лей. Судебный процесс затянулся до Но самое главное – BeOS продол- торную графику;
5 сентября 2003 года, когда Be Inc. жает развиваться, и в этом ей помога-  новый USB-стек;
(в которой к тому времени останется ют два проекта – Haiku и Zeta. Расска-  BONE и множество других улучше-
лишь один сотрудник – юрист) объяви- жем о них лишь в паре приложений. ний и дополнений.
ла об отзыве своего иска, а Microsoft – Заинтересованные могут найти под-
о выплате 23,25 млн. долл. компании в робное описание и новости касатель- По словам Бернда Корца, коли-
качестве компенсации. но проектов по адресам, находящим- чество проданных копий BeOS Zeta
BeIA и практически «иссякшие» ся в конце статьи. в три раза превышает количество
продажи BeOS 5 Pro не смогли удер- Проект Haiku, ранее носивший не- всех предыдущих версий BeOS, про-
жать BeOS от падения в бездну: 2 ап- официальное название OpenBeOS, данных Be Inc.
реля 2001 года Жан-Луи Гассе объявил, стартовал буквально через два ме-
что оставшихся у Be Inc. 9 млн. долл. сяца после покупки Palm компании Послесловие
хватит лишь на шесть месяцев сущес- Be Inc. Его целью стало воссоздание Делать какие-либо выводы относи-
твования, после чего она полностью BeOS 5.0 в новой операционной сис- тельно «светлого» будущего BeOS
обанкротится. Гассе ничего не остава- теме с открытым исходным кодом. По- ещё рановато, тем не менее риск-
лось, как начать разрабатывать план мимо этого, программисты уже выпус- нём предположить, что после выхо-
продажи своей компании. тили достаточно драйверов, позволя- да более или менее стабильной вер-
В августе 2001 года Be Inc. объяви- ющих существующим версиям BeOS сии Haiku, а также новых версий Zeta
ла об очередном увольнении 28 со- чувствовать себя «как дома» на боль- о BeOS снова заговорят в таком же
трудников, пытаясь хоть немного сни- шинстве распространённых конфигу- «радужном свете», как и в 1996 году.
зить затраты и продержаться до того, раций современных ПК. Круг замкнётся, и начнётся новая эра –
как на её душу найдётся покупатель. Что же касается BeOS Zeta, её ос- эра BeOS.
Ждать, впрочем, надо было недол- нователем является немец Бернд
го. Буквально через пару недель после Корц, ранее занимавшийся выпус- Ссылки:
второго увольнения компания Palm Inc. ком журнала InsideBeOS, почивше- 1. www.qube.ru – сайт русскоязычных
18 августа соизволила приобрести го после пятого номера. В начале пользователей BeOS.
Be Inc. и впоследствии использовать 2001 года Корц основал компанию 2. www.bebits.com – база программного
мультимедийные возможности, пре- yellowTAB, решившую заняться даль- обеспечения для BeOS. Практически
доставляемые BeIA, в своей собствен- нейшим продвижением BeOS. Для все существующие программы, а так-
ной операционной системе для КПК этого им была выкуплена лицензия же новые драйверы для этой ОС мож-
PalmOS. 12 ноября, после совещания на продажу BeOS 5 Pro у немецкого но скачать с этого сайта.
акционеров Be Inc., Palm окончатель- дистрибьютера Koch Media, на осно- 3. www.yellowtab.com – если вдруг возник-
но приобрела всю интеллектуальную ве которой yellowTAB собиралась вы- ло желание попробовать BeOS Zeta, за-
собственность компании за ничтожную пустить дистрибутив под названием казать её можно на сайте компании-
сумму в 11 млн. долл. Казалось, исто- BeOS NG (Next Generation – следую- разработчика.
рия «пчелы» подошла к концу… щее поколение). Позже его «начинку» 4. www.haikunews.org – источник новостей
было решено заменить с BeOS 5 Pro о проекте Haiku.
Жизнь после смерти на BeOS 5.1d0, в результате чего опе-
Ан нет. Невзирая на официальную рационная система изменила назва- Редактор рубрики
«смерть» BeOS, сообщество её поль- ние на BeOS Zeta. Кирилл Тихонов

№1, январь 2006 91


книжная полка

Головоломки для хакера


Иван Скляров
ны своей области, – криптоанализ, го- задание. Уровень сложности голово-
ловоломки в Web (хотя логичнее бы- ломок разнится – если некоторые мож-
ло бы назвать «головоломки в сети»), но «расколоть» и в уме, то на решение
Windows, кодинг, безопасное програм- иных можно потратить часы или даже
мирование, reverse code engineering дни, с учетом использование «спец-
(отладки и дисассеблирование) и за- средств». Всего предствлено 75 голо-
дания «для всех». Да, спектр задач до- воломок, много это или мало – судить
статочно широк, так что каждый смо- только вам. В конце книги приводятся
жет найти для себя что-нибудь инте- развернутые решения для всех зада-
ресное. Кому-то покажется занятным ний. Но не спешите их смотреть, не ли-
поиск ошибок в представленном учас- шайте себя удовольствия от самосто-
тке кода, после нахождения которого ятельного разгадывания решения, ка-
надо написать эксплоит, который бу- залось бы неразрешимой, на первый
дет использовать найденную уязви- взгляд задачи. Достойная книга, с до-
мость, для кого-то более интересно стойным материалом, с ней можно ско-
Материал, изложенный в книге, явля- будет исследование бинарных файлов ротать несколько долгих зимних вече-
ется сборником заданий, опубликован- с помощью отладчика и дисассембле- ров (или ночей). Нельзя не отметить
ных в рубрике X-Puzzle журнала «Ха- ра, а возможно, вам придется по ду- прилагающийся к книге диск, на кото-
кер», которую долгое время вел автор ше анализировать куски лога tcpdump, ром вы найдете много любопытного.
книги. Несмотря на уже вполне сфор- для того чтобы разгадать ту или иную
мировавшееся мнение о журнале у головоломку. Не останутся без дела  Издательство: «БХВ-Петербург»
специалистов, с «шапкозакидатель- и любители криптоанализа. Перефра-  Год издания: 2005
ским» настроением к заданиям под- зирую известную фразу «от каждо-  Количество страниц: 320
ходить нельзя. Все задания разде- го по способностям – каждому по за-  ISBN: 5-94157-562-9
лены на 7 частей, которые посвяще- данию», так и тут каждый найдет себе  Цена: ≈ 182 руб.

Компьютерные вирусы изнутри


и снаружи
Крис Касперски
нии и смысле жизни». Локальным виру- дать, что весь остальной материал
сам посвящена вторая часть – тут и про также имеет непосредственное отно-
UNIX, и про Windows. Следующую, тре- шение к основной теме книги, но де-
тью часть по праву можно назвать са- лать это я поостерегся. Изучая матери-
мой разношерстной. Несмотря на свое ал книги, иногда я невольно задавал-
заглавие «Черви возвращаются», ав- ся вопросом, а понимает ли вообще ав-
тор нам повествует и о SEH, и о дав- тор, о чем он пишет? Для примера возь-
но известной уязвимости в IE, связан- мем главу о базах данных, чего толь-
ной с IFRAME, а также о технологиях ко стоит цитата «Захватив управление
honeypot и… о базах данных (!). Далее веб-сервером (а практически ни одно-
(в 4 части) излагаемый материал так- му веб-серверу не удалось избежать
же достаточно отдаленно относится ошибок переполнения буфера и про-
к теме вирусов, но зато вы ознакоми- чих дыр), атакующий получит доступ
Так же как и первая книга автора, мате- тесь с техникой отладки приложений в ко всем данным, хранящимся в базе!».
риал является, по большей части, соб- UNIX-системах, технологией защиты А в остальном, занятная книга, но це-
ранием ранее опубликованных статей CD, а также тестированию ПО. Завер- левая аудитория неопределима.
(по большей части в нашем журна- шает издание последняя часть, из ко-
ле). Первая часть книги носит сугубо торой вы узнаете о различных эмуля-  Издательство: «Питер»
философско-теоретический характер, торах и виртуальных машинах, техни-  Год издания: 2006
но от этого менее интересной не ста- ке оптимизации в Linux и пр. Вот так и  Количество страниц: 527
новится. Основные темы размышле- получается, что непосредственно ви-  ISBN: 5-469-00982-3
ний становятся понятны из названия – русам посвящена только вторая часть  Цена: ≈ 268 руб.
«О деньгах, вирусах, программирова- книги. Нет, можно, конечно, утверж- Книга предоставлена издательством «Питер».

92
книжная полка

Хакинг. Искусство эксплоита


Джон Эриксон
этой книги есть неоспоримое преиму- сканирования и ddos-атак. Завершает
щество перед всеми остальными пуб- книгу раздел, посвященный криптоло-
ликациями, – это систематизация из- гии, прочтя который вы узнаете о тео-
лагаемого материала. рии информации, различных алгорит-
Сразу замечу, все, что описано мах шифрования данных, методиках
в книге относится к UNIX-подобным взлома паролей, атак на беспровод-
ОС, в частности к GNU/Linux. Автор ные сети и многое другое.
последовательно (от простого к слож- Изложенный материал носит су-
ному) повествует читателю о такой губо практический характер, каждая
сложной, но жутко увлекательной те- тема сопровождается приведенным
ме, как написание эксплоитов. в качестве примера исходным кодом.
Начиная с совсем уж простых при- Я думаю, книга покажется, как мини-
меров ошибок, которые в наше время мум, занятной широкому кругу чита-
могут появиться разве что в «лабора- телей – системным администраторам,
торых условиях», медленно но верно программистам и разного рода иссле-
«Эх, опять эксплоиты и переполнения продвигаемся в сторону уже не таких дователям. Если вы не боитесь отлад-
буферов, ну сколько можно!» – скажет тривиальных вещей, как переполнение чика gdb и вас не пугают «километро-
искушенный читатель. Действительно, в стеке и атаки на форматные стро- вые» дисассемблерные листинги – эта
освящаемая в книге тема уже доста- ки. Отдельно описаны тонкости и хит- книга для вас.
точно заезжена, статей море – начиная рости, которые несомненно пригодят-
от ставшей уже канонической статьи ся при написании shell-кода. Дальше  Издательство: «Символ плюс»
«Smashing the stack for fun and profit», больше – переходим от локального  Год издания: 2005
написанной почти 10 лет назад, и за- к сетевому. Целая глава посвящена  Количество страниц: 240
канчивая статьями от «широко извес- взаимодействию с сетью. Тут и сниф-  ISBN: 5-93286-076-6
тных в узких кругах» личностей. Но у финг, и tcp/ip hijack, различные методы  Цена: ≈ 268 руб.

Безопасность сети на основе


Microsoft Windows Server 2003
Роберта Брэгг
туального плана защиты сетевой ин- предстоит решать в процессе сдачи эк-
фраструктуры, проектирование ло- замена, все упражнения, которые опи-
гической защитной инфраструктуры, сывались в книге, электронные книги
физическая защита для сети, созда- (на английском языке) и небольшой
ние возможности безопасного управ- словарь терминов. Книга, несмотря
ления сетью, подготовка системы об- на сложность темы, легко читается,
новления системы безопасности, раз- а большое количество примеров и ск-
работка стратегий аутентификации риншотов помогает вам лучше усвоить
и проектирование защиты межсете- прочитанный материал. Но даже если
вого взаимодействия. Также вы поз- вы не собираетесь сдавать экзамены,
накомитесь с технологиями проекти- все равно рекомендуется приобрести
рования защиты для серверных ролей, это издание, поскольку в нем, действи-
управления доступом к корпоратив- тельно очень удачно, освещена и рас-
Эта книга является официальным ной информации, создания защищен- крыта основаная тема книги.
учебным курсом от Microsoft для же- ной инфраструктуры клиентов и за-
лающих самостоятельно подготовить- щищенных клиентских систем. Не ос-  Издательство: «Питер»
ся к экзамену 70-298. тались без внимания вопросы внед-  Год издания: 2005
Каждая глава книги разделена на рения беспроводных сетей и техни-  Количество страниц: 672
занятия, позволяет нормировать изу- ка защиты IIS.  ISBN: 5-7502-0028-0
чаемый материал. В конце каждого за- На прилагаемом к книге CD вы най-  Цена: ≈ 551 руб.
нятия вам предлагается самостоятель- дете демоверсию тестов, которые вам Книга предоставлена издательством «Питер».
но решить несколько упражнений. Ос-
новные темы книги: создание концеп- Обзор книжных новинок подготовил Александр Байрак

№1 январь 2006 93
подписка на 2006 год
Российская Федерация ти «Гасид» (370102, г. Баку, ул. Джавадхана, 21)
 Подписной индекс: годовой – 20780, полугодовой – 81655  Казахстан – по каталогу «Российская Пресса» через
Каталог агентства «Роспечать» ОАО «Казпочта» и ЗАО «Евразия пресс»
 Подписной индекс: 87836  Беларусь – по каталогу изданий стран СНГ через РГО
Объединенный каталог «Пресса России» «Белпочта» (220050, г. Минск, пр-т Ф. Скорины, 10)
Адресный каталог «Подписка за рабочим столом»  Узбекистан – по каталогу «Davriy nashrlar» российские
Адресный каталог «Библиотечный каталог» издания через агентство по распространению печати
 Альтернативные подписные агентства: «Davriy nashrlar» (7000029, г. Ташкент, пл. Мустакиллик,
Агентство «Интер-Почта» (095) 500-00-60, курьерская 5/3, офис 33)
доставка по Москве  Армения – по списку номенклатуры «АРЗИ» через ГЗАО
Агентство «Вся Пресса» (095) 787-34-47 «Армпечать» (375005, г. Ереван, пл. Сасунци Давида,
Агентство «Курьер-Прессервис» д. 2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул. Са-
Агентство «ООО Урал-Пресс» (343) 375-62-74 рьяна, 22)
ЛинуксЦентр www.linuxcenter.ru  Грузия – по списку номенклатуры «АРЗИ» через АО
 Подписка On-line «Сакпресса» ( 380019, г. Тбилиси, ул. Хошараульская, 29)
http://www.arzi.ru и АО «Мацне» (380060, г. Тбилиси, пр-т Гамсахурдия, 42)
http://www.gazety.ru  Молдавия – по каталогу через ГП «Пошта Молдавей»
http://www.presscafe.ru (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134)
по списку через ГУП «Почта Приднестровья» (МD-3300,
СНГ г. Тирасполь, ул. Ленина, 17)
В странах СНГ подписка принимается в почтовых отделе- по прайс-листу через ООО Агентство «Editil Periodice»
ниях по национальным каталогам или по списку номенк- (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134)
латуры АРЗИ:  Подписка для Украины:
 Азербайджан – по объединенному каталогу российских Киевский главпочтамт
изданий через предприятие по распространению печа- Подписное агентство «KSS», тел./факс (044)464-0220

Подписные
индексы:

20780*
81655**
по каталогу
агентства
«Роспечать»

87836
по каталогу
агентства
«Пресса
России»
*
годовой
**
полугодовой

94
подписка на 2006 год
Редакционная подписка
Открыта подписка через редакцию. Вы можете оформить
подписку на любое количество номеров 2006 года. Редак-
ция не высылает журналы за пределы Российской Феде-
рации.

Для юридических лиц:


№5
по (30
д
ww писн

w.s ой ай 2
По am ин
ag дек
0 05
Ищ чем .ru с 8165
ем у M 5

 Отправьте заявку по факсу (095) 928-82-53 или по e-mail:


Ст пр S S
WP роим ичин QL м
A-E з ы ед
На nte ащи ле
нн
стр rpr ще ор
Ка аи is н
e, ную аб
info1@samag.ru. уд к во ва 80 ота
ем 2.1 бес ет?
ал сс UP
Чт
ов
е н т
ны но а S по
x EA пров
е ф вит дL P-T од
аж LS ную

 Укажите наименование и банковские реквизиты своей но ай ь inu


в к тана зн лы x се
ть:
ор вл ать по
Эф п ор ваи об д BS
по фек ати ем IP- D
ля ти вн Sy тел

организации, почтовый индекс и адрес доставки журна- ми вн ой ma еф


Ко по о у се nte он
с п нтро ль пр ти c
A и и
ом ли зо ав ntiv
Ин ощ ру ва ля iru
ью ем тел ем s9
со терв
ла, телефон и e-mail контактного лица, период подпис- OS без ей .0
зд ью SIM оп вA
ате с ас D
ле Ла но
м я рр сть
зы и У се
ки и количество номеров. Редакция выставит вам счет,
ка ол ти
Pe лом
rl –

после оплаты которого вы начнете получать журналы


по почте. Необходимые бухгалтерские документы вы-
сылаются почтой.

Для физических лиц:


 Заполните нижеприведенную квитанцию, оплатите в лю-
бом банке и пришлите в редакцию копию с отметками
банка.
 После поступления платежа редакция начнет отправ-
лять вам номера.

Стоимость
подписки через
редакцию:

900* руб.
за 6 номеров
1800* руб.
за 12 номеров

* Включая НДС
и почтовую доставку

№1, январь 2006 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№1(38), Январь, 2006 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец В СЛЕДУЮЩЕМ
НОМЕРЕ:
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru
Технический редактор
Владимир Лукин
Редактор
Алексей Коршунов Современный Linux-сервер: и доступно через обновления. Вторые
Внештатные редакторы как планировать дисковые пересоберут критически важные пакеты
Алексей Барабанов ресурсы. Часть 2 со своими настройками и уберут, по их
Кирилл Тихонов Выбор технологии представления дан- мнению, лишнее. Дистрибутив Netwosix
Сергей Супрунов ных не исчерпывает всей совокупнос- предназначен именно для вторых, вот
ти вопросов, возникающих в процессе кому этот дистрибутив будет, несомнен-
РЕКЛАМНАЯ СЛУЖБА планирования дисковых ресурсов. На- но, интересен. При наличии подготов-
тел./факс: (095) 928-8253
до выбрать тип файловой системы, по- ленных конфигурационных файлов яд-
Дарья Хохлова
думать о надежности сделанных реше- ра и серверов, систему под любые тре-
reсlama@samag.ru
ний, и, самое главное, обеспечить со- бования можно собрать в течение часа.
Верстка и оформление ответствующее функционирование со- Буквально через пять дней после объ-
maker_up@samag.ru зданной системы так, чтобы можно бы- явления релиза 1.3 дистрибутива Linux
Дизайн обложки ло воспользоваться на практике всеми Netwosix был анонсирован тестовый ва-
Николай Петрочук преимуществами и выгодами. риант следующей второй ветки. Что но-
вого появилось и для каких целей пред-
По вопросам распространения Активные средства защиты назначен Linux Netwosix?
обращайтесь по телефону: против переполняющихся
(095) 928-8253 (доб. 120) буферов IRC: свобода слова
Стратегическая оборонная инициати- Сервисная система, с помощью кото-
107045, г. Москва,
ва с неисполняемым стеком и NX/XD- рой можно общаться через Интернет
Ананьевский переулок, дом 4/2, стр. 1
тел./факс: (095) 928-8253 байтами дискредитировала себя и на с другими людьми в режиме реально-
Сайт журнала: www.samag.ru проверку оказалась простым марке- го времени, IRC, была создана в 1988
тинговым трюком раздутой рекламной году финским студентом Ярко Ойка-
РУКОВОДИТЕЛЬ ПРОЕКТА шумихи. Кто же теперь будет противо- риненом (Jarkko Oikarinen. Изначаль-
Петр Положевец стоять червям и переполняющимся бу- но, когда доступ к сети Интернет был
ферам? Механизмы проверки време- ограничен, компьютерное сообщест-
УЧРЕДИТЕЛИ ни исполнения бросают вызов и уве- во пользовалось доступными и попу-
Владимир Положевец ренно держат удар, однако, они все- лярными в то время видами общения,
Александр Михалев таки уязвимы. посредством сети FIDO, а также с по-
мощью, так называемых BBS. Посколь-
ИЗДАТЕЛЬ
ЗАО «Издательский дом
Linux Netwosix – ку технология IRC зародилась в UNIX-
«Учительская газета» дистрибутив для сетей сообществе, то очевидно, что наиболь-
Есть два типа администраторов. Пер- шую популярность она снискала себе
Отпечатано типографией вые не будут (или не любят) занимать- именно в этой среде и по сей день, про-
ГП «Московская Типография №13» ся лишней работой и использует, то что цент пользователей этой сети именно
Тираж 9000 экз. установлено вместе с дистрибутивом «юниксоидами» достаточно велик.

Журнал зарегистрирован
в Министерстве РФ по делам печати, Уважаемые читатели!
телерадиовещания и средств массо-
вых коммуникаций (свидетельство
ПИ № 77-12542 от 24 апреля 2002 г.).
Спешите оформить подписку
на первое полугодие 2006 года!
За содержание статьи ответственность
несет автор. За содержание рекламно- Приобрести новые и старые номера журнала
го объявления ответственность несет вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.
рекламодатель. Все права на опубли-
кованные материалы защищены.

Доставка почтой в любую точку России.

96

Вам также может понравиться