Page 1

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

КА

БЫ С

ТР О ТИ РАС РА КУ Ж ПИ

НИ НО К У ВО ЛЫ ГО ЗА ДНИ ТЯ Е НУ ЛИ

ЛИ

СЬ

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

Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии танавливаем Symantec Antivirus 9.0 в корпоративной сети

№11(48) ноябрь 2006 подписной индекс 20780 www.samag.ru

Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM

Так видит журнал читатель, оформивший подписку: №5(30) май 2005 подписной индекс 81655 www.samag.ru

№11(48) ноябрь 2006

КО НЕО НЧ ЖИ ИЛ ДА ИС НН ЬД О ЕН ЬГ И ЗА

ПО АВ СЛ РА Е О Л НА ТПУ РА СКА БО ТЕ

УЕ ХА Л

ВО

ТП УС К

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

MS Windows XP SP3, или Много шума из ничего Разрабатываем пакет управления для МОМ 2005 Кластеризация + виртуализация: Linux HA + OpenVZ

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

На что способен дистрибутив SystemRescueCd Linux

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

Безопасность в FreeBSD: разбираемся в тонкостях применения jail Работаем с NTLMавторизацией Apache в домене MS Windows 2003

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

Чего ждать от Perl 6 Интервью с создателем популярного ресурса OpenNET


в номере ИНТЕРВЬЮ

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

2 Linux-десктопы должны быть привлекательными

42 Выявление угроз информационной безопасности внутри компании

5 ТЕНДЕНЦИИ

45 Внутренние IT-угрозы в банке превосходят по значимости все остальные

Пол Гийе (Paul Guillet), ответственный за продажи Mandriva, рассказывает о ближайших планах компании. Дмитрий Шурупов osa@samag.ru

АДМИНИСТРИРОВАНИЕ 6 Кластеризация + виртуализация: Linux HA + OpenVZ Часть 1: кластеризация на практике

Как одновременно уменьшить количество физических серверов, требующих обслуживания, и при этом продублировать их, обеспечив автоматическое переключение на резервный сервер при отказе основного. Евгений Прокопьев eugene.prokopiev@gmail.com

14 MS Windows XP SP3, или Много шума из ничего

Третий пакет обновлений для MS Windows XP напоминает второй том «Мертвых душ»: его пишут где-то там, за границей, его все ждут, вспоминая предыдущий вариант, о нем уже сочиняют небылицы… Алексей Барабанов alekseybb@mail.ru

22 Разрабатываем пакет управления для МОМ

Как написать свой пакет управления Microsoft Operations Manager 2005 для одной из наиболее важных служб вашей сети. Андрей Бирюков mex_inet@rambler.ru

27 Полезные советы: PostgreSQL Сергей Супрунов amsand@rambler.ru

28 На что способен дистрибутив SystemRescueCd Linux

Наверняка вам приходится восстанавливать системы после сбоя и использовать для этого наборы дистрибутивов и Live-CD различного назначения. Есть единое и компактное решение «все в одном». Иван Максимов ivan_maksimov@inbox.ru

34 Автоматизируем процесс установки обновлений с PatchQuest 4

Обзор утилиты PatchQuest 4, предназначенной для автоматизации управления и установки патчей, исправлений и модификаций на операционные системы и приложения. Сергей Яремчук grinder@ua.fm

ЧЕЛОВЕК НОМЕРА 38 Виртуальные радости и открытия Максима Чиркова

Ведущий OpenNET.ru, самого популярного русскоязычного ресурса, посвященного открытым технологиям, ценит независимость открытых проектов и возможность поделиться информацией с человечеством. Оксана Родионова rodion@dol.ru

№11, ноябрь 2006

Простейшие способы для диагностики системы защиты. Никита Дуров info@samag.ru

О том, как важно правильно защитить банк от внутренних IТ-угроз, рассказывает председатель совета директоров Банка высоких технологий Игорь Триф. Анна Верхось info@samag.ru

46 FreeBSD jail: зона строгого режима

Разбираемся в тонкостях работы с jail. Сергей Супрунов amsand@rambler.ru

53 Полезные советы: Bacula Сергей Яремчук grinder@ua.fm

54 Ошибки синхронизации открывают большие возможности для хакеров Каковы механизмы защиты?

Крис Касперски kk@sendmail.ru

62 Kerberos и электронная почта

Cпособ интеграции SMTP-сервера Postfix и IMAP/POP3 сервера Сyrus-IMAP в систему единой регистрации пользователей Heimdal-Kerberos. Михаил Кондрин mkondrin@hppi.troitsk.ru

68 Работаем с NTLM-авторизацией Apache в домене MS Windows 2003 Подробности настройки.

Владимир Василькин vasil1979@mail.ru

74 Защищаем PHP-приложения с помощью Suhosin Обзор проекта Suhosin.

Сергей Яремчук grinder@ua.fm

ПРОГРАММИРОВАНИЕ 78 Чего ждать от Perl 6

Perl готовится сделать новый рывок и оставить конкурентов позади. До круглой цифры счетчику версий осталось совсем немного. Андрей Шитов andy@shitov.ru

РЕТРОСПЕКТИВА 86 История компьютерных вирусов

К ним уже привыкли. Их не боятся школьные учителя информатики, о них не пишут на первых полосах газет. Но они продолжают выполнять свою разрушительную миссию. Илья Александров ilya_al@rambler.ru

92 КНИЖНАЯ ПОЛКА 73, 91

BUGTRAQ

1


интервью

Mandriva: Linux-десктопы должны быть привлекательными

IT-выставку Softool’2006, что проходила в Москве в конце сентября, посетил Пол Гийе (Paul Guillet), ответственный за продажи Mandriva, который согласился дать интервью нашему журналу.

2


интервью Главной инновацией вашего последнего десктоп-продукта, Mandriva Пол Гийе (Paul Guillet) занялся Linux-бизLinux 2007 [1], стало появление несом еще в 1995 году и был директором «трехмерного окружения» рабоче- одного из крупнейших Linux-реселлеров го стола – технологий Xgl и AIGLX. на территории Франции («Les Logiciels du Многие представители сообщества Soleil/KHEOPS»). В 1999 году стал сооссчитают, что эти разработки еще не- нователем и исполнительным директодостаточно стабильны, а вы их уже ром IdealX SAS, а в начале 2003 г. пришел включили в дистрибутив, предназначенный для домашних пользо- тельском рынке. Например, DVD-плейер (имеется вателей. Если вы сегодня хотите занять какое- в виду LinDVD. – Прим. ред.): люди либо место в мире информационных хотят просматривать видео без поттехнологий с решениями на базе Linux, ребности в проведении каких бы то необходимо предоставить людям про- ни было изощренных манипуляций дукты, которые будут как минимум с системой. Раньше у нас такого не на том же уровне, что и предложения было, и пользователям приходилось от компаний вроде Apple и Microsoft, тратить дополнительное время на то, или превосходить их. Рассматривае- чтобы добиться успеха в просмотмые возможности, на наш взгляд, до- ре DVD. Но мы решили отказаться от статочно стабильны, чтобы включить этого принципа и перейти на стороих в дистрибутив Mandriva. Если бы ну потребителей, которые хотят увиони таковыми не были, то их, естес- деть систему, где «все просто работатвенно, и не интегрировали бы в ста- ет». Их позиция такова: «Как здесь чтобильный релиз на этом этапе. Novell, либо функционирует, меня не интеренапример, давно уже включила Xgl сует. Я обычный пользователь, нуждающийся в рабочей среде, где все есть в свой продукт. «из коробки». Novell во многом и способствовала разработке Xgl, поэтому впол- В своих продуктах вы совмещаете не логично, что она и стала первой, свободное ПО с проприетарным, что кто представил результат обще- многими рассматривается как моственности в своем продукте. Осо- ветон. Нет ли у вас планов по выбенно учитывая ее растущее проти- делению бесплатного дистрибутива с полностью открытым кодом воборство с Red Hat... У нас есть свои проекты в Бразилии, ко- наподобие Fedora Core, openSUSE торые мы продвигаем совместно с быв- от коммерческого? шими сотрудниками Conectiva, что ста- Это действительно сложный вопрос ли частью нашей команды. А Novell – для меня. Думаю, такая схема пока это очень большая компания, в которой плохо применима к Mandriva в отлиработают тысячи людей. И все они, мо- чие от Red Hat и Novell. Последняя, нажете не сомневаться, борются за свои пример, существует уже 25 лет и усрабочие места. В Mandriva все иначе. пела за это время заработать немаВ первую очередь я имею в виду скром- лые деньги для инвестирования в марный штаб. Но когда мы объединились кетинг. Такой Open Source-проект – с Conectiva, взяли на вооружение все это средство для достижения цели (коинтересные разработки из дистрибу- ей в данном случае является продаваемый дистрибутив). тива этой компании. Сообщество, сложившееся вокМы пытаемся продвигать лучшее из того, что у нас есть, в США и Се- руг Mandriva, многое значит для нас. верной Америке, в Европе. При созда- Около 1000 сторонних разработчинии продуктов мы преследуем цель от- ков помогают нам работать над проветить текущим потребностям рынка, дуктами. Без них мы погибнем. Измеа он требует дружелюбного и простого нения в дистрибутиве провоцируются в использовании Linux для десктопов. сообществом: если мы не будем слуПоэтому мы включаем в состав дист- шать этих ребят, то они просто уйдут рибутива и решения, которых нет у той от нас куда-нибудь – скажем, в Ubuntu. же Novell, а эта компания представля- Это и есть лучшая гарантия для наших ется главным конкурентом на потреби- пользователей. Поэтому мы реализу-

№11, ноябрь 2006

в Mandriva, где теперь занимает должность директора по продажам. Стоит отметить, что из этой же компании (IdealX) в Mandriva перешел и ее нынешний главный технолог Дэвид Барт (David Barth). (По материалам http://www.mandriva.com/ en/company/about/executives.)

ем любую хорошую идею, предоставляемую нам сообществом. Причем, конечно, под GPL. Если же затрагивать тему проприетарных драйверов для устройств... да, они есть, но ведь это естественная составляющая современного мира. Касательно вашего слияния с Conectiva [2]. Какие проекты бразильской компании перешли в состав дистрибутива Mandriva? Имеет больший с мысл говорить не о конкретных проектах, а о наших объединившихся командах. Об изменении организации компании, в которой возникло 2 подразделения: одно в Бразилии, а другое – во Франции... То есть ключевой целью здесь было расширение рынка для дистрибутива за счет географии? Именно так. Это означает, что наши коллективы смешались, образовав интернациональную команду. Все текущие продукты Mandriva – фактически сейчас их пять – создаются совместными усилиями разработчиков и из Mandriva, и из бывшей Conectiva. Сейчас у нас порядка 8 миллионов пользователей во всем мире. Представителей Франции среди них – 10%. Благодаря слиянию с Conectiva в Латинской Америке у нас около 25% пользователей. Европа составляет около 40%, а США – 25%. У нас интернациональная компания, и мы сделали дистрибутив доступным для таких стран, как Россия, США, Азербайджан. Большое внимание мы уделяем локализациям, потому что это важно для продвижения на международном рынке, – нужно показывать пользователям уважение к их национальным особенностям. К вопросу о Mandriva в России [3]. Почему вы выбрали нашу страну для популяризации своего дистрибутива?

3


интервью продуктов, создание каких-то специфических систем? В грядущем месяце мы собираемся представить новый продукт для потребительского рынка, проект которого пока держится в секрете. Касательно RTOS-продукта Novell... Мы проводили экспертизу по рынку встраиваемых устройств. В этой области очень сложно создать «коробочное» решение. После ознакомления с результатами наших исследований пришли к выводу, что не хотим конкурировать со специалистами этого сегмента. Если у Novell есть такое желание – пожалуйста, это их право. О будущ их деск топ - решениях: как вы думаете, смогут ли новые технологии вроде Xgl полностью Мы считаем, что сейчас очень подходя- Мы установили контакты с некоторы- вытеснить существующие привычщее время для нашего продукта здесь. ми производителями для создания та- ные графические среды? Нужны Важно было выбрать нужный момент кого канала распространения. Рынок ли пользователям все эти визуальдля «вхождения» в такие страны, железа сильно изменяется, в разви- ные красоты? как Азербайджан, Грузия и другие быв- вающихся странах 80% национально- Когда домашние пользователи ищут шие советские республики. Не сомне- го рынка составляют не Dell, HP, IBM замену продукции Microsoft на настольваюсь, что люди из этих регионов сей- и другие представители «большой пя- ных ПК, их обычно интересуют не техчас ищут что-то... другое. терки», а продукция от компаний вро- нические аспекты. Они хотят получить де Asus и Gigabyte. Linux же постепен- живой, симпатичный и притягивающий Отличное от решений Microsoft? но проникает в эти страны. Так что интерфейс. Они хотят получить не «деДа. Но для того чтобы они заинтересо- мы открыли программу для продви- сктоп для бедных», а напротив – «девались в каком-либо решении, со сто- жения Mandriva по этим каналам, и она сктоп для богатых». Linux на настольроны производителя необходима под- уже неплохо работает. Таким спосо- ных ПК должна смотреться более секдержка их языка, понимание мест- бом в Бразилии продается порядка суально, чем решения MS. ной экономики и особенностей этой 30 000 копий дистрибутива в месяц. Общаясь с нашими клиентами, Думаем, что эта тенденция со време- с конечными пользователями, я постраны. нем дойдет и до России. нял, что им для десктопов нужна А как насчет стран Азии? Индия, Кидействительно красивая и удобная Недавно вы также выпустили но- система. тай, Япония? Пока мы пытаемся сосредоточиться вую версию своего корпоративнона развивающихся странах. Индия, го продукта – Corporate Server 4.0 [4]. Что ж, посмотрим, как с этим в дальв меньшей степени Китай (хотя у не- Это решение существует уже не нейшем будут справляться любители го большой потенциал), страны СНГ, первый год, однако, судя по СМИ, удобств и простоты из Mandriva... Россия – среди наших главных при- нишу дистрибутивов для Linux-сероритетов. веров прочно заняли RHEL и SLES, текст Дмитрия Шурупова, К нам проявляют интерес заказ- и никаких посылок к серьезным пефото Владимира Положевца чики из России, Азербайджана, Лат- ременам тут не предвидится. вии, Грузии, Казахстана... Мы идем на- На данный момент от Corporate Server 1. Анонс Mandriva Linux 2007 – http://www. встречу в сотрудничестве с различны- у нас около 10% прибыли. У нас есть nixp.ru/news/7809. ми странами – так и создается бизнес и крупные корпоративные заказчики. 2. Mandrakesoft поглощает Conectiva – в Mandriva: это даже не бизнес, а пос- Во Франции, например, это Минисhttp://www.nixp.ru/news/5515. троение экосистемы. терство оборудования, Министерс- 3. Л и н у кс Ц е н т р – л у ч ш и й п а р т н е р тво культуры, Министерство сельскоMandriva – http://www.linuxcenter.ru/lib/ Вы продвигаете свой дистрибутив го хозяйства. press/mandriva_press.phtml. в России, но я, например, ни разу 4. Анонс Mandriva Corporate Server 4.0 – не слышал о том, чтобы у нас про- Каковы ваши ближайшие планы? http://www.nixp.ru/news/7767. давались ПК с предустановленной На днях Novell представила Linux ре- 5. Novell выпустит Suse Linux Enterprise Mandriva Linux. Планируется ли раз- ального времени [5]. Не планируете Real-Time – http://www.nixp.ru/news/ ли вы расширение линейки своих витие этого направления? 7770.

4


тенденции У Mozilla и Firefox появились GNU-ответвления

трудниками компании MySQL AB. Одновременно с тем для разработчиков запустили веб-сайт MySQLForge (http://forge.mysql.com). «Эта дифференциация нацелена на лучшее обслуживание обеих категорий пользователей MySQL: тем, кто готов потратить время для экономии денег, и тем, кто хочет потратить деньги для экономии времени», – прокомментировал изменения в своем блоге Кай Арно (Kaj Arno), вицепрезидент по делам с сообществом в MySQL AB.

Неуступчивая в вопросах лицензирования политика Mozilla привела к тому, что проект GNU представил свои редакции ее продуктов Mozilla и Firefox. Авторы так прокомментировали свое решение по запуску этой инициативы: «Хотя исходный код проекта Mozilla является свободным программным обеспечением, выпускаемые ими бинарные сборки содержат дополнительное несвободное ПО. Кроме того, они распространяют несвободное ПО в виде плагинов». Консорциум SQO-OSS проверит качество Приложения получили названия Gnuzilla и IceWeasel со- Open Source ответственно. Имя последнего еще в 2004 году придумал Европейская комиссия учредила очередной Open SourceНатанаэл Нерод (Nathanael Nerode): «Лед – это не Огонь, проект: созданному при ее содействии консорциуму а Ласка – не Лиса, так что это, очевидно, другой пакет SQO-OSS (Quality Observatory for Open Source Software) (мы не хотим, чтобы Mozilla критиковали за наши ошибки, уже перечислили около 4 млн. долларов для тестирования и каких-либо проблем с их торговыми марками), однако с та- качества программного обеспечения с открытым кодом. В SQO-OSS вошли исследовательские организации, кой же очевидностью и относящийся к оригиналу». Разработчики проекта Debian GNU/Linux, известно- консультанты и некоторые проекты Open Source (среди го своей требовательностью к лицензионной «чисто- них, например, KDE). Половину средств консорциум полуте», еще до появления этого сообщения объявили о том, чил от своих участников, а об остальном побеспокоилась что в следующем стабильном релизе вместо оригиналь- сама Европейская комиссия. SQO-OSS будет предоставлять (под лицензией BSD) ного Firefox в дистрибутив войдет несколько измененная результаты по тестированию качества исходного кода проверсия браузера. дуктов Open Source с целью выявления степени их готовности для использования в корпоративной среде. ВдобаКомпания iXsystems купила права на PC-BSD вок будет опубликована таблица рейтинга приложений с отСпециализирующаяся на корпоративном аппаратном крытым кодом. обеспечении iXsystems приобрела права на основанную Составил Дмитрий Шурупов на FreeBSD операционную систему PC-BSD. по материалам www.nixp.ru Ожидается, что таким образом проект PC-BSD получит необходимое финансирование для разработки и выпуска новых версий ОС. «Теперь, с поддержкой iXsystems и их большим опытом в сфере BSD-серверов, PC-BSD планирует принести на рынок серверов стабильность и простоту использования. Большие и малые предприятия смогут только выиграть от удобства использования как десктопов с PC-BSD, так и серьезных серверов, в основе которых будет лежать FreeBSD», – прокомментировал это событие Крис Мур (Kris Moore), основатель проекта PC-BSD. «Наши поддержка и дальнейшее развитие PC-BSD ускорят адаптацию операционной системы FreeBSD пользователями Windows и Linux, привыкшими к удобному графическому интерфейсу», – заявил Мэтт Оландер (Matt Olander), главный технолог iXsystems.

MySQL представила серверы Enterprise и Community Разработчик популярной СУБД с открытым кодом представил проекты MySQL Enterprise Server и MySQL Community Server. Первая инициатива, как видно из названия, нацелена на корпоративных заказчиков и представляет собой новую подписку. В нее помимо самой СУБД входит привычная техническая поддержка и обновления, а также новая услуга мониторинга баз данных. MySQL Community Server ориентирован на сообщество и должен помочь разработчикам ПО с открытым кодом обмениваться информацией между собой и с со-

№11, ноябрь 2006

5


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

Кластеризация + виртуализация: Linux HA + OpenVZ Часть 1: кластеризация на практике

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

6


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

Ч

ем больше сервисов находится  Кластеры распределения нагрузв вашем попечении и чем в боль- Кластеры ки – позволяют распределить большей степени от их работоспособ- В Википедии (http://wikipedia.org) кластер шое количество запросов между нености зависит нормальное функциони- определяется как группа серверов, связансколькими узлами для снижения нарование предприятия, тем более акту- ных логически и способных обрабатывать грузки на каждый конкретный узел идентичные запросы. Серверы в составе альным становится обеспечение: и уменьшения времени ожидания от отказоустойчивости – от просто- кластера называются узлами или нодами вета на запрос. го резервного копирования важ- (Node). Каждый узел имеет собственный ных данных до систем высокой набор ресурсов, которые он предоставля-  Кластеры высокой готовности – позволяют гарантировать максимальную готовности (High Availability), ког- ет в пользование кластеру. Выделяют сленадежность благодаря избыточному кода при выходе из строя основно- дующие типы кластеров: личеству узлов, таким образом, отказ го сервера его функции автома-  Кластеры повышенной производительности – позволяют уменьшить одного из узлов не сказывается на ратически берет на себя резервный ботоспособности системы в целом. время, требуемое для проведения сервер; сложных расчетов, разбивая задание  консолидации сервисов и сокраВ этой статье нас будет интересовать на параллельно выполняющиеся потощения количества физических ки, часто используются в научных ис- только последний тип – кластеры высокой серверов, требующих обслужиследованиях. готовности. вания, – от простого размещения нескольких сервисов на одном фиЧаще всего в связке с Heartbeat исзическом сервере до использова- шние по отношению к проекту Linux HA ния различных систем виртуали- средства организации распределенно- пользуется DRBD (http://drbd.org), версия 7 которой обеспечивает более вызации, изолирующих сервисы друг го файлового хранилища. В их качестве могут выступать: сокую производительность и надежот друга.  классические распределенные ность по сравнению с классическими файловые системы (OCFS, CODA, распределенными файловыми систеНа первый взгляд эти задачи проGFS, Lustre), позволяющие орга- мами. DRBD версии 8 движется в стотивоположны, однако их вполне можно низовать параллельный доступ рону своих конкурентов, пытаясь сосовместить, если обеспечить отказоуск файлам с нескольких компьюте- хранить собственные преимущества, тойчивость не каждого сервиса в отдено к промышленной эксплуатации она ров одновременно; льности, а группы сервисов, работа средства автоматического зерка- пока еще не готова. ющих в виртуальных средах. Именно Что же касается виртуализации, лирования разделов жесткого дисэтим мы сейчас и займемся. ка на двух компьютерах, обеспечи- то здесь выбор гораздо шире, и опревающие доступ к файлам на чтение деляется он тем, что именно мы собиИнструменты и запись только с одного компью- раемся виртуализировать и сколько Сначала определимся с требуемым тера (программные – DRBD и аппа- аппаратных ресурсов мы готовы потинструментарием исходя из того, ратные – IBM ServeRAID); ратить. По этим критериям можно вычто нас интересуют только решения  прочие средства, которые в прин- делить 3 типа виртуализации (классис открытым исходным кодом. ципе использовать можно, но либо фикация приведена по докладу КирилЕсли требуется гарантировать их надежность (NFS, CIFS), либо ла Колышкина и Кирилла Коротаева, отказоустойчивость сервису, котостоимость (SAN) являются непри- прозвучавшему во время Третьей Межрый сам по себе отказоустойчивым емлемыми. дународной конференции разработчине является и встроенных механизмов кластеризации не имеет, то особых альтернатив проекту Linux HA (http://linux-ha.org) нет. Основным компонентом проекта является менеджер кластера Heartbeat, предоставляющий средства коммуникации между узлами кластера (в том числе механизм оповещения об отключении/включении узла) и управления ресурсами кластера. Для сервисов, решающих только вычислительные задачи, этого может быть достаточно, но большинство сервисов имеют привычку также хранить свои настройки и данные на диске. Чтобы они были доступны сервису независимо от того, на каком узле кластера он в данный момент работает, требуются внеРисунок 1. Кластеризация + виртуализация

№11, ноябрь 2006

7


администрирование Виртуализация Это система разделения ресурсов компьютера на множество независимых сред (виртуальных серверов), каждая из которых с точки зрения запущенных в ней программ выглядит как обычный выделенный сервер. Физический компьютер, на котором работают виртуальные среды, называется host-системой или HN (Hardware Node), для обозначения самих виртуальных сред часто используются такие термины, как гостевая система, раздел (partition), контейнер (container), VE, VPS, VDS. Основными областями применения виртуализации являются:  Консолидация серверов – позволяет

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

Zones/Containers, Linux VServer, ков свободных программ на Протве – Linux OpenVZ, Linux FreeVPS) – позhttp://kir.vtx.ru/lj/openvz-intro-ru.pdf): воляет в наибольшей степени сни Эмуляция (примеры реа лизации: QEmu, Bochs) – фактически зить накладные расходы и добитьэто полная эмуляция аппаратнося максимальной производительго обеспечения, позволяющая заности за счет того, что все виртупускать в виртуальной среде люальные среды обслуживает одно специально модифицированное бую операционную систему, однаядро операционной системы. Соко производительность таких решений сравнительно низкая. ответственно запускать не только различные операционные системы,  Паравиртуализация (примеры рено даже разные версии ядра не поализации: Xen, User-mode Linux) – позволяет запускать в виртуальлучится, да и доступ к аппаратным ресурсам внутри виртуальной среной среде специально модифицированную для этой среды операды во многом будет ограничен. ционную систему, соответственно Как мне кажется, с точки зрения запустить можно не все, но то, что запустить удастся, будет работать промышленной эксплуатации, а не тесбыстрее. тирования различного ПО, наиболь Виртуализация на уровне опе- шее значение имеет именно виртуарационной системы (примеры лизация на уровне операционной сисреализации: FreeBSD Jail, Solaris темы, так как в этом случае достига-

Рисунок 2. Особенности внутрикластерных сетевых соединений

8

ется максимально возможная плотность размещения виртуальных сред по сравнению с двумя предыдущими типами. Из трех открытых проектов, предназначенных для Linux, наиболее функциональным и быстрее всего развивающимся выглядит OpenVZ, который также является основой для проприетарного продукта Virtuozzo фирмы SWSoft. Более того, на wiki проекта довольно коротко уже описана удачная попытка «скрестить» его с проектом Linux HA – http://wiki.openvz.org/ HA_cluster_with_DRBD_and_Heartbeat. Поэтому пойдем уже проторенной дорогой и попытаемся построить аналогичное решение. В качестве платформы для построения нашего решения выбран ALT Linux Sisyphus (http://sisyphus.ru), и есть несколько причин такого выбора:  у меня уже имеется опыт успешной эксплуатации решений на дистрибутивах от ALT вообще и Sisyphus в частности;  использование Sisyphus предполагает минимум ручной работы, т.к. Linux HA и OpenVZ уже работают в нем «из коробки».

Что нам предстоит сделать В качестве простого примера возьмем ситуацию, когда нам требуется сконфигурировать почтовый сервер и сервер БД. Возможны следующие подходы к решению данной задачи: 1. Традиционный – для каждой задачи выделяется и конфигурируется отдельный физический сервер. В случае сбоя одного из серверов мы лишимся, как минимум, тех сервисов, которые этот сервер предоставляет. В худшем случае, учитывая, что сервисы могут зависеть друг от друга (а конфигурации, в которых почтовый сервер интенсивно использует сервер БД, не так уж редки), мы можем лишиться гораздо большего. 2. Кластеризация – физические серверы (точнее, сервисы, работающие на этих серверах) дублируются средствами Linux HA. В этом случае надежность значительно увеличивается, но возрастает также количество серверов и затраты на их обслуживание.


администрирование Проект «Sisyphus» Sisyphus (http://sisyphus.ru) – ежедневно обновляемый репозиторий пакетов свободных программ. Участие в Sisyphus открыто для всех желающих. В основе Sisyphus лежат технологии сборки программ и учета зависимостей между ними, а также отработанные процессы по взаимодействию между разработчиками. Для использования Sisyphus достаточно наличие любого дистрибутива ALT Linux (либо Sisyphus Live-CD) и средства управления пакетами программ APT. Sisyphus является постоянно развивающимся набором решений, на основе которого возможно создание универсальных или специализированных дистрибутивов Linux, а также одиночных решений. Таковыми являются все дистрибутивы, выпускаемые компанией ALT Linux (http://altlinux.ru), другим примером является дистрибутив RAD GNU/Linux (http://radlinux.org) для маршрутизаторов, Sisyphus Live-CD (http://www.unsafe.ru/ lakostis/livecd) – еще один пример. ALT Linux Team, которая занимается развитием проекта, в настоящее время состоит из более чем 150 разработчиков, только 1/5 часть которых является штат-

ными сотрудниками компании ALT Linux. Все остальные – это независимые разработчики, которые часто являются сотрудниками других организаций, использующих Sisyphus в своем бизнесе. Очень важно понимать, что Sisyphus в чистом виде, как и любая слишком быстро меняющаяся система, в большинстве случаев не предназначен для использования рядовыми пользователями, не принимающими даже минимальное участие в его развитии или хотя бы не отслеживающими состояние наиболее критичных для них компонентов системы, – и об этом явно сказано на сайте проекта. Для таких пользователей более удачным выбором будут дистрибутивы и специализированные решения на основе Sisyphus. К сожалению, пока не один из таких дистрибутивов не поддерживает описываемые в статье технологии виртуализации и кластеризации «из коробки», поэтому у вас есть выбор: использовать текущий репозиторий, дожидаться запланированного на ближайшее время стабильного среза или пытаться построить аналогичное решение на любом дистрибутиве Linux самостоятельно (и в этом случае то-

3. Виртуализация – для каждого сервера выделяется отдельная виртуальная среда на общем физическом сервере. В этом случае увеличивается гибкость, теперь мы не ограничены в количестве серверов и можем, например, выделить отдельную виртуальную среду для организации маршрутизатора/брандмауэра, ограничивающего доступ к почтовому серверу и серверу БД. Количество физических серверов и затраты на их обслуживание уменьшаются, но вместе с ними уменьшается и надежность, которая может оказаться даже ниже, чем в случае (1), если работоспособность серверов не зависит друг от друга. 4. Кластеризация + виртуализация – общий физический сервер (точнее, один-единственный сервис – система виртуализации) дублируется средствами Linux HA, тем самым мы совмещаем преимущества подходов (2) и (3) ценой увеличения нагрузки на сервера по сравнению с подходом (1). Если не углубляться в детали, схема выбранного нами последнего способа построения системы изображена на рис. 1. Переходим к деталям.

Строим кластер Более подробная схема, раскрывающая особенности внутрекластерных сетевых соединений, изображена на рис. 2. Каждый узел кластера имеет по 3 сетевые карты:

№11, ноябрь 2006

же есть выбор: использовать дистрибутив, построенный на основе Sisyphus, или нет). Что выбрать, наверное, зависит в первую очередь от вашего опыта. Имя проекту дал Sisyphus (Сизиф) – персонаж греческой мифологии. Миф о Сизифе, который непрерывно катил в гору камни, символизирует постоянный труд ALT Linux Team по усовершенствованию решений, заложенных в репозиторий. В настоящее время в стадии подготовки находится книга «Сизифов труд: Ежегодный альманах о свободном ПО (Sisyphus 2006)», в которую в качестве главы войдет часть материала статьи. Эта книга должна стать чем-то вроде первого выпуска альманаха, в котором будет подробно раскрыто несколько самых актуальных тем, обсуждавшихся в прошедшие полгода в связи с разработкой Sisyphus. Срок выхода книги планируется в соответствии с релиз-циклом Sisyphus, что позволит приложить к книге наиболее подходящий для использования стабильный срез репозитория. Дополнительная информация о книге доступна по ссылке https://heap.altlinux.ru/engine/Heap/Books/ AltLibrary/Sisyphus2006.

 eth0 – используется для подключения к внешней сети;  eth1 – будет использована далее при создании виртуального сервера router, поэтому адрес ей не присвоен;

 eth2 – специально выделена для коммуникации между узлами кластера. Сначала настроим общие разделы узлов кластера средствами DRBD. Установка DRBD производится штатным для ALT Linux способом. Смотрим, какие пакеты имеются в наличии: [root@m1 ~]# apt-cache search drbd drbd-tools - Distributed Redundant Block Device utilities kernel-modules-drbd-ovz-smp - Linux drbd kernel modules for DRBD. kernel-modules-drbd-std-smp - Linux drbd kernel modules for DRBD. kernel-modules-drbd-std-up - Linux drbd kernel modules for DRBD. kernel-modules-drbd-std26-smp - Linux drbd kernel modules for DRBD. kernel-modules-drbd-std26-up - Linux drbd kernel modules for DRBD. kernel-modules-drbd-vs26-smp - Linux drbd kernel modules for DRBD. kernel-modules-drbd-wks26-smp - Linux drbd kernel modules for DRBD. kernel-modules-drbd-wks26-up - Linux drbd kernel modules for DRBD. kernel-source-drbd-0.7.21 - Kernel source for DRBD.

Затем определяем, какое у нас ядро: [root@m1 ~]# uname -a Linux m1.mydomain.com 2.6.16-std26-up-alt10 #1 Wed Sep 13 20:06:02 MSD 2006 i686 GNU/Linux

На основании этой информации решаем, какие именно пакеты нам нужны, и устанавливаем их:

9


администрирование [root@m1 ~]# apt-get install ↵ kernel-modules-drbd-std26-up drbd-tools

Первый установленный нами пакет содержит модуль ядра, необходимый для работы DRBD, второй – userspace-инструменты для управления DRBD. Если вы используете другой дистрибутив Linux и уже готового модуля для вашего ядра нет ни в одном из репозиториев дистрибутива, модуль придется собрать самостоятельно – архив с последними исходными кодами DRDB доступен на http://oss.linbit.com/drbd. Конфигурирование DRBD сводится к редактированию файла /etc/drbd.conf. Минимальная, но вполне работоспособная конфигурация будет выглядит так: resource r0 { # протокол передачи # C: запись считается завершенной, если данные # записаны на локальный и удаленный диск, подходит # для критически важных транзакций и в большинстве # остальных случаев # B: запись считается завершенной, если данные # записаны на локальный диск и удаленный буферный кэш # A: запись считается завершенной, если данные # записаны на локальный диск и локальный буфер tcp # для отправки подходит для сетей # с высокой задержкой protocol C; # описание узла m1 on m1.mydomain.com { device /dev/drbd0; # имя drbd-устройства # раздел диска, поверх которого оно работает disk /dev/hda3; # адрес и порт демона drbd address 192.168.200.1:7788; # хранить метаданные drbd на том же разделе диска meta-disk internal; }

}

# описание узла m2 on m2.mydomain.com { device /dev/drbd0; # имя drbd-устройства # раздел диска, поверх которого оно работает disk /dev/hda3; # адрес и порт демона drbd address 192.168.200.2:7788; # хранить метаданные drbd на том же разделе диска meta-disk internal; }

Starting Starting DRBD resources: ...

service: [ d0 s0 n0 ].

После чего на обоих узлах кластера мы должны увидеть следующее: [root@m1 ~]# service drbd status drbd driver loaded OK; device status: version: 0.7.21 (api:79/proto:74) SVN Revision: 2326 build by builder@xeon.office.altlinux.ru, 2006-09-22 23:46:26 0: cs:Connected st:Secondary/Secondary ld:Inconsistent ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0

Итак, раздел устройства /dev/drbd0 уже работает, но содержимое разделов /dev/hda3, лежащих уровнем ниже, еще не синхронизировано. Первый раз синхронизацию необходимо произвести вручную, выполнив на узле m1: [root@m1 ~]# drbdadm -- --do-what-I-say primary all

После выполнения этой команды мы можем проследить за процесом синхронизации: [root@m1 ~]# service drbd status drbd driver loaded OK; device status: version: 0.7.21 (api:79/proto:74) SVN Revision: 2326 build by builder@xeon.office.altlinux.ru, 2006-09-22 23:46:26 0: cs:SyncSource st:Primary/Secondary ld:Consistent ns:1972 nr:0 dw:0 dr:10164 al:0 bm:0 lo:0 pe:30 ua:2048 ap:0 [>...................] sync'ed: 0.2% (3158696/3160552)K finish: 0:26:19 speed: 1,856 (1,856) K/sec

После окончания синхронизации на узле m1 мы увидим: [root@m1 ~]# service drbd status drbd driver loaded OK; device status: version: 0.7.21 (api:79/proto:74) SVN Revision: 2326 build by builder@xeon.office.altlinux.ru, 2006-09-22 23:39:33 0: cs:Connected st:Primary/Secondary ld:Consistent ns:731068 nr:1052796 dw:1782732 dr:193337 al:20 bm:356 lo:0 pe:0 ua:0 ap:0

В комплекте с DRBD поставляется очень детальный приПо строке Primary/Secondary можно определить, что сеймер конфигурационного файла, в котором все параметры прокомментированы. час узел m1 является ведущим. На ведомом узле m2 в выКроме того, если мы не используем udev (и созда- воде той же самой команды мы увидим Secondary/Primary. вать устройство /dev/drbd0 некому), придется создать его Все операции с устройством /dev/drbd0 необходимо выполвручную: нять только на ведущем узле, при этом все изменения будут автоматически применены к разделам /dev/hda3 на обо[root@m1 ~]# mknod /dev/drbd0 b 147 0 их узлах кластера. Создадим на устройстве /dev/drbd0 файловую систему Также необходимо прописать автозапуск сервиса drbd и примонтируем ее: при загрузке узла: [root@m1 ~]# chkconfig --level 2345 drbd on

Эти операции необходимо повторить на узле m2, а затем на обоих узлах запустить сервис drbd: [root@m1 ~]# uname -a

10

root@m1 ~]# mkfs.ext3 /dev/drbd0

mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 395200 inodes, 790138 blocks 39506 blocks (5.00%) reserved for the super user First data block=0


администрирование Maximum filesystem blocks=809500672 25 block groups 32768 blocks per group, 32768 fragments per group 15808 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 25 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.

[root@m1 ~]# mkdir /d0 [root@m1 ~]# mount /dev/drbd0 /d0

Если теперь мы попытаемся примонтировать устройство /dev/drbd0 на узле m2, мы получим следующее: [root@m2 ~]# mkdir /d0 [root@m2 ~]# mount /dev/drbd0 /d0 /dev/drbd0: Input/output error mount: block device /dev/drbd0 is write-protected, mounting read-only /dev/drbd0: Input/output error mount: /dev/drbd0 already mounted or /d0 busy

Такое (вполне разумное) поведение гарантируется только для ядер 2.6, в 2.4 была возможность примонтировать устройство /dev/drbd0 на обоих узлах кластера одновременно, что в свою очередь могло привести к повреждению файловой системы. Чтобы все-таки примонтировать раздел /dev/drbd0 на узле m2, необходимо сделать его ведущим, выполнив на узлах m1 и m2 следующие команды: [root@m1 [root@m1 [root@m2 [root@m1 [root@m2 [root@m1 [root@m2 [root@m2

~]# ~]# ~]# ~]# ~]# ~]# ~]# ~]#

umount /d0 drbdadm disconnect all drbdadm disconnect all drbdadm secondary all drbdadm -- --human primary all drbdadm connect all drbdadm connect all mount /dev/drbd0 /d0

В случае отказа узла m1 достаточно выполнить только те команды, которые приведены выше для узла m2. По большому счету, любители велосипедостроения (или оптимальных решений – иногда трудно отличить одно от другого) могут этим и ограничиться: написать скрипт, который будет следить на доступностью соседнего узла, и монтировать раздел /dev/drbd0, если соседний узел умер, можно самостоятельно. Другой вопрос: зачем, если Heartbeat умеет делать и это, и многое другое? Устанавливаем Heartbeat штатным для ALT Linux способом: [root@m1 heartbeat]# apt-get install heartbeat

Установка Heartbeat для других дистрибутивов Linux описана здесь http://www.linux-ha.org/DownloadSoftware. На главной странице проекта также написано, что кроме Linux Heartbeat, собирается и запускается на FreeBSD, Solaris и даже MacOS X. После установки Heartbeat на оба узла кластера на каждом узле необходимо создать файл /etc/ha.d/authkeys с правами доступа 600 и случайной строкой (ее можно приду-

№11, ноябрь 2006

мать самому, а лучше сгенерировать с помощью apg), которая будет использоваться узлами для авторизации друг друга: auth 1 1 sha1 RcBkJzU8ClnrjWVRLv5EDsdRFQP1j1C

Также необходимо создать конфигурационный файл Heartbeat, который на узле m1 будет выглядеть так: Logfacility local0 ucast eth2 192.168.200.2 auto_failback on node m1.mydomain.com m2.mydomain.com

а на m2 – так: Logfacility local0 ucast eth2 192.168.200.1 auto_failback on node m1.mydomain.com m2.mydomain.com

Затем необходимо описать ресурсы кластера в файле /etc/ha.d/haresources на каждом узле: m1.mydomain.com drbddisk ↵ Filesystem::/dev/drbd0::/d0::ext3

Такая запись означает, что кластер в штатном режиме будет использовать ресурсы drbddisk и Filesystem узла m1, а в случае его «смерти» – аналогичные ресурсы узла, оставшегося в живых, то есть m2. Для ресурса Filesystem заданы параметры: имя drbd-устройства, каталог, в который оно должно быть примонтировано (этот каталог мы должны создать самостоятельно на каждом узле кластера), и тип файловой системы. Узнать больше о ресурсах, поддерживаемых heartbeat, можно заглянув в каталог /etc/ha.d/resource.d – каждый ресурс представлен там соответствующим скриптом. Теперь можно запустить сервис heartbeat (не забыв перед этим размонтировать устройство /dev/drbd0, если оно было примонтировано): [root@m1 ~]# service heartbeat start logd is already running Starting High-Availability services:

[ DONE ]

После старта сервиса на ведущем узле кластера в логах можно увидеть такие сообщения: m1 heartbeat: [3372]: info: Status update for node m2.mydomain.com: status active m1 harc[3395]: info: Running /etc/ha.d/rc.d/status status m1 heartbeat: [3406]: info: Local Resource acquisition completed. m1 harc[3431]: info: Running /etc/ha.d/rc.d/ip-request-resp ip-request-resp m1 ip-request-resp[3431]: received ip-request-resp drbddisk OK yes m1 ResourceManager[3446]: info: Acquiring resource group: m1.mydomain.com drbddisk Filesystem::/dev/drbd0::/d0::ext3 m1 ResourceManager[3446]: info: Running /etc/ha.d/resource.d/drbddisk start m1 Filesystem[3569]: INFO: Running status for /dev/drbd0 on /d0 m1 Filesystem[3569]: INFO: /d0 is unmounted (stopped) m1 Filesystem[3505]: INFO: Filesystem Resource is stopped m1 ResourceManager[3446]: info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /d0 ext3 start m1 Filesystem[3678]: INFO: Running start for /dev/drbd0 on /d0 m1 kernel: kjournald starting. Commit interval 5 seconds

11


администрирование m1 kernel: EXT3 FS on drbd0, internal journal m1 kernel: EXT3-fs: mounted filesystem with ordered data mode. m1 Filesystem[3614]: INFO: Filesystem Success

В логах ведомого узла можно будет увидеть следующее: m2 heartbeat: [3739]: info: Status update for node m1.mydomain.com: status up m2 harc[3752]: info: Running /etc/ha.d/rc.d/status status m2 heartbeat: [3739]: info: remote resource transition completed. m2 heartbeat: [3773]: info: No local resources [/usr/lib/heartbeat/ResourceManager listkeys m2.mydomain.com] to acquire.

После старта heartbeat на обоих узлах кластера устройство /dev/drbd0 будет примонтировано на ведущем узле. Если остановить сервис heartbeat на ведущем узле m1, ведомый m2 возьмет на себя функции ведущего, и устройство /dev/drbd0 будет примонтировано на нем, при этом в логах мы увидим: m2 kernel: drbd0: Secondary/Primary --> Secondary/Secondary m2 heartbeat: [3739]: info: Received shutdown notice from 'm1.mydomain.com'. m2 heartbeat: [3739]: info: Resources being acquired from m1.mydomain.com. m2 heartbeat: [3850]: info: acquire local HA resources (standby). m2 heartbeat: [3851]: info: No local resources [/usr/lib/heartbeat/ResourceManager listkeys m2.mydomain.com] to acquire. m2 heartbeat: [3850]: info: local HA resource acquisition completed (standby). m2 heartbeat: [3739]: info: Standby resource acquisition done [all]. m2 harc[3870]: info: Running /etc/ha.d/rc.d/status status m2 mach_down[3880]: info: Taking over resource group drbddisk m2 ResourceManager[3900]: info: Acquiring resource group: m1.mydomain.com drbddisk Filesystem::/dev/drbd0::/d0::ext3 m2 ResourceManager[3900]: info: Running /etc/ha.d/resource.d/drbddisk start m2 kernel: drbd0: Secondary/Secondary --> Primary/Secondary m2 Filesystem[4023]: INFO: Running status for /dev/drbd0 on /d0 m2 Filesystem[4023]: INFO: /d0 is unmounted (stopped) m2 Filesystem[3959]: INFO: Filesystem Resource is stopped m2 ResourceManager[3900]: info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /d0 ext3 start m2 Filesystem[4132]: INFO: Running start for /dev/drbd0 on /d0 m2 kernel: kjournald starting. Commit interval 5 seconds m2 kernel: EXT3 FS on drbd0, internal journal m2 kernel: EXT3-fs: mounted filesystem with ordered data mode. m2 Filesystem[4068]: INFO: Filesystem Success m2 mach_down[3880]: info: /usr/lib/heartbeat/mach_down: nice_failback: foreign resources acquired m2 mach_down[3880]: info: mach_down takeover complete for node m1.mydomain.com. m2 heartbeat: [3739]: info: mach_down takeover complete.

m2 kernel: drbd0: drbd0_receiver [3510]: cstate Unconnected --> WFConnection m2 heartbeat: [3739]: WARN: node m1.mydomain.com: is dead m2 heartbeat: [3739]: WARN: No STONITH device configured. m2 heartbeat: [3739]: WARN: Shared disks are not protected. m2 heartbeat: [3739]: info: Resources being acquired from m1.mydomain.com. m2 heartbeat: [3739]: info: Link m1.mydomain.com:eth2 dead. m2 harc[4383]: info: Running /etc/ha.d/rc.d/status status m2 heartbeat: [4384]: info: No local resources [/usr/lib/heartbeat/ResourceManager listkeys m2.mydomain.com] to acquire. m2 mach_down[4403]: info: Taking over resource group drbddisk m2 ResourceManager[4423]: info: Acquiring resource group: m1.mydomain.com drbddisk Filesystem::/dev/drbd0::/d0::ext3 m2 ResourceManager[4423]: info: Running /etc/ha.d/resource.d/drbddisk start m2 kernel: drbd0: Secondary/Unknown --> Primary/Unknown m2 Filesystem[4546]: INFO: Running status for /dev/drbd0 on /d0 m2 Filesystem[4546]: INFO: /d0 is unmounted (stopped) m2 Filesystem[4482]: INFO: Filesystem Resource is stopped m2 ResourceManager[4423]: info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /d0 ext3 start m2 Filesystem[4655]: INFO: Running start for /dev/drbd0 on /d0 m2 kernel: kjournald starting. Commit interval 5 seconds m2 kernel: EXT3 FS on drbd0, internal journal m2 kernel: EXT3-fs: recovery complete. m2 kernel: EXT3-fs: mounted filesystem with ordered data mode. m2 Filesystem[4591]: INFO: Filesystem Success m2 mach_down[4403]: info: /usr/lib/heartbeat/mach_down: nice_failback: foreign resources acquired m2 mach_down[4403]: info: mach_down takeover complete for node m1.mydomain.com. m2 heartbeat: [3739]: info: mach_down takeover complete.

При повторном запуске сервиса heartbeat на m1 или при включении узла m1 он снова станет ведущим.

Что дальше

Традиционно после конфигурирования общего файлового хранилища файл /etc/ha.d/haresources дополняется списком сервисов, для которых необходимо гарантировать отказоустойчивость, а конфигурационные файлы и файлы данных этих сервисов перемещаются на файловую систему, созданную поверх drbd-устройства. Часто также конфигурируется алиас для сетевого интерфейса, который автоматически создается на ведущем узле, – тем самым все сервисы оказываются доступными по одному адресу. Недостатки такого подхода очевидны – чем больше сервисов, тем более запутанной становится такая конфигурация, а установка новых версий сервисов становится очень неудобной. Про общие проблемы сожительства различных сервисов на одном сервере я и не говорю – это специфично не только для Linux HA. Самым простым и изящным выходом в данной ситуаЕсли просто выключить питание узла m1, чтобы он ции является виртуализация. Если использовать этот подне успел оповестить m2 о том, что он завершает свою ра- ход, нам потребуется обеспечить отказоустойчивость тольботу, m2 обнаружит отсутствие m1 и точно так же возь- ко для одного сервиса – контейнера, в котором будут жить мет на себя функции ведущего узла и примонтирует раз- виртуальные сервера, причем последние можно конфигудел /dev/drbd0: рировать, не задумываясь о сложностях, связанных с кластеризацией... Но об этом читайте во второй части статьи, m2 kernel: drbd0: PingAck did not arrive in time. в следующем номере. m2 kernel: drbd0: NetworkFailure m2 kernel: drbd0: m2 kernel: drbd0: BrokenPipe m2 kernel: drbd0: m2 kernel: drbd0: m2 kernel: drbd0: Unconnected m2 kernel: drbd0:

12

drbd0_asender [3566]: cstate Connected -->

asender terminated drbd0_receiver [3510]: cstate NetworkFailure --> short read expecting header on sock: r=-512 worker terminated drbd0_receiver [3510]: cstate BrokenPipe --> Connection lost.

1. 2. 3. 4. 5. 6.

http://linux-ha.org http://drbd.org http://openvz.org http://altlinux.ru http://sisyphus.ru http://freesource.info


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

MS Windows XP SP3, или Много шума из ничего

Алексей Барабанов Третий пакет обновлений для MS Windows XP напоминает второй том «Мертвых душ»: его пишут где-то там, за границей, его все ждут, вспоминая предыдущий вариант, о нем уже сочиняют небылицы...

14


администрирование Предыстория Не меняются только самые мудрые и самые глупые. Конфуций

И есть ли какие-нибудь технические проблемы в данном вопросе? Попробуем разобраться.

Обновление до текущего состояния SP3 Мудрец стыдится своих недостатков,

Прошло уже несколько лет после даты выхода последнено не стыдится исправлять их. го кумулятивного пакета обновлений для MS Windows XP, Конфуций известного как Service Pack 2. И вот теперь, когда общее число выпущенных обновлений перевалило за сотню, все Попробуем получить SP3 самостоятельно. Для этого восс нетерпением ожидают пакета обновлений с номером 3. пользуемся диском, предназначенным для автоматической Официально в документе «Windows Service Pack Road Map» установки MS Windows XP SP2, созданным так, как описаMicrosoft предупреждает, что SP3 появится не ранее но в статьях [7]. Из процесса установки удалим для чисто2007 года. Но все равно периодически приходится опровер- ты эксперимента все дополнительные компоненты, кроме гать слухи о том, что SP3 уже готов к загрузке. И, несмотря собственно дистрибутива, и создадим имидж: на возражения Microsoft, самодельный SP3 можно загрузить # ./mkwinxp cd_sp2_only с различных ресурсов, например с TheHotfix.Net, как обещают после предварительной регистрации в форуме. Warning: creating filesystem that does not conform to ISO-9660. Warning: creating filesystem with (nonstandard) Joliet extensions Настораживает, что на Softpedia указан объем этоbut without (standard) Rock Ridge extensions. го обновления в 344 Мб, а это весьма много, да и ссылки It is highly recommended to add Rock Ridge mkisofs 2.01 (i686-suse-linux) для загрузки не работают. Еще стоит отметить, что согласre-directing all messages to mkwinxp-9838.log но [2] источником явился некий анонимный, но очень добрый сотрудник Microsoft. Почему-то все добрые люди таОкончательно образ диска занял 447 Мб (здесь и дакие скромные... Есть и отечественный вариант этого «чуда»: http:// лее примем для простоты 1 Мб равным 1 000 000 байтов, www.winall.ru/xp/sp/sp3. Он включает 30 заплаток и имеет или 1000 Кб, в зависимости от контекста). Воспользуемся объем 37,7 Мб. Ссылки тоже «висят», то есть загрузить SP3 результатом для установки рабочей станции под VMWare. ссайта невозможно. Но мне довелось получить это примитив- После завершения процесса инсталляции в полученной ное создание на очередном диске, купленном на одном мос- виртуальной машине проверим несколько важных в дальковском программном «развале». Самое смешное, что все нейшем точек. файлы переименованы в Pre_SP3_by_Winall_*.exe. Иначе гоНа рис. 1 видно, что уровень обновления системы – воря, до установки очень трудно оценить, что же ставится – SP2, директория «C:\Program Files\WindowsUpdate» пуста, и внутри ветки реестра «HKLM\SOFTWARE\Microsoft» откакие-то патчи от Microsoft или просто набор троянов. Ну и последний из существующих суррогатов SP3, об- сутствует раздел Updates. Запомним это. И приступим к обнаруженный в Интернете, откровенно носит сомнитель- новлению системы до текущего уровня рекомендованных ный характер и называется GAME EDITION 2006.Мне уда- обновлений. Для этого воспользуемся локальным сервисом SUSfL. лось его загрузить c http://www.wild-soft.org/2006/08/24/ windows_xp_sp3_pre_game_edition_2006.html. Но это был, Установка и настройка SUSfL подробно описана в [8]. Доскажем так, первый сайт с более-менее приличным содержанием. Так как все остальные имели контент из категории «только для взрослых». Этот набор имеет объем 118 Мб, что близко к размеру реального SP3, но поскольку в 118 Мб входит не SP3, а вся укороченная MS Windows XP в варианте «только для игрушек», то в моей практике такое изделие игровой инженерии вряд ли кого заинтересует. Из всего вышесказанного возникает больше вопросов, чем приходит ответов. Судя по всему, SP3 уже практически готов. И если не загадочные добряки из Microsoft, то какие-нибудь шустрые сетевые «гуру» непременно его предложат невзыскательной публике и попытаются получить на этом выгоду или иное преимущество. Так в чем же дело? С чем связано Рисунок 1. MS Windows XP SP2 после установки нежелание Microsoft выпустить SP3?

№11, ноябрь 2006

15


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

Рисунок 2. Установка SUSfL в качестве сервера обновления

бавим только одну поправку. Во всех статьях, описывающих установку SUSfL, неверно трактуется переменная localCabPool. Дело всё в том, что в исходных текстах содержится ошибка – название директории content иногда употребляется в виде литеральной константы, то есть localCabPool должен оканчиваться именно на «content» и никак иначе. # grep localCabPool sus_consts.py #localCabPool is path with trailing slash to your pool, where updates will be stored ###localCabPool = "/var/www/sus.int/content/" localCabPool = "/srv/winupdate/www/content/"

Естественно, надо учесть в настройках, что собирать обновления такой сервер должен для MS Windows XP Professional русской локализации. Перед обновлением рабочей станции убедимся, что сам SUSfL содержит все последние заплатки. # cd /srv/winupdate/www/autoupdate # python sus_sync.py Dictionaries up to date Need to download 0 Mb

не так, то надо её запустить командой «net start bits». Подождем, пока служба BITS скачает доступные обновления на рабочую станцию и предложит их установить. Не надо забывать, что BITS производит закачку в паузах сетевой активности, то есть надо на некоторое время оставить эту станцию в покое. Как только система приступит к загрузке обновлений, в правом нижнем углу появится иконка, всплывающая подсказка которой будет сообщать о степени готовности. После завершения загрузки сохраним полученные обновления, так как после установки они будут уничтожены. Для этого активируем меню процесса «Автоматическое обновление», но не будем подтверждать его, пока все папки из «C:\Program Files\ WindowsUpdate\wuaudnld.tmp\cabs» не скопируются в рабочую директорию, например в G:\SP3-from-win (см. рис. 3). После того как копирование завершится, разрешим установку загруженных заплаток. Таким образом, во-первых, получим правильный комплект обновлений и, во-вторых, проверим, что все обновления действительно подходят к нашему дистрибутиву. После установки обновлений будет предложено перегрузить рабочую станцию. Со всем согласимся и дождемся следующей загрузки станции (см. рис. 4). Откроем редактор реестра и найдем там ветку «HKLM\SOFTWARE\ Microsoft\Updates\Windows XP\SP3». Смотрите-ка, вот и SP3! Значит, все-таки есть? Экспортируем поскорее это «чудо», например в SP3-from-win.reg, в ту же директорию, где ранее были сохранены папки с файлами обновлений. Итак, теперь в нашем распоряжении есть набор необходимых обновлений, чтобы получить SP3 в текущем состоянии, и сохраненная ветка реестра, которая позволит проконтролировать факт установки SP3. Последнее подготовительное действие, что целесообразно выполнить прямо в MS Windows, это подготовить рабочее дерево дистрибутивных файлов для интеграции. Для этого просто скопируем содержимое установочного диска с MS Windows XP SP2 в заранее подготовленную для этого директорию на файловом сервере, которую подключим как G:\IMG (см. рис. 4).

Следовательно, если сейчас указать SUSfL как сервер обновлений, то система автоматически должна будет опре- Подготовка файлов для включения делить все недостающие заплатки и загрузить их из SUSfL в дистрибутив на рабочую станцию. Так и сделаем. Тот, кто, обращаясь к старому, Загрузим настройку реестра из http:\\winupdate.office. способен открывать новое, достоин, быть учителем. localnet\winupdate.reg (см. рис. 2), что назначит SUSfL с адКонфуций ресом winupdate.office.localnet как локальный сервер обновлений, и перезапустим службу автоматического обновле- Теперь, после того как все вспомогательные файлы собния на рабочей станции, набрав в окне консоли: раны, надо выбрать способ включения SP3 в существующий дистрибутив. Можно просто их все устанавливать >net stop wuauserv аналогично тому, как происходит установка обычных при>net start wuauserv ложений. Но можно их интегрировать внутрь. ПредполоЗагрузку обновлений производит служба BITS, ко- жим, что интеграция позволит получить нечто аналогичторая по умолчанию стартует автоматически. Если это ное кумулятивному SP2 и, как минимум, сэкономить объ-

16


администрирование ем. Кстати, об объеме – подсчитаем его. Все дальнейшие манипуляции будем выполнять в терминальном режиме на Samba-сервере. Пусть корень сетевого ресурса /srv/smb/public. Тогда папки обновлений размещаются в /srv/smb/public/SP3-from-win, а все содержимое исходного дистрибутивного диска в ../IMG относительно папок с заплатками. Все терминальные команды будут исполняться из /srv/smb/public/SP3-from-win. Сначала составим список всех файлов обновлений: # find . -name "*.exe" | awk -F/ '{print $3}' | awk ↵ -F. '{print $1}' >real-updates.txt

Затем скопируем их в корень рабочей директории: # for i in $(cat real-updates.txt) ; do find . ↵ -name "$i.exe" -exec cp -v '{}' $i.exe \; ; done `./com_microsoft.WindowsXP-KB925486-x86-189032/ ↵ WindowsXP-KB925486-x86-RUS.exe' -> ↵ `WindowsXP-KB925486-x86-RUS.exe' `./com_microsoft.873333_XP_SP3_WinSE_143087/ ↵ WindowsXP-KB873333-x86-RUS.exe' -> ↵ `WindowsXP-KB873333-x86-RUS.exe' ... пропущено ... `./com_microsoft.WindowsXP-KB922616-x86-185856/ ↵ WindowsXP-KB922616-x86-RUS.exe' -> ↵ `WindowsXP-KB922616-x86-RUS.exe'

Файлы копируются, а не перемещаются. Это позволит в случае неудачи повторить все шаги снова. Подсчитаем суммарный объем и число заплаток: # du -c *.exe | grep "total\$" 131128 total

# wc -l real-updates.txt 80 real-updates.txt

Итого 131 Мб в 80 файлах. Здесь уже можно оценить степень адекватности всех самодельных SP3, которые предлагаются в Интернете. Еще немного арифметики: итак, всего 131 Мб апдейтов, а размер исходного имиджа: # du -c ../IMG | grep "total\$" 448712 total

Если просто доложить все апдейты в дистрибутив, то получится 579 Мб. Но, конечно, правильнее будет их интегрировать. Для этого нужно подготовить соответствующие скрипты и для автоматического обновления в ходе установки, и для интеграции. Но нужно еще собрать информацию о допустимых ключах запуска заплаток. Но на сервере SUSfL она есть, но для того чтобы извлечь ее в автоматическом режиме, подправим немного исходники SUSfL: # diff -Naur admin.py.orig admin.py --- admin.py.orig +++ admin.py

2006-08-21 13:57:32.000000000 +0400 2006-08-21 16:04:24.000000000 +0400

@@ -155,7 +155,10 @@ else: dtstr = dts[0] + ' - ' + dts[len(dts)-1] print '<tr bgcolor="%s"><td valign="top"> ↵ <input type="checkbox" name="%s" value="1"%s> ↵ </td><td><b>'%(rowcolor,sPublisherPlusName,cstr) req.write('<div title="%s">%s, %s</div>'% ↵ (sPublisherPlusName, vItemDetails ↵

№11, ноябрь 2006

[conFieldItemStringsTitle].encode('utf8'), dtstr)) req.write('<div title="%s">%s, %s</div>'% ↵ (sPublisherPlusName, vItemDetails ↵ [conFieldItemStringsTitle].encode('utf8'), dtstr)) req.write('<div title="%s">'%(sPublisherPlusName)) print row+1, '&nbsp;' req.write('%s, %s</div>'%(vItemDetails ↵ [conFieldItemStringsTitle].encode('utf8'), dtstr)) req.write(' ↵ ('+repr(approved[sPublisherPlusName])+')') print '</b>' req.write(vItemDetails ↵ [conFieldItemStringsDescription].encode('utf8')) -169,7 +172,7 @@ req.write(' <a href="%s">Eula</a>'%urle) print '<br>'

+### + + + #

@@ +

req.write('Applies to: ' ↵ +string.join(applies, ',').encode('utf8')) req.write('Applies to: ' ↵ +string.join(applies, ',\n').encode('utf8')) print '</td></tr>' row = row + 1

Приведенный текст надо использовать как патч внутри каталога autoupdate, содержащегося в SUSfL. Эта правка носит косметический характер и приводит к тому, что в текстовом формате html имя файла обновления и все его характеристики, в том числе и ключи запуска, размещаются на одной строке, что в свою очередь облегчает обработку текстовыми утилитами. Прочтем список всех обновлений, размещенных на сервере, и сохраним его в файле: # wget http://winupdate.office.localnet/ ↵ autoupdate/admin.py -O all-updates-from-sus.html --00:27:52-- http://winupdate.office.localnet/autoupdate/admin.py => `all-updates-from-sus.html' Resolving winupdate.office.localnet... done. Connecting to winupdate.office.localnet[192.168.0.1]:80... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [text/html] [ <=>

] 396,889

3.82M/s

00:27:54 (3.82 MB/s) - `all-updates-from-sus.html' saved [396889]

Извлечем из текста все возможные обновления вместе с ключевой информацией: # grep XP SP2 all-updates-from-sus.html | ↵ awk 'BEGIN{FS="href=\""}{print $2}' >all-updates.txt

Теперь в all-updates.txt содержатся все доступные обновления и их ключи, что позволит составить командные файлы для полного обновления и интеграции в автоматическом режиме с помощью следующей программы: #!/bin/sh SUSLIST=all-updates-from-sus.html REAL=real-updates.txt # создадим командные файлы для обновления и интеграции U=update.cmd UO=update-only.cmd I=integrate.cmd for i in $U $UO $I ; do echo -e "@echo off\r" >$i done P="G:\IMG" RP="/srv/smb/public/IMG" mkdir -p $RP chmod ugo+w -R $RP UOP="$RP/\$OEM\$/\$1/InstData" mkdir -p $UOP

17


администрирование # список известных исключений EL="WindowsXP-KB885250-x86-RUS.exe ↵ WindowsXP-KB885835-x86-RUS.exe ↵ WindowsXP-KB887742-x86-RUS.exe ↵ WindowsXP-KB888113-x86-RUS.exe ↵ WindowsXP-KB890047-x86-RUS.exe ↵ WindowsXP-KB890175-x86-RUS.exe ↵ WindowsXP-KB867282-x86-RUS.exe ↵ Windows-KB913433-x86-RUS" n=1 for i in $(cat $REAL) ; do echo -----$n-------$i--------------T=$(grep "$i" $SUSLIST | grep "SP2") n=$((n+1)) if [ "1$T" == "1" ] ; then echo ====================ERROR!!!!================= else T=$(echo "$T" | awk 'BEGIN{FS="switches: "} ↵ {print $2}' | awk -F, '{print $1}') echo -e "echo integration $i running...\r\n$i.exe ↵ $T\r\necho done\r" >>$U # проверим на совместимость j=$(find . -name "$i.exe" | head -n 1) k=$(strings "$j" | grep "SFX_CAB_EXE") # удалим исключения m=$(echo $EL | grep "$i") [ "1$m" == "1" ] || k=""

fi done

if [ "1$k" == "1" ] ; then echo -e "echo integration $i running...\r\n$i.exe ↵ $T\r\necho done\r" >>$UO cp -v $i.exe $UOP else echo -e "echo integration $i running...\r\n$i.exe ↵ /q /integrate:$P\r\necho done\r" >>$I #echo "pause" >>$I fi

for i in $U $I ; do echo -e "pause\r" >>$i done cp -v $UO $UOP exit

Эта программа в ходе своей работы создает три командных файла:  update.cmd – для использования в дистрибутиве, чтобы установить заплатки как обычные приложения;

Рисунок 3. Обновления загружены и готовы к установке

18

 integrate.cmd – для интеграции обновлений в дерево файлов дистрибутива;

 update-only.cmd – для установки тех обновлений, которые нельзя интегрировать. Список исключений определен опытным путем. Все командные файлы строятся примерно одинаковым образом и состоят из последовательных запусков заплаток с ключами. Например, integrate.cmd начинается следующими строками: # head -n 7 integrate.cmd @echo off echo integration WindowsXP-KB925486-x86-RUS running... WindowsXP-KB925486-x86-RUS.exe /q /integrate:G:\IMG echo done echo integration WindowsXP-KB873333-x86-RUS running... WindowsXP-KB873333-x86-RUS.exe /q /integrate:G:\IMG echo done

Дистрибутив с интегрированным SP3 Достойный человек не идет по следам других людей. Конфуций

Запустим G:\SP3-from-win\integrate.cmd на рабочей станции MS Windows XP и выполним интеграцию обновлений в дистрибутивный набор G:\IMG (см. рис. 5). Дождавшись завершения, проверим результат уже снова в консоли Samba-сервера: # du -c ../IMG | grep "total\$" 623816 total

Получилось 623 Мб, что на 44 Мб больше, чем было бы, если просто разместить исходные обновления в виде установочных файлов, для того чтобы они отработали в процессе инсталляции. На 131 Мб исходных файлов 44 Мб «оверспейса» составляет 30%. Пока воздержимся от критики и проверим, как полученный дистрибутив с SP3 будет ставиться в автоматическом режиме. Соберем на основе полученного набора файлов установочный диск и произведем с него установку под VMWare. Главное, не забыть подключить установку тех заплаток, которые не были интегрированы и должны ставиться как приложения. Для этого можно, например, включить текст update-only.cmd в GuiRunOnce.cmd. Процесс установки ничем не отличается от ранее произведенного и потому не заслуживает комментариев. После завершения проверим важные для нас контрольные точки. Как видно на рис. 6, система указывает на соответствие SP2, каталог для сетевых апдейтов пуст, но в ре-


администрирование верных и самодельных вариантов Windows XP SP3. В любой момент свой SP3 можно приготовить за полчаса или за пару часов, если считать время на установку исходной MS Windows XP SP2. Здесь раскрою секрет появления списка исключений. Эти заплатки не «хотели» интегрироваться и терялись после установки проверочной системы с SP3. Проверку на соответствие уровню текущих обновлений можно проводить как с помощью сравнения экспортированной ветки реестра, так и путем подключения к локальному SUSfL для обновления. Но второй путь занимает больше времени, как и способ ручного прохождения интеграции каждой заплатки. Теперь вы знаете, что делать, если попадется такой «неуживчивый» Рисунок 4. Подготовка дерева дистрибутива после обновления до SP3 апдейт, пока компания Microsoft не естре присутствует ветка «HKLM\SOFTWARE\Microsoft\ соизволит выпустить настоящее обновление версии 3 Updates\Windows XP\SP3», что свидетельствует о произве- для MS Windows XP. денном в ходе инсталляции наложении заплаток. И тут самым важным становится вопрос о том, на- Выводы сколько интегрированные заплатки соответствуют тем, Единственная настоящая ошибка – что были поставлены из сети. Чтобы выяснить это, сноне исправлять своих прошлых ошибок. ва экспортируем указанную ветку реестра, но уже в файл Конфуций SP3-integrated.reg. Дабы избежать бинарного сравнения, воспользуемся Тут можно бы и закончить. Главный вывод: SP3 – не пропростенькой программкой для преобразования получен- блема, уже есть. Но давайте снова вернемся к подсчетам размеров. ных файлов в текстовый формат: Исходный диск с SP2 занимал 447 Мб, что оставляло # cat winreg2txt примерно 290 Мб для размещения приложений, использо#!/usr/bin/perl ванных в процедуре автоустановки, если не менять носи# преобразование winregistry в ascii файл тель на DVD. Дистрибутив с интегрированным SP3 занимает уже 623 Мб, что оставляет всего 114 Мб. Это недопустимо $i=1; $n=0; while(read(STDIN,$j,1)) { мало! Получается, если набор обновлений доложить в виif( $n > 1 ){ де установочных файлов, то останется 159 Мб. Не бог весть if( $i == 1){ $i=0; print $j; }else{ $i=1; } } что, но лучше, чем в случае с интеграцией заплаток в де$n++; рево дистрибутива. По крайней мере в этот объем можно } уместить хотя бы OpenOffice с парочкой сетевых приложеИ теперь получим из каждой сохраненной ветки реест- ний от Mozilla Foundation. Теперь можно предположить, чем вызвано нежелание ра список установленных заплаток: Microsoft торопиться с SP3. # ./winreg2txt <SP3-from-win.reg | grep "\\SP3\\\\" | ↵ «Нам», системным администраторам, работающим grep -v Filelist >SP3-from-win.reg.txt с GNU/Linux, не привыкать к периодическим и объемным # ./winreg2txt <SP3-integrated.reg | grep "\\SP3\\\\" | ↵ grep -v Filelist >SP3-integrated.reg.txt апдейтам. Чем их больше, и чем чаще они выходят, тем выше уровень сервиса дистрибуторов. И GNU/Linux легко «выходит» на объемы заплаток в 1 Гб. Например, openSUSE Осталось только сравнить их: через пару месяцев после выпуска требует именно тако# diff -s SP3-integrated.reg.txt SP3-from-win.reg.txt го объема апдейтов. Более того, нет никаких проблем, чтобы включить эти апдейты прямо в установочный диск. Files SP3-integrated.reg.txt and SP3-from-win.reg.txt are identical И при этом объем дистрибутива не увеличится сколько-нибудь существенно. А вот в модели проприетарной дистрибуции MS Windows Ну вот! Что и требовалось получить. Теперь ясно, что можно не рыскать по Интернету в поисках недосто- все гораздо хуже.

№11, ноябрь 2006

19


администрирование личение объема является следствием несовершенства выбранных форматов, которые не могут обеспечить жизненный цикл этой операционной системы. Согласно [2] инженеры Microsoft отложили выпуск Service Pack 3 до выхода Windows Vista. Можно предположить, что часть новых стандартов среды Vista в целях совместимости придется портировать в ранее выпущенные системы. И это очень вовремя возникшая причина станет рациональным оправданием для добавления очередных объемов к дистрибутиву MS Windows XP.

Рисунок 5. Процесс интеграции обновлений

Рисунок 6. MS Windows XP с текущим SP3 после установки

Выход SP2 увеличил размер дист- MS Windows, но и барьер совместирибутива MS Windows XP, и выпуск SP3 мости, так как после этого огромное тоже, скорее всего, сделает дистрибу- число компьютеров, оснащенных тольтив еще более объемным. И тем са- ко CD-приводом, смогут использовать мым вплотную пододвинет его к гра- дистрибутив единого образца, если он будет выпущен на DVD. нице CD-носителя. Еще одна проблема заключается Пугает ли это тех, кто привык к поставкам GNU/Linux на DVD или набору в увеличении «веса» без увеличения стоимости. С одной стороны, появлеCD, – нет! Но для дистрибуции универсаль- ние SP2 было оправдано увеличением ной системы MS Windows это не толь- функциональности, а вот для SP3 тако психологический барьер полу- кой лазейки пока, вероятно, нет. И почить многодисковый дистрибутив лучается, что немотивированное уве-

20

1. Windows Service Pack Road Map. Last Updates: March, 7, 2006 г. – http:// www.microsoft.com/windows/lifecycle/ servicepacks.mspx. 2. «Руководство Microsoft предупрежд ает: В с ет и в ы л ож и л и ф а л ьш и вый Windows XP SP3». 17 октября 2005 г. – http://www.securitylab.ru/news/ 241191.php. 3. T h e H o t f i x F o r u m s – h t t p : / / www.thehotfix.net/forums/index.php. 4. Sof tpedia: Windows XP Unof ficoal TheHotfix.Net Pack – http://www.softpedia. com/get/System/OS-Enhancements/ Windows-XP-Ser vice-Pack-3 Preview.shtml. 5. Microsoft Windows XP Service Pack 3 – http://www.winall.ru/xp/sp/sp3. 6. Windows XP SP3 Pre GAME EDITION 2006 – http://www.wild-soft.org/2006/08/ 24/windows_xp_sp3_pre_game_edition_ 2006.html. 7. Барабанов А. Автоматизация MS Windows, или AutoIt как мечта эникейщика. Часть 1. //Системный администратор, №4, 2005 г. – С. 11-15; Барабанов А. Автоматизация MS Windows, или AutoIt как мечта эникейщика. Часть 2. //Системный администратор, №5, 2005 г. – С. 54-58; Барабанов А. Автоматизация MS Windows, или AutoIt как мечта эникейщика. Часть 3. //Системный администратор, №6, 2005 г. – С. 25-31; Барабанов А. Автоматизация MS Windows, или AutoIt как мечта эникейщика. Часть 4. //Системный администратор, №7, 2005 г. – С. 46-47; 8. Кирилл Малеванов. Установка локального Windows Update сервера под Unix. 2004 г. – http://www.malevanov.spb.ru/ freebsd/winupdate.


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

Разрабатываем пакет управления для МОМ

Андрей Бирюков В вашей сети есть множество приложений, работу которых вам необходимо постоянно контролировать. Как написать свой пакет управления МОМ для одной из наиболее важных служб вашей сети?

Определяем задачу В предыдущей статье [1] вы узнали об архитектуре продукта Microsoft Operations Manager 2005, его функциональных возможностях, а также способах установки компонентов MOM, в том числе и пакетов управления Management Packs. Пакеты представляют собой контейнеры, содержащие наборы правил, которые позволяют осуществлять сбор информации. Однако мы рассмотрели вариант использования уже готовых пакетов, которые необходимо было лишь импортировать в МОМ. Удобство такого подхода очевидно, не нужно самостоятельно разработывать пакет, со-

22

ответственно нет необходимости разбираться в структуре взаимодействия Management Pack с МОМ. Но все это удобно лишь в том случае, если для интересующего вас программного продукта уже разработан пакет управления. Как упоминалось в предыдущей статье, Management Pack разработаны для всех продуктов Microsoft. Также пакеты управления есть для Lotus Domino и для систем резервного копирования Veritas (Symantec) Backup Exec. Но наверняка в вашей сети найдутся жизненно важные сервисы, состояние которых хотелось бы отслеживать с помощью МОМ, а готового пакета управления на сайте производите-

ля найти не удалось. Проблему можно решить написав собственный пакет управления. Дабы не быть голословным, в этой статье я опишу, как на практике создать Management Pack для одного из критичных ресурсов любой сети. В качестве примера такого сервиса предлагаю вам рассмотреть систему антивирусной защиты серверов. Данный компонент – неотъемлемая часть системы безопасности любой сети, но не для всех корпоративных антивирусов производители разработали пакеты управления для взаимодействия с МОМ. П р и м е р о м а н т и в и р у с а буд е т ClamAV. В данном случае неважно ка-


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

Архитектура Management Pack Пакет управления МОМ состоит из следующих основных взаимосвязанных компонентов (см. рис. 1):  Computer Attributes – в разделе определяется набор атрибутов, по которым будет осуществляться поиск нужных хостов.  Computer Groups – группа компьютеров, объединенная по определенному признаку, например серверы, на которых установлен Microsoft SQL.  Rule Groups – группы правил, которые являются неотъемлемой частью любого пакета управления.  Providers – провайдеры являются ключевыми элементами правил. Они определяют, где правило должно получать требуемые данные. Основным источником данных для правил является журнал Event Log.  Rules – правила, которые определяют, какие данные должны анализироваться пакетом управления, критерии, по которым ведется отбор, и какой ответ должен быть в случае получения интересующей информации.  Automated Responses – в этом разделе определяются ответы, возвращаемые МОМ.  Views – это ключевая возможность Management Pack, так как Views позволяют создавать сообщения о различных событиях, а также собирать информацию о производительности управляемой системы.

Рисунок 1. Компоненты Management Pack

редственно в процессе написания пакета управления, к которому мы собственно и приступаем.

Области действия и атрибуты

Начнем составление нового пакета управления. Сначала необходимо определиться с атрибутами, по которым будет выполняться выборка. В консоли «Administrator Console» выбираем «Management Packs», далее «Computer Attributes» и затем в меню «Action» указываем «Create Computer Attribute». Да лее пред лагается выбрать, по какому именно атрибуту выбирать: по ветке реестра или по значению. Для рассматриваемого в статье антивируса ClamAV нас будет интересовать ветка: HKEY_LOCAL_MACHINE\ S O F T WA R E \ M i c r o s o f t \ W i n d o w s \ CurrentVersion\Uninstall\ClamAV. Далее указываем имя, и атрибут готов. При необходимости таких атрибутов может быть несколько. Например, определенная операционная система или наличие специфического приложения на хосте (см. рис. 2). Теперь определимся с группой серверов, на которых нужно осуществлять мониторинг. В общем случае можно воспользоваться уже готовыми группами. Если же в вашей сети серверов очень много и вам необходимо указать лишь несколько из них, то тогда Предназначение каждого компо- создайте новую группу, выбрав в менента станет более понятным непос- ню «Actions» опцию «Create Computer

№11, ноябрь 2006

Group». Однако антивирус должен быть установлен на каждой рабочей станции и уж тем более на каждом сервере, так что лучше, чтобы в используемой группе были все сервера. Следующим этапом в разработке Management Pack будет создание правил. Для этого прежде всего необходимо создать группу правил Rule Group («Action → New Rule Groups»). При создании новой группы можно сразу указать те хосты, к которым будут эти правила применяться. В созданной группе правил есть три раздела: Event Rules, Alert Rules и Performance Rules. Подробно содержимое этих разделов уже рассматривалось в предыдущей статье [1]. Поэтому сейчас я опишу только те компоненты, которые необходимы для создания своего пакета управления. Во-первых, нас интересует бесперебойная работа антивирусного сервиса. Информация обо всех остановках сервиса должна немедленно сооб-

Рисунок 2. Ветка реестра в разделе «Attributes»

23


администрирование щаться оператору МОМ. Для этого необходимо создать Alert Rule, которое будет отслеживать состояние сервиса и в случае получения от системы сообщения «Service Unavaliable» отправлять письмо определенной группе пользователей. Реализовать все это можно следующим образом: В созданной группе правил открываем раздел «Alert Rules», далее в меню «Action» выбираем «Create Alert Rule», отмечаем опцию of severity, а в соответствующем списке – пункт «Service Unavailable». Таким образом, будут отслеживаться системные сообщения о недоступности сервиса. На следующем шаге указываем время, когда это правило будет выполняться – «Always process data». Наконец необходимо указать ответные действия «Responses». Как уже упоминалось ранее, нам требуется отправить уведомление соответственно «Send a notification to a Notification group». В разделе «Notification» выбираем группу получателей «Notification group – Network Administrators». В соседней закладке «E-Mail format» можно внести изменения в формат почтового сообщения, которое будет отправлено операторам. В качестве дополнительных ответных действий можно также прописать запуск сценария, который будет перезапускать сервис. В простейшем случае такой сценарий может состоять из одной команды: Net start [Имя_сервиса]

Однако зачастую внезапное «падение» сервиса носит неслучайный характер и простого рестарта служб может оказаться недостаточно, так как необходимо выяснить причину данного сбоя, поэтому непременно должно быть отправлено уведомление оператору. Теперь рассмотрим вопрос, касающийся создания операторов. В административной консоли МОМ для этого предусмотрен раздел «Notifications» (Уведомления), в котором определены «Notification Group» (Группы уведомлений). Здесь необходимо добавить нужного оператора в группу «Network Administrators», указав при этом контактный e-mail, на который требуется отправлять уведомления.

Сценарии и запросы Итак, мы определились с атрибутами, по которым будет проходить выборка, также составили список тех машин, на которых необходимо осуществлять мониторинг. Теперь определимся с провайдером (Provider), то есть с источником информации об интересующих нас событий. Таким событием прежде всего является остановка сервиса ClamAV, то есть необходимо обнаруживать состояние Stopped. В решении этой проблемы нам поможет запрос WMI. Подробнее об этом мощном средстве Windows уже рассказывалось в предыдущих выпусках журнала [2, 3]. Для контроля состояния сервиса ClamAV необходимо построить запрос следующего содержания: select * from __InstanceModificationEvent WITHIN 89 ↵ Where TargetInstance ClamAV'Win32_Service' ↵ AND TargetInstance.State = 'Stopped'

Для этого в меню «Management Pack» выбираем опцию «Providers», далее «Create Provider». В качестве типа про-

24

вайдера выбираем «WMI Events» и в следующем окне, в поле запрос, указываем вышеприведенную строку. Таким образом, был создан источник информации по интересующему событию. Думаю, очевидным требованием для антивирусного комплекса будет возможность создавать уведомления об обнаружении зараженных файлов. Для того чтобы создавать такие уведомления, лучше всего воспользоваться сценарием на VBScript, который будет производить анализ файла журнала антивирусной системы, осуществляя поиск вхождений строк, сообщающих об обнаруженных зараженных файлах, а также о результатах лечения или удаления из них вредоносного кода. Файл такого журнала может иметь следующий вид: … c:/windows/DtcInstall.log: OK c:/windows/eicar_com.zip: Eicar-Test-Signature FOUND c:/windows/EventSystem.log: OK c:/windows/explorer.exe: OK c:/windows/Zapotec.bmp: OK c:/windows/_default.pif: OK … ----------- SCAN SUMMARY ----------Known viruses: 53081 Engine version: devel-20060426 Scanned directories: 1 Scanned files: 84 Infected files: 1 Data scanned: 5.66 MB Time: 17.856 sec (0 m 17 s)

В примере продемонстрировано обнаружение тестового вируса Eicar, который используется для тестирования антивирусных продуктов. Сценарий, осуществляющий поиск подобных записей, должен содержать код, подобный представленному в Листинге 1. Листинг 1. Поиск вхождений в файле журнала ‘ путь к файлу журнала strFile="c:\clamav-devel\log\clamd.log" Set objFSO = CreateObject("Scripting.FileSystemObject") ‘ открываем файл на чтение Set readPCFile = objFSO.OpenTextFile(strFile, ForReading) search="FOUND" искомая подстрока ‘ цикл по всему файлу журнала Do Until readPCFile.AtEndOfStream strNextLine = readPCFile.Readline ‘ считываем построчно ‘ вхождение найдено If Instr(InStr(1,strNextLine,search)) then ‘ присваиваем соответствующее значение переменной result= strNextLine … ‘ далее действия с этой переменной End If Loop ‘ завершение цикла readPCFile.Close ‘ закрываем файл

Использовать сценарий в таком виде непосредственно в МОМ нельзя, так как для пакетов Management Pack существует определенный формат сценариев, которого необходимо придерживаться. Прежде всего нужно определить ряд констант и переменных. Обычно эта инициализация производится вначале сценария и имеет вид: Листинг 2. Общий вид сценария ‘ блок инициализации Option Explicit Const PROBLEMSTATE_NOTSET = 0


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

PROBLEMSTATE_GREEN = 1 PROBLEMSTATE_YELLOW = 3 ' Yellow = Red+(Warning|Error) PROBLEMSTATE_RED = 3 ALERT_SUCCESS = 10 ALERT_INFORMATION = 20 ALERT_WARNING = 30 ALERT_ERROR = 40 ALERT_CRITICAL_ERROR = 50 ALERT_SECURITY_BREACH = 60 ALERT_SERVICE_UNAVAILABLE = 70

Dim oEvent Set oEvent = ScriptContext.CreateEvent() ‘ основной блок Sub Main() ‘ здесь производится вызов процедур, используемых для сбора ‘ и обработки необходимой информации End Sub ‘ Function ThrowScriptError(sMessage, oErr) ' ' ThrowScriptError :: Creates an event and sends it back ' to the mom server ' ' процедура возвращает сообщение об ошибке, в случае ' некорректного завершения сценария ScriptContext.Quit() End Function ' VBScript source code ScriptContext.Submit oEvent

Напишем сценарий, который будет отслеживать появление в журналах событий антивирусной системы сообщения о зараженных файлах (напротив имен таких файлов должно быть написано FOUND). Далее сценарий будет передавать МОМ сообщение в специальном формате, на основании которого будет создан Alert, сообщающий оператору системы о заражении файла. Листинг 3. Сценарий, сообщающий об обнаружении зараженного файла Option Explicit Const PROBLEMSTATE_NOTSET = 0 ‘ состояние проблемы Const PROBLEMSTATE_GREEN = 1 ‘ цветовая маркировка Const PROBLEMSTATE_YELLOW = 3 ‘ Yellow = Red+(Warning|Error) Const PROBLEMSTATE_RED = 3 Const ALERT_SUCCESS = 10 ‘ различные виды уведомлений Alert Const ALERT_INFORMATION = 20 Const ALERT_WARNING = 30 Const ALERT_ERROR = 40 Const ALERT_CRITICAL_ERROR = 50 Const ALERT_SECURITY_BREACH = 60 Const ALERT_SERVICE_UNAVAILABLE = 70 Dim oAlertHandle ‘ Объект для создаваемого события Set oAlertHandle = ScriptContext.CreateAlert() ‘ основной блок Sub Main() ‘ здесь производится вызов процедур, используемых для сбора ‘ и обработки необходимой информации virusfind() End Sub Sub virusfind() ‘ путь к файлу журнала strFile=”c:\clamav-devel\log\clamd.log” Set objFSO = CreateObject(“Scripting.FileSystemObject”) ‘ открываем файл на чтение Set readPCFile = objFSO.OpenTextFile(strFile, ForReading)

№11, ноябрь 2006

search=”FOUND” искомая подстрока ‘ цикл по всему файлу журнала Do Until readPCFile.AtEndOfStream ‘ считываем построчно strNextLine = readPCFile.Readline ‘ вхождение найдено If Instr(InStr(1,strNextLine,search)) then ‘ присваиваем соответствующее значение переменной result= strNextLine ‘ далее приводятся свойства уведомления oAlertHandle.Name = “ Virus found!!!” ‘ описание события oAlertHandle.Description = “Virus found in file” & result ‘ Какая роль (диск так как вирус найден на файловом уровне, ‘ а например, не в памяти) oAlertHandle.ServerRole = “Disk” ‘ компонента – файловая система oAlertHandle.Component = “File System” ‘ цвет уведомления желтый oAlertHandle.ProblemState = PROBLEMSTATE_YELLOW ‘ вид уведомления – предупреждение oAlertHandle.AlertLevel = ALERT_WARNING End If Loop ‘ завершение цикла readPCFile.Close ‘ закрываем файл End sub ‘ Function ThrowScriptError(sMessage, oErr) ‘ ‘ ThrowScriptError :: Creates an event and sends it back ‘ to the mom server ' ' процедура возвращает сообщение об ошибке, в случае ‘ некорректного завершения сценария On Error Resume Next Dim oScriptErrorEvent Set oScriptErrorEvent = ScriptContext.CreateEvent() With oScriptErrorEvent .EventNumber = 40000 ‘EventLogEntryType Enumeration .EventType = 1 .Message = sMessage .SetEventParameter “Microsoft Windows Servers Base Operating System” .SetEventParameter sMessage .SetEventParameter oErr.Description .SetEventParameter oErr.Number End With ScriptContext.Submit oScriptErrorEvent ScriptContext.Echo ↵ “ThrowScriptError(‘” & sMessage & “’)” ScriptContext.Quit() End Function ‘ VBScript source code ScriptContext.Submit oEvent

Итак, как видно из Листинга 3, для создания уведомления необходимо прописать объект соответствующего типа и затем передать ему найденные в результате работы процедуры поиска данные. Теперь для завершения создания пакета нужно прописать данный сценарий в МОМ. Сделать это можно следующим образом. В консоли администрирования выбираем «Management Packs», далее «Scripts», в меню «Action» указываем «Create Script». В открывшемся окне пишем имя, в качестве языка сценариев указываем VBScript, далее просто копируем через буфер обмена исходный текст, в следующем окне Parameters ничего указывать не надо, так как все необходимые данные извлекаются в процессе работы программы. Наконец завершающим этапом в составлении пакета управления для антивирусной системы является подключение написанного сценария к Management Pack. Для это-

25


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

Рисунок 3. Сообщение о зараженном файле

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

го нужно создать задачу «Task». Для этого выбираем «Create Task», в окне, Выводы запрашивающем, где должен выпол- Подводя итог всех выполненных дейсняться сценарий (Task Run Location твий, хотелось бы сделать ряд пояснеAnd Type), выбираем «Agent Managed ний. Конечно, большинство коммерComputer» и тип задачи – «Script». ческих корпоративных антивирусов В следующем окне «Target Role – умеют выполнять описанные в стаComputer и Script» – указываем имя тье задачи. Так, для контроля за ратого сценария, который был создан ботой службы антивируса используранее. Далее указываем имя задачи ются различные механизмы, которые и нажимаем «Finish». в случае остановки сервиса немедленно его перезапускают. Также и уведомПолучаем результат ления о вирусах они могут рассылать Итак, пакет управления создан. Что же не только с помощью электронной почбыло получено в результате? Теперь ты, но и, к примеру, с помощью служб при обнаружении антивирусной сис- мгновенных сообщений (ICQ, MSN темой зараженного файла в консоли и других). Так что целью статьи не явоператора можно наблюдать следую- лялось изобретение велосипеда в упщие сообщения (см. рис. 3). равлении корпоративными антивирусАналогичное сообщение придет ными системами. Главное, на примере на почтовый адрес оператора, что мо- бесплатного антивируса ClamAV пожет оказаться весьма полезным в слу- казан механизм создания собственчае массовой вирусной эпидемии. ного пакета управления для Microsoft Также уведомление будет отправле- Operations Manager. Теперь на основе но в случае, если по какой-либо при- приведенных рекомендаций вы смо-

26

жете построить уже собственный пакет управления для тех сервисов, которые критичны именно для вашей сети, будь то система антиспама, сервер бухгалтерии или служба резервного копирования. Думаю, в ваших интересах получать своевременные сообщения обо всех жизненно важных системах сети. 1. Бирюков А. Microsoft Operations Manager 2005 – управляем сетью. //Системный администратор, №10, 2006 г. – С. . 2 Леонтьев К. Вы все еще не используете WMI? Часть 1. //Системный администратор, №1, 2006 г. – С. 4-11; Леонтьев К. Вы все еще не используете WMI? Часть 2: пишем сценарии//Системный администратор, №2, 2006 г. – С. 6-14. 3. Леонтьев К. Узнай секреты WMI: события и провайдеры. Часть 1: дополнительные возможности. //Системный администратор, №3, 2006 г. – С. 6-13; Леонтьев К. Узнай секреты WMI: события и провайдеры. Часть 2: ключ к управлению системой и приложениями. //Системный администратор, №5, 2006 г. – С. 28-34. 4. Microsoft Operations Manager Software Development Kit. 5. Microsoft Management Pack Developer Guide.


полезные советы Используйте родственные связи PostgreSQL, будучи, в общем-то реляционной СУБД, поддерживает и некоторые «объектные» свойства. Например, наследование таблиц. То есть вы можете на базе существующей таблицы (которая в дальнейшем так и будет называться – базовой) создать производную (или даже несколько), дополнив её новыми полями: CREATE TABLE mytable (id serial, ware varchar, ↵ price numeric(10,2)); CREATE TABLE withdesc (description text) INHERITS mytable;

Теперь в таблице withdesc, помимо собственного поля description, будут доступны и поля родительской таблицы mytable – id, ware и price. Причём данные, записанные, скажем, в поле ware таблицы withdesc, будут видны и в mytable (поскольку физически они там и хранятся). Естественно, и наоборот, изменения mytable будут находить отражение и в withdesc. Благодаря этому можно, например, вести одну таблицу с паспортными данными по всем вашим клиентам, а для хранения технической информации (различающейся, скажем, для пользователей ADSL и коммутируемого доступа) использовать две производные таблицы на её базе.

«Грузите» сервер с помощью курсоров «Классическая» схема взаимодействия между клиентской программой и сервером баз данных заключается в том, что клиент отсылает запрос на сервер, получает ответ, размещает его в своей памяти и обрабатывает в соответствии со своими задачами. Очевидно, что если выборка получается достаточно объёмная, то клиенту приходится затрачивать значительные ресурсы на её временное хранение. PostgreSQL предлагает способ переложить эту заботу на плечи сервера: использование курсоров. Курсор – это указатель на результат запроса (выборку), к которому клиент может обращаться за тем или иным фрагментом без необходимости держать его полностью в своей памяти. Рассмотрим небольшой пример: admin=# BEGIN; BEGIN

admin=# DECLARE mycursor CURSOR FOR admin-# SELECT * FROM mytable; DECLARE CURSOR

admin=# FETCH NEXT FROM mycursor; 1 | Монитор | 7999.00

admin=# FETCH NEXT FROM mycursor; 2 | Коврик для мыши | 7.90

admin=# MOVE BACKWARD ALL IN mycursor; MOVE 1

admin=# FETCH NEXT FROM mycursor; 1 | Монитор | 7999.00

admin=# COMMIT;

Как видите, это напоминает обычную работу из Perl-сценария, но на этот раз выборка хранится на стороне сервера. Запросом FETCH можно получить следующую, предыдущую, текущую запись (или несколько записей начиная с текущего положения указателя). Запрос MOVE служит для перемещения указателя в том или ином направлении. Безусловно, при использовании курсоров есть свои недостатки – частые запросы к СУБД заметно сказываются на быстродействии, да и на сеть создаётся дополнительная нагрузка... Поэтому в PostgreSQL курсоры используются сравнительно редко. Тем не менее, в ряде случаев они могут оказаться полезны, например, если приходится работать с большими объёмами данных на слабенькой клиентской машине. Нужно заметить, что в PostgreSQL курсоры поддерживают только чтение. Кроме того, курсор может быть использован только внутри транзакционного блока (BEGIN – COMMIT/ROLLBACK).

Ищите информацию в первоисточниках В PostgreSQL можно узнать много интересного непосредственно из системных таблиц. Получить их список в интерактивном терминале позволяет директива \dS. Например, таблица pg_authid содержит сведения о зарегистрированных PostgreSQL-пользователях (для работы можно использовать представления на её базе – pg_user, pg_shadow, pg_group); из pg_index вы получите данные по индексным файлам; и т. д. В ряде случаев просмотр этих таблиц помогает быстрее разобраться в той или иной проблеме. Кроме того, это довольно удобный путь для автоматического управления базами PostgreSQL.

Не забывайте об уборке В процессе активной работы база данных может подвергаться фрагментации, что приводит к нерациональному использованию места на диске, а также замедляет обработку запросов. Кроме того, внутренний оптимизатор запросов нуждается в актуальной статистической информации, чтобы строить запросы наиболее эффективно. Поэтому не забывайте о периодической (в идеале – ежедневной, а также внеплановой после крупных изменений в базе) очистке, которая выполняется командой VACUUM (VACUUM ANALYZE – для анализа структуры данных). Параметр VERBOSE позволит вам узнать, чем же СУБД занимается в это время. Нужно заметить, что зачастую при установке PostgreSQL утилита очистки базы (vacuumdb) автоматически «прописывается» в crontab или сценариях ежедневного обслуживания (periodic). Но поскольку очистка сильно замедляет работу СУБД, имеет смысл проконтролировать эти установки и привести их в соответствие с режимом работы вашего сервера.

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

COMMIT

№11, ноябрь 2006

27


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

На что способен дистрибутив SystemRescueCd Linux

Иван Максимов Наверняка вам приходится сталкиваться с проблемами по восстановлению системы после сбоя и использовать для этого наборы дистрибутивов и Live-CD различного назначения. Есть ли единое и компактное решение «все в одном»?

З

накомство с дистрибутивом у меня произошло в «боевых условиях». Однажды, в один прекрасный выходной вечер, знакомый попросил посмотреть его компьютер, который перестал работать. Что ж, друзей нужно выручать, пришлось заняться работой в выходной, но вот беда, дома ничего кроме нескольких игрушек и дистрибутивов с FreeBSD и Linux не оказалось. Только случайно было записано несколько небольших

28

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

на предложение установить OpenSUSE был получен отказ и подходящих инструментов под рукой не оказалось, пришлось попытаться воспользоваться Live-CD SystemRescueCd Linux, который до этого я даже ни разу не загружал...

О дистрибутиве SystemRescueCd Linux Live-CD-дистрибутив предназначен для восстановления системы пос-


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

Рисунок 1. Основное загрузочное меню Sysrescuecd

ле сбоя, копирования данных с поврежденных жестких дисков, тестирования аппаратной части ЭВМ, сброса забытых паролей в семействе ОС Windows NT, подготовки дисков для установки новой ОС и многого другого, но обо всем по порядку. Дистрибутив основан на Gentoo Live-CD, версии ядра Linux 2.6.16.10. Последняя стабильная версия расположена на официальном сайте проекта [1]. Доступны архитектуры x86 (i586) и PPC (Pocket PC). В дистрибутиве присутствует поддержка файловых систем: ext2/3, reiserfs (включая 4), xfs, jfs, iso9660, vfat и NTFS (в режиме записи используется CaptiveNtfs). Поддерживаются сетевые службы: ssh, nfs, samba, lufs. Первые версии данного дистрибутива свет увидел в 2003 г., на данный момент последний релиз от первого мая 2006 г. Обновления происходят не регулярно, в 2003-2004 гг. было выпущено 20 обновлений, тогда как в 2005 г. ни одного, в 2006 дистрибутив «ожил», выпущено 4 релиза. Форум проекта поддерживается на протяжении всего времени существования Live-CD. На сайте доступна документация на английском, французском и испанском языках, великого и могучего русского нет. Закачав с официального сайта isoобраз размером 121 Мб, запишем его на диск. Сразу оговорюсь, хотя и возможна установка дистрибутива на USBFlash, не считаю, что это рационально для дистрибутива «на все случаи жизни» – слишком большой парк машин у нас в стране не поддерживает загруз-

№11, ноябрь 2006

Рисунок 2. Строка приглашения c основными подсказками

ку с USB-устройств. Итак, приступим к обзору.

Загрузка Сразу после появления меню (рис. 1) не спешите нажимать <Enter> для запуска Gentoo, кроме изменения параметров, таких как разрешения экрана, загрузки с жесткого диска или флоппидисковода, нам доступны небольшие, но очень полезные образы программ и утилит. Рассмотрим самые интересные параметры. Нажав <F2>, мы можем выбрать:  Memtest86+ v1.65 – тест оперативной памяти на физические повреждения. После загрузки теста сразу начнется проверка ОЗУ с параметрами по умолчанию (полное тестирование), изменить параметры можно, зайдя в небольшое меню, нажав клавишу <C>.  FreeDOS – ОС и небольшой набор утилит для работы с жестким диском. В №2 за 2006 г. я описывал FreeDOS [2], но напомню некоторые основы. Командой «dir /w» выведем на экран список доступных утилит (38 файлов и одна директория – небольшой выбор). Для просмотра файлов с документацией можно воспользоваться утилитами more или pg, работает «донабор» команд и названия файлов (как в bash из *nix). Из основных утилит стоит выделить: fdisk (работа с разделами), chkdsk (тест FAT-партиций на ошибки), testdisk (восстановление разделов FAT, NTFS, ext2/3, reiserfs, ufs и т. д.), presizer (изменение размера FAT-партиций). Как можно заме-

тить, образ содержит утилиты, ориентированные в основном для работы с FAT-разделами, т.е. для ОС – клонами DOS и Windows 9х. GAG (Graphical-Boot-Manager) – загрузчик, аналог Lilo или Grub, работает прак тически со всеми распространенными ОС (DOS, Windows, Linux, BSD). Возможна одновременная загрузка до 9 операционных систем. Сразу после загрузки рекомендуется ознакомиться с документацией и часто задаваемыми вопросами (первый и второй пункты меню). Ranish Partition Manager – предназначен для работы с партициями, более функционален, чем стандартный fdsik. К сожалению, возможна работа в режиме создания только с файловыми системами FAT. Хотя Ranish Partition Manager и обнаруживает партиции с ufs (FreeBSD) и ext2/3 (Linux), из доступных опций имеется возможность только удалить их. Aida v2.12 – неплохой тест по определению «железа», но, к сожалению, успевший уже устареть (проблемы с определением новых чипов, например – nForce2). На 45 закладках будет подробно отображено аппаратное обеспечение ЭВМ. Если необходимо записать результат работы теста, выйдите из теста Aida (клавиша <Esc>) и запустите a.bat, который создаст файл report.asm. Dban (Darik’s Boot and Nuke) – замечательная утилита для разрушения данных на жестком диске. После загрузки будет представлено ме-

29


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

Обзор Gentoo

Рисунок 3. Интерфейс GNU Parted

Рисунок 4. Интерфейс Qtparted

Выбрав удобный видеорежим, запустите систему. Во время загрузки вас спросят, какую кодовую страницу следует использовать (русская за номером 31). Добравшись до строки приглашения, можно будет увидеть небольшие подсказки по работе с системой (рис. 2), работа ведется по умолчанию от пользователя root. После загрузки будет доступно 1388 команд (полноценный Linux, это вам не busybox). Никаких графических оболочек типа KDE или GNOME нет (кроме Midnight Commander), хотя, собственно, зачем они нужны на административном диске? В качестве командного интерпретатора (шелла) используется zsh версии 4.2.0, любители bash смогут найти последний по стандартному пути /bin/bash. При беглом обзоре стандартных утилит хотелось бы выделить их разнообразие:  Редакторы текста – vim, nano, zile, joe и графический qtinyeditor.  Архиваторы – gzip, zip, rar, tar, arj, dar.  Утилиты для записи CD и DVD – cdrecord, cdrtools, dvd-rw-tools.  Веб-браузеры – links и lynx.  Сканер Nmap (версии 3.55).  Пакет утилит для работы с файлами ОС DOS – Mtools (mmount, mformat,..).  Набор утилит – ntfstools (ntfsclone, ntfsresize,...).  Антивирус ClamAV (версии 0.75.1, обновление баз от 26 февраля 2006 г.).  Утилиты для работы с партициями – GNU Parted, Qtparted, Partimage.

ню, в котором можно ознакомиться с документацией по работе с программой. Существует выбор методов очисКак видно из списка выше, для решения различных затки диска – менее или более эффективные (все зависит дач можно выбирать инструменты, которые удобнее, приот времени и ваших целей). Если же необходимо мак- вычнее или функциональнее. симально быстро уничтожить данные, а не разбиратьТак как дистрибутив ориентирован на задачи для рася в интерактивном меню с тонкостями dban, сразу пос- боты с жесткими дисками, были приведены скриншоты ле загрузки наберите команду «autonuke». Будьте очень утилит с графическим интерфейсом GNU Parted (рис. 3), внимательны, данные невозможно будет восстановить. Qtparted (рис. 4) и Partimage (рис. 5) для ознакомления  Ntpass (Offline NT Password and Registry editor) – про- с ними. грамма для сброса забытых паролей и редактирования Первые две – программы для создания/удаления парреестра в ОС Windows семейства NT. Сразу после за- тиций (намного функциональнее fdisk), поддерживают файгрузки будет предложено выбрать раздел с Windows- ловые системы ext2/3, raiserfs, FAT, NTFS. Замечу лишь то, системой или автоматическое подключение всех FAT- что GNU Parted не имеет возможности отката действий. и NTFS-разделов. Сделано это для того, чтобы была Как видно, интерфейсы у них подобные Partition Magic возможность выбрать для работы конкретную ОС (бу- и очень простые. дет отображен полный путь до папок с Windows-сисPartImage – утилита для создания клонов копий партитемами). Если на компьютере установлена всего одна ций (аналог ghost и arcronix), очень жаль, что у данной утиWindows, смело следуйте указаниям мастера в автома- литы поддержка NTFS на экспериментальной стадии, и разтическом режиме. В конце его работы вам будет задан работчики предупреждают нас о возможных проблемах при вопрос на подтверждение сброса пароля или начала ра- клонировании ntfs дисков, но данную функцию можно выботы с реестром в режиме записи. полнить и утилитой ntfsclone. Не буду останавливаться на описании всех стандартИтак, еще даже не загрузив Gentoo, мы уже получили ных утилит, думаю, большинство пользователей уже знабогатый набор утилит различного назначения. Даже поль- комы с mtools, сканером nmap и другими программами. зователь, не искушенный в Linux, легко сможет воспользо- Но рассматривая далее задачу по пересборке дистрибу-

30


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

Пересборка дистрибутива Меня дистрибутив устраивал во многом, но все же нужно было добавить один скрипт для автоматизации клонирования рабочих станций. Многие из нас пересобирали дистрибутивы, основанные на Knoppix, и знают, что эта задача не совсем тривиальна и занимает много времени. Чаще всего в начале нужно создать образ дистрибутива, распаковать его, найти в нем корневую файловую систему (очень часто это небольшой gzip-архив) и заархивированный образ системы (Cloopfs). В SystemRescueCd Linux основной архив находится в корне диска, его объем около 100 Мб (sysrcd.dat запакован Cloop) для работы с ним нам поможет скрипт sysresccd-custom. Итак, рассмотрим подробно разборку и сборку дистрибутива. Загрузим Gentoo и выделим место на жестком диске для распаковки cloop-образа системы, для этого примонтируем партицию командой: mount /dev/hda1 /mnt/temp1

Создадим образ с файловой системой ext2: dd if=/dev/zero of=/mnt/temp1/fs.iso bs=1M count=1200 mkfs.ext2 /mnt/temp1/fd.iso

Примонтируем созданную файловую систему в /mnt/ custom, должен заметить, что образ нужно монтировать именно в эту директорию (она уже имеется на диске): mount -o loop /mnt/temp1/fd.iso /mnt/custom

Теперь распакуем файл-архив sysrcd.dat: sysrescue-custom extract

Процесс распаковки, как уже упоминалось, занимает долгое время, с этим, к сожалению, ничего поделать нельзя. После распаковки, зайдя в директорию /mnt/custom/, мы увидим нашу систему, которую можно уже изменять. В качестве примера добавим скрипт MyLanCloon в папку bin. Сам скрипт рассмотрим далее. Теперь снова запакуем систему (в cloopfs) командой: sysrescue-custom cloop sysrescue-costom extract300 20000

Должен заметить, что процесс запаковки идет еще дольше, чем распаковка. Разработчики приготовили для нас еще один сюрприз, после архивирования в cloop мы можем создать файл autorun в папке /mnt/custom/customcd/isoroot/, который выполнится при загрузке системы. Это может быть удобно для установки каких-либо небольших параметров, например установки сети: #!/bin/bash ifconfig eth0 192.168.1.200 netmask 255.255.255.0 route add default gw 192.168.1.1 mount -t nfs 192.168.1.10:/home/users /mnt/temp1/

№11, ноябрь 2006

В данном примере мы устанавливаем сетевую оснастку и по протоколу nfs подключаемся к нашему файловому серверу (к домашней папке нужного пользователя). Удобна установка кодовой страницы в системе на стадии загрузки, если помните, ее необходимо вводить каждый раз (номер 31). Чтобы задать русскую кодовую страницу для нашего будущего дистрибутива, выполним команду: sysresccd-custom setkmap ru

Теперь создадим главный iso-образ, который позже мы запишем на диск: sysresccd-custom isogen mysyscd

mysyscd – метка тома будущего диска. Образ и его md5-хеш будут расположены в папке /mnt/custom/customcd/isofile/. Все готово, можно записывать образ на CD и грузиться в систему. Все данные операции можно было выполнить и стандартными утилитами cloop-util и cdrtool, но это заняло бы больше времени плюс, как уже упоминалось, без соответствующих навыков неопытные пользователи столкнулись бы с проблемами. Если все же любопытно, что делает скрипт sysresccd-custom, его можно найти в папке /usr/sbin/.

Скрипт MyLanCloon Я специально вынес скрипт в отдельный раздел, во-первых, из-за его большого размера, а во-вторых, из-за необходимости рассмотреть его подробнее. Задача: написать скрипт для автоматизации процесса создания и копирования iso-образов клиентских машин на файловый сервер. Копирование будет производиться по протоколу SMB, идентификация образов рабочих станций будет по их MAC-адресу. Задача тривиальна, и многие используют для её решения большие и зачастую дорогие программные комплексы (Acronix, Ghost…), но скрипт во многом заменяет подобные программы и обладает замечательным свойством – бесконечной расширяемостью. Так как SystemRescueCd Linux обладает богатым инструментарием для работы с партициями и файловыми системами, наши возможности будут ограничены только фантазией (в *nix-области). #!/bin/bash # Установка параметров сети ifconfig eth0 192.168.1.200 netmask 255.255.255.0 route add default gw 192.168.1.1 # Монтирование сетевой папки mount.smb //192.168.1.10:/Files/ /mnt/temp1/ # Определение MAC-адреса MACADDRES="`strings /sys/class/net/eth0/address`" echo "Mac addres is ${MACADDRES}" # Определение файловых систем # FAT dd if=/dev/hda1 bs=512 count=1 | strings | grep FAT if [ $? -eq 0 ]; then FS="1" fi # NTFS dd if=/dev/hda1 bs=512 count=1 | strings | grep NTFS if [ $? -eq 0 ]; then

31


администрирование FS="2" fi # Процедура сохранения образа do_save() { # Сохранение FAT-образа if [ $FS -eq 1 ]; then partimage -z1 -o -b -d save /dev/hda1 ↵ /mnt/temp1/arhiv/${MACADDRES} exit 1 fi # Сохранение NTFS-образа if [ $FS -eq 2 ]; then ntfsclone --save-image /dev/hda1 -o ↵ /mnt/temp1/arhiv/${MACADDRES} exit 1 fi } # Процедура загрузки образа do_load() { # Загрузка FAT-образа if [ $FS -eq 1 ]; then partimage -b restore /dev/hda1 ↵ /mnt/temp1/arhiv/${MACADDRES}.000 exit 1 fi # Загрузка NTFS-образа if [ $FS -eq 2 ]; then ntfsclone --restore-image -O /dev/hda1 ↵ /mnt/temp1/arhiv/${MACADDRES} exit 1 fi } # Основная функция case "$1" in save) do_save;; load) do_load;; esac

Итак, рассмотрим скрипт подробнее. Установка параметров сети – стандартными командами ifconfig и route задаем IP-адреса локальной машины и роутера. Монтирование сетевой папки – монтирование происходит по протоколу smb, сделано это из соображений совместимости с Windows-сетевыми ресурсами, так как файловый сервер может быть и не под управлением ОС Linux. Желающие могут выбрать nfs-протокол, конечно же, если данный сервер установлен в сети. Если требуется обеспечить безопасность при копировании iso-образов, можно задействовать lufs (Linux users file system) и производить монтирование сетевой папки по ssh-протоколу. Также по lufs можно монтировать папки ftp-серверов. Выбирать есть из чего, все зависит от доступных средств, организации сети и ваших предпочтений. Определение MAC-адреса – как я уже говорил, для идентификации образов рабочих станций мы будем использовать их MAC-адреса. В переменную MACADDRES заносится MAC рабочей станции, впоследствии задействуем его. Определение файловых систем – так как мы точно не знаем, какая файловая система используется Windows, для начала определим ее. Зная, что в первых 512 байтах жесткого диска (цилиндр 0, головка 0, сектор 1) находится Master Boot Record, проверим, FAT ли это или NTFS. Должен заметить, я исходил из предположения, что на рабочих

32

станциях установлена одна ОС и находится на hda1 (диске C), если установлено 2-3 или более ОС, следует редактировать скрипт либо для выбора конкретной ОС, либо для клонирования всего диска (если необходимо сохранить все операционные системы). FAT и NTFS – проверяем, какая файловая система на устройстве hda1. Если FAT, то в переменную FS будет занесено значение 1, если NTFS – 2. В дальнейшем это значение нам понадобится для выбора утилит клонирования. Процедура сохранения образа – как уже упоминалось выше, partimage работает стабильно только с FATфайловыми системами (FAT12, FAT16 и FAT32) ОС Windows, но при этом обладает большими возможностями. Собственно из-за этого скрипт и разделен на две части: для работы с FAT или NTFS. Из интересных возможностей Partimage стоит выделить то, что он определяет занятое пространство на диске и копирует только его, а не диск целиком (как dd), при этом может очень эффективно архивировать iso-образ (в среднем компрессия составляла 50%). Сохранение FAT-образа – утилитой partimage сохраняем FAT-образ. Рассмотрим подробно ключи: partimage -z1 -o -b -d save /dev/hda1 ↵ /mnt/temp1/arhiv/${MACADDRES}

где:  z1 – уровень компрессии (z0 – быстрая запаковка, но «слабая» компрессия, z2 – максимальная компрессия, но длительное время запаковки);  o – если файл с данным именем существует, перезаписать его;  b – не запрашивать параметры у пользователя в интерактивном меню;  d – не запрашивать у пользователя дополнительное описание для образа;  save – указываем partimage, что необходимо копировать информацию с устройства в файл;  /dev/hda1 – это наш жесткий диск. И последний параметр – имя файла образа, оно будет равно значению переменной MACADDRES. Сохранение NTFS-образа – для создания образов дисков с файловой системой ntfs воспользуемся утилитой

Рисунок 5. Интерфейс Partimage


администрирование ntfsclone из состава ntfstools. О параметрах ntfsclone: ntfsclone --save-image /dev/hda1 ↵ -o /mnt/temp1/arhiv/${MACADDRES}

где:  save-image – сохранение образа;  /dev/hda1 – наш жесткий диск;  o – путь и имя файла образа (будьте внимательны, параметр «-о» в нижнем регистре). Должен отметить, что ntfsclone, хоть и копирует только занятое пространство на диске, не умеет сжимать образ. В данном случае можно прямо в потоке произвести запаковку, используя gzip, но эта операция займет дополнительное время. Процедура загрузки образа – распаковывает образ системы. Опять же задействуем для развертывания образов обе утилиты: partimage для FAT-разделов и ntfsclone для NTFS. Загрузка FAT-образа: partimage -b restore /dev/hda1 ↵ /mnt/temp1/arhiv/${MACADDRES}.000

где:  b – не запрашивать параметры у пользователя в интерактивном меню;  restore – восстановление образа;  /dev/hda1 – жесткий диск. Последний параметр – путь до образа, имя файла будет равно значению переменной MACADDRES, плюс расширение «.000». Загрузка NTFS-образа: ntfsclone --restore-image ↵ -O /dev/hda1 ↵ /mnt/temp1/arhiv/${MACADDRES}

где:  restore-image – восстановление образа;  O – путь до устройства для образа (будьте внимательны, параметр «-O» в верхнем регистре);  /dev/hda1 – наш жесткий диск. И как всегда, последний параметр – путь до файла образа нашей системы. Основная функция – основной оператор выбора case: если в консоли выполнить скрипт с параметром save – выполнится рассматриваемая выше

№11, ноябрь 2006

Альтернативы SystemRescueCd Linux Emergencu CD [4] – спасательный дистрибутив, основанный на Gentoo Linux версии ядра 2.4.22. Cодержит графический интерфейс IceWM, достаточно компактен (~180 Мб), но последний релиз от 28 октября 2003 г. Поддерживает большинство наиболее распространенных файловых систем (FAT, ext2/3, NTFS, ...) и сетевых служб (smb, nfs, ssh,...). Программы для работы с партициями Partimage и gpart. Дистрибутив в принципе богат утилитами и компактен, но за 3 прошедших года, к сожалению, успел устареть. INSERT LiveCD [5] – основанный

процедура сохранения образа, если load – сработает процедура загрузки образ. Примеры: «MyLanCloon save» или «MyLanCloon load». Все, скрипт готов к работе в составе SystemRescueCd Linux для автоматизации работы по клонированию образов операционных систем рабочих станций. Конечно, скрипт далек от идеального – не хватает проверок на существование файлов, подтверждений на выполняемые действия и других «красивых» процедур. Например, можно расширить основную функцию case вот таким образом: case "$1" in [Ss][Aa][Vv][Ee]) do_save;; [Ll][Oo][Aa][Dd]) do_load;; esac

В этом случае уже не будет иметь значения, в каком регистре набираются параметры save и load. Еще одной очень полезной функцией было бы создание процедуры для установки мастер-образа на «чистый» жесткий диск. Но скрипт получился и так громоздким, мы бы совсем отвлеклись от основного обзора дистрибутива SystemRescueCd Linux и его утилит. Если у вас есть желание доработать скрипт, но не хватает опыта в подобных вещах, очень рекомендую документ «Advanced Bash Scripting» на русском языке, расположенный по адресу [3].

Выводы SystemRescueCd Linux – функциональный, быстрый, современный дистрибу-

на Knoppix 4.0.2 версии ядра Linux kernel 2.6.12.5. Последняя доступная версия 1.3.6 от 24 февраля 2006 года. Дистрибутив поддерживает файловые системы ext2/3, reiserfs, FAT, NTFS (для режима записи используется captive или ntfstools) и другие. Включены сетевые службы nfs, smb, cifs, ssh и afs. Дистрибутив – наиболее близкий конкурент SystemRescueCd Linux, но есть одна странность. На официальном сайте, в ChangeLog говорится о выпуске версии 1.3.8 от 10.10.2006, но на ftp дистрибутива данной версии нет. Возможно, это ошибка, а, может быть, когда вы будете держать журнал в руках, версия дистрибутива и «объявится»?

тив, подходящий для работы как с домашними машинами, так и в небольших корпоративных сетях (после необходимых доработок). Форум проекта поддерживается на протяжении всего существования дистрибутива, несмотря на некоторые «паузы» в выпуске новых релизов. К положительным моментам относится наличие скрипта sysresccdcustom, который позволяет легко пересобрать дистрибутив. К а к м н о г и е, н а в е р н о е, ус п е ли заметить, размер дистрибутива (121 Мб) позволяет хранить на диске мас тер - образ Windows- с ис те мы (до ~580 Мб, что вполне достаточно), также из-за компактности SystemRescueCd Linux можно записать на miniCD, что добавляет дистрибутиву еще один плюс. На этом все, удачной работы! 1. http://www.sysresccd.org – официальный сайт дистрибутива Sysrescuecd Linux. 2. Максимов И. FreeDos – новый взгляд на старые вещи.//«Системный администратор», №2, февраль 2006 г. – C. 32-37. 3. http://gazette.linux.ru.net/rus/articles/ abs-guide/index.html – «Advanced BashScripting Guide. Искусство программирования на языке сценариев командной оболочки». 4. http://emergencycd2.sourceforge.net/ index.ru.html – официальный сайт Cool Linux CD и Emergency CD. 5. http://www.inside-security.de – официальный сайт дистрибутива INSERT LiveCD.

33


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

Автоматизируем процесс установки обновлений с PatchQuest 4

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

Л

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

34

ные на известную уязвимость, что в целом позволит повысить общий уровень безопасности и сократит простои системы и администрирование в целом. Корпорация Microsoft в настоящее время предлагает свое решение Windows Server Update Services (WSUS) [1], позволяющее администратору централизованно управлять установкой обновлений и исправлений продуктов этой компании. Но не всегда сеть имеет од-

нородные компоненты, и не все возможности, которые хотелось бы видеть в подобных продуктах, есть в WSUS. Здесь на помощь придут разработки сторонних производителей.

Возможности PatchQuest Назначение утилиты PatchQuest 4 [2] разработки AdventNet Inc. аналогично WSUS – автоматизация управлением и установкой патчей, исправ-


администрирование лений и модификаций на операционные системы и приложения. С помощью PatchQuest всего за несколько щелчков мышки можно установить патчи на:  операционные системы Windows NT 4.0/2000/XP/2003 различного назначения и связанных приложений: компоненты Microsoft Office 2000/2002/2003, Internet Explorer 5.01, 5.5 и 6.0, Outlook и Outlook Express, Internet Information Services, NET. Framework 1.1 и 2.0, Windows Media Player;  серверы и приложения SQL Server 7.0 и 2000, Exchange Server 5.5, 2000 и 2003, MDAC 2.5 – 2.8, MSXML 2.6 – 4.0;  а также операционные системы Linux: Red Hat Linux 7.2, 8.0, 9.0, RedHat Linux Advanced/Enterprise Server 2.1, 3.0, 4.0, Debian GNU/ Linux 3.0 (Woody) и 3.1. Возможна автоматическая загрузка и установка отсутствующих патчей и обновлений на основании заданных правил или корпоративных полисов безопасности. Администратор стоит перед выбором: устанавливать все патчи либо отбирать их по некоторому критерию, например, по серьезности уязвимости, которую патч устраняет. В PatchQuest большим подспорьем при отборе патчей является возможность оценки уязвимости. Сканируя отдельный узел или диапазон адресов вручную или по расписанию в указанное время PatchQuest, идентифицирует потенциальные нарушения безопасности в операционной системе Windows и приложениях и сообщает о необходимых для их устранения патчах, а также об уязвимостях, для которых в базе на момент сканирования еще нет патчей. Администратору в этом случае очень легко определить системы, нуждающиеся в особом внимании, которые требуют установки патчей, устраняющих критические уязвимости, и вовремя принять соответствующие меры. По окончании сканирования выдается подробный отчет, в котором будет указан статус патча, Bulletin ID, имя патча, его краткое описание, уровень угрозы и другая информация (рис. 1). Возможно отправление отчетов по электронной почте. Система отчетов PatchQuest продумана хорошо,

№11, ноябрь 2006

Рисунок 1. После сканирования администратор получит подробнейший отчет

администратор получит всю необходи- го агента сервер PatchQuest для домую информацию по интересующему ступа в систему использует логин его вопросу, для наглядности исполь- и пароль. Поддерживается аутентизуются различные графики. фикация средствами Windows, Active Дополнительно к этим возможнос- Directory, а для Linux систем telnet и ssh. тям PatchQuest может быть использо- Для удобства доступа к компьютерам ван для инвентаризации установлен- администратор может заранее создать ного на компьютерах программного удостоверения, состоящие из логина и пароля, и занести эту информацию обеспечения. При проверке ус тановленных в PatchQuest. Информация между серна компьютере патчей используются вером и целевой машиной может перевсе возможные методы: проверка за- даваться в зашифрованном виде. Для удаленного управления написей реестра, размера, версии и контрольной суммы файла. С помощью стройками PatchQuest и процессом PatchQuest можно легко определить, обновлений используется понятная когда нужный файл был переписан его и удобная веб-консоль. К сожалеболее ранней версией. нию, в списке языков локализации отТак же как и WSUS, PatchQuest ра- сутствует русский. Доступ к серверу ботает по клиент-серверной схеме, при этом возможен как по http, так и когда на компьютерах устанавлива- по защищенному протоколу https. ется агент, который, взаимодействуя Для работы с консолью можно прис сервером, управляет установкой менять в принципе любой доступобновлений и сбором информации. ный веб-браузер. Подойдут Internet Но может использоваться схема, не требующая установки агентов на компьютеры пользователей, а также комбинированный вариант доступа. В качестве серверов могут выступать компьютеры, работающие под управлением Windows от 2000 до 2003, а также RedHat Linux и Debian. Агенты доступны для этих же систем плюс Windows NT SP6a Workstation. При варианте Рисунок 2. Вариант использования PatchQuest выбирается во время установки работы без установленно-

35


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

Рисунок 3. Основное окно программы настройки

пользователь guest с таким же паролем, но в документации об этом почему-то ничего не сказано. Правда, он относится к группе Normal User, пользователи которой могут просматривать отчеты и информацию о доступных обновлениях. В результате перед вами появится основное окно программы настройки (рис. 3). Теперь необходимо выполнить ряд действий, после которых можно будет безопасно использовать PatchQuest, проверять системы и устанавливать патчи несколькими щелчками мышки. Заходим во вкладку «Settings» и устанавливаем:  в Proxy Configuration – параметры прокси-сервера;  в Mail Server Configuration – параметры корпоративного SMTP-сервера, необходимого для отправки отчетов;  в Patch Store Location – каталог, в котором будут храниться патчи (по умолчанию C:\AdventNet\ SecureCentral\PatchQuest\store);  в MS Office Media Location – каталог, в котором хранятся установочные файлы MS Office;  в Language Settings – язык по умолчанию, необходимый при выборе специфических патчей для операционной системы и приложений;  в Vulnerability Database Update Interval – интервал обновления баз уязвимостей и отсылку отчетов по обновлению;  в Change Password – изменяем пароль администратора PatchQuest;  в Global Credentials – создаем удостоверения для быстрого доступа к различным компьютерам;  в User Administration – пользователей, которые могут получить доступ к серверу PatchQuest.

Explorer от 5.0, Netscape от 7.0, Mozilla обходимо перейти в вариант Free или и Mozilla Firefox 1.5, Opera от 7.2. Стра- удалить PatchQuest. Использование языка Java наложиничка оптимизирована для разрешений 1024x768 и выше. Для хранения ло и свои системные требования. Так настроек используется база данных для работы сервера PatchQuest понаMySQL. Она, как и веб-сервер, напи- добится компьютер с частотой не месанный на Java, входит в дистрибутив, нее 1,8 Гц и имеющий минимум 512 Мб поэтому никаких дополнительных ком- оперативной памяти. Для клиента изпонентов устанавливать не надо. менились только требования к ОЗУ – Продукт распространяется под 256 Мб. Для баз обновлений рекомендвумя лицензиями. Бесплатная Free дуется оставить 10 Гб свободного месEdition разрешает управлять обновле- та на жестком диске. Это рекоменданиями для 5 компьютеров, вне зависи- ции разработчиков. При тестировании мости от установленного программно- с этой задачей нормально справлялго обеспечения или их версии. Платная ся компьютер с процессором Celeron Professional Edition Subscription License, 633 Гц и 256 Мб оперативной памяти, реализованная по подписному принци- на нем одновременно работал как серпу, то есть «Node Locked License» – ли- вер, так и клиент и дополнительно процензия, привязанная к определенной водилось обновление еще 4 систем. машине, покупается на определен- Система несколько подтормаживала, ный срок, по окончании которого не- но работать все равно было можно. обходимо либо ее обновить, либо удалить продукт. Интересно, что согласно Установка лицензионного соглашения, компания и использование оставляет за собой право в любой мо- Установка сервера ничего сложномент провести аудит для выяснения го не представляет. Если установка Далее следует включить поддеправильности использования лицен- происходит в Linux без использова- ржку защищенного протокола HTTPS. зии, перед этим она за 7 дней предуп- ния графического интерфейса, набе- Для этого в консоли переходим в подреждает администратора. Также стоит рите SecureCentral_PatchQuest.bin – каталог bin, который расположен отметить, что техническая поддержка console. На втором шаге вас попросят в месте установки PatchQuest, и надоступна для всех, вне зависимости уточнить номер порта для веб-серве- бираем HTTPSSupport.bat enable люот лицензии. ра (по умолчанию используется 8080) бой номер порта (в Windows) в Linux – Для скачивания предоставляется и номер порта для подключения кли- имя скрипта другое HTTPSSupport.sh. один файл, версия продукта выбира- ентов (9000). После установки вызы- Теперь повторно регистрируемся, исется во время установки (рис. 2). Ес- ваем веб-браузер и заходим по адре- пользовав уже https. ли указать Professional Edition, его мож- су http://имя_сервера:8080/, зарегистСледующий шаг – установка агенно протестировать в течение 30 дней рировавшись как пользователь admin тов. Их можно получить через вебна 10 компьютерах. После этого не- с паролем admin. В системе есть еще браузер, нажав на ссылку «Download

36


администрирование Agent» и выбрав операционную систему, в которой агент будет устанавливаться. Как вариант их можно попросту скопировать с каталога C:\ AdventNet\SecureCentral\PatchQuest\ agent\windows (для Windows) и …agent\ unix (для Linux). Установка агентов также не вызывает сложности. Вам необходимо будет указать параметры для подключения сервера, его имя и номер порта (9000). Далее необходимо указать компьютеры, на которых за обновлениями будет следить PatchQuest. Нажимаем «Add System» и попадаем в окно настройки «Add New System» (рис. 4). В поле «Add System By» можно ввести адрес или имя одного компьютера, указать диапазон адресов, импортировать список систем из файРисунок 4. Окно добавления компьютеров ла и использовать Active Directory. В «Operating System Type» выбираем «Add & Scan». Просмотреть список всех тип операционной системы. Например, систем, можно нажав на «System». Буесли выбрано Windows, будут добавле- дет доступна информация об имени, ны только компьютеры, находящиеся системе, IP-адресе, режиме управлепод управлением этой OC. Для зане- ния (агент или удаленный доступ) и сосения в список всех поддерживаемых стоянии системы, времени последнеPatchQuest систем используйте «All». го сканирования и версии операционВ поле «Credential for Windows/Linux» ной системы. Для удобства отбора отвводим параметры для доступа. Здесь дельные компьютеры или патчи могут можно выбрать созданные в «Global быть объединены в группы. В PatchQuest реализовано то, чеCredentials» удостоверения, либо ввести логин и пароль вручную. Кноп- го многим не хватает в WSUS: подка «Diagnose» позволит проверить со- держка нескольких операционных сисединение с указанной системой. Ког- тем, оценка уязвимостей клиентских да все настроено, нажимаем «Add» или компьютеров, гибкость в выборе ре-

№11, ноябрь 2006

жима доступа, возможность работы по защищенному каналу. Без сомнений, PatchQuest является удобным продуктом, позволяющим на порядок упростить управление установкой обновлений для группы компьютеров. 1. Сергеев С. Windows Server Update Servies.//«Системный администратор», № 4, 2005 г. – С. 8-10. 2. Сайт проекта PatchQuest 4 – http://www. securecentral.com/products/patchquest/ index.html. 3. Демонстрационная версия PatchQuest – http://demo.patchquest.com.

37


человек номера

Виртуальные радости и открытия Максима Чиркова

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

Ч

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

38

ги… Увлекательное дело – заглянуть в чужой «шкаф», познакомиться с образом мыслей, биографией человека, его точкой зрения на те или иные вещи. Нет-нет, не искать «скелеты» в шкафу или секретные материалы. Просто попытаться понять, что скрывается за датами, фактами, биографическими подробностями… Любопытно, что хранит «шкаф судьбы» ведущего популярного проекта и одноименного сайта OpenNET.ru? Еще бы! Тем более что известно о Максиме Чиркове немного. Живет в Тюмени, нет 30 лет… Заглянем в вездесу-

щий Интернет? Или все-таки обратимся к воображаемому архиву, где только факты, факты, факты?.. Предлагаю второе.

Семья Главное «отделение» виртуального шкафа Максима Чиркова, конечно, дела семейные. Иначе и быть не может. Какая бы замечательная работа ни была у человека, как бы он ни любил дело, которому служит, основной вопрос, как мне кажется: не КАК жить, а ЗАЧЕМ, РАДИ ЧЕГО? Семья – главное, потому что это и настоящее, и бу-


человек номера дущее. Поэтому все свободное время Максим Чирков, естественно, посвящает жене и сыну. Чирковы любят ездить на природу. Недавно взяли и махнули на день в Екатеринбург погулять в местном зоопарке. Удовольствие получили и ребенок, и взрослые. Как достигается семейная гармония? Вопрос непростой. Посмотрим, что говорят факты. Факт первый: сынишке Семену три года, и он уже перенимает у родителей навыки ответственного отношения к делу. В компьютерные игры Семен Максимович пока не играет. А вот поработать на машине не против. Максим рассказывает: «Еще толком не научившись ходить, сын уже достаточно уверенно манипулировал мышкой. Приходилось в такие моменты переключаться от работы к просмотру фотографий или детСемья – главное. Максим Чирков с сыном ских сайтов. Но нашелся выход – отдал сыну свой старый карманный ПК, венно… «Для меня главный постулат теперь он просит выдать ему батарей- при создании текстов новостей – наки, садится рядом, берет в руки сти- писать так, чтобы было интересно чилус и погружается в увлекательное тать самому. Примеряю тексты на сезанятие запуска разных приложений бя, а в остальном полагаюсь на здрана КПК. Ребенок страшно доволен, го- вый смысл. Меня всегда раздражает ворит, что папа и мама большие, у них использование пространных назвабольшие компьютеры, а он маленький, ний текстов новостей. По моему мнеи у него маленький компьютер». Чест- нию, заголовок призван четко опрено говоря, любого поклонника проек- делять тематику материала. Сам же та OpenNET такой подход немало об- текст должен быть предельно лакорадует. Похоже, сайт станет семейным ничен, содержать все необходимые делом, а значит, ему уготована почти для его восприятия факты, примеры и сведения. В нем не должно быть пусвечная жизнь… Факт второй: в этом году браку Чир- тых, бессмысленных выражений, котоковых исполняется пять лет. В народе рыми пестрят некоторые СМИ… Как я такая годовщина называется деревян- понимаю, оплата труда журналиста ной свадьбой, а психологи поздравля- пропорциональна объему выработанют супругов: оказывается, после пяти ного, и некоторые просто «гонят стролет совместной жизни вероятность ох- ку», расходуют целую страницу там, лаждения чувств сходит на нет. Счита- где можно ограничиться двумя предется, что к этому времени семья про- ложениями». шла первые, самые трудные испытаФилософия выбора ния. И прошла успешно. Факт третий: жена Максима – «че- Когда происходит выбор профессии? ловек творческий и понимающий», От чего он зависит? Заглянем на арк тому же журналист, а значит, хотя хивную полочку под названием «Детна первый взгляд профессии у мужа ство». В средних классах Максим уви жены разные, общих тем находится лекался аквариумистикой, кактусопредостаточно. Ведь создание и под- водством. Объясняет это тем, что быдержка сайта – редакторская работа. ли хорошие преподаватели, умели увА принципы, которых придерживается лечь своим предметом и хобби. Кто Максим Чирков, создавая новостий- сказал, что скучно содержать рыбок, ный блок, поддерживаю, как журна- что чистить аквариум – примитивное лист, двумя руками. Думаю, в созда- занятие? Учитель вывозил своих воснии этих принципов наверняка участ- питанников на природу, читал художесвовала супруга Максима, хотя бы кос- твенную литературу, рассказывал то,

№11, ноябрь 2006

Семеном

что не узнаешь ни из каких книг, и аквариумистика превращалась в не менее увлекательное занятие, чем поиск сокровищ на дне морском. Еще Максима явно привлекала возможность сделать открытие, пусть только свое, собственное, а не то, за которое дают Нобелевскую премию. Неудивительно, что в списке школьных интересов числятся радиотехника, химия… А уж мимо компьютеров школьник, которому скучно зубрить параграфы, просто не мог пройти! «С компьютерами столкнулся, – вспоминает Максим, – когда в 1990-м году в школе появился первый компьютерный класс УКНЦ. Новое увлечение сразу вскружило голову, начал копить на собственный компьютер. С помощью родителей удалось купить бытовой компьютер «Сура ПК 8000», на котором, кроме встроенного Бейсика, ничего не было. А так как Бейсик уже не удовлетворял всем потребностям, начался этап программирования в машинных кодах. Приходилось по таблицам составлять программы в шестнадцатеричном виде. Из наиболее запомнившихся разработок тех лет – система оцифровки звука с магнитофона и портирование разных дампов для «Радио РК-86» и «ЮТ-88», которые публиковались в журналах «Радио» и «ЮТ для умелых рук». Через год удалось приобрести списанный EC 1840, CGA-экран и отсутствие мыши не стало помехой…» Школьником Чирков проси-

39


человек номера Настоящий гимн информационным технологиям! Похоже, что сфера IT для новых поколений – то же самое, что космос для наших отцов и дедов. В наши дни даже в детском саду на вопрос, кем ты хочешь стать, вместо традиционного «космонавтом» звучит уверенное: программистом. Согласитесь, это счастье – правильно выбрать профессию. Тот случай, когда человек ловит себя на мысли: работа любимая, а тебе за нее еще и деньги платят.

Дело

У Семена – папин карманный ПК

живал целые дни в областной библиотеке, вылавливая крупицы нужной информации из книг и журналов. И снова – открытия, радостные и уже более масштабные. А параллельно, между прочим, Максим мечтал о медицинском. Парадокс? Ничего подобного. «К медицине толкали тайны возникновения жизни, сущности сознания, биологических процессов старения и сна, поиски эффективных методов борьбы с вирусной инфекцией и раковыми образованиями. В этой сфере так много нерешенных проблем!». Теперь, размышляя об альтернативе жизненного пути, Чирков считает, что все сложилось так, как надо: «Практикующему врачу необходимо умение мгновенно принимать правильные решения, мне же необходимо время на осмысление, часто я не способен адекватно среагировать на внезапно возникшие обстоятельства. Решение, принятое сразу, скорее всего не будет оптимальным, а вот рожденное после нескольких часов пеших прогулок-размышлений или спонтанно, через месяц после постановки задачи, окажется значительно эффективнее». В общем, компьютеры победили. Папка «Юность» в воображаемом архиве нашего героя открывается на странице с фото, где улыбается свежеиспеченный студент факультета технической кибернетики Тюменского нефтегазового университета. Че-

40

рез пять лет Максим Юрьевич Чирков получил диплом специалиста по автоматизированным системам обработки информации и управления. Так что с профессией все просто. При ее выборе «сработали» два главных критерия – любознательность и тяга к открытиям. Сам Максим объясняет это так: «Информационные технологии развиваются гигантскими темпами, существует огромный спектр нерешенных задач и проблем, имеются тысячи программ, требующих улучшения. Открыть что-то новое в современном компьютерном мире гораздо проще, чем, например, в таких точных науках, как физика или математика. Для этого даже и знаний особых не нужно, главное – новая идея. В качестве примера можно привести возникновение в Интернете ICQ, блогов и Wiki. Невозможно жить просто так, нужно куда-то себя вкладывать, находить точку самореализации, строить планы и двигаться к ним. Быть может, эти планы на первый взгляд недостижимы, но после преодоления всех трудностей и преград, достигнув желаемого, начинаешь строить еще более нереальные с первого взгляда планы и «прыгать через собственную голову». Интерес здесь сродни тяге к открытиям. Это то, что когда-то толкало людей пускаться в странствия по неизведанным местам, ночи напролет смотреть в небо, прыгать со скалы, смастерив крылья».

Ящик, где лежит увесистый, пухлый том с описанием профессиональных достижений, можно озаглавить просто: «Открытое программное обеспечение». Это именно то направление в IT, где тяга к открытиям реализуется на двести процентов. И опять это странное для скучающих клерков чувство радости от трудовых будней: «Миру открытого программного обеспечения свойственен энтузиазм, разработка ради удовольствия, отношение к работе как к развлечению. Каждый делает то, что ему нравится и это приносит потрясающие результаты». В эту стихию Максим окунулся не сразу, но «соблазн UNIX», оказывается, витал еще на первых курсах университета. Когда информация дошла в полном объеме и удалось на практике попробовать открытые проекты, выяснилось – нашел! Теперь на вопрос, почему он использует программы, распространяемые в исходных текстах, Максим Чирков отвечает без колебаний: «Из-за независимости, возможности в любой момент, ни на кого не полагаясь, решить возникшую проблему самостоятельно, найти и устранить мешающую работе ошибку, если нужно – дописать необходимую функциональность. Не нужно ждать чтото от разработчиков. Имея необходимые инструменты и навыки, можно самостоятельно найти решение. При выборе продукта, посмотрев код, есть возможность оценить реальное качество программы (типичные ошибки и неграмотный код бросается в глаза, достаточно беглого просмотра). Люди, не имеющие возможности или знаний для модификации чужого кода, часто как достоинство закрытого ПО называют наличие гарантирован-


человек номера ной поддержки у коммерческих решений. Мой опыт говорит, что такая поддержка может оказаться формальной, состоящей из пустых уверений и обещаний. Решение ошибок производителя может затянуться на длительный срок, фирма может закрыться… Что касается открытого ПО, в большинстве случаев поддержки сообщества, образовавшегося вокруг проекта, вполне достаточно. Если сообщество не реагирует на ваши вопросы, значит ответы на них есть в документации или эти проблемы многократно обсуждались раньше. Выход есть – для многих крупных открытых проектов сегодня можно найти фирмы, оказывающие коммерческую поддержку. А нетривиальные проблемы можно обсудить напрямую с разработчиками». Что же касается главного своего проекта, историю его создания Максим рассказывает так: «Решил во что бы то ни стало попробовать Linux после чтения статьи Владимира Водолазского в одном из номеров журнала «Монитор» за 1994 год. Экспериментировал по мелочам со Slackware 3.0, пока в 1996 году не удалось купить фирменный диск со Slackware 3.1, это был один из первых дистрибутивов, включавших в себя Linux ядро 2.0.x, с тех пор с UNIX больше не расставался. В процессе изучения подписался на FIDO конференции RU.LINUX и RU.UNIX. Накопилось несколько десятков интересных сообщений-заметок. В букмарках сформировался небольшой набор интересных ссылок. Разместил материал как часть своей домашней страницы http://www.tyumen.ru/~mc/linux. Получилось три раздела: статьи, ссылки и программы. К лет у 1998 года проект вырос, обзавелся форумом и разделом новостей. Сайт был доступен как http://linux.opennet.ru. www.opennet.ru тогда планировалось сделать порталом с более широкой тематикой, не ограничивающейся компьютерами и UNIX. Осенью 1998 года домен был передан мне в личное пользование и сайт поселился на http://www.opennet.ru». А этой осенью проекту исполняется 10 лет. Сегодня дело, которому служит Максим Чирков, развивается самыми стремительными темпами. Сайт www.opennet.ru давно получил известность, как самый богатый по содер-

№11, ноябрь 2006

OpenNET.ru, одному из первых русскоязычных ресурсов, посвященных открытым технологиям, исполняется 10 лет. Редакция журнала «Системный администратор» поздравляет Максима Чиркова и всех постоянных посетителей ресурса с юбилеем.

жанию из числа русскоязычных ре- ла лишь в планах, но последнее вресурсов, посвященных Linux. К популяр- мя просьбы по созданию мобильной ности сам Чирков относится спокойно. версии сайта появились в письмах поВернее не думает о ней. Для него со- сетителей, и теперь реализация – одздание и поддержка сайта – многолет- на из приоритетных задач. Некоторые ний труд, ежедневная рутина, а попу- новые возможности являются плодом лярность предполагает в первую оче- экспериментов. Например, на подхоредь ответственность за каждое сло- де реализация контекстных подскаво, каждый новый шаг. И на лаврах зок на этапе формирования поисковоМаксим Чирков не спешит почивать. го запроса, подобная «google suggest». Наоборот, сетует, что конструктивной Вообще давно хочется поменять поискритики маловато, а ведь именно она ковый механизм на сайте, но, к сожапозволяет немного по-другому взгля- лению, приемлемых вариантов пока нуть на привычные вещи. Однако, по- не нашел...» Максим улыбается: «Все самое хоже, Максим умеет критиковать себя лучше, чем любой посетитель сай- интересное еще впереди». Кстати, та. Любимое его занятие – доведе- улыбку эту я вижу лишь виртуально, ние до совершенства скриптов… Сайт как традиционные символы – двоетов постоянном развитии, иногда эта ра- чие и скобочка. Наша беседа о содербота даже не видна гостям OpenNET.ru: жимом виртуального «шкафа судьбы» идет оптимизация подсистем, реализа- тоже виртуальна. Впервые я беру инция возможности репликации данных тервью по электронной почте, и, однадля быстрого переключения на резер- ко, это не мешает мне, надеюсь, и чивный сервер при проблемах первично- тателям, понять главное в герое этого, без потери функциональности сай- го очерка. Это основное ценное зната. Это, пожалуй, высший пилотаж – ние о хозяине популярного сайта хракак работа опытного дворецкого в ко- нится на дальней полке со скромным названием «Радости». Чему радуетролевском дворце. Пожалуй, самое интересное в па- ся ведущий проекта OpenNET? Сам почке с манящим названием «Планы признался: «Тому, что могу поделитьи перспективы». Заглянем? «Уже не- ся накопившейся информацией с друсколько лет в планах логическое объ- гими». Вот причина, по которой Макединение (контекстная связь) всех ка- сим, не публичный человек, невольно талогов сайта. В дополнение к разде- стал ядром притяжения многих людей. ленным в силу исторических причин Жизнь вокруг него кипит, а сам Чирков каталогам программ, ссылок, доку- вполне удовлетворен ролью наблюдаментации и советов, планируется реа- теля. Не ищете его биографию в Интерлизовать единый тематический рубри- нете. Сходите на сайт, и вы поймете – катор. Если текущая связующая систе- здесь весь Максим Чирков. Виртуальма мини-порталов оперирует раздела- ная судьба, самая оригинальная в моми каталогов, то новая система при- ей журналистской коллекции судеб. звана функционировать на уровне ко- Скажете – несерьезно? Однако еще нечных записей из разделов, объеди- неизвестно, что долговечнее – шкаф, няя их в единую иерархическую струк- набитый невостребованными бумагатуру. Хочу создать версию сайта для ми, или одна короткая строчка в окошкарманных компьютеров. Админист- ке браузера: www.opennet.ru... ративный интерфейс для этого давно Оксана Родионова, адаптирован, но сам сайт, и особенфото из семейного архива но форум, просматривать неудобно. Максима Чиркова До некоторого времени эта идея бы-

41


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

Выявление угроз информационной безопасности внутри компании

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

П

о мере роста и развития информационных систем количество вариантов обхода систем защиты будет увеличиваться. А это диктует необходимость постоянно контролировать и совершенствовать системы защиты и отказоустойчивости. Для выполнения этой задачи необходимо проводить регулярные проверки безопасности для определения реальных рисков, стоящих перед организацией. Такие риски включают в себя:  Риски, связанные с нарушением требований внутренних и нормативных документов РФ (ФСТЕК, ФСО, ФСБ, МВД, ЦБ РФ), а также других международных стандартов в области защиты информации.  Целенаправленные действия высококвалифицированных хакеров, неэтичных конкурентов, которые имеют цель получить конкретную информацию или нарушить рабочие процессы предприятия и действуют на основе внутрифирменной информации (например, предоставленной действующим или уволенным сотрудником компании).

42

 Действия нелояльных сотрудни-

 разработки плана действий для лик-

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

видации выявленных уязвимых мест. Необходимо уделять основное внимание процедурам, связанным с выполнением требований нормативных документов в области защиты информации, а также проверке защищенности сегментов сети предприятия, удаленного доступа, а также правилам и процедурам в области IT и их общей организации. Методика обнаружения/сканирования доступа корпоративной сети:  определение маршрутов доступа в сеть;  запрос DNS;  идентификация хостов;  сканирование сетевых служб;  сканирование на предмет уязвимых мест.

Диагностика системной защиты заключается в оказании предприятию содействия в снижении риска обхода систем защиты его информационных сетей с помощью: Коммерческие программы обеспе выявления уязвимых мест в систе- чивают тестирование на предмет слемах защиты, анализа организации, дующих уязвимых мест: правил и процедур информацион-  слабые места в защите Sendmail/ ной безопасности; SMTP;


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

уязвимость к открытым атакам; недостаточная защита в области TFTP и FTP; уязвимость NetBIOS/SMB; уязвимость RPC-сервиса; уязвимость HTTP/CGI; слабые места сетевых информационных служб (NIS); IP-спуфинг (имитация соединений)/прогнозирование последовательности, отказ в обслуживании и многие другие виды атак; проверка сетей и протоколов на спуфинг, проверка протоколов маршрутизации из источника, rlogin, rsh и telnet; проверка на спуфинг RIP (маршрутизирующего информационного протокола) и ARP (протокола сопоставления адреса); проверка IP-переадресации (forwarding); всесторонняя проверка DNS; IP-фрагментация, проверка фрагментации и ретрансляции; проверка внутренних адресов; проверка сетевых масок и временных меток (timestamp) ICMP; проверка инкапсуляции пакета MBONE; проверка инкапсуляции APPLETALK IP, IPX, Х.25, FR; проверки резервированных разрядов и паритет-протоколов; определение исходных портов через проверки TCP и UDP; проверка портовых фильтров TCP и UDP и всесторонняя проверка портов; проверка специализированных фильтров; проверка фильтров с возможностью нулевой длины TCP и IP; проверка на передачу сверхнормативных пакетов.

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

№11, ноябрь 2006

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

Техники удаленного анализа А теперь рассмотрим несколько техник удаленного анализа (атаки), выполняемых для внутренней диагностики или злоумышленником. Используемые доступные инструменты:  Nmap – http://www.insecure.org/nmap/nmap_download.html.  Hping2 – http://www.hping.org/download.html.  Legion – http://www.rhino9.com.  L0pht crack – http://www.l0pth.com.

Техника 1. Поиск узлов корпоративной сети Посылка ICMP эхо-пакетов (ping) на каждый IP-адрес и ожидание ответа для определения, какой хост в рабочем состоянии. Но множество хостов отфильтровывают (отбрасывают) запросы и ответы ping. Пример: > ping microsoft.com PING microsoft.com (207.46.230.219) from 208.184.74.98 : 56(84) bytes of data. --- microsoft.com ping statistics --8 пакетов отправлено, 0 пакетов принято, 100% потери пакетов

Однако существует усовершенствованный способ поиска узлов корпоративной сети при помощи инструмента nmap, использующего нижние уровни IP-протокола. По умолчанию Nmap -sP, Nmap посылает пакет TCP ACK (acknowledgment) на порт 80 параллельно ICMP ping запросу. Если пакет RST (или ответ ping) возвращается, мы получаем информацию, что хост существует. В некоторых случаях вам необходимо опробовать компьютер при помощи пакета TCP SYN вместо ACK. Данное действие производится опцией -PS. Эта опция использует SYN (запрос соединения) пакеты вместо пакетов ACK для пользователей root. Хосты, находящиеся в рабочем состоянии, должны ответить пакетом RST (или, реже, SYN|ACK).

Техника 2. Определение доступных и используемых сервисов в корпоративной сети Открытые TCP-порты могут быть определены при помощи SYN-сканирования. Это предпочитаемый в общих случаях тип TCP-сканирования, также известный как half-open scanning. Запустите Nmap с аргументом -sS, чтобы произвести данный метод сканирования. Не забывайте про UDP-сканирование! (Nmap с опцией -sU). Другие типы сканирования: FIN, XMAS и NULL (-sF, -sX, -sN). Больше информации о механике этих видов сканирования можно получить на странице руководства Nmap (http://www.insecure.org/nmap/nmap_manpage.html) Продвинутый тип сканирования – ACK scan (-sA) для проверки межсетевых экранов/фильтрующих систем. Реализуется посредством сканирования IP-протоколов -sO. Nmap обычно фокусируется на TCP, UDP, и ICMP, но есть множество других протоколов, доступных для продвинутых атак и получения информации.

43


безопасность Сканирование протоколов зацикливается на 8-битном поле протокола, посылая массив IP-заголовков без данных. Ошибка «ICMP-протокол недоступен» означает, что целевой объект не принимает пакеты для данного протокола. К примеру, вот SYN-сканирование: # nmap -sS target.example.com/24

Эта команда запускает скрытое SYN-сканирование каждого компьютера в рабочем состоянии до 255 компьютеров в классе «C», принадлежащих домену target.example.com.

Техника 3. Разведка топологии корпоративной сети Выполняется трассировка при помощи пакетов типа UDP, исходящий порт соединения 53, а порт назначения 5023 исследуемого хоста gw.target.com. Трассировка позволяет получить информацию о структуре корпоративной сети, ее активных сетевых узлах (брандмауэры, маршрутизаторы, и т. д.). # hping2 --traceroute -t 1 -2 --baseport 53 -keep -V ↵ -p 5023 gw.target.com

Важно определить, какие из операционных систем используются на этих узлах. # nmap -O targethost.com

Nmap (с опцией -O) позволяет определить версию ОС на основе техники TCP/IP-дактилоскопирование (fingerprinting). Так же просто применить простую диагностику для веб-серверов, используя терминал telnet для соединения с веб-улом по порту 80. # telnet target.com 80 >GET /blah HTTP/1.1 HTTP/1.1 400 Bad Request Server: Microsoft-IIS/5.0 .... ....

Некоторые сервисы позволяют получить злоумышленнику избыточную информацию о сети, часто уязвимы DNS-сервера, как и приведенный выше пример с конфигурацией, разрешающей трансфер зоны: # nslookup

>server 11.12.13.2 (подключаемся к DNS серверу) >set type=any (устанавливает получение всех внутренних зон и узлов) >ls –d target.com. >> ./Zonetransfer.out

Файл Zonetransfer.out содержит полный список всех внутренних зон и узлов.

Техника 4. Поиск общих windows-ресурсов (windows-share) Допустим, злоумышленник уже получил следующие данные о корпоративной сети:  В сети присутствуют узлы на основе ОС MS Windows.  Диапазон IP-адресов локальной сети: 11.12.13.111.12.13.255.

44

Используем утилиту Legion 2.1 для сканирования заданного диапазона сети, для поиска общих ресурсов Microsoft Windows. Legion сперва определит, какие из доступных узлов используют или нет протокол NetBIOS, далее получим результат в виде полного списка доступных ресурсов и возможных прав доступа. Возможно, вы будете удивлены, увидев в списке ресурсов корневой диск или папки с рабочими документами пользователей. Так злоумышленник может получить доступ к коммерческой информации предприятия или воспользоваться доступом и установить «закладки» для мониторинга сетевых аккаунтов и паролей. Теперь, зная базовые техники атаки и возможные инструменты, можем организовать защиту и систему оповещения атаки корпоративной сети. С точки зрения атакующего, инструменты делятся на 3 категории: зондирование, получение доступа и заметание следов. С точки же зрения специалиста по информационной безопасности, их можно разделить на: глубоко эшелонированную защиту (HIDS/NIDS, Firewalls, Antivirus, Honeypots etc) и персональные утилиты анализа безопасности (сканеры и т. д.). Список популярных используемых инструментов:  Argus – инструмент анализа сетевой активности. Работает на уровне IP приложения, получая полную информацию с сетевого интерфейса. Может оповещать об аномальной активности в локальной сети (сканирование) (ftp://ftp.andrew.cmu.edu/pub/argus).  Asax – cканер и анализатор уявимостей для платформы UNIX (ftp://ftp.cerias.purdue.edu/pub/tools/unix/sysutils/ asax).  Asmodeous Port Scanner – сетевой сканер для Windows (http://www.webtrends.com/products/wsa).  HPing – утилита диагностики сети использует нижние уровни IP-протокола для получения информации о маршрутах сети (http://www.kyuzz.org/antirez/oldhping.html).  Internet Security Scanner (ISS) – сканер уязвимостей на UNIX-платформах, также собирает информацию о NFS-ресурсах (ftp://ftp.iss.net/pub/iss).  NESSUS – утилита основана на открытом исходном коде, удобный инструмент утилита для диагностики безопасности различных ОС. Поддерживает многопоточные модули и графический интерфейс X-windows (http://www.nessus.org).  SAINT – инструмент администратора сетевой безопасности. Позволяет работать со множеством сетевых сервисов NFS, NIS, ftp and tftp, rexd, statd, и другие (http://wwdsilx.wwdsi.com/saint). Вы можете собственными силами проверить информационную сеть компании на наличие уязвимостей, спроектировать систему информационной безопасности, выбрать нужные инструменты, разработать необходимые регламенты и политику безопасности. Или при отсутствии специалистов данной области обратиться к независимому стороннему аудиту.

Никита Дуров, специалист по внедрению программного обеспечения, Департамент внедрения и консалтинга LETA IT company


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

«Внутренние IT-угрозы в банке превосходят по значимости все остальные» О том, как важно правильно защитить банк от внутренних IТ-угроз, рассказывает председатель совета директоров Банка высоких технологий Игорь Триф. С какими внешними угрозами стал- рые эксперты отмечают, что сейчас ти при защите от внутренних IТ-угроз кивается IT-департамент вашего гораздо актуальнее решение вопро- очень актуален. банка чаще всего? Конечно, желательно, чтобы посов, связанных с построением заНаиболее распространенные из них – щиты банков от внутренних IT-уг- литика информационной безопасносвирусы, спам, попытки несанкциони- роз. Так ли это? ти при защите от внутренних IТ-угроз рованного доступа к публично доступ- Действительно, по данным исследова- разрабатывалась на основе существуным сервисам банка. Интернет-атаки ний компании InfoWatch, одного из ли- ющих стандартов информационной бесоставляют порядка 30%. Сканирова- деров российского рынка програм- зопасности и информационных техноние портов и попытки несанкциониро- мных решений, обеспечивающих за- логий, таких как уже упомянутый СТО ванного доступа к внешним сервисам – щиту конфиденциальной информации БР ИББС – 1.0 – 2006, ISO IEC 27001это наши суровые будни. предприятий и организаций, внутрен- 2005, COBIT. На мой взгляд, не стоит Кстати, по данным Отчета об уг- ние IT-угрозы, такие как кража инфор- изобретать велосипед, в то время когрозах интернет-безопасности компа- мации и халатность сотрудников, оста- да уже существуют лучшие практики нии Symantec, за первые шесть меся- ются главной опасностью для россий- в области информационной безопасцев 2006 года сектор финансовых ус- ских кредитных организаций. На фо- ности, такие как ISO IEC 17799-2005. луг оказался вторым по интенсивнос- не незначительноти нацеленных на него атак, их доля го снижения общесоставила 14% от всех зафиксирован- го индекса обеспоОсновные принципы для разработки поных целенаправленных попыток «взло- коенности инфорлитики информационной безопасности ма». Сектор финансовых услуг занял мационной безопаспри защите от внутренних IТ-угроз: девятое место по интенсивности атак ностью эта угроза  принцип двойного управления; на отказ в обслуживании, он чаще все- превосходит по знаго подвергался фишингу. чимости все осталь принцип минимальной достаточности; Новые версии и виды вредоносного ные. Это также под принцип самоокупаемости. программного обеспечения появляются тверж дается вве постоянно, даже самые известные вен- денным в действие доры на рынке антивирусного програм- в нынешнем году новым стандартом Стоит также отметить, что нельзя много обеспечения не всегда своевре- Банка России СТО БР ИББС – 1.0 – руководствоваться одним лишь «кнуменно успевают отреагировать на них. 2006 «Обеспечение информационной том» при разработке политики инфорОт внешних угроз мы защищены непло- безопасности организаций банковс- мационной безопасности. Огромную хо – у нас своевременно обновляются кой системы Российской Федерации» роль играет еще и действующая в банантивирусные базы, проводится уста- (далее СТО БР ИББС – 1.0 – 2006). ке корпоративная этика. новка новых обновлений и исправле- Пункт 5.4. раздела 5 гласит: «Наибольний безопасности в области операцион- шими возможностями для нанесения Готов ли ваш банк технически осущестных систем и программного обеспече- ущерба организации БС РФ обладает влять серьезный контроль над состония, фильтрация спама, проверка ано- ее собственный персонал. В этом слу- янием внутренней информационной малий в сетевой активности со стороны чае содержанием деятельности зло- среды? Каков общий принцип оргарабочих станций и серверов. Мы сле- умышленника является нецелевое ис- низации информационной безопасдим за информацией на сайтах вендо- пользование предоставленного конт- ности в вашем банке? ров антивирусного ПО и сайтах, связан- роля над информационными актива- На данный вопрос нельзя дать однозначных с информационной безопасностью. ми, а также сокрытие следов своей ный ответ без привлечения внешних ауВсе это позволяет существенно снизить деятельности. Внешний злоумышлен- диторов, но скорее да, чем нет. Основвозможность проникновения вредонос- ник скорее да, чем нет, может иметь ной же принцип организации информасообщника(ов) внутри организации». ционной безопасности в банке – это приного ПО в наши системы. Учитывая вышесказанное, можно сде- нцип минимальной достаточности. В связи с утечками баз конфиденци- лать вывод, что вопрос разработки поАнна Верхось альных банковских данных некото- литики информационной безопаснос-

№11, ноябрь 2006

45


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

FreeBSD jail: зона строгого режима

Сергей Супрунов Безопасность FreeBSD всегда была на должном уровне. Но когда в Интернет нужно «выставить» один или несколько сервисов, надеяться приходится уже не только на разработчиков системы.

О

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

46

тво для компиляции системы в аль- ки; исключения были описаны в статернативном каталоге. В дальнейшем тье Василия Озерова «Как увелиприспособили для нужд ftp, ограничи- чить безопасность процессов с помовая с его помощью доступ к файло- щью chroot и jail», №7 за 2006 г.) провой системе отдельных пользовате- цессу покинуть свой новый корневой лей. А потом понеслось... Безуслов- каталог, но всё же он не обеспечивано, chroot не позволяет (теоретичес- ет полную изоляцию процессов. За-


безопасность пущенные в chroot программы сохраняют возможность использовать почти любые системные вызовы, что позволяет им наблюдать за системой (например, с помощью ps) и даже влиять на её работу (монтировать файловые системы, модифицировать ядро и т. д., вплоть до остановки системы). Конечно, всё это возможно только в случае, если в chroot-каталоге будут доступны нужные средства, хотя при наличии shell-доступа «протащить» их туда не составит особого труда. Поэтому для повышения безопасности во FreeBSD появилось специальное средство – jail (англ. «тюрьма»). Но так уж «исторически сложилось», что для повышения безопасности всё же чаще используется chroot-окружение, а jail упоминается по большей части как средство виртуализации. Скорее всего, причина здесь в большей распространённости и универсальности вызова chroot, который реализован практически во всех UNIX-подобных системах. К тому же появился он намного раньше. Возможно, свою роль играет и несколько большая сложность организации jail-среды по сравнению с chroot, так что помимо всего прочего, постараемся в деталях разобраться и во всех тонкостях практического применения jail. Для начала рассмотрим некоторые теоретические вопросы.

Понятия

Рисунок 1. Изолированная виртуальная система

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

Вызов jail значительно расширяет функции chroot, ограничивая, помимо доступа к файловой системе вне «корня», любые средства, которые могут позволить использовать какиелибо ресурсы за пределами jail. Так, в jail запрещаются: любая модификация текущего ядра (включая загрузкувыгрузку модулей и изменение параметров с помощью sysctl), монтирование-демонтирование файловых систем, изменения сетевых настроек, доступ к «сырым» сокетам, взаимодейс- Инструментарий твие с процессами, запущенными вне «Тюрьма» создаётся с помощью одно«тюрьмы», любые действия, влияющие имённой утилиты – jail (см. man 8 jail). на работу всей системы (например, пе- В качестве обязательных аргуменрезагрузка). Благодаря этим ограниче- тов ей передаются путь к корневому ниям, даже процесс, запущенный в jail для «тюрьмы» каталогу, имя хоста и сес правами суперпользователя, будет тевой адрес, а также команда, которая существенно ограничен в возможнос- запустит в jail-окружении первый проти нарушить работу операционной сис- цесс, который будет родительским для всех остальных. Опционально может темы в целом.

№11, ноябрь 2006

быть указан пользователь, с правами которого этот процесс следует запустить. При инициализации в jail может быть запущен только один процесс. В дальнейшем он может порождать другие, которые будут дочерними по отношению к нему и унаследуют все ограничения. Нужно иметь в виду, что в jail никакие сценарии инициализации или чтото подобное не запустятся без вашего прямого на то указания. Jail – это, по сути, «усиленный» в плане безопасности chroot, а не полноценная виртуальная машина. Для создания виртуальной системы в jail следует в качестве имени команды, запускаемой в «тюрьме», указывать сценарий /etc/rc (пример будет показан ниже). Для работы с jail будут полезны также утилиты jls (возвращает список запущенных в данный момент «тюрем» с их идентификаторами) и jexec (предоставляет возможность выполнить какую-либо команду внутри jail из основной системы). Подробности смотрите на соответствующих man-страницах.

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

47


безопасность Безусловно, ряд проблем безопасности остаётся и в случае использования jail. Например, злоумышленник может использовать захваченную «тюрьму» для рассылки спама, организации ftp-файлообменников, настройки анонимных прокси-серверов и т. д. Большинство этих проблем связаны с сетевой активностью. Единственный адрес позволяет легко управлять сетевой работой «тюрьмы» из основной системы (в частности, запрещать взаимодействие со всеми портами, работа по которым для jail-системы не предусматривается). Тем не менее, нужно иметь в виду, что запуск процесса в среде jail сам по себе не является панацеей от любых внешних угроз.

Разборки Перейдём к практическим вопросам. Подробно разберём три примера: реализация полноценной виртуальной системы, создание изолированной «внешней» среды и запуск в jail одной сетевой службы.

Пример 1. Виртуальная система Для начала рассмотрим простейший с точки зрения реализации пример – виртуальную машину для тестирования или для предоставления пользователям полнофункционального хостинга с правами root (см. рис. 1). То есть нам нужно, фактически, создать систему в системе. Порядок действий можно почерпнуть в man jail – создаём каталог для будущей jail-системы, собираем в него «мир» и «дистрибутив», монтируем devfs: # # # # #

mkdir -p /var/jails/system cd /usr/src make world DESTDIR=/var/jails/system make distribution DESTDIR=/var/jails/system mount_devfs devfs /var/jails/system/dev

На не слишком шустрой машине сборку мира лучше запускать на ночь – эта процедура может затянуться часов на шесть-восемь. Впрочем, если вы уже пересобирали систему (например, в ходе обновления версии или «латания дыр», подобных недавним ошибкам в crypto), то вместо повторной сборки всей системы можно ограничиться инсталляцией в альтернативный каталог: # make installworld DESTDIR=/var/jails/system

Для запуска jail, помимо подготовленного каталога, понадобятся также IP-адрес и имя хоста. IP предварительно нужно задать как псевдоним на одном из интерфейсов основной системы (подойдёт и lo0):

jail# passwd root jail# adduser Username: admin Full name: Administrator of jail . . .пропущено. . .

jail# echo "sshd_enable=YES" >> /etc/rc.conf

Для корректной работы в дальнейшем следует также выставить правильный часовой пояс, впрочем это относится к стандартной процедуре настройки любой новой системы, так что здесь мы не будем останавливаться на этих вопросах. Продолжим – у нас осталось ещё одно серьёзное дело: нужно обеспечить автоматический запуск jail при загрузке. Для этого в /etc/rc.conf основной системы добавим следующие строки: jail_enable="YES" jail_list="system" jail_system_rootdir="/var/jails/system" jail_system_hostname="jail.host" jail_system_ip="10.30.0.100" jail_system_interface="lo0" jail_system_devfs_enable="YES" jail_system_exec_start="/bin/sh /etc/rc" jail_system_exec_stop="/bin/sh /etc/rc.shutdown"

В параметре jail_list перечисляются все jail-системы, которые должны запускаться автоматически (у нас пока такая система одна). В дальнейшем по схеме «jail_<имя из списка>_<параметр>» задаются параметры для каждой «тюрьмы» из списка. Обязательно должны быть указаны путь, имя хоста, IP-адрес и выполняемая команда. Параметр interface задавать не обязательно, но без него сценарий /etc/rc.d/jail выдаёт ошибки о неправильном синтаксисе для ifconfig, хотя на работе это никак не отражается. Также желательно задать автомонтирование файловой системы devfs, чтобы не модифицировать /etc/fstab. Ну и последние две строки в данном случае необязательны, поскольку повторяют значения по умолчанию – это команды, которые должны быть выполнены при старте и останове jail-системы. Теперь можно запустить jail командой /etc/rc.d/jail start (нужно предупредить, что при разрешённом sshd первый запуск займёт довольно ощутимое время – в jail будут генерироваться необходимые для работы ключи) и попробовать подключиться к ней по ssh: $ ssh -l admin 10.30.0.100

Здесь admin – имя пользователя, которого мы создали в jail. Войдя в «тюрьму», обратите внимание на то, как ограничены ваши права – команды ps, top и т. д. будут выдавать Если не терпится, то уже можно заглянуть в новую сис- информацию только о процессах, исполняющихся в данной «тюрьме», ifconfig разрешает только просмотр, traceroute тему: и ping не работают вообще, ссылаясь на «socket: Operation # jail /var/jails/system jail.host 10.30.0.100 /bin/csh not permitted». Для полноценной работы в jail ещё понадобится колРаз уж мы здесь, сразу сделаем несколько полезных лекция портов, но её можно просто скопировать из основвещей – зададим пароль пользователю root, создадим ной системы. Есть и более экономичный вариант, позволяобычного пользователя для повседневной работы, настро- ющий «разделять» один каталог между основной системой и «тюрьмами» (его мы рассмотрим в следующем примере), им sshd: # ifconfig lo0 alias 10.30.0.100 netmask 255.255.255.255

48


безопасность но здесь копия позволит пользователю, работающему в jail, делать с этим ката- Технологии «соседей»: логом что угодно без опасений, что это зоны Solaris Начиная с 10-й версии в Solaris существует отразится на основной системе.

Пример 2. Внешняя и внутренняя зоны Понятно, что рассмотренный выше случай удобен для хостинга, позволяя пользователю самостоятельно выполнять очень многое, вплоть до установки нужных программ. Но когда речь идёт об использовании jail как средства повышения безопасности (например, для разделения системы на «внешнюю» и «внутреннюю» области), здесь есть один недостаток – дублирование всех системных файлов. Помимо нерационального расходования дискового пространства, это также усложняет и сопровождение системы – патчи в случае выявления уязвимости нужно устанавливать во всех «тюрьмах», обновлять несколько одинаковых деревьев ports и т. д. Но есть способ свести дублирование информации к минимуму, который и рассмотрим на данном примере: пусть у нас есть один физический сервер и требуется реализовать на нём «внешнюю» систему, которая будет предоставлять услуги абонентам, такие как электронная почта, FTP-сервер и т. д. (своего рода DMZ, но в пределах одного физического сервера), и «внутреннюю», обеспечивающую некоторыми услугами пользователей локальной сети. Поскольку локальную сеть можно считать менее опасной, чем Интернет, то для предоставления «внутренних» услуг будем использовать основную систему, в то время как все «внешние» службы перенесём в jail-окружение (см. рис. 2). В отличие от предыдущего примера, здесь не предполагается, что какойто пользователь внутри jail будет выполнять модификацию системы. Поэтому львиную долю всех файлов можно сделать «только для чтения». А раз так, то вместо копирования всех системных файлов в jail можно попробовать предоставить те же файлы, которые используются основной системой. Ссылки не подойдут, поскольку суперпользователь внутри «тюрьмы» сможет выставить на файлы нужные права, так что в случае компромета-

№11, ноябрь 2006

реализация так называемых зон – технологии, очень близкой по своей сущности «тюрьмам» FreeBSD. Зоны позволяют запускать в рамках одного ядра несколько изолированных экземпляров системы. Так же, как и в jail, процессы различных зон не имеют возможности влиять друг на друга и даже наблюдать за «чужими» действиями. Сама система, в которой оказывается администратор после установки Solaris, – это тоже зона, именуемая глобальной. Процессы глобальной зоны имеют расширенные полномочия для мониторинга процессов в «обычных» зонах. Работа с зонами реализована гораздо удобнее и последовательнее, чем средства работы с jail, – к услугам администратора мощные утилиты zoneadm и zonecfg, позволяющие создавать, инсталлировать, конфигурировать зоны и управлять их ра-

ботой. Взаимодействие с зоной осуществляется через так называемую консоль зоны, подключение к которой выполняется утилитой zlogin. По умолчанию зоны используют (с правами только на чтение с помощью loopback filesystem) ряд пакетов глобальной зоны, благодаря чему их размер сравнительно небольшой, хотя «изнутри» зона мало чем отличается от полноценной системы. Внутри неглобальной зоны действуют ограничения, аналогичные ограничениям jail, – невозможно просмотреть информацию о процессах в других зонах, запрещены загрузка модулей ядра, настройка оборудования и т. д. Правда, «администратор» неглобальной зоны имеет возможность перезагрузить её. Или, скажем, есть возможность внутри зоны использовать «сырые» сокеты для ICMP (для других типов трафика их использование для неглобальных зон запрещено). Есть, естественно, и другие отличия.

ции jail-системы могут быть поврежКаталог портов /usr/ports можно дены и системные файлы. будет монтировать (но на чтение-заИзбежать этого позволяет меха- пись, поскольку это нужно для работы) низм монтирования. Если, скажем, в только на время установки нового ПО. каталог /bin смонтировать файловую По большому счёту, можно вообще высистему только для чтения, то из jail полнять установку из основной систеповредить её будет нельзя. Вы же пом- мы, указав нужный PREFIX. Разве что ните, что в jail операции монтирования некоторые действия придётся доделызапрещены? А раз так, то и перемон- вать вручную (например, регистрацию тировать на чтение-запись эту файло- в jail-системе нужных пользователей, поскольку при такой инсталляции они вую систему не удастся. Итак, что мы можем смонтировать будут созданы в основной). Теперь самое интересное – для монв jail с опцией ro? Во-первых, системные файлы – каталоги /bin, /sbin, /usr/bin тирования всех этих каталогов их и т. д. Во-вторых, каталог настроек – не нужно размещать на отдельных /etc. Ведь большую часть параметров разделах. В FreeBSD есть очень удобможно будет установить и из основ- ный механизм mount_nullfs, позволяной системы, где запись можно оста- ющий монтировать обычные каталовить разрешённой. Единственное, каталог /etc всё же лучше создать отдельный и монтировать уже его – иначе вы не сможете гибко разделять настройки основной и jail-систем. То есть в данном случае roмонтирование выполняется не для экономии дискового пространства, а исключительно по соображениям безопасности. Рисунок 2. Внешние сервисы вынесены в jail

49


безопасность ги. Например, ручное монтирование дерева портов может выглядеть таким образом: # mount_nullfs /usr/ports /var/jails/outers/usr/ports

Для монтирования «только на чтение», как обычно, указывается опция -o ro. Помимо nullfs, вы можете использовать и проверенный временем способ – NFS. Сетевая файловая система прекрасно зарекомендовала себя для предоставления ФС на одной машине другим системам, доступным по сети. Но ничто не мешает использовать её внутри одной системы. Только не забывайте, что монтировать NFS-каталоги, как и любые другие, вы должны из основной системы – в jail это запрещено. Есть ещё mount_unionfs, но в FreeBSD этот механизм пока не слишком устойчив и приводит к проблемам гораздо чаще, чем того хотелось бы. Итак, вместо сборки «мира» в каталог jail мы ограничимся сборкой «дистрибутива» (иерархию каталогов придётся создать вручную; если что забудете, make вам напомнит): # cd /var/jails/outers # find / -type d -maxdepth 1 | sed 's/^\///' | xargs mkdir # find /etc -type d -maxdepth 1 | sed 's/^\///' | ↵ xargs mkdir # find /usr -type d -maxdepth 1 | sed 's/^\///' | ↵ xargs mkdir # find /etc/periodic -type d -maxdepth 1 | ↵ sed 's/^\///' | xargs mkdir # find /var -type d -maxdepth 1 | sed 's/^\///' | ↵ xargs mkdir # find /var/named -type d -maxdepth 3 | sed 's/^\///' | ↵ xargs mkdir # cd /usr/src # make distribution DESTDIR=/var/jails/outers # mv /var/jails/outers/etc /var/jails/_4mount/outers/etc # mkdir /var/jails/outers/etc

Предпоследней строкой мы перенесли «дистрибутивный» каталог настроек за пределы jail-каталога, с тем чтобы в дальнейшем смонтировать его в режиме «только для чтения» и тем самым сделать невозможной любую модификацию настроек внутри jail. Теперь обеспечиваем автоматическое монтирование нужных каталогов, для чего в /etc/fstab добавим следующие строки: # For jail /bin /var/jails/outers/bin nullfs ro /sbin /var/jails/outers/sbin nullfs ro /lib /var/jails/outers/lib nullfs ro /libexec /var/jails/outers/libexec nullfs ro /usr/bin /var/jails/outers/usr/bin nullfs ro /usr/sbin /var/jails/outers/usr/sbin nullfs ro /usr/lib /var/jails/outers/usr/lib nullfs ro /usr/libexec /var/jails/outers/usr/libexec nullfs ro /usr/libdata /var/jails/outers/usr/libdata nullfs ro /usr/include /var/jails/outers/usr/include nullfs ro /usr/share /var/jails/outers/usr/share nullfs ro /var/jails/_4mount/outers/etc /var/jails/outers/etc nullfs ro 0 0

0 0 0 0 0 0 0 0 0 0 0 ↵

0 0 0 0 0 0 0 0 0 0 0

При первом запуске каталог etc нужно примонтировать вручную на чтение-запись, чтобы sshd смог сохранить сгенерированные ключи. Это также может понадобиться и ряду других программ, которые сохраняют свои данные непосредственно в etc – проверьте свои пакеты на этот счёт. Осталось подмонтировать порты, как показано выше, зайти в jail и установить необходимые программы. После этого каталог ports можно размонтировать – пока не пот-

50

ребуется установить что-то ещё или обновить какой-то пакет, он нам не понадобится. Кстати, если быть последовательным, то можно и /usr/local, по примеру /etc, вынести в отдельный каталог, а в jail подключать через монтирование. Или даже сделать две «тюрьмы» – Рисунок 3. Отдельный сервис в jail одну для настроек, не имеющую выхода в Интернет, но с каталогами, монтируемыми на чтение-запись; и вторую – рабочую, куда монтирование тех же каталогов выполняется только на чтение. В общем, нет предела паранойе. Кстати, у jail есть ещё одно ограничение, полезное при работе с «общими» файлами, – процессы, запущенные внутри «тюрьмы», не могут менять флаги уровня безопасности, выставленные на файлы. Благодаря этому файлы, которые jail разделяет с основной системой или другой «тюрьмой», можно объявить неизменяемыми. Правда, основной системе тоже придётся учитывать эти ограничения. Небольшое замечание по работе с файлом паролей. Поскольку в jail каталог etc недоступен для записи, все изменения нужно будет вносить в /var/jails/_4mount/outers/etc. Для этого удобнее всего использовать команду pw с параметром -V, указывающим на альтернативный каталог размещения файлов: # echo "password" | pw -V /var/jails/_4mount/outers/etc ↵ useradd me -h 0 -g wheel

Так мы добавили пользователя me. Если что-то непонятно, изучайте man pw. Нужно сказать, что описанный выше приём – это лишь конкретный пример. Очевидно, что подобным образом придётся учитывать изменённый каталог и для других конфигурационных файлов, например, баз данных sendmail. Возможно, в ряде случаев будет проще временно перемонтировать /etc на чтение-запись и выполнить необходимые модификации файлов из jail (по соображениям безопасности сетевую работу из jail на это время можно полностью заблокировать). На этом всё, пожалуй, – нам почти ничего не пришлось дублировать, обновления системы будут автоматически распространяться и на jail-систему, и при этом злоумышленник, даже если получит внутри «тюрьмы» права суперпользователя, не сможет причинить вред ни основной, ни jail-системе. Даже изменить большинство настроек (например, чтобы обеспечить себе беспрепятственный вход во взломанную систему по ssh или открыть релей в access-файле Sendmail), и то не сможет. В отличие от предыдущего примера, когда системные файлы в jail суперпользователь мог менять как ему вздумается, здесь мы имеем возможность ограничить ресурсы, которые будут доступны процессам в jail. Это позволит избежать перегрузки системы в случае ошибок в ра-


безопасность # mkdir -p /var/jails/wuftpd/usr/lib ботающих процессах (например, неаккуратно разрабо# cp /usr/lib/libopie.so.4 /var/jails/wuftpd/usr/lib танный сценарий, исполняющийся в среде FastCGI, может привести к утечке памяти) либо в случае сознательТакже понадобится вручную создать некоторые рабоных действий взломщика. Лимиты, как известно, зада- чие каталоги, например, для размещения log-файлов (есются в файле /etc/login.conf (в нашем случае это будет ли вы недостаточно хорошо знакомы с запускаемым сер/var/jails/_4mount/outers/etc/login.conf) с последующим под- висом, то, что именно создавать, можно будет узнать меключением «класса» в учётной записи пользователя. На- тодом «научного тыка»: обычно при неудачной попытке запример, можно использовать такие ограничения: пуска jail причины ошибок можно увидеть либо прямо в консоли, либо в /var/log/messages; запускаемый демон может default:\ также «ругаться» в лог-файл внутри jail):

:cputime=1h:\ :memoryuse=50M:\ ... пропущено ... :maxproc=35:\ :coredumpsize=0:

root:\ :tc=default:

Теперь, поскольку значения, определённые в default, будут распространяться на всех пользователей с пустым 5 полем в master.passwd (а мы его пустым и оставим), то все пользователи в jail, даже суперпользователь, будут ограничены в возможности потреблять ресурсы системы. Понятно, что это лишь пример – ваши значения и перечень ограничиваемых параметров могут быть совсем другими. При желании можно задать несколько «классов» ограничений для различных пользователей. Читайте man login.conf и проявляйте осторожность, выставляя ограничение cputime для процессов, подразумевающих постоянную работу.

Пример 3. Запускаем ftp-сервер Для таких служб, как Sendmail, проще создать в jail полноценную систему – слишком уж много у неё зависимостей и взаимосвязанных сервисов, таких как POP3-или IMAP-серверы, антивирусные и антиспамовые фильтры, и т. д. Однако в некоторых случаях это может оказаться избыточным (см. рис. 3). Например, вы хотите протестировать FTP-сервер wu-ftpd, но не уверены в его благонадёжности. Чтобы не подвергать риску всю систему, запустим его в jail-окружении. На этот раз нам не понадобятся ни «мир», ни «дистрибутив». Просто создаём каталог и выполняем в него инсталляцию из портов: # mkdir -p /var/jails/wuftpd # cd /usr/ports/ftp/wuftpd # make PREFIX=/var/jails/wuftpd/ install

Проверяем, от каких библиотек зависит эта программа, и копируем нужные в будущий jail-каталог согласно их размещению в дереве каталогов: # ldd /var/jails/wuftpd/libexec/ftpd /var/jails/wu-ftpd/libexec/ftpd: libcrypt.so.3 => /lib/libcrypt.so.3 (0x28095000) libopie.so.4 => /usr/lib/libopie.so.4 (0x280ad000) libmd.so.3 => /lib/libmd.so.3 (0x280b6000) libc.so.6 => /lib/libc.so.6 (0x280c4000)

# cp /lib/libcrypt.so.3 /var/jails/wuftpd/lib/ # cp /lib/libmd.so.3 /var/jails/wuftpd/lib # cp /lib/libc.so.6 /var/jails/wuftpd/lib

№11, ноябрь 2006

# mkdir -p /var/jails/wuftpd/var/log/ # mkdir -p /var/jails/wuftpd/var/run/

Переименуем конфигурационные файлы и при необходимости подредактируем: # # # # #

cd cp cp cp cp

/var/jails/wuftpd/etc ftpaccess.example ftpaccess ftpgroups.example ftpgroups ftpusers.example ftpusers ftpconversions.example ftpconversions

Ещё нам понадобится файл паролей, поскольку wu-ftpd использует его для работы (для анонимного доступа нужно также завести пользователя ftp, в качестве пароля можно поставить «*» так же, как и пользователю root, – они всё равно не используются, а «светить» их хэши лишний раз не стоит): # head -3 /etc/master.passwd > master.passwd # vipw -d

Последней командой мы как раз-таки и вносим в master.passwd необходимых пользователей. Рабочие хэшбазы при выходе из редактора будут созданы автоматически, не забудьте только указать текущий каталог директивой -d, чтобы не попортить файл паролей основной системы. Приготовления на этом можно считать завершёнными. Однако попытка запустить jail выявляет ещё одну недоработку: # jail /var/jails/wuftpd wuftpd 10.30.0.121 /libexec/ftpd -S ELF interpreter /libexec/ld-elf.so.1 not found Abort trap: 6

Исправляемся: # cp /libexec/ld-elf.so.1 /var/jails/wuftpd/libexec/

Запускаем вручную и проверяем: # jail /var/jails/wuftpd wuftpd 10.30.0.121 /libexec/ftpd -S # jls JID IP Address 24 10.30.0.121

Hostname wuftpd

Path /var/jails/wuftpd

# sockstat | grep 10.30.0.121 root

ftpd

8030 0 tcp4

10.30.0.121

*:*

# ps ax | grep J 8030 ?? IsJ 0:00,01 ftpd: accepting connections on port 2 (ftpd) 8156 p0 R+ 0:00,01 grep J

# killall -j 24

51


безопасность Последняя команда демонстрирует, как можно остановить jail-систему, Технологии «соседей»: запущенную вручную, – идентифика- VServer и Virtuozzo/OpenVZ тор возвращается утилитой jls (в на- Операционная система Linux тоже готова порадовать своих пользователей возшем примере он равен 24). Далее – уже знакомые вам про- можностью строить изолированные срецедуры: создаём псевдоним для ин- ды запуска процессов. Наиболее распротерфейса, задав IP-адрес, вносим не- странённые из них – VServer и Virtuozzo, сколько строк в /etc/rc.conf и запуска- поставляемые в виде патчей к ядру и наем jail. Готово, можно рассылать своим бора утилит. VServer, достаточно близкий по сводрузьям-хакерам IP-адрес с просьбой ей концепции к jail в FreeBSD, подробно взломать этот сервер.

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

52

был описан в статье Дмитрия Столярова «Linux-VServer: настраиваем виртуальные серверы» (октябрь 2006 года).

работанного для решения проблем безопасности. К тому же к вашим услугам довольно удобный инструментарий для управления и надзора за вашими «тюрьмами». 1. Алексей Закиров. Использование jail для предоставления shell-доступа – http://www.opennet.ru/base/sec/ freebsd_jail_setup.txt.html. 2. Запуск Apache в jail-окружении под FreeBSD – http://www.inode.ru/articles/ network/2006-02-09/294.

Технология Virtuozzo, разработанная компанией SWSoft, также позволяет запускать на одном физическом сервере до нескольких сотен изолированных виртуальных сред (Virtual Environment, VE) под управлением одного ядра. Virtuozzo распространяется под проприетарной лицензией. Однако доступна также открытая система OpenVZ, являющаяся базой для Virtuozzo. По заявлениям разработчиков, накладные расходы на создание виртуальных сред не превышают 1-3%, что делает подобные технологии заметно эффективнее для ряда задач, чем виртуальные машины. 3. Установка и настройка клеток (jail) на FreeBSD6.1 – http://www.lissyara.ru/ ?id=1197. 4. Using a jail as a virtual machine – http:// www.freebsddiary.org/jail.php. 5. Mike DeGraw-Bertsch. FreeBSD Jails – http://www.onlamp.com/lpt/a/4139. 6. Poul-Henning Kamp. Building Systems to be Shared Securely – http://www.acmqueue. org/modules.phpname=Content&pa=prin ter_friendly&pid=170&page=1. 7. База данных login-классов login.conf – http://pascal.tsu.ru/unix/users/class.html.


полезные советы Настройка безопасной передачи данных TLS По умолчанию при аутентификации Службы файлов (File Daemon), Центра управления (Director) и консоли (Bacula Console) используется пара логин и пароль. Пароль по сети передается в зашифрованном CRAM-MD5 виде, который не обеспечивает достаточной защищенности, так как уязвим к plaintext-атаке. Данные по сети передаются в открытом виде, что позволяет их перехватить. Между тем, начиная с версии 1.37 в Bacula интегрирована поддержка TLS, что позволяет использовать этот криптографический протокол для обеспечения безопасной аутентификации и передачи информации в сети. Для этого необходимо выполнить всего несколько действий. Для начала необходимо собрать Bacula, задав при конфигурировании опцию --enable-openssl. После установки генерируем сертификаты: $ mkdir /etc/ssl/bacula $ cd /etc/ssl/bacula # openssl req -new -x509 -config /opt/ssl/openssl.cnf ↵ -keyout bacula.pem -out bacula.pem -days 365

TLS Certificate = /etc/ssl/bacula/bacula_server.crt TLS Key = /etc/ssl/bacula/bacula_server.key

Другим вариантом защиты является создание защищенного соединения с использованием stunnel или ssh-туннеля. При создании последнего вам поможет скрипт ssh-tunnel.sh лежащий в каталоге examples.

Используйте брандмауэр и TCP wrappers Для большей защиты необходимо закрыть доступ к портам 9101, 9102, 9103 межсетевым экраном, разрешив соединение только с определенных адресов или сетей. При этом следует учитывать следующую схему работы демонов (при настройках по умолчанию):  Консоль ожидает подключения Центра управления на 9101-порту.  Центр управления ожидает подключения Storage на 9103-порту.  Центр управления ожидает подключения Службы файлов на 9102-порту.  Слу жба файлов ожидает подк лючения Storage на 9103-порту.

Рекомендуется подписать свой сертификат в организациях вроде http://cacert.org. То есть в общем случае правило iptables для сети Разделяем ключ и сертификат, убираем пароль с ключа: -s 192.168.0.0/24 выглядит так. Для сервера: # /opt/bin/openssl rsa -in bacula.pem ↵ -out bacula_server.key # /opt/bin/openssl x509 -in bacula.pem ↵ -out bacula_server.crt

И добавляем в конфигурационные файлы всех компонентов Bacula следующее: TLS Enable = yes # включение TLS TLS Require = yes # включение проверки сертификата клиента # (используется только на сервере) TLS Verify Peer = yes

Использование этого параметра позволит проверять все клиентские сертификаты на соответствие CN (Common Name, обычно это адрес электронной почты или веб-сайта организации). Все возможные CN прописываются в директиве TLS Allowed CN, которая может быть использована несколько раз, в этом случае будут проверены все варианты. TLS Allowed CN = "bacula@example.com" TLS Allowed CN = "administrator@example.com"

Следующей директивой указываем полный путь и имя файла TLS CA-сертификата. Допускается наличие нескольких сертификатов в одном файле. Как вариант можно использовать директиву TLS CA Certificate Dir, указывающую на каталог, в котором находятся СА-сертификаты, которые использовались при подписании. Имена файлов сертификатов и ключей должны иметь pem-формат. TLS CA Certificate File = /etc/ssl/bacula/bacula_server.crt

Проще всего для создания ключей и сертификатов использовать скрипт CA.pl, прописав все необходимые параметры в файл openssl.cnf. Сертификат и ключ сервера, используемые для шифрования исходящего соединения к клиенту (естественно, ключ должен соответствовать сертификату):

№11, ноябрь 2006

-A INPUT -p tcp --dport 9101:9103 -s 192.168.0.0/24 -j ACCEPT

И для клиента: -A INPUT -p tcp --dport 9102 –s 192.168.0.0/24 -j ACCEPT

Использование файлов /etc/hosts.allow или /etc/hosts.deny, также положительно скажется на безопасности. Для этого при конфигурировании Bacula необходимо задать опцию --with-tcp-wrappers. В качестве имени в записываемых правилах следует использовать имена, записанные в файлах конфигурации в параметре Name, не имя процесса демона. Например, если в секции Name стоят названия main-fd, main-sd и main-dir, записи в этом файле могут быть такими: main-fd : example.com : allow main-sd : example.com : allow main-dir : example.com : allow main-fd : ALL : deny main-sd : ALL : deny main-dir : ALL : deny

После чего проверьте правильность записей с помощью утилит tcpdchk и tcpdmatch: $ tcpdmatch main-fd example.com warning: main-fd : no such process name in /etc/inetd.conf client: hostname example.com client: address 192.168.1.58 server: process main-fd matched: /etc/hosts.allow line 11 option: allow access: granted

Кстати, параметры signature и verify могут заменить утилиты вроде tripwire.

Сергей Яремчук

53


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

Ошибки синхронизации открывают большие возможности для хакеров. Каковы механизмы защиты?

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

И

нтенсивность атак на пере- ковали сообщение о дыре в драйвере полняющиеся буферы, достиг- TOSRFBD.SYS, разработанном фирнув своего пика в первых го- мой Toshiba для своих Bluetooth-устдах XXI века, начинает неуклонно ид- ройств, используемых многими проти на спад, сдаваясь под напором кон- изводителями оборудования, в числе тратаки большого количества проти- которых оказались ASUS, Dell, Sony вохакeрских мер, предпринятых со сто- и другие бренды. Обе атаки основаны на ошибках роны производителей процессоров, компиляторов и операционных систем. синхронизации потоков (race condition). Неисполняемый стек, контроль целос- Такие ошибки часто встречаются тности адреса возврата, рандомиза- в драйверах, обрабатывающих асинхция адресного пространства – все это ронные запросы от сетевых устройств и многое другое затрудняет атаки, вы- и охватывающие широкий спектр обонуждая хакеров искать обходные пути. рудования, простилающийся от инфраИ такие пути действительно есть! красных адаптеров до DSL-модемов. 3 сентября 2006 года хакер Johnny Как известно, программы, работаюCache описал принципиально но- щие с большим количеством соедивую атаку на драйверы устройств нений (например, клиенты файло-оббеспроводной связи Intel Centrino менных сетей), способны обрушивать PRO, открывающую очередную стра- систему в BSOD с посмертным сообницу в книге переполняющихся бу- щением IRQL_NOT_LESS_OR_EQUAL. феров: http://lists.immunitysec.com/ Это – следствие «удара по памяти», pipermail/dailydave/2006-September/ возникающего из-за разрушения базо003459.html. вых структур данных в небрежно напиВслед за этим, буквально месяц санном драйвере сетевого устройства, спустя, 11 октября 2006 года David страдающего ошибками синхронизаMaynor из SecureWorks, Inc. и незави- ции. Прикладные программы лишь сосимый исследователь Jon Ellch опубли- здают условия наиболее «благоприят-

54

ные» для проявления ошибки, но сами по себе они не виноваты, и претензии пользователей направлены не по адресу, а претензий таких – много! Настолько много, что у большинства программ подобного рода соответствующий пункт явно включен в FAQ. Аналогичная картина наблюдается и с Bluetooth-устройствами, сырость драйверов которых породила целый класс атак под общим называнием BlueSmack, основанный на шторме эхо-запросов, направленных на жертву и вызывающих все тот же «голубой экран смерти». Долгое время никто из хакеров не интересовался, что именно происходит при этом, какой характер носят разрушения и можно ли осуществить нечто более умное, чем банальный отказ в обслуживании. Johnny Сache стал первым хакером, вызывавшим направленный удар по памяти, в результате которого ему удалось воздействовать на регистр EIP с передачей управления на shell-код, исполняющийся в режиме ядра, то есть на наивысшем уровне привилегий. За ним начали подтягиваться и ос-


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

Реализация направленного удара по памяти Механизмы обработки асинхронных событий драйверами подробно описаны в статье «Многоядерные процессоры и проблемы, ими порождаемые, в ОС семейства NT» [1], из которой следует, что при работе с разделяемыми данными программист должен соблюдать особую осторожность и тщательно следить за синхронизацией. Сборка пакетов из фреймов как раз и представляет собой пример работы с разделяемыми данными, однако про синхронизацию программисты традиционно забывают (или реализуют ее неправильно). В результате этого возникает угроза разрушения данных – если обработка одного фрейма прерывается в «неудобном» месте, – разделяемые структуры данных оказываются недостроенными, а поведение драйвера становится непредсказуемым. Вероятность такого события увеличивается на многопроцессорных машинах (под многопроцессорными системами здесь и далее мы понимаем не только истинную многопроцессорность, но также многоядерные и HT ЦП), поскольку на них процедура сборки фреймов может одновременно выполняться более, чем на одном процессоре, при этом все «копии» процедуры сборки обращаются к одним и тем же разделяемым переменным, которые, очевидно, должны быть защищены теми или иными средствами синхронизации, гарантирующими, что пока первая копия процедуры не закончит свою работу, все остальные вынуждены стоять в очереди и терпеливо ждать (либо же работать исключительно со своими собственными локальными переменными).

№11, ноябрь 2006

Рисунок 1. Toshiba выпускает заплатки для драйверов своих Bluetooth-устройств

На однопроцессорных машинах ситуация одновременного выполнения нескольких «копий» процедуры сборки невозможна, однако, если фреймы поступают быстрее, чем успевают обрабатываться, процедура сборки пакетов будет неизбежно прерываться в произвольных местах, поскольку обработчик прерываний от карты (модема) имеет более высокий приоритет. Рано или поздно прерывание произойдет в таком месте, когда часть разделяемых структур данных окажется недостроенной. В большинстве случаев в недостроенных структурах находится «мусор», среди которого встречаются и поля, ответственные за размер пакета, и указатели/ индексы на другие данные. Очевидно, что попытка обращения по «мусорному» указателю (в том числе и указателю, вычисленному на основе «мусорного» индекса) с высокой степенью вероятности приводит к ошибке доступа. В драйверах уровня ядра она обычно заканчивается голубым экраном смерти, сопровождаемым сообщением IRQL_NOT_LESS_OR_EQUAL. Так происходит потому, что на том уровне IRQL, на котором работают отложенные процедуры и обработчики прерываний, подкачка страниц не работает и при обращении к странице, отсутствующей в памяти, операционная система генерирует ошибку IRQL_NOT_LESS_OR_EQUAL, что час-

то вводит в заблуждение многих пользователей и программистов относительно истинной причины аварии. Для реализации DoS-атаки обычно достаточно утилиты наподобие ping, генерирующей большое количество пакетов и позволяющей варьировать промежутки времени между посылками. Атака носит вероятностный характер, и, чтобы добиться проявления ошибки синхронизации, необходимо послать достаточно большое количество пакетов через определенные промежутки времени, обусловленные конструктивными особенностями драйвера и «железки», которой он управляет. На некоторых промежутках ошибка синхронизации может вообще не проявляться, а на некоторых – возникать после нескольких пакетов (ну, «нескольких» – это в идеале). Можно посылать как UDP, так и ICMP-пакеты, направленные как на открытый, так и на закрытый порт. Также подходят и TCP-пакеты без установки сессии (пакет с флагом ASK, направленный на закрытый порт), но в этом случае потребуется «ручное» конструирование пакетов с использованием «сырых» (raw) сокетов. Некоторые ошибки синхронизации проявляют себя на всем «спектре», некоторые – только на эхо-запросах. И хотя выше мы говорили о фреймах, а теперь неожиданно перешли на пакеты, никакого противоречия здесь нет,

55


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

Рисунок 2. Для анализа причин аварии необходим полный дамп памяти

равно как нет и необходимости опускаться на уровень фреймов, поскольку UDP/ICMP-пакеты автоматически «разрезаются» на фреймы при передаче. Атаки данного типа основаны отнюдь не на специфике самих фреймов, а лишь на временных промежутках между ними. Мы не можем непосредственно влиять на частоту следования фреймов, но зато можем легко варьировать задержки между посылками UDP/ICMP-пакетов. Конечная цель атаки – прервать сборку пакета из фреймов в «неудобном» (для драйвера) месте, оставив разделяемые структуры данных в недостроенном состоянии. Поскольку это место определяется конструктивными особенностями программно-аппаратного обеспе-

чения, используемого жертвой, то никаких четких рецептов здесь нет. Перед началом экспериментов необходимо настроить систему на сохранение полного дампа памяти в случае аварии («Панель управления → Система → Дополнительно → Загрузка и восстановление → Запись отладочной информации → Полный дамп памяти) или установить отладчик soft-ice, перехватывающий «голубые экраны смерти». В случае возникновения ошибки это поможет понять, что же, собственно, произошло и какие перспективы в плане выполнения shellкода оно дает. Главное – не забывать, что ошибки синхронизации носят вероятностный характер, и потому обрушения могут происходить в различных местах, одни из которых допускают передачу на shell-код, а другие – нет. В качестве иллюстрации можно привести пару дампов памяти, полученных Johnny Cache: http:// www.802.11mercenary.net/~johnycsh/ prone_to_deletion/dd/crash2.zip и http:// www.802.11mercenary.net/~johnycsh/ prone_to_deletion/dd/crash3.zip. Объектом атаки выступил драйвер беспроводного устройства Intel Centrino PRO, которому посылались UDP-пакеты размером в 1400 байт, заполненных CChбайтами, и посылаемые на 2048-порт (прослушиваемый утилитой netcat) с интервалом в 400 микросекунд.

Рисунок 3. Анализ дампа памяти в отладчике Microsoft WinDbg

56

Через непродолжительное время после начала атаки операционная система (которой в данном случае являлась Windows XP) выбрасывает «голубой экран» и сохраняет дамп памяти в файл memory.dmp. Д ля его ана лиза необходимо иметь отладчик Microsoft Kernel Debugger, входящий как в распространяемый по подписке DDK, так и в доступный для бесплатного скачивания Microsoft Debugging Tools: http:// www.microsoft.com /whdc /devtools / debugging/default.mspx. Загрузка дампа в отладчик в общем случае осуществляется так: Листинг 1. Командная строка для загрузки дампа в отладчик i386kd -z C:\WINNT\memory.dmp ↵ y SRV*D:\sym* ↵ http://msdl.microsoft.com/ ↵ download/symbols

Здесь:

 i386kd – имя исполняемого файла консольной версии отладчика, если вы предпочитаете GUI – используйте вместо него windbg. Он нагляднее, но беднее по функциональности, однако для наших задач вполне хватит и его.  C:\WINNT \ memory.dmp – пу ть к файлу памяти, по умолчанию создаваемом в системном каталоге Windows.  SRV*D:\sym*http://msdl.microsoft. com/download/symbols – путь к каталогу, в котором хранятся файлы с символьной информацией (в данном случае – D:\sym) и адрес сервера Microsoft, откуда отладчик будет автоматически скачивать эти символы при необходимости. Символьные файлы занимают значительный объем, и на медленных каналах их загрузка может занять значительное время. По умолчанию загружаются только символы ядра, после чего отладчик высвечивает приглашение и мерцающий курсор. Если теперь дать команду «u eip» (дизассемблирование по адресу EIP), то отладчик покажет отнюдь не истинное место сбоя, а процедуру обработки ошибки (в данном случае, KiTrap0E+0x233), которая не несет никакой полезной информации:


безопасность Листинг 2. В загруженном дампе памяти регистр EIP указывает не на место сбоя, а на адрес, лежащий внутри обработчика исключения kd> u eip nt!KiTrap0E+0x233: 804e187f f7457000000200 804e1886 740d

test jz

dword ptr [ebp+0x70],0x20000 nt!KiTrap0E+0x249 (804e1895)

Определить значение регистра EIP в момент сбоя позволяет команда «!analyze -v», результат работы которой приведен ниже: Листинг 3. Анализ дампа памяти, вызвавшего BSOD, но не оказавшего воздействия на регистр EIP kd> !analyze -v DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1) Arguments: Arg1: 6e3c2081, memory referenced Arg2: 00000002, IRQL Arg3: 00000000, value 0 = read operation, 1 = write operation Arg4: f7433678, address which referenced memory Debugging Details: -----------------READ_ADDRESS: 6e3c2081 CURRENT_IRQL: 2 FAULTING_IP: w22n51+24678 f7433678 8a11

mov

dl,[ecx]

ds:0023:6e3c2081=??

STACK_TEXT: 8054e9e0 65537365 2f3c746e 656d616e 200a0d3e w22n51+0x24678 7479426c 00000000 00000000 00000000 00000000 0x65537365 IMAGE_NAME: w22n51.sys

Остается только выяснить как попадает в регистр ECX неправильный указатель и можно ли на него повлиять. Даем команду «u f7433678-10», чтобы дизассемблировать за 10h байт до места сбоя и смотрим: Листинг 4. Окрестности команды, вызывавшей «голубой экран смерти» из-за ошибки синхронизации kd>u f7433678-10 f7433668 0fb745f0 movzx f743366c 83f801 cmp f743366f 0f8e25240000 f7433675 8b4df4 mov ; здесь произошел сбой f7433678 8a11 f743367a 8855ea mov f743367d 8b45f4 mov f7433680 8a4801 mov f7433683 884dff mov f7433686 8b55f4 mov f7433689 83c202 add

eax,word ptr [ebp-0x10] eax,0x1 jle w22n51+0x26a9a (f7435a9a) ecx,[ebp-0xc] mov dl,[ecx] [ebp-0x16],dl eax,[ebp-0xc] cl,[eax+0x1] [ebp-0x1],cl edx,[ebp-0xc] edx,0x2

Мы видим, что содержимое ECX загружается из локальной переменной [EBP-0Ch]. Вне зависимости от того, как оно туда попадает, драйвер копирует один байт из [EBP-0Ch] в [EBP16h]. Обе переменных находятся в стеке, что уже хорошо (атаки на стек хорошо известны и давно отработаны). Допустим, нам удалось засунуть в [EBP-0Ch] указатель на определенную ячейку памяти, тогда, если мы сможем подменить [EBP-16h], данная конструкция будет действовать как оператор POKE языка Бейсик, записывающая произвольный байт по произвольному адресу, конечно, при условии, что он лежит в невытесненной на диск странице памяти, доступной на запись, например, стеке ядра, в котором хранится адрес возврата из функции. К сожалению, модификации одного-единственного байта для передачи управления на shell-код (размещенный здесь же, в стеке, в котором происходит сборка пакетов) явно недостаточно, но не будем отчаиваться! Ведь атака, как мы помним, носит вероятностный характер, и сбои

О чем это говорит? Во-первых, мы видим, что ошибка произошла на уровне IRQL, равном 2, что соответствует DISPATCH_LEVEL, на котором выполняются отложенные процедуры. Если бы сбой происходил в обработчике прерывания, то уровень IRQL был бы выше, но в большинстве случаев обработчик прерывания не выполняет реальной обработки данных, а поручает это отложенным процедурам, которые вынуждены работать с разделяемыми данными и которые могут одновременно выполняться на нескольких процессорах (как физических, так и виртуальных). Именно в отложенных процедурах сосредоточено наибольшее количество ошибок синхронизации. В результате одной из таких ошибок драйвер и пытается прочесть ячейку 6E3C2081h, находящуюся в странице памяти, вытесненной на диск (как уже говорилось, на уровне DISPATCH_LEVEL подкачка не работает). В момент сбоя регистр EIP равен F7433678h и указывает на машинную команду «mov dl, [ecx]», где ecx = = 6E3C2081h, принадлежащую драйверу (IMAGE_ NAME) w22n51.sys, щелкнув на свойства которого можно узнать, что это и есть тот самый дырявый драйвер, разраРисунок 4. Анализ дампа памяти в отладчике Microsoft i386kd ботанный Intel.

№11, ноябрь 2006

57


безопасность могут происходить в разных местах. Попробуем направить на жертву шторм пакетов еще раз, может быть, тогда нам повезет больше. Ниже приведен анализ дампа памяти, в котором помимо разрушения памяти произошло воздействие на регистр EIP: Листинг 5. Анализ дампа памяти, оказавшего воздействие на регистр EIP kd> !analyze -v DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1) Arguments: Arg1: 5c01abf7, memory referenced Arg2: 00000002, IRQL Arg3: 00000001, value 0 = read operation, 1 = write operation Arg4: cccccccf, address which referenced memory Debugging Details: -----------------WRITE_ADDRESS: 5c01abf7 CURRENT_IRQL: 2 FAULTING_IP: +ffffffffcccccccf cccccccf 01963b10ffd6

add [esi+0xd6ff103b],edx

LAST_CONTROL_TRANSFER: from ff103b96 to cccccccf STACK_TEXT: cccccccc ff103b96 01c486d6 00000000 00000000 0xcccccccf 01c486d6 00000000 00000000 00000000 00000000 0xff103b96

Уровень IRQL осталось прежним (DISPATCH_LEVEL), а вот значение регистра EIP изменилось драматически и вылетело далеко за пределы драйвера, попав в страницу с адресом CCCCCCCFh, каким-то чудом оказавшуюся в памяти и вызвавшую исключение по записи в инструкции «ADD [ESI+0XD6FF103B],EDX». Адрес CCCCCCCFh поразительно похож на «начинку» атакующих пакетов, но если это так, откуда тогда взялось число CFh? Ведь исходя из самых общих рассуждений, исключение должно было возникнуть по адресу CCCCCCCCh! Но, как говорится, если факты не совпадают с теорией, тем хуже для фактов. С какой это стати исключение должно возникать по адресу CCCCCCCCh? Это было бы так, если бы страница оказалась вытесненной на диск, но по воле случая она очутилась в оперативной памяти. Выполнение команд началось с адреса CCCCCCCCh и продолжилось вплоть до инструкции, вызывавшей исключение, которой и оказалась команда «add [esi+0xd6ff103b], edx», обратившаяся к ячейке 5C01ABF7h, отсутствующей в оперативной памяти. Если бы не она, выполнение продолжалось бы и дальше! Как это можно доказать? Хм, имея один лишь дамп памяти на руках, ничего доказать уже нельзя, но! Если наши рассуждения верны (а они верны), то команды, находящиеся между адресами CCCCCCCCh и CCCCCCCFh, должны выполняться без исключений, что легко подтвердить путем дизассемблирования. «Скармливаем» отладчику команду «u CCCCCCCC» и получаем следующий результат: Листинг 6. Дизассемблерный листинг окрестностей места сбоя kb>u cccccccc

58

cccccccc d6 Carry Flag cccccccd 86c4 cccccccf 01963b10ffd6 [esi+0xd6ff103b],edx ccccccd5 86c4 ccccccd7 0100 ccccccd9 0000 ccccccdb 0000 ccccccdd 0000

??? ; setalc Set AL to xchg add

ah,al

xchg add add add add

ah,al [eax],eax [eax],al [eax],al [eax],al

Непосредственно по адресу CCCCCCCCh располагается неизвестная отладчику i386kd недокументированная команда SETALC (Set AL to Carry Flag), с машиным кодом D6h (но, например, тот же HIEW ее прекрасно понимает), а следом за ней – XCHG AH,AL. Обе команды не обращаются к оперативной памяти и при любом раскладе выполняются без исключений. А вот команда «ADD [ESI+0xD6FF103B], EDX», расположенная по адресу CCCCCCCFh, обращается к ячейке памяти, определяемой регистром ESI, который в данном случае оказался равен 7AFD6444h, в результате чего произошла попытка записи двойного слова по адресу 5C01ABF7h, расположенному (опять-таки волею случая) в вытесненной странице памяти, следствием чего стало исключение, которое и вызвало голубой экран смерти. Таким образом, использование ошибок синхронизации для воздействия на регистр EIP все-таки возможно! Shell-код можно разместить прямо в пакете и при удачном стечении обстоятельств на него будет передано управление. При неудачном – жертва окажется свидетелем «голубого экрана смерти». Остается только выяснить, какое именно двойное слово попадет в регистр EIP при удачной атаке. Это сложно определить путем анализа дампа памяти, так что лучше действовать экспериментально, заполняя разные части пакета различными байтами. Легко показать, что, действуя методом «вилки», мы найдем нужное значение менее чем за 30 попыток. Однако следует помнить, что в силу вероятностного характера атаки в регистр EIP могут попадать различные двойные слова, в результате чего количество необходимых попыток возрастет в несколько раз, но все равно останется сравнительно небольшим.

Механизмы защиты от синхро-атак В Windows Vista компания Microsoft реализовала множество защитных механизмов, главным образом нацеленных на переполняющиеся буферы, но также затрудняющих и другие типы атак. Представляет интерес выяснить, как обстоит дело с атаками, основанными на ошибках синхронизации. Все сказанное ниже относится к Windows Vista RC1 – самой свежей версии на момент написания этих строк. Конечно, с выходом финальной версии (и многочисленных заплаток к ней) многие аспекты наверняка изменятся (в сторону усиления защиты), однако никому не дано предугадать, какой путь выберет Microsoft, поэтому будем изучать то, что дают (в смысле, что она раздает). Самой значительной инновацией стала возможность переноса части драйверов с нулевого кольца на прикладной уровень. Новая драйверная модель, названная «User


безопасность Mode Driver Framework» и являющаяся частью общей архитектуры драйверов «Windows Driver Foundation» впервые за всю историю существования Windows, наконец-то предоставила набор API-функций, позволяющих управлять USB и Firewire-устройствами непосредственно с прикладного уровня. То же самое относится и к драйверамфильтрам. Для обеспечения обратной совместимости User Mode Driver Framework также доступен и для Windows XP, что позволяет разработчикам писать драйверы, работающие в обеих операционных системах. Весь вопрос в том, какой процент из них этим воспользуется и как скоро начнется массовая миграция драйверов на прикладной уровень. Системные программисты крайне настороженно относятся к любым инновациям и не станут переписывать уже написанный код до тех пор, пока не почувствуют явной выгоды. Поскольку безопасность драйвера не является основной потребительской характеристикой, есть все основания предполагать, что в ближайшие несколько лет никаких радикальных изменений не произойдет. А вот драйверы для новых устройств, по-видимому, будут писать с использованием User Mode Driver Framework уже хотя бы потому, что это значительно упрощает их отладку. И что тогда? Ошибки синхронизации как были, так и останутся, только вместо нулевого кольца злоумышленник получает привилегии прикладного режима. Казалось бы – невелика разница! К тому же программировать shell-код на прикладном режиме намного проще, поскольку можно использовать высокоуровневые API-функции. На самом деле реализовать атаку на User-Mode драйверы на два порядка сложнее! (Во всяком случае теоретически). Все дело в том, что в Windows Vista появилась рандомизация адресного пространства (Address Space Layout Randomization, или сокращенно ASLR), и системные библиотеки теперь грузятся по одному из 256 возможных базовых адресов, а для обхода аппаратного DEP (см. статью «Cудьба shell-кода на системах с неисполняемым стеком» [2])

№11, ноябрь 2006

необходимо знать адреса API-функций KERNEL32.DLL еще до начала атаки! Очевидно, что теперь вероятность успешного захвата системы в 256 раз ниже, чем раньше! Но не нужно быть специалистом в криптографии, чтобы понять, что 1/256 – это очень большое число, тем более что при возникновении исключения в ядре вспыхивает «голубой экран смерти», уводящий систему в перезагрузку, а драйверы прикладного режима просто перезапускаются, позволяя хакеру перебирать различные базовые адреса Рисунок 5. Процессор AMD Athlon 64 с поддержкой технологии аппаратной KERNEL32.DLL без останова систевиртуализации Pacifica мы. Следовательно, реальные шансы на успешную атаку не только не снизились, но даже возросли, причем весьма значительно. Ситуация напоминает картину: вытащили голову – хвост увяз. Но все-таки вернемся к ядру, в коРисунок 6. Выполнение команды VMXON тором нам еще предстоит провести нена Intel Pentium приводит к установке монитора виртуальных машин сколько лет. Хорошая новость (для ха(в терминологии AMD – гипервизора), керов) – в Windows Vista появилось переводящего операционную систему в «гостевой» режим, полностью множество новых native-API-функций, контролируемый гипервизором существенно упрощающих процесс кодирования rootkit. В частности, по- Silvervale для IA32/IA64-архитектур явилась функция NtCreateUserProcess, соответственно), хакеры открыли для запускающая новый процесс на вы- себя возможность перехода в режим полнение. До этого процессы (из яд- гипервизора, переводящий операра!) приходилось запускать приблизи- ционную систему в гостевой режим тельно так: открываем PE-файл с фла- и не дающий себя обнаружить нигами SYNCHRONIZE и FILE_EXECUTE, какими средствами. О большем посоз даем новую секцию вызовом дарке разработчики rootkit не могли ZwCreateSection(,,,SEC_IMAGE), со- и мечтать! Первый rootkit нового поздаем процесс (вернее, не сам про- коления (названный «Голубой Пилюцесс, а некоторую «заготовку») че- лей» – Blue Pill) был продемонстрирез ZwCreateProcess, инициализиру- рован Жанной Рутковской (Joanna ем блок параметров процесса фун- Rutkowska) на конференциях SyScan кцией RtlCreateProcessParameters, (Сингапур) и Black Hat (США, Лас-Вевыделяем в процессе память, под- гас), состоявшихся 21 июля и 3 авгусготавливаем блок параметров и ус- та 2006 года соответственно. Она же т а н а в л и в ае м н а н е го у к а з ател ь разработала методику скрытой пеPeb->ProcessParameters, выделяем редачи трафика, который невозможпамять для стека и инициализируем но обнаружить никакими существуконтекст стартового потока процес- ющими средствами контроля. Текст са, после чего создаем сам поток вы- презентации (вместе с исходными зовом ZwCreateThread. Наконец ре- кодами некоторых хакерских утилит гистрируем процесс в клиент-сервер- и демонстрационными avi-роликами) ной подсистеме win32 (CSRSS), после можно найти на сайте Жанны: http:// чего пытаемся понять, где мы допус- www.invisiblethings.org. Попытки разработать «Красную тили ошибку и почему процесс не заПилюлю», определяющую присутствие пускается. Другая хорошая новость – с по- гипервизора, пока ни к чему не приявлением в процессорах поддержки вели. Единственное, что можно сдеаппаратной виртуализации (у AMD лать – отключить аппаратную виртуаона скрывается за кодовым назва- лизацию в BIOS (если BIOS это позвонием Pacifica, у Intel это – Vanderpool/ ляет), но это сделает невозможным эф-

59


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

Рисунок 7. Статья, описывающая различные пути обхода механизма Patch-Guard, следящего за целостностью ядра и позволяющего его модифицировать

фективную эмуляцию процессора, ра- а продукты сторонних разработчиков ди которой аппаратная виртуализация работать не смогут. И хотя Microsoft и затевалась. предоставила ряд API-функций для Третья хороша я новос ть и не контроля за открываемыми файлапросто хорошая, а даже сногсши- ми и сетевым трафиком – такую «забательная: в 64-битной редакции щиту» очень легко обойти. Одно приWindows Vista появился механизм, ложение (антивирус) устанавливает контролирующий целостность яд- фильтр, другое (вирус) снимает его ра и названный Patch-Guard, также легальными средствами, и антивирус реализованный в пакетах обновле- никак не может этому воспрепятствония для XP 64-bit и Server 2003 64-bit вать (в лучшем случае он просто уз(http://www.microsoft.com/whdc/driver/ нает, что фильтр снят). Самое забавkernel/64bitpatching.mspx). ное, что Patch-Guard очень легко «отОтныне запрещается перехваты- ломать», о чем подробно рассказавать ядерные функции, модифици- но в статье «Bypassing PatchGuard on ровать таблицу дескрипторов пре- Windows x64» (http://uninformed.org/ рываний и совершать другие «про- index.cgi?v=3&a=3&t=sumry), но летивоправные» действия, без кото- гальные разработчики не могут польрых существование надежных анти- зоваться подобными хакерскими вирусов и персональных брандмау- средствами! Им придется либо заброэров невозможно себе представить! сить свой бизнес, либо сменить ориПредлогом для этого шага послужи- ентацию (например, ограничиться авла небрежность большинства ком- тономным файл-сканером). Но как бы там ни было, хакеры намерческих и некоммерческих продуктов, неумело модифицирующих ядро ходятся в более выигрышном положеи вызывающих нестабильную рабо- нии, чем все остальные. Остается тольту системы, вплоть до невозможнос- ко надеяться, что 64-битные процессоти загрузки или частых появлений ры никогда не займут господствующеBSOD. Ну а пользователи, как обыч- го положения, и основной архитектуно, во всем винят Microsoft и ее «кри- рой останется IA32. вую» Windows. На самом деле Microsoft просто Заключение вытесняет игроков с рынка, протал- Защитные механизмы на несколько кивая свои собственные и далеко не шагов отстают от передовой хакерсамые лучшие решения. Но даже ес- ской мысли, и хотя время от времели бы они были лучшими – что с то- ни этот разрыв сокращается, «догго? Задача обхода произвольного ан- нать и перегнать» получается тольтивируса/брандмауэра в общем слу- ко на бумаге, а в реальной жизни хачае неразрешима, а тащить за собой керы продолжают процветать. Прикучу специализированных решений – чем эта проблема касается не тольслишком сложно, громоздко и неэф- ко Microsoft, но и остальных произфективно. Теперь же этого не понадо- водителей программного обеспечебится, поскольку антивирус и бранд- ния. Ведь драйвера для сетевых устмауэр будут интегрированы в ядро, ройств совсем не Microsoft пишет! А в

60

Intel и Toshiba вовсе не дураки сидят. Почему же мы имеем такую плачевную ситуацию? Одна из причин – бешеная «гонка вооружений». Всякая фирма стремится выбросить свой продукт первой. Сжатые временные рамки не позволяют как следует протестировать код, и если разработчикам удается довести его до минимально рабочего состояния (запускается и не падает), это уже хорошо. До тех пор, пока безопасность не войдет в ряды потребительских критериев, определяющих объемы продаж, никто не станет ею всерьез заниматься. Microsoft привлекла большое количество хакеров для тестирования Windows Vista, но чего она добилась при этом?! Пожалуй, ничего (за исключением рекламы). Трудно поверить, что хакеры пропустили такие вопиющие дефекты системы безопасности, о которых написано выше (что же за хакеры это были?!). Скорее всего, им не позволили воздействовать на концептуальные архитектурные решения, принятые «свыше». Microsoft не занимается безопасностью Windows (только разводит «пиар»), и не будет ею заниматься, точно так же, как не будет исправлять старые ошибки без добавления новых, потому что «работа над ошибками» требует вложения огромных денег, но не приносит никакого дохода. Поэтому в ближайшие несколько лет следует ожидать новой волны хакерских атак, от которых можно защититься только переходом на надежные операционные системы, например, OpenBSD, но, увы, это решение подходит только для серверов. Создание офисных рабочих станций на чем-то, отличном от Windows, создает гораздо больше проблем, чем их решает, не говоря уже о домашних компьютерах, являющиеся по совместительству игровыми приставками. 1. Касперски К. Многоядерные процессоры и проблемы, ими порождаемые, в ОС семейства NT. //Системный администратор, №10, 2006 г. – С. 78-84. 2. Касперски К. Cудьба shell-кода на системах с неисполняемым стеком. //Системный администратор, №1, 2006 г. – С. 66-74.


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

Kerberos и электронная почта

Михаил Кондрин Предлагаем вам способ интеграции SMTP-сервера Postfix и IMAP/POP3-сервера Сyrus-IMAP в систему единой регистрации пользователей Heimdal Kerberos. А также пример использования этой системы в гетерогенном окружении при помощи почтового клиента Thunderbird.

Электронная почта – Postfix и Cyrus-IMAP В сети существует достаточно много информации об установке и тонкой настройке этих двух программ. Я не ставлю себе целью осветить все детали конфигурации, к примеру, их взаимодействие с программами контроля спама и антивирусами, «виртуализации» пользователей и почтовых ящиков, настройки почтового транспорта и т. д. Будет рассмотрена минимальная конфигурация, которая позволяет аутентифицировать пользователей для работы с электронной почтой с помощью Kerberos, причем чем меньше потребуется изменений в стандартные конфигурационные файлы, прилагаемые к этим программам, тем с точки зрения данной статьи лучше. Итак, напомню задачу. Требуется настроить IMAP/SMTP-сервер таким образом, чтобы зарегистрированный в секторе Kerberos пользова-

62

тель мог получать/отправлять свою дящегося в одном домене, через серпочту без дополнительной регистра- вер, находящийся в другом, для полуции в секторе Kerberos, только на ос- чателя в третьем, чем в недавнем проновании действительного супербиле- шлом активно пользовались спамеры та, полученного им ранее. Либо в том (так называемый open-relay). Практислучае, если почтовый клиент не мо- чески все современные SMTP-сервежет обеспечить такой функциональ- ры тем или иным способом запрещаности, пароль, вводимый пользовате- ют такую пересылку почты, по умоллем, сверялся бы с базой данных паро- чанию разрешая передачу сообщелей, хранимых в Kerberos. Последний ний только от определенного множесвариант обеспечивает совместимость тва отправителей или только получасо старыми или недостаточно функци- телю из заранее описанного множесональными почтовыми клиентами. тва доменов. Для большинства почтоАутентификация пользователя для вых сетей такая установка достаточпротокола IMAP нужна, хотя бы для то- на, и проблемы возникают только тогго, чтобы каждый пользователь мог да, когда требуется обеспечить перечитать только свои письма и не имел сылку почты от мобильных пользовавозможности заглядывать в чужие телей, находящихся вне сети. Запреты/ ящики. В то же время аутентифика- разрешения, основанные на адресе отция для SMTP не столь обязательна правителя, небезопасны сами по себе и является только средством защи- (помним про IP-spoofing) и, более того, ты от несанкционированной рассылки не всегда применимы, поскольку адрес почты. Протокол SMTP разрешает пе- может меняться динамически и вполне редачу почты от пользователя, нахо- легальный пользователь перемещать-


безопасность ся из одной сети в другую. В таком случае идеальным решением было бы дать возможность пользователю аутентифицироваться на SMTP-сервере с помощью своего логина и пароля. Принцип построения почтовой системы достаточно прост – поскольку у нас уже есть библиотека SASL с поддержкой Kerberos, нужно только встроить поддержку SASL в почтовые сервисы, указать поддерживаемые ими механизмы SASL и зарегистрировать эти сервисы в секторе Kerberos. В дальнейшем нужно будет только выбрать подходящих клиентов, которые максимально прозрачно для пользователя будут взаимодействовать с почтовыми сервисами и Kerberos. Начнем с Postfix. Скачиваем последнюю версию с домашней страницы проекта [1] и собираем: $ $ $ $

tar xzvf postfix-2.2.8.tar.gz cd postfix-2.2. make tidy make makefiles -i Makefile.in "CCARGS=-DUSE_SASL_AUTH ↵ -I/usr/include/sasl" ↵ 'AUXLIBS=-L/usr/lib -R/usr/lib -lsasl2' $ make $ make update $ ./postfix-install -non-interactive

Сервер Cyrus-IMAP также разрабатывается в Университете Карнеги-Меллон и доступен по тому же адресу, что и Cyrus-SASL [2]. Несмотря на его название, помимо IMAP, он поддерживает также протоколы POP3 и NNTP. Но я ограничусь только протоколом IMAP. При конфигурировании Cyrus-IMAP достаточно только указать поддержку SASL: $ tar xzvf cyrus-imapd-2.3.1.tar.gz $ cd cyrus-imapd-2.3.1 $ ./configure --prefix=/usr --sysconfdir=/etc ↵ --localstatedir=/var --disable-static ↵ --with-cyrus-prefix=/usr/cyrus --with-sasl ↵ --enable-gssapi=no $ make $ make install

Архитектуры Postfix и Cyrus-IMAP в чём-то схожи. В обеих программах центральным звеном является демон, задача которого состоит в прослушивании портов и именованных сокетов. При подключении клиента демон вызывает обработчик, который уже осуществляет обмен данными по выбранному протоколу. Центральный демон, который в обоих случаях называется master, по своим функциям работает как супер-демон inetd, поэтому Postfix и Cyrus-IMAP можно использовать только как standalone сервисы. При установке программ также устанавливаются шаблонные файлы настроек демонов master: для Postfix – /etc/postfix/master.cf, а для Cyrus на выбор предлагается три файла, один из которых нужно скопировать в /etc/cyrus.conf. Для наших целей подойдёт самый простой из них – cyrus-imapd-2.3.1/master/small.conf. Вносить изменения в эти файлы приходится крайне редко, в основном настройка функциональности сервисов производится с помощью редактирования /etc/postfix/main.cf (для Postfix) и /etc/imapd.conf (для Сyrus). Начнём с настройки Postfix. Лучше всего начать с редактирования файла /etc/postfix/main.cf.default. Изменений немного: queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix sendmail_path = /usr/sbin/sendmail newaliases_path = /usr/bin/newaliases mailq_path = /usr/bin/mailq alias_maps=hash:$config_directory/aliases alias_database=hash:$config_directory/aliases local_recipient_maps= qmail_owner = postfix setgid_group = postdrop myhostname = kdc.myrealm.ru mydomain = myrealm.ru myorigin = $mydomain mydestination = $mydomain, $myhostname, localhost inet_interfaces = all mynetworks_style = subnet

mailbox_transport = lmtp:unix:/var/imap/socket/lmtp С помощью опции --enable-gssapi=no непосредственная линковка с библиотеками Kerberos отключается. Одsmtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = MYREALM.RU нако на конечном результате это скажется незначительbroken_sasl_auth_clients = yes но, поскольку эта опция отменяет только сборку сервеsmtpd_recipient_restrictions = permit_sasl_authenticated, ра kpop – специального протокола доставки почты, разраreject_unauth_destination ботанного в MIT. Этот протокол существенно отличается Существенные изменения – имя машины и домена oт POP3 (не следует думать, что это просто POP3 с подде(myhostname и mydomain) и что именно Postfix будет считать ржкой Kerberos) и мало распространен. Теперь можно приступать к настройке программ. Прежде локальной сетью (myorigin, mydestination, mynetworks_style). всего следует иметь в виду, что Postfix и Cyrus-IMAP требу- Mailbox_transport определяет способ передачи полученных ют наличия специальных системных пользователей и групп писем пользователю, в данном случае по протоколу LMTP для работы. Хотя они и создаются в процессе установки про- через именованный сокет, который создаёт Cyrus-IMAP грамм, но стоит лишний раз убедиться, что в /etc/passwd при запуске. С помощью smtpd_sasl_auth_enable вклюи /etc/group имеются строки вида: чается использование SASL для аутентификации пользователей. Последовательность правил, указанная # getent passwd | grep “^\(postfix\|cyrus\)” в smtpd_recipient_restrictions, позволяет принимать почту без ограничений от авторизованных пользователей postfix:x:12345:12345:The postfix MTA:/var/spool/postfix:/bin/false cyrus:x:12365:13:Cyrus Imap Server:/:/bin/false (permit_sasl_authenticated) и запрещает релейную пересылку почты незарегистрированным пользователям # getent group | grep “^\(mail\|postdrop\)” (reject_unauth_destination). Таким образом, для приёма mail::12:mail почты с локальных адресов (тех, что попадают в категоpostdrop:x:12346: рию mydestination) аутентификации не требуется. Пара-

№11, ноябрь 2006

63


безопасность метр же smtpd_sasl_local_domain – это просто имя секто- буется, чтобы принципал cyradmin присутствовал в сектора Kerberos. ре Kerberos, и при этом администратор не должен иметь Но это ещё не всё. Как вы помните, взаимодействие свой собственный почтовый ящик, иначе говоря, в систес SASL можно настраивать для каждого приложения ин- ме не должно быть такого бюджета, это позволяет избедивидуально с помощью конфигурационного файла жать проблем с его управлением в будущем. Физически /usr/lib/sasl2/<имя приложения>.conf. Для Postfix имя при- почтовый ящик пользователя – это каталог в директории ложения «smtpd», поэтому нам нужен файл /usr/lib/sasl2/ /var/spool/imap/user. При отображении в почтовом клиенте smtpd.conf. Его содержание ничем не отличается от уже со- структура папок воспроизводит структуру этого каталога, зданного ранее файла sample.conf, так что можно просто что не всегда удобно. Параметр altnamespace приводит почсоздать символическую ссылку. товый ящик к более привычному «плоскому» виду: c корневой папкой INBOX и всеми подкаталогами, приведенны# cat /usr/lib/sasl2/smtpd.conf ми к одному уровню. В отличие от Postfix настройка взаимодействия с SASL не требует специального файла в катаpwcheck_method:saslauthd mech_list:gssapi plain логе /usr/lib/sasl2, а все параметры SASL определяются непосредственно в файле /etc/imapd.conf. В данном случае наПроверку адресатов получаемых писем мы делать не бу- стройка аналогична Postfix – добавилась только приставка дем (параметр local_recipient_maps не определён), все по- sasl. После этого можно запустить Cyrus-IMAP: лученные письма передаются Cyrus-IMAP без предвари$ /usr/cyrus/bin/master & тельного разбора. Тем не менее нужно создать базу с основными псевдонимами (в основном техническими, например, postmaster) с помощью команды: и проверить, что в /var/log/syslog не сыпятся сообщения об ошибках. $ postalias /etc/postfix/aliases Перед тем как приступить к созданию почтовых ящиков, займёмся заселением базы Kerberos. Как уже говорилось, нам нужно добавить принципала cyradmin и двух принципосле чего posfix готов к работе: палов, соответствующих сервисам IMAP и SMTP. Для этого, $ /usr/sbin/postfix start как обычно, нужно зарегистрироваться в системе как root, аутентифицироваться в секторе Kerberos как администраПроверьте по /var/log/maillog, что Postfix успешно стар- тор Kerberos и с помощью программы kadmin внести изметовал. нения в базу данных Kerberos. Для Сyrus-IMAP вначале нужно создать его рабочую # kinit admin/admin директорию и дерево каталогов для хранения почтовых # kadmin ящиков пользователей. Для этого можно воспользовать>add cyradmin >add --random-key imap/kdc.myrealm.ru ся скриптом: $ $ $ $ $ $

mkdir chown chmod mkdir chown chmod

–p /var/imap/{proc,db,log,msg,socket,ptclient} -R cyrus.mail /var/imap -R 755 /var/imap –p /var/spool/imap cyrus.mail /var/spool/imap 750 /var/spool/imap

Обратите внимание на права доступа к созданным директориям. Для передачи почты через сокет /var/imap/socket/lmtp, Postfix, работающему под совсем другим пользователем, чем Cyrus-IMAP, необходимо иметь права на чтение и запуск программ в этой директории. Настройка Cyrus-IMAP, как уже говорилось, осуществляется с помощью двух конфигурационных файлов. Предполагается, что файл настроек демона master (/etc/cyrus.conf) уже скопирован. Для настройки взаимодействия по протоколу IMAP используется файл /etc/imapd.conf: configdirectory: /var/imap partition-default: /var/spool/imap admins: cyradmin altnamespace: yes sasl_pwcheck_method: saslauthd sasl_mech_list: gssapi plain

В первых двух строчках определяются рабочие директории Cyrus-IMAP (выше мы их уже создали). Администратором почтовых ящиков назначается cyradmin. Причем тре-

64

>add --random-key smtp/kdc.myrealm.ru >ext imap/kdc.myrealm.ru >ext smtp/kdc.myrealm.ru

Для сервисов, как обычно, пароли выбираются случайным образом. С помощью команды ext их пароли извлекаются из базы данных Kerberos и записываются в файл /etc/krb5.keytab. Поскольку этот файл содержит пароли в незашифрованном виде, то права на его чтение следует ограничить. Вместе с тем сервисы, в том числе Postfix и Cyrus-IMAP, работающие под непривилегированными пользователями, должны уметь извлекать свои пароли из этого файла. Для этого самым простым решением будет открыть keytab-файл на чтение выделенной группе, в которую нужно будет включить root, postfix и cyrus. То есть в файл /etc/group нужно добавить строку вида: kerberos::1000:root,postfix,cyrus

а затем поменять владельца и права доступа к keytabфайлу: # chown root.kerberos /etc/krb5.keytab # chmod 640 /etc/krb5.keytab

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


безопасность пособна аутентификация в Cyrus-IMAP через SASL. Нужно аутентифицироваться с помощью kinit в секторе Kerberos как cyradmin и вызвать утилиту cyradm: $ cyradm kdc.myrealm.ru kdc.myrealm.ru> cm user.mike kdc.myrealm.ru> setquota user.mike 10000

Таким образом, создан ящик ёмкостью 10 Мб для пользователя mike. В этом примере для аутентификации cyradm воспользовался супербилетом принципала cyradmin. Также можно аутентифицироваться с помощью текстового пароля, но для этого нужно убедиться, что демон saslauthd запущен, и указать в командной строке cyradm имя администратора Cyrus-IMAP и ключ -p для интерактивного ввода пароля: $ cyradm -u cyradmin -p kdc.myrealm.ru ...

После этого наша тестовая почтовая система готова к работе! В итоге команда «ps -aux» должна показать наличие двух процессов master (один для postfix, а другой для cyrus) и ещё несколько процессов saslauthd. После чего можно проверить работоспособность системы с помощью программ smtptest и imtest. Эти программы входят в состав дистрибутива Cyrus-IMAP (каталог imtest). Если они по какимто причинам не скомпилировались при сборке программ, то можно сделать это сейчас, выполнив «make» в соответствующем каталоге. Обе программы чем-то напоминают обычный telnet, позволяя подключаться к определённому порту и вводить команды, специфические для выбранного протокола в командной строке. Их отличие от telnet только в том, что они выполняют аутентификацию автоматически при запуске, тем самым избавляя вас от необходимости вручную приводить сертификаты к 7-битной форме. Попробуем с их помощью отправить письмо самому себе и затем прочитать его. Вначале, разумеется, нужно зарегистрироваться в системе и в Kerberos как обычный пользователь. $ kinit mike $ smtptest -m PLAIN -u mike kdc.myrealm.ru S: 220 kdc.myrealm.ru ESMTP Postfix C: EHLO example.com S: 250-kdc.myrealm.ru S: 250-PIPELINING S: 250-SIZE 10240000 S: 250-VRFY S: 250-ETRN S: 250-AUTH GSSAPI PLAIN S: 250-AUTH=GSSAPI PLAIN S: 250 8BITMIME Please enter your password: C: AUTH PLAIN ************ S: 235 Authentication successful Authenticated. Security strength factor: 0 MAIL FROM: mike@kdc.myrealm.ru RCPT TO: mike@kdc.myrealm.ru DATA Hello, mike! . 250 Ok: queued as 9E2495A8

Аналогично, с помощью imtest, прочитаем это «письмо». В отличие от предыдущего случая, где доступ был получен после предъявления текстового пароля, для получе-

№11, ноябрь 2006

ния письма мы используем механизм GSSAPI (можно было бы использовать и простой текстовый пароль, но для этого программу imtest нужно запускать, как ни странно, с ключом -m login). $ imtest -m GSSAPI kdc.myrealm.ru S: * OK kdc.myrealm.ru Cyrus IMAP4 v2.2.12 server ready C: C01 CAPABILITY S: * CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ MAILBOX-REFERRALS NAMESPACE UIDPLUS ID NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND BINARY SORT THREAD=ORDEREDSUBJECT THREAD=REFERENCES ANNOTATEMORE IDLE AUTH=GSSAPI SASL-IR S: C01 OK Completed .... S: A01 OK Success (privacy protection) Authenticated. Security strength factor: 56 1 select inbox * FLAGS (\Answered \Flagged \Draft \Deleted \Seen) * OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)] * 2 EXISTS * 1 RECENT * OK [UNSEEN 2] * OK [UIDVALIDITY 1137116496] * OK [UIDNEXT 12] 1 OK [READ-WRITE] Completed 2 fetch 2 body[text] * 2 FETCH (FLAGS (\Recent \Seen) BODY[TEXT] {14} Hello, mike! ) 2 OK Completed (0.000 sec) 3 store 1 +flags \deleted * 1 FETCH (FLAGS (\Deleted \Seen)) 3 OK Completed

Конечно же, регулярно использовать imtest и smtptest для чтения/отправки почты большого удовольствия не доставляет. Поэтому посмотрим, какие почтовые клиенты позволяют использовать преимущества аутентификации с помощью GSSAPI в полном объеме.

Почтовые клиенты и мобильный доступ Хотя возможность аутентификации с помощью GSSAPI присутствовала в почтовых службах достаточно давно, но воспользоваться ею было очень сложно из-за практически полного отсутствия подходящих почтовых клиентов. Из консольных клиентов в полном объеме GSSAPI использовал только Pine [3] для аутентификации по протоколам IMAP и SMTP. Популярный клиент Mutt [4] использовал GSSAPI только для протокола IMAP. До последнего времени с графическими почтовыми клиентами дела обстояли еще хуже. Большинство из них, за исключением, может быть, клиентов от Microsoft, традиционно поддерживающих свой протокол NTLM, использовали только вариации открытых текстовых механизмов (PLAIN, LOGIN). (Справедливости ради следует упомянуть еще почтовый клиент Mulberry, который поддерживал GSSAPI в полном объеме. К сожалению, этот коммерческий почтовый клиент в основном был распространен на платформе Macintosh, и компания, продвигавшая его, обанкротилась в 2005 году.) Безопасность соединения обеспечивалась внешними средствами с помощью SSL/TLS. Ситуация изменилась с выходом в январе этого года почтового клиента Thunderbird 1.5, в котором была впервые объявлена поддержка Kerberos. В данной статье я буду рассматривать настройку только этого приложения. Посколь-

65


безопасность ку клиент Thunderbird, как и другие продукты из семейства Mozilla, изначально планировался как кроссплатформенная программа, то его можно использовать как в UNIX-подобных операционных системах, так и в системе Windows. В последнем случае, правда, есть несколько небольших ловушек. Установка и настройка Thunderbird в Linux проблем не вызывает. Нужно только скачать и распаковать бинарную версию Thunderbird с сайта Mozilla [5]. Thunderbird использует GSSAPI непосредственно, не прибегая к услугам SASL. Так что помимо самого почтового клиента вам нужна ещё клиентская часть библиотек Heimdal. Настройка почтовой учетной записи пользователя выполняется как обычно. Нужно только поставить две галочки – одну напротив «Use secure authentication» на закладке Server Settings (для протокола IMAP) и вторую – напротив «Use name and password» в окне свойств Outgoing Server (для протокола SMTP). При наличии супербилета у пользователя учетной записи такая настройка Thunderbird приводит к аутентификации по протоколу GSSAPI. Поскольку, как правило, система конфигурируется таким образом, что супербилет запрашивается при входе пользователя в систему, то дополнительного ввода пароля в Thunderbird не требуется. Пользователь сразу же получает доступ к своему почтовому ящику. По логам Cyrus-IMAP и Postfix вы можете убедиться, что при аутентификации действительно используется протокол GSSAPI. Если поле «Use secure authentication» не отмечено, то Thunderbird откатывается к механизму простых текстовых паролей. В этом случае доступ к почтовому ящику возможен только после ввода пароля в выпадающем окошке. В системе Windows настройка выполняется аналогично. Но недостаток почтового клиента Thunderbird в том, что он не умеет использовать стандартное API Windows для доступа к функциям аутентификации (так называемое SSPI). Поэтому, в настройках по умолчанию Thunderbird в первую очередь нужно запретить использование SSPI – в противном случае это приведёт к некорректному завершению работы программы. user_pref("network.auth.use-sspi", false);

Это можно сделать, вручную отредактировав файл prefs.js в каталоге с используемым пользовательским профилем (т.е. C:\Documents and Settings\[User Name]\Application Data\Thunderbird\Profiles\) или введя нужное значение в окне «Edit → Preferences → Advanced → Config Editor». Возможно, в следующих версиях Thunderbird будет добавлена недостающая функциональность, но пока пользователям Windows-версии остается единственная альтернатива – использовать библиотеку Kerberos-for-Windows от MIT. Следует подчеркнуть, что SSPI и библиотека gssapi из пакета KfW используют разные кэши сертификатов. Для пользователя это означает, что даже если супербилет уже получен средствами sspi, то для функционирования KfW (и следовательно Thunderbird) этого недостаточно. Этот сертификат должен быть конвертирован в сертификат MIT (с помощью утилиты ms2mit) или же необходимо получить новый супербилет средствами библиотеки KfW (и графического интерфейса к ней leash32). В статье [6] описа-

66

ны установка пакета KfW и процедура получения обеих супербилетов (MS и MIT) при входе пользователя на свою рабочую станцию. После того как «правильный» супербилет находится в кэше сертификатов MIT, Thunderbird должен аутентифировать пользователя с помощью механизма GSSAPI. Однако «должна» не значит, что именно так она и поступит. Если в процессе аутентификации возникает ошибка и Thunderbird настаивает на использовании открытых текстовых паролей, то скорее всего Thunderbird не может найти саму библиотеку GSSAPI. В этом случае для борьбы с этой ошибкой нужно отредактировать еще два параметра по умолчанию Thunderbird (ниже приведены исходные значения): user_pref("network.negotiate-auth.using-native-gsslib", true) user_pref("network.negotiate-auth.gsslib", "")

Первый параметр означает, что Thunderbird использует системную библиотеку gssapi, которая в системе Windows называется gssapi32.dll. Если по каким-то причинам найти её не удаётся, например, потому что она не зарегистрирована в реестре, то нужно поменять значение первого параметра на false, а во втором параметре указать полный путь до соответствующей библиотеки из пакета KfW. Это значение, разумеется, зависит от того, где именно был установлен пакет KfW. У меня, например, этот путь – у:\KfW\bin\gssapi32.dll. Теперь рассмотрим ещё несколько моментов, на которые нужно обратить внимание при переносе «песочницы» в локальную сеть. Во-первых, разумеется, нужно поменять имена принципалов в соответствии с именами компьютеров в локальной сети и именем сектора Kerberos. К примеру, у принципала imap/kdc.myrealm.ru@MYREALM.RU часть имени между «/» и «@» – это имя компьютера, на котором работает сервис, часть имени после «@» – название сектора Kerberos – их-то вам и нужно привести в соответствие с реальными именами. Во-вторых, ключ сервиса должен присутствовать в keytab-файле на том компьютере, где работает сервис. Точно так же, на том же компьютере должен присутствовать и файл конфигурации SASL (в каталоге /usr/lib/sasl2). И последнее – следует задуматься о том, следует ли вам запретить использование открытых текстовых паролей для доступа к сервисам? Если вы все-же решите их оставить, то как тогда обезопасить их передачу? Простые текстовые пароли удобны тем, что они поддерживаются любыми почтовыми клиентами. Однако, чтобы предотвратить перехват простых текстовых паролей, при передаче по сети Cуrus-IMAP и Postfix позволяют запретить использование простых текстовых паролей, если канал передачи не зашифрован с помощью SSL/TLS. Для Cyrus-IMAP нужно отредактировать файл /etc/imapd.conf добавив параметр: allowplaintext: 0

Аналогично можно настроить и Postfix, дописав в main.cf файл строки: smtpd_sasl_security_options=noplaintext,noanonymous smtpd_sasl_tls_security_options=noanonymous


безопасность В том случае, если простые текстовые пароли не запре- ганизовать на ней полностью переносимое рабочее окрущаются, надо настроить шифрование канала. Но обсужде- жение из Thunderbird и пакета Kerberos-for-Windows. Таким образом, отпадает необходимость в установке и настройние этого вопроса выходит за рамки данной статьи. Итак, если текстовые пароли запрещены, то следует ке gssapi на клиентском компьютере. подумать над тем, каким образом клиенты, находящиеся Для этой цели нужно перенести весь каталог с Thunderbird вне вашего сектора Kerberos могут аутентифицировать- (тот, что установлен на C:\Program Files\...) на съёмный диск ся с помощью GSSAPI. Если клиентская часть находится и в него же распаковать пакеты KfW и KfW-extra [7]. В итоге на компьютере, имя и адрес которого постоянны (напри- исполняемые файлы thunderbird.exe, leash32.exe и библиомер, домашний компьютер вашего коллеги), то проще все- тека gssapi32.dll должны оказаться на одном уровне в одго включить этот компьютер в ваш сектор Kerberos. Если же ном и том же каталоге. При этом следует убедится, что зана компьютере, кроме того, установлен Linux, то можно так- пуск leash32 со съёмного носителя не приводит к сообщеже установить на нем локальный сектор Kerberos и нала- ниям об ошибке. Затем, в настройках leash32 нужно подить траст между этим локальным сектором и корпоратив- менять способ хранения кэша сертификатов с API:krb5cc ным сектором Kerberos. В любом случае следует убедить- на FILE:krb5cc. Таким образом, скопировав какой-нибудь ся, что доступ к kdc через 88 UDP/TCP-порт не блокируют- из полученных ранее сертификатов в файл krb5cc в катася брандмауэрами. лог с leash32, мы делаем этот сертификат доступным бибЕсли же доступ к почте осуществляется вполне легаль- лиотеке gssapi. Чтобы не настраивать каждый раз учётным пользователем, но со «случайного» компьютера и толь- ную запись пользователя, в тот же каталог стоит также ко время от времени, то можно обойтись без включения его скопировать каталог с пользовательскими настройками в сектор Kerberos. Правда, в этом случае требуется опре- (C:\Documents and Settings\[User Name]\Application Data\ делённые предварительные усилия для того, чтобы создать Thunderbird\Profiles\xxxxx.default) для удобства переименои перенести на этот компьютер билеты Kerberos. Идея мето- вав его, например, в roaming.def. Теперь осталось настрода состоит в том, что раз у пользователя уже есть готовые ить взаимодействие thunderbird с библиотекой gssapi, отбилеты для получения доступа к сетевым сервисам, то ни- редактировав файл roaming.defrefs.js: какого взаимодействия с KDC не требуется и, следовательuser_pref("network.auth.use-sspi", false); но, на клиентском компьютере не нужно настраивать секuser_pref("network.negotiate-auth.using-native-gsslib", ↵ тор Kerberos. Хотя при этом по-прежнему в силе остается false) user_pref("network.negotiate-auth.gsslib", "gssapi32.dll") требование, чтобы на компьютере были доступны библиотеки gssapi и, разумеется, Thunderbird. Рассмотрим пример – ваш коллега отправляется в коПоскольку библиотека gssapi находится в том же камандировку, время прибытия на место и отбытия ему из- талоге, что и исполняемый файл thunderbird.exe, то полвестно. Он собирается просматривать свою почту, исполь- ный путь указывать не нужно. После чего можно запустить зуя компьютер принимающей организации. Тогда перед thunderbird с флешки с помощью команды: отъездом ему нужно получить несколько билетов с ваше$ thunderbird.exe -profile roaming.def го KDC, например, с помощью такого скрипта: #/bin/bash for i in $@ ; do kinit -A --renewable --forwardable --start-time=$i ↵ -r 7d -l 1d -c $HOME/krb5cc_$i kgetcred -c ~/krb5cc_$i smtp/kdc.myrealm.ru kgetcred -c ~/krb5cc_$i imap/kdc.myrealm.ru done

и убедиться, что почтовые сервисы доступны и при наличии действительных сертификатов в файле krb5cc от вас не требуется ввод пароля. На этом мы и завершим настройку почтовой системы. Таким образом, нам удалось полностью интегрировать почтовые службы SMTP и IMAP в инфраструктуру Kerberos, С помощью этого скрипта пользователь получает безад- а кроссплатформенный почтовый клиент Thunderbird позресный TGT (ключ -A в вызове kinit), действительный в те- воляет пользователям Linux и Windows воспользоваться чение суток начиная со дня, указанного в качестве входно- преимуществами single sign-on-системы. го параметра (--start-time). Нужно указать все дни, которые ваш сотрудник рассчитывает пробыть в командировке. С по- 1. ftp://ftp.opennet.ru/pub/postfix/official/postfix-2.2.5.tar.gz. мощью полученного TGT генерируются билеты для служб 2. ftp://ftp.andrew.cmu.edu/pub/cyrus-mail. SMTP и IMAP, и весь комплект ключей записывается в фай- 3. http://www.washington.edu/pine/getpine. лы вида krb5cc_<ДБФБ>. Все эти файлы нужно скопировать 4. http://www.mutt.org. на какой-нибудь физический носитель (например, на флеш- 5. http://ftp.mozilla.org/pub/mozilla.org/thunderbird/releases/1.5rc1/ ку), который ваш коллега возьмёт с собой в поездку. source. Чтобы воспользоваться билетами, нужно указать 6. Кондрин М. Развертываем Heimdal Kerberos. //Системный АдThunderbird, где найти библиотеку gssapi, а библиотеке министратор, №7, 2005 г. – С. 20-25. gssapi сообщить, откуда брать сертификат пользователя. 7. http://web.mit.edu/kerberos/dist/kfw/3.0/kfw-3.0/kfw-3.0.zip, http:// Поскольку все необходимые сертификаты имеются в налиweb.mit.edu/kerberos/dist/kfw/3.0/kfw-3.0/kfw-3.0-extra.zip. чии, то нет необходимости подключаться с удалённого ком- 8. Кондрин М. Как настроить библиотеку SASL для совместной пьютера к контроллеру Kerberos. Если же на флешке вашеработы с Kerberos. //Системный администратор, №10, 2006 г. – го коллеги есть еще 45 Мб свободного места, то можно орС. 38-42.

№11, ноябрь 2006

67


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

Работаем с NTLM-авторизацией Apache в домене MS Windows 2003

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

М

ногие фирмы создают различные веб-ресурсы для использования только внутри компании (intranet-серверы). Если политика компании позволяет использовать технологии не только «монстра» Microsoft, то выбор часто останавливается на самом популярном http-сервере Apache. Бывает, что веб-ресурсы требуют разделения прав и контроля доступа к некоторым разделам или ко всему сай-

68

ту. Разделять и контролировать мож- тавлена подобная задача. Особенносно различными способами: на уровне ти инсталляции: ОС (firewall), веб-сервера и средства-  Первое – сервер Sun sparc, ОС соми самих приложений. ответственно Solaris 9. Есть своя Если авторизация во внутренней специфика, но приведенное решесетке построена на домене Windows, ние должно работать на большинсто разумно использовать доменные актве других ОС. каунты (чтобы не плодить учетные за-  Второе – как обычно, как можписи) и прозрачную для конечных польно меньше трогать системные назователей NTLM-авторизацию. стройки и настройки других проНедавно передо мной и была посграмм на сервере.


безопасность  Третье, самое интересное – домен в моей организации самый модный, Active Directory (AD или ADS в дальнейшем) на сервере Windows 2003 со всеми возможными новшествами. Отношения к управлению доменом я никакого не имею, этим занимаются совершенно другие люди. В этой сетке я просто пользователь. Что имеем на клиенте:

 Solaris 9 9/04.  Apache (Apache/1.3.31) из стандартной поставки Solaris 9. Для авторизации NTLM решено доустановить – samba3 и mod_ntlm_winbind из того же проекта (см. [4, 5]). Другие модули NTLM-авторизации, которые я нашел, с доменом 2003 работать не умеют. NTLM – это набор протоколов проверки подлинности и безопасного использования сессий, используемый в различных сетевых приложениях, преимущественно в сетях Microsoft. Первоначально созданный для работы в службах DCE/RPC, NTLM в данный момент используется всюду в сетевых приложениях Microsoft. Вероятно, это лучший способ для HTTP-авторизации в сетях MS Windows. Кроме упомянутых RPC, HTTP, поддержка NTLM встроена в Exchange-сервер (протоколы SMTP, POP3, IMAP); она так же присутствует в Microsoft – в реализациях CIFS/SMB, Telnet, SIP и, возможно, в каких-то еще. Сеанс NTLM-аутентифицикации работает по принципу запрос-ответ. Он содержит три типа сообщений, также известных как:  Type 1 – начало переговоров.  Type 2 – запрос.  Type 3 – аутентификация (проверка подлинности). Обычно создание NTLM-сессии выглядит следующим образом:  Клиент посылает сообщение 1-го типа на сервер. Это сообщение содержит список опций, поддерживаемых клиентом и запрашиваемых у сервера.  Сервер отвечает сообщением 2-го типа. Второе сообщение содержит список опций, принятых сервером. Более того, часто в этом сообщении передается дополнительный запрос, генерируемый сервером.

№11, ноябрь 2006

 Клиент отвечает на запрос сооб- це опишу основные моменты. Обычно щением 3-го типа, где содержится различная информация о клиенте (в том числе домен, имя пользователя, пароль) и информация, запрошенная сервером на второй стадии NTLM-сессии дополнительно. Ответы на 3-м этапе NTLM-сеанса – самая критичная часть диалога, т.к. на этом шаге клиент доказывает серверу свою подлинность. После установки подлинности клиент и сервер обмениваются различной информацией о созданной NTLM-сессии, включая ключ сессии, используемый для последующей подписи операций. Более подробно ознакомиться с описанием стека протоколов NTLM и реализацией этого стека для HTTP-аутентификации можно, следуя по ссылкам [10, 11]. В настоящее время NTLM в значительной степени вытесняется технологией Kerberos, как схемой аутентификации в сценариях внутри домена Windows. Однако в некоторых случаях использовать только Kerberos не представляется возможным, например, если сервер или клиент не входит в домен Windows, или они принадлежат различным доменам. Можно настроить прозрачную для пользователя аутентификацию, используя только технологию Kerberos, без NTLM. По ссылке [13] можно ознакомиться с описанием схемы аутентификации через Kerberos, которая используется Microsoft в своих продуктах (сервер IIS – браузер Internet Explorer). По ссылке [12] – описание способа для связки Apache-Mozilla. Думаю, будет работать и с MS Internet Explorer, не пробовал. Сегодня рассматривается решение, которое использует обе технологии. Клиент (браузер Internet Explorer) использует стек протоколов NTLM для аутентификации у веб-сервера Apache. Веб-сервер, в свою очередь, проверяет подлинность клиента в домене MS Windows, авторизуясь в AD через технологию Kerberos. Подробно с работой технологии Kerberos можно ознакомиться, например, по ссылке [14]. Чтобы при дальнейшем чтении статьи не возникало неясностей, вкрат-

участники процесса Kerberos-аутентификации делятся на три категории:  клиентская часть сетевого приложения (client);  серверная часть сетевого приложения (application server);  сервер аутентификации Kerberos (часто используется аббревиатура KDC).  Наверное, иногда можно добавить и четвертого участника – злоумышленника, но подробные вопросы безопасности сетевых технологий выходят за рамки данной статьи. Первый и второй типы участников являются Kerberos-клиентами, которые подтверждают свою подлинность у сервера или «центра» Kerberos – KDC (Key Distribution Center). KDC управляет проверкой подлинности всех Kerberosклиентов. Чтобы два Kerberos-клиента (клиент приложения и сервер приложения) доказали друг другу свою подлинность, они используют соответствующие удостоверения – «тикеты» (ticket). KDC также управляет распределением тикетов. Подобная схема работы называется сторонней системой идентификации, или системой идентификации у третьего лица (third party authentication system). В нашем случае Samba-сервер как член домена MS Windows обращается с информацией к ADS. Оба подтверждают свою подлинность у KDC (обычно это одна из функций контроллера домена MS Windows). Пакет проверк и под линнос ти W indows Kerb eros и с п ол ь зуе тс я по умолчанию в Microsoft Windows Server 2003, Microsoft Windows XP, и Microsoft Windows 2000 и сосуществует с протоколом запрос/ответ NTLM. По умолчанию максимальный размер пакета, для которого Windows Server 2003 использует протокол UDP, составляет 1465 байт. В зависимости от различных факторов, например истории идентификатора безопасности (SID) и членства в группе, некоторые учетные записи будут иметь больший размер пакетов проверки подлинности Kerberos. В конце концов Microsoft рекомендует использовать службу Kerberos через протокол TCP (см. [2]). А точнее – по UDP Kerberos от Microsoft

69


безопасность в Windows 2003 не работает без дополнительных настроек. В нашем случае контроллер домена требует использовать только протокол TCP. Так как это настройки по умолчанию в Windows 2003 – скорее всего они используются на большинстве систем. Видел официальное объяснение от Microsoft на английском языке, но на момент написания статьи не нашел его. Kerberos, поставляемый с Solaris 9 (базируется на MIT KRB5 1.2.1), подобных штучек себе не позволяет. Microsoft об этом честно предупреждает: «обновите UNIX KDC до последней версии протокола, которая поддерживает соединения TCP вместо UDP» (см. [3]). Хотя у нас и клиент Kerberos, а не KDC – обновиться все равно придется. В Solaris 9 по умолчанию нет никаких компиляторов, придется установить gcc. Samba собираем с поддержкой AD, т.е. с ключом --with-ads. Так как сервер Active Directory – это, по большому счету, реализация сервера LDAP от Microsoft, то и Samba при включении функционала клиента AD требует поддержку LDAP. Поэтому используем --with-ldap. Не стал мучаться с LDAP-библиотеками от Sun (SunONE ds), поставил OpenLDAP из пакетов. OpenLDAP потянул за собой соответственно OpenSSL и т. д. (в различных сборках OpenLDAP требования могут отличаться). MIT krb5-1.5 использует BerkeleyDB – установил пакет версии db-4.2.52. Все пакеты для Solaris 9 взяты с сайта [7], это:  SMCgcc342;  SMCiconv;  SMCossl98b;  SMCsasl;  SMColdap;  SMCdb.

Распаковываем: $ tar xf krb5-1.5-signed.tar $ /usr/sfw/bin/gtar xzf krb5-1.5.tar.gz $ cd krb5-1.5/src

Читаем, по желанию: $ more ../README

Cобираем: $ ./configure --prefix=/usr/local/mit-krb5 ↵ --enable-shared --without-krb4 $ make

Ставим: # make install

Процесс сборки у меня никаких проблем не вызвал. Пожалуй, единственное, на что стоит обратить внимание, чтобы все нужные для сборки программы и библиотеки были доступны. Переменная PATH у меня выглядела следующим образом (crle у нас уже настроен): $ echo $PATH /usr/local/bin:/usr/bin:/usr/sbin:/usr/ccs/bin:/usr/sfw/bin:/usr/ucb

Собираем Samba Скачиваем исходники (см. [4]). Я использовал файл samba-3.0.23a.tar.gz. Как и в случае с Kerberos – это последняя стабильная версия на момент установки. Распаковываем:

Скачиваем, устанавливаем, например, так:

$ /usr/sfw/bin/gtar xzf samba-3.0.23a.tar.gz $ cd samba-3.0.23a/source

# for i in *gz do /usr/bin/gunzip $i done # for i in *local do pkgadd –d $i all done

Собираем:

Чтобы установленные библиотеки стали видны остальным программам, пропишем путь к /usr/local/lib в crle: # crle -l /usr/lib:/usr/local/lib

Собираем Kerberos Скачиваем исходники (см. [8]). Я использовал файл krb5-1.5-signed.tar – последняя стабильная версия на момент установки. Можно использовать любую, лишь бы выбранная версия работала по TCP как Kerberos-клиент и не возникло проблем при сборке. Судя по файлу ./doc/CHANGES, поддержка TCP на стороне клиента появилась 2002-06-10. Для сравнения – версия Kerberos в стандартной поставке Solaris 9 датирована 2002-04-06.

70

$ ./configure --prefix=/usr/local/samba --with-ldap ↵ --with-ads --with-krb5=/usr/local/mit-krb5 $ make

Ставим: # make install

Процесс сборки также никаких заметных проблем не вызвал. Программы собраны, теперь надо завести машину в домен MS Windows.

Настраиваем DNS Настройки брал со своей рабочей станции: > ipconfig /all Primary Dns Suffix . . . . . . . : w2003.domain.inside … DNS Servers . . . . . . . . . . . : 192.168.0.1 192.168.1.1 192.168.2.1


безопасность В Solaris 9 по умолчанию можно использовать как раз три DNS-сервера: $ grep MAXNS /usr/include/resolv.h | grep define #define MAXNS

3

/* max # name servers we'll track */

Пишем в /etc/resolv.conf: nameserver 192.168.0.1 nameserver 192.168.1.1 nameserver 192.168.2.1 domain w2003.domain.inside

Проверяем настройки Kerberos командами: $ /usr/local/mit-krb5/bin/kinit -p domainuser

Спросит пароль… Если все в порядке, то: $ /usr/local/mit-krb5/bin/klist

Выдаст созданный «тикет». Когда писал статью, нашел в Интернете описание сборки samba3 для работы с ADS под Solaris9 (см. [9]). В ней автор предлагает собрать Samba, используя heimdal-реализапроверяется DNS командой nslookup, кто запамятовал. Не забываем, что в /etc/nsswitch.conf должна присутс- цию протокола Kerberos, для чего пришлось сильно пропаттвовать строчка: чить скрипт configure. Возможно, вариант не самый красивый, но статья оформлена превосходно. Вы можете польhosts: files dns зоваться любым способом, главное, чтобы Kerberos работал через TCP. Она говорит о том, что при разрешении имен компьютеров соответствующая запись будет искаться в файле Настраиваем Samba /etc/hosts, в случае неудачи будет использован протокол Привожу свой файл smb.conf: DNS. Подробнее с использованием сервисов имен в Solaris 9 [global] можно ознакомиться в man-страницах nsswitch.conf, workgroup = W2003 gethostbyname (разрешение имен хостов) и в Интернете. # имя домена server string = samba for ntlm

Настраиваем Kerberos

netbios name = pebs903x # это имя машине дали администраторы домена netbios aliases = argo # hostname, нам так проще обращаться к машине

Список контроллеров домена я получил через DNS (на рабочей станции):

interfaces = eri0 bind interfaces only = yes # параметры необязательные, просто в момент # настройки на сервере уже работала стандартная # Samba Version 2.2.12, поэтому выбор интерфейса # был критичен

> nslookup w2003

kdc и admin_server взял первым из списка контроллеров. Хотя правильней, пожалуй, было бы спросить у администраторов домена. В моем случае адреса совпали с DNS-серверами, но это может быть не всегда так. Привожу мой /etc/krb5.conf:

domain master = No wins server = 192.168.0.2 # смотрим вывод команды "ipconfiog /all" # в MS Windows на машине из домена name resolve order = wins host

$ more /etc/krb5.conf

realm = W2003.DOMAIN.INSIDE security = ads password server = pdc1.w2003.domain.inside encrypt passwords = yes

[libdefaults] default_realm = W2003.DOMAIN.INSIDE udp_preference_limit = 1 [realms] W2003.DOMAIN.INSIDE = { kdc = pdc1.w2003.domain.inside admin_server = pdc1.w2003.domain.inside }

log level = 0 # возможно, в процессе настройки придется увеличить idmap uid = 10000-20000 idmap gid = 10000-20000 winbind separator = +

[domain_realms] .pdc1.w2003.domain.inside = W2003.DOMAIN.INSIDE

Если

Строчка:

$ /usr/local/samba/bin/testparm

udp_preference_limit =1

говорит как раз о том, чтобы по возможности использовался протокол TCP вместо UDP по умолчанию. Теоретически, клиент должен пытаться использовать TCP, если размер сообщения больше 1 байта. Solaris 9 содержит прекрасный анализатор трафика – snoop, который нам четко показывает, что по одному сообщению UDP клиент и сервер все же умудряются обменяться.

№11, ноябрь 2006

отрабатывает без ошибок, можно вводить машину в домен. Когда администраторы домена дали права только завести машину в домен – ничего не вышло. Помучился денёк с пересборкой/перенастройкой Kerberos и Samba. Решилось просто – дали полные права администратора домена – машину добавил. Права забрали. Так что в чем конкретно было дело – сказать не могу. Заводим машину в домен командой: # /usr/local/samba/bin/net ads join -U domainlogin

71


безопасность После указанных выше настроек и получения прав администратора домена команда отработала без ошибок. Проверить можно, например, получив список групп домена: # /usr/local/samba/bin/net ads group -U domainlogin

Команда snoop в Solaris 9 разбирает LDAP-запросы, что оказалось очень удобным, чтобы посмотреть, какие конкретно запросы формирует Samba к AD. Например, полезно для того, чтобы достать из домена специфичные поля учетной записи пользователя – отображать на сайте имя и фамилию пользователя, вместо логина. Команда: $ net ads search sAMAccountName=Administrator ↵ -U adusername

покажет нам все поля, которые доступны на чтение для adusername у учетной записи Administrator. Для запуска/остановки Samba использую следующий скрипт: #!/sbin/sh case "$1" in start) [ -f /usr/local/samba/lib/smb.conf ] || exit 0

stop)

*) esac exit 0

/usr/local/samba/sbin/smbd -D /usr/local/samba/sbin/nmbd -D sleep 30 /usr/local/samba/sbin/winbindd ;; for i in `/usr/bin/ls ↵ /usr/local/samba/var/locks/*pid 2>/dev/null` do echo killed pid from file:$i /usr/bin/kill `/usr/bin/cat $i` /usr/bin/rm $i done ;; echo "Usage: $0 { start | stop }" exit 1 ;;

Собираем и настраиваем mod_smb_winbind Скачиваем mod_ntlm_winbind.с (см. [5]). Использовать стандартный Makefile (и apxs) не получится, т.к. Apache в Solaris 9 собран компилятором от SUN. Опции будут немного отличаться от gcc. Собираем: $ cc -DSOLARIS2=290 -DMOD_PERL -DEAPI -DUSE_EXPAT ↵ -I../lib/expat-lite -D_LARGEFILE_SOURCE ↵ -D_FILE_OFFSET_BITS=64 -DUSE_SO_LINGER ↵ -DHARD_SERVER_LIMIT=2048 -I/usr/apache/include ↵ -Wall -o mod_ntlm_winbind.o -c mod_ntlm_winbind.c

Линкуем: $ ld -G -o mod_auth_ntlm_winbind.so mod_ntlm_winbind.o

Копируем файл: # cp mod_auth_ntlm_winbind.so /usr/apache/libexec/

72

Теперь осталось добавить строчки в соответствующие места /etc/apache/httpd.conf: LoadModule ntlm_winbind_module ↵ libexec/mod_auth_ntlm_winbind.so AddModule mod_ntlm_winbind.c

Перед перезапуском httpd можно проверить синтаксис httpd.conf: $ /usr/apache/bin/httpd –t

Если видим фразу «Syntax OK» – перезапускаем Apache: # /etc/init.d/apache restart

Проверяем работу модуля, для чего создаем тестовую папку, например: # mkdir /var/apache/htdocs/test-ntlm

И в этой папке создаем файл .htaccess со следующими строчками: AuthName "NTLM Authentication AD" NTLMAuth on NTLMAuthHelper "/usr/local/samba/bin/ntlm_auth ↵ --helper-protocol=squid-2.5-ntlmssp" NTLMBasicAuthoritative on AuthType NTLM require valid-user

Теперь можно использовать переменную REMOTE_USER из «Apache Environment» в своих веб-приложениях. Например, прекрасно работает связка с Nagios. К сожалению, модуль не предоставляет возможности раздавать доступ конкретным пользователям (средствами Apache), но можно авторизовать по группам (из AD), используя ключ --require-membership-of=GROUPNAME в команде ntlm_auth. Успехов! 1. http://httpd.apache.org. 2. http://support.microsoft.com/kb/244474. 3. h t t p : / / w w w . m i c r o s o f t . c o m / t e c h n e t / p r o d t e c h n o l / windowsserver2003/technologies/security/tkerberr.mspx. 4. http://de.samba.org/samba. 5. h t t p : / / d o w n l o a d . s a m b a . o r g / f t p / u n p a c k e d / l o r i k e e t / mod_ntlm_winbind. 6. h t t p : / / w w w.u n i xd o c . r u / i n d ex . p h p? m o d e = 2 & p o d m o d e = 1&arcicle_id=145&theme=Samba%20ADS. 7. http://www.sunfreeware.com/indexsparc9.html. 8. http://web.mit.edu/Kerberos/dist/index.html. 9. http://shearer.org/Solaris9_Samba_ADS. 10. http://davenport.sourceforge.net/ntlm.html. 11. http://devel.squid-cache.org/ntlm/client_proxy_protocol.html. 12. http://meta.cesnet.cz/cms/opencms/en/docs/software/devel/ negotiate.html. 13. http://meta.cesnet.cz/cms/opencms/en/docs/software/devel/ draft-brezak-spnego-http-04.txt. 14. http://gazette.linux.ru.net/lg82/shekhar.html.


bugtraq Множественные уязвимости в различных продуктах от Oracle Программа: JD Edwards EnterpriseOne Tools 8.x, JD Edwards OneWorld Tools 8.x, Oracle Application Express 1.x, Oracle Application Express 2.x, Oracle Application Server 10g, Oracle Collaboration Suite 10.x, Oracle Database 10g, Oracle Database 8.x, Oracle Developer Suite 10g, Oracle E-Business Suite 11i, Oracle PeopleSoft Enterprise Portal Solutions 8.x, Oracle PeopleSoft Enterprise Tools 8.x, Oracle Pharmaceutical Applications 4.x, Oracle9i Application Server, Oracle9i Collaboration Suite, Oracle9i Database Enterprise Edition, Oracle9i Database Standard Edition, Oracle9i Developer Suite. Опасность: Критическая. Описание: 1. Следующие пакеты недостаточно проверяют представленные данные перед использованием в SQL-запросах. В результате возможно изменить существующий SQL-запрос и внедрить произвольный SQL-код:  DBMS_XDBZ  DBMS_SQLTUNE  SDO_DROP_USER_BEFORE  SDO_GEOR_INT  MD2  XDB_PITRIG_PKG  DBMS_CDC_IMPDP  SDO_DROP_USER  DBMS_CDC_IPUBLISH  SDO_CS  DBMS_CDC_ISUBSCRIBE 2. Переполнение буфера обнаружено в функции RELATE в пакетах MD2 и SDO_GEOM и в функции GEOM_OPERATION в пакете SDO_3GL, а также в функции TRANSFORM_LAYER в пакете SDO_CS. В результате злоумышленник, контролирующий параметры к этим функциям, может выполнить произвольный код на уязвимой системе. 3. Уязвимость существует в пакете WWV_FLOW_ITEM_ HELP из-за недостаточной обработки входных данных в параметре NOTIFCATION_MSG, и в Oracle Reports в параметрах showenv, parsequery, cellwrapper и delimiter. Удаленный пользователь может выполнить произвольный код сценария в браузере жертвы в контексте безопасности уязвимого сайта. 4. Уязвимость существует из-за ошибки, которая позволяет злоумышленнику только с привилегиями «create session» редактировать, создавать и удалять виды. URL производителя: http://www.oracle.com. Решение: установите соответствующее исправление.

Переполнение буфера в драйверах NVIDIA Программа: NVIDIA Driver For Linux v8774, NVIDIA Driver For Linux v8762, NVIDIA Driver for FreeBSD, NVIDIA Driver for Solaris. Опасность: Критическая. Описание: Уязвимость существует из-за ошибки при воспроизведении glyphs в бинарном драйвере NVIDIA. Удаленный пользователь может вызвать переполнение буфера и аварийно завершить работу драйвера или выполнить произвольный код на целевой системе. Уязвимость может эксплуатироваться с помощью специально сформированной веб-страницы. URL производителя: http://www.nvidia.com. Решение: В настоящее время способов устранения уязвимости не существует.

№11, ноябрь 2006

Несколько уязвимостей в драйверах Apple Airport Программа: Apple Macintosh OS X. Опасность: Критическая. Описание: 1. Уязвимость существует из-за ошибок проверки границ буфера при обработке сетевых фреймов. Удаленный пользователь может послать системе специально сформированный фрейм, вызвать переполнение стека и выполнить произвольный код на целевой системе с привилегиями суперпользователя. Уязвимости подвержены следующие продукты:  Power Mac  Mac Pro  PowerBook  Xserve  iBook  PowerPC-based Mac mini  iMac 2. Уязвимость существует из-за ошибки проверки границ данных в беспроводном драйвере AirPort при обработке обновлений кэша сканирований. Удаленный пользователь может послать целевой системе специально сформированный фрейм, вызвать переполнение буфера и аварийно завершить работу системы или выполнить произвольный код с привилегиями суперпользователя. 3. Целочисленное переполнение буфера обнаружено API беспроводных драйверов AirPort для стороннего ПО. Злоумышленник может послать приложению, использующему уязвимый API, специально сформированный фрейм, вызвать переполнение буфера и выполнить произвольный код на целевой системе с привилегиями суперпользователя. Примечание: Уязвимости №2 и №3 в Intel-based Mac mini, MacBook и MacBook Pro не затрагивают системы до версии Mac OS X v10.4 URL производителя: http://www.apple.com/macosx. Решение: Установите исправление с сайта производителя.

Переполнение буфера в Clam AntiVirus Программа: Clam AntiVirus версии до 0.88.5. Опасность: Критическая. Описание: 1. Уязвимость существует из-за ошибки проверки границ данных в распаковщике CHM-файлов chmunpack.c. Удаленный пользователь может с помощью специально сформированного CHM-файла вызвать отказ в обслуживании приложения. 2. Уязвимость существует из-за неизвестной ошибки в файле rebuildpe.c при пересоздании PE-файлов после их распаковки. Удаленный пользователь может вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. URL производителя: http://www.clamav.net. Решение: Установите последнюю версию (0.88.5) с сайта производителя.

73


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

Защищаем PHP-приложения с помощью Suhosin

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

П

ринято считать, что ошибки при программировании свойственны только новичкам, которые многого еще не умеют и не знают, но это не так. Программист с опытом способен избежать большинства проблем, но в то же время он также не застрахован от ошибок. Кроме того, многие сайты сегодня делаются под заказ специалистами-аутсорсерами и не всегда исполнитель может, умеет и хочет провести полноценный аудит собственного кода. Крупные проекты также содержат ошибки. Результат – сегодня только и слышно о PHP Include, SQL Injection, Cross site scripting (XSS) и других атаках, направленных на веб-сервисы. Несмотря на то что об этих технологиях и методах защиты рассказано многое, взломы все равно продолжаются. Так, по статистике Web Application Security Consortium [1] количество взломов веб-серверов в 2005 году по сравнению с 2004 годом увеличилось в три раза. Это, конечно, не самая точная и полная статистика, зато в ней фигурируют только крупные проекты, защитой которых занимаются отнюдь не новички. Среди основных причин такой негативной тенденции называют широкую доступность инструментов, необходимых для проведения атаки, и недостаточное внимание со стороны разработчиков сайтов к вопросам безопасности. Выходов из этой ситуации может быть несколько. Это и аудит кода, заказанный у сторонней организации, автоматическое тестирование с по-

74

мощью специализированных сканеров безопасности, работающих на прикладном уровне, вроде Acunetix Web Vulnerability Scanner [2] и правильная настройка всех компонентов системы (веб-сервера, параметров PHP и базы данных). Ручная проверка больших объемов кода является сложной и трудоемкой задачей, требующей больших знаний в различных областях, займет много времени и 100% гарантии все равно не даст. Сканеры безопасности, как правило, позволяют выявить лишь общие ошибки. Вероятно, поэтому в последнее время активно развиваются проекты, позволяющие защититься от атак глобально, независимо от присутствия ошибок на сайте. Один из вариантов – защита сервиса с помощью файервола веб-приложений [3], разработчики Suhosin пошли несколько иным путем.

Проекты Hardening-Patch и Suhosin Это два проекта от одного разработчика, имеющие сходную задачу, только реализованы по-разному. Задача – защита серверов и пользователей от целого ряда известных проблем в приложениях и ядре PHP. Кроме того, с помощью Hardening-Patch или Suhosin можно защититься от неизвестных уязвимостей. При этом Hardening-Patch реализован в виде патча к PHP и может быть использован только после полной пересборки PHP. В Suhosin входят две независимые части, которые могут использоваться как раздельно, так и в совместно.

Первая часть – небольшой патч к ядру, осуществляющий низкоуровневую защиту структур данных Zend LinkedList и HashMap против переполнения буфера и других уязвимостей ядра PHP. Это реализуется посредством хранения реальных указателей на используемые деструкторы, и каждый раз при его вызове происходит проверка списка. Патч защищает ядро и модули PHP от уязвимости форматной строки и от ошибок в реализации функции realpath, присущей некоторым платформам (приводя ее к принятой в FreeBSD). Вторая часть реализована в виде расширения, которое фактически и осуществляет всю основную защиту, при необходимости его очень просто доустановить в уже рабочую систему, без полной пересборки PHP. Здесь возможности уже гораздо шире (полный список приведен на сайте проекта http://www.hardened-php.net/suhosin/ a_feature_list.html):  добавлены функции sha256 (), sha256_file() и поддержка blowfish для всех платформ;  кодирование Cookies и данных сессии;  запрещение вставки URL, закачки файлов и доступа к произвольным файлам, верификация загруженных файлов через внешний скрипт, запрет загрузки исполняемых файлов, удаление двоичных данных из загружаемого файла;  отключение функции eval(), запуск приложений с использованием eval() с применением белого и черного списков;


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

курсии; поддержка виртуальных узлов и каталогов, настраиваемых через черный и белый списки; защита от прерывания HTTP-заголовка (HTTP Response Splitting); з а щ и т а гл о б а л ь н ы х п е р е м е н н ы х о т ex t r a c t и import_request_vars, а также от скриптов, манипулирующих memory_limit; защита от длинных и неправильных идентификаторов сессии; фильтрование ASCII-символов; игнорирование переменных GET, POST, COOKIE с целым рядом параметров; установка лимитов ряду переменных REQUEST.

$ sudo apt-get install bison flex libxml2 libxml2-dev

После этих операций PHP должен работать корректно и без ошибок. Если планируется, скомпилировать расширение вместе с PHP, то распаковываем архив suhosin-0.9.5.tgz и копируем все файлы из каталога src в ext/suhosin. Далее обычная сборка php, при конфигурировании не забываем включить опцию --enable-suhosin. Собираем модуль расширения: $ cd suhosin-0.9.5 $ phpize Configuring for: PHP Api Version: Zend Module Api No: Zend Extension Api No:

20041225 20050922 220051025

$ ./configure

В случае нарушения установленных правил возможна По умолчанию скомпилированный модуль будет блокировка переменных, отсылка определенного HTTP-кода ответа, перенаправление браузера пользователя, выпол- установлен в каталог, в котором он компилируется, нение другого PHP-скрипта. Все события заносятся в жур- что не очень удобно. Поэтому лучше использовать дирекналы, для чего может использоваться syslog, свой модуль тиву --prefix=/usr/lib. или внешний скрипт. В журнале появится запись об IP-ад$ make ресе атакующего, а также файл и номер строки, которые $ sudo make install были использованы для атаки. Версии Hardening-Patch и Suhosin-Patch привязаны к соответствующей версии PHP, последние версии расширения Настройка Suhosin Suhosin совместимы практически со всеми версиями PHP. Все настройки Suhosin производятся в файле php.ini. СлеСудя по ответу в FAQ, размещенному на сайте, Suhosin дует учесть, что патч поддерживает только опции ресейчас продвигается на замену Hardening-Patch, поэто- гистрации. Первая запись, которая должна быть обяму его и рекомендуется использовать. Распространяются зательно помещена в файл, – это подключение модуля эти два проекта под PHP License, version 3.01. suhosin.so (сам модуль должен быть виден переменной LD_RUN_PATH):

Установка Suhosin

Установка Suhosin состоит из двух этапов: наложение патча на PHP с последующей его пересборкой и компиляция модуля расширения. Хотя возможна и сборка со встроенным расширением. В репозитарии Ubuntu 6.06 на момент написания статьи была доступна версия php 5.12, для которой не имеется патча Suhosin. Поэтому будем устанавливать из исходных текстов. Скачиваем PHP, патч suhosin под используемую версию PHP и расширение. Все это распаковываем, накладываем патч и компилируем. $ $ $ $ $ $ $

tar -xvjf php-5.1.6.tar.bz2 gunzip suhosin-patch-5.1.6-0.9.5.patch.gz cd php-5.1.6 patch -p 1 -i ../suhosin-patch-5.1.6-0.9.5.patch make make test sudo make install

Хотя, чтобы не было проблем с зависимостями, в Ubuntu перед конфигурированием рекомендуется дать команду: $ sudo apt-get build-dep php5

и установить все недостающие пакеты (хотя большая их часть в конкретном случае явно лишняя). Минимальный набор для Ubuntu устанавливается так:

№11, ноябрь 2006

extension=suhosin.so

В таблице 1 приведены основные опции Suhosin. После установки Suhosin будет работать с настройками по умолчанию, которые показаны во втором столбце таблицы. Константы могут использоваться только совместно с Suhosin-патчем, иначе придется работать с их числовыми аналогами, для некоторых значений они приведены в скобках. Остальные вы найдете в документации проекта. На сайте проекта приведен тест производительности, замеренный с помощью скрипта bench.php [6]. При этом использовался компьютер с процессором Pentium 4 с частотой 2,80 Ггц и оперативной памятью 512 Мб. Замеры показали, что система, использующая патч и модуль Suhosin на 8,84 % работает медленнее. На компьютере с процессором 2 Ггц получилась приблизительно такая же цифра. Большую часть ресурсов забирает патч, модуль несильно нагружает систему. Но bench.php использует рекурсивную функцию с большим количеством вызовов, что в рабочих скриптах практически не встречается. Поэтому в реальной системе присутствие Suhosin будет незаметно. Suhosin является довольно интересным решением, позволяющим защитить веб-сервис, использующий PHP, от большинства известных и неизвестных угроз. В отличие от mod_security, где администратор должен постоянно отслеживать события и подправлять при необходимос-

75


безопасность Таблица 1. Опции Suhosin Опция

Значение по умолчанию

Возможные значения

Пояснение

Опции протоколирования

S_ALL (511)

S_MEMORY, S_MISC, S_VARS, S_FILES, S_INCLUDE, S_SQL, S_EXECUTOR, S_MAIL, S_SESSION, S_ALL

Указывает, какие классы тревог регистрируются в syslog. Вне зависимости от настроек S_MEMORY регистрируется всегда

LOG_USER (9)

LOG_KERN, LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_SYSLOG, LOG_LPR, LOG_NEWS, LOG_UUCP, LOG_CRON, LOG_AUTHPRIV, LOG_LOCAL0 ... LOG_LOCAL7

Указывает на компонент, который будет заносить сообщения в syslog

suhosin.log.syslog.priority

LOG_ALERT (1)

LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_WARNING, LOG_NOTICE, LOG_INFO, LOG_DEBUG, LOG_ERR

Приоритет сообщения

suhosin.log.sapi

S_ALL

Определяет, какие классы тревог регистрируются через SAPI

suhosin.log.script

0

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

suhosin.log.phpscript

Какие классы тревог будут регистрироваться через PHP-скрипт, S_MEMORY также не может регистрироваться

suhosin.log.script.name

Полный путь к внешнему скрипту. Скрипту будет передано два параметра. Первый – класс тревоги в буквенной нотации, второй – сообщение

suhosin.log.phpscript.name

Полный путь к внешнему php-скрипту. Ему будет передано два параметра: SUHOSIN_ERRORCLASS и SUHOSIN_ERROR, назначение которых аналогично предыдущему

suhosin.log.use-x-forwarded-for

0 (отключено)

Обычно IP-адрес атакующего извлекается из переменной REMOTE_ADDR, включение этой опции позволит использовать HTTP-заголовок X-Forwarded-For (например, используется прокси)

suhosin.log.syslog

suhosin.log.syslog.facility

Опции исполнения suhosin.executor.max_depth

0 (отключено)

Задает максимально разрешенную глубину стека, после чего выполнение скрипта будет остановлено

suhosin.executor.include.max_traversal

0

Определяет, сколько знаков ../ в запросе будет расценено как атака

suhosin.executor.include.whitelist

Разделенный запятой список разрешенных или запрещенных URL, которые можно включить в скрипт. Если не указан белый список, используется только черный, если не указаны оба, то вставка URL запрещена

suhosin.executor.include.blacklist

suhosin.executor.func.whitelist

suhosin.executor.func.blacklist

Список разрешенных или запрещенных для вызова функций. Если белый список пуст, анализируется черный, если пусты оба, то функции запрещены

– Список функций, разделенных запятой, которые разрешено или запрещено запускать посредством eval(). Если белый список пуст, анализируется черный, если пусты оба, то вызов функции через eval() запрещено

suhosin.executor.eval.whitelist

suhosin.executor.eval.blacklist

suhosin.executor.disable_eval

0

Глобальное отключение использования eval(). В журнале будут отображены все нарушения этого правила, поэтому можно отследить все случаи использования eval()

suhosin.executor.disable_emodifier

0

Модификатор /e внутри функции preg_replace() позволяет выполнять код, разработчики рекомендуют отключить ее использование и применять preg_replace_callback() Дополнительные опции

suhosin.simulation

0

Очень полезная опция, позволяет переводить систему в режим регистрации нарушений, то есть создав правила, вы можете некоторое время только регистрировать нарушения, чтобы затем комплексно оценить работу скриптов

suhosin.mail.protect

0

0, 1, 2

Включает защиту функции mail(). 0 – отключена, 1 – контроль Subject:, To:, 2 – дополнительно To:, CC:, BCC:

suhosin.memory_limit

0

Управление изменением memory_limit, при 0 – изменение запрещено, любое число показывает предел в Мб, при запросе скриптом большего значения его выполнение будет остановлено

76


безопасность Таблица 1. Опции Suhosin (продолжение) Опция

Значение по умолчанию

Возможные значения

Пояснение

Опции прозрачного шифрования suhosin.session.encrypt

1 (включено)

Разрешение/отключение шифрования сессии

suhosin.session.cryptkey

Ключ для шифрования сессии

suhosin.session.cryptua

1

suhosin.session.cryptdocroot

suhosin.session.cryptraddr

0

0-4

Число октетов REMOTE_ADDR, от которых будет зависить ключ шифрования

suhosin.cookie.encrypt

1

Шифрование Cookie. Значение остальных опций suhosin.cookie.cryptkey, suhosin.cookie.cryptua, suhosin.cookie.cryptdocroot, suhosin.cookie.cryptraddr аналогично

Зависимость ключа шифрования от полей User-Agent, Documentroot

Опции фильтрации

suhosin.filter.action

Определяет реакцию Suhosin на нарушение фильтров. По умолчанию переменная блокируется, 402 – останавливает скрипт и возвращает код ответа HTTP 402; [302,]http://www.site.com – перенаправляет по указанному адресу, в квадратных скобках может стоять код ответа; [402,]/var/scripts/badguy.php – перенаправляет на указанный скрипт

suhosin.cookie.max_array_depth

100

Максимальная глубина массива, зарегистрированного через cookie

suhosin.cookie.max_array_index_length

64

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

suhosin.cookie.max_name_length

64

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

suhosin.cookie.max_totalname_length

256

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

suhosin.cookie.max_value_length

10000

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

suhosin.cookie.max_vars

100

Определяет максимальное количество переменных, зарегистрированных через cookie

suhosin.cookie.disallow_nul

1

Если 1, то символы ASCIIZ в переменных не разрешены

Максимальная глубина массива, зарегистрированного через URL Значение остальных опций (suhosin.get.max_array_index_length, suhosin.get.max_name_length, suhosin.get.max_totalname_length, suhosin.get.max_value_length, suhosin.get.max_vars, suhosin.get.disallow_nul) сопоставимы с предыдущими

Максимальная глубина массива, зарегистрированного через POST. Значение остальных опций (suhosin.post.max_array_index_length, suhosin.post.max_name_length, suhosin.post.max_totalname_length, suhosin.post.max_value_length, suhosin.post.max_vars, suhosin.post.disallow_nul) сопоставимы с предыдущими

suhosin.get.max_array_depth

suhosin.post.max_array_depth

50

100

suhosin.request.max_array_depth

100

Максимальная глубина массива, зарегистрированного через все доступные методы URL, GET , POST или COOKIE. Может быть индивидуально переопределена предыдущими опциями. Также доступны параметры suhosin.request.max_array_index_length, suhosin.request.max_totalname_length, suhosin.request.max_value_length, suhosin.request.max_vars, suhosin.request.max_varname_length, suhosin.request.disallow_nul

suhosin.upload.max_uploads

25

Максимальное число файлов, пересылаемых одним запросом

suhosin.upload.disallow_elf

1

Установка запрета на загрузку ELF-файлов

suhosin.upload.disallow_binary

0

Установка запрета на загрузку двоичных файлов

suhosin.upload.remove_binary

0

Установка удаления двоичного контента из загружаемых файлов

suhosin.upload.verification_script

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

suhosin.session.max_id_length

128

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

ти правила. В Suhosin достаточно лишь оптимально установить параметры и в дальнейшем система не потребует вмешательства. 1. Web Hacking Statistics – http://www.webappsec.org/projects/whid/ statistics.shtml. 2. Яремчук С. Определяем уязвимость веб-сервиса с помощью Acunetix Web Vulnerability Scanner. //Системный администратор, № 9, 2005 г. – C. 68-69.

№11, ноябрь 2006

3. Яремчук С. Как повысить безопасность веб-приложений. //Системный администратор, № 2, 2006 г. – C. 60-66. 4. Сайт проекта Hardening-Patch – http://www.hardened-php.net/hphp. 5. Сайт проекта Suhosin – http://www.hardened-php.net/suhosin. 6. Скрипт bench.php – http://cvs.php.net/viewvc.cgi/ZendEngine2/ bench.php?content-type=text/plain&view=co. 7. Документация по настройке Hardening-Patch (опции в большинстве схожи с Suhosin) – http://www.hardened-php.net/ hardening-patch-0.4.3-manual-alpha.pdf.

77


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

Чего ждать от Perl 6

Андрей Шитов Perl готовится сделать новый рывок и оставить конкурентов позади. До круглой цифры счетчику версий осталось совсем немного, всего 0.1.2 версии.

П

ро Perl 6 впервые начали гово- язык от устаревших конструкций (на- тя так будут поступать разве что истинрить в 2000 году, когда было пример, GLOB), а с другой – добавить ные энтузиасты), а уж познакомиться принято решение переписать «современности» (например, вклю- с языком просто необходимо. существующий язык с чистого листа. чив в язык полноценную поддержку Общее направление задал соИсторически сложилось так, что фор- классов). здатель Perl Ларри Уолл: в статьях под общим названием «Откровения» мального стандарта никогда не су(Apocalypses) описано, каким он видит ществовало. Стандартом пятой вер- Часть 1. До языка сии фактически был язык, воплощен- К сожалению для разработчиков будущий язык. Позже появился еще один цикл ный в интерпретаторе. Желание иметь и к счастью для стандарта, после шесчеткие правила – одна из предпосылок ти лет еще не существует ни оконча- «Толкования» (Exegeses), в которых к созданию нового языка. тельных правил, ни полноценного ком- Дамиан Конвей поясняет «ОткровеКроме того, требовались измене- пилятора. Тем не менее, уже сегодня ния» на примерах. И, наконец, сущестния, чтобы, с одной стороны, очистить язык можно применять на практике (хо- вует начатый Эллисон Рэндал набор

78


программирование «Конспектов» (Synopses); они по сути являются спецификацией, от которой отталкиваются разработчики компиляторов. Одна из разработчиков (да, это женщина!) нового компилятора Одри Танг (Audrey Tang) изобразила на условном графике эволюцию Perl 6. Развитие временами напоминает хаос, тем не менее, надежда увидеть работающий Perl 6 есть.

Perl 6 и Perl 5 Синтаксис пятой и шестой версий не совместим друг с другом. Поэтому, чтобы начать изучать Perl 6, не обяУсловная кривая развития Perl 6. (Рисунок Одри Танг) зательно предварительно осваивать Новый цикл разработки программ семблер (Parrot assembler, PASM), котоPerl 5. Однако программистам, знакомым с пятой версией, будет проще на Perl 6 дает сразу два преимущест- рый содержит набор инструкций, очень понять многие конструкции, которые ва. Во-первых, во время выполнения похожих на те, которые применяются в новую версию либо полностью пе- теперь не требуется интерпретировать в обычном ассемблере для физичесрешли из предыдущей, либо измени- исходный код, вместо этого виртуаль- ких RISC-процессоров. Все операции ная машина выполняет предваритель- выполняются с операндами в виртулись только косметически. Perl 5 и Perl 6 не просто разные но скомпилированный байт-код (идео- альных регистрах разных типов: наприверсии одного языка. Правильнее бу- логия Java в чистом виде). Во-вто- мер, в одних регистрах хранятся целые дет сказать, что это два разных язы- рых, появилась возможность созда- числа, в других строки. Один из типов ка, объединенных одной идеей. Ны- вать программы из частей на разных необычен (как и его название Parrot нешние компиляторы не способны языках, для которых созданы транс- Magic Cookie, PMC) и предназначен выполнить программу другой версии. ляторы в байт-код (идеология .NET). специально для поддержки объектноТем не менее изначально предполага- На первый взгляд может показаться, ориентированного программирования. лось, что рабочая версия нового ком- что не было смысла создавать собс- Байт-код сохранялся в файле с расшитвенный формат байт-кода, а восполь- рением .pbc (pre-compiled bytecode). пилятора станет универсальной. Поскольку число регистров ограКстати, предыдущий «апгрейд» зоваться, например, правилами .NET. языка с четвертой версии на пятую то- Но основные языки, с которыми рабо- ниченно, программировать непосредсже требовал от программистов допол- тает .NET, – языки с сильной типиза- твенно на ассемблере PASM неудобно нительных усилий из-за некоторых не- цией. Байт-код же, используемый для (конечно, прежде всего разработчикам Perl 6, сконструирован с расчетом на компиляторов), и появились сопутссовместимостей. динамические языки без фиксирован- твующий язык IMC (Intermediate Code) ных типов данных, подобные Perl, на- и компилятор IMCC (Intermediate Code Архитектура Compier). IMC представляет собой над«Прошлый» Perl всегда был интерпре- пример, Python и Ruby. Наличие промежуточного байт-ко- стройку над ассемблером и разрешатируемым языком. Это часто давало повод противникам говорить о не- да не отменяет преимущества новой ет пользоваться произвольными певозможности применять язык в кри- версии как традиционного скрипто- ременными, поэтому нехватка регистических по времени приложениях. вого языка. Программу всегда мож- тров перестает ощущаться. Сегодня Наличие mod_perl и компиляторов но модифицировать на ходу, выпол- вместо IMC используется PIR (Parrot perl2exe не спасает положения, пос- няя ее с командной строки и не заду- Intermediate Representation). Ponie (еще одна тупиковая ветвь кольку, например, для программиро- мываясь о том, что происходит внутри в развитии Perl 6) – это попытка сования под mod_perl требуется учи- компилятора. здать компилятор в байт-код для протывать специфические ограничения, грамм, написанных на Perl 5. а perl2exe редко способен сгенериро- Parrot, PASM, IMC, PBC, Ponie, Библиотека CPAN содержит набор вать работающий код для программы, PIR, PUGS, PIL, Perl6::* История развития за последние шесть модулей Perl6::*, которые были напиболее сложной, чем «Hello, World!». В Perl 6 с самого начало было ре- лет, даже несмотря на наличие генпла- саны, чтобы поэкспериментировать шено изменить традиционный подход на, испещрена названиями и аббре- с синтаксисом шестой версии, имея и применить схему «программа – ком- виатурами; часть из них уже потеряли компилятор пятой. Пользоваться этими модулями сегодня особой необхопилятор – байт-код – виртуальная ма- свою актуальность. Parrot – это название упомянутой димости нет. шина». Эта схема не новая, и к 2000 гоВ состав Parrot входит около деду уже работала с языком Java, а чуть выше виртуальной машины. На ранней стадии использовался собственный ас- сятка компиляторов, создающих байтпозже в технологии .NET.

№11, ноябрь 2006

79


программирование ходных кодов без ошибок (за пару часов), но затем при установке Pugs конфигуратор сообщил, что не хватает модуля mtl в составе GHC: *** Could not load the "mtl" package in your GHC installation.

Приветствие, выводимое при запуске Pugs

код из программ на разных языках (иногда экзотических типа Ook!), в том числе экспериментальный компилятор Perl 6. Компилятор в составе Parrot более не развивается, ему на смену пришел проект Pugs (Perl 6 User’s Golfing System), которым занимается Одри Танг. Pugs тоже внес свой вклад в список сокращений, например, создав собственный формат PIL (Pugs Intermediate Language).

Установка Perl 6 Разбираться в месиве форматов необязательно, достаточно установить последнюю версию Pugs. Правда, радужная картина немного меркнет, когда узнаешь, что Pugs написан на языке Haskell, и для сборки необходим работающий компилятор. (А тем, кто захочет попробовать в действии новые регулярные выражения, возможно, потребуется и установленный Parrot.) Компилятор доступен на сайте www.haskell.org/ghc как в исходных кодах, так и в бинарных дистрибутивах для некоторых платформ. Самостоятельная сборка компилятора GHC происходит крайне долго, хотя и гладко. Итак, если для вашей платформы не нашлось бинарной версии Pugs, необходимо последовательно выполнить две процесса: установить компилятор GHC, после чего собрать Pugs. Ссылки на исходные и бинарные коды находятся на сайте проекта www.pugscode.org. Процесс сборки из исходных кодов стандартный для модулей Perl: perl Makefile.PL make make install

Примечание: исходный код Pugs размещен на сайте CPAN, но он не имеет отношения к модулям Perl6::*, о которых говорилось в предыдущем разделе. Во время подготовки статьи для тестирования программ я пользовался двумя версиями Pugs под Windows XP SP2 и Linux Red Hat 9. На каждой системе установлены GHC 6.6, Parrot 0.4.6, Pugs 6.2.13 и Perl 5.8.8. Кстати, при установке Pugs просит самую последнюю версию компилятора GHC, сообщая, что с более ранней скомпилировать-то пока удастся, но скорость работы будет низкой, а в будущем старая версия GHC вообще не подойдет. Компилятор Haskell под Windows установлен из msi-файла (необходим один дистрибутив размером 37 Мб, находящийся на официальном сайте). На второй системе получить желаемый набор удалось не сразу. В первый раз компилятор GHC собрался из ис-

80

Впрочем, далее в сообщении об ошибке следует разъяснение о том, что дополнительно необходимо поставить комплект библиотек extralibs. Итого, при сборке компилятора Haskell из исходных кодов нужны два файла, в данном случае ghc-6.6-src.tar.bz2 и ghc-6.6-src-extralibs.tar.bz2. Они находятся на том же сайте в разделе Source Distribution. Распаковав их в общий каталог и заново собрав GHC (еще два часа), удалось получить все необходимое для сборки Pugs.

Часть 2. Язык Самостоятельное изучение Perl 6 – сегодня занятие, больше похожее на исследовательскую работу. Теоретические источники знаний подборка Synopses, практические каталоги с примерами, входящими в поставку Parrot (languages/perl6/examples) и Pugs (examples/). В оставшейся части статьи бегло рассмотрены основные моменты Perl 6. Предполагаю, что вы знакомы с пятой версией, в этом случае чувство новизны языка ощущается сильнее. Все приведенные примеры кода проверены в Pugs 6.2.13 на двух системах: под Windows и Linux. Запуск программ на исполнение аналогичен тому, как это происходит в Perl 5. Если код записан в файле, передайте его аргументом при вызове pugs: > pugs programme.p6

Короткие однострочные программы допустимо записывать непосредственно в командной строке: > pugs –e'print "This is Perl 6"'

Кстати, для запуска pugs удобно сделать псевдоним p6 или perl6. Наконец, на платформе UNIX в файле с программой можно указать путь к компилятору: # !/usr/local/bin/pugs

и сделать файл исполняемым: > chmod 0755 programme.p6 pugs –e'print "This is Perl 6"' > ./programme.p6

К сожалению, объем журнальной статьи не позволяет описать все детали новых возможностей языка. Новшеств много, и они находятся на самых разных уровнях от способа записи скобок при вызове функции до идеологии объектно-ориентированного программирования. Хотя я отобрал для обзора наиболее интересные изменения, кому-то все равно может показаться, что подборка несколько субъективна. Все приведенные примеры содержатся в архиве, доступном по адресу: http://perl6.ru/publish/samag/code.zip.


программирование Вывод на печать Прежде чем рассматривать особенности Perl 6, необходимо познакомиться с механизмом вывода на печать, поскольку он потребуется в каждом примере. Стандартная функция print() по-прежнему доступна, но в Perl 6 появился метод say(), действие которого аналогично работе функции print(), но всегда завершается переводом строки. Новый способ вывода особенно удобен в отладочных сценариях, когда вписывать переводы строки вручную утомительно. # say.p6 say "This is Perl 6"; say 123; say(8 * 9);

Я не случайно назвал say() методом, поскольку им можно пользоваться не только как функцией, но и как методом объекта, например: # say-method.p6 "This is Perl 6".say; 123.say; (8 * 9).say();

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

для списков и % – для хешей. Однако теперь при обращении к отдельным элементам массивов и хешей (а отдельные элементы чаще всего бывают скалярами) сигил изменять не требуется. Например, обращение к элементу списка выглядит как @array[5], в то время как раньше приходилось писать $array[5]. Иными словами, переменная всегда сохраняет свой префикс-сигил. # variables.p6 my $string = 'abcde'; my @array = ('alpha', 'beta', 'gamma'); my %hash = {'alpha' => 'A', 'beta' => 'B', 'gamma' => 'C'}; say $string; # abcde say @array[1]; # beta say %hash{'gamma'}; # C

Связывание переменных Связывание (binding), или создание ссылок, осуществляют операторы «:=» и «::=». Они создают синоним переменной, указанной справа от оператора. Любое обращение к синониму эквивалентно обращению к оригинальной переменной: # binding.p6 my $a = 123; my $b := $a; $b = 456; say $a; # 456

Хотя в последней строке происходит обращение к переменной $a, на экране появится значение 456, которое присвоено через ссылку $b. 'error'.say (); Различие между формами с одним и двумя двоеточиями заключается в моменте, когда выполняется связывание. В первом случае оно происходит на этапе выполнения Такая запись приведет к ошибке: программы, во втором – на этапе компиляции. $ p6 say-method.p6 Это также сказывается и на размере промежуточного кода. *** Unexpected "();" Например, если приведенную программу оттранслироexpecting comment, operator, statement modifier, вать в промежуточный PIR-файл (указав опцию -CPIR), по";" or end of input at say-method.p6 line 7, column 13 лучится код длиной 91 049 байт, а та же программа с оператором «::=» окажется чуть короче (90 897 байт). Не стоКомментарии оформляются так же, как и в Perl 5, сим- ит пугаться таких размеров промежуточного кода, потому что в нем собрано много определений операторов, которые волом #. данной программой не используются.

Поддержка юникода

Исходный код программ на Perl 6 по умолчанию считается Конкатенация строк написанным в юникоде. Поэтому можно смело пользовать- «Складывание» строк теперь выполняет не оператор «точся любыми символами из нелатинских кодировок: ка», а тильда: # unicode.p6 say "Превед!"; say "β-sitostérol"; say "

!"

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

Переменные В Perl 6 по-прежнему применяются сигилы (sigils) для обозначения типа структуры переменной: $ – для скаляров, @ –

№11, ноябрь 2006

# concatenation.p6 my $before = 'This is'; my $after = 'Perl 6.'; say $before ~ ' ' ~ $after;

Одинарные и двойные кавычки в строках имеют тот же смысл, что и в Perl 5.

Операторы «//» и «//=» Бинарный оператор «//» (не путайте с началом однострочного комментария) принимает два операнда и возвращает первый из них, если он определен, и второй, если не определен первый.

81


программирование # double-slash.p6 my $a = "a"; my $b = "b"; my $c; say $b // $a; # b say $c // $a; # a

При первом вызове метод say() получает значение переменной $b (поскольку она определена), а второй $a (потому что значение у переменной $c отсутствует). Оператор «//=» выполняет то же действие, но над единственной переменной: вызов «$a //= $b» равнозначен «$a = $a // $b».

Интервальные условия В Perl 6 операторы сравнения допускается объединять в цепочку, что позволяет создавать компактные записи, например, для проверки попадания значения переменной в заданный интервал: # interval.p6 my $x = 5; say "yes" if 0 < $x < 10; if 0 < $x < 10 {say "yes"}

Кстати, из второго блока сравнений видно, что теперь необязательно использовать скобки в условии.

Контексты Perl 6 позволяет вручную управлять контекстом, в котором происходит работа с переменной; в некотором смысле это подобно преобразованию типов. Контекст устанавливается с помощью унарного оператора: # contexts.p6 my @array = (5..10); # Строковый контекст say ~@array; # 5 6 7 8 9 10 # Числовой контекст (возвращается размер массива) say int @array; # 6 say +@array; # 6 # Два модификатора контекста say ~ hash @array; # напечатает содержимое в два столбца my $value = 100; # Булевый контекст say ?$value; # 1 (то есть истина)

Функции Ключевое слово для объявления функции sub не изменилось. А механизм передачи параметров стал нагляднее. Например, при объявлении функции возможно указать именованные аргументы. При вызове нужно либо соблюдать порядок объявления, либо явно указывать имена. # sub-args.p6 callme(10, 20); callme(second => 7, first => 8); sub callme ($first, $second) { say "\$first = $first, \$second = $second"; }

82

Еще раз отмечу, что при вызове функции скобки нужно ставить вплотную к имени, иначе произойдет ошибка: Extra space found after &callme (...) – did you mean &callme(...) instead?

В объявлении наличие или отсутствие пробела не имеет значения. Одновременно с именами задаются и структурные типы формальных параметров (это было возможно и ранее, но не так наглядно). Параметры функции могут содержать модификаторы (traits), изменяющие их поведение. В частности, модификатор is rw дает возможность перезаписывать переданный аргумент: # sub-rw.p6 my $string = "before"; callme($string); say $string; # after sub callme ($value is rw) { $value = "after"; }

Попытка изменить аргумент без такого модификатора будет пресечена компилятором: *** Can't modify constant item: VRef <Scalar:0x1c6cfc4> at sub-rw.p6 line 9, column 9-25

Чтобы произвольно изменять значение, требуется указать модификатор is copy. При вызове функции по умолчанию не происходит «сворачивания» всех переменных в общий массив. Например, теперь удается безболезненно передать в функцию два массива, нигде явно не указывая их длину: # sub-slurp.p6 my @odd = (1, 3, 5); my @even = (2, 4, 6); view(@odd, @even); sub view (@a, @b) { say @a; say "&"; say @b; }

Необязательные параметры (которые должны идти последними в списке) помечают вопросительным знаком. Дополнительно можно указать значение по умолчанию: # sub-optional.p6 callme(1, 2); # 1, 2 callme(3); # 3, 4 sub callme ($a, $b? = 4) { say "$a, $b"; }

И наконец Perl 6 позволяет объявлять анонимные функции с помощью стрелки: # sub-anonymous.p6 my $anonymous = -> ($value) { say $value * 2; } $anonymous(10); # 20


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

Перегрузка функций Ключевое слово multi разрешает перегружать функции, то есть создавать несколько функций с одинаковым названием, но разным типом или числом аргументов. # sub-reload.p6 multi sub action ($scalar) { say "scalar"; } multi sub action ($scalar, $scalar) { say "two scalars"; } multi sub action (@array) { say "array"; } action(10); # scalar action(10, 11); # two scalars my @arr = (1, 2); action(@arr); # array

Перегрузка операторов Возможность перегружать не только функции, но и операторы явно придется по вкусу любителям C++. Perl 6 позволяет с помощью ключевых слов prefix, infix и postfix определять собственную семантику предопределенных операторов либо создавать новые:

# given.p6 my $x = 'y'; given ($x) { when "a" {say 'First letter'} when "b" {say 'Second letter'} default {say "Is '$x'"} }

Блоки when могут содержать и более сложные конструкции, например, сопоставление с регулярным выражением: given ($x) { when /<[a-z]>/ {say 'isalpha'} }

Программа напечатает isaplha, поскольку буква «y» совпадает с символьным классом <[a-z]> в регулярном выражении.

Новые регулярные выражения В документации на Perl 6 большой раздел посвящен новому синтаксису (не будет ошибкой сказать – новой идеологии) регулярных выражений. Кроме правил (regexps) теперь существуют грамматики (grammars), их объединяющие. Например, ранняя версия компилятора Perl 6, входящая в состав Parrot, при первом запуске создавала файл Perl6grammar.pm, описывающий синтаксис Perl 6, записанный в виде грамматики Perl 6. Подробное рассмотрение новых регулярных выражений требует отдельной статьи.

# xfix.p6

Классы и роли

multi infix:<+> ($a, $b) { return $a - $b; } say 10 + 20; # -10 sub postfix:<@> ($power) { 2 ** $power; } say 8@; # 256

Классы и роли – одно из самых существенных нововведений в Perl 6. Формально поддержка ООП была и в Perl 5, но «классы» являлись просто хешами с некоторыми дополнительными возможностями. Механизмы ООП в Perl 6 проще для понимания и образуют намного более стройную модель. Чтобы научиться применять классы, программистам, знакомым с другими объектными языками, достаточно познакомиться с синтаксисом, присущим Perl 6. Для определения класса служит ключевое слово «class»:

gather и take В Perl 6 появилась удобная пара gather/take, которая помогает избежать вспомогательного массива, когда нужно сохранять промежуточные результаты в циклических операциях. # gather.p6 say gather { for 1..5 -> $c { take $c; } }

Каждый вызов take добавляет новое значение в массив, возвращаемый блоком gather, и программа напечатает строку 12345. (Кстати, стрелка –> здесь является не чем иным, как началом анонимной функции.)

given, when и default Ключевые слова given, when и default предназначены для организации конструкции типа switch в C:

№11, ноябрь 2006

# class.p6 class Alphabet { }

Объекты класса создаются с помощью оператора new: my $abc = new Alphabet;

Члены-данные объявляют, используя has. Точка перед именем является признаком того, что переменная объявляется как открытая (public в общепринятой терминологии); отсутствие точки делает ее закрытой (private): class Alphabet { has $.Name; has $Length; } my $abc = new Alphabet; $abc.Name = 'Latin'; # синтаксически верно #$abc.Length = 26; # ошибка

83


программирование При создании объекта возможно инициализировать члены-данные: my $abc = Alphabet.new(Name => 'Latin', length => 26); say $abc.Name;

Классы могут содержать методы; они так и объявляются с ключевым словом «method»: class Alphabet { has $Name; has $Length; method Info { return "Aplhabet '$.Name' contains ↵ $.Length letters."; } }

Обратите внимание: хотя теперь обе переменные объявлены закрытыми, при обращении к ним из методов класса все равно необходима точка: $.Name. Конструктор и деструктор – это методы с именами BUILD и DESTROY. Классы можно наследовать, причем в Perl 6 допустимо множественное наследование. Чтобы создать производный класс, нужно указать базовый после ключевого слова «is»: class Characters is Alphabet { } my $chars = new Characters; say $chars.Info();

Разрешено и множественное наследование: class Unique; class Characters is Alphabet is Unique { }

В Perl 6 появилось новое понятие ролей. В других языках поведение, аналогичное действию ролей, реализуют либо абстрактные классы, либо интерфейсы. По сути, роли – это такие классы, которые запрещено инстанциировать (то есть создавать отдельные экземпляры этого класса). Чтобы «приписать» классу некоторую роль, нужно создать производный класс, воспользовавшись ключевым словом «does» вместо «is». role HaveName { has $.Name; method GetName { return $.Name; } } class NamedAplhabet does HaveName { } my $abc = NamedAplhabet.new(Name => 'English'); say $abc.GetName();

Роли могут быть как полноценными классами, содержащими и данные, и методы, так и абстрактными интерфейсами. Для объявления абстрактных методов служит ключевое слово «...» (три точки), которое, к сожалению, не реализовано в текущей версии Pugs.

84

Perl 6 на бумаге Книг, посвященных Perl 6, пока исключительно мало. Первая Perl 6 Essentials выпущена издательством O’Reilly летом 2003 года (ISBN 0-596-00499-0) и переиздана через год под измененным названием Perl 6 and Parrot Essentials (ISBN 0-596-00737-X). Второе издание переведено на русский язык: «Perl 6 и Parrot: справочник». М.: «Кудиц-образ», 2005. ISBN 5-9579-0086-9. Обе книги написаны Э. Рэндалом, Д. Сугальски и Л. Тёчем. Во время издания этих книг разговор о Perl 6 не мог обойтись без более или менее детального описания Parrot. Поэтому значительная часть книги посвящена языку ассемблера Parrot. К сожалению, по этим книгам нельзя научиться программировать на Perl 6, поскольку описанные языковые конструкции либо остались нереализованными, либо радикально изменились. Эти книги теперь можно назвать «историческими» или «идеологическими». В 2005 году вышла в свет книга Скота Вальтерса Perl 6 Now. The Core Ideas Illustrated with Perl 5. Примеры кода часто используют модули Perl6::* и, возможно, не будут работать в «настоящем Perl 6» в том виде, в каком они опубликованы (впрочем, от этого не застрахованы и примеры из моей статьи). Примеры кода из книги доступны на сайте www.perl6now.com.

Perl 6 в Интернете На русском языке: 1. http://perl6.ru – блог, в котором я описываю процесс освоения Perl 6. Первая запись на этом сайте появилась в 2003 году. 2. http://real.perl6.ru – первый в России сайт, работающий под управлением Perl 6. Здесь есть несколько крошечных примеров того, как можно написать CGI-приложение на Perl 6. 3. http://www.dklab.ru/chicken/perl6 – перевод фрагментов первых версий «Откровений» Ларри Уолла. 4. http://www.parrotcode.ks.ua/docs – перевод документации ранней версии Parrot. На английском языке: 1. http://dev.perl.org/perl6 – сайт Perl Development: Perl 6, который является отправной точкой. Здесь же размещены основные документы, описывающие будущую структуру языка: Apocalypses, Exegeses и Synopses. 2. http://perlcabal.org/syn – на этой странице, названной Official Perl 6 Documentation, содержится хорошо структурированный сборник основных «правовых» документов. 3. http://www.parrotcode.org – Parrot Virtual Machine. Исходные коды и другая информация про Parrot. 4. http://www.pugscode.org – сайт Pugs. 5. http://perl6.org, http://perl6.info – архивы рассылок perl6users, perl6-languages и других, посвященных языку. 6. http://www.programmersheaven.com/2/Perl6-FAQ – свежий FAQ с примерами кода. 7. http://www.cpan6.org – находящийся на зачаточной стадии новый CPAN, ориентированный на новый язык. 8. http://en.wikipedia.org/wiki/Perl_6 – Perl 6 в «Википедии».


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

История компьютерных вирусов

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

86


ретроспектива Предвестники электронных эпидемий Сказать, где и когда появился первый вирус, невозможно, поскольку таких данных в природе не существует. Если на «компьютере» Чарльза Бэббиджа, «отца» первой вычислительной машины, вирусов ещё не было, к середине семидесятых годов прошлого века они стали весьма распространенным и неприятным для большинства явлением. Тем не менее, предпосылки к их созданию появились практически сразу же с созданием первых ЭВМ. Еще в 1940 году математик Джон фон Нейман написал книгу, в которой были описаны самовоспроизводящиеся математические автоматы, то есть принципы, которые легли в основу всех вирусов. В 1959 году американский научный журнал «Scientific American» опубликовал статью Л. Пенроуза, рассказывавшую о самостоятельно распространяющихся биологических структурах. Автор рассмотрел способности подобных структур к мутациям, активации и размножению. Другой ученый, Ф. Шталь, полученные из этой статьи знания реализовал на практике. Работая оператором в научно-исследовательской лаборатории, он имел доступ к мощнейшей для того времени ЭВМ – IBM 650. Эксперимент очень удивил Шталя, превзойдя все его ожидания. Получившийся в результате «мутации» математических алгоритмов электронный «зверек» удалил все следы своих «родителей», присутствовавших в системе, после чего самоуничтожился. Естественно, все вышеперечисленные труды и опыты были направлены не для того, чтобы нынешние вирусописатели ежедневно выбрасывали в Интернет мегабайты новой «заразы». Изначально эти исследования, относившиеся к области создания искусственного интеллекта, представляли собой академический интерес. Однако любое открытие, сделанное в мирных целях, может быть без особых трудностей превращено в мощное оружие разрушения. В 1961 году среди компьютерщиков была очень популярна игра «Darwin». Её сюжет и смысл были просты: игрок руководил «расой», которая долж-

№11, ноябрь 2006

на была уничтожить своих конкурен- ного. Если ему это не удавалось, игтов. Выигрывал тот, кто захватит всю ра предлагала модернизировать ее, отданную под игровой процесс опе- после чего появлялась возможность ративную память. Особых действий задавать дополнительные наводящие в игре не требовалось: необходимо вопросы. Модифицированная версия пробыло лишь размножить принадлежащих к своей расе на свободные ячей- граммы странным образом начинаки ОЗУ или же захватить ячейки про- ла копироваться в другие директории, тивника. Подобный алгоритм очень в результате чего через некоторое похож на логику работы деструктив- время во всех папках жесткого диска содержалась копия Pervading Animal. ных программ. Широкое распространение ком- Так как в то время каждый килобайт пьютерных сетей стало катализато- пространства был «на вес золота», пором появления на свет первых де- добное поведение игры мало кого обструктивных программ – компьютер- радовало. До сих пор не ясно, была ли это ошибка программистов либо же заных вирусов. думка вирусописателей. Впрочем, проблема была быстро решена – новая 70-е годы: начало Появление первого в мире компью- версия операционной системы Exec терного вируса было зафиксировано 8 базировалась на другом типе файв начале 70-х годов прошлого столе- ловой системы, на которой програмтия, когда на просторах военной ком- ма засорять файловое пространство пьютерной сети APRAnet – прароди- больше не могла. тельницы современного Интернета – была найдена программа Creeper. Ви- 80-е: первые эпидемии рус был написан для распространен- К восьмидесятым годам прошлого стоной в те времена операционной сис- летия компьютер перестал быть ростемы Tenex, в которую он проникал, кошью, доступной лишь избранным. распространяясь через модемную Владельцев ПК становится все больсвязь. На экран зараженных компью- ше, кроме того, обмен информацитеров периодически выводилась над- ей между пользователями с помощью пись: «I’M THE CREEPER: CATCH ME электронных досок объявлений (BBS – IF YOU CAN». Деструктивных дейс- Buletin Board System) достиг междунатвий Creeper не совершал, ограничи- родного масштаба. В 1981 году произошла первая поваясь лишь этим сообщением, раздражавшим пользователей. Чуть поз- настоящему массовая вирусная эпиже для него было написано «противо- демия. Пострадали широко распроядие» – программа Reaper, находив- страненные в то время компьютеры шая файл с вирусом и удалявшая его. Apple II. Вирус Elk Clone записывался Распространялась она, кстати, ана- в загрузочные секторы дискет в мологичным с Creeper способом. Можно мент обращения к ним пользователя. сказать, что первый в мире антивирус Elk Clone искажал изображение на мобыл создан «по аналогии с вредонос- ниторе, выводил на экран различные текстовые сообщения, заставлял миной программой». В 1974 году «частым гостем» на раз- гать текст. Неискушенные пользователичных серверах была программа ли впадали от действий вируса в оцес милым для животноводов названи- пенение, в то время как он сам продолем Rabbit. «Кролик» ничего, кроме рас- жал «перемещаться» с одного компьюпространения и размножения само- тера на другой. В 1983 году американский прого себя, не делал. Программа самовоспроизводилась с огромной скоро- граммист Лен Эйделман впервые стью, постепенно занимая все систем- употребил термин «вирус», которым ные ресурсы. Иногда Rabbit даже вы- он обозначил саморазмножающиеся программы. зывал сбой в работе серверов. Спустя год Фред Коэн, один из саДругой пример – логическая игра Pervading Animal для операционной м ы х а в то р и тет н ы х в и рус ол о го в, системы Exec 8, смысл которой за- дал четкое определение понятию ключался в отгадывании пользовате- «компьютерный вирус»: «программа, лем загаданного программой живот- способная «заражать» другие про-

87


ретроспектива граммы при помощи их модификации обнаружить вирусный код в програм- Созданная неким Робертом Моррисом с целью внедрения своих копий». мах. Другим распространенным «ле- программа поражала компьютеры, раВ 1986 году 19-летний пакиста- карством» от вредоносных программ ботавшие под ОС UNIX. В планы созданец Басит Фарук Алви написал вирус того времени были «иммунизаторы». теля не входило нанесение вреда сисBrain. Также как и Elk Clone, Brain по- Этот тип ПО модифицировал все про- теме, червь должен был лишь проникражал загрузочные сектора дискет. граммы таким образом, чтобы вирусы нуть в сеть ARPAnet и оставаться там Программа не была ориентирована считали их уже зараженными и не вы- незамеченным. Вирус обладал возна какие-либо разрушительные функ- полняли по отношению к ним никаких можностью вскрытия паролей в ОС, ции, она лишь меняла метку всех дис- действий. После того как количест- и в списке выполнявшихся процессов кет на «(С)Brain». Как утверждает ав- во вирусов возросло в тысячи раз, ис- детище Морриса отображалось в виде тор, он преследовал только одну цель – пользование иммунизаторов было уже обычного пользовательского процесса. Червь стремительно саморазмножалвыяснить уровень компьютерного пи- бесполезным. Антивирусные фирмы чаще всего ся и пожирал все свободные ресурсы ратства у себя в стране. Но уже через несколько недель после активации ви- состояли из двух-трех человек и свои компьютера, вследствие чего из строя руса зараженными оказались тысячи продукты продавали за символичес- выходили целые серверы. Некотокомпьютеров по всему миру, что вы- кую сумму либо раздавали бесплат- рые из них смогли вернуться к работе звало настоящий переполох среди но. Но распространенность защитных лишь через пять суток, поскольку вакпользователей и бурю обсуждений программ была очень низка, да и не- цины против червя не существовало. в средствах массовой информации. прерывное появление новых вирусов За время своего «хождения по миру» В Brain был впервые использован при- делало их бессильными. Интернет вирус поразил около 6000 компьютерем, когда при чтении зараженного сек- в то время ещё не успел «вырваться» ных систем, затронув даже компьютетора диска вирус подставлял вместо из «объятий» учёных и военных, а об- ры исследовательского центра NASA. этого раздела незараженный. новляться без наличия глобальной се- Роберт Моррис отделался 400 часами В 1988 году была создана пер- ти было практически невозможно. общественных работ, но вошел в истоВ середине 80-х годов появился тер- рию как автор первого разрушительновая вредоносная программа, которая не просто заражала компьютер, мин «Virus Hoax» – «вирусная мистифи- го сетевого червя. но и наносила ему реальный вред. кация». В конце восьмидесятых пользоЭтот вирус был создан в Лехайском ватели панически боялись вирусов: ми- 90-е: полиморфные университете, в котором, кстати, рабо- фы о программах, выводящих из строя вирусы тал ранее упоминавшийся Фред Коэн. аппаратную часть ПК, будоражили ум В начале 90-х годов прошлого столеВирус Lehigh уничтожал информацию каждого владельца компьютера. Virus тия английская компания Sophos, в кона дисках, поражая системные файлы Hoax были ничем иным, как ложными торой работали Ян Храске, Эд УайлCOMMAND.COM. Наличие квалифи- слухами о новых компьютерных эпи- динг и Питер Лэймер, приступила к выцированных специалистов в универ- демиях. Вспоминается история, когда пуску журнала «Virus Bulletin». Virus ситете оказалось спасением – за сте- один шутник разослал на разные BBS Bulletin рассказывал о компьютерных ны учебного заведения он так и не про- сообщения о появлении нового виру- вирусах, а также обо всех аспектах брался. Впрочем, немалую роль в уст- са, который распространялся через защиты от них. Авторами журнала явранении угрозы эпидемии сыграл и ал- модемы, работавшие со скоростью пе- лялись программисты, руководители горитм самого Lehigh – во время фор- редачи информации 2400 бит в секун- антивирусных компаний, разработчиматирования винчестеров он само- ду. Чтобы не заразиться вирусом, ав- ки ПО. Журнал был некоммерческим: уничтожался вместе с остальной ин- тор рекомендовал перейти на модемы за всю его историю в нем не было насо скоростью 1200 бит/с. И что вы ду- печатано ни одного рекламного объявформацией. В это же время начало активно маете? Масса пользователей выброси- ления. Из-за этого Virus Bulletin не поразвиваться программное обеспече- ла более быстрые модемы ради своей лучил широкой распространенности. Его читателями были в основном проние, защищавшее компьютеры от ви- «безопасности». В 1988 произошла первая эпиде- фессионалы в сфере IT (информацирусов. Антивирусные программы того времени представляли собой про- мия, вызванная сетевым компьютер- онных технологий), а также сотруднистенькие сканеры, которые посредс- ным вирусом. Впоследствии такие ви- ки компьютерных фирм. В 1990 году появился новый тип твом контекстного поиска пытались русы стали именоваться «червями». вредоносных программ – полиморфОБСУЖ ДАЕМ НА ФОРУМЕ  Перспективы профессии ные вирусы. «Полиморфизмом» была ЖУРНАЛА  Настройка работы FreeBSD и Windows названа технология, при которой вирус Вы можете прочитать журнал от корки  Аутсорсинг IT нельзя было обнаружить сканером, исдо корки. И еще раз прочитать. И еще. А по-  Как получить DVD-диск с архивом но- кавшим вирусы с помощью фрагментом обсудить с коллегами самое интересное меров журнала тов уже известного вредоносного кона форуме: http://www.samag.ru/forum.  И многое другое да. Полиморфизм позволяет програмУже идет обсуждение тем: мам генерировать код во время испол Управляем серверами в реальном вреЗадайте интересующие вас вопросы, нения, в результате чего копия вирумени поделитесь своим мнением! са на каждом новом заражённом ком-

88


ретроспектива пьютере будет отличаться от предыдущей. Первым подобным вирусом стал Chameleon, написанный Марком Вашбёрном. После появления полиморфных программ неотъемлемой частью антивируса стал эмулятор для дешифрации кодов, впервые использованный Евгением Касперским. В этом же году в Болгарии, которая тогда была центром мирового вирусописания, появилась специализированная BBS, с которой каждый желающий мог скачать вредоносные программы. Конференции, посвященные программированию вирусов, появились и в UseNet. В это же время была опубликована книга «Маленькая Черная Книжка о Компьютерных Вирусах» Марка Людвига. Она стала «Библией» всех создателей вирусов. Была сформирована так называемая «VX-сцена» – сообщество программистов, специализирующихся на создании компьютерных вирусов.

Конструкторы вредоносных программ В 1992 году хакер, известный под ником Dark Avenger, выпустил в свет утилиту MtE (Mutation Engine). С её помощью любой, даже самый примитивный вирус можно было сделать полиморфным. Этим же человеком был впервые создан вирус Peach, наделенный способностью обходить антивирусное ПО. Peach удалял базу изменений программы Central Point AntiVirus. Эта программа, не находив свою базу данных, считала, что запущена впервые, и создавала её вновь. Таким образом, вирус обходил защиту и продолжал заражать систему. Группа программистов, известная в сети, как Nowhere Man, выпустила конструктор вирусов VCL (Virus Creation Laboratory). Отныне любой школьник, даже не владеющий языками программирования, мог вооружиться конструктором и собрать вирус любого типа и разрушительной силы. С появлением VCL и так немалый «поток» новых компьютерных вредителей стал просто огромным. Стоит ли удивляться, что спустя несколько дней после выхода в свет ОС Windows 3.11 появилась и первая деструктивная программа под эту платформу? Win.Vir_1_4 поражал испол-

№11, ноябрь 2006

Вирусы для мобильных устройств В 2000 году был впервые найден вирус для платформы PalmOS. Программа Phage.936 переходила между КПК во время передачи через ИК-порт. При заражении карманного компьютера могли быть удалены некоторые файлы, а приложения часто самопроизвольно закрываются. С тех пор появилось несколько десятков вирусов для различных платформ КПК, хотя они не столь разнообразны и «гибки», как их «собратья» для персональных компьютеров.

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

Первый арестованный вирусописатель На протяжении 1993-94 годов свет увидели новые конструкторы вирусов: PS-MPC и G2. Сгенерированные ими вредоносные программы стали самой распространенной опасностью в Интернете. В это же время состоялся настоящий «бум» среди производителей антивирусов – их программы, наконецто, стали обязательной составляющей к практически любой ОС. На рынок безопасности решила проникнуть даже Microsoft, выпустившая Microsoft AntiVirus (MSAV). Первоначально программа была популярна, но впоследствии крупнейший производитель программного обеспечения в мире прекратил разработку продукта. Лидерство в этой области постепенно завоевала компания Symantec, частью которой стали крупнейшие производители антивирусного программного обеспечения: Central Point и Fifth Generation Systems. Эпидемия нового полиморфного вируса, Pathogen, уже не была событием из ряда вон выходящим, к подобного рода событиям все уже начали привыкать. Однако это был первый вирус, автор которого был найден и осуждён. Безработный Кристофер Пайл за создание вредоносных программ был приговорен к 18 месяцам тюремного заключения.

Атака на Microsoft В 1995 году все разосланные бета-тестерам диски с операционной системой

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

Windows 95 были заражены загрузочным вирусом Form. К счастью, один из них обнаружил неладное, и на прилавки магазинов поступила нормальная, незараженная система. В августе того же года появился первый макровирус, написанный на языке WordBasic, встроенном в текстовый редактор MS Word. Макровирусом Concept были заражены сотни тысяч компьютеров по всему земному шару, вследствие чего он еще долго лидировал в статистических исследованиях компьютерных журналов. В 1996 году первую эпидемию пережили пользователи Windows 95 – их компьютеры были поражены загрузочным вирусом Boza. В июле того же года создатели макровирусов переключились с Word на редактор электронных таблиц MS Excel, выпустив для него вирус Laroux. Не заставили себя ждать и резидентные вирусы, использующие сервисы «нулевого кольца» ОС. Win95.Punch загружался в систему как VxD-драйвер, перехватывал обращения к файлам и заражал их.

Антивирусные склоки К 1997 году операционная система Linux, ранее считавшаяся оплотом «чистоты и стабильности», больше не являлась платформой, свободной от вирусов. Linux.Bliss, распространявшийся посредством конференций UseNet, заражал исполняемые файлы этой ОС. В этом же году было отмече но появление двух новых типов червей, распространявшихся через IRC и FTP. Особо большим их количеством мог «похвастаться» IRC, во многом из-за своей популярности, а также

89


ретроспектива многочисленных «дыр» mIRC – основ- кие платы становились непригодными жённом компьютере устанавливалась ного клиента подобных сетей. к использованию. Первый и последний специальная «лазейка», через котоПод конец ХХ века в погоне за ли- вирус, который наносил вред аппарат- рую злоумышленник получал полный доступ к системе. Вирус имеет более дерством стали нередки скандалы ной части ПК. среди производителей антивирусов. Melissa (1999) – 26 марта 1999 года ста модификаций. MyDoom (2004) – в январе 2004 гоТак, представители компании McAfee этот макровирус, распространявшийобъявили о том, что ее программис- ся по электронной почте, заразил око- да этот вирус молниеносно распроты обнаружили ошибку в антивиру- ло 20% офисных компьютеров по все- странился по всему Интернету, в ресе фирмы Dr.Solomon’s. Суть заявле- му миру. Крупнейшие корпорации, та- зультате чего средняя скорость загрузния сводилась к тому, что Dr.Solomon’s кие как Intel, были вынуждены прекра- ки сайтов в глобальной сети уменьшимог находить новые и технически со- тить работу внутри своих локальных лась на 50%. Червю принадлежит ревершенные вирусы только в специ- сетей. Ущерб – от 300 до 500 милли- корд по скорости распространения: меальном «усиленном» режиме, в ко- онов долларов. нее чем за сутки было заражено около ILOVEYOU (2000) – скрипт, напи- двух миллионов компьютеров. Точную торый переключался лишь после нахождения обычных, примитивных чер- санный на макроязыке Visual Basic. цифру из-за масштабов эпидемии привей. В результате антивирус показы- Так же как и Melissa, распространялся вести невозможно. Вирус был создан вал хорошие скоростные результа- по электронной почте с темой письма неизвестным программистом в качесты при сканировании незараженных «I love you». Вирус рассылал свои копии тве эксперимента, и самостоятельно дисков, и отличные показатели обна- по всем данным адресной книги поч- прекратил свою деятельность 12 февружения при работе с зараженными тового клиента. Все логины и пароли, раля того же года. файлами. В ответ Dr.Solomon`s пода- найденные червем на компьютере, отSasser (2004) – вирус вызвал «пела иск в суд на McAfee, причиной ко- сылались автору программы. Послед- рерыв» в работе французских спутниторого стала её «некорректно постро- ний, кстати, и не пытался скрываться: ковых каналов передачи данных, отенная рекламная компания». В итоге он является жителем Филиппин, где на- менил рейсы некоторых авиакомпався «заварушка» завершилась покуп- казаний за компьютерные преступле- ний, не говоря уже об обычных комкой McAfee контрольного пакета акций ния не предусмотрено. пьютерах, чья работа была полноDr.Solomon`s. Code Red (2001) – сетевой червь, стью приостановлена. РаспростраСпустя некоторое время публичное использующий ошибку в сетевом сер- нялся Sasser благодаря ошибке в сисзаявление сделали тайваньские раз- висе Microsoft IIS. В заданный день за- теме безопасности Windows 2000 и XP, работчики из фирмы Trend Micro, об- раженные компьютеры должны были запуская на зараженном компьютевинившие McAfee и Symantec в якобы начать DDOS-атаку по списку различ- ре сканер портов. Вирус был написан «нарушении их патента на сканирова- ных серверов, среди которых были сис- 17-летним немецким школьником. Инние данных». Миру были сразу пред- темы правительства США. Огромные тересен тот факт, что парень запусставлены доказательства о «безгреш- масштабы эпидемии и как итог – убыт- тил вирус в сеть в День своего соверности» компаний, однако Trend Micro ки в 2,5 миллиарда (!) долларов. шеннолетия. добилась своего, получив отменную Blaster (2003) – сетевой червь, выбесплатную рекламу в средствах мас- водивший на зараженных компьюте- Конца и края нет совой информации. рах сообщение о необходимости пе- История компьютерных вирусов до конрезагрузки. Через пару дней после его ца не дописана, продолжаясь и сегодвыпуска в Интернет (11 августа) бы- ня. Возможно, в то время как вы читаНаиболее разрушительные вирусы ли заражены миллионы компьютеров ете эти строки, какой-нибудь провинциальный программист пишет новый Продолжать подробную историю ком- по всему миру. Sobig.F (2003) – сетевой червь, вирус, еще более хитроумный и разпьютерных вирусов вплоть до наших дней не имеет смысла, поскольку еже- распространявшийся по электронной рушительный, чем все вышеперечисгодно появляются сотни и тысячи но- почте. Размножавшийся с огромной ленные. Ну а нам остаётся лишь уповать вых вредоносных программ. Я ограни- скоростью вирус скачивал на заражёнчусь лишь кратким рассказом о самых ный компьютер дополнительные фай- на милость компаний-производитеизвестных вирусах, появившихся пос- лы, «сжигая» трафик и ресурсы систе- лей антивирусов и следить за защиле 1997 года: мы. Интересная особенность – 10 сен- щённостью своих систем. CIH (1998) – ущерб, нанесенный тября вирус прекращал свою деятельвирусом, составил порядка 80 мил- ность, больше не представляя угрозы Редактор рубрики лионов долларов. Вирус был написан для пользователя. Автор Sobig.F, за инДмитрий Мороз программистом из Тайваня, и стал од- формацию о котором Microsoft предним из самых разрушительных в ис- лагала 250 тыс. долларов, не найден 1. http://www.viruslist.com/ru – вирусная тории. «Чих» заражал исполняемые до сих пор. энциклопедия, описание всех вирусов. Bagle (2004) – сетевой червь, расфайлы и активировался каждый год Новости и аналитические обзоры. 26 апреля – в день годовщины аварии пространявшийся по классическому 2. http://vx.netlux.org – журналы, статьи на Чернобыльской АЭС. CIH перезапи- способу, используя файловые вложео вирусах. Исходные коды и руководссывал FlashBIOS, после чего материнс- ния в электронных письмах. На заратва.

90


bugtraq Уязвимость состояния операции в OpenSSH Программа: OpenSSH 4.3, возможно более ранние версии. Опасность: Высокая. Описание: Уязвимость состояния операции существует изза ошибки в обработке сигналов при включенной аутентификации GSSAPI. Удаленный пользователь может вызвать отказ в обслуживании и потенциально выполнить произвольный код на целевой системе. URL производителя: http://www.openssh.org. Решение: Установите последнюю версию (4.4) с сайта производителя.

Множественные уязвимости в универсальной криптографической библиотеке OpenSSL Программа: OpenSSL 0.9.x Опасность: Высокая. Описание: 1. Уязвимость существует из-за ошибки при обработке некорректных ASN.1-структур. Удаленный пользователь может вызвать зацикливание приложения, использующего OpenSSL для обработки ASN.1-данных. Версии до 0.9.7 не уязвимы. 2. Некоторые публичные ключи требуют много времени для их обработки и могут быть использованы для DoS-атаки на приложение, использующее OpenSSL для обработки ASN.1-данных. 3. Переполнение буфера обнаружено в функции SSL_get_shared_ciphers(). Злоумышленник может послать список шифров приложению, использующему уязвимую функцию, и выполнить произвольный код на целевой системе. 4. Уязвимость существует из-за ошибки в клиентском коде SSLv2. Злоумышленник может использовать уязвимый клиент для создания SSLv2 соединения к серверу. URL производителя: http://www.openssl.org. Решение: Установите последнюю версию (0.9.7l или 0.9.8d и выше) с сайта производителя.

Уязвимость форматной строки в Skype Программа: Skype 1.5.*.79 и более ранние версии для Mac OS. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки форматной строки при обработке URL-аргументов. Удаленный пользователь может с помощью специально сформированного URL, содержащего символы форматной строки, выполнить произвольный код на целевой системе. URL производителя: http://www.skype.com/download/skype/ macosx. Решение: Установите последнюю версию (1.5.0.80) с сайта производителя.

№11, ноябрь 2006

Множественные уязвимости в Mac OS X Программа: Apple Macintosh OS X версии до 10.4.8. Опасность: Высокая. Описание: 1. Уязвимость существует из-за ошибки в компоненте CFNetwork, которая позволяет злонамеренному SSL-сайту выдать себя за доверенный сайт для клиентов CFNetwork (например, браузер Safari). 2. Исправлены уязвимости в Flash Player, которые позволяли удаленному пользователю обойти ограничения безопасности и скомпрометировать целевую систему. 3. Уязвимость существует из-за ошибки проверки границ данных в компоненте ImageIO при обработке JPEG2000-изображений. Удаленный пользователь может с помощью специально сформированного изображения вызвать переполнение буфера и выполнить произвольный код на целевой системе. 4. Уязвимость существует в механизме обработки ошибок ядра Mach exception ports. Локальный пользователь может повысить свои привилегии на системе. 5. Непроверяемое состояние ошибки в компоненте LoginWindow может позволить локальному пользователю получить доступ к Kerberos-тикету после неудачной попытки входа в систему. 6. Ошибка в компоненте LoginWindow во время обработки Fast User Switching может позволить другим локальным пользователям получить доступ к Kerberos-тикету. 7. Логическая ошибка в LoginWindow компоненте может позволить сетевым учетным записям без GUID обойти ограничения на доступ службы LoginWindow. 8. Уязвимость существует из-за ошибки, которая позволяет учетной записи после сброса административных привилегий управлять приложениями WebObjects. 9. Уязвимость существует из-за ошибки повреждения памяти при обработке PICT-изображений в QuickDraw Manager. Удаленный пользователь может с помощью специально сформированного PICT-изображения выполнить произвольный код на целевой системе. 10. Ошибка в SASL может позволить злоумышленнику вызвать отказ в обслуживании службы IMAP. 11. Уязвимость существует из-за ошибки управления памятью в WebKit при обработке HTML-кода. Удаленный пользователь может с помощью специально сформированной страницы выполнить произвольный код на целевой системе. 12. Ошибка в Workgroup Manager может позволить некоторым учетным записям использовать слабый механизм шифрования паролей. URL производителя: http://www.apple.com/macosx. Решение: Установите последнюю версию (10.4.8) с сайта производителя.

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

91


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

Эффективное проектирование приложений Oracle Томас Кайт

Издание – перевод знаменитой книги от культовой фигуры Oracle-сообщества – Тома Кайта. Сразу отмечу, что издание адресовано прежде всего специалистам, для новичков оно будет сложным. К сожалению, перевод книги не всегда корректен, что потенциально грозит непониманием информации в полном объеме. Но несмотря

на все это, вы откроете для себя огромное количество нужной и актуальной информации. В первой главе, которая носит название «Правильный подход к созданию приложений», автор рассказывает об общих требованиях при проектировании приложений, методологии их разработки, достаточно подробно освящены вопросы, связанные с производительностью. Далее вы познакомитесь с основными инструментами, которые помогут вам настроить систему на максимальную производительность (SQL*Plus, EXPLAIN PLAN, AUTOTRACE, TKPROF, Runstats, Statspack, DBMS_PROFILER). В главе «Архитектурные решения» Томас Кайт повествует о преимуществах кластеризации, применении секционирования, использовании параллельных операций. Достаточно подробно освещены вопросы эффективного администрирования – использова-

ние SPFILE для запуска базы данных, восстановление данных, управление пространством в сегменте и сегментами отката (UNDO). Обработка операторов (выполнение команд, запросы – от начала до конца, использование переменных привязки). Большое внимание уделено проектированию эффективных схем, применению языков SQL и PL/SQL. В общем и целом книга оставила благоприятное впечатление, и если бы не явные ошибки в переводе, издание можно было бы назвать одним из лучших по теме Oracle на русском языке.

    

Издательство: «Лори» Год издания: 2006 Количество страниц: 638 ISBN: 5-85582-251-6 Цена: ≈ 488 руб. Книга предоставлена издательстким домом «Вильямс».

Эффективная работа: Windows Server 2003 Уильям Станек

Автор этой книги не нуждается в представлении. Уильям Станек по праву заслужил уважение миллионов пользователей и администраторов Windows, опубликовав более 10 книг, по этой ОС. В этом фундаментальном труде автор обобщает свой опыт использования Windows Server 2003. Автор начал изучение этой ОС с первых альфа-

92

и бета-версий (в то время проект назывался Windows Whistler). Спектр рассмотренных тем поистине всеобъемлющ. Установка Windows Server 2003 (подготовка и начало установки, интерактивная и автоматизированная установка, службы удаленной установки). Обновление и миграция. Управление Windows Server 2003 (оборудование: настройка и устранение неполадок, управление реестром, мониторинг и настройка производительности, комплексный анализ и регистрация событий). Управление запоминающими устройствами и файловой системой (обеспечение высокой доступности, подготовка и размещение серверных кластеров, управление запоминающими устройствами). Сетевые службы и службы печати (управление DHCP, проектирование, реализация и поддержка DNS, использование удаленного рабочего стола, а так-

же вопросы, связанные с развертыванием служб терминалов). Чрезвычайно подробно рассмотрены вопросы работы с Active Directory – архитектура, проектирование и управление доменной средой, настройка сайтов и репликации AD. Не остались без внимания и вопросы планирования восстановления после аварий и резервного копирования. На прилагаемом к книге диске вы найдете электронную версию книги, а также большое количество различных инструментов, которые, без сомнения, окажутся полезными в вашей повседневной работе.

    

Издательство: «Питер» Год издания: 2007 Количество страниц: 1104 ISBN: 5-469-01005-8 Цена: ≈ 602 руб. Книга предоставлена издательством «Питер».


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

UML 2.0. Объектно-ориентированное моделирование и разработка Джеймс Рамбо, Майкл Блаха

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

но удалось достичь главной цели – приводится большое количество прив доступной форме объяснить читате- меров реализации той или иной задалю всю суть объектно-ориентирован- чи на языках C++ и Java. Нельзя не отного метода, не прибегая к описанию метить большое количество различреализации в рамках отдельно взято- ных заданий и множества самых разго языка программирования. В пер- нообразных советов, которые помовой части книги авторы ознакомят вас гут вам наиболее быстро и эффективс общими концепциями моделирова- но освоить весь излагаемый материния. Вторая часть посвящена анали- ал. Несмотря на достаточную сложзу и проектированию. В третьей части ность основных тем книги, она достакниги, которая носит название «Реа- точно легко читается, благодаря пролизация», авторы пишут о моделиро- стому и живому стилю изложения. Ревании реализации, объектно-ориенти- комендую всем без исключения пророванных языках, базах данных, а так- граммистам, желающим на практике же стилях программирования. Завер- познакомиться и начать использовать шает книгу практическая глава «Раз- технологии UML. работка программного обеспечения», где авторы на примерах повествуют  Издательство: «Питер» о итерационной разработке, управле-  Год издания: 2007 нии моделированием и унаследован-  Количество страниц: 544 ных системах. В приложении вы най-  ISBN: 5-469-00814-2 дете систему графических обозначе-  Цена: ≈ 538 руб. ний UML. На протяжении всей книги Книга предоставлена издательством «Питер».

Win32 API. Эффективная разработка приложений Юрий Щупак хочется отметить, что объяснение те- шами», диалоговыми окнами, а также мы начинается с самых азов, с «Hello, элементами управления общего польWorld!», а это значит, что даже нович- зования. Из главы «Многозадачность» ки в программировании смогут начать вы узнаете об объектах ядра, процесосвоение материала этой книги без ви- сах и потоках, а также методиках их упдимых сложностей. Постепенно осваи- равления. Не остались без внимания вая материал, вы узнаете о GDI – гра- вопросы синхронизации и обмена данфическом интерфейсе устройства, на- ными между процессами. В приложеучитесь рисовать фигуры, линии, выво- нии вы найдете описание интегриродить текст. Далее ознакомитесь с па- ванных сред Micorosoft Visual C++ 6.0 литрами, растрами и метафайлами. и Visual Studio.NET. Большое количесПодробно рассмотрены вопросы рабо- тво примеров и различных схем и табты со средствами ввода. В главе «Ре- лиц помогут вам усвоить весь излагаеКак правильно заметил автор книги, сурсы Windows-приложения» вы най- мый материал в кратчайшие сроки. многие люди, сразу начавшие осваи- дете информацию об основных ресурвать программирование для Windows сах, которые могут быть использова-  Издательство: «Питер» на уровне MFC и Windows Forms, не за- ны вами в той или иной разрабатыва-  Год издания: 2007 трагивая Win32 API, впоследствии емой программе (пиктограммы, кур-  Количество страниц: 572 сталкиваются с рядом неразрешимых соры, растровые образы). Достаточно  ISBN: 5-469-01361-8 задач при создании более-менее се- подробно рассмотрены вопросы созда-  Цена: ≈ 400 руб. рьезных приложений. Цель этой кни- ния меню и работы с «быстрыми клави- Книга предоставлена издательством «Питер». ги – в простой и доступной форме рассказать читателю о Win32 API. Сразу Обзор книжных новинок подготовил Александр Байрак

№11, ноябрь 2006

93


подписка на 2007 год

Оформите годовую подписку и получите в подарок DVD-диск с архивом всех вышедших номеров с 2002 года. Диск будет вложен в январьский юбилейный выпуск журнала Редакционная подписка для физических лиц

 Подписку Вы можете оформить на любой российский адрес.

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

94

 Подписку можно оформить с любо-

 Копию заполненного и оплаченно-

го месяца на любой срок.  В графе «Сумма» проставьте сумму за выбранное количество номеров. Стоимость одного номера журнала 150 руб. За год – 1800 руб. НДС и почтовые расходы включены в стоимость.

го бланка отправьте в редакцию по факсу: (495) 628-8253 или на электронный адрес: info@samag.ru  Журнал высылается почтой простой бандеролью только после поступления денег на расчетный счет.


подписка на 2007 год Российская Федерация

 Подписной индекс: годовой – 20780, полугодовой – 81655 Каталог агентства «Роспечать»

 Подписной индекс: 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог»  Альтернативные подписные агентства: Агентство «Интер-Почта» (495) 500-00-60, курьерская доставка по Москве Агентство «Вся Пресса» (495) 787-34-47 Агентство «Курьер-Прессервис» Агентство «ООО Урал-Пресс» (343) 375-62-74 ЛинуксЦентр www.linuxcenter.ru  Подписка On-line http://www.arzi.ru http://www.gazety.ru http://www.presscafe.ru

СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры «АРЗИ»:  Азербайджан – по объединенному каталогу российских изданий через предприятие по распространению

печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21)

 Казахстан – по каталогу «Российская Пресса» через ОАО «Казпочта» и ЗАО «Евразия пресс»

 Беларусь – по каталогу изданий стран СНГ через РГО «Белпочта» (220050, г. Минск, пр-т Ф. Скорины, 10)

 Узбекистан – по каталогу «Davriy nashrlar» российские издания через агентство по распространению печати «Davriy nashrlar» (7000029, г. Ташкент, пл. Мустакиллик, 5/3, офис 33)  Армения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г. Ереван, пл. Сасунци Давида, д. 2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул. Сарьяна, 22)  Грузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г. Тбилиси, ул. Хошараульская, 29) и АО «Мацне» (380060, г. Тбилиси, пр-т Гамсахурдия, 42)  Молдавия – по каталогу через ГП «Пошта Молдовей» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134) по списку через ГУП «Почта Приднестровья» (МD-3300, г. Тирасполь, ул. Ленина, 17) по прайс-листу через ООО Агентство «Editil Periodice» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134)  Подписка для Украины: Киевский главпочтамт Подписное агентство «KSS», тел./факс (044)464-0220

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

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

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

№11 ноябрь 2006

годовой полугодовой

95


СИСТЕМНЫЙ АДМИНИСТРАТОР №11(48), Ноябрь, 2006 год УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Редактор Алексей Коршунов Внештатные редакторы Алексей Барабанов Сергей Супрунов Крис Касперски Алексей Шелестов Алексей Мичурин Дмитрий Мороз Андрей Бирюков РЕКЛАМНАЯ СЛУЖБА тел./факс: (495) 628-8253 Евгения Тарабрина reсlama@samag.ru Верстка и оформление maker_up@samag.ru Дизайн обложки Николай Петрочук По вопросам распространения обращайтесь по телефону: (495) 628-8253 (доб. 120) 107045, г. Москва, Ананьевский переулок, дом 4/2, стр. 1 тел./факс: (495) 628-8253 Сайт журнала: www.samag.ru ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета» Отпечатано типографией ГП «Московская Типография №13» Тираж 11000 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002 г.). За содержание статьи ответственность несет автор. За содержание рекламных материалов ответственность несет рекламодатель. Все права на опубликованные материалы защищены.

96

ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Как предотвратить кражу веб-содержимого

мных решений. Если у вас сеть под управлением MS Windows, то вам наверЭксклюзивный материал, однажды няка знаком такой продукт как Microsoft опубликованный в сети, обречен на не- ISA Server 2004 – один из наиболее избежное расползание по сотням ты- распространенных межсетевых экрасяч веб-серверов, жестких дисков и… нов. Об особенностях его работы и пойдаже бумажных изданий. Что, согла- дет речь в следующем выпуске. ситесь, обидно, особенно если автор не получает вознаграждения, а его Обзор серверного имя затирается. Существует множес- дистрибутива tinysofa тво способов защиты веб-содержи- Установить и настроить надежную мого от несанкционированного копи- всесторонне защищенную систему рования, но большинство из них со- на сервер не такая уж и легкая задача. вершенно неработоспособны – легко Упростить ее можно, только правильно взламываются или создают проблемы подобрав дистрибутив и компоненты легальным посетителям. Тем не менее будущей системы. Один из вариантов – создание надежной защиты все-таки проект tinysofa, целью которого стало создание быстрой, надежной, стабильвозможно! ной и безопасной операционной систеMicrosoft ISA Server 2004 – мы, которую можно применять на сермногофункциональный верах уровня предприятия.

межсетевой экран

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

Уважаемые читатели! Обратите внимание, что теперь оформить подписку вы можете не только на полугодие, но и сразу на весь год. Годовой индекс по каталогу «Роспечать» – 20780. Интер-почта – заказ журналов по тел.(495) 500-00-60. Подписка on-line – SetBook.ru. Приобрести новые и старые номера журнала вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.

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

048 Системный Администратор 11 2006  

№11(48) ноябрь 2006 подписной индекс 20780 www.samag.ru Н Е О Ж И Д А Н Н О Б Ы С Т Р О Р А С К У П И Л И Т И Р А Ж Н О В О Г О Д Н И Е П О...

Read more
Read more
Similar to
Popular now
Just for you