Так видит журнал читатель, который забыл оформить подписку:
КА
БЫ С
ТР О ТИ РАС РА КУ Ж ПИ
НИ НО К У ВО ЛЫ ГО ЗА ДНИ ТЯ Е НУ ЛИ
ЛИ
СЬ
№5(30) май 2005 подписной индекс 81655 www.samag.ru
Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии
№2(39) февраль 2006 подписной индекс 20780 www.samag.ru
танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM
Так видит журнал читатель, оформивший подписку:
№2(39) февраль 2006
КО НЕО НЧ ЖИ ИЛ ДА ИС НН ЬД О ЕН ЬГ И ЗА
ПО АВ СЛ РА Е О Л НА ТПУ РА СКА БО ТЕ
УЕ ХА Л
ВО
ТП
УС К
Интервью с Ларри Уоллом – создателем языка Perl
Подключаемся к Интернету через спутник Чем уникальна Prevx1 – общественная система предотвращения атак Можно ли защититься от переполнения буферов?
№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
Доставку гарантируем: качество обслуживания в пакетных сетях ProFTPD: мастер своего дела
ПОДПИШИТЕСЬ И ЧИТАЙТЕ! Роспечать – 20780, 81655 Пресса России – 87836 Интер-почта – тел. (095) 500-00-60
Практикум Python: обрабатываем входящую электронную почту Какова цена анонимности в Сети
г. Москва, Хлебный переулок 2/3 тел. 29-161-32, 202-61-43 (круглосуточно) e-mail: support@redline.ru
Íàøà êîìïàíèÿ 12 ëåò ïðåäîñòàâëÿåò ëèíèè ñâÿçè â ñàìûõ íåïðîõîäèìûõ ìåñòàõ Ìîñêâû. 10 Ìáèò - $500, âêëþ÷åíî ÌÍÎÃÎ òðàôèêà. Anything else? Çâîíèòå, äîãîâîðèìñÿ! ;-)
оглавление 2 ТЕНДЕНЦИИ ИНТЕРВЬЮ 4 Free Software Foundation переходит на технологию LinuxBIOS
О подробностях рассказывает старший системный администратор организации FSF – Ward Vandewege. Антон Борисов a.borisov@tesv.tmb.ru
АДМИНИСТРИРОВАНИЕ 6 Вы всё ещё не используете WMI? Часть 2: пишем сценарии
Написание скриптов, использующих WMI для управления распределенной сетевой инфраструктурой. Константин Леонтьев klеоnt@miсrоsоft.соm
16 Современный Linux-сервер: как планировать дисковые ресурсы Часть 2
Планирование дисковых ресурсов нужным образом, выполняемое на этапе закладки сервера, позволит значительно сократить возможные издержки в непредвиденных ситуациях. Для этого надо подойти к решению многих привычных вопросов с учетом возможных последствий. Алексей Барабанов alekseybb@mail.ru
24 ProFTPD: мастер своего дела
Разработчики ПО постоянно стараются реализовать новые возможности в тесных рамках протокола FTP. Один из наиболее ярких представителей этой плеяды – проект ProFTPD. Сергей Супрунов amsand@rambler.ru
32 FreeDOS – новый взгляд на старые вещи
MS-DOS давно устарел. Какие новые проекты доступны сегодня? Чем они отличаются? Есть ли их поддержка? Насколько они совместимы с программным и аппаратным обеспечением? Предлагаем вам обзор одной из DOS-систем, поддерживаемой и развиваемой до настоящего времени. Иван Максимов ivan_maksimov@inbox.ru
ПРОГРАММИРОВАНИЕ 38 Практикум Python: обрабатываем входящую электронную почту
Методы и приёмы, которые продемонстрированы при решении этой узконаправленной задачи, помогут вам решать проблемы гораздо более широкого спектра. Сергей Супрунов amsand@rambler.ru
42 Замыкания в Perl
Замыкания являются одной из тех особенностей Perl, которые редко встретишь в других языках программирования. Да и программисты на Perl зачастую не вдаются в такие дебри. Напрасно. Даже если вы не используете замыканий, знать о них весьма полезно. Алексей Мичурин alexey@office-a.mtu-net.ru
№2, февраль 2006
БЕЗОПАСНОСТЬ 48 Можно ли защититься от переполнения буферов?
Хакеры ломают разрекламированные защитные комплексы один за другим. Почему? Давайте заглянем под капот Stack-Guard, Stack-Shield, Pro-Police и Microsoft Visual Studio .NET, сравнив заявленные возможности с реальными. Крис Касперски kk@sendmail.ru
56 Чем уникальна общественная система предотвращения атак Prevx1
Появление программ, работающих по новому принципу, может пошатнуть позиции антивирусных компаний. Сергей Яремчук grinder@ua.fm
60 Как повысить безопасность веб-приложений
ModSecurity – функциональный, простой в конфигурировании, и главное, совершенно бесплатный инструмент, использование которого позволит повысить безопасность предоставляемых веб-услуг. Сергей Яремчук grinder@ua.fm
66 Исследуем сетевую безопасность посредством Linux Netwosix
Обзор дистрибутива, ориентированного на исследование сетевой безопасности. Сергей Яремчук grinder@ua.fm
СЕТИ 70 Подключаемся к Интернету через спутник
Спутниковый Интернет развивается семимильными шагами, да и тарифы на передачу данных посредством спутниковых провайдеров одни из самых низких. Антон Борисов a.borisov@tesv.tmb.ru
74 Какова цена анонимности в Сети
Когда цена анонимности почтовой переписки или совершения электронных платёжных операций высока, применимы лишь самые надёжные методы. Андрей Погребенник andrew.p@safe-mail.net
82 Доставку гарантируем: качество обслуживания в пакетных сетях
Если вы работаете по ssh удаленно, слушаете интернет-радио или просто играете в online-игры, то знаете, что получаемое удовольствие прямо пропорционально нагрузке на вашу сеть. Сергей Сикорский fagot@kalinovka.net
РЕТРОСПЕКТИВА 86 История компьютеров «Амига» Часть первая: 1982-1994
Сегодня компьютерная индустрия поделена главным образом между Windows, Apple и Linux/UNIX-решениями. Еще 10-15 лет назад ситуация на рынке ПК была совершенно другой. Сергей Зуев megabyte2003@list.ru
92 КНИЖНАЯ ПОЛКА 55, 65 BUGTRAQ 1
тенденции Не все выставки одинаково интересны НПО «Схема» и компания SonicWall представили свои Международный форум «Технологии безопасности» готовые решения – шлюзы, firewall и другие сетевые средсв этом году отметил своё десятилетие. Раз в год орга- тва. Механические системы блокирования, среди которых низаторы собирают компании, так или иначе связанные с обеспечением безопасности. Последние два го- кабель-замок для портативного компьютера, стационарнода форум проходит в «Крокус-Экспо». го компьютера, напольная подставка-замок для компьютеОставим лирику в стороне и обратим внимание на са- ра и прочие системы физических блокировок, представиму выставку. Несмотря на малое количество отведённого ла компания Bariach Magem. места под экспозиции IT, компаний присутствовало достаКак и в прошлом году, НПО «Техника-Сервис» на своём точно много. Представители наиболее интересных из них богатом и прекрасно оформленном стенде представила с удовольствием рассказывали о представляемых продук- разновидности защищённых промышленных ноутбуков. Потах и щедро делились визитными карточками и пресс-ре- сетителям предлагали полюбоваться на компьютеры, подлизами. Что же было наиболее примечательного? вергающиеся различным внешним раздражителям, таким, Итак, компания Nero предлагала всем желающим оз- как вибрации, влага, прямые удары, низкие температуры, накомиться с системами мгновенного уничтожения данных большое количество пыли и прочие воздействия. В целом неправильно было бы сказать, что выставка с магнитных носителей. Представители компании SecureIT рассказывали о сис- пустовала, но и назвать её интересной и достойной внитеме Zlock, обеспечивающей гибкое управление доступом мания тоже нельзя. Из наиболее зрелищного в ряду IT-комк аппаратным ресурсам компьютера. паний, наверное, стоило бы упомянуть девушек, затянуКомпания «Актив» сообщала о своей системе со стран- тых в латекс, рекламирующих агентство телохранителей, ным названием Guardant. Это система защиты интеллек- которое почему-то разместилось крайне близко к «ряду туальной собственности разработчиков и издателей ком- ИТ-шников». Они вызывали наиболее оживлённый интепьютерных программ, представляющая собой програм- рес у публики. мно-аппаратный комплекс из электронных ключей и проАлексей Коршунов граммного обеспечения. Мы привыкли к подобным системам при использовании программ компании 1С. Ещё одна разработка, только на этот раз для авторизации пользо- Выход новой версии CRM вателей и защиты электронной переписки в сетях на базе от компании Microsoft Windows-систем, ruToken, также предлагалась компанией 8 февраля 2006 года в офисе Американской торговой «Актив» всем желающим. палаты прошла пресс-конференция, посвященная выФирма АНКАД представила свою основную продукцию – ходу новой версии системы управления отношениями аппаратные шифраторы серии Криптон. с клиентами (CRM) от корпорации Microsoft – Microsoft Компания STAR Force рассказывала всем желающим Dynamics CRM 3.0. Как видно из названия, это уже трео системе Safe’n’Sec, комплексной системе компьютерной тья версия этого продукта, являющегося одним из ребезопасности класса IPS для корпоративных информаци- шений Microsoft Business Solutions. онных сетей. Microsoft Dynamics CRM состоит из интегрированных моООО «Физтех-софт» предлагала систему защиты ин- дулей «Автоматизация продаж» (Sales) и «Обслуживание клиформации StrongDisk CE для смартофонов, КПК и других ентов» (Customer Service) и является инструментом для увеустройств под управлением ОС Windows Mobile. личения продаж и обеспечения высокого уровня сервиса На стенде компании ABBYY красовались FineReader для клиентов компании. Сейчас множество компаний испольи Lingvо, продукты весьма известные, но с не совсем по- зуют в своей работе эту систему. Те, кто использует Microsoft нятным отношением к безопасности. CRM версии 1.2, могут обновить свою систему до версии 3.0, а использующие CRM версий 2005 Alpha и 2005 TAP, лишены такой возможности. Данная CRM зарекомендовала себя как легкое в использовании, настройке и поддержке бизнес-приложение, которое может быть интегрировано с другими системами предприятия. Новая версия программы, сохранив все положительные стороны своей предшественницы, за счет использования последних наработок и решений софтверного гиганта (таких как MS SQL SERVER 2005) стала более надежной, быстрой в работе и развертывании. Пользовательский интерфейс претерпел изменения, сделавшие работу в системе более очевидной и удобной. Основные же изменения коснулись внутреннего устройства системы. Есть все основания полагать, что Microsoft Dynamics CRM 3.0 займет достойное место на рынке систем управления отношениями с клиентами. Стенд «живучих» ноутбуков
2
Николай Никульшин
тенденции Mozilla переродилась в SeaMonkey
Проект Camino достиг релиза 1.0
Энтузиасты, не пожелавшие хоронить 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.
Состоялся первый релиз веб-браузера с открытым кодом на базе движка 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.
MySQL AB открыла японское подразделение Компания MySQL AB, занимающаяся разработкой и поддержкой самой популярной открытой СУБД, объявила об учреждении MySQL K.K. – японского подразделения с штабом в Токио. За 2005 год было зафиксировано более одного миллиона скачиваний сервера базы данных MySQL японскими пользователями. Новая структура займется дальнейшим развитием этого успеха, повышением заинтересованности в экономичных решениях RDBMS среди корпоративных заказчиков, вопросами коммерческого лицензирования для поставщиков программного обеспечения, а также поддержкой продукции. «Япония – один из крупнейших мировых рынков ПО для баз данных корпоративного уровня, и интерес к MySQL в этом регионе был очень высок на протяжении нескольких последних лет, – прокомментировал Ларри Стефоник, президент MySQL K.K. и старший вице-президент MySQL AB по мировым продажам. – Открыв японское подразделение, мы продолжаем развитие услуг по предоставлению помощи нашим заказчикам и роста нашего бизнеса».
Основатель Gentoo покинул Microsoft Дэниэл Роббинс, основатель и бывший главный архитектор проекта популярного Linux-дистрибутива Gentoo, ушел из корпорации Microsoft, проработав там восемь месяцев. Основная задача работы Роббинса в Linux- и Open Source-лаборатории Microsoft, на которую он поступил в мае прошлого года, сводилась к «обучению» сотрудников гиганта ПО принципам проектов, строящихся на базе сообщества и разработок с открытым кодом. Как сообщил основатель Gentoo Linux в электронном письме агентству ZDNet UK, он покинул Microsoft в связи с тем, что у него не было возможности применять все свои технические навыки на этом посту.
Составил Дмитрий Шурупов по материалам www.nixp.ru
Oracle купила Sleepycat В середине февраля корпорация Oracle сообщила о приобретении Sleepycat Software, которая специализируется на программном обеспечении с открытым кодом и хорошо известна как разработчик популярной базы данных Berkeley DB. Покупка стала логичным следствием высказанного на одной из недавних конференций Ларри Эллисоном, исполнительным директором Oracle, заявлением, что его корпорация заинтересована в комбинировании программного обеспечения с открытым кодом и проприетарных разработок. Как сообщил Роберт Шимп, вице-президент по технологическому маркетингу в Oracle, корпорация продолжит поддерживать Sleepycat как автономное предприятие со всей текущей деятельностью в области проекта с открытым кодом Berkeley DB. В отличие от главного продукта Oracle – базы данных Oracle 10g – свободные разработки Sleepycat предназначены для встраивания в приложения. «Люди используют Berkeley DB, когда им не нужна вся мощь реляционных систем баз данных SQL, – заявил недавно Майкл Олсон, исполнительный директор Sleepycat, в интервью CNET. – В системах или устройствах, где вам нужно надежно и быстро хранить данные, вы можете заранее предугадать ее (СУБД) использование».
№2, февраль 2006
3
интервью
Free Software Foundation переходит на технологию LinuxBIOS Антон Борисов Альтернативой коммерческому BIOS является LinuxBIOS. В отличие от первого, он не является проприетарным продуктом. Аудит его кода может провести каждый, кто разбирается в x86-архитектуре. Поэтому неудивительно, что организация, пропагандирующая свободное программное обеспечение, остановила свой выбор именно на этой технологии.
F
SF (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 – это большой шаг в правильном направ-
4
лении (здесь и далее термины «тех- занных причин открытостью в том понология LinuxBIOS» и «платформа нятии, что мы пропагандируем. LinuxBIOS» равнозначны. – Прим. авОчевидно, что замена системнотора). Но всё же остается очень мно- го проприетарного BIOS на открытый го работы. В современных ПЭВМ ис- LinuxBIOS сделает ПЭВМ более свопользуется определенное количество бодной, но свободной на 100% совреfirmware [2] (Firmware – программное менная ПЭВМ не будет. Надо понимать, обеспечение, которое внедрено в ап- что в настоящий момент эта цель недопаратное устройство. Например, про- стижима. Хотя, повторюсь, цель можно грамма, содержащаяся во FlashROM- достичь, но придется очень много поили в ROM-чипе). работать в данном направлении. Есть системный проприетарный Другой аспект, который проявляBIOS (Basic Input/Output System – ба- ется при переходе, заключается в слезовая система ввода-вывода) [3], кото- дующем: LinuxBIOS, будучи аналогом рый может быть заменен на LinuxBIOS. системного проприетарного BIOS, заЕсть также VGA BIOS, который исполь- меняет большую часть функций посзуется в видеокартах. На некоторых леднего. Но LinuxBIOS не заменяет машинах, например, Tyan S2881, при- функции VGA BIOS. Для серверных сутствуют интегрированные контрол- решений отсутствие видеофункций не леры сетевых карт. Код в указанных очень актуально, а вот для настольконтроллерах, а также в контролле- ных решений – это ключевой фактор. рах IDE/SATA/SCSI (считайте для крат- Поэтому необходимо взять с сайта кости, что речь идет о жестких дисках), производителя архив системного BIOS и распаковать его. Найти в нем (обычно проприетарный, т.е. закрытый. Что следует понимать под проприе- это AwardBIOS или AMIBIOS. – Прим. тарным кодом? Это такое программное автора) файл VGA BIOS для встроенобеспечение, для которого существу- ной видеокарты и поместить его в диют различные ограничения, налагае- ректорию в LinuxBIOS. Затем пересобмые разработчиками. Это могут быть рать образ LinuxBIOS с учетом испольограничения как технического харак- зования функций видеокарты. После тера, например, запрет на тиражиро- этого получившийся образ LinuxBIOS вание и распространение кода (в ком- записать во FLASH-память системной мерческих или иных целях. – Прим. ав- платы, перезагрузиться и удостоветора), или же код поставляется только риться, что всё работает. в бинарном виде. (Настоятельно не рекомендуется Ограничения юридического харак- воспринимать указанные манипулятера подразумевают под собой: ли- ции как прямое руководство к дейсцензирование, подписание договоров твию. Во-первых, требуется опредео неразглашении информации (Non ленная техническая подготовка в данDisclosure Agreement) и другие спосо- ном вопросе. Во-вторых, следует убебы охраны авторского права в сфере диться, что ваше аппаратное обеспрограммного обеспечения. печение поддерживается LinuxBIOS – Поэтому вы понимаете, что пропри- сделать это можно через список расетарный код не обладает в силу ука- сылки или на сайте проекта. В-третьих,
интервью вы должны отдавать себе отчет в том, что после перехода на эту платформу у вас может появиться значительно больше вопросов, нежели до него. – Прим. автора.)
Если затрагивать функциональность, то в этом плане использование LinuxBIOS в настольных машинах вероятнее всего более практично, нежели в серверах. Одно из преимуществ у LinuxBIOS – это очень быстрое время загрузки. Насколько нам известно, пока не готова поддержка для какого-либо ноутбука. Поэтому с грустью можно констатировать, что перевести ноутбуки на LinuxBIOS-платформу пока невозможно.
Какие машины вы планируете перевести на платформу LinuxBIOS? Будет затронуто всё оборудование или только веб-сервера и сервера баз данных? Идеально было бы перевести все то оборудование, которое у нас есть. Очевидно, что это займет определен- Для использования операционных ное время, т.к. FSF некоммерческая систем, отличных от Linux, какой организация с ограниченным бюдже- вид загрузчиков (FILO/kboot/ADLO) том, и многие из наших машин не могут больше всего подходит? быть переведены на эту технологию, У нас не слишком богатый опыт в дант.к. просто-напросто это оборудование ном вопросе, т.к. мы проверяли зане числится в списке поддержки про- грузку Debian и Ubuntu. В качестве заекта LinuxBIOS. Когда мы приобретаем грузчика выступал Etherboot, т.к. FILO новое оборудование, мы стремимся вы- не позволяет пока загрузиться с SATAдисков. Что касается остальных забрать «совместимое с LinuxBIOS». На повестке дня у нас стоит заме- грузчиков, то мы их не пробовали исна серверов. Мы планируем развер- пользовать. нуть 2 или 3 новых сервера в ближайшие несколько месяцев. Все они идут Как вы считаете, каким органина замену устаревшего парка, и их мы зациям сейчас стоит переходить собираемся перевести на LinuxBIOS- на LinuxBIOS? платформу. Это интересный вопрос. На сегодня основными пользователями LinuxBIOS Могли бы вы перечислить их аппа- являются те, кто работает с кластератную начинку? рами. Использование 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 для использова- части. Например, известная эпопея с системами безопасности ноутбуков ния в настольных решениях? Сейчас на рынке присутствует доста- PhoenixNet и CompuTrace – когда в коточно много наименований оборудо- де BIOS присутствует дополнительный вания, для которого возможен пере- модуль, который может установитьход на LinuxBIOS. Например, материн- ся в ОС на базе Windows NT. Его заские платы на базе чипов AMD, неко- дача – блокирование ноутбука в слуторые из серий VIA EPIA. Предлагаю чае похищения по запросу владельознакомиться с сайтом LinuxBIOS [4], ца к производителю. Предполагаетчтобы узнать, поддерживается ли ва- ся, что похищенный ноутбук будет заша материнская плата или нет. блокирован при первом подключении
№2, февраль 2006
к Интернету. Что еще может передавать данный модуль, является загадкой. – Прим. автора.) Вы также вряд ли сможете провести аудит кода, который используется в проприетарном коде BIOS. По мере того как коммерческие BIOS становятся все более сложными, проблема аудита их кода становится все более сложным вопросом. Что, если в коде BIOS содержится функция отсылки по электронной почте конкурентной стороне ваших секретных данных? И, наконец, вопрос надежности. Здесь мы опять возвращаемся к проблеме аудита исходного кода коммерческого BIOS. Предположим, что у нас работает приложение так называемого класса высокой доступности (high-availability) – например,сервер системы управления полетом или управления атомной станцией. Разве вам не захочется быть абсолютно уверенным в надежности программного кода, который выполняет ваш компьютер? В этом аспекте также можно рассматривать LinuxBIOS в качестве надежной альтернативы существующим решениям. Пока что количество пользователей LinuxBIOS, честно говоря, ограничено. Но по мере того как проект взрослеет, и по мере роста актуальности безопасности данных в компьютерной среде я подозреваю, что LinuxBIOS привлечет к себе повышенное внимание. Тот факт, что коммерческие производители начинают внедрять в код BIOS неприятные DRM-функции (Digital Rights Management), послужит еще одним толчком к переходу на LinuxBIOS. Мы считаем недопустимым, когда над аппаратным обеспечением, кроме самого владельца, устананавливается контроль и сторонней компанией. Однако сейчас появляется возможность полностью контролировать аппаратуру, перейдя на платформу LinuxBIOS.
Ссылки: 1. ht tp : / / w w w.fsf.org /c ampaigns / free 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.
5
администрирование
Вы всё ещё не используете WMI? Часть II: пишем сценарии
Константин Леонтьев Продолжаем изучение технологии WMI и способов ее применения в повседневной практике системного администрирования. Настало время перейти к теме написания скриптов, использующих WMI для управления нашей распределенной сетевой инфраструктурой.
Пишем сценарии с использованием 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 из любого языка программирования не вызывает затруднений. Поэтому используйте тот язык написания сценариев, который вам лучше из-
6
Листинг 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 If Next Листинг 2. VB.NET Imports System Imports System.Management Imports 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
администрирование 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 Class End 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");
№2, февраль 2006
вестен и которым вам больше нравится пользоваться.
Строим moniker string Теперь более четко определимся, что такое moniker string? Дословный перевод этого словосочетания мог бы звучать примерно так: строка-прозвище или строка-кличка. По смыслу же это некое специальное имя (ссылка) для обращения к объектам или классам объектов WMI. Формат этой строки фактически представляет собой разновидность URL (Universal Resource Locator). Все moniker string начинаются с отличительного идентификатора Winmgmts:. Эта часть moniker string является обязательной. Далее формат зависит от того, как мы хотим обращаться к объекту. Например, вот так: Winmgmts://server01/root/cimv2: ↵ Win32_OperatingSystem
В приведенном примере 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)? Пространс-
7
администрирование 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
свойство. Нажмите кнопку «Search for Property Values». Вы увидите все варианты значений этого свойства для всех экземпляров объектов класса «Win32_TerminalServiceSetting». Нажмите кнопку «Execute Code». Откроется окно командной строки, где будет выведен результат работы скрипта. Если опция «Remote Desktop» включена, то будет отображена 1, в противном случае 0. Проверьте в свойствах вашей системы, что результат работы скрипта совпадает с тем, как установлена опция «Remote Desktop». Теперь откройте закладку «Execute a method». Снова выберите класс «Win32_ TerminalServiceSetting». В списке методов выберите «SetAllowTS Connections», как это показано на рис. 3. З а т е м в с п и с ке « M e t h o d [ i n ] parameters» установите значение «AllowTSConnections» противоположное от того, что мы получили на предыдущем шаге. Для этого ну жно просто кликнуть мышью на входной параметр метода. Нажмите кнопку «Execute Code». Откроется консольное окно, в котором будет выдано значение, возвращенное методом SetAllowTSConnections. Если все прошло удачно – это будет 0. Теперь проверьте, изменилась ли опция «Remote Desktop» в свойствах вашей системы. Обратите внимание на то, что вы можете очень быстро получить контекстную справку из библиотеки MSDN по выбранному классу WMI, щелкнув мышью по ссылке: «Get Documentation for this class from the online MSDN Library».
тво имен WMI – это раздел (директо- В стандартной инсталляции Windows рия) репозитория WMI, которая при- по умолчанию выбрано пространство звана группировать классы и объек- имен root\cimv2. ты WMI по назначению, а также определять атрибуты безопасности при до- Знакомство с WMI Code ступе к классам и объектам в каждом Creator 1.0 таком контейнере. Фактически это, Теперь давайте познакомимся с одкак уже отмечалось выше, полная ана- ной из наиболее удобных и функциология с директориями на веб-сервере нальных утилит для системного адми(см. рис. 1). Все пространства имен нистратора – WMI Code Creator 1.0 [2]. начинаются с корня, который в WMI На мой взгляд, сочетаемый этой утиобозначается ключевым словом root. литой функционал и удобство превосПосле имени корня через косую черту ходят все остальные описанные мной указывается пространство имен. Про- ранее утилиты. В упражнении с этой странства имен могут быть вложен- утилитой мы будем решать задачу ными. Пример того, как выглядит про- управления опцией Remote Desktop странство имен: root/mynamespace/ в свойствах системы, которая позвоsubnamespace. Подавляющее боль- ляет разрешить или запретить удашинство классов и объектов, которые ленные подключения к рабочему стоинтересуют вас, размещается в про- лу для задач администрирования. Этот пример будет работать только странстве имен root/CIMv2. Одно из существующих в Windows на ОС Windows XP и новее, а также пространств имен WMI может быть на Windows 2000 Server с установленвыбрано по умолчанию. Это означает, ными службами терминалов. что если вы попытаетесь подключитьДля начала скачайте и распася к этому хосту, не указав в moniker- куйте эту утилиту. Запустите файл string необходимое пространство имен, WMICodeCreator.exe и выберите в мето вы автоматически будете подклю- ню «Code Language Visual Basic Script». чены к выбранному по умолчанию. Затем проверьте в меню «Target Краткий обзор вопросов Computer», что установлена опция безопасности WMI «Local Computer». После этого удос- Если внимательно изучить схему архитоверьтесь, что у вас открыта заклад- тектуры WMI, которую я приводил в нака «Query for data from WMI class», чале статьи, то легко заметить, что все и на этой закладке выберите класс взаимодействие с ядром WMI проис«Win32_TerminalServiceSetting». В на- ходит с использованием интерфейсов боре свойств (properties) выделите COM+/DCOM. В свою очередь COM+ «AllowTSConnections», как это показа- и DCOM в качестве транспортного проно на рис. 2. токола используют RPC. Эта архитекСвойство «Win32_TerminalService турная особенность накладывает опSetting.AllowTSConnections» определя- ределенный отпечаток на идеологию ет состояние опции «Remote Desktop» системы безопасности WMI. В частв свойствах системы. В правом ок- ности, для людей, знакомых с технолоне вы увидите скрипт, который сге- гиями DCOM и COM+, слова «импернерировала утилита для того, чтобы сонация» и «делегирование» не новы. Рисунок 1. Дерево пространств вывести на экран выбранное вами Однако среди читателей большинсимен WMI
8
администрирование тво – системные администраторы, а не программисты, поэтому я постараюсь уделить некоторое внимание этим вопросам. Для того чтобы некая учетная запись имела возможность подключаться к репозиторию 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-приложения могут понадобиться в зависимости от используемого режима имперсонации.
Рисунок 2. Окно утилиты WMI Code Creator 1.0 с открытой закладкой Query
Имперсонация Зачем нужна имперсонация? Все довольно просто, это метод, при котором для подключения к ресурсу процесс (поток) или система должны исРисунок 3. Окно утилиты WMI Code Creator 1.0 с открытой закладкой Execute пользовать не свой контекст безопасВ случае с WMI делегирование ности, а учетные данные другого субъ- обладать привилегией создания марможет выглядеть так – мы, работая екта безопасности. Представьте, что керов доступа). Бывает чуть более сложный вари- на станции администратора, подклюнекая служба, запущенная в контексте безопасности LocalSystem, долж- ант имперсонации – делегирование. чаемся по WMI к некому серверу и зана выполнить действие от лица другой Этот вариант необходим тогда, ког- пускаем на нем процесс с помощью меучетной записи (например, от лица те- да подключение к конечному ресурсу тода Execute класса Win32_Process. Текущего зарегистрированного на ком- выполняется не самим субъектом бе- перь представим, что этот процесс есть пьютере пользователя). В этом случае зопасности (в нашем примере – служ- не что иное, как другой скрипт WMI, коей необходимо создать специальный бой от лица пользователя), а через торый подключается к еще одному хосмаркер доступа (Access Token), опи- посредника (например, промежуточ- ту в сети для того, чтобы сделать касывающий контекст безопасности той ный сервер). Представьте ситуацию, кие-то действия. Если мы не воспольучетной записи, под которой мы хотим что интернет-пользователь подключа- зуемся делегированием, то на конечвыполнить указанное действие. Без- ется не напрямую к базе данных, а че- ной машине скрипт будет запущен условно, для того чтобы создать та- рез веб-приложение на третьем сер- в контексте безопасности учетной закой маркер доступа, этой службе не- вере. Для осуществления такого под- писи промежуточного сервера, что даобходимо знать учетные данные это- ключения веб-приложение должно по- леко не всегда желаемо. С другой стого пользователя или, если этот про- лучить от субъекта безопасности (на- роны, подобная ситуация с делегироцесс происходит на локальной маши- шей службы) маркер доступа с правом ванием в реальной жизни требуется не, получить копию маркера доступа делегирования – это позволит веб-при- крайне редко. В таблице 1 представлены подзарегистрированного локально поль- ложению использовать маркер достузователя (безусловно, для этого кон- па субъекта безопасности уже при под- держиваемые уровни имперсонации WMI. текст безопасности службы должен ключении к базе данных.
№2, февраль 2006
9
администрирование Таблица 1. Уровни имперсонации Уровень имперсонации
Описание
Anonymous 1
Анонимный уровень имперсонации COM, маскирующий учетную запись вызывающего. Вызов WMI с этим уровнем имперсонации может завершиться ошибкой
Default 0
Уровень имперсонации по умолчанию
Delegate 4
Уровень имперсонации COM – делегирование. Разрешает использовать другим объектам учетные данные вызывающего субъекта для обращения к третьим объектам. Этот уровень может дать неоправданно высокие привилегии промежуточному объекту. Поддерживается только на Windows 2000 и выше
Identify 2
Уровень имперсонации COM – идентификация. Позволяет объектам вызова запрашивать учетные данные у вызывающего субъекта. Вызов WMI с этим уровнем имперсонации может завершиться с ошибкой
Impersonate 3
Уровень имперсонации COM – обычная имперсонация. Позволяет вызываемому объекту использовать учетные данные вызывающего субъекта для совершения только своих действий. Это рекомендуемый уровень имперсонации
Таблица 2. Варианты аутентификации и проверки целостности Уровень аутентификации
Описание
Call Call 3
Call-level COM authentication. Аутентификация в начале каждого вызова объекта WMI
Connect Connect 2
Connect-level COM authentication. Аутентификация только при установлении соединения с сервером WMI. Одни учетные данные используются для всего сеанса взаимодействия
Default Default 0
WMI использует настройки аутентификации COM по умолчанию
None None 1
Аутентификация COM не используется
Packet Pkt 4
Packet-level COM authentication. Аутентификация всех данных, получаемых от клиента, с подтверждением подлинности отправителя для каждого RPC-пакета
PacketIntegrity PktIntegrity 5
Packet Integrity-level COM authentication. Аутентификация и проверка целостности передаваемых данных для каждого RPC-пакета
PacketPrivacy PktPrivacy 6
Packet Privacy-level COM authentication. Аутентификация, проверка целостности и шифрование данных каждого передаваемого RPC-пакета
Аутентификация Аутентификация, целостность и конфиденциальность являются неотъемлемыми характеристиками безопасного взаимодействия систем по сети. При использовании WMI поддерживаются перечисленные в таблице 2 уровни аутентификации и проверки подлинности. Наиболее часто употребимый уровень – Connect (аутентификация и авторизация при вызове). Однако если вы хотите предотвратить возможное изменение передаваемых данных или их перехват методом men in the middle, то лучшим выбором могут являться режимы Pkt (проверка аутентичности клиента), PktIntegrity (проверка аутентичности клиента и целостности передаваемых данных) и PktPrivacy (проверка аутентичности клиента и шифрование передаваемых данных с проверкой целостности).
Привилегии Администраторам Windows хорошо известны настройки безопасности системы и их раздел «User Right Assignments»
10
(привилегии пользователей), доступные в консоли безопасности системы и групповых политиках домена. Ряд действий с операционной системой можно проделать только при наличии у пользователя или группы, куда он входит, той или иной привилегии. К таким действиям относятся, например, перезагрузка системы (завершение ее работы), восстановление состояния системы из резервной копии или смена системного времени. Поскольку с использованием WMI можно выполнить все эти действия, разработчики WMI заложили дополнительный механизм защиты. Смысл его в следующем: даже если учетная запись пользователя обладает необходимыми для действия с системой привилегиями, он все равно не сможет выполнить это действие, пока явно не активирует эту привилегию перед выполнением действия. В частности, если администратор запустит скрипт WMI, запрашивающий перезагрузку системы, этого все равно не произойдет, пока в скрипте не будет явно активирована эта привилегия. Список привилегий и их численных кодов указан в таблице 3. Для каждой привилегии указано три имени: первое имя – это константы для использования в скриптах VBScript, второе имя – это символические константы языка С++, третье имя привилегии – это имя, использующееся при составлении moniker string. Каким образом активировать эти привилегии, показано в примерах из раздела «Подключение к удаленным компьютерам». Важно запомнить, что активировать привилегии нужно до подключения к репозиторию WMI, а не после.
Подключение к удаленным компьютерам Подключение к другим компьютерам по сети чаще всего вызывает проблемы у тех, кто только начинает осваивать технологию WMI и программирование с ее использованием. Поэтому я считаю необходимым привести примеры кода на VBScript, которые позволяют решать эту задачу, и кратко пояснить их. Единственное, что необходимо запомнить, так это то, что запрещается подключаться к репозиторию WMI на локальном компьютере, используя другую учетную запись (не ту, под которой происходит обращение к CIM Object Manager). Это ограничение обычно решается использованием утилиты RunAs и ей подобных методов. Вариант подключения с использованием маркера доступа произвольной учетной записи: strComputer = "server01" Set objLocator = CreateObject("WbemScripting.SWbemLocator") objLocator.Security_.AuthenticationLevel = 3 objLocator.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 Wscript.Echo Wscript.Echo Wscript.Echo
in colItems "-----------------------------------" "Win32_OperatingSystem instance" "-----------------------------------"
администрирование 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
Обратите внимание, что для того, чтобы перезагрузить удаленный компьютер, нам необходимо явно активировать эту привилегию. Кроме того, в этом примере мы используем для подключения к удаленному компьютеру учетные данные отличные от тех, под которыми запущен данный скрипт. Другой вариант подключения с использованием текущего маркера доступа и moniker string: 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 Wscript.Echo Wscript.Echo Wscript.Echo Wscript.Echo Wscript.Echo
in colItems "-----------------------------------" "Win32_OperatingSystem instance" "-----------------------------------" "Caption: " & objItem.Caption "Name: " & objItem.Name
Rem Первый вариант вызова метода Reboot() Set objOutParams = objWMIService.ExecMethod(_ "Win32_OperatingSystem.Name='" & CStr(objItem.Name) ↵ & "'", "Reboot") Rem Второй вариант вызова метода Reboot() objItem.Reboot()
Next
В данном примере мы познакомились с еще одной возможностью, заложенной в moniker string. Мы можем включать в строку moniker string в фигурных скобках «{ }» параметры имперсонации, аутентификации и набор используемых привилегий. Таким образом, полный формат moniker string можно было бы записать так: Winmgmts:{ <security settings>, (<privileges>) } ↵ !//<server>/<namespace>:<Class | Object>
Есть и еще не описанные мной поля в формате moniker string, но поскольку они довольно редко нужны на практике, то я рекомендую желающим ознакомиться с ними по оригинальной документации на сайте Microsoft [3] самостоятельно.
События WMI и уведомляющие запросы События WMI – это очень удобный и эффективный механизм выявления изменений в системе и экземплярах объектов WMI. Представьте, что вы хотите написать скрипт, который будет реагировать на какое-либо системное событие. Например, на запуск процесса или на перезагрузку системы или, скажем, на изменение конфигурации сетевого интерфейса. Если бы не было событий WMI, вам бы пришлось написать скрипт, который опрашивал бы состояние интересующего вас свойства определенного экземпляра объекта
№2, февраль 2006
Таблица 3. Привилегии Привилегии
Описание
wbemPrivilegeCreateToken SeCreateTokenPrivilege CreateToken 1 0x1
Привилегия требуется для создания основного токена безопасности процесса
wbemPrivilegePrimaryToken SeAssignPrimaryTokenPrivilege AssignPrimaryToken 2 0x2
Привилегия требуется для замены (назначения нового) основного токена безопасности процесса
wbemPrivilegeLockMemory SeLockMemoryPrivilege 3 0x3
Привилегия требуется для закрепления соответствия между страницами физической памяти и логического адресного пространства
wbemPrivilegeIncreaseQuota SeIncreaseQuotaPrivilege IncreaseQuotaPrivilege 4 0x4
Привилегия требуется для назначения квот процессу
wbemPrivilegeMachineAccount SeMachineAccountPrivilege MachineAccount 5 0x5
Привилегия требуется для создания учетной записи компьютера
wbemPrivilegeTcb SeTcbPrivilege Tcb 6 0x6
Привилегия обозначает ее владельца как часть Trusted Computer Base
wbemPrivilegeSecurity SeSecurityPrivilege Security 7 0x7
Привилегия требуется для выполнения ряда функций, связанных с безопасностью, например просмотр журналов аудита. Привилегия определяет её владельца как Security Operator
wbemPrivilegeTakeOwnership SeTakeOwnershipPrivilege TakeOwnership 8 0x8
Привилегия требуется для получения права владельца объекта на объекты безопасности в отсутствии явных на то разрешений
wbemPrivilegeLoadDriver SeLoadDriverPrivilege LoadDriver 9 0x9
Привилегия требуется для загрузки и выгрузки драйверов устройств
wbemPrivilegeSystemProfile SeSystemProfilePrivilege SystemProfile 10 0xA
Привилегия требуется для сбора профилирующей информации всей системы
wbemPrivilegeSystemtime SeSystemtimePrivilege Systemtime 11 0xB
Привилегия требуется для изменения системного времени
wbemPrivilegeProfileSingle Process SeProfileSingleProcessPri vilege ProfileSingleProcess 12 0xC
Привилегия требуется для сбора профилирующей информации для одного процесса
wbemPrivilegeIncreaseBase Priority SeIncreaseBasePriorityPri vilege IncreaseBasePriority 13 0xD
Привилегия требуется для увеличения базового проиритета процесса
wbemPrivilegeCreatePagefile SeCreatePagefilePrivilege CreatePagefile 14 0xE
Привилегия требуется для создания и (или) изменения файла подкачки
11
администрирование Таблица 3. Привилегии (продолжение) Привилегии
Описание
wbemPrivilegeCreatePerm anent SeCreatePermanentPrivilege CreatePermanent 15 0xF
Привилегия требуется для создания постоянного общего объекта
wbemPrivilegeBackup SeBackupPrivilege Backup 16 0x10
Привилегия требуется для выполнения резервного копирования
wbemPrivilegeRestore SeRestorePrivilege Restore 17 0x11
Привилегия требуется для выполнения операции восстановления. Эта привилегия позволяет ее владельцу устанавливать для любого объекта произвольный существующий SID в качестве владельца объекта
wbemPrivilegeShutdown SeShutdownPrivilege Shutdown 18 0x12
Привилегия требуется для перезагрузки и завершения работы ОС
wbemPrivilegeDebug SeDebugPrivilege Debug 19 0x13
Привилегия требуется для отладки процессов
wbemPrivilegeAudit SeAuditPrivilege Audit 20 0x14
Привилегия требуется для записи в журналы аудита
wbemPrivilegeSystemEnvir onment SeSystemEnvironmentPrivilege SystemEnvironment 21 0x15
Привилегия требуется для модификации энергонезависимой памяти в тех системах, которые используют ее для хранения своей конфигурации
wbemPrivilegeChangeNotify SeChangeNotifyPrivilege ChangeNotify 22 0x16
Привилегия требуется для получения нотификаций об изменении файлов и директорий. Так же эта привилегия отменяет перекрестную проверку доступа к файлам и папкам. Эта привилегия по умолчанию дана всем пользователям
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"
wbemPrivilegeRemoteShu tdown SeRemoteShutdownPrivilege RemoteShutdown 23 0x17
Привилегия требуется для завершения работы ОС по сети
wbemPrivilegeUndock SeUndockPrivilege Undock 24 0x18
Привилегия требуется для снятия компьютера с док-станции
wbemPrivilegeSyncAgent SeSyncAgentPrivilege SyncAgent 25 0x19
Привилегия требуется для вызова процедуры синхронизации службы каталога
wbemPrivilegeEnableDele gation SeEnableDelegationPrivilege EnableDelegation 26 0x1A
Привилегия требуется для доверия пользователям или группам при делегировании
wbemPrivilegeManageVolume SeManageVolumePrivilege ManageVolume 27 0x1B
Привилегия требуется для операций обслуживания дисковых томов
WMI. Вам бы пришлось запускать такой скрипт с определенной периодичностью и сравнивать полученные значения – согласитесь, в этом много бестолкового труда и излишней траты системных ресурсов. Есть гораздо более эф-
12
фективное решение этого вопроса. И, как вы уже догадались, – это события WMI и уведомляющие запросы. Обработка событий может быть синхронной и асинхронной. Синхронная обработка событий – это когда процесс ожидает события и более ничем не занят. Обычно это ожидание – бесконечный цикл проверки условия: поступило событие или нет. Асинхронная обработка подразумевает, что процесс регистрирует обработчик события (подписывается на событие) и далее продолжает выполнять различные задачи. Когда событие возникает, нормальная работа процесса прерывается, запоминается место, где произошло прерывание, а управление передается на зарегистрированный обработчик событий. После обработки события обработчиком, управление возвращается на то действие основного процесса, которое было прервано. Оба приведенных ниже скрипта отслеживают запуск процесса с именем cmd.exe. Однако между ними все же есть различие. Приведенный ниже скрипт (первый из двух) использует синхронную технику уведомляющего запроса для создания экземпляра объекта Win32_ProcessStartTrace, который отвечает за отслеживание событий запуска процессов о системе. Каждый раз, когда в системе порождается процесс с именем cmd.exe, метод NextEvent возвращает управление скрипту.
Loop
Второй скрипт, который приведен ниже, использует немного другую синхронную технику. Этот метод более универсальный, так как не завязан на специальный класс 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 __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
администрирование Следует отметить, что скрипты 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 на рабочие станции; инвентаризация аппаратного обеспечения рабочих станций;
№2, февраль 2006
станций;
инвентаризация установленных и пропущенных обновлений системного ПО;
группировка рабочих станций на основании данных инвентаризации в коллекции;
установка программного обеспечения на группы компьютеров (коллекции);
установка операционных систем из образов на новые
компьютеры и переустановка с сохранением профилей пользователей на эксплуатируемых компьютерах; установка необходимых обновлений безопасности; выполнение на клиентских рабочих станциях задач обслуживания, оформленных в виде скриптов и/или исполняемых файлов; управление мобильными устройствами PocketPC; определение частоты запуска указанных приложений; отслеживание соответствия набора и версий программного обеспечения на рабочих станциях заданным параметрам; формирование отчетов о рабочих станциях и серверах; формирование отчетов о состоянии и работе самой системы; оптимизация нагрузки на сеть при передаче дистрибутивов и установке ПО на рабочие станции и серверы; удаленная поддержка пользователей с использованием Remote Tools, в состав которых входят: удаленное управление рабочим столом АРМ, передача файлов, удаленная перезагрузка, интерактивное общение администратора с пользователем и удаленная командная консоль; обеспечение контроля доступа ко всем функциям и объектам системы управления на базе SMS 2003 для авторизованных пользователей.
Все эти функции SMS 2003 реализованы с использованием технологии WMI. В частности, весь процесс инвентаризации, который производит агент SMS, представляет собой набор WMI-запросов. Все свои настройки и задания (Advertisements), а также некоторые промежуточные результаты инвентаризации агент SMS также хранит в репозитории WMI в отдельном пространстве имен: root\CCM.
MOM 2005 SP1 Система мониторинга на базе Microsoft Operations Manager 2005 позволяет решать следующие задачи: обеспечение непрерывного наблюдения в реальном времени за состоянием ИС компании и автоматическая регистрация инцидентов; снижение времени, требуемого для оповещения дежурной смены группы мониторинга об изменениях и сбоях, происходящих в ИС компании; снижение количества незарегистрированных инцидентов; обеспечение мониторинга всех компонентов ИС компании и распределенное по всем сегментам сети наблюдение за их состоянием;
13
администрирование предоставление кратких рекомендаций администрато
рам системы по большинству событий, регистрируемых системой мониторинга; обеспечение отказоустойчивости системы мониторинга; обеспечение возможности разделения административных полномочий на участки системы мониторинга; возможность ведения корпоративной базы знаний по инцидентам; выявление взаимосвязей между возникающими инцидентами и источниками проблем.
Ко всему выше сказанному следует добавить еще то, что Windows XP и Windows Server 2003 поддерживают в групповых политиках домена Active Directory технологию WMI Query Filtering. Что это такое? Это средство, которое позволяет определять, какие групповые политики следует применять к каким рабочим станциям и пользователям на основе результатов запросов WQL к WMI на том компьютере, на котором должно выполняться применение этой политики. В частности, в сочетании с Software Distribution Policy вы можете сделать так, чтобы офисный пакет Office 2003 мог устанавливаться только на те машины, которые имеют определенный объем ОЗУ и свободного пространства на жестком диске. Или, скажем, устанавливать очередной Service Pack через групповую политику только на те машины, у которых на жестком диске имеется не менее 2 Гб свободного пространства. И все это делается одной простой строкой WQL-запроса:
Система мониторинга представляет собой клиент-серверное распределенное приложение. На целевые серверы (те серверы прикладных систем, на которых осуществляется мониторинг) устанавливается специальное программное обеспечение – агент системы мониторинга MOM 2005. Агенты системы мониторинга получают свои настройки и правиSelect * from Win32_LogicalDisk where FreeSpace > 2147483648 ла (политики) мониторинга с управляющих серверов. Для каждого сервера, за которым ведет наблюдение его агент, в зависимости от установленного на него проТеперь заглянем немного в ближайшее будущее. В обграммного обеспечения применяется свой набор правил ласти управления системами Windows Server Systems коммониторинга. Правила мониторинга объединяются в группы пания Microsoft активно развивает свою новую инициативу правил, которые применяются к группам компьютеров. Груп- – новый командный интерпретатор под кодовым названием пы компьютеров содержат целевые системы мониторинга, MONAD [7]. Это очень гибкий и удобный интерпретатор кокоторые туда добавляются либо автоматически на основа- манд, который будет встроен в следующую версию Microsoft Exchange E12 и Longhorn Server, а также он может быть уснии данных из реестра целевых систем, либо вручную. Множество правил мониторинга, которые использует тановлен на любую ОС, поддерживающую .NET Framework MOM 2005, представляют собой скрипты, использующие 2.0 (Windows 98, Windows 2000, Windows XP, Windows Server WMI для получения и обработки данных о системе и ее 2003). В основе большинства элементов синтаксиса и некомпонентах. которых принципов работы с MONAD лежат удачные наработки, полученные при разработке WMI и WMIC. Консоль управления MMC 3.0 также будет полностью поддержиЧто же дальше? «Ну, хорошо, – скажете вы. – Я прочитал эту статью, но что вать архитектуру MONAD, и множество функций управлемне это даст. Автор рассуждает о WMI, но у меня конкрет- ния, доступные из консоли, будут не чем иным, как скрипные проблемы, решение которых я ищу, и чем конкретно тами MONAD. мне в моих проблемах поможет WMI?» Да, пожалуй, этот Со временем предполагается, что интерфейсы управвопрос заботит любого системного администратора, когда ления MONAD будут встроены во все продукты компании ему приходится столкнуться с новой технологией и встать Microsoft, и, как вы понимаете, навыки, полученные при раперед выбором использовать ее или нет. боте с WMI и WMIC, будут очень полезны всем системным Я надеюсь, что этот вопрос возникнет лишь у небольшо- администраторам, работающим с Windows. го числа читателей, поскольку я постарался отразить в этой статье значимость и пользу технологии WMI, а так же ра- Ссылки и литература: зобрать самые скользкие и сложные вопросы, возникаю- 1. Леонтьев К. Вы всё ещё не используете WMI? Часть1. – Журнал щие при ее использовании. Но все же я отвечу и тем, у ко«Системный администратор», №1, январь 2005 г. – 4-11 с. го этот вопрос все-таки возник. Уважаемые коллеги, WMI – 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. ные задачи простым способом. Стандарт WBEM, на кото- 4. TechNet Script Center – http://www.microsoft.com/technet/ ром основан WMI, реализован на UNIX и Linux системах [6] scriptcenter/default.mspx. и позволяет вам развивать гибкую и кроссплатформенную 5. Portable Script Center – http://www.microsoft.com/downloads/ систему управления и мониторинга сетью. details.aspx?FamilyID=b4cb2678-dafb-4e30-b2da-b8814fe2da5 Вы можете пойти двумя путями – либо приобрести гоa&DisplayLang=en. товый продукт управления и мониторинга (практически 6. Проект OpenWBEM – http://www.openwbem.org. все из них совместимы с WBEM и WMI), а можете создать 7. Microsoft Shell (MSH) – MONAD beta 3 – http://www.microsoft.com/ свое средство, но в обоих случаях знания по WMI вам обяdownloads/details.aspx?FamilyID=e8e5203a-574c-4105-af6b-b2f зательно пригодятся. ef39adf55&DisplayLang=en.
14
администрирование
Современный Linux-сервер: как планировать дисковые ресурсы Часть 2
Алексей Барабанов Планирование дисковых ресурсов, выполняемое на этапе закладки сервера, позволит значительно сократить возможные издержки в случае наступления непредвиденных ситуаций. Для этого надо подойти к решению многих привычных вопросов с учетом возможных последствий.
В
первой части обсуждения данной темы [1] на основании анализа эксплуатационного цикла сервера были выдвинуты два принципа (использовать всегда RAID1 вместо обычных разделов диска и перевести максимум объема под управление LVM), исходя из которых, предлагалось производить планирование дисковых ресурсов. Но существует еще одна, и не последняя, цикличность в работе серверов, как и любых компьютеров, которую надо принять во внимание – процесс загрузки. Это неизбежная фаза начинается сразу после включения питания и завершается после выхода системы в рабочий режим. Ключевую роль в ней играет загрузчик. Необходимость существования независимого
16
от операционной системы загрузчика обусловлена именно тем, что надо согласовать уровни представления систем хранения данных с точки зрения BIOS и того, как их «представляет» ядро ОС. Из двух крайностей, поместить BIOS в ядро или само ядро в BIOS, был выбран технологический компромисс – загрузчик. Обсудим подробнее.
Процесс загрузки Загрузка – это последовательность передачи управления от BIOS оборудованию, которая включается в процессе аппаратной инициализации, к ядру операционной системы. Процесс обслуживает упомянутый «загрузчик» (на диаграмме – LOADER). Существуют два типа загрузки – сетевая и локаль-
ная. Сетевая загрузка осуществляется только с помощью внешних серверных ресурсов, поэтому опустим её рассмотрение. Итак, далее обсуждаем только загрузку с SAS-устройств. В начальный момент времени BIOS, собравший всю доступную информацию о физически подключенных устройствах, производит в определенном порядке перебор систем хранения и поиск на них загрузчика. Управление будет передано первому подходящему. BIOS доступна лишь физическая структура устройств. Все, на что он «способен», – это загрузить первый сектор, проверить наличие специальной сигнатуры и передать управление полученному коду. Главные ограничения: код размещается в объеме секто-
администрирование ра (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... И следующий вопрос: доста-
№2, февраль 2006
точно ли одного только /boot, как считают в компании RedHat, или все-таки надо нечто посущественней? Для этого разберем, как работает загрузчик.
Работа загрузчика Linux в силу своей открытости стал весьма консервативной системой, так как каждая его компонента подвергается очень подробному анализу на адекватность назначению. Хотя вместе с дистрибутивом SuSE поставляются четыре загрузчика (Lilo, Grub, Syslinux, Loadlin), но в качестве стандартных, как правило, использовались только два – Syslinux и Grub. Долгое время они развивались, конкурируя друг с другом, и лишь недавно определилось, что будущее именно за Grub. Объясню, почему так. Опять возвращаемся к рис. 1. Посмотрите, загрузчик не обращается к физическим дисковым устройствам, он «смотрит» только на файловые системы. Именно это свойство, а не что-то иное определило преимущества проекта Grub. Дело в том, что загрузчик должен предоставить оператору выбор путей загрузки. И Grub считывает файл меню, свои кодовые файлы и файлы загружаемых систем, пользуясь только собственным драйвером файловой системы и никак не привязываясь к физическим константам устройств. Lilo, являсь исторически более ранним творением, не придерживался такой концепции, почему и вынужден был уступить. Внимание: изначально в дистрибутиве SuSE 10.0 поставляется Grub вер-
Рисунок 1. Видимость уровней представления на разных стадиях загрузки
сии 0.96. Этот релиз содержит ошибку. В обновлениях предлагается версия 0.97. В дальнейшем будет применяться именно эта, обновленная версия. Рассмотрим, как работает Grub. Для этого обратимся к рис. 2, где наглядно представлен процесс установки и загрузки Grub. Обсуждение будем вести в терминологии Grub. Итак, в самом начале BIOS считывает код загрузчика из первого сектора диска (1 на рисунке). 512 байт явно недостаточно, чтобы разместить там драйвер файловой системы. Эта часть загрузчика называется stage1. Её назначение – загрузить stage1_5 – специальную фазу, содержащую драйвер файловой системы. Проблема в том, чтобы добиться однозначности размещения этой фазы по отношению к stage1. Это достигается путем записи данной компоненты на «нулевую» дорожку загрузочного устройства, т.е. вслед за первым сектором, содержащим stage1. В режиме LBA (диски актуальных для серверов ёмкостей
Рисунок 2. Работа загрузчика Grub
17
администрирование в другом режиме просто не работают), лов загрузчика, нужно разместить яд- нести на отдельный раздел. Аналогична дисковом устройстве размещается ро и initrd, данные для инициализации ное соображение верно и в отношении 63 сектора в дорожке. То есть уровень виртуального диска, подключаемо- основной системы. «интеллекта» stage1_5 может быть по- го в процессе загрузки ядра системы. Наблюдательный читатель спровышен до 30 Кб. Для работы с файло- Примерно так и рассуждают в компа- сит: ну хоть /var можно вынести в привой системой ext3 хватает чуть более нии RedHat, когда выделяют /boot в ка- монтированный том и тем самым со8Кбайт. Иначе говоря, резервы эволю- честве раздела загрузки. Теперь обсу- кратить размер корневого раздела? Конечно, можно! Только надо учесть, ции у проекта Grub еще есть. дим реальное положение дел. что в случае проблем с монтированием Пос ле под к лючения stage1_ 5 в /var на «чистом» корне не будет ника(2 на рисунке) загрузчик уже «умеет» Эксплуатационные фазы читать выбранную файловую систе- Давайте мысленно вернемся к исход- ких структур, обеспечивающих работу му и, значит, «может» найти все не- ным целям вырабатываемых механиз- сервисов – даже /var/run. Поэтому прадостающее для его работы. А имен- мов и способов разметки. Итак, глав- вильной последовательностью будет но: основную свою компоненту stage2 ное – добиться условий для манипу- установка всей системы в единый раз(3 на рисунке) и файл, содержащий ме- ляций с логическими томами и разме- дел и потом уже перенос того, что нужню, menu.lst (4 на рисунке). Все! Теперь щенными на них файловыми систе- но, на другие тома LVM с последующим в памяти компьютера работает полно- мами таких, чтобы максимально на- их монтированием. Такая последовастью собранный загрузчик, который сколько возможно оставлять сам сер- тельность установки позволит прак«пользуется» возможностями файло- вер в работоспособном состоянии, что- тически с минимальной потерей фунвых систем для поиска всех указанных бы для обслуживания не требовалось кциональности отключать все «на лев меню файлов. Таким путем обеспе- физического вмешательства (посколь- ту» и соответственно менять. Значит, чивается независимость первых фаз ку это несовместимо с автоматиза- сэкономить не получится! Таким образом, у нас появилась загрузки от конкретного размещения цией и вообще с логикой работы выфайлов внутри файловой системы. числительных систем). Если, как это еще пара принципов планирования То есть, если модифицировать stage2, предложено все в том же RHEL, кор- дисковых ресурсов серверов. Принцип 3. Необходимо кроме осили изменить menu.lst, или какие-то невая файловая система размещена из загружаемых файлов, описанных на логическом томе LVM, то для пре- новной системы создать независимую в меню, то при следующей загрузке образований надо будет сначала от- по разметке вспомогательную систему, stage1+stage1_5, как ни в чем не бы- монтировать корень. Конечно, мож- которая будет обеспечивать фазу обвало, загрузят новые файлы. но просто заявить, что это не понадо- служивания сервера в случае необхоНа рис. 2 показано, как реальное бится, так как всегда можно к самому димости произвести online-преобразоразбиение жесткого диска «понимает- корню подмонтировать нужный объем, вания основной системы. Принцип 4. Все данные, нужные ся» загрузчиком. В процессе установки взятый все с того же LVM. Примем понадо указать корень, где размещены ка это объяснение. А если возникает для работы системы в минимальной все файлы загрузчика. В нашем слу- необходимость в обновлении исполь- функциональности, по возможносчае это делается командой root (hd0,1). зуемой системы? А если надо выпол- ти, надо устанавливать в один корнеУстановщик определяет тип файло- нить в системе настройку, результат вой раздел. Это увеличит надежность вой системы и согласно этому подби- которой может оказаться не на 100% системы и позволит независимым обрает следующую фазу – e2fs_stage1_5. успешным? Тогда возникает требова- разом манипулировать другими приИ далее остается лишь указать, куда ние иметь на SAS-устройстве второй монтированными разделами. записывать stage1+stage1_5. Это про- экземпляр системы со своим незавиСледствием этих принципов являизводится командой setup (hd0). После симым корнем. И, загрузив этот второй ется то, что возникают все возможчего нужные компоненты записывают- экземпляр системы, можно выполнить ности для создания дополнительного резервирования. Кроме использовася на нулевую дорожку указанного ус- все перечисленные операции. Состояние сервера, работающе- ния «зеркальных» дисковых устройств тройства, и в них жестко прошивается размещение и названия остальных го под управлением вспомогательно- можно создать «зеркальные» системы, файлов stage2 и menu.lst, иначе говоря, го экземпляра операционной системы, которые позволят произвести «откат» первая команда root (hd0,1), указыва- будем называть фазой обслуживания изменений в случае повреждения одющая на корень загрузчика. Заметим, (на диаграмме Out Of Order). ной из них – той, которая была рабоЗдесь снова получаем прежнюю чей, – в процессе online-обслуживачто корень, в котором размещается загрузчик, может, и даже очень часто, не проблему. Ведь можно и корень вто- ния. Иначе говоря, если один из дубсовпадать с корнем самой загружае- рой системы разместить на LVM, вы- лей системы предназначался для сомой системы. неся лишь /boot в отдельный раздел здания фазы обслуживания, то, сделав Определим здесь минимум-мини- диска. Тогда задумаемся, какая глуби- эти дубли идентичными, получаем паморум того, что должно быть разме- на online-преобразований (без отклю- ру, состоящую из основной и резервщено на разделе загрузки, (hd0,1) в на- чения) требуется. Если надо оставить ной системы. Конечно, здесь не идет шем случае. Если мы обсуждаем за- возможность перепланировки всего речь о полном дублировании всех дангрузку Linux-системы, то на этом раз- дискового устройства, то разумно ВСЕ ных. Обсуждается лишь вопрос о соделе, кроме уже перечисленных фай- данные вспомогательной системы вы- здании дубликата корневого раздела
18
администрирование в части, обеспечивающей функционал сервера. Теперь вернемся к «нашим баранам». Итак, размещения лишь /boot на выделенном томе не достаточно, так как это не обеспечит независимой загрузки для манипуляции остальным дисковым пространством. Значит, надо на отдельном разделе, установленном по схеме 1 DISK, 2 MD, 3 EXT3..., разметить всю систему. И кроме того, сделать это дважды, поскольку надо обеспечить еще и фазу обслуживания основной системы. Одновременно с этим получаем «бесплатный» дубликат рабочей системы на случай неожиданного технического повреждения последней (например, из-за ошибки в процессе наложения патчей), то есть фактически добавляем еще и фазу оперативного резерва. Таким образом, система после загрузки может перейти в одну из трех фаз: рабочую, обслуживания и резерва. Мысль эта не нова. Не могу привести пример из RHEL, но из SuSE – легко! В стандартно создаваемом в процессе установки menu.lst присутствует пункт аварийной загрузки failsafe. Хоть failsafe и полумера, но культурного шока от моих предложений не должно быть. А что в результате, спрашивается? Можно обойтись без спасательного CD! И все? Ведь получается, что все равно переключение системы из фазы работы в другие производится в традиционном варианте лишь с консоли. Ну можно, конечно, еще и путем редактирования menu.lst, благо, что возможности Grub позволяют это делать без переустановки. Нет, конечно, ради такой чепухи и не стоило бы городить столько. Все это даст эффект лишь в том случае, если настроить систему управляемой загрузки.
тирования самого меню. И то и другое циального файла default, который запредставляет собой весьма рукотвор- писывается утилитой grub-set-default. Хотя можно и просто менять текст саный процесс. Управляемой загрузкой будем счи- мого menu.lst. Но чтобы данная функциональная тать такой способ настройки, когда выбор нужной фазы работы системы бу- схема запустилась, надо обеспечить дет происходить автоматически в про- назначение служебной фазы как пути цессе загрузки. Конечно, для этого загрузки по умолчанию для следующей в Grub не хватает функциональности. перезагрузки после запуска каждой Его исполнительная часть stage2, ко- из других фаз – пунктов меню. Можторая обрабатывает меню, позволяет но воспользоваться все той же утилимодифицировать его и даже выпол- той grub-set-default или так же менять нять какие-то действия с дисковыми содержимое menu.lst. Но в Grub есть устройствами или сетевыми сервиса- специальный оператор (savedefault), ми, занимает от 100 до 200 Кб, в зави- который обеспечивает запись нужносимости от сборки. Но этого недоста- го значения прямо из stage2, то есть точно. В процедуре управляемой за- до передачи управления на загружаегрузки нужно иметь возможность вы- мую ОС, которая в общем случае мобрать эксплуатационную фазу, анали- жет быть и несовместима с утилитой зируя параметры в контексте самого grub-set-default. Получается, что кроме уже пересервера, а не загрузчика. Элементарно, например, если в ходе анализа пот- численных двух систем (одна основребуется прочитать данные или с LVM, ная, другая резервная) надо создать или с удаленного тома NFS, или полу- еще и третью? Нет, достаточно исчить путь из LDAP, то вряд ли удастся пользовать одну из уже имеющихся, остаться в рамках только пакета Grub но в специальном режиме. Как это сдедля обеспечения такой функции управ- лать, покажем на примере чуть позления загрузкой. же. На примере же и проиллюстриИтак, обслуживание стадии управ- руем, как планируется диаграмма пеления загрузкой будет производиться реходов состояний сервера в процесLinux как универсальной платформой. се загрузки. Присвоим новой фазе работы сервеА сейчас зададимся вопросом, ра название служебной (на диаграм- а не ересь ли предлагается здесь – мах Stuff). Это проходная фаза, в кото- создание специальной инсталляции рой по некоторым критериям будет вы- Linux только для обеспечения загрузбрана следующая фаза загрузки, про- ки? Нет! Есть аналог предложенного изведена соответствующая коррек- решения. Известен в «миру» как EFI ция и далее произведена перезагруз- (Extensible Firmware Interface). Изнака. В Grub существует механизм выбо- чально он создавался как новый форра пути загрузки по содержимому спе- мат модульного заменителя традици-
Концепция управляемой загрузки С точки зрения загрузчика, процесс загрузки системы, безусловно, управляем. Но с точки зрения самой системы, он всегда проходит одни и те же фазы загрузки: BIOS – LOADER – одна из эксплуатационных фаз. Выбор конкретной эксплуатационной фазы производится или из консольного меню оператором, или указанием ветки загрузки по умолчанию путем редак-
№2, февраль 2006
Рисунок 3. Изменение состояний рабочей станции в процессе управляемой загрузки
19
администрирование онного BIOS. Но в результате получилось, что такой универсальный инструмент может грузить и ОС, используя свои сильно расширенные возможности. Для обеспечения процесса загрузки с помощью EFI системы Linux используется компонента ELILO (программа в формате EFI), которая читает все загружаемые файлы со специального системного раздела, размеченного в FAT. Объем такого раздела небольшой по нынешним меркам – 128 Мб, как рекомендовано. На нем должны располагаться и ядра, и initrd, и все, что может понадобиться как загрузчику ELILO, так и другим компонентам EFI, список которых не ограничивается лишь драйверами и диагностическими утилитами. Но факт остается фактом: то, до чего еще не додумались разработчики проприетарного EFI, легко реализуется на самом Linux.
Пример управляемой загрузки В качестве иллюстрации технологии управляемой загрузки рассмотрим синтетический пример: управляемую загрузку рабочей станции. Такая подмена предмета позволит сделать пример полностью законченным и конкретным. Одновременно это даст возможность продемонстрировать большее число приемов загрузки с помощью Grub. И кроме того, покажет, что рамки применения, казалось бы, серверной технологии можно с успехом расширить. Поставим задачу следующим образом. Нужно создать универсальную рабочую станцию, которая будет автоматически загружиться как Linux-станция, Windows-станция и X-терминал. Согласно нашей концепции будут также реализованы дополнительные состояния – служебное и состояние обслуживания. Полная диаграмма переходов состояний, начиная с запуска Grub, будет выглядеть, как представлено на рис. 3. Зеленым цветом обозначены узлы, соответствующие рабочим состояниям, желтым – служебные, красным – состояние обслуживания. Рабочая станция пребывает в состояниях обслуживания и служебном в течение времени, необходимого на выполнение запрограммированных задач. А вот пребывание в рабочих состояниях ограничивается лишь целевой необходимостью и завершается командой оператора на перезагрузку или выключение, но также может быть инициировано удаленным запросом с центрального сервера, управляющего всей сетью подобных рабочих станций. Естественно, технология такого запроса полностью определяется платформой, которой этот запрос должен управлять. Например, для того чтобы выключить MS Windows XP удаленно с Linux-сервера, можно воспользоваться специальным запросом MS RPC: > rpcclient -c shutdowninit -U username%password ip-address
где username и password соответствуют бюджету администратора на компьютере с адресом ip-address, где будет запущена процедура выключения (которая, кстати, не сможет автоматически завершить работающие программы, увы). Меню Grub для обеспечения требуемой смены состояний можно построить следующим образом: # cat /boot/grub/menu.lst color white/blue black/light-gray
20
default saved hiddenmenu timeout 5 #0 title 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 #1 title Linux root (hd0,1) kernel /boot/vmlinuz root=/dev/sda2 vga=0x332 ↵ selinux=0 splash=0 showopts 5 initrd /boot/initrd savedefault 4 #2 title Windows root (hd0,2) chainloader +1 makeactive savedefault 4 #3 title Terminal bootp root (nd) kernel /lts/pxe/vmlinuz.ltsp root=/dev/ram0 ↵ rw init=/linuxrc initrd /lts/pxe/initrd.lts savedefault 4 #4 title Stuff root (hd0,1) kernel /boot/vmlinuz root=/dev/sda2 vga=0x332 ↵ selinux=0 tonextboot splash=0 showopts 3 initrd /boot/initrd savedefault #
Это, конечно же, один из возможных вариантов, и многие параметры надо назначить согласно используемому оборудованию и принятым установкам работы. В частности, выше видно, что все состояния, обслуживаемые Linux, совмещают один экземпляр системы (так как цель демонстрации лишь управляемая загрузка). Пункты меню, соответствующие основным состояниям, более-менее однозначны: № 1 Linux и № 2 Windows соответствуют стандартным способам запуска этих систем из Grub. № 3 Terminal запускает клиента LTSP путем загрузки ядра и initrd с ресурса tftp, который указывается по протоколу DHCP. Для того чтобы сработала команда bootp, надо вместо stage2, устанавливаемой в ходе стандартной процедуры, разместить в корне Grub stage2, специально собранную для работы с сетью: # cp /usr/lib/grub/stage2.netboot /boot/grub/stage2
При этом выполнение всех остальных команд меню не пострадает. Пункты меню № 4 Stuff и № 0 Out Of Order во всем практически подобны стандартному режиму запуска Linux на уровень 3. Но для их правильного функционирования надо запрограммировать специальную обработку этих режимов в процессе инициализации соответствующего уровня. Продемонстрируем, как это сделать для служебного режима, поскольку он является ключевым для реализации всей схемы. Будем использовать в качестве управляющего признака содержимое файла, размещенного на локальном httpресурсе. Далее принимаются стандарты SuSE на расположение таких файлов. Например, сделаем так: если следует запустить станцию с адресом 192.168.0.166 с использованием пункта меню Grub с номером 1, то запишем этот но-
администрирование мер в файл, названный по IP-адресу нужной станции (действия производятся на http-сервере): # echo 1 >/srv/www/htdocs/192.168.0.166
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!" ; }
Это значение можно прочесть со станции с помощью wget, lynx или curl, обратившись по адресу http://www.office. localnet/192.168.0.166, если именно такой адрес у нашего локального http-ресурса. Получив значение нового рабочего состояния, скрипт устанавливает параметры следующей загрузки, используя утилиту grub-set-default. Скрипт, который будет анализировать параметр управления загрузкой, назовем tonextboot. Для того чтобы он вызывался автоматически, придется поместить его в процесс стартовой инициализации соответствующего уровня, в нашем случае уровня 3: # cp tonextboot /etc/init.d # insserv tonextboot
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
;; Но чтобы скрипт «знал», когда запускать систему в слуesac rc_exit жебном режиме, добавим специальный параметр, который будем передавать через Grub ядру в командной строке так, чтобы потом можно было проверить его наличие через Скрипт очень простой и прозрачный по смыслу. В нем /proc/cmdline. Примем таким параметром управляемое сло- есть обработка только одной непредвиденной ситуации – во «tonextboot». Если этого слова нет, то скрипт «считает», если скрипт «не может» вообще никак «узнать» следующее что это какой-то иной режим запуска, а не Stuff. Если же та- состояние сервера. Тогда принимается политика «по умолкое слово обнаруживается, то следует выполнить действия, чанию», которая управляется переменной DEF. указанные на рис. 3. Полный текст скрипта, сделанный по Нельзя не сказать и о том случае, когда grub-set-default стандартам SuSE приведен ниже. Чтобы скрипт правильно будет вызван с номером, превышающим число возможных встал в порядок загрузки, указано, что для его работы тре- ветвлений меню Grub. Тогда система запустится с параметбуется инициализированный сетевой уровень. рами нулевого пункта меню. Это надо учитывать при планировании порядка размещения состояний в меню Grub. Скрипт tonextboot Все перечисленные настройки, включая модификацию stage2, выполняются без переустановки Grub. Затем произ#!/bin/sh # водится начальная инициализация grub-set-default 4 и пос### BEGIN INIT INFO ле перезагрузки система станет работать в зависимости # Provides: tonextboot # Required-Start: network от того уровня, что назначен на сервере www.office.localnet # Should-Start: для данной станции. # Required-Stop: network # Default-Start: 3 Таким приемом можно управлять офисом или классом # Default-Stop: компьютеров, заставляя их автоматически загружаться # Description: Check and set next boot way ### END INIT INFO в нужный режим. . /etc/rc.status rc_reset NULL=/dev/null SRV="http://www.office.localnet/" #VERB=1 DEF=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
№2, февраль 2006
Сопутствующие вопросы Рассмотрение темы планирования дисковых ресурсов не будет полным, если не коснуться вопросов надежности программных уровней представления данных (LVM, MD и проч.) и выбора типа файловой системы. Вопреки традиционному подходу, не будем придавать этим вопросам статус основополагающих. И вот по какой причине. В отношении LVM существует расхожее бытовое мнение о, якобы, низкой ее надежности, основанное на том факте, что после повреждения структуры LVM практически невозможно восстановить данные файловых систем, созданных внутри логических томов. Это неверно построенная логическая цепочка рассуждений. По аналогии, многие люди считают опасными самолеты, на том основании, что, мол, летают быстро и высоко, и при падении выживших крайне мало, но при этом забывают, что статистика свидетельствует, что обычный автотранспорт гораздо
21
администрирование в секунду, рядом с которыми изображены индексы отклонения от средней 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 бчатой диаграммы (рис. 4). И убедимся, Символьное чтение 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, опаснее. Но и это не самое главное. В таком рассуждении рассчитаем средний индекс и запишем все это в итоговой подменяется объект. Цикл эксплуатации состоит из време- строке (строка 6 в таблице 1). Теперь уже можно устанони наработки на отказ, отказом и периодом восстановле- вить, что лучшие результаты у xfs и jfs, худший – у reiserfs4, ния. Так вот, надежность всецело определяется временем а вот те файловые системы, что зачастую принимаются наработки на отказ. И это время не зависит от сложности в качестве стандартных в инсталляторах «из коробки», «хосамой программной системы, а лишь от надежности обо- дят» в явных середнячках (и даже не в «троечниках»!). Хорудования. Причина в том, что в настоящее время в ЭВМ тя отклонения не превышают 5%. Иначе говоря, нет иноприменяются детерминированные алгоритмы. То есть вне го способа объяснить выбор форматов ext3 и reiserfs в казависимости от цепочки преобразований пара одинаковых честве стандартов, как учетом их большей отработанносзапросов вернет эквивалентные данные. Безусловно, чем ти (например, в jfs значительное число возможностей посложнее преобразования, тем сложнее их реконструкция ка имеет статус экспериментальных) и большей историей на этапе восстановления. Но, во-первых, это уже не име- использования. ет отношения к надежности, а, во-вторых, кто сказал, что Тем более, вспомним, что выбор типа файловой сисвосстановление сложных систем надо производить прими- темы для нас актуален лишь относительно. Используя остивными способами? новную систему, можно поменять формат файловых сисВ отношении MD и остальных программных систем все тем, размещенных в LVM, почти «на лету»: создать «снапаналогично. Есть лишь те проблемы, что каждая из таких шот» LVM, произвести резервное копирование, создать носистем вводит в работу ряд параметров, например, назва- вый логический том, разметить его в новом формате, синние MD устройства, имя группы LVM, и при физической мо- хронизировать данные и перемонтировать. Лишь две посдификации дисковых устройств возможны конфликты по ледние операции потребуют кратковременного отключения. этой причине. Наличие вспомогательной системы, кроме ос- Даже формат основной системы можно поменять, испольновной, позволит модифицировать все подобные парамет- зуя вспомогательную систему. А потом и на ней изменить ры у основной системы, чтобы избежать конфликта. разметку, воспользовавшись уже основной. Самый спорный вопрос – это, конечно же, предпочтеТаким образом, эти, в обычном случае «важные» вопрония типа файловой системы. Очень часто этот вопрос пе- сы – сложность LVM, выбор типа файловой системы – бларетекает из области рациональной оценки в область вкуса, годаря использованным технологическим приемам перепривычек или политических предпочтений. А как же иначе? ведены в разряд второстепенных. Ведь если бы существовало однозначное решение, так все менее популярные проекты просто прекратили бы разви- Заключение ваться. Значит, в каждой из файловых систем есть собс- Обсуждение вопросов, связанных с темой планирования твенные преимущества. дисковых ресурсов, можно считать завершенной. Были Попробуем решить спор тривиальным тестированием сформулированы четыре принципа, которые следует учитыс помощью bonnie (Таблица 1). Условия полностью совпада- вать при создании конкретного серверного решения. Проют с теми, что были в первой части статьи [1]. Только пара- иллюстрированы разнообразные технологические приемы, метром будет тип файловой системы (перечислены в верх- сопутствующие предложенным технологиям. Но, безусловней строке). Режимы тестирования указаны в самом левом но, все вышесказанное носит рекомендательный характер. столбце. В перекрестьях замеренные результаты в Кбайт Не забывайте, что дисковые подсистемы и вопросы, их окружающие, являются лишь частью, хотя и достаточно важной, всех задач, которые решаются в ходе построения прикладного сервера. И конечный выбор способа, которым надо разбить дисковые устройства на разделы, полностью определяется назначением самого сервера. О том, какие преимущества можно получить, используя предложенный здесь подход, обсудим в продолжении цикла. Таблица 1. Зависимость скорости доступа от типа файловой системы
Литература: Рисунок 4. Зависимость скорости доступа от типа файловой системы
22
1. Барабанов А. Современный Linux-сервер: как планировать дисковые ресурсы. – Журнал «Системный администратор», №1, 2006 г. – 16-21 с.
администрирование
ProFTPD: мастер своего дела
Сергей Супрунов Серверы FTP, несмотря на то, что они предоставляют один из старейших сервисов глобальной сети, по-прежнему остаются крайне популярными. Разработчики ПО постоянно стараются реализовать новые возможности в тесных рамках протокола FTP. И один из наиболее ярких представителей этой плеяды – проект ProFTPD.
П
ри разработке FTP-сервера ProFTPD особое внимание уделялось безопасности и максимальной гибкости настроек. Практически во всём прослеживается влияние проекта Apache – от структуры конфигурации и файлов .ftpaccess до модульной архитектуры. Сервер полностью поддерживает базовый протокол FTP, определённый в RFC 959, а также многие функции, описанные в RFC 1123. Приставка «Pro», фигурирующая в названии, полностью оправдывает себя – это действительно профессиональный сервер, с помощью которого вы можете реализовать практически всё, что может потребоваться от FTP-сервера. Конечно, все его возможности в рамках одной статьи охватить неисполнимо, но наиболее важные моменты я постараюсь для вас осветить.
Инсталляция Установка выполняется достаточно традиционно. Пользователи Linux наверняка (учитывая большую популярность данной программы) найдут предкомпилированный пакет для своего дистрибутива. Для FreeBSD стандартная рекомендация – установить сервер из коллекции портов. Ну и, естественно, вы всегда можете вручную собрать ProFTPD из исходных кодов. В дальнейшем все примеры будут относиться к FreeBSD (для конкретики), так что приступим к установке. Обновив коллекцию портов, даём команду:
собрать ProFTPD. Если коротко, то эти модули выполняют следующие функции: IPV6: поддержка шестой версии протокола IP. LDAP: поддержка аутентификации пользователей на LDAP-сервере. MYSQL: поддержка СУБД MySQL для хранения учётных записей пользователей. POSTGRESQL: аналогичная поддержка для PostgreSQL. OPENSSL: поддержка шифрованных соединений. QUOTA: позволяет настраивать лимиты для пользователей на используемое дисковое пространство. IFSESSION: поддержка ограничений для конкретных сессий. README: позволяет выводить сообщения об изменениях в каталогах. RATIO: управление соотношением загрузок/скачиваний. REWRITE: поддержка перезаписи имён запрашиваемых файлов/каталогов на основе регулярных выражений. WRAP: ограничение входящих соединений по IP-адресу источника (замена механизму TCPWrapper, используемому сервером inetd, при работе в автономном режиме). RADIUS: поддержка авторизации на RADIUS-серверах.
О некоторых из них мы ещё поговорим, но вам уже сейчас нужно будет определиться с тем, какие модули вам по# /usr/local/sbin/portinstall proftpd надобятся, так как при необходимости добавить что-то к уже работающему серверу вам придётся пересобирать ProFTPD Можно, конечно, и традиционно (cd /usr/ports/ftp/proftpd; с новыми параметрами. Но и включать всё, что есть, про заmake install), но утилита portupgrade предоставляет целый пас, тоже не стоит – «меньше ставишь – лучше спишь». ряд дополнительных возможностей, так что от себя пореКстати, запустив в следующий раз установку этого поркомендую установить её в любом случае. та (например, чтобы изменить список модулей или обновить Запустив установку порта впервые, вы получите изоб- версию), вы уже не увидите этот диалог – ваш нынешний ражённое на рис. 1 диалоговое окно, где нужно будет от- ответ будет сохранён в файле /var/db/ports/proftpd/options. метить дополнительные модули, с которыми вы желаете Так что вам нужно будет либо удалить этот файл (вместе
24
администрирование с каталогом proftpd), либо выполнить нужные правки прямо в нём. Пользователям Linux нужно будет подыскать подходящий пакет, собранный с нужными модулями, либо ставить из исходных кодов, указав нужные расширения с помощью параметра with-modules в команде ./configure, например, так: # ./configure --with-modules=mod_rewrite:mod_postgresql
Более подробно о параметрах сборки можно, как обычно, узнать, введя команду: # ./configure --help
Рисунок 1. Диалог выбора дополнительных модулей ProFTPD
Посмотреть полный список подключенных модулей (включая модули, собираемые по умолчанию) можно с помощью следующей команды (вводить её следует после инсталляции): $ /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
Рисунок 2. Модульная архитектура ProFTPD (показаны не все модули)
чем запускать наш FTP-сервер, проследуем в конфигурационный файл (/usr/local/etc/proftpd.conf) и посмотрим, нет ли в настройках по умолчанию чего-то такого, о чём мы могли бы пожалеть в дальнейшем.
Структура конфигурационного файла
Сразу же бросается в глаза его синтаксическая схожесть с httpd.conf – конфигурационным файлом Apache. В файле В зависимости от того, какой из способов установки вы proftpd.conf можно выделить следующие секции (области выберете, вам может понадобиться выполнить вручную не- действия директив): секция <Global>: общие настройки для всех виртуалькоторые действия: ных серверов; создать учётную запись пользователя, от имени которого будет работать сервер (традиционно это поль- секция <VirtualHost>: параметры виртуальных хостов (таких секций может быть произвольное число, см. дазователь ftp, и обычно он уже присутствует в системе; лее раздел про организацию виртуального хостинга); по умолчанию используется nobody, однако повсеместное его использование может приблизить его по пол- секция <Anonymous>: настройка анонимного доступа (см. ниже); номочиям к root); создать каталог(и) для размещения файлов, кото- секция <Directory>: параметры, относящиеся к файлам конкретного каталога; рые вы хотели бы предоставлять пользователям ва секция <Limit>: ограничения на работу с командами шего сервера; протокола FTP и ограничения авторизации; создать конфигурационный файл proftpd.conf (обычно базовый файл создается автоматически во время ин- «внешние» директивы: не включены в какую-либо секцию, действуют на весь сервер (директивы внутри сексталляции); ций переопределяют общие настройки для своей сек обеспечить возможность автоматического старта ции). сервиса при перезагрузках компьютера. Кроме конфигурационного файла, некоторые наВ случае FreeBSD от вас потребуется только подготовить рабочие каталоги и добавить в /etc/rc.conf стройки могут быть выполнены в файлах .ftpaccess (если строчку «proftpd_enable = YES», чтобы получить воз- не запрещено переопределение параметров директивой можность управлять сервисом с помощью сценария «AllowOverride off»). Действие данного файла распростра/usr/local/etc/rc.d/proftpd.sh, который заодно обеспечива- няется на каталог, в котором он размещён, и на все влоет и автозапуск демона при загрузке системы. Но прежде женные каталоги.
№2, февраль 2006
25
администрирование Приоритетом будет пользоваться та директива, «вложенность» которой больше, т.е. та, действие которой охватывает меньшую область сервера. Директивы можно условно разделить на две категории: «параметрические», которые требуют указать некоторый параметр (например, IP-адрес), и «логические», которые в качестве параметра принимают ключевое слово «on» или «off», соответственно включая или отключая действие директивы. В дальнейшем в данной статье для параметрических директив будет приводиться синтаксис их параметров; логические директивы будут указаны без параметров (за исключением случаев, когда требуется подчеркнуть необходимость установить конкретное значение).
Некоторые сведения о режимах работы В первую очередь нужно будет определиться с тем, как ваш сервер должен работать. Поддерживается два режима – inetd и standalone, что определяется параметром ServerType. В первом режиме, как следует из его названия, proftpd будет запускаться суперсервером inetd (это же относится и к xinetd, более популярному в современных дистрибутивах Linux). Это, может быть, разумно в том случае, если inetd у вас запущен (в последнее время хорошим тоном стало отказываться от его использования) и нагрузка на FTP крайне низка, что не оправдывает постоянное присутствие в памяти ещё одного демона. В данном случае управлять установлением соединений будет inetd (он прослушивает 21-й порт и принимает решение о том, принять или отклонить запрос на соединение, руководствуясь файлами /etc/hosts.allow и /etc/hosts.deny), однако возможности ProFTPD в этом режиме существенно ограничены (в частности, нельзя создавать виртуальные серверы). Помимо параметра «Ser verType inetd» в файле /etc/inetd.conf следует закомментировать строки, относящиеся к «родному» серверу ftpd (чтобы не было конфликтов) и добавить строку для активации proftpd при получении запроса на 21-й порт (впрочем, вы можете использовать и нестандартный порт, если очень хочется): # ftp
stream tcp nowait root /usr/libexec/ftpd ftpd -l # ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l ftp stream tcp nowait root ↵ /usr/local/sbin/proftpd 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 запросов [сообщение]: задается максимальное число запросов на соединение, обслуживаемое в одну секунду.
Обязательно проверьте правильность пути к исполняемому файлу: на некоторых системах proftpd может быть установлен в /usr/sbin или в /usr/local/libexec. Автономный режим (standalone) оправдывает себя во всех остальных случаях. Теперь proftpd постоянно приНа самом деле параметров конфигурации значительсутствует в памяти, самостоятельно прослушивая нужные но больше, ознакомиться со всем многообразием вы смоадреса и порты и управляя всеми входящими соединени- жете в документах, ссылки на которые приведены в конями. Кстати говоря, и время реакции на запрос пользова- це статьи. Здесь же рассмотрим два модуля: mod_wrap и mod_ratio. теля в этом случае будет меньше, т.к. не придётся каждый Модуль mod_wrap предназначен для обеспечения раз считывать программу с диска и создавать новый процесс. Именно режим standalone используется по умолчанию, функциональности, которую в случае inetd реализует так что не будем ничего менять. Убедитесь, что в inetd.conf TCPWrapper. Собрав ProFTPD с поддержкой данного модуне активирован никакой сервис, обслуживающий порт, на ля, вы сможете указать файлы allow и deny, которыми серкотором будет работать proftpd, чтобы исключить конф- вер будет руководствоваться, принимая решение о том, обликты. служивать соединение с данного адреса или нет. Вы мо-
26
администрирование жете указывать эти файлы как для всех пользователей, так и для конкретных:
ванными в системе. Формат файлов должен соответствовать системным, за исключением того, что пароль указывается в этом же файле (аналога shadow нет), так что преTCPAccessFiles /etc/hosts.allow /etc/hosts.deny дельно внимательно отнеситесь к ограничению прав доTCPUserAccessFiles admin /etc/admin.allow /etc/admin.deny ступа к этому файлу. Кроме того, вы можете указать требуемый логин и паС помощью символа «~» вы можете подключить для каждого пользователя свои wrap-файлы, размещаемые в их до- роль непосредственно в конфигурационном файле proftpd с помощью директивы UserPassword. Как здесь, так и в файмашних каталогах: ле, определенном директивой AuthUserFile, должны испольTCPAccessFiles ~/.allow ~/.deny зоваться хешированные пароли (если верить ряду проведённых экспериментов, сервер самостоятельно опредеФормат файлов аналогичен /etc/allow.host, в качестве ляет тип хеша по его виду; поддерживается DES и «станимени службы используется proftpd (можно задать другое дартный» MD5, причём допускается их совмещение в одном файле). Для управления паролями можно использовать, с помощью TCPServiceName). Модуль mod_ratio позволяет вам устанавливать огра- например, входящую в состав Apache утилиту htpasswd ничения на соотношение скачиваемых файлов и загружа- (для формирования DES-паролей; то, что формирует эта емых на сервер (грубо говоря, контролировать отношение утилита с ключом -m, сервером ProFTPD, не распознаётисходящего трафика ко входящему). Рассмотрим следую- ся как MD5-хеш). Также существует аналогичная утилита ftpasswd, разработанная специально для нужд ProFTPD, щую директиву: но в стандартную поставку, по крайней мере, во FreeBSD, Ratios on она почему-то не включена. (Почитать про неё можно здесь: UserRatio ftp 10 5 20 256000 http://www.castaglia.org/proftpd/contrib/ftpasswd.html, а по этоЗдесь мы для пользователя ftp ввели следующие ог- му адресу находится собственно текст данной утилиты, написанной на языке Perl: http://www.castaglia.org/proftpd/ раничения: он должен скачать в десять раз больше файлов, чем за- contrib/ftpasswd). Рассмотрим также хранение информации об учётных загрузит на сервер (первое число 10 означает, что соотношение download/upload = 10/1); писях пользователей в базе данных на примере PostgreSQL. Прежде всего, убедитесь, что ваш proftpd собран с подде первые 5 файлов можно закачать «в кредит»; ржкой модулей mod_sql и mod_sql_postgres. Теперь подго для размера файлов установлено соотношение 20/1; товим базу данных (назовём её proftpdb), в которой созда «кредит» – 250 Кб. дим две таблицы – users и groups: Помимо этого вы можете устанавливать соотношения $ psql -U serg для хостов (HostRatio), групп (GroupRatio), анонимных поль# create database proftpdb owner serg; зователей (AnonRatio). Символ «*» можно использовать CREATE DATABASE в значении «все» (например, все пользователи). Установка какого-либо параметра в 0 означает снятие ограничений. # \c proftpdb serg
Права доступа и анонимные серверы Если сравнивать proftpd со стандартным ftpd, входящим в поставку FreeBSD, то в первую очередь следует отметить гораздо большие возможности первого в вопросах управления учётными записями и правами доступа. ProFTPD в полном объёме поддерживает стандартные средства управления доступом (авторизация по системному файлу паролей, использование файлов /etc/shells, чтобы предоставлять доступ только тем пользователям, которые имеют действительную командную оболочку, и т. п.). Помимо этого к вашим услугам ряд других замечательных возможностей, о которых и поговорим. Прежде всего отметим возможность использовать базу LDAP для аутентификации пользователей. Также вы можете вести базу виртуальных пользователей в обычном текстовом файле или в СУБД (поддерживаются MySQL и PostgreSQL). Для использования текстового файла, содержащего данные учётных записей, используются директивы AuthUserFile и AuthGroupFile. В этом случае ProFTPD будет руководствоваться данными этих файлов, как если бы пользователи, описанные в них, были обычными, зарегистриро-
№2, февраль 2006
Вы подсоединились к базе данных "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
Как видите, структура таблиц очень напоминает структуру файла /etc/passwd. Вам следует соблюдать уникальность имён пользователя и группы, а также уникальность uid в файле users и gid в файле groups. Если пользовате-
27
администрирование Вспомогательные утилиты В составе пакета ProFTPD вы найдёте несколько утилит, которые могут быть весьма полезны для мониторинга работы вашего FTP-сервера и поиска в его работе «узких мест»: ftpcount – выводит число подключённых в данный момент клиентов (с разбивкой по серверам); ftpdctl – позволяет управлять запущенным сервером proftpd; ftptop – аналог команды top для процессов proftpd; ftpwho – выводит список подключённых к серверу пользователей; ftpshut – позволяет выполнить останов всех запущенных proftpd-серверов в указанное время (аналог системной команды shutdown). Для каждой команды есть подробная страница справки (man).
лей предполагается не слишком много, то об этом можно заботиться и вручную. В противном случае следует установить на соответствующие поля признак UNIQUE, чтобы СУБД сама следила за их уникальностью. Последними двумя командами мы создаём группу «admins» и пользователя «admin». Теперь нужно указать 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
Теперь вы можете входить на сервер под именем «admin», хотя такого системного пользователя и нет. Главное – чтобы его домашний каталог реально существовал, если вы используете директиву DefaultRoot ~. Обратите внимание, что после авторизации процесс, обслуживающий соединение, получит uid и gid, указанные в базе, так что вам следует позаботиться об отсутствии пересечений с системными пользователями. Также учитывайте этот факт в контексте прав доступа к тем или иным файлам (заметьте, что вы можете дать на любой файл или каталог права несуществующего пользователя, указав любые нужные вам идентификаторы, например, так: chown 9999:9999 /home/admin). Для организации анонимного доступа используется секция <Anonymous каталог>, где каталог – это имя каталога (абсолютный путь или с использованием символа ~), доступ в который будет осуществляться без обязательного знания пароля. Типичный пример приведён ниже: <Anonymous ~ftp> User ftp Group ftp UserAlias anonymous <Limit WRITE> DenyAll </Limit> </Anonymous>
28
# Анонимный доступ в каталог ~ftp # Пользователь и группа, с правами # которых будет работать процесс ftp # Псевдоним anonymous = ftp # # Запрещаем запись # #
Если в секции <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 таким образом, что каждый виртуальный сервер будет прослушивать свой порт. Очевидно, что это непригодно для коммерческого хостинга, когда каждый клиент ожидает получить «стандартный» сервер, ко-
администрирование торый будет отвечать на запросы, адресованные на 21-й порт. Однако для личных нужд (например, когда FTP используется для доступа к корню веб-сервера) такой метод может оказаться вполне пригодным. Так что мы уделим внимание и ему. Итак, виртуальный сервер задаётся секцией <VirtualHost IP-адрес>. Вместо адреса можно указать и доменное имя. В данной секции допускаются очень многие директивы, управляющие работой сервера – вы можете задать отдельного пользователя, с чьими правами он будет работать; настраивать анонимный доступ; установить собственный способ авторизации; вводить различные ограничения. Общие для всех виртуальных хостов опции можно вынести в секцию <Global>. Пример конфигурации см. ниже, в решении задачи 5.
Другие директивы, которые могут быть полезны Существует масса директив, которые отвечают за запись информации в лог-файлы, за фильтрацию запросов с помощью регулярных выражений (например, чтобы установить ограничения на файлы с определённым расширением), за специальную обработку файлов (например, можно автоматически добавлять префикс ко всем загружаемым на сервер файлам или управлять правами доступа с помощью Umask), и т. д. Вы можете управлять дисковыми квотами (модуль mod_quota, директивы DefaultQuota, QuotaType, UserQuota, GroupQuota и др.), скоростью скачивания, и проч. В общем, ознакомьтесь с документацией – там много интересного.
Несколько практических примеров Для закрепления материала рассмотрим небольшие примеры, демонстрирующие решение некоторых задач, связанных с настройкой FTP-сервера.
Пример 1. Конфигурация, близкая к стандартной
кто не входит в перечисленные в директиве AllowGroup группы: DefaultRoot ~ !admin RequireValidShell off <Limit LOGIN> AllowGroup wheel,dialup </Limit> <Limit WRITE> AllowGroup wheel </Limit>
Теперь admin будет свободно «бродить» по всему дереву каталогов, а члены групп wheel и dialup смогут работать в своих домашних каталогах. Заметьте, что пользователь admin должен быть членом одной из указанных групп (скорее всего, он уже входит в wheel), иначе ему не позволят авторизоваться.
Пример 2. Несколько анонимных каталогов Постановка задачи: требуется настроить на одном FTP-сервере три анонимных каталога – для разработчиков, для тестеров и для пользователей. Решение: в данном случае проще всего создать три секции <Anonymous> для разных пользователей, имена которых должны вводиться при подключении. Для определенности разработчикам нужно будет входить под именем developer, тестерам – tester, остальным пользователям – под стандартными anonymous/ftp (ну и для общности добавим ещё один псевдоним – user): <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>
Постановка задачи: необходимо с помощью FTP администратору (пользоЗаметьте, что имя каталога, указанного в теге <Anonymous>, ватель admin) открыть доступ ко всему дереву каталоне обязательно должно совпадать с именем пользоватегов сервера; нескольким «своим» пользователям, входящим в груп- ля – оно может указывать на любой существующий катапу wheel, – доступ в их домашние каталоги с правом за- лог. Имя же пользователя, при вводе которого осущестписи; вляется анонимный вход, задаётся директивой User, при пользователям, работающим через коммутируемые со- чём указанный пользователь должен существовать в сисединения (группа dialup), дать доступ на чтение в один теме (в случае виртуальных пользователей для них должиз каталогов (для всех членов группы он установлен ны быть указаны uid и gid, под которыми будет запущен как домашний); процесс). В последней секции мы указываем два псевдонима, чтобы в этот каталог можно было попасть не только всем остальным доступ по FTP запретить. под именем user, но и как ftp или anonymous. Решение: эту задачу можно решить в два этапа – во-первых, ограничим доступ домашними каталогами всем поль- Пример 3. Общий каталог зователям, кроме пользователя admin (первая строка при- Постановка задачи: есть группа пользователей, которым мера). Поскольку пользователи dialup не имеют реальной нужно предоставить полный доступ каждому в свой докомандной оболочки, то второй строкой отключим провер- машний каталог, а также в общий для всех каталог тольку наличия shell пользователя в файле /etc/shells. Ну и, во- ко на чтение. вторых, в секциях <Limit> «отсекаем» возможность входить Решение: сразу напрашивается идея использовать на сервер (LOGIN) и писать в каталоги (WRITE) для всех, символьную ссылку на общий каталог из домашних ка-
№2, февраль 2006
29
администрирование талогов пользователей, а затем «запереть» всех с помощью «DefaultRoot ~». Однако выход за пределы корневого (в данном случае – домашнего для пользователя) каталога по символьной ссылке запрещён. Так что нужно искать обходной путь, например, такой: DefaultRoot /home !admin <Directory /home> HideNoAccess on </Directory>
Чтобы это сработало, должны выполняться некоторые ограничения – все домашние каталоги пользователей должны размещаться в /home, кроме того, на них должны быть выставлены права 0700 (доступ только владельцу каталога). Общий каталог также должен располагаться в /home, но с правами, позволяющими любому пользователю читать его содержимое. В этом случае события будут развиваться следующим образом: после успешной авторизации процесс, обслуживающий соединение, получит права авторизованного пользователя – владельца одного из каталогов; поскольку прав на чтение чужих домашних каталогов у данного пользователя нет, то сервер ProFTPD в соответствии с директивой HideNoAccess скроет их и не представит по команде LIST (теоретически доступ в скрытые каталоги возможен, но в данном случае он будет предотвращаться системными правами); общий каталог скрыт не будет, и пользователь, поднявшись из своего каталога (куда он попадёт автоматически) в каталог /home, увидит его и сможет в него перейти.
Пример 4. Запись без права чтения
ры на стандартном порту (21), при этом администратор должен иметь возможность работать с сервером с помощью третьего FTP-сервера. При этом реальных адресов на сервере – всего два. Решение: поскольку «очень важных» клиентов ущемлять в правах нельзя, придется им давать «нормальный» хостинг на реальных IP-адресах. Страдать, как обычно, будет администратор, которому придётся довольствоваться работой через нестандартный порт (для красоты выберем порт 2121): DefaultAddress user1.mydomain.ru Port 2121 SocketBindTight on <VirtualHost user1.mydomain.ru> ServerName "User1 Virtual Host" Port 21 .. .. .. </VirtualHost> <VirtualHost user2.mydomain.ru> ServerName "User2 Virtual Host" Port 21 .. .. .. </VirtualHost>
Что здесь нужно пояснить: вне секций мы описываем параметры «административного» сервера, который будет привязан к домену user1.mydomain.ru и порту 2121. Директива «SocketBindTight on» требует от ProFTPD «разумного» подхода к созданию сокетов, когда порты прослушиваются только на тех адресах, где это необходимо, а не на всех обнаруженных интерфейсах. Ну и секциями <VirtualHost> вводим наши пользовательские серверы (показаны только директивы, отвечающие за создание виртуальных серверов).
Постановка задачи: разрешить анонимным пользователям загрузку файлов на сервер. Чтобы избежать злоупотреблений (когда ваш анонимный сервер превратится в средство обмена Напутствие «пиратскими» файлами), чтение из данного каталога необхо- Пожалуй, приведённых сведений должно быть достаточно, димо запретить (в дальнейшем администратор будет просмат- чтобы начать работать с ProFTPD. Но, как вы можете увиривать файлы и публиковать нужные в других каталогах). деть в документации, существуют ещё десятки (если не соРешение: здесь всё достаточно просто – на рассматри- тни) опций, с помощью которых можно добиться от сервеваемый каталог нужно установить соответствующие огра- ра почти всего, что вам может понадобиться. Как говоритничения (в секции LIMIT): ся, нет предела совершенству. Дополнительную информацию вы всегда можете полу<Anonymous ~ftp> чить по ссылкам, приведённым ниже. User ftp Удачи вам и настойчивости, чтобы преодолеть всё! Group ftp <Limit WRITE> DenyAll </Limit> <Directory ~ftp/upload> <Limit WRITE> AllowAll </Limit> <Limit READ> DenyAll </Limit> </Directory> </Anonymous>
То есть для каталога upload мы выставляем «инверсные» права – разрешаем запись, но запрещаем чтение.
Пример 5. Виртуальные серверы Постановка задачи: есть два «очень важных» клиента, которым необходимо предоставить виртуальные FTP-серве-
30
Ссылки: 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.
администрирование
FreeDOS – новый взгляд на старые вещи
Иван Максимов В мае 1994 года корпорация Microsoft выпустила последнюю версию операционной системы MS-DOS, позже эта ОС входила в состав Windows, но различные компании и энтузиасты продолжают создавать, развивать и дорабатывать DOS. Какие же проекты существуют сегодня?
В
настоящее время многие забыли про операционную систему DOS, ее используют крайне редко, в случаях сбоя как последнюю маленькую надежду для восстановления данных и теста оборудования. Но MS-DOS давно устарел, какие новые проекты доступны в настоящее время? Чем они отличаются? Есть ли их поддержка? Насколько они
32
совместимы с программным и аппаратным обеспечением? Сегодня рассмотрим одну из DOS-систем, поддерживаемую и дорабатываемую до настоящего времени, сравним с аналогами и проведем тестирования.
Почему FreeDOS? Некоторое время назад мне пришлось создать загрузочный диск с DOS-сис-
темой. Первое и простое решение – создать загрузочный диск из Windows, добавить нужные компоненты и готово, но есть в этом решении несколько но... Места почти всегда не хватает на обычный тест жесткого диска, памяти и других узлов PC, нет нужных по современным меркам утилит и иные проблемы... Поэтому было решено ознакомиться с альтернативами.
администрирование 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 и другие. Приятной особенностью является то, что в командную строку встроен аналог bashcompletion. Со всеми утилитами можно ознакомиться и скачать их на официальном сайте ОС. Важным нововведением в FreeDOS, думаю, стоит считать официальную поддержку протокола TCP/IP. Но что еще умеет FreeDOS? Что необходимо для подобной ОС? Существует множество утилит для работы с файловыми системами NTFS, ext2/3 и reiserfs;
№2, февраль 2006
Рисунок 1. Первое меню загрузочной дискеты
Рисунок 2. Начальная настройка инсталляции FreeDos
программы-оболочки: 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 Мб. Итак, скачав нужный образ, копируем его на носитель.
Обзор дистрибутива на дискете Начнем с обзора дискеты, командой: rawrite -f fd1440.img
копируем образ, перезагружаем PC. Думаю, не стоит досконально описывать каждый пункт меню, большинство пользователей справятся с выбором диска и папки для инсталляции системы, затрону лишь самые интересные и необходимые пункты меню. После перезагрузки перед нами возникает меню (см. рис. 1) с возможностью выбора: Инсталлировать FreeDOS – образ дискеты развернется в виртуальный диск. Загружать утилиту Smart Boot Manager – мультизагрузчик ОС.
33
администрирование Не использовать CD-ROM. Использовать CD-ROM и редактировать файл инсталляции install.bat.
Загрузить дистрибутив из Интернета.
Рисунок 3. Меню загрузочного компакт-диска
Выберем последний пункт меню. Нам предложат загрузить новые драйвера 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-диска.
Обзор малого дистрибутива
Рисунок 4. Интерфейс графической оболочки GemXP
Рисунок 5. Интерфейс графической оболочки Seal2
Запускать тест памяти PC – memtest86+. Инсталлировать FreeDOS (disk safe) – работа с дискеты. При выборе первого или четвертого пункта меню (см. рис. 2) нам предложат: Загрузить стандартные драйвера (нестабильная версия). Использовать свой драйвер CD-ROM.
34
Образ загрузочного диска разворачивается любой программой для записи компакт-дисков (в моем случае это была «k3b»). Чем же отличается 12-мегабайтная версия, кроме размера образа? Меню инсталляции иное, по сравнению с представленным на дискете (см. рис. 3). После загрузки CD-ROM нам предложат: Установить FreeDOS. Загрузиться с жесткого диска. Загрузиться с дискеты. Отменить загрузку с CD-ROM. Серьезным отличием является поддержка 85 кодовых страниц, включая русскую. В конце следует мастер инсталляции FreeDOS на PC. Пункта загрузки дистрибутива из сети Интернет нет. Отличие данного дистрибутива в большем количестве стандартных утилит и драйверов. Присутствует несколько версий драйверов для работы с мышью, утилиты для работы с верхней памятью, CD-ROM, режима доступа UDMA, несколько программ для восстановления данных и многие другие. Всего после инсталляции в каталоге bin появится 120 утилит и драйверов. Папки doc и help не пусты, присутствует большое количество документации по утилитам и драйверам. Просматривая документацию, должен заметить, что она составлена достаточно грамотно, содержит много полезной информации. Набрав, предположим, команду «help del», на экран выведется краткая подсказка по команде del. По сравнению с man в *nix-системах справка менее информативна, но поможет разобраться с синтаксисом программ. Не стоит забывать и про ключ «/?» в конце команд – вывод основных параметров данной утилиты. В папке appinfo присутствует информация о разработчиках всех утилит, вошедших в ОС, их адреса электронной почты, веб-
администрирование ресурсы. Исходных кодов утилит на диске нет, но их можно найти на веб-страницах разработчиков, указанных в папке 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
Создание загрузочного диска
Рисунок 6. Скриншот файла config.sys
Рисунок 7. Скриншот файла autoexec.bat
На официальном сайте проекта (http://freedos-32.sourceforge. Сразу должен сказать, что буду описывать создание заnet) доступен для ознакомления дистрибутив FreeDOS32 грузочной дискеты, так как хочу показать одно из преимуверсии 0.0.5 от 1 июня 2005 года (образ для флоппи-дис- ществ FreeDOS – малый размер и функциональность, хотя ка). Развернем образ на дискету. После загрузки перед на- все действия можно применить и к компакт-диску, и к жесми появится меню загрузчика GRUB с различными возмож- ткому диску. Итак, какими функциями должна обладать поностями загрузки FreeDOS32: работа с дискетой (нет воз- добная ОС на дискете? Конечно, это зависит от задач, но я можности обратиться к жесткому диску), работа с жест- решил создать «реаниматор» в случае сбоя ОС и тест обоким диском, тест 32-битного приложения. После загрузки рудования: значит необходима поддержка распространенвыбранного пункта меню можно попробовать поработать ных файловых систем NTFS и ext2/3, тесты оборудования, с данной ОС, именно «попробовать поработать». Система, работа с usb flash, приводом CD-ROM, небольшие системкак это уже было сказано, не запускает 16-битные прило- ные утилиты и драйвера. Для «аварийной дискеты», на мой жения, при попытке запуска консольных win32-приложе- взгляд, этого достаточно. Для начала скачаем необходимые файлы для загрузочний ОС либо висла, либо сообщает о нехватке различных библиотек. Доступны стандартные DOS-команды в мини- ной области и ядра, их три: kernel.sys, command.com, sys.com. мальном наборе, драйвера CD-ROM, мыши, ... и все. Очень Из любой DOS-совместимой системы выполним команду хотелось увидеть более-менее рабочую 32-битную версию «sys [имя диска:]». Создадим два необходимых конфигуFreeDOS, но чудо не свершилось... Возможно, данная вер- рационных файла: config.sys, autoexec.bat и подготовим несия ОС будет интересна разработчикам, на сайте выложе- обходимые папки и файлы. Драйвера я разместил в папке ны исходные коды 32-битной ОС, но для реальных задач drivers, а утилиты в utils.
№2, февраль 2006
35
администрирование С официального сайта ОС скопируем необходимые ках. С USB немного сложнее: определение USB Flash длитнам программы: драйвер расширенной памяти himem.exe ся 3-5 сек., различные драйвера (версии 0, 1, 2, 3) преднаи верхней emm386.exe. Драйвера мыши – ct-mouse.exe, значены для разных наборов чипсетов, поэтому перед задрайвера CD-ROM – xcdrom.exe, аналог программы грузкой каждого драйвера будет задан вопрос, загружать mscdex.exe – shcdx33a.com, драйвера UDMA для жестко- данный драйвер или нет. Рассмотрим autoexec.bat подробнее. Как я уже писал, го диска. Драйвера USB-шины для DOS мне встретились в двух вариантах: драйвера «duse» я не использовал из- xmsdsk позволяет назначать буквенное обозначение имеза достаточно крупного размера, поэтому я их не тестиро- ни виртуального диска сразу в момент загрузки драйвера, вал, а вот драйвера от «Panasonic Communications» с ре- что я и сделал. Обработчик команд (command.com) удобнее сурса http://johnson.tmfc.net занимали минимальное про- сразу переписать на виртуальный диск, для того чтобы постранство и, как это выяснилось позже, стабильно работа- том можно было работать без дискеты. Остальные параметли. Результаты тестирования FreeDOS на совместимость ры, думаю, не требуют дополнительного описания. с программным и аппаратным обеспечением будут предДля ускорения работы программ и экономии места на дискете, но в ущерб скорости загрузки системы можставлены ниже. Стандартные утилиты: format.exe, mem.exe, fdisk.exe, но запаковать крупные утилиты любым DOS-архиватором, edit.exe. а позже распаковать их на виртуальный диск или для авУтилит для работы с NTFS и ext2/3 из-под DOS-совмести- томатизации добавить строку распаковки в autoexec.bat. мых систем предостаточно в Интернете, но я выбрал утили- Например: ты, занимающие минимальное пространство, это: утилита rawrite -f fd1440.img чтения разделов ext2/3 с сайта http://ext2read.sourceforge.net и утилита ntfs reader c http://www.ntfs.com (утилиты бесплатны). Итак, дистрибутив аварийной дискеты собран и готов Утилит для создания виртуальных дисков много, на офи- к работе. Особенностью утилит чтения файловых систем циальном сайте их около 20, мой выбор давно пал на ути- NTFS и ext2/3 является то, что они не «обращают внималиту xmsdsk. Почему именно так? Многие из тех пользова- ния» на политики безопасности файловых систем, так как телей, кто в прошлом создавал загрузочные диски, стал- не имеют доступа к системозависимым пользовательским кивался с проблемой определения буквы виртуального бюджетам, с которыми они создавались. Дополнительно диска в системе. Утилита xmsdsk позволяет сразу назна- на дискету я записал комплексный тест DR.Hard, для тесчать имя диска, что достаточно удобно. Итак, после копи- тирования PC. После заполнения дискеты у нас осталось рования, распаковки и размещения нужных программ на около 200 Кб. дискете опишем их в конфигурационных файлах config.sys (см. рис. 6) и autoexec.bat (см. рис. 7). Сравнения и тесты Рассмотрим config.sys немного подробнее. Я решил Итак, на официальном сайте FreeDOS написано, что ОС не создавать меню из псевдографики, так как дискета со- 100%-совместима с MS-DOS приложениями и стабильно здавалась для определенной цели. Драйвера UDMA под- работает с оборудованием, проверим эти данные. Я прогружаются всех версий – их загрузка происходит доста- вел небольшие тесты на доступном мне ПО и оборудоваточно быстро, а включаются они на разных жестких дис- нии, результаты представлены ниже. Таблица 1. Размеры утилит различных DOS-систем
Сравнение размера утилит
FreeDos-утилиты
Продемонстрирую разницу в размере различных утилит. Должен заметить, что малый размер означает не только удобство, но и лучшую оптимизацию. Функциональность утилит за счет малого размера, как это может показаться, не пострадала, а наоборот добавлено много новых функций по сравнению с последним MS-DOS и аналогами (см. таблицу 1). В разных ОС одни и те же утилиты иногда имеют различные названия, были указаны их полные названия в каждой ОС, размер утилит указан в Кб. (Caldera Dr-DOS 7.03 последнее обновление в 1999 г.)
command.com
64,8
Win98-утилиты command.com
93
Caldera Dr-DOS 7.03 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
Итого
352,4
36
720,8
10,2 435,9
Работа с MS-DOS совместимыми приложениями Проблем с запуском ПО под DOS не возникало, кроме случаев, когда программа наотрез отказывалась работать с драйвером emm или была нехватка базовой памяти, но это стандартные проблемы со специфичным ПО еще с давних времен. Думаю, что стоит отдельно упомянуть, что проблем с установкой ОС компании Microsoft из-под FreeDOS не возникало.
администрирование Таблица 2. Тест на совместимость с «железом»
Полезные утилиты от сторонних разработчиков:
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-устройств и иные утилиты.
Оборудование
Проблемы
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 не заработал
Но были и проблемы:
Как видно из теста, возможны некоторые затруднения с определением USB Flash-памятью в FreeDOS.
Запуск и работа этих программ прошли без проблем. Существует еще огромное количество ПО для 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.
Общие впечатления
Были проблемы с стандартным драйвером atapicdd.
sys – на одной машине он не читал диски, на другой определял один CD-ROM как два устройства, но драйвер xcdrom.sys работал стабильно. Был конфликт драйверов UDMA для жесткого диска и CD-ROM (xcdrom.sys), причем система просто и скромно сообщала «kernel panic:...», все решилось заменой драйверов UDMA для жесткого диска. Также из трех представленных на сайте утилит format – одна форматировала дискеты через раз, пришлось ее заменить. Доступная на сайте утилита scandisk очень часто «висла», но ее также успешно можно заменить. Самой большим неудобством было то, что при вынимании USB Flash из гнезда и установки обратно Flash не определялась. После инсталляции полного дистрибутива системы русская кодовая страница иногда неправильно устанавливается, рекомендую проверить значения в fdconfig.sys: COUNTRY=007,866,C:\FDOS\BIN\COUNTRY.SYS
И в autoexe.bat две команды: Постараюсь описать все плюсы и минусы, с которыми я столкнулся во время работы с FreeDOS. Итак, плюсы: SET CODEPAGE=866 Поддержка аналога bash-completion: «донабор» имен MODE CON CP PREP=((866) C:\FDOS\cpi\EGA3.CPX) каталогов, история набранных команд и другое. В принципе это все серьезные проблемы, которые Расширен синтаксис описания команд в конфигурация встречал при исследовании готовых дистрибутивов онных файлах (config.sys, autoexec.bat). Богатый набор утилит, их компактный размер и функ- и сборки собственного из сторонних утилит. циональность. Приятно видеть, что «старичок» DOS способен на та- Выводы кие вещи как: работа с Flash-памятью, работа с файло- В данном обзоре я не мог охватить все стороны ОС выми системами NTFS, ext2/3 и даже reiserfs, возмож- FreeDOS, но постарался описать, на мой взгляд, его основна и запись в данные файловые системы, но утилиты ные возможности. Данная ОС, по-моему, подходит для создания «аварийных дисков», начальных загрузчиков, прислишком громоздкие для использования на дискетах. Поддержка режима UDMA для жесткого диска и CD-ROM. чем может работать как на новом, так и старом оборудо Было сюрпризом увидеть *nix-утилиты в FreeDOS, та- вании. Радует то, что проект развивается, осуществляется кие как текстовый редактор vim, браузер lynx, архива- исправление ошибок, оптимизируется код программ, вводятся новые возможности. торы gzip, tar и другие программы. Чтож, посмотрим, какие еще возможности появятся Работает поддержка TCP/IP, хотя еще и на слабом уровне, но для доступа к FTP с дистрибутивами FreeDOS в данной ОС в будущем, на этом я заканчиваю свой обзор. вполне способна.
№2, февраль 2006
37
программирование
Практикум Python: обрабатываем входящую электронную почту
Сергей Супрунов «Хороший сисадмин – ленивый сисадмин». Если что-то можно сделать вручную, то почти наверняка это же можно и автоматизировать. Вопрос лишь в соотношении цена/качество, которым определяется целесообразность разработки очередного скрипта.
38
программирование
Е
сли говорить об автоматизации процессов админис- maildigest.py. На время тестирования можно будет не петрирования, то более точно будет говорить о соот- реправлять, а дублировать почту на скрипт, оставив в каношении «время на разработку/экономия времени честве получателя и прежнего пользователя (чтобы избев дальнейшем». Лично для меня наилучшее значение до- жать потери почты): стигается при использовании языка Python. postmaster: admin, “| /usr/local/scripts/maildigest ↵ В данной статье мы рассмотрим решение одной до/maildigest.py” статочно узконаправленной задачи. Тем не менее методы и приёмы, которые будут здесь продемонстрированы, я наПолучая очередное сообщение на обработку, сценарий деюсь, помогут вам решать проблемы гораздо более ши- должен будет проверить, не является ли оно уведомленирокого спектра. ем от ClamAV (будем контролировать два параметра: тему сообщения и тег заголовка «Auto-Submitted»). Если является, то обрабатываем его и записываем результат в некотоПостановка задачи Итак, есть почтовый сервер: FreeBSD + Sendmail + ClamAV, рый файл (о формате пока не думаем). Если же это какоето другое письмо, то положим его сразу в почтовый ящик остальное в данном случае не важно. ClamAV выполняет проверку всей входящей корреспон- пользователя admin. При необходимости изменить имя денции на вирусы и, помимо всего прочего, отсылает уве- получателя его можно будет подправить непосредствендомления об обнаруженных вирусах на адрес postmaster. но в коде сценария (не совсем «академическое» решение, Проблема заключается в том, что администратору (для оп- но оно позволяет упростить код, не разбрасываясь на обределённости будем считать, что он получает почту на ад- работку параметров). рес admin, что достигается соответствующей настройкой в /etc/mail/aliases) приходится обрабатывать достаточ- Небольшое исследование но большое число таких уведомлений. В то же время, они Сначала давайте посмотрим, в каком виде сообщения поспозволяют следить за вирусной активностью на вверен- тупают на вход сценария, а заодно проверим, с какими праном узле, так что отказываться от такой информации не- вами наш сценарий исполняется (эта информация нам пожелательно. надобится в дальнейшем для решения проблемы передаТаким образом, требуется снизить нагрузку на адми- чи «прочей» почты пользователю admin). Для этого напишем небольшой сценарий (как определенистратора без потери накапливаемой в процессе работы статистики. но в aliases, сохраним его под именем maildigest.py, не забыв установить права на исполнение):
Анализ проблемы
Попробуем решить данную задачу путём формирования ежедневных «дайджестов», отражающих вирусную активность за прошедшие сутки. Интересовать нас будет количество обнаруженных вирусов с разбивкой по их названиям. Очевидно, что наиболее простым и в принципе более правильным решением было бы отключить уведомления на postmaster и просто обрабатывать log-файлы, формируемые в процессе работы. Однако мы пойдём другим путём, чтобы рассмотреть на практике один из достаточно полезных приёмов: попробуем обрабатывать всю поступающую на postmaster почту, что называется, «на лету». Поскольку на данный адрес идёт почта не только от ClamAV, нам нужно перехватывать только интересующие нас уведомления, а всё остальное без изменений пересылать администратору (в нашем примере, на адрес admin).
Идеи по реализации Наиболее удобным выглядит перенаправление почты на вход скрипта-обработчика путём создания канала (pipe), что можно реализовать с помощью псевдонимов (aliases). Например, если в файле /etc/mail/aliases добавить такую строку: postmaster: “| /usr/local/scripts/maildigest/maildigest.py”
то вся почта, поступающая на указанный адрес, будет передаваться на стандартный вход (STDIN) сценария
№2, февраль 2006
Листинг 1. Первый эксперимент #!/usr/local/bin/python import os, sys mail = sys.stdin.read() fd = open('/var/scripts/maildigest/mail.txt', 'w') fd.write(mail) fd.write(os.popen('id').read()) fd.close()
Здесь мы всё, что поступает на стандартный вход (дескриптор определён в sys.stdin), записываем в файл mail.txt. Сюда же добавляем строчку, возвращающую идентификатор текущего пользователя, для чего воспользуемся функцией os.popen(), которая создаёт канал между сценарием и системной командой (в нашем случае это команда id). На первых порах нужно разрешить любому пользователю создавать файлы в каталоге /var/scripts/maildigest. В итоге получим примерно следующее (часть полей заголовка за ненадобностью не показана): From clamav@mydomain.ru Fri Feb 17 10:00:07 2006 [. . .] Date: Fri, 17 Feb 2006 09:53:41 +0300 (MSK) Message-Id: <200602170653.k1H6rfHX047203@mydomain.ru> From: MAILER-DAEMON@mydomain.ru To: postmaster@mydomain.ru Auto-Submitted: auto-submitted (antivirus notify) Subject: Virus intercepted X-Virus-Scanned: ClamAV 0.88/1291/Thu Feb 16 23:15:09 2006 on mydomain.ru X-Virus-Status: Clean [. . .] The message k1H6rBq7047195 sent from <info@salaried.com> to <user@mydomain.ru> contained Worm.SomeFool.P and has not been delivered. uid=26(mailnull) gid=26(mailnull) groups=26(mailnull)
39
программирование Распознавать уведомления ClamAV будем по признакам, которые в приведённом выше выводе выделены красным шрифтом (можно ограничиться и каким-то одним, но лучше перестраховаться). Интересующая нас информация об обнаруженном вирусе содержится в предпоследней строке. Ну и в самом конце выводится информация о том, что работа сценария идёт от имени пользователя mailnull, так что теперь можно ужесточить права на каталог /var/scripts/maildigest.
Вопросы доставки Как видите, сообщение мы получаем в том виде, в каком оно будет в дальнейшем помещено в почтовый ящик пользователя. Обработать его проблем не составит – задействуем модуль rfc822, содержащий методы для разбора заголовков. А вот о чём придётся подумать, так это о том, как положить «транзитное» письмо в ящик пользователю. Можно, конечно, воспользоваться протоколом SMTP, но при наличии уже сформированного сообщения формировать его заново выглядит не очень разумным. К тому же есть риск зациклить обработку письма. Попробуем воспользоваться услугами локального агента доставки (LDA). Хорошо бы просто отдавать сообщение на вход mail.local (LDA, используемый во FreeBSD по умолчанию). Здесь мы упираемся в то, что для выполнения своей работы mail.local должен запускаться с правами пользователя root. Обойти это можно, установив на mail.local бит suid, однако поскольку такие права нужны нам для решения частной задачи, то более правильно будет создать копию агента доставки с нужными правами, а оригинальный файл не трогать: # cd /usr/local/scripts/maildigest/ # cp /usr/libexec/mail.local mail.local.suid # chmod 4555 mail.local.suid
Проведём ещё один эксперимент: Листинг 2. Второй эксперимент #!/usr/local/bin/python import os prefix_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))
Напомню, что все тестовые сценарии мы сохраняем под именем maildigest.py, чтобы не вносить каждый раз изменения в /etc/mail/aliases. Здесь с помощью той же функции popen() создается канал с утилитой mail.local.suid, на вход которой передается текст сообщения, сохранённого в файле в результате предыдущего эксперимента. Пользователя-получателя указываем явно (admin). В принципе этот сценарий можно выполнить и непосредственно из командной строки, но лучше использовать тот же способ запуска через aliases, чтобы лишний раз убедиться в отсутствии проблем с правами доступа и переменными окружения. Отправив тестовое сообщение на postmaster, убеждаемся, что доставка выполняется нормально, естественно,
40
при условии, что запускался предыдущий тест, в результате которого должен был сформироваться файл, который в данном случае и используется. Значит, так и будем поступать в дальнейшем.
Сбор статистики и формирование «дайджеста» Информация об обнаруженном вирусе (его название) содержится в последней строчке уведомления (если быть точнее, то в предпоследней, а последняя – пустая). Если эту строку разбить по пробелам, то нужное нам имя получим во втором поле. Учитывая, что на моём сервере больших нагрузок не предвидится, для хранения результата я выбрал формат DBM. В стандартную поставку Python включён модуль anydbm, который самостоятельно определяет, какая именно реализация DBM используется в вашей системе, так что об этом нам заботиться не придётся. Данные в этом формате хранятся в виде пар «имя – значение». Единственный его недостаток в нашем случае – это то, что он позволяет хранить только текстовые данные, т.е. придётся в процессе работы выполнять преобразования сохранённого значения, отражающего количество обнаруженных вирусов данного типа, из строки в число и обратно. Для удобства будем хранить информацию посуточно, для чего имя db-файла будет формироваться с учётом текущей даты (см. код сценария ниже). Наконец, при смене даты нам нужно будет формировать и отправлять сводный отчёт за прошедшие сутки. Поскольку отчёт предназначается локальному пользователю, то проще всего будет сформировать «вручную» сообщение с нужными заголовками и воспользоваться тем же LDA для его доставки.
Реализация Итак, приступим к разработке сценария. Чтобы сохранить целостность восприятия, полностью приведу прокомментированный текст скрипта, а ниже дам некоторые пояснения. Листинг 3. Сценарий maildigest.py #!/usr/local/bin/python # -*- coding: koi8-r -*# Импортирование нужных модулей import os, sys, rfc822, anydbm from StringIO import StringIO from 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): # Здесь ошибку не проверяем, поскольку всё равно # работу сценария придётся прерывать
программирование lda = os.popen(lda_command, 'w').write # Формируем необходимые заголовки lda('From: maildigest\r\n') lda('To: admin@mydomain.ru\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)
Рисунок 1. Примерно так выглядят формируемые отчёты
ную активность на почтовом сервере за истекшие сутки (см. рис. 1).
Нет предела фантазии
Насладившись работой нашего сценария, поразмышляем о том, что ещё полезного можно сделать подобным способом. Во-первых, можно реализовать автоматический разбор входящей почты (когда сообщения со словом «Договор» в теме направляются в абонентский отдел, а со словом «Счёт» – в бухгалтерию). Заодно можно организовать функцию автоматического ответа, когда отправитель сообщения будет получать уведомление, что его письмо получено и передано на обработку Иванову Ивану Ивановичу (ещё одно последствие борьбы со спамом, когда приходится подтверждать доставку почти каждого важного письма, чтобы убедиться, что оно не попало под «жернов» одного из фильтров). # Если в 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) этот механизм для создания учётных записей и перезагНа всякий случай напомню, что блоки кода в Python за- рузки сервера!). Наконец, можно пропускать входящую корреспондендаются с помощью отступов. В принципе всё должно быть понятно. Пояснения требует разве что использование пе- цию через собственные фильтры или собирать ту или иную ременной lda в функции send_digest(). В первой строке статистику. В общем, полёт вашей фантазии ничем не огмы присваиваем этой переменной ссылку на метод write(), раничен. который применяется к каналу, созданному для команды, определённой в lda_command. В дальнейшем мы можем использовать функцию lda() как замену конструкции os.popen(lda_command, 'w').write(). Ещё следует указать, что скобки позволяют обойти жёсткие требования соблюдать отступ, чем мы и воспользовались в трехстрочной конструкции if, где мы проверяем наличие в письме нужных нам заголовков. Теперь вместо десятков уведомлений администратор будет получать одно письмо в день, отражающее вирус-
№2, февраль 2006
41
программирование
Замыкания в Perl
Алексей Мичурин Замыкания являются одной из тех особенностей Perl, которые редко встретишь в других языках программирования. Да и программисты на Perl зачастую не вдаются в такие дебри. Напрасно. Вы можете не иметь прав и автомобиля, не желать стоять в пробках, но правила дорожного движения должен знать каждый. Точно так же, даже если вы не используете замыканий, знать о них весьма полезно.
Суть замыканий но с ошибками в интерпретаторе Perl. Суть замыканий состоит в том, что па- Больше того, мы скоро убедимся в том, мять, занятая под временные пере- что интерпретатор «знает» о возникменные, не освобождается дольше, шем замыкании и может уведомить чем соответствующие переменные ос- вас, если вы того хотите. Почему же память освобождаеттаются доступны. Сразу скажу, что возникновение замыканий никак не связа- ся не сразу после исчезновения пере42
менной? Чтобы ответить на этот вопрос, надо сказать пару слов о системе сборки мусора, которой оснащён Perl. Он автоматически освобождает фрагменты памяти, на которые нет ссылок. Переменная может исчезнуть, но ссылка может остаться, тогда Perl не осво-
программирование бодит память до тех пор, пока не исчезнет последняя ссылка. Эта система работы со ссылками противоположна C-подходу, где ссылка хранится независимо от соответствующего фрагмента памяти. Поэтому в небрежно написанных программах на C случается, что ссылка указывает на фрагмент памяти, который уже возвращён системе. Попытка обратиться к информации по этой ссылке всегда приводит к серьёзным сбоям в работе программы. Perl устроен иначе. В нём не может существовать неправильной ссылки, но за это приходится платить неосвобождённой памятью. Давайте проиллюстрируем сказанное простым примером: 1: #!/usr/bin/perl 2: 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
ние 1, осталась нетронутой, как и само значение. Подобная сит уация возникает и при замыкании: временной переменной уже нет, но память не освобождена. Однако замыканиями принято называть более узкий круг «явлений». К ним нас приближает следующий пример: 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();
Суть того, что мы сделали, состоит в следующем. Мы создали блок (строки 2-9) и в нём определили локальную переменную $t. В этом же блоке создана функция f, которая использует переменную $t. Функция может изменять значение переменной $t (если вызвать её с аргументом) и печатает информацию об этой переменной (адрес и значение). Далее мы вызываем функцию f в строках 10-12, то есть за пределами блока, в котором существовала переменная $t. Сможет ли функция f нормально работать, ведь, казалось бы, переменной $t уже нет? Давайте посмотрим на результат работы этой программы:
Выполнение программы начинается с вызова функции f в седьмой строке. В теле функции создаётся временная переменная $v, печатается её адрес и значение. Функция возвращает указатель на переменную $v и завер$t=10 \$t=SCALAR(0x8057ae4) шает работу. После этого переменная f: $t=10 \$t=SCALAR(0x8057ae4) f: $t=20 \$t=SCALAR(0x8057ae4) $v пропадает. Но корректней было бы f: $t=20 \$t=SCALAR(0x8057ae4) сказать не «переменная пропадает», а «имя становится недоступно». ПотоКак видите, несмотря на то, что за му что значение переменной $v по-пре- пределами блока (строки 10-12) пежнему хранится в памяти. Мы больше ременная $t исчезла и явных ссылок не можем обратиться к этому значе- на неё не осталось, память не освобонию по имени $v, но указатель на эту дилась, а значение сохранилось. Чтообласть памяти присвоен переменной бы убедиться, что с этой памятью мож$a, он существует, а значит Perl не ос- но работать, мы поменяли хранящееся вободит память, занятую ранее пере- в ней значение с 10 на 20. Внимательный читатель уже замеменной $v. Чтобы окончательно убедиться тил сходство этого примера с предыв этом, напечатаем значения пере- дущим. Там память, выделенная под менной $a и разименуем этот указа- локальную переменную, не освобожтель в строке 8. Сравните первую и вто- далась потому, что за пределами обрую строки вывода программы. Пер- ласти видимости переменной сохравая напечатана, когда переменная $v нялись ссылки на эту область памяти. ещё существовала. Вторая – когда пе- Теперь память не освобождается потоременной $v уже не было. Но, как ви- му, что сохраняются функции, испольдите, память, выделенная под значе- зующие эту область памяти.
№2, февраль 2006
Если вы поняли, как и почему работает этот пример, то взгляните на образчик классического замыкания: 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();
По сути, этот пример очень похож на предыдущий. Блок операторов теперь стал телом функции gen. Вместо переменной $t в нём созданы две локальные переменные $name и $count. Внутри же создаётся не именованная функция, как это было в предыдущем примере (там мы создавали функцию f), а анонимная функция, указатель на которую мы возвращаем как результат работы функции gen. Эта «вложенная» функция, как и в предыдущем примере, использует локальные переменные, которые были объявлены вне её тела и которые будут не видны в основной программе – за пределами функции gen. Таким образом, суть выполняемых операций не изменилась. Единственное принципиальное отличие состоит в том, что раньше наш блок выполнялся только единожды, а теперь мы можем вызывать функцию gen многократно. Фактически функция gen является генератором функций. Больше того, генерируемые функции используют переменные, которые локальны для gen, но не для самих этих функций. Поэтому переменные $name и $count не исчезают бесследно после окончания работы функции gen – они сохранятся интерпретатором Perl для дальнейшего использования. Как вы понимаете, эти переменные сохранят свои значения и между вызовами полученных анонимных функций. Так что же делает этот код? В строке 6 мы вызываем генератор. Внутри функции gen инициализируются две локальные переменные $name (значением CntA) и $count (значением 10). Там же создаётся анонимная функциясчётчик, использующая эти переменные, указатель на неё возвращается и присваивается переменной $a. Пос-
43
программирование ле окончания работы gen имена $name и $count исчезают. В строке 7 мы вызываем генератор повторно. Внутри функции снова создаются две локальные переменные. Обратите внимание, они создаются заново и память для них отводится новая(!). Им присваиваются соответствующие значения ($name='CntB', $count=20), создаётся новая анонимная функция, которая будет использовать уже эти новые значения, указатель на функцию возвращается, а gen завершает работу, и имена $name и $count снова уходят в небытие. В результате вызовов полученных функций в строках 8-12 мы видим следующий вывод: CntA: CntA: CntB: CntB: CntA:
10 11 20 21 12
Мы получили два независимых счётчика, инициализированных разными значениями. Надеюсь, что с переменными неожиданностей уже нет. Мы уже рассмотрели достаточно примеров. Давайте теперь изучим более тонкий вопрос: когда и как создаётся новая функция.
Специфика анонимных и именованных функций Для начала рассмотрим пример, в котором нет замыканий, но он для нас тоже будет интересен: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
#!/usr/bin/perl sub gen { my $v=shift; return sub {print "ok.\n"} } my $a=gen(1); my $b=gen(2); print ($a."\n"); &$a(); print ($b."\n"); &$b();
Здесь вложенная функция не содержит ссылок на локальные переменные. Но мы вызываем функцию gen дважды, и дважды же создаём анонимную функцию. Будут ли созданы две абсолютно одинаковые анонимные функции? Взгляните на вывод: CODE(0x8057bbc) ok. CODE(0x8057bbc) ok.
44
Perl не настолько «прост», он не стал создавать две одинаковые функции, он дважды вернул ссылки на один и тот же код. Локальная переменная $v в этом примере создана только для того, чтобы лучше читалась преемственность этого и других примеров. Теперь чуть изменим этот пример. Пусть анонимная функция будет использовать локальную переменную: 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();
ли. Просто раньше мы сразу возвращали указатель на функцию, а теперь мы сперва создаём функцию t (строка 5), а потом возвращаем указатель (строка 6). Но это «незначительное» изменение коренным образом изменит результат: gen: \$v=SCALAR(0x8057b2c) $v=1 gen: \$v=SCALAR(0x805728c) $v=2 CODE(0x8057bc8) 1 ok. CODE(0x8057bc8) 1 ok.
Как видите, функция t была создана только при первом вызове gen. При повторном вызове функция t не была ни клонирована, ни изменена. Любопытное поведение? Мы ещё вернёмся к рассмотрению этого случая, а пока сделаем вывод, что замыкание сопровождается рождением новой функции только при создании аноМы получили классическое замы- нимных функций – только во втором из рассмотренных примеров. кание: Обратите также внимание на разgen: \$v=SCALAR(0x8057b2c) $v=1 ницу в «поведении» функций и переgen: \$v=SCALAR(0x8057d18) $v=2 менных, вызванную тем, что функция CODE(0x805716c) 1 ok. всегда глобальна, а все наши переменCODE(0x8057d0c) ные локальны. (Кстати, сейчас широ2 ok. ко обсуждается возможность создания При двух вызовах gen дважды бы- локальных функций; так что, возможно, ла создана локальная переменная $v; в шестой версии Perl мы сможем напикаждый раз новая в новой области па- сать что-то вроде my sub f {...}.) мяти, о чём свидетельствуют первые две строки вывода программы. И дваж- Нежелательные ды родилась новая функция. Как види- последствия замыканий те, и поведение, и адреса двух получен- Сперва скажу несколько слов о том, ных анонимных функций отличаются. когда же замыкания могут возникнуть Собственно, такой пример мы уже ви- без вашего ведома, «сами». Действительно, большинство продели в предыдущем разделе, но здесь я хотел подчеркнуть, что мы получили граммистов скажут, что, находясь именно две разные функции. в здравом уме, они не будут размещать Давайте рассмотрим, что будет, ес- функцию в теле другой функции. Смею ли генератор будет создавать имено- уверить: это могут сделать за вас. Существует множество задач, треванную функцию. Ещё чуть-чуть изменим пример: бующих, чтобы Perl-код компилировался только один раз, но мог выполняться 1: #!/usr/bin/perl многократно. Эта возможность будора2: sub gen { жит умы Perl-программистов, наверное, 3: my $v=shift; 4: print 'gen: ↵ с первых дней появления Perl. Самая из\$v='.\$v.' $v='.$v."\n"; вестная среда, в которой реализован 5: sub t {print "$v ok.\n"} 6: return \&t; такой подход – mod_perl. (В этой статье 7: } я буду говорить о mod_perl, имея в виду, 8: my $a=gen(1); 9: my $b=gen(2); в основном, только один его компонент – 10: print $a."\n"; Apache::Registry, который широко при11: &$a(); 12: print $b."\n"; меняется для переноса обычных CGI13: &$b(); скриптов в mod_perl-окружение.) Там Может показаться, что никаких при- скорость выполнения CGI-приложений нципиальных изменений мы не сдела- увеличивается многократно, благодаря
программирование тому, что эти приложения компилируются только один раз. Подобные приёмы используются при «кэшировании» некоторых частей кода, содержащих, например, много регулярных выражений, заданных переменными. Известно, что компиляция регулярных выражений – достаточно ресурсоёмкая задача. Как же реализуется подобное одноразовое компилирование и многократные запуски? В большинстве случаев – очень просто: тело программы включается внутрь некой функции, которая потом может вызываться многократно, естественно, без повторной компиляции, выполняя всё, что должна была делать программа. Поясню на примере. Допустим, у вас есть программа: 1: #!/usr/bin/perl 2: print "ok.\n";
«Кэшировать» её можно следующим образом: 1: 2: 3: 4: 5: 6: 7:
#!/usr/bin/perl sub run { #!/usr/bin/perl print "ok.\n"; } # далее, сколько угодно # вызовов функции run
1: #!/usr/bin/perl 2: 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
По три строчки от каждого из двух вызовов. Но давайте представим, что эта программа оказалась в контексте, аналогичном тому, который создаёт mod_perl: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
#!/usr/bin/perl sub run { my $c=1; sub incr ↵ { print('$c='.$c++."\n") } incr(); incr(); incr(); } print "step 1:\n"; run(); print "step 2:\n"; run();
Подобный подход обладает масСправедливости ради следует отсой известных ограничений. Например, в программах нельзя использовать метить, что здесь я несколько упростил конструкции __END__ и __DATA__, ситуацию. В реальной жизни приходитвызывать функции типа exit, осторож- ся избегать конфликтов имён, поэтоно надо обращаться с глобальными му вместо простой функции в mod_perl, переменными $^T, %ENV, $/ и прочи- точнее в модуле Apache::Registry, исми, не злоупотреблять модификато- пользуются методы, разнесённые ром /o в регулярных выражениях, ак- в разные пространства имён – как бы куратно работать с файлами... Многие в разные модули. Теперь мы компилируем нашу «оплошности», вполне простительные в обычных условиях, способны вызвать программу единожды, а выполняем, странные ошибки при работе програм- как и ранее, дважды. Какой же резульмы в mod_perl-образном контексте. тат нас ожидает? Неподготовленного Но больше всего недоразумений вы- человека он может обескуражить: зывают замыкания. step 1: Почему-то о замыканиях чаще все$c=1 $c=2 го вспоминают, когда говорят об утеч$c=3 ках памяти. На самом деле в больstep 2: шинстве случаев замыкания вызыва$c=4 $c=5 ют не утечки памяти, а просто пере$c=6 расход памяти. Ес ли вы тоже обес к ура жены, На мой взгляд, основные проблемы возникают из-за замыканий в имено- то вернитесь к концу предыдущего ванных функциях. С них мы и начнём раздела и сравните этот код с прирассмотрение проблем. мером, который мы обсуждали там. Взгляните на следующую про- По сути мы имеем одно и то же. Здесь функция incr тоже будет создана тольграмму:
№2, февраль 2006
ко при первом запуске run. При повторном вызове run, incr никак не изменится, Perl, фактически, просто проигнорирует строку 4. Это, наверное, самые неприятные сюрпризы, возникающие из-за замыканий. С точки зрения Perl, никаких ошибок и нет, поэтому Perl просто выполняет то, что написано. Ни опция -w, ни прагма strict не помогут вам обнаружить эту ошибку. Однако Perl имеет средства, позволяющие это сделать. Их мы ещё рассмотрим. А сейчас давайте вернёмся к утечкам памяти. Perl достаточно «умён», чтобы не допустить никаких утечек. Если ссылка на функцию пропадает, то Perl удалит из памяти не только код, но и все переменные, замкнутые на него. В следующем примере никаких утечек не будет: 1: 2: 3: 4: 5: 6: 7: 8:
#!/usr/bin/perl sub a { my $v=0; sub b { $v=1 } } while (1) {a}
Несмотря на то, что мы вызываем генератор a бесконечно много раз, никакой утечки не происходит, ведь мы не храним бесконечно много анонимных функций, которые получаются в результате его работы. Не будет утечки в следующем примере: 1: 2: 3: 4: 5: 6: 7: 8:
#!/usr/bin/perl sub a { my $v=0; return sub { $v=1 } } while (1) { my $f=a() }
Здесь мы сохраняем указатель на анонимную функцию, но в локальной переменной. Как только переменная исчезает – уничтожается и функция со всеми её замыканиями. Если вы не используете анонимных функций, то любая ваша функция будет компилироваться только один раз, в любом случае – утечки просто невозможны. Можно, конечно, обеспечить утечку памяти, но это происходит только в совсем экзотических ситуациях. Вот пример:
45
программирование 1: #!/usr/bin/perl 2: sub a ↵ { my $v; $v = sub { $v = 1 } } 3: a() while (1);
ную в последнем примере, трудно назвать распространённой.
Диагностика замыканий
my $a=0; sub incr { my $v=shift; $$v++; } incr \$a;
Здесь мы замыкаем переменную Как мы видели только что, наиболее Этот пример можно сделать более $v и ей же присваиваем ссылку на за- неожиданные и неприятные эффекмыкающую функцию. То есть, пока су- ты вызывают замыкания в именован- изящным, если использовать прототиществует функция, будет существо- ных функциях. Именно такие замы- пы функций: вать и переменная (как обычно: бу- кания позволяет отследить прагма my $a=0; дет существовать не имя переменной, diagnostics. Я бы советовал обязательsub incr (\$) { # <- прототип а значение). Но пока будет существо- но добавлять строку: my $v=shift; $$v++; вать переменная, не исчезнет и функ} use diagnostics; ция. Таким образом сама функция явincr $a; # <- слэш больше # не нужен ляется гарантом своего вечного существования. во все скрипты, которые могут запусМожно непосредственно рабоЕсли вы запустите эту программу, каться через mod_perl или другой кэто уже через несколько минут (или да- ширующий механизм. Кстати, если вы тать с элементами массива аргуменже секунд) почувствуете острую не- компилируете mod_perl самостоятель- тов @_. Это тоже позволяет изменить хватку памяти. но, очень рекомендую задать опцию «внешние» переменные: Только в последнем примере мы «PERL_DEBUG=1», тогда вся диагносmy $a=0; получили полноценную утечку памя- тическая информация будет выдаватьsub incr { ти. Возможна ли такая патологичес- ся и без прагмы diagnostics. $_[0]++; } При вк лючённой диагнос тике кая ситуация в реальной жизни? В реincr $a; зультате ошибки – конечно. При орга- и при замыкании в именованной функВсе эти приёмы позволяют полнизации рекурсий – возможно. Но ес- ции Perl выдаёт весьма развёрнутое ли рекурсия организована правильно объяснение ситуации (рис. 1). ностью отказаться от использования Если вы возьмёте на себя труд пе- внешних переменных в теле функций. и вовремя останавливается, то и подобная ситуация не возникнет. ревести это послание, то обнаружите, Это наиболее предпочтительная доПонятно, что такого рода утечки мо- что в нём просто кратко изложены ос- ктрина разработки. Если же от работы с глобальными гут быть вызваны и более сложными новные мысли этой статьи. переменными отказаться нельзя (трудсвязями. Например, в функции может использоваться хэш, в одном из эле- Как избежать замыканий но? лениво?), то можно использовать ментов которого хранится ссылка на Самый простой способ – не использо- не my-переменные, а our-переменные. массив, в котором хранится ссылка на вать в функциях глобальных перемен- Давайте чуть модифицируем наш прифункцию. Могут возникать ситуации, ных. Это не только навсегда избавит мер, имитирующий работу в mod_perlкогда набор функций A обеспечивает вас от замыканий, но и сделает ваш контексте: сохранность функций B, а те, в свою код более читабельным и красивым. 1: #!/usr/bin/perl очередь, отвечают взаимностью. ФанЕсли вы хотите изменить в те2: sub run { тазировать можно бесконечно, но суть ле функции значение «внешней» пе3: our $c=1; # <-- my заменено # на our везде остаётся одной и той же. ременной, то можете воспользовать4: sub incr ↵ Тем не менее я бы не стал преувели- ся одним из множества средств, пре{ print('$c='.$c++."\n") } 5: incr(); чивать опасность утечек памяти из-за доставляемых Perl. Можно передать 6: incr(); замыканий. Конструкцию, приведён- ссылку на внешнюю переменную: 7: incr(); 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 выдаёт весьма развёрнутое объяснение ситуации
46
8: 9: 10: 11: 12:
} print "step 1:\n"; run(); print "step 2:\n"; run();
Теперь он будет выдавать «правильный» результат: step 1: $c=1 $c=2 $c=3 step 2: $c=1 $c=2 $c=3
Аналогичного эффекта можно достичь, если использовать простые глобальные переменные:
программирование 3: $c=1;
# <-- это уже не # my-переменная
Но широкое использование глобальных переменных никогда не приветствуется. Можно использовать глобальные переменные с указанием полных имён: 3: $main::c=1;
Но только в том случае, если вы очень хорошо понимаете, что делаете. Например, если использовать подобный подход совместно с mod_perl, то вы, скорее всего, получите очень странные и неприятные ошибки. Дело в том, что mod_perl кэширует много сценариев. Для каждого он организует отдельное пространство имён. Поэтому конфликтов глобальных переменных не происходит. Но если вы принудительно разместите переменные в определённом пространстве имён, то можете получить конфликты, вызывающие самые неожиданные эффекты.
Использование замыканий Надеюсь, что читатель уже не считает замыкания недоработкой Perl. Они так же логичны, как «самооживление» переменных (autovivification) и другие механизмы Perl. Но можно ли использовать замыкания для своей пользы? Конечно! Вы уже видели, что замыкания позволяют генерировать функции, варьируя некоторые аспекты работы этих функций. Причём перекомпиляция кода при этом фактически не происходит; то есть новые функции создаются практически мгновенно. Поэтому замыкания с успехом применяются для создания множества обработчиков событий при программировании приложений, основанных на событиях. Например, вы можете разработать библиотеку для создания графического пользовательского интерфейса. Каждому новому элементу «флажок» будет отвечать собственная функцияобработчик. Эти функции должны быть схожи, но допускать некоторые отличия (цвет, форма, начальное положение и прочее). Здесь уместно применить замыкания. Проиллюстрируем сказанное:
№2, февраль 2006
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;
Результат работы этого кода, естественно, будет точно таким же, как и предыдущего. Обратите внимание, строки 5 и 6 должны обязательно заканчиваться точкой с запятой (довольно редкая ситуация: после закрывающей фигурной скобки обязательно требуется точка с запятой). Заметьте также, что создаваемые функции должны быть строго анонимны. Если вы внесёте в код следующие изменения, то он будет работать инаЗдесь функция new создаёт две че и, скорее всего, не так, как вы ожианонимные функции: первая – увели- даете. чивает счётчик, вторая – печатает зна... чение счётчика. 5: sub incr {$c+=$step}; Каждая создаваемая пара функ6: sub prnt {print ↵ "count=$c (step=$step)\n"}; ций отличается шагом счётчика ($step), 7: return {'incr' => \&incr, ↵ который задаётся как аргумент «конс'print' => \&prnt} ... труктора» new при создании нового счётчика. Все создаваемые счётчиЧитатель, конечно, спросит: «А поки, естественно, работают независимо друг от друга. чему бы нам не использовать просто Мы создаём две пары функций (два ОО подход вместо замыканий?» Посчётчика; строки 8, 9). Печатаем зна- жалуйста! Но всем известно, что пока чения счётчиков (строки 10, 11). По два объекты в Perl достаточно неповоротраза для каждого счётчика делаем ин- ливы. Мой опыт показывает, что в некремент (строки 12-15). И снова полу- которых ситуациях замыкания позвочаем значения счётчиков. ляют иногда получить выигрыш в бысЗапустив программу, можно убе- тродействии в полтора-два раза. Этот выигрыш становится особенно замедиться, что всё работает правильно: тен, если методы выполняют короткие count=0 (step=1) и простые операции. count=0 (step=100) count=2 (step=1) Тех, кто сейчас скажет: «Ну уж я count=200 (step=100) никогда не буду использовать в своих Этому коду можно придать и более программах таких изысков», я спешу заверить, что большинство програмобъектно-ориентированный вид: мистов на Perl постоянно использу1: #!/usr/bin/perl ют замыкания, так как многие модули 2: sub new { используют это средство. Достаточно 3: my $step=shift; 4: my $c=0; сказать, что замыкания есть в модуле 5: my $incr=sub {$c+=$step}; DBI, который широко применяется при 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}->(); может быть использован и в mod_perl16: $c2->{incr}->(); 17: $c1->{print}->(); контексте. 18: $c2->{print}->(); Кстати, замыкания часто используЗдесь функция new возвраща- ют как раз, чтобы избежать ситуаций, ет не две функции, а хэш, состоя- чреватых «неожиданными» замыкащий из пары функций, которые нам ниями. Поэтому замыкания встречауже хорошо знакомы. То есть мы со- ются в модулях и программах на Perl здаём не набор разрозненных мето- гораздо чаще, чем может показаться на первый взгляд. дов, а единый «объект».
47
безопасность
Можно ли защититься от переполнения буферов?
Умные в споре ищут истину, глупцы – выясняют, кто умнее. Народное
Крис Касперски На рынке имеется множество средств как коммерческих, так и бесплатных, обещающих решить проблему переполняющихся буферов раз и навсегда, но хакеры ломают широко разрекламированные защитные комплексы один за другим. Почему? Давайте заглянем под капот Stack-Guard, Stack-Shield, Pro-Police и Microsoft Visual Studio .NET, сравнив заявленные возможности с реальными.
О
шибки переполнения вездесущи – это факт. Буквально каждые несколько дней обнаруживается новая дыра, а сколько дыр остаются необнаруженными – приходится только гадать. Как с ними борются? Арсенал имеющихся средств довольно разнообразен и простирается от аппаратных защит типа NX/XD-битов до статических анализаторов наподобие Spilnt. В последнее время в обиход вошел термин «secure programming» и издано множество книг по безопасности, настоятельно рекомендующих использовать динамические средства защиты типа Stack-Guard, внедряющие в компилируемую программу дополнительный код, проверяю-
48
щий целостность адреса возврата пе- мок), и не в окно (там – сигнализация), ред выходом из функции и предпри- а проникает через никем не охраняенимающий другие действия, затруд- мую вентиляционную/канализационняющие атаку. ную трубу или даже дымоход. Расплатой за «безопасность» стаВсе защитные механизмы, имеюновятся снижение производительнос- щиеся на рынке, спроектированы так, ти (впрочем, довольно незначитель- что дрожь берет. Сразу видно, что их ное) и необходимость перекомпиля- создатели никогда не атаковали чуции всего кода. Но это только внешняя жие системы, не писали shell-код и дасторона проблемы. Понадеявшись на же не общались с теми, кто всем этим широко разрекламированные защит- занимается. Защита не только не останые средства, разработчики расслаб- навливает атакующего, но в некоторых ляются и… начинают строчить не- случаях даже упрощает атаку! брежный код, который Stack-Guard (Stack-Shield/Pro-Police) все равно «ис- Типы переполнения правит». Но что именно он правит? и типы защит Давайте задвинем рекламу в сторону Существует множество типов ошибок и посмотрим на защиту глазами хаке- переполнения, подробно рассмотренра, который ломится не в дверь (там за- ных в статье [1]. Это:
безопасность переполнение кучи (работающее как оператор POKE – запись значения в указанную ячейку памяти); целочисленное переполнение, ошибки форматированного вывода (PEEK – чтение содержимого произвольной ячейки памяти) POKE в одном лице); переполнение локальных стековых буферов.
Листинг 1. Демонстрационная программа с переполняющимся буфером, которую мы будем защищать // дочерняя функция f(char *msg) { // объявляем локальные переменные int a; char buf[0x66]; // копируем аргумент в буфер без контроля длины,
// что на определенном этапе приводит к его переполнению Стековое переполнение – не только не единственное, a = *strcpy(buf, msg); но даже не самое популярное. Оператор new языка Си++ // выходим из функции размещает переменные в динамической памяти, поэтоreturn a; } му актуальность атак на кучу все растет, а к стеку интерес снижается. Ложка дорога к обеду. После драки кулаками // материнская функция int main(int argv, char **argc) не машут. Защитники стека явно опоздали и теперь подта{ совывают факты и разводят рекламу. int x; x = f(argc[1]); } Вот цитата из документации на Stack-Guard: «…emits programs hardened against «stack smashing» attacks. Stack Откомпилируем файл компилятором gcc с настройками 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 за- ченный elf в дизассемблер, чтобы посмотреть, как выглякаляет программы против срыва стека – наиболее попу- дит стандартный пролог/эпилог функции f(). лярного типа удаленных атак. Программы, откомпилироЛистинг 2. Дизассемблерный листинг исходной функции f ванные со Stack-Guard приобретают крепкий иммунитет с моими комментариями против этого»). function_prologue: На самом деле Stack-Guard всего лишь затрудняет под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]
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 ее защитить.
№2, февраль 2006
function_epilogue: leave ; // mov esp, ebp/pop ebp retn ; // выходим в материнскую функцию
Содержимое стека на момент вызова f() представляет конгломерат локальных переменных и служебных данных. На вершине стека лежит буфер, под ним располагается целочисленная переменная «a» (на самом деле порядок размещения переменных не стандартизован и целиком зависит от воли компилятора, то есть может быть любым). За локальными переменными следует сохраненный регистр указателя кадра стека (в x86 процессорах его роль обычно играет EBP), а за ним – адрес возврата и аргументы, переданные функции. Короче говоря, все это выглядит так: Листинг 3. Состояние стека на момент вызова функции f [ [
buf a
] ; <-- переполняющийся буфер ] ; <-- прочие локальные переменные
49
безопасность [ [ [ [ [ [
ebp retaddr arg 1 -------------------------
] ] ] ] ] ]
; ; ; ; ; ;
<-<-<-<-<-<--
сохраненный указатель кадра адрес возврата в материнскую функцию аргументы, переданные функции \ +- кадр стека материнской функции /
Переполняющийся буфер может воздействовать на следующие объекты: локальные переменные, расположенные ниже его; сохраненный указатель кадра стека; адрес возврата; аргументы, переданные функции; на кадр материнской функции. Все эти атаки подробно описаны в моей статье [1], поэтому не будем повторяться, а лучше пропустим программу через Stack-Guard 1.0 и посмотрим, что это даст. Листинг 4. Дизассемблерный листинг функции f(), защищенной Stack-Guard (добавленные защитой строки выделены красным шрифтом) function_prologue: ; // забрасываем canary word на стек ; // (следовало это делать после сохранение ebp) push 000AFF0Dh ; // сохраняем старый указатель кадра в стеке push ebp mov ebp, esp ; // открываем новый кадр ; // резервируем место под локальные переменные sub esp, 98h ; // тело функции (точно такое же, как и в прошлый раз) function_epilogue:
50
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 -------------------------
] ] ] ] ] ] ] ] ]
После защиты Stack-Guard перед адресом возврата располагается константа 000AFF0Dh (в терминологии Stack-Guard – canary word), целостность которой проверяется перед выходом из функции. Суть в том, что комбинацию символов, слагающих canary word – \x00\x0A\xFF\x0D, очень трудно «воспроизвести» с помощью строковых функций, поскольку в языке Си символ нуля трактуется как «конец строки». Функция gets – одна из тех немногих, что обрабатывает ноль как обыкновенный символ, поскольку в качестве завершителя строки использует символ «возврата каретки».
безопасность При работе с ASCIIZ-строками «подделать» canary word невозможно! Адрес возврата можно считать надежно защищенным. Ведь чтобы «дотянуться» до него, переполняющемуся буферу необходимо пересечь (и затереть) canary word! Разработчики торжествуют, а хакеры стреляются. Или… все-таки нет? Начнем с того, что на Unicode все эти ограничения не распространяются и canary word подделывается без труда (кстати говоря, пилотная версия Stack-Guard в качестве Рисунок 1. Адрес возврата по XOR случайным canary сторожевого слова использовала 00000000h, что в Unicode В версии 2.0 защита адреса возврата была как бы усиуже не воспроизводится, но может быть введено с помощью функции gets, которая сегодня практически никем и нигде лена – в нем появился случайный canary word, хранящийся не используется). К тому же приложения, обрабатывающие в read-only памяти и «шифрующий» адрес возврата по XOR. двоичные данные функциями типа memcpy, также остают- Угадать 32-битный canary word – нереально, но это и не нужно! Достаточно подсунуть заведомо ложное значение. Тогся беззащитными. Локальные переменные и указатель кадра стека во- да, убедившись, что стек переполнен и хакеры хакерствуобще никак не защищены и могут быть беспрепятствен- ют, как крысы в амбаре, Stack-Guard передаст управление но атакованы. Если среди этих переменных присутству- функции __canary_death_handler, которая завершает выет хотя бы один указатель на функцию, вызываемую пос- полнение программы, устраивая настоящий DoS. Но лучле переполнения, хакер сможет подменить его адрес, пе- ше DoS, чем захват управления! Весь фокус в том, что указатель на __canary_death_handler редавая управление на свой shell-код. Конструкция типа «int *x; int a; … x = a;», которая к числу экзотических никак размещается в глобальной таблице смещений – GOT и моне относится, позволяет атакующему модифицировать лю- жет быть атакован путем воздействия на локальные перебые указатели на функции, в том числе и адрес возврата, менные через уязвимый указатель кадра стека. Если таи защита canary word уже не срабатывает, поскольку сто- кие переменные действительно есть (а куда бы они подеварожевое слово остается в неприкосновенности. Образно лись?), хакер просто перенаправляет __canary_death_handler говоря, это как положить «перед шматком сала грозный на свой shell-код! В последующих версиях Stack-Guard canary world «перекапкан». Тот, кто идет напрямую (классическое последовательное переполнение), попадет в него прежде, чем ус- ехал» на одну позицию вверх, взяв под свою защиту и укапеет полакомиться. Но если десантироваться прямо на са- затель кадра, однако дальнейшего развития проект не поло путем воздействия на переменные-указатели – капкан лучил и постепенно сдулся. отдыхает (правда, в этом случае необходимо знать точное положение вершины стека на момент атаки, что не всегда Microsoft Visual Studio .NET возможно, поэтому хакеры предпочитают модифицировать Озабоченная последними хакерскими атаками, Microsoft реализовала в своем новом компиляторе Visual Studio .NET таблицу импорта в Windows, а в UNIX – секцию got). Рассмотрим самый сложный случай, когда никаких пе- (бывший Visual C++) некоторую разновидность Stack-Guard ременных в нашем распоряжении нет, а есть только сохра- в далеко не лучшей его «инаугурации». Никогда не разненный регистр кадра стека, который мы и будем атаковать. рабатывающая собственных продуктов, а только «воруФатальной ошибкой Stack-Guard явилось то, что он не учел ющая» уже готовые (авторитетный товарищ Берзуков «побочных эффектов» инструкции leave, которая работает в своей софт-панораме об этом только и говорит, сходите так: «mov esp, ebp/pop ebp», позволяя хакеру воздейство- на www.softpanorama.org/Bulletin/News/Archive/news078.txt, вать на кадр материнской функции. Если в каком-то месте почитайте – там много интересного), Microsoft, как это часстека или кучи атакующему удастся «сложить» конструкцию то и бывает, сама не поняла, что стащила и у кого. Ладно, «000AFF0Dh &shell-code», (что в переводе на русский зву- все это лирика. Перейдем к фактам. При компиляции с ключом /GS компилятор добавлячит как: canary-word за которым следует указатель на shellкод), ему остается всего лишь подменить сохраненный EBP ет в код security cookie – так в терминологии Microsoft нана адрес «своего» canary-word. Тогда при выходе из мате- зывается случайный 32-битный canary word, хранящийся ринской функции управление будет передано на shell-код! в writable-памяти и инспектируемый функцией check_canary Атаки этого типа называются ret2ret и давно описаны в ха- при выходе из функции: керской литературе, однако какого-либо практического приЛистинг 6. Дизассемблерный листинг функции f(), ложения они так и не получили, поскольку в оптимизирооткомпилированной Microsoft .NET с ключом /GS ванных эпилогах (ключ -O2) вместо инструкции leave ком(добавленные защитой строки выделены красным шрифтом) пилятор использует более быстродействующую конструкfunction _prologue: цию «add esp,x/pop ebp», и побочный эффект воздействия ; // сохраняем прежний указатель кадра push ebp на ESP исчезает. В оптимизированном эпилоге хакер моmov ebp, esp ; // открываем новый кадр жет воздействовать только на стековый кадр материнской ; // резервируем место для локальных переменных ; // и canary функции, «подсовывая» ей те значения локальных переменsub esp, 9Ch ных, которые он захочет. Для успешной реализации атаки push edx ; \ ; + - сохраняем регистры, этого обычно оказывается вполне достаточно.
№2, февраль 2006
51
безопасность 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
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
52
позволит подделать любой символ. Короче говоря, если бы в 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 eax ; // сохраняем регистры push edx ; // уменьшаем указатель массива возвратов add [retptr], -4 ; // заносим в eax смещение массива возвратов mov eax, offset retptr ; // как на счет свободного места? cmp eax, rettop ; // если места нет, значит и выталкивать нечего jbe .LSHIELDEPILOG ; // снимаем сохраненный адрес со стека возвратов mov edx, [eax] ; // восстанавливаем стековый адрес не проверяя его mov [esp+8],edx
Рисунок 2. Безопасная модель стека Pro-Police call [eax]
.LSHIELDEPILOG: pop edx ; // восстанавливаем регистры pop eax ; ret ; // выходим в материнскую функцию
; // вызываем функцию по указателю
Контроль за указателями на функции препятствует непосредственной передаче управления на shell-код, но не мешает хакеру использовать функции стандартной библиоПри компиляции с ключом -d, Stack-Shiled вставляет до- теки libc и функции самой уязвимой программы. Указатеполнительную проверку, сравнивая адреса возврата на сте- ли на данные также остаются незащищенными. Кроме токе и retarray. В случае расхождения вызывается функция го, при исчерпании массива адреса возвратов (что при глубокой вложенности функций имеет место быть) он автомаSYS_exit, завершающая программу в аварийном режиме. Ключи -r и -g задействуют механизм «Ret Range Checking», тически переходит в «обычный» режим, в котором провепроверяющий границы адресов возврата и останавливаю- ряет только границы адресов возврата, но не сами адреса. щий программу, если они выходят за пределы некоторой за- Хорошая новость, нечего сказать! ранее заданной величины (т.е. находятся в куче или стеке). Таким образом, даже если хакер перезапишет retarray Pro-Police (а он находится в записываемой области памяти), подсунуть Протектор Pro-Police, зародившийся в недрах японского отуказатель на shell-код ему уже не удастся, правда, он может деления IBM (http://www.research.ibm.com/trl/projects/security/ беспрепятственно вызывать функции библиотеки libc, пере- ssp), – это без преувеличения самый сложный и самый совершенный механизм, реализующий модель безопасного давая им любые аргументы (атака типа return-to-libc). стека (Safe Stack Usage Model), который действительно заЛистинг 8. Дизассемблерный код, раскрывающий сущность щищает, а не разводит пропаганду, чтобы выбить очередмеханизма Ret Range Checking ной грант. Сражение с такой защитой любой самурай почfunction_epilogue: тет за честь. ; // закрываем кадр стека небезопасным путем Pro-Police зарывается намного глубже, чем Stack-Guard leave cmp [esp], offset shielddatabase и работает на уровне RTL. Это не библиотека времени исполнения, это – промежуточный системно-независимый ; // ^ проверяем границы адреса возврата ; // если все ок, то переходим на ret язык, генерируемый компилятором gcc и расшифровываjbe .LSHIELDRETRANGE емый как register transfer language. ; // если мы здесь, то адрес возврата вышел Абстрагирование от оборудования существенно упроmovl eax,1 щает портирование и Pro-Police поддерживает практичес; // за допустимые пределы, возможно он был изменен movl ebx,-1 ки все современные платформы: x86, powerpc, alpha, sparc, ; // завершаем выполнение программы mips, vax, m68k, amd64. int 80h Самая главная инновация – переупорядочивание ло.LSHIELDRETRANGE: кальных переменных. Pro-Police разбивает переменные ret ; // возвращаемся в материнскую процедуру на две группы: массивы и все остальные. На вершину кадУсилилась и защита локальных переменных. Теперь пе- ра стека попадают обычные скалярные переменные. Масред вызовом функции по указателю, Stack-Shield убеждает- сивы идут за ними. Переполняющиеся буферы могут воздействовать друг на друга, но до указателей уже не достать, ся, что она находится в пределах сегмента кода: во всяком случае не таким простым путем. Листинг 9. Дизассемблерный код, показывающий Адрес возврата и указатель кадра защищены сторокак Stack-Shield контролирует указатели на функции жевой константой guard, генерируемой произвольном об; // в eax находится указатель на функцию разом. Это все тоже canary word, только в обличии новой ; // проверяем границы указателя терминологии. cmp eax, offset shielddatabase ; // если указатель в границах, перехрдим ; // на вызов функции jbe .LSHIELDCALL ; // указатель на функцию выходит за допустимые границы mov eax,1 movl ebx,-1 ; // возможно, он был хакнут ; // завершаем выполнение программы int 80h .LSHIELDCALL:
№2, февраль 2006
Листинг 10. Псевдокод уязвимой функции до защиты Pro-Police foo() {
}
char *p; char buf[128];
// локальная переменная-указатель // локальный буфер
// функция, которая этот буфер и переполняет gets (buf);
53
безопасность Сводная таблица различных защитных методов stack-guard
.NET
stack-shield
pro-police
Защищает адрес возврата
да
да
частично
да
Защищает указатель кадра
нет
да
нет
да
Защищает локальные переменные
нет
нет
частично
да
Защищает аргументы
нет
нет
нет
да
Защищает массивы
нет
нет
нет
нет
Canary word случаен
нет
частично
–
да
Защищает canary word от перезаписи
да
нет
–
да
Листинг 11. Псевдокод функции, защищенной Pro-Police (добавленные защитой строки выделены красным шрифтом) // глобальный canary, генерируемый случайным образом Int32 random_number; foo () { // локальная копия canary, охраняющая кадр volatile int32 guard; // буфер идет перед всеми локальными переменными! char buf[128]; // локальная переменная-указатель char *p; // копируем глобальный canary в лок. переменную guard = random_number;
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 */
При всей надежности Pro-Police отсутствие сторожевых слов между массивами делает атаку по-прежнему if (guard != random_number) /* program halts */ возможной, поскольку затирание нижеследующих мас} сивов порождает целый каскад вторичных переполнеСостояние стека на момент вызова функции f из лис- ний (особенно целочисленных), да и массивы из указатинга 1 под Pro-Police выглядит так: телей не такая уж большая редкость. Тем не менее такая проверка (кстати говоря, обещанная в следующих Листинг 12. Состояние стека функции foo() на момент версиях Pro-Police) приведет к существенному падению завершения выполнения пролога, обратите внимание, производительности, что явно пойдет не на пользу ее почто при переполнении буфера buf затирания локальных переменных уже не происходит! пулярности. gets (buf);
[ [ [ [ [ [ [ [ [
p buf guard ebp retaddr arg 1 -------------------------
// вызываем уязвимую функцию
] ] ] ] ] ] ] ] ]
Сравните это с листингом 5. Разница незначительная, но принципиальная! По соображениям производительности, Pro-Police внедряет защиту адреса возврата только функции, содержащие буферы, которые потенциально могут быть переполнены. То есть Pro-Police совмещает в себе защитный механизм с системой аудита кода (рис. 2)! Pro-Police предусматривает даже такую неочевидную ситуацию, как подмена указателей, переданных в качестве аргументов, и надежно защищает их. В прологе аргументы копируются в промежуточные переменные, расположенные «над» переполняющимся буфером, а не «под» ним (где находятся оригинальные аргументы). В дальнейшем все обращения к аргументам осуществляются через промежуточные переменные следующим образом: Листинг 13. Псевдокод уязвимой функции, вызывающей функцию по указателю, передаваемому в качестве аргумента, до защиты Pro-Police
54
Заключение Так все-таки можно защититься от переполняющихся буферов или нет? Pro-Police отсекает большое количество атак, но… все это атаки на стек, а помимо стека у нас еще есть целочисленное переполнение, спецификаторы и куча, которые Pro-Police даже не пытается охранять, поскольку они находятся вне его «департамента». Это не упрек, а скорее констатация факта. Личное наблюдение – прочитав несколько популярный статей и установив могучий Pro-Police, большинство знакомых мне программистов упускают из виду, что необходимо установить что-то еще. Безопасное программирование требует целого комплекса совокупных мер, жестоко карая за малейшие ошибки. Использовать Pro-Police, безусловно, стоит, равно как и компилировать программы с ключом /GS, однако необходимо помнить, что эта мера отнюдь не гарантирует защищенности, а всего лишь уменьшает вероятность атаки.
Литература: 1. Касперски К. Ошибки переполнения буфера извне и изнутри как обобщенный опыт реальных атак. – Журнал «Системный администратор» №3, 2004 г. – 64-72 с.
bugtraq Множественные уязвимости в Mozilla Firefox
Обход ограничений безопасности в продуктах Oracle
Программа: 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) с сайта производителя.
Программа: 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. Решение: В настоящее время способов устранения уязвимости не существует.
Переполнение буфера в GNU Tar Программа: GNU Tar 1.15.1, возможно более ранние версии. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки при обработке расширенных заголовков PAX. Удаленный пользователь может с помощью специально сформированного архива вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.gnu.org/software/tar. Решение: Установите исправленную версию (1.15.90 (alpha)) с сайта производителя.
№2, февраль 2006
Переполнение буфера в 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.
Отказ в обслуживании модуля netinet в FreeBSD Программа: FreeBSD 5.3, 5.4. Опасность: Средняя. Описание: Уязвимость существует в реализации алгоритма выборочного подтверждения (SACK – Selective Acknowledgement) при обработке TCP-пакетов. Удаленный пользователь может послать уязвимой системе специально сформированные TCP-пакеты, вызвать зацикливание TCP/IP-стека и потребить все доступные ресурсы на системе. Удачная эксплуатация уязвимости позволит злоумышленнику вызвать отказ в обслуживании системы. URL производителя: www.freebsd.org. Решение: Установите исправление с сайта производителя.
Составил Александр Антипов
55
безопасность
Чем уникальна общественная система предотвращения атак Prevx1
Сергей Яремчук В течение многих лет пользователи доверяли защиту своих компьютеров антивирусным программам, но многочисленные эпидемии показали, что сравнение сигнатур часто не спасает и необходим принципиально иной подход. Появление на рынке программ, работающих по новому принципу, может пошатнуть позиции антивирусных компаний.
В
журнале уже шла речь о проактивных системах защиты [1] и узловой системе остановки атак CORE FORCE [2]. Назначение у них одно – защита персонального компьютера от вирусов, известных и неизвестных уязвимостей, червей, шпионских и троянских программ. В том числе они способны среагировать на так называемые атаки нулевого дня, которые, как правило, не обнаруживаются традиционными средствами. Но эти системы отличаются принципом работы. Первые самостоятель-
56
но составляют безопасный профиль системы и работающих программ, а CORE FORCE использует профиль, заранее подготовленный сообществом пользователей. Недостатки есть у обеих систем. На составление автоматического профиля (обучение) уходит некоторое время, в течение которого решение о допуске программы, как правило, принимает пользователь. И хотя подобные системы сегодня все меньше и меньше задают вопросов, от пользователя требуется некий уровень понимания происходяще-
го в системе, хотя бы такого, чтобы появление нового процесса вызвало подозрение. На составление и тестирование профиля для CORE FORCE требуется время, кроме того, в списке известных программ может не оказаться нужной утилиты. Хотя эта проблема также решаема, пользователь сам может составить профиль или попросить помощи у сообщества, быстрота реакции которого – вещь труднопрогнозируемая. При правильно составленном профиле пользователь может и не участвовать в отражении атаки,
безопасность но следует учесть, что вручную профи- вод (рис. 1). Если в центральной базе ли составляются только для заведомо данных не было информации о новой хороших программ. Вирус и шпионский программе, новый модуль заносится модуль будут пойманы, только при по- в нее и помечается как неизвестный, пытке выполнить какое-то неизвестное пользователь в таком случае предупсистеме защиты действие. А ресурсы, реждается о возможном риске. В отзатраченные для автоматической ге- личие от антивирусов, требующих ненерации профиля в проактивных сис- которое время, необходимое на анатемах, остаются неизвестными сооб- лиз специалистами, Community Watch ществу, к тому же для них характерны в большинстве случаев сам способен ложные тревоги. Истина, как извест- определить характер программы, осно, где-то посередине. Возможно, со- новываясь на поведенческих характездателям общественной системы пре- ристиках. Для этого используется меРисунок 1. При попытке установки дотвращения атак (Community Intrusion тодика, названная «Four Axes of Evil» нового, неизвестного локальной базе ПО запрашивается информация из центральной Prevention System – CIPS) Prevx 1 уда- (четыре оси зла), определяющая хабазы данных лось ее найти. рактер программы по четырем составляющим: скрытность, поведение, происхождение и распространение. В реЧто представляет собой Prevx 1? зультате создается ее описание, соАнглийская компания Prevx Limited, держащее около 120 параметров, позимеющая 5-летний опыт по разработ- воляющих ее идентифицировать в буке систем предотвращения атак, вы- дущем. То есть если неизвестная баРисунок 2. В режиме Pro и Expert пользователь будет получать информацию пустила в феврале 2004 года совер- зе утилита выполняет те же действия, о работе программ шенно новый тип IPS, названный Prevx что и уже известная зловредная проHome. Уникального в представлен- грамма, то ее назначение очевидно. тер самостоятельно, так и может быть ной системе было много. Так, в отли- Если данных, собранных агентом, все- усилена другими продуктами: межчие от антивирусных систем, исполь- таки недостаточно для принятия од- сетевым экраном, антивирусом, прозующих для определения злонаме- нозначного решения, то база данных граммами для поиска шпионских моренных файлов сигнатуры, или неко- может потребовать копию программы дулей и пр. Программа проходит тесторых IDS-систем, использующих спи- для прогона. По заявлению разработ- тирование на совместимость, только сок разрешенных приложений, в но- чиков только небольшой процент слу- межсетевые экраны могут закрывать вой системе применялись правила, чаев требует ручного вмешательства доступ к базе, но это легко решается. описывающие поведение и контроль- специалистов. При первом запуске Для установки агентов потребуются ные суммы программ. Причем в спи- база данных содержала информацию Windows 2000/XP/2003, установленсок попадали как заведомо хорошие об одном миллионе событий, через ные на компьютер с 256 Мб ОЗУ, и пропрограммы, так и плохие, что позво- 20 месяцев в базе уже была инфор- цессор с частотой 600 Мгц. Замечу, что ляло быстро определить характер но- мацию об 1 миллиарде событий. Такой при такой минимальной конфигурации вой программы или процесса на ком- принцип фактически устраняет лож- система явно притормаживает, поэтопьютере. Но не это главное. В систе- ные позитивные и отрицательные сра- му для комфортной работы желательме используется единая база данных батывания. Как результат – появление но более мощное оборудование. (Community Watch), являющаяся на- нового поколения программы Prevx 1, иболее мощным источником инфор- бета-тестирование которой началось Семейство Prevx 1 мации, определяющим существова- с 16 июля 2005 года. Результат превы- Каждая копия установленного Prevx 1 ние, распространение и деятельность сил все ожидания – 100 тысяч разбро- состоит из двух основных частей: как благоприятного, так и злонаме- санных по всему миру компьютеров консоли (pxconsole.exe) и агента ренного программного обеспечения. с установленными на них Prevx 1 ока- (pxagent.exe). Консоль может работать База данных прослеживает и анали- зались способны противостоять новым в трех режимах, выбираемых пользозирует в реальном времени поведе- угрозам в реальном времени. В насто- вателем самостоятельно, кроме того, ние и распространение каждой про- ящее время оптимизированная база возможно использование трех лиценграммы, выполняемое обществом. данных содержит более 10 миллионов зий. В зависимости от этого пользоваАгенты безопасности, расположенные уникальных событий с 220 тысячами телю будут доступны различные парана клиентских компьютерах, отслежи- вредных объектов. А система автома- метры и настройки. По умолчанию консоль устанавливают ситуацию в защищаемой систе- тически обнаруживает и нейтрализует ме. При установке нового приложе- ежедневно свыше 400 вредных и око- вается в режим Prevx1 ABC. Это самый ния либо появлении нового неизвест- ло 10 тысяч программ различного на- простой режим, предназначенный для ного локальной базе процесса соеди- значения, антивирусным программам неподготовленного (и ленивого) польнялись с центральной (общественной) не угнаться за такой производитель- зователя. Выводится минимум инфорбазой через Интернет и на основании ностью. Prevx1 может использовать- мации, внешне работа системы будет полученной информации делали вы- ся как автономно, защищая компью- заметна только в случае возникно-
№2, февраль 2006
57
безопасность
Рисунок 3. После установки пользователю будет выведен результат
Рисунок 4. Вредные программы попадают в песочницу
вения внештатной ситуации, контро- ние об установке программ, загрузлируется меньшее число параметров ке данных из Интернета и другой депрограмм, запуск, остановку и другие ятельности. действия программ можно контролироНекоторым пользователям настровать в сплывающих окнах (рис. 2). ек Pro было мало, так как они не могВариант Pro рассчитан на продви- ли тонко сконфигурировать систему, нутых пользователей, которые хотят вот для них и предназначена версия получать более подробную информа- Expert, дающая в руки наиболее полцию о работе и остановке программ, ное управление системой. Агенты пропопытке выхода в Интернет и дру- веряют большее количество параметгих действиях. Кроме того, пользо- ров, даже по сравнению с версией Pro. ватель получает доступ к больше- Учитывая возможность вмешательства му числу настроек и в результате мо- пользователя в режимах Pro и Expert, жет самостоятельно принимать реше- в таком варианте система Prevx1 мо-
58
жет работать автономно, без доступа к внешней базе данных, так как информация о новых процессах будет выводиться пользователю. Теперь о лицензиях. Лицензия Individual стоимостью 19,95 у.е., как видно из названия, предназначена для защиты одного персонального компьютера. При наличии 5 персональных компьютеров лучше использовать лицензию Family стоимостью 39,95 у.е. Кроме меньшей стоимости лицензии в пересчете на один компьютер, в варианте Family Prevx1 умеет отправлять почтовые сообщения о состоянии безопасности компьютеров семейства при возникновении угроз, установке нового ПО, загрузке подозрительного контента и пр. Самой мощной является лицензия Enterprise. Кроме оповещений доступных в версии Famile, в этом варианте использован более мощный End Point Security агент. При попытке установки нового ПО или попытке запуска неизвестной программы агент производит запрос к центральной базе данных на предмет санкционированного использования в предприятии. Если такое ПО не разрешено, то попытка выполнения блокируется. Если код известен, благоприятен и разрешен, тогда программа выполняется, и ее данные добавляются к локальной базе данных. В течение выполнения агент или база данных может аннулировать право выполнения, если код ведет себя с некоторой степенью анормальности. Таким образом, при помощи Prevx1 можно не только защищать компьютеры предприятия от известных и неизвестных атак, но и контролировать установку программного обеспечения. Enterprise можно свободно установить на 100 компьютеров и тестировать в течение 3 месяцев, что позволяет полностью оценить качество продукта и выявить слабые места в компьютерной сети предприятия. Кроме этого пользователям предлагается свободная версия продукта, имеющая литеру «R» в названии [3]. Здесь поступили очень просто: вместо обычного в таких случаях ограничения функциональности продукта пользователям предоставляется самая последняя тестовая версия, имеющая полную функциональность. Таким образом, не только привлекаются но-
безопасность вые пользователи, добавляющие свои сигнатуры в базу данных сообщества, но и тестируется непроверенное программное обеспечение.
Установка Prevx1 Установка Prevx1 не представляет собой ничего сложного, но обязательно при активации и верификации требуется подключение к Интернету. После запуска исполняемого файла (5,45 Мб) предстоит пройти четыре этапа: Installation – приложение копируется в заданный каталог и устанавливается. Рисунок 5. Для подтверждения запуска обновленного браузера Firefox требуется Activation – указывается файл лисверка с базой сообщества цензий или использование тесто Jail – программы перемещаются ей работы продуктом. Использование вого варианта. в другую папку, переименовыва- многочисленных компьютеров как не Disk Scan – происходит сканироваются, и запустить их невозможно. коей распределенной системы обнание жесткого диска в поиске исполружения атак позволяет вовремя обнаняемых файлов и создание локальСписок всех активных программ руживать неизвестные угрозы, а приной базы данных. Эта операция производится один раз, при последу- доступен в окне «Status». Работу лю- меняемые для их описания алгоритмы ющей эксплуатации системы, про- бой программы можно проконтролиро- практически полностью автоматизиграммы определяются при попыт- вать при помощи монитора (Programm руют процесс занесения их в базу данке запуска, поэтому периодическое Monitor). В результате пользователь мо- ных. Возможность контроля над устажет собрать полную информацию о клю- навливаемыми приложениями в версии сканирование не требуется. Verification – происходит сверка чах реестра, к которым осуществлялся Enterprice и оповещение делает ее хорос общественной базой данных, оп- доступ, сетевой и другой активности. шим помощником администратора. Миределение характера найденных Ее можно вывести в двух формах: спи- нусы тоже есть. Необходим постоянный программ и завершение создания сок событий и тип событий (Event Type). и устойчивый канал в Интернете, к толокальной базы данных. На тесто- Последний очень удобен при ручном со- му же такая система во время установвом компьютере с полусотней ус- ставлении правил. Но, к сожалению, эк- ки потребует некоторый трафик, кототановленных программ такая свер- спортировать полученный список в ок- рый при большом количестве компьюка заняла около 600 Кб входящего но правил нельзя. Для переключения теров может стать большим. Возможв режимы Pro и Expert необходимо ак- ность использования централизовани исходящего трафика. тивировать «Advanced Mode» во вклад- ной базы данных (даже в кэширующем После чего компьютер считается ке «Preferences» и затем в появившей- варианте), расположенной на предпризащищенным и пользователю выво- ся вкладке «Advanced» выставить тре- ятии, снизила бы нагрузку на внешний дится результирующая информация буемый режим. При желании настрой- канал, упростила администрирование (рис. 3). Кроме того, о состоянии за- ки в «Preferences» можно защитить па- и сделала такую систему менее зависимой от внешней базы. Таким обращиты вам подскажет индикатор в трее. ролем. В моем случае даже не пришлось зом, повысилась бы надежность всей Если он горит зеленым, то с защитой все в порядке, красным – на компьюте- долго ждать, чтобы протестировать схемы. Но очевиден отход от классире найдены вредные программы, жел- работу системы. В процессе верифи- ческих схем определения атак и в бутый цвет индикатора показывает на на- кации базы данных решил обновить- дущем, вероятно, подобные системы личие неизвестных программ, в этом ся веб-браузер Firefox. После его пе- будут более распространены. случае пользователь должен быть вни- резапуска консоль Prevx1 выдала сомателен. Все вредные программы бу- общение о том, что происходит запуск Литература, ссылки: дут помещены в песочницу, имеющую неизвестной программы и требуется 1. Яремчук С. Проактивные системы запроверка с базой данных сообщества щиты, или Есть ли жизнь без антивирутри варианта (рис. 4): са? – Журнал «Системный админист Holding Cell – программы остают- (рис. 5). Хотя пользователь может заратор», №7, 2005 г. – 9-13 с. ся на своих местах, но они заблоки- пустить ее и без подтверждения, вырованы, и запустить их невозмож- брав вариант установки нового про- 2. Яремчук С. Защита Windows-систем при помощи CORE FORCE – Журно, сюда программы попадают сра- граммного обеспечения. нал «Системный администратор», №1, зу после обнаружения. 2006 г. – 54-59 с. On Probation – программа может Выводы быть запущена, даже если Prevx1 Несомненно, Prevx1 является передо- 3. Свободная версия Prevx1R – http://free. вым и интересным по принципу своprevx.com. определил ее как вредную.
№2, февраль 2006
59
безопасность
Как повысить безопасность веб-приложений
Сергей Яремчук Хорошая вещь швейцарский нож: есть и ножницы, пилочка, отвертка и еще много нужных предметов, но вот пользоваться им не очень удобно. В повседневной жизни лучше применять индивидуальный инструмент. В мире безопасности аналогичная ситуация.
Т
радиционно для защиты сете- в реальном времени, требуется помес- запрос, содержащий злонамеренные вых приложений используют сис- тить IPS и firewall поближе к приложе- данные, он вполне может отклонить, преобразовать запрос или выполнить темы обнару жения и останов- нию, т.е. на седьмой уровень. любое другое действие. К слову скаки атак, а также межсетевые экраны, работающие на третьем сете- Firewall веб-приложений зать, на сегодняшний день нет единой вом уровне модели OSI. В то же вре- Судя по статистике, именно веб-сер- устоявшейся терминологии, каждый мя такой подход имеет и недостатки. висы привлекают сегодня нападаю- производитель называет продукт поТак, при включении в разрыв необхо- щего. Это, впрочем, не удивительно, своему. Поэтому в Интернете следует дим IP-адрес, при этом IPS (Intrusion так как веб-технологии ориентирова- искать информацию в различных соPrevention Systems) легко обнаружи- ны в первую очередь на публичный четаниях. Например, Adaptive Firewall вается и система сама может подвер- доступ 24 часа в сутки 7 дней в не- (Proxy, Gateway), Application (-level или гнуться нападению. Выходом из такой делю. Поэтому его невозможно спря- -layer) Firewall, Web IPS или Deep Packet ситуации является переход на более тать за межсетевым экраном. Каждая Inspection Firewalls и другие. Имеются низкий, т.е. канальный уровень OSI, из атак, направленных на этот сер- как аппаратные решения, так и прочто с успехом и применяется в такой вис, представляет собой специально граммные. К первым относятся такие, IPS, как hogwash [1]. Но увеличение по- составленные запросы, которые вы- как TrafficShield Application Firewall [3], токов данных привело к тому, что та- глядят как обычный трафик, поэтому в котором применена так называемая кие системы требуют серьезной аппа- он беспрепятственно проходит через положительная модель безопасности, ратной поддержки, иначе они просто него. Один из возможных путей ре- запрещающая все, что явно не разне успевают обрабатывать информа- шения проблемы описан в [2], но та- решено, или NetContinuum NC-2000 цию. С другой стороны IPS, как прави- кие мероприятия можно отнести ско- AG Secure Application Gateways [4], коло, не знает, что конкретно она защи- рее к упреждающим. Для остановки торый является гибридным устройсщает (хотя это можно настроить, уб- атаки необходимо использовать пер- твом, объединяющим в себе функрав лишние правила), поэтому ресурсы сональные IPS – firewall веб-приложе- ции firewall веб-приложений и коммусистемы расходуются зря. Но зато она ний (Web Application Firewall – WAF). татора седьмого уровня. Или подобточно не владеет информацией о собы- Они действуют по принципу обрат- ный гибрид от компании Imperva Inc. тиях, происходящих в конкретных при- ного прокси-сервера, стоящего меж- SecureSphere Web Application Firewall ложениях. Кроме того, такие системы ду сервером и клиентами. Один такой [5], имеющий фирменную технологию позволяют защитить только наиболее прокси может одновременно обслужи- Dynamic Profiling, которая формирует часто используемые приложения. Поэ- вать несколько веб-серверов, что уп- модель нормального поведения притому они смогут обеспечить только не- рощает администрирование, позволя- ложения. Такие гибридные устройский минимальный базовый уровень за- ет централизованно управлять досту- тва имеют подробное представление щиты, а учитывая, что на сегодняшний пом, увеличивая производительность, о защищаемом веб-сервере и о кондень увеличилось количество нападе- кэшируя запросы, сжимая информа- кретных приложениях. Они обладают ний на прикладном уровне, этого явно цию. Кроме того, такой подход скрыва- достаточной функциональностью, познедостаточно. Для выполнения более ет топологию сети. Поскольку модуль воляющей надежно защитить веб-серширокого набора проверок, контроля расположен между клиентом и серве- вис, но и стоят дорого. Среди програмтрафика и реагирования на нападение ром, то в случае, когда он обнаружит мных решений особо хотелось бы вы-
60
безопасность делить основанный на OpenBSD мощный и легкий в управлении firewall веб-приложений датский продукт Profense [6], стоящий отдельного обзора. А также бесплатные Open Source продукты: написанные на Java и ориентированные на все серверы, работающие по протоколу HTTP/HTTPS Guardian@JUMPERZ.NET [8] и mod_security [9], о котором пойдет речь далее.
Проект ModSecurity ModSecurity создан Иваном Ристиком (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 для вебсервера, установленного на том же компьютере, описание остальных настроек вы найдете в документации проекта. При установке из исходных текстов возможны два варианта: компиляция как динамической библиотеки и компиляция в качестве модуля веб-сервера. В первом случае рас-
№2, февраль 2006
Рисунок 1. ModSecurity может быть установлен как отдельно, так и защищать группу разнородных веб-серверов
паковываем архив и заходим внутрь каталога соответствующего версии веб-сервера Apache. $ 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
Для сборки используется 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. # /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.so cp .libs/mod_security.lai /usr/lib/apache2/modules/mod_security.la cp .libs/mod_security.a /usr/lib/apache2/modules/mod_security.a ranlib /usr/lib/apache2/modules/mod_security.a chmod 644 /usr/lib/apache2/modules/mod_security.a PATH="$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]
Последнее сообщение говорит о том, что в конфигурационный файл веб-сервера занесена строка для запуска Dynamic Shared Object (DSO): «LoadModule /usr/lib/apache2/ modules/mod_security.so». Проверьте ее наличие. При установке в качестве модуля Apache необходимо скопировать файл mod_security.c в подкаталог httpd-2.0.xx/modules/proxy и сконфигурировать со следующими опциями. $ ./configure -enable-security ↵ --with-module=proxy:mod_security.c $ make # make install
Прежде чем перезапускать веб-сервер, необходи-
61
безопасность мо отредактировать конфигурационный файл, в котором подключить библиотеки и настроить правила фильтрации. Архив с исходными текстами содержит пример httpd.conf.example-minimal, копируем его на место: # cp httpd.conf.example-minimal ↵ /etc/httpd2/conf/mod_security.conf
Подключаем его в конфигурационном файле веб-сервера строкой: Include /etc/httpd2/conf/mod_security.conf
Конфигурационный файл ModSecurity Рассмотрим основные параметры: <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 On SecFilterCheckURLEncoding On SecFilterCheckUnicodeEncoding Off # Можно определить диапазон разрешенных символов # (эта директива не распространяется на POST # с multipart/form-data) SecFilterForceByteRange 0 255 # Можно замаскировать сервер, указав здесь другие данные. # Некоторые эксплоиты перед началом работы проверяют банер #(ответ сервера), а нападающий будет сбит с толку, правда, # на некоторое время, т.к. на Linux IIS не ставится. # SecServerSignature "Microsoft-IIS/5.0" # Параметры хранения временных файлов и скрипт для проверки # ClamAV (найдете в каталоге util архива) SecUploadDir /tmp SecUploadApproveScript /usr/bin/modsec_clamscan.pl SecUploadKeepFiles Off # Защита от DOS-атак, при превышении (по умолчанию) # 120 запросов в минуту и 360 за 5 минут адрес блокируется # при помощи iptables, требует скрипт blacklist. # Скрипт httpd-guardian и blacklist найдете в архиве [13] SecGuardianLog | /usr/bin/httpd-guardian # Ведение журнала аудита и отладки SecAuditEngine RelevantOnly # SecAuditLogRelevantStatus ^5 SecAuditLog logs/modsec_audit.log # Либо можно подключить экспериментальный скрипт # modsec-auditlog-collector.pl, контролирующий журналы # и отсылающий информацию на http-сервер. # SecAuditLog | /path/to/modsec-auditlog-collector.pl ↵ logs/modsec_audit.log logs/index SecFilterDebugLevel 0 SecFilterDebugLog logs/modsec_debug.log # Просмотр выходной информации (работает только в версии # для Apache 2) необходим для параметра OUTPUT # (примеры см. далее по тексту) SecFilterScanOutput On
62
# Кроме общих правил, можно задавать правила для отдельных # каталогов веб-сервера <Location /axis/modsec.jws> …. </Location> # Далее при помощи директив SecFilter или SecFilterSelective # указываются правила </IfModule>
Правила ModSecurity Отбор запросов ModSecurity осуществляет на основе правил. Ключевое слово в правиле может быть не только простым текстом, но и записываться в виде регулярного выражения. Например, используя следующее правило, можно отсеять все запросы, не содержащие слово php (действие deny используется по умолчанию, но для наглядности его лучше прописывать явно): SecFilter !php
или так: SecFilter !php deny
или, например: SecFilter /etc/passwd
а лучше: SecFilter "/(etc|bin|sbin|kernel|dev|tmp|var|opt)/"
Но такое правило хотя и пишется легко, но будет работать медленно, так как будет искать эту строку во всех параметрах. Поэтому на практике чаще всего используется директива SecFilterSelective. В общем случае правило, составленное с ее помощью, будет иметь такой вид: SecFilterSelective LOCATION KEYWORD [ACTIONS]
Параметры KEYWORD и ACTIONS аналогичны SecFilter, LOCATION определяет местонахождение искомой строки. Здесь может быть использовано регулярное выражение, IP-адрес, имя, идентификаторы, включая CGI-переменные (полный список приведен в «ModSecurity for Apache User Guide», который найдете в подкаталоге doc-архива). Например: # Прием только тех запросов, которыми может # оперировать ModSecurity SecFilterSelective REQUEST_METHOD "!^(GET|HEAD)$" chain SecFilterSelective HTTP_Content-Type "!(^application/ ↵ x-www-form-urlencoded$|^multipart/form-data;)" # Запрет GET или HEAD с ненулевым телом SecFilterSelective REQUEST_METHOD "^(GET|HEAD)$" chain SecFilterSelective HTTP_Content-Length "!^$" # То же для каждого POST-запроса SecFilterSelective REQUEST_METHOD "^POST$" chain SecFilterSelective HTTP_Content-Length "^$" # Чтобы избежать атак, направленных на переполнение # буфера, используем SecFilterSelective THE_ REQUEST "!^[\x0a\x0d\x20-\x7f]+ $" # Запрет вывода, содержащего опасное словосочетание SecFilterSelective OUTPUT "credit card numbers"
безопасность Таблица 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 chain SecFilterSelective REMOTE_ADDR "^192\.168\.1\.99$"
pause
Задержка в миллисекундах перед ответом на запрос (может быть полезна при борьбе со сканерами)
auditlog
Регистрация в журнал аудита
noauditlog
Не регистрировать событие в журнале аудита
id rev msg severity
Эти действия предназначены для вывода параметров в журнале ModSecurity, помогает собрать больше информации и классифицировать ошибки
mandatory
Наследование правил
setenv setnote
Установка или сброс переменных среды и Apache
# Или вывода команды ls –l SecFilterSelective OUTPUT "total [[:digit:]]+" # Также полезно запретить вывод пользователю ошибок # сценариев SecFilterSelective OUTPUT "Fatal error:"
Команда разработчиков во главе с Иваном Ристиком основной упор делает на усовершенствование кода ModSecurity, оставляя создание правил пользователям, поэтому оригинальный конфигурационный файл имеет всего несколько правил. Недавно был официально анонсирован субпроект, цель которого создание и тестирование правил [11]. Для их использования необходимо скачать и подключить требуемый файл правил в конфигурационном файле ModSecurity директивой Include. Некоторые из правил требуют редактирования, кроме того, следует учитывать особенности rexeс и PCRE, поэтому правила, созданные для Apache 2.x, могут неправильно работать с первой версией сервера (о том, как собрать первую версию с поддержкой PCRE, рассказано в документации). Кроме того, в подкаталоге util найдете скрипт snort2modsec.pl, преобразующий правила IDS Snort в правила ModSecurity (и готовый файл snortmodsec-rules.txt, содержащий преобразованные таким образом правила, актуальные на момент выхода дистрибутива). Получить их самому очень просто. $ tar zxvf snortrules-snapshot-CURRENT.tar.gz $ cat README.first > snortmodsec-rules.txt $ ./snort2modsec.pl rules/* >> snortmodsec-rules.txt
Аналогичную роль играет скрипт nessus2modsec.pl, пред-
№2, февраль 2006
Id – уникальный ID правила (для собственных правил используйте диапазон 1 – 99999) rev – версия правила msg – текстовое сообщение severity – цифровое значение (2-5) или название в syslog
SecFilter KEYWORD setenv:name=value Например, при помощи MODSEC_ENABLE можно на лету переопределять значение директивы SecFilterEngine
назначенный для преобразования NASL правил сканера безопасности Nessus/GNessUs. Формат запуска такой же. Теперь, когда правила составлены, перезапускаем вебсервер и тестируем. # /etc/init.d/httpd2 restart Stopping httpd2 service: Checking configuration sanity for httpd2: Syntax OK Starting httpd2 service:
[ DONE ] [ DONE ] [ DONE ]
Тестируем правила Для тестирования работы ModSecurity можно использовать любой из сканеров безопасности, умеющий проверять уязвимости веб-сервисов [2]. Кроме того, в комплект дистрибутива входит скрипт run-test.pl, предназначенный для посылок тестовых запросов. Попробуем создать простейшее правило, запрещающее доступ к каталогу скриптов cgi-bin, и отследить в журналах реакцию системы на его нарушение. Вот это правило: SecFilter cgi-bin
Запускаем веб-сервер сначала без поддержки ModSecurity и убеждаемся, что запрос к http://localhost/cgi-bin/printenv выполняется успешно. Затем подключаем ModSecurity, результат на (рис. 2), как видите, запрос не прошел с кодом ошибки 403. Смотрим, что написано в журналах (в ALTLinux /var/ log/httpd2). Журнал регистрации запросов access_log содержит следующую запись.
63
безопасность
Рисунок 2. Запрос, запрещенный правилами, не прошел 127.0.0.1 - - [06/Feb/2006:15:16:25 +0000] "GET /cgi-bin/printenv HTTP/1.1" 403 299
Журнал ошибок поясняет, что доступ клиенту, пришедшему с адреса 127.0.01, запрещен модулем mod_security, потому что совпал образец «cgi-bin». [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"]
[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
Выводы
Только система, не подключенная к сети, может быть 100% безопасной, но веб-сервис должен быть публичным, иначе он Кстати, на основании этой записи можно уже оптими- теряет смысл. Выявить все слабые места практически не воззировать правило. Вот так: можно. По данным компании Netcraft, отслеживающей, какое программное обеспечение используется серверами в ИнтерSecFilterSelective REQUEST_URI "cgi-bin" нете, хакеры всё чаще эксплуатируют дыры в распространенных приложениях на основе РНР. Обычный межсетевой экТеперь журналы ModSecurity. Файл modsec_audit.log со- ран здесь не помогает. Только специализированное програмдержит всю информацию о запросе. мное обеспечение способно остановить атаку. ModSecurity чрезвычайно функциональный, простой в конфигурировании ==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.1 Connection: Keep-Alive User-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, deflate Accept-Charset: windows-1251, utf-8;q=0.5, *;q=0.5 Accept-Language: ru, en Host: localhost mod_security-action: 403 mod_security-message: Access denied with code 403. Pattern match "cgi-bin" at REQUEST_URI
HTTP/1.1 403 Forbidden Content-Length: 299 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html; charset=iso-8859-1 --83d74643--
А в modsec_debug.log найдете информацию обо всех использованных при запросе правилах: [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
64
Литература, ссылки: 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. Сайт Imper va Inc. – ht tp://w w w.imper va.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. Проект Guardian@JUMPERZ.NET – 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.
bugtraq Обход ограничений безопасности в frag3-препроцессоре в Snort
Отказ в обслуживании при обработке LDAP-запросов в Fedora Directory Server
Программа: Snort 2.4.3. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки в frag3-препроцессоре, что может привести к тому, что Snort пропустит ip_option_length-байты в конце IP-опций во время дизассемблирования пакета. Удаленный пользователь может с помощью специально сформированных фрагментированных пакетов обойти сигнатуры. URL производителя: www.snort.org. Решение: В настоящее время способов устранения уязвимости не существует.
Программа: 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) с сайта производителя.
Множественные уязвимости в 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) с сайта производителя.
Обход ограничений безопасности в 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. Решение: Установите исправленную версию с сайта производителя.
№2, февраль 2006
Отказ в обслуживании в MDaemon IMAP Server Программа: MDaemon IMAP Server 8.1.1. Опасность: Средняя. Описание: Уязвимость существует при обработке входных данных в команде LIST. Удаленный авторизованный пользователь может с помощью специально сформированного аргумента заставить приложение потреблять все доступные ресурсы на системе. Пример: M:\Distrib\nc>nc -v 127.0.0.1 143 Blaster [127.0.0.1] 143 (imap) open * OK hack.com IMAP4rev1 MDaemon 8.1.1 ready 0001 LOGIN "densen" "console" 0001 OK LOGIN completed 0003 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 completed 0004 LIST "%s%s%s%s%s%s%s" "%s"
URL производителя: www.altn.com. Решение: Установите исправление с сайта производителя.
Раскрытие данных в 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) с сайта производителя.
Составил Александр Антипов
65
безопасность
Исследуем сетевую безопасность посредством Linux Netwosix
Сергей Яремчук Буквально через пять дней после объявления релиза 1.3 дистрибутива Linux Netwosix был анонсирован тестовый вариант следующей второй ветки. Что нового появилось и для каких целей предназначен Linux Netwosix?
О
снователем и главным разработчиком дистрибутива является итальянец Vincenzo Ciaglia. На основной странице проекта [1] сказано, что Linux Netwosix является небольшим, мощным, легко настраиваемым, оптимизированным дистрибутивом, созданным для потребностей сетевого администратора. Предназначен для применения на серверах и ра-
66
боты, связанной с исследованием сетевой безопасности. Распространяется по лицензии GNU GPL. Одним из требований при его создании было дать большую свободу в настройке администратору, так как только таким образом он может сконфигурировать мощный и стабильный в работе сервер. Учитывая большое количество специальных утилит, дис-
трибутив может также использоваться для специальных исследований, таких как тесты на проникновение. Главный замысел создателя Linux Netwosix состоит в том, что система содержит минимально необходимое количество пакетов, так как часто бывает в других дистрибутивах, в которых для удовлетворения всех зависимостей на жесткий диск сваливается боль-
безопасность шое количество ненужных приложений и библиотек. Также нет и приложений с дублирующей функциональностью, т.е. различных вариантов почтовых, 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-образ с официального сайта проекта или любого из зеркал. После этого проверяем правильность полученного файла при помощи контрольной суммы. # md5sum netwosix2.0-rc1.x86.iso
e88a3a4c2d1f388cb9352442c89038f7
№2, февраль 2006
ISO-образ является LiveCD, поэ- ваны разделы (/mnt). После этого предтому записываем на диск, вставляем лагается установить базовый набор ( ), в привод и перезагружаемся. После в который входит около 65 пакетов. Срепоявления приглашения boot: необхо- ди них auticonf 2.59, automake 1.9.5, bash димо нажать на Enter и затем зарегис- 3.0, coreutils 5.2.1, devfsd 1.3.25, gcc 3.43, трироваться как root с пустым паролем. glibs 2.3.5, make 3.80, patch, lilo 22.7, Краткую инструкцию по установке и на- ncurces, perl 5.8.6, vim, sendmail 8.13.4, стройке Linux Netwosix (на английском) wget, net-tools. Выберите обязательно утилиты для можно получить, зарегистрировавшись во второй консоли (<ALT> + <F2>) и вве- работы с портами ports. Кроме базоводя «netwosix_howto». Следующий этап – го набора, на жесткий диск копируются создание дисковых разделов. Для этих исходные тексты ядра 2.6.14.5. По оконцелей используются fdisk или cfdisk чании процесса выводится отчет об ус(GNU/parted нет). Разработчики реко- тановленных пакетах. На этом установмендуют создать четыре раздела: ка считается законченной. Но в традициях всех дистрибутивов, собира swap (2хОЗУ); емых из исходных текстов ядра, в та root (350-500 Мб); кой системе нет. Поэтому следующим /var (не менее 100 Мб); шагом идет компиляция ядра. Перехо /usr (> 1 Гб). дим в chroot-окружение. Хотя в зависимости от назначения # mount -t devfs devfs /mnt/dev сервера можно в этот список добавить # mount -t proc proc /mnt/proc /home, /usr/local или /opt. Каждому раз# chroot /mnt /bin/bash делу должен быть присвоен свой тип, т.е. swap 82, остальным 83. После соИ собираем ядро: здания разделов форматируем их под # cd /usr/src/linux-2.6.14.5 нужную файловую систему. В HOWTO # make menuconfig приведены команды для создания ext2 # make all # make modules_install (mke2fs /dev/hdaN), ext3 (mke2fs -J) # cp arch/i386/boot/bzImage /vmlinuz и ReiserFS (mkreiserfs), но в дистрибу# cp System.map / тиве имеются утилиты для создания JFS (mkfs.jfs) и XFS (mkfs.xfs). ПоэтоЧтобы не терять времени, пока му можно выбрать любую из этих фай- компилируется ядро, переходим во ловых систем. Создаем и активируем вторую консоль и приступаем к насвоп-раздел. стройке системы. Первым делом устанавливаем пароль суперпользова# mkswap /dev/hda1 теля командой passwd. Далее при по# swapon /dev/hda1 мощи редактора vi редактируем файИнтересно, что в документации на- лы /etc/fstab, /etc/rc.conf, /etc/rc.d/net, звания разделов приводятся пооче- /etc/hosts и /etc/resolv.conf. Хочется отредно то в традиционном обозначении метить, что разработчики не стали усвроде /dev/hda1, то в стиле devfs -/dev/ ложнять жизнь, а заготовили шаблоdiscs/disc0/part1. В отличие от CRUX, ны. Например: в котором не поддерживается обрат# /dev/#REISERFS_ROOT# / ↵ ная совместимость, здесь будут рабоreiserfs defaults 0 0 тать оба варианта, но такое расхождение может запутать новичка (хотя вряд Причем такие строки существуют ли новичок будет его ставить). И монти- для всех поддерживаемых ядром файруем все созданные разделы в /mnt/. ловых систем. Остается только раскомментировать нужную строку и вместо # mount /dev/hda2 /mnt # корневой #REISERFS_ROOT# вписать нужный # mkdir /mnt/usr раздел. Теперь /etc/rc.conf, в котором # mkdir /mnt/var # mount /dev/hda3 /mnt/usr необходимо указать клавиатурную рас# mount /dev/hda3 /mnt/var кладку (можно посмотреть имеющиеся После этого приступаем к собствен- в /usr/share/kbd/keymaps/i386/qwerty), устано установке, введя setup. В первом эк- новить часовой пояс (/usr/share/zoneinfo/), ране выбираем установку или обновле- шрифт (/usr/share/kbd/consolefonts/) ние Linux Netwosix, затем необходимо и указать автоматически запускающиввести каталог, в который смонтиро- еся при старте системы сервисы.
67
безопасность Редактируем, записываем, нажав <Esc> и набрав «:wq». И устанавливаем: #lilo -v
Все, система полностью готова к работе, самое время добавить необходимые сервисы, поэтому переходим к системе портов.
Система пакетов и портов Linux Netwosix Рисунок 1. Выбор пакетов базовой установки
У меня он получился такой. FONT=Cyr_a8x16 KEYMAP=ru4 TIMEZONE=Europe/Kiev HOSTNAME=host.com SERVICES=(net crond)
Обратите внимание на строку SERVICES, в которой просто перечислены сервисы, которые необходимо автоматически запустить при старте системы, все имеющиеся на данный момент можно найти в /etc/rc.d/. После установки в этом каталоге будет четыре файла, crond, inetd, net, sendmail. Сетевые интерфейсы настраиваются в /etc/rc.d/net, который также снабжен шаблонами. Настроим один интерфейс жестко с IP-адресом 192.168.0.1, второму адрес назначает провайдер. #!/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
И последним этапом конфигурируем и устанавливаем загрузчик LILO. Файл /etc/lilo.conf также имеет шаблон, и нам остается только указать правильно корневой раздел. # # /etc/lilo.conf # Linux Netwosix # <http://www.netwosix.org> # lba32 install=text boot=/dev/hdа image=/vmlinuz label=LinuxNetwosix root=/dev/hdа2 read-only append="quiet" # End of file
68
В документации проекта сказано все о системе портов nepote, но абсолютно ни слова не говорится о системе пакетов, хотя они в системе используются, и умолчать об этом прав не имеем. Очевидно, пакеты планируется использовать только при установке и обновлении системы, главную же роль при построении сервера будет играть все-таки nepote. Система пакетов не только полностью заимствована, но и даже совместима с Crux. Устанавливаются пакаджи при помощи команды pkgadd с указанием полного имени пакета, при этом будет произведена проверка зависимостей и после чего предварительно скачанный с сайта пакет установится. Если пакет уже установлен, но требуется обновить его, то набрав: # pkgadd -u package_name
избежим сообщения о том, что пакет уже установлен. Для того чтобы предотвратить модификацию некоторых важных для системы каталогов и файлов они указываются в /etc/pkgadd.conf. Например: # UPGRADE UPGRADE UPGRADE UPGRADE
^.*$ ^etc/.*$ ^var/log/.*$ ^etc/mail/cf/.*$
YES NO NO YES
Если снять комментарий с первой строки, будут модифицированы все файлы. Более поздняя запись имеет больший приоритет при запросе. Во второй и третьей строках запрещается модификация каталога и подкаталогов /etc и /var/log, но в последней строке разрешено изменение файлов в /etc/mail/cf/. Удалить пакет также просто: # pkgrm bash
и его как не бывало, зависимости не проверяются, но, очевидно, считается, что человек, дающий такую команду, знает, что делает, и понимает последствия. С другой стороны, удалять в дистрибутиве практически нечего, все и так установлено по минимуму, поэтому особой необходимости в этом, очевидно, и нет. Узнать информацию об установленных пакаджах можно, набрав: # pkginfo -i
или если нужен определенный, то: # pkginfo -l bash
Используя pkgmk, можно собрать пакаджи самому.
безопасность Но основным средством, предназначенным для установки приложений, является nepote. На момент написания статьи в системе портов было около 190 приложений в 9 категориях. Понятие порта здесь немного отличается от таковых в FreeBSD. Под портом понимается скрипт, обеспечивающий загрузку и компиляцию конкретной программы, а также набор программ, упрощающих обновление дерева, поиск нужных портов. Перед началом работы рекомендуется обновить дерево портов. Пока это делается вручную, в будущем планируется операцию автоматизировать, хотя при желании простенький скрипт можно написать и самому. # cd / # wget –c ftp://rm.mirror.garr.it/mirrors/netwosix/ ↵ nepote/ports.tgz # tar xzf ports.tgz # rm ports.tgz
Либо при помощи утилиты nepote: # 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 <ciaglia@netwosix.org> *****************************************************************
Нажав клавишу <1>, можно произвести обновление всего дерева портов как с официального сайта, так и указав любой другой сервер. Если выбрать <2>, то будет загружен и установлен файл обновлений системы updateLN.tgz. Конфигурационные файлы nepote находятся в /etc/nepote, заглянув внутрь, можно легко подстроить систему под себя. Для поиска порта используется команда nepote-find. После запуска будет предложено ввести название порта, если такой пакет будет обнаружен, то будет выведен полный путь к нему. Например, файл порта веб-сервера Apaсhe выглядит так. # # # # #
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 tree package_name=httpd version=2.2.0 release=2 source=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
№2, февраль 2006
Как видите, ничего сложного здесь нет, это набор обычно задаваемых команд. Для его установки необходимо зайти в каталог порта и ввести sh nepote. # cd /usr/ports/net/apaсhe # sh nepote
После чего файл будет скачан, распакован, скомпилирован и установлен. Если в процессе установки появятся проблемы, связанные с неудовлетворенными зависимостями, то в этом случае следует использовать команду «sh nepote-dep». Для установки флагов компилирования используется файл /etc/pkgmk.conf. export CFLAGS="-O2 -march=i686 -pipe" export CXXFLAGS="-O2 -march=i686 -pipe"
Хотя в дереве портов и программе установки 2.0 есть, на мой взгляд, несколько недоработок. Например, на CD-диске /netwosix/additional присутствует раздел, содержащий исходные тексты 116 приложений, в том числе и входящих в дерево портов. Но ни во время установки системы, ни при использовании nepote эти архивы никак не задействуются, лежа мертвым грузом. Хотя в принципе их можно использовать. Не скачивать же их повторно. Например, смонтировать диск и скопировать архив веб-сервера Apaсhe httpd-2.2.0.tar.bz2 в каталог /usr/ports/ net/apaсhe. Но так просто установить его не получится, т.к. скрипт nepote будет искать файл с расширением tar.gz. Поэтому просто переделываем под свои нужды скрипт, исправив следующие строки. # wget $source tar xjf $package_name-$version.tar.bz2 rm $package_name-$version.tar.bz2
Теперь 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.
69
сети
Подключаемся к Интернету через спутник
Антон Борисов Спутниковый Интернет развивается семимильными шагами. Тарифы на передачу данных посредством спутниковых провайдеров одни из самых низких. Однако, если вы не являетесь подписчиком услуг спутникового провайдера, данные вы сможете получить в любом случае.
И
стория развития DVB-S-стандарта уходит корнями в последние несколько десятилетий прошлого века. Запуск искусственных спутников Земли всегда был интересной задачей для человечества, как в технологическом плане – вывод на орбиту, так получаемыми возможностями – наблюдение за атмосферными осадками, радионавигация и радиосвязь. Применений для орбитальных спутников много. По мере развития технологий и, в какой-то степени, их удешевления появилась возможность использовать спутниковые технологии для передачи интернет-трафика конечному пользователю. Для приема последнему следует обзавестись спутниковой антенной и обратным каналом связи. Запрос на конкретный документ в сети происходит по обратному каналу связи, а на тарелку принимается трафик со спутника. С прямым каналом вроде бы всё ясно – скорость приема достаточно высокая, порядка 4 Мбит/с (а если быть точным, то ограничение здесь накладывает DVB-S-карта с её максимальной символьной скоростью, которую она может обработать). С обратным каналом количество вариантов
70
побольше – это может обычная теле- ние. Вроде бы всё ясно и понятно. А тефонная линия к интернет-провайдеру, перь представьте, что обратного каналибо GPRS-соединение к оператору ла нет. Будь у нас обычное модемное сотовой связи, либо оптоволоконная соединение или ethernet-подключение, линия до национального оператора. то разумно было бы расстроиться. ОдВ случае, когда вы являетесь провай- нако это не повод впадать в депрессию дером услуг интернет-связи и львиный в случае со спутниковым каналом. Потрафик получаете со спутника, то на- чему? Сейчас разберемся. Когда пользователь отправляет заверняка у вас на руках есть соотношение исходящего и входящего тра- прос по обратному каналу спутниковофика. Чем больше делается запросов му оператору (предположим, что это по обратному каналу, тем больше дан- PlanetSky [2] или SatGate [3]), то посных приходит по прямому каналу. По- ледний забирает файл в сети по укаэтому в ситуации, когда требуется пе- занному url и со спутника отправляет редавать много данных по обратному уже для всей аудитории территории каналу, следует рассмотреть возмож- покрытия. А уж кому предназначается ность подключения к скоростному ка- данный файл, решает конечный польналу (см. рис. 1). Например, оптоволо- зователь, т.е. из всего DVB-потока выконная линия. бираются те данные, которые совпадаТрасса N1 – обратный канал свя- ют с MAC-адресом DVB-карты пользози. На схеме не показан региональ- вателя и с PID, который был выдан при ный ISP, но его наличие предполага- его подключении к спутниковому опеется. По трассе N2 проходит трафик ратору. Таким образом, фильтрация уже от/к самому спутниковому провай- данных в DVB-потоке на совести кодеру. Далее он передается на спутник нечного пользователя. и в качестве СВЧ-излучения по трассе Теперь попробуем вывернуть данN3 (прямому каналу) приходит к вам ную ситуацию наизнанку. Предполов дом. жим, что пользователь фильтровать Итак, по обратному каналу проис- ничего не хочет. Тогда он сможет походит запрос на ресурс в сети, по пря- лучить весь трафик на конкретном мому каналу происходит его получе- транспондере (частоте) данного спут-
сети ника. Луч достаточно широкий, поэтому получить сигнал теоретически сможет любой, было б необходимое оборудование. Здорово, не правда ли? Эта процедура и называется – спутниковая «рыбалка». Дабы не быть голословным, рассмотрим данный вид «спорта» на реальном примере. Считаем, что тарелка, DVB-S-карта установлены, драйвера настроены и вы в курсе, что такое PlanetSky (или хотя бы слышали). Я переориентирую тарелку на направление 40E (восточная долгота) – это спутник Express AM 1 [5]. Проверяю уровень сигнала, который приходит на тарелку.
Рисунок 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 = 0x020c using '/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_LOCK status 1f | signal b8a7 | snr d4ac | ber 00000000 | unc 00000000 | FE_HAS_LOCK status 1f | signal b6dc | snr ccd2 | ber 00000000 | unc 00000000 | FE_HAS_LOCK status 1f | signal b83d | snr d566 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
В среднем значение 72%. Вполне терпимо. Сам файл channels.conf выглядит так: # 40E FirstChannel:3675:r:0:33483:650:512:1:1 Rossiya:3675:r:0:33483:660:513:1:2 RMayak:3675:r:0:33483:0:651:1:11 PlanetSky:11051:h:0:29650:524:524:524
Если для приема видео/аудио каналов AID, VID и важны (последние 3 цифры в параметрах транспондера), то для приема потока они не важны. Почти. Чтобы посмотреть, какие PID (Packet IDentifier) передаются на данной частоте, стоит запустить утилиту dvbtraffic. $ dvbtraffic 0200 0202 0203 0204 0205 0207 0208 0209 020a 020b 020c 020d 020e 020f 0210 0211 0212 022b 0309 0378 03e7 2000
2543 3926 724 1252 792 200 342 723 791 235 844 225 1232 137 194 849 373 575 359 140 140 16606
p/s 466 p/s 720 p/s 132 p/s 229 p/s 145 p/s 36 p/s 62 p/s 132 p/s 145 p/s 43 p/s 154 p/s 41 p/s 226 p/s 25 p/s 35 p/s 155 p/s 68 p/s 105 p/s 65 p/s 25 p/s 25 p/s 3048
kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s kb/s
3825 5904 1089 1883 1191 301 514 1088 1190 354 1269 339 1853 206 292 1277 561 865 540 211 211 24976
kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit kbit
Рисунок 2. Указываем интерфейс для приема DVB Network Interface Manager Version 1.1.0-TVF (Build Втр Сен 06 23:45:44 2005) Copyright (C) 2003, TV Files S.p.A Device: /dev/dvb/adapter0/net0 Status: device dvb0_1 for pid 512 created successfully.
# ifconfig dvb0_0 192.168.0.1
Для приема данных воспользуемся пакетом owns – One Way Network Sniffer [6]. Программа довольно простая. Требуется указать интерфейс, на котором будем вылавливать поток данных (см. рис. 2). Затем по вкусу выставить размер файлов. Я выставил в качестве фильтра все графические и текстовые файлы больше 100 Кб (см. рис. 3). Нажимаем на кнопку «Start Capture» и можно ждать. Получается, что потоки с номерами PID (обращаю ваше Главное, чтобы место на жестком диске не кончилось. Пока файлы постепенно начинают приходить, давайвнимание на их шестнадцатиричную нотацию) в самом начале списка и в конце наиболее оживленные. Однако пос- те обратим внимание на моральную сторону данного заняледний поток – это суммарный общий поток. Начнем с про- тия. С одной стороны, получается, что вы получаете данные, предназначенные вовсе не вам. С другой стороны, стого – опробуем самый первый. вы просто отфильтровываете один большой поток – уместно Для этого настроим dvb-интерфейс на этот PID. сравнение с радиоэфиром. Если у вас есть радиоприемник # dvbnet -p 0x200 FM-диапазона и вы умеете крутить на нем кнопки, насколь-
№2, февраль 2006
71
сети
Рисунок 3. Выставляем фильтр на размер файлов
ко неэтично слушать радиостанции FM-диапазона? Пожалуй, этично. А если вы слышите разговор по беспроводному телефону в этом диапазоне? Мне кажется, что это будет уже забота тех, кто болтает, чтобы их не слышали. В применении к спутниковому Интернету это означает, что сохранность информации зависит от профессиональности принимающей стороны. Что это означает? «Рыбалка», по-видимому, ваш промежуточный шаг к использованию асимметричного спутникового Интернета. Технология поворота антенны и получение трафика без ошибок отработана. Следующее действие – подключение к спутниковому провайдеру. А вот в этот момент вы уже знаете, что данные может получить и кто-то еще. Нужно безопасное соединение? Используйте VPN-шлюзы! Тогда ваш трафик придет в зашифрованном виде. Не желаете использовать полную шифрацию – упаковывайте архивы с паролями. В противном случае получайте данные в открытом виде, например, фильмы, звуковые файлы, книги и т. п. Аудитория спутниковых рыбаков будет вам благодарна. Но похоже мы с вами расфантазировались и забежали в будущее – пока же мы сами работаем обычными «рыболовами-спортсменами». Так, что там с полученными данными (см. рис. 4)? За 737 секунд входящий трафик оказался немаленьким – более 300 Мб. Весьма и весьма неплохо. Более 2/3 трафика пришлось на TCP-соединения, 1/3 – на другие протоколы. Чтобы сказать более точно, что это за протоколы, следует скопировать весь поток в файл и проанализировать его. В спутниковой рыбалке есть свои негативные стороны. Самый жирный минус – невозможность докачать файл или получить заново некоторые его части, если произошла ошибка. Вы же не будете звонить эфемерному, неизвестному пользователю с просьбой забрать тот или иной файл заново. Ошибка может возникнуть и на вашей стороне. Например, из-за высокой нагрузки процессора не хва-
72
Рисунок 4. Анализируем статистику приема
тило кванта времени на переключение контекста задачи и, в итоге, «вылетел» маленький кусочек большого файла. В случае, если это графический или видео-файл, то почти ничего страшного. Однако если попался архив, то увы и ах (см. рис. 5). Другой негативный момент – обилие информации. Требуются большие запасы свежего места на винчестере, т.е. это мегабайты и гигабайты свободного места, которое через несколько часов перестанет быть свободным. А отсюда вытекает проблема сортировки. В частности, у OWNS не слишком развита система фильтрации файлов. Что делать? Обратимся к альтернативной программе – skynet [6]. Нет, это не сеть из Terminator 2 – это программа отечественной инженерной мысли. Как в лучших детективах, известен о нем только позывной – s.o.v.a. Интерфейс у skynet довольно оригинальный, если не сказать спартанский (см. рис. 6). Однако, как было упомянуто на одном форуме, именно горизонтальные полоски, характеризующие процесс получения файлов, а также их разбивку по типам файлов (jpeg, avi, djvu и т. д.), являются визитной карточкой skynet. Ну и, конечно же, алгоритм сборки файлов по фрагментам. И стоит отметить особо – самый минимальный размер среди программ подобного класса – всего 150 Кб! Обращаю внимание, что ключевым файлом к успешной рыбалке является содержимое файла skynet.ini, в котором задается частота транспондера, символьная скорость и PID потоков. В моем варианте самые важные параметры выставлены следующим образом. tuner=11051000,H,29650000,A pids=512 incomplete=/mnt/BigMuzzy/SkyTest/incomplete temp=/mnt/BigMuzzy/SkyTest/temp ok=/mnt/BigMuzzy/SkyTest/ok
сети Как можно догадаться, последние три параметра – это путь к неполным файлам (у них произошел тайм-аут, после которого они перемещаются из временного каталога temp в каталог incomplete), собственно к файлам, находящимся в процессе сборки, и файлы, которые получены без ошибок. Кроме указанного skynet.ini существуют файлы regex.txt и rules.txt – названия их говорят сами за себя. В первом хранятся шаблоны, с помощью которых происходит идентификация типа файла, а во втором – правила, по которым следует ловить файлы. Предположим, что вам интересны будут только zip-файлы, предназначенные для определенного MAC-адреса. Тогда использование указанной ниже конструкции в rules.txt позволит подхватывать данные архивы. m 0011223344 +zip
Предположим, что все zip-файлы не представляют интереса, а нужны только файлы больше 500 Кб и с определенного IP-адреса. s 1.2.3.4 +zip[500k-]
Рисунок 5. Помехи при приеме вызывают потерю данных
Можно указывать не только, с какого именно IP-адреса, но и для какого адресата предназначен файл. d 1.2.3.4 +zip[-500k]
В этом случае, все zip-файлы, предназначенные для адресата с IP-адресом «1.2.3.4» и размером меньше, чем 500 Кб, попадут к вам на обработку. Чтобы во время работы добавлять/удалять нужные классы файлов, следует нажать <Ctrl+G>. На дополнительной цифровой панели справа с помощью серых клавиш «+»/«-» указать нужный диапазон размеров файлов. И не забыть нажать <Ctrl+S>. Тогда созданный файл regex.dat в директории с xskynet позволит в дальнейшем не запускать X-Server и xskynet, а непосредственно из консоли заниматься столь интересным делом, как спутниковая рыбалка. Бывает так, что файл приходит с «дырками» в архиве. Что делать? Исправлять по мере возможности. Если файлы упакованы zip, то попытаться его исправить: $ zip -FF ZipArchive.zip $ unzip ZipArchive.zip
Естественно, что целым распакованный файл не будет, но во всяком случае вам удастся его распаковать. Например, полученный мною архив с документом в pdf-формате оказался физически битым, но ошибки пришлись только на фотографии внутри документа, так что текст, можно сказать, не пострадал. Для упакованных файлов архиватором rar используйте следующую комбинацию: $ rar x -kb RarArchive.rar
Если вас заинтересовали тонкости настройки skynet,
№2, февраль 2006
Рисунок 6. Фильтрация данных в программе skynet
то нелишним будет ознакомиться с информацией волгоградского ресурса [8]. На этом пока всё. Желаю творческих успехов в сортировке полученных гигабайтов. Надеюсь, вы по-настоящему оцените тот калейдоскоп, который буквально падает на нас сверху.
Ссылки: 1. 2. 3. 4. 5. 6. 7. 8.
http://hostinfo.ru/htmltree/communication/satellite. http://www.planetsky.com. http://www.satgate.com. http://www.space-service.ru/technology.html. http://www.lyngsat.com/eam1.html. http://owns.sourceforge.net. http://skynet.mcdir.ru/files/skynet090.7z. http://www.volgosat.ru/skynet.html.
73
сети
Какова цена анонимности в Сети – А зачем тогда оно нужно? Если ты сам знаешь, что это бесполезно? – Как тебе сказать. Потому что, кроме этого, я знаю еще много других вещей, и одна из них вот какая – если ты оказался в темноте и видишь хотя бы самый слабый луч света, ты должен идти к нему вместо того чтобы рассуждать, имеет смысл это делать или нет. Может, это действительно не имеет смысла. Но просто сидеть в темноте не имеет смысла в любом случае. Понимаешь, в чем разница? Виктор Пелевин «Затворник и шестипалый»
Андрей Погребенник Когда цена анонимности почтовой переписки или совершения электронных платёжных операций высока, применимы лишь самые надёжные методы. К счастью, стойкая криптография давно перестала быть внутренним делом спецслужб, а энтузиасты со всего мира поддерживают сервера анонимных сетей и ремэйлеров электронной почты, способные обеспечить искомую анонимность.
74
сети
В
Важен и аспект современном обществе проблема балансирования между го- с ох р а н е н и я а н о сударственной безопасностью нимности и конфии индивидуальной свободой (катего- денциальности при риями столь же необходимыми, сколь условии воздейси противоречивыми) стоит как никог- твия методов социда остро. При всей сложности данно- альной инженерии го вопроса один факт неопровержим – или какого -либо те государства, в которых права и сво- давления на операбоды гражданина становятся размен- тора сервера: ведь ной монетой, как правило, не достига- прокси- или VPNют требуемой безопасности. С ростом сервера представроли Интернета как средства массо- ляют собой единую вой информации, в котором еще спо- точку отказа (едиРисунок 1. Схематическое изображение образования сеанса собна существовать свобода слова, ная точка выхода связи через сеть Tor именно он становится основным по- в большую Сеть). Многоуровневое же шифрование жительности сеансов связи узлов сети. лем конфликта. Это значит, что пора раскрыть тему анонимности и приват- и распределённый характер аноним- Для успешного проведения атаки пености в Сети. ных сетей, устраняя единую точку от- ресечения также необходима возможМы будем рассматривать ПО двух каза и единый вектор атак, позволя- ность анализа трафика в глобальных типов: ПО анонимных сетей общего ют сделать перехват трафика или да- масштабах. Классифицировано большее чисназначения и клиентов анонимных ре- же взлом части узлов сети вовсе не мэйлеров электронной почты. Специ- фатальным для общего блага собы- ло атак, но остальные выходят за рамки статьи. фика систем информационной безо- тием. В общем случае безопасность аноТеоретические работы, которыми пасности заключается в том, что разработчики вынуждены идти на ком- руководствуются разработчики ано- нимной сети прямо пропорциональпромисс между степенью защиты нимных сетей, предлагают термины, на количеству узлов-участников сети. и лёгкостью использования системы, которые автору следует определить Улучшение равномерности статистического распределения узлов также её «прозрачностью» для конечного моделью угрозы анонимной сети. пользователя. Итак, против анонимных сетей и се- является действенной мерой против Речь пойдёт о средствах достиже- тей ремэйлеров эффективны атаки пе- многих типов атак. Учитывая любиния надёжной анонимности (militant ресечения. Анонимные сети и ранние тельский характер анонимных сетей, grade anonymity), работающих поверх разработки в области криптографи- главным катализатором их развития Интернета – открытой сети, к которой ческих ремэйлеров также подверже- являются степень доверия и сотруднет доверия, что на поверку оказыва- ны тайминг-атакам (http://www.i2p.net/ ничество пользователей. Доверие же к системам такого класса возможно ется одной из сложнейших задач ин- how_threatmodel). Тайминг-атака заключается в поис- лишь при условии открытости исходформационной безопасности. Неудивительно, что за анонимность пользо- ке и анализе повторяющихся паттер- ного кода, основополагающих протокователь расплачивается увеличенной нов в частоте отправки сообщений. Ме- лов и проектной документации. Одналатентностью сети, снижением скоро- тоды защиты от тайминг-атаки вклю- ко исследования показывают, что дасти, нередко – гигабайтными объёма- чают внесение переменных задержек же в ПО движения Open Source могут в характер информационного обмена, в течение долгого времени оставатьми трафика. перемешивание и объединение сооб- ся незамеченными оставленные прощений, пересылку их блоками фикси- фессионалами потайные ходы, в свяМодель угрозы зи с чем чрезвычайно высока роль Сразу следует развеять некоторые рованного размера. Атакой «brute force» называют исследований экспертов-аналитиков заблуждения касательно более распространённых методов достижения действия могущественной третьей и криптологов. «анонимности» и конфиденциальнос- стороны, «наблюдателя», способного ти в сети, а именно VPN и анонимных прослушивать интернет-трафик в гло- Ранние анонимные сети. прокси-серверов. бальных масштабах, направленные на Freedom и Freenet VPN-т уннели по определению установление соответствия между со- Первой успешной анонимной сетью не являются средством анонимизации общением (пакетом) и его отправите- был коммерческий сервис Freedom, (я отнюдь не имею в виду конфиденци- лем. Некто со столь широкими возмож- существовавший в период с 1998 альность) соединения, уязвимости же ностями может наводнить сеть огром- до 2001 года. Компанией ZKS были наиболее распространенного их стан- ным объемом данных и изучить кор- установлены выделенные серверы, дарта (PPTP MPPE) уже стали притчей реляцию входного и выходного тра- с которыми клиенты «общались» посредством криптографического протово языцех. Анонимный прокси-сер- фика сети. Наконец атака пересечения бази- кола. Узел, на который приходили павер и вовсе не имеет ничего общего со стойкой криптографией. руется на данных о моментах и продол- кеты от пользователя Freedom, не мог
№2, февраль 2006
75
сети идентифицировать настоящего отпра- ляется полностью децентрализованвителя. Сама сеть функционировала ной – существуют 3 центральных серна уровне протокола IP. вера каталогов, хранящие подписанПеред тем как перейти к «главным ный актуальный список узлов сети Tor героям» статьи, следует сказать пару с их реальными адресами и отпечаткаслов о проекте Freenet [1] – хронологи- ми открытых ключей (генерируемыми чески также один из первых, но разви- заново каждые 7 дней), т.е. регистравающийся по сей день. Он реализовал ция серверов производится центраанонимное и конфиденциальное рас- лизованно. Что касается территорипределённое хранилище статических альной распределённости, то два из данных, не связанное с конкретным трёх серверов каталогов размещены узлом сети. В сети Freenet информа- в США, а число энтузиастских сервеция хранится в зашифрованном ви- ров в США также выше, чем в любой де, при этом ни операторы узлов сети, другой стране. Сеть Tor называют вторым поколени её создатели не знают содержимого хранимых ими данных (т.н. систе- нием сетей, построенных по принципу ма с нулевым уровнем знаний), физи- «onion routing». Суть его в следующем. ческого местоположения данных и ни- Клиентская сторона формирует цекак не могут влиять на процесс их пе- почку из трех произвольно выбранных узлов сети Tor. Среди них есть входресылки. Freenet позволяет анонимную, ной (entry node) по отношению к клибез цензуры, публикацию различных енту узел и выходной (exit node), сеть материалов, владелец файла и его Tor при этом функционирует как шлюз пользователь в равной степени ано- между клиентом и внешней сетью (Иннимны. Конфиденциальность данных тернетом). Каждый Tor-сервер «знает» обеспечивается строгой криптогра- о предшествующем ему и последуюфией. Файл можно извлечь, сообщив щем, но не более того, а замыкающие в запросе к системе ассоциированный узлы не знают, кто находится на друс ним ключ. гой стороне канала и кто инициироРоль такого ключа выполняет хэш- вал соединение. Отсутствие логическод файла или DSA-ключ, что образу- кой связи между отправителем и соет также механизм проверки целос- общением и гарантирует надёжную анонимность. тности. На рис. 1 схематически показан В разработке находится версия 0.7 проекта Freenet, – новой масштабиру- процесс анонимной пересылки сообемой сети, реализующей механизм щения. В пути, проложенном по Ин«onion routing» [2], а значит – потенци- тернету через произвольно выбранально сопоставимой по функциональ- ные серверы сети Tor красной лининости с сетью Tor, к описанию которой ей изображены зашифрованные камы и переходим. Там же будет изложе- налы, зелёной – незашифрованные. Узлы сети Tor выделяются зелёным на суть механизма onion routing. цветом. Несложно заметить, что такая схеАнонимная сеть Tor Tor [3] – наиболее известная и развитая ма делает бесполезным перехват трасреди существующих анонимных се- фика на стороне ISP (ваш провайдер тей (несмотря на раннюю стадию раз- «видит» лишь поток шифртекста, соработки, в которой пребывает проект), стоящий из пакетов постоянной длисоздаётся в США с середины 2002 года ны). в рамках проекта Free Haven [4]. ДейсИспользование Tor как шлюза на путвия же в области разработки протоко- ти к большой Сети позволяет защитить лов «onion routing» велись с середины права пользователей из стран, в кото1996 года. Корни проекта ведут к MIT, рых регулируется доступ во Всемира список спонсоров включает DARPA, ную Сеть (таких, как Китай). По крайOffice of Naval Research и Electronic ней мере на некоторое время: ведь Frontier Foundation. Распределённая такой стране достаточно заблокиросеть серверов сети Tor насчитывает вать доступ даже не ко всем сервеоколо 350 постоянно подключённых уз- рам сети Tor, а лишь к трём центральлов, а количество активных пользова- ным серверам каталогов. А в таком телей превышает 100000. Сеть не яв- случае энтузиастам останется разве
76
что искать пути разворачивания собственного сервера каталогов на основе разработанного в рамках 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-адреса или пор-
сети Правовое регулирование использования стойкой криптографии Разумеется, использование ПО, о котором идёт речь в статье, не регулируется законодательством специальным образом. Тем не менее, правовые аспекты использования средств криптографической защиты информации (СКЗИ, будь то клиентское ПО анонимных сетей или ремэйлеров или иное ПО, с которым вы работаете), заслуживают отдельного рассмотрения. Правовая модель, принятая в РФ, следует знакомому вам принципу: «разрешено всё, что явно не запрещено». Основная правовая база – законы «Об информации, информатизации и защите информации» и «О коммерческой тайне», Приказ ФСБ «Об утверждении положения о разработке, производстве, реализации и эксплуатации шифровальных средств защиты информации», Указ Президента РФ «О мерах по соблюдению законности в области разработки производства, реализации и эксплуатации шифровальных средств, а также предоставления услуг в области шифрования информации». Итак, в законодательстве РФ нет ограничений на длину ключа используемых криптоалгоритмов, а депонирование криптографических ключей частных лиц и негосударственных организаций в России не проводится, хотя в случае санкции суда подследственный обязан выдать ключ или пароль для проведения расследования. В противном случае подследственному инкриминируется сокрытие вещественных доказательств и препятствование ведению следствия. Впрочем, доказать факт преднамеренного сокрытия информации, иными словами знания ключа – задача вовсе не тривиальная, а, учитывая возможность физического разделения ключа между несколькими лицами, в т.ч. нерезидентами, порой неразрешимая. Так или иначе, о подобных прецедентах в российской право-
вой практике автору неизвестно. Далее, требование эксплуатации исключительно сертифицированных ФАПСИ средств криптографической защиты информации действительно лишь по отношению к информации, относящейся к государственной тайне, или конфиденциальной информации государственных органов власти. Сертификация служит гарантией качества алгоритма и свидетельством того, что он разработан под строгим государственным контролем. Следовательно, использование иностранных криптоалгоритмов и эксплуатация импортированных СКЗИ, в том числе включённых в дистрибутивы ОС с открытым исходным кодом, в любых частных и коммерческих целях, легальны. Что касается лицензирования СКЗИ, п. 4 Указа Президента N334 от 03.04.95 запрещает деятельность юридических и физических лиц по эксплуатации СКЗИ без лицензии, выданной ФАПСИ при Президенте РФ. В соответствии с п. 1 ст. 1 Федерального закона «О лицензировании отдельных видов деятельности» от 08.08.2001, «закон регулирует отношения, возникающие между федеральными органами исполнительной власти, органами исполнительной власти субъектов Российской Федерации, юридическими лицами и индивидуальными предпринимателями в связи с осуществлением лицензирования отдельных видов деятельности в соответствии с перечнем, предусмотренным пунктом 1 статьи 17 настоящего Федерального закона». Но перечень из п. 1 ст. 17 не включает положения о лицензировании деятельности, связанной с эксплуатацией СКЗИ, следовательно, эксплуатация лицензированию не подлежит. Подводя итоги вышесказанного, следует сказать, что регулирующее сферу компьютерной безопасности законодательство в РФ весьма либерально, впрочем некоторые противоречивые моменты вполне могут сбить с толку иного IT-специалиста.
ты, предотвращая, например, исполь- Tor, и с этой точки зрения гибкость назование filesharing-сервисов и рассыл- стройки политик – одно из наиболее мощных свойств сети Tor, повышаюку спама. Так, принятая по умолчанию поли- щих её привлекательность для энтузитика предусматривает блокирование астов, желающих поддерживать свой всех исходящих соединений на порт сервер сети Tor. TCP 25 для борьбы со спамом, а также Информация о статусе серверов портов наиболее популярных клиен- сети Tor обновляется каждые 15 митов пиринговых сетей. Поскольку вы- нут при работе в режиме сервера и 30 – ходной узел «видит» открытый текст, в режиме клиента, а подписанный спион становится слабым звеном в цепи сок всех серверов сети Tor загружает-
№2, февраль 2006
ся каждые 20 минут в режиме сервера и 1 час – в режиме клиента. Естественно, администратор может управлять этими параметрами, а также назначать группы серверов (клиент избегает одновременного использования узлов одной группы; это имеет смысл, если вы оперируете более чем одним узлом Tor). Можно даже настроить ПО на работу в режиме сервера каталогов, что позволяет развернуть самодостаточную сеть Tor в вашей локальной сети. Что касается сетевой безопасности, то здесь, кроме атак с участием «глобального наблюдателя» и таймингатак (которым по определению не могут полностью противостоять анонимные сети с низкой латентностью), угрозу представляет практическая возможность корреляции анонимного и неанонимного трафика, так как все TCP-соединения мультиплексируются в один канал. В качестве контрмеры здесь целесообразно поддерживать несколько параллельно работающих экземпляров процесса Tor. Если же пользователь поддерживает собственный сервер сети Tor, то отличить порождаемый им трафик от трафика, проходящего через его сервер от других клиентов, и вовсе невозможно. Компрометация же одного или нескольких серверов цепи к потере анонимности или конфиденциальности не ведёт. Так, если скомпрометировано c из n узлов сети Tor, то вероятность успеха компрометации случайного сеанса связи равна c 2 /n2.
Практические вопросы При настройке прикладных программ не-HTTP-приложения, не обладающие поддержкой SOCKS, должны быть подвергнуты процедуре соксификации. Гораздо проще этот процесс происходит в UNIX-подобных ОС, в Windows же он сопряжён с большими трудностями. Для этого в дистрибутив Tor включены команды tsocks и torify, использующие механизм LD_ PRELOAD; можно использовать и Socat [5] – релэй для двусторонней передачи данных между независимыми каналами (в роли которых могут выступать файлы, сокеты, специальные устройства, SOCKS-клиенты и т. д.).
77
сети Сети криптографических ремэйлеров Движение шифрпанков, возникшее в университете Беркли, ставило своей целью сохранить преимущества сети Интернет как средства самовыражения и среды для существования свободы слова и остро реагировало на любые попытки контроля и слежки. Один из разработанных ими механизмов анонимности, сети анонимных ремэйлеров, гарантирует анонимность электронной переписки. Их принято классифицировать по нескольким поколениям: так, сети нулевого поколения, type 0, состояли из одного промежуточного сервера, выполняющего задачу сродни анонимному прокси-серверу – удаление из сообщений электронной почты идентифицирующих отправителя заголовков. Слабость ремэйлеров нулевого поколения была обусловлена незащищенностью цепи «отправительремэйлер» и их централизованностью. Однако уже в следующем, первом поколении ремэйлеров (type 1) был представлен полностью переработанный протокол анонимной переписки. Широко известная сегодня система Mixmaster относится к ремэйлерам второго поколения (type 2), разрабатываемым с 1995 года. Очень амбициозен и проект Mixminion, называемый сетью третьего поколения (type 3). Современные сети криптографических ремэйлеров включают десятки энтузиастских серверов в разных частях мира. Принцип действия ремэйлеров лучше показать на примере первого поколения ремэйлеров шифрпанков. Отправитель сообщения волен выбрать несколько промежуточных серверов-ремэйлеров. Он шифрует письмо открытыми PGP-ключами выбранных серверов, начиная с последнего. Каждый промежуточный сервер расшифровывает сообщение своим закрытым ключом и удаляет все служебные заголовки, присоединяя новые. Таким образом скрывается логическая связь между отправителем и получателем сообщения, а сообщение обладает свойством анонимности. Компрометация небольшого числа промежуточных серверов не меняет общей картины. Ремэйлеры первого поколения (в отличие от последующих) не требуют специальных программ для формирования сообщения, зато вам понадобятся открытые ключи выбранных промежуточных серверов и их адреса. С адресами помогут многочисленные сайты статистики, ключи же можно получить на специальных страни-
78
цах или же запросить у самого сервера, отправив на его почтовый адрес письмо с темой remailer-key. Проект Mixmaster [19] представил не только средства защиты от анализа трафика, но и функциональность сервера псевдонимов, или ним-сервера. Как средство защиты от анализа трафика были реализованы: дополнение/разбивка сообщения на блоки постоянного размера в 28 Кб; внесение случайной задержки во время отправки каждого блока и «перемешивание» блоков сервером-ремэйлером. Двусторонняя же пересылка анонимных сообщений реализована благодаря связыванию псевдонима отправителя с сообщением. Фактически «обратная связь» была предусмотрена еще в ремэйлере нулевого поколения – знаменитом anon.penet.fi Йохана Хельсингьюса. Сервер anon.penet.fi ассоциировал с адресом отправителя сообщения адрес вида anXXXX@anon.penet.fi. Если получатель отправлял ответное сообщение на такой адрес, сервер пересылал ответ обратно на почтовый адрес автора первого сообщения. В 1996 году Хельсингьюс закрыл свой сервис, через год после того, как под угрозой судебного преследования был вынужден выдать адреса отправителей некоторых анонимных писем. Чтобы не допустить подобных инцидентов, ремэйлеры со времен Mixmaster хранят ассоциированные с псевдонимом адрес и открытый ключ, предварительно зашифровав их открытыми ключами серверов-ремэйлеров. На сайте проекта QuickSilver [20] можно загрузить реализацию протокола Mixmaster для платформы Windows, отличную от референсной. Хотя проект Mixminion [21] – сеть анонимных ремэйлеров третьего поколения – все еще находится в ранней стадии разработки, представленные им идеи более чем интересны. Сторона-отправитель разбивает сообщение на пакеты постоянной длины и выбирает для каждого пакета последовательность серверов, через которую пакет будет передаваться, при этом каждый пакет содержит информацию о следующем сервере на своем пути. В рамках протокола Mixminion разработана также технология Single-Use Reply Blocks (SURBS), обеспечивающая анонимность получателя письма, и технология взаимной анонимности отправителя и получателя. Другие нововведения включают выделенные серверы каталогов, ограничение срока жизни ключа, применение TLS и другое.
Для Linux существует экспериментальное решение для соксификации всех сетевых соединений на уровне ядра – Kernel Socks Bouncer [6]. Для прозрачного соксифицирования программой пользовательского режима Linux можно использовать TranSocks [7] и Transproxy [8] в связке с iptables. Впрочем, Transproxy поддерживает и FreeBSD с ipfw, но проксирует эта программа лишь HTTP-трафик. На платформе Windows дейс т в е н н ы п р о г р а м м ы Fr e e C a p [ 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),
сети и то лишь при условии грамотного проEchelon ляется частью комплекса Echelon. Внедграммирования. Потому рекомендуется в настрой- Общим свойством любых анонимных се- ренная как средство контроля над СССР ках, обладающих поддержкой SOCKS- тей или сетей криптографических ремэй- система Echelon сегодня стала не тольприложений явно указывать IP-ад- леров является уязвимость по отношению ко весомым аргументом в борьбе с межреса вместо доменного имени. Для к слежке со стороны могущественного дународным терроризмом и наркоторговразрешения доменных имен в IP-ад- «глобального наблюдателя». В данном кон- лей, но и орудием, способным утвердить реса анонимным образом следу- тексте следует помнить о факте существо- превосходство стран-участников на полиет использовать команду tor-resolve, вания автоматизированной системы конт- тической арене. Существуют факты, поза в Windows – и анонимный DNS-сер- роля и слежения Echelon. Echelon был со- воляющие предположить о применении здан к 1971 году альянсом англоязычных Echelon в качестве орудия промышленновер TorDNS [13]. Работой в режиме клиента или сер- стран UKUSA, образованным в качестве го шпионажа или средства внутреннего навера управляет параметр ClientOnly. агентства перехвата и разведки инфор- блюдения (domestic surveillance). Во многих других странах разработаДля использования Tor в качестве мации (signal intelligence) специальными клиента в общем случае не требу- агентствами англоязычных стран во гла- ны собственные средства глобального конется ни малейших изменений в кон- ве с National Security Agency (NSA) США. троля и слежения, аналогичные Echelon. фигурации по умолчанию, настрой- В альянс UKUSA входят и ведомства Ве- Так, в России функциональным аналогом ка же Privoxy исчерпывается внесе- ликобритании, Канады, Австралии и Но- служит СОРМ (система оперативно-ранием в файл конфигурации Privoxy вой Зеландии, а некоторые «третьи» стра- зыскных мероприятий), в странах Евросо(/etc/privoxy/config или /usr/local/etc/ ны имеют на своей территории оборудова- юза действует система RES, а в США поprivoxy/config большинстве UNIX-по- ние комплекса Echelon. До сих пор отсутс- мимо Echelon одно время существовала добных ОС) одной строки, задающей твует исчерпывающая информация о сис- и локальная система Carnivore. Как бы то перенаправление HTTP-соединений теме Echelon, а правительство США офици- ни было, общая тенденция такова, что даально не признало её существования. Ис- же мощности Echelon недостаточно для в сеть Tor посредством SOCKS 4a: forward-socks4a / localhost:9050
Есть у Privoxy и веб-интерфейс: он будет доступен по адресу: http://config. privoxy.org. Настройка сервера Tor включает выбор nickname и порта (ORPort). Информацию о себе (включая слепки сгенерированных ключей и свой статус) сервер автоматически передаст серверам каталогов. Последующие шаги обычно включают ограничение пропускной способности (что рекомендуется в случае обладания асимметричным подключением), установку лимита трафика (иначе сервер сети Tor может потреблять сотни гигабайт трафика ежемесячно) и выбор политики участия в сети.
«Скрытые» ресурсы сети Tor Хотя Tor используется преимущественно для анонимизации на стороне клиента, существуют и анонимные сервера, предоставляющие внутри сети Tor «скрытые» ресурсы, отличаемые с доменным суффиксом .onion. При этом гарантируется взаимная анонимность клиента и сервера. Так устроены системы анонимных блогов, электронной почты, IRC, Jabber, USENET, форумы/BBS, Wiki, SSH, серверы PGP-ключей и пр.
№2, февраль 2006
точником имеющихся сведений послужили несколько отчетов о Echelon и книга «Secret Power: New Zealand’s Role in the International Spy Network», увенчавшая 12-летние исследования Nicky Hager. Известно, что система Echelon наделена функциями перехвата трафика радиоэфира и линий спутниковой, радиорелейной и сотовой связи, телефонных линий и компьютерных сетей. Мощность комплекса Echelon, по имеющимся сведениям, достаточна для перехвата миллиардов сообщений ежечасно. Работу системы обеспечивают передовые разработки в области систем анализа трафика и обработки данных, в частности – систем искусственного интеллекта. Наиболее производительная в мире система NAS, использующая твердотельные диски (solid-state disk, SSD), яв-
анализа всего передаваемого в электрических и волновых каналах связи трафика, а следовательно – подобные системы вынуждены действовать выборочно и целенаправлено, в соответствии с наборами фильтров. Проблема приватности и анонимности в Сети отнюдь не умаляется европейскими органами власти: так, Европарламент в отчете о Echelon 2001 года рекомендовал гражданам стран ЕС применять средства криптографии для защиты права на приватность, а в 2004 ЕС выделил 11 миллионов евро на развитие проекта SECOQC (Secure Communication based on Quantum Cryptography) – системы квантовой криптографии, теоретически неподверженной воздействию Echelon или подобных ей систем.
Есть и шлюз 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. Большое количество
79
сети Так, каждый узел туннеля «знает», жит записей для многих сайтов сети – исправить положение можно, до- частью какого туннеля он является. К примеру, если для передачи сооббавив строку: щения используется туннель из 2 узАнонимная сеть I2P http://orion.i2p/hosts.txt лов, и Боб получает сообщение от ЧарСеть I2P [17] возникла в 2003 году как форк проекта Freenode. При обмели, которое он должен переслать Алине данными по I2P выполняется их мно- в раздел управления вашими под- се, очевидно, что Алиса является погоуровневое шифрование (сквозное, писками (http://localhost:7657/susidns/ лучателем сообщения. туннельное, шифрование транспорт- subscriptions.jsp). К выходу первого публичного релиПользователь сети может легко со- за разработчики планируют устранить ного уровня) и криптографическая аутентификация конечных узлов. здать собственный сайт, так называе- известные слабые места. Хоть прямое Узлы сети I2P представлены иден- мый eepsite, доступный только в сети сравнение I2P и Tor и не совсем корректификаторами, не имеющими логи- I2P через eepProxy. Впрочем, послед- тно, нельзя не отметить более распреческой связи с их реальными IP-адре- нее не совсем верно – «входной» прок- делённый и самодостаточный хараксами. Клиентское программное обес- си-сервер [18] позволяет получить до- тер первой, преимуществом является печение функционирует как I2P-мар- ступ к ресурсам сети I2P из любого уз- и применение в I2P туннелей одностошрутизатор, записывающий в табли- ла Интернета, просто дописав tin0.de роннего типа. Принятые разработчиками решецу данные узлов для передачи входя- к URL ресурса сети I2P. После запуска I2P на порту 4444 ния в сумме обеспечивают лучшее сощего и исходящего трафика. Передаваемый пакет проходит временные од- ожидает соединения прокси- сер - крытие сетевой активности. Тем не меносторонние цепочки: маршрутизато- вер. Privoxy можно сконфигурировать нее до выхода новых релизов, большеры исходящего трафика, построенные на доступ к ресурсам Tor и I2P одновре- го распространения сети I2P и публина узле-отправителе, и маршрутизато- менно, добавив в файл настроек сразу кации результатов её научных исслеры входящего трафика, построенные после строки Tor следующее: дований (без которых сложно предузлом-адресатом. Такие туннели пеставить проект на стыке анонимности forward .i2p localhost:4444 и криптографической науки) следует рестраиваются каждые 10 минут. Уппризнавать Tor изученным средством равляя длиной цепочки маршрутизаторов в клиентском ПО, пользователь Все запросы к ресурсам, доменное анонимности. ПО сети I2P относится к категовыбирает для себя нужное соотноше- имя которых заканчивается на .i2p, буние между степенью анонимности, ла- дут идти через сеть I2P, а остальной рии Open Source; реализации прототентностью и пропускной способнос- трафик – через Tor. кола I2P и SDK выполнены на языке Использование Tor здесь обосно- Java, а следовательно – кроссплаттью сети. Передаваемое же сообщение проходит такой путь, который от- вано, поскольку сайты I2P могут со- форменны. Управление ПО сети I2P произвовечает моделям угрозы отправителя держать рисунки, cgi-скрипты, фрейи получателя. мы, размещенные на серверах боль- дится через веб-интерфейс и настольВ то время как Tor служит промежу- шой Сети, с которыми охотно уста- ко просто, что не нуждается в дополточным звеном для анонимного досту- новит соединение клиент I2P. А мощ- нительных разъяснениях с моей стопа клиента в большую Сеть I2P пресле- ность и надежность выходных узлов роны. Существует и простой API с фундует цель анонимного доступа к внут- I2P гораздо ниже, чем у Tor: повторимренним ресурсам I2P в первую очередь. ся, этот проект ставит перед собой не- кциональностью Simple Anonymous Внутренние ресурсы сети I2P, иденти- сколько иные цели. Messaging (SAM) для языка С, в разраБудучи основанной на UDP (вернее ботке находятся API для Perl и Python, фицируемые доменным суффиксом i2p, предоставляют сервисы аноним- его модификации Secure Semireliable что обещает проекту долгую жизнь. ных блогов («Syndie»), анонимного до- UDP, SSU, имеющей функции ауступа в сеть IRC («ircProxy»), аноним- тентификации, управления потоком JAP: Java Anon Proxy ной электронной почты («Susimail»), и пр.), IP2 предлагает мост TCP/I2P, Проект JAP, он же AN.ON [22], преслепередачи файлов, групп новостей, т.н. I2PTunnel, обеспечивающий пере- дует гораздо менее глобальные цели, шлюзы сетей Freenet и Mnet. Сущест- дачу TCP-пакетов по сети I2P, а следо- чем два предыдущих: JAP предназнавуют и выходные узлы для анонимного вательно – и средство создания защи- чен для анонимизации только HTTPвеб-сёрфинга посредством анонимно- щенных туннелей к любым TCP-служ- трафика. Хотя само ПО поддерживаго HTTP-прокси, «eepProxy». бам, в доступе к которым может воз- ет и SOCKS, разработчики аргуменСписок сайтов сети I2P доступен никнуть необходимость. тируют поддержку своими серверапо адресу orion.i2p, для поиска в сеНа момент написания статьи ко- ми лишь HTTP с высоким риском злоти I2P можно использовать search.i2p личество серверов сети оценивается употреблений. Пересылка трафика или eepsites.i2p. цифрой порядка 300, и для достиже- производится в зашифрованном виСразу после запуска ПО интегриро- ния более высокого уровня безопас- де через фиксированный каскад миксванная адресная книга (средство раз- ности сеть должна обрести большее серверов: пользователь не имеет возрешения имен в сети I2P, простой тек- количество пользователей. можности составить произвольную цеСуществуют и другие проблемы. стовый файл) вашего узла не содерпочку серверов. Преимущество дандополнительной информации находится на страницах [16].
80
сети ного подхода в том, что так проще до- ция JAP не безупречна, а Tor и I2P явстичь той «критической массы» поль- ляются гораздо более привлекательзователей, которая гарантирует вы- ными средствами обеспечения насокую степень анонимности, а так- дежной анонимности и конфиденциже более высокой скорости серфинга альности. (и она действительно выше, чем у полностью распределенных сетей). Кроме Заключение того, поскольку пользователь не слу- Безусловно, мы не открыли вам лёгкожит в данном случае конечным звеном го и универсального пути достижения цепи, то он защищен от посягательств надёжной анонимности, но «швейцарсо стороны лиц, желающих завладеть ских ножей» в данной области попросданными (ведь он не служит промежу- ту не существует: безопасность и проточным звеном при передаче трафика стота вообще слабо совместимые поот других узлов; впрочем, exit policies нятия. Я не ставил своей целью предсети Tor предоставляют более гибкое ложить вам готовое решение: в посторешение данной проблемы). Компро- янно меняющемся мире информационметация анонимности клиента невоз- ной безопасности (а тем более в сравможна без перехвата всего входящего нительно новой и экспериментальной и исходящего трафика всех узлов кас- области анонимности) это было бы када и их содействия с целью расшиф- преступлением. Успеха, по моему мнеровывания пакетов. нию, можно достичь лишь путём граС помощью функции forwarding су- мотного и прагматичного комбинироществует возможность предоставлять вания существующих средств анониманонимный доступ другим клиентам. ности и конфиденциальности, к котоС мая 2005 года JAP умеет использо- рым нет и не может быть абсолютновать узлы сети Tor в качестве каска- го доверия, таким образом, чтобы обда для анонимизации HTTP-трафика. разованная система соответствовала Это происходит автоматически в том ценности защищаемых данных и стеслучае, если в настройках браузера пени ущерба в случае нарушения ановыбран SOCKS-, а не HTTP-прокси. нимности. JAP гарантирует шифрование трафика Так, разумным подходом выглядит от клиента до каскада JAP-серверов, сочетание нескольких средств достино не выполняет дополнение пакетов жения анонимности и/или конфидендо постоянного размера, чего заведо- циальности в сети: анонимных семо недостаточно для противостояния тей, прокси, туннелей OpenVPN, SSH атакам, основанным на анализе тра- и SLIRP [23]. Даже в области анонимфика. Полная конфиденциальность пе- ной переписки следует изучить возредаваемых данных достигается лишь можность комбинирования анонимв случае дополнительного шифрова- ной сети Tor и криптографических рения на верхних уровнях с помощью та- мэйлеров, имеющих точку входа внутких протоколов, как SSL. Со второй по- ри сети Tor (таких, как Pantha Rei [24] ловины 2006 года в рамках JAP решено или Bananasplit [25]. Тема анонимности в Сети побуждапредоставлять платный премиум-сервис, так как проект лишился прежнего ет великое количество вопросов правоисточника финансирования. вого, политического или этического хаРеализация JAP выполнена на язы- рактера, предвосхитить которые хочетке Java, ПО – свободно и кроссплат- ся словами Б. Франклина, произнесёнформенно. Программа разработана ными им более 200 лет назад: «Те, кто в Германии, каскад JAP-серверов рас- готовы пожертвовать своими фундаположен там же. Известен случай ком- ментальными свободами ради временпрометации сети германским Federal ной безопасности, не заслуживают ни Bureau of Criminal Investigation, FBCI. безопасности, ни свободы». В реализацию JAP разработчиками был встроен потайной ход (backdoor), Ссылки: а пользователям настоятельно реко- 1. http://freenetproject.org – официальный мендовали провести обновление ПО. сайт проекта Freenet. Вскоре суд признал действия FBCI не- 2. http://www.onion-router.net – описание легитимными, а потайной ход из кода концепции onion routing, архив публиJAP устранен. Так или иначе, репутакаций.
№2, февраль 2006
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. ht t p : / / t r a n s o c ks . s o u rc e fo r g e.n e t – TranSocks, прозрачный соксификатор пользовательского режима Linux. 8. ht tp: // transprox y.sourceforge.net – Transproxy, прозрачный HTTP-прокси. 9. ht tp://w w w.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: // w w w.freehaven.net /~arrakis / 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.sourc eforge.net – Mixmaster, анонимный ремэйлер второго поколения. 20. h t t p : / / w w w . q u i c k s i l v e r m a i l . n e t – QuickSilver – альтернативная реализация Mixmaster для платформы Windows. 21. http://www.mixminion.net – Mixminion – анонимный ремэйлер третьего поколения. 22. http://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-ремэйлер.
81
сети
Доставку гарантируем: качество обслуживания в пакетных сетях Сергей Сикорский Если вы частенько работаете по ssh удаленно, слушаете интернет-радио или просто играете в online-игры, то наверняка замечали, что получаемое от этого удовольствие прямо пропорционально нагрузке на вашу сеть.
Б
удь то Windows Update с вашей же машины, или FlashGet с соседней, все равно приложениям надо будет «поделиться». Вот вам и «изюминка» совместного использования интернет-канала – постоянные скачки, рывки и задержки. Иными словами, ваши данные не получают соответствующего качества обслуживания (Quality of Service, QoS). И к несчастью, это так же неизбежно, как налоги… Задержки отдельных дейтаграмм на пути от отправителя к получателю являются принципиальной особенностью сетей с коммутацией пакетов (таких, как сети TCP/IP), из которых собственно и состоит Интернет. Но где есть спрос – там всегда есть предложение, и на сегодняшний день существует целый ряд технологий, позволяющих свести к минимуму влияние «врожденных» недостатков этого метода передачи данных. О них и пойдет речь в этой статье.
Качество обслуживания – какой же этот «серверный» олень?.. Под «качественным обслуживанием» обычно понимают выполнение неких требований, предъявляемых приложением к сети, для удовлетворительной его работы. Что это за требования, зависит от типа задач, решаемых приложением. Одним важна скорость, другим – время доставки данных, третьим – и то, и другое. В общем случае, основными критериями понятия «качества обслуживания» являются: Параметры пропускной способности – минимальная, средняя и максимальная. Параметры задержек – их величины и вариации.
82
Параметры надежности – про- в довольно больших пределах. Когдацент потерянных и искаженных пакетов. Самый простой способ гарантировать их выполнение – избыточность, то есть если сеть будет быстрее и надежнее «чем надо», проблем наверняка не будет. Если же это невозможно, необходимо на всем пути пакетов, из конца в конец, обеспечить соответствующее качество обслуживания «вручную».
Коммутация каналов – светлое прошлое QoS Строго говоря, гарантировать постоянство характеристик качества обслуживания некоего потока данных можно только в сетях с коммутацией каналов (аналоговых или ISDN). В таких сетях выделенный канал обычно используется монопольно, а его параметры известны заранее и неизменны на протяжении всего сеанса связи. Но как ни странно, это же является и основным недостатком такой техники передачи данных. Невозможность перераспределения неиспользуемых ресурсов абонентов приводит к неэффективному использованию сети в целом и значительно сказывается на ее стоимости. Таким образом, метод коммутации каналов хоть и позволяет удовлетворить требования к качеству обслуживания, но не имеет будущего в гетерогенных сетях. Сети с коммутацией пакетов лишены этого недостатка, причем лишены настолько, что в принципе не дают возможности что-либо гарантировать – качество обслуживания отдельных пакетов зависит от общей загруженности сети, которая может варьироваться
то давно, во времена магнитных лент и бородатых инженеров, это всех устраивало, но сейчас требования приложений к качеству обслуживания существенно возросли и продолжают увеличиваться. Разумеется, тенденция не осталась незамеченной – решений, соответствующих требованиям, хватает. Вот только работают они разными способами и с разной эффективностью.
Frame Relay, ATM и MPLS – дорого, но сердито Все три технологии используют метод коммутации виртуальных каналов для передачи данных и работают по принципу предварительного резервирования полосы пропускания. Но при этом используя технику коммутации пакетов, что делает их более эффективными и менее дорогостоящими в сравнении с классическими сетями коммутации каналов. Технология Frame Relay основывается на передаче кадров, но возникла как служба в сетях ISDN. За счет предварительного резервирования пропускной способности на всем пути следования дейтаграмм технология Frame Relay позволяет гарантировать основные показатели качества обслуживания – среднюю скорость передачи данных при допустимых пульсациях трафика, просто отбрасывая пакеты, поступающие слишком быстро. Правда, технология Frame Relay не очень подходит для передачи интерактивных данных, поскольку не гарантирует отсутствия задержек. Еще одним недостатком Frame Relay является низкая пропускная способность – всего 2 Мбит/с.
сети ATM – технология асинхронного до- ки – FastEthernet и GigabitEthernet так- ит из трех битов IP Precedence и честупа (Asynchronous Transfer Mode) бы- же не получили таких возможностей тырех битов, собственно указывала создана с учетом все возрастаю- поскольку разработчики сочли ус- ющих на тип сервиса (последние щих потребностей приложений в про- ложнение этих технологий излишним два бита не используются и должны пускной способности сети, требуе- ввиду больших скоростей передачи быть нулями). Восемь двоичных знамом качестве обслуживания и недо- данных, им присущих. Стандарт IEEE чений IP Precedence (от 000 – обычстатков уже существующих техноло- 802.1Q, который был разработан от- ный трафик, до 111 – служебная ингий. ATM подходит для передачи лю- носительно недавно и определяет ос- формация маршрутизаторов) ознабых видов трафика, обладает мощ- новные правила построения вирту- чают, что на границе сети при необными средствами обеспечения QoS, альных локальных сетей, расширя- ходимости (высокой загруженности а диапазон поддерживаемых скоро- ет заголовок Ethernet-кадра на 4 бай- каналов, например) из всего потока стей очень широк – от десятков мега- та (путем уменьшения размера поля данных дейтаграммы с меньшим знабит до нескольких гигабит. Но универ- пользовательских данных), из кото- чением Precedence могут быть сбросальность этой технологии ее и по- рых три бита отводятся под приоритет шены без повторных попыток доставгубила, сделав ее слишком сложной, кадра (802.1p). Таким образом, появ- ки по назначению. А биты типа сервидорогостоящей и… неэффективной ляется возможность «поделить» тра- са – Low Delay, High Throughput, High на практике. Владельцы уже сущест- фик на восемь классов, с последу- Reliability и Minimize Monetary Const, – вующих сетей не спешили переходить ющей соответствующей обработкой указывают на необходимость отпрана новое дорогое оборудование. А тем (коммутаторы и мосты, не поддержи- вить пакет по каналу с наименьшей завременем появились методы обеспе- вающие 802.1p, должны «не замечать» держкой, наибольшей пропускной спочения QoS в (уже популярных) сетях эти биты). собностью, надежностью и наименьНу а для настоящих любителей шей стоимостью (с финансовой точTCP/IP и дешевый Gigabit Ethernet, способный удовлетворить даже очень се- «быстрой езды», да еще и по «бездо- ки зрения) соответственно. Использование поля TOS хотя рьезные требования к пропускной спо- рожью», сегодня существует Gigabit Ethernet, работающий даже на кабе- и позволяет в некотором роде приорисобности. Самая новая из рассматривае- ле UTP пятой категории, что делает тезировать трафик, но не является домых технологий – Multi-Protocol Label эту технологию необычайно недорогой статочно гибким. Например, если адSwitching (MPLS, RFC-3031) благода- и эффективной. Забавно – она облада- министратору надо повысить приориря своей гибкости может использо- ет всеми недостатками ее предшест- тет каким-то двум видам трафика над ваться для целого ряда задач. В ос- венников, но это совершенно не ска- остальными, то это в принципе вознове ее лежит использование меток – зывается на темпах ее распростра- можно. Но указать при этом, что при седополнительного заголовка, которым нения. Основные причины тому – ско- рьезной загруженности каналов можснабжаются поступающие в сеть паке- рость и стоимость, которые покрыва- но одним из них пожертвовать в польты. Метка содержит всю необходимую ют и отсутствие средств обеспечения зу второго – уже нельзя. Кроме того, не MPLS-маршрутизаторам информацию качества обслуживания, и другие не- стоит ожидать, что простая установка для передачи пакетов, данные IP-за- достатки технологии, такие как невоз- его в нужное значение что-либо гаранголовка для выбора пути дейтаграмм можность построения сетей с избыточ- тирует. Это связано с тем, что на сегодвнутри сети не используются. Это поз- ными связями. няшний день поле TOS чаще игнорируволяет сократить накладные расходы ется, чем используется, а маршрутизана анализ заголовков пакетов, сокра- Качество обслуживания торы имеют право его менять по своещая таким образом задержки их про- в сетях TCP/IP – мечтать му усмотрению. Хотя в пределах вадвижения и нагрузку на оборудова- не вредно шей сети вы вольны использовать поние. Кроме того, использование тех- Стек протоколов TCP/IP до недав- ле TOS как считаете нужным. ники виртуальных каналов позволя- него времени практически не имел ет конструировать пути прохождения средств управления трафиком. Более IntServ и DiffServ – пакета оптимальным образом (Traffic того, при разработке основных про- две стороны одной Engineering) и предварительно зака- токолов стека главный упор делался медали зывать требуемую пропускную способ- на максимально возможную утилиза- Чтобы удовлетворить все возрастаюность. Сфера применения MPLS не ог- цию каналов, в результате чего даже щие требования к качеству обслуживараничивается задачами управления нескольким потокам одного приложе- ния данных в сетях TCP/IP, организацитрафиком, но имеет необычайно бога- ния приходится «бороться» между со- ей Internet Engineering Task Force (IETF), тые возможности для их решения. бой за право отправить пакет, а уж были разработаны две модели прео качестве обслуживания не может доставления QoS – IntServ и DiffServ. идти и речи... Модель IntServ (RFC-1633, RFC-2212, Gigabit Ethernet Поле Тип Сервиса (Type Of Service, RFC-2215) с помощью протокола сиги стандарт 802.1Q/p – TOS) IP-пакета и является меткой, поз- нализации RSVP (ReSerVation Protocol, сила есть... и остальное тоже воляющей указать желаемое качес- RFC-2205) позволяет «заказывать» Классический Ethernet не имеет средств тво доставки пакета, но только в об- желаемую пропускную способность управления трафиком. Его наследни- щих чертах. По RFC-1349, оно состо- на всем пути продвижения пакета,
№2, февраль 2006
83
сети за счет чего и гарантирует качество доставки данных. Это похоже на принцип работы Frame Relay, за тем исключением, что речь идет не о виртуальном канале (ввиду его отсутствия), а о потоке данных между двумя приложениями (однозначно идентифицируемом IP-адресами источника/назначения, портами и транспортным протоколом). Разумеется, все оборудование, через которое пойдут данные, должно поддерживать такую модель обслуживания. IntServ хорошо справляется со своими обязанностями (гарантируя пропускную способность), но сложность реализации и цена поддерживающего RSVP-оборудования ограничивают его применение крупными корпоративными сетями. Принципом работы DiffServ (RFC2474, RFC-2475) является распределение трафика на классы, называемые Class of Service (CoS) и применение к этим классам неких параметров QoS. Для этого пакеты маркируются по полю TOS-заголовка IP-пакета, а затем обрабатываются желаемым образом. В технологии DiffServ поле TOS называется DS (Differentiated Services), в котором первые 6 бит используются для задания до 64 (26) классов трафика (и называются Differentiated Services Code Point, DSCP), а два последних пока не используются. Одной из ключевых особенностей DiffServ является то, что трафик маркируется в классы оборудованием по всей сети, а маршрутизаторам, осуществляющим обработку трафика, достаточно лишь распределить доступные ресурсы между ними, что обеспечивает хорошую производительность.
Классификация данных – что, где, куда? Эталонная модель OSI определяет семь уровней взаимодействия систем в сетях с коммутацией пакетов, которым должны соответствовать уровни стеков коммутационных протоколов. Но поскольку многие протоколы (например, TCP/IP) были разработаны до появления модели OSI (начало 80-х годов), они соответствуют ей не полностью. Стек протоколов TCP/IP, получивший на сегодняшний день наибольшее распространение, имеет 4 уровня: при-
84
кладной, транспортный, уровень межсетевого взаимодействия и уровень сетевых интерфейсов. В принципе, классифицировать трафик для последующей обработки можно на всех четырех уровнях стека, начиная с маркировки данных на основе MAC-адресов и вплоть до попыток доставки пользователям html-страниц со словом «трафик» с наименьшей задержкой. Но первый подход не очень гибок, поскольку не позволяет «творчески» подойти к разграничению трафика, а второй – слишком требователен к системным ресурсам и не дает никаких гарантий по определению. Таким образом, самые популярные и эффективные методы классификации трафика основываются на анализе адресов источника/назначения IP-пакетов и TCP-, UDP-портов. То есть речь идет о транспортном и уровне межсетевого взаимодействия. Очень важно при выборе политики обслуживания данных учитывать принципы работы транспортного протокола, доставляющего эти данные. Например, протокол TCP постоянно следит за качеством передачи данных, и потеря пакетов для него – сигнал к уменьшению скорости их передачи. Таким образом, преднамеренно уничтожая слишком быстро поступающие TCP-пакеты, можно «заставить» отправителя снизить интенсивность их отправки. Это довольно грубый метод управления скоростью потока – корректнее было бы манипулировать значением поля Window TCP-пакета, или, в крайнем случае, преднамеренно задерживать квитанции о получении (ACK). Но простота реализации и неприхотливость к системным ресурсам сделали такой метод управления трафиком довольно популярным. Например, принцип умышленного уничтожения пакетов лежит в основе всех разновидностей RED (Random Early Detection) – механизма предварительного обнаружения перегрузок, который в случае превышения заданной (но еще не критичной) скорости поступления данных уничтожает пакеты, случайным образом выбранные из потока. Дальнейшим развитием этой идеи является задержка пакетов вместо уничтожения, что позволяет избежать их повторной передачи, но требует больших накладных расходов. А вот преднамеренно уничтожать
пакеты протоколов, не осуществляющих контроль передачи данных (таких, как UDP) ни в коем случае нельзя, поскольку это приведет только к увеличению их потока (из-за повторной передачи), если приложение само следит за их доставкой. Исходя из этого крайне не желательно определять в один класс TCPи UDP-потоки, ведь при «недостатке» скорости, TCP-протокол будет постоянно уменьшать интенсивность передачи, а UDP – «подгребать» под себя освободившиеся ресурсы, образовывая замкнутый круг.
Средства узла для обеспечения QoS – для тех, кто на такси в булочную не ездит Все рассмотренные выше средства обеспечения качества обслуживания подразумевают использование единой технологии передачи данных на всем пути следования пакета. Более того, вы обязаны либо быть владельцем сетей, по которым передаются ваши данные, либо арендовать их – как минимум на время их использования. А что же делать, если вы – всего лишь администратор частной сети, пользователи которой, видимо, ощущая жгучий информационный голод, так и ломятся в ваш и без того узкий канал Интернет? Вася из бухгалтерии сутками напролет мультики качает, начальник в трубку жалуется, что у него «почта тормозит», а вам – так вообще давно пора «мифриловые перчи» покупать, но так «лагает», что играть невозможно… Можно ли что-то сделать в этом случае? В принципе, да, но насколько хорошо это у вас получится, зависит от нескольких факторов. Самые важные из них – является ли ваш шлюз в Интернет самым узким местом на всем пути следования пакетов, какой именно шлюз используется в вашей сети, и насколько хорошо вы себе представляете, как он работает. Если коротко – у каждого сетевого интерфейса вашего маршрутизатора есть очередь устройства (queue of a device), в которую попадают все пакеты перед отправкой их непосредственно в «железяку». Это область памяти, откуда драйвер устройства выбирает пакеты по одному и обрабатывает.
сети Размещением пакетов в очереди оритизации «на месте», конечно, не бузанимается так называемая «дисцип- дет. Самый простой способ предотвралина обработки очереди». И по умол- тить это – использовать высокоскочанию, это скорее всего разновидность ростные технологии локальных сетей FIFO (First In First Out, «первым при- (такие как FastEthernet) и не забыть шел – первым ушел») – самый прос- про пунктик в договоре с ISP, о гарантой способ обработки пакетов, досто- тированной полосе пропускания. Доступные вам средства управлеинствами которого являются простота и скорость, а недостатками – собс- ния трафиком зависят от используетвенно, отсутствие методов обеспече- мого оборудования. Смею предполония QoS. Все дисциплины, работаю- жить, что если вы все еще читаете эту щие по принципу FIFO, просто помеща- статью, то явно не сидя на ящике от кают приходящие пакеты в некий буфер кого-то магистрального маршрутиза(очередь), постепенно выводя из не- тора, но это вовсе и не обязательно. го пакеты, пришедшие раньше, а при Даже обычная машина, под управлеего заполнении – отбрасывают новые нием ОС Linux, имеет довольно бога(безвозвратно), пока под них не осво- тые возможности по управлению трабодится место. фиком. Другое дело – что настроить их Но поскольку скорость обработки оптимальным образом бывает довольданных системой обычно значительно но сложно (хотя это относится не тольвыше, чем скорость их передачи в сеть, ко к Linux. становится возможным использовать другие, довольно сложные алгорит- SLA – доверяй, мы обработки очереди, которые будут но проверяй не просто помещать пакеты в очередь Когда речь заходит о предоставлепо одному, но и выстраивать их в оп- нии услуг гарантированного качестределенной последовательности, от- ва, очень важно сначала определитьбрасывать или совершать иные дейс- ся с тем, что собственно подразуметвия. В результате всего этого стано- вается под словами «качество» и «гавится возможным управлять потоками рантии». Соглашение об уровне обслутрафика по своему усмотрению (в ра- живания (Service Level Agreement, SLA) как раз и является тем документом, зумных пределах). Подобно технологии DiffServ вы на основании которого потребитель можете попытаться менять приори- и провайдер заключают договор о претет некоторых потоков трафика та- доставлении услуг. В нем описываются параметры ким образом, чтобы дать преимущество тем пакетам, которым оно дейс- QoS, методы проверки и санкции за натвительно необходимо. При этом сов- рушение обязательств (как поставщисем не обязательно маркировать па- ка услуг, так и пользователя), всяческеты «по порту» на коммутаторах или кие дополнительные услуги и соглашеиспользовать еще какое-то дополни- ния. В общем случае, обычно говорится тельное оборудование – все действия об усредненных значениях неких покабудут производиться на вашем шлю- зателей за определенный период врезе. Например, пакеты приложений, не мени и их допустимых пульсациях. требовательных к задержке (первый SLA может быть составлен как в инкандидат – smtp-данные) могут «ме- дивидуальном порядке, с учетом спеняться местами» в очередях устройств цифики работы конкретного абонента, с пакетами более интерактивных при- так и быть типовым договором, подпиложений, чтобы уменьшить задержку сываемым с любым клиентом при подих прохождения. ключении. Но все это реализуемо, только если ваш шлюз – действительно единс- Заключение твенное место, где эти задержки вно- Так или иначе, на сегодняшний день сятся. Если до того, как пакеты посту- средства управления трафиком играпят на маршрутизатор (где-то в вашей ют большую роль в качественном пресети), или после того, как покинут его доставлении телекоммуникационных (на каналах провайдера или выше), услуг. Даже если сейчас вы не испыони не будут получать требуемую про- тываете необходимости в приоритипускную способность, пользы от при- зации голосового трафика например,
№2, февраль 2006
или мощностей вашей сети и оборудования достаточно для обработки всех поступающих данных, рано или поздно это изменится. Не пренебрегайте возможностью оптимизировать использование ваших каналов, и они отплатят вам сторицей. Но эффективно управлять трафиком, не имея понятия об особенностях используемых технологий и протоколов, конечно, нельзя. Поэтому, если хотите побольше узнать об управлении трафиком и качестве обслуживания, начните не с руководства по вашему маршрутизатору и попыток понять синтаксис соответствующих команд, а ознакомьтесь с форматами кадров, принципами работы основных протоколов и т. д. Удачи.
Источники информации 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/mplscharter.html. 4.2. http://www.riverstonenet.com/support/ mpls/mpls_introduction.htm. 4.3. http://www.cisco.com/univercd/cc/ td /doc /product /software /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=199 51&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.
85
ретроспектива
История компьютеров «Амига» Часть первая: 1982-1994
Сергей Зуев На протяжении последних лет компьютерная индустрия оказалась поделена между Windows-системами, продукцией от Apple и Linux/UNIX-решениями, куда входят также и знаменитые рабочие станции SGI/Sun. Однако буквально десять-пятнадцать лет назад ситуация на рынке персональных компьютеров была совершенно другой.
86
ретроспектива
Н
а протяжении последних лет ли на частотах до 14 МГц и адресовакомпьютерная индустрия оказа- ли до 16 Мб адресного пространства, лась поделена между Windows- что было на голову выше даже самых системами, продукцией от Apple близких их конкурентов от Intel – прои Linux/UNIX-решениями, куда входят цессоров 8086/88. Майнер сделал нетакже и знаменитые рабочие станции сколько запросов к руководству комSGI/Sun. Однако буквально десять-пят- пании для выделения ему отдельной надцать лет назад ситуация на рын- лаборатории по разработке новой выке персональных компьютеров была числительной системы, однако кажсовершенно другой. Существовало дый раз получал отказ. Это вынудипо крайней мере два-три десятка раз- ло его оставить корпорацию и занятьличных платформ, отличающихся и ди- ся индивидуальными исследованиями зайном, и процессором, и какими-то в данной области. Игнорирование мнения Майнера специфическими оригинальными решениями в аппаратной части. Одна- сыграло злую шутку с Atari – в сереко, несмотря на то, что большая часть дине восьмидесятых, все еще ориенрынка уже занята вышеперечисленны- тируясь на рынок восьмиразрядных ми системами, старые компьютеры ни- компьютеров, корпорация потерпела куда не делись. Для них до сих пор пи- огромные финансовые убытки, следы шется программное обеспечение и со- от которых тянулись вплоть до ее полздается новое железо. Пример тому – ного банкротства в середине девяноскомпьютеры Amiga. тых годов. В 1982 году Майнеру позвонил его бывший коллега, также уволивЗарождение идеи История Amiga начинается в 1980 году, шийся из Atari, Ларри Кеплен. Кеплен в лабораториях Atari, где Джей Май- к тому времени уже создал свою манер проектировал восьмиразрядные ленькую фирму по разработке компьюсистемы. Именно он разработал та- терных игр, хорошо известную сегодня кие знаменитые компьютеры и кон- как Activision. Как и Майнер, он искал соли, как Atari 2600, Atari 400 и Atari финансовую помощь для дальнейшей 800. Основной упор в проектирова- деятельности своего детища. По счастливому стечению обстоянии делался на создание custom-чипов (микросхемы, которые заказыва- тельств, дантист Майнера был богатым ются специально на заводах для кон- человеком, который вкладывал деньги кретной линейки продуктов), каждый в новые, перспективные разработки из которых брал на себя определен- в области компьютерных игр. Благоную функцию по выводу графики, син- даря ему новая фирма Джея, Hi-Toro, тезированию звука, управления внут- получила стартовый капитал в 7 милренней шиной и пр. Это разгружало лионов долларов. центральный процессор от несвойсHi-Toro разделилась на две груптвенных ему задач и весьма ощути- пы. Первая, Atari Peripheral, занимамо повышало общую производитель- лась разработкой фирменных джойсность системы. тиков и игр для Atari 2600. Вторая групВ то время Atari была настолько па работала над проектом с кодовым крупной компанией, что сегодня мог- именем «Lorraine», названным так ла бы соперничать с Sony или Nintendo. в честь жены CEO Дейва Морзе. НеОднако в ней присутствовали сильный смотря на то что группа была весьма коммерческий дух, жестко спланиро- немногочисленной, ее цели были кованное производство, и это не остав- лоссальными. Предполагалось создать революляло ни малейшей возможности талантливым рабочим для продвижения ционную игровую систему, у которой своих идей в производство. Это и слу- были бы 3.5" дисковод и клавиатура. чилось с Майнером. Он считал, что эра Изначально были определены главные восьмиразрядных компьютеров закан- разработчики игр, Activision и Imagic, чивается и пора переходить на более для того чтобы обеспечить систему игсовершенные технологии. рами на момент начала продаж. На то Как раз в 1979 году Motorola выпус- время это был беспрецедентный шаг, тила свое новое семейство процессо- например, та же Atari всячески прегров 68000. Эти процессоры работа- рождала дорогу сторонним компани-
№2, февраль 2006
Рисунок 1. Джей Майнер – создатель компьтеров «Амига»
Рисунок 2. Промежуточный вариант Lorraine
ям по выпуску продуктов к ее компьютерам, Nintendo же вообще имела монопольное право на выпуск картриджей для своих приставок, и сторонние разработчики должны были платить деньги за право выпуска своих игр на ее системах. Проект по созданию новой системы рос, как на дрожжах. В кратчайшие сроки группа спроектировала и, самое главное, воплотила в жизнь множество революционных идей. Новый компьютер основывался на процессорах Motorola и имел несколько сопроцессоров для выполнения второстепенных задач. Сопроцессоры содержали в себе такие блоки, как Blitter (занимался быстрым перебросом областей памяти из трех источников в четвертое конечное место одновременно с выполнением логических операций над ними) и Copper (следил за положением луча на экране, в зависимости от значений мог или изменять значения внутренних регистров, или вызывать прерывание центрального процессора для выполнения каких-либо процедур). Каждому процессору давались женские имена, например, Paula являлась контроллером дисковода и звуковой подсистемой, обеспечивала компьютер 4-канальным 8-разрядным
87
ретроспектива
Рисунок 3. Amiga 1000
звуком; 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 с итальянского переводится как «подружка») и располагалось в те-
88
лефонном справочнике между назва- мини-компьютер из трех стоек. Кажниями Apple и Atari. дый «чип» занимал по несколько плат, 1983 год начался с гигантских по- причем на каждой было по 50 микротерь на компьютерном рынке, за- схем (рис. 2). крылось множество мелких фирм. Amiga Inc. также потерпела крупные Эпоха Commodore неудачи в продажах, и в итоге ситуа- В самом начале 1984 года, на америция сложилась так, что Lorraine стала канской выставке CES была произвеединственной возможностью компа- дена первая демонстрация Lorraine шинии заработать деньги. Для ускорения рокой публике. Компьютер до сих пор разработки проекта в компанию были представлял собой груду печатных приглашены новые люди: Боб Бернс, плат и множество проводов, но все это Гленн Келлер, Дейл Лак, ЭрДжи Ми- старательно было спрятано под стол, каль, Дейв Нидл, Рон Николсон, Боб на котором оставили только монитор. Парисо и Карл Сассенрат. Появление Самой большой проблемой на этой новых инженеров позволило разбить демонстрации было обеспечение команду разработчиков на две группы: вентиляции системы – пространство первая занималась собственно разра- под столом никак не вентилировалось, боткой компьютера, а вторая – написа- и оборудование могло в любую секуннием программного обеспечения к не- ду выйти из строя, но, к счастью, этому. За вторую группу отвечал ЭрДжи го не произошло. Микаль. Позже, в интервью, он расскаLorraine произвела фурор – на экзывал следующее: ране крутилась известная демонстра«В Amiga Inc. я начинал как инженер ция «Boing Ball», которая рисовала враПО, я отвечал за проектирование гра- щающийся, прыгающий трехмерный фических библиотек. Затем под моим красно-белый шар. При этом, достигруководством был создан Intuition – ос- нув краев экрана, он со стереозвуком нова графического интерфейса буду- ударялся о стенки и двигался в обратщей операционной системы. Это был ную сторону. На фоне других, восьмиочень тяжелый для нас период – раз- разрядных компьютеров, возможности работка длилась несколько месяцев Lorraine смотрелись просто шикарно! Однако несмотря на торжество на выпо 100 часов в неделю!» Для того чтобы иметь какие-либо ставке среди посетителей, крупные средства в начале года, отдел компа- компании восприняли новинку весьнии, занимающийся изобретением но- ма прохладно. К тому времени первоначальный вых игровых контроллеров, выпустил очень оригинальную игру Zen Meditaton. капитал в 7 миллионов долларов уже Смысл ее заключался в том, что надо иссяк, а продажи игровых контролбыло сидеть максимально долгое вре- леров не давали значительного домя не шевелясь, в позе Лотоса на спе- хода. Положение было критическое, циальном контроллере, выполненном и руководство компании решило пров виде доски для сноуборда. Цель иг- дать свое детище какому-нибудь гигары была в том, чтобы, достигнув опре- нту. Были контакты с Sony, Apple, Atari деленного временного результата, по- и почти удавшийся контракт с Silicon пасть в нирвану. В операционной сис- Graphics. Стив Джобс, CEO Apple, натеме Amiga при сбоях демонстриро- пример, посчитал, что компьютер вался мигающий прямоугольник с над- имеет «очень продвинутое hardware», писью «Guru Meditation», т.е. «гуру ме- что не приемлемо для домашних сисдитирует». Эта фраза была данью раз- тем. Из всех компаний только Atari соработчиков своему прошлому. гласилась заключить серьезную сделК сентябрю 1983 года были закон- ку с Amiga Inc. В 1992 году в интервью чены макеты трех основных custom- Джей Майнер сообщил: «Atari дала нам 500 тысяч долларов чипов: Agnus (Address Generator), Daphne, которую позже переименовали с таким условием, что если мы за мев Denise (Display Adapter) и Porita, поз- сяц не успеем закончить custom-чипы, же названную Paula (Purts and Audio). то они купят наши акции по бросовым То, что было сделано hardware-отделом, ценам. Это был очень глупый контракт, мало походило на обычный домашний но из-за отсутствия других вариантов компьютер, скорее, это напоминало мы согласились.»
ретроспектива Однако к тому времени Amiga Inc. и продавать компьютер по значительподвернулась удача, гигант в области но меньшей цене. Плюс, компьютер домашних компьютеров Commodore изначально имел MIDI-разъемы и сосогласился приобрести компанию ответствующее программное обесза 3 миллиона долларов, превра- печение, что сразу предопределитив ее в одно из своих подразделе- ло его успех на рынке музыкальных ний и оставив весь ее состав. Бла- компьютеров. 1985-1986 годы прошли под флаггодаря этой сделке Amiga Inc. быстро вернула Atari ее 500 тысяч дол- манским лидерством компьютеров Рисунок 4. Авторская Amiga 500 ларов. Commmodore переименовала Atari, причем за это время было выAmiga Inc. в «Commodore-Amiga Inc.» пущено три новых модели со встрои выделила 27 миллионов долларов енным дисководом и увеличенным на дальнейшую разработку компью- до 1 Мб объемом оперативной памятера. ти. Однако Commodore все это время К концу 1984 года новое подраз- не дремала. В 1986 году началась разработделение выпустило первый прототип нового компьютера – Amiga 1000 ка новой модели Amiga 2000, которая (рис. 3). По тем временам это была отличалась вместительным desktopочень мощная машина с 256 Кб опе- корпусом с большим количеством ративной памяти и desktop-корпу- разъемов расширения, причем присом, позволяющим убирать клавиа- сутствовали даже разъемы под шитуру под него. Для ускорения процес- ну ISA для периферии от компьютеса разработки операционной систе- ров IBM PC. Для их функционирования Рисунок 5. Amiga 3000 мы была нанята британская фирма были разработаны аппаратные эмуДля поддержки пользователей MetaComCo. Она занялась портирова- ляторы IBM PC с процессорами 8088 нием ядра своей ОС Tripos на процес- и 80286. Это позволяло значительно под спонсорством Commodore в 1985 расширить объем программного обес- году начался выпуск первого журнасоры Motorola. ла для пользователей Amiga – «Amiga В 1985 году Amiga 1000 поступи- печения под Amiga. Благодаря возможностям расши- World». ла в продажу по официальной цене В 1987 году на рынок вышли две нов 1 500 долларов. Commodore счита- рения Amiga 2000 продемонстрировала, что победила, так как выпустила ла новую технологию автоматической вые модели – Amiga 2000 и Amiga 500 первую домашнюю шестнадцатираз- конфигурации устройств AutoConfig. (рис. 4). Вторая представляла соСмысл ее заключался в том, чтобы ав- бой упрощенный вариант первой. рядную систему. Однако на той же самой выстав- томатически предоставлять при вклю- Как и Atari ST, A500 была укомплектоке CES’85, где демонстрировались чении компьютера новому устройс- вана в единый с клавиатурой корпус, первые компьютеры, Atari предста- тву область памяти, прерывания и ли- плюс ее цена была меньше 1000 долвила свою новинку. Это был компью- нии DMA. Через десять лет подобное ларов, оставляя в себе все возможтер Atari ST. Он был основан на том появилось в IBM PC под названием ности от старшей сестры. Ввиду своей низкой цены А500 стала объектом же процессоре MC68000, что и Amiga, Plug’n’Play. В 1985 году было разработано сто- мечтаний множества людей и сподвигимел зашитую в ПЗУ однозадачную операционную систему, представля- ронней компанией новое устройство нула массы на переход с устаревшей ющую собой гибрид MS-DOS, CP/M Genlock, которое устанавливалось восьмиразрядной технологии (компьюи графического интерфейса от Digital в разрыв между видеоразъемом и мо- теры Spectrum, Amstrad и пр.) на новые Research – GEM (Graphic Environment ниторным кабелем Amiga. Данное уст- шестнадцатиразрядные машины. В 1988 году общий объем продаж Manager). ройство предназначалось для смешиГрафические и музыкальные спо- вания видеосигнала от внешнего ис- от компьютеров и программного обессобности также были не на высоте – точника (видеомагнитофон, видеока- печения превысил аналогичную циф320х200 точек на 4 цвета из палитры мера и т. п.) и компьютера. Одновре- ру у Atari. С тех пор последняя всегв 512 цветов, плюс 640х200 и 640х400 менно с этим для Amiga были разра- да находилась на втором месте посна 2 цвета, причем последний режим ботаны первые программы для трех- ле Amiga. Игровой рынок также перешел в рутребовал специального монитора. мерного моделирования и графичесВ качестве музыкального сопро- кие редакторы. В то время профес- ки Amiga, поскольку для нее выходили цессора служил хорошо знакомый сиональные компьютеризированные такие игры, которые просто невозможпоклонникам компьютера ZX Spectrum видеостудии стоили до 50 тыс. долла- но было сделать на Atari. Последняя наконтроллер YM-2149 (4 бита, 3 кана- ров, цена же Amiga с этими програм- чала иск против Commodore, поскольла, 8 октав). мами и GenLock составляла пример- ку изначально Майнер работал в Atari Однако упрощенная, по сравне- но две – три тысячи долларов, поэто- и все свои идеи придумал именно в ее нию с Amiga, архитектура позволи- му ее популярность на данном рынке лабораториях, однако этот иск не был удовлетворен судом. ла быстрее наладить производство быстро возросла.
№2, февраль 2006
89
ретроспектива
Рисунок 6. Авторская Amiga 600
Рисунок 7. Amiga 4000
Рисунок 8. Авторская Amiga 1200
Рисунок 9. A1200 (вид снизу): установлена процессорная карта Blizzard 1260 от Phase 5
Первые попытки давления от Microsoft и Apple начали ощущаться в следующем, 1989 году. Для удержания своих позиций Commodore улучшила чипсет для поддержки 1 Мб памяти и сильно снизила цену на А500. Девид Плизенс, будущий глава Commodore UK, создал «А500 Batman bundle», благодаря чему продал тысячи компьютеров и обеспечил их огромную популярность в начале девяностых годов. 1990 год ознаменовался коренным улучшением программной и аппаратной части компьютеров. Вышла новая версия AmigaOS 2.x. В программном плане (API, интерфейсы) это был настоящий прорыв по сравнению с предыдущей ОС. Даже внешний вид стал
90
более серьезным. Но самое главное – да выводить изображение – на чипсет это был выход Amiga 3000. Компью- или на видеокарту. Sun заключила договор с тер включал в себя новый чипсет ECS (Enhanced ChipSet, первый же стали Commodore о создании новой операназывать OCS – от слова Original), ко- ционной системы для A3000, UNIX-клоторый адресовал до 2 Мб памяти и под- на Amiga UNIX. Специально для нее выдерживал не только две жестко задан- пускались модели A3000UX, которые ные экранные частоты (PAL, NTSC), включали в себя стриммер, графичесно позволял гибко менять из значе- кий и сетевой контроллеры, плюс контния с 15 до 31 КГц для строчной часто- роллер на 6 последовательных портов ты и от 45 до 83 для кадровой частоты. для терминалов. Помимо А3000 была выпущена Это позволило использовать вошедшие в моду VGA-мониторы от IBM PS/2. еще одна модель – Commodore CDTV. Поскольку большая часть старых игр Это была старая А500 с 1 Мб памябыла написана прямым программиро- ти и с приводом CD-ROM, заключенванием чипсета, то для работы с этими ная в корпус, похожий на видеомагмониторами в компьютер было встро- нитофон. Для этого компьютера проено устройство ScanDoubler, позоля- давались инфракрасная клавиатура, ющее удвоить телевизионную часто- мышь и внешний дисковод. Не смотту с 15 до 31 КГц. ря на оригинальную идею, эта модель А3000 производилась в Desktop- провалилась – за последние несколькорпусе (рис. 5), имела шину SCSI-2 ко лет люди пресытились возможносдля накопителей, 4 разъема для рас- тями А500. На замену А500 в 1991 году приширения с шиной Zorro-II, 3 разъема ISA и специальный разъем Fast Slot. шел новый вариант – А500+. Эта маДело в том, что на материнской плате шина имела тот же самый чипсет ECS, компьютера располагался процессор что и А3000. Последнюю дополнила MC68030 на 16/25 МГц (в зависимости модель А3000Т – это была та же самая от версии), а оперативная память мог- А3000, только с семью слотами Zorro-2 ла расширяться только до 16 Мб. Fast и в Tower-исполнении. Slot предназначался для специальной платы с новым процессором, ра- Advanced Amiga ботающим на большей частоте, и до- Architecture полнительных слотов для оператив- К концу года IBM свернула свою линой памяти. нейку PS/2, оставив после нее «наЗдесь стоит отметить одну особен- следство» в виде двух разъемов мыность строения оперативной памяти ши/клавиатуры, слотов SIMM и, саAmiga – адресное пространство делит- мое главное, графических адаптеся на две области: Chip-RAM, к кото- ров VGA. Последние привнесли норой имеет доступ и процессор, и чип- вый режим 320х200х256 цветов, что сет (он хранит в ней звуки и изображе- превосходило параметры чипсетов ния), причем последний имеет боль- Amiga, и поэтому публика требовала ший приоритет; и Fast-RAM, к которой улучшений. В лабораториях Commodore к этому имеет доступ только процессор. Такое разделение хорошо тем, что ни про- времени разрабатывался новый комцессор, ни чипсет практически не пе- пьютер – А3000+. Это была внешне ресекаются, каждый работает со сво- та же А3000, но внутри – кардинально ей областью по циклам прямого до- измененная аппаратная часть. Прежде ступа в память и не мешают друг дру- всего это новый чипсет AGA. Это быгу. Но позже это стало создавать огра- ла если не революция, то по крайней ничения – чипсет с его возможностями мере серьезная эволюция по сравнесо временем устаревает, потребности нию с ECS. Общая скорость работы в памяти растут, но она все равно ог- повысилась в четыре раза, но самое раничена изначальным максималь- главное – это новые цветовые режиным объемом в 2 Мб и максимальным мы: к имеющимся ранее режимам в 2, трансфером в 7 Мб/с. Проблему сла- 4, 8, 16, 32 цвета плюс EHB (Extra Half бого чипсета стали решать с помо- Bright – режим в 32 цвета, плюс они же, щью видеокарт. Дело в том, что с точ- но с половинной яркостью) и HAM доки зрения AmigaOS нет разницы, ку- бавились 64, 128 и 256 цветов и плюс
ретроспектива 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 (позволял из одного скрипт-файла полноценно управлять одновременно несколькими приложениями). Были произведены улучшения в файловой системе (кеширование директорий, поддержка не латинских имен), стандартная подсистема установки приложений и многое другое. Для периферии
№2, февраль 2006
появилась новая шина расширения – новременно с этим на рынке появиZorro-3. Она совместима со своей про- лась Amiga CD32 – игровая консоль шлой версией электрически, но рабо- с CD-ROM. Аппаратно она представлятала на гораздо большей скорости – ла собой ту же А1200 без клавиатуры 25 Мб/с против 3,5 Мб/с и адресова- и с чипсетом, выполненным по меньла 512 Мб адресного пространства шему технологическому процессу. против 8 Мб. При помощи позже выпущенных моAtari предприняла свою последнюю дулей от сторонних фирм (ProModule, попытку отвоевать рынок у Amiga, вы- SX-1, SX-2) эта консоль превращалась пустив новый компьютер Atari Falcon в полноценный компьютер с клавиатус процессором MC68030 на 25 МГц рой, мышью, накопителями и процеси немного более качественным чип- сором MC68030 на 50 МГц. В маркетинсетом, чем AGA, но было уже слишком говом плане CD32 имела успех только поздно. Невыпущенная модель Atari на британском рынке, а на остальных Microbox и провалившаяся шестидеся- провалилась. Интересный факт: в 1993 году тичетырехразрядная игровая консоль Atari Jaguar доконали компанию, и ее Microsoft разрабатывала свою новую имущество и бренд были распроданы операционную систему Windows NT, с молотка компании JTS Corp., произ- которую планировалось перенести на множество платформ, в том чисводящей жесткие диски. К концу 1992 года, продолжая ле и на Amiga. Однако этим планам развитие своего модельного ряда, не суждено было сбыться. Commodore выпускает Amiga 1200 После AGA началось проектиро(рис. 8, 9). Это самая продаваемая вание чипсетов Hombre и AAA, котоAmiga за всю свою историю. Понача- рые должны были значительно усколу цена на нее составляла 699 фун- рить работу, привнести новые цветотов стерлингов, но позже опустилась вые режимы до 16-бит, HAM-12, поддо 399 фунтов стерлингов. держку более высоких частот разВнешне это была усеченная по верток, что дало бы разрешения до глубине А500. Внутри стоял новый 1280x1024 и множество других нововчипсет AGA, 32-разрядный процес- ведений. Commodore объявила, что бусор MC680EC20 на 14 МГц, 2 Мб Chip- дущие модели будут строиться на бапамяти, такие же разъемы IDE 2.5" зе новых процессоров от Motorola – и PCMCIA, как и у А600. Внизу ком- PowerPC или от HP – PA RISC. В марте 1994 года началось произпьютера, под пластмассовой крышечкой, располагался 150-контакт- водство Tower-версии А4000 – Amiga ный слот TrapDoor. Подобное было 4000T. Amiga были весьма популярны и у А500, и у А600, но у них он служил на домашнем рынке, в области видедля установки плат с дополнительной опроизводства (на Amiga считались Chip-памятью, а у А1200 туда были вы- эффекты в Babylon-5, морфинг 3D-моведены процессорные шины и сигна- делей в Terminator-2), в музыкальной лы. Под этот слот в последующие го- области (ранние альбомы The Prodigy ды было разработано великое мно- писались на Amiga) и множество дружество процессорных карт. При их ус- гих. Доход от продаж компьютеров тановке старый процессор отключал- был высок, однако промахи с попытся, но влючался новый (от 68020 на бо- ками выжать все соки из старых техлее высокой тактовой частоте и с FPU нологий в виде A500+, A600 и CDTV, до 68060 на 50-66 МГц и PowerPC 603e оставили большую брешь в бюдже160-240 МГц), добавлялась Fast-па- те компании. Все это привело к тому, что к семять. редине года компания объявила себя банкротом. Помимо этого 20 июБанкротство В 1993 году Commodore наконец пол- ня 1994 года Джей Майнер скончался ностью свернуло производство сво- от обширного инфаркта сердца. Баних популярных восьмиразрядных ма- кротство компании заставило отвершин Commodore 64. За 11 лет их «жиз- нуться от Amiga множество фирм, выни» было выпущено 30 миллионов пускавших программное и аппаратное компьютеров, что даже было зане- обеспечение. Ее будущее было неопсено в Книгу рекордов Гиннесса. Од- ределено.
91
книжная полка
Внедрение, управление и поддержка сетевой инфраструктуры Microsoft Windows Server 2003 Дж. С. Макин, Йен Маклин ты на них), а также лабораторная рабо- ление удаленным доступом (авторизата, выполнение которой поможет луч- ция подключений удаленного доступа, ше усвоить прочитанный материал. Те- развертывание VPN, RADIUS), управмы книги: основные сведения о сетях ление безопасностью сети (мониторинг Windows 2003 Server (ключевые момен- и устранение неполадок основных проты проектирования инфраструктуры токолов сети), поддержка сетевой инфсети, создание сетей на основе стан- раструктуры (наблюдение за работой дартных компонентов), общие сведе- и методики решения проблем, связанния о TCP/IP (общие концепции TCP/IP, ных с сетями). На прилагаемом к книIP-адресация, разбиение сетей на под- ге диске вы найдете демоверсию экзасети), мониторинг и устранение непо- менационного теста, электронные книЭта книга является переводом офи- ладок подключений TCP/IP, настройка ги (на английском языке), материалы, циального пособия для самостоятель- серверов и клиентов DNS. Развертыва- необходимые для исполнения лабораной подготовки к экзамену 70-291. Без ние структуры DNS, мониторинг и ус- торных работ. сомнения, это издание окажется вам транение неполадок. Конфигурироваполезным, даже если вы не собирае- ние DHCP-серверов и клиентов, а так- Издательство: «Питер» тесь сдавать вышеобозначенный экза- же наблюдение и выявление проблем, Год издания: 2006 мен. Каждая глава разбита на занятия, связанных с DHCP. Маршрутизация Количество страниц: 620 в конце которых представлено резюме в Windows 2003 (локальные сети, NAT, ISBN: 5-469-01357-X написанного. В завершение глав пред- протоколы маршрутизации OSPF и RIP, Цена: ≈ 510 руб. ложены контрольные вопросы (и отве- фильтры пакетов), настройка и управ- Книга предоставлена издательством «Питер».
Oracle PL/SQL для профессионалов Стивен Фейерштейн, Билл Прибыл
При написании книги авторы в качестве основных целей и задач выбрали следующие направления: изучение всех возможностей PL/SQL, использование PL/SQL для решения повседневных задач и создание эффективного кода, который легко сопровождать. Подробно ознакомившись с содержанием книги, могу сообщить, что задуманное авторам удалось почти в пол-
92
ном объеме, разве что «все возмож- ний с базами данных Oracle средстваности PL/SQL» освящены не полно- ми SQL, подробно рассказано о том, стью, но это отнюдь не оттого, что ав- как определить транзакции, обновляюторы что-то недописали, а скорее по- щие, дополняющие и удаляющие дантому, что действительно досконально ные таблицы). Разработка приложений и в полном объеме описать все воз- PL/SQL (в этой части освящены вопроможности PL/SQL в рамках одной кни- сы структуры основных составляющих ги неосуществимо. Изложенный мате- частей любой программы: процедуры, риал разделен на 6 логических частей. функции, триггеры, пакеты). Особые Программирование на PL/SQL (исто- возможности PL/SQL (основные этария языка, краткий обзор некоторых пы исполнения кода PL/SQL, испольглавных функций, простые примеры зование памяти, различий между сери основы языка). Структуры програм- верным и клиентским PL/SQL, показамы PL/SQL (условные if и case и пос- но, как вызвать код на Java и C из приледовательные goto и null, операторы ложений PL/SQL). Без сомнения, эта управления потоком и обработка ис- книга – просто находка для всех людей, ключений). Работа с данными в PL/SQL использующих (или желающих начать) (рассмотрены различные типы про- PL/SQL в своей работе. граммных данных, таких как числа, строки, записи и коллекции, не оста- Издательство: «Питер» лось без внимания и описание встро- Год издания: 2005 енных функций, предоставляемых Количество страниц: 941 Oracle для выполнения различных опе- ISBN: 5-318-00528-4 раций с данными). SQL и PL/SQL (ор- Цена: ≈ 525 руб. ганизация взаимодействия приложе- Книга предоставлена издательством «Питер».
книжная полка
Snort 2.1. Обнаружение вторжений Рейвен Олдер, Джейкоб Баббин, Адам Докстейтер, Джеймс Фостер, Тоуби Колленберг, Майкл Раш
Несмотря на то, что из-за перевода книга отстала от жизни года на три (напомню, что первые публикации о Snort были в «Системном администраторе» в 2003 году и что сейчас актуальной является серия 2.4, частично несовместимая с версией 2.1), книга является актуальной и новой для нас потому, что это первое русское издание значительного объёма и качества о cистеме обнаружения
атак Snort. Для тех, кто решил заняться вопросами обнаружения атак почти с нуля, хочет понять и разобраться с точки зрения пользователя, как установить и настроить IDS Snort, книга будет незаменима. В книге рассмотрено не только несколько вариантов установки программы под разные дистрибутивы и даны рекомендации, но и понятным для продвинутого пользователя языком поясняется структура каждой части программы. Стиль «HowTo» разбавляется литературными абзацами и картинками, что делает чтение более лёгким. Но, несмотря на такие приятные моменты, нельзя назвать перевод на 100% удачным: несколько бессмысленными кажутся дословно переведённые конспекты и FAQ в конце каждой главы, не будучи адаптированными для нас. Примерно пятая часть книги подробно рассказывает о наиболее часто используемых дополнениях к Snort, где даже те, кто хо-
рошо знаком со Snort, откроют для себя что-то новенькое. Прилагаемый к книге компакт-диск для человека, имеющего под рукой Интернет, абсолютно бесполезен. Диск заполнен процентов на десять программами, о которых идёт речь в книге и которые без проблем можно найти в сети. Все программы раскинуты по директориям, видимо, с намёком на главы, однако это не вносит порядка: несколько программ встречаются по два раза, одни и те же версии есть как в архиве, так и распакованные, а некоторые имена файлов вообще обрезаны и заканчиваются на ~1.
Издательство: Год издания: Количество страниц: ISBN: Цена:
«Бином-Пресс» 2006 656 5-9518-0136-2 ≈ 374 руб.
Аппаратные средства IBM PC Михаил Гук метить, что эта книга входит в число Большое количество различных официальных учебных пособий в ря- диаграмм, таблиц и иллюстраций споде учебных заведений. Книга хорошо собствует лучшему пониманию изучаструктурирована. Весь материал из- емого материала. Исходя из содержалагается простым и доступным язы- ния можно подумать, что книга носит ком. Все темы освящаются достаточ- сугубо теоретический характер, но это но глубоко и развернуто. Основные не так, некоторая часть материала ноиз них: устройство и общая архитек- сит исключительно практическое знатура компьютера (устройство PC, пи- чение. Книгу можно порекомендовать тание, архитектура IBM PC-совмести- широкому кругу читателей, возможмых компьютеров, организация ввода- но использование и как учебного повывода, BIOS); ядро компьютера – ма- собия, так и просто как справочника. теринская плата, процессор и память; Последнее издание книги пополнепериферия (устройства хранения дан- но материалами о PCI-X, PCI-Express, ных, ввода-вывода и их интерфейсы, HT, SATA, а также дополнены некотоДумаю, эта книга не нуждается в пред- видео- и аудиосистемы, сетевые уст- рые главы. ставлении широкому кругу читателей. ройства); интерфейсы периферийных Она по праву считается одной из луч- устройств (шины расширения, парал- Издательство: «Питер» ших книг на русском языке, посвящен- лельный интерфейс, проводные и бес- Год издания: 2006 ных аппаратному обеспечению IBM PC. проводные последовательные интер- Количество страниц: 1072 Издание пользуется популярностью фейсы, шины USB, FIREFIRE, интер- ISBN: 5-469-01182-8 у широкого круга читателей, начиная фейсы IDE: ATA/ATAPI/SATA, а также Цена: ≈ 480 руб. от обычных пользователей и заканчи- SCSI и Fibre Channel). Книга предоставлена издательством «Питер». вая серьезными специалистами в области «железа». Также нельзя не от- Обзор книжных новинок подготовили Александр Байрак, Павел Закляков
№2 февраль 2006
93
подписка на 2006 год Российская Федерация
Подписной индекс: годовой – 20780, полугодовой – 81655 Каталог агентства «Роспечать»
Подписной индекс: 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» Альтернативные подписные агентства: Агентство «Интер-Почта» (095) 500-00-60, курьерская доставка по Москве Агентство «Вся Пресса» (095) 787-34-47 Агентство «Курьер-Прессервис» Агентство «ООО Урал-Пресс» (343) 375-62-74 ЛинуксЦентр www.linuxcenter.ru Подписка On-line http://www.arzi.ru http://www.gazety.ru http://www.presscafe.ru
СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры АРЗИ: Азербайджан – по объединенному каталогу российских изданий через предприятие по распространению печа-
ти «Гасид» (370102, г. Баку, ул. Джавадхана, 21)
Казахстан – по каталогу «Российская Пресса» через ОАО «Казпочта» и ЗАО «Евразия пресс»
Беларусь – по каталогу изданий стран СНГ через РГО «Белпочта» (220050, г. Минск, пр-т Ф. Скорины, 10)
Узбекистан – по каталогу «Davriy nashrlar» российские издания через агентство по распространению печати «Davriy nashrlar» (7000029, г. Ташкент, пл. Мустакиллик, 5/3, офис 33) Армения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г. Ереван, пл. Сасунци Давида, д. 2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул. Сарьяна, 22) Грузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г. Тбилиси, ул. Хошараульская, 29) и АО «Мацне» (380060, г. Тбилиси, пр-т Гамсахурдия, 42) Молдавия – по каталогу через ГП «Пошта Молдавей» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134) по списку через ГУП «Почта Приднестровья» (МD-3300, г. Тирасполь, ул. Ленина, 17) по прайс-листу через ООО Агентство «Editil Periodice» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134) Подписка для Украины: Киевский главпочтамт Подписное агентство «KSS», тел./факс (044)464-0220
Подписные индексы:
20780* 81655** по каталогу агентства «Роспечать»
87836 по каталогу агентства «Пресса России» * **
94
годовой полугодовой
подписка на 2006 год Редакционная подписка Открыта подписка через редакцию. Вы можете оформить подписку на любое количество номеров 2006 года. Редакция не высылает журналы за пределы Российской Федерации.
Для юридических лиц:
Отправьте заявку по факсу (095) 928-82-53 или по e-mail: info1@samag.ru.
Укажите наименование и банковские реквизиты своей организации, почтовый индекс и адрес доставки журнала, телефон и e-mail контактного лица, период подписки и количество номеров. Редакция выставит вам счет, после оплаты которого вы начнете получать журналы по почте. Необходимые бухгалтерские документы высылаются почтой.
№5
(30 по )м д ww писн w.s ой ай 2 am ин 0
05 По ag дек Ищ чем .ru с 8165 5 ем у M пр S S Ст WP роим ичин QL м A-E з ы ед ле nte ащи На нн стр rpr ще ор is н аи Ка аб e, ную ва ота 80 уд к во ем 2.1 бес ет? ал сс UP е x т н а S Чт EA пров ны но по ов P-T од е ф вит дL аж LS ную inu ай ь но лы се x в к тана зн ть: по ать ор вл д п и ор ва Эф BS об ати ем D IPпо фек вн Sy тел ля ти ой ma ми вн еф Ко се nte по о у он ти c ль пр с п нтро и и A зо ав ntiv ом ли ва ля ощ ру iru Ин тел ем ью ем s9 ей со терв .0 OS без зд ью вA SIM оп ате с D ас ле Ла но м я рр сть зы и У се ка ол ти Pe лом rl –
Для физических лиц:
Заполните нижеприведенную квитанцию, оплатите в любом банке и пришлите в редакцию копию с отметками банка. После поступления платежа редакция начнет отправлять вам номера.
Стоимость подписки через редакцию: 900* руб. за 6 номеров 1800* руб. за 12 номеров
* Включая НДС и почтовую доставку
№2, февраль 2006
95
СИСТЕМНЫЙ АДМИНИСТРАТОР №2(39), Февраль, 2006 год РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Редактор Алексей Коршунов Внештатные редакторы Алексей Барабанов Кирилл Тихонов Сергей Супрунов Валентин Синицын Татьяна Ильченко РЕКЛАМНАЯ СЛУЖБА тел./факс: (095) 928-8253 Дарья Хохлова reсlama@samag.ru Верстка и оформление maker_up@samag.ru Дизайн обложки Николай Петрочук По вопросам распространения обращайтесь по телефону: (095) 928-8253 (доб. 120) 107045, г. Москва, Ананьевский переулок, дом 4/2, стр. 1 тел./факс: (095) 928-8253 Сайт журнала: www.samag.ru РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета» Отпечатано типографией ГП «Московская Типография №13» Тираж 10000 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002 г.). За содержание статьи ответственность несет автор. За содержание рекламного объявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены.
ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Создаем порт для FreeBSD своими руками Автоматизированная система сборки стороннего программного обеспечения из исходных текстов (система портов) – это то, чем по праву гордится FreeBSD. Система содержит ссылки на десятки тысяч программ, и этот список постоянно пополняется. Кто их создает, эти пополнения? Некие выдающиеся специалисты? Да вовсе нет. Вы тоже сможете стать одним из них, прочитав эту статью.
Переходим от VBScript к ASP и ASP.NET: дописываем Framework на примере сетевых папок
ление которым можно, и, как правило, нужно автоматизировать. Для решения этой задачи был разработан протокол SNMP. Существует масса готовых коммерческих решений по управлению различными устройствами с помощью SNMP, например HP Open View, однако не каждой организации по карману приобретение подобного ПО, к тому же, эти программные продукты предназначены для управления большим количеством устройств и их использование в небольших сетях нецелесообразно.
Конфиденциально? Защитим!
Утечка даже части конфиденциальной информации может нанести непоправимый вред компании. Мы зачастую отдаем сервер, жесткий диск на ремонт или замену, выбрасываем старые архивные ленты, в лучшем случае тщательно стараясь удалить некогда хранимую на нем конфиденциальную информацию низкоуровневым форматированием либо специализированными утилитами, что не всегда успешно. На рынке существует несколько программно-аппаратных комплексов для защиты конфиденциальной информаУправляем сетевым оборудованием с помощью ции на рабочих станциях и серверах протокола SNMP посредством шифрования. Мы расСегодня практически в любой сети да- скажем вам о возможностях програмже небольшой организации есть ак- мных продуктов Zserver и Zbackup комтивное сетевое оборудование, управ- пании SecurIT. Программисты Microsoft, создававшие Framework, явно не ориентировались на системных и сетевых программистов, поэтому там отсутствуют функции по управлению DFS, сетевыми папками и т. д. Возникает вопрос: «А как же решить данную проблему, ведь, например, в VBScript можно было без особых усилий управлять сетевыми папками (Shared Folders). Неужели в VB.NET это невозможно сделать?»
Уважаемые читатели! Спешите оформить подписку на первое полугодие 2006 года! Приобрести новые и старые номера журнала вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.
Доставка почтой в любую точку России.
96