98
Роспечать – 20780, 81655 Пресса России – 87836 Интер-почта – тел. (095) 500-00-60 Так видит журнал читатель, который забыл оформить подписку: ПОДПИШИТЕСЬ И ЧИТАЙТЕ! Так видит журнал читатель, оформивший подписку: НОВОГОДНИЕ КАНИКУЛЫ ЗАТЯНУЛИСЬ БЫСТРО РАСКУПИЛИ ТИРАЖ НЕОЖИДАННО ЗАКОНЧИЛИСЬ ДЕНЬГИ УЕХАЛ В ОТПУСК ПОСЛЕ ОТПУСКА АВРАЛ НА РАБОТЕ №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 №2(39) февраль 2006 №2(39) февраль 2006 подписной индекс 20780 www.samag.ru Подключаемся к Интернету через спутник Чем уникальна Prevx1 – общественная система предотвращения атак Можно ли защититься от переполнения буферов? Как повысить безопасность веб-приложений Доставку гарантируем: качество обслуживания в пакетных сетях ProFTPD: мастер своего дела Практикум Python: обрабатываем входящую электронную почту Какова цена анонимности в Сети

039 Системный Администратор 02 2006

Embed Size (px)

DESCRIPTION

ЗАКО Н ЧИ Ж И ДАН ДЕН ЬГИ РАБО ТЕ ГО ДН И Е СТРО ЛИ СЬ Н О ВО РАЖ №2(39) февраль 2006 Н ЕО БЫ ЛИ Н О СЬ ТИ №5(30) май 2005 №5(30) май 2005 подписной индекс 81655 www.samag.ru подписной индекс 81655 www.samag.ru Íàøà êîìïàíèÿ 12 ëåò ïðåäîñòàâëÿåò ëèíèè ñâÿçè â ñàìûõ íåïðîõîäèìûõ ìåñòàõ Ìîñêâû. 10 Ìáèò - $500, âêëþ÷åíî ÌÍÎÃÎ òðàôèêà. Anything else? г. Москва, Хлебный переулок 2/3 тел. 29-161-32, 202-61-43 (круглосуточно) e-mail: [email protected]

Citation preview

Page 1: 039 Системный Администратор 02 2006

Роспечать – 20780, 81655Пресса России – 87836Интер-почта – тел. (095) 500-00-60

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

ПОДПИШИТЕСЬ И ЧИТАЙТЕ!

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

НОВОГОДНИЕ

КАНИКУЛЫ

ЗАТЯ

НУЛИСЬ

БЫСТР

О РАСКУПИЛИ

ТИРА

Ж

НЕОЖ

ИДАННО

ЗАКОНЧИЛИСЬ Д

ЕНЬГИ

УЕХАЛ В

ОТП

УСК

ПОСЛЕ ОТП

УСКА

АВРАЛ Н

А РАБОТЕ

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

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

Строим защищенную беспроводную сеть:WPA-Enterprise, 802.1x EAP-TLS

Настраиваем UPS под Linux

Как восстановить удаленные файлы под BSD

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

танавливаем Symantec Antivirus 9.0в корпоративной сети

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

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

Интервью с Ларри Уоллом –создателем языка Perl

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

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

Строим защищенную беспроводную сеть:WPA-Enterprise, 802.1x EAP-TLS

Настраиваем UPS под Linux

Как восстановить удаленные файлы под BSD

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

танавливаем Symantec Antivirus 9.0в корпоративной сети

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

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

Интервью с Ларри Уоллом –создателем языка Perl

№2(

39)

фев

раль

200

6

№2(39) февраль 2006подписной индекс 20780www.samag.ru

Подключаемся к Интернету через спутник

Чем уникальна Prevx1 –общественная система предотвращения атак

Можно ли защититься от переполнения буферов?

Как повысить безопасность веб-приложений

Доставку гарантируем:качество обслуживания в пакетных сетях

ProFTPD: мастер своего дела

Практикум Python: обрабатываем входящую электронную почту

Какова цена анонимности в Сети

Page 2: 039 Системный Администратор 02 2006

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

Anything else?

Çâîíèòå, äîãîâîðèìñÿ! ;-)

г. Москва, Хлебный переулок 2/3тел. 29-161-32, 202-61-43

(круглосуточно)e-mail: [email protected]

Page 3: 039 Системный Администратор 02 2006

1№2, февраль 2006

оглавление

ТЕНДЕНЦИИ2

ИНТЕРВЬЮ

Free Software Foundation переходит на технологию LinuxBIOS

4

Антон Борисов[email protected]

Вы всё ещё не используете WMI?Часть 2: пишем сценарии

6

АДМИНИСТРИРОВАНИЕ

Константин Леонтьевklеоnt@miсrоsоft.соm

Написание скриптов, использующих WMI для управле-ния распределенной сетевой инфраструктурой.

ProFTPD: мастер своего дела24

Сергей Супрунов[email protected]

Разработчики ПО постоянно стараются реализовать новые возможности в тесных рамках протокола FTP. Один из наиболее ярких представителей этой плея-ды – проект ProFTPD.

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

16

Алексей Барабанов[email protected]

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

FreeDOS – новый взгляд на старые вещи32

Иван Максимов[email protected]

MS-DOS давно устарел. Какие новые проекты доступ-ны сегодня? Чем они отличаются? Есть ли их подде-ржка? Насколько они совместимы с программным и ап-паратным обеспечением? Предлагаем вам обзор од-ной из DOS-систем, поддерживаемой и развиваемой до настоящего времени.

ПРОГРАММИРОВАНИЕ

Практикум Python: обрабатываем входящую электронную почту

38

Сергей Супрунов[email protected]

Методы и приёмы, которые продемонстрированы при решении этой узконаправленной задачи, помогут вам решать проблемы гораздо более широкого спектра.

Замыкания в Perl42

Алексей Мичурин[email protected]

Замыкания являются одной из тех особенностей Perl, которые редко встретишь в других языках программи-рования. Да и программисты на Perl зачастую не вда-ются в такие дебри. Напрасно. Даже если вы не исполь-зуете замыканий, знать о них весьма полезно.

БЕЗОПАСНОСТЬ

Чем уникальна общественная система предотвращения атак Prevx1

56

Сергей Яремчук[email protected]

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

Как повысить безопасность веб-приложений60ModSecurity – функциональный, простой в конфигуриро-вании, и главное, совершенно бесплатный инструмент, ис-пользование которого позволит повысить безопасность предоставляемых веб-услуг. Сергей Яремчук

[email protected]

Можно ли защититься от переполнения буферов?

48

Крис Касперски[email protected]

Хакеры ломают разрекламированные защитные комп-лексы один за другим. Почему? Давайте заглянем под капот Stack-Guard, Stack-Shield, Pro-Police и Microsoft Visual Studio .NET, сравнив заявленные возможности с реальными.

Исследуем сетевую безопасность посредством Linux Netwosix

66

Обзор дистрибутива, ориентированного на исследова-ние сетевой безопасности.

Сергей Яремчук[email protected]

СЕТИ

Подключаемся к Интернету через спутник70

Антон Борисов[email protected]

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

Какова цена анонимности в Сети74

Андрей Погребенник[email protected]

Когда цена анонимности почтовой переписки или со-вершения электронных платёжных операций высока, применимы лишь самые надёжные методы.

Доставку гарантируем: качество обслуживания в пакетных сетях

82

Сергей Сикорский[email protected]

Если вы работаете по ssh удаленно, слушаете интер-нет-радио или просто играете в online-игры, то знаете, что получаемое удовольствие прямо пропорционально нагрузке на вашу сеть.

История компьютеров «Амига»Часть первая: 1982-1994

86

Сергей Зуев[email protected]

РЕТРОСПЕКТИВА

КНИЖНАЯ ПОЛКА92

55, 65 BUGTRAQ

О подробностях рассказывает старший системный ад-министратор организации FSF – Ward Vandewege.

Сегодня компьютерная индустрия поделена главным образом между Windows, Apple и Linux/UNIX-решени-ями. Еще 10-15 лет назад ситуация на рынке ПК была совершенно другой.

Page 4: 039 Системный Администратор 02 2006

2

тенденции

Выход новой версии CRM от компании Microsoft8 февраля 2006 года в офисе Американской торговой палаты прошла пресс-конференция, посвященная вы-ходу новой версии системы управления отношениями с клиентами (CRM) от корпорации Microsoft – Microsoft Dynamics CRM 3.0. Как видно из названия, это уже тре-тья версия этого продукта, являющегося одним из ре-шений Microsoft Business Solutions.

Microsoft Dynamics CRM состоит из интегрированных мо-дулей «Автоматизация продаж» (Sales) и «Обслуживание кли-ентов» (Customer Service) и является инструментом для уве-личения продаж и обеспечения высокого уровня сервиса для клиентов компании. Сейчас множество компаний исполь-зуют в своей работе эту систему. Те, кто использует Microsoft CRM версии 1.2, могут обновить свою систему до версии 3.0, а использующие CRM версий 2005 Alpha и 2005 TAP, лише-ны такой возможности. Данная CRM зарекомендовала се-бя как легкое в использовании, настройке и поддержке биз-нес-приложение, которое может быть интегрировано с дру-гими системами предприятия. Новая версия программы, со-хранив все положительные стороны своей предшественни-цы, за счет использования последних наработок и решений софтверного гиганта (таких как MS SQL SERVER 2005) стала более надежной, быстрой в работе и развертывании. Поль-зовательский интерфейс претерпел изменения, сделавшие работу в системе более очевидной и удобной. Основные же изменения коснулись внутреннего устройства системы. Есть все основания полагать, что Microsoft Dynamics CRM 3.0 зай-мет достойное место на рынке систем управления отноше-ниями с клиентами.

Николай Никульшин

Не все выставки одинаково интересныМеждународный форум «Технологии безопасности» в этом году отметил своё десятилетие. Раз в год орга-низаторы собирают компании, так или иначе связан-ные с обеспечением безопасности. Последние два го-да форум проходит в «Крокус-Экспо».

Оставим лирику в стороне и обратим внимание на са-му выставку. Несмотря на малое количество отведённого места под экспозиции IT, компаний присутствовало доста-точно много. Представители наиболее интересных из них с удовольствием рассказывали о представляемых продук-тах и щедро делились визитными карточками и пресс-ре-лизами. Что же было наиболее примечательного?

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

Представители компании SecureIT рассказывали о сис-теме Zlock, обеспечивающей гибкое управление доступом к аппаратным ресурсам компьютера.

Компания «Актив» сообщала о своей системе со стран-ным названием Guardant. Это система защиты интеллек-туальной собственности разработчиков и издателей ком-пьютерных программ, представляющая собой програм-мно-аппаратный комплекс из электронных ключей и про-граммного обеспечения. Мы привыкли к подобным систе-мам при использовании программ компании 1С. Ещё одна разработка, только на этот раз для авторизации пользо-вателей и защиты электронной переписки в сетях на базе Windows-систем, ruToken, также предлагалась компанией «Актив» всем желающим.

Фирма АНКАД представила свою основную продукцию – аппаратные шифраторы серии Криптон.

Компания STAR Force рассказывала всем желающим о системе Safe’n’Sec, комплексной системе компьютерной безопасности класса IPS для корпоративных информаци-онных сетей.

ООО «Физтех-софт» предлагала систему защиты ин-формации StrongDisk CE для смартофонов, КПК и других устройств под управлением ОС Windows Mobile.

На стенде компании ABBYY красовались FineReader и Lingvо, продукты весьма известные, но с не совсем по-нятным отношением к безопасности.

НПО «Схема» и компания SonicWall представили свои готовые решения – шлюзы, firewall и другие сетевые средс-тва.

Механические системы блокирования, среди которых кабель-замок для портативного компьютера, стационарно-го компьютера, напольная подставка-замок для компьюте-ра и прочие системы физических блокировок, представи-ла компания Bariach Magem.

Как и в прошлом году, НПО «Техника-Сервис» на своём богатом и прекрасно оформленном стенде представила разновидности защищённых промышленных ноутбуков. По-сетителям предлагали полюбоваться на компьютеры, под-вергающиеся различным внешним раздражителям, таким, как вибрации, влага, прямые удары, низкие температуры, большое количество пыли и прочие воздействия.

В целом неправильно было бы сказать, что выставка пустовала, но и назвать её интересной и достойной вни-мания тоже нельзя. Из наиболее зрелищного в ряду IT-ком-паний, наверное, стоило бы упомянуть девушек, затяну-тых в латекс, рекламирующих агентство телохранителей, которое почему-то разместилось крайне близко к «ряду ИТ-шников». Они вызывали наиболее оживлённый инте-рес у публики.

Алексей Коршунов

Стенд «живучих» ноутбуков

Page 5: 039 Системный Администратор 02 2006

3№2, февраль 2006

тенденции

Mozilla переродилась в SeaMonkeyЭнтузиасты, не пожелавшие хоронить Mozilla Suite, анонси-ровали первый релиз реинкарнации единого набора интер-нет-приложений проекта Mozilla – SeaMonkey 1.0.

SeaMonkey 1.0 состоит из веб-браузера (Mozilla Browser, в котором помимо множества других новых функций, поя-вилась поддержка d’n’d в табах для мышки, автоматической прокрутки и изображений в SVG), почтового клиента (Mozilla Mail), HTML-редактора с интерфейсом WYSIWYG (Mozilla Composer), IRC-клиента (Chatzilla). Файлы для скачивания доступны на www.mozilla.org/projects/seamonkey.

MySQL AB открыла японское подразделениеКомпания MySQL AB, занимающаяся разработкой и подде-ржкой самой популярной открытой СУБД, объявила об уч-реждении MySQL K.K. – японского подразделения с шта-бом в Токио.

За 2005 год было зафиксировано более одного милли-она скачиваний сервера базы данных MySQL японскими пользователями. Новая структура займется дальнейшим развитием этого успеха, повышением заинтересованнос-ти в экономичных решениях RDBMS среди корпоративных заказчиков, вопросами коммерческого лицензирования для поставщиков программного обеспечения, а также подде-ржкой продукции.

«Япония – один из крупнейших мировых рынков ПО для баз данных корпоративного уровня, и интерес к MySQL в этом регионе был очень высок на протяжении нескольких последних лет, – прокомментировал Ларри Стефоник, пре-зидент MySQL K.K. и старший вице-президент MySQL AB по мировым продажам. – Открыв японское подразделение, мы продолжаем развитие услуг по предоставлению помо-щи нашим заказчикам и роста нашего бизнеса».

Oracle купила SleepycatВ середине февраля корпорация Oracle сообщила о при-обретении Sleepycat Software, которая специализирует-ся на программном обеспечении с открытым кодом и хо-рошо известна как разработчик популярной базы данных Berkeley DB.

Покупка стала логичным следствием высказанного на одной из недавних конференций Ларри Эллисоном, ис-полнительным директором Oracle, заявлением, что его кор-порация заинтересована в комбинировании программно-го обеспечения с открытым кодом и проприетарных разра-боток. Как сообщил Роберт Шимп, вице-президент по тех-нологическому маркетингу в Oracle, корпорация продол-жит поддерживать Sleepycat как автономное предприятие со всей текущей деятельностью в области проекта с от-крытым кодом Berkeley DB. В отличие от главного продук-та Oracle – базы данных Oracle 10g – свободные разработ-ки Sleepycat предназначены для встраивания в приложе-ния. «Люди используют Berkeley DB, когда им не нужна вся мощь реляционных систем баз данных SQL, – заявил не-давно Майкл Олсон, исполнительный директор Sleepycat, в интервью CNET. – В системах или устройствах, где вам нужно надежно и быстро хранить данные, вы можете зара-нее предугадать ее (СУБД) использование».

Проект Camino достиг релиза 1.0Состоялся первый релиз веб-браузера с открытым кодом на базе движка Gecko для Mac OS X – Camino 1.0. Браузер оснащен родным интерфейсом Cocoa, специальными икон-ками и другими особенностями, предназначенными для удобства его использования в среде Mac OS X. Причем ин-теграция с Mac OS X в Camino 1.0 не ограничивается вне-шним видом браузера. В Camino встроены и функции, ис-пользующие различные системные компоненты (Spotlight, Address Book, Keychain, Finder, Dock, Bonjour, Services и System Preferences). Официально объявлено о поддержке Mac OS X версий 10.2, 10.3 и 10.4. Camino 1.0 распростра-няется под свободной лицензией Mozilla (MPL 1.1) и досту-пен для скачивания с www.caminobrowser.org.

Основатель Gentoo покинул MicrosoftДэниэл Роббинс, основатель и бывший главный архитек-тор проекта популярного Linux-дистрибутива Gentoo, ушел из корпорации Microsoft, проработав там восемь месяцев. Основная задача работы Роббинса в Linux- и Open Source-ла-боратории Microsoft, на которую он поступил в мае прошлого года, сводилась к «обучению» сотрудников гиганта ПО при-нципам проектов, строящихся на базе сообщества и разра-боток с открытым кодом. Как сообщил основатель Gentoo Linux в электронном письме агентству ZDNet UK, он покинул Microsoft в связи с тем, что у него не было возможности при-менять все свои технические навыки на этом посту.

Составил Дмитрий Шуруповпо материалам www.nixp.ru

Page 6: 039 Системный Администратор 02 2006

4

интервью

FSF (Free Software Foundation) – не-коммерческая организация, ос-нованная в конце 1985 года Ри-

чардом Столлманом (Richard Stallman) для поддержки движения за свободное программное обеспечение, в частнос-ти, проекта GNU. Организация из свое-го фонда оплачивала создание свобод-ных программ до середины 90-х годов. Затем во многих компаниях намети-лась тенденция писать свободное ПО, поэтому сейчас сотрудники FSF заняты в основном юридическими вопросами в сообществе свободного ПО.

На вопросы журналиста отвечает старший системный администратор организации FSF – Вард Вандеведж (Ward Vandewege).

Скажите, когда в FSF узнали о тех-нологии LinuxBIOS?Наша организация познакомилась с проектом LinuxBIOS достаточно дав-но, так как этот проект развивается уже больше пяти лет. Мы даже начали кампанию за свободный BIOS год на-зад (см. «Campaign for Free BIOS» [1]).

Общеизвестно, что FSF – это флаг-ман в движении за открытые техно-логии (Open Source). Переведя свое оборудование на LinuxBIOS, насколь-ко ближе ваша организация окажет-ся к 100% свободному миру?Вы знаете, многие путают термин «сво-бодное ПО» (Free Software) с термином «открытые исходные тексты» (Open Source). Цель нашей организации – свобода для компьютерных пользова-телей, и она немного отличается от на-правления команды, идущей с лозун-гом Open Source.

Переход на платформу LinuxBIOS – это большой шаг в правильном направ-

лении (здесь и далее термины «тех-нология LinuxBIOS» и «платформа LinuxBIOS» равнозначны. – Прим. ав-тора). Но всё же остается очень мно-го работы. В современных ПЭВМ ис-пользуется определенное количество firmware [2] (Firmware – программное обеспечение, которое внедрено в ап-паратное устройство. Например, про-грамма, содержащаяся во FlashROM- или в ROM-чипе).

Есть системный проприетарный BIOS (Basic Input/Output System – ба-зовая система ввода-вывода) [3], кото-рый может быть заменен на LinuxBIOS. Есть также VGA BIOS, который исполь-зуется в видеокартах. На некоторых машинах, например, Tyan S2881, при-сутствуют интегрированные контрол-леры сетевых карт. Код в указанных контроллерах, а также в контролле-рах IDE/SATA/SCSI (считайте для крат-кости, что речь идет о жестких дисках), проприетарный, т.е. закрытый.

Что следует понимать под проприе-тарным кодом? Это такое программное обеспечение, для которого существу-ют различные ограничения, налагае-мые разработчиками. Это могут быть ограничения как технического харак-тера, например, запрет на тиражиро-вание и распространение кода (в ком-мерческих или иных целях. – Прим. ав-тора), или же код поставляется только в бинарном виде.

Ограничения юридического харак-тера подразумевают под собой: ли-цензирование, подписание договоров о неразглашении информации (Non Disclosure Agreement) и другие спосо-бы охраны авторского права в сфере программного обеспечения.

Поэтому вы понимаете, что пропри-етарный код не обладает в силу ука-

занных причин открытостью в том по-нятии, что мы пропагандируем.

Очевидно, что замена системно-го проприетарного BIOS на открытый LinuxBIOS сделает ПЭВМ более сво-бодной, но свободной на 100% совре-менная ПЭВМ не будет. Надо понимать, что в настоящий момент эта цель недо-стижима. Хотя, повторюсь, цель можно достичь, но придется очень много по-работать в данном направлении.

Другой аспект, который проявля-ется при переходе, заключается в сле-дующем: LinuxBIOS, будучи аналогом системного проприетарного BIOS, за-меняет большую часть функций пос-леднего. Но LinuxBIOS не заменяет функции VGA BIOS. Для серверных решений отсутствие видеофункций не очень актуально, а вот для настоль-ных решений – это ключевой фактор. Поэтому необходимо взять с сайта производителя архив системного BIOS и распаковать его. Найти в нем (обычно это AwardBIOS или AMIBIOS. – Прим. автора) файл VGA BIOS для встроен-ной видеокарты и поместить его в ди-ректорию в LinuxBIOS. Затем пересоб-рать образ LinuxBIOS с учетом исполь-зования функций видеокарты. После этого получившийся образ LinuxBIOS записать во FLASH-память системной платы, перезагрузиться и удостове-риться, что всё работает.

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

Free Software Foundation переходит на технологию LinuxBIOS

Альтернативой коммерческому BIOS является LinuxBIOS. В отличие от первого, он не является проприетарным продуктом. Аудит его кода может провести каждый, кто разбирается в x86-архитектуре. Поэтому неудивительно, что организация, пропагандирующая свободное программное обеспечение, остановила свой выбор именно на этой технологии.

Антон Борисов

Page 7: 039 Системный Администратор 02 2006

5№2, февраль 2006

интервью

к Интернету. Что еще может переда-вать данный модуль, является загад-кой. – Прим. автора.)

Вы также вряд ли сможете провес-ти аудит кода, который используется в проприетарном коде BIOS. По мере того как коммерческие BIOS стано-вятся все более сложными, проблема аудита их кода становится все более сложным вопросом. Что, если в коде BIOS содержится функция отсылки по электронной почте конкурентной сто-роне ваших секретных данных?

И, наконец, вопрос надежности. Здесь мы опять возвращаемся к про-блеме аудита исходного кода ком-мерческого BIOS. Предположим, что у нас работает приложение так назы-ваемого класса высокой доступности (high-availability) – например,сервер сис-темы управления полетом или управ-ления атомной станцией. Разве вам не захочется быть абсолютно уверенным в надежности программного кода, кото-рый выполняет ваш компьютер? В этом аспекте также можно рассматривать LinuxBIOS в качестве надежной альтер-нативы существующим решениям.

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

Тот факт, что коммерческие про-изводители начинают внедрять в код BIOS неприятные DRM-функции (Digital Rights Management), послужит еще од-ним толчком к переходу на LinuxBIOS. Мы считаем недопустимым, когда над аппаратным обеспечением, кроме са-мого владельца, устананавливается контроль и сторонней компанией. Одна-ко сейчас появляется возможность пол-ностью контролировать аппаратуру, пе-рейдя на платформу LinuxBIOS.

Ссылки:1. ht tp : / /www.fsf.org /campaigns / f ree -

bios.html.2. http://en.wikipedia.org/wiki/Firmware.3. http://ru.wikipedia.org/wiki/BIOS.4. http://www.linuxbios.org.5. http://kboot.sourceforge.net.6. http://te.to/~ts1/filo.7. http://linuxbios.org/index.php/ADLO.8. http://en.wikipedia.org/wiki/Proprietary_

software.

вы должны отдавать себе отчет в том, что после перехода на эту платфор-му у вас может появиться значитель-но больше вопросов, нежели до него. – Прим. автора.)

Какие машины вы планируете пе-ревести на платформу LinuxBIOS? Будет затронуто всё оборудование или только веб-сервера и сервера баз данных?Идеально было бы перевести все то оборудование, которое у нас есть. Очевидно, что это займет определен-ное время, т.к. FSF некоммерческая организация с ограниченным бюдже-том, и многие из наших машин не могут быть переведены на эту технологию, т.к. просто-напросто это оборудование не числится в списке поддержки про-екта LinuxBIOS. Когда мы приобретаем новое оборудование, мы стремимся вы-брать «совместимое с LinuxBIOS».

На повестке дня у нас стоит заме-на серверов. Мы планируем развер-нуть 2 или 3 новых сервера в ближай-шие несколько месяцев. Все они идут на замену устаревшего парка, и их мы собираемся перевести на LinuxBIOS-платформу.

Могли бы вы перечислить их аппа-ратную начинку?Мы приобрели сервера Tyan Transport GX28 со следующей начинкой: Материнская плата: Tyan S2881. CPU: 2x AMD Dual-core Opteron 270. HDD: 4x WD Digital Raptor 74GB 10k

RPM. RAM: 4GB Corsair ECC RAM.

И Tyan, и AMD вносят сущест-венный вклад в развитие проекта LinuxBIOS, поэтому мы рады покупать их оборудование. И эти серверы дейс-твительно очень быстрые!

С вашей точки зрения, годится ли сейчас LinuxBIOS для использова-ния в настольных решениях?Сейчас на рынке присутствует доста-точно много наименований оборудо-вания, для которого возможен пере-ход на LinuxBIOS. Например, материн-ские платы на базе чипов AMD, неко-торые из серий VIA EPIA. Предлагаю ознакомиться с сайтом LinuxBIOS [4], чтобы узнать, поддерживается ли ва-ша материнская плата или нет.

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

Для использования операционных систем, отличных от Linux, какой вид загрузчиков (FILO/kboot/ADLO) больше всего подходит?У нас не слишком богатый опыт в дан-ном вопросе, т.к. мы проверяли за-грузку Debian и Ubuntu. В качестве за-грузчика выступал Etherboot, т.к. FILO не позволяет пока загрузиться с SATA-дисков. Что касается остальных за-грузчиков, то мы их не пробовали ис-пользовать.

Как вы считаете, каким органи-зациям сейчас стоит переходить на LinuxBIOS?Это интересный вопрос. На сегодня ос-новными пользователями LinuxBIOS являются те, кто работает с класте-рами. Использование LinuxBIOS поз-воляет достичь отличных результатов в плане контроля за аппаратной час-тью кластеров.

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

(Речь идет не об операционных системах и драйверах, задача кото-рых и состоит в «общении» с аппара-турой. Здесь имеются в виду недоку-ментированные функции и несанк-ционированный доступ к аппаратной части. Например, известная эпопея с системами безопасности ноутбуков PhoenixNet и CompuTrace – когда в ко-де BIOS присутствует дополнительный модуль, который может установить-ся в ОС на базе Windows NT. Его за-дача – блокирование ноутбука в слу-чае похищения по запросу владель-ца к производителю. Предполагает-ся, что похищенный ноутбук будет за-блокирован при первом подключении

Page 8: 039 Системный Администратор 02 2006

6

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

Пишем сценарии с использованием WMIЕще раз взгляните на изображение архитектуры WMI, которое я помес-тил в начало первой части статьи [1], рис. 1. Обратите внимание, что доступ к WMI может осуществляться через интерфейсы COM+ и .NET Framework. Это означает, что любой язык програм-мирования, который поддерживает взаимодействие с Microsoft Windows COM+ и .NET Framework, может ис-пользоваться для работы с WMI. К пе-речню таких языков, в частности, от-носятся: VBScript, Visual Basic и Visual Basic .NET, Java Script, Python, Perl, PHP, C#, C++, Pascal, TCL и другие.

Обращение к объектам и методам WMI в разных языках может немного отличаться из-за специфики синтак-сиса работы с объектами и типами для каждого конкретного языка, но в целом все приемы очень сходны.

Для иллюстрации приведу несколь-ко примеров (см. листинги 1-6). Озна-комившись с ними, очевидно, что не-важно, какой язык вы выберите, ра-бота с WMI из любого языка програм-мирования не вызывает затруднений. Поэтому используйте тот язык написа-ния сценариев, который вам лучше из-

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

Вы всё ещё не используете WMI?Часть II: пишем сценарии

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

Листинг 1. VBScript

strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")Set colItems = objWMIService.ExecQuery( _ "SELECT * FROM Win32_NetworkAdapterConfiguration",,48)For Each objItem in colItems Wscript.Echo "-----------------------------------" Wscript.Echo "Win32_NetworkAdapterConfiguration instance" Wscript.Echo "-----------------------------------" If isNull(objItem.IPAddress) Then Wscript.Echo "IPAddress: " Else Wscript.Echo "IPAddress: " & Join(objItem.IPAddress, ",") End IfNext

Листинг 2. VB.NET

Imports SystemImports System.ManagementImports System.Windows.Forms

Namespace WMISample

Public Class MyWMIQuery

Public Overloads Shared Function Main() As Integer

Try Dim searcher As New ManagementObjectSearcher( _ "root\CIMV2", _ "SELECT * FROM Win32_NetworkAdapterConfiguration")

For Each queryObj As ManagementObject in searcher.Get()

Console.WriteLine("-----------------------------------") Console.WriteLine("Win32_NetworkAdapterConfiguration instance") Console.WriteLine("-----------------------------------")

If queryObj("IPAddress") Is Nothing Then Console.WriteLine("IPAddress: {0}", queryObj("IPAddress")) Else Dim arrIPAddress As String() arrIPAddress = queryObj("IPAddress") For Each arrValue As String In arrIPAddress

Page 9: 039 Системный Администратор 02 2006

7№2, февраль 2006

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

вестен и которым вам больше нравит-ся пользоваться.

Строим moniker stringТеперь более четко определимся, что такое moniker string? Дословный перевод этого словосочетания мог бы звучать примерно так: строка-прозви-ще или строка-кличка. По смыслу же это некое специальное имя (ссылка) для обращения к объектам или клас-сам объектов WMI. Формат этой строки фактически представляет собой раз-новидность URL (Universal Resource Locator). Все moniker string начинают-ся с отличительного идентификато-ра Winmgmts:. Эта часть moniker string является обязательной. Далее фор-мат зависит от того, как мы хотим об-ращаться к объекту.

Например, вот так:

В приведенном примере server01 – это, как вы уже догадались, сетевое имя компьютера, на котором мы хотим полу-чить доступ к объекту WMI. Если указать вместо сетевого имени символ «.» (точ-ка), то подключение будет происходить к локальному компьютеру. Root/CIMv2 – это пространство имен репозитория WMI (по аналогии очень похоже на вир-туальный каталог веб-сервера). Под-робнее пространства имен я опишу чуть ниже. После двоеточия идет наимено-вание класса WMI, к объектам которо-го мы хотим обратиться. В данном при-мере это класс Win32_OperatingSystem. Следует заметить, что в moniker string можно использовать не только прямую наклонную черту, но и обратную, так что строки «winmgmts://server01/root/cimv2» и «winmgmts:\\server01\root\cimv2» оди-наковы.

При подключении к репозито-рию WMI необязательно указы-вать имя локального сервера точ-кой. Строка может выглядеть и так: «WinMgmts:root/CIMv2». Если в строке moniker-string имя сервера не указано, то подключение произойдет и к локаль-ному репозиторию WMI. Точно так же, как и в случае использования строки «WinMgmts://./root/CIMv2».

Пространства имен WMIЧто же такое WMI namespace (про-странство имен WMI)? Пространс-

Console.WriteLine("IPAddress: {0}", arrValue) Next End If Next Catch err As ManagementException MessageBox.Show("An error occurred while querying for WMI data: ↵ " & err.Message) End Try End Function End ClassEnd Namespace

Листинг 3. C#

using System;using System.Management;using System.Windows.Forms;

namespace WMISample{ public class MyWMIQuery { public static void Main() { try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_NetworkAdapterConfiguration");

foreach (ManagementObject queryObj in searcher.Get()) { Console.WriteLine("-----------------------------------"); Console.WriteLine("Win32_NetworkAdapterConfiguration instance"); Console.WriteLine("-----------------------------------");

if(queryObj["IPAddress"] == null) Console.WriteLine("IPAddress: {0}", queryObj["IPAddress"]); else { String[] arrIPAddress = (String[])(queryObj["IPAddress"]); foreach (String arrValue in arrIPAddress) { Console.WriteLine("IPAddress: {0}", arrValue); } } } } catch (ManagementException e) { MessageBox.Show("An error occurred while querying for WMI data: ↵ " + e.Message); } } }}

Листинг 4. Perl

use strict;use Win32::OLE('in');

use constant wbemFlagReturnImmediately => 0x10;use constant wbemFlagForwardOnly => 0x20;

my $computer = ".";

my $objWMIService = Win32::OLE->GetObject("winmgmts:\\\\$computer\\root\\CIMV2") ↵ or die "WMI connection failed.\n"; my $colItems = $objWMIService->ExecQuery("SELECT * FROM ↵ Win32_NetworkAdapterConfiguration", "WQL", ↵ wbemFlagReturnImmediately | wbemFlagForwardOnly);

foreach my $objItem (in $colItems) { print "-----------------------------------"\n"; print "Win32_NetworkAdapterConfiguration instance"; print "-----------------------------------\n"; print "IPAddress: " . join(",", (in $objItem->{IPAddress})) . "\n"; }

Листинг 5. JScript

var wbemFlagReturnImmediately = 0x10;var wbemFlagForwardOnly = 0x20;

var strComputer = ".";

var objWMIService = GetObject("winmgmts:\\\\" + strComputer + "\\root\\CIMV2");

Winmgmts://server01/root/cimv2: ↵ Win32_OperatingSystem

Page 10: 039 Системный Администратор 02 2006

8

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

тво имен WMI – это раздел (директо-рия) репозитория WMI, которая при-звана группировать классы и объек-ты WMI по назначению, а также опре-делять атрибуты безопасности при до-ступе к классам и объектам в каждом таком контейнере. Фактически это, как уже отмечалось выше, полная ана-логия с директориями на веб-сервере (см. рис. 1). Все пространства имен начинаются с корня, который в WMI обозначается ключевым словом root. После имени корня через косую черту указывается пространство имен. Про-странства имен могут быть вложен-ными. Пример того, как выглядит про-странство имен: root/mynamespace/subnamespace. Подавляющее боль-шинство классов и объектов, которые интересуют вас, размещается в про-странстве имен root/CIMv2.

Одно из существующих в Windows пространств имен WMI может быть выбрано по умолчанию. Это означает, что если вы попытаетесь подключить-ся к этому хосту, не указав в moniker-string необходимое пространство имен, то вы автоматически будете подклю-чены к выбранному по умолчанию.

свойство. Нажмите кнопку «Search for Property Values». Вы увидите все варианты значений этого свойства для всех экземпляров объектов клас-са «Win32_TerminalServiceSetting». На-жмите кнопку «Execute Code». Откро-ется окно командной строки, где будет выведен результат работы скрипта. Если опция «Remote Desktop» вклю-чена, то будет отображена 1, в против-ном случае 0. Проверьте в свойствах вашей системы, что результат работы скрипта совпадает с тем, как установ-лена опция «Remote Desktop».

Теперь откройте закладку «Execute a method». Снова выберите класс «Win32_TerminalServiceSetting». В списке мето-дов выберите «SetAllowTS Connections», как это показано на рис. 3.

Затем в списке «Method [ in ] parameters» установите значение «AllowTSConnections» противополож-ное от того, что мы получили на пре-дыдущем шаге. Для этого нужно просто кликнуть мышью на входной параметр метода. Нажмите кноп-ку «Execute Code». Откроется кон-сольное окно, в котором будет вы-дано значение, возвращенное ме-тодом SetAllowTSConnections. Если все прошло удачно – это будет 0. Те-перь проверьте, изменилась ли опция «Remote Desktop» в свойствах вашей системы.

Обратите внимание на то, что вы можете очень быстро получить кон-текстную справку из библиотеки MSDN по выбранному классу WMI, щелкнув мышью по ссылке: «Get Documentation for this class from the online MSDN Library».

Краткий обзор вопросов безопасности WMIЕсли внимательно изучить схему архи-тектуры WMI, которую я приводил в на-чале статьи, то легко заметить, что все взаимодействие с ядром WMI проис-ходит с использованием интерфейсов COM+/DCOM. В свою очередь COM+ и DCOM в качестве транспортного про-токола используют RPC. Эта архитек-турная особенность накладывает оп-ределенный отпечаток на идеологию системы безопасности WMI. В част-ности, для людей, знакомых с техноло-гиями DCOM и COM+, слова «импер-сонация» и «делегирование» не новы. Однако среди читателей большинс-

В стандартной инсталляции Windows по умолчанию выбрано пространство имен root\cimv2.

Знакомство с WMI Code Creator 1.0Теперь давайте познакомимся с од-ной из наиболее удобных и функцио-нальных утилит для системного адми-нистратора – WMI Code Creator 1.0 [2]. На мой взгляд, сочетаемый этой ути-литой функционал и удобство превос-ходят все остальные описанные мной ранее утилиты. В упражнении с этой утилитой мы будем решать задачу управления опцией Remote Desktop в свойствах системы, которая позво-ляет разрешить или запретить уда-ленные подключения к рабочему сто-лу для задач администрирования. Этот пример будет работать только на ОС Windows XP и новее, а также на Windows 2000 Server с установлен-ными службами терминалов.

Для начала скачайте и распа-куйте эту утилиту. Запустите файл WMICodeCreator.exe и выберите в ме-ню «Code Language Visual Basic Script». Затем проверьте в меню «Target Computer», что установлена опция «Local Computer». После этого удос-товерьтесь, что у вас открыта заклад-ка «Query for data from WMI class», и на этой закладке выберите класс «Win32_TerminalServiceSetting». В на-боре свойств (properties) выделите «AllowTSConnections», как это показа-но на рис. 2.

Свойство «Win32_TerminalService Setting.AllowTSConnections» определя-ет состояние опции «Remote Desktop» в свойствах системы. В правом ок-не вы увидите скрипт, который сге-нерировала утилита для того, чтобы вывести на экран выбранное вами

Рисунок 1. Дерево пространствимен WMI

var colItems = objWMIService.ExecQuery("SELECT * FROM ↵ Win32_NetworkAdapterConfiguration", "WQL", ↵ wbemFlagReturnImmediately | wbemFlagForwardOnly);

var enumItems = new Enumerator(colItems); for (; !enumItems.atEnd(); enumItems.moveNext()) { var objItem = enumItems.item();

WScript.Echo("-----------------------------------"); WScript.Echo("Win32_NetworkAdapterConfiguration instance"); WScript.Echo("-----------------------------------");

try { WScript.Echo("IPAddress: " + (objItem.IPAddress.toArray()).join(",")); } catch(e) { WScript.Echo("IPAddress: null"); } }

Листинг 6. WMIC

wmic nicconfig get IPAddress /value

Page 11: 039 Системный Администратор 02 2006

9№2, февраль 2006

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

тво – системные администраторы, а не программисты, поэтому я поста-раюсь уделить некоторое внимание этим вопросам.

Для того чтобы некая учетная за-пись имела возможность подклю-чаться к репозиторию WMI, необхо-димо дать ей соответствующие пра-ва. Права, как вы уже могли дога-даться, нужно дать как на пространс-тво имен – WMI name space (восполь-зовавшись оснасткой wmimgmt.msc), так и на DCOM-приложения диспет-чера WMI – CIM Object Manager (вос-пользовавшись оснасткой управле-ния COM+ comexp.msc или утилитой dcomcnfg.exe). Вот минимальный спи-сок приложений DCOM, права на ко-торые необходимы для удаленной ра-боты с WMI: Windows Management and Instrumentation, Microsoft WMI Provider Subsystem Host. Некоторые сведения по вопросам настройки прав доступа к WMI и сетевой безопасности вы мо-жете почерпнуть из статьи Microsoft Knowledge Base KB875605 или из биб-лиотеки MSDN [3]. Права на другие DCOM-приложения могут понадобить-ся в зависимости от используемого ре-жима имперсонации.

ИмперсонацияЗачем нужна имперсонация? Все до-вольно просто, это метод, при кото-ром для подключения к ресурсу про-цесс (поток) или система должны ис-пользовать не свой контекст безопас-ности, а учетные данные другого субъ-екта безопасности. Представьте, что некая служба, запущенная в контек-сте безопасности LocalSystem, долж-на выполнить действие от лица другой учетной записи (например, от лица те-кущего зарегистрированного на ком-пьютере пользователя). В этом случае ей необходимо создать специальный маркер доступа (Access Token), опи-сывающий контекст безопасности той учетной записи, под которой мы хотим выполнить указанное действие. Без-условно, для того чтобы создать та-кой маркер доступа, этой службе не-обходимо знать учетные данные это-го пользователя или, если этот про-цесс происходит на локальной маши-не, получить копию маркера доступа зарегистрированного локально поль-зователя (безусловно, для этого кон-текст безопасности службы должен

В случае с WMI делегирование может выглядеть так – мы, работая на станции администратора, подклю-чаемся по WMI к некому серверу и за-пускаем на нем процесс с помощью ме-тода Execute класса Win32_Process. Те-перь представим, что этот процесс есть не что иное, как другой скрипт WMI, ко-торый подключается к еще одному хос-ту в сети для того, чтобы сделать ка-кие-то действия. Если мы не восполь-зуемся делегированием, то на конеч-ной машине скрипт будет запущен в контексте безопасности учетной за-писи промежуточного сервера, что да-леко не всегда желаемо. С другой сто-роны, подобная ситуация с делегиро-ванием в реальной жизни требуется крайне редко.

В таблице 1 представлены под-держиваемые уровни имперсонации WMI.

обладать привилегией создания мар-керов доступа).

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

Рисунок 2. Окно утилиты WMI Code Creator 1.0 с открытой закладкой Query

Рисунок 3. Окно утилиты WMI Code Creator 1.0 с открытой закладкой Execute

Page 12: 039 Системный Администратор 02 2006

10

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

АутентификацияАутентификация, целостность и конфиденциальность явля-ются неотъемлемыми характеристиками безопасного вза-имодействия систем по сети. При использовании WMI под-держиваются перечисленные в таблице 2 уровни аутенти-фикации и проверки подлинности. Наиболее часто упот-ребимый уровень – Connect (аутентификация и автори-зация при вызове). Однако если вы хотите предотвратить возможное изменение передаваемых данных или их пере-хват методом men in the middle, то лучшим выбором могут являться режимы Pkt (проверка аутентичности клиента), PktIntegrity (проверка аутентичности клиента и целостнос-ти передаваемых данных) и PktPrivacy (проверка аутентич-ности клиента и шифрование передаваемых данных с про-веркой целостности).

ПривилегииАдминистраторам Windows хорошо известны настройки бе-зопасности системы и их раздел «User Right Assignments»

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

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

Список привилегий и их численных кодов указан в таб-лице 3.

Для каждой привилегии указано три имени: первое имя – это константы для использования в скриптах VBScript, вто-рое имя – это символические константы языка С++, третье имя привилегии – это имя, использующееся при составле-нии moniker string.

Каким образом активировать эти привилегии, показа-но в примерах из раздела «Подключение к удаленным ком-пьютерам». Важно запомнить, что активировать привилегии нужно до подключения к репозиторию WMI, а не после.

Подключение к удаленным компьютерамПодключение к другим компьютерам по сети чаще всего вызывает проблемы у тех, кто только начинает осваивать технологию WMI и программирование с ее использовани-ем. Поэтому я считаю необходимым привести примеры кода на VBScript, которые позволяют решать эту задачу, и кратко пояснить их. Единственное, что необходимо запомнить, так это то, что запрещается подключаться к репозиторию WMI на локальном компьютере, используя другую учетную за-пись (не ту, под которой происходит обращение к CIM Object Manager). Это ограничение обычно решается использова-нием утилиты RunAs и ей подобных методов.

Вариант подключения с использованием маркера до-ступа произвольной учетной записи:

Уровень имперсонации Описание

Anonymous1

Анонимный уровень имперсонации COM, маскирую-щий учетную запись вызывающего. Вызов WMI с этим уровнем имперсонации может завершиться ошибкой

Default0

Уровень имперсонации по умолчанию

Delegate4

Уровень имперсонации COM – делегирование. Разре-шает использовать другим объектам учетные данные вызывающего субъекта для обращения к третьим объ-ектам. Этот уровень может дать неоправданно высо-кие привилегии промежуточному объекту. Поддержи-вается только на Windows 2000 и выше

Identify2

Уровень имперсонации COM – идентификация. Позво-ляет объектам вызова запрашивать учетные данные у вызывающего субъекта. Вызов WMI с этим уровнем имперсонации может завершиться с ошибкой

Impersonate3

Уровень имперсонации COM – обычная имперсонация. Позволяет вызываемому объекту использовать учет-ные данные вызывающего субъекта для совершения только своих действий. Это рекомендуемый уровень имперсонации

Таблица 1. Уровни имперсонации

Таблица 2. Варианты аутентификации и проверки целостности

Уровень аутентификации Описание

CallCall3

Call-level COM authentication.Аутентификация в начале каждого вызова объекта WMI

ConnectConnect2

Connect-level COM authentication.Аутентификация только при установлении соедине-ния с сервером WMI. Одни учетные данные использу-ются для всего сеанса взаимодействия

DefaultDefault0

WMI использует настройки аутентификации COM по умолчанию

NoneNone1

Аутентификация COM не используется

PacketPkt4

Packet-level COM authentication.Аутентификация всех данных, получаемых от кли-ента, с подтверждением подлинности отправителя для каждого RPC-пакета

PacketIntegrityPktIntegrity5

Packet Integrity-level COM authentication.Аутентификация и проверка целостности передавае-мых данных для каждого RPC-пакета

PacketPrivacyPktPrivacy6

Packet Privacy-level COM authentication.Аутентификация, проверка целостности и шифрова-ние данных каждого передаваемого RPC-пакета

strComputer = "server01"

Set objLocator = CreateObject("WbemScripting.SWbemLocator")objLocator.Security_.AuthenticationLevel = 3objLocator.Security_.Privileges.Add(18)

Set objWMIService = objLocator.ConnectServer(_ strComputer, "root\cimv2", ↵ "mydomain\administrator", "password")

objWMIService.Security_.ImpersonationLevel = 3

Set colItems = objWMIService.ExecQuery(_ "SELECT * FROM Win32_OperatingSystem",,48)

For Each objItem in colItems Wscript.Echo "-----------------------------------" Wscript.Echo "Win32_OperatingSystem instance" Wscript.Echo "-----------------------------------"

Page 13: 039 Системный Администратор 02 2006

11№2, февраль 2006

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

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

Другой вариант подключения с использованием теку-щего маркера доступа и moniker string:

В данном примере мы познакомились с еще одной воз-можностью, заложенной в moniker string. Мы можем вклю-чать в строку moniker string в фигурных скобках «{ }» пара-метры имперсонации, аутентификации и набор использу-емых привилегий. Таким образом, полный формат moniker string можно было бы записать так:

Есть и еще не описанные мной поля в формате moniker string, но поскольку они довольно редко нужны на практи-ке, то я рекомендую желающим ознакомиться с ними по оригинальной документации на сайте Microsoft [3] само-стоятельно.

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

Таблица 3. Привилегии

Привилегии Описание

wbemPrivilegeCreateTokenSeCreateTokenPrivilegeCreateToken10x1

Привилегия требуется для создания основного токена безопасности процесса

wbemPrivilegePrimaryTokenSeAssignPrimaryTokenPrivilegeAssignPrimaryToken20x2

Привилегия требуется для замены (назначения нового) основного токена безопасности процесса

wbemPrivilegeLockMemorySeLockMemoryPrivilege30x3

Привилегия требуется для закрепления соответс-твия между страницами физической памяти и логи-ческого адресного пространства

wbemPrivilegeIncreaseQuotaSeIncreaseQuotaPrivilegeIncreaseQuotaPrivilege40x4

Привилегия требуется для назначения квот процессу

wbemPrivilegeMachineAccountSeMachineAccountPrivilegeMachineAccount50x5

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

wbemPrivilegeTcbSeTcbPrivilegeTcb60x6

Привилегия обозначает ее владельца как часть Trusted Computer Base

wbemPrivilegeSecuritySeSecurityPrivilegeSecurity70x7

Привилегия требуется для выполнения ряда функ-ций, связанных с безопасностью, например про-смотр журналов аудита. Привилегия определяет её владельца как Security Operator

wbemPrivilegeTakeOwnershipSeTakeOwnershipPrivilegeTakeOwnership80x8

Привилегия требуется для получения права вла-дельца объекта на объекты безопасности в отсутс-твии явных на то разрешений

wbemPrivilegeLoadDriverSeLoadDriverPrivilegeLoadDriver90x9

Привилегия требуется для загрузки и выгрузки драйверов устройств

wbemPrivilegeSystemProfileSeSystemProfilePrivilegeSystemProfile100xA

Привилегия требуется для сбора профилирующей информации всей системы

wbemPrivilegeSystemtimeSeSystemtimePrivilegeSystemtime110xB

Привилегия требуется для изменения системно-го времени

wbemPrivilegeProfileSingleProcessSeProfileSingleProcessPrivilegeProfileSingleProcess120xC

Привилегия требуется для сбора профилирующей информации для одного процесса

wbemPrivilegeIncreaseBasePrioritySeIncreaseBasePriorityPrivilegeIncreaseBasePriority130xD

Привилегия требуется для увеличения базового проиритета процесса

wbemPrivilegeCreatePagefileSeCreatePagefilePrivilegeCreatePagefile140xE

Привилегия требуется для создания и (или) изме-нения файла подкачки

Wscript.Echo "Caption: " & objItem.Caption Wscript.Echo "Name: " & objItem.Name

Rem Первый вариант вызова метода Reboot() Set objOutParams = objWMIService.ExecMethod(_ "Win32_OperatingSystem.Name='" & CStr(objItem.Name) ↵ & "'", "Reboot")

Rem Второй вариант вызова метода Reboot() objItem.Reboot()Next

strComputer = "server01"

Set objWMIService = GetObject(_"WinMgmts:{impersonationLevel=Impersonate, ↵ authenticationLevel=Call, (Shutdown)}!//" ↵ & strComputer & "/root/cimv2")

Set colItems = objWMIService.ExecQuery(_ "SELECT * FROM Win32_OperatingSystem",,48)

For Each objItem in colItems Wscript.Echo "-----------------------------------" Wscript.Echo "Win32_OperatingSystem instance" Wscript.Echo "-----------------------------------" Wscript.Echo "Caption: " & objItem.Caption Wscript.Echo "Name: " & objItem.Name

Rem Первый вариант вызова метода Reboot() Set objOutParams = objWMIService.ExecMethod(_ "Win32_OperatingSystem.Name='" & CStr(objItem.Name) ↵ & "'", "Reboot")

Rem Второй вариант вызова метода Reboot() objItem.Reboot()Next

Winmgmts:{ <security settings>, (<privileges>) } ↵ !//<server>/<namespace>:<Class | Object>

Page 14: 039 Системный Администратор 02 2006

12

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

фективное решение этого вопроса. И, как вы уже догада-лись, – это события WMI и уведомляющие запросы.

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

Оба приведенных ниже скрипта отслеживают запуск процесса с именем cmd.exe. Однако между ними все же есть различие.

Приведенный ниже скрипт (первый из двух) использу-ет синхронную технику уведомляющего запроса для со-здания экземпляра объекта Win32_ProcessStartTrace, ко-торый отвечает за отслеживание событий запуска процес-сов о системе. Каждый раз, когда в системе порождается процесс с именем cmd.exe, метод NextEvent возвращает уп-равление скрипту.

Второй скрипт, который приведен ниже, использует не-много другую синхронную технику. Этот метод более уни-версальный, так как не завязан на специальный класс WMI Win32_ProcessStartTrace. С помощью уведомляю-щего запроса отслеживается состояние всего пула объ-ектов класса Win32_Process. Каждый раз, когда в систе-ме порождается новый экземпляр объекта, принадлежа-щего классу Win32_Process и полем Description, содержа-щим строку cmd.exe, метод NextEvent возвращает управ-ление скрипту.

strComputer = "."Set objWMIService = GetObject("winmgmts:\\" ↵ & strComputer & "\root\CIMV2")

Set objEvents = objWMIService.ExecNotificationQuery _("SELECT * FROM Win32_ProcessStartTrace ↵ WHERE ProcessName = 'cmd.exe'")

Wscript.Echo "Waiting for events ..."Do While(True) Set objReceivedEvent = objEvents.NextEvent

Wscript.Echo "CMD.EXE started"

Loop

strComputer = "." Set objWMIService = GetObject("winmgmts:\\" ↵ & strComputer & "\root\CIMV2")

Set objEvents = objWMIService.ExecNotificationQuery( ↵ "SELECT * FROM __InstanceCreationEvent WITHIN 1 ↵ WHERE (TargetInstance ISA 'Win32_Process') ↵ AND (TargetInstance.Description = 'cmd.exe')")

Wscript.Echo "Waiting for events ..."Do While(True) Set objReceivedEvent = objEvents.NextEvent

Wscript.Echo "CMD.EXE started"

Loop

Привилегии Описание

wbemPrivilegeCreatePermanentSeCreatePermanentPrivilegeCreatePermanent150xF

Привилегия требуется для создания постоянного общего объекта

wbemPrivilegeBackupSeBackupPrivilegeBackup160x10

Привилегия требуется для выполнения резервно-го копирования

wbemPrivilegeRestoreSeRestorePrivilegeRestore170x11

Привилегия требуется для выполнения операции восстановления. Эта привилегия позволяет ее вла-дельцу устанавливать для любого объекта произ-вольный существующий SID в качестве владель-ца объекта

wbemPrivilegeShutdownSeShutdownPrivilegeShutdown180x12

Привилегия требуется для перезагрузки и завер-шения работы ОС

wbemPrivilegeDebugSeDebugPrivilegeDebug190x13

Привилегия требуется для отладки процессов

wbemPrivilegeAuditSeAuditPrivilegeAudit200x14

Привилегия требуется для записи в журналы аудита

wbemPrivilegeSystemEnvironmentSeSystemEnvironmentPrivilegeSystemEnvironment210x15

Привилегия требуется для модификации энергоне-зависимой памяти в тех системах, которые исполь-зуют ее для хранения своей конфигурации

wbemPrivilegeChangeNotifySeChangeNotifyPrivilegeChangeNotify220x16

Привилегия требуется для получения нотифика-ций об изменении файлов и директорий. Так же эта привилегия отменяет перекрестную провер-ку доступа к файлам и папкам. Эта привилегия по умолчанию дана всем пользователям

wbemPrivilegeRemoteShutdownSeRemoteShutdownPrivilegeRemoteShutdown230x17

Привилегия требуется для завершения работы ОС по сети

wbemPrivilegeUndockSeUndockPrivilegeUndock240x18

Привилегия требуется для снятия компьютера с док-станции

wbemPrivilegeSyncAgentSeSyncAgentPrivilegeSyncAgent250x19

Привилегия требуется для вызова процедуры синх-ронизации службы каталога

wbemPrivilegeEnableDelegationSeEnableDelegationPrivilegeEnableDelegation260x1A

Привилегия требуется для доверия пользователям или группам при делегировании

wbemPrivilegeManageVolumeSeManageVolumePrivilegeManageVolume270x1B

Привилегия требуется для операций обслуживания дисковых томов

Таблица 3. Привилегии (продолжение)

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

Page 15: 039 Системный Администратор 02 2006

13№2, февраль 2006

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

Следует отметить, что скрипты WSH и ядро WMI поми-мо синхронного ожидания событий позволяют асинхронно обрабатывать события и исключения. Вы можете не отда-вать управления из скрипта менеджеру событий WMI и про-должать выполнение необходимых действий. В то же вре-мя, когда возникнет отслеживаемое вами событие, управ-ление будет передано на специальную подпрограмму скрип-та, и будут выполнены необходимые действия. Это работа-ет так же, как прерывания или события форм в Visual Basic или Visual Basic for Application.

Использование техники регистрации асинхронных со-бытий и их обработки требует детального изложения мате-риала и не умещается в рамки этой статьи. Возможно, этот материал появится в виде отдельной статьи. Намекну лишь, что WMI Code Creator 1.0 позволяет легко создавать скрип-ты для асинхронной обработки событий WMI.

Есть еще один, принципиально иной способ обработки событий с использованием WMI. С помощью создания эк-земпляров объектов специальных классов (классов с об-щим названием Standard Event Consumers) отслеживать со-бытия и выполнять несколько типовых действий (отправка уведомления по SMTP, запись в журнал событий, запись в текстовый файл, запуск приложения, запуск скрипта) во-обще без написания скриптов WSH. Однако об этом мето-де мы поговорим в другой раз.

Продукты, использующие WMIПосле знакомства с технологией WMI у читателей может возникнуть желание начать разрабатывать собственные скрипты и системы управления и мониторинга. Безусловно, это похвальное желание, но, возможно, не стоит поступать столь опрометчиво. Возможно, стоит оглянуться по сторо-нам и обнаружить, что уже многое сделано в этом направ-лении другими людьми и их решения успешно развива-ются. Для начала советую заглянуть в подборку скриптов в TechNet Script Center [4, 5]. Если все же вы не горите жела-нием объединять разрозненные скрипты в единую систему управления и мониторинга и фактически изобретать велоси-пед, советую вам обратить внимание на продукты Microsoft SMS 2003 (http://www.microsoft.com/smserver) и Microsoft Operations Manager 2005 (http://www.microsoft.com/mom).

SMS 2003 SP1Система управления изменениями и конфигурациями, пос-троенная на базе Microsoft Systems Management Server 2003, представляет собой клиент-серверное распределенное при-ложение. Клиентская часть устанавливается на управля-емые рабочие станции и серверы и периодически запра-шивает с сервера, входящего в состав системы SMS 2003, задания, которые затем выполняются на клиентской части ПО SMS 2003. Эти задания касаются как самих настроек клиентской части, так и собственно задач, которые реша-ет система SMS 2003. Основными задачами в сетях на ба-зе продуктов Microsoft, решаемыми системой управления на базе SMS 2003, являются: автоматизация процесса установки клиентской части

системы SMS 2003 на рабочие станции; инвентаризация аппаратного обеспечения рабочих стан-

ций;

инвентаризация программного обеспечения рабочих станций;

инвентаризация установленных и пропущенных обнов-лений системного ПО;

группировка рабочих станций на основании данных ин-вентаризации в коллекции;

установка программного обеспечения на группы ком-пьютеров (коллекции);

установка операционных систем из образов на новые компьютеры и переустановка с сохранением профилей пользователей на эксплуатируемых компьютерах;

установка необходимых обновлений безопасности; выполнение на клиентских рабочих станциях задач об-

служивания, оформленных в виде скриптов и/или ис-полняемых файлов;

управление мобильными устройствами PocketPC; определение частоты запуска указанных приложений; отслеживание соответствия набора и версий програм-

много обеспечения на рабочих станциях заданным па-раметрам;

формирование отчетов о рабочих станциях и серве-рах;

формирование отчетов о состоянии и работе самой сис-темы;

оптимизация нагрузки на сеть при передаче дистрибу-тивов и установке ПО на рабочие станции и серверы;

удаленная поддержка пользователей с использовани-ем Remote Tools, в состав которых входят: удаленное уп-равление рабочим столом АРМ, передача файлов, уда-ленная перезагрузка, интерактивное общение админис-тратора с пользователем и удаленная командная кон-соль;

обеспечение контроля доступа ко всем функциям и объ-ектам системы управления на базе SMS 2003 для авто-ризованных пользователей.

Все эти функции SMS 2003 реализованы с использова-нием технологии WMI. В частности, весь процесс инвента-ризации, который производит агент SMS, представляет со-бой набор WMI-запросов.

Все свои настройки и задания (Advertisements), а так-же некоторые промежуточные результаты инвентаризации агент SMS также хранит в репозитории WMI в отдельном пространстве имен: root\CCM.

MOM 2005 SP1Система мониторинга на базе Microsoft Operations Manager 2005 позволяет решать следующие задачи: обеспечение непрерывного наблюдения в реальном вре-

мени за состоянием ИС компании и автоматическая ре-гистрация инцидентов;

снижение времени, требуемого для оповещения дежур-ной смены группы мониторинга об изменениях и сбоях, происходящих в ИС компании;

снижение количества незарегистрированных инциден-тов;

обеспечение мониторинга всех компонентов ИС компа-нии и распределенное по всем сегментам сети наблю-дение за их состоянием;

Page 16: 039 Системный Администратор 02 2006

14

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

предоставление кратких рекомендаций администрато-рам системы по большинству событий, регистрируемых системой мониторинга;

обеспечение отказоустойчивости системы мониторин-га;

обеспечение возможности разделения административ-ных полномочий на участки системы мониторинга;

возможность ведения корпоративной базы знаний по инцидентам;

выявление взаимосвязей между возникающими инци-дентами и источниками проблем.

Система мониторинга представляет собой клиент-сер-верное распределенное приложение. На целевые серверы (те серверы прикладных систем, на которых осуществляет-ся мониторинг) устанавливается специальное программное обеспечение – агент системы мониторинга MOM 2005. Аген-ты системы мониторинга получают свои настройки и прави-ла (политики) мониторинга с управляющих серверов.

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

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

Что же дальше?«Ну, хорошо, – скажете вы. – Я прочитал эту статью, но что мне это даст. Автор рассуждает о WMI, но у меня конкрет-ные проблемы, решение которых я ищу, и чем конкретно мне в моих проблемах поможет WMI?» Да, пожалуй, этот вопрос заботит любого системного администратора, когда ему приходится столкнуться с новой технологией и встать перед выбором использовать ее или нет.

Я надеюсь, что этот вопрос возникнет лишь у небольшо-го числа читателей, поскольку я постарался отразить в этой статье значимость и пользу технологии WMI, а так же ра-зобрать самые скользкие и сложные вопросы, возникаю-щие при ее использовании. Но все же я отвечу и тем, у ко-го этот вопрос все-таки возник. Уважаемые коллеги, WMI – это открытая технология, основанная на открытых стандар-тах, которая использует все больше и больше программных продуктов различных производителей. Она позволяет сэко-номить вам свое рабочее время и решать поистине слож-ные задачи простым способом. Стандарт WBEM, на кото-ром основан WMI, реализован на UNIX и Linux системах [6] и позволяет вам развивать гибкую и кроссплатформенную систему управления и мониторинга сетью.

Вы можете пойти двумя путями – либо приобрести го-товый продукт управления и мониторинга (практически все из них совместимы с WBEM и WMI), а можете создать свое средство, но в обоих случаях знания по WMI вам обя-зательно пригодятся.

Ко всему выше сказанному следует добавить еще то, что Windows XP и Windows Server 2003 поддерживают в груп-повых политиках домена Active Directory технологию WMI Query Filtering. Что это такое? Это средство, которое позво-ляет определять, какие групповые политики следует при-менять к каким рабочим станциям и пользователям на ос-нове результатов запросов WQL к WMI на том компьютере, на котором должно выполняться применение этой полити-ки. В частности, в сочетании с Software Distribution Policy вы можете сделать так, чтобы офисный пакет Office 2003 мог устанавливаться только на те машины, которые име-ют определенный объем ОЗУ и свободного пространства на жестком диске. Или, скажем, устанавливать очередной Service Pack через групповую политику только на те маши-ны, у которых на жестком диске имеется не менее 2 Гб сво-бодного пространства. И все это делается одной простой строкой WQL-запроса:

Теперь заглянем немного в ближайшее будущее. В об-ласти управления системами Windows Server Systems ком-пания Microsoft активно развивает свою новую инициативу – новый командный интерпретатор под кодовым названием MONAD [7]. Это очень гибкий и удобный интерпретатор ко-манд, который будет встроен в следующую версию Microsoft Exchange E12 и Longhorn Server, а также он может быть ус-тановлен на любую ОС, поддерживающую .NET Framework 2.0 (Windows 98, Windows 2000, Windows XP, Windows Server 2003). В основе большинства элементов синтаксиса и не-которых принципов работы с MONAD лежат удачные нара-ботки, полученные при разработке WMI и WMIC. Консоль управления MMC 3.0 также будет полностью поддержи-вать архитектуру MONAD, и множество функций управле-ния, доступные из консоли, будут не чем иным, как скрип-тами MONAD.

Со временем предполагается, что интерфейсы управ-ления MONAD будут встроены во все продукты компании Microsoft, и, как вы понимаете, навыки, полученные при ра-боте с WMI и WMIC, будут очень полезны всем системным администраторам, работающим с Windows.

Ссылки и литература:1. Леонтьев К. Вы всё ещё не используете WMI? Часть1. – Журнал

«Системный администратор», №1, январь 2005 г. – 4-11 с.2. WMI Code Creator 1.0 – http://download.microsoft.com/download/0/

c/a/0ca7691c-6335-4143-8f9f-6708969f8212/WMICodeCreator.zip.

3. Windows Management Instrumentation – http://msdn.microsoft.com/library/en-us/dnanchor/html/anch_wmi.asp.

4. TechNet Script Center – http://www.microsoft.com/technet/scriptcenter/default.mspx.

5. Portable Script Center – http://www.microsoft.com/downloads/details.aspx?FamilyID=b4cb2678-dafb-4e30-b2da-b8814fe2da5a&DisplayLang=en.

6. Проект OpenWBEM – http://www.openwbem.org.7. Microsoft Shell (MSH) – MONAD beta 3 – http://www.microsoft.com/

downloads/details.aspx?FamilyID=e8e5203a-574c-4105-af6b-b2fef39adf55&DisplayLang=en.

Select * from Win32_LogicalDisk where FreeSpace > 2147483648

Page 17: 039 Системный Администратор 02 2006
Page 18: 039 Системный Администратор 02 2006

16

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

В первой части обсуждения дан-ной темы [1] на основании ана-лиза эксплуатационного цикла

сервера были выдвинуты два принци-па (использовать всегда RAID1 вмес-то обычных разделов диска и перевес-ти максимум объема под управление LVM), исходя из которых, предлагалось производить планирование дисковых ресурсов. Но существует еще одна, и не последняя, цикличность в работе серверов, как и любых компьютеров, которую надо принять во внимание – процесс загрузки. Это неизбежная фа-за начинается сразу после включения питания и завершается после выхода системы в рабочий режим. Ключевую роль в ней играет загрузчик. Необхо-димость существования независимого

от операционной системы загрузчика обусловлена именно тем, что надо со-гласовать уровни представления сис-тем хранения данных с точки зрения BIOS и того, как их «представляет» яд-ро ОС. Из двух крайностей, поместить BIOS в ядро или само ядро в BIOS, был выбран технологический компромисс – загрузчик. Обсудим подробнее.

Процесс загрузкиЗагрузка – это последовательность пе-редачи управления от BIOS оборудо-ванию, которая включается в процес-се аппаратной инициализации, к ядру операционной системы. Процесс об-служивает упомянутый «загрузчик» (на диаграмме – LOADER). Существуют два типа загрузки – сетевая и локаль-

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

В начальный момент времени BIOS, собравший всю доступную информа-цию о физически подключенных ус-тройствах, производит в определен-ном порядке перебор систем хране-ния и поиск на них загрузчика. Управ-ление будет передано первому подхо-дящему. BIOS доступна лишь физичес-кая структура устройств. Все, на что он «способен», – это загрузить первый сектор, проверить наличие специаль-ной сигнатуры и передать управление полученному коду. Главные ограниче-ния: код размещается в объеме секто-

Алексей Барабанов

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

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

Page 19: 039 Системный Администратор 02 2006

17№2, февраль 2006

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

ра (512 байт), выбирается всегда лишь первый сектор. Поскольку BIOS никак не учитывает существование разметки дисков, то загрузчик смело может за-нимать 510 байт (512 – сигнатура).

Теперь обсудим конечную точку ра-боты загрузчика (но не конечную точ-ку загрузки!). Загрузчик «должен» точ-но так же, как чуть раньше это сделал BIOS, найти следующий программный код, то есть ядро ОС, загрузить его, проверить корректность и передать уп-равление. Естественно, расположение ядра операционной системы и всех не-обходимых для загрузки файлов зави-сит от типа и свойств самой ОС. Хотя в заголовок статьи вынесено утверж-дение, что рассматривается имен-но Linux, но это не значит, что вместе с ним на дисковых ресурсах не будут располагаться и другие ОС.

Итак, получили «разрыв» пред-ставлений. Воспользуемся все той же диаграммой переходов в процессе на-стройки для иллюстрации (рис. 1).

Синим цветом на рисунке обозна-чено то, что «может видеть» BIOS, а зе-леным то, что «должен видеть» загруз-чик. Между узлами 2 MD и 5 EXT3... изображена двунаправленная стрел-ка. Как было показано в первой части статьи [1], логическая структура фай-ловой системы, положенной поверх RAID1, не меняется. Благодаря это-му можно считать, что если загрузчик обязан «понимать» файловую систему, то он будет «понимать» её, размещен-ную поверх MD. Но это и максимум его «понятливости». Иначе говоря, на на-стоящий момент не представляется возможным разместить всю систе-му целиком на логических томах LVM. Приходится часть, необходимую для загрузки, все-таки выносить за преде-лы этой столь удобной системы управ-ления томами данных.

Это утверждение иллюстрируется все тем же RHEL, в котором файлы, участвующие в загрузке, размещае-мые традиционно в /boot, записывают-ся во внешний по отношению ко всей системе том, который не подключает-ся в управление LVM.

Вывод. Хотя очень правильно все, что можно, внести внутрь LVM, но при-ходится мириться с существованием разделов, проинициализированных в последовательности 1 DISK, 2 MD, 3 EXT3... И следующий вопрос: доста-

сии 0.96. Этот релиз содержит ошибку. В обновлениях предлагается версия 0.97. В дальнейшем будет применяться именно эта, обновленная версия.

Рассмотрим, как работает Grub. Для этого обратимся к рис. 2, где на-глядно представлен процесс установ-ки и загрузки Grub. Обсуждение будем вести в терминологии Grub.

Итак, в самом начале BIOS считы-вает код загрузчика из первого секто-ра диска (1 на рисунке). 512 байт явно недостаточно, чтобы разместить там драйвер файловой системы. Эта часть загрузчика называется stage1. Её на-значение – загрузить stage1_5 – спе-циальную фазу, содержащую драй-вер файловой системы. Проблема в том, чтобы добиться однозначнос-ти размещения этой фазы по отноше-нию к stage1. Это достигается путем записи данной компоненты на «нуле-вую» дорожку загрузочного устройс-тва, т.е. вслед за первым сектором, со-держащим stage1. В режиме LBA (дис-ки актуальных для серверов ёмкостей

точно ли одного только /boot, как счи-тают в компании RedHat, или все-таки надо нечто посущественней? Для этого разберем, как работает загрузчик.

Работа загрузчикаLinux в силу своей открытости стал весьма консервативной системой, так как каждая его компонента под-вергается очень подробному анали-зу на адекватность назначению. Хо-тя вместе с дистрибутивом SuSE пос-тавляются четыре загрузчика (Lilo, Grub, Syslinux, Loadlin), но в качестве стандартных, как правило, использо-вались только два – Syslinux и Grub. Долгое время они развивались, кон-курируя друг с другом, и лишь недав-но определилось, что будущее именно за Grub. Объясню, почему так.

Опять возвращаемся к рис. 1. Пос-мотрите, загрузчик не обращается к физическим дисковым устройствам, он «смотрит» только на файловые сис-темы. Именно это свойство, а не что-то иное определило преимущества про-екта Grub. Дело в том, что загрузчик должен предоставить оператору вы-бор путей загрузки. И Grub считыва-ет файл меню, свои кодовые файлы и файлы загружаемых систем, поль-зуясь только собственным драйвером файловой системы и никак не привя-зываясь к физическим константам уст-ройств. Lilo, являсь исторически более ранним творением, не придерживался такой концепции, почему и вынужден был уступить.

Внимание: изначально в дистрибу-тиве SuSE 10.0 поставляется Grub вер-

Рисунок 1. Видимость уровней представления на разных стадиях загрузки

Рисунок 2. Работа загрузчика Grub

Page 20: 039 Системный Администратор 02 2006

18

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

в другом режиме просто не работают), на дисковом устройстве размещается 63 сектора в дорожке. То есть уровень «интеллекта» stage1_5 может быть по-вышен до 30 Кб. Для работы с файло-вой системой ext3 хватает чуть более 8Кбайт. Иначе говоря, резервы эволю-ции у проекта Grub еще есть.

После подключения stage1_5 (2 на рисунке) загрузчик уже «умеет» читать выбранную файловую систе-му и, значит, «может» найти все не-достающее для его работы. А имен-но: основную свою компоненту stage2 (3 на рисунке) и файл, содержащий ме-ню, menu.lst (4 на рисунке). Все! Теперь в памяти компьютера работает полно-стью собранный загрузчик, который «пользуется» возможностями файло-вых систем для поиска всех указанных в меню файлов. Таким путем обеспе-чивается независимость первых фаз загрузки от конкретного размещения файлов внутри файловой системы. То есть, если модифицировать stage2, или изменить menu.lst, или какие-то из загружаемых файлов, описанных в меню, то при следующей загрузке stage1+stage1_5, как ни в чем не бы-вало, загрузят новые файлы.

На рис. 2 показано, как реальное разбиение жесткого диска «понимает-ся» загрузчиком. В процессе установки надо указать корень, где размещены все файлы загрузчика. В нашем слу-чае это делается командой root (hd0,1). Установщик определяет тип файло-вой системы и согласно этому подби-рает следующую фазу – e2fs_stage1_5. И далее остается лишь указать, куда записывать stage1+stage1_5. Это про-изводится командой setup (hd0). После чего нужные компоненты записывают-ся на нулевую дорожку указанного ус-тройства, и в них жестко прошивает-ся размещение и названия остальных файлов stage2 и menu.lst, иначе говоря, первая команда root (hd0,1), указыва-ющая на корень загрузчика. Заметим, что корень, в котором размещается за-грузчик, может, и даже очень часто, не совпадать с корнем самой загружае-мой системы.

Определим здесь минимум-мини-морум того, что должно быть разме-щено на разделе загрузки, (hd0,1) в на-шем случае. Если мы обсуждаем за-грузку Linux-системы, то на этом раз-деле, кроме уже перечисленных фай-

нести на отдельный раздел. Аналогич-ное соображение верно и в отношении основной системы.

Наблюдательный читатель спро-сит: ну хоть /var можно вынести в при-монтированный том и тем самым со-кратить размер корневого раздела? Конечно, можно! Только надо учесть, что в случае проблем с монтированием в /var на «чистом» корне не будет ника-ких структур, обеспечивающих работу сервисов – даже /var/run. Поэтому пра-вильной последовательностью будет установка всей системы в единый раз-дел и потом уже перенос того, что нуж-но, на другие тома LVM с последующим их монтированием. Такая последова-тельность установки позволит прак-тически с минимальной потерей фун-кциональности отключать все «на ле-ту» и соответственно менять. Значит, сэкономить не получится!

Таким образом, у нас появилась еще пара принципов планирования дисковых ресурсов серверов.

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

Принцип 4. Все данные, нужные для работы системы в минимальной функциональности, по возможнос-ти, надо устанавливать в один корне-вой раздел. Это увеличит надежность системы и позволит независимым об-разом манипулировать другими при-монтированными разделами.

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

лов загрузчика, нужно разместить яд-ро и initrd, данные для инициализации виртуального диска, подключаемо-го в процессе загрузки ядра системы. Примерно так и рассуждают в компа-нии RedHat, когда выделяют /boot в ка-честве раздела загрузки. Теперь обсу-дим реальное положение дел.

Эксплуатационные фазыДавайте мысленно вернемся к исход-ным целям вырабатываемых механиз-мов и способов разметки. Итак, глав-ное – добиться условий для манипу-ляций с логическими томами и разме-щенными на них файловыми систе-мами таких, чтобы максимально на-сколько возможно оставлять сам сер-вер в работоспособном состоянии, что-бы для обслуживания не требовалось физического вмешательства (посколь-ку это несовместимо с автоматиза-цией и вообще с логикой работы вы-числительных систем). Если, как это предложено все в том же RHEL, кор-невая файловая система размещена на логическом томе LVM, то для пре-образований надо будет сначала от-монтировать корень. Конечно, мож-но просто заявить, что это не понадо-бится, так как всегда можно к самому корню подмонтировать нужный объем, взятый все с того же LVM. Примем по-ка это объяснение. А если возникает необходимость в обновлении исполь-зуемой системы? А если надо выпол-нить в системе настройку, результат которой может оказаться не на 100% успешным? Тогда возникает требова-ние иметь на SAS-устройстве второй экземпляр системы со своим незави-симым корнем. И, загрузив этот второй экземпляр системы, можно выполнить все перечисленные операции.

Состояние сервера, работающе-го под управлением вспомогательно-го экземпляра операционной системы, будем называть фазой обслуживания (на диаграмме Out Of Order).

Здесь снова получаем прежнюю проблему. Ведь можно и корень вто-рой системы разместить на LVM, вы-неся лишь /boot в отдельный раздел диска. Тогда задумаемся, какая глуби-на online-преобразований (без отклю-чения) требуется. Если надо оставить возможность перепланировки всего дискового устройства, то разумно ВСЕ данные вспомогательной системы вы-

Page 21: 039 Системный Администратор 02 2006

19№2, февраль 2006

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

в части, обеспечивающей функцио-нал сервера.

Теперь вернемся к «нашим бара-нам». Итак, размещения лишь /boot на выделенном томе не достаточно, так как это не обеспечит независимой загрузки для манипуляции остальным дисковым пространством. Значит, на-до на отдельном разделе, установлен-ном по схеме 1 DISK, 2 MD, 3 EXT3..., разметить всю систему. И кроме того, сделать это дважды, поскольку надо обеспечить еще и фазу обслужива-ния основной системы. Одновременно с этим получаем «бесплатный» дубли-кат рабочей системы на случай неожи-данного технического повреждения последней (например, из-за ошибки в процессе наложения патчей), то есть фактически добавляем еще и фазу оперативного резерва.

Таким образом, система после за-грузки может перейти в одну из трех фаз: рабочую, обслуживания и резер-ва. Мысль эта не нова. Не могу привес-ти пример из RHEL, но из SuSE – лег-ко! В стандартно создаваемом в про-цессе установки menu.lst присутству-ет пункт аварийной загрузки failsafe. Хоть failsafe и полумера, но культурно-го шока от моих предложений не долж-но быть.

А что в результате, спрашивается? Можно обойтись без спасательного CD! И все? Ведь получается, что все равно переключение системы из фазы работы в другие производится в тра-диционном варианте лишь с консоли. Ну можно, конечно, еще и путем ре-дактирования menu.lst, благо, что воз-можности Grub позволяют это делать без переустановки. Нет, конечно, ради такой чепухи и не стоило бы городить столько. Все это даст эффект лишь в том случае, если настроить систему управляемой загрузки.

Концепция управляемой загрузкиС точки зрения загрузчика, процесс загрузки системы, безусловно, управ-ляем. Но с точки зрения самой систе-мы, он всегда проходит одни и те же фазы загрузки: BIOS – LOADER – од-на из эксплуатационных фаз. Выбор конкретной эксплуатационной фазы производится или из консольного ме-ню оператором, или указанием ветки загрузки по умолчанию путем редак-

циального файла default, который за-писывается утилитой grub-set-default. Хотя можно и просто менять текст са-мого menu.lst.

Но чтобы данная функциональная схема запустилась, надо обеспечить назначение служебной фазы как пути загрузки по умолчанию для следующей перезагрузки после запуска каждой из других фаз – пунктов меню. Мож-но воспользоваться все той же утили-той grub-set-default или так же менять содержимое menu.lst. Но в Grub есть специальный оператор (savedefault), который обеспечивает запись нужно-го значения прямо из stage2, то есть до передачи управления на загружае-мую ОС, которая в общем случае мо-жет быть и несовместима с утилитой grub-set-default.

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

А сейчас зададимся вопросом, а не ересь ли предлагается здесь – создание специальной инсталляции Linux только для обеспечения загруз-ки? Нет! Есть аналог предложенного решения. Известен в «миру» как EFI (Extensible Firmware Interface). Изна-чально он создавался как новый фор-мат модульного заменителя традици-

тирования самого меню. И то и другое представляет собой весьма рукотвор-ный процесс.

Управляемой загрузкой будем счи-тать такой способ настройки, когда вы-бор нужной фазы работы системы бу-дет происходить автоматически в про-цессе загрузки. Конечно, для этого в Grub не хватает функциональности. Его исполнительная часть stage2, ко-торая обрабатывает меню, позволяет модифицировать его и даже выпол-нять какие-то действия с дисковыми устройствами или сетевыми сервиса-ми, занимает от 100 до 200 Кб, в зави-симости от сборки. Но этого недоста-точно. В процедуре управляемой за-грузки нужно иметь возможность вы-брать эксплуатационную фазу, анали-зируя параметры в контексте самого сервера, а не загрузчика. Элементар-но, например, если в ходе анализа пот-ребуется прочитать данные или с LVM, или с удаленного тома NFS, или полу-чить путь из LDAP, то вряд ли удастся остаться в рамках только пакета Grub для обеспечения такой функции управ-ления загрузкой.

Итак, обслуживание стадии управ-ления загрузкой будет производиться Linux как универсальной платформой. Присвоим новой фазе работы серве-ра название служебной (на диаграм-мах Stuff). Это проходная фаза, в кото-рой по некоторым критериям будет вы-брана следующая фаза загрузки, про-изведена соответствующая коррек-ция и далее произведена перезагруз-ка. В Grub существует механизм выбо-ра пути загрузки по содержимому спе-

Рисунок 3. Изменение состояний рабочей станции в процессе управляемой загрузки

Page 22: 039 Системный Администратор 02 2006

20

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

онного BIOS. Но в результате получилось, что такой универ-сальный инструмент может грузить и ОС, используя свои сильно расширенные возможности. Для обеспечения про-цесса загрузки с помощью EFI системы Linux использует-ся компонента ELILO (программа в формате EFI), которая читает все загружаемые файлы со специального систем-ного раздела, размеченного в FAT. Объем такого раздела небольшой по нынешним меркам – 128 Мб, как рекомендо-вано. На нем должны располагаться и ядра, и initrd, и все, что может понадобиться как загрузчику ELILO, так и другим компонентам EFI, список которых не ограничивается лишь драйверами и диагностическими утилитами. Но факт оста-ется фактом: то, до чего еще не додумались разработчики проприетарного EFI, легко реализуется на самом Linux.

Пример управляемой загрузкиВ качестве иллюстрации технологии управляемой загрузки рассмотрим синтетический пример: управляемую загрузку рабочей станции. Такая подмена предмета позволит сде-лать пример полностью законченным и конкретным. Одно-временно это даст возможность продемонстрировать боль-шее число приемов загрузки с помощью Grub. И кроме то-го, покажет, что рамки применения, казалось бы, сервер-ной технологии можно с успехом расширить.

Поставим задачу следующим образом. Нужно создать универсальную рабочую станцию, которая будет автома-тически загружиться как Linux-станция, Windows-станция и X-терминал. Согласно нашей концепции будут также ре-ализованы дополнительные состояния – служебное и со-стояние обслуживания. Полная диаграмма переходов со-стояний, начиная с запуска Grub, будет выглядеть, как пред-ставлено на рис. 3.

Зеленым цветом обозначены узлы, соответствующие рабочим состояниям, желтым – служебные, красным – со-стояние обслуживания. Рабочая станция пребывает в со-стояниях обслуживания и служебном в течение времени, необходимого на выполнение запрограммированных за-дач. А вот пребывание в рабочих состояниях ограничива-ется лишь целевой необходимостью и завершается коман-дой оператора на перезагрузку или выключение, но так-же может быть инициировано удаленным запросом с цен-трального сервера, управляющего всей сетью подобных рабочих станций. Естественно, технология такого запро-са полностью определяется платформой, которой этот за-прос должен управлять. Например, для того чтобы выклю-чить MS Windows XP удаленно с Linux-сервера, можно вос-пользоваться специальным запросом MS RPC:

где username и password соответствуют бюджету админис-тратора на компьютере с адресом ip-address, где будет за-пущена процедура выключения (которая, кстати, не сможет автоматически завершить работающие программы, увы).

Меню Grub для обеспечения требуемой смены состоя-ний можно построить следующим образом:

Это, конечно же, один из возможных вариантов, и мно-гие параметры надо назначить согласно используемому оборудованию и принятым установкам работы. В частности, выше видно, что все состояния, обслуживаемые Linux, сов-мещают один экземпляр системы (так как цель демонстра-ции лишь управляемая загрузка). Пункты меню, соответс-твующие основным состояниям, более-менее однозначны: № 1 Linux и № 2 Windows соответствуют стандартным спо-собам запуска этих систем из Grub. № 3 Terminal запуска-ет клиента LTSP путем загрузки ядра и initrd с ресурса tftp, который указывается по протоколу DHCP. Для того чтобы сработала команда bootp, надо вместо stage2, устанавли-ваемой в ходе стандартной процедуры, разместить в корне Grub stage2, специально собранную для работы с сетью:

При этом выполнение всех остальных команд меню не пострадает. Пункты меню № 4 Stuff и № 0 Out Of Order во всем практически подобны стандартному режиму запус-ка Linux на уровень 3. Но для их правильного функциони-рования надо запрограммировать специальную обработку этих режимов в процессе инициализации соответствующе-го уровня. Продемонстрируем, как это сделать для служеб-ного режима, поскольку он является ключевым для реали-зации всей схемы.

Будем использовать в качестве управляющего призна-ка содержимое файла, размещенного на локальном http-ресурсе. Далее принимаются стандарты SuSE на располо-жение таких файлов. Например, сделаем так: если следу-ет запустить станцию с адресом 192.168.0.166 с использо-ванием пункта меню Grub с номером 1, то запишем этот но-

> rpcclient -c shutdowninit -U username%password ip-address

# cat /boot/grub/menu.lst

color white/blue black/light-gray

default savedhiddenmenutimeout 5#0title Out Of Order root (hd0,1) kernel /boot/vmlinuz root=/dev/sda2 vga=0x332 ↵ selinux=0 splash=0 showopts 3 initrd /boot/initrd savedefault 4#1title Linux root (hd0,1) kernel /boot/vmlinuz root=/dev/sda2 vga=0x332 ↵ selinux=0 splash=0 showopts 5 initrd /boot/initrd savedefault 4#2title Windows root (hd0,2) chainloader +1 makeactive savedefault 4#3title Terminal bootp root (nd) kernel /lts/pxe/vmlinuz.ltsp root=/dev/ram0 ↵ rw init=/linuxrc initrd /lts/pxe/initrd.lts savedefault 4#4title Stuff root (hd0,1) kernel /boot/vmlinuz root=/dev/sda2 vga=0x332 ↵ selinux=0 tonextboot splash=0 showopts 3 initrd /boot/initrd savedefault#

# cp /usr/lib/grub/stage2.netboot /boot/grub/stage2

Page 23: 039 Системный Администратор 02 2006

21№2, февраль 2006

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

мер в файл, названный по IP-адресу нужной станции (дейс-твия производятся на http-сервере):

Это значение можно прочесть со станции с помощью wget, lynx или curl, обратившись по адресу http://www.office.localnet/192.168.0.166, если именно такой адрес у нашего локального http-ресурса. Получив значение нового рабо-чего состояния, скрипт устанавливает параметры следую-щей загрузки, используя утилиту grub-set-default.

Скрипт, который будет анализировать параметр управ-ления загрузкой, назовем tonextboot. Для того чтобы он вы-зывался автоматически, придется поместить его в процесс стартовой инициализации соответствующего уровня, в на-шем случае уровня 3:

Но чтобы скрипт «знал», когда запускать систему в слу-жебном режиме, добавим специальный параметр, кото-рый будем передавать через Grub ядру в командной строке так, чтобы потом можно было проверить его наличие через /proc/cmdline. Примем таким параметром управляемое сло-во «tonextboot». Если этого слова нет, то скрипт «считает», что это какой-то иной режим запуска, а не Stuff. Если же та-кое слово обнаруживается, то следует выполнить действия, указанные на рис. 3. Полный текст скрипта, сделанный по стандартам SuSE приведен ниже. Чтобы скрипт правильно встал в порядок загрузки, указано, что для его работы тре-буется инициализированный сетевой уровень.

Скрипт очень простой и прозрачный по смыслу. В нем есть обработка только одной непредвиденной ситуации – если скрипт «не может» вообще никак «узнать» следующее состояние сервера. Тогда принимается политика «по умол-чанию», которая управляется переменной DEF.

Нельзя не сказать и о том случае, когда grub-set-default будет вызван с номером, превышающим число возможных ветвлений меню Grub. Тогда система запустится с парамет-рами нулевого пункта меню. Это надо учитывать при плани-ровании порядка размещения состояний в меню Grub.

Все перечисленные настройки, включая модификацию stage2, выполняются без переустановки Grub. Затем произ-водится начальная инициализация grub-set-default 4 и пос-ле перезагрузки система станет работать в зависимости от того уровня, что назначен на сервере www.office.localnet для данной станции.

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

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

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

# echo 1 >/srv/www/htdocs/192.168.0.166

# cp tonextboot /etc/init.d# insserv tonextboot

Скрипт tonextboot

#!/bin/sh#### BEGIN INIT INFO# Provides: tonextboot# Required-Start: network# Should-Start:# Required-Stop: network# Default-Start: 3# Default-Stop:# Description: Check and set next boot way### END INIT INFO

. /etc/rc.statusrc_reset

NULL=/dev/nullSRV="http://www.office.localnet/"#VERB=1DEF=2

abort() { [ "1${VERB}" != "1" ] && { echo ; echo -n "Error: $1" ; } rc_status -u rc_exit}

default() { [ "1${VERB}" != "1" ] && { echo ; echo -n "Error: $1" ; } BOOT=$DEF echo -n " to $BOOT" $GRUB $BOOT rc_status -v /sbin/shutdown -r now rc_exit}

echo -n "Check and set next boot way"case "$1" in

start) STUFF=$(cat /proc/cmdline | grep tonextboot) [ "1${STUFF}" == "1" ] && { abort "use only ↵ for stuff level!" ; }

CURL=`which curl 2>$NULL` [ "1${CURL}" == "1" ] && { abort "need curl!" ; }

GRUB=`which grub-set-default 2>$NULL` [ "1${GRUB}" == "1" ] && { abort "need ↵ grub-set-default!" ; }

HOST=$(hostname -i | grep 192.168) [ "1${HOST}" == "1" ] && { default "cant ↵ resolve address!" ; }

BOOT=$(${CURL} --max-filesize 2 -s ${SRV}${HOST} | ↵ grep "[[:digit:]]") [ "1${BOOT}" == "1" ] && { default "cant get ↵ boot way!" ; }

echo -n " to $BOOT" $GRUB $BOOT rc_status -v /sbin/shutdown -r now ;; *) rc_status -s ;;esacrc_exit

Page 24: 039 Системный Администратор 02 2006

22

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

опаснее. Но и это не самое главное. В таком рассуждении подменяется объект. Цикл эксплуатации состоит из време-ни наработки на отказ, отказом и периодом восстановле-ния. Так вот, надежность всецело определяется временем наработки на отказ. И это время не зависит от сложности самой программной системы, а лишь от надежности обо-рудования. Причина в том, что в настоящее время в ЭВМ применяются детерминированные алгоритмы. То есть вне зависимости от цепочки преобразований пара одинаковых запросов вернет эквивалентные данные. Безусловно, чем сложнее преобразования, тем сложнее их реконструкция на этапе восстановления. Но, во-первых, это уже не име-ет отношения к надежности, а, во-вторых, кто сказал, что восстановление сложных систем надо производить прими-тивными способами?

В отношении MD и остальных программных систем все аналогично. Есть лишь те проблемы, что каждая из таких систем вводит в работу ряд параметров, например, назва-ние MD устройства, имя группы LVM, и при физической мо-дификации дисковых устройств возможны конфликты по этой причине. Наличие вспомогательной системы, кроме ос-новной, позволит модифицировать все подобные парамет-ры у основной системы, чтобы избежать конфликта.

Самый спорный вопрос – это, конечно же, предпочте-ния типа файловой системы. Очень часто этот вопрос пе-ретекает из области рациональной оценки в область вкуса, привычек или политических предпочтений. А как же иначе? Ведь если бы существовало однозначное решение, так все менее популярные проекты просто прекратили бы разви-ваться. Значит, в каждой из файловых систем есть собс-твенные преимущества.

Попробуем решить спор тривиальным тестированием с помощью bonnie (Таблица 1). Условия полностью совпада-ют с теми, что были в первой части статьи [1]. Только пара-метром будет тип файловой системы (перечислены в верх-ней строке). Режимы тестирования указаны в самом левом столбце. В перекрестьях замеренные результаты в Кбайт

в секунду, рядом с которыми изобра-жены индексы отклонения от средней по данному тесту величины.

Для наглядности представим резуль-таты в графической форме в виде стол-бчатой диаграммы (рис. 4). И убедимся, что серьезного преимущества нет ни у одного из форматов.

Тогда определим для каждой из сис-тем число индексов, превосходящих 1,

рассчитаем средний индекс и запишем все это в итоговой строке (строка 6 в таблице 1). Теперь уже можно устано-вить, что лучшие результаты у xfs и jfs, худший – у reiserfs4, а вот те файловые системы, что зачастую принимаются в качестве стандартных в инсталляторах «из коробки», «хо-дят» в явных середнячках (и даже не в «троечниках»!). Хо-тя отклонения не превышают 5%. Иначе говоря, нет ино-го способа объяснить выбор форматов ext3 и reiserfs в ка-честве стандартов, как учетом их большей отработаннос-ти (например, в jfs значительное число возможностей по-ка имеет статус экспериментальных) и большей историей использования.

Тем более, вспомним, что выбор типа файловой сис-темы для нас актуален лишь относительно. Используя ос-новную систему, можно поменять формат файловых сис-тем, размещенных в LVM, почти «на лету»: создать «снап-шот» LVM, произвести резервное копирование, создать но-вый логический том, разметить его в новом формате, син-хронизировать данные и перемонтировать. Лишь две пос-ледние операции потребуют кратковременного отключения. Даже формат основной системы можно поменять, исполь-зуя вспомогательную систему. А потом и на ней изменить разметку, воспользовавшись уже основной.

Таким образом, эти, в обычном случае «важные» вопро-сы – сложность LVM, выбор типа файловой системы – бла-годаря использованным технологическим приемам пере-ведены в разряд второстепенных.

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

Литература:1. Барабанов А. Современный Linux-сервер: как планировать

дисковые ресурсы. – Журнал «Системный администратор», №1, 2006 г. – 16-21 с.

Рисунок 4. Зависимость скорости доступа от типа файловой системы

ext3 reiserfs reiserfs4 xfs jfs

Символьная запись 47362 – 1,01 47965 – 1,02 37533 – 0,80 49783 – 1,06 52083 – 1,11

Блочная запись 60396 – 1,01 66731 – 1,12 51754 – 0,87 61549 – 1,03 57912 – 0,97

Перезапись 21618 – 0,95 22360 – 0,98 22116 – 0,97 23365 – 1,03 24225 – 1,07

Символьное чтение 21791 – 0,82 23956 – 0,90 29647 – 1,12 28199 – 1,06 28893 – 1,09

Блочное чтение 53288 – 0,99 52851 – 0,98 53963 – 1,00 54159 – 1,01 54350 – 1,01

Итоговая оценка 2 – 0,96 2 – 1,00 1 – 0,95 5 – 1,04 4 – 1,05

Таблица 1. Зависимость скорости доступа от типа файловой системы

Page 25: 039 Системный Администратор 02 2006
Page 26: 039 Системный Администратор 02 2006

24

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

При разработке FTP-сервера ProFTPD особое внима-ние уделялось безопасности и максимальной гиб-кости настроек. Практически во всём прослежива-

ется влияние проекта Apache – от структуры конфигура-ции и файлов .ftpaccess до модульной архитектуры. Сер-вер полностью поддерживает базовый протокол FTP, оп-ределённый в RFC 959, а также многие функции, описан-ные в RFC 1123.

Приставка «Pro», фигурирующая в названии, полностью оправдывает себя – это действительно профессиональный сервер, с помощью которого вы можете реализовать прак-тически всё, что может потребоваться от FTP-сервера.

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

ИнсталляцияУстановка выполняется достаточно традиционно. Пользо-ватели Linux наверняка (учитывая большую популярность данной программы) найдут предкомпилированный пакет для своего дистрибутива. Для FreeBSD стандартная реко-мендация – установить сервер из коллекции портов. Ну и, естественно, вы всегда можете вручную собрать ProFTPD из исходных кодов.

В дальнейшем все примеры будут относиться к FreeBSD (для конкретики), так что приступим к установке. Обновив коллекцию портов, даём команду:

Можно, конечно, и традиционно (cd /usr/ports/ftp/proftpd; make install), но утилита portupgrade предоставляет целый ряд дополнительных возможностей, так что от себя поре-комендую установить её в любом случае.

Запустив установку порта впервые, вы получите изоб-ражённое на рис. 1 диалоговое окно, где нужно будет от-метить дополнительные модули, с которыми вы желаете

собрать ProFTPD. Если коротко, то эти модули выполняют следующие функции: IPV6: поддержка шестой версии протокола IP. LDAP: поддержка аутентификации пользователей

на LDAP-сервере. MYSQL: поддержка СУБД MySQL для хранения учётных

записей пользователей. POSTGRESQL: аналогичная поддержка для PostgreSQL. OPENSSL: поддержка шифрованных соединений. QUOTA: позволяет настраивать лимиты для пользова-

телей на используемое дисковое пространство. IFSESSION: поддержка ограничений для конкретных

сессий. README: позволяет выводить сообщения об измене-

ниях в каталогах. RATIO: управление соотношением загрузок/скачива-

ний. REWRITE: поддержка перезаписи имён запрашиваемых

файлов/каталогов на основе регулярных выражений. WRAP: ограничение входящих соединений по IP-адре-

су источника (замена механизму TCPWrapper, исполь-зуемому сервером inetd, при работе в автономном ре-жиме).

RADIUS: поддержка авторизации на RADIUS-серве-рах.

О некоторых из них мы ещё поговорим, но вам уже сей-час нужно будет определиться с тем, какие модули вам по-надобятся, так как при необходимости добавить что-то к уже работающему серверу вам придётся пересобирать ProFTPD с новыми параметрами. Но и включать всё, что есть, про за-пас, тоже не стоит – «меньше ставишь – лучше спишь».

Кстати, запустив в следующий раз установку этого пор-та (например, чтобы изменить список модулей или обновить версию), вы уже не увидите этот диалог – ваш нынешний ответ будет сохранён в файле /var/db/ports/proftpd/options. Так что вам нужно будет либо удалить этот файл (вместе

ProFTPD: мастер своего дела

Сергей Супрунов

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

# /usr/local/sbin/portinstall proftpd

Page 27: 039 Системный Администратор 02 2006

25№2, февраль 2006

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

с каталогом proftpd), либо выполнить нужные правки пря-мо в нём.

Пользователям Linux нужно будет подыскать подхо-дящий пакет, собранный с нужными модулями, либо ста-вить из исходных кодов, указав нужные расширения с по-мощью параметра with-modules в команде ./configure, на-пример, так:

Более подробно о параметрах сборки можно, как обыч-но, узнать, введя команду:

Посмотреть полный список подключенных модулей (включая модули, собираемые по умолчанию) можно с по-мощью следующей команды (вводить её следует после ин-сталляции):

В зависимости от того, какой из способов установки вы выберете, вам может понадобиться выполнить вручную не-которые действия: создать учётную запись пользователя, от имени ко-

торого будет работать сервер (традиционно это поль-зователь ftp, и обычно он уже присутствует в системе; по умолчанию используется nobody, однако повсемес-тное его использование может приблизить его по пол-номочиям к root);

создать каталог(и) для размещения файлов, кото-рые вы хотели бы предоставлять пользователям ва-шего сервера;

создать конфигурационный файл proftpd.conf (обыч-но базовый файл создается автоматически во время ин-сталляции);

обеспечить возможность автоматического старта сервиса при перезагрузках компьютера.

В случае FreeBSD от вас потребуется только под-готовить рабочие каталоги и добавить в /etc/rc.conf строчку «proftpd_enable = YES», чтобы получить воз-можность управлять сервисом с помощью сценария /usr/local/etc/rc.d/proftpd.sh, который заодно обеспечива-ет и автозапуск демона при загрузке системы. Но прежде

чем запускать наш FTP-сервер, проследуем в конфигураци-онный файл (/usr/local/etc/proftpd.conf) и посмотрим, нет ли в настройках по умолчанию чего-то такого, о чём мы могли бы пожалеть в дальнейшем.

Структура конфигурационного файлаСразу же бросается в глаза его синтаксическая схожесть с httpd.conf – конфигурационным файлом Apache. В файле proftpd.conf можно выделить следующие секции (области действия директив): секция <Global>: общие настройки для всех виртуаль-

ных серверов; секция <VirtualHost>: параметры виртуальных хостов

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

секция <Anonymous>: настройка анонимного доступа (см. ниже);

секция <Directory>: параметры, относящиеся к фай-лам конкретного каталога;

секция <Limit>: ограничения на работу с командами протокола FTP и ограничения авторизации;

«внешние» директивы: не включены в какую-либо сек-цию, действуют на весь сервер (директивы внутри сек-ций переопределяют общие настройки для своей сек-ции).

Кроме конфигурационного файла, некоторые на-стройки могут быть выполнены в файлах .ftpaccess (если не запрещено переопределение параметров директивой «AllowOverride off»). Действие данного файла распростра-няется на каталог, в котором он размещён, и на все вло-женные каталоги.

# ./configure --with-modules=mod_rewrite:mod_postgresql

# ./configure --help

$ /usr/local/sbin/proftpd -l

Compiled-in modules: mod_core.c mod_xfer.c mod_auth_unix.c mod_auth_file.c mod_auth.c mod_ls.c mod_log.c mod_site.c mod_delay.c mod_auth_pam.c mod_ratio.c mod_readme.c mod_rewrite.c mod_wrap.c mod_sql.c mod_sql_postgres.c mod_ifsession.c

Рисунок 1. Диалог выбора дополнительных модулей ProFTPD

Рисунок 2. Модульная архитектура ProFTPD (показаны не все модули)

Page 28: 039 Системный Администратор 02 2006

26

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

Приоритетом будет пользоваться та директива, «вло-женность» которой больше, т.е. та, действие которой охва-тывает меньшую область сервера.

Директивы можно условно разделить на две катего-рии: «параметрические», которые требуют указать некото-рый параметр (например, IP-адрес), и «логические», кото-рые в качестве параметра принимают ключевое слово «on» или «off», соответственно включая или отключая действие директивы. В дальнейшем в данной статье для параметри-ческих директив будет приводиться синтаксис их парамет-ров; логические директивы будут указаны без параметров (за исключением случаев, когда требуется подчеркнуть не-обходимость установить конкретное значение).

Некоторые сведения о режимах работыВ первую очередь нужно будет определиться с тем, как ваш сервер должен работать. Поддерживается два ре-жима – inetd и standalone, что определяется параметром ServerType. В первом режиме, как следует из его названия, proftpd будет запускаться суперсервером inetd (это же от-носится и к xinetd, более популярному в современных дис-трибутивах Linux). Это, может быть, разумно в том случае, если inetd у вас запущен (в последнее время хорошим то-ном стало отказываться от его использования) и нагрузка на FTP крайне низка, что не оправдывает постоянное при-сутствие в памяти ещё одного демона. В данном случае уп-равлять установлением соединений будет inetd (он прослу-шивает 21-й порт и принимает решение о том, принять или отклонить запрос на соединение, руководствуясь файла-ми /etc/hosts.allow и /etc/hosts.deny), однако возможности ProFTPD в этом режиме существенно ограничены (в част-ности, нельзя создавать виртуальные серверы).

Помимо параметра «ServerType inetd» в файле /etc/inetd.conf следует закомментировать строки, относя-щиеся к «родному» серверу ftpd (чтобы не было конфлик-тов) и добавить строку для активации proftpd при получе-нии запроса на 21-й порт (впрочем, вы можете использо-вать и нестандартный порт, если очень хочется):

Обязательно проверьте правильность пути к исполняе-мому файлу: на некоторых системах proftpd может быть ус-тановлен в /usr/sbin или в /usr/local/libexec.

Автономный режим (standalone) оправдывает себя во всех остальных случаях. Теперь proftpd постоянно при-сутствует в памяти, самостоятельно прослушивая нужные адреса и порты и управляя всеми входящими соединени-ями. Кстати говоря, и время реакции на запрос пользова-теля в этом случае будет меньше, т.к. не придётся каждый раз считывать программу с диска и создавать новый про-цесс. Именно режим standalone используется по умолчанию, так что не будем ничего менять. Убедитесь, что в inetd.conf не активирован никакой сервис, обслуживающий порт, на котором будет работать proftpd, чтобы исключить конф-ликты.

Ну и пока мы здесь, можно указать имя нашего серве-ра в параметре ServerName – оно будет выводиться в бан-нере приветствия при установке соединения.

Управление соединениямиProFTPD предоставляет широчайшие возможности по уп-равлению TCP-соединениями. Рассмотрим некоторые на-иболее полезные параметры (напомню, что мы рассмат-риваем standalone-режим; в режиме inetd будет работать далеко не всё): DefaultAddress IP-адрес: задаёт для сервера IP-адрес

интерфейса, на котором следует ожидать входящие со-единения.

Port порт: номер порта, на котором сервер будет ожи-дать входящие соединения.

PassivePorts нач. кон.: крайне полезная для работы за межсетевым экраном опция. Позволяет задать кон-кретный диапазон «высоких» портов, которые серверу будет разрешено использовать в пассивном режиме. Например, PassivePorts 60000 61999.

SocketBindTight: логическая директива, включающая «умное» прослушивание интерфейсов. Если она отклю-чена, то каждый порт будет связываться со всеми об-служиваемыми интерфейсами.

Timeout*: группа директив, управляющих разрывом соединений на различных этапах установления связи в случае неактивности клиента. Подробности см. в до-кументации.

UseReverseDNS: включает или отключает определе-ние доменного имени клиента по IP-адресу («обратный» DNS). Если из-за проблем в работе DNS ваши клиенты жалуются на то, что подключение выполняется с боль-шой задержкой, данную опцию можно отключить.

MaxClients*: группа опций, управляющая максималь-ным количеством клиентов, которым разрешается од-новременно работать с сервером. Вы можете ограни-чивать как общее число соединений (MaxClients чис-ло [сообщение]), так и число соединений с одного хос-та (MaxClientsPerHost число [сообщение]) или под одним именем пользователя (MaxClientsPerUser чис-ло [сообщение]). Необязательный параметр «сообще-ние» позволяет указать конкретную фразу, которая бу-дет возвращаться клиенту в случае запроса на соеди-нение, когда лимиты превышены.

MaxConnectionRate запросов [сообщение]: задается максимальное число запросов на соединение, обслужи-ваемое в одну секунду.

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

Здесь же рассмотрим два модуля: mod_wrap и mod_ratio.Модуль mod_wrap предназначен для обеспечения

функциональности, которую в случае inetd реализует TCPWrapper. Собрав ProFTPD с поддержкой данного моду-ля, вы сможете указать файлы allow и deny, которыми сер-вер будет руководствоваться, принимая решение о том, об-служивать соединение с данного адреса или нет. Вы мо-

# ftp stream tcp nowait root ↵ /usr/libexec/ftpd ftpd -l# ftp stream tcp6 nowait root ↵ /usr/libexec/ftpd ftpd -lftp stream tcp nowait root ↵ /usr/local/sbin/proftpd proftpd

Page 29: 039 Системный Администратор 02 2006

27№2, февраль 2006

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

жете указывать эти файлы как для всех пользователей, так и для конкретных:

С помощью символа «~» вы можете подключить для каж-дого пользователя свои wrap-файлы, размещаемые в их до-машних каталогах:

Формат файлов аналогичен /etc/allow.host, в качестве имени службы используется proftpd (можно задать другое с помощью TCPServiceName).

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

Здесь мы для пользователя ftp ввели следующие ог-раничения: он должен скачать в десять раз больше файлов, чем за-

грузит на сервер (первое число 10 означает, что соот-ношение download/upload = 10/1);

первые 5 файлов можно закачать «в кредит»; для размера файлов установлено соотношение 20/1; «кредит» – 250 Кб.

Помимо этого вы можете устанавливать соотношения для хостов (HostRatio), групп (GroupRatio), анонимных поль-зователей (AnonRatio). Символ «*» можно использовать в значении «все» (например, все пользователи). Установка какого-либо параметра в 0 означает снятие ограничений.

Права доступа и анонимные серверыЕсли сравнивать proftpd со стандартным ftpd, входящим в поставку FreeBSD, то в первую очередь следует отме-тить гораздо большие возможности первого в вопросах уп-равления учётными записями и правами доступа. ProFTPD в полном объёме поддерживает стандартные средства уп-равления доступом (авторизация по системному файлу паролей, использование файлов /etc/shells, чтобы предо-ставлять доступ только тем пользователям, которые име-ют действительную командную оболочку, и т. п.). Помимо этого к вашим услугам ряд других замечательных возмож-ностей, о которых и поговорим.

Прежде всего отметим возможность использовать ба-зу LDAP для аутентификации пользователей. Также вы мо-жете вести базу виртуальных пользователей в обычном текстовом файле или в СУБД (поддерживаются MySQL и PostgreSQL).

Для использования текстового файла, содержаще-го данные учётных записей, используются директивы AuthUserFile и AuthGroupFile. В этом случае ProFTPD будет руководствоваться данными этих файлов, как если бы поль-зователи, описанные в них, были обычными, зарегистриро-

ванными в системе. Формат файлов должен соответство-вать системным, за исключением того, что пароль указы-вается в этом же файле (аналога shadow нет), так что пре-дельно внимательно отнеситесь к ограничению прав до-ступа к этому файлу.

Кроме того, вы можете указать требуемый логин и па-роль непосредственно в конфигурационном файле proftpd с помощью директивы UserPassword. Как здесь, так и в фай-ле, определенном директивой AuthUserFile, должны исполь-зоваться хешированные пароли (если верить ряду про-ведённых экспериментов, сервер самостоятельно опреде-ляет тип хеша по его виду; поддерживается DES и «стан-дартный» MD5, причём допускается их совмещение в од-ном файле). Для управления паролями можно использовать, например, входящую в состав Apache утилиту htpasswd (для формирования DES-паролей; то, что формирует эта утилита с ключом -m, сервером ProFTPD, не распознаёт-ся как MD5-хеш). Также существует аналогичная утилита ftpasswd, разработанная специально для нужд ProFTPD, но в стандартную поставку, по крайней мере, во FreeBSD, она почему-то не включена. (Почитать про неё можно здесь: http://www.castaglia.org/proftpd/contrib/ftpasswd.html, а по это-му адресу находится собственно текст данной утилиты, написанной на языке Perl: http://www.castaglia.org/proftpd/contrib/ftpasswd).

Рассмотрим также хранение информации об учётных за-писях пользователей в базе данных на примере PostgreSQL. Прежде всего, убедитесь, что ваш proftpd собран с подде-ржкой модулей mod_sql и mod_sql_postgres. Теперь подго-товим базу данных (назовём её proftpdb), в которой созда-дим две таблицы – users и groups:

Как видите, структура таблиц очень напоминает струк-туру файла /etc/passwd. Вам следует соблюдать уникаль-ность имён пользователя и группы, а также уникальность uid в файле users и gid в файле groups. Если пользовате-

TCPAccessFiles /etc/hosts.allow /etc/hosts.denyTCPUserAccessFiles admin /etc/admin.allow /etc/admin.deny

TCPAccessFiles ~/.allow ~/.deny

Ratios onUserRatio ftp 10 5 20 256000

$ psql -U serg# create database proftpdb owner serg;

CREATE DATABASE

# \c proftpdb serg

Вы подсоединились к базе данных "proftpdb" как пользователь "serg".

proftpdb=> create table users (username text, ↵ pass text, uid numeric,proftpdb(> gid numeric, home text, shell text);

CREATE TABLE

proftpdb=> create table groups (groupname text, ↵ gid numeric, members text);

CREATE TABLE

proftpdb=> insert into groups values('admins', 1000, ↵ 'admin');

INSERT 227037 1

proftpdb=> insert into users values ('admin', ↵ 'adminpassword', 1000,proftpdb(> 1000, '/home/admin', '/bin/sh');

INSERT 227038 1

proftpdb=> \q

Page 30: 039 Системный Администратор 02 2006

28

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

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

Последними двумя командами мы создаём группу «admins» и пользователя «admin». Теперь нужно указать ProFTPD, как использовать эти данные:

Теперь вы можете входить на сервер под именем «admin», хотя такого системного пользователя и нет. Главное – что-бы его домашний каталог реально существовал, если вы используете директиву DefaultRoot ~. Обратите внимание, что после авторизации процесс, обслуживающий соедине-ние, получит uid и gid, указанные в базе, так что вам следу-ет позаботиться об отсутствии пересечений с системными пользователями. Также учитывайте этот факт в контексте прав доступа к тем или иным файлам (заметьте, что вы мо-жете дать на любой файл или каталог права несуществую-щего пользователя, указав любые нужные вам идентифика-торы, например, так: chown 9999:9999 /home/admin).

Для организации анонимного доступа используется сек-ция <Anonymous каталог>, где каталог – это имя каталога (абсолютный путь или с использованием символа ~), доступ в который будет осуществляться без обязательного знания пароля. Типичный пример приведён ниже:

Если в секции <Anonymous> вы укажете директиву AnonRequirePassword off, то вход на сервер будет выпол-няться сразу после ввода имени пользователя (в нашем случае – ftp или anonymous). Если же использовать значе-ние «on», то у пользователя будет запрошен адрес элек-тронной почты в качестве пароля (хотя ввести он сможет там всё что угодно).

Более подробного рассмотрения заслуживает упомя-нутая выше секция <Limit>. С её помощью вы можете вво-дить ограничения как для всех пользователей (как в при-ведённом выше примере), так и для конкретных пользова-телей или групп. Вы можете налагать ограничения на ис-пользование конкретных команд FTP-протокола (напри-мер, <Limit STOR> будет управлять использованием коман-ды STOR). Существует несколько «макросов», охватываю-щих целые наборы FTP-команд (например, WRITE (группа команд записи), READ (группа команд чтения), DIRS (работа с каталогами). Секция <Limit LOGIN> определяет возмож-ность выполнять процедуру входа на сервер.

Также нужно сказать пару слов о директиве AllowOverwrite, с помощью которой вы можете полностью запрещать (off) или разрешать (on) перезапись существующих на сервере файлов (дополнительно пользователь, пытающийся вы-полнить такую перезапись, должен обладать достаточны-ми системными правами).

Ну и последнее, о чём следует упомянуть, говоря о про-цедуре входа в систему, это о приветственных сообщениях, которые будут выводиться пользователю в том или ином случае (при входе на сервер, при переходе в тот или иной каталог и т. д.). ProFTPD позволяет довольно гибко управ-лять этими сообщениями, благодаря чему вы сможете сде-лать работу на сервере достаточно простой и понятной. Ко-нечно, большинство FTP-клиентов просто игнорируют по-добные сообщения, но для работы с помощью консольного клиента они могут быть полезны. Если вам захочется изме-нить то или иное сообщение, обратитесь к документации (см. директивы AccessDenyMgs, AccessGrantMsg, группу оп-ций Display*), и вы наверняка найдёте способ сделать это.

Виртуальные серверыВиртуальный FTP-сервер? А почему бы, собственно, и нет! Конечно, это будет не то же самое, что мы привыкли ви-деть в Apache, когда на один IP-адрес «навешивается» не-сколько десятков, а то и тысяч «народных» сайтов. Всё де-ло в том, что в протоколе FTP нет того «волшебного» пара-метра заголовка – Host, – который позволяет веб-серверу, поддерживающему протокол HTTP версии 1.1, разобрать-ся, что же на самом деле клиент желает увидеть на экра-не своего монитора.

В случае FTP каждый виртуальный сервер всё же дол-жен иметь свой собственный IP-адрес, по которому к не-му будет осуществляться доступ. Для тех, кто испытыва-ет дефицит адресного пространства (а разве бывает так, чтобы IP-адресов всегда хватало?), есть обходной маневр – то, что в Apache называют «port-based vhosts». Вы можете настроить ProFTPD таким образом, что каждый виртуаль-ный сервер будет прослушивать свой порт. Очевидно, что это непригодно для коммерческого хостинга, когда каж-дый клиент ожидает получить «стандартный» сервер, ко-

### Настройка авторизации в PostgreSQL# Данные для подключения, формат: # база@хост:порт логин парольSQLConnectInfo proftpdb@localhost:5432 serg sergpassword# Поддерживаемые типы авторизации# (в данном случае – открытый текст)SQLAuthTypes plaintext# Имя таблицы пользователей и далее – имена полейSQLUserInfo users username pass uid gid home shell# Имя таблицы групп и далее – имена полейSQLGroupInfo groups groupname gid members# Сюда выводится отладочная информация# (полезно на этапе настройки)SQLLogFile /var/log/proftpd.log

<Anonymous ~ftp> # Анонимный доступ в каталог ~ftp User ftp # Пользователь и группа, с правами Group ftp # которых будет работать процесс UserAlias anonymous ftp # Псевдоним anonymous = ftp <Limit WRITE> # DenyAll # Запрещаем запись </Limit> #</Anonymous> #

Вспомогательные утилитыВ составе пакета ProFTPD вы найдёте несколько утилит, кото-рые могут быть весьма полезны для мониторинга работы ваше-го FTP-сервера и поиска в его работе «узких мест»: ftpcount – выводит число подключённых в данный момент

клиентов (с разбивкой по серверам); ftpdctl – позволяет управлять запущенным сервером proftpd; ftptop – аналог команды top для процессов proftpd; ftpwho – выводит список подключённых к серверу пользова-

телей; ftpshut – позволяет выполнить останов всех запущенных

proftpd-серверов в указанное время (аналог системной ко-манды shutdown).

Для каждой команды есть подробная страница справки (man).

Page 31: 039 Системный Администратор 02 2006

29№2, февраль 2006

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

торый будет отвечать на запросы, адресованные на 21-й порт. Однако для личных нужд (например, когда FTP ис-пользуется для доступа к корню веб-сервера) такой ме-тод может оказаться вполне пригодным. Так что мы уде-лим внимание и ему.

Итак, виртуальный сервер задаётся секцией <VirtualHost IP-адрес>. Вместо адреса можно указать и доменное имя. В данной секции допускаются очень многие директивы, уп-равляющие работой сервера – вы можете задать отдельно-го пользователя, с чьими правами он будет работать; на-страивать анонимный доступ; установить собственный спо-соб авторизации; вводить различные ограничения. Общие для всех виртуальных хостов опции можно вынести в сек-цию <Global>.

Пример конфигурации см. ниже, в решении задачи 5.

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

Вы можете управлять дисковыми квотами (модуль mod_quota, директивы DefaultQuota, QuotaType, UserQuota, GroupQuota и др.), скоростью скачивания, и проч.

В общем, ознакомьтесь с документацией – там много интересного.

Несколько практических примеровДля закрепления материала рассмотрим небольшие при-меры, демонстрирующие решение некоторых задач, свя-занных с настройкой FTP-сервера.

Пример 1. Конфигурация, близкая к стандартнойПостановка задачи: необходимо с помощью FTP администратору (пользо-

ватель admin) открыть доступ ко всему дереву катало-гов сервера;

нескольким «своим» пользователям, входящим в груп-пу wheel, – доступ в их домашние каталоги с правом за-писи;

пользователям, работающим через коммутируемые со-единения (группа dialup), дать доступ на чтение в один из каталогов (для всех членов группы он установлен как домашний);

всем остальным доступ по FTP запретить.

Решение: эту задачу можно решить в два этапа – во-пер-вых, ограничим доступ домашними каталогами всем поль-зователям, кроме пользователя admin (первая строка при-мера). Поскольку пользователи dialup не имеют реальной командной оболочки, то второй строкой отключим провер-ку наличия shell пользователя в файле /etc/shells. Ну и, во-вторых, в секциях <Limit> «отсекаем» возможность входить на сервер (LOGIN) и писать в каталоги (WRITE) для всех,

кто не входит в перечисленные в директиве AllowGroup группы:

Теперь admin будет свободно «бродить» по всему дере-ву каталогов, а члены групп wheel и dialup смогут работать в своих домашних каталогах. Заметьте, что пользователь admin должен быть членом одной из указанных групп (ско-рее всего, он уже входит в wheel), иначе ему не позволят авторизоваться.

Пример 2. Несколько анонимных каталоговПостановка задачи: требуется настроить на одном FTP-сер-вере три анонимных каталога – для разработчиков, для тес-теров и для пользователей.

Решение: в данном случае проще всего создать три сек-ции <Anonymous> для разных пользователей, имена кото-рых должны вводиться при подключении. Для определен-ности разработчикам нужно будет входить под именем developer, тестерам – tester, остальным пользователям – под стандартными anonymous/ftp (ну и для общности до-бавим ещё один псевдоним – user):

Заметьте, что имя каталога, указанного в теге <Anonymous>, не обязательно должно совпадать с именем пользовате-ля – оно может указывать на любой существующий ката-лог. Имя же пользователя, при вводе которого осущест-вляется анонимный вход, задаётся директивой User, при-чём указанный пользователь должен существовать в сис-теме (в случае виртуальных пользователей для них долж-ны быть указаны uid и gid, под которыми будет запущен процесс). В последней секции мы указываем два псевдо-нима, чтобы в этот каталог можно было попасть не только под именем user, но и как ftp или anonymous.

Пример 3. Общий каталогПостановка задачи: есть группа пользователей, которым нужно предоставить полный доступ каждому в свой до-машний каталог, а также в общий для всех каталог толь-ко на чтение.

Решение: сразу напрашивается идея использовать символьную ссылку на общий каталог из домашних ка-

DefaultRoot ~ !adminRequireValidShell off<Limit LOGIN> AllowGroup wheel,dialup</Limit><Limit WRITE> AllowGroup wheel</Limit>

<Anonymous ~developer> User developer Group project</Anonymous>

<Anonymous ~tester> User tester Group project</Anonymous>

<Anonymous ~user> User user Group project UserAlias ftp user UserAlias anonymous user</Anonymous>

Page 32: 039 Системный Администратор 02 2006

30

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

талогов пользователей, а затем «запереть» всех с помо-щью «DefaultRoot ~». Однако выход за пределы корнево-го (в данном случае – домашнего для пользователя) ката-лога по символьной ссылке запрещён. Так что нужно ис-кать обходной путь, например, такой:

Чтобы это сработало, должны выполняться некоторые ограничения – все домашние каталоги пользователей долж-ны размещаться в /home, кроме того, на них должны быть выставлены права 0700 (доступ только владельцу катало-га). Общий каталог также должен располагаться в /home, но с правами, позволяющими любому пользователю читать его содержимое. В этом случае события будут развиваться следующим образом: после успешной авторизации процесс, обслуживающий

соединение, получит права авторизованного пользова-теля – владельца одного из каталогов;

поскольку прав на чтение чужих домашних катало-гов у данного пользователя нет, то сервер ProFTPD в соответствии с директивой HideNoAccess скроет их и не представит по команде LIST (теоретически доступ в скрытые каталоги возможен, но в данном случае он будет предотвращаться системными правами);

общий каталог скрыт не будет, и пользователь, подняв-шись из своего каталога (куда он попадёт автоматичес-ки) в каталог /home, увидит его и сможет в него перейти.

Пример 4. Запись без права чтенияПостановка задачи: разрешить анонимным пользователям за-грузку файлов на сервер. Чтобы избежать злоупотреблений (когда ваш анонимный сервер превратится в средство обмена «пиратскими» файлами), чтение из данного каталога необхо-димо запретить (в дальнейшем администратор будет просмат-ривать файлы и публиковать нужные в других каталогах).

Решение: здесь всё достаточно просто – на рассматри-ваемый каталог нужно установить соответствующие огра-ничения (в секции LIMIT):

То есть для каталога upload мы выставляем «инверсные» права – разрешаем запись, но запрещаем чтение.

Пример 5. Виртуальные серверыПостановка задачи: есть два «очень важных» клиента, ко-торым необходимо предоставить виртуальные FTP-серве-

ры на стандартном порту (21), при этом администратор дол-жен иметь возможность работать с сервером с помощью третьего FTP-сервера. При этом реальных адресов на сер-вере – всего два.

Решение: поскольку «очень важных» клиентов ущем-лять в правах нельзя, придется им давать «нормальный» хостинг на реальных IP-адресах. Страдать, как обычно, будет администратор, которому придётся довольствовать-ся работой через нестандартный порт (для красоты выбе-рем порт 2121):

Что здесь нужно пояснить: вне секций мы описываем параметры «административного» сервера, который будет привязан к домену user1.mydomain.ru и порту 2121. Дирек-тива «SocketBindTight on» требует от ProFTPD «разумного» подхода к созданию сокетов, когда порты прослушивают-ся только на тех адресах, где это необходимо, а не на всех обнаруженных интерфейсах. Ну и секциями <VirtualHost> вводим наши пользовательские серверы (показаны толь-ко директивы, отвечающие за создание виртуальных сер-веров).

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

Дополнительную информацию вы всегда можете полу-чить по ссылкам, приведённым ниже.

Удачи вам и настойчивости, чтобы преодолеть всё!

Ссылки:1. Официальный сайт проекта ProFTPD – http://www.proftpd.org.2. ProFTPD mini-HOWTO – http://devil.st.vstu.edu.ru/ftpd/howto.3. Богомолов С. FTP-сервер ProFTPD: установка, настройка и ис-

пользование – http://bog.pp.ru/work/ProFTPD.html.4. Лаврентьев А. Маленькие нюансы при установке и настройке

ProFTPD – http://opennet.ru/base/net/adv_proftpd.txt.html.5. Великанов С. Ограничение доступа на сервере proftpd при по-

мощи mod_wrap – http://www.opennet.ru/base/net/proftpd_mod_wrap.txt.html.

6. Бочкарёв Д. Настройка ProFTPD на сервере под управлени-ем FreeBSD – http://opennet.ru/base/net/proftpd_setup.txt.html.

7. Настройка связки ProFTPD + MySQL – http://fr33man.ru/proftpd.html.

<Anonymous ~ftp> User ftp Group ftp <Limit WRITE> DenyAll </Limit> <Directory ~ftp/upload> <Limit WRITE> AllowAll </Limit> <Limit READ> DenyAll </Limit> </Directory></Anonymous>

DefaultAddress user1.mydomain.ruPort 2121SocketBindTight on

<VirtualHost user1.mydomain.ru> ServerName "User1 Virtual Host" Port 21 .. .. ..</VirtualHost>

<VirtualHost user2.mydomain.ru> ServerName "User2 Virtual Host" Port 21

.. .. ..

</VirtualHost>

DefaultRoot /home !admin<Directory /home> HideNoAccess on</Directory>

Page 33: 039 Системный Администратор 02 2006
Page 34: 039 Системный Администратор 02 2006

32

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

В настоящее время многие за-были про операционную сис-тему DOS, ее используют край-

не редко, в случаях сбоя как послед-нюю маленькую надежду для восста-новления данных и теста оборудова-ния. Но MS-DOS давно устарел, ка-кие новые проекты доступны в насто-ящее время? Чем они отличаются? Есть ли их поддержка? Насколько они

совместимы с программным и аппа-ратным обеспечением? Сегодня рас-смотрим одну из DOS-систем, подде-рживаемую и дорабатываемую до на-стоящего времени, сравним с аналога-ми и проведем тестирования.

Почему FreeDOS?Некоторое время назад мне пришлось создать загрузочный диск с DOS-сис-

темой. Первое и простое решение – создать загрузочный диск из Windows, добавить нужные компоненты и гото-во, но есть в этом решении несколь-ко но... Места почти всегда не хвата-ет на обычный тест жесткого диска, памяти и других узлов PC, нет нуж-ных по современным меркам утилит и иные проблемы... Поэтому было ре-шено ознакомиться с альтернативами.

FreeDOS – новый взглядна старые вещи

Иван Максимов

В мае 1994 года корпорация Microsoft выпустила последнюю версию операционной системы MS-DOS, позже эта ОС входила в состав Windows, но различные компании и энтузиасты продолжают создавать, развивать и дорабатывать DOS. Какие же проекты существуют сегодня?

Page 35: 039 Системный Администратор 02 2006

33№2, февраль 2006

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

DR-DOS (www.drdos.com) оказался платным, а искать все-возможные ключи и патчи не хотелось по многим причи-нам. Предыдущая версия DR-DOS от компании Caldera бы-ла слишком устаревшей, поддержка остановлена. Послед-няя версия RxDos (http://rxdos.sourceforge.net) была выпуще-на в 2000г. Достаточно любопытен проект PTS-DOS (http://www.phystechsoft.ru) Российская разработка, поддержива-емый, используемый в промышленных целях, но проект не бесплатен. Еще одной альтернативой оказался FreeDOS (www.freedos.org) – бесплатен, функционален, доступен большой выбор утилит и до сих пор дорабатывается.

ПрименениеЯ не стану переводить и переписывать информацию с раз-ных сайтов, говорящую о том, что DOS еще нужен на сла-бых машинах, всевозможных терминалах и специальном оборудовании, что это ОС с открытым исходным кодом, все это было уже сказано и не раз. Я опишу, где сталки-вался с ним в российской действительности. Впервые в ра-боте со специальным ПО, в частности для работы с мини-АТС. Также я его встречал проинсталлированным на гото-вых компьютерах в магазинах с установленными тестами, покупателю предлагался Windows или установленная ОС ( FreeDOS). Один раз мне довелось его увидеть в качестве дискеты для удаления Linux с компьютера. Зачем? Прода-вец в магазине ответил, что на их PC устанавливается Linux, многие покупатели просто не знают, как его удалить, а дис-кета при загрузке удалит Linux, создаст диск с FAT32, под-ключит CD-ROM и установит Volkov Commander, благо ос-новам «нортона» учили в школах многих. Еще я его видел в офисе моего коллеги на загрузочных дисках с програм-мой ghost от Symantec, естественно, с готовым образом ОС Windows. Также мне попадались диски компаний Asus, MSI с драйверами к материнской плате и c FreeDOS в качестве загрузочной ОС, с тестами и прошивками BIOS. Как видите, DOS, а конкретно FreeDOS достаточно популярен. DR-DOS я встречал лишь раз, причем не текущую версию от компа-нии DRDOS, Inc, а от Caldera, Inc в продукте Partition Magic 8. Перейдем к обзору FreeDOS...

Краткий обзорПоследняя доступная версия (на момент написании статьи) FreeDOS Beta9SR2 от 1 декабря 2005. Итак, какие утилиты и программы доступны в данной ОС? На официальном сай-те (www.freedos.org) доступны необходимые и знакомые бы-валым пользователям и администраторам такие DOS-ути-литы, как fdisk, format, scandisk, emm386, mem, драйвера для CD-ROM, мыши. Также стоит отметить драйвера для досту-па к жесткому диску в режиме UDMA, утилиты для работы с модемом, архиваторы. Пользователи ОС Linux найдут на официальном сайте такие распространенные программы, как vim, lynx, wget, gzip и другие. Приятной особенностью является то, что в командную строку встроен аналог bash-completion. Со всеми утилитами можно ознакомиться и ска-чать их на официальном сайте ОС. Важным нововведени-ем в FreeDOS, думаю, стоит считать официальную подде-ржку протокола TCP/IP. Но что еще умеет FreeDOS? Что не-обходимо для подобной ОС? Существует множество утилит для работы с файловыми системами NTFS, ext2/3 и reiserfs;

программы-оболочки: Volcov Commander, Norton Commander, Dos Navigator, SEAL, GEM. Тесты оборудования, компилято-ры, ПО для резервного копирования данных и многие другие распространенные программы. Ниже я приведу более под-робный список наиболее необходимых утилит и программ для работы в FreeDOS с ссылками на веб-ресурсы.

Нельзя не упомянуть и о 32-битной версии FreeDOS. Проект находится в стадии разработки, но доступен для оз-накомления. Нетрудно догадаться, что предназначен он для работы с 32-битными приложениями, но на данной ста-дии разработки 32-битный FreeDOS не стабилен. Разра-ботчики предупреждают нас о возможных проблемах с ап-паратной частью PC и о невозможности запуска 16-битных приложений, поэтому большинство утилит и драйверов для DOS применить невозможно. Но, несомненно, данная вер-сия тоже заслуживает внимания, поэтому я кратко коснусь описания 32-битной версии в одном из разделов. Должен еще раз напомнить, что проект FreeDOS и большинство утилит к нему бесплатны.

Установка и работаВозможны установки FreeDOS на дискету, компакт-диск или жесткий диск. Образы дискеты и компакт-дисков находят-ся на официальном сайте (раздел «Download FreeDOS»). В данном разделе находится утилита «rawrite», позволя-ющая разворачивать образ на дискету. Разработчики ре-комендуют использовать образы компакт-дисков, так как они более стабильны и лучше протестированы. Размер образа дискеты стандартен 1.4 Мб (доступны дистрибу-тивы дискет 360, 720 и 1200 Кб), компакт-дисков пример-но 12 Мб и 102 Мб. Итак, скачав нужный образ, копируем его на носитель.

Обзор дистрибутива на дискетеНачнем с обзора дискеты, командой:

копируем образ, перезагружаем PC. Думаю, не стоит доско-нально описывать каждый пункт меню, большинство поль-зователей справятся с выбором диска и папки для инстал-ляции системы, затрону лишь самые интересные и необхо-димые пункты меню. После перезагрузки перед нами воз-никает меню (см. рис. 1) с возможностью выбора: Инсталлировать FreeDOS – образ дискеты развернет-

ся в виртуальный диск. Загружать утилиту Smart Boot Manager – мультизагруз-

чик ОС.

rawrite -f fd1440.img

Рисунок 1. Первое меню загрузочной дискеты

Рисунок 2. Начальная настройка инсталляции FreeDos

Page 36: 039 Системный Администратор 02 2006

34

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

Запускать тест памяти PC – memtest86+. Инсталлировать FreeDOS (disk safe) – работа с дискеты.

При выборе первого или четвертого пункта меню (см. рис. 2) нам предложат: Загрузить стандартные драйвера (нестабильная вер-

сия). Использовать свой драйвер CD-ROM.

Не использовать CD-ROM. Использовать CD-ROM и редактировать файл инстал-

ляции install.bat. Загрузить дистрибутив из Интернета.

Выберем последний пункт меню. Нам предложат загру-зить новые драйвера CD-ROM или образ 12 Мб дистрибу-тива. Далее запускается аналог Linux-утилиты lspci (спи-сок PCI-устройств), и нам предложат установить драйвера для сетевой карты с рекомендацией конкретных файлов. Далее идет мастер оснастки TCP/IP: наш IP, маска сети, DNS-сервер и шлюз. После этого в зависимости от выбран-ного пункта меню программа wget начнет загрузку из Ин-тернета. Очень хотелось увидеть аналог портов в FreeBSD для установки ПО, но, увы, видимо, мы это увидим (если увидим) только в следующем релизе FreeDOS.

В заключение, последует мастер инсталляции FreeDOS на жесткий диск. Будут установлены основные утилиты, об-работчик команд (command.com), драйвера CD-ROM. Ути-литы – стандартный набор fdisk, format, mem. После уста-новки системы мы видим перед собой стандартный мини-мальный набор программ, необходимый для работы с PC. На дискете остаются тест памяти и Smart Boot Manager. Что ж, большего ожидать было нелогично, перейдем к об-зору CD-диска.

Обзор малого дистрибутиваОбраз загрузочного диска разворачивается любой програм-мой для записи компакт-дисков (в моем случае это была «k3b»). Чем же отличается 12-мегабайтная версия, кроме размера образа? Меню инсталляции иное, по сравнению с представленным на дискете (см. рис. 3).

После загрузки CD-ROM нам предложат: Установить FreeDOS. Загрузиться с жесткого диска. Загрузиться с дискеты. Отменить загрузку с CD-ROM.

Серьезным отличием является поддержка 85 кодовых страниц, включая русскую. В конце следует мастер инстал-ляции FreeDOS на PC. Пункта загрузки дистрибутива из се-ти Интернет нет. Отличие данного дистрибутива в большем количестве стандартных утилит и драйверов. Присутствует несколько версий драйверов для работы с мышью, утили-ты для работы с верхней памятью, CD-ROM, режима досту-па UDMA, несколько программ для восстановления данных и многие другие. Всего после инсталляции в каталоге bin появится 120 утилит и драйверов. Папки doc и help не пусты, присутствует большое количество документации по утили-там и драйверам. Просматривая документацию, должен за-метить, что она составлена достаточно грамотно, содержит много полезной информации. Набрав, предположим, коман-ду «help del», на экран выведется краткая подсказка по ко-манде del. По сравнению с man в *nix-системах справка ме-нее информативна, но поможет разобраться с синтаксисом программ. Не стоит забывать и про ключ «/?» в конце ко-манд – вывод основных параметров данной утилиты. В пап-ке appinfo присутствует информация о разработчиках всех утилит, вошедших в ОС, их адреса электронной почты, веб-

Рисунок 3. Меню загрузочного компакт-диска

Рисунок 4. Интерфейс графической оболочки GemXP

Рисунок 5. Интерфейс графической оболочки Seal2

Page 37: 039 Системный Администратор 02 2006

35№2, февраль 2006

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

ресурсы. Исходных кодов утилит на диске нет, но их можно найти на веб-страницах разработчиков, указанных в папке appinfo или на сайте. Итоговый размер ОС FreeDOS после инсталляции примерно равен 5 Мб.

Обзор полного дистрибутиваРассмотрим самый большой дистрибутив FreeDOS, как уже упоминалось, его размер 102 Мб. Меню при загрузке диска не отличается от 12 Мб дистрибутива. При инстал-ляции системы FreeDOS обнаруживает уже установлен-ные операционные системы и добавляет «себя» в меню boot.ini, не повреждая его. В момент установки несколько раз были предупреждения об отсутствии некоторых паке-тов, возможно, они появятся в финальной версии FreeDOS. Чем же отличается столь большой дистрибутив? Количест-во утилит в папке bin возросло до 239, появились шрифты в папке founts, графические оболочки и текстовые редакто-ры. Присутствуют графические оболочки GemCore, GemXP (см. рис. 4), OpenGem и Seal2 (см. рис. 5).

О первых трех я ничего положительного, к сожалению, сказать не могу, многие приложения «намертво виснут», не всегда отображаются все логические диски. Порадо-вал Seal2 – приличная графика, продуманный интерфейс, нормально определились и отобразились все устройства. На мой взгляд, его в принципе можно использовать в рабо-те. Неприятным моментом было только одно обстоятельс-тво: если драйвера мыши не загружены, seal2 при запуске выбрасывает ошибку «Kernel panic:....», помогает только reset. В целом, графические оболочки для данной ОС не-актуальны, так как DOS-системы ориентированы на иные интерфейсы.

В папках doc и help собрана документация по всем 239 утилитам. Появились еще два текстовых редактора, кроме стандартного edit, это знакомый бывалым пользователям DOS-систем редактор setedit и не менее известный Linux-редактор vim. С данными редакторами проблем не возник-ло. Размер полного дистрибутива после установки на жес-ткий диск примерно равен 90 Мб.

Обзор 32-битного дистрибутива FreeDOSНа официальном сайте проекта (http://freedos-32.sourceforge.net) доступен для ознакомления дистрибутив FreeDOS32 версии 0.0.5 от 1 июня 2005 года (образ для флоппи-дис-ка). Развернем образ на дискету. После загрузки перед на-ми появится меню загрузчика GRUB с различными возмож-ностями загрузки FreeDOS32: работа с дискетой (нет воз-можности обратиться к жесткому диску), работа с жест-ким диском, тест 32-битного приложения. После загрузки выбранного пункта меню можно попробовать поработать с данной ОС, именно «попробовать поработать». Система, как это уже было сказано, не запускает 16-битные прило-жения, при попытке запуска консольных win32-приложе-ний ОС либо висла, либо сообщает о нехватке различных библиотек. Доступны стандартные DOS-команды в мини-мальном наборе, драйвера CD-ROM, мыши, ... и все. Очень хотелось увидеть более-менее рабочую 32-битную версию FreeDOS, но чудо не свершилось... Возможно, данная вер-сия ОС будет интересна разработчикам, на сайте выложе-ны исходные коды 32-битной ОС, но для реальных задач

применять ее не рекомендуется. Будем ждать новых ре-лизов этой ОС.

Создание загрузочного дискаСразу должен сказать, что буду описывать создание за-грузочной дискеты, так как хочу показать одно из преиму-ществ FreeDOS – малый размер и функциональность, хотя все действия можно применить и к компакт-диску, и к жес-ткому диску. Итак, какими функциями должна обладать по-добная ОС на дискете? Конечно, это зависит от задач, но я решил создать «реаниматор» в случае сбоя ОС и тест обо-рудования: значит необходима поддержка распространен-ных файловых систем NTFS и ext2/3, тесты оборудования, работа с usb flash, приводом CD-ROM, небольшие систем-ные утилиты и драйвера. Для «аварийной дискеты», на мой взгляд, этого достаточно.

Для начала скачаем необходимые файлы для загрузоч-ной области и ядра, их три: kernel.sys, command.com, sys.com. Из любой DOS-совместимой системы выполним команду «sys [имя диска:]». Создадим два необходимых конфигу-рационных файла: config.sys, autoexec.bat и подготовим не-обходимые папки и файлы. Драйвера я разместил в папке drivers, а утилиты в utils.

Рисунок 6. Скриншот файла config.sys

Рисунок 7. Скриншот файла autoexec.bat

Page 38: 039 Системный Администратор 02 2006

36

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

С официального сайта ОС скопируем необходимые нам программы: драйвер расширенной памяти himem.exe и верхней emm386.exe. Драйвера мыши – ct-mouse.exe, драйвера CD-ROM – xcdrom.exe, аналог программы mscdex.exe – shcdx33a.com, драйвера UDMA для жестко-го диска. Драйвера USB-шины для DOS мне встретились в двух вариантах: драйвера «duse» я не использовал из-за достаточно крупного размера, поэтому я их не тестиро-вал, а вот драйвера от «Panasonic Communications» с ре-сурса http://johnson.tmfc.net занимали минимальное про-странство и, как это выяснилось позже, стабильно работа-ли. Результаты тестирования FreeDOS на совместимость с программным и аппаратным обеспечением будут пред-ставлены ниже.

Стандартные утилиты: format.exe, mem.exe, fdisk.exe, edit.exe.

Утилит для работы с NTFS и ext2/3 из-под DOS-совмести-мых систем предостаточно в Интернете, но я выбрал утили-ты, занимающие минимальное пространство, это: утилита чтения разделов ext2/3 с сайта http://ext2read.sourceforge.net и утилита ntfs reader c http://www.ntfs.com (утилиты бес-платны).

Утилит для создания виртуальных дисков много, на офи-циальном сайте их около 20, мой выбор давно пал на ути-литу xmsdsk. Почему именно так? Многие из тех пользова-телей, кто в прошлом создавал загрузочные диски, стал-кивался с проблемой определения буквы виртуального диска в системе. Утилита xmsdsk позволяет сразу назна-чать имя диска, что достаточно удобно. Итак, после копи-рования, распаковки и размещения нужных программ на дискете опишем их в конфигурационных файлах config.sys (см. рис. 6) и autoexec.bat (см. рис. 7).

Рассмотрим config.sys немного подробнее. Я решил не создавать меню из псевдографики, так как дискета со-здавалась для определенной цели. Драйвера UDMA под-гружаются всех версий – их загрузка происходит доста-точно быстро, а включаются они на разных жестких дис-

ках. С USB немного сложнее: определение USB Flash длит-ся 3-5 сек., различные драйвера (версии 0, 1, 2, 3) предна-значены для разных наборов чипсетов, поэтому перед за-грузкой каждого драйвера будет задан вопрос, загружать данный драйвер или нет.

Рассмотрим autoexec.bat подробнее. Как я уже писал, xmsdsk позволяет назначать буквенное обозначение име-ни виртуального диска сразу в момент загрузки драйвера, что я и сделал. Обработчик команд (command.com) удобнее сразу переписать на виртуальный диск, для того чтобы по-том можно было работать без дискеты. Остальные парамет-ры, думаю, не требуют дополнительного описания.

Для ускорения работы программ и экономии места на дискете, но в ущерб скорости загрузки системы мож-но запаковать крупные утилиты любым DOS-архиватором, а позже распаковать их на виртуальный диск или для ав-томатизации добавить строку распаковки в autoexec.bat. Например:

Итак, дистрибутив аварийной дискеты собран и готов к работе. Особенностью утилит чтения файловых систем NTFS и ext2/3 является то, что они не «обращают внима-ния» на политики безопасности файловых систем, так как не имеют доступа к системозависимым пользовательским бюджетам, с которыми они создавались. Дополнительно на дискету я записал комплексный тест DR.Hard, для тес-тирования PC. После заполнения дискеты у нас осталось около 200 Кб.

Сравнения и тестыИтак, на официальном сайте FreeDOS написано, что ОС 100%-совместима с MS-DOS приложениями и стабильно работает с оборудованием, проверим эти данные. Я про-вел небольшие тесты на доступном мне ПО и оборудова-нии, результаты представлены ниже.

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

В разных ОС одни и те же утилиты иногда имеют раз-личные названия, были указаны их полные названия в каж-дой ОС, размер утилит указан в Кб. (Caldera Dr-DOS 7.03 последнее обновление в 1999 г.)

Работа с MS-DOS совместимыми приложениямиПроблем с запуском ПО под DOS не возникало, кроме слу-чаев, когда программа наотрез отказывалась работать с драйвером emm или была нехватка базовой памяти, но это стандартные проблемы со специфичным ПО еще с давних времен. Думаю, что стоит отдельно упомянуть, что про-блем с установкой ОС компании Microsoft из-под FreeDOS не возникало.

rawrite -f fd1440.img

FreeDos-утилиты Win98-утилиты Caldera Dr-DOS 7.03

command.com 64,8 command.com 93 command.com 66,7

kernel.sys 43,7 msdos.sys+io.sys 218,8 Ibmdos.com 30,8

sys.com 11,2 sys.com 18,7 sys.com 18,3

Fdisk.exe 37,9 Fdisk.exe 63,1 Fdisk.com 28,1

Himem.exe 8 Himem.sys 32,4 Himem.sys 14,7

Format.exe 30,2 Format.com 48,9 Format.com 23,8

Deltree.com 4,1 Deltree.exe 18,7 Deltree.bat 3

Find.com 4,8 Find.exe 6,5 Find.exe 13,3

Mem.exe 13,9 Mem.exe 31,6 Mem.exe 16,8

shcdx33a.sys 6,7 mscdx.sys 24,9 mwcdex.sys 21,7

emsdsk.exe 19 ramdrive.sys 15 vdisk.sys 4

Label.exe 4 Label.exe 9,2 Label.com 9

attrib.com 5 attrib.exe 15,4 attrib.exe 12,3

chkdsk.exe 35,3 chkdsk.exe 28,5 chkdsk.exe 59,5

edit.exe 59,6 edit.com 70,3 edit.com 103,7

sort.com 4,2 sort.exe 25,8 sort.exe 10,2

Итого 352,4 720,8 435,9

Таблица 1. Размеры утилит различных DOS-систем

Page 39: 039 Системный Администратор 02 2006

37№2, февраль 2006

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

Полезные утилиты от сторонних разработчиков: http://www.egner-online.de/vc – Volkov Commander, од-

на из самых маленьких shell-оболочек. http://www.ritlabs.com/dn – Dos Navigator, еще одна про-

грамма-оболочка. http://www.f-prot.com/index.html – F-Port, антивирус. http://www.hwinfo.com – hwinfo, программа предостав-

ляющая информацию пользователю о аппаратной час-ти PC, обновляемая достаточно часто.

http://www.sysanalyser.com – еще один тест оборудо-вания.

http://www.sysinfolab.com/ru – и еще один небольшой тест оборудования.

http://johnson.tmfc.net – сборник драйверов для USB-ус-тройств и иные утилиты.

Запуск и работа этих программ прошли без проблем.Существует еще огромное количество ПО для DOS,

причем обновляемого до сих пор. На официальном сайте http://www.freedos.org в разделе ссылок можно найти раз-личные дополнительные утилиты и программы для работы с файловыми системами, оборудованием, тесты и многое другое. Я, конечно, просто не в силах протестировать да-же часть доступного на сайте ПО, но думаю, и остальные приложения работать будут стабильно.

Работа с оборудованиемВ ходе тестирования были выявлены некоторые проблемы с совместимостью оборудования, но в целом FreeDOS про-шел и этот тест. Опишу лишь возникшие проблемы на данных PC (см. таблицу 2). Стабильно работали USB Flash: Kingston USB Data Travel 2.0, Neo Flash Drive 1.0, Transcend JetFlash.

После проблем с USB на PC № 3 (см. таблица 2) драй-вера USB-Flash тестировать еще на 10 машинах: определе-ния универсальной последовательной шины и других драй-веров прошло стабильно, за исключением отсутствия под-держки UDMA на некоторых PC.

Общие впечатленияПостараюсь описать все плюсы и минусы, с которыми я столкнулся во время работы с FreeDOS. Итак, плюсы: Поддержка аналога bash-completion: «донабор» имен

каталогов, история набранных команд и другое. Расширен синтаксис описания команд в конфигураци-

онных файлах (config.sys, autoexec.bat). Богатый набор утилит, их компактный размер и функ-

циональность. Приятно видеть, что «старичок» DOS способен на та-

кие вещи как: работа с Flash-памятью, работа с файло-выми системами NTFS, ext2/3 и даже reiserfs, возмож-на и запись в данные файловые системы, но утилиты слишком громоздкие для использования на дискетах.

Поддержка режима UDMA для жесткого диска и CD-ROM. Было сюрпризом увидеть *nix-утилиты в FreeDOS, та-

кие как текстовый редактор vim, браузер lynx, архива-торы gzip, tar и другие программы.

Работает поддержка TCP/IP, хотя еще и на слабом уров-не, но для доступа к FTP с дистрибутивами FreeDOS вполне способна.

Но были и проблемы: Как видно из теста, возможны некоторые затруднения

с определением USB Flash-памятью в FreeDOS. Были проблемы с стандартным драйвером atapicdd.

sys – на одной машине он не читал диски, на другой оп-ределял один CD-ROM как два устройства, но драйвер xcdrom.sys работал стабильно.

Был конфликт драйверов UDMA для жесткого диска и CD-ROM (xcdrom.sys), причем система просто и скром-но сообщала «kernel panic:...», все решилось заменой драйверов UDMA для жесткого диска.

Также из трех представленных на сайте утилит format – одна форматировала дискеты через раз, пришлось ее заменить.

Доступная на сайте утилита scandisk очень часто «вис-ла», но ее также успешно можно заменить.

Самой большим неудобством было то, что при выни-мании USB Flash из гнезда и установки обратно Flash не определялась.

После инсталляции полного дистрибутива систе-мы русская кодовая страница иногда неправильно устанавливается, рекомендую проверить значения в fdconfig.sys:

И в autoexe.bat две команды:

В принципе это все серьезные проблемы, которые я встречал при исследовании готовых дистрибутивов и сборки собственного из сторонних утилит.

ВыводыВ данном обзоре я не мог охватить все стороны ОС FreeDOS, но постарался описать, на мой взгляд, его основ-ные возможности. Данная ОС, по-моему, подходит для со-здания «аварийных дисков», начальных загрузчиков, при-чем может работать как на новом, так и старом оборудо-вании. Радует то, что проект развивается, осуществляется исправление ошибок, оптимизируется код программ, вво-дятся новые возможности.

Чтож, посмотрим, какие еще возможности появятся в данной ОС в будущем, на этом я заканчиваю свой об-зор.

Оборудование Проблемы

Ip1 166mmx/16simm/cdrom GoldStar 4x/hdd 1g quantum Все ОК

Amd k6-500/256dimm/dvd-rom Samsung/hdd 5g quantum/usb

Все ОК

Ip2 433cel/192dimm/hdd 10g seagate/usb USB Flash не заработала

Ip3 1.1g cel/256dimm/cd-rom MSI/hdd 40g seagate/usb Все ОК

Ip4 2.1g cel/256ddr/cd-rw Toshiba/hdd 40g samsund/usb Режим udma не заработал

Amd k7-1.7g atlonXP/265ddr/cd-rom LG+cd-rw LG/hdd 120g samsung+wd160g/usb

Все ОК

Amd k7-2.5g Barton/512ddr/dvd-rw nec/sata raid на логи-ке sil3112 120+160wd/usb

Режим udma не заработал

Таблица 2. Тест на совместимость с «железом»

COUNTRY=007,866,C:\FDOS\BIN\COUNTRY.SYS

SET CODEPAGE=866MODE CON CP PREP=((866) C:\FDOS\cpi\EGA3.CPX)

Page 40: 039 Системный Администратор 02 2006

38

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

Практикум Python:обрабатываем входящую электронную почту

«Хороший сисадмин – ленивый сисадмин». Если что-то можно сделать вручную, то почти наверняка это же можно и автоматизировать. Вопрос лишь в соотношении цена/качество, которым определяется целесообразность разработки очередного скрипта.

Сергей Супрунов

Page 41: 039 Системный Администратор 02 2006

39№2, февраль 2006

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

Если говорить об автоматизации процессов админис-трирования, то более точно будет говорить о соот-ношении «время на разработку/экономия времени

в дальнейшем». Лично для меня наилучшее значение до-стигается при использовании языка Python.

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

Постановка задачиИтак, есть почтовый сервер: FreeBSD + Sendmail + ClamAV, остальное в данном случае не важно.

ClamAV выполняет проверку всей входящей корреспон-денции на вирусы и, помимо всего прочего, отсылает уве-домления об обнаруженных вирусах на адрес postmaster. Проблема заключается в том, что администратору (для оп-ределённости будем считать, что он получает почту на ад-рес admin, что достигается соответствующей настрой-кой в /etc/mail/aliases) приходится обрабатывать достаточ-но большое число таких уведомлений. В то же время, они позволяют следить за вирусной активностью на вверен-ном узле, так что отказываться от такой информации не-желательно.

Таким образом, требуется снизить нагрузку на адми-нистратора без потери накапливаемой в процессе рабо-ты статистики.

Анализ проблемыПопробуем решить данную задачу путём формирования ежедневных «дайджестов», отражающих вирусную актив-ность за прошедшие сутки. Интересовать нас будет коли-чество обнаруженных вирусов с разбивкой по их назва-ниям.

Очевидно, что наиболее простым и в принципе более правильным решением было бы отключить уведомления на postmaster и просто обрабатывать log-файлы, форми-руемые в процессе работы.

Однако мы пойдём другим путём, чтобы рассмотреть на практике один из достаточно полезных приёмов: поп-робуем обрабатывать всю поступающую на postmaster поч-ту, что называется, «на лету». Поскольку на данный адрес идёт почта не только от ClamAV, нам нужно перехватывать только интересующие нас уведомления, а всё остальное без изменений пересылать администратору (в нашем при-мере, на адрес admin).

Идеи по реализацииНаиболее удобным выглядит перенаправление почты на вход скрипта-обработчика путём создания канала (pipe), что можно реализовать с помощью псевдонимов (aliases). Например, если в файле /etc/mail/aliases добавить такую строку:

то вся почта, поступающая на указанный адрес, будет передаваться на стандартный вход (STDIN) сценария

maildigest.py. На время тестирования можно будет не пе-реправлять, а дублировать почту на скрипт, оставив в ка-честве получателя и прежнего пользователя (чтобы избе-жать потери почты):

Получая очередное сообщение на обработку, сценарий должен будет проверить, не является ли оно уведомлени-ем от ClamAV (будем контролировать два параметра: тему сообщения и тег заголовка «Auto-Submitted»). Если являет-ся, то обрабатываем его и записываем результат в некото-рый файл (о формате пока не думаем). Если же это какое-то другое письмо, то положим его сразу в почтовый ящик пользователя admin. При необходимости изменить имя получателя его можно будет подправить непосредствен-но в коде сценария (не совсем «академическое» решение, но оно позволяет упростить код, не разбрасываясь на об-работку параметров).

Небольшое исследованиеСначала давайте посмотрим, в каком виде сообщения пос-тупают на вход сценария, а заодно проверим, с какими пра-вами наш сценарий исполняется (эта информация нам по-надобится в дальнейшем для решения проблемы переда-чи «прочей» почты пользователю admin).

Для этого напишем небольшой сценарий (как определе-но в aliases, сохраним его под именем maildigest.py, не за-быв установить права на исполнение):

Здесь мы всё, что поступает на стандартный вход (дескриптор определён в sys.stdin), записываем в файл mail.txt. Сюда же добавляем строчку, возвращающую иден-тификатор текущего пользователя, для чего воспользуем-ся функцией os.popen(), которая создаёт канал между сце-нарием и системной командой (в нашем случае это коман-да id). На первых порах нужно разрешить любому пользо-вателю создавать файлы в каталоге /var/scripts/maildigest.

В итоге получим примерно следующее (часть полей за-головка за ненадобностью не показана):

Практикум Python:обрабатываем входящую электронную почту

postmaster: “| /usr/local/scripts/maildigest/maildigest.py”

postmaster: admin, “| /usr/local/scripts/maildigest ↵ /maildigest.py”

Листинг 1. Первый эксперимент

#!/usr/local/bin/python

import os, sysmail = sys.stdin.read()fd = open('/var/scripts/maildigest/mail.txt', 'w')fd.write(mail)fd.write(os.popen('id').read())fd.close()

From [email protected] Fri Feb 17 10:00:07 2006[. . .]Date: Fri, 17 Feb 2006 09:53:41 +0300 (MSK)Message-Id: <[email protected]>From: [email protected]: [email protected]: auto-submitted (antivirus notify)Subject: Virus interceptedX-Virus-Scanned: ClamAV 0.88/1291/Thu Feb 16 23:15:09 2006 on mydomain.ruX-Virus-Status: Clean[. . .]

The message k1H6rBq7047195 sent from <[email protected]> to <[email protected]>contained Worm.SomeFool.P and has not been delivered.uid=26(mailnull) gid=26(mailnull) groups=26(mailnull)

Page 42: 039 Системный Администратор 02 2006

40

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

Распознавать уведомления ClamAV будем по призна-кам, которые в приведённом выше выводе выделены красным шрифтом (можно ограничиться и каким-то од-ним, но лучше перестраховаться). Интересующая нас ин-формация об обнаруженном вирусе содержится в предпос-ледней строке. Ну и в самом конце выводится информа-ция о том, что работа сценария идёт от имени пользовате-ля mailnull, так что теперь можно ужесточить права на ка-талог /var/scripts/maildigest.

Вопросы доставкиКак видите, сообщение мы получаем в том виде, в каком оно будет в дальнейшем помещено в почтовый ящик пользова-теля. Обработать его проблем не составит – задействуем модуль rfc822, содержащий методы для разбора заголов-ков. А вот о чём придётся подумать, так это о том, как по-ложить «транзитное» письмо в ящик пользователю. Мож-но, конечно, воспользоваться протоколом SMTP, но при на-личии уже сформированного сообщения формировать его заново выглядит не очень разумным. К тому же есть риск зациклить обработку письма. Попробуем воспользоваться услугами локального агента доставки (LDA).

Хорошо бы просто отдавать сообщение на вход mail.local (LDA, используемый во FreeBSD по умолчанию). Здесь мы упираемся в то, что для выполнения своей работы mail.local должен запускаться с правами пользователя root.

Обойти это можно, установив на mail.local бит suid, од-нако поскольку такие права нужны нам для решения част-ной задачи, то более правильно будет создать копию аген-та доставки с нужными правами, а оригинальный файл не трогать:

Проведём ещё один эксперимент:

Напомню, что все тестовые сценарии мы сохраняем под именем maildigest.py, чтобы не вносить каждый раз из-менения в /etc/mail/aliases.

Здесь с помощью той же функции popen() создается ка-нал с утилитой mail.local.suid, на вход которой передается текст сообщения, сохранённого в файле в результате пре-дыдущего эксперимента. Пользователя-получателя ука-зываем явно (admin). В принципе этот сценарий можно вы-полнить и непосредственно из командной строки, но луч-ше использовать тот же способ запуска через aliases, что-бы лишний раз убедиться в отсутствии проблем с правами доступа и переменными окружения.

Отправив тестовое сообщение на postmaster, убежда-емся, что доставка выполняется нормально, естественно,

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

Сбор статистики и формирование «дайджеста»Информация об обнаруженном вирусе (его название) со-держится в последней строчке уведомления (если быть точ-нее, то в предпоследней, а последняя – пустая). Если эту строку разбить по пробелам, то нужное нам имя получим во втором поле.

Учитывая, что на моём сервере больших нагрузок не предвидится, для хранения результата я выбрал фор-мат DBM.

В стандартную поставку Python включён модуль anydbm, который самостоятельно определяет, какая именно реали-зация DBM используется в вашей системе, так что об этом нам заботиться не придётся. Данные в этом формате хра-нятся в виде пар «имя – значение». Единственный его не-достаток в нашем случае – это то, что он позволяет хранить только текстовые данные, т.е. придётся в процессе работы выполнять преобразования сохранённого значения, отра-жающего количество обнаруженных вирусов данного типа, из строки в число и обратно.

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

Наконец, при смене даты нам нужно будет формиро-вать и отправлять сводный отчёт за прошедшие сутки. Поскольку отчёт предназначается локальному пользова-телю, то проще всего будет сформировать «вручную» со-общение с нужными заголовками и воспользоваться тем же LDA для его доставки.

РеализацияИтак, приступим к разработке сценария. Чтобы сохранить целостность восприятия, полностью приведу прокоммен-тированный текст скрипта, а ниже дам некоторые пояс-нения.

Листинг 3. Сценарий maildigest.py

#!/usr/local/bin/python# -*- coding: koi8-r -*-

# Импортирование нужных модулейimport os, sys, rfc822, anydbmfrom StringIO import StringIOfrom time import ctime, strftime

# «Родительские» каталоги для размещения файловprefix_bin = '/usr/local/scripts/maildigest/'prefix_var = '/var/scripts/maildigest/'

# Команда доставки сообщения --lda_command = prefix_bin + 'mail.local.suid admin'

# Текущее имя db-файла (зависит от текущей даты)mdfile = prefix_var + 'md' + strftime('%Y%m%d')

# Файл хранит имя следующей для обработанной базыnext = prefix_var + '.next'

# Функция формирования и отправки «дайджеста»def send_digest(fn=mdfile): # Здесь ошибку не проверяем, поскольку всё равно # работу сценария придётся прерывать

# cd /usr/local/scripts/maildigest/# cp /usr/libexec/mail.local mail.local.suid# chmod 4555 mail.local.suid

Листинг 2. Второй эксперимент

#!/usr/local/bin/python

import osprefix_bin = '/usr/local/scripts/maildigest/'prefix_var = '/var/scripts/maildigest/'lda_command = prefix_bin + 'mail.local.suid admin'

mail = open(prefix_var + 'mail.txt', 'r').read()os.popen(lda_command).write(mail))

Page 43: 039 Системный Администратор 02 2006

41№2, февраль 2006

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

На всякий случай напомню, что блоки кода в Python за-даются с помощью отступов. В принципе всё должно быть понятно. Пояснения требует разве что использование пе-ременной lda в функции send_digest(). В первой строке мы присваиваем этой переменной ссылку на метод write(), который применяется к каналу, созданному для коман-ды, определённой в lda_command. В дальнейшем мы мо-жем использовать функцию lda() как замену конструкции os.popen(lda_command, 'w').write().

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

Теперь вместо десятков уведомлений администратор будет получать одно письмо в день, отражающее вирус-

ную активность на почтовом сервере за истекшие сутки (см. рис. 1).

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

Во-первых, можно реализовать автоматический раз-бор входящей почты (когда сообщения со словом «Дого-вор» в теме направляются в абонентский отдел, а со сло-вом «Счёт» – в бухгалтерию). Заодно можно организовать функцию автоматического ответа, когда отправитель со-общения будет получать уведомление, что его письмо по-лучено и передано на обработку Иванову Ивану Иванови-чу (ещё одно последствие борьбы со спамом, когда прихо-дится подтверждать доставку почти каждого важного пись-ма, чтобы убедиться, что оно не попало под «жернов» од-ного из фильтров).

Во-вторых, обработка входящих сообщений позволяет при определённой доле осторожности и «разумности» ис-пользовать электронную почту для управления каким-ли-бо сервисом путём отправки команд в теле или теме со-общения на определённый адрес (только не используйте этот механизм для создания учётных записей и перезаг-рузки сервера!).

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

lda = os.popen(lda_command, 'w').write

# Формируем необходимые заголовки lda('From: maildigest\r\n') lda('To: [email protected]\r\n') lda('Date: %s\r\n' % ctime()) lda('Subject: Virus digest\r\n') lda('\r\n')

# Фомируем отчёт lda('Вирусная активность за %s\r\n\r\n' % fn[-8:]) lda('%-30s | %3s\r\n' % ('Имя вируса', 'К-во')) lda('-' * 38 + '\r\n') try: d = anydbm.open(fn) total = 0 for i in d.keys(): lda('%-30s | %3s\r\n' % (i, d[i])) total += int(d[i]) lda('-' * 38 + '\r\n') lda('%-30s | %3d\r\n’ % ('ИТОГО', total))

# Записываем в .next следующую базу open(next, 'w').write(mdfile)

except: lda('Ошибка формирования дайджеста для %s\r\n' % fn)

# Считываем поступившее сообщение...mail = sys.stdin.read()# ...и разбираем его «по косточкам»message = rfc822.Message(StringIO(mail))

# Если в заголовке есть указанные поля с указанными# значениями, то считываем имя вируса и увеличиваем# для него счётчикif (message.getheader('Subject') == 'Virus intercepted' and message.getheader('Auto-Submitted') == 'auto-submitted (antivirus notify)'): try: # Первый «сплит» выделяет предпоследнюю строку # (последняя - пустая), а второй - второе поле

строки virusname = mail.split('\n')[-2].split(' ')[1] except: virusname = 'Format error' stat = anydbm.open(mdfile, 'c') if stat.has_key(virusname): stat[virusname] = str(int(stat[virusname]) + 1) else: stat[virusname] = '1'else: os.popen(lda_command, 'w').write(mail)

# Если в next-файле записано имя «прошлой» базы,# то отсылаем дайджестif os.path.isfile(next): mdf = open(next, 'r').read(len(prefix_var) + 10) if mdfile != mdf: send_digest(mdf)else: open(next, 'w').write(mdfile)

Рисунок 1. Примерно так выглядят формируемые отчёты

Page 44: 039 Системный Администратор 02 2006

42

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

но с ошибками в интерпретаторе Perl. Больше того, мы скоро убедимся в том, что интерпретатор «знает» о возник-шем замыкании и может уведомить вас, если вы того хотите.

Почему же память освобождает-ся не сразу после исчезновения пере-

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

менной? Чтобы ответить на этот воп-рос, надо сказать пару слов о системе сборки мусора, которой оснащён Perl. Он автоматически освобождает фраг-менты памяти, на которые нет ссылок. Переменная может исчезнуть, но ссыл-ка может остаться, тогда Perl не осво-

Замыкания в Perl

Замыкания являются одной из тех особенностей Perl, которые редко встретишь в других языках программирования. Да и программисты на Perl зачастую не вдаются в такие дебри. Напрасно. Вы можете не иметь прав и автомобиля, не желать стоять в пробках, но правила дорожного движения должен знать каждый. Точно так же, даже если вы не используете замыканий, знать о них весьма полезно.

Алексей Мичурин

Page 45: 039 Системный Администратор 02 2006

43№2, февраль 2006

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

ние 1, осталась нетронутой, как и са-мо значение.

Подобная ситуация возникает и при замыкании: временной пере-менной уже нет, но память не осво-бождена. Однако замыканиями при-нято называть более узкий круг «яв-лений». К ним нас приближает следу-ющий пример:

Суть того, что мы сделали, состоит в следующем. Мы создали блок (стро-ки 2-9) и в нём определили локальную переменную $t. В этом же блоке со-здана функция f, которая использует переменную $t. Функция может изме-нять значение переменной $t (если вы-звать её с аргументом) и печатает ин-формацию об этой переменной (адрес и значение). Далее мы вызываем фун-кцию f в строках 10-12, то есть за пре-делами блока, в котором существова-ла переменная $t. Сможет ли функция f нормально работать, ведь, казалось бы, переменной $t уже нет?

Давайте посмотрим на результат работы этой программы:

Как видите, несмотря на то, что за пределами блока (строки 10-12) пе-ременная $t исчезла и явных ссылок на неё не осталось, память не освобо-дилась, а значение сохранилось. Что-бы убедиться, что с этой памятью мож-но работать, мы поменяли хранящееся в ней значение с 10 на 20.

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

бодит память до тех пор, пока не ис-чезнет последняя ссылка.

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

Perl устроен иначе. В нём не может существовать неправильной ссылки, но за это приходится платить неосво-бождённой памятью.

Давайте проиллюстрируем сказан-ное простым примером:

Результат работы этого кода таков:

Выполнение программы начинает-ся с вызова функции f в седьмой стро-ке. В теле функции создаётся времен-ная переменная $v, печатается её ад-рес и значение. Функция возвращает указатель на переменную $v и завер-шает работу. После этого переменная $v пропадает. Но корректней было бы сказать не «переменная пропадает», а «имя становится недоступно». Пото-му что значение переменной $v по-пре-жнему хранится в памяти. Мы больше не можем обратиться к этому значе-нию по имени $v, но указатель на эту область памяти присвоен переменной $a, он существует, а значит Perl не ос-вободит память, занятую ранее пере-менной $v.

Чтобы окончательно убедиться в этом, напечатаем значения пере-менной $a и разименуем этот указа-тель в строке 8. Сравните первую и вто-рую строки вывода программы. Пер-вая напечатана, когда переменная $v ещё существовала. Вторая – когда пе-ременной $v уже не было. Но, как ви-дите, память, выделенная под значе-

Если вы поняли, как и почему рабо-тает этот пример, то взгляните на об-разчик классического замыкания:

По сути, этот пример очень похож на предыдущий. Блок операторов те-перь стал телом функции gen. Вместо переменной $t в нём созданы две ло-кальные переменные $name и $count. Внутри же создаётся не именован-ная функция, как это было в преды-дущем примере (там мы создава-ли функцию f), а анонимная функция, указатель на которую мы возвраща-ем как результат работы функции gen. Эта «вложенная» функция, как и в пре-дыдущем примере, использует ло-кальные переменные, которые были объявлены вне её тела и которые бу-дут не видны в основной программе – за пределами функции gen. Таким об-разом, суть выполняемых операций не изменилась. Единственное при-нципиальное отличие состоит в том, что раньше наш блок выполнялся толь-ко единожды, а теперь мы можем вы-зывать функцию gen многократно.

Фактически функция gen является генератором функций. Больше того, ге-нерируемые функции используют пе-ременные, которые локальны для gen, но не для самих этих функций. Поэто-му переменные $name и $count не ис-чезают бесследно после окончания работы функции gen – они сохранят-ся интерпретатором Perl для дальней-шего использования. Как вы понимае-те, эти переменные сохранят свои зна-чения и между вызовами полученных анонимных функций.

Так что же делает этот код? В стро-ке 6 мы вызываем генератор. Внутри функции gen инициализируются две локальные переменные $name (зна-чением CntA) и $count (значением 10). Там же создаётся анонимная функция-счётчик, использующая эти перемен-ные, указатель на неё возвращается и присваивается переменной $a. Пос-

1: #!/usr/bin/perl2: sub f {3: my $v=shift;4: print 'f: \$v='.\$v.' ↵ $v='.$v."\n";5: return \$v;6: }7: my $a=f(1);8: print ' $a='.$a.' ↵ $$a='.$$a."\n";

f: \$v=SCALAR(0x8057b2c) $v=1 $a=SCALAR(0x8057b2c) $$a=1

$t=10 \$t=SCALAR(0x8057ae4)f: $t=10 \$t=SCALAR(0x8057ae4)f: $t=20 \$t=SCALAR(0x8057ae4)f: $t=20 \$t=SCALAR(0x8057ae4)

1: #!/usr/bin/perl 2: sub gen { 3: my ($name, $count)=@_; 4: return sub { print ↵ ("$name: ".$count++."\n") } 5: } 6: my $a=gen('CntA', 10); 7: my $b=gen('CntB', 20); 8: &$a(); 9: &$a();10: &$b();11: &$b();12: &$a();

1: #!/usr/bin/perl 2: { 3: my $t=10; 4: print ' $t='.$t.' ↵ \$t='.\$t."\n"; 5: sub f { 6: $t=shift if (@_); 7: print 'f: $t='.$t.' ↵ \$t='.\$t."\n"; 8: } 9: }10: f();11: f(20);12: f();

Page 46: 039 Системный Администратор 02 2006

44

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

Perl не настолько «прост», он не стал создавать две одинаковые функции, он дважды вернул ссылки на один и тот же код.

Локальная переменная $v в этом примере создана только для того, что-бы лучше читалась преемственность этого и других примеров.

Теперь чуть изменим этот пример. Пусть анонимная функция будет ис-пользовать локальную переменную:

Мы получили классическое замы-кание:

При двух вызовах gen дважды бы-ла создана локальная переменная $v; каждый раз новая в новой области па-мяти, о чём свидетельствуют первые две строки вывода программы. И дваж-ды родилась новая функция. Как види-те, и поведение, и адреса двух получен-ных анонимных функций отличаются. Собственно, такой пример мы уже ви-дели в предыдущем разделе, но здесь я хотел подчеркнуть, что мы получили именно две разные функции.

Давайте рассмотрим, что будет, ес-ли генератор будет создавать имено-ванную функцию. Ещё чуть-чуть изме-ним пример:

Может показаться, что никаких при-нципиальных изменений мы не сдела-

ле окончания работы gen имена $name и $count исчезают.

В строке 7 мы вызываем генера-тор повторно. Внутри функции снова создаются две локальные перемен-ные. Обратите внимание, они созда-ются заново и память для них отводит-ся новая(!). Им присваиваются соот-ветствующие значения ($name='CntB', $count=20), создаётся новая аноним-ная функция, которая будет использо-вать уже эти новые значения, указа-тель на функцию возвращается, а gen завершает работу, и имена $name и $count снова уходят в небытие.

В результате вызовов полученных функций в строках 8-12 мы видим сле-дующий вывод:

Мы получили два независимых счётчика, инициализированных раз-ными значениями.

Надеюсь, что с переменными не-ожиданностей уже нет. Мы уже рас-смотрели достаточно примеров. Да-вайте теперь изучим более тонкий вопрос: когда и как создаётся новая функция.

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

Здесь вложенная функция не со-держит ссылок на локальные перемен-ные. Но мы вызываем функцию gen дважды, и дважды же создаём ано-нимную функцию. Будут ли созданы две абсолютно одинаковые аноним-ные функции?

Взгляните на вывод:

ли. Просто раньше мы сразу возвра-щали указатель на функцию, а теперь мы сперва создаём функцию t (стро-ка 5), а потом возвращаем указатель (строка 6). Но это «незначительное» изменение коренным образом изме-нит результат:

Как видите, функция t была созда-на только при первом вызове gen. При повторном вызове функция t не была ни клонирована, ни изменена.

Любопытное поведение? Мы ещё вернёмся к рассмотрению этого слу-чая, а пока сделаем вывод, что замы-кание сопровождается рождением но-вой функции только при создании ано-нимных функций – только во втором из рассмотренных примеров.

Обратите также внимание на раз-ницу в «поведении» функций и пере-менных, вызванную тем, что функция всегда глобальна, а все наши перемен-ные локальны. (Кстати, сейчас широ-ко обсуждается возможность создания локальных функций; так что, возможно, в шестой версии Perl мы сможем напи-сать что-то вроде my sub f {...}.)

Нежелательные последствия замыканийСперва скажу несколько слов о том, когда же замыкания могут возникнуть без вашего ведома, «сами».

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

Существует множество задач, тре-бующих, чтобы Perl-код компилировал-ся только один раз, но мог выполняться многократно. Эта возможность будора-жит умы Perl-программистов, наверное, с первых дней появления Perl. Самая из-вестная среда, в которой реализован такой подход – mod_perl. (В этой статье я буду говорить о mod_perl, имея в виду, в основном, только один его компонент – Apache::Registry, который широко при-меняется для переноса обычных CGI-скриптов в mod_perl-окружение.) Там скорость выполнения CGI-приложений увеличивается многократно, благодаря

gen: \$v=SCALAR(0x8057b2c) $v=1gen: \$v=SCALAR(0x8057d18) $v=2CODE(0x805716c)1 ok.CODE(0x8057d0c)2 ok.

1: #!/usr/bin/perl 2: sub gen { 3: my $v=shift; 4: print 'gen: ↵ \$v='.\$v.' $v='.$v."\n"; 5: sub t {print "$v ok.\n"} 6: return \&t; 7: } 8: my $a=gen(1); 9: my $b=gen(2);10: print $a."\n";11: &$a();12: print $b."\n";13: &$b();

gen: \$v=SCALAR(0x8057b2c) $v=1gen: \$v=SCALAR(0x805728c) $v=2CODE(0x8057bc8)1 ok.CODE(0x8057bc8)1 ok.

1: #!/usr/bin/perl 2: sub gen { 3: my $v=shift; 4: print 'gen: ↵ \$v='.\$v.' $v='.$v."\n"; 5: return sub {print "$v ok.\n"} 6: } 7: my $a=gen(1); 8: my $b=gen(2); 9: print ($a."\n");10: &$a();11: print ($b."\n");12: &$b();

CntA: 10CntA: 11CntB: 20CntB: 21CntA: 12

1: #!/usr/bin/perl 2: sub gen { 3: my $v=shift; 4: return sub {print "ok.\n"} 5: } 6: my $a=gen(1); 7: my $b=gen(2); 8: print ($a."\n"); 9: &$a();10: print ($b."\n");11: &$b();

CODE(0x8057bbc)ok.CODE(0x8057bbc)ok.

Page 47: 039 Системный Администратор 02 2006

45№2, февраль 2006

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

Если мы запустим её дважды, то увидим вполне закономерный и предсказуемый результат:

По три строчки от каждого из двух вызовов.

Но давайте представим, что эта программа оказалась в контексте, аналогичном тому, который создаёт mod_perl:

Справедливости ради следует от-метить, что здесь я несколько упростил ситуацию. В реальной жизни приходит-ся избегать конфликтов имён, поэто-му вместо простой функции в mod_perl, точнее в модуле Apache::Registry, ис-пользуются методы, разнесённые в разные пространства имён – как бы в разные модули.

Теперь мы компилируем нашу программу единожды, а выполняем, как и ранее, дважды. Какой же резуль-тат нас ожидает? Неподготовленного человека он может обескуражить:

Если вы тоже обескуражены, то вернитесь к концу предыдущего раздела и сравните этот код с при-мером, который мы обсуждали там. По сути мы имеем одно и то же. Здесь функция incr тоже будет создана толь-

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

Как же реализуется подобное од-норазовое компилирование и много-кратные запуски? В большинстве слу-чаев – очень просто: тело программы включается внутрь некой функции, ко-торая потом может вызываться мно-гократно, естественно, без повторной компиляции, выполняя всё, что долж-на была делать программа.

Поясню на примере. Допустим, у вас есть программа:

«Кэшировать» её можно следую-щим образом:

Подобный подход обладает мас-сой известных ограничений. Например, в программах нельзя использовать конструкции __END__ и __DATA__, вызывать функции типа exit, осторож-но надо обращаться с глобальными переменными $^T, %ENV, $/ и прочи-ми, не злоупотреблять модификато-ром /o в регулярных выражениях, ак-куратно работать с файлами... Многие «оплошности», вполне простительные в обычных условиях, способны вызвать странные ошибки при работе програм-мы в mod_perl-образном контексте. Но больше всего недоразумений вы-зывают замыкания.

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

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

Взгляните на следующую про-грамму:

ко при первом запуске run. При повтор-ном вызове run, incr никак не изменит-ся, Perl, фактически, просто проигно-рирует строку 4.

Это, наверное, самые неприятные сюрпризы, возникающие из-за замы-каний. С точки зрения Perl, никаких ошибок и нет, поэтому Perl просто вы-полняет то, что написано. Ни опция -w, ни прагма strict не помогут вам обна-ружить эту ошибку.

Однако Perl имеет средства, позво-ляющие это сделать. Их мы ещё рас-смотрим.

А сейчас давайте вернёмся к утеч-кам памяти. Perl достаточно «умён», чтобы не допустить никаких утечек. Если ссылка на функцию пропада-ет, то Perl удалит из памяти не толь-ко код, но и все переменные, замкну-тые на него.

В следующем примере никаких уте-чек не будет:

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

Не будет утечки в следующем при-мере:

Здесь мы сохраняем указатель на анонимную функцию, но в локаль-ной переменной. Как только перемен-ная исчезает – уничтожается и функ-ция со всеми её замыканиями.

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

Можно, конечно, обеспечить утеч-ку памяти, но это происходит толь-ко в совсем экзотических ситуациях. Вот пример:

1: #!/usr/bin/perl2: print "ok.\n";

1: #!/usr/bin/perl2: sub run {3: #!/usr/bin/perl4: print "ok.\n";5: }6: # далее, сколько угодно7: # вызовов функции run

1: #!/usr/bin/perl2: my $c=1;3: sub incr ↵ { print('$c='.$c++."\n") }4: incr();5: incr();6: incr();

$c=1$c=2$c=3$c=1$c=2$c=3

1: #!/usr/bin/perl 2: sub run { 3: my $c=1; 4: sub incr ↵ { print('$c='.$c++."\n") } 5: incr(); 6: incr(); 7: incr(); 8: } 9: print "step 1:\n";10: run();11: print "step 2:\n";12: run();

step 1:$c=1$c=2$c=3step 2:$c=4$c=5$c=6

1: #!/usr/bin/perl2: 3: sub a {4: my $v=0;5: sub b { $v=1 }6: }7: 8: while (1) {a}

1: #!/usr/bin/perl2: 3: sub a {4: my $v=0;5: return sub { $v=1 }6: }7: 8: while (1) { my $f=a() }

Page 48: 039 Системный Администратор 02 2006

46

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

Здесь мы замыкаем переменную $v и ей же присваиваем ссылку на за-мыкающую функцию. То есть, пока су-ществует функция, будет существо-вать и переменная (как обычно: бу-дет существовать не имя переменной, а значение). Но пока будет существо-вать переменная, не исчезнет и функ-ция. Таким образом сама функция яв-ляется гарантом своего вечного су-ществования.

Если вы запустите эту программу, то уже через несколько минут (или да-же секунд) почувствуете острую не-хватку памяти.

Только в последнем примере мы получили полноценную утечку памя-ти. Возможна ли такая патологичес-кая ситуация в реальной жизни? В ре-зультате ошибки – конечно. При орга-низации рекурсий – возможно. Но ес-ли рекурсия организована правильно и вовремя останавливается, то и по-добная ситуация не возникнет.

Понятно, что такого рода утечки мо-гут быть вызваны и более сложными связями. Например, в функции может использоваться хэш, в одном из эле-ментов которого хранится ссылка на массив, в котором хранится ссылка на функцию. Могут возникать ситуации, когда набор функций A обеспечивает сохранность функций B, а те, в свою очередь, отвечают взаимностью. Фан-тазировать можно бесконечно, но суть везде остаётся одной и той же.

Тем не менее я бы не стал преувели-чивать опасность утечек памяти из-за замыканий. Конструкцию, приведён-

Этот пример можно сделать более изящным, если использовать прототи-пы функций:

Можно непосредственно рабо-тать с элементами массива аргумен-тов @_. Это тоже позволяет изменить «внешние» переменные:

Все эти приёмы позволяют пол-ностью отказаться от использования внешних переменных в теле функций. Это наиболее предпочтительная до-ктрина разработки.

Если же от работы с глобальными переменными отказаться нельзя (труд-но? лениво?), то можно использовать не my-переменные, а our-переменные. Давайте чуть модифицируем наш при-мер, имитирующий работу в mod_perl-контексте:

Теперь он будет выдавать «пра-вильный» результат:

Аналогичного эффекта можно до-стичь, если использовать простые гло-бальные переменные:

ную в последнем примере, трудно на-звать распространённой.

Диагностика замыканийКак мы видели только что, наиболее неожиданные и неприятные эффек-ты вызывают замыкания в именован-ных функциях. Именно такие замы-кания позволяет отследить прагма diagnostics. Я бы советовал обязатель-но добавлять строку:

во все скрипты, которые могут запус-каться через mod_perl или другой кэ-ширующий механизм. Кстати, если вы компилируете mod_perl самостоятель-но, очень рекомендую задать опцию «PERL_DEBUG=1», тогда вся диагнос-тическая информация будет выдавать-ся и без прагмы diagnostics.

При включённой диагностике и при замыкании в именованной функ-ции Perl выдаёт весьма развёрнутое объяснение ситуации (рис. 1).

Если вы возьмёте на себя труд пе-ревести это послание, то обнаружите, что в нём просто кратко изложены ос-новные мысли этой статьи.

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

Если вы хотите изменить в те-ле функции значение «внешней» пе-ременной, то можете воспользовать-ся одним из множества средств, пре-доставляемых Perl. Можно передать ссылку на внешнюю переменную:

Variable "$tmp" will not stay shared at ./example.pl line 7 (#1) (W closure) An inner (nested) named subroutine is referencing a lexical variable defined in an outer subroutine.

When the inner subroutine is called, it will probably see the value of the outer subroutine’s variable as it was before and during the *first* call to the outer subroutine; in this case, after the first call to the outer subroutine is complete, the inner and outer subroutines will no longer share a common value for the variable. In other words, the variable will no longer be shared.

Furthermore, if the outer subroutine is anonymous and references a lexical variable outside itself, then the outer and inner subroutines will never share the given variable.

This problem can usually be solved by making the inner subroutine anonymous, using the sub {} syntax. When inner anonymous subs that reference variables in outer subroutines are called or referenced, they are automatically rebound to the current values of such variables.

Рисунок 1. Perl выдаёт весьма развёрнутое объяснение ситуации

my $a=0;sub incr { my $v=shift; $$v++;}incr \$a;

my $a=0;sub incr (\$) { # <- прототип my $v=shift; $$v++;}incr $a; # <- слэш больше # не нужен

my $a=0;sub incr { $_[0]++;}incr $a;

1: #!/usr/bin/perl 2: sub run { 3: our $c=1; # <-- my заменено # на our 4: sub incr ↵ { print('$c='.$c++."\n") } 5: incr(); 6: incr(); 7: incr(); 8: } 9: print "step 1:\n";10: run();11: print "step 2:\n";12: run();

step 1:$c=1$c=2$c=3step 2:$c=1$c=2$c=3

1: #!/usr/bin/perl2: sub a ↵ { my $v; $v = sub { $v = 1 } }3: a() while (1);

use diagnostics;

Page 49: 039 Системный Администратор 02 2006

47№2, февраль 2006

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

Здесь функция new создаёт две анонимные функции: первая – увели-чивает счётчик, вторая – печатает зна-чение счётчика.

Каждая создаваемая пара функ-ций отличается шагом счётчика ($step), который задаётся как аргумент «конс-труктора» new при создании нового счётчика. Все создаваемые счётчи-ки, естественно, работают независи-мо друг от друга.

Мы создаём две пары функций (два счётчика; строки 8, 9). Печатаем зна-чения счётчиков (строки 10, 11). По два раза для каждого счётчика делаем ин-кремент (строки 12-15). И снова полу-чаем значения счётчиков.

Запустив программу, можно убе-диться, что всё работает правильно:

Этому коду можно придать и более объектно-ориентированный вид:

Здесь функция new возвраща-ет не две функции, а хэш, состоя-щий из пары функций, которые нам уже хорошо знакомы. То есть мы со-здаём не набор разрозненных мето-дов, а единый «объект».

Но широкое использование гло-бальных переменных никогда не при-ветствуется.

Можно использовать глобаль-ные переменные с указанием пол-ных имён:

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

Использование замыканийНадеюсь, что читатель уже не счи-тает замыкания недоработкой Perl. Они так же логичны, как «самоожив-ление» переменных (autovivification) и другие механизмы Perl. Но можно ли использовать замыкания для сво-ей пользы? Конечно!

Вы уже видели, что замыкания поз-воляют генерировать функции, варь-ируя некоторые аспекты работы этих функций. Причём перекомпиляция кода при этом фактически не проис-ходит; то есть новые функции созда-ются практически мгновенно. Поэто-му замыкания с успехом применяют-ся для создания множества обработ-чиков событий при программировании приложений, основанных на событи-ях. Например, вы можете разработать библиотеку для создания графичес-кого пользовательского интерфейса. Каждому новому элементу «флажок» будет отвечать собственная функция-обработчик. Эти функции должны быть схожи, но допускать некоторые отли-чия (цвет, форма, начальное положе-ние и прочее). Здесь уместно приме-нить замыкания.

Проиллюстрируем сказанное:

Результат работы этого кода, ес-тественно, будет точно таким же, как и предыдущего.

Обратите внимание, строки 5 и 6 должны обязательно заканчивать-ся точкой с запятой (довольно редкая ситуация: после закрывающей фигур-ной скобки обязательно требуется точ-ка с запятой).

Заметьте также, что создаваемые функции должны быть строго аноним-ны. Если вы внесёте в код следующие изменения, то он будет работать ина-че и, скорее всего, не так, как вы ожи-даете.

Читатель, конечно, спросит: «А по-чему бы нам не использовать просто ОО подход вместо замыканий?» По-жалуйста! Но всем известно, что пока объекты в Perl достаточно неповорот-ливы. Мой опыт показывает, что в не-которых ситуациях замыкания позво-ляют иногда получить выигрыш в быс-тродействии в полтора-два раза. Этот выигрыш становится особенно заме-тен, если методы выполняют короткие и простые операции.

Тех, кто сейчас скажет: «Ну уж я никогда не буду использовать в своих программах таких изысков», я спешу заверить, что большинство програм-мистов на Perl постоянно использу-ют замыкания, так как многие модули используют это средство. Достаточно сказать, что замыкания есть в модуле DBI, который широко применяется при программировании интерфейсов к ба-зам данных.

Кроме того, считаться с замыка-ниями вам придётся, если вы захоти-те создать собственный модуль. Что-бы обеспечить его универсальность, вы должны обязательно учесть, что он может быть использован и в mod_perl-контексте.

Кстати, замыкания часто использу-ют как раз, чтобы избежать ситуаций, чреватых «неожиданными» замыка-ниями. Поэтому замыкания встреча-ются в модулях и программах на Perl гораздо чаще, чем может показаться на первый взгляд.

3: $c=1; # <-- это уже не # my-переменная

3: $main::c=1;

1: #!/usr/bin/perl 2: sub new { 3: my $step=shift; 4: my $c=0; 5: return sub {$c+=$step}, 6: sub {print "count=$c ↵ (step=$step)\n"}; 7: } 8: my ($incr1, $print1)=new(1); 9: my ($incr2, $print2)=new(100);10: &$print1;11: &$print2;12: &$incr1;13: &$incr1;14: &$incr2;15: &$incr2;16: &$print1;17: &$print2;

count=0 (step=1)count=0 (step=100)count=2 (step=1)count=200 (step=100)

1: #!/usr/bin/perl 2: sub new { 3: my $step=shift; 4: my $c=0; 5: my $incr=sub {$c+=$step}; 6: my $print=sub {print ↵ "count=$c (step=$step)\n"}; 7: return {'incr' => $incr, ↵ 'print’'=> $print} 8: } 9: my $c1=new(1);10: my $c2=new(100);11: $c1->{print}->();12: $c2->{print}->();13: $c1->{incr}->();14: $c2->{incr}->();15: $c1->{incr}->();16: $c2->{incr}->();17: $c1->{print}->();18: $c2->{print}->();

... 5: sub incr {$c+=$step}; 6: sub prnt {print ↵ "count=$c (step=$step)\n"}; 7: return {'incr' => \&incr, ↵ 'print' => \&prnt}...

Page 50: 039 Системный Администратор 02 2006

48

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

Ошибки переполнения вездесу-щи – это факт. Буквально каж-дые несколько дней обнаружи-

вается новая дыра, а сколько дыр ос-таются необнаруженными – приходит-ся только гадать. Как с ними борют-ся? Арсенал имеющихся средств до-вольно разнообразен и простирается от аппаратных защит типа NX/XD-би-тов до статических анализаторов на-подобие Spilnt.

В последнее время в обиход во-шел термин «secure programming» и издано множество книг по безопас-ности, настоятельно рекомендующих использовать динамические средс-тва защиты типа Stack-Guard, внед-ряющие в компилируемую програм-му дополнительный код, проверяю-

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

Расплатой за «безопасность» ста-новятся снижение производительнос-ти (впрочем, довольно незначитель-ное) и необходимость перекомпиля-ции всего кода. Но это только внешняя сторона проблемы. Понадеявшись на широко разрекламированные защит-ные средства, разработчики расслаб-ляются и… начинают строчить не-брежный код, который Stack-Guard (Stack-Shield/Pro-Police) все равно «ис-правит». Но что именно он правит? Давайте задвинем рекламу в сторону и посмотрим на защиту глазами хаке-ра, который ломится не в дверь (там за-

мок), и не в окно (там – сигнализация), а проникает через никем не охраняе-мую вентиляционную/канализацион-ную трубу или даже дымоход.

Все защитные механизмы, имею-щиеся на рынке, спроектированы так, что дрожь берет. Сразу видно, что их создатели никогда не атаковали чу-жие системы, не писали shell-код и да-же не общались с теми, кто всем этим занимается. Защита не только не оста-навливает атакующего, но в некоторых случаях даже упрощает атаку!

Типы переполнения и типы защитСуществует множество типов ошибок переполнения, подробно рассмотрен-ных в статье [1]. Это:

Можно ли защититьсяот переполнения буферов?

Крис Касперски

Умные в споре ищут истину, глупцы – выясняют, кто умнее.

Народное

На рынке имеется множество средств как коммерческих, так и бесплатных, обещающих решить проблему переполняющихся буферов раз и навсегда, но хакеры ломают широко разрекламированные защитные комплексы один за другим. Почему? Давайте заглянем под капот Stack-Guard, Stack-Shield, Pro-Police и Microsoft Visual Studio .NET, сравнив заявленные возможности с реальными.

Page 51: 039 Системный Администратор 02 2006

49№2, февраль 2006

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

переполнение кучи (работающее как оператор POKE – запись значения в указанную ячейку памяти);

целочисленное переполнение, ошибки форматиро-ванного вывода (PEEK – чтение содержимого произ-вольной ячейки памяти) POKE в одном лице);

переполнение локальных стековых буферов.

Стековое переполнение – не только не единственное, но даже не самое популярное. Оператор new языка Си++ размещает переменные в динамической памяти, поэто-му актуальность атак на кучу все растет, а к стеку интерес снижается. Ложка дорога к обеду. После драки кулаками не машут. Защитники стека явно опоздали и теперь подта-совывают факты и разводят рекламу.

Вот цитата из документации на Stack-Guard: «…emits programs hardened against «stack smashing» attacks. Stack smashing attacks are the most common form of penetration attack. Programs that have been compiled with StackGuard are largely immune to stack smashing attack» («Stack-Guard за-каляет программы против срыва стека – наиболее попу-лярного типа удаленных атак. Программы, откомпилиро-ванные со Stack-Guard приобретают крепкий иммунитет против этого»).

На самом деле Stack-Guard всего лишь затрудняет под-мену адреса возврата, то есть противодействует подклассу стековых атак, причем противодействует весьма неумело. То же самое можно сказать и про остальные защиты, ус-танавливая которые мы не должны забывать, что они сра-жаются лишь с определенным типом атак, а на остальные просто не обращают внимания.

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

Stack-GuardПервым, кто бросил вызов переполняющимся буферам, был Stack-Guard, представляющий собой заплатку для ком-пиляторов gcc и eggs, распространяемую по лицензии GPL. Раньше его было можно скачать с http://www.cse.ogi.edu/DISC/projects/immunix/StackGuard или immunix.org, но сей-час эти ссылки мертвы, а проект заброшен. C тех пор как Immunix скупила Novell, Stack-Guard больше не поддержи-вается, во всяком случае найти какие бы то ни было упоми-нания о нем на официальном сайте мне не удалось.

Исходный код сохранился только у «коллекционеров», как, например: http://www.packetstormsecurity.org/UNIX/utilities/stackguard. Тут может возникнуть вопрос: «Если Stack-Guard устарел и мертв, какой смысл его исследо-вать?».

На самом деле смысл есть. Stack-Guard – простей-ший защитный механизм, расковыряв который, мы смо-жем разобраться и со всеми остальными, тем более что между ними наблюдается стройная эволюционная пре-емственность.

Возьмем следующую программу с умышленно допу-щенной ошибкой переполнения и посмотрим, сможет ли Stack-Guard ее защитить.

Откомпилируем файл компилятором gcc с настройками по умолчанию (то есть без оптимизации) и загрузим полу-ченный elf в дизассемблер, чтобы посмотреть, как выгля-дит стандартный пролог/эпилог функции f().

Содержимое стека на момент вызова f() представляет конгломерат локальных переменных и служебных данных. На вершине стека лежит буфер, под ним располагается це-лочисленная переменная «a» (на самом деле порядок раз-мещения переменных не стандартизован и целиком зави-сит от воли компилятора, то есть может быть любым). За ло-кальными переменными следует сохраненный регистр ука-зателя кадра стека (в x86 процессорах его роль обычно иг-рает EBP), а за ним – адрес возврата и аргументы, передан-ные функции. Короче говоря, все это выглядит так:

Листинг 1. Демонстрационная программа с переполняющимся буфером, которую мы будем защищать

// дочерняя функцияf(char *msg){ // объявляем локальные переменные int a; char buf[0x66]; // копируем аргумент в буфер без контроля длины, // что на определенном этапе приводит к его переполнению a = *strcpy(buf, msg); // выходим из функции return a;}

// материнская функцияint main(int argv, char **argc){ int x; x = f(argc[1]);}

Листинг 2. Дизассемблерный листинг исходной функции f с моими комментариями

function_prologue: push ebp ; // сохраняем старый указатель ; // кадра mov ebp, esp ; // открываем новый кадр стека sub esp, 98h ; // резервируем место ; // под локальные переменные

; // тело программы ; // копируем аргумент в регистр eax mov eax, [ebp+arg_0] ; // кладем eax в стек (выглядит как засылка eax ; // в локальную переменную но в действительности – ; // это такая передача аргументов, необычно, ; // но компилятору удобно) mov [esp+98h+var_94], eax

; // получаем указатель на локальную переменную var_88 lea eax, [ebp+var_88] ; // кладем его в стек mov [esp+98h+var_98], eax ; // вызываем _strcpy(&arg_0[0], &var_88[0]) call _strcpy ; // eax = *((signed char*) eax); ; // копируем eax в локальную переменную var_C movsx eax, byte ptr [eax] mov [ebp+var_C], eax ; // копируем содержимое var_C в eax mov eax, [ebp+var_C]

function_epilogue: leave ; // mov esp, ebp/pop ebp retn ; // выходим в материнскую функцию

Листинг 3. Состояние стека на момент вызова функции f

[ buf ] ; <-- переполняющийся буфер[ a ] ; <-- прочие локальные переменные

Page 52: 039 Системный Администратор 02 2006

50

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

Переполняющийся буфер может воздействовать на сле-дующие объекты: локальные переменные, расположенные ниже его; сохраненный указатель кадра стека; адрес возврата; аргументы, переданные функции; на кадр материнской функции.

Все эти атаки подробно описаны в моей статье [1], поэ-тому не будем повторяться, а лучше пропустим программу через Stack-Guard 1.0 и посмотрим, что это даст.

После защиты Stack-Guard перед адресом возвра-та располагается константа 000AFF0Dh (в терминологии Stack-Guard – canary word), целостность которой проверяет-ся перед выходом из функции. Суть в том, что комбинацию символов, слагающих canary word – \x00\x0A\xFF\x0D, очень трудно «воспроизвести» с помощью строковых функций, пос-кольку в языке Си символ нуля трактуется как «конец стро-ки». Функция gets – одна из тех немногих, что обрабатывает ноль как обыкновенный символ, поскольку в качестве завер-шителя строки использует символ «возврата каретки».

Листинг 4. Дизассемблерный листинг функции f(), защищенной Stack-Guard (добавленные защитой строки выделены красным шрифтом)

function_prologue: ; // забрасываем canary word на стек ; // (следовало это делать после сохранение ebp) push 000AFF0Dh

; // сохраняем старый указатель кадра в стеке push ebp mov ebp, esp ; // открываем новый кадр ; // резервируем место под локальные переменные sub esp, 98h ; // тело функции (точно такое же, как и в прошлый раз) function_epilogue:

[ ebp ] ; <-- сохраненный указатель кадра[ retaddr ] ; <-- адрес возврата в материнскую функцию[ arg 1 ] ; <-- аргументы, переданные функции[ --------- ] ; <-- \[ --------- ] ; <-- +- кадр стека материнской функции[ --------- ] ; <-- /

leave ; // закрываем кадр стека ; // проверяем целостность canary word cmp esp,AFF0Dh ; // если canary изменено, прыгаем на canary_changed jne canary_changed add esp,4 ; // удаляем canary из стека ; // возвращаемся в материнскую процедуру ret

canary_changed: ; // завершаем выполнение программы call __canary_death_handler ; // если завершить не удалось — зацикливаемся jmp .

Листинг 5. Состояние стека функции f() на момент завершения выполнения пролога и начала выполнения ее тела

[ buf ][ a ][ ebp ][ 000aff0dh ][ retaddr ][ arg 1 ][ --------- ][ --------- ][ --------- ]

Page 53: 039 Системный Администратор 02 2006

51№2, февраль 2006

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

При работе с ASCIIZ-строками «подделать» canary word невозможно! Адрес возврата можно считать надежно за-щищенным. Ведь чтобы «дотянуться» до него, переполня-ющемуся буферу необходимо пересечь (и затереть) canary word! Разработчики торжествуют, а хакеры стреляются. Или… все-таки нет?

Начнем с того, что на Unicode все эти ограничения не распространяются и canary word подделывается без тру-да (кстати говоря, пилотная версия Stack-Guard в качестве сторожевого слова использовала 00000000h, что в Unicode уже не воспроизводится, но может быть введено с помощью функции gets, которая сегодня практически никем и нигде не используется). К тому же приложения, обрабатывающие двоичные данные функциями типа memcpy, также остают-ся беззащитными.

Локальные переменные и указатель кадра стека во-обще никак не защищены и могут быть беспрепятствен-но атакованы. Если среди этих переменных присутству-ет хотя бы один указатель на функцию, вызываемую пос-ле переполнения, хакер сможет подменить его адрес, пе-редавая управление на свой shell-код. Конструкция типа «int *x; int a; … x = a;», которая к числу экзотических никак не относится, позволяет атакующему модифицировать лю-бые указатели на функции, в том числе и адрес возврата, и защита canary word уже не срабатывает, поскольку сто-рожевое слово остается в неприкосновенности. Образно говоря, это как положить «перед шматком сала грозный капкан». Тот, кто идет напрямую (классическое последо-вательное переполнение), попадет в него прежде, чем ус-пеет полакомиться. Но если десантироваться прямо на са-ло путем воздействия на переменные-указатели – капкан отдыхает (правда, в этом случае необходимо знать точное положение вершины стека на момент атаки, что не всегда возможно, поэтому хакеры предпочитают модифицировать таблицу импорта в Windows, а в UNIX – секцию got).

Рассмотрим самый сложный случай, когда никаких пе-ременных в нашем распоряжении нет, а есть только сохра-ненный регистр кадра стека, который мы и будем атаковать. Фатальной ошибкой Stack-Guard явилось то, что он не учел «побочных эффектов» инструкции leave, которая работает так: «mov esp, ebp/pop ebp», позволяя хакеру воздейство-вать на кадр материнской функции. Если в каком-то месте стека или кучи атакующему удастся «сложить» конструкцию «000AFF0Dh &shell-code», (что в переводе на русский зву-чит как: canary-word за которым следует указатель на shell-код), ему остается всего лишь подменить сохраненный EBP на адрес «своего» canary-word. Тогда при выходе из мате-ринской функции управление будет передано на shell-код! Атаки этого типа называются ret2ret и давно описаны в ха-керской литературе, однако какого-либо практического при-ложения они так и не получили, поскольку в оптимизиро-ванных эпилогах (ключ -O2) вместо инструкции leave ком-пилятор использует более быстродействующую конструк-цию «add esp,x/pop ebp», и побочный эффект воздействия на ESP исчезает. В оптимизированном эпилоге хакер мо-жет воздействовать только на стековый кадр материнской функции, «подсовывая» ей те значения локальных перемен-ных, которые он захочет. Для успешной реализации атаки этого обычно оказывается вполне достаточно.

В версии 2.0 защита адреса возврата была как бы уси-лена – в нем появился случайный canary word, хранящийся в read-only памяти и «шифрующий» адрес возврата по XOR. Угадать 32-битный canary word – нереально, но это и не нуж-но! Достаточно подсунуть заведомо ложное значение. Тог-да, убедившись, что стек переполнен и хакеры хакерству-ют, как крысы в амбаре, Stack-Guard передаст управление функции __canary_death_handler, которая завершает вы-полнение программы, устраивая настоящий DoS. Но луч-ше DoS, чем захват управления!

Весь фокус в том, что указатель на __canary_death_handler размещается в глобальной таблице смещений – GOT и мо-жет быть атакован путем воздействия на локальные пере-менные через уязвимый указатель кадра стека. Если та-кие переменные действительно есть (а куда бы они подева-лись?), хакер просто перенаправляет __canary_death_handler на свой shell-код!

В последующих версиях Stack-Guard canary world «пере-ехал» на одну позицию вверх, взяв под свою защиту и ука-затель кадра, однако дальнейшего развития проект не по-лучил и постепенно сдулся.

Microsoft Visual Studio .NETОзабоченная последними хакерскими атаками, Microsoft ре-ализовала в своем новом компиляторе Visual Studio .NET (бывший Visual C++) некоторую разновидность Stack-Guard в далеко не лучшей его «инаугурации». Никогда не раз-рабатывающая собственных продуктов, а только «вору-ющая» уже готовые (авторитетный товарищ Берзуков в своей софт-панораме об этом только и говорит, сходите на www.softpanorama.org/Bulletin/News/Archive/news078.txt, почитайте – там много интересного), Microsoft, как это час-то и бывает, сама не поняла, что стащила и у кого. Ладно, все это лирика. Перейдем к фактам.

При компиляции с ключом /GS компилятор добавля-ет в код security cookie – так в терминологии Microsoft на-зывается случайный 32-битный canary word, хранящийся в writable-памяти и инспектируемый функцией check_canary при выходе из функции:

Рисунок 1. Адрес возврата по XOR случайным canary

Листинг 6. Дизассемблерный листинг функции f(), откомпилированной Microsoft .NET с ключом /GS (добавленные защитой строки выделены красным шрифтом)

function _prologue: ; // сохраняем прежний указатель кадра push ebp mov ebp, esp ; // открываем новый кадр ; // резервируем место для локальных переменных ; // и canary sub esp, 9Ch push edx ; \ ; + - сохраняем регистры,

Page 54: 039 Системный Администратор 02 2006

52

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

Canary word защищает не только адрес возврата, но и кадр, что очень хорошо, правда, в оптимизированном коде, генерируемый этим же самым компилятором, локаль-ные переменные адресуются непосредственно через ESP, и дополнительный регистр им не нужен, поэтому фактичес-ки защищается только один адрес возврата. Остальные пе-ременные остаются незащищенными, что открывает про-стор для махинаций с указателями.

В частности, хакер может перезаписать глобальную пе-ременную canary своим значением – тогда его проверка пройдет нормально.

Это даже упрощает (!) атаку: в незащищенной систе-ме существует проблема ввода «запрещенных» символов, которую не всегда возможно обойти. Операция XOR поз-воляет генерировать любые символы! В частности, чтобы сформировать символ нуля, достаточно положить в canary и зашифрованный адрес возврата два одинаковых симво-ла. Как известно «X XOR X = 0». Остальные символы гене-рируются аналогичным способом.

Самое интересное, что Microsoft переняла ошибку ран-них версий Stack-Guard, причем даже не его ошибку, а осо-бенность поведения компилятора gcc, позволяющую ата-кующему воздействовать на регистр ESP через модифи-кацию указателя кадра стека.

Microsoft Visual C++ 6.0 закрывал кадр стека безопасной конструкций «ADD ESP,XXX», а .NET вместо этого использу-ет «MOV ESP, EBP». И хотя указатель кадра защищен canary word, это еще не повод ослаблять защиту! Canary word ге-нерируется не совсем случайным путем, и угадать его с не-скольких попыток вполне реально, ну а инструкция XOR

позволит подделать любой символ. Короче говоря, если бы в Microsoft думали головой…

Stack-ShieldНесмотря на схожесть в названии со своим собратом, Shack-Shield действует совсем по другому принципу. Это еще одно расширение к gcc, последнюю версию которого мож-но скачать с http://www.angelfire.com/sk/stackshield, но ино-го типа. Если Stack-Guard реализован как патч к компиля-тору, «исправляющий» function_prologue и function_epilogue, то Stack-Shield «захватывает» ассемблерные файлы, сгене-рированные компилятором (в UNIX-мире они имеют расши-рение .S), обрабатывает их, выплевывая защищенный ас-семблерный файл, возвращаемый компилятору для окон-чательной трансляции в двоичный код. Такая схема да-ет Stack-Shiled намного большие возможности, и мне сра-зу же захотелось посмотреть, как он ими воспользовался и можно ли его одолеть.

Соблазненный процессорными архитектурами с разне-сенным стеком (один стек для хранения адресов возврата, другой – для локальный переменных), создатель Stack-Guard попытался «проэмулировать» на x86 нечто подобное. Для этой цели он использовал глобальный массив retarray на 256 адресов: эпилог копирует текущий адрес на вершину массива, определяемую указателем retprt, а пролог «стяги-вает» этот адрес с вершины и передает ему управление.

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

Листинг 7. Дизассемблерный листинг функции f(), защищеннойStack-Shield с настройками по умолчанию (добавленные защитой строки выделены красным шрифтом)

function_prologue: ; // сохраняем регистры, которые изменяет Stack-Shied push eax push edx ; // копируем в eax смещение указателя массива retpt mov eax, offset retpt cmp rettop, eax ; // смотрим – есть ли еще место? ; // если места нет, отказываемся от записи ; // нового адреса jbe .LSHIELDPROLOG ; // заносим в edx адрес возврата со стека mov edx, [esp+8] ; // сохраняем его в массиве адресов возврата mov [eax], edx

.LSHIELDPROLOG: ; // увеличиваем указатель массива возвратов ; // на первый взгляд это явный баг, ; // но на самом деле – оптимизация! add [retptr],4

; // восстанавливаем регистры назад pop edx pop eax ;

; // сохраняем старый указатель кадра стека push ebp mov ebp, esp ; // открываем новый кадр ; // резервируем место под локальные переменные sub esp, 98h

; // тело функции (такое же как в случае с Stack-Guard)

function_epilogue: ; // закрываем кадр стека небезопасным путем leave

: которые будут изменены push esi push edi ; /

; // копируем глобальный canary в eax mov eax, [canary] // сравниваем адрес возврата с canary xor eax, [esp+10h]; ; // кладем результат на стек, защищая указатель кадра mov [ebp-10h],eax

; // тело функции; (не совсем такое же, как и в прошлый раз,; но различия между компиляторами к делу не относятся)

function_epilogue: ; // копируем сравненный canary в ecx mov ecx, [epb-10h] ; // сравниваем адрес возврата и кладем его в ecx xor ecx, [ebp+10h] ; // вызываем функцию проверки canary call check_canary

pop edi ; \ pop esi ; + - восстанавливаем регистры pop ebx ; / ; // закрываем кадры стека небезопасным путем mov esp, ebp

; // (Microsoft повторяет ошибку Stack Guard) pop ebp ; // выходим в материнскую функцию ret

check_canary: ; // функция проверки canary ; // сравниваем переданный ecx с глобальным canary cmp ecx, [canary] ; // если не совпадают – завершаем программу jnz canary_changed ; // все ок, продолжаем выполнение программы ret

Page 55: 039 Системный Администратор 02 2006

53№2, февраль 2006

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

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

Ключи -r и -g задействуют механизм «Ret Range Checking», проверяющий границы адресов возврата и останавливаю-щий программу, если они выходят за пределы некоторой за-ранее заданной величины (т.е. находятся в куче или стеке). Таким образом, даже если хакер перезапишет retarray (а он находится в записываемой области памяти), подсунуть указатель на shell-код ему уже не удастся, правда, он может беспрепятственно вызывать функции библиотеки libc, пере-давая им любые аргументы (атака типа return-to-libc).

Усилилась и защита локальных переменных. Теперь пе-ред вызовом функции по указателю, Stack-Shield убеждает-ся, что она находится в пределах сегмента кода:

Контроль за указателями на функции препятствует не-посредственной передаче управления на shell-код, но не ме-шает хакеру использовать функции стандартной библио-теки libc и функции самой уязвимой программы. Указате-ли на данные также остаются незащищенными. Кроме то-го, при исчерпании массива адреса возвратов (что при глу-бокой вложенности функций имеет место быть) он автома-тически переходит в «обычный» режим, в котором прове-ряет только границы адресов возврата, но не сами адреса. Хорошая новость, нечего сказать!

Pro-PoliceПротектор Pro-Police, зародившийся в недрах японского от-деления IBM (http://www.research.ibm.com/trl/projects/security/ssp), – это без преувеличения самый сложный и самый со-вершенный механизм, реализующий модель безопасного стека (Safe Stack Usage Model), который действительно за-щищает, а не разводит пропаганду, чтобы выбить очеред-ной грант. Сражение с такой защитой любой самурай поч-тет за честь.

Pro-Police зарывается намного глубже, чем Stack-Guard и работает на уровне RTL. Это не библиотека времени ис-полнения, это – промежуточный системно-независимый язык, генерируемый компилятором gcc и расшифровыва-емый как register transfer language.

Абстрагирование от оборудования существенно упро-щает портирование и Pro-Police поддерживает практичес-ки все современные платформы: x86, powerpc, alpha, sparc, mips, vax, m68k, amd64.

Самая главная инновация – переупорядочивание ло-кальных переменных. Pro-Police разбивает переменные на две группы: массивы и все остальные. На вершину кад-ра стека попадают обычные скалярные переменные. Мас-сивы идут за ними. Переполняющиеся буферы могут воз-действовать друг на друга, но до указателей уже не достать, во всяком случае не таким простым путем.

Адрес возврата и указатель кадра защищены сторо-жевой константой guard, генерируемой произвольном об-разом. Это все тоже canary word, только в обличии новой терминологии.

Листинг 8. Дизассемблерный код, раскрывающий сущность механизма Ret Range Checking

function_epilogue: ; // закрываем кадр стека небезопасным путем leave cmp [esp], offset shielddatabase

; // ^ проверяем границы адреса возврата ; // если все ок, то переходим на ret jbe .LSHIELDRETRANGE

; // если мы здесь, то адрес возврата вышел movl eax,1 ; // за допустимые пределы, возможно он был изменен movl ebx,-1 ; // завершаем выполнение программы int 80h

.LSHIELDRETRANGE: ret ; // возвращаемся в материнскую процедуру

Листинг 9. Дизассемблерный код, показывающий как Stack-Shield контролирует указатели на функции

; // в eax находится указатель на функцию ; // проверяем границы указателя cmp eax, offset shielddatabase

; // если указатель в границах, перехрдим ; // на вызов функции jbe .LSHIELDCALL

; // указатель на функцию выходит за допустимые границы mov eax,1 movl ebx,-1 ; // возможно, он был хакнут ; // завершаем выполнение программы int 80h

.LSHIELDCALL:

Листинг 10. Псевдокод уязвимой функции до защиты Pro-Police

foo(){ char *p; // локальная переменная-указатель char buf[128]; // локальный буфер

// функция, которая этот буфер и переполняет gets (buf);}

Рисунок 2. Безопасная модель стека Pro-Police

push eax ; // сохраняем регистры push edx ; // уменьшаем указатель массива возвратов add [retptr], -4 ; // заносим в eax смещение массива возвратов mov eax, offset retptr ; // как на счет свободного места? cmp eax, rettop ; // если места нет, значит и выталкивать нечего jbe .LSHIELDEPILOG ; // снимаем сохраненный адрес со стека возвратов mov edx, [eax] ; // восстанавливаем стековый адрес не проверяя его mov [esp+8],edx .LSHIELDEPILOG: pop edx ; // восстанавливаем регистры pop eax ; ret ; // выходим в материнскую функцию

call [eax] ; // вызываем функцию по указателю

Page 56: 039 Системный Администратор 02 2006

54

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

Состояние стека на момент вызова функции f из лис-тинга 1 под Pro-Police выглядит так:

Сравните это с листингом 5. Разница незначительная, но принципиальная! По соображениям производительнос-ти, Pro-Police внедряет защиту адреса возврата только функции, содержащие буферы, которые потенциально мо-гут быть переполнены. То есть Pro-Police совмещает в себе защитный механизм с системой аудита кода (рис. 2)!

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

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

ЗаключениеТак все-таки можно защититься от переполняющихся буфе-ров или нет? Pro-Police отсекает большое количество атак, но… все это атаки на стек, а помимо стека у нас еще есть целочисленное переполнение, спецификаторы и куча, ко-торые Pro-Police даже не пытается охранять, поскольку они находятся вне его «департамента». Это не упрек, а скорее констатация факта.

Личное наблюдение – прочитав несколько популярный статей и установив могучий Pro-Police, большинство зна-комых мне программистов упускают из виду, что необхо-димо установить что-то еще. Безопасное программирова-ние требует целого комплекса совокупных мер, жестоко карая за малейшие ошибки.

Использовать Pro-Police, безусловно, стоит, равно как и компилировать программы с ключом /GS, одна-ко необходимо помнить, что эта мера отнюдь не гаран-тирует защищенности, а всего лишь уменьшает вероят-ность атаки.

Литература:1. Касперски К. Ошибки переполнения буфера извне и изнутри

как обобщенный опыт реальных атак. – Журнал «Системный администратор» №3, 2004 г. – 64-72 с.

stack-guard .NET stack-shield pro-police

Защищает адрес возврата да да частично да

Защищает указатель кадра нет да нет да

Защищает локальные переменные нет нет частично да

Защищает аргументы нет нет нет да

Защищает массивы нет нет нет нет

Canary word случаен нет частично – да

Защищает canary word от перезаписи да нет – да

Сводная таблица различных защитных методов foo (int a, void (*fn)()){ char buf[128]; // локальный буфер gets (buf); // функция, переполняющая буфер // вызов функции по указателю, переданному // в качестве аргумента и затираемому при переполнении (*fn)();}

Листинг 14. Псевдокод функции, защищенной Pro-Police (добавленные строки выделены красным шрифтом)

// глобальный canary, генерируемый случайным образомInt32 random_number;// уязвимый аргумент-указательfoo (int a, void (*fn)()){ // локальная копия canary, охраняющая кадр volatile int32 guard; // буфер идет перед переменными, но после аргументов char buf[128]; // копируем аргумент во временную переменную (void *safefn)() = fn; // копируем глобальный canary в локальную переменную guard = random_number; gets (buf); // вызываем уязвимую функцию

// вызываем функцию по скопированному указателю (*safefn)(); if (guard != random_number) /* program halts */}

Листинг 11. Псевдокод функции, защищенной Pro-Police (добавленные защитой строки выделены красным шрифтом)

// глобальный canary, генерируемый случайным образомInt32 random_number;foo (){ // локальная копия canary, охраняющая кадр volatile int32 guard; // буфер идет перед всеми локальными переменными! char buf[128]; // локальная переменная-указатель char *p;

// копируем глобальный canary в лок. переменную guard = random_number; gets (buf); // вызываем уязвимую функцию if (guard != random_number) /* program halts */}

Листинг 12. Состояние стека функции foo() на момент завершения выполнения пролога, обратите внимание, что при переполнении буфера buf затирания локальных переменных уже не происходит!

[ p ][ buf ][ guard ][ ebp ][ retaddr ][ arg 1 ][ --------- ][ --------- ][ --------- ]

Листинг 13. Псевдокод уязвимой функции, вызывающей функцию по указателю, передаваемому в качестве аргумента, до защиты Pro-Police

Page 57: 039 Системный Администратор 02 2006

55№2, февраль 2006

bugtraq

Переполнение буфера в GNU TarПрограмма: GNU Tar 1.15.1, возможно более ранние вер-сии.Опасность: Высокая.Описание: Уязвимость существует из-за ошибки при об-работке расширенных заголовков PAX. Удаленный поль-зователь может с помощью специально сформированного архива вызвать переполнение буфера и выполнить произ-вольный код на целевой системе.URL производителя: www.gnu.org/software/tar.Решение: Установите исправленную версию (1.15.90 (alpha)) с сайта производителя.

Множественные уязвимости в Mozilla FirefoxПрограмма: Mozilla Firefox 1.5 и более ранние версии.Опасность: Критическая.Описание: 1. Обнаружено несколько ошибок в JavaScript engine при обработке временных переменных. Удаленный пользователь может выполнить произвольный сценарий на целевой системе. Уязвимы Mozilla Firefox 1.5 и более ран-ние версии.

2. Обнаружена ошибка при обработке динамических стилей. Удаленный пользователь может изменить стиль элемента с «position:relative» на «position:static» и получить доступ к освобожденной памяти. Удачная эксплуатация уязвимости позволит злоумышленнику выполнить произ-вольный код на целевой системе. Уязвимость существу-ет в версии 1.5.

3. Уязвимость существует из-за ошибки в методе QueryInterface в объектах Location и Navigator. Удаленный пользователь может выполнить произвольный код на целе-вой системе. Уязвимость существует в версии 1.5.

4. Уязвимость существует при обработке входных данных в имени атрибута при вызове функции XULDocument.persist(). Удаленный пользователь может внедрить произвольный XML или JavaScript-код в файл localstore.rdf, который будет выполнен во время следующего запуска браузера.

5. Несколько целочисленных переполнений обнаруже-ны в модулях E4X, SVG и Canvas. Удаленный пользователь может выполнить произвольный код на целевой системе. Уязвимость существует в версии 1.5.

6. Уязвимость существует при обработке данных в функ-ции nsExpatDriver::ParseBuffer() XML-парсера. Удаленный пользователь может получить доступ к данным, хранящим-ся в динамической памяти системы. Уязвимость существу-ет в версии 1.0.

7. Уязвимость существует из-за недостаточной защи-щенности внутреннего объекта AnyName в модуле E4X. Удаленный пользователь может создать коммуникацион-ный канал между двумя окнами или фреймами в различ-ных доменах. Удаленный пользователь может получить до-ступ к важным данным на системе. Уязвимость существу-ет в версии 1.5.URL производителя: www.mozilla.com.Решение: Установите последнюю версию (1.5.0.1) с сай-та производителя.

Отказ в обслуживании модуля netinet в FreeBSDПрограмма: FreeBSD 5.3, 5.4.Опасность: Средняя.Описание: Уязвимость существует в реализации алго-ритма выборочного подтверждения (SACK – Selective Acknowledgement) при обработке TCP-пакетов. Удаленный пользователь может послать уязвимой системе специаль-но сформированные TCP-пакеты, вызвать зацикливание TCP/IP-стека и потребить все доступные ресурсы на систе-ме. Удачная эксплуатация уязвимости позволит злоумыш-леннику вызвать отказ в обслуживании системы.URL производителя: www.freebsd.org.Решение: Установите исправление с сайта производите-ля.

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

Обход ограничений безопасности в продуктах OracleПрограмма: Oracle9i Database Standard Edition, Oracle9i Database Enterprise Edition, Oracle9i Application Server, Oracle Application Server 10g, Oracle Database 8.x, Oracle HTTP Server 8.x, Oracle HTTP Server 9.x.Опасность: Высокая.Описание: Уязвимость существует из-за ошибки в компо-ненте Gateway в Oracle PL/SQL при проверке подлинности определенных HTTP-запросов. Удаленный пользователь может обойти ограничения списка PLSQLExclusion и полу-чить доступ к запрещенным пакетам и процедурам с помо-щью специально сформированного HTTP-запроса. Удач-ная эксплуатация уязвимости позволит злоумышленнику получить доступ с привилегиями DBA к базе данных пос-редством веб-сервера.URL производителя: www.oracle.com.Решение: В настоящее время способов устранения уязви-мости не существует.

Переполнение буфера в Red Hat Directory Server/Certificate ServerПрограмма: Netscape Directory Server 4.x, Netscape Certificate Management System 4.x, Red Hat Certificate System 7.1 и бо-лее ранние версии, Red Hat Directory Server 7.1 и более ран-ние версии.Опасность: Высокая.Описание: Переполнение стека обнаружено из-за ошибки при обработке событий кнопки «Help» на административ-ных страницах в «Management Console». Удаленный поль-зователь может подключиться к консоли управления и с по-мощью специально сформированного запроса выполнить произвольный код на целевой системе.URL производителя: www.redhat.com.Решение: Установите исправление для Red Hat Directory Server с сайта производителя. В настоящее время способов устранения уязвимости в Red Hat Certificate System не су-ществует. В качестве временного решения рекомендуется удалить файл help.cgi.

Page 58: 039 Системный Администратор 02 2006

56

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

В журнале уже шла речь о про-активных системах защиты [1] и узловой системе останов-

ки атак CORE FORCE [2]. Назначе-ние у них одно – защита персональ-ного компьютера от вирусов, извест-ных и неизвестных уязвимостей, чер-вей, шпионских и троянских программ. В том числе они способны среагиро-вать на так называемые атаки нулево-го дня, которые, как правило, не обна-руживаются традиционными средства-ми. Но эти системы отличаются прин-ципом работы. Первые самостоятель-

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

го в системе, хотя бы такого, чтобы по-явление нового процесса вызвало по-дозрение. На составление и тестиро-вание профиля для CORE FORCE тре-буется время, кроме того, в списке из-вестных программ может не оказать-ся нужной утилиты. Хотя эта пробле-ма также решаема, пользователь сам может составить профиль или попро-сить помощи у сообщества, быстрота реакции которого – вещь труднопро-гнозируемая. При правильно состав-ленном профиле пользователь может и не участвовать в отражении атаки,

Чем уникальна общественная система предотвращения атак Prevx1

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

Сергей Яремчук

Page 59: 039 Системный Администратор 02 2006

57№2, февраль 2006

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

но следует учесть, что вручную профи-ли составляются только для заведомо хороших программ. Вирус и шпионский модуль будут пойманы, только при по-пытке выполнить какое-то неизвестное системе защиты действие. А ресурсы, затраченные для автоматической ге-нерации профиля в проактивных сис-темах, остаются неизвестными сооб-ществу, к тому же для них характерны ложные тревоги. Истина, как извест-но, где-то посередине. Возможно, со-здателям общественной системы пре-дотвращения атак (Community Intrusion Prevention System – CIPS) Prevx 1 уда-лось ее найти.

Что представляет собой Prevx 1?Английская компания Prevx Limited, имеющая 5-летний опыт по разработ-ке систем предотвращения атак, вы-пустила в феврале 2004 года совер-шенно новый тип IPS, названный Prevx Home. Уникального в представлен-ной системе было много. Так, в отли-чие от антивирусных систем, исполь-зующих для определения злонаме-ренных файлов сигнатуры, или неко-торых IDS-систем, использующих спи-сок разрешенных приложений, в но-вой системе применялись правила, описывающие поведение и контроль-ные суммы программ. Причем в спи-сок попадали как заведомо хорошие программы, так и плохие, что позво-ляло быстро определить характер но-вой программы или процесса на ком-пьютере. Но не это главное. В систе-ме используется единая база данных (Community Watch), являющаяся на-иболее мощным источником инфор-мации, определяющим существова-ние, распространение и деятельность как благоприятного, так и злонаме-ренного программного обеспечения. База данных прослеживает и анали-зирует в реальном времени поведе-ние и распространение каждой про-граммы, выполняемое обществом. Агенты безопасности, расположенные на клиентских компьютерах, отслежи-вают ситуацию в защищаемой систе-ме. При установке нового приложе-ния либо появлении нового неизвест-ного локальной базе процесса соеди-нялись с центральной (общественной) базой через Интернет и на основании полученной информации делали вы-

вод (рис. 1). Если в центральной базе данных не было информации о новой программе, новый модуль заносится в нее и помечается как неизвестный, пользователь в таком случае предуп-реждается о возможном риске. В от-личие от антивирусов, требующих не-которое время, необходимое на ана-лиз специалистами, Community Watch в большинстве случаев сам способен определить характер программы, ос-новываясь на поведенческих характе-ристиках. Для этого используется ме-тодика, названная «Four Axes of Evil» (четыре оси зла), определяющая ха-рактер программы по четырем состав-ляющим: скрытность, поведение, про-исхождение и распространение. В ре-зультате создается ее описание, со-держащее около 120 параметров, поз-воляющих ее идентифицировать в бу-дущем. То есть если неизвестная ба-зе утилита выполняет те же действия, что и уже известная зловредная про-грамма, то ее назначение очевидно. Если данных, собранных агентом, все-таки недостаточно для принятия од-нозначного решения, то база данных может потребовать копию программы для прогона. По заявлению разработ-чиков только небольшой процент слу-чаев требует ручного вмешательства специалистов. При первом запуске база данных содержала информацию об одном миллионе событий, через 20 месяцев в базе уже была инфор-мацию об 1 миллиарде событий. Такой принцип фактически устраняет лож-ные позитивные и отрицательные сра-батывания. Как результат – появление нового поколения программы Prevx 1, бета-тестирование которой началось с 16 июля 2005 года. Результат превы-сил все ожидания – 100 тысяч разбро-санных по всему миру компьютеров с установленными на них Prevx 1 ока-зались способны противостоять новым угрозам в реальном времени. В насто-ящее время оптимизированная база данных содержит более 10 миллионов уникальных событий с 220 тысячами вредных объектов. А система автома-тически обнаруживает и нейтрализует ежедневно свыше 400 вредных и око-ло 10 тысяч программ различного на-значения, антивирусным программам не угнаться за такой производитель-ностью. Prevx1 может использовать-ся как автономно, защищая компью-

тер самостоятельно, так и может быть усилена другими продуктами: меж-сетевым экраном, антивирусом, про-граммами для поиска шпионских мо-дулей и пр. Программа проходит тес-тирование на совместимость, только межсетевые экраны могут закрывать доступ к базе, но это легко решается. Для установки агентов потребуются Windows 2000/XP/2003, установлен-ные на компьютер с 256 Мб ОЗУ, и про-цессор с частотой 600 Мгц. Замечу, что при такой минимальной конфигурации система явно притормаживает, поэто-му для комфортной работы желатель-но более мощное оборудование.

Семейство Prevx 1Каждая копия установленного Prevx 1 состоит из двух основных частей: консоли (pxconsole.exe) и агента (pxagent.exe). Консоль может работать в трех режимах, выбираемых пользо-вателем самостоятельно, кроме того, возможно использование трех лицен-зий. В зависимости от этого пользова-телю будут доступны различные пара-метры и настройки.

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

Рисунок 1. При попытке установки нового, неизвестного локальной базе ПО запрашивается информация из центральной базы данных

Рисунок 2. В режиме Pro и Expert пользователь будет получать информацию о работе программ

Page 60: 039 Системный Администратор 02 2006

58

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

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

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

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

Некоторым пользователям настро-ек Pro было мало, так как они не мог-ли тонко сконфигурировать систему, вот для них и предназначена версия Expert, дающая в руки наиболее пол-ное управление системой. Агенты про-веряют большее количество парамет-ров, даже по сравнению с версией Pro. Учитывая возможность вмешательства пользователя в режимах Pro и Expert, в таком варианте система Prevx1 мо-

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

Теперь о лицензиях. Лицензия Individual стоимостью 19,95 у.е., как вид-но из названия, предназначена для за-щиты одного персонального компьюте-ра. При наличии 5 персональных ком-пьютеров лучше использовать лицен-зию Family стоимостью 39,95 у.е. Кро-ме меньшей стоимости лицензии в пе-ресчете на один компьютер, в вари-анте Family Prevx1 умеет отправлять почтовые сообщения о состоянии бе-зопасности компьютеров семейства при возникновении угроз, установке нового ПО, загрузке подозрительного контента и пр.

Самой мощной является лицензия Enterprise. Кроме оповещений доступ-ных в версии Famile, в этом варианте использован более мощный End Point Security агент. При попытке установки нового ПО или попытке запуска неиз-вестной программы агент производит запрос к центральной базе данных на предмет санкционированного исполь-зования в предприятии. Если такое ПО не разрешено, то попытка выполнения блокируется. Если код известен, благо-приятен и разрешен, тогда программа выполняется, и ее данные добавляют-ся к локальной базе данных. В течение выполнения агент или база данных мо-жет аннулировать право выполнения, если код ведет себя с некоторой сте-пенью анормальности.

Таким образом, при помощи Prevx1 можно не только защищать компьюте-ры предприятия от известных и неиз-вестных атак, но и контролировать ус-тановку программного обеспечения. Enterprise можно свободно установить на 100 компьютеров и тестировать в те-чение 3 месяцев, что позволяет полно-стью оценить качество продукта и вы-явить слабые места в компьютерной сети предприятия.

Кроме этого пользователям пред-лагается свободная версия продукта, имеющая литеру «R» в названии [3]. Здесь поступили очень просто: вмес-то обычного в таких случаях ограни-чения функциональности продукта пользователям предоставляется са-мая последняя тестовая версия, имею-щая полную функциональность. Таким образом, не только привлекаются но-

Рисунок 3. После установки пользователю будет выведен результат

Рисунок 4. Вредные программы попадают в песочницу

Page 61: 039 Системный Администратор 02 2006

59№2, февраль 2006

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

вые пользователи, добавляющие свои сигнатуры в базу данных сообщества, но и тестируется непроверенное про-граммное обеспечение.

Установка Prevx1Установка Prevx1 не представляет со-бой ничего сложного, но обязательно при активации и верификации требу-ется подключение к Интернету. После запуска исполняемого файла (5,45 Мб) предстоит пройти четыре этапа: Installation – приложение копирует-

ся в заданный каталог и устанавли-вается.

Activation – указывается файл ли-цензий или использование тесто-вого варианта.

Disk Scan – происходит сканирова-ние жесткого диска в поиске испол-няемых файлов и создание локаль-ной базы данных. Эта операция про-изводится один раз, при последу-ющей эксплуатации системы, про-граммы определяются при попыт-ке запуска, поэтому периодическое сканирование не требуется.

Verification – происходит сверка с общественной базой данных, оп-ределение характера найденных программ и завершение создания локальной базы данных. На тесто-вом компьютере с полусотней ус-тановленных программ такая свер-ка заняла около 600 Кб входящего и исходящего трафика.

После чего компьютер считается защищенным и пользователю выво-дится результирующая информация (рис. 3). Кроме того, о состоянии за-щиты вам подскажет индикатор в трее. Если он горит зеленым, то с защитой все в порядке, красным – на компьюте-ре найдены вредные программы, жел-тый цвет индикатора показывает на на-личие неизвестных программ, в этом случае пользователь должен быть вни-мателен. Все вредные программы бу-дут помещены в песочницу, имеющую три варианта (рис. 4): Holding Cell – программы остают-

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

On Probation – программа может быть запущена, даже если Prevx1 определил ее как вредную.

Jail – программы перемещаются в другую папку, переименовыва-ются, и запустить их невозможно.

Список всех активных программ доступен в окне «Status». Работу лю-бой программы можно проконтролиро-вать при помощи монитора (Programm Monitor). В результате пользователь мо-жет собрать полную информацию о клю-чах реестра, к которым осуществлялся доступ, сетевой и другой активности. Ее можно вывести в двух формах: спи-сок событий и тип событий (Event Type). Последний очень удобен при ручном со-ставлении правил. Но, к сожалению, эк-спортировать полученный список в ок-но правил нельзя. Для переключения в режимы Pro и Expert необходимо ак-тивировать «Advanced Mode» во вклад-ке «Preferences» и затем в появившей-ся вкладке «Advanced» выставить тре-буемый режим. При желании настрой-ки в «Preferences» можно защитить па-ролем.

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

ВыводыНесомненно, Prevx1 является передо-вым и интересным по принципу сво-

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

Литература, ссылки:1. Яремчук С. Проактивные системы за-

щиты, или Есть ли жизнь без антивиру-са? – Журнал «Системный админист-ратор», №7, 2005 г. – 9-13 с.

2. Яремчук С. Защита Windows-систем при помощи CORE FORCE – Жур-нал «Системный администратор», №1, 2006 г. – 54-59 с.

3. Свободная версия Prevx1R – http://free.prevx.com.

Рисунок 5. Для подтверждения запуска обновленного браузера Firefox требуется сверка с базой сообщества

Page 62: 039 Системный Администратор 02 2006

60

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

Традиционно для защиты сете-вых приложений используют сис-темы обнаружения и останов-

ки атак, а также межсетевые экра-ны, работающие на третьем сете-вом уровне модели OSI. В то же вре-мя такой подход имеет и недостатки. Так, при включении в разрыв необхо-дим IP-адрес, при этом IPS (Intrusion Prevention Systems) легко обнаружи-вается и система сама может подвер-гнуться нападению. Выходом из такой ситуации является переход на более низкий, т.е. канальный уровень OSI, что с успехом и применяется в такой IPS, как hogwash [1]. Но увеличение по-токов данных привело к тому, что та-кие системы требуют серьезной аппа-ратной поддержки, иначе они просто не успевают обрабатывать информа-цию. С другой стороны IPS, как прави-ло, не знает, что конкретно она защи-щает (хотя это можно настроить, уб-рав лишние правила), поэтому ресурсы системы расходуются зря. Но зато она точно не владеет информацией о собы-тиях, происходящих в конкретных при-ложениях. Кроме того, такие системы позволяют защитить только наиболее часто используемые приложения. Поэ-тому они смогут обеспечить только не-кий минимальный базовый уровень за-щиты, а учитывая, что на сегодняшний день увеличилось количество нападе-ний на прикладном уровне, этого явно недостаточно. Для выполнения более широкого набора проверок, контроля трафика и реагирования на нападение

в реальном времени, требуется помес-тить IPS и firewall поближе к приложе-нию, т.е. на седьмой уровень.

Firewall веб-приложенийСудя по статистике, именно веб-сер-висы привлекают сегодня нападаю-щего. Это, впрочем, не удивительно, так как веб-технологии ориентирова-ны в первую очередь на публичный доступ 24 часа в сутки 7 дней в не-делю. Поэтому его невозможно спря-тать за межсетевым экраном. Каждая из атак, направленных на этот сер-вис, представляет собой специально составленные запросы, которые вы-глядят как обычный трафик, поэтому он беспрепятственно проходит через него. Один из возможных путей ре-шения проблемы описан в [2], но та-кие мероприятия можно отнести ско-рее к упреждающим. Для остановки атаки необходимо использовать пер-сональные IPS – firewall веб-приложе-ний (Web Application Firewall – WAF). Они действуют по принципу обрат-ного прокси-сервера, стоящего меж-ду сервером и клиентами. Один такой прокси может одновременно обслужи-вать несколько веб-серверов, что уп-рощает администрирование, позволя-ет централизованно управлять досту-пом, увеличивая производительность, кэшируя запросы, сжимая информа-цию. Кроме того, такой подход скрыва-ет топологию сети. Поскольку модуль расположен между клиентом и серве-ром, то в случае, когда он обнаружит

запрос, содержащий злонамеренные данные, он вполне может отклонить, преобразовать запрос или выполнить любое другое действие. К слову ска-зать, на сегодняшний день нет единой устоявшейся терминологии, каждый производитель называет продукт по-своему. Поэтому в Интернете следует искать информацию в различных со-четаниях. Например, Adaptive Firewall (Proxy, Gateway), Application (-level или -layer) Firewall, Web IPS или Deep Packet Inspection Firewalls и другие. Имеются как аппаратные решения, так и про-граммные. К первым относятся такие, как TrafficShield Application Firewall [3], в котором применена так называемая положительная модель безопасности, запрещающая все, что явно не раз-решено, или NetContinuum NC-2000 AG Secure Application Gateways [4], ко-торый является гибридным устройс-твом, объединяющим в себе функ-ции firewall веб-приложений и комму-татора седьмого уровня. Или подоб-ный гибрид от компании Imperva Inc. SecureSphere Web Application Firewall [5], имеющий фирменную технологию Dynamic Profiling, которая формирует модель нормального поведения при-ложения. Такие гибридные устройс-тва имеют подробное представление о защищаемом веб-сервере и о кон-кретных приложениях. Они обладают достаточной функциональностью, поз-воляющей надежно защитить веб-сер-вис, но и стоят дорого. Среди програм-мных решений особо хотелось бы вы-

Как повысить безопасность веб-приложений

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

Сергей Яремчук

Page 63: 039 Системный Администратор 02 2006

61№2, февраль 2006

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

делить основанный на OpenBSD мощный и легкий в управ-лении firewall веб-приложений датский продукт Profense [6], стоящий отдельного обзора. А также бесплатные Open Source продукты: написанные на Java и ориентированные на все серверы, работающие по протоколу HTTP/HTTPS [email protected] [8] и mod_security [9], о котором пойдет речь далее.

Проект ModSecurityModSecurity создан Иваном Ристиком (Ivan Ristic) в 2003 го-ду и представляет собой firewall веб-приложений, который может использоваться как модуль веб-сервера Apache, ли-бо работать в автономном режиме и позволяющий защитить веб-приложения как от известных, так и неизвестных атак. Его использование прозрачно, как установка, так и удаление не требует изменения настройки сервисов и сетевой тополо-гии. Кроме того, при обнаружении уязвимого места теперь не обязательно впопыхах изменять исходный код, делая но-вые ошибки, достаточно на первых порах добавить новое правило, запрещающее вредную комбинацию. Modsecurity может защищать одновременно несколько веб-серверов, в том числе и отличных от Apache (рис. 1). Кроме обычных соединений может контролировать и защищенный SSL-тра-фик. Гибкозадаваемые правила журналирования позволяют записать любые данные сеанса, позволяя в будущем пол-ностью разобрать запросы, предшествующие взлому. По-нимание протокола HTTP позволяет очень тонко выполнить фильтрацию, поддерживается как GET, так и POST-методы, запросы к динамическим ресурсам. Для борьбы с различ-ными методами уклонения (ссылки на внешние сайты, за-кодированные URL, использование нескольких слэшей, ну-левые байты и пр.) пути и параметры нормализуются. В но-вой версии 1.9, вышедшей в ноябре 2005 года, возможно на-следование правил, используется новый формат контроль-ного журнала, позволяющий производить аудит в реальном времени (старый формат оставлен, но может быть удален в версии 2.0). Кроме того, в этой версии введен новый ме-ханизм, названный guardian, задачей которого является кон-троль запросов, производимых с одного адреса, что позво-ляет защититься от DOS-атак, настраивая правила iptables. Интеграция с Open Source антивирусом ClamAV дает воз-можность сканировать загружаемые файлы на наличие ви-русов. В версии добавлена поддержка PCRE, которую теперь можно использовать вместо библиотеки regex для Apache 1.3. Количество кода по сравнению с предыдущей версией выросло на 40%. Распространяется ModSecurity под двойной лицензией: GNU GPL, как свободное Open Source приложе-ние, также доступно несколько вариантов end-user и OEM коммерческих лицензий.

Установка ModSecurityНа момент написания статьи актуальной была версия 1.9.2, имеющая незначительные исправления. Для упрощения будем рассматривать использование ModSecurity для веб-сервера, установленного на том же компьютере, описание остальных настроек вы найдете в документации проекта. При установке из исходных текстов возможны два вариан-та: компиляция как динамической библиотеки и компиля-ция в качестве модуля веб-сервера. В первом случае рас-

паковываем архив и заходим внутрь каталога соответству-ющего версии веб-сервера Apache.

Для сборки используется apxs – APache eXtenSion tool. Если Apache устанавливался вместе с дистрибути-вом, убедитесь в наличии заголовочных файлов и ути-литы apxs. В ALTLinux заголовочные файлы находятся в /usr/include/apache2. Если в вашем дистрибутиве их нет, то доустановите соответствующий devel-пакет (например, httpd-devel), в некоторых дистрибутивах в него включен и apxs. В ALTLinux Master, в котором может быть установ-лена любая из двух версий Apache 1.3 и 2.0, скрипт apxs ис-пользуется при компиляции динамических библиотек для версии 1.3. При использовании второй версии сервера биб-лиотеки необходимо применять apxs2.

Последнее сообщение говорит о том, что в конфигура-ционный файл веб-сервера занесена строка для запуска Dynamic Shared Object (DSO): «LoadModule /usr/lib/apache2/modules/mod_security.so».

Проверьте ее наличие. При установке в качестве мо-дуля Apache необходимо скопировать файл mod_security.c в подкаталог httpd-2.0.xx/modules/proxy и сконфигуриро-вать со следующими опциями.

Прежде чем перезапускать веб-сервер, необходи-

Рисунок 1. ModSecurity может быть установлен как отдельно,так и защищать группу разнородных веб-серверов

$ wget –c http://www.modsecurity.org/download/ ↵ modsecurity-apache-1.9.2.tar.gz$ tar –xzvf modsecurity-apache-1.9.2.tar.gz$ cd modsecurity-apache-1.9.2/apache2

# /usr/sbin/apxs2 -cia mod_security.c

…/usr/lib/apache2/modules/usr/share/apr/build/libtool --mode=install cp mod_security.la /usr/lib/apache2/modules/cp .libs/mod_security.so /usr/lib/apache2/modules/mod_security.socp .libs/mod_security.lai /usr/lib/apache2/modules/mod_security.lacp .libs/mod_security.a /usr/lib/apache2/modules/mod_security.aranlib /usr/lib/apache2/modules/mod_security.achmod 644 /usr/lib/apache2/modules/mod_security.aPATH="$PATH:/sbin" ldconfig -n /usr/lib/apache2/modules------------------------------------------------------------------Libraries have been installed in: /usr/lib/apache2/modules------------------------------------------------------------------chmod 755 /usr/lib/apache2/modules/mod_security.so[activating module `security’ in /etc/httpd2/conf/httpd2.conf]

$ ./configure -enable-security ↵ --with-module=proxy:mod_security.c$ make# make install

Page 64: 039 Системный Администратор 02 2006

62

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

мо отредактировать конфигурационный файл, в кото-ром подключить библиотеки и настроить правила филь-трации. Архив с исходными текстами содержит пример httpd.conf.example-minimal, копируем его на место:

Подключаем его в конфигурационном файле веб-сер-вера строкой:

Конфигурационный файл ModSecurityРассмотрим основные параметры:

Правила ModSecurityОтбор запросов ModSecurity осуществляет на основе пра-вил. Ключевое слово в правиле может быть не только прос-тым текстом, но и записываться в виде регулярного выра-жения. Например, используя следующее правило, можно отсеять все запросы, не содержащие слово php (действие deny используется по умолчанию, но для наглядности его лучше прописывать явно):

или так:

или, например:

а лучше:

Но такое правило хотя и пишется легко, но будет рабо-тать медленно, так как будет искать эту строку во всех па-раметрах. Поэтому на практике чаще всего используется директива SecFilterSelective. В общем случае правило, со-ставленное с ее помощью, будет иметь такой вид:

Параметры KEYWORD и ACTIONS аналогичны SecFilter, LOCATION определяет местонахождение искомой строки. Здесь может быть использовано регулярное выражение, IP-адрес, имя, идентификаторы, включая CGI-перемен-ные (полный список приведен в «ModSecurity for Apache User Guide», который найдете в подкаталоге doc-архива). Например:

# cp httpd.conf.example-minimal ↵ /etc/httpd2/conf/mod_security.conf

Include /etc/httpd2/conf/mod_security.conf

<IfModule mod_security.c>

# Включение проверок ModSecurity, возможны три варианта:# Off – проверки не производятся, On – проверяется все# и DynamicOnly – только динамически сгенерированные запросы# (позволяет сэкономить ресурсы процессора)SecFilterEngine On

# При совпадении правил могут быть произведены одно# или более действий, каждый фильтр может иметь# индивидуальный список действий, этим параметром # определяются действия по умолчанию.# Среди основных действий – deny, pass и redirect.# Среди второстепенных – exec, к действиям, изменяющим# прохождение цепочек, относится chain и skip. Действия# описаны в таблице 1. После действий можно указать# параметры, например статусSecFilterDefaultAction "deny,log,status:430"

# Включение декодирования POST-запросов, поддерживается# два типа (application/x-www-form-urlencoded# и multipart/form-data)SecFilterScanPOST OnSecFilterCheckURLEncoding OnSecFilterCheckUnicodeEncoding Off

# Можно определить диапазон разрешенных символов # (эта директива не распространяется на POST# с multipart/form-data)SecFilterForceByteRange 0 255

# Можно замаскировать сервер, указав здесь другие данные.# Некоторые эксплоиты перед началом работы проверяют банер #(ответ сервера), а нападающий будет сбит с толку, правда,# на некоторое время, т.к. на Linux IIS не ставится.# SecServerSignature "Microsoft-IIS/5.0"

# Параметры хранения временных файлов и скрипт для проверки # ClamAV (найдете в каталоге util архива)SecUploadDir /tmpSecUploadApproveScript /usr/bin/modsec_clamscan.plSecUploadKeepFiles Off

# Защита от DOS-атак, при превышении (по умолчанию)# 120 запросов в минуту и 360 за 5 минут адрес блокируется# при помощи iptables, требует скрипт blacklist.# Скрипт httpd-guardian и blacklist найдете в архиве [13]SecGuardianLog | /usr/bin/httpd-guardian# Ведение журнала аудита и отладкиSecAuditEngine RelevantOnly# SecAuditLogRelevantStatus ^5SecAuditLog logs/modsec_audit.log# Либо можно подключить экспериментальный скрипт# modsec-auditlog-collector.pl, контролирующий журналы# и отсылающий информацию на http-сервер.# SecAuditLog | /path/to/modsec-auditlog-collector.pl ↵ logs/modsec_audit.log logs/index

SecFilterDebugLevel 0SecFilterDebugLog logs/modsec_debug.log# Просмотр выходной информации (работает только в версии# для Apache 2) необходим для параметра OUTPUT# (примеры см. далее по тексту)SecFilterScanOutput On

# Кроме общих правил, можно задавать правила для отдельных# каталогов веб-сервера<Location /axis/modsec.jws>….</Location>

# Далее при помощи директив SecFilter или SecFilterSelective# указываются правила</IfModule>

SecFilter !php

SecFilter !php deny

SecFilter /etc/passwd

SecFilter "/(etc|bin|sbin|kernel|dev|tmp|var|opt)/"

SecFilterSelective LOCATION KEYWORD [ACTIONS]

# Прием только тех запросов, которыми может# оперировать ModSecuritySecFilterSelective REQUEST_METHOD "!^(GET|HEAD)$" chainSecFilterSelective HTTP_Content-Type "!(^application/ ↵ x-www-form-urlencoded$|^multipart/form-data;)"

# Запрет GET или HEAD с ненулевым теломSecFilterSelective REQUEST_METHOD "^(GET|HEAD)$" chainSecFilterSelective HTTP_Content-Length "!^$"

# То же для каждого POST-запросаSecFilterSelective REQUEST_METHOD "^POST$" chainSecFilterSelective HTTP_Content-Length "^$"# Чтобы избежать атак, направленных на переполнение# буфера, используемSecFilterSelective THE_ REQUEST "!^[\x0a\x0d\x20-\x7f]+ $"# Запрет вывода, содержащего опасное словосочетаниеSecFilterSelective OUTPUT "credit card numbers"

Page 65: 039 Системный Администратор 02 2006

63№2, февраль 2006

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

Команда разработчиков во главе с Иваном Ристи-ком основной упор делает на усовершенствование кода ModSecurity, оставляя создание правил пользователям, по-этому оригинальный конфигурационный файл имеет все-го несколько правил. Недавно был официально анонсиро-ван субпроект, цель которого создание и тестирование пра-вил [11]. Для их использования необходимо скачать и под-ключить требуемый файл правил в конфигурационном файле ModSecurity директивой Include. Некоторые из пра-вил требуют редактирования, кроме того, следует учиты-вать особенности rexeс и PCRE, поэтому правила, создан-ные для Apache 2.x, могут неправильно работать с первой версией сервера (о том, как собрать первую версию с под-держкой PCRE, рассказано в документации). Кроме того, в подкаталоге util найдете скрипт snort2modsec.pl, преоб-разующий правила IDS Snort в правила ModSecurity (и го-товый файл snortmodsec-rules.txt, содержащий преобразо-ванные таким образом правила, актуальные на момент вы-хода дистрибутива).

Получить их самому очень просто.

Аналогичную роль играет скрипт nessus2modsec.pl, пред-

назначенный для преобразования NASL правил сканера бе-зопасности Nessus/GNessUs. Формат запуска такой же.

Теперь, когда правила составлены, перезапускаем веб-сервер и тестируем.

Тестируем правилаДля тестирования работы ModSecurity можно использовать любой из сканеров безопасности, умеющий проверять уяз-вимости веб-сервисов [2]. Кроме того, в комплект дистри-бутива входит скрипт run-test.pl, предназначенный для по-сылок тестовых запросов. Попробуем создать простейшее правило, запрещающее доступ к каталогу скриптов cgi-bin, и отследить в журналах реакцию системы на его наруше-ние. Вот это правило:

Запускаем веб-сервер сначала без поддержки ModSecurity и убеждаемся, что запрос к http://localhost/cgi-bin/printenv вы-полняется успешно. Затем подключаем ModSecurity, резуль-тат на (рис. 2), как видите, запрос не прошел с кодом ошиб-ки 403. Смотрим, что написано в журналах (в ALTLinux /var/log/httpd2). Журнал регистрации запросов access_log со-держит следующую запись.

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

Действие Описание Пример

passДействие, полезное в том случае, когда необходимо зарегистрировать событие, и далее продолжить прохождение по цепочке правил

SecFilter KEYWORD "log,pass"

allow Действие разрешает запрос без прохождения по остальным цепочкам SecFilterSelective REMOTE_ADDR "^192\.168\.1\.99$" allow

deny Запрет запроса (по умолчанию используется статус 500)

statusКод HTTP-статуса при запрете запроса. Активизируется директива Apache ErrorDocument и выводит-ся соответствующая страница

SecFilter KEYWORD "deny,status:404"

redirectПользователь перенаправляется на указанный адрес (не должен содержать запятую). Переопределя-ет status и deny

SecFilter KEYWORD "redirect:http://www.example.com"

proxy Запрос перенаправляется на внутренний обратный прокси (mod_proxy) SecFilter KEYWORD "proxy:http://www.example.com"

execВыполнение внешней команды (без параметров), которая получит все переменные CGI среды (по окончании команда должна что-то вывести в stdin, иначе ModSecurity решит, что выполнение завершилось с ошибкой)

SecFilter KEYWORD "exec:/usr/bin/report-attack"

log Регистрация события в журнал ошибок

nolog Не регистрировать событие в журналах ошибок и аудита

skipnext Пропуск одного (по умолчанию) или нескольких следующих правил SecFilterSelective ARG_p value1 skipnext:2

chain Подключение нескольких правил в единый тест. Действие будет разрешено только в том случае, когда будут выполнены все правила. Например, администратора только с указаного IP-адреса

SecFilterSelective ARG_username admin chainSecFilterSelective REMOTE_ADDR "^192\.168\.1\.99$"

pause Задержка в миллисекундах перед ответом на запрос (может быть полезна при борьбе со сканерами)

auditlog Регистрация в журнал аудита

noauditlog Не регистрировать событие в журнале аудита

idrevmsgseverity

Эти действия предназначены для вывода параметров в журнале ModSecurity, помогает собрать боль-ше информации и классифицировать ошибки

Id – уникальный ID правила (для собственных правил ис-пользуйте диапазон 1 – 99999)rev – версия правилаmsg – текстовое сообщениеseverity – цифровое значение (2-5) или название в syslog

mandatory Наследование правил

setenvsetnote Установка или сброс переменных среды и Apache

SecFilter KEYWORD setenv:name=valueНапример, при помощи MODSEC_ENABLE можно на лету переопределять значение директивы SecFilterEngine

# Или вывода команды ls –lSecFilterSelective OUTPUT "total [[:digit:]]+"# Также полезно запретить вывод пользователю ошибок# сценариевSecFilterSelective OUTPUT "Fatal error:"

$ tar zxvf snortrules-snapshot-CURRENT.tar.gz$ cat README.first > snortmodsec-rules.txt$ ./snort2modsec.pl rules/* >> snortmodsec-rules.txt

# /etc/init.d/httpd2 restart

Stopping httpd2 service: [ DONE ]Checking configuration sanity for httpd2: Syntax OK [ DONE ]Starting httpd2 service: [ DONE ]

SecFilter cgi-bin

Page 66: 039 Системный Администратор 02 2006

64

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

Журнал ошибок поясняет, что доступ клиенту, пришед-шему с адреса 127.0.01, запрещен модулем mod_security, потому что совпал образец «cgi-bin».

Кстати, на основании этой записи можно уже оптими-зировать правило. Вот так:

Теперь журналы ModSecurity. Файл modsec_audit.log со-держит всю информацию о запросе.

А в modsec_debug.log найдете информацию обо всех ис-пользованных при запросе правилах:

ВыводыТолько система, не подключенная к сети, может быть 100% безопасной, но веб-сервис должен быть публичным, иначе он теряет смысл. Выявить все слабые места практически не воз-можно. По данным компании Netcraft, отслеживающей, какое программное обеспечение используется серверами в Интер-нете, хакеры всё чаще эксплуатируют дыры в распространен-ных приложениях на основе РНР. Обычный межсетевой эк-ран здесь не помогает. Только специализированное програм-мное обеспечение способно остановить атаку. ModSecurity чрезвычайно функциональный, простой в конфигурировании и главное совершенно бесплатный инструмент, использова-ние которого позволит повысить безопасность предоставля-емых веб-услуг, а относительная легкость написания правил поможет быстро среагировать на угрозу.

Литература, ссылки:1. Яремчук С. Все в одном, или Hogwash как пример Gateway-IDS. –

Журнал «Системный администратор», №1, 2005 г. – 50-55 с.2. Яремчук С. Определяем уязвимости веб-сервиса с помощью

Acunetix Web Vulnerability Scanner. – Журнал «Системный ад-министратор», №9, 2005 г. – 68-69 с.

3. Сайт F5 Networks, Inc. – http://www.f5.com/products.4. Сайт NetContinuum – http://www.netcontinuum.com.5. Сайт Imperva Inc. – ht tp: / /www.imperva.com/products /

securesphere/web_application_firewall.html.6. Проект Profense – http://www.armorlogic.com.7. Списки некоторых Web Application Firewall – http://www.bitpipe.

com/rlist/term/Web-Application-Security.html.8. Проект [email protected] – http://guardian.jumperz.net.9. Проект mod_security – http://www.modsecurity.org.

10. Проект WASC (Web Application Security Consortium), здесь най-дете документы, показывающие проблемы защиты веб-прило-жений и их возможные решения – http://www.webappsec.org.

11. Субпроект ModSecurity Rules – http://www.modsecurity.org/projects/rules/index.html.

12. Ссылка на текущие правила для ModSecurity – http://www.modsecurity.org/download/modsecurity-rules-current.tar.gz.

13. Архив инструментов для Apache – http://www.apachesecurity.net/download/snapshot/apache_tools-snapshot.tar.gz.

==83d74643==============================Request: localhost 127.0.0.1 - - [06/Feb/2006:15:16:25 +0000] "GET /cgi-bin/printenv HTTP/1.1" 403 299 "-" «Mozilla/5.0 (compatible; Konqueror/3.2; Linux) (KHTML, like Gecko)" vwk-VsCoABQAAA7tBpoAAAAA "-"Handler: cgi-script----------------------------------------GET /cgi-bin/printenv HTTP/1.1Connection: Keep-AliveUser-Agent: Mozilla/5.0 (compatible; Konqueror/3.2; Linux) (KHTML, like Gecko)Accept: text/html, image/jpeg, image/png, text/*, image/*, */*Accept-Encoding: x-gzip, x-deflate, gzip, deflateAccept-Charset: windows-1251, utf-8;q=0.5, *;q=0.5Accept-Language: ru, enHost: localhostmod_security-action: 403mod_security-message: Access denied with code 403. Pattern match "cgi-bin" at REQUEST_URI

HTTP/1.1 403 ForbiddenContent-Length: 299Keep-Alive: timeout=15, max=100Connection: Keep-AliveContent-Type: text/html; charset=iso-8859-1--83d74643--

[Mon Feb 06 15:16:25 2006] [error] [client 127.0.0.1] mod_security: Access denied with code 403. Pattern match "cgi-bin" at REQUEST_URI [hostname "localhost"] [uri "/cgi-bin/printenv"] [unique_id "vwk-VsCoABQAAA7tBpoAAAAA"]

SecFilterSelective REQUEST_URI "cgi-bin"

Рисунок 2. Запрос, запрещенный правилами, не прошел

127.0.0.1 - - [06/Feb/2006:15:16:25 +0000] "GET /cgi-bin/printenv HTTP/1.1" 403 299

[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][2] Detection phase starting (request 8182958): "GET /cgi-bin/printenv HTTP/1.1"[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][2] Parsing arguments...[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][3] Content-Type is not available[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][2] Checking signature "!^(GET|HEAD)$" at REQUEST_METHOD

[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][2] Checking signature "^(GET|HEAD)$" at REQUEST_METHOD[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][3] Warning (chained rule). Pattern match "^(GET|HEAD)$" at REQUEST_METHOD[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][2] Checking signature "!^$" at HEADER(Content-Length)[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][2] Checking signature "^POST$" at REQUEST_METHOD[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][2] Checking signature "!^$" at HEADER(Transfer-Encoding)[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][2] Checking signature "cgi-bin" at THE_REQUEST[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][1] Access denied with code 403. Pattern match "cgi-bin" at REQUEST_URI[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][2] Logging phase starting[06/Feb/2006:15:16:25 +0000] [localhost/sid#80a8e90][rid#8182958][/cgi-bin/printenv][2] sec_audit_logger_serial: start

Page 67: 039 Системный Администратор 02 2006

65№2, февраль 2006

bugtraq

Множественные уязвимости в Mozilla ThunderbirdПрограмма: Mozilla Thunderbird 0.x, 1.x.Опасность: Средняя.Описание: Обнаруженные уязвимости позволяют уда-ленному пользователю обойти ограничения безопаснос-ти, произвести XSS нападение и выполнить произвольный код на целевой системе. Удачная эксплуатация уязвимос-ти возможна при включенном JavaScript (по умолчанию JavaScript отключен).URL производителя: www.mozilla.com/thunderbird.Решение: В настоящее время способов устранения уязви-мости не существует. В качестве временного решения ре-комендуется запретить использование JavaScript и не от-крывать письма из недоверенных источников.

Отказ в обслуживании в службе IMAP в MailEnable ProfessionalПрограмма: MailEnable Professional версии до 1.72.Опасность: Средняя.Описание: Уязвимость существует из-за неизвестной ошибки в команде EXAMINE. Удаленный пользователь мо-жет аварийно завершить работу IMAP-службы.URL производителя: www.mailenable.com.Решение: Установите последнюю версию (1.72) с сайта производителя.

Раскрытие данныхв Fedora Directory ServerПрограмма: Fedora Directory Server 1.0.Опасность: Средняя.Описание: Уязвимость существует из-за того, что Admin Server раскрывает пароль администратора из файла adm.conf в теге IFRAME.URL производителя: www.directory.fedora.redhat.com/wiki/Main_Page.Решение: Установите последнюю версию (1.0.1) с сайта производителя.

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

Отказ в обслуживании при обработке LDAP-запросов в Fedora Directory ServerПрограмма: Fedora Directory Server 1.0.Опасность: Средняя.Описание: 1. Уязвимость существует в LDAP-компонен-те при обработке BER-пакетов. Удаленный пользователь может с помощью специально сформированного BER-па-кета заставить приложение потреблять все доступные ре-сурсы системы.

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

3. Уязвимость существует из-за ошибки при обработке BER-пакетов. Удаленный пользователь может послать оп-ределенную последовательность BER-пакетов и вызвать отказ в обслуживании приложения.URL производителя: www.directory.fedora.redhat.com/wiki/Main_Page.Решение: Установите последнюю версию (1.0.1) с сайта производителя.

Отказ в обслуживании в MDaemon IMAP ServerПрограмма: MDaemon IMAP Server 8.1.1.Опасность: Средняя.Описание: Уязвимость существует при обработке входных данных в команде LIST. Удаленный авторизованный поль-зователь может с помощью специально сформированного аргумента заставить приложение потреблять все доступ-ные ресурсы на системе. Пример:

URL производителя: www.altn.com.Решение: Установите исправление с сайта производите-ля.

M:\Distrib\nc>nc -v 127.0.0.1 143Blaster [127.0.0.1] 143 (imap) open* OK hack.com IMAP4rev1 MDaemon 8.1.1 ready0001 LOGIN "densen" "console"0001 OK LOGIN completed0003 CREATE "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"0003 OK CREATE completed0004 LIST "%s%s%s%s%s%s%s" "%s"

Обход ограничений безопасности в frag3-препроцессоре в SnortПрограмма: Snort 2.4.3.Опасность: Средняя.Описание: Уязвимость существует из-за ошибки в frag3-пре-процессоре, что может привести к тому, что Snort пропустит ip_option_length-байты в конце IP-опций во время дизассем-блирования пакета. Удаленный пользователь может с по-мощью специально сформированных фрагментированных пакетов обойти сигнатуры.URL производителя: www.snort.org.Решение: В настоящее время способов устранения уязви-мости не существует.

Обход ограничений безопасности в Sun Java JREПрограмма: JDK and JRE 5.0 Update 5 и более ранние вер-сии, SDK and JRE 1.4.2_09 и более ранние версии, SDK and JRE 1.3.1_16 и более ранние версии.Опасность: Высокая.Описание: Уязвимости существуют из-за неизвестных ошибок в reflection API. Злонамеренный апплет может обой-ти ограничения безопасности песочницы, прочитать и запи-сать произвольные файлы, выполнить произвольные при-ложения на системе.URL производителя: www.sun.com.Решение: Установите исправленную версию с сайта про-изводителя.

Page 68: 039 Системный Администратор 02 2006

66

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

Основателем и главным разра-ботчиком дистрибутива явля-ется итальянец Vincenzo Ciaglia.

На основной странице проекта [1] ска-зано, что Linux Netwosix является не-большим, мощным, легко настраива-емым, оптимизированным дистрибу-тивом, созданным для потребностей сетевого администратора. Предназна-чен для применения на серверах и ра-

боты, связанной с исследованием се-тевой безопасности. Распространяет-ся по лицензии GNU GPL.

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

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

Главный замысел создателя Linux Netwosix состоит в том, что система со-держит минимально необходимое ко-личество пакетов, так как часто быва-ет в других дистрибутивах, в которых для удовлетворения всех зависимос-тей на жесткий диск сваливается боль-

Исследуем сетевую безопасность посредством Linux Netwosix

Буквально через пять дней после объявления релиза 1.3 дистрибутива Linux Netwosix был анонсирован тестовый вариант следующей второй ветки. Что нового появилось и для каких целей предназначен Linux Netwosix?

Сергей Яремчук

Page 69: 039 Системный Администратор 02 2006

67№2, февраль 2006

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

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

При таком подходе Linux Netwosix в некотором смысле напоминает Trustix Secure Linux. Этот базирую-щийся на RedHat дистрибутив отлича-ется от своего прародителя тщатель-ным подбором пакетов и отсутствием лишнего софта, за счет чего считает-ся более безопасным. Но если Trustix является типичным представителем rpm-based дистрибутивов, то Netwosix принадлежит с source-based-дистрибу-тивам, в котором утилиты собираются из исходных текстов.

Базовый набор помещается на диск размером 242 Мб, и вся установка за-нимает не более 10 минут даже дале-ко не на самых мощных системах. Ес-тественно, весь набор софта не мог поместиться в такой маленький объ-ем, для его пополнения и обновления используется система портов Nepote (NEtwosix POrting Tool Environment), по-добная xBSD-системам.

Во второй ветке дистрибутив полу-чил новую систему установки, взятую с CRUX Linux (те, кто работал с CRUX, вообще найдут очень много общего), обновлены многие программы, дист-рибутив стал более стабильным и бе-зопасным.

В комплект 2.0-rc1 входит послед-нее стабильное ядро на момент рели-за 2.6.14.5. Работает Linux Netwosix на компьютерах с x86-процессорами, под-держка других архитектур планирует-ся в будущем.

В течение первого года с офи-циального сайта проекта дистрибу-тив был скачан более 25 тысяч раз. Диск с ним был приложен к итальянс-кому журналу Linux Magazine. Его ис-пользует финское министерство об-разования, и некоторые университе-ты в Италии.

Установка Linux NetwosixСкачиваем iso-образ с официального сайта проекта или любого из зеркал. После этого проверяем правильность полученного файла при помощи конт-рольной суммы.

ISO-образ является LiveCD, поэ-тому записываем на диск, вставляем в привод и перезагружаемся. После появления приглашения boot: необхо-димо нажать на Enter и затем зарегис-трироваться как root с пустым паролем. Краткую инструкцию по установке и на-стройке Linux Netwosix (на английском) можно получить, зарегистрировавшись во второй консоли (<ALT> + <F2>) и вве-дя «netwosix_howto». Следующий этап – создание дисковых разделов. Для этих целей используются fdisk или cfdisk (GNU/parted нет). Разработчики реко-мендуют создать четыре раздела: swap (2хОЗУ); root (350-500 Мб); /var (не менее 100 Мб); /usr (> 1 Гб).

Хотя в зависимости от назначения сервера можно в этот список добавить /home, /usr/local или /opt. Каждому раз-делу должен быть присвоен свой тип, т.е. swap 82, остальным 83. После со-здания разделов форматируем их под нужную файловую систему. В HOWTO приведены команды для создания ext2 (mke2fs /dev/hdaN), ext3 (mke2fs -J) и ReiserFS (mkreiserfs), но в дистрибу-тиве имеются утилиты для создания JFS (mkfs.jfs) и XFS (mkfs.xfs). Поэто-му можно выбрать любую из этих фай-ловых систем. Создаем и активируем своп-раздел.

Интересно, что в документации на-звания разделов приводятся пооче-редно то в традиционном обозначении вроде /dev/hda1, то в стиле devfs -/dev/discs/disc0/part1. В отличие от CRUX, в котором не поддерживается обрат-ная совместимость, здесь будут рабо-тать оба варианта, но такое расхожде-ние может запутать новичка (хотя вряд ли новичок будет его ставить). И монти-руем все созданные разделы в /mnt/.

После этого приступаем к собствен-но установке, введя setup. В первом эк-ране выбираем установку или обновле-ние Linux Netwosix, затем необходимо ввести каталог, в который смонтиро-

ваны разделы (/mnt). После этого пред-лагается установить базовый набор ( ), в который входит около 65 пакетов. Сре-ди них auticonf 2.59, automake 1.9.5, bash 3.0, coreutils 5.2.1, devfsd 1.3.25, gcc 3.43, glibs 2.3.5, make 3.80, patch, lilo 22.7, ncurces, perl 5.8.6, vim, sendmail 8.13.4, wget, net-tools.

Выберите обязательно утилиты для работы с портами ports. Кроме базово-го набора, на жесткий диск копируются исходные тексты ядра 2.6.14.5. По окон-чании процесса выводится отчет об ус-тановленных пакетах. На этом установ-ка считается законченной. Но в тра-дициях всех дистрибутивов, собира-емых из исходных текстов ядра, в та-кой системе нет. Поэтому следующим шагом идет компиляция ядра. Перехо-дим в chroot-окружение.

И собираем ядро:

Чтобы не терять времени, пока компилируется ядро, переходим во вторую консоль и приступаем к на-стройке системы. Первым делом ус-танавливаем пароль суперпользова-теля командой passwd. Далее при по-мощи редактора vi редактируем фай-лы /etc/fstab, /etc/rc.conf, /etc/rc.d/net, /etc/hosts и /etc/resolv.conf. Хочется от-метить, что разработчики не стали ус-ложнять жизнь, а заготовили шабло-ны. Например:

Причем такие строки существуют для всех поддерживаемых ядром фай-ловых систем. Остается только раском-ментировать нужную строку и вместо #REISERFS_ROOT# вписать нужный раздел. Теперь /etc/rc.conf, в котором необходимо указать клавиатурную рас-кладку (можно посмотреть имеющиеся в /usr/share/kbd/keymaps/i386/qwerty), уста-новить часовой пояс (/usr/share/zoneinfo/), шрифт (/usr/share/kbd/consolefonts/) и указать автоматически запускающи-еся при старте системы сервисы.

# md5sum netwosix2.0-rc1.x86.iso

e88a3a4c2d1f388cb9352442c89038f7

# mkswap /dev/hda1# swapon /dev/hda1

# mount /dev/hda2 /mnt # корневой# mkdir /mnt/usr# mkdir /mnt/var# mount /dev/hda3 /mnt/usr # mount /dev/hda3 /mnt/var

# mount -t devfs devfs /mnt/dev# mount -t proc proc /mnt/proc# chroot /mnt /bin/bash

# /dev/#REISERFS_ROOT# / ↵ reiserfs defaults 0 0

# cd /usr/src/linux-2.6.14.5# make menuconfig# make all# make modules_install# cp arch/i386/boot/bzImage /vmlinuz# cp System.map /

Page 70: 039 Системный Администратор 02 2006

68

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

У меня он получился такой.

Обратите внимание на строку SERVICES, в которой просто перечислены сервисы, которые необходимо авто-матически запустить при старте системы, все имеющиеся на данный момент можно найти в /etc/rc.d/. После установ-ки в этом каталоге будет четыре файла, crond, inetd, net, sendmail. Сетевые интерфейсы настраиваются в /etc/rc.d/net, который также снабжен шаблонами. Настроим один интер-фейс жестко с IP-адресом 192.168.0.1, второму адрес на-значает провайдер.

И последним этапом конфигурируем и устанавливаем загрузчик LILO. Файл /etc/lilo.conf также имеет шаблон, и нам остается только указать правильно корневой раздел.

Редактируем, записываем, нажав <Esc> и набрав «:wq». И устанавливаем:

Все, система полностью готова к работе, самое время добавить необходимые сервисы, поэтому переходим к сис-теме портов.

Система пакетов и портов Linux NetwosixВ документации проекта сказано все о системе портов nepote, но абсолютно ни слова не говорится о системе па-кетов, хотя они в системе используются, и умолчать об этом прав не имеем. Очевидно, пакеты планируется использо-вать только при установке и обновлении системы, глав-ную же роль при построении сервера будет играть все-та-ки nepote. Система пакетов не только полностью заимство-вана, но и даже совместима с Crux.

Устанавливаются пакаджи при помощи команды pkgadd с указанием полного имени пакета, при этом будет произве-дена проверка зависимостей и после чего предварительно скачанный с сайта пакет установится. Если пакет уже уста-новлен, но требуется обновить его, то набрав:

избежим сообщения о том, что пакет уже установлен. Для того чтобы предотвратить модификацию некоторых важных для системы каталогов и файлов они указывают-ся в /etc/pkgadd.conf. Например:

Если снять комментарий с первой строки, будут моди-фицированы все файлы. Более поздняя запись имеет боль-ший приоритет при запросе. Во второй и третьей строках запрещается модификация каталога и подкаталогов /etc и /var/log, но в последней строке разрешено изменение фай-лов в /etc/mail/cf/. Удалить пакет также просто:

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

или если нужен определенный, то:

Используя pkgmk, можно собрать пакаджи самому.

Рисунок 1. Выбор пакетов базовой установки

# pkgadd -u package_name

# UPGRADE ^.*$ YESUPGRADE ^etc/.*$ NOUPGRADE ^var/log/.*$ NOUPGRADE ^etc/mail/cf/.*$ YES

# pkgrm bash

# pkginfo -i

# pkginfo -l bash

FONT=Cyr_a8x16KEYMAP=ru4TIMEZONE=Europe/KievHOSTNAME=host.comSERVICES=(net crond)

#!/bin/sh # # /etc/rc.d/net: start/stop network # Linux Netwosix # <http://www.netwosix.org>

if [ "$1" = "start" ]; then /sbin/ifconfig lo 127.0.0.1 /sbin/ifconfig eth0 192.168.0.1 netmask 255.255.255.0 /sbin/dhcpcd eth1 /sbin/route add default gw 192.168.1.100 elif [ "$1" = "stop" ]; then /sbin/ifconfig eth1 down /sbin/ifconfig eth0 down /sbin/ifconfig lo down killall -q /sbin/dhcpcd

else echo "usage: $0 start|stop" fi

# End of file

## /etc/lilo.conf# Linux Netwosix# <http://www.netwosix.org>#lba32install=textboot=/dev/hdаimage=/vmlinuz label=LinuxNetwosix root=/dev/hdа2 read-only append="quiet"

# End of file

#lilo -v

Page 71: 039 Системный Администратор 02 2006

69№2, февраль 2006

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

Но основным средством, предназначенным для уста-новки приложений, является nepote. На момент написа-ния статьи в системе портов было около 190 приложений в 9 категориях. Понятие порта здесь немного отличает-ся от таковых в FreeBSD. Под портом понимается скрипт, обеспечивающий загрузку и компиляцию конкретной про-граммы, а также набор программ, упрощающих обновле-ние дерева, поиск нужных портов. Перед началом работы рекомендуется обновить дерево портов. Пока это делает-ся вручную, в будущем планируется операцию автоматизи-ровать, хотя при желании простенький скрипт можно напи-сать и самому.

Либо при помощи утилиты nepote:

Нажав клавишу <1>, можно произвести обновление все-го дерева портов как с официального сайта, так и указав любой другой сервер. Если выбрать <2>, то будет загружен и установлен файл обновлений системы updateLN.tgz. Кон-фигурационные файлы nepote находятся в /etc/nepote, за-глянув внутрь, можно легко подстроить систему под себя. Для поиска порта используется команда nepote-find. Пос-ле запуска будет предложено ввести название порта, ес-ли такой пакет будет обнаружен, то будет выведен полный путь к нему. Например, файл порта веб-сервера Apaсhe выглядит так.

# cd /# wget –c ftp://rm.mirror.garr.it/mirrors/netwosix/ ↵ nepote/ports.tgz# tar xzf ports.tgz# rm ports.tgz

# nepote

*******************> Linux Netwosix - NEPOTE <*******************Select an option and press enter, please.*****************************************************************(1) to update your NETWOSIX portage tree (from the net)(2) to update from the net your Linux Netwosix box(0) to quit*****************************************************************Nepote is developed by Vincenzo Ciaglia <[email protected]>*****************************************************************

# LINUX NETWOSIX - NEPOTE PACKAGE# Description: Apache Server# URL: http://www.apache.org# Date created: Dec, 25 2005# Maintainer: Apache.org

# Please, change only this 4 lines, to build your package# from a portage treepackage_name=httpdversion=2.2.0release=2source=http://mirrors.publicshout.org/apache/httpd/ ↵ httpd-2.2.0.tar.gz# STOP!

# Downloading the package ...wget $source

# building the packages using NETWOSIX portage tree tar xzf $package_name-$version.tar.gz cd $package_name-$version ./configure make make install cd /usr/ports/net/apache rm $package_name-$version.tar.gz rm -r $package_name-$version

Как видите, ничего сложного здесь нет, это набор обыч-но задаваемых команд.

Для его установки необходимо зайти в каталог порта и ввести sh nepote.

После чего файл будет скачан, распакован, скомпили-рован и установлен. Если в процессе установки появят-ся проблемы, связанные с неудовлетворенными зависи-мостями, то в этом случае следует использовать коман-ду «sh nepote-dep».

Для установки флагов компилирования используется файл /etc/pkgmk.conf.

Хотя в дереве портов и программе установки 2.0 есть, на мой взгляд, несколько недоработок. Например, на CD-диске /netwosix/additional присутствует раздел, содер-жащий исходные тексты 116 приложений, в том числе и вхо-дящих в дерево портов. Но ни во время установки системы, ни при использовании nepote эти архивы никак не задейс-твуются, лежа мертвым грузом. Хотя в принципе их можно использовать. Не скачивать же их повторно.

Например, смонтировать диск и скопировать архив веб-сервера Apaсhe httpd-2.2.0.tar.bz2 в каталог /usr/ports/net/apaсhe. Но так просто установить его не получится, т.к. скрипт nepote будет искать файл с расширением tar.gz. Поэтому просто переделываем под свои нужды скрипт, ис-правив следующие строки.

Теперь Apache установится без проблем. Далее на-звание подкаталога graphics, по моему мнению, несколь-ко не соответствует ожидаемым приложениям, т.к. зайдя внутрь, готов увидеть что-то вроде GIMP. Сейчас внутри – 8 портов: axyftp, gftp, xchat, sylpheed, dxpc, pavuk, ethereal и crank.

ВыводЕсть два типа администраторов. Первый не будет (или не лю-бит) заниматься «бесполезной» работой и использует то, что установлено вместе с дистрибутивом и доступно че-рез обновления. Второй пересоберет критически важные для него пакеты со своими настройками и уберет, по его мнению, лишнее. Netwosix предназначен именно для вто-рых, которым этот дистрибутив будет несомненно интере-сен. При наличии подготовленных конфигурационных фай-лов ядра и серверов, систему под любые требования можно собрать в течение часа. И хотя предрелиз 2.0 явно сыроват, но это не мешает его использовать полноценно.

Ссылки:1. Сайт проекта Linux Netwosix – http://www.netwosix.org.2. Vincenzo Ciaglia, «Linux Netwosix One Year Later» – http://www.

linuxsecurity.com/content/view/117808/49.

# cd /usr/ports/net/apaсhe# sh nepote

export CFLAGS="-O2 -march=i686 -pipe"export CXXFLAGS="-O2 -march=i686 -pipe"

# wget $sourcetar xjf $package_name-$version.tar.bz2rm $package_name-$version.tar.bz2

Page 72: 039 Системный Администратор 02 2006

70

сети

История развития DVB-S-стан-дарта уходит корнями в пос-ледние несколько десятилетий

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

Запрос на конкретный документ в сети происходит по обратному ка-налу связи, а на тарелку принимается трафик со спутника. С прямым каналом вроде бы всё ясно – скорость приема достаточно высокая, порядка 4 Мбит/с (а если быть точным, то ограничение здесь накладывает DVB-S-карта с её максимальной символьной скоростью, которую она может обработать). С об-ратным каналом количество вариантов

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

Трасса N1 – обратный канал свя-зи. На схеме не показан региональ-ный ISP, но его наличие предполага-ется. По трассе N2 проходит трафик уже от/к самому спутниковому провай-деру. Далее он передается на спутник и в качестве СВЧ-излучения по трассе N3 (прямому каналу) приходит к вам в дом.

Итак, по обратному каналу проис-ходит запрос на ресурс в сети, по пря-мому каналу происходит его получе-

ние. Вроде бы всё ясно и понятно. А те-перь представьте, что обратного кана-ла нет. Будь у нас обычное модемное соединение или ethernet-подключение, то разумно было бы расстроиться. Од-нако это не повод впадать в депрессию в случае со спутниковым каналом. По-чему? Сейчас разберемся.

Когда пользователь отправляет за-прос по обратному каналу спутниково-му оператору (предположим, что это PlanetSky [2] или SatGate [3]), то пос-ледний забирает файл в сети по ука-занному url и со спутника отправляет уже для всей аудитории территории покрытия. А уж кому предназначается данный файл, решает конечный поль-зователь, т.е. из всего DVB-потока вы-бираются те данные, которые совпада-ют с MAC-адресом DVB-карты пользо-вателя и с PID, который был выдан при его подключении к спутниковому опе-ратору. Таким образом, фильтрация данных в DVB-потоке на совести ко-нечного пользователя.

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

Подключаемся к Интернету через спутник

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

Антон Борисов

Page 73: 039 Системный Администратор 02 2006

71№2, февраль 2006

сети

ника. Луч достаточно широкий, поэтому получить сигнал теоретически сможет любой, было б необходимое обору-дование. Здорово, не правда ли? Эта процедура и называ-ется – спутниковая «рыбалка».

Дабы не быть голословным, рассмотрим данный вид «спорта» на реальном примере. Считаем, что тарелка, DVB-S-карта установлены, драйвера настроены и вы в кур-се, что такое PlanetSky (или хотя бы слышали).

Я переориентирую тарелку на направление 40E (вос-точная долгота) – это спутник Express AM 1 [5].

Проверяю уровень сигнала, который приходит на та-релку.

В среднем значение 72%. Вполне терпимо.Сам файл channels.conf выглядит так:

Если для приема видео/аудио каналов AID, VID и важ-ны (последние 3 цифры в параметрах транспондера), то для приема потока они не важны. Почти.

Чтобы посмотреть, какие PID (Packet IDentifier) передают-ся на данной частоте, стоит запустить утилиту dvbtraffic.

Получается, что потоки с номерами PID (обращаю ваше внимание на их шестнадцатиричную нотацию) в самом на-чале списка и в конце наиболее оживленные. Однако пос-ледний поток – это суммарный общий поток. Начнем с про-стого – опробуем самый первый.

Для этого настроим dvb-интерфейс на этот PID.

Для приема данных воспользуемся пакетом owns – One Way Network Sniffer [6]. Программа довольно простая. Требуется указать интерфейс, на котором будем вылавли-вать поток данных (см. рис. 2).

Затем по вкусу выставить размер файлов. Я выставил в качестве фильтра все графические и текстовые файлы больше 100 Кб (см. рис. 3).

Нажимаем на кнопку «Start Capture» и можно ждать. Главное, чтобы место на жестком диске не кончилось.

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

Рисунок 1. Асинхронное подключение к спутниковому Интернету [4]

$ szap -c /etc/channels.conf "PlanetSky"

reading channels from file '/etc/channels.conf'zapping to 64 'PlanetSky':sat 0, frequency = 11051 MHz H, symbolrate 29650000, vpid = 0x020c, apid = 0x020cusing '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'status 03 | signal b893 | snr cfde | ber 0000039b | unc 00000000 | status 1f | signal b81d | snr d4c7 | ber 00000008 | unc 00000000 | FE_HAS_LOCKstatus 1f | signal b8a7 | snr d4ac | ber 00000000 | unc 00000000 | FE_HAS_LOCKstatus 1f | signal b6dc | snr ccd2 | ber 00000000 | unc 00000000 | FE_HAS_LOCKstatus 1f | signal b83d | snr d566 | ber 00000000 | unc 00000000 | FE_HAS_LOCK

# 40EFirstChannel:3675:r:0:33483:650:512:1:1Rossiya:3675:r:0:33483:660:513:1:2RMayak:3675:r:0:33483:0:651:1:11PlanetSky:11051:h:0:29650:524:524:524

$ dvbtraffic

0200 2543 p/s 466 kb/s 3825 kbit0202 3926 p/s 720 kb/s 5904 kbit0203 724 p/s 132 kb/s 1089 kbit0204 1252 p/s 229 kb/s 1883 kbit0205 792 p/s 145 kb/s 1191 kbit0207 200 p/s 36 kb/s 301 kbit0208 342 p/s 62 kb/s 514 kbit0209 723 p/s 132 kb/s 1088 kbit020a 791 p/s 145 kb/s 1190 kbit020b 235 p/s 43 kb/s 354 kbit020c 844 p/s 154 kb/s 1269 kbit020d 225 p/s 41 kb/s 339 kbit020e 1232 p/s 226 kb/s 1853 kbit020f 137 p/s 25 kb/s 206 kbit0210 194 p/s 35 kb/s 292 kbit0211 849 p/s 155 kb/s 1277 kbit0212 373 p/s 68 kb/s 561 kbit022b 575 p/s 105 kb/s 865 kbit0309 359 p/s 65 kb/s 540 kbit0378 140 p/s 25 kb/s 211 kbit03e7 140 p/s 25 kb/s 211 kbit2000 16606 p/s 3048 kb/s 24976 kbit

# dvbnet -p 0x200

DVB Network Interface ManagerVersion 1.1.0-TVF (Build Втр Сен 06 23:45:44 2005)Copyright (C) 2003, TV Files S.p.A

Device: /dev/dvb/adapter0/net0Status: device dvb0_1 for pid 512 created successfully.

# ifconfig dvb0_0 192.168.0.1

Рисунок 2. Указываем интерфейс для приема

Page 74: 039 Системный Администратор 02 2006

72

сети

ко неэтично слушать радиостанции FM-диапазона? Пожа-луй, этично. А если вы слышите разговор по беспроводно-му телефону в этом диапазоне? Мне кажется, что это будет уже забота тех, кто болтает, чтобы их не слышали. В приме-нении к спутниковому Интернету это означает, что сохран-ность информации зависит от профессиональности прини-мающей стороны. Что это означает? «Рыбалка», по-види-мому, ваш промежуточный шаг к использованию асиммет-ричного спутникового Интернета. Технология поворота ан-тенны и получение трафика без ошибок отработана. Сле-дующее действие – подключение к спутниковому провай-деру. А вот в этот момент вы уже знаете, что данные может получить и кто-то еще. Нужно безопасное соединение? Ис-пользуйте VPN-шлюзы! Тогда ваш трафик придет в зашиф-рованном виде. Не желаете использовать полную шифра-цию – упаковывайте архивы с паролями. В противном слу-чае получайте данные в открытом виде, например, филь-мы, звуковые файлы, книги и т. п. Аудитория спутниковых рыбаков будет вам благодарна. Но похоже мы с вами рас-фантазировались и забежали в будущее – пока же мы сами работаем обычными «рыболовами-спортсменами».

Так, что там с полученными данными (см. рис. 4)?За 737 секунд входящий трафик оказался немалень-

ким – более 300 Мб. Весьма и весьма неплохо. Более 2/3 трафика пришлось на TCP-соединения, 1/3 – на дру-гие протоколы. Чтобы сказать более точно, что это за про-токолы, следует скопировать весь поток в файл и проана-лизировать его.

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

тило кванта времени на переключение контекста задачи и, в итоге, «вылетел» маленький кусочек большого файла. В случае, если это графический или видео-файл, то поч-ти ничего страшного. Однако если попался архив, то увы и ах (см. рис. 5).

Другой негативный момент – обилие информации. Требуются большие запасы свежего места на винчесте-ре, т.е. это мегабайты и гигабайты свободного места, ко-торое через несколько часов перестанет быть свобод-ным. А отсюда вытекает проблема сортировки. В частнос-ти, у OWNS не слишком развита система фильтрации фай-лов. Что делать?

Обратимся к альтернативной программе – skynet [6]. Нет, это не сеть из Terminator 2 – это программа отечест-венной инженерной мысли. Как в лучших детективах, из-вестен о нем только позывной – s.o.v.a.

Интерфейс у skynet довольно оригинальный, если не сказать спартанский (см. рис. 6).

Однако, как было упомянуто на одном форуме, имен-но горизонтальные полоски, характеризующие процесс получения файлов, а также их разбивку по типам файлов (jpeg, avi, djvu и т. д.), являются визитной карточкой skynet. Ну и, конечно же, алгоритм сборки файлов по фрагментам. И стоит отметить особо – самый минимальный размер сре-ди программ подобного класса – всего 150 Кб!

Обращаю внимание, что ключевым файлом к успешной рыбалке является содержимое файла skynet.ini, в котором задается частота транспондера, символьная скорость и PID потоков. В моем варианте самые важные параметры вы-ставлены следующим образом.

Рисунок 3. Выставляем фильтр на размер файлов Рисунок 4. Анализируем статистику приема

tuner=11051000,H,29650000,Apids=512

incomplete=/mnt/BigMuzzy/SkyTest/incompletetemp=/mnt/BigMuzzy/SkyTest/tempok=/mnt/BigMuzzy/SkyTest/ok

Page 75: 039 Системный Администратор 02 2006

73№2, февраль 2006

сети

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

Кроме указанного skynet.ini существуют файлы regex.txt и rules.txt – названия их говорят сами за себя. В первом хра-нятся шаблоны, с помощью которых происходит идентифи-кация типа файла, а во втором – правила, по которым сле-дует ловить файлы.

Предположим, что вам интересны будут только zip-фай-лы, предназначенные для определенного MAC-адреса. Тог-да использование указанной ниже конструкции в rules.txt позволит подхватывать данные архивы.

Предположим, что все zip-файлы не представляют ин-тереса, а нужны только файлы больше 500 Кб и с опреде-ленного IP-адреса.

Можно указывать не только, с какого именно IP-адреса, но и для какого адресата предназначен файл.

В этом случае, все zip-файлы, предназначенные для адресата с IP-адресом «1.2.3.4» и размером меньше, чем 500 Кб, попадут к вам на обработку.

Чтобы во время работы добавлять/удалять нужные классы файлов, следует нажать <Ctrl+G>. На дополни-тельной цифровой панели справа с помощью серых кла-виш «+»/«-» указать нужный диапазон размеров фай-лов. И не забыть нажать <Ctrl+S>. Тогда созданный файл regex.dat в директории с xskynet позволит в дальнейшем не запускать X-Server и xskynet, а непосредственно из кон-соли заниматься столь интересным делом, как спутнико-вая рыбалка.

Бывает так, что файл приходит с «дырками» в архиве. Что делать? Исправлять по мере возможности. Если фай-лы упакованы zip, то попытаться его исправить:

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

Для упакованных файлов архиватором rar используйте следующую комбинацию:

Если вас заинтересовали тонкости настройки skynet,

то нелишним будет ознакомиться с информацией волго-градского ресурса [8].

На этом пока всё. Желаю творческих успехов в сор-тировке полученных гигабайтов. Надеюсь, вы по-настоя-щему оцените тот калейдоскоп, который буквально пада-ет на нас сверху.

Ссылки:1. http://hostinfo.ru/htmltree/communication/satellite.2. http://www.planetsky.com.3. http://www.satgate.com.4. http://www.space-service.ru/technology.html.5. http://www.lyngsat.com/eam1.html.6. http://owns.sourceforge.net.7. http://skynet.mcdir.ru/files/skynet090.7z.8. http://www.volgosat.ru/skynet.html.

Рисунок 5. Помехи при приеме вызывают потерю данных

Рисунок 6. Фильтрация данных в программе skynet

m 0011223344 +zip

s 1.2.3.4 +zip[500k-]

d 1.2.3.4 +zip[-500k]

$ zip -FF ZipArchive.zip$ unzip ZipArchive.zip

$ rar x -kb RarArchive.rar

Page 76: 039 Системный Администратор 02 2006

74

сети

Андрей Погребенник

Какова цена анонимности в Сети

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

– А зачем тогда оно нужно? Если ты сам знаешь, что это бесполезно?– Как тебе сказать. Потому что, кроме этого, я знаю еще много других

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

это действительно не имеет смысла. Но просто сидеть в темноте не имеет смысла в любом случае. Понимаешь, в чем разница?

Виктор Пелевин «Затворник и шестипалый»

Page 77: 039 Системный Администратор 02 2006

75№2, февраль 2006

сети

В современном обществе пробле-ма балансирования между го-сударственной безопасностью

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

Мы будем рассматривать ПО двух типов: ПО анонимных сетей общего назначения и клиентов анонимных ре-мэйлеров электронной почты. Специ-фика систем информационной безо-пасности заключается в том, что раз-работчики вынуждены идти на ком-промисс между степенью защиты и лёгкостью использования системы, её «прозрачностью» для конечного пользователя.

Речь пойдёт о средствах достиже-ния надёжной анонимности (militant grade anonymity), работающих поверх Интернета – открытой сети, к которой нет доверия, что на поверку оказыва-ется одной из сложнейших задач ин-формационной безопасности. Неуди-вительно, что за анонимность пользо-ватель расплачивается увеличенной латентностью сети, снижением скоро-сти, нередко – гигабайтными объёма-ми трафика.

Модель угрозыСразу следует развеять некоторые заблуждения касательно более рас-пространённых методов достижения «анонимности» и конфиденциальнос-ти в сети, а именно VPN и анонимных прокси-серверов.

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

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

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

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

Итак, против анонимных сетей и се-тей ремэйлеров эффективны атаки пе-ресечения. Анонимные сети и ранние разработки в области криптографи-ческих ремэйлеров также подверже-ны тайминг-атакам (http://www.i2p.net/how_threatmodel).

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

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

Наконец атака пересечения бази-руется на данных о моментах и продол-

жительности сеансов связи узлов сети. Для успешного проведения атаки пе-ресечения также необходима возмож-ность анализа трафика в глобальных масштабах.

Классифицировано большее чис-ло атак, но остальные выходят за рам-ки статьи.

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

Ранние анонимные сети. Freedom и FreenetПервой успешной анонимной сетью был коммерческий сервис Freedom, существовавший в период с 1998 до 2001 года. Компанией ZKS были установлены выделенные серверы, с которыми клиенты «общались» пос-редством криптографического прото-кола. Узел, на который приходили па-кеты от пользователя Freedom, не мог

Рисунок 1. Схематическое изображение образования сеансасвязи через сеть Tor

Page 78: 039 Системный Администратор 02 2006

76

сети

идентифицировать настоящего отпра-вителя. Сама сеть функционировала на уровне протокола IP.

Перед тем как перейти к «главным героям» статьи, следует сказать пару слов о проекте Freenet [1] – хронологи-чески также один из первых, но разви-вающийся по сей день. Он реализовал анонимное и конфиденциальное рас-пределённое хранилище статических данных, не связанное с конкретным узлом сети. В сети Freenet информа-ция хранится в зашифрованном ви-де, при этом ни операторы узлов сети, ни её создатели не знают содержимо-го хранимых ими данных (т.н. систе-ма с нулевым уровнем знаний), физи-ческого местоположения данных и ни-как не могут влиять на процесс их пе-ресылки.

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

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

В разработке находится версия 0.7 проекта Freenet, – новой масштабиру-емой сети, реализующей механизм «onion routing» [2], а значит – потенци-ально сопоставимой по функциональ-ности с сетью Tor, к описанию которой мы и переходим. Там же будет изложе-на суть механизма onion routing.

Анонимная сеть TorTor [3] – наиболее известная и развитая среди существующих анонимных се-тей (несмотря на раннюю стадию раз-работки, в которой пребывает проект), создаётся в США с середины 2002 года в рамках проекта Free Haven [4]. Дейс-твия же в области разработки протоко-лов «onion routing» велись с середины 1996 года. Корни проекта ведут к MIT, а список спонсоров включает DARPA, Office of Naval Research и Electronic Frontier Foundation. Распределённая сеть серверов сети Tor насчитывает около 350 постоянно подключённых уз-лов, а количество активных пользова-телей превышает 100000. Сеть не яв-

ляется полностью децентрализован-ной – существуют 3 центральных сер-вера каталогов, хранящие подписан-ный актуальный список узлов сети Tor с их реальными адресами и отпечатка-ми открытых ключей (генерируемыми заново каждые 7 дней), т.е. регистра-ция серверов производится центра-лизованно. Что касается территори-альной распределённости, то два из трёх серверов каталогов размещены в США, а число энтузиастских серве-ров в США также выше, чем в любой другой стране.

Сеть Tor называют вторым поколе-нием сетей, построенных по принципу «onion routing». Суть его в следующем. Клиентская сторона формирует це-почку из трех произвольно выбранных узлов сети Tor. Среди них есть вход-ной (entry node) по отношению к кли-енту узел и выходной (exit node), сеть Tor при этом функционирует как шлюз между клиентом и внешней сетью (Ин-тернетом). Каждый Tor-сервер «знает» о предшествующем ему и последую-щем, но не более того, а замыкающие узлы не знают, кто находится на дру-гой стороне канала и кто иницииро-вал соединение. Отсутствие логичес-кой связи между отправителем и со-общением и гарантирует надёжную анонимность.

На рис. 1 схематически показан процесс анонимной пересылки сооб-щения. В пути, проложенном по Ин-тернету через произвольно выбран-ные серверы сети Tor красной лини-ей изображены зашифрованные ка-налы, зелёной – незашифрованные. Узлы сети Tor выделяются зелёным цветом.

Несложно заметить, что такая схе-ма делает бесполезным перехват тра-фика на стороне ISP (ваш провайдер «видит» лишь поток шифртекста, со-стоящий из пакетов постоянной дли-ны).

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

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

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

Образованные цепочки каждые 10 минут перестраиваются: таким обра-зом через каждый узел сети проходит ограниченный объём данных от каждо-го клиента. Для каждой вновь образо-ванной цепочки серверов генерирует-ся новый сеансовый ключ, а для про-тиводействия атакам анализа трафика блок данных имеет, как уже было ска-зано, постоянный размер – 512 байт. «Луковица» может содержать сведе-ния, необходимые для установки об-ратного канала – двусторонних соеди-нений. Функционируя на уровне TCP (и пересылая лишь легитимные по-токи TCP), Tor предоставляет надеж-ный транспорт для прикладных про-грамм посредством протокола SOCKS (см. статью «Универсальный прокси-сервер», Системный администратор, №2, 2005 г.).

Пользователь Tor может вручную формировать цепочки входящих и ис-ходящих серверов сети Tor (параметры EntryNodes и ExitNodes) и выбирать по-литику участия в сети (exit policy): сер-вер сети Tor может функционировать как посредник (middleman node), толь-ко передающий трафик другому узлу, так и выходной узел (exit node), трафик из которого в открытом виде выходит в большую Сеть.

Следовательно, пользователям сети для сокрытия трафика от выход-ного узла следует помнить о целесо-образности применения SSL или по-добных ему протоколов на приклад-ном уровне.

Оператор сервера может блокиро-вать определенные IP-адреса или пор-

Page 79: 039 Системный Администратор 02 2006

77№2, февраль 2006

сети

ты, предотвращая, например, исполь-зование filesharing-сервисов и рассыл-ку спама.

Так, принятая по умолчанию поли-тика предусматривает блокирование всех исходящих соединений на порт TCP 25 для борьбы со спамом, а также портов наиболее популярных клиен-тов пиринговых сетей. Поскольку вы-ходной узел «видит» открытый текст, он становится слабым звеном в цепи

Tor, и с этой точки зрения гибкость на-стройки политик – одно из наиболее мощных свойств сети Tor, повышаю-щих её привлекательность для энтузи-астов, желающих поддерживать свой сервер сети Tor.

Информация о статусе серверов сети Tor обновляется каждые 15 ми-нут при работе в режиме сервера и 30 – в режиме клиента, а подписанный спи-сок всех серверов сети Tor загружает-

ся каждые 20 минут в режиме серве-ра и 1 час – в режиме клиента.

Естественно, администратор может управлять этими параметрами, а так-же назначать группы серверов (кли-ент избегает одновременного исполь-зования узлов одной группы; это име-ет смысл, если вы оперируете более чем одним узлом Tor).

Можно даже настроить ПО на ра-боту в режиме сервера каталогов, что позволяет развернуть самодостаточ-ную сеть Tor в вашей локальной сети.

Что касается сетевой безопаснос-ти, то здесь, кроме атак с участием «глобального наблюдателя» и тайминг-атак (которым по определению не мо-гут полностью противостоять аноним-ные сети с низкой латентностью), уг-розу представляет практическая воз-можность корреляции анонимного и неанонимного трафика, так как все TCP-соединения мультиплексируются в один канал.

В качестве контрмеры здесь целе-сообразно поддерживать несколько параллельно работающих экземпля-ров процесса Tor. Если же пользова-тель поддерживает собственный сер-вер сети Tor, то отличить порождае-мый им трафик от трафика, проходя-щего через его сервер от других кли-ентов, и вовсе невозможно. Компроме-тация же одного или нескольких сер-веров цепи к потере анонимности или конфиденциальности не ведёт. Так, ес-ли скомпрометировано c из n узлов сети Tor, то вероятность успеха ком-прометации случайного сеанса свя-зи равна c2/n2.

Практические вопросыПри настройке прикладных программ не-HTTP-приложения, не обладающие поддержкой SOCKS, должны быть под-вергнуты процедуре соксификации. Гораздо проще этот процесс происхо-дит в UNIX-подобных ОС, в Windows же он сопряжён с большими трудно-стями.

Для этого в дистрибутив Tor вклю-чены команды tsocks и torify, исполь-зующие механизм LD_PRELOAD; можно использовать и Socat [5] – ре-лэй для двусторонней передачи дан-ных между независимыми каналами (в роли которых могут выступать фай-лы, сокеты, специальные устройства, SOCKS-клиенты и т. д.).

Правовое регулирование использования стойкой криптографииРазумеется, использование ПО, о кото-ром идёт речь в статье, не регулируется законодательством специальным обра-зом. Тем не менее, правовые аспекты ис-пользования средств криптографической защиты информации (СКЗИ, будь то кли-ентское ПО анонимных сетей или ремэй-леров или иное ПО, с которым вы работа-ете), заслуживают отдельного рассмотре-ния. Правовая модель, принятая в РФ, сле-дует знакомому вам принципу: «разреше-но всё, что явно не запрещено». Основная правовая база – законы «Об информации, информатизации и защите информации» и «О коммерческой тайне», Приказ ФСБ «Об утверждении положения о разработ-ке, производстве, реализации и эксплуа-тации шифровальных средств защиты ин-формации», Указ Президента РФ «О мерах по соблюдению законности в области раз-работки производства, реализации и экс-плуатации шифровальных средств, а так-же предоставления услуг в области шиф-рования информации».

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

вой практике автору неизвестно.Далее, требование эксплуатации ис-

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

Что касается лицензирования СКЗИ, п. 4 Указа Президента N334 от 03.04.95 за-прещает деятельность юридических и фи-зических лиц по эксплуатации СКЗИ без ли-цензии, выданной ФАПСИ при Президенте РФ. В соответствии с п. 1 ст. 1 Федерального закона «О лицензировании отдельных ви-дов деятельности» от 08.08.2001, «закон ре-гулирует отношения, возникающие между федеральными органами исполнительной власти, органами исполнительной власти субъектов Российской Федерации, юриди-ческими лицами и индивидуальными пред-принимателями в связи с осуществлением лицензирования отдельных видов деятель-ности в соответствии с перечнем, предус-мотренным пунктом 1 статьи 17 настоящего Федерального закона». Но перечень из п. 1 ст. 17 не включает положения о лицензиро-вании деятельности, связанной с эксплуа-тацией СКЗИ, следовательно, эксплуата-ция лицензированию не подлежит. Подво-дя итоги вышесказанного, следует сказать, что регулирующее сферу компьютерной бе-зопасности законодательство в РФ весьма либерально, впрочем некоторые противо-речивые моменты вполне могут сбить с тол-ку иного IT-специалиста.

Page 80: 039 Системный Администратор 02 2006

78

сети

Для Linux существует эксперимен-тальное решение для соксификации всех сетевых соединений на уровне ядра – Kernel Socks Bouncer [6].

Для прозрачного соксифициро-вания программой пользовательско-го режима Linux можно использовать TranSocks [7] и Transproxy [8] в связке с iptables. Впрочем, Transproxy подде-рживает и FreeBSD с ipfw, но прокси-рует эта программа лишь HTTP-тра-фик.

На платформе Windows дейс-твенны программы FreeCap [ 9 ] и SocksCap [10]. Данные для настрой-ки многих популярных приложений можно найти на странице http://wiki.noreply.org/noreply/TheOnionRouter/TorifyHOWTO.

Для анонимизации HTTP-трафи-ка в связке с Tor обычно применяют локальный прокси-сервер Privoxy [11]. Privoxy производит подмену/удаление сведений конфиденциального харак-тера из отправляемых клиентскими приложениями HTTP(S)-заголовков, а также удаление баннеров.

Однако даже с его применени-ем Java-апплет, JavaScript-сцена-рий, cookie, сохранённая браузером история, Flash или ActiveX-содержи-мое (а также «нечестный» плагин ва-шего браузера: плагины Realplayer и mplayer, к примеру, игнорируют ука-занные в браузере настройки прокси) могут легко скомпрометировать вашу анонимность.

Посетив страницу [12] можно уви-деть, какой объём информации с готов-ностью сообщает ваш браузер.

Стоит обратить внимание на та-кие расширения браузера Firefox, как JSBlocker, NoScript, User Agent, Web Developer, Flashblock, Add N Edit Cookies, Cookie Button.

Для удобного переключения между прокси-серверами в Firefox существуют SwitchProxy, ProxyButton и SwitchProxy Tool. Наконец, разумным может быть запрет с помощью firewall всех исхо-дящих соединений, кроме тех, что ис-ходят от ПО Tor.

Сложную проблему представля-ет и сокрытие DNS-активности узла. Privoxy позволяет решить эту зада-чу, однако ограничение состоит в том, что лишь клиент SOCKS версии 4a мо-жет выполнить разрешение доменных имен анонимно (посредством сети Tor),

Сети криптографических ремэйлеровДвижение шифрпанков, возникшее в уни-верситете Беркли, ставило своей целью со-хранить преимущества сети Интернет как средства самовыражения и среды для су-ществования свободы слова и остро реаги-ровало на любые попытки контроля и слеж-ки. Один из разработанных ими механиз-мов анонимности, сети анонимных ремэй-леров, гарантирует анонимность элект-ронной переписки. Их принято классифи-цировать по нескольким поколениям: так, сети нулевого поколения, type 0, состояли из одного промежуточного сервера, вы-полняющего задачу сродни анонимному прокси-серверу – удаление из сообщений электронной почты идентифицирующих от-правителя заголовков. Слабость ремэйле-ров нулевого поколения была обусловле-на незащищенностью цепи «отправитель-ремэйлер» и их централизованностью. Од-нако уже в следующем, первом поколении ремэйлеров (type 1) был представлен пол-ностью переработанный протокол аноним-ной переписки. Широко известная сегодня система Mixmaster относится к ремэйлерам второго поколения (type 2), разрабатывае-мым с 1995 года. Очень амбициозен и про-ект Mixminion, называемый сетью третье-го поколения (type 3). Современные сети криптографических ремэйлеров включа-ют десятки энтузиастских серверов в раз-ных частях мира.

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

цах или же запросить у самого сервера, от-правив на его почтовый адрес письмо с те-мой remailer-key.

Проект Mixmaster [19] представил не только средства защиты от анализа трафика, но и функциональность сервера псевдонимов, или ним-сервера. Как средс-тво защиты от анализа трафика были реа-лизованы: дополнение/разбивка сообще-ния на блоки постоянного размера в 28 Кб; внесение случайной задержки во время от-правки каждого блока и «перемешивание» блоков сервером-ремэйлером. Двусторон-няя же пересылка анонимных сообщений реализована благодаря связыванию псев-донима отправителя с сообщением. Факти-чески «обратная связь» была предусмотре-на еще в ремэйлере нулевого поколения – знаменитом anon.penet.fi Йохана Хельсин-гьюса. Сервер anon.penet.fi ассоциировал с адресом отправителя сообщения адрес вида [email protected]. Если получа-тель отправлял ответное сообщение на та-кой адрес, сервер пересылал ответ обрат-но на почтовый адрес автора первого со-общения. В 1996 году Хельсингьюс закрыл свой сервис, через год после того, как под угрозой судебного преследования был вы-нужден выдать адреса отправителей не-которых анонимных писем. Чтобы не до-пустить подобных инцидентов, ремэйле-ры со времен Mixmaster хранят ассоции-рованные с псевдонимом адрес и откры-тый ключ, предварительно зашифровав их открытыми ключами серверов-ремэй-леров. На сайте проекта QuickSilver [20] можно загрузить реализацию протокола Mixmaster для платформы Windows, отлич-ную от референсной.

Хотя проект Mixminion [21] – сеть ано-нимных ремэйлеров третьего поколения – все еще находится в ранней стадии разра-ботки, представленные им идеи более чем интересны. Сторона-отправитель разбива-ет сообщение на пакеты постоянной длины и выбирает для каждого пакета последова-тельность серверов, через которую пакет будет передаваться, при этом каждый па-кет содержит информацию о следующем сервере на своем пути. В рамках протоко-ла Mixminion разработана также технология Single-Use Reply Blocks (SURBS), обеспечи-вающая анонимность получателя письма, и технология взаимной анонимности от-правителя и получателя. Другие нововве-дения включают выделенные серверы ка-талогов, ограничение срока жизни ключа, применение TLS и другое.

Page 81: 039 Системный Администратор 02 2006

79№2, февраль 2006

сети

и то лишь при условии грамотного про-граммирования.

Потому рекомендуется в настрой-ках, обладающих поддержкой SOCKS-приложений явно указывать IP-ад-реса вместо доменного имени. Для разрешения доменных имен в IP-ад-реса анонимным образом следу-ет использовать команду tor-resolve, а в Windows – и анонимный DNS-сер-вер TorDNS [13].

Работой в режиме клиента или сер-вера управляет параметр ClientOnly. Для использования Tor в качестве клиента в общем случае не требу-ется ни малейших изменений в кон-фигурации по умолчанию, настрой-ка же Privoxy исчерпывается внесе-нием в файл конфигурации Privoxy (/etc/privoxy/config или /usr/local/etc/privoxy/config большинстве UNIX-по-добных ОС) одной строки, задающей перенаправление HTTP-соединений в сеть Tor посредством SOCKS 4a:

Есть у Privoxy и веб-интерфейс: он будет доступен по адресу: http://config.privoxy.org.

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

«Скрытые» ресурсы сети TorХотя Tor используется преимуществен-но для анонимизации на стороне кли-ента, существуют и анонимные серве-ра, предоставляющие внутри сети Tor «скрытые» ресурсы, отличаемые с до-менным суффиксом .onion. При этом гарантируется взаимная анонимность клиента и сервера.

Так устроены системы аноним-ных блогов, электронной почты, IRC, Jabber, USENET, форумы/BBS, Wiki, SSH, серверы PGP-ключей и пр.

Есть и шлюз p2p-сети Entropy – ано-нимного распределённого хранилища данных, схожего с Freenet. Пользовате-ли имеют возможность самостоятель-но открывать скрытые сервисы.

Уместно привести несколько реко-мендаций для операторов Tor-узлов: веб-сервера класса Apache подобно сложному браузеру могут быть кана-лом утечки конфиденциальных дан-ных (за thttpd, к примеру, «уследить» куда проще), а доверие к вашему уз-лу будет гораздо выше в случае пол-ного шифрования дискового раздела (dm-crypt, luks, loop-aes, gbde, geli, cgd,

svnd) и запуска использования изоли-рованных окружений (chroot, jail).

ПО Tor доступно в портах pkgsrc, FreeBSD и OpenBSD, включено в не-которые дистрибутивы Linux (Debian, Red Hat, портежи Gentoo), доступно для MacOS X и Windows. Tor и Privoxy также входят в дистрибутив Anonym.OS, основанного на OpenBSD 3.8 LiveCD [14].

Для пользователей Windows со-здан готовый для записи на флэш-диск дистрибутив Torpark [15], состо-ящий из уже настроенной связки Tor и Mozilla Firefox. Большое количество

EchelonОбщим свойством любых анонимных се-тей или сетей криптографических ремэй-леров является уязвимость по отношению к слежке со стороны могущественного «глобального наблюдателя». В данном кон-тексте следует помнить о факте существо-вания автоматизированной системы конт-роля и слежения Echelon. Echelon был со-здан к 1971 году альянсом англоязычных стран UKUSA, образованным в качестве агентства перехвата и разведки инфор-мации (signal intelligence) специальными агентствами англоязычных стран во гла-ве с National Security Agency (NSA) США. В альянс UKUSA входят и ведомства Ве-ликобритании, Канады, Австралии и Но-вой Зеландии, а некоторые «третьи» стра-ны имеют на своей территории оборудова-ние комплекса Echelon. До сих пор отсутс-твует исчерпывающая информация о сис-теме Echelon, а правительство США офици-ально не признало её существования. Ис-точником имеющихся сведений послужили несколько отчетов о Echelon и книга «Secret Power: New Zealand’s Role in the International Spy Network», увенчавшая 12-летние иссле-дования Nicky Hager.

Известно, что система Echelon наделе-на функциями перехвата трафика радио-эфира и линий спутниковой, радиорелей-ной и сотовой связи, телефонных линий и компьютерных сетей. Мощность комп-лекса Echelon, по имеющимся сведениям, достаточна для перехвата миллиардов со-общений ежечасно. Работу системы обес-печивают передовые разработки в области систем анализа трафика и обработки дан-ных, в частности – систем искусственного интеллекта. Наиболее производительная в мире система NAS, использующая твер-дотельные диски (solid-state disk, SSD), яв-

ляется частью комплекса Echelon. Внед-ренная как средство контроля над СССР система Echelon сегодня стала не толь-ко весомым аргументом в борьбе с меж-дународным терроризмом и наркоторгов-лей, но и орудием, способным утвердить превосходство стран-участников на поли-тической арене. Существуют факты, поз-воляющие предположить о применении Echelon в качестве орудия промышленно-го шпионажа или средства внутреннего на-блюдения (domestic surveillance).

Во многих других странах разработа-ны собственные средства глобального кон-троля и слежения, аналогичные Echelon. Так, в России функциональным аналогом служит СОРМ (система оперативно-ра-зыскных мероприятий), в странах Евросо-юза действует система RES, а в США по-мимо Echelon одно время существовала и локальная система Carnivore. Как бы то ни было, общая тенденция такова, что да-же мощности Echelon недостаточно для анализа всего передаваемого в электри-ческих и волновых каналах связи трафи-ка, а следовательно – подобные системы вынуждены действовать выборочно и це-ленаправлено, в соответствии с набора-ми фильтров.

Проблема приватности и анонимнос-ти в Сети отнюдь не умаляется европей-скими органами власти: так, Европарла-мент в отчете о Echelon 2001 года реко-мендовал гражданам стран ЕС применять средства криптографии для защиты пра-ва на приватность, а в 2004 ЕС выделил 11 миллионов евро на развитие проекта SECOQC (Secure Communication based on Quantum Cryptography) – системы кванто-вой криптографии, теоретически непод-верженной воздействию Echelon или по-добных ей систем.

forward-socks4a / localhost:9050

Page 82: 039 Системный Администратор 02 2006

80

сети

дополнительной информации находит-ся на страницах [16].

Анонимная сеть I2PСеть I2P [17] возникла в 2003 году как форк проекта Freenode. При обме-не данными по I2P выполняется их мно-гоуровневое шифрование (сквозное, туннельное, шифрование транспорт-ного уровня) и криптографическая ау-тентификация конечных узлов.

Узлы сети I2P представлены иден-тификаторами, не имеющими логи-ческой связи с их реальными IP-адре-сами. Клиентское программное обес-печение функционирует как I2P-мар-шрутизатор, записывающий в табли-цу данные узлов для передачи входя-щего и исходящего трафика. Переда-ваемый пакет проходит временные од-носторонние цепочки: маршрутизато-ры исходящего трафика, построенные на узле-отправителе, и маршрутизато-ры входящего трафика, построенные узлом-адресатом. Такие туннели пе-рестраиваются каждые 10 минут. Уп-равляя длиной цепочки маршрутиза-торов в клиентском ПО, пользователь выбирает для себя нужное соотноше-ние между степенью анонимности, ла-тентностью и пропускной способнос-тью сети. Передаваемое же сообще-ние проходит такой путь, который от-вечает моделям угрозы отправителя и получателя.

В то время как Tor служит промежу-точным звеном для анонимного досту-па клиента в большую Сеть I2P пресле-дует цель анонимного доступа к внут-ренним ресурсам I2P в первую очередь. Внутренние ресурсы сети I2P, иденти-фицируемые доменным суффиксом i2p, предоставляют сервисы аноним-ных блогов («Syndie»), анонимного до-ступа в сеть IRC («ircProxy»), аноним-ной электронной почты («Susimail»), передачи файлов, групп новостей, шлюзы сетей Freenet и Mnet. Сущест-вуют и выходные узлы для анонимного веб-сёрфинга посредством анонимно-го HTTP-прокси, «eepProxy».

Список сайтов сети I2P доступен по адресу orion.i2p, для поиска в се-ти I2P можно использовать search.i2p или eepsites.i2p.

Сразу после запуска ПО интегриро-ванная адресная книга (средство раз-решения имен в сети I2P, простой тек-стовый файл) вашего узла не содер-

жит записей для многих сайтов се-ти – исправить положение можно, до-бавив строку:

в раздел управления вашими под-писками (http://localhost:7657/susidns/subscriptions.jsp).

Пользователь сети может легко со-здать собственный сайт, так называе-мый eepsite, доступный только в сети I2P через eepProxy. Впрочем, послед-нее не совсем верно – «входной» прок-си-сервер [18] позволяет получить до-ступ к ресурсам сети I2P из любого уз-ла Интернета, просто дописав tin0.de к URL ресурса сети I2P.

После запуска I2P на порту 4444 ожидает соединения прокси-сер-вер. Privoxy можно сконфигурировать на доступ к ресурсам Tor и I2P одновре-менно, добавив в файл настроек сразу после строки Tor следующее:

Все запросы к ресурсам, доменное имя которых заканчивается на .i2p, бу-дут идти через сеть I2P, а остальной трафик – через Tor.

Использование Tor здесь обосно-вано, поскольку сайты I2P могут со-держать рисунки, cgi-скрипты, фрей-мы, размещенные на серверах боль-шой Сети, с которыми охотно уста-новит соединение клиент I2P. А мощ-ность и надежность выходных узлов I2P гораздо ниже, чем у Tor: повторим-ся, этот проект ставит перед собой не-сколько иные цели.

Будучи основанной на UDP (вернее его модификации Secure Semireliable UDP, SSU, имеющей функции ау-тентификации, управления потоком и пр.), IP2 предлагает мост TCP/I2P, т.н. I2PTunnel, обеспечивающий пере-дачу TCP-пакетов по сети I2P, а следо-вательно – и средство создания защи-щенных туннелей к любым TCP-служ-бам, в доступе к которым может воз-никнуть необходимость.

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

Существуют и другие проблемы.

Так, каждый узел туннеля «знает», частью какого туннеля он является. К примеру, если для передачи сооб-щения используется туннель из 2 уз-лов, и Боб получает сообщение от Чар-ли, которое он должен переслать Али-се, очевидно, что Алиса является по-лучателем сообщения.

К выходу первого публичного рели-за разработчики планируют устранить известные слабые места. Хоть прямое сравнение I2P и Tor и не совсем коррек-тно, нельзя не отметить более распре-делённый и самодостаточный харак-тер первой, преимуществом является и применение в I2P туннелей односто-роннего типа.

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

ПО сети I2P относится к катего-рии Open Source; реализации прото-кола I2P и SDK выполнены на языке Java, а следовательно – кроссплат-форменны.

Управление ПО сети I2P произво-дится через веб-интерфейс и настоль-ко просто, что не нуждается в допол-нительных разъяснениях с моей сто-роны.

Существует и простой API с фун-кциональностью Simple Anonymous Messaging (SAM) для языка С, в разра-ботке находятся API для Perl и Python, что обещает проекту долгую жизнь.

JAP: Java Anon ProxyПроект JAP, он же AN.ON [22], пресле-дует гораздо менее глобальные цели, чем два предыдущих: JAP предназна-чен для анонимизации только HTTP-трафика. Хотя само ПО поддержива-ет и SOCKS, разработчики аргумен-тируют поддержку своими сервера-ми лишь HTTP с высоким риском зло-употреблений. Пересылка трафика производится в зашифрованном ви-де через фиксированный каскад микс-серверов: пользователь не имеет воз-можности составить произвольную це-почку серверов. Преимущество дан-

http://orion.i2p/hosts.txt

forward .i2p localhost:4444

Page 83: 039 Системный Администратор 02 2006

81№2, февраль 2006

сети

ного подхода в том, что так проще до-стичь той «критической массы» поль-зователей, которая гарантирует вы-сокую степень анонимности, а так-же более высокой скорости серфинга (и она действительно выше, чем у пол-ностью распределенных сетей). Кроме того, поскольку пользователь не слу-жит в данном случае конечным звеном цепи, то он защищен от посягательств со стороны лиц, желающих завладеть данными (ведь он не служит промежу-точным звеном при передаче трафика от других узлов; впрочем, exit policies сети Tor предоставляют более гибкое решение данной проблемы). Компро-метация анонимности клиента невоз-можна без перехвата всего входящего и исходящего трафика всех узлов кас-када и их содействия с целью расшиф-ровывания пакетов.

С помощью функции forwarding су-ществует возможность предоставлять анонимный доступ другим клиентам. С мая 2005 года JAP умеет использо-вать узлы сети Tor в качестве каска-да для анонимизации HTTP-трафика. Это происходит автоматически в том случае, если в настройках браузера выбран SOCKS-, а не HTTP-прокси. JAP гарантирует шифрование трафика от клиента до каскада JAP-серверов, но не выполняет дополнение пакетов до постоянного размера, чего заведо-мо недостаточно для противостояния атакам, основанным на анализе тра-фика. Полная конфиденциальность пе-редаваемых данных достигается лишь в случае дополнительного шифрова-ния на верхних уровнях с помощью та-ких протоколов, как SSL. Со второй по-ловины 2006 года в рамках JAP решено предоставлять платный премиум-сер-вис, так как проект лишился прежнего источника финансирования.

Реализация JAP выполнена на язы-ке Java, ПО – свободно и кроссплат-форменно. Программа разработана в Германии, каскад JAP-серверов рас-положен там же. Известен случай ком-прометации сети германским Federal Bureau of Criminal Investigation, FBCI. В реализацию JAP разработчиками был встроен потайной ход (backdoor), а пользователям настоятельно реко-мендовали провести обновление ПО. Вскоре суд признал действия FBCI не-легитимными, а потайной ход из кода JAP устранен. Так или иначе, репута-

ция JAP не безупречна, а Tor и I2P яв-ляются гораздо более привлекатель-ными средствами обеспечения на-дежной анонимности и конфиденци-альности.

ЗаключениеБезусловно, мы не открыли вам лёгко-го и универсального пути достижения надёжной анонимности, но «швейцар-ских ножей» в данной области попрос-ту не существует: безопасность и про-стота вообще слабо совместимые по-нятия. Я не ставил своей целью пред-ложить вам готовое решение: в посто-янно меняющемся мире информацион-ной безопасности (а тем более в срав-нительно новой и экспериментальной области анонимности) это было бы преступлением. Успеха, по моему мне-нию, можно достичь лишь путём гра-мотного и прагматичного комбиниро-вания существующих средств аноним-ности и конфиденциальности, к кото-рым нет и не может быть абсолютно-го доверия, таким образом, чтобы об-разованная система соответствовала ценности защищаемых данных и сте-пени ущерба в случае нарушения ано-нимности.

Так, разумным подходом выглядит сочетание нескольких средств дости-жения анонимности и/или конфиден-циальности в сети: анонимных се-тей, прокси, туннелей OpenVPN, SSH и SLIRP [23]. Даже в области аноним-ной переписки следует изучить воз-можность комбинирования аноним-ной сети Tor и криптографических ре-мэйлеров, имеющих точку входа внут-ри сети Tor (таких, как Pantha Rei [24] или Bananasplit [25].

Тема анонимности в Сети побужда-ет великое количество вопросов право-вого, политического или этического ха-рактера, предвосхитить которые хочет-ся словами Б. Франклина, произнесён-ными им более 200 лет назад: «Те, кто готовы пожертвовать своими фунда-ментальными свободами ради времен-ной безопасности, не заслуживают ни безопасности, ни свободы».

Ссылки:1. http://freenetproject.org – официальный

сайт проекта Freenet.2. http://www.onion-router.net – описание

концепции onion routing, архив публи-каций.

3. http://tor.eff.org – анонимная сеть Tor, официальный сайт.

4. http://www.freehaven.net – родительский по отношению к Tor проект, в наличии архив научных исследований.

5. http://www.dest-unreach.org/socat – до-машняя страница проекта socat.

6. http://ksb.sourceforge.net – Kernel Socks Bouncer, соксификация Linux-ядра.

7. h t tp : / / t ransocks.sourceforge.net – TranSocks, прозрачный соксификатор пользовательского режима Linux.

8. ht tp: / / t ransproxy.sourceforge.net – Transproxy, прозрачный HTTP-прокси.

9. ht tp: / /www.freecap.ru – домашняя страница Freecap, соксификатора для Windows.

10. h t t p : / / w w w. s o c k s . p e r m e o . c o m – SocksCap, ещё один соксификатор для Windows.

11. http://www.privoxy.org – домашняя стра-ница анонимизирующего прокси-сер-вера Privoxy.

12. http://gemal.dk/browserspy – информа-ция, сообщаемая вашим браузером.

13. http://sandos.ath.cx/~badger/tordns.html – TorDNS, анонимный DNS-сервер для Windows.

14. http://theory.kaos.to/projects.html – до-машняя страница Anonym.OS.

15. ht tp: / /www.freehaven.net /~arrak is /torpark.html – Torpark, дистрибутив Tor + Firefox для Windows.

16. h t t p : / / w i k i . n o r e p l y . o r g / n o r e p l y /TheOnionRouter – Wiki проекта Tor.

17. http://www.i2p.net – официальный сайт анонимной сети I2P.

18. http://inproxy.tino.i2p.tin0.de – входной прокси-сервер к сети I2P.

19. ht tp : / /mixmaster.sourceforge.net – Mixmaster, анонимный ремэйлер вто-рого поколения.

20. h t t p : / / w w w.q u i c k s i l ve r m a i l . n e t – QuickSilver – альтернативная реа-лизация Mixmaster для платформы Windows.

21. http://www.mixminion.net – Mixminion – анонимный ремэйлер третьего поко-ления.

22. ht tp: / /anon.inf.tu-dresden.de / index_en.html – домашняя страница анони-майзера JAP.

23. http://slirp.sourceforge.net – SLIRP, эму-ляция PPP или SLIP через терминаль-ную сессию.

24. http://www.panta-rhei.eu.org – ним-сер-вер Panta Rhei.

25. http://www.bananasplit.info – приватный Mixmaster-ремэйлер.

Page 84: 039 Системный Администратор 02 2006

82

сети

Будь то Windows Update с вашей же машины, или FlashGet с со-седней, все равно приложени-

ям надо будет «поделиться». Вот вам и «изюминка» совместного использо-вания интернет-канала – постоянные скачки, рывки и задержки. Иными сло-вами, ваши данные не получают соот-ветствующего качества обслуживания (Quality of Service, QoS). И к несчастью, это так же неизбежно, как налоги…

Задержки отдельных дейтаграмм на пути от отправителя к получате-лю являются принципиальной осо-бенностью сетей с коммутацией па-кетов (таких, как сети TCP/IP), из ко-торых собственно и состоит Интернет. Но где есть спрос – там всегда есть предложение, и на сегодняшний день существует целый ряд технологий, поз-воляющих свести к минимуму влияние «врожденных» недостатков этого ме-тода передачи данных. О них и пойдет речь в этой статье.

Качество обслуживания – какой же этот «серверный» олень?..Под «качественным обслуживанием» обычно понимают выполнение неких требований, предъявляемых приложе-нием к сети, для удовлетворительной его работы. Что это за требования, за-висит от типа задач, решаемых прило-жением. Одним важна скорость, дру-гим – время доставки данных, треть-им – и то, и другое. В общем случае, ос-новными критериями понятия «качест-ва обслуживания» являются: Параметры пропускной способ-

ности – минимальная, средняя и максимальная.

Параметры задержек – их вели-чины и вариации.

Параметры надежности – про-цент потерянных и искаженных пакетов.

Самый простой способ гарантиро-вать их выполнение – избыточность, то есть если сеть будет быстрее и на-дежнее «чем надо», проблем навер-няка не будет. Если же это невозмож-но, необходимо на всем пути паке-тов, из конца в конец, обеспечить со-ответствующее качество обслужива-ния «вручную».

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

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

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

Frame Relay, ATM и MPLS – дорого, но сердитоВсе три технологии используют ме-тод коммутации виртуальных кана-лов для передачи данных и работа-ют по принципу предварительного ре-зервирования полосы пропускания. Но при этом используя технику комму-тации пакетов, что делает их более эф-фективными и менее дорогостоящими в сравнении с классическими сетями коммутации каналов.

Технология Frame Relay основыва-ется на передаче кадров, но возник-ла как служба в сетях ISDN. За счет предварительного резервирования пропускной способности на всем пу-ти следования дейтаграмм техноло-гия Frame Relay позволяет гарантиро-вать основные показатели качества обслуживания – среднюю скорость пе-редачи данных при допустимых пуль-сациях трафика, просто отбрасывая пакеты, поступающие слишком быст-ро. Правда, технология Frame Relay не очень подходит для передачи интерак-тивных данных, поскольку не гаран-тирует отсутствия задержек. Еще од-ним недостатком Frame Relay являет-ся низкая пропускная способность – всего 2 Мбит/с.

Доставку гарантируем: качество обслуживания в пакетных сетях

Если вы частенько работаете по ssh удаленно, слушаете интернет-радио или просто играете в online-игры, то наверняка замечали, что получаемое от этого удовольствие прямо пропорционально нагрузке на вашу сеть.

Сергей Сикорский

Page 85: 039 Системный Администратор 02 2006

83№2, февраль 2006

сети

ATM – технология асинхронного до-ступа (Asynchronous Transfer Mode) бы-ла создана с учетом все возрастаю-щих потребностей приложений в про-пускной способности сети, требуе-мом качестве обслуживания и недо-статков уже существующих техноло-гий. ATM подходит для передачи лю-бых видов трафика, обладает мощ-ными средствами обеспечения QoS, а диапазон поддерживаемых скоро-стей очень широк – от десятков мега-бит до нескольких гигабит. Но универ-сальность этой технологии ее и по-губила, сделав ее слишком сложной, дорогостоящей и… неэффективной на практике. Владельцы уже сущест-вующих сетей не спешили переходить на новое дорогое оборудование. А тем временем появились методы обеспе-чения QoS в (уже популярных) сетях TCP/IP и дешевый Gigabit Ethernet, спо-собный удовлетворить даже очень се-рьезные требования к пропускной спо-собности.

Самая новая из рассматривае-мых технологий – Multi-Protocol Label Switching (MPLS, RFC-3031) благода-ря своей гибкости может использо-ваться для целого ряда задач. В ос-нове ее лежит использование меток – дополнительного заголовка, которым снабжаются поступающие в сеть паке-ты. Метка содержит всю необходимую MPLS-маршрутизаторам информацию для передачи пакетов, данные IP-за-головка для выбора пути дейтаграмм внутри сети не используются. Это поз-воляет сократить накладные расходы на анализ заголовков пакетов, сокра-щая таким образом задержки их про-движения и нагрузку на оборудова-ние. Кроме того, использование тех-ники виртуальных каналов позволя-ет конструировать пути прохождения пакета оптимальным образом (Traffic Engineering) и предварительно зака-зывать требуемую пропускную способ-ность. Сфера применения MPLS не ог-раничивается задачами управления трафиком, но имеет необычайно бога-тые возможности для их решения.

Gigabit Ethernet и стандарт 802.1Q/p – сила есть... и остальное тожеКлассический Ethernet не имеет средств управления трафиком. Его наследни-

ки – FastEthernet и GigabitEthernet так-же не получили таких возможностей поскольку разработчики сочли ус-ложнение этих технологий излишним ввиду больших скоростей передачи данных, им присущих. Стандарт IEEE 802.1Q, который был разработан от-носительно недавно и определяет ос-новные правила построения вирту-альных локальных сетей, расширя-ет заголовок Ethernet-кадра на 4 бай-та (путем уменьшения размера поля пользовательских данных), из кото-рых три бита отводятся под приоритет кадра (802.1p). Таким образом, появ-ляется возможность «поделить» тра-фик на восемь классов, с последу-ющей соответствующей обработкой (коммутаторы и мосты, не поддержи-вающие 802.1p, должны «не замечать» эти биты).

Ну а для настоящих любителей «быстрой езды», да еще и по «бездо-рожью», сегодня существует Gigabit Ethernet, работающий даже на кабе-ле UTP пятой категории, что делает эту технологию необычайно недорогой и эффективной. Забавно – она облада-ет всеми недостатками ее предшест-венников, но это совершенно не ска-зывается на темпах ее распростра-нения. Основные причины тому – ско-рость и стоимость, которые покрыва-ют и отсутствие средств обеспечения качества обслуживания, и другие не-достатки технологии, такие как невоз-можность построения сетей с избыточ-ными связями.

Качество обслуживания в сетях TCP/IP – мечтать не вредноСтек протоколов TCP/IP до недав-него времени практически не имел средств управления трафиком. Более того, при разработке основных про-токолов стека главный упор делался на максимально возможную утилиза-цию каналов, в результате чего даже нескольким потокам одного приложе-ния приходится «бороться» между со-бой за право отправить пакет, а уж о качестве обслуживания не может идти и речи...

Поле Тип Сервиса (Type Of Service, TOS) IP-пакета и является меткой, поз-воляющей указать желаемое качес-тво доставки пакета, но только в об-щих чертах. По RFC-1349, оно состо-

ит из трех битов IP Precedence и че-тырех битов, собственно указыва-ющих на тип сервиса (последние два бита не используются и должны быть нулями). Восемь двоичных зна-чений IP Precedence (от 000 – обыч-ный трафик, до 111 – служебная ин-формация маршрутизаторов) озна-чают, что на границе сети при необ-ходимости (высокой загруженности каналов, например) из всего потока данных дейтаграммы с меньшим зна-чением Precedence могут быть сбро-шены без повторных попыток достав-ки по назначению. А биты типа серви-са – Low Delay, High Throughput, High Reliability и Minimize Monetary Const, – указывают на необходимость отпра-вить пакет по каналу с наименьшей за-держкой, наибольшей пропускной спо-собностью, надежностью и наимень-шей стоимостью (с финансовой точ-ки зрения) соответственно.

Использование поля TOS хотя и позволяет в некотором роде приори-тезировать трафик, но не является до-статочно гибким. Например, если ад-министратору надо повысить приори-тет каким-то двум видам трафика над остальными, то это в принципе воз-можно. Но указать при этом, что при се-рьезной загруженности каналов мож-но одним из них пожертвовать в поль-зу второго – уже нельзя. Кроме того, не стоит ожидать, что простая установка его в нужное значение что-либо гаран-тирует. Это связано с тем, что на сегод-няшний день поле TOS чаще игнориру-ется, чем используется, а маршрутиза-торы имеют право его менять по свое-му усмотрению. Хотя в пределах ва-шей сети вы вольны использовать по-ле TOS как считаете нужным.

IntServ и DiffServ – две стороны одной медалиЧтобы удовлетворить все возрастаю-щие требования к качеству обслужива-ния данных в сетях TCP/IP, организаци-ей Internet Engineering Task Force (IETF), были разработаны две модели пре-доставления QoS – IntServ и DiffServ. Модель IntServ (RFC-1633, RFC-2212, RFC-2215) с помощью протокола сиг-нализации RSVP (ReSerVation Protocol, RFC-2205) позволяет «заказывать» желаемую пропускную способность на всем пути продвижения пакета,

Page 86: 039 Системный Администратор 02 2006

84

сети

за счет чего и гарантирует качество доставки данных. Это похоже на при-нцип работы Frame Relay, за тем ис-ключением, что речь идет не о вирту-альном канале (ввиду его отсутствия), а о потоке данных между двумя при-ложениями (однозначно идентифици-руемом IP-адресами источника/назна-чения, портами и транспортным прото-колом). Разумеется, все оборудование, через которое пойдут данные, должно поддерживать такую модель обслу-живания. IntServ хорошо справляется со своими обязанностями (гаранти-руя пропускную способность), но слож-ность реализации и цена поддержива-ющего RSVP-оборудования ограничи-вают его применение крупными корпо-ративными сетями.

Принципом работы DiffServ (RFC-2474, RFC-2475) является распределе-ние трафика на классы, называемые Class of Service (CoS) и применение к этим классам неких параметров QoS. Для этого пакеты маркируются по по-лю TOS-заголовка IP-пакета, а затем обрабатываются желаемым образом. В технологии DiffServ поле TOS на-зывается DS (Differentiated Services), в котором первые 6 бит используются для задания до 64 (26) классов трафи-ка (и называются Differentiated Services Code Point, DSCP), а два последних по-ка не используются.

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

Классификация данных – что, где, куда?Эталонная модель OSI определяет семь уровней взаимодействия систем в сетях с коммутацией пакетов, кото-рым должны соответствовать уров-ни стеков коммутационных протоко-лов. Но поскольку многие протоколы (например, TCP/IP) были разработа-ны до появления модели OSI (нача-ло 80-х годов), они соответствуют ей не полностью.

Стек протоколов TCP/IP, получив-ший на сегодняшний день наибольшее распространение, имеет 4 уровня: при-

кладной, транспортный, уровень меж-сетевого взаимодействия и уровень сетевых интерфейсов.

В принципе, классифицировать трафик для последующей обработки можно на всех четырех уровнях стека, начиная с маркировки данных на осно-ве MAC-адресов и вплоть до попыток доставки пользователям html-страниц со словом «трафик» с наименьшей за-держкой. Но первый подход не очень гибок, поскольку не позволяет «твор-чески» подойти к разграничению тра-фика, а второй – слишком требова-телен к системным ресурсам и не да-ет никаких гарантий по определению. Таким образом, самые популярные и эффективные методы классифика-ции трафика основываются на анализе адресов источника/назначения IP-па-кетов и TCP-, UDP-портов. То есть речь идет о транспортном и уровне межсе-тевого взаимодействия.

Очень важно при выборе политики обслуживания данных учитывать при-нципы работы транспортного протоко-ла, доставляющего эти данные. Напри-мер, протокол TCP постоянно следит за качеством передачи данных, и поте-ря пакетов для него – сигнал к умень-шению скорости их передачи. Таким образом, преднамеренно уничтожая слишком быстро поступающие TCP-па-кеты, можно «заставить» отправите-ля снизить интенсивность их отправки. Это довольно грубый метод управле-ния скоростью потока – корректнее бы-ло бы манипулировать значением поля Window TCP-пакета, или, в крайнем слу-чае, преднамеренно задерживать кви-танции о получении (ACK). Но просто-та реализации и неприхотливость к сис-темным ресурсам сделали такой метод управления трафиком довольно попу-лярным. Например, принцип умышлен-ного уничтожения пакетов лежит в осно-ве всех разновидностей RED (Random Early Detection) – механизма предва-рительного обнаружения перегрузок, который в случае превышения задан-ной (но еще не критичной) скорости поступления данных уничтожает паке-ты, случайным образом выбранные из потока. Дальнейшим развитием этой идеи является задержка пакетов вмес-то уничтожения, что позволяет избе-жать их повторной передачи, но требу-ет больших накладных расходов.

А вот преднамеренно уничтожать

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

Исходя из этого крайне не жела-тельно определять в один класс TCP- и UDP-потоки, ведь при «недостатке» скорости, TCP-протокол будет постоян-но уменьшать интенсивность переда-чи, а UDP – «подгребать» под себя ос-вободившиеся ресурсы, образовывая замкнутый круг.

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

А что же делать, если вы – все-го лишь администратор частной сети, пользователи которой, видимо, ощу-щая жгучий информационный голод, так и ломятся в ваш и без того узкий канал Интернет? Вася из бухгалтерии сутками напролет мультики качает, на-чальник в трубку жалуется, что у него «почта тормозит», а вам – так вообще давно пора «мифриловые перчи» по-купать, но так «лагает», что играть не-возможно… Можно ли что-то сделать в этом случае?

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

Если коротко – у каждого сетево-го интерфейса вашего маршрутизато-ра есть очередь устройства (queue of a device), в которую попадают все паке-ты перед отправкой их непосредствен-но в «железяку». Это область памяти, откуда драйвер устройства выбирает пакеты по одному и обрабатывает.

Page 87: 039 Системный Администратор 02 2006

85№2, февраль 2006

сети

Размещением пакетов в очереди занимается так называемая «дисцип-лина обработки очереди». И по умол-чанию, это скорее всего разновидность FIFO (First In First Out, «первым при-шел – первым ушел») – самый прос-той способ обработки пакетов, досто-инствами которого являются просто-та и скорость, а недостатками – собс-твенно, отсутствие методов обеспече-ния QoS. Все дисциплины, работаю-щие по принципу FIFO, просто помеща-ют приходящие пакеты в некий буфер (очередь), постепенно выводя из не-го пакеты, пришедшие раньше, а при его заполнении – отбрасывают новые (безвозвратно), пока под них не осво-бодится место.

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

Подобно технологии DiffServ вы можете попытаться менять приори-тет некоторых потоков трафика та-ким образом, чтобы дать преимущес-тво тем пакетам, которым оно дейс-твительно необходимо. При этом сов-сем не обязательно маркировать па-кеты «по порту» на коммутаторах или использовать еще какое-то дополни-тельное оборудование – все действия будут производиться на вашем шлю-зе. Например, пакеты приложений, не требовательных к задержке (первый кандидат – smtp-данные) могут «ме-няться местами» в очередях устройств с пакетами более интерактивных при-ложений, чтобы уменьшить задержку их прохождения.

Но все это реализуемо, только ес-ли ваш шлюз – действительно единс-твенное место, где эти задержки вно-сятся. Если до того, как пакеты посту-пят на маршрутизатор (где-то в вашей сети), или после того, как покинут его (на каналах провайдера или выше), они не будут получать требуемую про-пускную способность, пользы от при-

оритизации «на месте», конечно, не бу-дет. Самый простой способ предотвра-тить это – использовать высокоско-ростные технологии локальных сетей (такие как FastEthernet) и не забыть про пунктик в договоре с ISP, о гаран-тированной полосе пропускания.

Доступные вам средства управле-ния трафиком зависят от используе-мого оборудования. Смею предполо-жить, что если вы все еще читаете эту статью, то явно не сидя на ящике от ка-кого-то магистрального маршрутиза-тора, но это вовсе и не обязательно. Даже обычная машина, под управле-нием ОС Linux, имеет довольно бога-тые возможности по управлению тра-фиком. Другое дело – что настроить их оптимальным образом бывает доволь-но сложно (хотя это относится не толь-ко к Linux.

SLA – доверяй, но проверяйКогда речь заходит о предоставле-нии услуг гарантированного качест-ва, очень важно сначала определить-ся с тем, что собственно подразуме-вается под словами «качество» и «га-рантии». Соглашение об уровне обслу-живания (Service Level Agreement, SLA) как раз и является тем документом, на основании которого потребитель и провайдер заключают договор о пре-доставлении услуг.

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

SLA может быть составлен как в ин-дивидуальном порядке, с учетом спе-цифики работы конкретного абонента, так и быть типовым договором, подпи-сываемым с любым клиентом при под-ключении.

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

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

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

Источники информации1. Общие сведения: 1.1. Компьютерные сети. Принципы, тех-

нологии, протоколы: Учебник для ву-зов. 3-е изд. http://www.piter.com/book/978546900504.

1.2. http://utc.jinr.ru/nets/semenov. 1.3. http://www.protocols.com/protocols.htm.2. Frame Relay – http://www.networksorcery.

com/enp/protocol/framerelay.htm.3. ATM – http://www.cisco.com/univercd/cc/

td/doc/cisintwk/ito_doc/atm.htm.4. MPLS: 4.1. http://www.ietf.org/html.charters/mpls-

charter.html. 4.2. http://www.riverstonenet.com/support/

mpls/mpls_introduction.htm. 4.3. http://www.cisco.com/univercd/cc/

td /doc /product /sof tware / ios120 /120newft/120t/120t5/lsc.htm.

4.4. http://polaris.umuc.edu/~jhubbard/msit_660/MPLS/MPLS%20Def.

4.5. http://www.mpls-exp.ru. 4.6. h t t p : / / w w w . s y r u s . r u / i n d e x .

cgi?Template=all_docs&TreeId=19951&DocId=81.

4.7. http://www.nsi-com.ru/art001.htm.5. TCP/IP: 5.1. http://www.faqs.org/rfcs/rfc793.html. 5.2. http://www.faqs.org/rfcs/rfc791.html. 5.3. http://www.faqs.org/rfcs/rfc768.html. 5.4. http://www.faqs.org/rfcs/rfc1349.html.6. IntServ, DiffServ: 6.1. http://www.faqs.org/rfcs/rfc1633.html. 6.2. http://www.faqs.org/rfcs/rfc2749.html. 6.3. http://www.cisco.com/warp/public/

cc/pd/iosw/ioft/iofwft/prodlit/difse_wp.htm.

6.4. http://www.gta.ufrj.br/diffserv.

Page 88: 039 Системный Администратор 02 2006

86

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

История компьютеров «Амига»Часть первая: 1982-1994

Сергей Зуев

На протяжении последних лет компьютерная индустрия оказалась поделена между Windows-системами, продукцией от Apple и Linux/UNIX-решениями, куда входят также и знаменитые рабочие станции SGI/Sun. Однако буквально десять-пятнадцать лет назад ситуация на рынке персональных компьютеров была совершенно другой.

Page 89: 039 Системный Администратор 02 2006

87№2, февраль 2006

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

На протяжении последних лет компьютерная индустрия оказа-лась поделена между Windows-

системами, продукцией от Apple и Linux/UNIX-решениями, куда входят также и знаменитые рабочие станции SGI/Sun. Однако буквально десять-пят-надцать лет назад ситуация на рын-ке персональных компьютеров была совершенно другой. Существовало по крайней мере два-три десятка раз-личных платформ, отличающихся и ди-зайном, и процессором, и какими-то специфическими оригинальными ре-шениями в аппаратной части. Одна-ко, несмотря на то, что большая часть рынка уже занята вышеперечисленны-ми системами, старые компьютеры ни-куда не делись. Для них до сих пор пи-шется программное обеспечение и со-здается новое железо. Пример тому –компьютеры Amiga.

Зарождение идеиИстория Amiga начинается в 1980 году, в лабораториях Atari, где Джей Май-нер проектировал восьмиразрядные системы. Именно он разработал та-кие знаменитые компьютеры и кон-соли, как Atari 2600, Atari 400 и Atari 800. Основной упор в проектирова-нии делался на создание custom-чи-пов (микросхемы, которые заказыва-ются специально на заводах для кон-кретной линейки продуктов), каждый из которых брал на себя определен-ную функцию по выводу графики, син-тезированию звука, управления внут-ренней шиной и пр. Это разгружало центральный процессор от несвойс-твенных ему задач и весьма ощути-мо повышало общую производитель-ность системы.

В то время Atari была настолько крупной компанией, что сегодня мог-ла бы соперничать с Sony или Nintendo. Однако в ней присутствовали сильный коммерческий дух, жестко спланиро-ванное производство, и это не остав-ляло ни малейшей возможности та-лантливым рабочим для продвижения своих идей в производство. Это и слу-чилось с Майнером. Он считал, что эра восьмиразрядных компьютеров закан-чивается и пора переходить на более совершенные технологии.

Как раз в 1979 году Motorola выпус-тила свое новое семейство процессо-ров 68000. Эти процессоры работа-

ли на частотах до 14 МГц и адресова-ли до 16 Мб адресного пространства, что было на голову выше даже самых близких их конкурентов от Intel – про-цессоров 8086/88. Майнер сделал не-сколько запросов к руководству ком-пании для выделения ему отдельной лаборатории по разработке новой вы-числительной системы, однако каж-дый раз получал отказ. Это вынуди-ло его оставить корпорацию и занять-ся индивидуальными исследованиями в данной области.

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

В 1982 году Майнеру позвонил его бывший коллега, также уволив-шийся из Atari, Ларри Кеплен. Кеплен к тому времени уже создал свою ма-ленькую фирму по разработке компью-терных игр, хорошо известную сегодня как Activision. Как и Майнер, он искал финансовую помощь для дальнейшей деятельности своего детища.

По счастливому стечению обстоя-тельств, дантист Майнера был богатым человеком, который вкладывал деньги в новые, перспективные разработки в области компьютерных игр. Благо-даря ему новая фирма Джея, Hi-Toro, получила стартовый капитал в 7 мил-лионов долларов.

Hi-Toro разделилась на две груп-пы. Первая, Atari Peripheral, занима-лась разработкой фирменных джойс-тиков и игр для Atari 2600. Вторая груп-па работала над проектом с кодовым именем «Lorraine», названным так в честь жены CEO Дейва Морзе. Не-смотря на то что группа была весьма немногочисленной, ее цели были ко-лоссальными.

Предполагалось создать револю-ционную игровую систему, у которой были бы 3.5" дисковод и клавиатура. Изначально были определены главные разработчики игр, Activision и Imagic, для того чтобы обеспечить систему иг-рами на момент начала продаж. На то время это был беспрецедентный шаг, например, та же Atari всячески прег-рождала дорогу сторонним компани-

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

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

Новый компьютер основывался на процессорах Motorola и имел не-сколько сопроцессоров для выпол-нения второстепенных задач. Сопро-цессоры содержали в себе такие бло-ки, как Blitter (занимался быстрым пе-ребросом областей памяти из трех ис-точников в четвертое конечное место одновременно с выполнением логи-ческих операций над ними) и Copper (следил за положением луча на экра-не, в зависимости от значений мог или изменять значения внутренних регис-тров, или вызывать прерывание цент-рального процессора для выполнения каких-либо процедур).

Каждому процессору давались женские имена, например, Paula явля-лась контроллером дисковода и звуко-вой подсистемой, обеспечивала ком-пьютер 4-канальным 8-разрядным

Рисунок 2. Промежуточный вариант Lorraine

Рисунок 1. Джей Майнер – создателькомпьтеров «Амига»

Page 90: 039 Системный Администратор 02 2006

88

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

звуком; Agnus – контроллер прямо-го доступа в память, генератор так-товой частоты; Denise управлял аппа-ратными спрайтами и содержал в се-бе Copper.

Помимо вышеперечисленных воз-можностей, новый компьютер имел па-литру до 4096 цветов, с возможностью использования до 16 в режимах вы-сокого разрешения 640х256 (или 512 в режимах с чересстрочной разверт-кой), и до 32 в режимах низкого раз-решения 320х256 (512).

Также существовал специальный режим HAM (Hold-And-Modify) для од-новременного показа всех 4096 цве-тов в низком разрешении. Достигалось это благодаря аппаратным цикличес-ким изменениям значений цветовых регистров, т.е. на каждом новом пик-селе можно было изменить одну цве-товую составляющую (R, G или B) пре-дыдущего пикселя или выбрать новый цвет из палитры.

Следует отметить два эффекта Copper, которые часто использовались программистами ПО и даже в самой операционной системе. Это возмож-ность использования нескольких ви-деорежимов на экране. Для примера: верхняя часть экрана работает в раз-решении 640х200 на 8 цветов, а ниж-няя – на 320х200 на 32 цвета (в совре-менных видеокартрах этого нет). Вто-рой эффект – это возможность смены цветовой палитры в различных час-тях экрана.

В конце 1982 года Hi-Toro сменила свое имя на Amiga Incorporated в свя-зи с иском японской фирмы Toro о на-рушении авторских прав. Новое имя компании было выбрано не случайно – основатели компании хотели, чтобы имя звучало максимально дружелюб-но (Amiga с итальянского переводится как «подружка») и располагалось в те-

лефонном справочнике между назва-ниями Apple и Atari.

1983 год начался с гигантских по-терь на компьютерном рынке, за-крылось множество мелких фирм. Amiga Inc. также потерпела крупные неудачи в продажах, и в итоге ситуа-ция сложилась так, что Lorraine стала единственной возможностью компа-нии заработать деньги. Для ускорения разработки проекта в компанию были приглашены новые люди: Боб Бернс, Гленн Келлер, Дейл Лак, ЭрДжи Ми-каль, Дейв Нидл, Рон Николсон, Боб Парисо и Карл Сассенрат. Появление новых инженеров позволило разбить команду разработчиков на две группы: первая занималась собственно разра-боткой компьютера, а вторая – написа-нием программного обеспечения к не-му. За вторую группу отвечал ЭрДжи Микаль. Позже, в интервью, он расска-зывал следующее:

«В Amiga Inc. я начинал как инженер ПО, я отвечал за проектирование гра-фических библиотек. Затем под моим руководством был создан Intuition – ос-нова графического интерфейса буду-щей операционной системы. Это был очень тяжелый для нас период – раз-работка длилась несколько месяцев по 100 часов в неделю!»

Для того чтобы иметь какие-либо средства в начале года, отдел компа-нии, занимающийся изобретением но-вых игровых контроллеров, выпустил очень оригинальную игру Zen Meditaton. Смысл ее заключался в том, что надо было сидеть максимально долгое вре-мя не шевелясь, в позе Лотоса на спе-циальном контроллере, выполненном в виде доски для сноуборда. Цель иг-ры была в том, чтобы, достигнув опре-деленного временного результата, по-пасть в нирвану. В операционной сис-теме Amiga при сбоях демонстриро-вался мигающий прямоугольник с над-писью «Guru Meditation», т.е. «гуру ме-дитирует». Эта фраза была данью раз-работчиков своему прошлому.

К сентябрю 1983 года были закон-чены макеты трех основных custom-чипов: Agnus (Address Generator), Daphne, которую позже переименовали в Denise (Display Adapter) и Porita, поз-же названную Paula (Purts and Audio). То, что было сделано hardware-отделом, мало походило на обычный домашний компьютер, скорее, это напоминало

мини-компьютер из трех стоек. Каж-дый «чип» занимал по несколько плат, причем на каждой было по 50 микро-схем (рис. 2).

Эпоха Commodore В самом начале 1984 года, на амери-канской выставке CES была произве-дена первая демонстрация Lorraine ши-рокой публике. Компьютер до сих пор представлял собой груду печатных плат и множество проводов, но все это старательно было спрятано под стол, на котором оставили только монитор. Самой большой проблемой на этой демонстрации было обеспечение вентиляции системы – пространство под столом никак не вентилировалось, и оборудование могло в любую секун-ду выйти из строя, но, к счастью, это-го не произошло.

Lorraine произвела фурор – на эк-ране крутилась известная демонстра-ция «Boing Ball», которая рисовала вра-щающийся, прыгающий трехмерный красно-белый шар. При этом, достиг-нув краев экрана, он со стереозвуком ударялся о стенки и двигался в обрат-ную сторону. На фоне других, восьми-разрядных компьютеров, возможности Lorraine смотрелись просто шикарно! Однако несмотря на торжество на вы-ставке среди посетителей, крупные компании восприняли новинку весь-ма прохладно.

К тому времени первоначальный капитал в 7 миллионов долларов уже иссяк, а продажи игровых контрол-леров не давали значительного до-хода. Положение было критическое, и руководство компании решило про-дать свое детище какому-нибудь гига-нту. Были контакты с Sony, Apple, Atari и почти удавшийся контракт с Silicon Graphics. Стив Джобс, CEO Apple, на-пример, посчитал, что компьютер имеет «очень продвинутое hardware», что не приемлемо для домашних сис-тем. Из всех компаний только Atari со-гласилась заключить серьезную сдел-ку с Amiga Inc. В 1992 году в интервью Джей Майнер сообщил:

«Atari дала нам 500 тысяч долларов с таким условием, что если мы за ме-сяц не успеем закончить custom-чипы, то они купят наши акции по бросовым ценам. Это был очень глупый контракт, но из-за отсутствия других вариантов мы согласились.»

Рисунок 3. Amiga 1000

Page 91: 039 Системный Администратор 02 2006

89№2, февраль 2006

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

Однако к тому времени Amiga Inc. подвернулась удача, гигант в области домашних компьютеров Commodore согласился приобрести компанию за 3 миллиона долларов, превра-тив ее в одно из своих подразделе-ний и оставив весь ее состав. Бла-годаря этой сделке Amiga Inc. быс-тро вернула Atari ее 500 тысяч дол-ларов. Commmodore переименовала Amiga Inc. в «Commodore-Amiga Inc.» и выделила 27 миллионов долларов на дальнейшую разработку компью-тера.

К концу 1984 года новое подраз-деление выпустило первый прото-тип нового компьютера – Amiga 1000 (рис. 3). По тем временам это была очень мощная машина с 256 Кб опе-ративной памяти и desktop-корпу-сом, позволяющим убирать клавиа-туру под него. Для ускорения процес-са разработки операционной систе-мы была нанята британская фирма MetaComCo. Она занялась портирова-нием ядра своей ОС Tripos на процес-соры Motorola.

В 1985 году Amiga 1000 поступи-ла в продажу по официальной цене в 1 500 долларов. Commodore счита-ла, что победила, так как выпустила первую домашнюю шестнадцатираз-рядную систему.

Однако на той же самой выстав-ке CES’85, где демонстрировались первые компьютеры, Atari предста-вила свою новинку. Это был компью-тер Atari ST. Он был основан на том же процессоре MC68000, что и Amiga, имел зашитую в ПЗУ однозадачную операционную систему, представля-ющую собой гибрид MS-DOS, CP/M и графического интерфейса от Digital Research – GEM (Graphic Environment Manager).

Графические и музыкальные спо-собности также были не на высоте – 320х200 точек на 4 цвета из палитры в 512 цветов, плюс 640х200 и 640х400 на 2 цвета, причем последний режим требовал специального монитора.

В качестве музыкального сопро-цессора служил хорошо знакомый поклонникам компьютера ZX Spectrum контроллер YM-2149 (4 бита, 3 кана-ла, 8 октав).

Однако упрощенная, по сравне-нию с Amiga, архитектура позволи-ла быстрее наладить производство

и продавать компьютер по значитель-но меньшей цене. Плюс, компьютер изначально имел MIDI-разъемы и со-ответствующее программное обес-печение, что сразу предопредели-ло его успех на рынке музыкальных компьютеров.

1985-1986 годы прошли под флаг-манским лидерством компьютеров Atari, причем за это время было вы-пущено три новых модели со встро-енным дисководом и увеличенным до 1 Мб объемом оперативной памя-ти. Однако Commodore все это время не дремала.

В 1986 году началась разработ-ка новой модели Amiga 2000, которая отличалась вместительным desktop-корпусом с большим количеством разъемов расширения, причем при-сутствовали даже разъемы под ши-ну ISA для периферии от компьюте-ров IBM PC. Для их функционирования были разработаны аппаратные эму-ляторы IBM PC с процессорами 8088 и 80286. Это позволяло значительно расширить объем программного обес-печения под Amiga.

Благодаря возможностям расши-рения Amiga 2000 продемонстрирова-ла новую технологию автоматической конфигурации устройств AutoConfig. Смысл ее заключался в том, чтобы ав-томатически предоставлять при вклю-чении компьютера новому устройс-тву область памяти, прерывания и ли-нии DMA. Через десять лет подобное появилось в IBM PC под названием Plug’n’Play.

В 1985 году было разработано сто-ронней компанией новое устройство Genlock, которое устанавливалось в разрыв между видеоразъемом и мо-ниторным кабелем Amiga. Данное уст-ройство предназначалось для смеши-вания видеосигнала от внешнего ис-точника (видеомагнитофон, видеока-мера и т. п.) и компьютера. Одновре-менно с этим для Amiga были разра-ботаны первые программы для трех-мерного моделирования и графичес-кие редакторы. В то время профес-сиональные компьютеризированные видеостудии стоили до 50 тыс. долла-ров, цена же Amiga с этими програм-мами и GenLock составляла пример-но две – три тысячи долларов, поэто-му ее популярность на данном рынке быстро возросла.

Для поддержки пользователей под спонсорством Commodore в 1985 году начался выпуск первого журна-ла для пользователей Amiga – «Amiga World».

В 1987 году на рынок вышли две но-вые модели – Amiga 2000 и Amiga 500 (рис. 4). Вторая представляла со-бой упрощенный вариант первой. Как и Atari ST, A500 была укомплекто-вана в единый с клавиатурой корпус, плюс ее цена была меньше 1000 дол-ларов, оставляя в себе все возмож-ности от старшей сестры. Ввиду сво-ей низкой цены А500 стала объектом мечтаний множества людей и сподвиг-нула массы на переход с устаревшей восьмиразрядной технологии (компью-теры Spectrum, Amstrad и пр.) на новые шестнадцатиразрядные машины.

В 1988 году общий объем продаж от компьютеров и программного обес-печения превысил аналогичную циф-ру у Atari. С тех пор последняя всег-да находилась на втором месте пос-ле Amiga.

Игровой рынок также перешел в ру-ки Amiga, поскольку для нее выходили такие игры, которые просто невозмож-но было сделать на Atari. Последняя на-чала иск против Commodore, посколь-ку изначально Майнер работал в Atari и все свои идеи придумал именно в ее лабораториях, однако этот иск не был удовлетворен судом.

Рисунок 4. Авторская Amiga 500

Рисунок 5. Amiga 3000

Page 92: 039 Системный Администратор 02 2006

90

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

Первые попытки давления от Microsoft и Apple начали ощущаться в следующем, 1989 году. Для удержа-ния своих позиций Commodore улучши-ла чипсет для поддержки 1 Мб памяти и сильно снизила цену на А500. Девид Плизенс, будущий глава Commodore UK, создал «А500 Batman bundle», бла-годаря чему продал тысячи компьюте-ров и обеспечил их огромную популяр-ность в начале девяностых годов.

1990 год ознаменовался коренным улучшением программной и аппарат-ной части компьютеров. Вышла новая версия AmigaOS 2.x. В программном плане (API, интерфейсы) это был на-стоящий прорыв по сравнению с пре-дыдущей ОС. Даже внешний вид стал

более серьезным. Но самое главное – это был выход Amiga 3000. Компью-тер включал в себя новый чипсет ECS (Enhanced ChipSet, первый же стали называть OCS – от слова Original), ко-торый адресовал до 2 Мб памяти и под-держивал не только две жестко задан-ные экранные частоты (PAL, NTSC), но позволял гибко менять из значе-ния с 15 до 31 КГц для строчной часто-ты и от 45 до 83 для кадровой частоты. Это позволило использовать вошед-шие в моду VGA-мониторы от IBM PS/2. Поскольку большая часть старых игр была написана прямым программиро-ванием чипсета, то для работы с этими мониторами в компьютер было встро-ено устройство ScanDoubler, позоля-ющее удвоить телевизионную часто-ту с 15 до 31 КГц.

А3000 производилась в Desktop-корпусе (рис. 5), имела шину SCSI-2 для накопителей, 4 разъема для рас-ширения с шиной Zorro-II, 3 разъема ISA и специальный разъем Fast Slot. Дело в том, что на материнской плате компьютера располагался процессор MC68030 на 16/25 МГц (в зависимости от версии), а оперативная память мог-ла расширяться только до 16 Мб. Fast Slot предназначался для специаль-ной платы с новым процессором, ра-ботающим на большей частоте, и до-полнительных слотов для оператив-ной памяти.

Здесь стоит отметить одну особен-ность строения оперативной памяти Amiga – адресное пространство делит-ся на две области: Chip-RAM, к кото-рой имеет доступ и процессор, и чип-сет (он хранит в ней звуки и изображе-ния), причем последний имеет боль-ший приоритет; и Fast-RAM, к которой имеет доступ только процессор. Такое разделение хорошо тем, что ни про-цессор, ни чипсет практически не пе-ресекаются, каждый работает со сво-ей областью по циклам прямого до-ступа в память и не мешают друг дру-гу. Но позже это стало создавать огра-ничения – чипсет с его возможностями со временем устаревает, потребности в памяти растут, но она все равно ог-раничена изначальным максималь-ным объемом в 2 Мб и максимальным трансфером в 7 Мб/с. Проблему сла-бого чипсета стали решать с помо-щью видеокарт. Дело в том, что с точ-ки зрения AmigaOS нет разницы, ку-

да выводить изображение – на чипсет или на видеокарту.

S u n з а к л ю ч и л а д о г о в о р с Commodore о создании новой опера-ционной системы для A3000, UNIX-кло-на Amiga UNIX. Специально для нее вы-пускались модели A3000UX, которые включали в себя стриммер, графичес-кий и сетевой контроллеры, плюс конт-роллер на 6 последовательных портов для терминалов.

Помимо А3000 была выпущена еще одна модель – Commodore CDTV. Это была старая А500 с 1 Мб памя-ти и с приводом CD-ROM, заключен-ная в корпус, похожий на видеомаг-нитофон. Для этого компьютера про-давались инфракрасная клавиатура, мышь и внешний дисковод. Не смот-ря на оригинальную идею, эта модель провалилась – за последние несколь-ко лет люди пресытились возможнос-тями А500.

На замену А500 в 1991 году при-шел новый вариант – А500+. Эта ма-шина имела тот же самый чипсет ECS, что и А3000. Последнюю дополнила модель А3000Т – это была та же самая А3000, только с семью слотами Zorro-2 и в Tower-исполнении.

Advanced Amiga ArchitectureК концу года IBM свернула свою ли-нейку PS/2, оставив после нее «на-следство» в виде двух разъемов мы-ши/клавиатуры, слотов SIMM и, са-мое главное, графических адапте-ров VGA. Последние привнесли но-вый режим 320х200х256 цветов, что превосходило параметры чипсетов Amiga, и поэтому публика требовала улучшений.

В лабораториях Commodore к этому времени разрабатывался новый ком-пьютер – А3000+. Это была внешне та же А3000, но внутри – кардинально измененная аппаратная часть. Прежде всего это новый чипсет AGA. Это бы-ла если не революция, то по крайней мере серьезная эволюция по сравне-нию с ECS. Общая скорость работы повысилась в четыре раза, но самое главное – это новые цветовые режи-мы: к имеющимся ранее режимам в 2, 4, 8, 16, 32 цвета плюс EHB (Extra Half Bright – режим в 32 цвета, плюс они же, но с половинной яркостью) и HAM до-бавились 64, 128 и 256 цветов и плюс

Рисунок 6. Авторская Amiga 600

Рисунок 7. Amiga 4000

Рисунок 8. Авторская Amiga 1200

Рисунок 9. A1200 (вид снизу): установлена процессорная карта Blizzard 1260 от Phase 5

Page 93: 039 Системный Администратор 02 2006

91№2, февраль 2006

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

HAM-8, причем во всех разрешени-ях. Общая цветовая палитра увеличи-лась с 4096 до 16 млн. цветов, а пос-ледний режим давал возможность од-новременного вывода 262 144 цветов. Также планировалось устанавливать в эту модель DSP-процессор MC56001 для обеспечения работы того, что сей-час называется «программный мо-дем», декодирования звуковых и ви-део (MPEG) данных.

В начале 1992 года вышла заме-на А500+ – Amiga 600 (рис. 6). С ап-паратной точки зрения это была та же А500+, но с контроллером IDE для но-утбучных 2.5" жестких дисков и слотом PCMCIA. Самое главное – это разме-ры. От клавиатуры оставили только ос-новную часть, без цифровой, благода-ря этому удалось сделать удивительно компактный корпус. Однако к 1992 го-ду иметь все тот же чипсет ECS, про-цессор MC68000 на 7 МГц и 1 Мб па-мяти – было уже несерьезно.

Проект А3000+ был остановлен, однако новый чипсет AGA не был за-брошен. На его основе была разра-ботана новая модель – Amiga 4000 (рис. 7). Внешне улучшенная (добав-лен пятидюймовый отсек для диско-водов 5.25", стриммеров, CD-ROM и пр.), внутри слегка упрощенная (IDE вместо SCSI, убран DSP, выки-нут ScanDoubler), это была маши-на-мечта. Внутрь устанавливалась процессорная карта с процессором MC68040 на 25 МГц. По тестам на про-изводительность этот процессор об-ходил 80486, работающий на 50 МГц. Для этой машины была написана но-вая ОС – AmigaOS 3.0. Это был также серьезный прорыв. Для чтения дисков от IBM PC была интегрирована подсис-тема CrossDOS. Для удобства написа-ния прикладного ПО появились дата-тайпы (плагины к системе, позволяю-щие любому приложению открывать требуемые ему графические, звуко-вые, текстовые форматы), единая сис-тема локализации приложений, улуч-шенный скрипт-язык AREXX (позво-лял из одного скрипт-файла полно-ценно управлять одновременно не-сколькими приложениями). Были про-изведены улучшения в файловой сис-теме (кеширование директорий, под-держка не латинских имен), стандар-тная подсистема установки приложе-ний и многое другое. Для периферии

появилась новая шина расширения – Zorro-3. Она совместима со своей про-шлой версией электрически, но рабо-тала на гораздо большей скорости – 25 Мб/с против 3,5 Мб/с и адресова-ла 512 Мб адресного пространства против 8 Мб.

Atari предприняла свою последнюю попытку отвоевать рынок у Amiga, вы-пустив новый компьютер Atari Falcon с процессором MC68030 на 25 МГц и немного более качественным чип-сетом, чем AGA, но было уже слишком поздно. Невыпущенная модель Atari Microbox и провалившаяся шестидеся-тичетырехразрядная игровая консоль Atari Jaguar доконали компанию, и ее имущество и бренд были распроданы с молотка компании JTS Corp., произ-водящей жесткие диски.

К концу 1992 года, продолжая развитие своего модельного ряда, Commodore выпускает Amiga 1200 (рис. 8, 9). Это самая продаваемая Amiga за всю свою историю. Понача-лу цена на нее составляла 699 фун-тов стерлингов, но позже опустилась до 399 фунтов стерлингов.

Внешне это была усеченная по глубине А500. Внутри стоял новый чипсет AGA, 32-разрядный процес-сор MC680EC20 на 14 МГц, 2 Мб Chip-памяти, такие же разъемы IDE 2.5" и PCMCIA, как и у А600. Внизу ком-пьютера, под пластмассовой кры-шечкой, располагался 150-контакт-ный слот TrapDoor. Подобное было и у А500, и у А600, но у них он служил для установки плат с дополнительной Chip-памятью, а у А1200 туда были вы-ведены процессорные шины и сигна-лы. Под этот слот в последующие го-ды было разработано великое мно-жество процессорных карт. При их ус-тановке старый процессор отключал-ся, но влючался новый (от 68020 на бо-лее высокой тактовой частоте и с FPU до 68060 на 50-66 МГц и PowerPC 603e 160-240 МГц), добавлялась Fast-па-мять.

БанкротствоВ 1993 году Commodore наконец пол-ностью свернуло производство сво-их популярных восьмиразрядных ма-шин Commodore 64. За 11 лет их «жиз-ни» было выпущено 30 миллионов компьютеров, что даже было зане-сено в Книгу рекордов Гиннесса. Од-

новременно с этим на рынке появи-лась Amiga CD32 – игровая консоль с CD-ROM. Аппаратно она представля-ла собой ту же А1200 без клавиатуры и с чипсетом, выполненным по мень-шему технологическому процессу. При помощи позже выпущенных мо-дулей от сторонних фирм (ProModule, SX-1, SX-2) эта консоль превращалась в полноценный компьютер с клавиату-рой, мышью, накопителями и процес-сором MC68030 на 50 МГц. В маркетин-говом плане CD32 имела успех только на британском рынке, а на остальных провалилась.

Интересный факт: в 1993 году Microsoft разрабатывала свою новую операционную систему Windows NT, которую планировалось перенести на множество платформ, в том чис-ле и на Amiga. Однако этим планам не суждено было сбыться.

После AGA началось проектиро-вание чипсетов Hombre и AAA, кото-рые должны были значительно уско-рить работу, привнести новые цвето-вые режимы до 16-бит, HAM-12, под-держку более высоких частот раз-верток, что дало бы разрешения до 1280x1024 и множество других новов-ведений. Commodore объявила, что бу-дущие модели будут строиться на ба-зе новых процессоров от Motorola – PowerPC или от HP – PA RISC.

В марте 1994 года началось произ-водство Tower-версии А4000 – Amiga 4000T. Amiga были весьма популярны на домашнем рынке, в области виде-опроизводства (на Amiga считались эффекты в Babylon-5, морфинг 3D-мо-делей в Terminator-2), в музыкальной области (ранние альбомы The Prodigy писались на Amiga) и множество дру-гих. Доход от продаж компьютеров был высок, однако промахи с попыт-ками выжать все соки из старых тех-нологий в виде A500+, A600 и CDTV, оставили большую брешь в бюдже-те компании.

Все это привело к тому, что к се-редине года компания объявила се-бя банкротом. Помимо этого 20 ию-ня 1994 года Джей Майнер скончался от обширного инфаркта сердца. Бан-кротство компании заставило отвер-нуться от Amiga множество фирм, вы-пускавших программное и аппаратное обеспечение. Ее будущее было неоп-ределено.

Page 94: 039 Системный Администратор 02 2006

92

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

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

Эта книга является переводом офи-циального пособия для самостоятель-ной подготовки к экзамену 70-291. Без сомнения, это издание окажется вам полезным, даже если вы не собирае-тесь сдавать вышеобозначенный экза-мен. Каждая глава разбита на занятия, в конце которых представлено резюме написанного. В завершение глав пред-ложены контрольные вопросы (и отве-

ном объеме, разве что «все возмож-ности PL/SQL» освящены не полно-стью, но это отнюдь не оттого, что ав-торы что-то недописали, а скорее по-тому, что действительно досконально и в полном объеме описать все воз-можности PL/SQL в рамках одной кни-ги неосуществимо. Изложенный мате-риал разделен на 6 логических частей. Программирование на PL/SQL (исто-рия языка, краткий обзор некоторых главных функций, простые примеры и основы языка). Структуры програм-мы PL/SQL (условные if и case и пос-ледовательные goto и null, операторы управления потоком и обработка ис-ключений). Работа с данными в PL/SQL (рассмотрены различные типы про-граммных данных, таких как числа, строки, записи и коллекции, не оста-лось без внимания и описание встро-енных функций, предоставляемых Oracle для выполнения различных опе-раций с данными). SQL и PL/SQL (ор-ганизация взаимодействия приложе-

Oracle PL/SQL для профессионаловСтивен Фейерштейн, Билл Прибыл

ний с базами данных Oracle средства-ми SQL, подробно рассказано о том, как определить транзакции, обновляю-щие, дополняющие и удаляющие дан-ные таблицы). Разработка приложений PL/SQL (в этой части освящены вопро-сы структуры основных составляющих частей любой программы: процедуры, функции, триггеры, пакеты). Особые возможности PL/SQL (основные эта-пы исполнения кода PL/SQL, исполь-зование памяти, различий между сер-верным и клиентским PL/SQL, показа-но, как вызвать код на Java и C из при-ложений PL/SQL). Без сомнения, эта книга – просто находка для всех людей, использующих (или желающих начать) PL/SQL в своей работе.

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Питер».

«Питер»

2005

941

5-318-00528-4

≈ 525 руб.

Внедрение, управление и поддержка сетевой инфраструктуры Microsoft Windows Server 2003Дж. С. Макин, Йен Маклин

ты на них), а также лабораторная рабо-та, выполнение которой поможет луч-ше усвоить прочитанный материал. Те-мы книги: основные сведения о сетях Windows 2003 Server (ключевые момен-ты проектирования инфраструктуры сети, создание сетей на основе стан-дартных компонентов), общие сведе-ния о TCP/IP (общие концепции TCP/IP, IP-адресация, разбиение сетей на под-сети), мониторинг и устранение непо-ладок подключений TCP/IP, настройка серверов и клиентов DNS. Развертыва-ние структуры DNS, мониторинг и ус-транение неполадок. Конфигурирова-ние DHCP-серверов и клиентов, а так-же наблюдение и выявление проблем, связанных с DHCP. Маршрутизация в Windows 2003 (локальные сети, NAT, протоколы маршрутизации OSPF и RIP, фильтры пакетов), настройка и управ-

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

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Питер».

«Питер»

2006

620

5-469-01357-X

≈ 510 руб.

Page 95: 039 Системный Администратор 02 2006

93№2 февраль 2006

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

Думаю, эта книга не нуждается в пред-ставлении широкому кругу читателей. Она по праву считается одной из луч-ших книг на русском языке, посвящен-ных аппаратному обеспечению IBM PC. Издание пользуется популярностью у широкого круга читателей, начиная от обычных пользователей и заканчи-вая серьезными специалистами в об-ласти «железа». Также нельзя не от-

Несмотря на то, что из-за перевода кни-га отстала от жизни года на три (напом-ню, что первые публикации о Snort были в «Системном администраторе» в 2003 году и что сейчас актуальной являет-ся серия 2.4, частично несовместимая с версией 2.1), книга является актуаль-ной и новой для нас потому, что это пер-вое русское издание значительного объ-ёма и качества о cистеме обнаружения

Snort 2.1. Обнаружение вторженийРейвен Олдер, Джейкоб Баббин, Адам Докстейтер, Джеймс Фостер, Тоуби Колленберг, Майкл Раш

атак Snort. Для тех, кто решил занять-ся вопросами обнаружения атак почти с нуля, хочет понять и разобраться с точ-ки зрения пользователя, как установить и настроить IDS Snort, книга будет неза-менима. В книге рассмотрено не толь-ко несколько вариантов установки про-граммы под разные дистрибутивы и да-ны рекомендации, но и понятным для продвинутого пользователя языком по-ясняется структура каждой части про-граммы. Стиль «HowTo» разбавляется литературными абзацами и картинками, что делает чтение более лёгким. Но, не-смотря на такие приятные моменты, не-льзя назвать перевод на 100% удачным: несколько бессмысленными кажут-ся дословно переведённые конспекты и FAQ в конце каждой главы, не буду-чи адаптированными для нас. Пример-но пятая часть книги подробно расска-зывает о наиболее часто используемых дополнениях к Snort, где даже те, кто хо-

рошо знаком со Snort, откроют для себя что-то новенькое.

Прилагаемый к книге компакт-диск для человека, имеющего под рукой Ин-тернет, абсолютно бесполезен. Диск за-полнен процентов на десять програм-мами, о которых идёт речь в книге и ко-торые без проблем можно найти в сети. Все программы раскинуты по директо-риям, видимо, с намёком на главы, од-нако это не вносит порядка: несколь-ко программ встречаются по два раза, одни и те же версии есть как в архиве, так и распакованные, а некоторые име-на файлов вообще обрезаны и закан-чиваются на ~1.

Аппаратные средства IBM PCМихаил Гукметить, что эта книга входит в число официальных учебных пособий в ря-де учебных заведений. Книга хорошо структурирована. Весь материал из-лагается простым и доступным язы-ком. Все темы освящаются достаточ-но глубоко и развернуто. Основные из них: устройство и общая архитек-тура компьютера (устройство PC, пи-тание, архитектура IBM PC-совмести-мых компьютеров, организация ввода-вывода, BIOS); ядро компьютера – ма-теринская плата, процессор и память; периферия (устройства хранения дан-ных, ввода-вывода и их интерфейсы, видео- и аудиосистемы, сетевые уст-ройства); интерфейсы периферийных устройств (шины расширения, парал-лельный интерфейс, проводные и бес-проводные последовательные интер-фейсы, шины USB, FIREFIRE, интер-фейсы IDE: ATA/ATAPI/SATA, а также SCSI и Fibre Channel).

Большое количество различных диаграмм, таблиц и иллюстраций спо-собствует лучшему пониманию изуча-емого материала. Исходя из содержа-ния можно подумать, что книга носит сугубо теоретический характер, но это не так, некоторая часть материала но-сит исключительно практическое зна-чение. Книгу можно порекомендовать широкому кругу читателей, возмож-но использование и как учебного по-собия, так и просто как справочника. Последнее издание книги пополне-но материалами о PCI-X, PCI-Express, HT, SATA, а также дополнены некото-рые главы.

Обзор книжных новинок подготовили Александр Байрак, Павел Закляков

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

«Бином-Пресс»

2006

656

5-9518-0136-2

≈ 374 руб.

Издательство:

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Питер».

«Питер»

2006

1072

5-469-01182-8

≈ 480 руб.

Page 96: 039 Системный Администратор 02 2006

94

подписка на 2006 год

Российская Федерация Подписной индекс: годовой – 20780, полугодовой – 81655 Каталог агентства «Роспечать» Подписной индекс: 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» Альтернативные подписные агентства: Агентство «Интер-Почта» (095) 500-00-60, курьерская

доставка по Москве Агентство «Вся Пресса» (095) 787-34-47 Агентство «Курьер-Прессервис» Агентство «ООО Урал-Пресс» (343) 375-62-74 ЛинуксЦентр www.linuxcenter.ru Подписка On-line http://www.arzi.ru http://www.gazety.ru http://www.presscafe.ru

СНГ В странах СНГ подписка принимается в почтовых отделе-ниях по национальным каталогам или по списку номенк-латуры АРЗИ: Азербайджан – по объединенному каталогу российских

изданий через предприятие по распространению печа-

ти «Гасид» (370102, г. Баку, ул. Джавадхана, 21) Казахстан – по каталогу «Российская Пресса» через

ОАО «Казпочта» и ЗАО «Евразия пресс» Беларусь – по каталогу изданий стран СНГ через РГО

«Белпочта» (220050, г. Минск, пр-т Ф. Скорины, 10) Узбекистан – по каталогу «Davriy nashrlar» российские

издания через агентство по распространению печати «Davriy nashrlar» (7000029, г. Ташкент, пл. Мустакиллик, 5/3, офис 33)

Армения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г. Ереван, пл. Сасунци Давида, д. 2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул. Са-рьяна, 22)

Грузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г. Тбилиси, ул. Хошараульская, 29) и АО «Мацне» (380060, г. Тбилиси, пр-т Гамсахурдия, 42)

Молдавия – по каталогу через ГП «Пошта Молдавей» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134)

по списку через ГУП «Почта Приднестровья» (МD-3300, г. Тирасполь, ул. Ленина, 17)

по прайс-листу через ООО Агентство «Editil Periodice» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134)

Подписка для Украины: Киевский главпочтамт Подписное агентство «KSS», тел./факс (044)464-0220

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

20780*

81655**

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

87836

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

* годовой** полугодовой

Page 97: 039 Системный Администратор 02 2006

95№2, февраль 2006

подписка на 2006 год

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

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

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

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

Для юридических лиц: Отправьте заявку по факсу (095) 928-82-53 или по e-mail:

[email protected]. Укажите наименование и банковские реквизиты своей

организации, почтовый индекс и адрес доставки журна-ла, телефон и e-mail контактного лица, период подпис-ки и количество номеров. Редакция выставит вам счет, после оплаты которого вы начнете получать журналы по почте. Необходимые бухгалтерские документы вы-сылаются почтой.

Для физических лиц: Заполните нижеприведенную квитанцию, оплатите в лю-

бом банке и пришлите в редакцию копию с отметками банка.

После поступления платежа редакция начнет отправ-лять вам номера.

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

№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

Page 98: 039 Системный Администратор 02 2006

96

СИСТЕМНЫЙ АДМИНИСТРАТОР№2(39), Февраль, 2006 год

РЕДАКЦИЯИсполнительный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[email protected]Технический редакторВладимир ЛукинРедакторАлексей КоршуновВнештатные редакторыАлексей БарабановКирилл ТихоновСергей СупруновВалентин СиницынТатьяна Ильченко

РЕКЛАМНАЯ СЛУЖБАтел./факс: (095) 928-8253Дарья Хохловаreс[email protected]

Верстка и оформление[email protected]Дизайн обложкиНиколай Петрочук

По вопросам распространенияобращайтесь по телефону:(095) 928-8253 (доб. 120)

107045, г. Москва,Ананьевский переулок, дом 4/2, стр. 1тел./факс: (095) 928-8253Сайт журнала: www.samag.ru

РУКОВОДИТЕЛЬ ПРОЕКТАПетр Положевец

УЧРЕДИТЕЛИВладимир ПоложевецАлександр Михалев

ИЗДАТЕЛЬЗАО «Издательский дом«Учительская газета»

Отпечатано типографиейГП «Московская Типография №13»Тираж 10000 экз.

Журнал зарегистрированв Министерстве РФ по делам печати, телерадиовещания и средств массо-вых коммуникаций (свидетельствоПИ № 77-12542 от 24 апреля 2002 г.).

За содержание статьи ответственность несет автор. За содержание рекламно-го объявления ответственность несет рекламодатель. Все права на опубли-кованные материалы защищены.

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

Уважаемые читатели!

Спешите оформить подпискуна первое полугодие 2006 года!

Приобрести новые и старые номера журналавы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.

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

Создаем порт для FreeBSD своими рукамиАвтоматизированная система сбор-ки стороннего программного обеспе-чения из исходных текстов (система портов) – это то, чем по праву гордится FreeBSD. Система содержит ссылки на десятки тысяч программ, и этот список постоянно пополняется. Кто их созда-ет, эти пополнения? Некие выдающие-ся специалисты? Да вовсе нет. Вы то-же сможете стать одним из них, прочи-тав эту статью.

Переходим от VBScript к ASP и ASP.NET:дописываем Framework на примере сетевых папокПрограммисты Microsoft, создававшие Framework, явно не ориентировались на системных и сетевых программис-тов, поэтому там отсутствуют функции по управлению DFS, сетевыми папка-ми и т. д. Возникает вопрос: «А как же решить данную проблему, ведь, напри-мер, в VBScript можно было без осо-бых усилий управлять сетевыми папка-ми (Shared Folders). Неужели в VB.NET это невозможно сделать?»

Управляем сетевым оборудованием с помощью протокола SNMPСегодня практически в любой сети да-же небольшой организации есть ак-тивное сетевое оборудование, управ-

ление которым можно, и, как правило, нужно автоматизировать. Для реше-ния этой задачи был разработан про-токол SNMP. Существует масса го-товых коммерческих решений по уп-равлению различными устройствами с помощью SNMP, например HP Open View, однако не каждой организации по карману приобретение подобного ПО, к тому же, эти программные про-дукты предназначены для управления большим количеством устройств и их использование в небольших сетях не-целесообразно.

Конфиденциально? Защитим! Утечка даже части конфиденциальной информации может нанести непопра-вимый вред компании. Мы зачастую от-даем сервер, жесткий диск на ремонт или замену, выбрасываем старые ар-хивные ленты, в лучшем случае тща-тельно стараясь удалить некогда хра-нимую на нем конфиденциальную ин-формацию низкоуровневым формати-рованием либо специализированны-ми утилитами, что не всегда успешно. На рынке существует несколько про-граммно-аппаратных комплексов для защиты конфиденциальной информа-ции на рабочих станциях и серверах посредством шифрования. Мы рас-скажем вам о возможностях програм-мных продуктов Zserver и Zbackup ком-пании SecurIT.