№1(38) январь 2006
№1(38) январь 2006 подписной индекс 20780 www.samag.ru
Вы всё ещё не используете 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 ТЕНДЕНЦИИ АДМИНИСТРИРОВАНИЕ 4 Вы всё ещё не используете WMI? Часть 1
Основы, необходимые для эффективного использования технологии Windows Management Instrumentation, и набор рецептов по ее применению в реальных условиях. Константин Леонтьев klеоnt@miсrоsоft.соm
12 Делаем резервное копирование конфигураций активного сетевого оборудования
Пример сценария для резервного копирования, написанный на языке Perl. Андрей Бирюков mex_inet@rambler.ru
16 Современный Linux-сервер: как планировать дисковые ресурсы
Можно заниматься математическим предсказанием увеличения объема информации в сети, а выгоднее использовать технологии хранения, которые позволят вам оперативно масштабировать дисковое пространство и резервировать данные. Алексей Барабанов alekseybb@mail.ru
22 Почтовый сервер на основе реляционной СУБД. Оцените преимущества!
Используем DBMail – малоизвестный, но очень эффективный инструмент для построения сложных и масштабируемых почтовых систем, позволяющий применять реляционные СУБД в качестве серверного хранилища почтовых сообщений вместо традиционных текстовых. Евгений Прокопьев eugene_prokopiev@mail.ru
32 Штопаем дыры в Ilohamail
Доступ к электронной почте через веб-интерфейс обеспечивает дополнительные удобства. Но мы не всегда задумываемся о потенциальных проблемах безопасности, а ведь даже такой безобидный пакет, как Ilohamail, имеет несколько неприятных дыр. Сергей Супрунов amsand@rambler.ru
35 Строим мультидоменный почтовый сервер с защитой от вирусов и спама
Система полностью построена на свободном программном обеспечении: Exim + MySQL + TLS + AUTH + Courier-Imap + DSPAM + SquirrelMail + ClamAV. Павел Семенец darkman@rusgate.org
44 Создаём кластер для PostgreSQL
Мощная СУБД, способная легко конкурировать с такими гигантами, как Oracle и MS SQL. Но, к сожалению, в ней отсутствует возможность репликации. Что делать, если такая опция необходима? Андрей Тренин my_zone@mail.ru
№1, январь 2006
СЕТИ 48 Малоизвестные подробности работы NAT
NAT, поистине, спасение для системного администратора, когда нужно быстро подключить к Интернету локальную сеть. Но всё ли вы о нём знаете? Ильяс Кулиев ilia@kuliev.org
БЕЗОПАСНОСТЬ 54 Защищаем Windows-системы с помощью CORE FORCE
CORE FORCE – яркий пример того, как можно защитить систему, не зная ничего об угрозе. Сергей Яремчук grinder@ua.fm
60 Расширяем возможности MailScanner
Обзор дополнительных программ, позволяющих просмотреть статистику работы системы защиты электронной почты. Сергей Яремчук grinder@ua.fm
66 Судьба shell-кода на системах с неисполняемым стеком
Отчаявшись справиться со своими же ошибками, компания Microsoft совместно с Intel и AMD реализовала технологию DEP, призванную покончить с удаленными атаками, но этого не произошло и защиту удалось обойти. Крис Касперски kk@sendmail.ru
ПРОГРАММИРОВАНИЕ 76 Переходим от VBScript к ASP и ASP.NET: Безопасность и синтаксис
Некоторые скрипты на VBScript настолько усложняются, что их трудно использовать без графического интерфейса. Оптимальное решение – создать веб-приложение на ASP, ASP.NET. Иван Коробко ikorobko@prosv.ru
IMHO 82 Электронная почта как источник повышенной опасности
Не многие задумываются о том, к каким последствиям может привести небрежное отношение к своему почтовому ящику. Сергей Супрунов amsand@rambler.ru
РЕТРОСПЕКТИВА 84 Сломленная, но не сдавшаяся: история операционной системы BeOS Часть 2 Дмитрий Мороз akuji@list.ru
92 КНИЖНАЯ ПОЛКА 53, 65, 85 BUGTRAQ
1
г. Москва, Хлебный переулок 2/3 тел. 29-161-32, 202-61-43 (круглосуточно) e-mail: support@redline.ru
Íàøà êîìïàíèÿ 12 ëåò ïðåäîñòàâëÿåò ëèíèè ñâÿçè â ñàìûõ íåïðîõîäèìûõ ìåñòàõ Ìîñêâû. 10 Ìáèò - $500, âêëþ÷åíî ÌÍÎÃÎ òðàôèêà. Anything else? Çâîíèòå, äîãîâîðèìñÿ! ;-)
тенденции Вышла NetBSD 3.0 В конце 2005-го года состоялся релиз новой версии популярной операционной системы с открытым кодом – NetBSD 3.0. Среди ключевых отличий между NetBSD 2.0 и 3.0 можно выделить: работа ОС на платформе iyonix; порт xen начал поддержку Xen 2.0; поддержка технологии Enhanced SpeedStep Technology (в i386); добавлено устройство ptm(4); программный watchdog timer – swwdog(4); интеграция OpenBSD PF (Packet Filter) как альтернативного фильтра пакетов; появление псевдотерминальной файловой системы ptyfs; поддержка больших файлов (более 2 Гб) в ext2fs; появление PAM; обновления в программном обеспечении.
OpenSUSE установили на 750 тысяч ПК Представители компании Novell сообщили о первых успехах инициативы OpenSUSE.org: за первые 6 месяцев своего существования зафиксировано более 750 тысяч инсталляций бесплатной версии Linux-дистрибутива на ПК. Запуск веб-сайта проекта OpenSUSE состоялся в августе 2005 года. Тогда на выставке LinuxWorld в Сан-Франциско и была официально анонсирована сама инициатива. OpenSUSE предоставляет бесплатный доступ к свободным сборкам и Linux-релизам от Novell. Благодаря сообществу Open Source и разработчикам создается основа, в том числе и для корпоративных продуктов компании.
Основная цель русского сайта – работа над локализацией vtiger CRM (уже сейчас можно скачать версию 0.82 базовой русской локализации для vtigerCRM 4.2 в кодировке UTF-8) и поддержка русскоязычных пользователей.
Covalent поддержала Geronimo Компания Covalent, специализирующаяся на программном обеспечении с открытым кодом, объявила о начале поддержки Geronimo – свободного сервера Java-приложений от организации Apache. Covalent уже распространяет серверное программное обеспечение с открытым кодом, предназначенное для работы как с главным продуктом Apache – одноименным вебсервером, так и другими его свободными разработками, среди которых сервер приложений Apache Tomcat и сервер веб-сервисов Apache Axis. Компания продает услуги по технической поддержке на базе подписки. По словам Марка Брюера (Mark Brewer), исполнительного директора (CEO) Covalent, компания приняла решение расширить поддержку на Apache Geronimo в связи с растущим спросом со стороны своих корпоративных заказчиков. «Компании на протяжении определенного времени рассматривали различные пути ухода с серверного ПО с закрытым кодом. Мы заметили огромное количество людей, оставивших Weblogic от BEA Systems и WebSphere от IBM и мигрировавших на Tomcat», – пояснил Брюер.
Составил Дмитрий Шурупов по материалам www.nixp.ru
Представлен черновой вариант 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, а также имеете общее представление об объектно-ориентированном программировании. Обратите внимание на готовые примеры кода, которые помогут вам в вашей работе.
Что такое WMI?
Рисунок 1. Архитектура WMI
этих процедур оформляется, как WMI Provider – специальная библиотека, являющаяся мостом между любым приложением и ядром службы WMI. Таким образом, WMI – это открытая унифицированная библиотека (репозиторий) однотипных интерфейсов доступа к параметрам, настройки и свойствам различных систем и их компонентов. Архитектура WMI представлена на рис. 1. Многие производители программного и аппаратного обеспечения ведут разработку ПО в соответствии со стандартом WBEM. Как следствие, это ПО совместимо и с WMI, а значит, может управляться через единый и удобный интерфейс.
Формально: аббревиатура WMI – это Windows Management Instrumentation (инструментарий управления Windows). Из этого названия понятно, для чего создана и применяется эта технология. Стоит лишь добавить, что она давно перешагнула рамки управления только операционной системой Windows и позволяет контролировать множество других совместимых с ней приложений. По своей сути WMI – это расширенная и адаптированная компанией Microsoft реализация стандарта WBEM (Web-Based Enterprise Management компании DMTF Inc [1]). В основе WBEM лежит идея создания универсального интерфейса мониторинга и управления к различным систе- Классы, объекты, свойства и методы мам и компонентам распределенной информационной сре- Поскольку WMI построена по объектно-ориентированды предприятия с использованием объектно-ориентирован- ному принципу, то все данные об операционной системе, ной идеологии и широко распространенных веб-техноло- ее свойствах, управляемых приложениях и обнаруженгий представления информации: протоколов XML и HTTP. ном оборудовании представлены в виде объектов. КажСтандарт WBEM является правопреемником стандарта DMI дый тип объекта описан классом, в состав которого входят свойства и методы. Определения классов описаны в MOF(Desktop Management Interface). В основе структуры представления данных в стандарте файлах, а объекты этих классов с заполненными свойс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
администрирование
Рисунок 4. Основное окно утилиты WBEMTEST после подключения к репозиторию WMI
Рисунок 2. Основное окно утилиты WBEMTEST Рисунок 3. Окно настройки подключения к репозиторию WMI утилиты WBEMTEST
Рисунок 5. Окно свойств класса Win32_OperatingSystem
мейства Windows. Условно разделим этот набор утилит на поставляемые с операционной системой по умолчанию и набор утилит, которые потребуется скачивать с сайта компании Microsoft. К первой категории относятся следующие утилиты: wmimgmt.msc – оснастка консоли MMC, позволяющая в целом управлять самой системой WMI на выбранном компьютере. Winmgmt.exe – консольная утилита управления WMI. Выполняет аналогичные действия, что и консоль MMC wmimgmt.msc. Кроме того, является исполняемым файлом сервиса WMI в системе. Для запуска из консоли используется с опцией /exe (winmgmt.exe /exe). Wbemtest.exe – графическая утилита для интерак тивной работы с WMI. Удобна для тестирования классов и методов, просмотра свойств и т. п. Wmic.exe – консольная утилита для вызова объектов и методов WMI (WMI Console) – присутствует только в Windows XP и Windows Server 2003.
6
Рисунок 6. Окно результатов запроса со списком всех классов WMI пространства имен CIMv2
Рисунок 7. Окно свойств экземпляра объекта класса Win32_OperatingSystem
mofcomp.exe – компилятор MOF-
Tweakomatic Utility – у тилита
файлов. Служит для расширения репозитория WMI и тонких операций с библиотекой классов WMI, а также для «ремонта» нарушенного репозитория.
в формате Hyper Text Application (HTA). Содержит множество настроек системы, обычно доступных через утилиты-твикеры (например, Windows XP Power Toys TweakUI), для которых позволяет сгенерировать WMI-скрипты для их автоматической настройки. Весьма полезна при разработке сценариев автоматизированной установки и настройки [5].
Ко второй категории средств для работы с WMI, которые требуется дополнительно устанавливать, относится: WMI Code Creator 1.0 – очень удобная и полезная утилита для создания готовых сценариев WMI. Поддерживает языки Visual Basic Script, C# и Visual Basic .NET [2]. WMI Administrative Tools – комплект средств в составе: WMI CIM Studio, WMI Event Registration, WMI Event Viewer и WMI Object Browser). Удобная среда разработки и тестирования WMI-классов и методов [3]. Scriptomatic 2.0 – мастер в формате Hyper Text Application (HTA). Удобна д ля создания готовых сценариев и на различных скриптовых яз ыка х. Под держив ает Visual Basic Script, Perl, Java Script и Python [4].
Все утилиты, относящиеся ко второй категории, можно бесплатно скачать с сайта компании Microsoft по ссылкам, перечисленным в конце статьи. Полезно будет так же посетить раздел загрузки средств работы со скриптами [6] и общий раздел загрузки средств работы с WMI [7]. Для того чтобы рассмотреть возможности и особенности всех средств работы с WMI, которые перечислены выше, не хватит и целого журнала, поэтому мы кратко остановимся на некоторых из них, на мой взгляд, наиболее полезных и (или) наиболее употребимых. Собственно, к таким я отношу следующие утилиты:
администрирование WBEMTEST, WMIC, WMI Administrative ке экземпляров операционных сисTools и довольно новую, но весьма по- тем. В открывшемся окне свойств эклезную и удачную утилиту WMI Code земпляра операционной системы найCreator 1.0. ти свойство («Property») с названием Надо отметить, что существуют «Name», как это показано на рис. 7. и другие утилиты и средства рабоИ дважды кликнуть по нему курты с WMI, в том числе разработанные сором мыши. В открывшемся окне рене компанией Microsoft, однако формат дактора свойств, которое, показано статьи не позволяет нам на них оста- на рис. 8, скопировать отображаемое навливаться сколько-нибудь подроб- значение в буфер обмена. Оно пригоно. Об одном из этих средств я считаю дится нам в дальнейшем. своим долгом хотя бы упомянуть в этой Далее закройте все окна, кроме статье – это ADSI Scriptomatic [8], поз- основного окна программы wbemtest. воляющее создавать скрипты для уп- В блокноте отредактируйте строку из равления службой каталогов Microsoft буфера обмена следующем образом: Active Directory. Заключите строку в кавычки. Все примеры в этой статье про- До первых кавычек добавьте слетестированы на операционной систедующий текст: «Win32_OperatingSystem.Name=». ме Windows XP Service Pack 2, однако должны также корректно работать Замените все одинарные обратные и на более ранних версиях OS Windows слеши на двойные. вплоть до Windows 2000. Если вам потВ итоге у вас должна получиться ребуется использовать WMI на более ранних версиях ОС Windows, то вам примерно следующая строка (в завинеобходимо будет установить WMI симости от версии ОС и логического Core Components 1.5 [9] и последнюю диска, куда она установлена): версию Windows Scripting Host [10, 11] Win32_OperatingSystem.Name= ↵ на эти ОС.
Знакомимся с утилитой WBEMTEST
Рисунок 9. Окно вызова метода для экземпляра объекта класса Win32_OperatingSystem утилиты WBEMTEST
"Microsoft Windows XP ↵ Professional|C:\\WINDOWS|\\ ↵ Device\\Harddisk0\\Partition1"
Теперь давайте выполним следуюДля того чтобы прямо сейчас посмотреть, какой набор классов определен щее упражнение с утилитой wbemtest. в репозитории WMI на вашем персо- В уже открытом окне утилиты wbemtest нальном компьютере, достаточно за- нажмем кнопку «Execute Method…» пустить утилиту wbemtest.exe и уста- и в окошко «GetObjectPath» встановить флажок «Enable All Privileges», вим строку, которую мы подготовикак показано на рис. 2. ли в блокноте. В появившемся окне Далее нажать кнопку «Connect…», (см. рис. 9) вызова метода экземпляв поле пространства имен вписать root\ ра объекта выберем метод Reboot и наCIMv2, как это показано на рис. 3, и на- жмем кнопку «Execute!». Поздравляю, вы только что отпражать кнопку «Connect». Затем нажмите кнопку «Enum вили свою операционную систему в пеClasses…», выберите «Recursive», не резагрузку, используя WMI. Если вы заполняйте поле суперкласса и на- вдруг получили вместо перезагрузжмите «Ok». В результате вы получи- ки сообщение об ошибке 0x80041062 те список классов, определенный в ва- «Privilege not held», то это означает, что шем репозитории WMI, в пространстве вы забыли установить опцию «Enable имен CIMv2. Найдите среди всех класс All Privileges» до подключения к репос названием Win32_OperatingSystem зиторию WMI. (CIM_OperatingSystem), как это покаТеперь в довершение следует сказано на рис. 6. зать (пока ваш Windows перезагруДважды щелкнув курсором мы- жается), что при подключении к проши по классу Win32_OperatingSystem, странству имен WMI вы можете подпосмотреть его свойства. Пример того, ключаться не только на локальной как это выглядит, показан на рис. 5. машине, но и как следует из обзора Далее нажать кнопку «Instances» WMI к любой удаленной. Главное, оби в открывшемся окне дважды щелк- ладать на той машине необходимынуть курсором мыши по строке в спис- ми правами. Но об этих правах позд-
№1, январь 2006
Рисунок 8. Окно со значением свойства Name экземпляра объекта класса Win32_OperatingSystem
Рисунок 10. Окно подключение к пространству имен WMI с явным указанием имени сервера
нее! Для подключения к удаленной машине в окне подключения достаточно в поле Name Space указать строку вида \\<computername>\root\CIMv2 и указать учетные данные пользователя, обладающего необходимыми правами (например, Administrator). Пример этого показан на рис. 10. Не пробуйте подключаться к локальной машине, на которой запрашиваются объекты и методы WMI (например, на той, на которой сейчас выполняется утилита wbemtest), используя отличные от текущих учетные данные – все равно это у вас не получится. Это специальная защита для повышения локальной безопасности WMI, но о ней мы поговорим позже.
7
администрирование Теперь список процессов ограничен только теми процессами, в имени исполняемого модуля которых присутствует строка «cmd.exe». Обратите внимание на PID процесса(ов). Теперь давайте попробуем отобрать интересующие нас процессы, используя непосредственно WMI и не прибегая к стандартным средствам командной строки. Для этого просто напишите: wmic process where description='cmd.exe' list brief Рисунок 11. Командное окно с запущенной утилитой WMIC в интерактивном режиме
Изучаем работу утилиты WMIC Для того чтобы воспользоваться этой очень важной и полезной для администратора утилитой, достаточно запустить интерпретатор командной строки cmd.exe и в строке приглашения набрать WMIC. После этого у вас появится приглашение консоли WMI, как это показано на рис. 11. Для получения справки по всем командам, доступным из консоли WMIC, достаточно в строке приглашения ввести команду «/?». Синтаксис каждой команды или глобальной опции вы можете посмотреть, введя ее название и знак вопроса. Например:
Сравните полученные результаты. Запомните PID процесса CMD.EXE. Теперь давайте вызовем метод Terminate для экземпляра объекта WMI. Так мы завершим интересующий нас процесс в системе. Для того чтобы однозначно определить процесс, который мы хотим завершить, нам нужно использовать его PID или какой-либо другой набор атрибутов процесса, которые позволяют его однозначно отличить от множества других процессов в системе. Для завершения процесса нам нужно вызвать метод WMI. Для этого существует команда CALL. Для того чтобы вывести справку по всем методам, применимым к объектам типа PROCESS (Win32_Process), наберите команду: wmic process call /?
process list /?
Среди них обратите внимание на метод Terminate – он принимает в качестве единственного входного параметТак мы работаем с утилитой WMIC в интерактивном ре- ра значение типа UINT32 (беззнаковое 32-разрядное целое) жиме. Однако ничто не мешает нам использовать ее и в па- в качестве индекса причины завершения процесса. В данкетном режиме из наших BAT/CMD-сценариев. Например, ном случае этот параметр аналогичен Exit-коду. в приглашении командной строки CMD можно написать: Запустите четыре разных экземпляра процесса cmd.exe (откройте 4 командных окна). Еще раз выполниwmic process list /? те команду: и получить тот же результат. Утилита WMIC создана для удобства использования WMI прямо из командной строки, поэтому наиболее употребимые классы WMI доступны для использования под псевдонимами (ALIAS). Вы можете самостоятельно определить псевдонимы для тех классов, для которых это еще не сделано, или добавить новые псевдонимы для тех классов WMI, которые уже их имеют. Список псевдонимов, которые определены на Windows XP Service Pack 2 по умолчанию с их кратким описанием, приведены в таблице 1. Теперь давайте попробуем использовать утилиту WMIC для работы с WMI из командной строки. Для начала выйдите из интерактивного режима консоли WMIC командой exit. Вы оказались в среде командного интерпретатора CMD. В приглашении наберите команду: wmic process list brief
Вы получите список процессов, запущенных на вашем локальном компьютере. Теперь выполните команду: wmic process list brief | find "cmd.exe"
8
wmic process where description='cmd.exe' list brief
В результате вы получите в ответ примерно следующее: HandleCount 28 28 28 31
Name cmd.exe cmd.exe cmd.exe cmd.exe
Priority 8 8 8 8
ProcessId 4648 5156 4940 612
ThreadCount 1 1 1 1
WorkingSetSize 2494464 2498560 2498560 2703360
Итак, чтобы завершить конкретный процесс, просто наберите: wmic process where processid='****' call terminate(0)
вместо звездочек укажите PID нужного вам экземпляра процесса cmd.exe. Теперь давайте одной командой завершим все оставшиеся процессы cmd.exe, для этого просто введите команду: wmic process where description='cmd.exe' call terminate(0)
Что за конструкция where и как еще ее можно исполь-
администрирование зовать, мы разберем чуть позже в разделе «Язык запросов WQL». Для того чтобы подключиться к репозиторию WMI на другом компьютере и выполнять все те же действия, при условии, что наша учетная запись обладает достаточными правами, нам всего лишь нужно немного модифицировать нашу командную строку. Теперь наши команды должны выглядеть примерно так: wmic /NODE:server01 /USER:DOMAIN\Administrator ↵ /PASSWORD:qwerty /PRIVILEGES:ENABLE process where ↵ description='cmd.exe' list brief
Если же вы хотите выполнить какие-то действия, используя WMI не с одним, а с целой группой компьютеров, то достаточно написать команду с использованием WMIC и ключом «/node:@serverslist.txt»: wmic /NODE:@serverslist.txt /USER:DOMAIN\Administrator ↵ /PASSWORD:qwerty /PRIVILEGES:ENABLE process ↵ where description='cmd.exe' list brief
Рисунок 12. Окно утилиты WMI CIM Studio с открытыми свойствами класса Win32_OperatingSystem
WMI CIM Studio очень удобный инструмент для поиска классов и свойств в огромном море репозитория WMI. Для поиска нажмите кнопку со значком бинокля и введите шаблон для поиска, например «network». Выберите область поиска (Class names, Class description, Property names) и нажмите «Go!». В целом WMI CIM Studio очень хороший инструмент для поиска и исследования репозитория WMI и для интерактивного анализа состояния экземпляров объектов WMI.
В файле serverlist.txt в столбец или в строку должны быть перечислены имена (IP-адреса) хостов, на которых необходимо выполнить это действие. В довершение краткого описания утилиты WMIC, следует сказать об еще одной, поистине замечательной, ее особенности – форматировании вывода. Практически все команды WMIC, которые возвращают информацию, могут ее форматировать разными способами. Для этого используется ключ «/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, используется язык WMI Query Language (WQL), который является подмое ActiveX. На рис. 12 показан вид окна WMI CIM Studio. Слева вы множеством ANSI SQL. Основное отличие WQL от ANSI SQL состоит в том, что видите набор классов WMI и их иерархии в том пространстве имен 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
BASEBOARD
Base board (also known as a motherboard or system board) management
Win32_BIOS
BIOS
Basic input/output services (BIOS) management
Win32_BaseBoard
BOOTCONFIG
Boot configuration management
Win32_BootConfiguration
CDROM
CD-ROM management
Win32_CDROMDrive
COMPUTERSYSTEM
Computer system management
Win32_ComputerSystem
CPU
CPU management
WIN32_PROCESSOR
CSPRODUCT
Computer system product information from SMBIOS
Win32_ComputerSystemProduct
DATAFILE
DataFile Management
CIM_DataFile
DCOMAPP
DCOM Application management
WIN32_DCOMApplication
DESKTOP
User’s Desktop management
WIN32_DESKTOP
DESKTOPMONITOR
Desktop Monitor management
WIN32_DESKTOPMONITOR
DEVICEMEMORYADDRESS
Device memory addresses management
Win32_DeviceMemoryAddress
DISKDRIVE
Physical disk drive management
Win32_DiskDrive
DISKQUOTA
Disk space usage for NTFS volumes
Win32_DiskQuota
DMACHANNEL
Direct memory access (DMA) channel management
Win32_DMAChannel
ENVIRONMENT
System environment settings management
Win32_Environment
FSDIR
Filesystem directory entry management
Win32_Directory
GROUP
Group account management
Win32_Group
IDECONTROLLER
IDE Controller management
Win32_IDEController
IRQ
Interrupt request line (IRQ) management
Win32_IRQResource
JOB
Providesaccess to the jobs scheduled using the schedule service
Win32_ScheduledJob
LOADORDER
Management of system services that define execution dependencies
Win32_LoadOrderGroup
LOGICALDISK
Local storage device management
Win32_LogicalDisk
LOGON
LOGON Sessions
Win32_LogonSession
MEMCACHE
Cache memory management
WIN32_CACHEMEMORY
MEMLOGICAL
System memory management (configuration layout and availability of memory)
Win32_LogicalMemoryConfiguration
MEMPHYSICAL
Computer system’s physical memory management
Win32_PhysicalMemoryArray
NETCLIENT
Network Client management
WIN32_NetworkClient
NETLOGIN
Network login information (of a particular user) management
Win32_NetworkLoginProfile
NETPROTOCOL
Protocols (and their network characteristics) management
Win32_NetworkProtocol
NETUSE
Active network connection management
Win32_NetworkConnection
NIC
Network Interface Controller (NIC) management
Win32_NetworkAdapter
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
ONBOARDDEVICE
Management of common adapter devices built into the motherboard (system board)
Win32_OnBoardDevice
OS
Installed Operating System/s management
Win32_OperatingSystem
PAGEFILE
Virtual memory file swapping management
Win32_PageFileUsage
PAGEFILESET
Page file settings management
Win32_PageFileSetting
PARTITION
Management of partitioned areas of a physical disk
Win32_DiskPartition
PORT
I/O port management
Win32_PortResource
PORTCONNECTOR
Physical connection ports management
Win32_PortConnector
PRINTER
Printer device management
Win32_Printer
10
применяться только в сочетании с константой NULL. Языком WQL поддерживается оператор LIKE. Более подробно про шаблоны, применяемые совместно с оператором LIKE в WQL, можно ознакомиться в оригинальном описании WMI на сайте Microsoft [12, 13]. Ниже приведен пример некоторых типичных WQL-запросов: SELECT * FROM Win32_LogicalDisk ↵ WHERE FileSystem IS NULL SELECT * FROM Win32_LogicalDisk ↵ WHERE FileSystem IS NOT NULL SELECT * FROM Win32_LogicalDisk ↵ WHERE FileSystem = "NTFS" SELECT * FROM Win32_DiskDrive ↵ WHERE Partitions < 2 ↵ OR SectorsPerTrack > 100 SELECT * FROM Win32_LogicalDisk ↵ WHERE (Name = "C:" OR ↵ Name = "D:") AND FreeSpace > ↵ 2000000 AND FileSystem = "NTFS" SELECT * FROM Win32_NTLogEvent ↵ WHERE Logfile = 'Application' SELECT * FROM Meta_Class ↵ WHERE __Class LIKE %Win32% SELECT * FROM __InstanceCreationEvent ↵ WHERE TargetInstance ISA ↵ "Win32_NTLogEvent" GROUP ↵ WITHIN 600 BY TargetInstance.SourceName HAVING ↵ NumberOfEvents > 25
Вы можете поупражняться в запросах WMI с помощью уже хорошо известной вам утилиты WBEMTEST, нажав кнопку «Query» в ее главном окне. Теперь вспомните утилиту командной строки WMIC, функции которой мы разбирали немного выше. В ее синтаксисе также могут использоваться WQLзапросы для удобства работы с наборами объектов одного класса. Чтобы использовать уже имеющиеся и проверенные WQL-запросы (большинство из них удобнее всего проверять утилитой WBEMTEST), из командной строки достаточно отбросить у WQL-запроса первую часть: «select * from». Затем заменить имя класса на его алиас (псевдоним) из таблицы 1 и при необходимости добавить после запроса вызов метода, формат вывода списка или запрос свойства объекта. Примеры того, что при этом получается, я уже приводил выше. Если же среди псевдонимов в таблице 1 нет нужного вам класса, то есть два пути решения. Первый – добавить новый псевдоним для нового класса. Этот путь хорош, если с этим классом из WMIC вы будете работать только на этом компьютере. Если же вы хотите использовать команду wmic на разных компьютерах, в том числе и на тех, на которых такой алиас вы не опреде-
администрирование ляли, то можно воспользоваться вторым способом. Второй способ позволяет явно использовать настоящее имя класса WMI при обращении к нему с помощью WMIC. Для этого используйте следующий синтаксис:
Таблица 1. Список псевдонимов утилиты WMIC и соответствие их классам WMI (продолжение) Псевдоним
Описание
Имя клсса WMI
PRINTERCONFIG
Printer device configuration management
Win32_PrinterConfiguration
PRINTJOB
Print job management
Win32_PrintJob
PROCESS
Process management
Win32_Process
PRODUCT
Installation package task management
Win32_Product
QFE
Quick Fix Engineering
Win32_QuickFixEngineering
QUOTASETTING
Setting information for disk quotas on a volume
Win32_QuotaSetting
RECOVEROS
Information that will be gathered from memory when the operating system fails
Win32_OSRecoveryConfiguration
Заключение
REGISTRY
Computer system registry management
Win32_Registry
На этом хочу прервать изложение первой части и, предваряя выход очередного номера, журнала сообщить вам, краткое содержание следующей части статьи. Мы обсудим написание сценариев с использованием WMI и WSH. Будут разобраны особенности использования WMI в скриптах, из тех, которые обычно вызывают наибольшие затруднения у людей, начинающих работать с этой технологией. К таким темам я отношу: построение moniker string, использование различных пространств имен WMI, связка WMI и COM, использование различных языков программирования вместе с WMI, имперсонация, аутентификация и привилегии. Наконец, наиболее интересные моменты, связанные с подключением к удаленным компьютерам и обработкой системных событий с помощью WMI. В заключении мы обсудим готовые продукты, использующие WMI и стратегию развития этой технологии, а так же ее применения в информационных системах предприятий. Что ж, надеюсь, что первая часть статьи вас не разочаровала, а продолжение окажется для вас полезным! До скорой встречи…
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
SOFTWAREELEMENT
Management of theelements of a software product installed on a system
Win32_SoftwareElement
SOFTWAREFEATURE
Management of software product subsets of SoftwareElement
Win32_SoftwareFeature
SOUNDDEV
Sound Device management
WIN32_SoundDevice
STARTUP
Management of commands that run automatically when users log onto the computer system
Win32_StartupCommand
SYSACCOUNT
System account management
Win32_SystemAccount
SYSDRIVER
Management of the system driver for a base service
Win32_SystemDriver
SYSTEMENCLOSURE
Physical system enclosure management
Win32_SystemEnclosure
SYSTEMSLOT
Management of physical connection points including ports,slots and peripherals, and proprietary connections points
Win32_SystemSlot
TAPEDRIVE
Tape drive management
Win32_TapeDrive
TEMPERATURE
Data management of a temperature sensor (electronic thermometer)
Win32_TemperatureProbe
TIMEZONE
Time zone data management
Win32_TimeZone
UPS
Uninterruptible power supply (UPS) management
Win32_UninterruptiblePowerSupply
USERACCOUNT
User account management
Win32_UserAccount
VOLTAGE
Voltage sensor (electronic voltmeter) data management
Win32_VoltageProbe
VOLUMEQUOTASETTING
Associates the disk quota setting with a specific disk volume
Win32_VolumeQuotaSetting
WMISET
WMI service operational parameters management
Win32_WMISetting
wmic path Win32_LogicalDisk ↵ WHERE FileSystem='NTFS' ↵ get /value
Ссылки и литература: 1. Distributed Management Task Force Inc. – http://www.dmtf.org/home. 2. W M I C o d e C r e a t o r 1. 0 – h t t p : / / download.microsoft.com/download/0/ c / a / 0 c a7 6 9 1c - 6 3 3 5 - 414 3 - 8 f 9 f 6708969f8212/WMICodeCreator.zip. 3. WMI Administrative Tools – ht tp: // download.microsoft.com /download /. NetStandardServer/Install/V1.1/NT5XP/ EN-US/WMITools.exe. 4. S c r i p t o m a t i c 2 . 0 – h t t p : / / w w w . 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 . aspx?FamilyID = 09dfc342-648b-4119b7eb-783b0f7d1178& DisplayLang=en.
№1, январь 2006
5. Twe a ko m at i c U t i l i t y – h t t p : / / w w w. 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 . aspx?FamilyID =bd328d1e-6c01-4447bd7c-c09646d722c8&DisplayLang=en. 6. Microsoft Scripting Downloads Catalog – http://msdn.microsoft.com/downloads/list/ webdev.asp. 7. W M I D o w n l o a d s c a t a l o g – h t t p : / / msdn.microsof t.com /librar y/default. asp?url=/downloads/list/wmi.asp. 8. A D S I S c r i p t o m a t i c – h t t p : / / w w w. 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 . aspx?FamilyID =39044e17-2490-487d9a92-ce5dcd311228&DisplayLang=en. 9. WMI Core 1.5 for Windows 9x, NT 4.0 SP4 – http://www.microsoft.com/downloads/ details.aspx?FamilyID=afe41f46-e213-4cbf9c5b-fbf236e0e875&DisplayLang=en.
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 W i n d ows 9 x / N T/ M E – ht t p : / / w w w. 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 . aspx?FamilyID = 0a8a18f6-249c-4a72bfcf-fc6af26dc390&DisplayLang=en. 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 Documentation – ht tp: //w w w. 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 . aspx?FamilyId=01592C48-207D-4BE18A76-1C4099D7BBB9&displaylang=en. 12. WQL Keywords and description – http:// windowssdk.msdn.microsoft.com/library/ en-us/wmisdk /wmi /wql_sql_for_wmi. asp. 13. Windows Management Instrumentation – http://msdn.microsoft.com/library/en-us/ dnanchor/html/anch_wmi.asp.
11
администрирование
Делаем резервное копирование конфигураций активного сетевого оборудования
Андрей Бирюков Конфигурации активного сетевого оборудования, также как и данные, используемые различными приложениями, нуждаются в резервном копировании. Предлагаем вам пример сценария для резервного копирования, написанный на языке Perl.
Н
а сегодняшний день резервное копирование данных стало неотъемлемой частью ежедневных задач, выполняемых системными администраторами. И это неудивительно, так как убытки, которые компания может понести в случае потери данных или вынужденного простоя, зачастую намного больше стоимости оборудования, используемого для хранения данных. Существует масса различных программных продуктов, позволяющих осуществлять автоматическое резервное копирование данных практически в любом формате, от «снимка» состояния операционной системы до бэкапа баз данных. Однако все многообразие применимо лишь к программным решениям. С аппаратными решениями, в частности, с активным сетевым оборудованием, дело обстоит немного сложнее. Конечно, многие могут возразить, что энер-
12
гонезависимая память маршрутизаторов и коммутаторов более устойчива к сбоям в энергосети и что вполне достаточно, скажем, раз в месяц делать вручную копию рабочей конфигурации своего оборудования и сохранять ее на TFTP-сервер [1]. Однако в случае динамически изменяющейся конфигурации сети такой подход будет, мягко говоря, не слишком хорош. Например, на маршрутизаторах телекоммуникационной компании, где настройки интерфейсов, статические маршруты или access-list могут меняться ежедневно. Осуществлять резервное копирование вручную в такой сети очень сложно, особенно если количество маршрутизаторов и коммутаторов больше пяти. В такой ситуации нам необходимо осуществлять ежедневное, автоматическое резервное копирование рабочих конфигураций активного сетевого оборудования.
Для решения поставленной задачи мы воспользуемся небольшим сценарием на языке Perl, который будет запускаться по расписанию, удаленно подключаться к каждому маршрутизатору или коммутатору по протоколу Telnet или SSH и копировать рабочую конфигурацию на TFTP-сервер. Для примера в статье будут использоваться команды Cisco IOS, хотя ничто не мешает вам использовать активное сетевое оборудование других фирм, предварительно настроив на нем удаленный доступ через Telnet или SSH.
Реализация Итак, приступим к программной реализации. В качестве операционной системы используется FreeBSD, хотя с тем же успехом можно все описанное далее реализовать и на Linux-клонах. За основу нашего сценария, используемого для выполнения удаленных ко-
администрирование манд, возьмем пример кода с сайта 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 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");
Рисунок 1. Резервное копирование дампа конфигурации
Таким образом, для решения поставленной задачи нам необходимо написать сценарий, корректно выполняющий данный диалог сервера и маршрутизатора. Остается только добавить обработку исключений, на случай если возникнут ошибки, а также отправку администратору письма о том, что резервное копирование успешно осуществлено. Для тоВ этом сценарии мы сначала устанавливаем соедине- го чтобы 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> Router>enable Router#copy running-config tftp Address or name of remote host []?10.0.1.2 Destination filename []?config080106 !!!!!! 21519 bytes copied in 1.056 secs (20045 bytes/sec)
Другой вариант резервного копирования для маршрутизаторов Cisco – это полный дамп конфигурации, находящейся в флеш-памяти маршрутизатора. Для этого необходимо вначале узнать полное имя файла конфигурации. Получить список файлов, находящихся в флеш-памяти можно с помощью команды «show flash». На рис. 1 показан результат действия данной команды. Выделен файл, который нам необходимо скопировать. Однако, как видно из данного рисунка, размер дампа конфигурации существенно превышает размер простой копии рабочей конфигурации, которая делалась в первом примере. Это может иметь значение при использовании каналов с небольшой пропускной способностью или если на TFTP-сервере мало свободного места. В такой ситуации имеет смысл делать, к примеру, раз в неделю копию дампа и ежедневно копию рабочей конфигурации, аналогично полному и разностному резервному копированию.
№1, январь 2006
use Net::Telnet (); use Mail::Sendmail; $t = new Net::Telnet ; $hostname="10.0.1.11"; $t->open($hostname); $t->waitfor('/login:.*$/') or die "bad login: ", $t->lastline; $t->print("user"); $t->waitfor('/Password:.*$/') or die "bad password: ", $t->lastline; $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; $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); $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',
13
администрирование From => 'ciscobackup@test.local', Message => "Backup was finished with result:".$result, SMTP => 'smtp.mail.ru' ); sendmail(%mail) or die $Mail::Sendmail::error;
Пользователям, не слишком искушенным в программировании на Perl, следует обратить внимание на ряд технических моментов. Прежде всего для запуска сценария необходимы права на выполнение для данного пользователя. Также сценарий можно запускать с помощью команды «perl имя_сценария», однако в случае, если первой строкой в тексте идет путь к интерпретатору Perl (например #!/usr/bin/perl, как в Листинге 1), то тогда можно запускать как обычный файл сценария, то есть ./имя_сценария (аналогично chmod +x), но второй вариант также удобен при использовании веб-интерфейса. Узнать путь к интерпретатору Perl можно с помощью команды «which perl». Наш сценарий соединяется с удаленным устройством по протоколу Telnet, затем выполняет заданный набор команд, сохраняет рабочую конфигурацию в файле с именем, содержащим полную дату создания файла, и потом отправляет администратору письмо с результатами выполнения сценария. Для отправки почты данным сценарием достаточно, чтобы был указан SMTP-сервер на котором для данного IP-адреса разрешена ретрансляция почты. В качестве показателя результата выступает строка, которую возвращает удаленное устройство после попытки сохранить конфигурацию на TFTP-сервер. В случае ошибки результирующая строка может выглядеть вот так: Error opening tftp://10.0.12/config080106
торые требуются для корректной работы автоматической системы резервного копирования.
Автоматизируем выполнение Прежде всего нам потребуется TFTP-сервер. Я не буду описывать процесс установки и настройки данной службы, так как все это уже хорошо описано в [1]. Следующим этапом будет настройка утилиты cron. Данная утилита входит в состав UNIX-систем и позволяет выполнять автоматически различные задачи по расписанию. Формат данных, который использует cron, довольно прост. Поля: Минута – от 0 до 59. Час – от 0 до 23. Дата –от 1 до 31. Месяц – от 1 до 31 или от Jan до Dec. День недели – от 0 до 6 или от Sun до Sat. Команда – выполняемая команда (в нашем случае это буде файл сценария). Для большей ясности приведем пару примеров: 30 2 * *
perl /tmp/telnet.pl
Сценарий telnet.pl, находящийся в каталоге tmp, будет выполняться каждый день в 2 часа 30 минут. Поле «день недели» не используется, вместо него указан лишний пробел. 50 18 1,15 * perl /tmp/ssh.pl
В данном случае сценарий будет выполняться в 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
администрирование В-третьих, после вышесказанного совершенно очевидно, что возрастание внутренних данных приводит к необходимости увеличения емкости хранения рано или поздно. И, в-четвертых, модернизация сервера или его миграция на иное оборудование является неотвратимой закономерностью, если только компания-заказчик, где сервер работает, не предполагает разориться вместе с завершением эксплуатации сервера. Поэтому задумываться о том, какой ценой будет производиться модернизация, надо сразу при «закладке» сервера. Перечислив положительные качества, не забудем упомянуть и отрицательные – те, что обозначены в формулировке как «избыточные ресурсы». Избыточным будем считать все, что привлекается лишь для совершения самой операции увеличения, улучшения или модернизации. Например, если для увеличения дискового пространства потребуется не только подключить новый диск, но еще и придется выкинуть старый, то такой нескомпенсированный обмен надо считать «избыточным ресурсом». Также избыточными будем считать все траты на подобные операции. Например, если модификацию можно осуществить без перерыва в работе, то это идеал, в противном случае – нет. А на практике там, где обсуждаются не идеальные, но реальные условия, чем меньше ресурсов потребуется для проведения операции, тем лучше. Резюмируем вышесказанное. Во всех технологических выборах следует предпочитать те способы и методы, которые снизят стоимость дальнейших преобразований и модификаций. Вот такой получается «восточный дракон», кусающий собственный хвост. Теперь, когда цель ясна и определена, обсудим сами устройства хранения и те технологии, что предлагаются на выбор «из коробки» при сегодняшнем уровне развития в SuSE Linux 10.0.
Рисунок 1. Схема иерархии уровней представления дисковых данных
DRB/iSCSI – сетевой диск по соответствующей технологии;
EXT3... – уровень представления, соответствующий файловым системам;
NFS... – уровень представления, соответствующий сетевым файловым системам и протоколам, используемым для организации сетевого доступа к файлам. Каждый окрашенный прямоугольник отделяет регион, включающий технологии соответствующей категории. Их три: SAS – устройства, физически подключаемые к серверу; SAN – блочные устройства, подключаемые по сетевым интерфейсам; NAS – файловые системы, доступные через сеть.
Все перечисленные на схеме технологии могут быть задействованы в пределах одного серверного блока или, точнее, одного хоста. Безусловно, необходимость их испольСовременный Linux-сервер является многофункциональ- зования должна диктоваться областью применения. И вот ным устройством, работающим в сети. Если абстрагиро- здесь для нашего обсуждения будет важно то, какую гибваться от его прикладного назначения и попытаться пред- кость в настройке и модернизации обеспечивают все изобставить весь спектр возможных уровней и способов досту- раженные элементы. Для этого рассмотрим подробнее па к данным, то получится большая схема, напоминающая ту же схему, но с точки зрения операций и их взаимодейсмногослойный пирог. Иерархию сетевого доступа к данным твия по пути эскалации технологических уровней. Будем далее исходить из предположения, что все истоже принято изображать в виде многоуровневой схемы инкапсуляции. Только если сетевая модель уже давно канони- пользуемые технологии применяются к одному физичесзирована, то схема вложенности уровней доступа к диско- кому дисковому устройству. Это не исключает в дальнейвым данным не имеет привычного вида, что допускает воль- шем использования дополнительных дисков, но задает боности в ее представлении. Итак, если все доступные в SuSE лее жесткие рамки вариантов выбора. Например, под MD Linux 10.0 технологии попытаться уложить в единую схему, в дальнейшем будет пониматься исключительно RAID1. отражающую их взаимосвязь и взаимодействие, то полуДиаграммы переходов чится нечто вроде изображенного на рис. 1. Прокомментирую эту схему. Хотя все аббревиатуры Для того чтобы определить ключевые, или, в нашей термии обозначения являются традиционными в Linux, расшиф- нологии, «дорогостоящие» технологические элементы, построим диаграмму переходов в процессе возможных настрорую их: ек от самого нижнего уровня DISK до самого верхнего NFS... DISK – физическое дисковое устройство; MD – так называемый multiple device или программный Полученная диаграмма представлена на рис. 2. Узлы соответствуют технологическим уровням предRAID; LVM – виртуальный диск по технологии Logical Volume ставления данных, а стрелки обозначают возможные направления в процессе настройки сервера. Нумерация узManager;
Иерархия уровней представления дисковых данных
№1, январь 2006
17
администрирование
Рисунок 2. Диаграмма настроек
щена файловая система – это условно возможная операция, так как на диске должно оставаться свободное место для таких манипуляций. Во-вторых, можно перевести используемый диск в статус RAID1 – это условно возможная операция, так как в случае наличия свободного места в файловой системе для размещения суперблока операцию можно провести «на лету». В-третьих, можно перевести файловую систему под управление LVM – эта операция проводится с потерей данных, так как LVM использует размещение суперблоков в теле рабочих разделов так, что не представляется возможным выделить для этого единое пространство. Ну и, наконец, можно отключить от используемой файловой системы сетевое блочное устройство – эта операция приводит только к отключению самого сервиса и ни к чему более серьезному. Таким образом, самая серьезная ситуация складывается вокруг переделок, требующих установки LVM. Если подключение RAID или переразметка диска могут быть проведены без резервного копирования всех данных в некоторых случаях, то помещение томов с данными под управление LVM потребует 100% сохранения всей задействованной информации. Здесь можно сделать вывод, что именно LVM является той критической технологией, решение об использовании которой надо принимать на самом раннем этапе планирования дисковых ресурсов.
Таблица операций
Рисунок 3. Диаграмма переделок
лов проставлена в порядке самого длинного маршрута настроек. Все очевидно и не нуждается в пояснениях. А вот теперь повернем стрелки в обратном направлении! Представим, что некий шаг настройки оказался ошибочным, но решение о его отмене пришло лишь в процессе эксплуатации, спустя некоторое время. Например, в процессе установки были последовательно пройдены этапы 1 DISK, 5 EXT3..., 6 NFS.... И спустя некоторое время появилась необходимость перевести работающую систему под LVM. То есть надо последовательно перевести сервер по диаграмме настроек 6 NFS..., 5 EXT3... и затем в узел 3 LVM. После чего снова в поступательном движении по диаграмме настроек вернуться в узел 6 NFS..., который соответствует полностью работоспособному серверу. Вторую диаграмму назовем диаграммой переделок. В ней все вектора изменили направление на противоположное, и рядом с каждым из них добавился комментарий, оценивающий стоимость переделки. Результат изображен на рис 3. Итак, все возможные стоимости переделок уложились в четыре градации: потеря сервиса, отключение сервиса, условно возможно, потеря данных. Например, рассмотрим возможные переделки для узла файловых систем EXT3... Во-первых, можно переразметить диск, на котором разме-
18
Попробуем поместить все данные из диаграмм в таблицу 1. Слева в столбце 1 – исходное состояние, сверху в ряду 1 – конечное, в ячейке на пересечении соответствующих состояний указана операция, переводящая начальное состояние в конечное. Таким образом, в ячейки левой нижней части таблицы, разделенной диагональю, попадут операции переделок и их стоимости, а в ячейки правой верхней части попадут операции настроек. Теперь в этой таблице голубым цветом по вертикали, то есть в целевых столбцах, выделим технологии, допускающие оперативное масштабирование, и салатным, также по вертикали, – те технологии, что позволяют организовать горячее резервирование по схеме RAID. Если исходить из условия, что необходимо обеспечить масштабирование емкостей в оперативном порядке, то выбор однозначен. Поскольку в предыдущем разделе уже был сделан вывод о том, что технология LVM единственная, которая требует решения о ее применении на самом раннем этапе, то можно сказать, выбор сделан – LVM непременно надо использовать. Далее, у нас два кандидата для возможного увеличения отказоустойчивости путем горячего резервирования. Безусловно, сравнивать RAID и сетевые блочные устройства просто некорректно. Но в рамках рассматриваемой модели мы не учитываем ничего, кроме возможности перенастроить нужный уровень представления данных и последствий такой перенастройки. И следуя этому принципу, получается, что создание сетевого блочного устройства на основе локального – это лишь запуск соответствующего сервиса, а переключение локально подмонтированного диска на сетевой режим работы без изменения его объема или размещения тоже не представляет особой проблемы. Итак,
администрирование Таблица 1. Операции и стоимости DISK
MD
LVM
DRB/iSCSI
EXT3...
Создание LVM и подключение
Запуск drbd/ iscsid
Разметка fs и монтирование
Создание LVM и подключение
Запуск drbd/ iscsid
Разметка fs и монтирование
Запуск drbd/ iscsid
Разметка fs и монтирование
DISK
Разбиение диска
MD
Условно возможна миграция MD на иной раздел диска
LVM
Условно возможна миграция PV
Условно возможно перемещение PV внутрь MD
DRB/iSCSI
Условно возможна миграция раздела DRB/iSCSI
Условно возможно перемещение раздела внутрь MD
Невозможно без полного резервного копирования
EXT3...
Условно возможна миграция FS
Условно возможно перемещение FS внутрь MD
Невозможно без полного резервного копирования
Создание MD и подключение
NFS...
Разметка fs и монтирование Отключение от сетевого блочного устройства
Запуск 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, будем самым неудобным в модификации, и поэтому самым «дорогим», считать MD. На этом этапе можно сформулировать первые принципы планирования дисковых ресурсов. Принцип 1. Следует, по возможности, переключить все размеченные разделы жесткого диска в режим работы программного RAID, пусть и неполного, что позволит в дальнейшем при необходимости перевести их в режим горячего резервирования. Принцип 2. Следует, по возможности, объединить все созданные физические тома под управлением LVM – для того, чтобы в дальнейшем, при необходимости, легко манипулировать объемом используемых логических томов. Обращаю внимание на уточнение «по возможности». Обсуждение этих «возможностей», а также все, что касается стратегии разбиения на разделы, оставим для второй части этой статьи. Сейчас просто учтем эту оговорку и просто попытаемся оценить эффект от следования заявленным выводам, как принципам планирования дисковых ресурсов.
Тестирование Да, именно так – тестирование. Нет ничего проще, чем оценить издержки использования этих, запасенных впрок, технологических изысков MD и LVM, путем проверки с помощью самого рядового теста файловой системы bonnie, проверяющего символьные и блочные операции чтения-записи, как повлияет на его результаты внесение соответствующих изменений в настройки. В тестовом компьютере было установлено 1 Гб оперативной памяти. Это не очень «удобный» объем, так как максимальный размер тестового файла в 32-битном режиме составляет 2 Гб, что несколько снижает точность измерений. И поэтому дополнительно были сделаны проверки в 64-битном режиме и с размером тестового файла в 4 Гб. Получен-
№1, январь 2006
ные результаты представлены в таблице 2. В самом левом столбце перечислены операции, на которых проводились измерения, а в самой верхней строке сокращениями обозначены условия тестирования. Опишем их по порядку: sda3 – проверка проводится на «чистом» разделе диска, размеченного под ext3; sda3,md3 – файловая система размечена поверх половинки «зеркала» RAID1; sda3,md3,lvm – раздел, использованный как половинка RAID1, помещен в LVM, и уже поверх него размечена файловая система ext3; sda3,md3,amd64 – случай 2, но в режиме 64 бита; sda3,md3,4096 – условия как в предыдущем 64-битном варианте, но с размером тестового файла в 4 Гб; sda2,md2 – случай 2, но со смещением к начальным областям диска. Результаты тестов показаны в Кб/сек. Рядом с ними рассчитаны индексы отклонений от средней величины, определенной по первым трем испытаниям. Для наглядности данные таблицы представлены в графическом виде в форме столбчатой диаграммы (см. рис. 4). Испытания с 1-го по 3-е определяют то, как влияет использование дополнительных уровней представления данных на скорость работы. Практически отклонения не превышают 5%. Совершенно понятно, что с увеличением числа «слоев» трансляции уровней представления немного подрастает скорость записи и немного снижается скорость чтения. Это объясняется тем, что при записи большее число программных драйверов создает большую массу кеширующих механизмов, и в сравнении с тестом на файле 4 Гб (колонка 5) видно, как увеличение размера в 2 раза довольно существенно снижает результаты по записи. А вот в процедуре чтения данных увеличение числа уровней представления лишь увеличивает цепочку запросов, если данные не сохранены в кеше, и, значит, немного снижает ско-
19
администрирование
Рисунок 4. Зависимость скорости доступа от разбиения и типа разметки
рость. Сравнение результатов тестирования, произведенного на другом разделе диска (колонка 6), с аналогичным по условиям (колонка 2) дает основания считать результаты последней достаточно достоверными, так как за небольшим исключением скорости обмена данными схожи. Здесь очень интересно отметить, что переход на 64-битную платформу показывает резкий прирост скорости символьного чтения. Вероятно, из-за более эффективного использования индексов в кеше. Безусловно, увеличение числа прогонов, изменение соотношения размера тестового файла к объему оперативной памяти и другие приемы, возможно, дали бы более стабильные результаты, но, скорее всего, общий уровень показателей не изменился бы существенно. Можно считать, что уровень отклонения не превысит 5% и в реальной работе. Поскольку, как видно по результатам, выигрыш в записи сопровождается потерями в чтении, то никакого существенного ухудшения работы системы такой тюнинг не принесет в общем случае. Как подтверждение правильности сделанных здесь выводов приведем тот факт, что RHEL (серверная версия Red Hat Linux) по умолчанию устанавливает все данные, кроме размещаемых в каталоге /boot, именно в раздел под управлением LVM. Даже swap помещается на раздел LVM для того, чтобы можно было в дальнейшем манипулировать его объемом. Иначе говоря, преимущества технологичности сопровождения создаваемого сервера с лихвой окупают трудноуловимые «жертвы» производительности. Теперь, уверившись в правильности предложенных выше принципов, попробуем применить их на практике.
Практический рецепт миграции на RAID1 Внимание! Используйте описанную ниже технологию на свой страх и риск. Автор не несет ответственности за возможные повреждения данных и настоятельно рекомендует выполнить процедуру резервного сохранения критически важной информации. Далее все описано применительно к SuSE 10.0. Не забудьте сделать поправку под актуальную платформу. Как было ранее заявлено, надо стремиться к переводу разделов под RAID и LVM с самого раннего этапа. При этом вовсе не обязательно, чтобы в системе было необходимое количество дисков для построения RAID или присутствовала сложная иерархия устройств, управляемая LVM. Вовсе нет! Все должно быть применимо даже к единственному жесткому диску. В отношении LVM проблем нет, даже если диск один. А вот RAID1, технологически работающий
20
даже на одном диске, в процессе инсталляции системы с использованием стандартных установщиков не удается так просто включить в работу. Для исправления этой проблемы применяются схемы с миграцией готовой системы с обычных разделов на второе дисковое устройство, как на половинку «зеркала». То есть возникает та самая аппаратная избыточность, которой мы стремились избежать. Но можно воспользоваться тем, что суперблок MD записывается в конец используемого раздела, и с точки зрения файловой системы структура раздела более не меняется. Таким образом, если на этапе установки разместить систему на некотором разделе, а потом уменьшить объем файловой системы так, чтобы в полученном «хвостике» уместился бы суперблок RAID1, то при такой трансформации данные никак не должны пострадать. Проверим это. В работе используем раздел /dev/sda3, размеченный как ext3, но можно использовать любую файловую систему, допускающую изменение размера. Все манипуляции надо производить над немонтированным разделом. Если трансформируется корневой раздел, то надо использовать или спасательный диск, или альтернативную загрузку. Итак, вот разметка диска до начала работ: # 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 /dev/sda1 /dev/sda2 /dev/sda3 *
Start 1 132 1378
End 131 1377 2683
Blocks 1052226 10008495 10490445
Id 82 fd 83
System Linux swap / Solaris Linux raid autodetect Linux
Внутри раздела уже создана файловая система. # fsck /dev/sda3 fsck 1.38 (30-Jun-2005) e2fsck 1.38 (30-Jun-2005) /dev/sda3: clean, 117054/1311552 files, 720522/2622611 blocks
По умолчанию использован блок с размером 4 Кб. Уточнить действительный размер можно с помощью утилиты dumpe2fs с ключом -h. Теперь есть возможность сразу рассчитать размер и положение суперблока MD, как указано в usr/include/linux/raid/md_p.h и уменьшить размер файловой системы соответственно. После подстановки в формулу для расчета переведем все числа, указанные в блоках, в шестнадцатеричные: Размер устройства MD = (размер физического устройства & ~ (размер суперблока -1) – размер суперблока = 2622611 & ~(15) -16 == 0x280493 & ~(0xF) – 0x10 = 0x280480 = 2622592 блоков. Полученное значение составит размер полученного диска MD. Начиная с указанного блока будет размещаться суперблок MD длиной 64 Кб. Но можно пойти по самому примитивному пути и заставить систему сообщить нужный размер, как мы и сделаем далее. Создадим RAID1 из раздела /dev/sda3. На предупреждение о том, что внутри уже найдена размеченная файловая система, не обращаем внимания – мы же знаем, что делаем! # mdadm -C /dev/md3 -l 1 -n 2 /dev/sda3 missing
администрирование И для того чтобы инициировать автоматическое детектирование RAID в процессе загрузки системы, поправим тип раздела (для краткости используем неинтерактивную форму):
mdadm: /dev/sda3 appears to contain an ext2fs file system size=10490444K mtime=Mon Jan 9 01:08:28 2006 Continue creating array? y mdadm: array /dev/md3 started.
Теперь проверим целостность файловой системы внутри полученного MD. Утилита должна указать на несоответствие размера раздела и размера файловой системы, после чего проверку следует прервать: # fsck /dev/md3
# fdisk /dev/sda <<EOT t 3 fd w EOT
Перечитаем таблицы разметки диска:
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 Either the superblock or the partition table is likely to be corrupt! Abort<y>? yes
# partprobe
fsck.ext3 /dev/md3 failed (status 0x8). Run manually!
Полученный из сообщения «физический» размер в 2622592 блока по 4 Кб, который, кстати сказать, совпадает с заранее рассчитанным, нужно будет использовать при коррекции размера файловой системы. Но предварительно выполним проверку файловой системы на /dev/sda3, так как иначе утилита resize2fs откажется работать.
Если обновленный раздел используется в качестве корневого, то есть его имя передается загрузчиком ядру, то надо поправить меню загрузки. В нашем случае /boot размещен на модифицируемом разделе. Здесь принимается без объяснений то, что следует использовать загрузчик grub. Обоснование этого, а также и многих других правил, оставим для второй части статьи. Итак, проводим такую же правку, как и с /etc/fstab: # perl -i.orig -p -e 's,/dev/sda3,/dev/md3,g' ↵ /boot/grub/menu.lst
# e2fsck -f /dev/sda3 e2fsck 1.38 (30-Jun-2005) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/sda3: 117054/1311552 files (0.5% non-contiguous), 720522/2622611 blocks
А вот теперь скорректируем размер самой системы: # 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
Для контроля снова проверим целостность файловой системы на /dev/md3: # e2fsck -f /dev/md3 e2fsck 1.38 (30-Jun-2005) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/md3: 117054/1311552 files (0.5% non-contiguous), 720522/2622592 blocks
Если эта система была корневой и/или использовалась в процессе загрузки, то надо внести дополнительные правки в содержимое файлов, управляющих загрузкой системы. Монтируем новый раздел: # mount /dev/md3 /mnt # mount | grep md3 /dev/md3 on /mnt type ext3 (rw)
Сначала исправим /etc/fstab, так как изменилось имя устройства, использованного для монтирования раздела: # perl -i.orig -p -e 's,/dev/sda3,/dev/md3,g' /mnt/etc/fstab # cat /mnt/etc/fstab | grep md3 /dev/md3
№1, январь 2006
/
ext3
acl,user_xattr
Теперь все готово к работе. Надо только не забыть, что initrd должен «понимать» тип нового раздела. И если это не так, то следует пересобрать initrd, указав в /etc/sysconfig/ kernel среди имен модулей в параметре INITRD_MODULES дополнительно raid1. Напоследок, если возникают трудности с загрузкой, то продемонстрируем протокол установки загрузчика из модифицированного раздела.
1 1
> > > >
root (hd0,2) setup (hd0) quit EOT
GNU GRUB version 0.96 (640K lower / 3072K upper memory) ... grub> root (hd0,2) Filesystem type is ext2fs, partition type 0xfd grub> setup (hd0) Checking if «/boot/grub/stage1» exists... yes Checking if «/boot/grub/stage2» exists... yes Checking if «/boot/grub/e2fs_stage1_5» exists... yes 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
Таким образом, была осуществлена трансформация «на лету». Условием ее успешного выполнения стало то, что в файловой системе было свободно не менее 2622611-2622592 = 19 блоков или 76 Кб. Для повторения этого «трюка» в другом Linux, не в SuSE, или с другим типом файловой системы надо обеспечить наличие необходимых для трансформации файловой системы утилит. Вопросы выбора типа файловой системы, способа распределения данных по разделам, организация процесса загрузки и многое другое, что осталось за рамками рассмотрения, будут освещены во второй части статьи.
21
администрирование
Почтовый сервер на основе реляционной СУБД. Оцените преимущества!
Евгений Прокопьев Большинство почтовых систем в качестве хранилища сообщений до сих пор используют различные текстовые форматы. Сегодня мы построим почтовый сервер на основе реляционной СУБД и посмотрим, какие преимущества нам это даст.
О
дним из малоизвестных, но очень эффективных инструментов для построения сложных и масштабируемых почтовых систем является DBMail – комплекс программ для UNIX-подобных систем, позволяющий использовать реляционные СУБД в качестве серверного хранилища почтовых сообщений вместо традиционных mbox, Maildir и прочих текстовых хранилищ. Используя DBMail, можно добиться: Более высокой производительности по сравнению с файловыми хранилищами – реляционные СУБД гораздо лучше приспособлены к обработке больших объемов структурированных данных, чем любой парсер текстовых файлов. Большей гибкости при обработке и анализе корреспонденции – возможности SQL опять-таки несоизмеримы с тем, что можно сделать, обрабатывая mbox или Maildir различными самописными скриптами на Perl/Python/Ruby для извлечения какой-либо статистики. При этом администратор почтовой системы может задействовать различные механизмы, предоставляемые СУБД (при условии, что выбранная им СУБД это позволяет), например:
22
Кластеризация – механизм, с по- в DBMail пока отсутствуют некоторые мощью которого можно разместить возможности более распространенСУБД на нескольких компьютерах ных и развитых почтовых систем (на(узлах кластера) с доступом к еди- пример, аутентификация с помощью SASL, встроенная поддержка SSL/TLS, ной БД. Репликация – возможность авто- механизм фильтрации почтовых сообматического переноса сообщений щений, аналогичный Sieve – это периз одной БД в другую, создания вое, что приходит в голову), но реаликонсолидированной БД из разных зовать их проще (и работы над реалиисточников и т. д. зацией многих недостающих возмож Фрагментирование – разделе- ностей ведутся), чем добавить описанние одной логической таблицы БД ные выше возможности к традиционна несколько физических для уп- ным почтовым системам. DBMail – продукт нидерландской рощения обслуживания, повышения производительности, сжатия компании IC&S, в котором также есть вк лад большого числа независиархивных данных и т. д. Отказоустойчивость и баланси- мых разработчиков из разных стран. ровка нагрузки с автоматичес- Он распространяется по лицензии GPL, ким переключением на резервный кроме того, IC&S предлагает платную поддержку. сервер при отказе основного. Резервное копирование – горячее (без необходимости останав- Архитектура ливать почтовый сервер, чтобы не В дальнейшем я предполагаю, что вы получить поврежденное хранили- знакомы с общими принципами постще сообщений) и инкременталь- роения почтовых систем, и термины ное (копирование изменений вмес- MTA, MDA и MUA вас не пугают. Если то копирования всего хранилища). это не так, то всю необходимую инфор Дополнительная логика обработ- мацию вы можете найти в моей статье ки почты, построенную на триг- «Круговорот почты в сети, или Архигерах, представлениях и т. д. тектура современных почтовых систем», опубликованной в предыдущем Похоже на голубую мечту сисадми- номере журнала. Принципиальная схена. Конечно, не все так замечательно: ма работы DBMail, которую нарисовал
администрирование чем указать можно только одну СУБД. В будущем планируется реализовать динамическую подгрузку модулей для работы с различными СУБД, описываемую в конфигурационном файле, – это должно упростить создание и поддержку пакетов 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 # ./configure –-with-pgsql (либо -–with-mysql) входят две категории MDA: # make Предназначенные для доставки сообщений от MTA # make install в хранилище. Предназначенные для доставки MUA из хранилища. Я использую ALT Linux и считаю этот способ приемлемым только на тестовых машинах, а для использования К первым относятся: на рабочих серверах предпочитаю собирать любое ПО, от dbmail-smtp – исполняемый файл, использующий pipe- сутствующее в дистрибутиве, в пакеты и помещать в собсинтерфейс: читает почтовое сообщение от MTA со стан- твенный репозитарий. Соответственно, установка DBMail дарного входа (stdin) и сохраняет его в БД. Таким обра- в этом случае сведется к: зом, на каждое входящее сообщение создается отде# apt-get install dbmail льный процесс UNIX и подключение к СУБД. 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 sqlsocket= и lib[rdms-name]dbmail. В настоящее время тип поддержиuser=dbmail ваемой СУБД жестко определяется на этапе ./configure, приpass=dbmailpwd
№1, январь 2006
23
администрирование db=dbmail postmaster=postmaster@mydomain.com trace_level=2 [SMTP] sendmail=/usr/sbin/sendmail auto_notify=no auto_reply=no trace_level=2 [LMTP] effective_user=mail effective_group=mail bindip=* port=24 nchildren=10 maxchildren=10 minsparechildren=2 maxsparechildren=4 maxconnects=10000 timeout=300 resolve_ip=yes trace_level=2 max_errors=500 [POP] effective_user=mail effective_group=mail bindip=* port=110 nchildren=10 maxchildren=10 minsparechildren=2 maxsparechildren=4 maxconnects=10000 timeout=300 resolve_ip=yes pop_before_smtp=no trace_level=2 [IMAP] effective_user=mail effective_group=mail bindip=* port=143 nchildren=10 maxchildren=10 minsparechildren=2 maxsparechildren=4 maxconnects=10000 timeout=4000 resolve_ip=yes imap_before_smtp=no trace_level=2
Небольшой комментарий к содержимому конфигурационного файла. Он состоит из следующих секций: DBMAIL – в ней описываются глобальные настройки, применимые ко всем сервисам DBMail (в основном это параметры подключения к БД). SMTP – здесь описываются параметры взаимодействия с MTA, которому DBMail передает почтовые сообщения для дальнейшей обработки. LMTP, POP3, IMAP – в этих секциях описываются настройки соответствующих демонов: на каких адресах и портах принимать подключения, под какой учетной записью работать, сколько дочерних процессов породить и т. д.
dbmail-smtp unix n n pipe flags= user=mail:mail argv=/usr/sbin/dbmail-smtp -d ${recipient} ↵ -r ${sender}
А затем задействовать этот транспорт в /etc/postfix/ main.cf: mailbox_transport = dbmail-smtp:
Описание транспорта LMTP будет выглядеть так: dbmail-lmtp
unix -
-
n
-
-
lmtp
Или так (если требуется большая детализация в логах): dbmail-lmtp
unix -
-
n
-
-
lmtp -v
Или так (если имена некоторых доменов назначения входящих почтовых сообщений не описаны в DNS): dbmail-lmtp unix -o disable_dns_lookups=yes
n
-
-
lmtp
Во всех этих случаях новый транспорт нужно будет задействовать следующим образом: mailbox_transport = dbmail-lmtp:localhost:24
Разумеется, можно задействовать доставку почтовых сообщений в хранилище DBMail только для определенных доменов, но это уже не имеет никакого отношения к DBMail и настраивается исключительно средствами Postfix. Кроме того, необходимо поставить Postfix в известность о тех почтовых ящиках, для которых он должен принимать сообщения. Создадим для этого файл /etc/postfix/dbmailmailboxes.cf со следующим содержимым: user = dbmail password = dbmailpwd hosts = localhost dbname = dbmail table = dbmail_aliases select_field = alias where_field = alias
И задействуем его в /etc/postfix/main.cf: local_recipient_maps = pgsql:/etc/postfix ↵ /dbmail-mailboxes.cf $alias_maps
Для того чтобы это работало, Postfix должен быть собран с поддержкой PostgreSQL. В Debian и ALT Linux (возможно, не только в них) поддержка PostgreSQL в Postfix вынесена в пакет postfix-pgsql, который необходимо доустановить, если он еще не установлен. Пример конфигурационного файла, поставляемого Пользователи прочих дистрибутивов Linux или друв комплекте с DBMail, содержит поясняющие комментарии гих UNIX-систем, в которых Postfix собран без поддедля большинства настраиваемых параметров. ржки PostgreSQL, либо вообще отсутствует, могут перед Теперь необходимо настроить механизм взаимодейс- компиляцией включить его самостоятельно, указав ключ твия с Postfix. Как уже было сказано, таких механизмов -DHAS_PGSQL и пути к соответствующим заголовкам и бибдва: pipe-интерфейс и LMTP. лиотекам: В первом случае потребуется в файле /etc/postfix/master. # make tidy cf описать следующий транспорт:
24
администрирование # make -f Makefile.init makefiles \ 'CCARGS=-DHAS_PGSQL -I/usr/local/include/pgsql' \ 'AUXLIBS=-L/usr/local/lib -lpq' # make
Наконец, последний штрих – ежедневные плановые работы по очистке БД от удаленных записей и проверке корректности БД. Их будет выполнять файл /etc/cron.daily/ dbmail-clean со следующим содержимым: #!/bin/sh /usr/sbin/dbmail-util -cturpd -l 24h -qq
Теперь можно запустить демоны dbmail-lmtpd (в том случае, если для доставки мы планируем использовать LMTP), dbmail-imapd и dbmail-pop3d (можно запустить только тот, который будет использоваться для извлечения почты из хранилища, если он будет один). В пакет для ALT Linux включены соответствующие стартовые скрипты, которые могут быть вызваны вручную с помощью service или настроены на автоматическое выполнение при загрузке с помощью chkconfig/ntsysv. Если для вашей ОС или вашего дистрибутива Linux таких скриптов нет, вам придется настроить автозапуск вручную. На этом настройку связки Postfix + DBMail + PostgreSQL можно считать законченной. Создадим тестового пользователя почтовой системы следующим образом: # 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 clientid 0... Ok, user added id [3] Adding INBOX for new user Ok. added [test@mydomain.com] Done
В этом примере с помощью параметра -a указывается имя пользователя, с помощью -w – пароль, а с помощью -s – почтовый ящик, принадлежащий пользователю (у одного пользователя их может быть несколько). Отправим созданному пользователю тестовое письмо: # echo hello | mail -s «Test Message» test@mydomain.com
В логах мы должны увидеть нечто вроде: postfix/qmgr[29149]: 432B01774F: from=<john@mydomain.com>, size=301, nrcpt=1 (queue active) dbmail/lmtpd[29359]: serverchild.c,PerformChildTask: incoming connection from [127.0.0.1 (localhost.localdomain)] dbmail/lmtpd[29359]: db.c, db_get_mailbox_from_filters: default mailbox [(null)] dbmail/lmtpd[29359]: sort.c, sort_and_deliver: message id=4, size=333 is inserted postfix/lmtp[29710]: 432B01774F: to=<test@mydomain.com>, orig_to=<test>, relay=localhost[127.0.0.1], delay=1341, status=sent (215 Recipient <test@mydomain.com> OK) postfix/qmgr[29149]: 432B01774F: removed
Это значит, что письмо успешно доставлено. Попытаемся получить его по протоколу POP3, чтобы удостовериться в том, что это действительно так:
№1, январь 2006
# telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is ‘^]’. +OK DBMAIL pop3 server ready to rock <3b1d246c241825db052940bc65a 6a39b@mydomain.com> user test +OK Password required for test pass testpwd +OK test has 1 messages (355 octets) stat +OK 1 355 list +OK 1 messages (355 octets) 1 355 . retr 1 +OK 355 octets Return-Path: john@mydomain.com Received: by mydomain.com (Postfix, from userid 502) id 7E8E617762; Sun, 20 Nov 2005 15:03:04 +0300 (MSK) To: test@mydomain.com Subject: Test Message Message-Id: <20051120120304.7E8E617762@mydomain.com> Date: Sun, 20 Nov 2005 15:03:04 +0300 (MSK) From: john@mydomain.com hello . dele 1 +OK message 1 deleted quit +OK see ya later Connection closed by foreign host.
Итак, DBMail настроен и в первом приближении работает именно так, как нам нужно.
Внутреннее устройство хранилища DBMail После удачного запуска DBMail имеет смысл взглянуть на устройство его хранилища более внимательно. Уже знакомый нам по «DBMail big picture» Wolfram A. Kraushaar нарисовал ER (Entity-Relationship) модель БД DBMail, смотрите рис. 2. Теперь краткое пояснение. Центральной таблицей является dbmail_users, в которой хранится вся информация о пользователях: их имена, пароли, текущий и максимальный размер всех почтовых ящиков, а также дата и время последнего подключения. Каждому пользователю могут соответствовать один или несколько почтовых адресов из таблицы dbmail_aliases. Впрочем, с помощью алиасов в DBMail можно также пересылать сообщения другим адресатам или передавать внешним программам на стандартный вход (stdin) для дальнейшей обработки. Каждому пользователю принадлежит один или несколько почтовых ящиков (каталогов IMAP) из таблицы dbmail_mailboxes, по умолчанию доставка осуществляется в ящик по имени INBOX. Кроме владельца, с ящиком могут работать и другие пользователи (такие ящики называются shared folders) – они описаны в таблице dbmail_ subscription, соответствующие права доступа описаны в таблице dbmail_acl. В каждом ящике хранятся сообщения, IMAPфлаги сообщений находятся в таблице dbmail_messages, а содержимое сообщений разбивается на блоки не больше 512 Кб и располагается в таблице dbmail_messageblks – каждый блок в отдельной записи. Для увеличения производительности размер и дата получения сообщения выне-
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_auto_replies и dbmail_auto_notifications используются для автоматической отправки ответов и уведомлений, а таблица dbmail_pbsp – для POP/IMAP-before-SMTP (механизма, аналогичного SMTP-авторизации, но менее распространенного и менее надежного). Довольно неудобным обстоятельством является то, что все заголовки каждого сообщения целиком хранятся в одной строке таблицы dbmail_messageblks – у таких строк значение поля is_header = 1. В нестабильной версии DBMail заголовки вынесены в отдельную таблицу, и для каждого выделена собственная запись. Однако вместо того чтобы ждать выхода новой ветки DBMail или использовать нестабильную, мы можем реализовать эту функциональность самостоятельно средствами PostgreSQL. Воспользуемся тем, что PostgreSQL позволяет создавать функции на языке PL/Python и богатыми возможностями Python в области обработки почтовых сообщений (разумеется, этот выбор субъективен: желающие могут реализовать аналогичную функциональность на PL/PgSQL, PL/Perl, PL/Tcl или даже на С). Сначала включим поддержку PL/Python для выбранной БД: # createlang -U dbmail plpythonu dbmail
Для того чтобы эта команда выполнилась, PostgreSQL необходимо собрать с поддержкой PL/Python. В ALT Linux поддержка PL/Python вынесена в пакет postgresql-python, который необходимо доустановить, если он еще не уста-
26
Для того чтобы оценить возможности этого механизма, у нас слишком маленькая БД. Конечно, можно написать скрипт, генерирующий множество почтовых сообщений, но мы поступим иначе. Допустим, что у нас уже есть архив списка рассылки DBMail-Users в формате Maildir. С помощью MUA создадим IMAP-каталог, а затем с помощью скрипта mailbox2dbmail импортируем в него все сообщения из архива: # /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 ... Processed Message 558 All Done!
Теперь можно провести анализ содержимого IMAP-каталога: # psql -U dbmail dbmail dbmail=# select user_idnr, userid from dbmail_users; user_idnr | userid -----------+-------------------------------1 | __@!internal_delivery_user!@__ 2 | anyone 3 | test (записей: 3)
dbmail=# select mailbox_idnr, owner_idnr, ↵ name from dbmail_mailboxes where owner_idnr = 3; mailbox_idnr | owner_idnr | name --------------+------------+-------------------1 | 3 | INBOX 3 | 3 | Trash 4 | 3 | INBOX/DBMail-Users (записей: 3)
администрирование dbmail=# select mailheader(messageblk, 'User-Agent'), ↵ count(*) dbmail=# from dbmail_messages inner join ↵ dbmail_messageblks dbmail-# on dbmail_messages.physmessage_id = ↵ dbmail_messageblks.physmessage_id dbmail-# where mailbox_idnr = 4 and is_header = 1 dbmail-# group by 1 dbmail-# order by 2 desc; mailheader | count ---------------------------------------------------------------------+-----| 194 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 Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.7.2) Gecko/20040808 | 15 Mozilla Thunderbird 1.0.6 (X11/20050716) | 12 Mozilla Thunderbird 1.0 (X11/20041206) | 11 Mozilla Thunderbird 1.0.7 (X11/20051014) | 9 Mozilla Thunderbird 1.0.7 (Windows/20050923) | 9 Debian Thunderbird 1.0.2 (X11/20050331) | 8 Mozilla Thunderbird 1.0 (Windows/20041206) | 8 SquirrelMail/1.4.4 | 7 Mozilla Thunderbird 1.0.6 (Macintosh/20050716) | 7 Debian Thunderbird 1.0.7 (X11/20051017) | 6 Opera M2/8.50 (Win32, build 7700) | 6 Mozilla Thunderbird 1.0.7 (X11/20051010) | 5 KMail/1.8.2 | 4 Thunderbird 1.4 (Windows/20050908) | 4 Mozilla Thunderbird 1.0.5 (Windows/20050711) | 3 Mozilla Thunderbird 1.0.7 (X11/20051013) | 2 Thunderbird 1.5 (Windows/20051025) | 2 SquirrelMail/1.5.1 [CVS] | 2 SquirrelMail/1.4.5 | 2 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 Mozilla Thunderbird 1.0.6 (X11/20050826) | 2 SquirrelMail/1.4.3a | 1 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 Mozilla Thunderbird 1.0.7 (Macintosh/20050923) | 1 Microsoft-Entourage/11.1.0.040913 | 1 Mozilla Thunderbird 1.0.7 (X11/20051017) | 1 Mozilla Thunderbird 1.0.6-1.4.1.centos4 (X11/20050721) | 1 Mozilla Thunderbird 1.0.7 (X11/20050923) | 1 Mozilla Thunderbird 1.0 (X11/20041207) | 1 Microsoft-Entourage/11.2.1.051004 | 1 (записей: 39)
Итак, мы получили распределение сообщений в списке рассылки по MUA (точнее, по заголовку User-Agent). Запрос выполнился не слишком быстро, что и не удивительно: для каждой строки пришлось вызывать функцию разбора содержимого. Чтобы уменьшить время выполнения, можно создать триггер на вставку записей с сообщениями и сохранять результаты mailheader в отдельную проиндексированную таблицу. Тем самым за счет уменьшения времени анализа сообщений мы получим увеличение времени, затрачиваемого на добавление сообщений, – что важнее, решать администратору почтовой системы. Впрочем, здесь из области администрирования почтового сервера мы переходим в область администрирования баз данных вообще и администрирования PostgreSQL в частности – последнему посвящен цикл статей Сергея Супрунова, уже публиковавшийся в нашем журнале.
Shared folders Трудно представить себе полноценный IMAP-сервер без поддержки механизма shared folders, обеспечивающего совместный доступ различных пользователей к общим каталогам с сообщениями. В DBMail поддерживаются: Системные общие каталоги в пространстве имен #Public – настраиваются администратором почтового сервера.
№1, январь 2006
Личные общие каталоги в пространстве имен #Users – настраиваются как администратором, так и владельцами каталогов средствами MUA (при условии, что MUA поддерживают эту функциональность). Как мы уже выяснили, универсальный инструмент администратора DBMail – это SQL-консоль выбранной им СУБД. Создадим системный общий каталог News и предоставим доступ к нему пользователю test с помощью этого инструмента. Сначала необходимо создать пользователя с именем __public__. Мы уже создавали пользователя test с помощью dbmail-users, сделаем теперь то же самое средствами SQL: # psql -U dbmail dbmail dbmail=# insert into dbmail_users (userid, passwd) dbmail-# values ('__public__', 'abracadabra'); INSERT 0 1
dbmail=# select user_idnr from dbmail_users where ↵ userid='__public__';
user_idnr ----------5 (1 запись)
Теперь создадим каталог News, владельцем которого будет пользователь __public__: # psql -U dbmail dbmail dbmail=# insert into dbmail_mailboxes dbmail=# (owner_idnr, name, seen_flag, answered_flag, ↵ deleted_flag, flagged_flag, dbmail=# recent_flag, draft_flag, no_inferiors, ↵ no_select, permission) dbmail-# values (5, 'News', 1, 1, 1, 1, 1, 1, 0, 0, 2); INSERT 0 1
dbmail=# select mailbox_idnr from dbmail_mailboxes ↵ where name='News'; mailbox_idnr -------------7 (1 запись)
А теперь опишем права доступа для пользователя test к этому каталогу: # psql -U dbmail dbmail dbmail=# select user_idnr from dbmail_users ↵ where userid='test';
user_idnr ----------3 (1 запись)
dbmail=# insert into dbmail_acl dbmail=# (user_id, mailbox_id, lookup_flag, read_flag, ↵ seen_flag, write_flag, dbmail=# insert_flag, post_flag, create_flag, delete_flag, ↵ administer_flag) dbmail-# values (3, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1); INSERT 0 1
Все, пользователю test осталось только подписаться на каталог #Public/News средствами своего MUA. Впрочем, и это тоже можно выполнить средствами SQL:
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
Возможности перенаправления почты Мы не станем рассматривать эти возможности так же детально, как и shared folders, т.к. общий принцип администрирования DBMail уже понятен. Упомянем только таблицы, принимающие участие в перенаправлении почты: dbmail_aliases – в этой таблице каждому почтовому адресу (или нескольким адресам) можно поставить в соответствие один или несколько идентификаторов пользователей, уже заведенных в DBMail, произвольных адресов и внешних программ, которые получат сообщение на stdin. Перед именем программы должен быть символ «|» (в этом случае программа получит сообщение в необработанном виде) или «!» (к сообщению будет добавлен mbox-заголовок). Вместо непосредственного редактирования таблицы можно также использовать утилиту dbmail-users (Примечание: примерно то же самое можно сделать средствами MTA, но не всегда. Postfix, например, обрабатывает собственную таблицу алиасов только в том случае, если в доставке принимает участие его собственный MDA local. Это не самый эффективный способ доставки, и при настройке DBMail во многих случаях предпочтительнее использовать LMTP). dbmail_auto_notifications – в этой таблице для каждого пользователя DBMail можно указать несколько адресов, на которые придут уведомления о получении пользователем сообщения. По умолчанию такая функциональность отключена, чтобы ее включить, необходимо в файле /etc/dbmail.conf в секции SMTP исправить значение параметра auto_notify с no на yes. dbmail_auto_replies – в этой таблице для каждого пользователя DBMail можно указать текст сообщения для автоматического ответа на все приходящие сообщения. По умолчанию такая функциональность также отключена, и чтобы ее включить, необходимо в файле /etc/dbmail.conf в секции SMTP исправить значение параметра auto_reply с no на yes. Использование описанных механизмов требует аккуратного подхода, иначе очень легко получить зацикливание почты. Так я по невнимательности указал для почтового пользователя в качестве адреса для уведомлений один из его же алиасов. После этого вместо одного письма пользователь
28
Рисунок 3. DbMail Administrator
получил около 500 сообщений в течение нескольких секунд на машине с довольно скромной аппаратной конфигурацией. Прекращать это безобразие пришлось вручную с помощью инструмента postsuper из комплекта Postfix.
Прочие возможности DBMail К числу прочих возможностей почтового сервера, часто востребованных администраторами, относятся: Квоты на размер почтового ящика – поддерживаются в DBMail непосредственно: максимальный размер ящика можно указать как при вызове утилиты dbmail-users ключом -m, так и изменив значение поля maxmail_size в таблице dbmail_users. SMTP-авторизация – вообще-то это задача MTA, но поскольку в DBMail уже хранится соответствие имен пользователей и их паролей, есть смысл настроить SASL на использование этой информации. POP/IMAP before SMTP – это альтернатива SMTP-авторизации, которая опирается на использование таблицы dbmail_pbsp и должна быть включена в /etc/dbmail.conf параметрами pop_before-smtp/imap_before_smtp. SSL/TLS – DBMail не поддерживает этот механизм непосредственно, но есть возможность организовать прозрачный с точки зрения клиентов SSL-доступ с помощью внешнего ПО, например, stunnel – работа с этим инструментом подробно рассматривалась в цикле статей Андрея Бешкова. Фильтрация почтовых сообщений на основании их содержимого – эту задачу и способы ее решения мы обсудим позже. Кроме того, DBMail не обошелся без GUI-конфигуратора DbMail Administrator (DBMA), написанного на Perl и ориентированного на веб. Он доступен на http://library.mobrien.com/ dbmailadministrator и выглядит так (см. рис. 3). Есть еще один веб-интерфейс к DBMail – swiftMail (http:// www.obfuscatedcode.com/swiftmail/trac), написанный на PHP. Его можно было бы отнести к классу webmail-приложений, если бы не одна особенность: для чтения почты используется не POP3/IMAP, а прямой доступ к БД DBMail. В настоящее время доступна альфа-версия swiftMail, поддерживающая только MySQL. Поддержка PostgreSQL обещается в ближайшем будущем.
администрирование Таблица 1. Способы фильтрации почтовых сообщений средствами DBMail Способ
Преимущества
Недостатки
Использование традиционных MDA
Простота, привычность
Теряются все преимущества DBMail в производительности. Кроме того, все пользователи в DBMail – виртуальные, а не системные, т.е. появляются проблемы с разделением доступа к фильтрам
Использование фильтров MTA + RFC3589
Приемлемая производительность
Необходимо отслеживать побочные эффекты при написании фильтров MTA, писать фильтры труднее, чем правила для procmail и maildrop. Аналогичные проблемы с разделением доступа к фильтрам
Использование триггеров
Высокая производительность, возможность хранить фильтры в таблице БД и легко разделить доступ к ним с помощью представлений
Во всех СУБД поддержка триггеров существенно отличается – придется либо ограничиться поддержкой одной СУБД, либо поддерживать несколько реализаций одной и той же функциональности для каждой СУБД. В текущей стабильной версии DBMail на каждый заголовок письма не выделяется отдельной записи, т.е. заголовки не очень удобно анализировать – хотя в случае использования PostgreSQL эту проблему мы уже решили
Написание собственного патча
Переносимость между различными СУБД, высокая производительность, возможность хранить фильтры в таблице БД и разделить доступ к ним, простота анализа заголовков (это стало ясно только после изучения исходного кода)
Необходимо изучение исходного кода DBMail, возможно внесение ошибок в код
Фильтрация почтовых сообщений средствами DBMail Общеизвестным преимуществом IMAP является то, что почтовый пользователь может работать со своей и общей корреспонденцией с разных рабочих мест с помощью совершенно различных MUA: как традиционных, так и ориентированных на веб. Это означает, что правила, в соответствии с которыми сообщения распределяются по каталогам IMAP, должны определяться не на уровне MUA, а на уровне MDA. В настоящее время в DBMail отсутствуют штатные способы решения этой задачи. В будущих версиях планируется использование специализированного языка программирования для фильтрации почтовых сообщений Sieve (описан в RFC 3028, активно используется в Cyrus IMAP), код поддержки Sieve даже есть в текущей стабильной версии, но он не завершен и недостаточно протестирован, поэтому при компиляции по умолчанию поддержка Sieve отключена. Кроме того, для большинства случаев Sieve является слишком мощным инструментом. Сформулируем, что нам требуется от простейшего механизма фильтрации почтовых сообщений: Каждый пользователь может задать собственный список фильтров и назначить их приоритеты. Фильтр представляет из себя соответствие названия заголовка письма и его значения IMAP-каталогу, в который должно попасть письмо. Письмо попадает в каталог, если значение заголовка в письме содержит в себе значение заголовка в фильтре. А теперь перечислим те способы решения задачи, которые пришли мне в голову: Использование традиционных MDA (procmail, maildrop) и dbmail-smtp. Использование фильтров MTA и патча для поддержки RFC 3589 (Sieve Email Filtering – Subaddress Extension: user+folder@server) в dbmail-lmtpd. Патч можно взять здесь – http://www.dbmail.org/mantis/bug_view_advanced_ page.php?bug_id=0000057. Использование средств СУБД (триггеров) для модификации записей, соответствующих сообщению, в БД. Написание собственного патча.
№1, январь 2006
Сравним их (см. таблицу 1). После недолгих раздумий выбор был сделан в пользу последнего варианта. Самым трудным оказалось не реализовать нужную функциональность, а найти место в коде, куда ее необходимо вставить, не нарушив при этом работоспособности всего остального. Решение задачи сильно упростило то, что в DBMail хорошо организовано ведение логов. Для каждого демона в конфигурационном файле можно задать уровень отладки (параметр trace_level), определяющий степень детализации выводимых отладочных сообщений. При максимальном уровне отладки (trace_level=5 в секции LMTP) во время доставки сообщения в логах можно увидеть очень много сообщений, но наиболее интересным является следующий фрагмент: 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] dbmail/lmtpd[5327]: dbpgsql.c,db_query: executing query [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 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 [UPDATE dbmail_users SET curmail_size = curmail_size + '363' WHERE user_idnr = '7'] dbmail/lmtpd[5327]: sort.c, sort_and_deliver: message id=12, size=363 is inserted dbmail/lmtpd[5327]: pipe.c, insert_messages: successful sort_and_ deliver for useridnr [7]
Похоже, что именно здесь и происходит сохранение сообщения. Код, выводящий это сообщение, выглядит так: trace(TRACE_DEBUG, "%s, %s: calling sort_and_deliver for useridnr [%llu]", __FILE__, __func__, useridnr);
29
администрирование dsn_result = sort_and_deliver(tmpmsgidnr, msgsize, ↵ useridnr, delivery->mailbox);
struct element *el = list_getstart(headerfields); char *filter_field = db_get_result(i, 0); char *filter_value = db_get_result(i, 1); char *mailbox = db_get_result(i, 2);
Можно заглянуть в реализацию sort_and_deliver и найти там подтверждение догадки. В delivery->mailbox по умолчанию передается [null]. Таким образом, задача сводится к тому, чтобы, проанализировав заголовки сообщения, передать в delivery->mailbox имя каталога IMAP. Заголовки сообщения функция insert_messages получает в виде структуры headerfields. После того как исходные данные для определения каталога назначения и параметр, в который нужно передать имя каталога, определены, можно реализовать функцию, которая и будет выполнять эту задачу. Вызов функции будет выглядеть так:
trace(TRACE_MESSAGE, "%s, %s: processing filter [%s : ↵ \"%s\" => %s]", __FILE__, __func__, filter_field, ↵ filter_value, mailbox); while (el) { struct mime_record *record = ↵ (struct mime_record *) el->data; trace(TRACE_MESSAGE, "%s, %s: processing header ↵ [%s : \"%s\"]", __FILE__, __func__, ↵ record->field, ↵ record->value); if (!strcmp(record->field, filter_field) && ↵ strstr(record->value, ↵ filter_value)) {
trace(TRACE_DEBUG, "%s, %s: calling sort_and_deliver for useridnr [%llu]", __FILE__, __func__, useridnr); dsn_result = sort_and_deliver(tmpmsgidnr, msgsize, ↵ useridnr, db_get_mailbox_from_filters(useridnr, ↵ headerfields, delivery->mailbox));
trace(TRACE_MESSAGE, "%s, %s: header [%s : ↵ \"%s\"] accept filter ↵ [%s : \"%s\" => %s]", __FILE__, __func__, ↵ record->field, ↵ record->value, ↵ filter_field, ↵ filter_value, ↵ mailbox);
Прототип функции, который мы поместим в db.h: char *db_get_mailbox_from_filters(u64_t useridnr, ↵ struct list *headerfields, const char *mailbox);
При реализации функции необходимо использовать следующую таблицу:
}
CREATE TABLE dbmail_filters ( user_id INT8 REFERENCES dbmail_users(user_idnr) ↵ ON DELETE CASCADE ON UPDATE CASCADE, filter_id INT8, filter_field varchar(128) NOT NULL, filter_value varchar(255) NOT NULL, mailbox varchar(100) NOT NULL, PRIMARY KEY (user_id, filter_id) ); CREATE INDEX dbmail_user_id_idx ON dbmail_filters(user_id); CREATE INDEX dbmail_filter_id_idx ON dbmail_filters(filter_id);
В качестве образца чтения таблицы из БД можно использовать функцию db_get_users_from_clientid из db.c. В результате реализация функции db_get_mailbox_from_filters в файле 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; unsigned num_filters = 0; snprintf(query, DEF_QUERYSIZE, "SELECT filter_field, filter_value, mailbox ↵ FROM dbmail_filters WHERE user_id = '%llu' ↵ ORDER BY filter_id", useridnr); if (db_query(query) == -1) { trace(TRACE_ERROR, "%s,%s: error gettings filters for " "user_id [%llu]", __FILE__, __func__, useridnr); return NULL; } num_filters = db_num_rows(); for (i = 0; i < num_filters; i++) {
30
}
}
return mailbox;
el = el->nextnode;
trace(TRACE_MESSAGE, "%s, %s: no header accept filter ↵ [%s : \"%s\" => %s]", __FILE__, __func__, filter_field, ↵ filter_value, mailbox);
db_free_result(); return NULL;
} else { }
}
return mailbox;
После внесения изменений в код, перекомпиляции, создания таблицы фильтров в БД и ее заполнения новый механизм фильтрации был тщательно протестирован. Ошибок выявлено не было. Фрагмент лога, в котором виден процесс анализа заголовков почтового сообщения, теперь выглядит так: dbmail/lmtpd[5329]: pipe.c, insert_messages: temporary msgidnr is [13] dbmail/lmtpd[5329]: pipe.c, insert_messages: calling sort_and_deliver for useridnr [7] dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters: default mailbox [(null)] dbmail/lmtpd[5329]: dbpgsql.c,db_query: executing query [SELECT filter_field, filter_value, mailbox FROM dbmail_filters WHERE user_id = '7' ORDER BY filter_id] dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters: processing filter [Subject : "Test" => MyFolder] dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters: processing header [From : "test@mydomain.com"] dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters: processing header [Date : "Mon, 24 Oct 2005 10:42:25 +0400 (MSD)"] dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters: processing header [Message-Id : "<20051024064225.588B73BED@mydomain.com>"] dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters:
администрирование processing header [Subject : "Test Message"] dbmail/lmtpd[5329]: db.c, db_get_mailbox_from_filters: header [Subject : "Test Message"] accept filter [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'] 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, 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’)] 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 dbmail/lmtpd[5329]: 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 = '13'] 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')] 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!@__ dbmail/lmtpd[5329]: dbpgsql.c,db_query: executing query [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=# select * from dbmail_filters;
user_id | filter_id | filter_field | filter_value | mailbox ---------+-----------+--------------+--------------+---------6 | 0 | Subject | Test | MyFolder (1 запись)
Изменения были оформлены как .diff (с помощью утилиты gendiff – после этого они могут быть использованы утилитой patch для автоматического внесения изменений в оригинальный исходный код) и отправлены в списки рассылки пользователей и разработчиков DBMail. По согласованию с лидером проекта эти изменения не внесены в основную стабильную ветку, но патч включен в архив с кодом, и пакет DBMail для Debian Linux собран с этим патчем (т.к. лидер проекта по совместительству еще и мантейнер этого пакета в Debian). Пакет DBMail для ALT Linux также собран с этим патчем. Пользователи прочих дистрибутивов Linux или других UNIX-систем могут собрать DBMail с ним самостоятельно. Разумеется, патч не идеален, и в будущем, может быть, придется усовершенствовать его, добавив: использование регулярных выражений POSIX вместо простого поиска подстроки; кэширование содержимого таблицы фильтров, чтобы не выполнять SQL-запрос при анализе каждого сообщения;
№1, январь 2006
использование нескольких критериев, объединенных с помощью операций AND и OR, в одном фильтре;
дополнительные функции обработки сообщений (например, обработка сообщений внешними программами по pipe-интерфейсу).
Итоги Проекту DBMail придется пройти еще долгий путь, чтобы заслужить признание и получить такую же популярность, как, например, Courier IMAP или Cyrus IMAP. Но уже сейчас видно, что его потенциальные возможности очень широки. В будущих версиях планируется реализовать следующее (часть уже реализована в версии 2.1.3): Использование LDAP для аутентификации – это уже поддерживается ведущими POP3/IMAP-серверами и очень удобно для ведения единой БД пользователей, единой адресной книги и т. д. Организация пользователей в группы – поможет упростить управление пользователями и раздавать полномочия не отдельным пользователям, а целым группам. Хранение разных заголовков и вложений отдельно – позволит значительно упростить анализ корреспонденции посредством написания SQL-запросов. Примерно то же самое мы сегодня реализовали самостоятельно, но только для PostgreSQL. Sieve – как средство фильтрации почтовых сообщений, очень примитивный аналог которого мы также сегодня реализовали. Индивидуальные черные списки и фильтры для пользователей – позволят пользователям самостоятельно указывать, письма от кого им не хотелось бы читать. Графические средства администрирования – пока многие возможности DBMail можно задействовать только путем внесения исправлений в БД– с помощью написания SQL-инструкций (хотя DbMail Administrator решает большинство проблем такого рода). Средства администрирования по протоколам XMLRPC/SOAP – основные настройки DBMail хранятся не в БД, а в файле /etc/dbmail.conf (например, там указывается имя БД и логин/пароль для доступа к ней). К этим настройкам, а также к настройкам, хранящимся в БД, было бы очень удобно иметь унифицированный доступ. Посмотрим, что ожидает DBMail в будущем.
Литература, ссылки: 1. http://dbmail.org/dokuwiki/doku.php. 2. Бешков А. Защита сетевых сервисов с помощью stunnel (1-3 части). – Журанал «Системный администратор», №12, 2004 г., №1, 2005 г., №3, 2005 г. 3. Супрунов С. PostgreSQL: первые шаги. Журнал «Системный администратор», №7, 2004 г. – 26-33 с. 4. Супрунов С. PostgreSQL: функции и триггеры. – Журнал «Системный администратор», №10, 2004 г. – 42-47 с. 5. Супрунов С. PostgreSQL 8.0: новые возможности. – Журнал «Системный администратор», №3, 2005 г. – 7 с.
31
администрирование
Штопаем дыры в Ilohamail Доверяй, но проверяй (народная мудрость)
Сергей Супрунов Доступ к электронной почте через веб-интерфейс обеспечивает дополнительные удобства. Однако мы не всегда задумываемся о потенциальных проблемах безопасности, а ведь даже такой безобидный пакет, как Ilohamail имеет несколько неприятных дыр.
Знакомство с Ilohamail Ilohamail – это разработанный на PHP4 пакет, обеспечивающий возможность работать с POP3- и IMAP-серверами непосредственно с интернетстраницы. Во FreeBSD вы найдете его в коллекции портов (mail/ilohamail), для Linux можете скачать исходные коды, rpm- или deb-пакет, со страни-
32
цы проекта (http://ilohamail.org/main. php?page=Downloads, см. также http:// sourceforge.net/projects/ilohamail). Отличительной особенностью этой программы от многих других (наподобие OpenWebMail) является то, что она не использует для работы небезопасных методов, таких как suexec или suidperl. В данном случае доступ к почто-
вому ящику осуществляется по протоколу POP3 или IMAP (в зависимости от выбора пользователя, сделанного во время аутентификации, или конфигурационных параметров), и все сценарии исполняются от имени пользователя, с чьими правами работает вебсервер (для Apache это, как правило, пользователь www).
администрирование Установка по крайней мере на на, и разобраться при необходимости Нужно заметить, что в 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 не столь зуемый по умолчанию язык интерфей- ет по тому же принципу, разработан тоже актуальны. на PHP, и ему присущи некоторые из опиОднако пользовательские данные поса ($default_lang). прежнему хранятся (по умолчанию) в деВы можете подстроить в других санных проблем. Наиболее заметные отличия от Ilohamail реве веб-сайта, так что перенос каталофайлах в каталоге conf еще некоторые параметры. Однако если возникнет же- в этом плане – для всех файлов, включая га database за его пределы также крайлание внести более серьезные измене- конфигурационные, используется расши- не желателен (новый путь прописываетния в интерфейс (например, добавить рение php, что при правильной настройке ся в параметре $temporary_directory файна стартовую страницу свой логотип), веб-сервера должно уберечь от чтения их ла inc/config.php). Ну и если вас беспокоит репутация вато придется заняться непосредствен- содержимого через обычный http-запрос. ной правкой php-файлов. Впрочем, К тому же здесь не предусмотрена возмож- шей компании, то логотип на странице ауструктура пакета не слишком слож- ность использовать произвольный POP3- тентификации тоже придется сменить…
№1, январь 2006
33
администрирование
Рисунок 1. Ilohamail с более приятным цветом фона
теля и пароль для доступа к почтовому серверу). Тем не менее даже такая информация, как любимый цвет человека, может рассматриваться как конфиденциальная (особенно если он использует это в «секретном вопросе» в какой-нибудь системе напоминания паролей). Однако чтобы не искушать судьбу, лучше вынести каталог data за пределы иерархии каталогов, доступных вебсерверу (например, /var/db/ilohamail выглядит подходящим местом). Обеспечьте пользователю www (и только ему) беспрепятственный доступ к этому каталогу и его внутренностям на чтение и запись, а в конфигурационном файле conf/conf.inc измените соответствующие пути к файлам (переменные $UPLOAD_DIR, $CACHE_DIR, $USER_DIR, $SESSION_DIR). Вместо «плоских» файлов для хранения некоторых данных может использоваться и база данных MySQL (см. файл conf/db_conf.php).
Раскрытие конфигурации По умолчанию конфигурационные и прочие настроечные файлы имеют расширение inc (исключение составляет лишь db_conf.php), однако Ilohamail в процессе инсталляции не предпринимает никаких действий, чтобы ограничить к ним доступ через веб-браузер. Учитывая, что файлы конфигурации могут хранить в открытом виде логин/пароль для авторизации на smtp-сервере, опасность этого достаточно высока. Да и вообще, не очень хорошая идея – предоставить всем возможность видеть настройки пакета, например, пути доступа к пользовательским файлам. Поэтому нужно озаботиться ограничением доступа к inc-файлам силами веб-сервера. Для Apache соответствующий фрагмент файла httpd.conf может выглядеть таким образом: <Files ~ "\.inc$"> Order allow,deny Deny from all </Files>
воспользоваться вашим сайтом для взлома чужого ящика методом подбора пароля, причем с точки зрения пострадавшего сервера, источником атаки будет являться именно ваш IP-адрес. Таким образом, если вы не строите сознательно сервис для анонимного доступа к любым почтовым ящикам, то имеет смысл принудительно указать в настройках пакета ваш сервер и исключить возможность указывать имя произвольного сервера. Для этого нужно указать разрешенный адрес (или список адресов, если серверов несколько) в переменной $default_host в файле conf/login.inc; также потребуется установка $hide_host = 1, чтобы скрыть ненужную подпись в форме. К счастью, этого оказывается достаточно, поскольку Ilohamail проводит проверку введенного имени сервера, и если оно отличается от прописанного в $default_host, то значение хоста обнуляется, что приводит к ошибке «Could not connect to …». Благодаря этому злоумышленник не сможет выполнить авторизацию из внешней формы (сохранив файл source/index.php, точнее, тот html-код, который этим сценарием формируется, локально, и изменив/добавив дополнительные параметры). Точнее, внешние формы работают, но в рамках указанных в конфигурации ограничений.
Возможность анонимной рассылки сообщений от вашего имени Если вы все же оставили пользователю возможность самостоятельно указывать сервер входящих сообщений, то он сможет войти в интерфейс управления, введя аутентификационные данные любого своего ящика, например, размещенного на одном из бесплатных серверов. Однако отправка сообщения будет осуществляться через smtpсервер, указанный в переменной $SMTP_SERVER файла conf/conf.inc. Если к этому прибавить возможность указывать в настройках произвольный адрес отправителя, то получается, что любой пользователь, имеющий где-либо ящик электронной почты, сможет отправить сообщение от вашего имени (или от имени пользователя, у которого зарегистрирован почтовый ящик на вашем сервере). И при этом все параметры заголовка, такие как IP-адрес, будут однозначно указывать на ваш сервер, что усилит в глазах получателя достоверность сообщения, а, следовательно, сделает атаку более успешной, а вас – первым подозреваемым. Для снижения этой опасности ограничьте возможность использования произвольных серверов для авторизации в Ilohamail так, как это описано в предыдущем подразделе.
Выводы
Аналогичное ограничение можно наложить и только Как видите, даже такой простой пакет, как Ilohamail, котона нужный каталог, например, используя .htaccess (хотя, ес- рый, казалось бы, не дает даже поводов усомниться в его ли вы единственный, кому может понадобиться менять на- безопасности, требует к себе пристального внимания и кристройки сервера, то по соображениям быстродействия луч- тического отношения. Естественно, я не ставил своей цеше от использования файлов .htaccess отказаться). лью запугать вас и заставить отказаться от использования веб-интерфейсов или вообще Интернета. При учете всех Возможность анонимного доступа описанных «мелочей» Ilohamail сможет послужить вам век почтовому ящику рой и правдой. Просто, когда вам доведется устанавлиЕсли пользователю разрешено самостоятельно указы- вать что-то подобное, не забывайте, что на самом деле все вать POP3- или IMAP-сервер, то злоумышленник может не так уж и просто.
34
администрирование
Строим мультидоменный почтовый сервер с защитой от вирусов и спама
Павел Семенец Кто из нас не мечтал создать свою мультидоменную почтовую систему, которая работала бы стабильно, надежно и безопасно, предлагала множество удобных функций, защищала от вирусов и спама, умела авторизовывать пользователей, шифровать передаваемый трафик, и в то же время была проста в обслуживании. Это особенно актуально для почтовых систем больших компаний или провайдерских серверов, предоставляющих почтовые сервисы внешним клиентам. Как добиться такого результата, затратив минимум усилий?
№1, январь 2006
35
администрирование
С
разу хотелось бы отметить, что данный труд не предназначен для новичков в мире UNIX. Несмотря на мои старания излагать всё как можно подробнее, многие вещи, очевидные для любого подкованного UNIX-админа, остались за бортом, иначе пришлось бы писать целый сериал. По ходу повествования я буду кратко объяснять, что и зачем мы делаем. Надеюсь, такого уровня подробностей хватит большинству читателей. Итак, наша почтовая система будет использовать только свободное программное обеспечение. Для выполнения поставленной задачи нам понадобится следующее: Exim – MTA (Mail Tranfer Agent), на момент написания статьи доступная версия 4.53. MySQL – реляционная СУБД требуется для более удобного управления пользователями и доменами, которые будет поддерживать наш почтовый сервер. Courier-Imap – один из самых быстрых и защищенных серверов для работы с почтовыми ящиками, поддерживающий работу по протоколу SSL. DSPAM – быстрый и очень гибкий в настройке антиспам фильтр. SquirrelMail – один из самых лучших веб-интерфейсов для работы с почтовыми ящиками. ClamAV – наиболее зрелый из бесплатных антивирусных фильтров. ОС FreeBSD версии 5.4 с последними патчами.
# make WITH_CHARSET=koi8_ru WITH_CHARSET=cp1251 ↵ WITH_CHARSET=utf8 WITH_CHARSET=latin1 ↵ WITH_XCHARSET=all all install clean
Настраиваем запуск так, чтобы MySQL стартовал перед всеми сервисами. Создаем скрипты для запуска MySQL: # cd /usr/local/etc/rc.d/ # mv 000.mysql-client.sh 010.mysqlc.sh # mv mysql-server.sh 015.mysqls.sh
При стандартной установке FreeBSD создается слишком маленький раздел /var для хранения базы нашего почтового сервера, этого не достаточно, для этого переместим БД MySQL в /usr/local/database/mysql во избежание проблем с нехваткой места для базы в дальшейшем. Добавляем в файл /etc/rc.conf: mysql_enable="YES" mysql_dbdir="/usr/local/database/mysql"
Создадим директорию для хранения базы MySQL и передадим права пользователю, от которого работает MySQL: # mkdir -p /usr/local/database/mysql # chown -R mysql:mysql /usr/local/database/mysql
Запускаем сервер баз данных: # /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: # cd /usr/ports/databases/mysql41-server/
36
# mysql -u root -ptestpassword
Удаляем тестовую базу: mysql> drop database test;
Подключаемся к базе с именем mysql: mysql> use mysql;
Удаляем все записи о правах на базы данных: mysql> delete from db;
администрирование Удаляем все учетные записи, которые не относятся к руту и локальному хосту: mysql> delete from user where not (user='root' ↵ and host='localhost');
Создаем базу данных для Exim: mysql> create database mail;
Передаем права пользователю Exim на почтовую базу данных: mysql> grant all on mail.* to exim@localhost identified ↵ by 'youpassword';
Далее пока оставляем настройку Exim (вернемся к ней позже). Продолжим подготавливать нашу базу данных для работы Exim. Созаем файл exim.sql (см. содержание файла в приложении [9]): # cd /usr/local/databases # cat > exim.sql << "EOF" ... EOF
Выполняем команды, записанные в файл. Существует несколько способов сделать это. Вариант 1:
Выходим из консоли сервера:
# mysql -u root -ptestpassword exim < exim.sql
mysql> \q
Вариант 2:
MySQL мы подготовили, теперь приступим к установке собственно самого Exim. Зачем нужны приведенные ниже опции, разобраться будет несложно, достаточно внимательно прочитать файл EDITME, находящийся в папке src корневого каталога с исходными текстами Exim. # # # # # # #
cd /usr/ports/mail/exim make fetch cd /usr/ mkdir Install cd Install tar -xvjpf /usr/ports/distfiles/exim/exim-4.53.tar.bz2 cd exim-4.53/Local
Создаем пользователя, от имени которого будет работать Exim. # pw adduser exim -g mail -d /var/spool/mqueue ↵ -C "Exim Server" -s /usr/sbin/nologin
# mysql -u root -ptestpassword mysql> use exim mysql> ./exim.sql mysql> \q
Возвращаемся к настройке Exim, SSL-соединения и аутентификации на SMTP-сервер: # # # #
cd /etc/mail/ mkdir ssl cd ssl openssl req -x509 -newkey rsa:1024 -keyout mail.pem ↵ -out mail.pem -days 3650 -nodes # chmod 400 mail.pem # chown exim:mail mail.pem
В директории /etc/mail создаем файл exim.conf (содержание см. в [9]) (FQDN mail.test.com взят для примера): #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" мые ссылки. # # # # # # #
cd ../ make make install ln -fs /usr/sbin/exim ln -fs /usr/sbin/exim ln -fs /usr/sbin/exim ln -fs /usr/sbin/exim
/usr/lib/sendmail /usr/sbin/sendmail /usr/bin/mailq /usr/bin/runq
Этот шаг не обязателен. Данное действие удалит все отладочные символы, тем самым уменьшив размер исполняемых файлов: # strip /usr/sbin/exim*
№1, январь 2006
LogFile /var/log/clamav/clamd.log LogTime LogClean LogSyslog PidFile /var/run/clamav/clamd.pid TemporaryDirectory /var/tmp DatabaseDirectory /var/db/clamav FixStaleSocket TCPSocket 3310 TCPAddr 127.0.0.1 User clamav AllowSupplementaryGroups ScanPE ScanOLE2 ScanMail ScanHTML ScanArchive ScanRAR
37
администрирование ArchiveMaxFiles 10000 EOF
И файл freshclam.conf следующего содержания: # cat > freshclam.conf << "EOF" DatabaseDirectory /var/db/clamav UpdateLogFile /var/log/clamav/freshclam.log LogVerbose PidFile /var/run/clamav/freshclam.pid DatabaseOwner clamav AllowSupplementaryGroups DatabaseMirror database.clamav.net MaxAttempts 5 Checks 3 NotifyClamd EOF
Запускаем ClamAV: # cd /usr/local/etc/rc.d # mv clamav-clamd.sh 020.clamav.sh # mv clamav-freshclam.sh 025.freshclam.sh
Добавляем в файл rc.conf следующие строки: clamav_freshclam_enable="YES" clamav_clamd_enable="YES"
Запускаем антивирусный фильтр: # ./020.clamav.sh start # ./025.freshclam.sh start
Далее создаем директорию, в которой собственно будем хранить почту наших пользователей. Для этих целей я выбрал директорию vmail, созданную в подкаталоге local каталога usr. # mkdir -p /usr/local/vmail # chown -R exim:mail /usr/local/vmail /var/spool/mqueue # chmod 0770 /usr/local/vmail
Создаем скрипт для запуска Exim: # cat > /usr/local/etc/rc.d/030.exim.sh << "EOF" # !/bin/sh case "$1" in start) echo "starting Exim..." /usr/sbin/exim -bd -q15m ;; restart) echo "restarting Exim..." kill -HUP `cat /var/spool/mqueue/exim-daemon.pid` ;; stop) echo "stopping Exim..." kill -TERM `cat /var/spool/mqueue/exim-daemon.pid` ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac EOF # chmod +x /usr/local/etc/rc.d/030.exim.sh
Запускаем Exim: # /usr/local/etc/rc.d/030.exim.sh start
Проверяем правильность настройки и работоспособность Exim. Для этого отправим тестовое письмо сами себе.
38
# /usr/local/etc/rc.d/030.exim.sh start Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.test.com ESMTP Exim 4.53 Wed, 19 Oct 2005 16:49:58 +0400 ehlo mail.test.com 250-mail.test.com Hello localhost.test.com [127.0.0.1] 250-SIZE 10485760 250-PIPELINING 250-AUTH PLAIN LOGIN CRAM-MD5 250 HELP mail from:user@test.com 250 OK rcpt to:user@test.com 250 Accepted data 354 Enter message, ending with "." on a line by itself test . 250 OK quit
В подкаталоге /usr/local/vmail после отправки письма должна создаться директория test.com. Проверим это, выполнив команду «ls /usr/local/vmail». Следующим этапом проверяем методы аутентификации. Для каждой проверки с помощью Perl будем кодировать аутентификационный запрос согласно используемому методу. Метод PLAIN. Для этого метода нужно получить специальную строку, которая используется в процессе аутентификации. Создадим ее следующей командой: # perl -MMIME::Base64 -e 'print encode_base64( ↵ "user\@test.com\0user\@test.com\0password");' DXNlckB0ZXN0LmNvbQB1c2VyQHRlc3QuY29tAHBhc3N3b3Jk
Полученная строка и является нашей строкой аутентификации. # telnet 127.0.0.1 25 ehlo mail.test.com ... ... AUTH PLAIN dXNlckB0ZXN0LmNvbQB1c2VyQHRlc3QuY29tAHBhc3N3b3Jk 235 Authentication succeeded quit
Метод LOGIN: # perl -MMIME::Base64 -e 'print encode_base64( ↵ "user\@test.com");'
dXNlckB0ZXN0LmNvbQ==
# perl -MMIME::Base64 -e 'print encode_base64("password");'
cGFzc3dvcmQ=
Смотрим: # telnet 127.0.0.1 25 ehlo mail.test.com ... AUTH LOGIN 334 VXNlcm5hbWU6 dXNlckB0ZXN0LmNvbQ== 334 UGFzc3dvcmQ6 cGFzc3dvcmQ= 235 Authentication succeeded quit
администрирование Метод CRAM-MD5: # telnet 127.0.0.1 25 ehlo mail.test.com AUTH CRAM-MD5 334 PDUwNy4xMTI5Nzk3MzkyQG1haWwucnVzZ2F0ZS5vcmc+
А здесь нам понадобится дополнительная манипуляция, так как для этого метода требуется еще знать и очередь сообщения. Предупреждение: cпецификация метода Cram-MD5 не допускает криптованные пароли. Декодируем имя очереди следующей командой: # perl -MMIME::Base64 -e 'print ↵ MIME::Base64::decode_base64(shift), ↵ "\n"' PDUwNy4xMTI5Nzk3MzkyQG1haWwucnVzZ2F0ZS5vcmc+
Получаем очередь письма: <507.1129797392@mail.test.com>
После кодируем строку для аутентификации, используя данные об очереди, логин и пароль: # 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' ↵ '<507.1129797392@mail.test.com>'
Используем полученную последовательность символов для аутентификации: Z2luZ2VyQGV4YW1wbGUucnUgYjllN2Q1OTUxMGMxNjE0YzIwYjU4N2JkNmFkODk2MDI= 235 Authentication succeeded quit
Проверяем антивирусный фильтр. Для этого отправим как тело сообщения тестовую сигнатуру EICAR-вируса: ehlo mail.test.com mail from:user@test.com 250 OK rcpt to:user@test.com 250 Accepted data 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* . 550-Messege rejected: Virus (Eicar-Test-Signature) Found. Your message was 550 successfully trashed.
Как мы видим, антивирусный фильтр работает нормально, далее приступаем к проверке SSL-соединения. Для этого тербуется подключиться через SSL-клиента на порт к TCP-порту 465: # openssl OpenSSL> s_client -host localhost -port 465
Если SSL-соединение прошло успешно, вы увидите приглашение Exim. Ну вот настройку Exim и проверку работоспособности почти закончили, приступим к сборке и настройке Courier-IMAP. # cd /usr/ports/mail/courier-imap # make all install clean
В открывшемся меню отмечаем:
№1, январь 2006
[X] [X] [X]
OPENSSL TRASHQUOTA AUTH_MYSQL
Build with OpenSSL support Include deleted mails in the quota MySQL support
Нажимаем <TAB>, потом <Enter>. Ждем, пока процесс дойдет до сборки Courier-AuthLib и отмечаем поодержку MySQL: [X]
AUTH_MYSQL
MySQL support
И так же, как с Courier-IMAP: <TAB>, потом <Enter>. Ждем окончания сборки. Переходим в директорию /usr/local/etc/authlib/: # cd /usr/local/etc/authlib # cat > authdaemonrc << "EOF" authmodulelist="authmysql" authmodulelistorig="authuserdb authvchkpw authpam ↵ authldap authmysql authpgsql" daemons=5 authdaemonvar=/var/run/authdaemond subsystem=mail DEBUG_LOGIN=0 DEFAULTOPTIONS="wbnodsn=1" LOGGEROPTS="" EOF
С authmysql немного сложнее, так как мы с вами авторизуем пользователя по схеме «username@domain», то нам с вами придется переписать запрос авторизации: #cat > authmysqlrc << "EOF" MYSQL_SERVER localhost MYSQL_USERNAME exim MYSQL_PASSWORD youpassowrd MYSQL_PORT 3306 MYSQL_OPT 0 MYSQL_DATABASE mail MYSQL_SELECT_CLAUSE SELECT CONCAT(id,'@',mbox_host), ↵ crypt, "", 1001, 6, home, CONCAT(home,'/Maildir'), ↵ "", id, "" FROM users WHERE CONCAT(id,'@', ↵ mbox_host) = ‘'$(local_part)@$(domain)’' EOF
Далее приступаем к настройке собственно самих сервисов POP3 и IMAP (содержание файлов pop3d и imapd см. в [9]): # cd /usr/local/etc/courier-imap # cat > pop3d << "EOF" ... EOF # cat > imapd << "EOF" ... EOF
Настраиваем SSL Для этого редактируем файлы imapd.cnf и pop3d.cnf. Первый из них должен выглядеть следующим образом: # cat > imapd.cnf << "EOF" RANDFILE = /usr/local/share/courier-imap/imapd.rand [ req ] default_bits = 1024 encrypt_key = yes distinguished_name = req_dn x509_extensions = cert_type prompt = no [ req_dn ] C=RU ST=Russia Federaton L=Moscow O=Exim Super Server
39
администрирование OU=IT DEpartament CN=mail.test.com emailAddress=abuse@test.com [ cert_type ] nsCertType = server
Второй файл pop3d.cnf отличается первой строкой:
Escape character is '^]'. +OK Hello there. user user@test.com +OK Password required. pass password +OK logged in. list quit
RANDFILE = /usr/local/share/courier-imap/pop3d.rand
Проверяем работу Courier-IMAP по протоколу IMAP:
Создаем самоподписанные сертификаты:
# telnet 127.0.0.1 143
# cd /usr/local/share/courier-imap # ./mkimapdcert # ./mppop3dcert
Копируем полученные сертификаты в директорию /usr/ local/etc/courier-imap: # cd /usr/local/etc/courier-imap # mkdir ssl && cd ssl # cp /usr/local/share/courier-imap/*.pem .
Настраиваем SSL-соединения для imap и pop3: # cd ../
Создаем файлы imapd-ssl и pop3d-ssl следующего содержания (содержание файлов см. в [9]): # cat > imapd-ssl << "EOF" ... EOF # cat > pop3d-ssl << "EOF" ... EOF
Создаем скрипты для запуска: # # # # # #
cd mv mv mv mv mv
/usr/local/etc/rc.d courier_authdaemond.sh 035.courier-auth.sh courier_imap_imapd.sh 040.courier-imap.sh courier_imap_pop3d.sh 045.courier-pop3d.sh courier_imap_imapd_ssl 050.courier-imaps.sh courier_imap_pop3d_ssl 055.courier_pop3ds.sh
Добавляем записи в rc.conf для запуска скриптов в процессе загрузки: courier_authdaemond_enable-"YES" courier_imap_imapd_enable-"YES" courier_imap_pop3d_enable-"YES" courier_imap_imapd_ssl_enable-"YES" courier_imap_pop3d_ssl_enable-"YES"
Запускаем Courier-IMAP: # # # # #
/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 /usr/local/etc/rc.d/050.courier-imaps.sh start /usr/local/etc/rc.d/055.courier-pop3ds.sh start
Проверяем работу Courier-IMAP по протоколу POP3: # telnet 127.0.0.1 110 Trying 127.0.0.1... Connected to mail.test.com.
40
Trying 127.0.0.1... Connected to mail.test.com. * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2005 Double Precision, Inc. See COPYING for distribution information. a001 login user@test.com password a001 OK LOGIN Ok. // ответ сервера a001 logout * BYE Courier-IMAP server shutting down a001 OK LOGOUT completed Connection closed by foreign host.
Проверяем работу Courier-IMAP по протоколу POP3 через SSL-соединение: # openssl OpenSSL> s_client -host localhost -port 995 ..... ..... ..... Connected to mail.test.com. +OK Hello there. quit
Проверяем работу Courier-IMAP по протоколу IMAP через SSL-соединение: OpenSSL> s_client -host localhost -port 993 ...... ...... ...... * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE AUTH=PLAIN ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2005 Double Precision, Inc. See COPYING for distribution information. a001 login user@test.com password a001 OK LOGIN Ok. // ответ сервера a001 logout * BYE Courier-IMAP server shutting down a001 OK LOGOUT completed closed
Ну вот, в общем, все почти готово. Приступим к настройке DSPAM и свяжем его с Exim, а заодно установим веб-интерфейс для администрирования спам-фильтра. Последним стабильным дистрибутивом на дату написания статьи была версия 3.4.8. # # # # # #
cd /usr/ports/mail/dspam make fetch cd /usr/Install tar -xvzf /usr/ports/distfiles/dspam-3.4.8.tar.gz cd dspam-3.4.8 ./configure –prefix=/usr/local/dspam ↵ --includedir=/usr/local/dspam/include ↵ --mandir=/usr/local/dspam/share/man ↵ --infodir=/usr/local/dspam/share/info ↵ --sysconfdir=/usr/local/dspam/etc ↵ --localstatedir=/usr/local/dspam/var ↵ --libexecdir=/usr/local/dspam/lib ↵
администрирование --with-dspam-home=/usr/local/dspam/var/spool ↵ --enable-debug ↵ --enable-domain-scale ↵ --enable-signature-headers ↵ --with-delivery-agent="/usr/sbin/exim ↵ -oi -oMr spam-scanned" ↵ --enable-whitelist ↵ --enable-virtual-users ↵ --enable-experimental ↵ --with-logdir=/var/log/dspam ↵ --enable-neural-networking ↵ --with-storage-driver=mysql_drv ↵ --with-mysql-includes=/usr/local/include/mysql ↵ --with-mysql-libraries=/usr/local/lib/mysql ↵ --enable-preferences-extension # make # make install
Создаем файл конфигурации. Что означают приведенные ниже опции, вы сможете узнать из официальной документации по DSPAM (содержание файла dspam.conf см. в [9]): # cd /usr/local/dspam/etc/ # cat > dspam.conf << "EOF" ... EOF
Создаем базу данных для DSPAM: # mysql -u root -ppassword mysql> create database 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 # mysql -u exim -pyoupassowrd dspam < ↵ mysql_objects-4.1.sql # mysql -u exim -pyoupassowrd dspam < neural.sql # mysql -u exim -pyoupassowrd dspam < virtual_users.sql
Итак, приступаем собственно к настройке Exim для работы с dspam. Для этого открываем /etc/mail/exim.conf и ищем такую строчку begin routers. После вписываем следующие строки: dspam_addspam: driver = accept expn = false domains = +local_domains local_parts = spam transport = addspam headers_add = "X-DSPAM-REPORT: Missclassified"
Этот маршрут используется для отправки писем о спаме спам-фильтру в случаях, если спам-фильтр не распознал спам и пропустил письмо как нормальное. Маршрут создает виртуальный адрес вида «spam@domain», где «domain» – имя вашего домена (test.com) по умолчанию, на который и следует пересылать вышеуказанные письма. dspam_falsepositive: driver = accept expn = false domains = +local_domains local_parts = ham:nospam transport = falsepositive headers_add = "X-DSPAM-REPORT: Falsepositive"
Применяется д ля отправки писем при ошибоч ных срабатываниях спам-фильтра, то есть когда спам-
№1, январь 2006
фильтр распознал нормальное письмо как спам. Маршрут создает виртуальный адрес вида «ham@domain» и nospam@domain, где domain – имя вашего домена (test.com) по умолчанию, на который и следует пересылать вышеуказанные письма. spamscan_router: no_verify headers_remove = X-FILTER-SPAM : X-Spam-Score : ↵ X-Spam-Score-Gate : X-Spam-Report : ↵ X-Spam-Gate-Subject : X-Spam-Flag : X-S condition = "${if and {{!eq ↵ {$received_protocol}{spam-scanned}} ↵ {!def:h_X-FILTER-SPAM:}} {1}{0}}" driver = accept headers_add = X-FILTER-SPAM: ICF Team Spam Filter ↵ on $primary_hostname, $tod_full\n ↵ X-SENDER-INFO: ${if def:authenticated_id ↵ {ID - ${authenticated_id},}} ↵ ${if def:authenticated_sender ↵ {authenticated_sender - ↵ ${authenticated_sender},}} ↵ ${if def:sender_ident ↵ {rfc1413(ident) - ${sender_ident},}} ↵ ${if def:originator_uid {UID - ↵ ${originator_uid},}} ↵ ${if def:originator_gid {GID - ↵ ${originator_gid}}} local_parts = !addham:!addspam:!ham: ↵ !spam:!sexy transport = spamcheck_transport require_files = /usr/local/dspam/var/spool: ↵ /usr/local/dspam/bin/dspam
Следующий маршрут используется для прохождения и проверки всей входящей и исходящей почты. spam_reject: driver = redirect check_local_user user = exim group = mail headers_add = "X-DSPAM-Rreport: Rejected" condition = ${if eq ↵ {$h_X-DSPAM-Result:}{Spam}{yes}{no}} allow_fail = true require_files = $local_part:/usr/local/vmail ↵ /${domain}/spam/$local_part errors_to = "" data = :blackhole: more = false
Включает удаление писем, классифицированных как спам для каждого пользователя индивидуально, путем создания файла /usr/local/vmail/domainname/spam/usernamе. Если файл присутствует, то письма удаляются без какоголибо уведомления, если нет, то только помечаются как спам и доставляются как обычно. Ищем следующую строку begin transports. После описываем транспорты: spamcheck_transport: driver = pipe command = "/usr/sbin/exim -oi -oMr ↵ spam-scanned -bS" transport_filter = /usr/local/dspam/bin/dspam ↵ --stdout --deliver=innocent,spam --user ↵ $local_part@$domain --mail-from ↵ "${lc:$sender_address}" ↵ --rcpt-to "${lc:$local_part}@${lc:$domain}" 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
41
администрирование return_path_add = true envelope_to_add = true log_fail_output = true log_defer_output = true return_fail_output = true message_prefix = "" message_suffix = "" temp_errors = *
Этот транспор запускает спам-фильтр и классифицирует входящие и исходящие письма. addspam:
driver = pipe command = /usr/local/dspam/bin/dspam ↵ --user ${lc:$sender_address} ↵ --class=spam --source=error return_path_add = false return_fail_output = true log_output = true home_directory = "/usr/local/dspam/var/spool" current_directory = "/usr/local/dspam/var/spool" user = exim group = mail message_prefix = "" message_suffix = ""
Выполняет обучение спам-фильтра при отправке писем, ошибочно класифицированных как нормальное письмо. falsepositive: driver = pipe command = /usr/local/dspam/bin/dspam ↵ --user ${lc:$sender_address} ↵ --class=innocent --source=error return_path_add = false return_fail_output = true log_output = true home_directory = "/usr/local/dspam/var/spool" current_directory = "/usr/local/dspam/var/spool" user = exim group = mail message_prefix = "" message_suffix = ""
Обучает спам-фильтр при отправке писем, ошибочно классифицированных как спам. Перезапускаем Exim: # /usr/local/etc/rc.d/030.exim.sh restart
Смотрим в /var/log/maillog, если видим ошибки, то еще раз проверяем действия по всем пунктам с начала статьи. Приступаем к настройке CGI-интерфейса для отслеживания работы спам-фильтра и веб-интерфейса для работы с почтовыми ящиками. Для этого нам понадобится WWW-сервер Apache с поддержкой suexec и mod_perl, для желающих можно использовать ssl. Я предлагаю настроить отдельный виртуальный хост для просмотра статистики по отработке фильтра. # cd /usr/ports/www/apache13-modssl # make WITH_APACHE_SUEXEC=yes ↵ 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/ # make all install clean # cd /usr/ports/lang/php4-extensions # make all install clean
42
После того как вы выполните эту команду, выйдет достаточно длинный список выбора модулей. Каждый может выбрать по вкусу, но обязательные модули – это session gd mysql iconv. Редактируем файл /usr/local/etc/apache/httpd.conf. Ищем строчку «ServerName» и пишем там fqdn-имя нашего сервера, в данном случае «mail.test.com». Ищем строчку «AddType application/x-tar .tgz» и после нее вписываем две строки: AddType application/x-httpd-php .php .phtml AddType application/x-httpd-php-source .phps
Теперь настроим два виртуальных хоста для SquirrelMail и для dspam. В самом конце конфигурационного файла вписываем следующее: NameVirtualHost * # 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 Group mail <Directory "/usr/local/www/vhosts/dspam.test.com"> Options Includes Indexes FollowSymLinks ExecCGI AllowOverride All Order allow,deny Allow from all DirectoryIndex index.html AddHandler cgi-script .cgi <IfModule mod_perl.c> PerlSendHeader On AddHandler cgi-script .cgi PerlHandler Apache::Registry </IfModule> </Directory> ErrorLog /usr/local/www/logs/dspam.test.com/errors.log CustomLog /usr/local/www/logs/dspam.test.com/access.log common </VirtualHost> #Веб-интерфейс SquirrelMail <VirtualHost *> ServerName mail.test.com ServerAlias test.com Options Includes Indexes FollowSymLinks MultiViews DocumentRoot /usr/local/www/vhosts/mail.test.com 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>
Сохраняем, выходим и переходим в директорию наших будущих виртуальных хостов: # cd /usr/local/www
Создаем каталоги для контента и протоколов: # mkdir -p vhosts/dspam.test.com vhosts/mail.test.com ↵ logs/dspam.test.com logs/mail.test.com
Создаем файлы логов, я предлагаю использовать на каждый виртуальный хост свой журнал обращений и ошибок, дабы облегчить поиск ошибок в дальнейшем. # touch logs/dspam.test.com/access.log ↵ logs/mail.test.com/access.log ↵ logs/dspam.test.com/errors.log ↵ logs/mail.test.com/errors.log
администрирование Передаем права пользователю www на директорию logs: # chown -R www:www logs
Копируем содержимое /usr/Install/dspam-3.4.8/cgi в директорию, предназначенную для анитиспам-фильтра: # cd vhosts/dspam.test.com # cp -R /usr/Install/dspam-3.4.8/cgi/* .
Передаем права пользователю Exim: # cd ../ # chown -R exim:mail dspam.test.com
Cледующие команды выполняются в директории /usr/ local/www/vhosts/dspam.test.com. Создаем файл .htpasswd следующего содержания: #cat > .htaccess << "EOF" AuthType Basic AuthName "DSPAM Statistic Server" AuthUserFile /usr/local/www/passwd/htpaasswd require valid-user EOF
# # # # #
cp -R ../../squirrelmail/* . cd ../ chown -R www:www mail.test.com cd mail.test.com ./configure
Настраиваем для наших потребностей. Рассказывать про конфигурацию SquirrelMail не вижу смысла, так как там все до банальности просто. Здесь находится исчерпывающая документация по настройке и конфигурированию этого сервиса – http://www.squirrelmail.org/ wiki/SquirrelMail. Добавляем в rc.conf следующую строчку для запуска Apache: apache_enable="YES"
Создаем скрипт для запуска Apache: # cd /usr/local/etc/rc.d # cp apache.sh 060.apache.sh
Запускаем Apache: # ./060.apache.sh start
Ну вот вроде и все. После правим файл admins, убираем запись суперпользователя и вписываем адреса пользователей, которые имеют право администрировать сервер статистики (в нашем случае user@test.com). Выставляем права на файл .htaccess: # chown www:www .htaccess # chmod 640 .htaccess
Создаем директорию для хранения файла паролей: # mkdir /usr/local/etc/apache/htpasswd
Заключение За время эксплуатации (примерно полтора года) данный комплекс показал себя как надежный почтовый сервер. При грамотном обучении DSPAM начинает распознавать 99% процентов спама, делая одну ошибку примерно на 50-60 тысяч проходящих писем. Задержка при обработке каждого письма составляет примерно 1-2 секунды.
Благодарности
# chown www:www /usr/local/etc/apache/htpasswd
Выражаю благодарность Сергею Супрунову за его замечательную статью по описанию работы DSPAM в журнале «Системный администратор», которая послужила руководством для использования DSPAM в место Spamassasin + Amavisd.
Создаем файл паролей:
Ссылки:
Передаем права на директорию пользователю www:
# htpasswd -c /usr/local/etc/apache/htpasswd/htpasswd ↵ user@test.com
Вводим пароль такой же, который использовали при создании почтового. Устанавливаем права на файл: # chown www:www /usr/local/etc/apache/htpasswd/htpasswd # chmod 640 /usr/local/etc/apache/htpasswd/htpaswd
Выполняем сборку и устанавливаем SquirrelMail: # cd /usr/ports//mail/squirrelmail # make all install clean
После установки нужно скопировать полученный при сборке SquirrelMail в предназначенную для него директорию: # cd /usr/local/www/vhosts/mail.test.com
№1, январь 2006
1. http://www.exim.org – официальный сайт MTA Агента Exim. 2. http://www.clamav.com – официальный сайт антивирусного фильтра. 3. http://dspamwiki.woozle.org/DspamWithExim – Wiki-сайт по настройке Dspam. 4. http://www.mysql.com – jфициальный сайт cервера баз данных. 5. http://www.php.net – официальный сайт языка програмирования PHP. 6. http://www.apache.com– официальный сайт веб-сервера Apache. 7. http://www.squirrelmail.org – официальный сайт веб-интерфейса написанного на языке PHP для работы с почтовыми ящиками. 8. http://www.freebsg.org – официальный сайт операционной системы FreeBSD. 9. http://www.samag.ru/cgi-bin/go.pl?q=source – сайт журнала «Системный администратор», раздел «Исходный код».
43
администрирование
Создаём кластер для PostgreSQL
Андрей Тренин PostgreSQL – мощная СУБД с конвейера Open Source, способная легко конкурировать с такими гигантами, как Oracle и MS SQL. К сожалению, наряду с полезными утилитами, такими как pg_autovacuum, в нем отсутствует возможность репликации. Что делать, если такая опция вам необходима?
Э
та статья будет интересна читателям, имеющим начальные знания в области РБД, и будет полезна системным администраторам организаций, использующим PostgreSQL (http://www.postgresql.org) для хранения достаточно большого объема информации (1 Гб и более), которая является не статической, а наоборот, динамично изменяющейся и дополняющейся, которую очень легко потерять и трудно восстановить в установленные руководством сроки.
44
есть несколько способов. Начинаем Немного о PostgreSQL Это мощная система управления ре- его использовать как хранилище одноляционными базами данных, подде- типных данных для сайта, или покупарживающая расширенное подмножес- ем систему класса CRM, ERP отечесттво стандарта SQL. Включает в себя: венной сборки, в принципе это не важтранзакции, внешние ключи, подза- но. Важно то, что данных становится со просы, триггеры, пользовательские ти- временем все больше, от этого увелипы данных, функции и многое другое. чивается их важность, и даже за кратПричем функции могут быть написа- ковременную паузу в доступе к данным ны на C, Perl, Python, Tcl и JDBC. Так- вам «стучат по голове» и не дают долже следует учесть, что это чудо разра- гожданную премию. Простои в работе любого хранилиботано не на «коленках», а в University of California at Berkeley (UCB). ща данных неизбежны (плановая проКак PostgreSQL «попадает в дом» – филактика, замена комплектующих
администрирование или «уборщица пробралась в серверную») и встает вопрос: «Как сделать так, чтобы доступ к данным был возможен всегда?». Ответ прост – нужно иметь как минимум две параллельные системы, взаимозаменяющие друг друга, чтобы во время простоя одной – другая работала как ни в чем не бывало. Однако наряду с преимуществами данной схемы, мы получаем сопутствующие недостатки, а именно: систем становится как минимум больше одной – надо думать над синхронизацией данных; поломка одной из систем – нужно сделать период времени между сбоем и отключением вышедшей из строя системы как можно менее продолжительным для внешних приложений. Эти проблемы и некоторые менее важные призвано решать реплицирующее программное обеспечение, речь о котором пойдет далее.
бутивными pg_dump/pg_restore и после этого все опять включить. Преимущество данной схемы очевидно – система отключается не тогда, когда она хочет, а тогда, когда запланируем мы, конечно же, при условии низкой вероятности отказа двух серверов в течение, скажем, 4-12 часов, столько времени вполне хватит для прибытия на работу и неспешного восстановления работоспособности программных средств. Ус танавливать и нас траивать PgPool очень легко. Допустим, у нас есть два сервера PostgreSQL. На один из них устанавливаем демон и в конфигурационном файле выставляем ему master, другому – slave, еще немного правим его (он всего один!), если необходимо, и все – мы имеем в наличии репликационный сервер.
PGCluster
Рисунок 1. Общая схема работы PGCluster
Рисунок 2. Схема репликации в PGCluster
PGCluster – синхронизирующаяся реп- один из кластеров БД «падает», баланликационная система с мультимас- сер и репликационный сервер, постотерной композиционной схемой для янно отслеживающие жизнедеятельPostgreSQL. Сейчас проект имеет пог- ность кластеров БД, отделяют сломанPgPool 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 кластеров БД. жет объединить два сервера в систе- много времени. Установка PGCluster есть установка Slony-I му (master – slave). PgPool посылает одинаковые SQL- PostgreSQL, ибо PGCluster и есть мо- Slony-I – это репликационная систекоманды на оба сервера, тем самым дифицированный PostgreSQL, а вот ма по схеме «один master плюс много достигается эффект репликации. Ес- настройка трех типов конфигураци- slave». Запускается на POSIX и этим ли один из серверов ломается/отклю- онных файлов (по одному на каж- все сказано. Лицензия – BSD. Забечается – демон пытается продолжить дый тип серверов) является задачей гая вперед, скажу – поддерживает работу с оставшимся в живых. К сожа- не тривиальной. Сколько нужно на- динамическое реконфигурирование лению, чтобы ввести сервер обратно строить параметров, станет очевид- кластера. Данный проект задумывался как в строй, придется остановить всю сис- ным после рассмотрения схемы репрепликационная система, независятему, провести синхронизацию данных, ликации (рис. 2). например утилитой rsync или дистриРассмотрим самое тяжелое. Когда щая от какой-то конкретной версии
№1, январь 2006
45
администрирование Таблица показателей PgPool
PGCluster
Slony-I
Установка
3
1
2
Системные требования
3
2
2
Документация
3
2
2
Скорость работы
3
2
2
Стабильность работы
2
2
3
Широта области применения
2
3
1
PostgreSQL, и одновременно с этим не требующая перезапуска серверов БД, для того чтобы начать или прекратить работу. Однако, как и все универсальные системы, Slony-I имеет очень много недостатков. Первое – неумение определить недоступность базы данных и как следствие отстранить ее от работы. Второе – Slony-I не является мультимастерной репликационной системой, что в совокупности с невозможностью автоматического перехода сервера с режима slave на master делает область ее применения довольно узкой. Вот лишь некоторые примеры, где данная система не будет работать: коннект между серверами БД часто внезапно пропадает; реплицирование БД с центрального сервера в разбросанные по местности локальные сервера, которые делают коннект только на время сбора данных; системы, где пользователи могут менять схему БД, ибо изменения схемы тоже не отслеживаются. Однако настройка репликации хоть и сложна, но позволяет реплицировать даже отдельные таблицы, чего не могут все вышеперечисленные системы. Ситуация напоминает извечный спор: что лучше, система, где для выполнения любого задания достаточно нажать кнопку «ОК», или же система, где нужно настроить пару конфигурационных файлов, но зато по кнопке «ОК» будут произведены именно те действия, которые хотел пользователь. Другими словами: экскаватор копает глубоко и быстро, зато лопатой сложно пробить газопровод. Примерное описание репликации приведено в документации – http:// slony1.projects.postgresql.org/slony_tip/ adminguide/slonyadmin.html#FIRSTDB,
46
от себя лишь добавлю, что оно ввиду чрезмерной сложности заслуживает отдельной статьи.
Сравниваем продукты Перейдем к оценке этих изделий. Определим её параметры, так как системы три, то и оценивать будем по трехбалльной шкале (3 – хорошо, 2 – могло быть и лучше, 1 – плохо). Установка – данный показатель оценивает возможность установки на максимальное количество типов ОС, простоту процесса инсталляции, размер дистрибутива и сложность постинсталляционной настройки. Системные требования – следующий показатель, оценивающий количество серверов и его мощность, необходимые для нормального функционирования системы в целом. Документация – этот показатель ставит оценку наличию, доступности и понятности изложения всех источников информации (сайт производителя, документация на продукт, mail-листы) необходимых для установки и обслуживания системы. Скорость работы – данный показатель количественно в ходе опыта оценить не удалось ввиду того, что составленный стресс-тест проверял в основном надежность, к тому же на сайтах производителей количественная оценка есть (результаты pgbench). Однако качественную оценку скорости каждому продукту поставить получилось на основе их архитектурных особенностей и визуальных наблюдений в ходе опытов (браузер, «ps ax» и т. д.). Стабильность работы – здесь обещанное в документации я сравнивал с действительностью, то есть с тем, что я видел на системе, установленной мною лично. Широта области применения – при оценке данного показателя я принимал во внимание следующие параметры: количество работающих одновременно серверов БД, возможность горячего исключения/подключения серверов БД. Все тесты и оценки делались на тестовом полигоне крупного зарубежного online-аукциона c коли-
чеством ставок при стресс-тестах порядка 430 тысяч в день и базой данных на 8 Гб. Результаты оценки сведены в таблицу.
Подведем итог Как мы видим, в таблице нет колонки «Итого», потому что если просуммировать проставленные оценки, то получим лидера PgPool, если введем вес для каждого показателя, то, безусловно, выиграет PGCluster, так как вес буду проставлять я. Целью данной статьи является не выдвижение вперед какого-то одного продукта или занижение ценности другого. Наоборот, статья явным образом показывает, что все продукты достойны использования, но именно там, где они будут наиболее эффективны. Например, у вас есть сайт информационного значения, его простои не несут ощутимых убытков, вы не можете позволить себе дополнительное оборудование, да и желания разбираться с новым софтом, быть может, не имеете, то PgPool – ваш выбор. Или же у вас есть мощная корпоративная система, остановка работы которой пользователи воспримут как выходной, а вы как увольнение, содержание отдела программно-технического обеспечения не несет серьезных трат для компании, то ваш выбор очевиден – PGCluster. Это и мой выбор, ведь для приемлемой работы проекта вполне достаточно использовать конфигурацию по умолчанию – большая часть необходимых параметров уже инициализированы. А при необходимости вы всегда сможете изменить настройки на нужные вам. Постараюсь объяснить, где можно использовать Slony-I. Данный программный продукт необходимо использовать в совокупности с другими средствами, как хорошо настраиваемую, с большим запасом интегрируемости часть какой-то большой системы. Скорее всего, проект будет полезен больше разработчикам информационных систем, чем их пользователям.
Ссылки: 1. http://pgpool.projects.postgresql.org. 2. http://pgcluster.projects.postgresql.org. 3. http://slony1.projects.postgresql.org.
сети
Малоизвестные подробности работы NAT
Ильяс Кулиев NAT, поистине, спасение для системного администратора, когда нужно быстро подключить к Интернету локальную сеть. Но все ли вы о нём знаете?
NAT и его реализации
Inside Global (IG). Это внешний
Outside Local (OL). Это адрес,
Используя терминологию Cisco, в контексте NAT есть четыре основных определения для IP-адресов. Рассмотрим их на примере, показанном на рис. 1. На обоих маршрутизаторах делается NAT (network address translation). При этом: Inside Local (IL). Это адрес, присвоенный хосту, находящемуся в локальной сети. В данном случае адреса 10.0.0.100 и 172.16.0.100 – адреса IL.
адрес, при отправлении пакетов на который они будут доставлены на хост с адресом IL. В данном случае для хоста 10.0.0.100 адресом IG является 111.222.0.1. Outside Global (OG). Внешний адрес хоста, доступ к которому мы хотим получить из нашей локальной сети. В данном случае, если мы отправляем пакет от 10.0.0.100 для 172.16.0.100, адресом OG будет 111.222.0.2.
под которым адреса внешних хостов видны внутри локальной сети. В данном случае, если мы отправляем пакет от 10.0.0.100 для 172.16.0.100, для хоста 172.16.0.100 это будет выглядеть так, будто пакет пришёл от 172.16.0.1 (адрес OL).
48
Простейший случай NAT – это трансляция адресов IL в IG и наоборот. При этом маршрутизатор, выполняю-
сети
Рисунок 1. Определение IP-адресов в контексте NAT
щий NAT, модифицирует поле адреса в заголовке IP следующим образом: в исходящих пакетах адрес источника IL заменяется на IG, и пакет отправляется дальше по роутингу к хосту с адресом OG; во входящих пакетах адрес приемника IG заменяется на IL и отправляется в локальную сеть для хоста с адресом IL. Таким образом, в таблице сопоставлений NAT каждая запись состоит из двух значений – IL и IG. Эта или подобная схема иногда применяется для обеспечения доступа снаружи к хостам, находящимся в локальной сети (например, к веб-серверу или FTP-серверу). Она может также применяться для балансировки нагрузки путем динамического распределения пакетов, приходящих на публичный адрес маршрутизатора, между несколькими серверами, находящимися в локальной сети, и еще в некоторых случаях. Более распространённый случай – это NPAT, network and port address translation. При использовании NPAT в таблице сопоставлений каждая запись имеет не два (как в простом NAT), а пять значений: транспортный протокол; локальный адрес (IL); локальный порт; глобальный адрес (IG); глобальный порт. Это позволяет использовать единственный публичный адрес для предоставления доступа в Интернет компьютерам, находящимся в локальной сети. В документации Cisco такая схема обычно называется «NAT with port overload» или короче – «NAT overload». Исторически сложилось так, что именно его, как правило, имеют в виду, когда употребляют термин «NAT», и о нём мы и будем говорить в дальнейшем, ввиду его распространённости. До сих пор речь шла о вещах общеизвестных. Однако, если посмотреть на NAT поближе, возникают новые вопросы. Возьмём простейшую сеть, с одним компьютером и одним маршрутизатором, выполняющим NAT. Модель маршрутизатора в данном случае не слишком важна – допустим, что это давно устаревшая, но все еще популярная Cisco 1601R (см. рис. 2). В конфигурации маршрутизатора указано, что он должен выполнять NAT для всех пакетов, с адресами источника 192.168.0.0/24, пришедших через интерфейс Ethernet0 и отправляемых далее через интерфейс Serial0, а также для ответных пакетов, пришедших через Serial0, для которых есть соответствующая запись в таблице трансляций:
№1, январь 2006
Рисунок 2. Пример сети с NAT ! ! Last configuration change at 09:29:45 UTC someday by TheAllmightyMaster ! NVRAM config last updated at 19:27:46 UTC some other day by TheAllmightyMaster ! version 12.2 ... interface Serial0 ip address 11.22.33.44 255.255.255.252 ip nat outside ... interface Ethernet0 ip address 192.168.0.1 255.255.255.0 ip nat inside ... ip nat inside source list MyNetwork interface Serial0 overload ... 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). Как следует из конфигурации, наш внешний адрес IG – 11.22.33.44. В результате этого в таблице NAT появится примерно такая запись: Proto UDP
Inside global 11.22.33.44:1053
Inside local 192.168.0.141:1053
Outside local 1.2.3.4:53
Outside global 1.2.3.4:53
Допустим, после появления такой записи в таблице, другой хост, 1.2.3.5, отправляет пакет UDP с адресом назначения 11.22.33.44 и портом назначения 1053. Вопрос – получит ли наш хост 192.168.0.141 этот пакет? Здравый смысл подсказывает, что вроде бы не должен. С другой стороны, налицо факт: в нашей таблице NAT черным по белому записано, что пакет с адресом назначения 11.22.33.44 и портом назначения 1053 нужно принять и транслировать в локальную сеть для хоста 192.168.0.141 (который его примет и молча уничтожит, поскольку на этом компьютере не запущено сетевого приложения, которому был бы предназначен этот пакет.) Кстати говоря – ну хорошо, допустим такого приложения нет, а если бы оно было? Как хорошо известно пользователям таких программ, как eMule и eDonkey, они требуют, чтобы им была предоставлена возможность беспрепятственно получать UDP пакеты с портом назначения 4661, или 4242, или 4321 – точный номер порта зависит от настроек. И, что также хорошо известно их пользователям, эти программы плохо работают, будучи запущены из локальной сети, находящейся за NAT. Так вот, это может происходить, в том числе и потому, что несмотря на успешное установление локальным клиентом соединения с сервером, из-за специфики данной конкретной реализации NAT другие клиенты, находящиеся во внешнем мире, не могут устанавливать соединение с локальным клиентом.
49
сети По этой же причине может не работать DCC chat в клиентах IRC, передача файлов в ICQ и тому подобные вещи, для которых требуется обеспечение беспрепятственного прохождения пакетов непосредственно между пользовательскими компьютерами. Итак, отвечая на вопрос, «получит ли наш хост 192.168.0.141 пакет, направленный на 11.22.33.44 от постороннего хоста», – может быть, получит, а может быть, и нет; ответ на этот вопрос зависит от реализации NAT на пограничном маршрутизаторе. Реализаций же насчитывается четыре: Symmetric NAT. До недавнего времени это была наиболее распространённая реализация. Его характерная особенность – в таблице NAT маппинг адреса IL на адрес IG жёстко привязан к адресу OG, то есть к адресу назначения, который был указан в исходящем пакете, инициировавшем этот маппинг. При указанной реализации NAT в нашем примере хост 192.168.0.141 получит оттранслированные входящие UDP-пакеты только от хоста 1.2.3.4 и строго с портом источника 53 и портом назначения 1053 – ни от кого более. Пакеты от других хостов, даже если указанные в пакете адрес назначения и порт назначения присутствуют в таблице NAT, будут уничтожаться маршрутизатором. Это наиболее параноидальная реализация NAT, обеспечивающая более высокую безопасность для хостов локальной сети, но в некоторых случаях сильно усложняющая жизнь системных администраторов. Да и пользователей тоже. Full Cone NAT. Эта реализация NAT – полная противоположность предыдущей. При Full Cone NAT входящие пакеты от любого внешнего хоста будут оттранслированы и переправлены соответствующему хосту в локальной сети, если в таблице NAT присутствует соответствующая запись. Более того, номер порта источника в этом случае тоже не имеет значения – он может быть и 53, и 54, и вообще каким угодно. Например, если некое приложение, запущенное на компьютере в локальной сети, инициировало получение пакетов UDP от внешнего хоста 1.2.3.4 на локальный порт 4444, то пакеты UDP для этого приложения смогут слать также и 1.2.3.5, и 1.2.3.6, и вообще все до тех пор, пока запись в таблице NAT не будет по какой-либо причине удалена. Ещё раз: в этой реализации NAT во входящих пакетах проверяется только транспортный протокол, адрес назначения и порт назначения, адрес и порт источника значения не имеют. Address Restricted Cone NAT (он же Restricted NAT). Эта реализация занимает промежуточное положение между Symmetric и Full Cone реализациями NAT – маршрутизатор будет транслировать входящие пакеты только с определенного адреса источника (в нашем случае 1.2.3.4), но номер порта источника при этом может быть любым. Port Restricted Cone NAT (или Port Restricted NAT). То же, что и Address Restricted Cone NAT, но в этом случае маршрутизатор обращает внимание на соответствие номера порта источника и не обращает внимания на адрес источника. В нашем примере маршрутизатор будет транслировать входящие пакеты с любым адре-
50
сом источника, но порт источника при этом обязан быть 53, в противном случае пакет будет уничтожен маршрутизатором. Как видим, реализации NAT – это настоящий зоопарк, в котором каждой твари по паре. Положение смягчается тем, что для большинства сетевых приложений подробности реализации NAT большого значения не имеют (в особенности для приложений, использующих транспорт TCP, как известно, это протокол, использующий сессии, поэтому сказанное выше для TCP неактуально. Тем не менее с развитием приложений Peer-to-Peer (eDonkey, eMule, Skype), IP-телефонии и разнообразной сетевой мультимедии (зачастую использующих транспорт на основе UDP) различия в реализациях NAT постепенно начинают играть заметную роль. Поэтому для разработчиков таких приложений пришла пора задуматься над тем, как их детище будет работать, находясь в локальной сети за NATом. Одним из плодов таких раздумий стал протокол STUN (Simple Traversal of UDP through NAT), описанный в RFC 3489.
STUN Некоторым приложениям, особенно предназначенным для IP-телефонии (поскольку там это наиболее актуально), важно знать, находится ли компьютер, на котором они запущены, в локальной сети за NAT или на компьютере с публичным IP адресом, и в случае NAT – определить, какого он типа. Для этого в настоящее время широко используется протокол STUN, который позволяет также определить наличие блокирующего firewall на пограничном маршрутизаторе или самом компьютере. Идея STUN несложна – клиент отправляет на находящийся снаружи сервер зондирующие сообщения, используя транспорт UDP. В теле этих сообщений содержатся IP-адреса и номера портов источника и приемника. Непременным условием работы сервера является использование им двух IP-адресов – дальше станет понятно, для чего. Процесс определения типа NAT с использованием STUN протекает следующим образом. Допустим, наш клиент находится за NAT, его локальный адрес 192.168.0.111, публичный адрес NAT – 1.2.3.4, адреса сервера STUN – 11.22.33.1 и 11.22.33.2, номера портов 3478. Происходит следующее: Клиент отправляет запрос на основной адрес сервера (11.22.33.1), при этом в теле отправленного запроса указаны адреса и порты: 192.168.0.111:1055 -> 11.22.33.1:3478. Эти же адреса и порты фигурируют в заголовке IP-пакета, содержащего запрос, но после прохождения NAT адрес источника изменится на 1.2.3.4, а номер порта в зависимости от реализации NAT может измениться или остаться неизменным. Если клиент не получает никакого ответа в течение тайм-аута, он делает вывод, что находится за блокирующим firewall, и завершает работу. Сервер отвечает клиенту со своего адреса 11.22.33.1 сообщением, в теле которого также указаны адреса и порты: 11.22.33.1:3478 -> 1.2.3.4:1055. Если бы адрес, с которого клиент отправлял своё первое сообщение (192.168.0.111), и адрес в полученном от сервера
сети сообщении (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 в наром. Если ответ был получен, NAT относится к Address шем примере: Restricted Cone, если нет – то к Port Restricted Cone. Для иллюстрации работы STUN см. рис. 3 (взят из статьи «Anatomy: A Look Inside Network Address Translators» в «The IP Journal» Vol.7 Num. 2 за сентябрь 2004 г.). Клиент STUN встроен в некоторые приложения IP-телефонии, например, X-Pro и X-Lite от компании CounterPath, и в некоторые другие. Консольный клиент STUN под ОС Windows может быть загружен отсюда: http://prdownloads. sourceforge.net/stun/client.exe?download. Запустив его и указав в качестве параметра командной строки один из публичных 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
Приведённый выше результат получен на компьютере, находящемся за маршрутизатором ZyXEL Prestige 645R. Результат для маршрутизатора Cisco 1721 с IOS версии 12.2 в свою очередь выглядит так: C:\>client.exe stun.xten.net STUN client version 0.94 ... Primary: Port Restricted Nat, preserves ports, no hairpin Return value is 0x1b
№1, январь 2006
Proto UDP
Inside global 11.22.33.44:1053
Inside local 192.168.0.141:1053
Outside local 1.2.3.4:53
Outside global 1.2.3.4:53
«Random port» означает, что данная реализация NAT не заботится о том, чтобы номер порта источника в исходящем наружу пакете оставался таким же, каким он был получен от хоста локальной сети, и заменяет его на случайное значение в диапазоне от 1024 до 65535. Можно предположить, что по замыслу автора идеи «random ports» такая замена уменьшает вероятность конфликта между записями, если несколько хостов локальной сети одновременно попытаются отправить наружу пакеты с совпадающим номером порта источника. Поскольку номер порта источника в исходящих пакетах формируется хостами локальной сети также случайным образом, преимущества такой замены сомнительны, из недостатков же можно назвать хотя бы потенциальную проблему с протоколом RPC, да и не только. Как видно из примера, наш маршрутизатор старается сохранять номер порта неизменным (11.22.33.44:1053 и 192.168.0.141:1053), из чего следует, что запущенный в его локальной сети STUN-клиент сообщил бы о нем «preserves ports». К слову, на FreeBSD этот результат достигается ключом «-same_ports» или «-s» в строчке запуска или конфигурационном файле демона natd.
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 была бы изменена маршрутизатором на PORT 1,2,3,4,4,211. Благодаря этому в обоих укаNAT и шлюзы приложений К сожалению, не у всех сетевых протоколов взаимодейс- занных выше случаях соединение данных будет успешно твие с NAT протекает безболезненно. Наиболее часто установлено. Функция ALG в маршрутизаторах Cisco позволяет осувстречающийся пример – это FTP. Здесь возможны два случая. ществлять трансляцию адресов уровня приложений не тольПервый случай. Пользователь, находящийся в локаль- ко для протокола FTP, но также и для протоколов SIP, H.323, ной сети за NAT, использует FTP-клиент для того, чтобы Skinny и некоторых других (благодаря этому можно, наприполучить доступ к FTP-серверу с публичным IP-адресом мер, размещать в локальной сети серверы DNS). Для боль(см. рис. 4). шего удобства функция ALG в маршрутизаторах Cisco вклюПроблема здесь возникает, когда клиент пытается ис- чена по умолчанию. Аналогичную ALG функциональность в маршрутизатопользовать активный режим FTP. Сессия протекает при этом следующим образом. В некоторый момент по управ- рах на основе ОС 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 Server: 150 Opening BINARY mode data connection for file.zip (1334109 bytes).
Наибольший интерес здесь представляет первая команда от клиента, которая информирует сервер о том, что хост с адресом 192.168.0.101 открыл для приема соединения данных порт номер (4*256) + 211 = 1235. В ответ на это сервер должен установить соединение данных со своего порта номер 20 на указанный порт хоста 192.168.0.101. Поскольку этот адрес является приватным, такое соединение не может быть установлено. В результате наблюдается знакомый многим системным администраторам эффект, когда клиент вроде бы успешно подключается к FTP-серверу, но не может скачивать с него файлы или даже просматривать содержимое текущего каталога (это происходит потому, что передача листинга файлов с сервера на клиент также осуществляется по соединению данных). Для борьбы с описанной проблемой может использоваться переключение сервера в так называемый пассивный режим. Поскольку в этом режиме инициатором соединения данных выступает клиент, проблема исчезает. Имен-
52
Заключение
Понимание принципов работы различных реализаций NAT может оказаться полезным при поиске причины неудовлетворительной работы некоторых приложений, использующих транспортный протокол UDP. Так, например, сочетание ALG и Symmetric или Port Restricted NAT и IP-телефонов, использующих протокол установки соедиенения SIP, может порой давать самые причудливые результаты (спорадические отказы в регистрации на сервере, односторонняя слышимость между абонентами и т. п.), причем это зависит не только от настроек IP-телефона, но и от настроек сервера. Другой пример: компания Microsoft сообщает в своей статье KB817778, что их реализация туннеля IPv6 over UDP не будет работать через Symmetric NAT (адрес статьи в Интернете: http://support.microsoft.com/kb/ 817778/EN-US). Таких примеров можно найти ещё много, и во всех случаях понимание различий в реализациях NAT если и не поможет немедленно устранить проблему, то хотя бы укажет на возможные пути решения (например, заменить firmware маршрутизатора на такое, где NAT реализован в виде Full Cone, если, конечно, оно существует, или заменить сам маршрутизатор).
bugtraq Выполнение произвольного кода в Microsoft Windows при обработке WMF-файлов Множественные уязвимости в VisNetic Mail Server Программа: VisNetic Mail Server 8.3.0 build 1, возможно более ранние версии. Опасность: Критическая. Описание: 1. Уязвимость существует из-за недостаточной обработки входных данных в переменных language и lang_settings в сценариях /accounts/inc/include.php и /admin/inc/include.php. Удаленный пользователь может переопределить глобальные переменные и с помощью специально сформированного URL выполнить произвольный PHP-сценарий на целевой системе. Пример: http://[host]:32000/accounts/inc/include.php? ↵ language=0&lang_settings[0][1]=http://[host]/ http://[host]:32000/admin/inc/include.php?language=0& ↵ lang_settings[0][1]=http://[host]/
Удачная эксплуатация уязвимости позволит злоумышленнику выполнить PHP-сценарий с привилегиями SYSTEM в конфигурации по умолчанию. 2. Уязвимость существует из-за недостаточной обработки входных данных в параметре lang сценария /dir/include.html. Удаленный пользователь может просмотреть произвольные файлы на системе. Пример: http://[host]:32000/dir/include.html?lang=[file]%00
3. Уязвимость существует из-за недостаточной обработки входных данных в параметре language в сценарии /mail/settings.html. Удаленный пользователь может с помощью специально сформированного URL выполнить произвольный PHP-сценарий на целевой системе с привилегиями SYSTEM в конфигурации по умолчанию. Пример: http://[host]:32000/mail/settings.html? ↵ id=[current_id]&Save_x=1&language=TEST http://[host]:32000/mail/index.html?id=[current_id]& ↵ lang_settings[TEST]=test;http://[host]/;
4. Уязвимость существует из-за недостаточной инициализации переменных default_layout и layout_settings при обработке неизвестного HTTP_USER_AGENT. Удаленный пользователь может просмотреть произвольные файлы на системе. Пример: Example (using non-IE/Mozilla/Firefox browser): http://[host]:32000/mail/index.html?/mail/index.html? default_layout=OUTLOOK2003&layout_settings[OUTLOOK2003]= ↵ test;[file]%00;2
URL производителя: www.deerfield.com/products/visneticmailserver. Решение: Установите последнюю версию (8.3.5) с сайта производителя.
Программа: Microsoft Windows 2000, XP, 2003. Опасность: Критическая. Описание: Уязвимость существует в «Windows Picture and Fax Viewer» при обработке Windows-метафайлов (.wmf), содержащих специально сформированные SETABORTPROC Escape-записи. Эти записи позволяют выполнить произвольные функции, если процесс генерации WMF-файла заканчивается неудачно. Удаленный пользователь может с помощью специально сформированного WM- файла выполнить произвольный код на целевой системе с привилегиями пользователя, открывшего злонамеренный файл. Примечание: Уязвимость может быть эксплуатирована посредством Windows Explorer, даже если расширение злонамеренного файла было изменено на .jpg, .gif, .tif, .png и другие форматы. URL производителя: http://www.microsoft.com. Решение: Установите обновление с сайта производителя.
Выполнение произвольного кода при обработке архивов в F-Secure Anti-Virus Программа: 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 Servers version 5.52, F-Secure Anti-Virus for MIMEsweeper version 5.61 и более ранние, F-Secure Anti-Virus Client Security version 6.01 и более ранние, F-Secure Anti-Virus for MS Exchange version 6.40 и более ранние, F-Secure Internet Gatekeeper version 6.42 и более ранние, F-Secure Anti-Virus for Firewalls version 6.20 и более ранние, F-Secure Internet Security 2004, 2005 и 2006, F-Secure Anti-Virus 2004, 2005 и 2006, Solutions based on F-Secure Personal Express version 6.20 и более ранние, F-Secure Anti-Virus for Linux Workstations version 4.52 и более ранние, F-Secure Anti-Virus for Linux Servers version 4.64 и более ранние, F-Secure Anti-Virus for Linux Gateways version 4.64 и более ранние, F-Secure AntiVirus for Samba Servers version 4.62, F-Secure Anti-Virus Linux Client Security 5.11 и более ранние, F-Secure Anti-Virus Linux Server Security 5.11 и более ранние, F-Secure Internet Gatekeeper for Linux 2.14 и более ранние. Опасность: Высокая. Описание: 1. Уязвимость существует при обработке ZIP-архивов. Удаленный пользователь может с помощью специально сформированного архива вызвать переполнение буфера и выполнить произвольный код на целевой системе. 2. Уязвимость в модуле сканирования при обработке RAR и 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 реализовать такую вроде бы довольно простую систему как-то не решались. Причин здесь, вероятно, много, и сказать, какая из них является решающей довольно трудно. В UNIX и Windows не только разные архитектуры, но и строение файловой системы. Так, в UNIX все исполняемые файлы согласно стандарта файловой системы традиционно собраны в одном месте (/bin, /sbin и пр.), статические конфигурационные – в другом, а растущие журналы – в третьем, пользователи также ограничены своим рабочим пространством. Это все довольно легко описать при помощи простых правил. В Windows все несколько сложнее. Файлы раскиданы по разным каталогам, настройки могут сохранять-
54
ся не только в разные ветки реест- тыре основных параметра: входящие ра, но и в индивидуальных конфигу- и исходящие сетевые пакеты, доступ рационных файлах. Все это порожда- к файловой системе и реестру, целосет некий бардак, так как программа тность исполняемых файлов. Эти воздолжна иметь доступ во множество можности могут быть сконфигурировамест, что отследить гораздо труднее, ны как на системном, так и прикладда и пользователь традиционно имеет ном уровнях для специфических просамые высокие права в системе. Так- грамм (почтовых клиентов, веб-браже не вызывает сомнений, что UNIX- узеров, видео- и аудиопроигрыватепользователь, подготовлен на поря- лей и пр.). Каждому приложению мождок лучше пользователя Windows, ко- но дать доступ к определенным часторый обычно полностью полагается тям файловой системы и реестра, со на работу мастеров, часто не вникая строгим ограничением прав, только на в подробности. Поэтому последний чтение или возможность модификации скорее всего не будет в восторге от то- объектов. Также определяется разрего, что придется описывать поведение шенная конкретному приложению седля каждой устанавливаемой им про- тевая активность. CORE FORCE бесплатен как для граммы. А если их десятки? Но должен некоммерческого, так и для коммерже быть выход? ческого использования. Распространяется по лицензии Apache 2.0 (http:// Подход CORE FORCE Вероятно, разработчиков CORE FORCE [1] www.apache.org/licenses/LICENSE-2.0). эти и другие проблемы не смогли ос- Все профили безопасности, доступные тановить, и была создана система, ко- в сообществе CORE FORCE или поторая при правильной настройке спо- данные зарегистрированными польсобна решить задачу по защите пер- зователями, распространяются по сонального компьютера от вирусов, Creative Commons лицензии (http:// известных и неизвестных уязвимос- creativecommons.org/licenses/by-nc-sa/ тей, шпионских программ, червей, 2.5), гарантирующей, что все могут троянских программ и прочих подар- пользоваться этими профилями и соков, которыми традиционно богат се- здавать на их основе свои. годняшний Интернет. CORE FORCE представляет собой несколько нетра- Принцип работы диционное решение по обеспечению CORE FORCE безопасности персональных компью- CORE FORCE состоит из нескольких теров, работающих под управлением модулей, контролирующих определенWindows 2000 и XP. ные компоненты на предмет имеющихЭто узловая система предотвраще- ся разрешений. В настоящее время дония атак (host-based Intrusion Prevention ступны три таких модуля, работающих System – H-IPS) с интегрированным се- в режиме ядра контролирующих сететевым экраном. Контролируется че- вых соединений, защищающих файло-
безопасность В качестве фильтра пакетов испольвую систему и реестр (рис. 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 предназна- мы. Этот драйвер, располагаясь внизу чен для хранения конфигураций обо сетевого стека, контролирует все вховсех разрешениях для всех профилей дящие и исходящие сетевые пакеты, безопасности, обеспечивает подде- защищая в том числе и стек операциржание базы в целостности, обновле- онной системы. Другой драйвер (tdifilter.sys, TDI – ние ее через Policy Developer, импорт и Transport Dispatch Interface) работает экспорт профилей безопасности. Централизованное управление за- на более высоком транспортном уровгрузкой в память базы данных, которая не, помогая NDIS отслеживать сетесодержит все разрешения, обеспечи- вые связи каждого процесса, синхровает диспетчер (dispant.sys), также ра- низировать запросы для разрешенных ботающий в пространстве ядра. Кро- пользовательских соединений. Драйме того, диспетчер обеспечивает API, вера, защищающие файловую систему позволяя подключить при необходи- и реестр, имеют аналогичное функцимости любые другие модули контро- ональное назначение для своих типов ля. Диспетчер играет роль посредни- объектов. Располагаются в alpha2.sys ка между модулями защиты, выполня- и alpha2r.sys. Из-за своей позиции ющимися в пространстве ядра, и мо- в операционной системе они могут педулями, работающими в пространстве рехватывать системные вызовы пропользователя. цессов, пытающихся получить доступ Например, сетевой модуль полу- к любому файлу или объекту реестра, чает сведения о попытке получения а также вызовы, которые были сделадоступа программой, запрос на под- ны компонентами ядра. тверждение этого действия отсылается диспетчеру. Если в базе данных дис- Организация профилей петчера записано, что такое действие безопасности необходимо запретить или разрешить, Описание работы будет неполным без ответ отсылается обратно. Если реше- рассказа об организации профилей бение принимает пользователь, то дис- зопасности. Действительно, установка петчер связывается с Policy Developer всех разрешений для большого колии ожидает ответа. Диспетчер миними- чества приложений при неправильном зирует использование памяти, загру- подходе может свести на нет все усижая только необходимые в данный мо- лия. Пользователь может просто запумент разрешения для текущего уровня таться и либо забросить настройку сисбезопасности. Хранение разрешений темы, либо настроить ее неправильно. на том же уровне, на котором работа- В CORE FORCE конфигурация разреют модули защиты, позволяет миними- шений сделана таким образом, чтобы зировать потери на переключение кон- обеспечить максимальную гибкость текста из режима ядра в режим поль- и возможность их повторного использователя. Кроме того, диспетчер пере- зования. Так, для установки разрешеводит переменные в свои фактические ний, которые могут быть применены величины, т.е. например, расшифровы- к любой программе, можно использовает полный путь к файлу. вать 2 комплекта: системный и индивиМодуль межсетевого экрана филь- дуальный. Если конкретной программе трует сетевые пакеты, основываясь не указаны разрешения, то будет исна инструкциях, соединяет програм- пользоваться встроенный, т.е. системму с соответствующим текущему про- ный набор разрешений. Такие наборы филю безопасности набором правил, разрешений группируются в профили которые загружаются во время запус- безопасности, позволяющие програмка программы. ме нормально работать, но в то же вре-
№1, январь 2006
Рисунок 1. Взаимодействие модулей CORE FORCE
Рисунок 2. Выбор уровня безопасности
мя иметь доступ только к разрешенным объектам. Но в разных условиях (доверенная сеть, Интернет, запуск непонятной утилиты) могут потребоваться различные разрешения, как более жесткие блокирующие, всякую подозрительную деятельность, так и легкие, не отвлекающие при работе. Для более гибкой их организации каждый профиль безопасности имеет набор уровней безопасности: High, Medium, Medium-Low, Low и Custom. Каждый сконфигурирован с таким расчетом, чтобы обеспечить необходимый баланс. Пользователю в большинстве случаев достаточно просто выбрать необходимый уровень, не вникая в подробности, а просто почитав описание (рис. 2). Гибкости этой схеме добавляет то, что уровень безопасности выставляется не один на всех, а используется более индивидуальный подход. То есть можно системный уровень выбрать одним, программам же выставить другие уровни. И теперь при открытии документа Acrobat Reader не будет каждый раз запрашиваться разрешение, а почтовый клиент для отправки и приема почты будет использовать только указанные сервера и спрашивать подтверждение на большинство потенциально опасных операций (запись в реестр, например).
55
безопасность Кирпичиками, на которых строятся профили безопасности, являются разрешения. Разрешения применяются к сетевым ресурсам, файлам, реестру, обеспечивая полноценную основу для защиты программ. Если запрос подходит под правило, то к объекту могут быть применены различные действия block или no (блокировать), pass или yes (разрешить), ask (спросить подтверждение), inherit (наследовать системные настройки). Не говоря уже об опциях запроса. Здесь и протокол, TCP-флаг, IP-адрес и порт источника/приемника, сетевой интерфейс, каталог, файл, ветка реестра и пр., которым необходимо разрешить определенные действия: получение списка файлов, чтение, запись, удаление или выполнение. Дополнительно можно включать журналирование определенных событий и еще много других полезных опций. Поэтому конфигурирование при помощи разрешений является несколько непрактичным. Ведь если программа не должна писать в системную область, то в Windows придется описывать довольно много объектов. А если то же самое затем придется делать и для другой программы? Проще сгруппировать все разрешения, предназначенные для определенных целей в некий блок, который затем можно многократно использовать. И если придется изменять некие параметры (добавить каталоги, указать правила фильтрации и т. п.), то это необходимо будет сделать только в одном месте. Такие блоки называются «политики» (policies). Теперь при создании нового профиля безопасности достаточно собрать подходящие политики и указать уровень безопасности, для которого они должны применяться. CORE FORCE уже имеет некоторое количество встроенных политик, предназначенных для самых разнообразных операций. Конечно же, их можно создавать и самому, как самостоятельно, так и используя уже имеющиеся и связывая их через Assigned Policies. При создании политике желательно дать название, которое будет описывать его функциональное назначение. Например, такие имена говорят сами за себя «Network. Send and receive mails» или «Cannot execute from temp (confirmation required)». Разрешения конфигурируются только в политиках, если две политики (разрешения) назначены на один и тот же объект, последний аннулирует предыдущий, то есть фактически политики прилагаются в порядке объявления. Например, если в одной политике запрещен доступ к каталогу, а в последующем разрешен, то в итоге доступ будет все-таки разрешен. Именно поэтому в некоторых политиках (чаще в сетевых) доступ сначала запрещается для всего (Protocol – Any, Address – Any, Direction – Any и т. д.). А в последующих правилах разрешения ослабляются, открывая доступ к тому, что действительно необходимо. Для файлов чаще проще поступить наоборот, т.е. сначала все разрешить, а потом запретить доступ к системным каталогам. При необходимости очередность разрешений в политике можно изменять при помощи стрелок. В отдельном пункте «Permissions» можно указать свои параметры, которые будут иметь более высокий приоритет перед всеми остальными вне зависимости от выставленного уровня безопасности. Разрешения можно копировать в другие профили. Естественно, созданные политики могут многократно использоваться для описания профилей безопасности раз-
56
личных программ. Такие многократно используемые политики создаются и сохраняются в отдельной вкладке «Shared Policies». Итак, текущая конфигурация безопасности приложения и системы будет определена исходя из настроек трех уровней: Security Profile (Program/System) – Security Levels – Policies. Как видите, создание профиля безопасности хоть и максимально продумано, но обычный пользователь вряд ли будет этим заниматься. Поэтому одной из задач проекта было создание общества экспертов, в обязанность которых будет входить и разработка готовых профилей безопасности. Сейчас в репозитории проекта можно найти около сотни профилей для наиболее популярных программ (ICQ, IE, GPG, Mozilla Firefox и Thunderbird, FlashGet и другие). Каждый из них включает имя профиля (часто название программы), ник разработчика, рейтинг, дату последнего изменения и краткое описание. В Policy Developer реализован импорт и экспорт профилей безопасности посредством удобных для восприятия человеком 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 ↵ and programs folder.</Documentation> <Permissions> <FileSystem> <Permission Delete="No" Log="Failed" ↵ Recursive="Yes" Write="No"> <PredefinedFolder Name=»ProgramFiles»/> </Permission> <Permission Delete="No" Log="Failed" ↵ Recursive="Yes" Write="No"> <PredefinedFolder Name="Windows"/> </Permission> </FileSystem> </Permissions> </Policy>
А сетевая политика, разрешающая исходящие соединения по протоколу SMB, выглядит так. <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> </Rule> <Rule Direction=»Outgoing»> <Allow/> <TCP> <Target Port="smb"/> </TCP> </Rule> <Rule Direction="Outgoing"> <Allow/> <TCP> <Target Port="netbios-ssn"/> </TCP> </Rule> </Firewall> </Permissions> </Policy>
Более сложные политики занимают несколько экранов, но на общей читаемости это не сказывается, всегда можно
безопасность понять принцип его работы. Для удобс- ность, но нормально работать он натва переноса между компьютерами ис- чал только после полной очистки сиспользуются переменные, как общесис- темы от следов CORE FORCE. И еще темные вроде [ProgramFiles], так и ус- один неприятный момент, о котором танавливаемые пользователем. Напри- написано на сайте, и эксперименты это мер, моя локальная сеть выглядит так. подтвердили. CORE FORCE игнорирует работу с PPPoE, в том числе и ADSL. <Alias Confidential="Yes" ↵ Сетевой модуль защиты просто не виName="Local Network"> дит это соединение, хотя соответству<Address> <Single Value="192.168.1.0"/> ющий драйвер во вкладке «Свойс</Address> тва» просматривается, но модули за</Alias> щиты файлов и реестра по-прежнему После переноса в новую систему работают. В текущей версии 0.70.105 достаточно только изменить значе- не предусмотрена какая-либо защита ние переменных на актуальные для настроек или привязки к конкретному текущего компьютера. Для программ, пользователю, поэтому защитить сисеще не имеющих подготовленный про- тему от действий пользователя, облафиль безопасности, предусмотрен ре- дающего какими-либо правами в сисжим обучения. теме, при помощи CORE FORCE не получится. Такие возможности планируются в будущих релизах. Хотя соСовместимость и системные требования четание системных настроек и CORE Компьютер Celeron 633 с 256 ОЗУ и ус- FORCE на порядок поднимает общую тановленным Windows XP SP2 заметно защищенность компьютера. притормаживает при работе с CORE FORCE. Поэтому предложенные раз- Установка CORE FORCE работчиками минимальные системные Установка является стандартной для требования – Pentium III 800 и 128 ОЗУ, – Windows. Скачиваем исполняемый можно считать, выбраны обоснованно. файл размером 8,72 Мб и запускаем. Но это еще не все неприятности. CORE В процессе установки программа авFORCE вмешивается в работу сетевых томатически скачивает пакет Windows и системных сервисов, что не может Installer [3], если нет соединения с Иннравиться антивирусным программам тернетом, либо планируется применеи межсетевым экранам. На странице ние CORE FORCE на нескольких компроекта [4] имеется список совмести- пьютерах, этот пакет необходимо скамости (и несовместимости тоже) та- чать и установить самостоятельно. ких программ. В последний попали та- В процессе установки появится сообкие продукты, как Norton Antivirus 2004, щение о кратковременном отключеSophos Anti-Virus 5.05 и Panda Titanium нии соединений с Интернетом и про2006 Anti-Virus + Antispyware v5.0.1.00 сьбе закрыть все соединения. В моем (на сайте указано, что не работает случае соединение с Интернетом так в Windows 2000 SP4, зато работает и не восстановилось (вероятно, из-за с Windows XP SP2). Разработчики обе- проблем с Outpost). Если установка производилась щают постепенно устранить проблемы. Список совместимых программ немно- в Windows XP, то появится еще одно го больше: AVG Anti-Virus (на сайте ука- сообщение (рис. 3) о том, что нет серзана версия 7.0.334, у меня более ста- тифицированной подписи на ПО. Здесь рая 6.0.754 работала также без про- подтверждаем установку. В процессе блем), Kaspersky Anti-Virus Personal установки будет проведен поиск изv5.0.388, BitDefender Free Edition v8, вестных программе утилит и сравнение MCAFEE VirusScan 2006 v10, Sophos сигнатур, в результате пользователю Anti-Virus v5.05, NODE32 v2.5, eTrust EZ будет выведен результат (рис. 4). ОтAntivirus v7.0.8.1, F-Prot Antivirus v3.16c вет «No» говорит, что такая программа и Trend Micro PC-Cillin Internet Security не найдена, «Yes» – программа найдена 2005 v12.0 и 2006 v14.0. и контрольная сумма совпадает с имеКак видите, в списках одни анти- ющейся в базе данных. Но, скорее всевирусы. Но у меня после установки го, вы получите ответ «Yes, but signature CORE FORCE намертво завис Outpost is invalid», говорящий о том, что проверсий 2.5 и 3.0. Возможно, и случай- грамма найдена, а контрольная сум-
№1, январь 2006
Рисунок 3. Во время установки необходимо подтвердить неподписанный драйвер
Рисунок 4. Программа установки ищет известные программы
ма не совпадает. Это не означает наличие вируса или чего-нибудь еще. Скорее всего дело в другой версии утилиты. Обновить сигнатуры для всех найденных программ можно, поставив галочку в «Update unrecognized signatures to match those found on your computer». Следующим шагом программа запросит указать сетевые настройки (Local Network, Broadcast, DNS), которые можно затем отредактировать, зайдя в Aliases. После перезагрузки в трее появится еще один значок , по щелчку на нем можно активировать, деактивировать CORE FORCE и вызвать Policy Developer для настройки. А во вкладке «Свойства сетевого соединения» появится новый драйвер «Сore Force Network Driver». В особо тяжелых случаях система после установки CORE FORCE может не захотеть загружаться. Для устранения этого необходимо перейти в Safe Mode, нажав <F8> при загрузке, и воспользоваться Core Force Recovery Console (RecoveryConsole.exe), который поможет деактивировать драйвера и отключить автоматический старт CORE FORCE при загрузке.
Работа с CORE FORCE Окно Policy Developer, показанное на рис. 5, визуально разделено на две
57
безопасность
Рисунок 5. Окно настройки Policy Developer
Рисунок 6. Настройка сетевой переменной
Рисунок 7. Выбор исполняемого файла добавляемой программы
части. В левой части, состоящей из двух вкладок General и Shared Policies, выбираются профили безопасности, политики, разрешения, добавляются и убираются новые программы в список контроля. В правой части производятся просмотр и настройка соответствующих параметров.
58
Если выбран режим настройки разрешений, то правое окно будет состоять из трех вкладок: Firewall, File System и Registry, в которых выставляются разрешения для соответствующих модулей. В каждой вкладке доступны два режима просмотра. Например, для межсетевого экрана разрешения можно просматривать в виде правил PF либо их расшифровку. Пункт System – Aliases покажет все переменные, известные программе (отдельно сетевые и файловые). Здесь же по двойному щелчку их можно редактировать. Например, на рис. 6 показан процесс настройки одной из сетевых переменных. В качестве параметра можно ввести значение, имеющее смысл (IP-адрес компьютера или сети, сетевую маску, имя) или Any, означающее любое. Если выставить галочку в «Confidential (Don’t save content on export)», то при экспорте настроек эта переменная не будет выводиться в результирующий файл. Отследить текущие события можно, зайдя в Activity Monitor, имеющую две вкладки Logs и Processes. Для удобства отбора определенных событий можно воспользоваться фильтром. Кроме того, все программы, доступные из Policy Developer, также имеют свой Activity Monitor, показывающий события, относящиеся к конкретной программе. Для примера настроим правила для почтового клиента Mozilla Thunderbird. Выбираем в левом окне
в разделе Programs Mozilla Thunderbird. Если его нет в списке найденных программ, например, она устанавливалась позже, сначала прописываем ее. Для этого нажимаем на панели инструментов «Create» либо щелкаем правой кнопкой, и появляется меню «Add new program…». Запускается мастер, помогающий добавить новую программу в список. Первым шагом указываем на исполняемый файл (рис. 7). Далее мастер предлагает два варианта действий: найти профиль безопасности на сайте CORE FORCE (Search in CORE FORCE Community (recommended)) или создать его самому (Add new program configuration) (рис. 8). При выборе первого пункта будет произведен поиск на сайте, в результате чего может быть предложено несколько вариантов профилей. В нашем случае их два, с одинаковым рейтингом (рис. 9). Если готового профиля нет, то выбираем самостоятельное создание профиля безопасности. При этом будет предложен запуск Learning Wizard с тремя вариантами использования программы (рис. 10). Итак, после закачки профиля переходим к настройке в основном окне программы. Выбираем Mozilla Thunderbird в Programs и заходим в Launch Control (рис. 11). Контрольная сумма в установленном профиле не совпадает с нашей, т.к. профиль безопасности создавался для версии 1.0.2, я использую более новую 1.0.7. Нажатием на «Add Signature» добавляем новую контрольную сумму в базу. Для контроля настроек выбираем пункт «Permissions». Если зайти во вкладки «File System» и «Registry», то можно обнаружить, что разрешения запрещают записывать, удалять, выполнять, а в некоторых случаях и читать файлы в основных системных каталогах. Правила фильтрации сетевых пакетов смотрим в Firewall. Разрешения, установленные по умолчанию, показаны на рис. 12. Все, что подсвечено серым цветом, изменять нельзя, если какое-либо из них вас не устраивает, то его можно переопределить, добавив новое правило и поместив ниже. Теперь если правило требует подтверждение
безопасность
Рисунок 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 следующий раз не будет вас чего об угрозе. беспокоить. Все настройки в пределах одной Ссылки: статьи описать невозможно. На сай- 1. Сайт программы CORE FORCE – http:// force.coresecurity.com. те проекта найдете несколько пошаговых руководств, описывающих со- 2. Яремчук С. Проактивные системы защиты, или Есть ли жизнь без антивируздание разрешений для простейших са? – Журнал «Системный администприложений, которые помогут во всем ратор», №7, 2005 г. – 9-13 с. разобраться.
Вывод В последнее время явно наметилось оживление «альтернативных» приложений, защищающих Windows, в которых разработчики смотрят на пробле-
№1, январь 2006
3. Пакет Windows Installer – http://www. installengine.com/cert02/isengine/isscript. msi. 4. Known Issues & Compatibility List – http://force.coresecurit y.com /index. php?module=articles.
Рисунок 14. Запрос на подтверждение изменения ветки реестра
Рисунок 15. Подтверждение сетевой активности программы
59
безопасность
Расширяем возможности MailScanner
Сергей Яремчук В прошлой статье [1] вы рассмотрели возможности и установили почтовый сканер MailScanner. Сегодня мы познакомим вас с дополнительными программами, позволяющими просмотреть статистику работы системы защиты электронной почты.
Веб-интерфейс MailWatch
Просмотр статуса работы вирус- рые параметры объяснены плохо, по-
MailWatch [2] представляет собой инструмент, предназначенный для работы и настройки MailScanner, использующий веб-технологии. Написан на PHP, MySQL и JpGraph, распространяется под лицензией GNU GPL. Для записи в базу данных применяются свои собственные функции пользователя (CustomFunctions). Основные возможности: Отображение очереди входящей и исходящей почты (пока только для Sendmail/Exim), вывод информации о средней загрузке и количестве сообщений за текущий день, спаме, вирусах и блокированного контента. Подсвечивание недавно обработанной почты. Вывод подробной информации по каждому сообщению. Управление почтой, попавшей в карантин (т.е. ее можно просматривать, разрешать, удалять, переобучать спам-фильтры).
сканера (пока только для Sophos), базы данных MySQL и вывод файла настроек MailScanner. При работе с Sendmail имеется возможность проверить и вывести размеры очереди почты и информацию о пересылке. Разграничение информации для пользователей, домена и администратора. Поддержка XML-RPC позволяет использовать несколько инсталляций MailScanner/MailWatch как единое целое. Вывод самых разнообразных отчетов.
60
Настройка MailWatch Процесс настройки MailWatch можно условно разделить на три части: создание необходимых баз и таблиц в MySQL, изменение параметров доступа веб-сервера и редактирование конфигурационного файла MailScanner.conf. В документации этот процесс описан подробно, но некото-
этому пройдем все три этапа. Для работы потребуются права суперпользователя. Распаковываем файл с архивом в рабочий каталог. # tar xzvf mailwatch-1.0.2.tar.gz # su mailwatch
И приступаем к созданию баз и таблиц. # /etc/init.d/mysqld start Starting safe_mysqld service:
[ DONE ]
Таблицы можно создавать и вручную, но проще воспользоваться готовым скриптом. # mysql –u root -p < create.sql Enter password: ******
Создаем пользователя, от имени которого MailWatch будет работать с базой данных. # mysql –u root -p
безопасность Enter password: ****** mysql> GRANT ALL ON mailscanner.* TO mailwatch@localhost IDENTIFIED BY 'password'; Query OK, 0 rows affected (0.12 sec)
mysql> INSERT INTO users VALUES ↵ ('grinder@test.ru',md5('pasword'),'sergej','A','1'); Query OK, 1 row affected (0.46 sec)
Для интереса посмотрим созданные таблицы.
С базой все, выходим.
mysql> SHOW TABLES;
mysql> quit
+----------------------------+ | Tables_in_mailscanner | +----------------------------+ | audit_log | | blacklist | | geoip_country | | inq | | maillog | | mcp_rules | | mtalog | | outq | | sa_rules | | saved_filters | | user_filters | | users | | whitelist | +----------------------------+ 13 rows in set (0.00 sec)
Все пользователи для доступа через веб-интерфейс должны иметь запись в таблице users. mysql> DESCRIBE users; +-------------------+---------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------------+---------------------------+------+-----+---------+-------+ | username | varchar(60) | | PRI | | | | password | varchar(32) | YES | | NULL | | | fullname | varchar(50) | | | | | | NULL | | | type | enum('A','D','U','R','H') | YES | | quarantine_report | tinyint(1) | YES | | 0 | | +-------------------+---------------------------+------+-----+---------+-------+ 5 rows in set (0.10 sec)
Теперь файл MailWatch.pm, в котором редактируем следующие параметры (по умолчанию почему-то используется root). my($db_name) my($db_host) my($db_user) my($db_pass)
= = = =
'mailscanner'; 'localhost'; 'mailwatch'; 'password';
Затем перемещаем его в каталог CustomFunctions. # mv MailWatch.pm /opt/MailScanner/lib ↵ /MailScanner/MailScanner/CustomFunctions
Аналогичные параметры редактируем и в скрипте SQLBlackWhiteList.pm, который позволяет пользователю самому создавать белый и черный списки и заносить их в базу данных. После чего помещаем его на место: # mv SQLBlackWhiteList.pm /opt/MailScanner/lib ↵ /MailScanner/MailScanner/CustomFunctions
И переходим к следующему этапу. Папку mailscanner, содержащую php-скрипты, помещаем в рабочий каталог веб-сервера. # mv mailscanner /var/www/html/
Поле username должно устанавливаться в зависимости от значения поля type. Для обычных пользователей оно И устанавливаем необходимые права доступа для катасодержит почтовый адрес и используется при регистрации логов, в которых будут создаваться и храниться графики. и работе с почтой. Поле password, думаю, понятно без объ# chown root:apache /var/www/html/mailscanner/images яснений, а в fullname заносят реальное имя пользователя. # chmod ug+rwx /var/www/html/mailscanner/images Поле type указывает на привилегии, которые будет иметь # chown root:apache /var/www/html/images/cache # chmod ug+rwx /var/www/html/images/cache пользователь. Так, U (User) означает обычные привилегии, такой пользователь будет способен работать с почтой, редактировать черный и белый списки только для указанноДля настройки параметров доступа к базе данных исго почтового адреса, совпадающего с username. При уста- пользуется файл conf.php. Берем в качестве основы conf. новке типа D (Domain Administrator) в поле username в та- php.example и редактируем его. ком случае указывается домен, а пользователь может ра// Database settings ботать с письмами и спам-листами для всего домена. Тип define(DB_TYPE, 'mysql’); A (Administrator) – администратор предназначен для работы define(DB_USER, 'mailwatch'); define(DB_PASS, 'password'); с самим MailWatch, H зарезервирован для остальных случа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 и выше можно использовать флаг управления карантином, но в этом случае необходимо отключить используемый самим MailScanner скрипт clean.quarantine, запускаемый через cron. Далее активируем QUARANTINE_USE_FLAG, т.е. меняем false на true. Ниже настраиваем параметры отправки сообщения по электронной почте о поступлении письма в карантин. Для вывода очереди сообщений (Sendmail и Exim) необходимо активировать переменную MAILQ. Затем скрипт mailq.php запускаем через cron. # cp /var/www/html/mailscanner/mailq.php /usr/local/bin # crontab -e 0-59 * * * * /usr/local/bin/mailq.php
Редактируем MailScanner.conf: Always Looked Up Last = &MailWatchLogging Detailed Spam Report = yes Quarantine Whole Message = yes Quarantine Whole Message As Queue Files = no Include Scores In SpamAssassin Report = yes Quarantine User = root QuarantineGroup = apache # т.е. та же что и у веб-сервера Quarantine Permissions = 0660 # И для редактирования спам-списков. Is Definitely Not Spam = &SQLWhitelist Is Definitely Spam = &SQLBlacklist
После чего запускаем MailScanner: # /opt/MailScanner/bin/check_mailscanner
В /var/log/maillog должна появится запись о работе с MailWatch и соединении с MySQL. Jan 2 10:48:12 grinder MailScanner[26388]: Virus Scanner version 4.45.4-1 starting... Jan 2 10:48:13 grinder MailScanner[26388]: init function MailWatchLogging Jan 2 10:48:14 grinder MailScanner[26388]: connection Jan 2 10:48:14 grinder MailScanner[26388]: database connection
MailScanner E-Mail
Config: calling custom Initialising database Finished initialising
Теперь пробуем зайти на MailWatch, набрав в строке веббраузера http://localhost/mailscanner/ и использовав в качестве логина и пароля данные администратора, созданного ранее и занесенного в таблицу users. Все, теперь можете заводить пользователей (рис. 1), просматривать отчеты, редактировать спам-листы и прочее. В документации довольно подробно описан процесс настройки MailScanner и MailWatch для работы с байесовскими фильтрами и настройка просмотра релейных сообщений для Sendmail, поэтому говорить о них не будем.
Мониторинг почтового сервера при помощи MRTG
Если MailWatch больше ориентирован на работу и более тонкую настройку самого MailScanner, то mailscanner-mrtg [3] помогает разобраться с работой почтового сервера в целом, выводя различные статистики о работе последнего. Используя его, можно получить следующую информацию:
62
системой, синяя линия указывает на количество полученных сообщений, затененная область – количество получателей (одно сообщение может иметь многочисленных получателей). Spam Identified – число сообщений, определенных как спам. Затененная область включает все сообщения, заблокированные всеми возможными средствами: правилами MTA, RBL в MailScanner и SpamAssassin. Синяя линия показывает сообщения, заблокированные только на уровне MTA. Spam as Percentage of Total Mail – процент представленной почты, определенной как спам. Отличие заключается в том, что представленная почта включает сообщения, отвергнутые MTA, т.е. не дошедшая до MailScanner. Mail Containing a Virus or Failing Content Checks – общее число обнаруженных сообщений, содержащих вредный контент. Затененная область представляет заблокированные, изолированные, удаленные сообщения, содержащие вирусы, запрещенные расширения, имена и типы файлов, html-код. Синяя линия показывает обнаруженные вирусными сканерами. MTA Processes Running и Copies Of MailScanner Running – индикаторы работы MTA и MailScanner. Bytes of Mail Transferred – этот граф, показывающий количество информации, прошедшей через MTA, позволяет оценить нагрузку, вызванную внешней почтой. В течение дня график должен расти равномерно, резкие всплески или плоский график могут свидетельствовать о проблемах. Ram Usage – использование памяти. Затененная линия показывает количество ОЗУ с используемым дисковым кешем, синяя область – общее количество затребованной памяти, включая своп. Number Of Files In Incoming Queue и Number Of Files In Outgoing Queue – вывод количества файлов во входящей и исходящей очередях, резкие изменения в любом из этих графиков могут свидетельствовать о проблеме. Number Of Files / Messages In Quarantine – количество файлов (затененная область) и сообщений (синяя линяя) в карантине. Machine Load Average и CPU Utilization Percentage – показатели загрузки системы. Processing Speed – скорость обработки почты MailScanner. Для работы этого параметра необходимо выставить Log Speed = yes в MailScanner.conf. В отличие от большинства других графов, низкий показатель предполагает проблему. Average Number of Messages Per Batch – среднее количество сообщений при обработке пакета помогает разобраться в Processing Speed, поскольку скорость обработки зависит и от размера. Viruses and Blocked Content as Percentage of Total Mail – показывает процент обработанной почты, содержащей запрещенный контент или вирус. Синяя линия указывает на вирусы, затененная область суммарно запрещенный контент и вирус. Disk Space Used in / – занятость в процентном отношении корневой файловой системы.
безопасность 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 в конфигурационном файле). С работой этой системы можно ознакомиться, обратившись к [7], правда, на момент написания статьи там была установлена более ранняя версия (текущая 0.10). Установка никаких сложностей не представляет. Скачиваем архив размером 64 Кб, распаковываем и даем команду ./install.pl внутри каталога (некоторые опции можно просмотреть, используя ключ-help). После чего скрипт выведет текущие настройки. Location of perl: Installation Prefix: Program Location: Libraries Location: Documentation Location: Man pages Location: MRTG Config directory: MailScanner Config directory: WWW root: Apache configuration dir: Location of mrtg: Location of uptime: Use SNMP: Cron job in cron.d:
/usr/bin /usr ${prefix}/sbin ${prefix}/lib ${prefix}/share/doc ${prefix}/share/man /etc/mrtg /etc/MailScanner /var/www/html /etc/httpd/conf /usr/bin/mrtg /usr/bin/uptime n /etc/cron.d
Далее все файлы будут скопированы на свои места, и будет предложено отредактировать конфигурационный файл mailscanner-mrtg.conf, который затем будет помещен на свое место, т.е. в /etc/mrtg. Файл хорошо комментирован, имеются готовые шаблоны, некоторые опции приведены выше, некоторые совпадают с MailScanner.conf, поэтому особенных трудностей при его редактировании возникнуть не должно. Обязательно проверьте правильность всех путей в файле и установки MTA. В крайнем случае картинки с неправильными параметрами будут пустыми, и вы сами сможете быстро определить проблему. Главным является Perlскрипт /usr/sbin/mailscaner-mrtg с модулями, расположенными в каталоге /usr/lib/MailScanner-MRTG/MSMRTG. MRTG традиционно генерирует графики через определенное время. Для этого используется скрипт mailscanner-mrtg.crond, который после установки должен лежать в /etc/cron.d. */5 * * * * root /usr/bin/mrtg /etc/mrtg/mailscanner-mrtg
То есть скрипт будет выполняться каждые 5 минут. Для проверки работоспособности лучше выполнить эту команду в консоли и проследить за отсутствием ошибок. Перезапускаем веб-сервер и заходим по адресу http://localhost/mailscanner-mrtg (рис. 2). По щелчку на конкретном графике будет выдана статистическая информация за день, неделю, месяц и год.
№1, январь 2006
Рисунок 1. Создание нового пользователя для доступа к MailWatch
Рисунок 2. Вывод статистики MailScanner-MRTG
Анализ почты с Vispan Vispan (VIrus and SPam ANalyser), представляющий собой Perl-скрипт, анализирующий файлы журналов и использующий библиотеку GD для построения графиков (полный список зависимостей найдете на сайте). Последняя версия 2.0.2 датирована 6 января 2004 года, поэтому можно предположить о приостановке работ. Тем не менее Vispan имеет свои особенности, о которых следует рассказать. Проект [4] немного похож по возможностям на предыдущий, только его графики больше ориентированы на статистику сообщений, и меньше выводят системную информацию. С его помощью получите полную статистику о размере очереди входящих и исходящих сообщений, включая спам и вирусы (количество и процент от общего числа), времени прохождения по MailScanner, количестве блокированных IP-адресов, времени последнего обновления антивирусных баз. Кроме того, будет выведен список наиболее часто попадающихся вирусов и спама. Кроме вывода статистики сценарий может автоматически добавлять адреса спамеров в конфигурационный файл sendmail или в правила iptables. Этот адрес может автоматически удаляться после указанного промежутка времени. Если с этого адреса спам будет получен вторично, то промежуток времени нахождения в черном списке будет каждый раз удваиваться. Ознакомительная версия доступна по адресу [8].
63
безопасность И приступаем к редактированию конфигурационного файла /etc/Vispan.conf. Основные параметры которого приведены ниже. # Использование sendmail для блокировки спамерских адресов UseAccess = 0 # Использование IPtables для блокировки спамерских адресов. # Одновременное использование UseAccess и UseIPTables # смысла не имеет UseIPTables = 1 # Использование эвристического удаления адресов из # блокировки. Иначе будет сохраняться весь список спамеров UseHeuristics = 1 # Первичная блокировка адреса в минутах, далее время # будет постоянно удваиваться BlockTime = 7200 # 5 дней Рисунок 3. Вывод статистики Vispan
# Адреса, которые не будут блокироваться. Можно задать # одиночный IP или диапазон: # 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 * * * *
Рисунок 4. Модуль webmin позволяет настроить работу MailScanner
Рисунок 5. При помощи модуля webmin настройка многочисленных параметров заметно упрощена
Установка также проста. # wget -c http://www.while.homeunix.net/mailstats/ Vispan-2.0.2.tar.gz # tar xzvf Vispan-2.0.2.tar.gz # cd Vispan-2.0.2 # perl Makefile.PL Checking if your kit is complete... Looks good Writing Makefile for Vispan
Здесь могут быть сообщения о ненайденных модулях, их необходимо будет установить. # make install
64
root
/usr/local/bin/Vispan
Первый раз его также желательно запустить самому и отследить ошибки. После этого в веб-браузере набираем http://localhost/vispan/, результат смотрите на рис. 3. Задачу настройки самого MailScanner может существенно упростить модуль для Webmin [5], который после установки появится в закладке «Службы». Далее необходимо его сконфигурировать, прописав в настройках пути к конфигурационному и исполняемым файлам и месту, куда установлен сам MailScanner. После этого выбираем необходимый пункт (рис. 4) и редактируем параметры, в большинстве случаев, только устанавливая кнопки в «Да» или «Нет». MailScanner является мощным средством для защиты электронной почты, а имеющиеся дополнения позволяют заметно упростить работу с ним и расширить его возможности. Да, кстати, 1 января 2006 года вышла новая 4.49 версия MailScanner.
Литература и ссылки: 1. Яремчук С. Защищаем электронную почту средствами MailScanner. – Журнал «Системный администратор», №12, декабрь 2005 г. – 45-51 с. 2. Сайт проекта MailWatch – http://mailwatch.sourceforge.net. 3. Сайт проекта mailscanner-mrtg – http://mailscannermrtg. sourceforge.net. 4. Сайт проекта Vispan – http://www.while.homeunix.net/mailstats. 5. Сайт проекта mailscanner-webmin – http://lushsoft.dyndns.org/ mailscanner-webmin или http://sourceforge.net/projects/msfrontend. 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. org.uk/mrtg.
bugtraq Отказ в обслуживании при обработке EIGRP-пакетов в Cisco Программа: Cisco EIGRP 1.2. Опасность: Средняя. Описание: 1. Уязвимость существует в реализации EIGRPпротокола. Удаленный пользователь может получить доступ к потенциально важным данным в EIGRP UPDATE Reply-пакетах или вызвать отказ в обслуживании с помощью большого количества HELLO-собщений. 2. Уязвимость существует при обработке Goodbye-сообщений, если не используется MD5-аутентификация. Удаленный пользователь может послать большое количество специально сформированных EIGRP-пакетов и вызвать отказ в обслуживании устройства. URL производителя: www.cisco.com. Решение: В настоящее время способов устранения уязвимости не существует.
Переполнение динамической памяти в Clam AntiVirus Программа: Clam AntiVirus (clamav) версии до 0.88. Опасность: Средняя. Описание: Переполнение динамической памяти обнаружено в файле libclamav/upx.c при обработке UPX-архивов. Удаленный пользователь может с помощью специально сформированного UPX-файла вызвать отказ в обслуживании приложения. URL производителя: www.clamav.net. Решение: Установите последнюю версию (0.88) с сайта производителя.
Уязвимость форматной строки в модуле auth_ldap в Apache Программа: auth_ldap 1.6.0 и более ранние версии. Опасность: Высокая. Описание: Уязвимость форматной строки обнаружена в функции auth_ldap_log_reason(). Удаленный пользователь может с помощью специально сформированного имени пользователя выполнить произвольный код на целевой систме. URL производителя: www.rudedog.org/auth_ldap. Решение: Установите последнюю версию (1.6.1) с сайта производителя: http://www.rudedog.org/auth_ldap/auth_ ldap-1.6.1.tar.gz.
Отказ в обслуживании в FreeBSD ipfw Программа: FreeBSD 6.x. Опасность: Средняя. Описание: Уязвимость обнаружена в модуле ipfw при обработке IP-фрагментов. Удаленный пользователь может послать ICMP IP-фрагменты, отвечающие действиям reset, reject или unreach и аварийно завершить работу межсетевого экрана. URL производителя: www.freebsd.org. Решение: Установите исправление с сайта производителя: ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-06:04/ ipfw.patch.
№1, январь 2006
Множественные уязвимости в продуктах Oracle Программа: JD Edwards EnterpriseOne 8.x, Oracle Application Server 10g, Oracle Collaboration Suite Release 1, Oracle Collaboration Suite Release 2, Oracle Database 8.x, Oracle Database Server 10g, Oracle Developer Suite 10g, Oracle EBusiness Suite 11i, Oracle Enterprise Manager 10.x, Oracle9i Application Server, Oracle9i Database Enterprise Edition, Oracle9i Database Standard Edition, Oracle9i Developer Suite, PeopleSoft Enterprise Portal 8.x. Опасность: Средняя. Описание: Обнаружено 82 уязвимости в различных продуктах Oracle, которые позволяют удаленному пользователю получить доступ к потенциально важным данным, перезаписать произвольные файлы на системе и выполнить SQL-команды. 1. Уязвимость существует из-за недостаточной обработки входных данных в различных параметрах в процедурах DBMS_DATAPUMP, DBMS_REGISTRY, DBMS_CDC_ UTILITY, DBMS_CDC_PUBLISH, DBMS_METADATA_UTIL и DBMS_METADATA_INT в пакетах Oracle PL/SQL. Злоумышленник может выполнить произвольные SQL-команды в базе данных. 2. Уязвимость существует из-за недостаточной обработки входных данных в процедурах ATTACH_JOB, HAS_PRIVS и OPEN_JOB в пакете SYS.KUPV$FT. Злоумышленник может выполнить произвольные SQL-команды в базе данных. Уязвимость обнаружена в Oracle 10g Release 1. 3. Уязвимость обнаружена в нескольких процедурах в пакете SYS.KUPV$FT_INT. Злоумышленник может выполнить произвольные SQL-команды в базе данных. Уязвимость обнаружена в Oracle 10g Release 1. 4. Ошибка дизайна обнаружена в Oracle TDE (Transparent Data Encryption) wallet, которая позволяет сохранить пароль и главный ключ в незашифрованном виде. Уязвимость существует в Oracle Database 10g Release 2 version 10.2.0.1. 5. Обнару жены ошибки в компонента х Repor ts в Application Server, которые позволяют злоумышленнику перезаписать произвольные файлы на системе. Уязвимость существует в версиях 1.0.2.0 по 10.1.0.2. 6. Уязвимость обнаружена при обработке входных данных в атрибуте AUTH_ALTER_SESSION в аутентификационном сообщении TNS. Удаленный пользователь может выполнить произвольные SQL-команды в базе данных приложения с привилегиями пользователя SYS. Уязвимость существует в Oracle 8i (8.1.7.x.x), Oracle 9i (9.2.0.7), Oracle 10g Release 1 (10.1.0.4.2) и Oracle 10g Release 2 (10.2.0.1.0). URL производителя: www.oracle.com. Решение: Установите исправления с сайта производителя.
Составил Александр Антипов
65
безопасность
Cудьба shell-кода на системах с неисполняемым стеком
Не ошибается то, что не работает (c) Windows
Крис Касперски Отчаявшись справиться со своими же собственными ошибками, компания Microsoft совместно с Intel и AMD реализовала технологию DEP, призванную покончить с удаленными атаками раз и навсегда, но этого не произошло, и защиту удалось обойти.
Н
есмотря на все усилия, вырытые рвы и воздвигнутые защитные сооружения, интенсивность удаленных атак не снижается, и отражать их становится все труднее. Хакеры научились маскировать вредоносные процессы под LINUX/BSD и NT, разобрались с брандмауэрами и освоились с распределенными системами – сотни тысяч зараженных машин, управляемых через IRC, – это настоящая армия, очень мощная и разрушительная. Интересы отдельных пользователей, пострадавших от атаки, отходят на задний план, уступая место вопросам безопасности всей инфраструктуры в целом. А инфраструктура – это уже серьезно. Анализ показывает, что подавляющее большинство атак используют ошибки переполнения, фундаментальную природу которых мы уже обсуждали (см. «Ошибки переполнения буфера извне и изнутри как обобщен-
66
ный опыт реальных атак»). Львиная до- тузиазма и встала на коммерческий ля таких ошибок находится в Internet поток с большими вложениями. СтоExplorer, что, в частности, и явилось имость гарантированно работающего причиной перехода NASA на FireFox эксплоита зачастую доходит до $2 000. (http://www.securitylab.ru/news/242844. Можно только догадываться, кому и заphp?R1=RSS&R2=allnews), что можно чем это нужно… только приветствовать. Однако FireFox В очередной раз возникло понима(как и все остальные браузеры) не сво- ние, что «дальше так жить нельзя» (c) боден от ошибок, и в нем присутствует и нужно что-то решать. Попытки побольшое количество критических уяз- кончить с удаленными атаками неодвимостей, позволяющих злоумышлен- нократно предпринимались еще с 80-х нику выполнить свой код (далее по тек- годов, особенно после Червя Морриса, сту называемый shell-кодом). Вот но все безуспешно. Как говорят в этих только одна из таких дыр: http://www. случаях американцы: серебряной пуsecuritylab.ru/vulnerability/240254.php. ли нет! Оборотня не убить! Тем не меНикакое программное обеспече- нее, Microsoft решилась на отчаянный ние небезопасно! Даже если своевре- шаг и возродила старые идеи, отрыменно устанавливать свежие заплат- тые на помойке истории и реализоки, всегда существует риск, что хакер ванные без учета понимания ситуанайдет новую дыру, о которой еще ник- ции наших дней. Технология DEP (Data Execution то не знает, и с успехом воспользуется ею. Кстати говоря, разработка атакую- Protection – защита от выполнения данщих программ за последние несколь- ных), реализованная в Windows XP SP2 ко лет поднялась с колен чистого эн- и Server 2003 SP1, делает секцию дан-
безопасность ных, стек и кучу неисполняемыми, что (теоретически) предотвращает засылку shell-кода и отсекает целый класс удаленных атак, основанных на переполнении. В чем же революционность такого решения? Ведь еще со времен Windows 95 (не говоря уже про стандарт POSIX, принятый в 1985 году) x-атрибут (от eXecutable – исполняемый) имеется только у кодовой секции и отсутствует у всех остальных. Достаточно взять любой ELF/PE-файл и посмотреть! Так-то оно так, но… у x86-процессоров на этот счет имеется свое собственное мнение: на уровне страниц процессор поддерживает всего лишь два атрибута защиты: -a- (от accessed – страница доступна для чтения/исполнения) и -w- (от write – запись в страницу разрешена). Никакого x-атрибута в PTE нет, и он присутствует только в таблице селекторов, а это значит, что мы не можем выборочно разрешать/запрещать исполнение кода для отдельных страниц, а только для всего сегмента целиком. Вот потому Windows с ее плоской моделью памяти вынуждена трактовать атрибут -r- как -x-, а -x- как -r-. То есть, право на чтение страницы дает неявное право на ее исполнение и наоборот. На самом деле, никакого произвола со стороны процессора здесь нет: проблему можно решить и в рамках плоской модели. Достаточно «всего лишь» перегруппировать сегменты и установить правильные лимиты (см. рис. 2). Естественно, это требует больших телодвижений со стороны разработчиков ядра (необходимо использовать раздельные ITLB/DTLB и т. д.), что их совсем не вдохновляет. Почему же в x86 не была предусмотрена возможность задания x-атрибута на уровне страниц? Риторический вопрос… Скорее всего, во времена проектирования 80386 это было никому не нужно, вот и решили не усложнять логику процессора без необходимости. А вот в Itanium этот атрибут присутствует изначально, и специальный бит, известный под аббревиатурой XD (от eXecute Disable – выполнение запрещено), определяет, разрешено ли выполнение кода в данной странице или нет. Аналогичный бит имеется и в процессорах AMD-64 (Opteron и Athlon 64),
№1, январь 2006
только там он называется NX (от NoeXecute – не выполняемый). Кому-то в компании пришла в голову «здравая» мысль объявить x-атрибут «технологией», и вокруг NX-бита тут же развернулась рекламно-маркетинговая акция «Enhanced Virus Protection» (расширенная вирусная защита), или сокращенно EVP. На сайте компании выложено множество красочных роликов, демонстрирующих, как AMD борется с вирусами на уровне процессора (!). Неудивительно, что 64-битная редакция NT от рождения имеет неисполняемую кучу и стек! Microsoft просто подхватила брошенный ей атрибут защиты и встроила его в систему, чтобы лишний раз продемонстрировать, что она не отстает от прогресса. В этом-то и заключается сущность аппаратного (hardware-enforced) DEP. Воспользовавшись шумихой, развернутой AMD, компания Intel внедрила поддержку XD-бита в 32-разрядные Pentium, сделав эту «технологию» доступной всем и каждому (желающих пересесть на AMD-64 ради одного лишь DEP набралось не так уж и много). Строго говоря, Nx присутствует не только в «настоящих» 64-битных процессорах от AMD, но и в собранных на 64-битном ядре 32-битных (т.е. работающих в состоянии перманентной эмуляции i386) процессорах – например, Sempron (около 99$ за штуку). Достаточно лишь воткнуть последний Pentium-4 и обновить ядро, чтобы Windows могла задействовать новые аппаратные возможности, и тогда при попытке выполнения прикладного кода в куче, секции данных или в стеке возбуждается исключение типа STATUS_ACCESS_VIOLATION (C0000005h), и если только программист не установил свой обработчик SEH, выполнение программы аварийно завершается с выдачей сообщения «to help protect your computer, Windows has closed this program» (см. рис. 5). В режиме ядра при попытке выполнения кода в неисполняемой области памяти возбуждается исключение ATTEMPTED_EXECUTE_OF_ NOEXECUTE_MEMORY c BugCheckкодом FCh, обрушивающим систему в «синий экран». 64-битные версии NT защищают от исполнения стек ядра, paged- и session pool, а 32-битные – только стек.
Рисунок 1. Схематичное изображение стека. Стрелка показывает направление, в котором растет стек. Локальный буфер «растет» в противоположном направлении и при определенных обстоятельствах может затирать адрес возврата
Рисунок 2. «Эмуляция» NX/XD-битов на x86-процессорах
Рисунок 3. Организация виртуальной памяти
Рисунок 4. NX-бит — новый атрибут защиты в PDE/PTE
Если процессор не поддерживает NX/XD-битов, система активирует программный (software-enforced) DEP, который даже и не пытается эмулировать неисполняемый стек/кучу (а ведь мог бы!). Технология, которую продвигает Microsoft, в действительности представляет собой примитивную защиту обработчика структурных исключений, ранее известную под именем SafeSEH. Она никак не препятствует выполнению shell-кода, но затрудняет использование им структурных исключений, если тот вдруг решит их использовать. Подробнее об этом можно прочитать в статье «SEH на службе контрреволюции», электронная копия которой лежит на сервере ftp://nezumi.org.ru. Мы будем обсуждать только аппаратный DEP, поскольку его сложнее всего обойти. Некоторые даже считают, что это невозможно вообще: «…на сегодняшний день не существует ни одного хотя бы концептуального эксплойта, на практике до-
67
безопасность
Конфигурирование DEP
ное количество уже написанного ПО, трактующего атрибут -r- как -x- и отказывающегося работать, если это не так. Поэтому для сохранения обратной совместимости Microsoft предусмотрела возможность отключения DEP для 32-битных редакций NT и 32-битных приложений, исполняющихся в 64-битных редакциях NT. Чтобы задействовать механизм DEP, необходимо иметь процессор, поддерживающий NX/XD-биты, причем 32-битные процессоры поддерживают NX-бит только в режиме PAE (Physical Address Extension – расширение физических адресов). 32-битные редакции NT автоматически распознают тип процессора, при необходимости добавляя ключ /PAE в файл boot. ini. 64-битные редакции не имеют отдельного PAE-ядра (они работают через технологию расширения окна адресации Address Windowing Extension – AWE), поэтому добавлять ключ /PAE для них не нужно. Если не указывать никаких дополнительных ключей, то в 32-битных редакциях NT будет запрещено выполнение кода на стеке, в ядре и в некоторых системных службах прикладного уровня. Все остальные приложения будут исполняться в обычном режиме. 64-битные версии по умолчанию разрешают выполнение кода на стеке/куче только для 32-битных приложений, а для 64-битных они запрещены (см. рис. 6). Ключ /execute полностью отключает DEP для 32-битных редакций NT и 32-битных приложений, исполняющихся под 64-битными редакциями NT, но на «родные» 64-битные приложения его влияние не распространя-
64-битные редакции NT при работе в native-режиме всегда задействуют DEP и не позволяют его отключать. Если разработчику хочется выполнить код на стеке или в куче (а хочется это достаточно часто), он должен явно назначить атрибуты доступа к данному региону памяти путем вызова API-функции VirtualAlloc или VirtualProtect. Никаких прав для этого не нужно, так что мы получаем лишь видимость безопасности – защиту от непреднамеренного доступа, но не более того, и чуть позже мы покажем, как ее обойти. С 32-битными приложениями все намного сложнее. Существует огром-
По данным компании Intel, XD-бит поддерживают следующие операционные системы, предотвращая непреднамеренное исполнение кода в неисполняемых областях памяти (однако преднамеренных хакеров эта мера не остановит, и все системы могут быть атакованы, Windows – проще, Red Hat – сложнее): Microsoft Windows Server 2003 with Service Pack 1; Microsoft Windows XP with Service Pack 2; SUSE Linux 9.2; Red Hat Enterprise Linux 3 Update 3.
Рисунок 5. Реакция DEP на попытку выполнения кода на стеке
Рисунок 6. Регионы памяти, защищенные от выполнения кода
Рисунок 7. Конфигурирование DEP через редактирование файла boot.ini в Notepad
казывающего возможность поражения Windows XP с установленным пакетом обновления Service Pack 2» (www.computerra.ru/softerra/36652). Если бы DEP проектировался головой, все так бы и было. Однако Microsoft идет своим особым путем, который умом не понять, и DEP обходится без труда, а вот у легальных пользователей возникает множество проблем, о которых мы еще поговорим. Неправильно называть DEP защитным механизмом. До «защитного механизма» ему так же далеко, как одиноко торчащему рулю до самосвала. DEP – это всего лишь поддержка атрибутов защиты страниц и ничего более!
68
Кто поддерживает XD-бит
ется, и они по-прежнему остаются защищены. Ключ /noexecute=уровень_политики позволяет конфигурировать DEP по своему усмотрению, выбирая требуемый уровень защищенности. Параметр «уровень_политики» может принимать одно из следующих значений: AlwaysOn, AlwaysOff, OptIn и OptOut, описанных в таблице 1. Если редактирование boot.ini приводит вас в ужас (что в общем-то вполне закономерно, поскольку после этого система может перестать загружаться), воспользуйтесь интерактивным конфигуратором: В ко м а н д н о й с т р о ке в в е д и те «start sysdm.cpl» или нажмите <win>+<break>. На вк ла дке «Дополнительно» в группе «Быстродействие» нажмите кнопку «Параметры». Перейдите на вкладку «Предотвращение выполнения данных». Выберите пункт «Включить DEP только для основных программ и служб Windows», чтобы добавить в boot.ini, параметр OptIn или выберите «Включить DEP для всех программ и служб, кроме выбранных ниже», чтобы добавить параметр OptOut. Другие параметры через интерактивный конфигуратор добавить невозможно. Если был выбран параметр OptOut, нажмите кнопку «Добавить» и укажите программы, на которые DEP распространяться не должна. Список программ, для которых отключен DEP, можно сформировать и через реестр (чисто хакерский путь, экономящий массу времени). Просто откройте ключ HKLM\SOFTWARE\ Microsoft\Windows NT\CurrentVersion\ AppCompatFlags\Layers и создайте новый ключ типа «строка». Его имя должно содержать полный путь к exe-файлу, защиту которого мы хотим отключить, поместив внутрь ключа значение «DisableNXShowUI». Только не перепутайте их местами – иначе ничего не получится.
Проблемы совместимости Исполняемый стек необходим очень многим приложениям: защитным механизмам, эмуляторам, just-in-timeкомпиляторам и т. д. Попытки сделать
безопасность Таблица 1. Влияние уровня политики Со сторонними производителястек неисполняемым неоднократно на безопасность предпринимались еще в 70-80-х го- ми дело обстоит еще хуже. НавесПараметр Значение дах, когда никакого Windows и в про- ные упаковщики и протекторы, исDEP включена только для ограекте не существовало, но… они как- пользующие самомодифицирующийOptIn ниченных системных процессов (по умолчанию) то не прижились. А все из-за проблем ся код и другие антихакерские трюки, Windows и ядра совместимости. Кому нужна операци- не могут работать с неисполняемым DEP включена для всех процессоонная система, если на ней нельзя за- стеком, а это значит, что защита DEP ров и ядра, однако можно сформиOptOut ровать список приложений, на копускать свои любимые приложения? для них должна быть отключена. Коеторые защита не распространяется Выхода нет. Или безопасность, или кто может возразить, что все проблеDEP включена для всех процессосовместимость. Компромисс невозмо- мы от «неправильного» стиля програм- AlwaysOn ров и ядра. Отключить защиту для выборочных приложений нельзя жен. Разве только что… рассказывают мирования и использования «недокуDEP отключена для всех процес(врут, конечно), что давным-давно ста- ментированных» особенностей систеAlwaysOff сов и ядра ли греки строить баню. И озадачились мы (которые на самом деле очень даони вопросом: стоит ли строгать доски же документированные), однако проили нет? Ведь если не построгать, мож- блемы встречаются не только у кустано легко занозиться, а если постро- рей, но и весьма именитых фирм, нагать… попробуй тут не поскользнуть- пример, 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. Интерактивное конфигурирование DEP install Windows CE 4.x Emulator on use this method by itself to attempt to 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
безопасность
Рисунок 10. Классическая удаленная атака — засылка shell-кода в стек с последующей передачей на него управления путем модификации адреса возврата
атаки становится переданный и успешно выполненный shell-код, выполняющий команды, заранее подготовленные злоумышленником. Чтобы понять, как это делается, сначала необходимо разобраться с классическими методами переполнения, подробно разобранными в статье «Ошибки переполнения буфера извне и изнутри как обобщенный опыт реальных атак». Напомним читателю ее основные положения: отсутствие контроля границ локальных буферов позволяет затирать адрес возврата из функции, помещая сюда указатель на shell-код, который находится здесь же, в стеке. Другой тип переполнения связан с кучей. С его помощью хакер может модифицировать любую writable ячейку в адресном пространстве уязвимого процесса (например, подменить указатель на виртуальную функцию или подделать адрес возврата). Имеются и другие возможности (в частности, атакующий может изменить обычный порядок выделения блоков памяти из кучи, разместив следующий выделяемый блок поверх ключевых структур данных), но для простоты изложения мы ограничимся модификацией адреса возврата. Существует множество защитных механизмов, контролирующих целость кучи и адреса возврата, но… со своей задачей они не справляются. Это отдельная большая тема, никак не связанная ни с NX/XD-битами, ни с технологией DEP. В следующих статьях мы подробно рассмотрим ее, но… это будет потом. Сейчас же ограничимся тем, что DEP никак не препятствует модификации адреса возврата и существует множество программ, действительно позволяющих это делать (Internet Explorer, FireFox и др.). Манипулируя адресом возврата, хакер может вызывать произвольные функции уязвимой программы (в том числе и API-функции операционной системы), передавая необходимые параметры через стек. Конечно, при
70
этом он будет очень ограничен в своих возможностях, поскольку среди готовых функций полезных для хакерствования не так уж и много, однако если как следует подумать головой, проблему удается решить путем вызова API-функции CreateProcess или функции System из библиотеки CRT, запустив штатную программу типа tftp.exe и закачав на атакуемый компьютер двоичный файл, который можно исполнить с помощью CreateProcess/ System (атака типа return-to-libc). Механизм DEP этому сценарию никак не препятствует, поскольку в этом случае shell-код передается не через стек/кучу, а через легальный исполняемый файл. На стеке содержатся лишь аргументы вызываемых функций и «поддельные» адреса возврата, указывающие на них. Таким образом, даже при включенном DEP у хакера сохраняется возможность забрасывать на атакуемую машину свой код и передавать на него управление. Наличие tftp.exe не является необходимым условием для атаки. Даже если его удалить, хакер может вызвать cmd.exe и… нет, удалять все файлы с диска необязательно (хотя и возможно), достаточно перенаправить вывод в файл и с помощью ECHO создать крохотный com, делающий что-то «полезное». Да и в самой уязвимой программе наверняка содержатся функции, через которые можно загрузить файл из Интернета… Словом, возможностей – море! Атаки этого типа хорошо изучены хакерами и описаны в литературе. Только специалисты из Microsoft похоже об этом ничего не знают, иначе как можно объяснить тот загадочный факт, что успешность атаки данного типа никак не зависит от активности DEP и старые эксплоиты полностью сохраняют свою работоспособность. Распространение червей останавливается только потому, что вместе с DEP пакет обновлений включает в себя заплатки на все известные дыры. Однако стоит хакерам найти еще одну ошибку переполнения (а это всего лишь вопрос времени), как Интернет захлестнет новая эпидемия, и никакой DEP ее не остановит. (Вообщето, нет, не захлестнет, ведь автоматическое обновление теперь включено по умолчанию.) Некоторые могут сказать, что это
«ненастоящая» атака, поскольку в ней отсутствует явная передача shell-кода через стек, а ведь именно на это DEP и рассчитан! Мысль, конечно, умная, но забавная. И какой это хакер бросится на амбразуру, если можно сходить в обход? Неужели в Microsoft всерьез считают, что атакующий играет по «правилам» и идет по пути наибольшего сопротивления, карабкаясь по извилистой горной тропинке, напичканной патрулями, когда столбовая дорога никем не охраняется?! В качестве разминки для мозгов рассмотрим альтернативный сценарий атаки, передающий shell-код через стек. Засунуть shell-код в локальный буфер – не проблема, подменить адрес возврата тоже, но… при попытке передачи управления на shell-код при активном DEP будет возникать исключение, ведь x-атрибута у нас нет, хотя… это смотря, что мы переполняем. Как уже говорилось выше, некоторые приложения (в том числе и браузеры) нуждаются в исполняемом стеке, в который они складывают откомпилированный java-код. Но не будем смягчать себе условия. Давайте считать, что никаких исполняемых страниц в нашем стеке нет. Чтобы их заполучить, необходимо либо сбросить NX/XD-бит (но это можно делать только система), либо… вызывать функцию VirtualProtect, назначая атрибуты защиты по своему желанию! Но как же мы вызовем VirtualProtect без возможности выполнения shell-кода? Да очень просто – скорректируем адрес возврата так, чтобы он указывал на VirtualProtect, тогда при выполнении команды return она передаст на нее управление! На самом деле, это только идея. До практической реализации ей еще далеко. В жизни все намного сложнее и… элегантнее. Допустим, вызвали мы VirtualProtect. А дальше что? Куда она возвратит управление? И как узнать адрес выделенного блока? Это великолепная головоломка, на решение которой автор этой статьи потратил целый день и был очень разочарован, когда узнал, что он не один такой умный, и все загадки разгадали еще до него. Взгляните на рис. 11. Специалисты поймут идею с первого взгляда, неспециалистам мы сейчас все объясним.
безопасность
Рисунок 11. Подготовка стека для реализации атаки типа commit-n-copy
Итак, все по порядку. Начнем с ответа на вопрос: куда возвращает управление VirtualProtect? Ответ очевиден: по указателю, который лежит за модифицированным адресом возврата! В момент выхода из VirtualProtect, процессор сталкивает текущий адрес возврата с вершины стека и удаляет переданные ей аргументы. Так происходит потому, что VirtualProtect (как и все API-функции) придерживается соглашения о передаче параметров типа stdcall, при котором аргументы удаляются самой вызываемой функцией. Таким образом, мы можем вызывать столько stdcall-функций, сколько захотим. Процессор будет послушно стягивать их со стека, поступательно двигаясь от вершины вглубь. Техника вызова cdecl-функций выглядит чуть сложнее. Они не очищают аргументы при выходе, и атакующему приходится это делать самостоятельно. Проще всего перенаправить адрес возврата на код типа «ADD ESP,n/RET», расположенный где-то внутри уязвимой программы, где n – количество байт, занятых аргументами. Такую комбинацию можно встретить практически в любом оптимизированном эпилоге. Ну а нужное n подобрать совсем несложно! Теперь мы знаем, как вызывать функцию для изменения атрибутов доступа и вернуться обратно в shellкод, но это еще не все. Функция VirtualProtect требует, чтобы ей передали адрес уже выделенного региона, а shell-коду он неизвестен. К тому же, по слухам, Microsoft собирается встроить в VirtualProtect дополнительную проверку, запрещающую назначать xатрибут, если он не был присвоен еще при выделении. Тупик? Не совсем, ведь мы можем выделить новый регион, на-
№1, январь 2006
значить нужные права, скопировать туда свой shell-код и передать ему управление. С выделением никаких проблем нет – берем VirtualAlloc и вперед. Как прочитать возвращенный указатель – вот в чем вопрос! Функция передает его в регистре EAX, и заранее предсказать его значение невозможно. А ведь хакер должен сформировать указатель и затолкать его в стек еще на стадии проектирования shell-кода, то есть задолго до вызова VirtualAlloc. Ну теперь уж точно тупик… А вот и нет! Внимательное чтение SDK (или Рихтера) показывает, что Windows позволяет COMMIT (то есть передавать) уже переданную память по заданному адресу и хотя последствия такого выделения могут быть очень печальными (для кучи) – кого это волнует?! Главное, чтобы shell-код получил управление, и он его получит! Выбираем произвольный адрес, который с высокой степенью вероятности не занят ничем полезным (например, 191000h), и передаем его функции VirtualAlloc вместе с флагом MEM_COMMIT и атрибутами PAGE_EXECUTE_READWRITE. Все! Первая стадия атаки благополучно завершилась, и теперь можно глотнуть пива. На втором шаге мы вызываем функцию memcpy и копируем shell-код в только что выделенный регион памяти, целевой адрес которого заранее известен. После этой операции shell-код оказывается в области памяти, где разрешено выполнение, и нам остается только засунуть в стек еще один подложный адрес возврата, который будет указывать на shell-код (внимание! функция memcpy в отличие от VirtualAlloc придерживается cdecl соглашения, поэтому после нее мы уже не можем выполнять никакие другие функции, предварительно не удалив аргументы со стека). Последовательность вызовов, реализующих атаку, выглядит так (напоминаем: это не shell-код, это именно последовательность вызовов APIфункций, осуществляемая путем подмены адресов возврата): Листинг 1. Последовательность вызова функций, реализующих атаку типа commit-n-copy VirtualAlloc(REMOTE_BASE, ↵ SHELLCODE_LENGTH, MEM_COMMIT, ↵ PAGE_EXECUTE_READWRITE);
memcpy(REMOTE_BASE, SHELLCODE_BASE, ↵ SHELLCODE_LENGTH); GOTO shell_code;
Маленький нюанс – 64-битные редакции NT передают аргументы API-функциям через регистры, и потому вызывать VirtualAlloc на них уже не удастся (разумеется, речь идет только о 64-битных приложениях). То есть вызывать-то удастся, а вот передать аргументы – нет, поэтому этот сценарий уже не сработает, однако вызов функций уязвимой программы через подмену адреса возврата будет действовать по-прежнему (то есть запустить tftp.exe мы все-таки сможем, вызывая ее через функцию System, которая по-прежнему принимает аргументы через стек). Подведем итог: стечение ряда неблагоприятных для DEP обстоятельств делает эту технологию практически полностью бесполезной. Да, она отсекает целый класс атак, основанных на переполнении, однако дает пищу для новых, и в целом ситуация никак не меняется. Забавно, но большинство людей (в том числе и администраторов!) совершенно не понимают, что такое DEP, зачем он нужен, какие цели преследует и в чем заключается взлом. Достаточно почитать дискуссию, развернувшуюся на http://www.mastropaolo.com/?p=13, чтобы убедиться, что оба предложенных сценария обхода DEP не считаются взломом, поскольку x-атрибут присваивается «легальным» способом через вызов VirtualAlloc. На самом деле суть взлома вовсе не в том, чтобы выполнить код в области памяти без x-атрибута (это действительно невозможно), а в том, чтобы использовать уязвимое ПО в своих хакерских целях. В идеале DEP должен представлять собой целый комплекс защитных мер, предотвращающих это, но ничего подобного он не делает, ограничиваясь простой формальной поддержкой NX/XD-атрибутов. Перечислим те обстоятельства, которые ему мешают: параметры API-функций передаются через стек; адреса API-функций и положение вершины стека легко предсказуемы; всякий процесс может пометить любой регион памяти как «исполняемый»;
71
безопасность Прототип функции VirtualAlloc Функция VirtualAlloc занимается выделением (allocate) и передачей (commit) виртуальной памяти, с одновременной установкой прав доступа на чтение/запись/выполнение: Листинг 2. Функция VirtualAlloc и ее прототип LPVOID VirtualAlloc ( LPVOID lpAddress, SIZE_T dwSize, WORD flAllocationType, DWORD flProtect );
Назначение аргументов в функции следующее: Таблица 2. Аргументы функции VirtualAlloc Аргумент
Значение
lpAddress
Указатель на передаваемый регион памяти
dwSize
Размер передаваемого региона
flAllocationType
Тип запроса, MEM_COMMIT (1000h) – передача памяти
flProtect
Атрибуты защиты, PAGE_EXECUTE_ READWRITE (40h) – rwx
функция VituallAlloc позволяет вы- мам. В общем, большой популярности это решение не получило. Неисполняемый стек – это всего лишь одна из защитных мер, которая оправдывает себя только в совокупВ лагере UNIX Ошибки переполнения не являются ности с целым комплексом остальных. «собственностью» Windows. Это об- Так, например, бессмысленно ставить щая проблема для всех программ бронированную дверь, если можно заС/С++, родиной которых был и остает- лезть через окно. Рассмотрим возможся UNIX. Уязвимые приложения в изобилии встречаются и там. С ними ак- BufferShield или PaX на NT тивно борются путем хитроумных из- Пакет BufferShield – это достойный конвращений и оригинальных техничес- курент штатному DEP, не требующий уских решений, о которых мы и собира- тановки SP2, работающий без аппаратемся сейчас рассказать. ной поддержки со стороны процессора, Начнем с того, что существуют использующий рандомизацию раскладпроцессорные архитектуры (SPARC, ки адресного пространства и задействуюSPARC64, Alpha, HPPA), на которых щий NX/XD-биты, если они есть. Он значиUNIX имеет неисполняемый стек еще тельно превосходит DEP по защищенности от рождения. Существуют архитекту- и атаковать его очень сложно (тем не менее ры, использующие раздельные сте- некоторые лазейки все-таки есть, в частки для хранения адресов возврата ности, из-за отсутствия GOT рандомизаи локальных переменных. Подменить ция выполняется не полностью, оставляя адрес возврата на них невозможно, в памяти значительное количество предно легко затереть указатель на функ- сказуемых адресов). цию, при вызове которой управление Защищать можно как отдельные приполучит shell-код (правда, передача ложения (например, пресловутый Internet аргументов представляет собой боль- Explorer), так и определенный диапазон шую проблему, особенно если они пе- памяти внутри конкретного приложения. редаются через регистры, тем не ме- Так же поддерживаются и многопроцеснее атаковать такую систему все-та- сорные системы (правда, только для «одки возможно, пусть и на концептуаль- нополых» процессоров, то есть если один ном уровне). процессор имеет поддержку 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. помешало многим «честным» програмОсновные свойства продукта: делять/передавать уже переданную память.
72
ности, которые предоставляет популярный пакет PaX, распространяемый на бесплатной основе вместе с исходными текстами и подробной технической документацией, из которой можно почерпнуть массу интересного. Первое и главное – PaX не требует специальной поддержи со стороны оборудования и не нуждается в битах NX/XD. Вместо этого он группирует сегменты, как показано на рис. 2, и устанавливает лимиты так, чтобы они не пересекались. Несомненный плюс такого решения в том, что для защиты от хакеров нам не нужно приобретать новый процессор – это раз. Shell-код не сможет выделить исполняемый регион в области кучи или стека – это два. Тоже самое, впрочем, относится и к justin-time компиляторам, поэтому с совместимостью будут проблемы, которые PaX обходит довольно элегантным путем. При аппаратной поддержке со сто-
распознает выполнение кода на стеке,
куче, виртуальной памяти и сегменте данных; запрашивает подтверждение на завершение, если обнаружено переполнение буфера; ведет отчет обнаруженных переполнений в протоколе событий (Windows event log); позволяет вк лючать защиту даже для отдельных частей выбранных приложений (!!!); поддерживает NX-бит и задействует его, если доступен (но может работает и без него); поддерживает симметричные многопроцессорные системы (SMP) с однополыми ЦП; рандомизует раскладку адресного пространства (технология ASLR).
Рисунок 12. Окно настройки BufferShiled
безопасность роны ЦП (биты NX/XD) он может защищать не только весь процесс целиком, Глоссарий но и его отдельную часть. Допустим, 1. A S L R ( A d d r e s s S p a c e L a y o u t Randomization – рандомизация расмы имеем приложение, нуждающееся кладки адресного пространства): в исполняемом стеке, но не присваивамощная технология защиты против ющее x-атрибут явно. Под Windows мы shell-кода, основанная на непредскабудем вынуждены занести его в список зуемом изменении адресов системпрограмм, на которые механизм DEP ных функций, расположения стека, исне распространяется, со всеми вытекапользуется в пакете PaX и Exec Shield, ющими отсюда последствиями. А PaX но только не в DEP: http://en.wikipedia. позволяет отключить защиту лишь для org/wiki/ASLR. части стека! Конечно, это снижает иммунитет системы, но не так радикаль- 2. DEP (Data Execution Prevention – предотвращение выполнения данных): но, как полное отключение DEP. К тосовокупность программных и аппаму же рандомизация адресов не позратных технологий, призванных преволяет shell-коду добраться до этой исдотвратить выполнение shell-кода, полняемой области и использовать ее но в действительности с этим не справв своих целях. ляющихся. DEP может быть как аппаВторым китом является технолоратным (hardware-enforced), так и прогия рандомизации адресного программным (software-enforced). Аппаратстранства – Address Space Layout ный DEP фактически сводится к поддеRandomization или сокращенно ASLR. ржке NX/XD-бита, программный предЕсли при каждом запуске программы ставляет собой SafeSEH. непредсказуемым образом менять положение всех сегментов, хакер не смо- 3. EVP (Enhanced Virus Protection – расширенная вирусная защита): маркежет определить ни расположение shellтинговый трюк AMD, выдающий XD-бит кода, ни адреса API-функций (это утза «технологию защиты против вируверждение справедливо даже для тех сов». клонах UNIX, в которых вызов API-функций происходит через прерывание, Третий кит – PaX «дорабатывает» например в Linux/i386, поскольку прикладные процессы общаются с ядром функцию mprotect так, чтобы назнане напрямую, а через разделяемые чать x-атрибут могла только система. библиотеки, придерживающиеся со- Никакой прикладной процесс не моглашения stdcall, и являющиеся свое- жет изменить атрибуты региона памяобразным аналогом KERNEL32.DLL), ти с -x на +x. Также никакой регион паследовательно, подмена адреса воз- мяти не может иметь -x- и -w- атрибуты врата не дает ничего кроме DoS. Па- одновременно. Пакет PaX портирован кет PaX позволяет рандомизовать ос- на множество систем, в том числе и… новные сегменты ELF-файла (code, под Windows. Существует по меньшей data, bss), кучу, библиотечные фун- мере два приличных порта для NT – кции, стек потока, разделяемую па- BufferShield (см. одноименную врезку) мять и стек ядра, короче устраивает и StackDefender (http://www.ngsec.com/ настоящий хаос, в котором не оста- ngproducts/stackdefender), которые в отется ничего постоянного, за что мож- личие от штатного DEP действительно но было бы уцепиться. Ну или практи- защищают компьютер от вторжения, и преодолеть их ну очень трудно. чески ничего.
Рисунок 13. Окно конфигурации пакета StackDefender
№1, январь 2006
4. PAE (Physical Address Extension – режим расширения физических адресов): специальный режим 32-разрядных x86-процессоров, в котором они могут адресовать больше памяти и использовать дополнительные возможности (в частности, атрибут NX); 5. PTE (Page Table Entry – элемент каталога страниц): структура данных, описывающая свойства «своей» страницы виртуальной памяти и задающая права доступа. 6. NX (Not executable – не исполняемый): AMD64: специальный бит в PTE, разрешающий/запрещающий выполнение машинного кода в данной странице. 7. XD (execution Disabled – исполнение запрещено): Intel: специальный бит в PTE, разрешающий/запрещающий выполнение машинного кода в данной странице. 8. SafeSEH (безопасный SEH): набор защитных мер, разработанных Microsoft для предотвращения использования обработчика структурных исключений (SEH) shell-кодом, позднее был переименован в software-enforced DEP.
Другой популярный пакет – Exec Shield (http://people.redhat.com/mingo/ exec-shield), входящий в состав Red Hat Enterprise Linux v.3, update 3, также использует неисполняемую кучу/стек, замечательно работая на всем семействе x86 процессоров без NX/XD-битов, и частично рандомизует адресное пространство, произвольным образом изменяя базовый адрес стека, расположение разделяемых библиотек и начало области кучи. Остальная память остается нетронутой, однако для отражения большинства атак и этого оказывается вполне достаточно. Фактически, Exec Shield представляет урезанный вариант PaX и не несет в себе ничего нового. Еще хуже дела обстоят в OpenBSD. Начиная с версии 3.3 ядро поддерживает механизм W^X (произносится как «W xor X»), который по своему названию предотвращает одновременную установку атрибутов -x- и -w- на любую область памяти, что по замыслу разработчиков должно серьезно озадачить хакеров (http://marc.theaimsgroup.com/ ?l=openbsd-announce&m=1051754750 06905&w=2).
73
безопасность
10.
Рисунок 14. Окно протокола пакета StackDefender
11.
На самом деле эта защита элемен- смогут только гуру, да и то с кучей огтарно обходится множественным вызо- раничений, делающих червей практивом функции mprotect. Сначала shell- чески нежизнеспособными. код вызывает mprotect, устанавливая один лишь атрибут записи (если он не Ссылки: был установлен ранее), затем копиру- 1. PaX (лучший бесплатный проектор 12. ет shell-код через memcpy и вызывадля LINUX/BSD): http://www.ngsec.com/ ет mprotect еще раз, сбрасывая атриngproducts/stackdefender. бут записи и присваивая себе права 2. BufferShield 1.01k (коммерческий порт исполнения. Кстати говоря, в версии PaX на NT): http://www.sys-manage.com/ 3.3 W^X не работал на x86, поскольку index10.htm. у того отсутствует возможность зада- 3. S t a c k d e f e n d e r ( е щ е о д и н п о р т ния x-атрибута на уровне страниц, одPaX на NT): http://www.ngsec.com/ нако, начиная с версии 3.4, этот недоngproducts/stackdefender. 13. статок был исправлен. 4. Exec Shield (усеченный клон PaX для Короче говоря, в штатной конфигуIn Red Hat Enterprise Linux v.3, update рации, без установки пакета PaX, все 3): http://people.redhat.com/mingo/execUNIX-подобные системы потенциальshield. но уязвимы и допускают выполнение 5. W^X (простой и бесполезный защитshell-кода по сценарию, описанному ный пакет для OpenBSD): http://marc. 14. в разделе «атаки на DEP». theaimsgroup.com/?l=openbsd-announc
Заключение DEP – это не защита! Это рекламный трюк! Если только Microsoft не создаст свой собственный клон PaX, реализованный по всем правилам (что очень навряд ли), черви и хакеры продолжат свое существование. Так что слухи об их кончине в очередной раз оказались преждевременными и сильно преувеличенными. По этому поводу вспоминается один анекдот «Недостаток у танка ровно один: через триплексы ни хрена не видно, куда едешь. Но когда ты едешь на танке, это не очень большой недостаток». Так вот, Microsoft едет в танке, прикрываясь толстой броней монополизма, и ее совершенно не волнует, куда она едет и что творит. Не полагайтесь на Microsoft! Для надежной обороны своего компьютера (рабочей станции, сервера) используйте BufferShield или StackDefender, «пробить» который
74
e&m=105175475006905&w=2. 6. A detailed description of the Data Execution Prevention (DEP): официальное описание технологии DEP от Microsoft, крайне поверхностное и неконкретное, но почитать все-таки стоит (на русском и английском языках): http:// support.microsoft.com/kb/875352/ru; http://support.microsoft.com/kb/875352; 7. AMD64 Enhanced Virus Protection: официальная презентация «EVP-технологии» от компании AMD. Куча роликов и никакой технической информации (на английском языке): http://www. amd.com/us-en/Weblets/0,,7832_11104_ 11105,00.html. 8. Execute Disable Bit Functionality Blocks Malware Code Execution: детальная техническая информация от Intel, касающаяся XD-бита, ориентированная на системных программистов (на английском языке): http://cache-www.intel.com/ cd/00/00/14/93/149307_149307.pdf; 9. Processor Number Feature Table: пере-
15.
16.
17.
чень процессоров от Intel, поддерживающих XDбит (на английском языке): http:// support.intel.com/products/processor_ number/proc_info_table072505.pdf. 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-05maynor.pdf. Buffer overflow attacks bypassing DEP (NX/XD bits) – part 2 : Code injection: обход DEP, основанный на выделении региона памяти посредством вызова VirtualAlloc с последующим копированием shell-кода (на английском языке): http://www.mastropaolo.com/?p=13. Defeating Microsoft Windows XP SP2 Heap protection and DEP bypass: обход DEP, основанный на переполнении кучи с последующей подменой адреса возврата из функции main на функцию crt!system (на английском языке): http://www.maxpatrol.com/defeatingxpsp2-heap-protection.htm. Windows Heap Overflows: презентация с Black Hat, описывающая общие принципы переполнения кучи под NT (на английском языке): http://www.blackhat. com/presentations/win-usa-04/bh-win-04litchfield/bh-win-04-litchfield.ppt; DEP evasion technique: замечательный блог, демонстрирующий технику обхода DEP и сравнивающий его с аналогичными защитными механизмами из UNIX (на английском языке): http:// woct-blog.blogspot.com/2005/01/reviewof-microsofts-dep.html; http://woct-blog. blogspot.com /2005/ 01/dep-evasiontechnique.html. Касперски К. Ошибки переполнения буфера извне и изнутри как обобщенный опыт реальных атак. – Журнал «Системный администратор», №3, март 2004 г. Уже устаревавшая статья, подробно описывающая причины и следствия ошибок переполнения различных типов. SEH на службе контрреволюции: еще одна моя статья, демонстрирующая технику обхода программного DEP: ftp://nezumi.org.ru/pub/zq-buf-SEH.zip; eWEEK.com Special Report: Windows XP Service Pack 2: Microsoft подтверждает возможность обхода DEP (на английском языке): http://www.eweek.com/ article2/0,1759,1757786,00.asp.
программирование
Переходим от VBScript к ASP и ASP.NET Безопасность и синтаксис
Иван Коробко Многие программисты используют VBScript для создания сценариев, предназначенных для управления серверами. Некоторые скрипты настолько усложняются, что их трудно использовать без графического интерфейса. Оптимальным решением этой задачи является создание веб-приложения на ASP, ASP.NET.
С
оздавая сценарии на VBScript для обслуживания серверов, таким образом автоматизируя работу системного администратора и службы технической поддержки, сводя до минимума влияние человеческого фактора, программисты приходят к выводу, что некоторые из их скриптов стали неудобными и им необходим графический интерфейс. Например, веб-интерфейс, выбор которого объясняется соображениями безопасности и удобством эксплуатации. Для решения этой задачи рекомендуется ASP, а лучше всего – ASP.NET, который позволяет на порядок повысить безопасность работы приложения.
От VBScript к ASP
<%Script Language="VBScript"%>
или <%Script Language="JScript"%>
Программный код, находящийся между <% и %>, выполняется на сервере и подчинен синтаксису одного из выбранных языков. Весь остальной код представляет собой HTMLстраницу в явном виде. Листинг типовой ASP-страницы выглядит следующим образом:
<%@ Language=VBScript CODEPAGE=1251%> У вас может возникнуть вопрос: «Зачем мне переходить на <HTML> ASP, когда я просто могу использовать DHTML с VBS встав<TITLE> Заголовок страницы </TITLE> <HEAD> ками?» Использовать DHTML или HTA для этих целей не по<LINK href="../style.css" type=text/css rel=stylesheet> лучится, поскольку они основаны на HTML, который дейс<meta http-equiv="Content-Type" content="text/html" ↵ charset=windows-1251> твительно позволяет делать вставки на VBScript, однако не </HEAD> <BODY> поддерживают работу с OLE-объектами. Для программис<FONT FACE="Arial"> … та, создающего приложения для обслуживания серверов, <% поддержка OLE-объектов используемой им средой – основ… ' отображение на экране содержимого переменной ное требование, поскольку формирование отчетов, доступ Response.write variable к Active Directory и др. базируется на их использовании. %> ASP представляет собой решение, которое поддерживаПосле обработки интерпретатором IIS программного кода ет HTML, OLE-объекты и позволяет делать вставки на рази преобразования результатов его работы в HTML/DHTML неличных скриптовых языках: VBScript, JScript. Переход от 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
Microsoft IIS 6
Входит в состав Windows 2003 Server
Microsoft .NET Framework 1.1
http://www.microsoft.com/downloads/details.aspx? FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3& displaylang=en
Microsoft .NET Framework 2.0
http://www.microsoft.com/downloads/details.aspx? familyid=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5& displaylang=en
Microsoft FrontPage Server Extensions 2000
Входит в состав Windows 2000, XP
Microsoft FrontPage Server Extensions 2002
Входит в состав Windows 2003 Server; KB13380: http://www.microsoft.com/downloads/details.aspx? FamilyId=3E8A21D9-708E-4E69-8299-86C49321EE25& displaylang=en
Microsoft Visual J# .Net Redistributable Package 1.1
http://www.microsoft.com/downloads/details.aspx? FamilyID=e3cf70a9-84ca-4fea-9e7d-7d674d2c7ca1& DisplayLang=en
Microsoft Visual J# .Net Redistributable Package 2
http://www.microsoft.com/downloads/details.aspx? FamilyID=90cef3f3-9eaf-4d41-bad3-9f44fe8e5e81& DisplayLang=en
Microsoft Windows Installer 2
http://www.microsoft.com/downloads/details.aspx? FamilyID=4b6140f9-2d36-4977-8fa1-6f8a0f5dca8f& DisplayLang=en
Microsoft Windows Installer 3.1
http://www.microsoft.com/downloads/details.aspx? FamilyID=889482fc-5f56-4a38-b838-de776fd4138c& DisplayLang=en
грамм следует запустить процесс установки студии, после завершения которого необходимо перезапустить ОС и проверить ее работоспособность, создав проект. Замечание. Для установки Visual Studio без проверки установленных компонентов необходимо запустить процесс установки с ключом: X:\SETUP\SETUP.EXE /NO_BSLN_CHECK
Что такое FRAMEWORK Компания Microsoft поддерживает одновременно несколько языков программирования: Visual Basic, C++, C#. Большая часть функциональных возможностей этих языков совпадает: в каждом из них реализована работа с файловой системой, с базами данных, обработка строк, математические функции. Более того, некоторые из них поддерживают идентичные функции, операторы цикла и условные операторы. Наконец, многие из них имеют похожие типы данных. Поддержка одних и тех же функциональных возможностей для нескольких языков программирования требует немалых усилий от разработчика, поэтому программисты компании Microsoft задумались над тем, как уменьшить трудозатраты. Результатом их деятельности является библиотека классов .Net Framework Class Library, которая состоит из множества классов, предназначенных для решения различных задач, которые могут встать перед программистом. В настоящее время активно используется .Net Framework, однако все большую популярность приобретает недавно вышедший .Net Framework 2.0. Пространство имен платформы .Net содержит более 3400 классов, которые организованы в иерархию пространств имен. Например, пространство имен, связанных с работой файловой системы, называется System.IO. Существует два способа импорта пространств имен в зависимости от метода программирования. Оба они будут рассмотрены ниже на примере импорта пространства имен System.Security.Principal для проверки режима имперсонализации.
Управление доверительными отношениями в ASP NET Для конфиденциальной работы приложения 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 нет, то комcomAuthenticationLevel= PktPrivacy поненты необходимо загрузить с сайта Microsoft или устаcomImpersonationLevel= Impersonate новить с дистрибутива соответствующей версии операционной системы. Список возможных значений этих параметров привеПосле завершения установки необходимых подпро- ден ниже: Рисунок 3. Настройка безопасности IIS
78
программирование comAuthenticationLevel="Default|None|Connect|Call|Pkt| ↵ PktIntegrity|PktPrivacy"; comImpersonationLevel="Default|Anonymous|Identity| ↵ Impersonate|Delegate"
Для IIS6 необходимо сделать изменения в реестре. В ветви реестра «HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services\W3SVC\Parameters» необходимо добавить четыре параметра: AuthentionLevel, CoInitializeSecurityParam, ImpersonationLevel, Authentication Capabilities (см. риc. 4). Параметр CoInitializeSecurityParam принимает значения 0 и 1. Отвечает за включение/отключение использования остальных трех. Все параметры имеют тип REG_DWORD. Описания остальных трех параметров см. в таблице 2. Для включения имперсонализации рекомендуется присвоить перечисленным параметрам следующие значения: CoInitializeSecurityParam=1, AuthentionLevel=6, ImpersonationLevel=3, AuthenticationCapabilities=12352. В каждом создаваемом проекте автоматически генерируется файл Web.Config, в который также необходимо внести изменения, чтобы включить режим имперсонализации: <?xml version=»1.0» encoding=»utf-8» ?> <configuration> <system.web> <identity impersonate =»true»/> <authentication mode=»Windows» /> </system.web> </configuration>
Если необходимо, чтобы механизм имперсонализации работал от имени одного и того же пользователя, то необходимо указать логин и пароль учетной записи в поле <identity>: <identity impersonate ="true" username="user/domain" ↵ password="" />
Проверка имперсонализации осуществляется с помощью функции WindowsIdentity.GetCurrent().Name, которая возвращает имя учетной записи пользователя, от которой будут запускаться процессы. Если программный код формируется непосредственно в ASPX-файл, то в его заголовке необходимо импортировать пространство имен System.Security.Principal (2-я строчка примера – см. рис. 5). В случае обработки событий в виде функций, необходимо перед описанием класса импортировать пространство имен, о котором уже шла речь, и привязать код к событию, например, к нажатию на кнопку. Для этого сначала необходимо создать в ASPX-файле кнопку (Button1) и в теле соответствующей функции, по умолчанию Button1_Click() добавить функцию WindowsIdentity.GetCurrent().Name (см. рис. 6). При включенной имперсонализации на странице должно отобразиться текущее доменное имя пользователя в формате Domain/LogonUser.
Переход от VBScript к ASP.NET По своей сути ASP представляет собой HTML со вставками VBScript или Jscript (в общем случае), при этом ASP, в от-
№1, январь 2006
Рисунок 4. Параметры имперсонализации для IIS6
Рисунок 5. Пример импортирования пространства имен System.Security.Principal в ASPX-файле
Рисунок 6. Пример импортирования пространства имен System.Security.Principal в VB-файле
личие от HTML, работает с OLE-объекты. Это принципиальная разница между ASP и DHTML. Вставки на VBScript практически не претерпели изменений за некоторым исключением. Переход от ASP к ASP.NET также достаточно прост, однако есть ряд принципиальных отличий. Об особенностях перехода между этими тремя языками и пойдет речь.
Файлы ASP корректно работают под ASP.NET Для страниц ASP.NET фактически приемлемы любые расширения, в том числе и ASP. Для того чтобы ASP-страницы распознавались файлами платформы ASP.NET, необходимо проделать следующие манипуляции. Изменить ассоциацию ASP-файлов: Запустить Internet Services Manager («Start → Programs → Administrative Tools → Internet Services Manager»). Открыть страницу свойств нужного веб-узла, щелкнув правой кнопкой мыши по нужному узлу и выбрав пункт «Properties». В появившемся диалоговом окне войти во вкладку «Home Directory». В разделе «Application Settings» нажать на кнопку «Configuration». В п о я в и в ш е м с я д и а л о го в о м о к н е «Applic ation Configuration» выбрать вкладку «App Mapping». Ассоциировать файлы с расширением ASP с библиотекой aspnet_isapi.dll. При этом предварительно необходимо удалить предыдущую ассоциацию ASP. Внести изменения в конфигурационный файл .NET Framework:
79
программирование System.Web, ↵ Version=1.0.2411.0, ↵ Culture=neutral, ↵ PublicKeyToken=b03f5f7f11d50a3a ↵ "/>
Таблица 2. Принимаемые значения параметров имперсонализации для IIS6 Имя параметра
Значение AuthentionLevel
Default
0
None
1
Connect
2
Call
3
Pkt
4
PktIntegrity
5
PktPrivacy
6
Оператор Option Explicit Рассмотрим использование оператора Option Explicit для VBScript, ASP и ASP.NET.
VBScript, ASP По умолчанию в VBScript допускается неявное объявление переменных. При этом переменная создается без ее предварительного объявления операторами Dim, Private, Public или ReDim. Однако, разрешив неявное объявление переменных в сценариях, велик риск пропустить допущенную синтаксическую ошибку в имени переменной во время программирования. В том случае, если допущена ошибка, VBScript просто объявит новую переменную и создаст ее, вследствие чего программа будет работать некорректно. Для обнаружения ошибок-опечаток такого рода в первую строку программы необходимо поместить оператор Option Explicit, который сигнализирует оператору о переменных, которые не были объявлены явно.
ImpersonationLevel Default
0
Anonymous
1
Identity
2
Impersonate
3 4
Delegate
AuthenticationCapabilities None
0x0
Mastual_Auth
0x1
Secure_Refs
0x2
Access_Control
0x4
APPID
0x8
Dynamic
0x10
Static_Cloaking
0x20
Dynamic_Cloaking
0x40
ANY_Authority
0x80
Make_FullSic
0x100
Require_FullSic
0x200
Auto_Impersonate
0x400
Default
0x800
Disable_Aaa
0x1000
No-Custom_Marshal
0x1200
ASP.NET
Таблица 3. Сопоставления вызываемых файлов соответствующим приложениям VBScript
ASP
ASP.NET
Расширение
*.vbs
*.asp
*.aspx
Обработчик
cscript.exe, wscript.exe
Asp.dll
Aspnet_isapi.dll
Открыть файл machine.config с установленным на компьютере IIS, который находится в C:\Windows\ Microsoft.NET\Framework\[version]\ config. В разделе [httpHandlers] приведены обработчики для файлов с различными расширениями. В нем должны присутствовать «.asp, .aspx». Необходимо добавить обработчик System.Web.Ui.PageHandlerFactory: <add verb="*.*" path="*.asp" type=" Web.Ui.PageHandlerFactory, ↵
80
Опция Explicit, выключенная по умолчанию в предыдущих версиях ASP, на платформе ASP.NET включена. При включении перед использованием переменной ее необходимо объявить. Например, приведенный ниже сценарий успешно работает на ASP, но на ASP.NET он вызовет ошибку – «The name ‘strMsgBox’ is not declared»: <% strMsgBox="Привет" response.write(strMsgBox) %>
<Compilation> Explicit = "False" </Compilation>
Преобразование типов данных В языке VBScript отсутствуют требования жестко привязать переменную к определенному типу. В нем нельзя объявить тип переменной, в результате чего все создаваемые переменные принадлежат к типу Variant. В ASP.NET этот тип данных не поддерживается. Своеобразным его эквивалентом является тип object. Рассмотрим пример сценария, в котором объявим переменную, и присвоим ей значение, после чего выведем его на экран. В качестве шаблона воспользуемся примером из предыдущего параграфа: <% Dim strMsgBox strMsgBox="Привет" response.write(strMsgBox) %>
Обратите внимание, что при объявлении переменной strMsgBox не указан ее тип явным образом, поэтому считается, что она принадлежит к типу Object. При присвоении значения переменной осуществляется автоматическое преобразование к типу String. Автоматическое преобразование к нужному типу данных очень удобно, однако оно негативно сказывается на скорости работы сценария. Для определения типа переменной используйте функцию VarType(), возвращающую число, которому соответствует подтип (см. таблицу 4). Синтаксис: VarType(VarName); Varname – имя переменной, содержащей значение.
При работе с массивами функция VarType() никогда не возвращает знаИсправить ошибку можно дву- чение 8192. Это связано с тем, что элемя способами. Первый способ – объ- менты массива содержат данные, коявить переменную strMsgBox явным торые также соответствуют одному образом: из типов данных. Например, если элементами массива являются числа типа <% Integer, то функция будет возвращать Dim strMsgBox As String значения 2 + 8192, т.е. 8194. strMsgBox="Привет" response.write(strMsgBox) VBScript: %>
Второй способ – отключить на всех страницах ASP.NET в файле machine. config опцию Explicit:
Dim Array(100) T="" T=VarType(Array) MsgBox T
программирование ASP, ASP.NET: <% Response.Write(VartType(Parametr)) %>
Приведенный пример возвращает значение 8204 = 8192 + 12. Элементы массива не определены, поэтому они имеют тип данных Variant (12). Процесс автоматического преобразования типов данных называется динамическим связыванием (late binding). Избежать динамического связывания можно с помощью опции Striсt: <%@ Striсt="True" %>
При включении опции Striсt автоматически включается Explicit. Кроме того, опцию Striсt можно включить для всех страниц ASP.NET в файле machine.config: <Compilation> Striсt = "True" </Compilation>
В отличие от VBScript-сценариев и классических ASP-страниц в ASP.NET при передаче параметров подпрограммам или методам всегда должны использоваться скобки. Например, приведенный ниже сценарий без ошибок будет выполняться под ASP: <% Response.Write "Привет" %>
Но в ASP.NET он вызовет ошибку, поскольку метод Write необходимо использовать со скобками: <% Response.Write ("Привет") %>
Операторы SET и LET В VBScript и ASP для присвоения переменных необходимо было использовать переменную SET. VBScript: Set obj=CreateObject("Adodb.Connection")
ASP: <% Set obj=Server.CreateObject("Adodb.Connection") %>
На страницах ASP.NET он больше не используется. Синтаксис присвоения переменной объекта выглядит следующим образом. ASP.NET: <% obj=Server.CreateObject("Adodb.Connection") %>
№1, январь 2006
Таблица 4. Расшифровка принимаемых значений функцией VarType() Константа
Значение
Описание
vbEmpty
0
Empty (пустое значение)
vbNull
1
Null (не содержит данных)
vbInteger
2
Integer
vbLong
3
Long integer
vbSingle
4
Single (число с плавающей точкой)
vbDouble
5
Double (число с плавающей точкой)
vbCurrency
6
Currency
vbDate
7
Date
vbString
8
String
vbObject
9
Объект
vbError
10
Error
vbBoolean
11
Boolean
vbVariant
12
Variant (используется только с массивами)
vbDataObject
13
Object
vbByte
17
Byte
vbArray
8192
Array
Таблица 5. Описания часто используемых параметров для обработки ошибки Свойство
Описание
Err
Краткое описание ошибки
Err.Message
Полное описание ошибки
Err.GetType.ToString
Тип ошибки
Err.Source
Источник ошибки (имя библиотеки)
Также не поддерживается оператор LET.
Поддержка многопоточных компонентов По умолчанию в ASP.NET не поддерживаются многопоточные методы, такие как ADO Connection, Scripting Dictionary. Для включения их поддержки в заголовке файла необходимо использовать директиву: <%@ PageASPCompat="True" %>
Обработка ошибок в ASP.NET Для обработки ошибок предназначен класс System. Exception. Анализируемый на ошибки код заключается внутрь конструкции Try: Tru Code <Sample Code> Cath err as Exception Response.write(err) End Try
Для конкретизации ошибки рекомендуется использовать встроенные свойства (см. таблицу 5).
Вместо заключения Рассмотрев основные этапы перехода с языка VBscript и ASP к ASP.NET, изучив различные подводные камни, вы можете приступить к изучению более сложных вещей, касающихся программирования на ASP.NET: управления файловой системой, Active Directory и т. д.
81
IMHO
Электронная почта как источник повышенной опасности
Сергей Супрунов Мы настолько привыкли пользоваться услугами электронной почты, что с трудом представляем себе Интернет без нее. Однако не многие задумываются о том, насколько эта услуга небезопасна и к каким последствиям может привести халатное отношение к своему почтовому ящику.
В
се сказанное в данной статье веры можно было пересчитать по пальследует рассматривать исклю- цам, а их администраторы хорошо значительно как мое личное мне- ли каждого своего пользователя. Вопние, основанное на некотором опыте росы безопасности и доверия к отпраи, в какой-то степени, личных эмоци- вителю тогда не имели сегодняшнего ях. Я не пытался сделать какие-то гло- уровня актуальности, и потому в цебальные выводы или выработать уни- лях экономии протокол SMTP получилверсальные рекомендации решения ся на самом деле настолько простым, проблем. Это всего лишь мой взгляд что не поддерживал ни авторизации, на ситуацию, если хотите – приглаше- ни средств подтверждения подлинносние к дискуссии. ти отправителя. Он умел лишь отправлять электронные сообщения указанному адресату. Основной источник Сейчас сеть Интернет стала друпроблем Как вы знаете, протоколы электрон- гой. Децентрализация, простота и деной почты создавались в те «золотые» шевизна подключения к сети, практивремена зарождения сети, когда сер- чески полная анонимность пользовате-
82
ля, идентифицировать которого можно разве что по его IP-адресу, который редко можно однозначно сопоставить с конкретным человеком, да и даже на достоверность этого параметра тоже нельзя положиться, – все это привело к тому, что человек в сети чувствует себя гораздо более свободным, и, как следствие, позволяет себе порой то, на что в «оффлайне» никогда не решился бы. Интернет давно превратился из простого средства для общения коллег и единомышленников в инструмент ведения бизнеса. И указанная выше степень свободы позволила применять для достижения своей цели весьма агрессивные методы, не считаясь
IMHO с последствиями этих методов для других участников сети. А протокол SMTP остался при этом практически тем же самым, что и десятилетия назад. В частности, согласно базовому RFC 821, лежащему в основе современной электронной почты, различные агенты доставки (MTA) взаимодействуют, по сути, на доверительных отношениях. Даже для команды HELO, которой SMTP-клиент (так будем называть программу, инициирующую SMTP-соединение, по аналогии с другими протоколами) представляется серверу, никак не проверяется достоверность содержащейся в ней информации. И уж тем более не предусмотрено оснований, по которым сервер может отклонить соединение. Более того, если письмо не предназначено пользователям, обслуживаемым данным сервером, то согласно протоколу он должен выполнить передачу сообщения дальше, в соответствии со значением поля «To», т.е. фактически, должен работать в режиме Open Relay. Различными расширяющими документами вводятся дополнительные процедуры, такие как SMTP-аутентификация, запрет на транзитную передачу сообщений, и т. д., призванные ограничить проблемы, возникающие при использовании базового протокола. Однако их применение до сих пор не является обязательным, и каждый администратор принимает решение об их поддержке исключительно по своему усмотрению. Таким образом, сейчас мы все более отчетливо ощущаем недостатки почтового протокола SMTP: возможность подделать практически любой параметр отправляемого сообщения; отсутствие механизмов для однозначной идентификации отправителя; отправка любого количества любых сообщений какому-либо пользователю не требует никакого разрешения со стороны последнего, но платит за почту при этом именно он. Рассмотрим немного подробнее некоторые из возникающих при этом проблемы.
«Нам чужого не надо…» О спаме мы у же много говорили на страницах журнала, борьбе с этой
№1, январь 2006
напастью посвящено множество ста- правлять электронные сообщение натей в Интернете. А порождено это яв- много проще и дешевле. Да и за почление в первую очередь возможнос- товый ящик, прибитый к калитке, потью отправлять сообщения практи- лучатель ничего не платит… чески анонимно, что не позволяет однозначно выявить отправителя и его «Не виноватые мы…» наказать. Не меньшую угрозу представляет и обОдним из правил защиты, которое ратная ситуация – когда в результаупоминается, пожалуй, наиболее час- те заражения ваша машина сама стато, является совет никогда не остав- новится источником спама и вирусов. лять свой реальный почтовый адрес И такая несложная операция, как блона веб-страницах (в форумах, ново- кирование с помощью персонального стных лентах, даже на своих домаш- брандмауэра 25-го порта (как на прием, них сайтах). Изворотливый челове- так и на отправку), кроме порта на том ческий ум придумал массу способов сервере, с которым мы действительно замаскировать свой адрес и спрятать работаем, может заметно снизить «наего от назойливых роботов-сборщи- пряженность», но почему-то мы не спеков – от банального «vasya (at) petrov шим это делать. Да еще и предъявля(dot) ru» до всевозможных скриптов, ем претензии своему провайдеру, есотдающих адрес из базы только в слу- ли он пытается сделать это за нас. Вичае явного щелчка по ссылке. димо, сказывается убеждение, что саОпределенный смысл в этом есть, ма по себе электронная почта безвредпоскольку если спамер не будет знать на, к тому же бесплатность исходящевашего адреса, то и отправить вам ни- го трафика позволяет не обращать на него никакого внимания. чего не сможет. Но, с другой стороны, адрес наподобие приведенного выше доста- «А вас здесь не стояло…» точно легко угадывается, а постольку Сильно удивляет и то, насколько легSMTP позволяет указывать в качест- ко мы относимся к заполнению различве обратного адреса практически лю- ных регистрационных форм, где требубой, то спамер может не беспокоить- ется указать адрес электронной почся, что после очередного сканирова- ты. Здесь мы довольно часто, наобония его ящик будет завален сообще- рот, желая (в виду описанных выше причин) скрыть свой почтовый адрес ниями «Undeliverable message». А вот нам с вами по этому пово- от любопытных глаз, указываем чтоду беспокоиться можно и даже нуж- нибудь наподобие qwe@qweasdzxc.ru. но – в качестве такого обратного ад- Именно на этом основан один из нареса вполне может быть выбран (слу- иболее популярных методов кражи чайно или специально) именно ваш ад- аккаунтов ICQ – нетрудно догадаться, рес. Согласитесь, что это не самая луч- что злоумышленнику теперь остаетшая перспектива – обнаружить в по- ся лишь зарегистрировать на себя донедельник свой почтовый ящик заби- мен qweasdzxc.ru, создать там почтотым такими «возвратами» вперемешку вый ящик qwe и воспользоваться сисс возмущениями и угрозами потрево- темой напоминания пароля. Причем женных пользователей. Особенно ес- этот метод работает достаточно хороли ваша плата провайдеру за подде- шо не только в случае с ICQ, но и везде, ржку ящика зависит от объемов тра- где при регистрации вы должны укафика или размера сообщений, храня- зать свой электронный адрес, но его принадлежность или хотя бы сущестщихся на сервере. И опять-таки, SMTP не предостав- вование никак не проверяются. Конечно, можно успокаивать себя ляет никаких способов эффективно этому противодействовать. Конечно, тем, что ваш UIN вряд ли будет облаприближение работы электронной поч- дать ценностью, способной компенты к обычной (когда в ваш ящик могут сировать трату двадцати долларов положить любую корреспонденцию) на регистрацию домена. Но кто знаимело определенный смысл, по край- ет, насколько ценную информацию вы ней мере в том плане, что не нужно будете передавать по ICQ лет через было придумывать новую концепцию. пять. В любом случае нельзя забывать Но при этом не было учтено, что от- об этом методе получения пароля.
83
IMHO ке (см. рисунок). Да даже и без близкого знакомства иногда за вечер нетрудно перебрать несколько десятков «любимых цветов». А когда, желая избежать шаблонности, пользователи сами «придумывают» свой вопрос и ответ на него (типа «qwe – qwe»), то это вообще песня.
«Спасайся, кто может…»
suprunov@mail.ru – это не мой ящик. Однако если я «подружусь» с его владельцем (тем более что одинаковая фамилия – неплохой повод, а наступивший год собаки дает возможность поговорить и на действительно интересующую меня тему), то он вполне может стать моим…
Кстати, с этой точки зрения при на- твия, которое должно быть выполнено. поминании пароля по электронной поч- Например, когда вы меняете свой пате на том или ином сервисе более безо- роль к почтовому ящику на веб-страпасной выглядит генерация нового па- нице, вы пересылаете и всю информароля по запросу пользователя, а не от- цию (к примеру, идентификатор сесправка существующего – это позволит сии), перехвата которой достаточно, законному пользователю (который все чтобы воспроизвести это же действие еще будет использовать старый па- с другими параметрами. Вывод напрашивается сам собой – роль) в случае кражи доступа, по крайней мере, вовремя обнаружить пробле- везде, где это возможно, используйму. Правда, у этой медали есть и об- те для работы с электронной почтой ратная сторона – пользователя, ука- протоколы SMTP и POP3/IMAP (тоже завшего свой реальный адрес, можно не лишенные недостатков, но все же буквально «задолбать» постоянными это меньшее из зол), а не HTTP. Пракзапросами напоминания пароля. тически все популярные почтовые Таким образом, чуть ли не самым серверы предоставляют такую возудачным решением в данной ситуации можность. будет вообще отказаться от использования системы напоминания пароля, а «Язык мой - враг мой…» сам пароль (достаточно сложный для Но все же самыми популярными остого, чтобы держать его в память) за- таются социальные методы, основанписать у себя в блокноте. ные на все той же системе напоминания пароля, но теперь уже к самому почтовому ящику. В большинстве слу«Лучше меньше, да лучше…» чаев человек, регистрируя себе «четКстати говоря, веб-интерфейс к элек- вероногого друга» где-нибудь на mail. тронной почте сам по себе представ- ru, без должного внимания относится ляет для злоумышленника некоторые к выбору «секретного вопроса», счидополнительные пути завладеть чу- тая, что ничего важного все равно отжим ящиком. Но здесь уже исполь- правлять/получать не будет. Но идут зуются недостатки другого, не менее годы, человек становится каким-ни«наивного» протокола – HTTP. Как вы будь высокопоставленным чиновнизнаете, он не поддерживает соедине- ком или успешным предприниматения, то есть каждый новый запрос рас- лем, продолжая по привычке пользосматривается как совершенно не зави- ваться тем же почтовым ящиком. И хасящий от предыдущих, и, следователь- керу остается лишь собрать о нем нено, должен содержать всю информа- которую информацию (имена родных цию, необходимую для аутентифика- и их родословная, кличка кота и т. д.), ции пользователя и определения дейс- чтобы получить доступ к его перепис-
84
Как видите, электронная почта отнюдь не так уж безобидна, как может показаться на первый взгляд. И если опытный компьютерщик еще способен предвидеть возможные проблемы и попытаться их избежать, то требовать того же самого от начинающего пользователя, только что купившего свою первую интернет-карту и рвущегося в необъятный и полный возможностей мир «глобальной паутины», как правило, не приходится. Да, пользователей в сети с каждым годом становится все больше и больше, притом, что уровень технической подготовленности среднестатистического пользователя неуклонно снижается. Это вполне правильная тенденция, поскольку врач или адвокат должны хорошо знать свое дело, а не изучать работу межсетевых экранов или заниматься дефрагментацией. Но такими темпами уже через пару лет Интернет может превратиться в действующую модель древнегреческого Хаоса (правда, с меньшими шансами, что из него родится что-то сущее), и жизнеспособность электронной почты – одного из основных сервисов – может оказаться под вопросом. И более-менее реальными выходами из создавшегося положения кажутся либо жесткие ограничения свободы пользователей со стороны их провайдеров (например, запрет соединяться с 25-м портом любого сервера, кроме провайдерского), либо переход на другие, более соответствующие современным реалиям протоколы. Плюс настойчивая пропаганда среди пользователей «здорового образа жизни». Ну а простому пользователю остается лишь уделять больше внимания настройкам своего брандмауэра, аккуратнее относиться к веб-интерфейсам и бороться, бороться, бороться со спамом. По крайней мере, до тех пор, пока это не начнет делать его провайдер…
bugtraq Отказ в обслуживании при обработке SGBP-протокола в Cisco IOS Программа: IOS 12.x, R12.x. Опасность: Средняя. Описание: Уязвимость существует при обработке SGBP (Stack Group Bidding Protocol)-протокола. Удаленный пользователь может послать специально сформированную UDP-датаграмму на порт 9900 и вызвать отказ в обслуживании устройства. URL производителя: www.cisco.com. Решение: Установите исправление с сайта производителя.
Отказ в обслуживании в Eudora Internet Mail Server при обработке NTLM-запросов Программа: Eudora Internet Mail Server версии до 3.2.8. Опасность: Средняя. Описание: Уязвимость существует при обработке запросов для NTLM-аутентификации. Удаленный пользователь может с помощью специально сформированных NTLM-запросов аварийно завершить работу приложения. URL производителя: www.eudora.co.nz. Решение: Установите последнюю версию (3.2.8) с сайта производителя.
Отказ в обслуживании при обработке соединений в Cisco CallManager Программа: Cisco CallManager 3.2 и более ранние версии, Cisco CallManager 3.3, версии до 3.3(5)SR1a, Cisco CallManager 4.0, версии до 4.0(2a)SR2c, Cisco CallManager 4.1, версии до 4.1(3)SR2. Опасность: Средняя. Описание: 1. Уязвимость существует из-за недостаточной обработки тайм-аутов для соединений на порт 2000/tcp. Удаленный пользователь может открыть много соединений и потребить большое количество памяти и ресурсов процессора. 2. Обнаружена ошибка при обработке соединений к портам 2001, 2002 и 7727. Удаленный пользователь может создать большое количество соединений и заполнить Windows message queue, что приведет к перезагрузке Cisco CallManager. URL производителя: www.cisco.com. Решение: Установите исправление с сайта производителя.
Переполнение буфера в Golden FTP Server Программа: Golden FTP Server 1.92. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки при обработке входных данных в APPE FTP-команде. Удаленный пользователь может с помощью слишком длинной строки вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.goldenftpserver.com. Решение: В настоящее время способов устранения уязвимости не существует.
№1, январь 2006
Отказ в обслуживании в ядре Linux Программа: Linux kernel версии до 2.6.15.1. Опасность: Средняя. Описание: 1. Отсутствует проверка входных данных в переменной nlmsg_len в функции netlink_rcv_skb(). Локальный пользователь может установить значение 0 и вызвать бесконечный цикл. 2. Уязвимость обнаружена в PPTP NAT-хелпере при обработке входящих PPTP_IN_CALL_REQUEST-пакетов. Удаленный пользователь может с помощью специально сформированного пакета вызвать ошибку при расчете смещения и повредить случайную область памяти ядра. Успешная эксплуатация уязвимости позволит злоумышленнику аварийно завершить работу системы. 3. Обнаружена ошибка в PPTP NAT-хелпере при подсчете смещения, основанного на разнице между двумя указателями на заголовок. Удаленный пользователь может вызвать отказ в обслуживании системы. URL производителя: www.kernel.org. Решение: Установите последнюю версию (2.6.15.1) с сайта производителя.
Переполнение буфера в FreeBSD IEEE 802.11 Программа: FreeBSD 6.x. Опасность: Средняя. Описание: Целочисленное переполнение обнаружено в модуле net80211 при обработке некорректных IEEE 802.11-сообщений во время поиска беспроводной сети. Удаленный пользователь может выполнить произвольный код на целевой системе. URL производителя: www.freebsd.org. Решение: Установите исправление с сайта производителя.
Отказ в обслуживании при обработке GTP-протокола в Ethereal Программа: Ethereal версии 0.9.1 – 0.10.13 Опасность: Средняя. Описание: Уязвимость существует при обработке входных данных в диссекторе GTP-протокола. Удаленный пользователь может с помощью специально сформированного пакета вызвать зацикливание приложения и заставить систему потреблять все доступные ресурсы процессора. URL производителя: www.ethereal.com. Решение: Установите последнюю версию (0.10.14) с сайта производителя.
Составил Александр Антипов
85
ретроспектива
Сломленная, но не сдавшаяся: история операционной системы BeOS Часть 2
Дмитрий Мороз Решение Стива Джобса покончить с производителями клонов Macintosh больно ударило по самолюбию Жана-Луи Гассе, лишив Be Inc. сразу всех потенциальных клиентов. Компании не оставалось ничего другого, как искать новые рынки для сбыта своей ОС, пользовательская база которых бы исчислялась шести- или даже семизначными числами. А единственным подобным «рынком» являлись, несомненно, компьютеры архитектуры x86.
Суровое время перемен На проходившей 11 февраля 1998 года выставке Software Development’98 компания Be Inc. представила общественности версию BeOS 3.0, работавшую на компьютерах с процессорами Intel. Несмотря на то что эта корпорация в то время представила новейшие чипы Pentium II, BeOS отлично работа-
86
ла и на обычном Pentium. Управляющий Intel Энди Грув тогда честно признался: «Я даже не думал, что производимое нами аппаратное обеспечение может гарантировать такой уровень производительности». Сама BeOS 3.0 являлась «вылизанной до блеска» PR2, в которую были добавлены поддержка процессоров
Pentium/Pentium II, специальная версия программы PartitionMagic для динамического разбиения жёстких дисков, изменены некоторые элементы интерфейса, а также расширены сетевые возможности. Одновременно с выходом BeOS третьей версии Be Inc. анонсировала свою интегрированную среду разра-
ретроспектива ботки под названием BeIDE, компиляторы, линкеры и библиотеки для которого поставляла компания Metrowerks. «Благодаря» BeIDE собственный пакет компании CodeWarrior стал неактуален (он стоил денег, в то время как аналогичный продукт от Be Inc. поставлялся вместе с ОС), и его разработка в версии для BeOS была приостановлена. Старт продаж BeOS 3.0 был запланирован на 20 марта 1998 г. Начиная с этого дня поддержка существующего и нового аппаратного обеспечения стала для программистов Be Inc. настоящей головной болью. Выпущенная 16 июня, BeOS 3.1 содержала в основном дополнительные драйверы для материнских плат, звуковых карт, SCSI-адаптеров и внутренних модемов. Кроме слабой аппаратной поддержки BeOS 3.0 для архитектуры х86 не могла «похвастаться» какими-либо интересными приложениями. В день старта продаж ОС для неё было доступно всего 20 программ. Данные обстоятельства тем не менее не помешали Intel, а также другим фирмам вложить 25 млн. $ в компанию Be Inc., финансовые дела у которой опять шли плохо. «Be Inc. – компания, которой смерть дышала практически в самую спину, – говорил в то время аналитик компании Zona Research Грег Блатник. – Я думаю, благодаря финансированию Intel, она (Be Inc. – Прим. авт.) скоро снова встанет в строй. Если же у неё на уме ещё несколько других сделок – это пойдёт компании только на пользу». Кроме того, Intel также предоставила компании Гассе своих инженеров для обеспечения наиболее полной совместимости с процессорами семейств Pentium/Celeron. Так, например, Be Inc. была одной из первых компаний, продемонстрировавших на примере своей ОС, а также некоторых других приложений преимущества новых инструкций SSE, появившихся в процессорах Pentium III. В июне 1998 года BeOS, можно сказать, увидела мир. Именно в это время Microdata AB стала первым официальным дистрибьютором BeOS. Патрик Ланц, сотрудник Microdata, предложил Гассе продавать BeOS в Швеции ещё в начале 1998 года, и лишь по
№1, январь 2006
истечении шести месяцев управляющий Be Inc. решил рискнуть. «Я до сих пор помню, как мы продавали коробки с BeOS v.3, на которых крупными буквами было написано «Не для продажи!» – вспоминает Ланц. В дальнейшем дистрибьюторами BeOS стали: Gobe Software (американский рынок, а также англоязычные территории Азии), Hitachi (Япония и остальная часть Азии), а также Koch Media и Apacabar (Европа). Как только Be Inc. выпустила версию своей ОС для архитектуры х86, её главной задачей стало налаживание контактов и заключение партнёрских соглашений с производителями ПК с целью установки BeOS на их компьютеры. К сожалению, почти все компании отвечали отказом, но это немудрено, ведь Be Inc. была «зелёным новичком» на рынке, который всецело лежал у ног корпорации Microsoft и её Windows. Тем не менее один производитель ПК всё же откликнулся на зов Be Inc. Им стала компания Hitachi Ltd., производящая компьютеры для японского рынка. Впечатлённая возможностями BeOS, она согласилась преустанавливать BeOS на три модели своих компьютеров, выпускавшихся под маркой Hitachi Flora Prius. И, казалось бы, всё будет хорошо… Ещё в 1996 году на вопрос корреспондента известного журнала Wired «Что вы думаете о Билле Гейтсе» Гассе ответил: «Биллу постоянно сопутствует успех. Билл – это Билл. Microsoft очень хорошо управляется. И ещё одно: компания – отличный террорист, когда дело касается её интеллектуальной собственности». И он не прогадал. Как только Be Inc. наладила партнёрские соглашения с Hitachi и обе компании выпустили пресс-релизы о совместном сотрудничестве, буквально на следующий день в офис японской компании прибыли юристы Microsoft и ясно дали понять, что, если Hitachi будет устанавливать BeOS и Windows на свои компьютеры, лицензия на их операционную систему будет отнята. Это же предупреждение получили все известные и не очень производители ПК. Как Microsoft могла запретить устанавливать BeOS? Очень просто:
Рисунок 1. Программа для нелинейного видеомонтажа personalStudio
Рисунок 2. Прототип IPAD, демонстрировавшийся Be Inc. на выставке PC Expo’99
в лицензионном ОЕМ-соглашении Microsoft, которое подписывает каждая компания-производитель ПК, говорится: «После того, как пользователь включит компьютер и пройдёт стадия инициализации BIOS, запрещается изменять или модифицировать последовательность появления экранов, отображаемых Windows 98, вплоть до появления надписи «Добро пожаловать в Windows 98». Таким образом, Hitachi, равно как и другие производители ПК, не могли установить специальный загрузчик, позволявший пользователю выбрать, какая ОС, Windows или BeOS, будет загружаться на его компьютере. Результат оказался плачевным. Несмотря на то что BeOS была установлена на ПК, пользователь мог узнать о её существовании лишь по загрузочной дискетке, входившей в комплект поставки. Попытка Be Inc. закрепиться в качестве OEM-лицензиата операционной системы производителя компьютеров провалилась. Позже, в 1999 году, компания даже предлагала бесплатные лицензии на свою ОС, но «мыши на бесплатный сыр не пошли». Во время походившей 10 ноября 1998 года выставки COMDEX 98 Be Inc. анонсировала новую, четвёртую версию BeOS. Среди её основных нов-
87
ретроспектива
Рисунок 3. Многозадачность BeOS 5.0 – одновременная работа десяти игр
Рисунок 4. Офисный пакет GobeProductive 2.0
шеств стоит отметить: новую библиотеку Media Kit, предназначенную для выполнения комплексных операций над потоковыми медиа-данными; в очередной раз расширенную поддержку нового аппаратного обеспечения; возможность работы с разделами FAT16/32 (чтение/запись данных из-под BeOS); увеличившуюся на 30% производительность ОС, а также расширенные сетевые возможности. Сама Be Inc. считала BeOS 4.0 первой версией системы, полностью удовлетворяющей потребности обычного пользователя, а также готовой для OEM-предустановки на персональные компьютеры. По словам аналитика исследовательской фирмы IDC Уильяма Петерсона, у Be Inc. наконец-то появилась очень быстрая и стабильная ОС. Приблизительно в это время для BeOS начали появляться программы «второго поколения», по своим возможностям не уступающие Windows или MacOS-аналогам. Среди них стоит отметить: офисный пакет GobeProductive (Gobe Inc.), программы нелинейного видеомонтажа для любителей (personalStudio) и про-
88
фессионалов (A-Studio) от компании Adamation, растровый редактор Easel (Human Touch), пакет для создания «классической» мультипликации Moho (Lost Marble) и др. Кроме того, компания Wildcard Design стала первым разработчиком игр для BeOS. Её «стартовыми» продуктами стали перенесённые с других операционных систем игры Axia и Abuse. Спустя пару месяцев после выхода BeOS 4.0 состоялась первая публичная демонстрация возможностей аппаратного ускорения OpenGL, над которым инженеры Be Inc. работали на протяжении полутора лет. Специально для этого программист Be Inc. Эндрю Кимптон портировал на BeOS игру Quake II. Зоркий глаз присутствовавших, внимательно следивших за демонстрацией, заметил, что чип Pentium III, установленный на тестовом компьютере, работал на частоте 400 МГц, тогда как официально частота этих процессоров стартовала на отметке 450 МГц. Этот факт лишний раз доказывает, что инженеры Be Inc. имели доступ к прототипам нового чипа Intel задолго до его публичной демонстрации. Кстати, стоит отметить работу OpenGL на BeOS, вернее, её скорость. Тот факт, что операционная система демонстрировала двух-, а в некоторых тестах трёхкратное превосходство перед Windows 95/98, говорил о возможной будущей любви разработчиков игр к этой ОС. BeOS даже начали называть «игровой платформой будущего». Ах, мечты… Тем временем постоянно развивающийся компьютерный рынок требовал от BeOS новых возможностей. Прекрасно осознавая это, Be Inc. не стала медлить, и в апреле 1999 г. объявила о скором выходе новой версии своей операционной системы под номером 4.5. Вкратце перечислим основные нововведения BeOS 4.5: новый экран загрузки, показывающий загружающиеся в данный момент компоненты ОС, обновлённую панель настроек для лёгкой конфигурации звуковых и видеокарт, появившиеся хранители экрана, а также полные либо демонстрационные версии программ: 3dsound (позже изменившей название на 3dmix) SoundRecorder, Moho, BePlan, поставлявшиеся в комплекте.
15 апреля 1999 года Be Inc. с гордостью заявила, что количество зарегистрированных разработчиков для BeOS перевалило за отметку 10 000. Но несмотря на такой внушительный показатель, большие компании не спешили рисковать с выходом на BeOSрынок. И их можно было понять.
Пчела демонстрирует своё жало Выход BeOS 4.5, конечно же, не оказался незамеченным, но померк на фоне анонса Be Inc. 3 марта 1999 года об изменении своей стратегии и анонсе новой ОС под названием BeIA (кодовое название Stinger – жало). Компания, ранее делавшая ставки на операционную систему BeOS, решила попытать счастья на только начавшем зарождаться рынке так называемых персональных устройств для доступа в Интернет – Internet Apliances. Целевая аудитория IA – люди, желающие приобщиться к миру высоких технологий, но опасающиеся большой сложности в освоении компьютеров. Для примера типичного устройства рассмотрим собственный прототип Be Inc. под названием IPAD (Internet Personal Access Device – персональное устройство для доступа в Интернет), продемонстрированный компанией на выставке PC Expro в июне 1999 г. Это устройство, по форме напоминающее LCD-монитор с «деформированной» стойкой, было предназначено для использования на кухне и позволяло бы своему владельцу смотреть видеорецепты приготовления различных блюд, наблюдать за детьми в соседней комнате, слушать музыку, читать новости, получать и отправлять почту и, конечно же, бороздить просторы Интернета. Если вспомнить основную концепцию BeOS (быстрая, надёжная, компактная, с широкими мультимедийными возможностями), получается, что она, как никакая другая ОС в мире, была предназначена для такого устройства. Гассе с товарищиами подумал так же и решил рискнуть. BeIA является «урезанной» версией обычной BeOS, в которую для улучшения мультимедийных и сетевых возможностей были добавлены: новый сетевой стек BONE (BeOS Network Stack), браузер Opera 4.0, медиаплеер Real Player, а также виртуальная машина Java. Кроме того, каждый производи-
ретроспектива тель, лицензировавший BeIA, мог самостоятельно создать внешний вид системы, подстраивая его под нужды конкретного устройства. В результате усечения некоторых библиотек новая ОС могла спокойно разместиться на флэш-карте объёмом 16 Мб и комфортно чувствовать себя на тех же 16 Мб ОЗУ. По мнению Be Inc., BeIA могла бы с успехом применяться в веб-планшетах, медиа-серверах, хранящих различную фото-, аудио- и видеоинформацию, миниатюрных ПК, игровых консолях и т. д. Вместе с заявлением об изменении стратегии Гассе объявил о том, что Be Inc. становится открытой акционерной компанией. Выпуск шести миллионов акций по цене 6 долл. за акцию должен был, по мнению управляющего, принести Be Inc. 57 млн. долл., необходимых на развитие и продвижение проекта BeIA (суммарная прибыль компании в 1998 году составила всего 1,2 млн. долл.). Первым «внешним» акционером Be Inc. стала, как нетрудно догадаться, корпорация Intel, купившая 10% её акций. Сразу после объявления Жаном-Луи Гассе новой стратегии развития компании среди пользователей BeOS поднялась буря негодования, вызванная опасением, что Be Inc. перестанет уделять должное внимание версии своей ОС для настольных компьютеров. Павел Цислер, создатель Tracker, предложил Стиву Сакоману открыть исходные коды некоторых частей системы, чтобы сообщество программистов для BeOS могло дальше улучшать возможности операционной системы. Поскольку Сакоман и Гассе сами думали над подобным шагом, идея Цислера была воплощена в жизнь, и на свет появились проекты OpenTracker и OpenDeskbar. Тем не менее циркулировавшие вплоть до середины 2000 года слухи об открытии исходного кода всей BeOS таковыми и остались. Причина, по словам Гассе, заключалась в большом количестве чужих технологий, лицензированных Be Inc. для своей ОС. Их изымание из системы потребовало бы очень много времени, которого у компании с её ограниченными ресурсами просто не было. Изменение стратегии Be Inc. коренным образом повлияло на весь рынок BeOS. Несмотря на то, что курс ак-
№1, январь 2006
ций компании после объявления BeIA стал расти, многие именитые разработчики ПО, понимая, что дальнейшая судьба BeOS теперь под вопросом, приостановили либо прекратили процесс переноса своих приложений. В их число вошли: Steinberg (аудиоредактор NUENDO), Emagic (аудиоредактор Logic Audio), Maxon (пакет для создания трёхмерной графики Cinema 4D) и др. Также были приостановлены работы по переносу приложений внутри самой Be Inc. BeOSверсии генератора трёхмерных ландшафтов Bryce 4 (MetaCreations), пакетов для создания трёхмерной графики Strata3D и StudioPro, а также программы нелинейного видеомонтажа VideoShop (C-3D Digital) так и остались незаконченными. Изменение стратегии Be Inc. больно ударило и по тем немногим компаниям, осмелившимся начать работы по переносу своих игровых приложений на BeOS. Со временем операционная система лишилась: Tribes II, Neverwinter Nights, Worms Armageddon, Shogo: Mobile Armor Division, Unreal Tournament, Quake III, Black & White и SimSity 3000. Хотя ещё одним немаловажным аспектом, препятствовавшим появлению игровых продуктов на BeOS, стали постоянные задержки с тестированием аппаратного ускорения OpenGL и нового сетевого BONE. Из дошедших до пользователя игр остались лишь Civilization: Call to Power и Corumn III: Chaotic Magic. Кроме программ, BeOS начала «терять» и инженеров, работавших над ней. Так, в течение 1999 года из Be Inc. ушли практически все создатели операционной системы: Доминик Джиамполо (автор BFS), Джейсон Семс (работавший над OpenGL), Говард Бирки (BONE), Павел Цислер (Tracker) и др. Из положительных событий, последовавших вслед за роковым заявлением Жана-Луи Гассе, стало объявление в августе 1999 г. Be Inc. финансовых результатов второго квартала. Прибыль компании составила 537 000 долл., что на 74% больше (309 000 долл.), чем за первый квартал. Окрылённая успехом, Be Inc. начала усиленно продвигать свою новую ОС на рынок. Среди компаний, лицензировавших BeIA на протяжении 1999 года, стоит отметить: Intel, Microworkz, Qubit
Рисунок 5. Интерфейс прототипа цифрового музыкального сервера Aura
Рисунок 6. Программа для финального мастеринга песен T-RackS
Technology, National Semiconductor, First Computer International, Metricom и др. Большинство из устройств, анонсированных этими компаниями, представляли собой маломощные ПК, вебпланшеты, а также «интеллектуальные пульты» для дистанционного управления бытовой электроникой. «Засмотрелась» на BeIA и Compaq Computer. По словам представителей компании, для её персонального устройства, предназначенного для доступа в Интернет, новая ОС от Be Inc. подходила как нельзя лучше. Компании заключили партнёрское соглашение, и Compaq стала официальным лицензиатом BeIA. Однако в октябре 1999 года компания объявила о разрыве соглашения и лицензировании Windows CE от корпорации Microsoft. В это же время в Интернет просочились слухи о том, что Compaq незаконно предоставила конфиденциальную информацию относительно BeIA Microsoft, за что та обеспечила компании скидку на Windows CE. Таким образом, бывший партнёр подло предал Be Inc. и пошёл под суд, закончившийся, правда, безрезультатно.
BeOS 5 Personal Edition: преодолевая миллионный рубеж Несмотря на некоторые успехи Be Inc. в деле лицензирования BeIA, пользо-
89
ретроспектива
Рисунок 7. Интернет-терминал Sony eVilla, работающий на базе BeIA
Рисунок 8. Интерфейс BeOS Zeta
ватели BeOS продолжали негодовать и требовать выпустить новую версию системы, содержавшую долго ожидаемые аппаратную акселерацию OpenGL, сетевой стек BONE, а также виртуальную машину Java. Дабы хоть как-то успокоить своих клиентов, Be Inc. в марте 2000 года объявила о выходе сразу двух версий BeOS 5.0 – Personal Edition и Professional Edition. В пятой версии ОС содержалось меньше улучшений, чем в BeOS 4.5, да и они были не такими важными. Судите сами: благодаря проектам OpenTracker и OpenDeskbar обновились Tracker и Deskbar; новый драйвер для файловых систем NTFS и ext2fs позволил читать (но не записывать) данные в разделах Windows 2000 и Linux; была улучшена производительность ОС при проигрывании MPEG-файлов; появилась простая программа для записи CD-дисков под названием CDBurner, была добавлена поддержка колёсика прокрутки на мыши, расширен список поддерживаемого аппаратного обеспечения (в основном принтеров), а также несколько улучшены возможности
90
программ NetPositive, BeMail, Camera, 3dmiX и среды разработки BeIDE. BeOS 5 Pro Edition помимо этого содержала несколько лицензированных Be Inc. компонентов: лицензированный mp3-кодек, медиа-проигрыватель RealPlayer G2, видеоэнкодер Indeo 5, а также руководство по эксплуатации и техническую поддержку. При этом из ОС пятой версии были убраны экспериментальные драйверы аппаратного ускорения OpenGL, присутствовавшие в BeOS 4.5. Главное же отличие между PE и Proверсиями заключалось в том, что бесплатная BeOS 5.0 поставлялась в виде инсталлятора и устанавливалась в Windows, создавая полугигабайтный образ BFS внутри файловой системы FAT32. Be Inc. надеялась использовать BeOS 5 PE в качестве «троянского коня», который позволил бы пользователям, не желающим или не умеющим устанавливать операционную систему на отдельный раздел, тем не менее попробовать её. В результате «Интернет-бума» Personal Edition всего за три месяца было скачано более миллиона копий BeOS 5 PE. Кроме того, практически каждый компьютерный журнал считал обязательным включить бесплатную версию ОС на свой компакт-диск. Так, по словам Стива Сакомана, в одной только Европе более 65 журналов распространили BeOS 5 PE количеством в шесть миллионов копий. Стоит также отметить появление напротяжении 2000 года качественного нового ПО для BeOS: новой версии офисного пакета GobeProductive 2.0 с возможностью чтения документов Microsoft Office, программ для создания музыкальных композиций (GrooveMaker), диджеинга (FinalScratch), а также финального мастеринга песен (T-RackS), программы для нелинейного видеомонтажа (UltraDV) и др. BeOS была у всех на виду. О ней заговорил весь компьютерный мир. Тем не менее дела у Be Inc. шли всё хуже и хуже. Если компанию представить в качестве мяча и подкинуть его высоко вверх, момент, когда он достигнет максимальной высоты и начнёт стремительно падать вниз, настал для Be Inc. именно в 2000 году. На протяжении 2000 года стратегия BeIA начала «давать трещины». Одна
за другой компании, ранее лицензировавшие новую ОС, объявляли о переходе на другие альтернативные решения: кто – на WindowsCE, кто – на QNX, а кто – на Linux. Be Inc. помогали удержаться на плаву лишь продажи BeOS 5 Pro, принёсшие за последний квартал 2000 года 480 000 долларов, которых едва хватало на выплату зарплаты своим сотрудникам. Понимая, что каждый новый день приближает Be Inc. к банкротству, Гассе и компания продолжали усиленно продвигать BeIA в массы. На выставке CES 2001, ежегодно проходящей в Лас-Вегасе, Be Inc. представила миру прототип Aura – мультимедийного домашнего центра, предназначенного для кодирования, прослушивания, а также хранения музыки в формате mp3. Устройство подключалось к телевизору и обладало интуитивно-понятным пользовательским интерфейсом, позволявшим организовывать композиции в плейлисты, просматривать информацию о песнях, дополнительные данные об исполнителях, а также в будущем покупать музыку через интернет-магазины. Идея с Aura так понравилась самой Be Inc., что компания буквально сразу же объявила о создании целой платформы под названием HARP (Home Audio Reference Platform – базовая платформа), предназначенной для создания «умных» мультимедийных устройств. На HARP сразу же объявился первый потенциальный покупатель – Music Republic, но дальше «постного» релиза о сотрудничестве с Be Inc. дело, как в случае с абсолютным большинством лицензиатов BeIA, не пошло.
Прощальный вздох 2001 год стал последним годом жизни Be Inc. Финансовые показатели компании держались на уровне «ватерлинии» лишь благодаря Sony, лицензировавшей BeIA для своего нового интернет-терминала eVilla. Убытки Be Inc. достигли к 31 декабря 2000 г. (конец финансового года) 94 млн. долл., в то время как прибыль составила лишь 14 миллионов. Эти финансовые показатели заставили компанию пойти на крайние меры – уволить 27 человек. Несмотря на то, что большинство из них занимали должности менеджеров по продажам, Be Inc.
ретроспектива лишилась и нескольких инженеров, «не вовлечённых в разработку основного продукта компании», то бишь программистов BeOS. В феврале 2001 года, отчаявшись, компания подала в суд на корпорацию Microsoft, обвиняя её в монополизации рынка операционных систем своей Windows, а также в давлении на производителей ПК. В то время судебный антимонопольный процесс касательно Microsoft длился уже три года (в частности, вспомните «войну» браузеров Netscape Navigator и Internet Explorer в 1998 г.). Be Inc., лишённая возможности поставлять свою ОС производителям компьютеров, чтобы те могли спокойно устанавливать её на свои ПК, вошла в группу компаний-обвинителей. Судебный процесс затянулся до 5 сентября 2003 года, когда Be Inc. (в которой к тому времени останется лишь один сотрудник – юрист) объявила об отзыве своего иска, а Microsoft – о выплате 23,25 млн. долл. компании в качестве компенсации. BeIA и практически «иссякшие» продажи BeOS 5 Pro не смогли удержать BeOS от падения в бездну: 2 апреля 2001 года Жан-Луи Гассе объявил, что оставшихся у Be Inc. 9 млн. долл. хватит лишь на шесть месяцев существования, после чего она полностью обанкротится. Гассе ничего не оставалось, как начать разрабатывать план продажи своей компании. В августе 2001 года Be Inc. объявила об очередном увольнении 28 сотрудников, пытаясь хоть немного снизить затраты и продержаться до того, как на её душу найдётся покупатель. Ждать, впрочем, надо было недолго. Буквально через пару недель после второго увольнения компания Palm Inc. 18 августа соизволила приобрести Be Inc. и впоследствии использовать мультимедийные возможности, предоставляемые BeIA, в своей собственной операционной системе для КПК PalmOS. 12 ноября, после совещания акционеров Be Inc., Palm окончательно приобрела всю интеллектуальную собственность компании за ничтожную сумму в 11 млн. долл. Казалось, история «пчелы» подошла к концу…
Жизнь после смерти Ан нет. Невзирая на официальную «смерть» BeOS, сообщество её поль-
№1, январь 2006
зователей продолжает активно поддерживать систему. Постоянно выпускаются новые программы, совершенствуются старые. На основе бесплатной BeOS 5 PE, а также патчей, драйверов и программ, народ собирает различные дистрибутивы. Например, BeOS, ранее не «дружившая» с процессорами Pentium 4/ Athlon, а также видеокартами старше первого ATI Radeon, благодаря появлению BeOS Max и BeOS Developer Edition может спокойно работать на новых компьютерах. Кроме того, на основе просочившейся тайком в 2001 году беты, следующей за BeOS пятой версии BeOS 5.1d0 (кодовое название Dan0), был разработан дистрибутив PhOS. Но самое главное – BeOS продолжает развиваться, и в этом ей помогают два проекта – Haiku и Zeta. Расскажем о них лишь в паре приложений. Заинтересованные могут найти подробное описание и новости касательно проектов по адресам, находящимся в конце статьи. Проект Haiku, ранее носивший неофициальное название OpenBeOS, стартовал буквально через два месяца после покупки Palm компании Be Inc. Его целью стало воссоздание BeOS 5.0 в новой операционной системе с открытым исходным кодом. Помимо этого, программисты уже выпустили достаточно драйверов, позволяющих существующим версиям BeOS чувствовать себя «как дома» на большинстве распространённых конфигураций современных ПК. Что же касается BeOS Zeta, её основателем является немец Бернд Корц, ранее занимавшийся выпуском журнала InsideBeOS, почившего после пятого номера. В начале 2001 года Корц основал компанию yellowTAB, решившую заняться дальнейшим продвижением BeOS. Для этого им была выкуплена лицензия на продажу BeOS 5 Pro у немецкого дистрибьютера Koch Media, на основе которой yellowTAB собиралась выпустить дистрибутив под названием BeOS NG (Next Generation – следующее поколение). Позже его «начинку» было решено заменить с BeOS 5 Pro на BeOS 5.1d0, в результате чего операционная система изменила название на BeOS Zeta.
Рисунок 9. Графический растровый редактор Refraction
На данный момент Zeta является наиболее продвинутой версией BeOS. Она включает в себя: обновлённое ядро; SVG Tracker, поддерживающий векторную графику; новый USB-стек; BONE и множество других улучшений и дополнений. По словам Бернда Корца, количество проданных копий BeOS Zeta в три раза превышает количество всех предыдущих версий BeOS, проданных Be Inc.
Послесловие Делать какие-либо выводы относительно «светлого» будущего BeOS ещё рановато, тем не менее рискнём предположить, что после выхода более или менее стабильной версии Haiku, а также новых версий Zeta о BeOS снова заговорят в таком же «радужном свете», как и в 1996 году. Круг замкнётся, и начнётся новая эра – эра BeOS.
Ссылки: 1. www.qube.ru – сайт русскоязычных пользователей BeOS. 2. www.bebits.com – база программного обеспечения для BeOS. Практически все существующие программы, а также новые драйверы для этой ОС можно скачать с этого сайта. 3. www.yellowtab.com – если вдруг возникло желание попробовать BeOS Zeta, заказать её можно на сайте компанииразработчика. 4. www.haikunews.org – источник новостей о проекте Haiku.
Редактор рубрики Кирилл Тихонов
91
книжная полка
Головоломки для хакера Иван Скляров
Материал, изложенный в книге, является сборником заданий, опубликованных в рубрике X-Puzzle журнала «Хакер», которую долгое время вел автор книги. Несмотря на уже вполне сформировавшееся мнение о журнале у специалистов, с «шапкозакидательским» настроением к заданиям подходить нельзя. Все задания разделены на 7 частей, которые посвяще-
ны своей области, – криптоанализ, го- задание. Уровень сложности головоловоломки в Web (хотя логичнее бы- ломок разнится – если некоторые можло бы назвать «головоломки в сети»), но «расколоть» и в уме, то на решение Windows, кодинг, безопасное програм- иных можно потратить часы или даже мирование, reverse code engineering дни, с учетом использование «спец(отладки и дисассеблирование) и за- средств». Всего предствлено 75 голодания «для всех». Да, спектр задач до- воломок, много это или мало – судить статочно широк, так что каждый смо- только вам. В конце книги приводятся жет найти для себя что-нибудь инте- развернутые решения для всех задаресное. Кому-то покажется занятным ний. Но не спешите их смотреть, не липоиск ошибок в представленном учас- шайте себя удовольствия от самостотке кода, после нахождения которого ятельного разгадывания решения, канадо написать эксплоит, который бу- залось бы неразрешимой, на первый дет использовать найденную уязви- взгляд задачи. Достойная книга, с домость, для кого-то более интересно стойным материалом, с ней можно скобудет исследование бинарных файлов ротать несколько долгих зимних вечес помощью отладчика и дисассембле- ров (или ночей). Нельзя не отметить ра, а возможно, вам придется по ду- прилагающийся к книге диск, на котоше анализировать куски лога tcpdump, ром вы найдете много любопытного. для того чтобы разгадать ту или иную Издательство: «БХВ-Петербург» головоломку. Не останутся без дела 2005 и любители криптоанализа. Перефра- Год издания: 320 зирую известную фразу «от каждо- Количество страниц: 5-94157-562-9 го по способностям – каждому по за- ISBN: Цена: ≈ 182 руб. данию», так и тут каждый найдет себе
Компьютерные вирусы изнутри и снаружи Крис Касперски
Так же как и первая книга автора, материал является, по большей части, собранием ранее опубликованных статей (по большей части в нашем журнале). Первая часть книги носит сугубо философско-теоретический характер, но от этого менее интересной не становится. Основные темы размышлений становятся понятны из названия – «О деньгах, вирусах, программирова-
92
нии и смысле жизни». Локальным виру- дать, что весь остальной материал сам посвящена вторая часть – тут и про также имеет непосредственное отноUNIX, и про Windows. Следующую, тре- шение к основной теме книги, но детью часть по праву можно назвать са- лать это я поостерегся. Изучая материмой разношерстной. Несмотря на свое ал книги, иногда я невольно задавалзаглавие «Черви возвращаются», ав- ся вопросом, а понимает ли вообще автор нам повествует и о SEH, и о дав- тор, о чем он пишет? Для примера возьно известной уязвимости в IE, связан- мем главу о базах данных, чего тольной с IFRAME, а также о технологиях ко стоит цитата «Захватив управление honeypot и… о базах данных (!). Далее веб-сервером (а практически ни одно(в 4 части) излагаемый материал так- му веб-серверу не удалось избежать же достаточно отдаленно относится ошибок переполнения буфера и прок теме вирусов, но зато вы ознакоми- чих дыр), атакующий получит доступ тесь с техникой отладки приложений в ко всем данным, хранящимся в базе!». UNIX-системах, технологией защиты А в остальном, занятная книга, но цеCD, а также тестированию ПО. Завер- левая аудитория неопределима. шает издание последняя часть, из ко«Питер» торой вы узнаете о различных эмуля- Издательство: 2006 торах и виртуальных машинах, техни- Год издания: Количество страниц: 527 ке оптимизации в Linux и пр. Вот так и 5-469-00982-3 получается, что непосредственно ви- ISBN: ≈ 268 руб. русам посвящена только вторая часть Цена: книги. Нет, можно, конечно, утверж- Книга предоставлена издательством «Питер».
книжная полка
Хакинг. Искусство эксплоита Джон Эриксон
«Эх, опять эксплоиты и переполнения буферов, ну сколько можно!» – скажет искушенный читатель. Действительно, освящаемая в книге тема уже достаточно заезжена, статей море – начиная от ставшей уже канонической статьи «Smashing the stack for fun and profit», написанной почти 10 лет назад, и заканчивая статьями от «широко известных в узких кругах» личностей. Но у
этой книги есть неоспоримое преиму- сканирования и ddos-атак. Завершает щество перед всеми остальными пуб- книгу раздел, посвященный криптололикациями, – это систематизация из- гии, прочтя который вы узнаете о теолагаемого материала. рии информации, различных алгоритСразу замечу, все, что описано мах шифрования данных, методиках в книге относится к UNIX-подобным взлома паролей, атак на беспроводОС, в частности к GNU/Linux. Автор ные сети и многое другое. последовательно (от простого к сложИзложенный материал носит суному) повествует читателю о такой губо практический характер, каждая сложной, но жутко увлекательной те- тема сопровождается приведенным в качестве примера исходным кодом. ме, как написание эксплоитов. Начиная с совсем уж простых при- Я думаю, книга покажется, как минимеров ошибок, которые в наше время мум, занятной широкому кругу читамогут появиться разве что в «лабора- телей – системным администраторам, торых условиях», медленно но верно программистам и разного рода исслепродвигаемся в сторону уже не таких дователям. Если вы не боитесь отладтривиальных вещей, как переполнение чика gdb и вас не пугают «километров стеке и атаки на форматные стро- вые» дисассемблерные листинги – эта ки. Отдельно описаны тонкости и хит- книга для вас. рости, которые несомненно пригодятся при написании shell-кода. Дальше Издательство: «Символ плюс» больше – переходим от локального Год издания: 2005 к сетевому. Целая глава посвящена Количество страниц: 240 взаимодействию с сетью. Тут и сниф- ISBN: 5-93286-076-6 финг, и tcp/ip hijack, различные методы Цена: ≈ 268 руб.
Безопасность сети на основе Microsoft Windows Server 2003 Роберта Брэгг
Эта книга является официальным учебным курсом от Microsoft для желающих самостоятельно подготовиться к экзамену 70-298. Каждая глава книги разделена на занятия, позволяет нормировать изучаемый материал. В конце каждого занятия вам предлагается самостоятельно решить несколько упражнений. Основные темы книги: создание концеп-
№1 январь 2006
туального плана защиты сетевой инфраструктуры, проектирование логической защитной инфраструктуры, физическая защита для сети, создание возможности безопасного управления сетью, подготовка системы обновления системы безопасности, разработка стратегий аутентификации и проектирование защиты межсетевого взаимодействия. Также вы познакомитесь с технологиями проектирования защиты для серверных ролей, управления доступом к корпоративной информации, создания защищенной инфраструктуры клиентов и защищенных клиентских систем. Не остались без внимания вопросы внедрения беспроводных сетей и техника защиты IIS. На прилагаемом к книге CD вы найдете демоверсию тестов, которые вам
предстоит решать в процессе сдачи экзамена, все упражнения, которые описывались в книге, электронные книги (на английском языке) и небольшой словарь терминов. Книга, несмотря на сложность темы, легко читается, а большое количество примеров и скриншотов помогает вам лучше усвоить прочитанный материал. Но даже если вы не собираетесь сдавать экзамены, все равно рекомендуется приобрести это издание, поскольку в нем, действительно очень удачно, освещена и раскрыта основаная тема книги.
Издательство: «Питер» Год издания: 2005 Количество страниц: 672 ISBN: 5-7502-0028-0 Цена: ≈ 551 руб. Книга предоставлена издательством «Питер».
Обзор книжных новинок подготовил Александр Байрак
93
подписка на 2006 год Российская Федерация
Подписной индекс: годовой – 20780, полугодовой – 81655 Каталог агентства «Роспечать»
Подписной индекс: 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» Альтернативные подписные агентства: Агентство «Интер-Почта» (095) 500-00-60, курьерская доставка по Москве Агентство «Вся Пресса» (095) 787-34-47 Агентство «Курьер-Прессервис» Агентство «ООО Урал-Пресс» (343) 375-62-74 ЛинуксЦентр www.linuxcenter.ru Подписка On-line http://www.arzi.ru http://www.gazety.ru http://www.presscafe.ru
СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры АРЗИ: Азербайджан – по объединенному каталогу российских изданий через предприятие по распространению печа-
ти «Гасид» (370102, г. Баку, ул. Джавадхана, 21)
Казахстан – по каталогу «Российская Пресса» через ОАО «Казпочта» и ЗАО «Евразия пресс»
Беларусь – по каталогу изданий стран СНГ через РГО «Белпочта» (220050, г. Минск, пр-т Ф. Скорины, 10)
Узбекистан – по каталогу «Davriy nashrlar» российские издания через агентство по распространению печати «Davriy nashrlar» (7000029, г. Ташкент, пл. Мустакиллик, 5/3, офис 33) Армения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г. Ереван, пл. Сасунци Давида, д. 2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул. Сарьяна, 22) Грузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г. Тбилиси, ул. Хошараульская, 29) и АО «Мацне» (380060, г. Тбилиси, пр-т Гамсахурдия, 42) Молдавия – по каталогу через ГП «Пошта Молдавей» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134) по списку через ГУП «Почта Приднестровья» (МD-3300, г. Тирасполь, ул. Ленина, 17) по прайс-листу через ООО Агентство «Editil Periodice» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134) Подписка для Украины: Киевский главпочтамт Подписное агентство «KSS», тел./факс (044)464-0220
Подписные индексы:
20780* 81655** по каталогу агентства «Роспечать»
87836 по каталогу агентства «Пресса России» * **
94
годовой полугодовой
подписка на 2006 год Редакционная подписка Открыта подписка через редакцию. Вы можете оформить подписку на любое количество номеров 2006 года. Редакция не высылает журналы за пределы Российской Федерации.
Для юридических лиц:
Отправьте заявку по факсу (095) 928-82-53 или по e-mail: info1@samag.ru.
Укажите наименование и банковские реквизиты своей организации, почтовый индекс и адрес доставки журнала, телефон и e-mail контактного лица, период подписки и количество номеров. Редакция выставит вам счет, после оплаты которого вы начнете получать журналы по почте. Необходимые бухгалтерские документы высылаются почтой.
№5
(30 по )м д ww писн w.s ой ай 2 am ин 0
05 По ag дек Ищ чем .ru с 8165 5 ем у M пр S S Ст WP роим ичин QL м A-E з ы ед ле nte ащи На нн стр rpr ще ор is н аи Ка аб e, ную ва ота 80 уд к во ем 2.1 бес ет? ал сс UP е x т н а S Чт EA пров ны но по ов P-T од е ф вит дL аж LS ную inu ай ь но лы се x в к тана зн ть: по ать ор вл д п и ор ва Эф BS об ати ем D IPпо фек вн Sy тел ля ти ой ma ми вн еф Ко се nte по о у он ти c ль пр с п нтро и и A зо ав ntiv ом ли ва ля ощ ру iru Ин тел ем ью ем s9 ей со терв .0 OS без зд ью вA SIM оп ате с D ас ле Ла но м я рр сть зы и У се ка ол ти Pe лом rl –
Для физических лиц:
Заполните нижеприведенную квитанцию, оплатите в любом банке и пришлите в редакцию копию с отметками банка. После поступления платежа редакция начнет отправлять вам номера.
Стоимость подписки через редакцию: 900* руб. за 6 номеров 1800* руб. за 12 номеров
* Включая НДС и почтовую доставку
№1, январь 2006
95
СИСТЕМНЫЙ АДМИНИСТРАТОР №1(38), Январь, 2006 год РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Редактор Алексей Коршунов Внештатные редакторы Алексей Барабанов Кирилл Тихонов Сергей Супрунов РЕКЛАМНАЯ СЛУЖБА тел./факс: (095) 928-8253 Дарья Хохлова reсlama@samag.ru Верстка и оформление maker_up@samag.ru Дизайн обложки Николай Петрочук По вопросам распространения обращайтесь по телефону: (095) 928-8253 (доб. 120) 107045, г. Москва, Ананьевский переулок, дом 4/2, стр. 1 тел./факс: (095) 928-8253 Сайт журнала: www.samag.ru РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета» Отпечатано типографией ГП «Московская Типография №13» Тираж 9000 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002 г.). За содержание статьи ответственность несет автор. За содержание рекламного объявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены.
ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Современный Linux-сервер: как планировать дисковые ресурсы. Часть 2 Выбор технологии представления данных не исчерпывает всей совокупности вопросов, возникающих в процессе планирования дисковых ресурсов. Надо выбрать тип файловой системы, подумать о надежности сделанных решений, и, самое главное, обеспечить соответствующее функционирование созданной системы так, чтобы можно было воспользоваться на практике всеми преимуществами и выгодами.
и доступно через обновления. Вторые пересоберут критически важные пакеты со своими настройками и уберут, по их мнению, лишнее. Дистрибутив Netwosix предназначен именно для вторых, вот кому этот дистрибутив будет, несомненно, интересен. При наличии подготовленных конфигурационных файлов ядра и серверов, систему под любые требования можно собрать в течение часа. Буквально через пять дней после объявления релиза 1.3 дистрибутива Linux Netwosix был анонсирован тестовый вариант следующей второй ветки. Что нового появилось и для каких целей предназначен Linux Netwosix?
Активные средства защиты против переполняющихся буферов IRC: свобода слова Стратегическая оборонная инициатива с неисполняемым стеком и NX/XDбайтами дискредитировала себя и на проверку оказалась простым маркетинговым трюком раздутой рекламной шумихи. Кто же теперь будет противостоять червям и переполняющимся буферам? Механизмы проверки времени исполнения бросают вызов и уверенно держат удар, однако, они всетаки уязвимы.
Сервисная система, с помощью которой можно общаться через Интернет с другими людьми в режиме реального времени, IRC, была создана в 1988 году финским студентом Ярко Ойкариненом (Jarkko Oikarinen. Изначально, когда доступ к сети Интернет был ограничен, компьютерное сообщество пользовалось доступными и популярными в то время видами общения, посредством сети FIDO, а также с помощью, так называемых BBS. Поскольку технология IRC зародилась в UNIXLinux Netwosix – сообществе, то очевидно, что наибольдистрибутив для сетей Есть два типа администраторов. Пер- шую популярность она снискала себе вые не будут (или не любят) занимать- именно в этой среде и по сей день, прося лишней работой и использует, то что цент пользователей этой сети именно установлено вместе с дистрибутивом «юниксоидами» достаточно велик.
Уважаемые читатели! Спешите оформить подписку на первое полугодие 2006 года! Приобрести новые и старые номера журнала вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.
Доставка почтой в любую точку России.
96