046 Системный Администратор 09 2006

Page 1

№9(46) сентябрь 2006

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

Семь веб-интерфейсов к электронной почте Выберите лучший! Zlock: контролируйте доступ к USB-устройствам Обзор систем резервного копирования Как обнаружить malware-программы? Ajax: новый канал общения клиента и сервера Развиваем модуль DBI В поисках профессиональной этики сисадминов Кевин Митник защищает компании от былых коллег


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

КА

БЫ С

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

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

ЛИ

СЬ

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

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

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

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

УЕ ХА Л

ВО

ТП

УС К

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

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

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

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


в номере 5 ТЕНДЕНЦИИ

48 Как обнаружить malware-программы? Универсальный метод.

РЕПОРТАЖ 6 Берегись, «мышь» полетела!

Состоялся Первый Всероссийский слет сисадминов. Репортаж с места событий. Оксана Родионова rodion@dol.ru

АДМИНИСТРИРОВАНИЕ 10 Семь веб-интерфейсов к электронной почте. Выберите лучший!

Требования мобильности и доступности электронной почты в любых условиях делают использование протоколов POP3/IMAP не всегда удобным. На помощь приходят системы, обеспечивающие веб-интерфейс к почтовым ящикам. Сергей Супрунов amsand@rambler.ru

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

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

22 Обзор систем резервного копирования

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

30 Упаковщики исполняемых файлов в Linux/BSD

Коммерческие продукты с закрытым кодом зачастую распространяются в упакованном виде, что препятствует анализу, снижает производительность и ухудшает совместимость с UNIX-клонами. Как можно освободиться от упаковщиков? Крис Касперски kk@sendmail.ru

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

ЧЕЛОВЕК НОМЕРА 56 Пират виртуального мира

«Перевоспитавшийся» хакер Кевин Митник решает новые головоломки. Теперь он защищает компании от былых коллег. Оксана Родионова rodion@dol.ru

WEB 60 Ajax: новый канал общения клиента и сервера

После того, как Ajax взяли на вооружение такие веб-гиганты, как google и gmail, технологией стали интересоваться все: от руководителей крупных проектов до начинающих веб-мастеров. Алексей Мичурин alexey@michurin.com.ru

66 Устанавливаем DACS

Установим систему контроля доступа к веб-ресурсам DACS в минимальной конфигурации, а заодно посмотрим на нее в работе. Сергей Яремчук grinder@ua.fm

ПРОГРАММИРОВАНИЕ 72 Развиваем модуль DBI

DBI, Perl-модуль для взаимодействия с базами данных, используется в доброй половине всех существующих Perl-программ. Как его усовершенствовать? Алексей Мичурин alexey@michurin.com.ru

IMHO 78 В поисках профессиональной этики сисадминов

В Интернете и печатных изданиях встречаются разные представления о принципах системного администрирования. Попробуем найти в этих вариантах общие черты и определить направление совершенствования. Алексей Барабанов alekseybb@mail.ru

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

БЕЗОПАСНОСТЬ 40 Zlock: контролируйте доступ к USB-устройствам

У конкурентов оказалась база данных ваших клиентов? Сотрудники используют рабочее место для обработки и записи гигабайт личных фотографий с цифровой камеры на CD? Без надежной системы контроля доступа к мобильным устройствам вряд удастся избежать подобное. Андрей Гущин info@securit.ru

44 Защищаемся от malware с помощью BufferZone

86 Суровая правда, скрытая за «розовыми очками»: история компании Transmeta

Компания Transmeta принесла практически совершенные процессоры в массы, но собственноручно допущенные ошибки, жестокая конкуренция и привередливые пользователи не позволили ей завоевать место под солнцем. Дмитрий Мороз akuji@list.ru

КНИЖНАЯ ПОЛКА 92 Обзор книжных новинок Александр Байрак x01mer@pisem.net

Обзор проекта BufferZone.

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

59, 91, 94

BUGTRAQ

Открыта подписка на 2007 год. Спешите оформить! №9, сентябрь 2006

1



26.09–29.09 2006 г. в Москве на ВВЦ в павильоне № 69 состоится 17-я ежегодная выставка информационных технологий SOFTOOL. Выставка включена в планы официальных мероприятий Федерального агентства по информационным технологиям, Правительства Москвы, Российской Академии наук. Поддержку выставке оказывает Министерство экономического развития и торговли РФ. Организатор выставки – компания ИТ-ЭКСПО. В Организационный комитет выставки входят руководители Федеральных органов власти, действительные члены и члены-корреспонденты Российской Академии наук, представители научно-технической общественности. Председателем Оргкомитета выставки является видный ученый, академик РАН, член Президиума РАН Ю.В. Гуляев. Площадь выставки составляет 8,5 тысяч кв. м., количество участников более 300. Количество посетителей более 48 тысяч. SofTool отражает состояние российского рынка программных продуктов, предоставляет уникальную возможность посетителям ознакомиться в полном объеме со всеми аспектами отрасли информационных технологий: подготовкой специалистов; разработкой новых методов и решений; предложениями рынка в области консалтинга и управления; опытом внедрения в производство. Ежегодно около трехсот ИТ-компаний представляют на выставке SofTool новейшие разработки практически для всех отраслей экономики, начиная с бухгалтерских программ, заканчивая сложнейшими компьютерными системами. В рамках SofTool’а проводится выставка САПР’экспо. Это расширенная экспозиция компаний, занимающих лидирующие позиции на мировом рынке систем автоматизации проектирования. С прошлого года спонсором САПР’экспо является компания AUTODESK. 3-й год подряд на выставке выделена экспозиция LinuxLand, на которой представлены ведущие мировые и российские Linux-компании. В рамках LinuxLand внимание посетителей привлекут международная конференция и ряд мастер-классов по всему спектру Linux-решений. Организатор LinuxLand – компания LinuxCenter. В этом году впервые организован объединенный стенд Российской Академии наук, который представит достижения российских ученых из специализированных НИИ РАН. Итогами выставки ежегодно становятся многочисленные контракты, широкий обмен опытом, а также новые плодотворные идеи, которые реально содействуют подъему российской экономики и дальнейшему развитию отечественной компьютерной индустрии.

Softool 2006


LinuxLand 2006 Компании ИТ-Экспо и Линуксцентр приглашают Вас посетить выставкуконференцию LinuxLand, которая пройдет в рамках SofTool-2006. На LinuxLand представлен весь спектр доступных в России Linux-решений. В течение всей выставки будут проходить мастер-классы с демонстрацией практической работы Linux-технологий. 26 сентября приглашаем Вас на конференцию “ИТО-2006: Технологии Linux и Open Source” .

Компании ИТ-Экспо и Линуксцентр приглашают вас принять участие в выставке информационных технологий SofTool’2006 (26-29 сентября 2006 года), где планируется собрать ведущие российские Linux-компании в одном секторе выставочной площади LinuxLand. LinuxLand – единственное мероприятие, где Linux-компании получат возможность представить свои продукты конечным пользователям и корпоративным клиентам одновременно.

Ждем Вас на LinuxLand !

Организатор Платиновый спонсор

LinuxLand будет местом, в котором соберутся поставщики Linux и различных решений для этой ОС: Mandriva, IBM, Novell, R-Style, HP, Oracle, ASPLinux, Linux-Online (разработчик Linux XP), НПО "Сеть" (разработчик MOPSLinux), Bitrix, ПРОМТ, Etersoft и Linuxcenter.ru, журнал Linux Format, образовательный центр Lynx Education Center и другие. Помимо выставочных стендов, на экспозиции традиционно будет расположена демо-зона, где посетители LinuxLand смогут вживую познакомиться с предлагаемыми продуктами.

Золотой спонсор Серебряный спонсор

В этом году в рамках LinuxLand состоится международная конференция "ИТО-2006: Технологии Linux и Open Source", первый день будет посвящен обсуждению программ ЮНЕСКО внедрения Open Source в образование, докладам и презентациям лидеров Linux-индустрии и Linux-образования. В остальные дни пройдут мастер-классы и тренинги по технологиям Linux и Open Source.

ИТО-2006: Технологии Linux и Open Source

Большой конференц зал

26.09. Технологии Linux и Open Source в образовании

Стенд D16, зал мастер-классов LinuxLand

26.09. мастер-классы IBM 27.09. Технологии Linux - презентации, мастер-классы 28.09. Тренинги технологий Linux - мастер-классы 29.09 Вручение Сертификатов ЮНЕСКО / WDU

Информационная поддержка

издательство “Открытые системы”, издательство “СК Пресс”, журнал “Системный администратор”, IXBT.ru, 3DNews.ru, PCnews.ru, Lenta.ru, Linuxcenter.ru, Linux.ru, LinuxRSP.ru, OpenNet.ru

26 сентября - 29 сентября 2006 года Москва, ВВЦ, павильон №69

Участники конференции получают кейсы со сборниками трудов, учебными пособиями и дистрибутивами Linux и Open Source. Для получения материалов необходима регистрация. Программа конференции 26.09. Технологии Linux и Open Source – лекции, доклады Linux и Open Source в образовании – доклады 27.09. Технологии Linux – презентации, мастер-классы Технологии Open Source – презентации, тренинги 28.09. Тренинги технологий Linux – мастер-классы Тренинги Open Source – лекции, тренинги 29.09 Вручение Сертификатов ЮНЕСКО / WDU

Зарегистрироваться для участия в конференции в качестве слушателя можно по адресу: http://www.linuxland.ru/conf.phtml Регистрация докладчиков производится на сайте МПГУ по адресу: http://linux.mpgu.ru/registration.shtml Приглашаем вас принять участие в выставке LinuxLand / SofTool’2006 Контакты: e-mail: info@linuxcenter.ru Телефон: (812) 929-09-07


тенденции IBM не считает OpenSolaris проектом Open Source

рабочей станции под управлением GNU/Linux. Вместе с тем Lenovo будет предоставлять техническую поддержку по Linux По мнению представителей IBM, проект OpenSolaris нельзя для своих лаптопов – это касается драйверов и технологий по-настоящему отнести к Open Source, потому что его автор, ThinkVantage. Одной из причин, открывших перспективы покомпания Sun Microsystems, не желает делиться управлени- лученному союзу, как считает Билл Йори (Bill Iori), ответсем OpenSolaris со сторонними разработчиками. твенный за ThinkPad T Series в Lenovo, является тот факт, «Sun держит все за огненной стеной. Сообщество не мо- что Linux-ядро теперь обладает лучшей поддержкой таких жет ничего увидеть, – заявил Дэн Фрай (Dan Frye), вице-пре- используемых в ноутбуках технологий, как спящий режим. зидент из IBM, ответственный за технологический Linux-центр в компании, на LinuxWorld Conference and Expo. – Это только HP предоставит поддержку видимость. Куча маркетинга и никакого сообщества». для Debian GNU/Linux Фрай отметил, что если Sun хочет превратить OpenSolaris Компания Hewlett-Packard решила расширить круг GNU/ в настоящий продукт сообщества, необходимо перенести Linux-дистрибутивов, по которым она предоставляет техвсе обсуждение проекта в публичные форумы, чтобы все ническую поддержку, добавив к продукции Red Hat и Novell желающие видели, что происходит. разрабатываемый сообществом Debian GNU/Linux. Как поДжим Грисанзо (Jim Grisanzio) из Sun ответил на эти яснил Джеффри Вейд (Jeffrey Wade), менеджер по мировым заявления непониманием, почему IBM атакует сообщест- продажам в Open Source и Linux-подразделении HP, у комво OpenSolaris, заметив, что Sun 16 раз представляла ре- пании большое число заказчиков, заинтересованных в рализы ПО с открытым кодом, а с момента запуска проекта боте с Debian на серверах HP. HP будет оказывать услуги (что произошло чуть более года назад) сторонними разра- по установке и настройке некоммерческого дистрибутиботчиками было внесено 116 добавлений. ва на протяжении времени поддержки серверов. Несмотря на это известие, Red Hat и Novell останутся ключевыми мировыми Linux-партнерами HP. Кроме того, HP не будет NetBSD 3.1 готовится к выходу Команда разработчиков свободной ОС NetBSD в рассылке продвигать Debian, и заказчикам придется самостоятельnetbsd-announce обнародовала план выпуска следующего но скачивать эту систему со всем нужным ПО. HP не наместабильного релиза – 3.1. В соответствии с опубликованной рена формально сертифицировать Debian для своих сервеинформацией первый кандидат в релиз (NetBSD 3.1_RC1) ров, предоставлять для этого дистрибутива предложения появился 21 августа, второй (3.1_RC2) – через две недели, от таких своих партнеров, как BEA Systems и Oracle. 4 сентября. Финальный релиз 3.1 запланирован на 18 сенСоставил Дмитрий Шурупов тября (если не возникнет никаких серьезных проблем с выпо материалам www.nixp.ru пущенными RC – в противном случае будет представлен еще один кандидат в релиз, а релиз отложат еще на 2 недели). В NetBSD 3.1 по сравнению с предыдущим релизом – 3.0 – представлены такие новшества, как поддержка domU для Xen 3, значительные улучшения в стабильности LFS, множество других улучшений, исправлений и дополнений.

OpenOffice.org портирован на OpenBSD Стало известно о запуске популярного свободного офисного пакета OpenOffice.org в среде открытой операционной системы OpenBSD. В первой версии порта пока действуют ограничения (так, например, нет Java, из-за чего отсутствует поддержка некоторого импорта/экспорта и других функций). OOo в OpenBSD работает на архитектурах 386 и amd64. На данный момент пакет распространяется в несобранном виде (сообщается, что его компиляция занимает порядка 6 часов).

Lenovo начинает поставку Linux-ноутбуков Компании Novell и Lenovo заключили договор, по которому отныне будет предустанавливаться дистрибутив первой (SUSE Linux) на ноутбуки последней (ThinkPad T60p). Об этом стало известно на прошедшей конференции LinuxWorld в СанФранциско. Из множества редакций SUSE Linux для ноутбуков Lenovo была выбрана корпоративная десктоп-версия SLED 10. По словам представителей Lenovo, эти компьютеры предназначены для инженеров и других продвинутых пользователей, заинтересованных в получении мобильной

№9, сентябрь 2006

5


репортаж

Берегись, «мышь» полетела!

На Первом Всероссийском слете сисадмины вышли из Интернета, чтобы посидеть у костра.

Я

думала, что еду на турслет. Ну и что, что системных администраторов? Да пусть даже бухгалтеров! Туристы они и в Африке туристы. Но все оказалось совсем не так просто… А поляна под Калугой, где проходят слеты людей всевозможных профессий, оказалась заколдованным местом, настоящим Зазеркальем.

Глюк №1: Сисадмин-футболист Кто эти люди, играющие в футбол и волейбол? Нет, не может быть, чтобы это были сисадмины! Они ведь никогда не расстаются с «мышками» и не отрываются от экранов мониторов, их пальцы непрерывно бегают по клавиату-

6

ре. А эти подозрительные товарищи… бросаются «мышками»! И клавиатурами. Это они так проверяют, кто дальше кинет. Хм, а ведь не так просто, оказывается, забросить «мыша» в небольшой огороженный квадрат. Похоже, победители долго тренировались. Интересно, на ком? Надеюсь, не на своих юзерах… Они вообще любят кидаться чем ни попадя на этом слете, как я погляжу. Вот еще одна игра: предлагается пройти по маршруту, попутно выполняя задания. Число ходов указывает огромный деревянный кубик. Алле-ап, бросили! Сколько? Два очка. Пропускаете ход. Сколько? Одно. Опять пропускаете. Сколько? Три очка! Вам задание: с завязанными гла-

зами налить воду ковшиком из бака в бутылку. Девушка Лена успешно с заданием справилась. Народ вокруг ее бурно поддерживал. Но мне все-таки не верится, что это сисадмины. Иду к палаткам знакомиться. Вот компания, играющая в преферанс. Не хочется мешать, но что делать… – Вы системные администраторы? – Не все. Вот двое. – А как отличить системного администратора от обычного человека? – Это сложно, если без компьютера. Но если люди играют в преферанс – верный признак! – А вы откуда? – Из Ярославля. – Как вам идея собраться здесь?


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

Глюк №2: Девушка-сисадмин На другом конце поляны расположилась Вологда. Подхожу. Теперь уже не я, а меня спрашивают: – А вы системный администратор? С глубоким изумлением отвечаю, что нет. Ребята огорчены: – А мы уже думали, что встретили! По легенде, бывают девушки – системные администраторы. – И здесь есть? – Говорят, вчера была, танцевала хорошо. – А системные администраторы хорошо танцуют? – А чего нет! – А о чем здесь разговоры идут? – интересуюсь. – О работе… и обо всем остальном. – Зачем о работе? – Сисадмины – такие люди, что где угодно будут о работе говорить. Потом я все-таки увидела девушку сисадмина из Учкудука и поняла, что это не миф, а правда. Девушка была обаятельна и весела – она понимала, какая роль ей досталась. Говорят, на поляне можно было найти даже несколько системных администраторов женского пола – этакий слет сисадминок. Однако развлечения на слете были явно рассчитаны на мужчин. Вот пейнтбол, например, – типично мужское занятие. Все серьезно – оружие, маски, инструктаж… – Сейчас будем играть в пейнтбол. Две команды по пять человек, одна с одной, другая с другой стороны. Цель игры – захватить флаг и принести его на базу противника. Как только флаг принесли, игра закончена. Флаг находится в центре. Задача игроков – отстоять свой флаг. Комментарий участника игры: Убей его, пока он не убил тебя. – Бойцы, смотрите! Будете играть такими маркерами, – инструктор показал оружие. – Сюда насыпаются шары, здесь находится воздух, отсюда вылетает шарик. На маркере находится заглушка. До выхода на игровую площад-

№9, сентябрь 2006

Подведены итоги конкурсов! Накануне Дня Сисадмина-2006 на сисадминском сайте был проведен конкурс «Сисадминские рекорды». Каждый сисадмин мог предоставить на суд пользователей сайта свой рекорд – личный или профессинальный. Победители определялись голосованием. Главные призы получили Дмитрий Луговой – за рекорд о самом большом числе способов передачи данных, Наталья Бакланова с зажигательным списком ежедневных рекордов и побед в их организации и Сергей Заворыкин, описавший рекорд по самым частым пересадкам. В течение 10 дней после празднова-

ния Дня Сисадмина-2006 на сайте http:// sysadmin.mail.ru проходил конкурс сисадминских репортажей. Сисадмины из разных регионов рассказывали о том, как они встретили праздник. Победителями стали три системных администратора, которые по-разному, но очень увлеченно описали свой отдых на Первом Всероссийском слёте Сисадминов: Голыженков Алексей, Белякова Светлана и Бринько Сергей. Все победители получают в качестве подарка уникальные сисадминские футболки, пакет лицензионного ПО от магазина Allsoft.ru, обучение в Учебном Центре Softline и подписку на журнал «Системный администратор».

ку, до нашей команды заглушки не сни- кера бутылки, висящие на веревочке. мать! Они находятся здесь для безо- Увлеклась зрелищем. – Вы его жена? – раздалось сбоку. пасности, чтобы случайно не сделать Ну чем не театр абсурда? Я не жена выстрел. Самое главное – не снимать маску во время игры. Если увидите ко- сисадмина, я не сисадминка! А кто я?.. го-то без маски, по этим людям стре- Не помню. лять не надо. Если гражданский появляется на поле, опять-таки не стреля- Глюк №3: ем. У каждого свои дела могут быть Бурные аплодисменты в этом лесу... Из задумчивости меня вывел звонкий Организаторы игры помогли на- голос, усиленный динамиками, напомдеть маски бойцам и на прощание нивший, что это все же турслет адмиспросили: нистраторов, а не второй сон Веры – Здоровые все? Никому плохо Павловны: не станет? – Все, кто приехал, подойдите Нервно отсмеявшись, мужчины уш- в штаб. Штаб – это синяя палатка. Там бегает и ждет вас Полкошки, у которой ли в лес играть в войнушку. А я осталась наблюдать, как сисад- вы зарегистрируетесь. Там же вы момин из Вологды расстреливает из мар- жете приобрести футболочки и банда-

География слета

7


репортаж

Праздник удался на славу

ны с символикой слета. Там вам все продадут… с радостью. Есть куча дров для общего пользования. В оргкомитете вам помогут их распилить. «Скорая помощь» опять-таки для общего пользования. На территории дежурит милиция, так что не переживайте, ничего не случится. Работают две палатки, где вы можете приобрести ватрушки, минералочку и так далее. В штабе можно купить пиво. В желтой бочке вода. Все для вас, уважаемые системные администраторы! Реальность вернулась на место. Тем более что впереди было поднятие флага. Народ начал подтягиваться к центру поляны. Полились благодарности. Сайту «Сисадмин тоже человек», совместному проекту компаний «Softline» и «Mail.ru»! Аплодисменты. Городской управе города Калуги в лице Максима Алексеевича Акимова! Аплодисменты. Генеральному партнеру слета – Калужской пивоваренной компании! Бурные аплодисменты. Партнерам слета: учебному центру «Softline» и интернет-магазину софта Allsoft.ru! Аплодисменты не смолкали. Ну а когда начались благодарности инициаторам слета, хлопающие ладошки сисадминов выдали просто-таки овацию. Браво Полине Трояновской! Браво Дмитрию Луговому! Потом началась перекличка городов. И тут опять пошла мистика: ну как на обычную зеленую поляну под Калугой попали люди не только из Москвы и Подмосковья, но и Питера, Брянска, Нижнего Новгорода, Воронежа, Ярославля, Альметьевска, Таганро-

8

га, Ростова-на-Дону, Тамбова, Белгорода и даже Красноярска, Екатеринбурга, Усолья-Сибирского, Иркутска и Ташкента! Ничего себе, за полторы тысячи километров съездить на уикэнд отдохнуть… Может, сисадмины знают, как перемещать по сетям не только тексты и фотки, но и бренные тела? Явно! П ол и н а Тр о я н о в с к а я, о н а же Рolkoshka очень душевно всех приветствовала: «В этом году нам много звонили и говорили, что День сисадмина празднуют по всем городам, что это стало очень популярным. Я вас поздравляю! Пусть ваши юзеры всегда будут с вами, умными и понимающими».

Глюк №4: Братья-педагоги Над поляной полилась магнитофонная запись. Ну вот, никакого абсурда, песня знакомая и милая, авторская – «Атланты держат небо». Ой, нет, слова какие-то не такие: …Где без питья и хлеба, Забытые в веках, Админы сервер держат В слабеющих руках. А что, неплохо у них получилось. И главное – в тему! Но, однако, мистика мистикой, а подошло время обеда. Меня потянуло в сторону штаба и корпоративного костра, где маняще чернел боками закопченный чайник. Мне галантно налили чаю и предложили закусить: все-таки голодный журналист – злой журналист… За чаем разговорилась… нет,

не с сисадмином, с директором Центра новых информационных технологий Калужского госпедуниверситета им. К.Э.Циолковского Вадимом Виноградским. Ученый человек, кандидат наук, доцент говорил о слете в восторженных тонах: – Работники информационной сферы, IT-специалисты общаются только в он-лайн режиме, через компьютер. А ведь живое человеческое общение нельзя заменить ни компьютером, ни чем другим. Как видите, это подтверждается. Потеря живого общения, на мой взгляд и на взгляд наших коллег, приводит к тому, что люди замыкаются в своем мире и не видят, что происходит в мире на самом деле, а видят только виртуальный мир, который далек от жизни. Опять Зазеркалье – оказывается, в организации турслета сисадминов принимает участие педуниверситет. Удивленно спрашиваю: – Как связан педагогический университет и системные администраторы? – Наш университет чем хорош? Это единственный собственный университет нашего города. Остальные – филиалы. У нас учатся ребята, которые по каким-то причинам не подошли для всего мира, а подходят для нашей жизни. Университет гуманитарный по своей сути. А для гуманитариев самое важное в жизни – душа. Наша земля калужская – святая земля. И на этой святой земле есть университет. Миссия нашего университета – соединять людей. Естественно, что мы поддерживаем все мероприятия, которые связаны с общением людей, соединением людей в единое общество. Ни много ни мало. Я задумалась. И поняла, что надо прекратить искать мистику на Первом Всероссийском слете сисадминов. А принимать как должное и конкурс на самое быстрое, экономное, элегантное обжимание проводов, и выставку оружия на пригорке. А также разгоревшийся при моем появлении костер около одной из палаток. Пусть будут глюки. Праздник все-таки. Раз в году – можно!

Оксана Родионова, фотографии предоставлены организаторами слета



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

Семь веб-интерфейсов к электронной почте Выберите лучший!

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

10


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

На чем проводилось тестирование Для тестирования использовалась машина, работающая под управлением операционной системы FreeBSD 6.1. Версии остального программного обеспечения, которое использовалось для тестирования:  Apache 1.3.36  Sendmail 8.13.6  Popa3d 1.0.2_1  Dovecot 1.0 rc2  PHP 4.4.2  Perl 5.8.8  PostgreSQL 8.1.3 Указанные версии не следует рассматривать как какие-то зависимости – большинство тестируемых пакетов хорошо работают с любыми SMTP/POP3/IMAP-серверами, в том числе и удалёнными. Проверка на Linux-машине с установленным Apache 2.0.55 и PHP 5.1.2 (для пакетов, разработанных на этом языке) показала

работоспособность тестируемых пакетов и в этих условиях.

Претенденты на звание лучшего В обзоре принимали участие только свободные системы, доступные в коллекции портов:  Ilohamail  RoundCube  UebiMiau  ISMail  OpenWebMail  NoCC  SquirrelMail Установка выполнялась исключительно из портов в конфигурации, заданной по умолчанию. Замечу, что многие из рассмотренных пакетов доступны и для других систем, в частности, для Linux. Все, за исключением OpenWebMail, разработаны на «чистом» PHP, так что проблем с переносимостью быть не должно. Представленные здесь веб-интерфейсы рассматривались как с точки зрения администратора (простота и понятность установки и первоначальной настройки, вопросы безопасности), так и с точки зрения пользователя (функциональные возможности, удобство, внешний вид). Оценка качественных характеристик, таких как удобство и привле-

кательность интерфейса, производилась путём усреднения субъективных мнений автора и «независимых экспертов», завербованных из числа сотрудников редакции журнала. Мнение автора имело определяющий вес. Для каждого пакета внимание обращалось на следующие особенности:  Возможность работы по протоколам POP3 и IMAP.  Возможность и удобство работы с вложениями.  Возможность поиска и сортировки сообщений.  Качество русификации и корректность работы с различными кодировками.  Наличие «сервисных» функций (таких как адресная книга и т. д.).  Наличие дополнительных возможностей (работа по защищённому протоколу, использование СУБД и т. д.).  Наличие и качество документации.  Требования к клиенту (поддержка JavaScript и т. п.). Также обязательно проверялась «история безопас нос ти» рас с матривае мых интерфейсов по базе данных сайта www.securitylab.ru.

Слово – претендентам

ментированы достаточно хорошо и работа пакета предельно прозрачна, сложно представить, что какие-то проблемы могут возникнуть. Настройка выполняется путём редактирования файлов conf/login.inc и conf/conf.inc, а также других inc-файлов (если потребуется что-то нестандартное). Как минимум, нужно указать параметры SMTP-сервера, которые будут использоваться для отправки сообщений. Также наIlohamail стоятельно рекомендуется в параметре $default_host жёс Тестируемая версия: ilohamail-0.8.13_1. тко ограничить список POP3- и IMAP-серверов, с которы Порт: /usr/ports/mail/ilohamail. ми пользователям будет позволено работать.  Язык разработки: PHP. Взаимодействие с почтовыми системами осуществляет Официальный сайт: http://ilohamail.org.  Демо-версия: http://ilohamail.org/main.php?page=demo. ся по протоколам SMTP и POP3/IMAP (используются функции собственной разработки), то есть пакет совершенно Пакет уже рассматривался на страницах журнала автономен и никак не зависит от версий и режимов рабо(№1 за 2006 г.). Установка не вызывает никаких сложностей – ты ваших серверов входящей и исходящей почты. Ilohamail все необходимые для работы файлы помещаются по умол- вполне может быть запущен на отдельном хосте, хотя в цечанию в каталог /usr/local/www/ilohamail. Для начала рабо- лях минимизации сетевого трафика рекомендуется всё же ты этот каталог нужно либо перенести в дерево вашего веб- устанавливать его на той же машине, где работает ваш сайта, при необходимости переименовав его, либо создать POP3/IMAP-сервер. (Естественно, эта рекомендация больна него ссылку в конфигурации Apache, например, так: ше подходит для небольших серверов с умеренной загрузкой. Для систем, работающих на пределе своих возможносAlias /mail/ /usr/local/www/ilohamail/ тей, размещение здесь же сервера Apache может оказаться не самой лучшей идеей.) Имеется поддержка SSL. По умолчанию пакет позволяет пользователю самостояДокументация, представленная на сайте, не слишком подробная (просто перечислены имеющиеся функции), тельно указывать сервер входящих сообщений и протокол, зато есть почтовый список рассылки и форум, где в слу- по которому будет выполняться работа. Это хорошая возчае проблем можно будет получить ответ на свой вопрос. можность, если вы создаёте универсальный сервер, позПравда, учитывая, что конфигурационные файлы проком- воляющий вашим клиентам работать со своими почтовыПриступим к «смотру» основных претендентов. Обратите внимание на пункт «Демо-версия» – по этому адресу вы сможете попробовать тот или иной пакет в действии. Ну и, конечно же, представлены снимки экранов. Итак, знакомьтесь!

№9, сентябрь 2006

11


администрирование сутствии cookies пакет в состоянии использовать другие способы поддержания сессии). Из уязвимостей упоминаются лишь возможность получения доступа к конфигурации и пользовательским данным (о чём мы упоминали) и недостаточная обработка входных данных, позволяющая выполнить XSS-нападение. Обе уязвимости датированы 18.04.2005 года со степенью угрозы «низкая». В общем и целом пакет произвёл очень хорошее впечатление своей простотой, понятностью и нетребовательРисунок 1. IlohaMail настолько просто выполнен, что будет работать даже в links ностью. Думаю, он будет неплохим выми ящиками, где бы те ни были зарегистрированы. То есть бором для систем, где «ехать» важнее, чем «шашечки». можно сказать, что Ilohamail – это веб-аналог обычного почтового клиента. UebiMiau Однако такая «вольность» таит в себе определённые  Тестируемая версия: uebimiau-2.7.10. проблемы безопасности, и потому я рекомендую всё же за-  Порт: /usr/ports/mail/uebimiau. ранее указать список допустимых серверов.  Язык разработки: PHP. Вся пользовательская информация (индивидуальные  Официальный сайт: http://www.uebimiau.org. настройки, отправленные сообщения, список контактов)  Демо-версия: http://uebimiau.org/demo.php. размещается по умолчанию в каталоге data. Поскольку некоторая небрежность с расширениями файлов и отсутсПакет UebiMiau во многом напоминает Ilohamail. По умолтвием индексов может привести к неавторизованному до- чанию также создаётся каталог в /usr/local/www, который ступу к конфиденциальным данным, настоятельно реко- нужно либо перенести в дерево веб-сайта, либо сконфигумендуется этот каталог перенести за пределы дерева веб- рировать как псевдоним. Также желательно вынести катасайта, благо такая возможность предусмотрена в файле лог database за пределы каталога, доступного веб-серверу. конфигурации. Настройки выполняются правкой файла inc/config.php. Ilohamail переведён на десятки языков, среди которых Документация на сайте находится в стадии разработесть и русский (поддержка языков реализована через под- ки, так что надеяться приходится только на комментарии ключение соответствующих inc-файлов). Русификация вы- в конфигурационных файлах. Впрочем, они предельно пополнена на очень хорошем уровне, не считая нескольких нятны, так что сложностей с пониманием работы пакета опечаток в интерфейсе. Сообщения в различной кодиров- возникнуть не должно. ке Ilohamail отображает корректно, разве что «споткнулся» Поддерживается работа как по IMAP, так и по POP3 (мооб UTF-8 в имени отправителя. жет использоваться прямое обращение к sendmail, php-фунДостаточно аскетичный и в то же время удобный интер- кция mail() либо работа по протоколу SMTP с любым удалёнфейс позволяет легко ориентироваться в возможностях па- ным сервером), но в настройках можно задать только один кета. Помимо естественной возможности отправлять поч- из этих протоколов. SSL не поддерживается. Права самоту и просматривать входящую (если в php.ini не запрещена стоятельно указывать сервер пользователи также не полузагрузка файлов параметром «file_uploads = Off», то и с от- чают – подключаться можно только к серверам, явно укаправкой вложений никаких сложностей не возникнет), к ва- занным в конфигурации (массив $mail_servers[] в файле шим услугам календарь (правда, без возможности делать inc/config.php). какие-то заметки), список контактов, закладки (здесь вы можете хранить интересные вам интернет-ссылки). Самостоятельно пользователь может изменить кодировку, язык, часовой пояс, правила сортировки, некоторые цвета интерфейса. Поддержка браузером JavaScript не требуется, хотя его использование позволит получить некоторые дополнительные удобства. Не является обязательной также и поддержка cookies-файлов (авторизация, как и в большинстве рассмотренных пакетов, обеспечивается механизмом сессий языка PHP, так что при отРисунок 2. Всё бы было хорошо, если бы кодировка не сломалась...

12


администрирование Хранение пользовательских данных, как и в случае с Ilohamail, осуществляется в текстовых файлах, размещаемых в каталоге database, так что никаких особых прав доступа для этого каталога не требуется, и вся работа ведётся исключительно с правами пользователя, от имени которого работает Apache. Есть возможность выбрать язык интерфейса из очень большого числа вариантов. Русский среди них присутствует, и к качеству перевода никаких нареканий нет. Правда, впечатление несколько подпортила некорректная работа с кодировкой входящих сообщений – UebiMiau не сумел правильно выбрать Рисунок 3. Здесь есть почти всё, о чём только можно мечтать кодировку даже для сообщения, которое через него же и отправлялось. Интерфейс организован очень удобно и интуитивно понятен. При первом входе в систему вас переправят на страницу настроек. При желании можно изменить часовой пояс, режимы управления корзиной (куда будут помещаться удаляемые сообщения), задать личную подпись. Из дополнительных возможностей – работа с папками, поиск (по отправителю, теме, телу сообщения), адресная книга. Поддержка браузером скриптов на JavaScript обязательна – иначе не будет работать даже меню. Также обязательна и поддержка cookies (хотя в настройках это требование можно отключить, тогда UebiMiau будет использовать другие способы поддержания сессий). Проблем с безопасностью зарегисРисунок 4. Веб-диск позволит вам копаться в своём домашнем каталоге, даже если трировано три, все помечены низким злой админ не открыл FTP-доступ уровнем опасности. Последняя из них фильтрацию спама (за это отвечает SpamAssassin), прове(межсайтовый скриптинг) датирована 3 июля этого года. Несмотря на предельную простоту и не столь большое рять правописание (подключается ispell) и так далее. Установка выполняется по умолчанию в /usr/local/www/ число функций, этот веб-интерфейс будет прекрасным выбором в том случае, если вам просто нужно обеспечить cgi-bin/openwebmail. Для начала работы нужно указывать «запасный выход» для некоторых своих клиентов (или да- в адресной строке полный путь к файлу: mysite.ru/cgi-bin/ же только для себя), чтобы иметь возможность просмот- openwebmail/openwebmail.pl. В принципе можно попробореть свою почту из любого интернет-кафе. Впрочем, не- вать сделать более «красивый» путь с помощью псевдоникорректная работа с кодировками может несколько под- мов, но в процессе работы особой необходимости в этом не возникает. портить впечатление. Все конфигурационные файлы размещаются здесь же, в каталоге cgi-bin/openwebmail/etc. Доступ к ним регулируOpenWebMail ется с помощью прав на исполнение, так что особое внима Тестируемая версия: openwebmail-2.52_1. ние нужно уделять грамотной настройке доступа к cgi-ката Порт: /usr/ports/mail/openwebmail. логу (в частности, нельзя допускать, чтобы он был доступен  Язык разработки: Perl.  Официальный сайт: http://turtle.ee.ncku.edu.tw/ в корне веб-сайта по прямой ссылке, в обход ScriptAlias). Документация на сайте включает файлы README, FAQ и друopenwebmail. гие, которые в ряде случаев могут оказаться полезны.  Демо-версия: http://www.postman.net. Поскольку пользовательские данные OpenWebMail храПри установке можно задать ряд параметров, в том чис- нит в домашних каталогах пользователей (то есть пакет ле подключить проверку на вирусы (с помощью ClamAV), «завязан» на учётные записи и требует, в частности, что-

№9, сентябрь 2006

13


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

Рисунок 5. В SquirrelMail можно найти и довольно гармоничные

бы каждый пользователь имел реально существующий домашний каталог), то для ряда операций используются двоичные файлы с установленным suid-битом, то есть работа выполняется фактически с правами пользователя root. С одной стороны, размещение данных в домашних каталогах гарантирует, что они не будут доступны другим пользователям, а также позволяет реализовать ряд интересных сервисных функций, таких как «веб-диск» (об этом – чуть позже). Если учесть, что за OpenWebMail тянется довольно длинный шлейф уязвимостей (я насчитал восемь, но, к чести разработчиков, замечу, что они, по большей части, охарактеризованы как имеющие низкую степень опасности), то всё это вместе отнюдь не добавляет спокойствия и уверенности в завтрашнем дне вашего сервера. Пользовательский интерфейс прямо с экрана авторизации поразил стильностью и качеством проработки деталей. Русский язык был выставлен автоматически, без необходимости что-либо править (при желании, в настройках вы сможете выбрать другой из множества доступных). В настоящее время переведено примерно 90% надписей (в частности, эта радость пока не постигла адресную книгу). Автоматическое распознавание кодировки сообщения выполняется на уровне – все тестовые сообщения были отображены правильно, включая отправителя, тему и само сообщение. Правда, OpenWebMail споткнулся (как и все остальные, впрочем) на кириллическом имени вложения (отправлялся созданный в Windows файл с именем «тест.txt»). Пиктограммы панели инструментов достаточно удобны в работе, не загромождая экран и позволяя интуитивно ориентироваться в доступных функциях. Хотя их маленький размер для утомлённого годами терминальной работы админского глаза показался поначалу не слишком комфортным. Помимо функций работы с электронной почтой к вашим услугам – адресная книга, календарь, где можно отмечать важные события, фильтр входящих сообщений, расширенная форма поиска, веб-диск, с помощью которого вы сможете хранить на сервере свои файлы, без необходимости прибегать к услугам FTP-сервера и даже интерфейс ssh-терминала. Также реализованы всплывающие окна, инфор-

14

мирующие о наступлении того или иного события, например, получении нового сообщения. Использование JavaScript не обязательно, но вот для поддержания сеанса работы поддержка cookies обязательно должна быть включена. Нужно заметить, что, по сравнению с «легковесами», разработанными на PHP, OpenWebMail заметно притормаживает, задумываясь на секунду-другую, прежде чем обновить экран. В принципе ожидать иного от «чистого» CGI-интерфейса и не приходится, а для работы в mod_perl пакет не предназначен (в первую очередь из-за «бинарных» вставок). Отдавая должное огромной работе, проделанной разработчиками, следует сказать, что пакет OpenWebMail – очень темы мощное и эффективное решение, особенно если веб-интерфейс является для вас и ваших клиентов основным способом работы с электронной почтой. Но, с другой стороны, невысокая скорость работы и потенциальные проблемы с безопасностью делают его не слишком пригодным для работы в «большом Интернете».

SquirrelMail     

Тестируемая версия: squirrelmail-1.4.7. Порт: /usr/ports/mail/squirrelmail. Язык разработки: PHP. Официальный сайт: http://www.squirrelmail.org. Демо-версия: не обнаружена.

Как и в случае большинства рассмотренных здесь пакетов, всё, что требуется для работы, при инсталляции помещается в /usr/local/www/squirrelmail. Здесь же, в каталоге config, можно найти файл конфигурации, где нужно будет указать параметры SMTP- и IMAP-серверов. В поставке имеется и Perl-скрипт под именем conf.pl, который поможет вам выполнить настройку интерактивно

Рисунок 6. Интерактивная конфигурация – к вашим услугам


администрирование (запускается он из командной строки). Если вам доводилось заниматься настройкой различного сетевого оборудования, то интерфейс покажется вам знакомым (см. рис. 6). Документация на сайте весьма подробная, коротко, но ясно описывающая буквально каждый шаг. Есть большое число дополнений, которые можно установить из коллекции портов (например, вы можете автоматически добавлять к каждому письму «нижний колонтитул» с помощью плагина squirrelmailemail_footer-plugin или выполнять с поРисунок 7. Наверное, именно так и должно выглядеть совершенство мощью squirrelmail-login_auth-plugin автоматическую HTTP-аутентификацию). Язык по умолчанию предлагается английский, но может быть переопределён в настройках («Options → Display Preferences»), где среди множества представленных вы наверняка найдёте тот, который вам нужен. Русский там, естественно, присутствует. Качество перевода никаких нареканий не вызвало, «белых пятен» также в ходе тестирования не обнаружилось. Там же, в настройках, помимо всего прочего, можно изменить и цветовую гамму интерфейса. Выбор заложенных в поставку тем огромен – от приятных и гармоничных (например, Bluesome), до режущих глаз ядовито-зелёных. Впрочем, на вкус и цвет, как известно, товарищей нет. Обрадовало наличие подробной справочной информации, доступной здесь же, через веб-интерфейс. Так что особо непонятливых пользователей, коРисунок 8. Крепость так и не сдалась... торые умудрятся заблудиться в столь понятном и простом интерфейсе, можно будет отсылать к ней, именно то оформление, которое сделает приятным даже получение письма от начальства, что срочно нужно подгоа не «куда-нибудь подальше». Отправка-чтение работают «на ура», включая вложения товить отчёт, срок сдачи – «вчера»... (за исключением русских имён файлов) и автораспознавание кодировки. Из «сервисных функций» – адресная кни- RoundCube га, работа с папками, поиск и справка. Ряд дополнитель-  Тестируемая версия: roundcube-0.1.20060518.  Порт: /usr/ports/mail/roundcube. ный функций можно установить из плагинов. А вот что касается безопасности, то первое, что прихо-  Язык разработки: PHP. дит в голову при просмотре списка уязвимостей, это сло-  Официальный сайт: http://www.roundcube.net. во «решето»... 22 штуки, включая «средние» и «критичес-  Демо-версия: http://demo.roundcube.net. кие», позволяющие получить доступ к системной инфорДля хранения пользовательских данных использует мации и даже выполнение произвольного кода с правами веб-сервера – это уже не шутки. Правда, последнее вре- СУБД – при инсталляции предлагается на выбор MySQL мя «поток уязвимостей» несколько стабилизировался, так или PostgreSQL. После сборки размещается в /usr/local/ что можно надеяться, что сейчас использование пакета не www/roundcube. Перед началом работы требуется сформировать нужпредставляет такой уж серьёзной опасности. Так что, если «паранойя» – не ваш диагноз, то SquirrelMail ную базу данных и настроить параметры подключения к ней обеспечит вашим пользователям удобный и прекрасно ло- в конфигурации (файл config/db.inc.php). Прочие настройкализованный веб-интерфейс для работы с электронной ки, такие как параметры почтовых серверов, указываются почтой, к тому же позволяющий выбрать из множества тем в config/main.inc.php.

№9, сентябрь 2006

15


администрирование ки «Отправить» в форме создания нового сообщения, может сбить с толку – не сразу догадываешься, что для отправки сообщения нужно щёлкнуть на пиктограмму, больше похожую на изображение принтера. Так же не совсем привычно, что, например, для просмотра какогото сообщения открывать его нужно двойным, а не одинарным щелчком. Поддержка различных кодировок выполнена на высоком уровне («зюки» вместо имени вложения мы уже не рассматриваем – эту проверку не прошёл ни один из кандидатов). Из дополнительных функций – лишь список контактов. Информацию об известных уязвимостях обнаружить не удалось, так что если вы фанат самых продвинутых техРисунок 9. Эх, если бы не загромождённость поля «От» да лишнее поле «Кому»... нологий или хотите доставить своим Если что-то будет работать не так, то первое место, ку- пользователям эстетическое удовольствие от прикосноведа следует обратиться за разъяснениями, – лог-файлы ния к столь тонко проработанному дизайну, то RoundCube в roundcube/logs. Первая ошибка, с которой мне пришлось будет для вас хорошим выбором – задачу «кубатуры крустолкнуться, – это сообщение, что отсутствует функция га» разработчики решили превосходно. session_start(). Для её устранения пришлось в php.ini установить следующий параметр: ISMail  Тестируемая версия: ismail-2.0. ; Initialize session on request startup  Порт: /usr/ports/www/ismail. session.auto_start = 1  Язык разработки: PHP. Кстати сказать, ещё одна переменная – register_globals,  Официальный сайт: http://www.insidesystems.net/ которая раньше также создавала много проблем, для расprojects/project.php?projectid=4. сматриваемых пакетов не критична, так что можно вполне  Демо-версия: не обнаружена. оставить значение по умолчанию (обычно по соображениям безопасности это «Off»). Для хранения пользовательской информации может исДля нормальной работы обязательно требуется доступ- пользоваться domxml (по умолчанию), MySQL или PostgreSQL. ный IMAP-сервер – работа по POP3, похоже, не поддержива- Примеры настройки на работу с той или иной базой данных ется. Для работы с IMAP-серверами может использоваться можно найти в /usr/local/share/examples/ismail. Кстати, раслибо функция mail(), либо код, разработанный для Ilohamail. ширение PHP – domxml как зависимость почему-то не устаПоддержка безопасных SSL-соединений реализована. новилось, так что пришлось доустанавливать его вручную В общем, установка и настройка особых сложностей из порта php4-extensions. не вызовут, хотя некоторые тонкие моменты можно было бы и Документация на сайте довольно удобна, для сообщеболее подробно осветить в документации, представленной на ний об ошибках (Bug Reports) предусмотрено использовасайте. К слову, документация оформлена в виде wiki, что все- ние электронной почты. ляет надежду на её быстрое наполнение. Пользователю для полноценной работы потребуется браузер, в полном объёме поддерживающий CSS2, XHTML, объектную модель JavaScript и XMLHttpRequest. Впрочем, это умеют практически все современные браузеры. Также обязательной является и поддержка cookies. Среди переводов есть и русский язык. Включить его можно в настройках. Там же доступны вкладки для работы с папками и своим профилем. Интерфейс очень интересный. Особенно поразили полупрозрачные диагностические сообщения, выводимые поверх основной страницы. Некоторая непривычность интерфейса, в частности, отсутствие кнопРисунок 10. А это уже другая тема. Тоже, впрочем, неплохо

16


администрирование Установка выполняется в /usr/local/www/data/ismail, так что если data в вашем случае является символьной ссылкой на корень веб-сайта, то будьте готовы к тому, что ISMail сразу станет доступен вашим пользователям. Так же, как и для RoundCube, необходимо в php.ini разрешить автоматическую инициализацию сессий: ; Initialize session on request startup session.auto_start = 1

Конфигурационные файлы размещаются в каталоге include. Для того чтобы веб-интерфейс заработал, нужно переименовать файлы ismail.conf.sample и istheme.conf.sample в ismail.conf и istheme.conf соответственно. Ну и, естественно, внести в них необходимые изменения. В частности, обязательно нужно прописать секцию своего домена (пример того, как это сделать, можно посмотреть в секции default). И не забудьте убрать секцию example.net, иначе она тоже будет предлагаться на выбор при входе в систему. Для отправки сообщения вы должны задать переменную mailprogram в конфигурационном файле, которая бы указывала на вашу локальную программу отправки почты. В нем по умолчанию есть примеры для использования sendmail и exim. Если через /bin/sendmail, то и постфикс имеет такой враппер – конкретно используется команда: /usr/libexec/sendmail/sendmail -oi -t

но, поскольку эта команда задаётся прямо в конфигурационном файле, то в принципе можно указать любой вызов, лишь бы он поддерживал нужный режим работы. Изменил предыдущее предложение... Использовать любой SMTP-сервер вы не сможете. Интерфейс буквально поразил своей красотой в стиле Ubuntu. Но ещё больше «поразил» нечитаемыми символами, выводимыми вместо русских букв в именах отправителей и темах сообщений. Удручила и невнятная панель инструментов, о назначении иконок на которой можно узнать, только подведя к ней мышку (возможно, со временем, когда работа дойдёт до автоматизма, это будет и удобно, что ничего лишнего, но при первом знакомстве с таким интерфейсом просто теряешься). Зато по расположению фреймов очень напоминает привычные многим «оффлайновые» почтовые клиенты типа Outlook Express, что можно считать довольно хорошим начинанием (особенно это поможет низкоквалифицированным пользователям). Для работы требуются JavaScript и поддержка cookies. При попытке открыть форму редактирования нового сообщения меня встретил чистый экран. Поискав в логах, я обнаружил сообщение об ошибке: [error] PHP Parse error: syntax error, unexpected ';' in /var/www/webmailtesting/ismail/sendmail.php on line 167

Пришлось в указанном файле заменить строчку: $addedentry = $AddressBook->AddEntry ↵ ($headerinfo->(ISDecode(fromaddress));

на: $addedentry = $AddressBook->AddEntry ↵ (ISDecode($headerinfo->fromaddress);

№9, сентябрь 2006

После этого форма стала открываться. Кнопки «Отправить» и здесь нет (видимо, разработчики решили во всём следовать интерфейсу «оффлайновых» клиентов), так что пришлось предварительно поводить мышкой по иконкам, разбираясь, что же они означают. Если вы не большой поклонник коричневого, то внешний вид можно подправить в include/istheme.conf. С языком – хуже. Среди настроек русский не отыскался. Тем не менее определённую надежду вселило наличие каталога locale, где можно найти mo- и po-файлы для итальянского, чешского, датского и английского, но почему-то выбор любого из этих языков в настройках на языке интерфейса никак не отражался. Разве что «зюки» становились другими. Создание «по образу и подобию» каталога с русской локалью (пришлось повспоминать азы gettext) не привело к появлению родного языка среди доступных. Пришлось править исходники. В частности, русский язык был добавлен в список доступных в массив $defaultsettings["locale"]["values"] (файл include/globals.php). Но на переключение языка интерфейса эта опция упорно влиять не желала. Так что, не мудрствуя лукаво, в include/globals.php был жёстко прописан для варианта по умолчанию «ru_RU», и там же (строка 204) явно указана кодировка, так как из файла локалей её разработчики решили не вытаскивать, ограничившись жёсткой привязкой к iso-8859-2: function PageHeader($echo=1, $frame=0) { $header = ""; if ($_SESSION["locale"] == "ru_RU") { $header = "<?xml version=\"1.0\" ↵ encoding=\"koi8-r\"?>\n"; } else { $header = "<?xml version=\"1.0\" ↵ encoding=\"iso-8859-1\"?>\n"; }

Вся эта «хирургия» позволила наконец-то увидеть русские надписи в элементах интерфейса, и koi8-r стал отображаться нормально и в сообщениях. А вот письмам в других кодировках так и не повезло – они по-прежнему сохранили свою «нечитаемость». Похоже, пакет не предусматривает, что у кого-то может быть несколько кодовых таблиц и что все их хорошо бы обрабатывать по-своему. Из дополнительных функций – лишь адресная книга, так что даже если абстрагироваться от проблем с кодировками, пакет всё равно оставляет чувство какой-то недоработанности. Небольшим утешением можно считать отсутствие известных уязвимостей. Тем не менее ISMail можно порекомендовать разве что любителям копаться в исходниках и править локали. Ну а я с грустью констатирую, что мне «взять Измаил» сходу не удалось, а к длительной осаде я сейчас не предрасположен.

NoCC     

Тестируемая версия: nocc-1.2. Порт: /usr/ports/mail/nocc. Язык разработки: PHP. Официальный сайт: http://nocc.sourceforge.net. Демо-версия: не обнаружена.

17


администрирование Сравниваем веб-интерфейсы к электронной почте Веб-интерфейс

Ilohamail

UebiMiau

OpenWebMail

SquirrelMail

RoundCube

ISMail

NoCC

Версия

0.8.13_1

2.7.10

2.52_1

1.4.7

0.1

2.0

1.2

Поддержка POP3

+

+

n/a****

-

-

+

+

Поддержка IMAP

+

+

n/a****

+

+

+

+

Метод отправки*

SMTP

SMTP

собственная

SMTP

SMTP

MSA

SMTP

Поддержка SSL

+

-

n/a

-

+

-

+

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

+/- *****

-

+

+/- *****

+/- *****

-

+

Работа с вложениями

+

+

+

+

+

+

+

Русский интерфейс

4

4

4,5

5

4,5

1

4

Обязательная поддержка JavaScript

нет

да

нет

нет

да

да

нет

Функция поиска сообщений

-

+

+

+

-

-

-

Функция сортировки

+

+

+

+

+

+

+

Внешние фильтры

-

-

+

-

-

-

-

Адресная книга

+

+

+

+

+

+

-

Календарь

+

-

+

-

-

-

-

веб-диск, ssh-терминал

плагины

Количество уязвимостей

2

3

8

22

-

-

2

Простота установки и настройки**

4,5

5

5

5

4

1

5

Удобство работы***

4,5

4

4

5

5

4

3,5

Внешний вид***

3,5

3,5

4

4,5

5

3,5

3,5

Темы интерфейса

+

Прочие сервисные функции

+

Примечания: * SMTP – отправка сообщений по протоколу SMTP; MSA – использование почтового агента напрямую (например, sendmail); собственная – собственная реализация функции отправки. ** простота установки и настройки дана как интегральный субъективный показатель (от 1 до 5), учитывающий «прозрачность» пакета, комментарии в конфигурационных файлах, качество документации, а также необходимость «доводки напильником». *** усреднённая оценка удобства и внешнего вида указана как средняя оценка (от 1 до 5), присвоенная интерфейсу редакцией. **** OpenWebMail работает напрямую с хранилищами, автоматически определяя их тип. ***** отметка «+/-» означает, что пакет не смог корректно отобразить Unicode в поле «Отправитель».

Установка выполняется в /usr/local/www/nocc. Перед началом работы следует внести нужные изменения в конфигурационный файл (conf.php), к слову, очень подробно прокомментированный. Обязательно нужно установить значение переменной $tmpdir. Пришлось также доустановить из php4-extensions расширение Iconv (как зависимость оно не установилось). Не забывайте перезапускать Apache после добавления расширений. В отличие от RoundCube и ISMail, здесь для нормальной работы, наоборот, нужно отключить автоматическую инициализацию сессий: ; Initialize session on request startup session.auto_start = 0

В противном случае получите ошибку «Невозможно подключиться к серверу». Cookies для поддержания сессии не требуются. Имеется поддержка SSL. Русский язык был предложен по умолчанию. Интерфейс довольно милый (хотя и несколько громоздкий), с корректным отображением кириллицы. Ничего лишнего (даже настроек, не говоря уже об адресных книгах и т. д.). Есть по умолчанию три цветовые темы (выбрать одну из них можно при входе, на экране ввода логина и пароля). Уязвимостей было обнаружено две (последняя из них в феврале этого года – с уровнем «средний»). Несмотря

18

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

Подводим итоги Для того чтобы было проще охватить сразу все рассматриваемые пакеты, наиболее важные особенности сведены в таблицу. Довольно сложно вынести вердикт, что «этот пакет хорош, а этот плох». За исключением ISMail, который так и не удалось заставить полноценно работать, не говоря уже о работе «из коробки» (впрочем, никто поддержку русского языка здесь и не обещал), каждый из оставшихся вправе претендовать на вашу благосклонность. Если вам нужно лёгкое и нетребовательное решение, то хорошими кандидатами являются Ilohamail, NoCC или UebiMiau (последний – если для вас не слишком критична корректная работа с различными кодировками). Для «гурманов» прекрасным выбором будет блистательный RoundCube (если не обращать внимания на не очень богатый фунционал). Если вам нужна непревзойдённая функциональность, даже ценой снижения безопасности сервера, то обратите внимание на OpenWebMail или SquirrelMail. В общем, выбирать есть из чего, и окончательное решение мы оставляем за вами.



FreeBSD

полезные советы

Как не «проморгать» нужную строку жмёте <Enter>, если удалить – вводите <d> и потом <Enter>. Вы, думаю, помните, сколько всего выводится на экран Понятно, что если какой-то из удаляемых пакетов «держит» при сборке ядра или какого-нибудь большого пакета. Пос- другие в качестве зависимости, то эти другие сами станут тоянно наблюдать за выводом довольно скучно, а экранный «листовыми». Поскольку запускать «pkg_cutleaves -x» рекурбуфер не всегда позволяет «отмотать» вывод до интересу- сивно, пока не останутся только нужные пакеты, – не самое ющего вас момента. Можно, конечно, перенаправить вывод весёлое занятие, разработчики предусмотрели ещё один в файл и потом изучать его сколько угодно, но в этом слу- ключ: -R. Команда «pkg_cutleaves -R» работает аналогично чае вы теряете возможность «мониторить» процесс в ре- приведённому выше, за тем исключением, что если в сисжиме реального времени. Проблема легко решается с по- теме есть пакеты, от которых зависит только удаляемый, то они будут удалены автоматически и рекурсивно, без домощью утилиты script: полнительных вопросов. Как обычно в таких случаях, на# script /var/log/build.log стоятельно рекомендую ознакомиться с man pkg_cutleaves Script started, output file is /var/log/build.log и внимательно отвечать на каждый вопрос программы. # make buildworld <. . . отображение процесса сборки . . .>

# exit exit Script done, output file is /var/log/build.log

То есть вы всё видите на экране, но при этом весь вывод, равно как и ввод, дублируются в указанном файле. Главное, чтобы места на диске хватило. Только не забывайте, что в этот же файл попадут и управляющие символы, так что этот метод не слишком подходит для «логирования» интенсивной интерактивной работы, особенно если вам часто приходится использовать Backspace.

Удалите из системы всё лишнее При интенсивной работе с пакетами программ в системе со временем накапливается много лишнего, например, пакеты, которые устанавливались как зависимости к уже удалённым или обновлённым приложениям. Для их удаления в «полуавтоматическом» режиме служит очень удобная утилита: pkg_cutleaves (установить её можно из портов: sysutils/pkg_cutleaves). Поскольку она использует возможности portupgrade, то эта программа также должна быть у вас установлена. Если говорить точнее, то pkg_cutleaves работает с так называемыми листовыми пакетами, т.е. с такими, которые не являются зависимостями для других, установленных в системе. Например, команда «pkg_cutleaves -lc» выведет (с краткими комментариями) список пакетов-кандидатов на удаление, среди которых будут и bash, без которой вы жить не можете, и какой-нибудь gmake, который был нужен для установки приложения, уже давно «почившего в бозе». Поэтому её работа в любом случае требует вашего пристального внимания: # /usr/local/sbin/pkg_cutleaves -x Package 1 of 38: autoconf-2.59_2 - Automatically <...> Un*x platforms (2.59) autoconf-2.59_2 - [keep]/(d)elete/(f)lush marked pkgs/(a)bort? ** Keeping autoconf-2.59_2. Package 2 of 38: bash-2.05b.007_5 - The GNU Bourne Again Shell bash-2.05b.007_5 - [keep]/(d)elete/(f)lush marked pkgs/(a)bort?

И так по всем пакетам: если хотите оставить – просто

20

О пользе обратных кавычек Свойство оболочки исполнять выражение в обратных кавычках (`команда`) и подставлять результат в исполняемую командную строку, предоставляет широчайшие возможности для автоматизации. Например, следующая команда выведет на экран конфигурационный файл текущего ядра, независимо от платформы и имени этого файла: $ cat /usr/src/sys/`uname -p`/conf/`uname -i`

Ещё один пример: $ touch arch`date "+%Y-%m-%d"`

В итоге вы получите файл с именем вида arch2006-07-21, зависящим от даты исполнения команды. При необходимости можно создавать и вложенные конструкции, например: $ echo a`echo b\`echo c\\\`echo d\\\`c\`b`a abcdcba

Обратите внимание на то, как приходится экранировать служебные символы для того, чтобы они «срабатывали» на нужном уровне вложенности (сам слэш тоже нуждается в экранировании, поэтому на «уровне d» мы вынуждены использовать целых три символа «\»). Наибольшую пользу обратные кавычки приносят при использовании в скриптах, автоматизирующих те или иные действия.

Обновляйте коллекцию портов без усилий В FreeBSD 6.x появилась удобная утилита для обновления портов: portsnap. Теперь не обязательно устанавливать и настраивать cvsup, обновление дерева очень легко выполняется системными средствами: # portsnap fetch && portsnap update

При первом запуске между этими командами понадобится ещё одна: «portsnap extract». Для автоматического скачивания обновлений (например, по расписанию cron) вместо portsnap fetch следует использовать portsnap cron.

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


полезные советы

Не нагружайте Apache лишней работой Если вы не предоставляете своим клиентам услуги хостинга с возможностью самостоятельно вносить изменения в .htaccess и если вам не требуется «на лету» менять параметры каких-либо каталогов – отключите вообще исполь- Не обижайте клиентов зование этих файлов с помощью директивы AllowOverride Предположим, у вас есть каталог http://yourdomain.ru/project/. None. Вы же не хотите потерять клиентов, которые будут пытатьЛюбые специфические для каталога настройки мож- ся по ошибке зайти в каталог proect? Конечно, можно нано указать в соответствующей секции <Directory>. Конеч- писать красивую и грамотную «страницу 404», которая буно, в этом случае после каждого изменения конфигура- дет возвращаться клиенту в ответ на запрос несуществуции придётся перезапускать веб-сервер, но это, как прави- ющего ресурса и всё ему объяснять. Но проблема в том, ло, лучше, чем заставлять Apache при обработке каждого что «клиент всегда прав», и он обижается, если ему сказапроса просматривать каждый каталог от корня файло- зать, что он ошибся. Для домашней странички это не кривой системы (даже не сайта!!!) до текущего файла в поис- тично, но для интернет-магазина обиженный клиент – наках файла .htaccess. стоящая трагедия. А если вы «додумались» задать для этих файлов сраApache позволяет очень легко решить эту проблему: зу несколько имён (с помощью директивы AccessFileName), просто создайте псевдоним для часто «ошибаемого» адто работы у Apache прибавится пропорционально числу воз- реса: можных вариантов. Никогда так не делайте, если в этом нет Alias /proect/ /usr/local/www/htdocs/project/ абсолютной необходимости. И даже если есть – всё равно Не забывайте только, что первым параметром указыване делайте. Примечание: если для какого-то каталога вам всё-та- ется путь от корня веб-сайта, а вторым – от корня файлоки нужен .htaccess-файл, разрешите его обработку только вой системы. Ещё один вариант решения задачи – создать для этого каталога – в секции <Directory>: символьную ссылку (см. также предыдущий совет, касающийся символьных ссылок). AllowOverride None Но Apache был бы не Apache, если бы не предложил ещё <Directory /specclient> AllowOverride All более элегантное решение – модуль mod_speling. (Одна «l» – </Directory> это не опечатка! Вопреки всем правилам английской грамматики название модуля пишется именно так). Здесь всё просто: убедитесь, что этот модуль подключается, и внесите небольшую корректировку в конфигурацию, добавив в секции, которые должны охватываться действием этого Внимательней относитесь к ссылкам Ещё один способ упростить жизнь серверу Apache – разрешить модуля, одну директиву: символьные ссылки директивой Options+FollowSymLinks. ДаCheckspelling on да, именно разрешить! Дело в том, что если они запрещеНа этот раз нужны обе буквы «l». Теперь Apache, поны, то при обработке каждого запроса Apache должен будет проверить каждый подкаталог в пути и сам файл на пред- лучив запрос несуществующего ресурса, самостоятельмет того, не является ли он символьной ссылкой. Если же но попытается найти среди имеющихся наиболее похожий ссылки разрешены, то веб-сервер будет просто открывать и вернёт его клиенту. Правда, проверяется расхождение запрошенный файл, не задумываясь о его природе. всего на один символ в элементе (под элементом здесь Естественно, нельзя забывать здесь об аспекте безо- понимается имя файла или имя любого каталога в пути пасности – если кто-то ещё, кроме вас, имеет право созда- к файлу; т.е. mod_speling сможет распознать ошибку типа вать файлы в корневом каталоге веб-сервера, то кто зна- nevs/totay/inex.html, но споткнётся на news/tudey/index.html), но в большинстве случаев это позволит отдать клиенту то, ет, какие ссылки там могут появиться? Нужно предостеречь, что попытка решить проблемы что он хочет. Даже если он и сам не до конца понимает, чебезопасности с помощью опции SymLinksIfOwnerMatch, го же хочет... которая позволяет Apache обрабатывать ссылку только Сергей Супрунов в том случае, если она принадлежит тому же пользователю, который является владельцем самого файла, добавит для Apache даже больше работы, чем при полностью запрещённых ссылках. Ведь мало того что придётся проверять, ссылка это или нет, так нужно будет ещё и владельцев контролировать! В общем, пользуйтесь этими возможностями с умом и осторожностью.

№9, сентябрь 2006

21


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

Обзор систем резервного копирования

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

22


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

С

амым распространенным способом сохранения информации в любой ситуации является ее дублирование. Резервная копия, сохраненная на другом источнике, стримере, жестком диске, DVD/CD, в случае выхода из строя основной системы позволит восстановить необходимое практически с нуля. Решение задачи построения систем резервного копирования и хранения данных зависит от инфраструктуры предприятия, ценности информации и требований к степени готовности такой системы. Поэтому, несмотря на кажущуюся простоту, выбрать необходимое решение удается не сразу. Схожие на первый взгляд проекты не сразу раскрывают все свои возможности, и, чтобы их выявить, иногда приходится устанавливать систему и пробовать ее в работе. Учитывая, что в каждой конкретной ситуации (сервер, небольшая сеть, гетерогенная сеть и пр.) необходимо персонально подходить к решению задачи копирования, решено было протестировать ряд проектов, результат в виде 17 систем различного назначения представлен в итоговой таблице. Системные требования участников тестирования существенно разнятся, так, если для работы сервера afbackup подойдет компьютер пятилетней давности, то для Time Navigator и Arkeia Network Backup они на порядок выше. К сожалению, объемы статьи не позволяют включить в итог все существующие решения. Но главная цель статьи – не показать победителя, а помочь сориентироваться при выборе и определиться с критериями.

AMANDA Проект AMANDA (Advanced Maryland Automatic Network Disk Archiver), начатый в 1998 году в департаменте компьютерных технологий университета Maryland США, постепенно утратил поддержку в родных стенах, и исходные тексты были перемещены на Sourceforge. В настоящее время разрабатывается многими добровольцами, и, хотя не заявлена лицензия GNU GPL, любой желающий может модифицировать код по своему усмотрению, рас-

№9, сентябрь 2006

пространять и продавать при условии, что авторство будет сохранено. AMANDA является надстройкой к стандартным программам dump/restore, GNU tar и многим другим. Построен по клиент-серверной схеме, причем клиент может быть установлен на одном компьютере с сервером либо клиенты могут быть установлены на всех компьютерах, которым требуется архивация. Для передачи информации используется свой протокол, работающий поверх UDP или TCP. Последние версии AMANDA могут взаимодействовать Рисунок 1. Менеджер управления Arkeia с компьютерами Windows посредством SAMBA, либо как вариант можно ис- поненты написаны на Java и доступны пользовать клиента, скомпилирован- для большого числа платформ. Локализованного интерфейса, к сожаленого под cygwin. Поддерживается шифрование ин- нию, нет. Клиент в принципе не привяформации как на клиенте, так и на сер- зан к конкретному серверу, можно развере, для этих целей используется не- вернуть несколько серверов и для ресимметричный GPG и симметричный зервирования выбрать любой из доamcrypt-алгоритм, хотя легко можно ступных, если администратор разредобавить и любой другой. Аналогично шил к нему доступ. Пользователи могут быть разможно настроить и сжатие данных. Если сжимать информацию на клиенте, делены на роли (ADMINISTRATOR, это уменьшит нагрузку на сеть, если OPERATOR, USER) со своими правана сервере, то снизит нагрузку на мало- ми в системе. Разработаны также дополнительмощную машину клиента. При наличии нескольких средств архивации на од- ные модули, позволяющие резервином сервере можно использовать не- ровать данные отдельных приложений без их остановки. сколько независимых конфигураций. В настоящее время доступны такие AMANDA оптимизирована для работы со стримерами, но никто не за- модули для Lotus, Open-Xchange, LDAP, MS Exchange, и баз данных Oracle, прещает использовать CD и DVD. Процессом резервирования можно mySQL, PostgreSQL, DB2, и MS SQL руководить как вручную, так и запус- Server. Стоит также отметить и функцию кать при помощи cron. Disaster Recovery, появившуюся в продуктах Arkeia начиная с версии 5.3.12. Arkeia Компания выпускает два продук- С ее помощью можно восстановить та – Arkeia Network Backup и Arkeia данные на компьютере под управлениSmart Backup. Первый предназначен ем Linux или Windows всего за нескольдля больших и средних сетей, второй – ко шагов, даже если исходный компьюдля небольших растущих сетей, отли- тер потерян или вышел из строя. Поддерживается протокол NDMP чаются ценой. Так, Smart Backup для пользователей Linux бесплатен и ог- версии 3, позволяющий управлять данраничен 50 Гб архивируемой инфор- ными на носителях. Его применение мации. Стоимость лицензии Network дает выигрыш по времени в операциях Backup может колебаться от 3 000 резервирования и восстановления. Возможно несколько вариантов до 15 000 у.е. Построен по клиент-серверной дублирования резервной информации: схеме. Имеются перекомпилирован- восстановление с переадресацией ные пакеты для большинства систем. данных, выполнение команд до и посДля управления процессом архиви- ле резервирования. Удобный планировщик календаррования используется Arkeia Manager, а на клиентских машинах устанавли- ного типа позволяет выполнить все неваются программы-клиенты. Эти ком- обходимые операции: полную, инкре-

23


администрирование Дополнительно хочется отметить наличие большого числа дополнительных программ и утилит, например, модуля к Webmin (http://sourceforge.net/ projects/afbackup-webmin) и скрипта remote-afbackup, позволяющего запускать операцию создания резервной копии удаленно.

Bacula

Рисунок 2. Bеб-интерфейс управления BackupPC

Чтобы знать, какие файлы уже были резервированы, клиент ведет специальный список, удаление которого приведет к тому, что повторно будет произведено полное резервирование. Аналогично, так как резервная копия привязана к имени узла, при его изменении будет создана полная копия. Для уменьшения нагрузки на сеть файлы сжимаются индивидуально на стоAfbackup Построен по клиент-серверной схеме. роне клиента. Сервер может работать в одном Сервер отвечает за работу с различными устройствами хранения инфор- из двух режимов: однопоточном, подмации, отслеживает их состояние, ко- ходящем для полного резервирования, личество. Все остальное лежит на кли- и многопоточном, для инкрементного. енте. Клиент знает, какие файлы, ката- В последнем случае для каждого сологи подлежат резервированию, на ка- единения открывается новый порт. Все используемые кассеты получакую кассету на стримере должна быть записана информация. ют специальную метку, к которой приНа стороне клиента задействуют- вязывается записанная информация, ся три утилиты. Утилита afclient отве- поэтому желательно эту метку нанесчает за связь с сервером и осущест- ти на коробку, чтобы не путать. Для равляет распаковку и упаковку файлов, боты с одним клиентом может быть наafrestore – за восстановление инфор- строено несколько серверов. Предусмации, а afclient выполняет контро- мотрено дублирование архива. Восстановлением информации молирующие и управляющие функции. Для последних двух утилит имеются жет руководить как пользователь, так и фронт-енды xafrestore и xclientconfig. централизованно администратор. ментную, дифференциальную копии, восстановление и прочее. Общее впечатление портит только передача логина/пароля в открытом виде, что при возможностях Arkeia может привести к утечке информации, ведь восстановить файл можно в произвольное место в сети.

24

Модульная архитектура этого мощного средства для создания, управления и восстановления информации позволяет использовать его как в малых, так и больших сетях. Работает по клиент-серверной схеме. Относительно прост в настройках и обладает большим количеством продвинутых возможностей, позволяющих с легкостью находить и восстанавливать утраченные или поврежденные файлы. Возможно, указать индивидуальные параметры для различных типов файлов. Например, текстовые сжимать, а архивы, исполняемые файлы передавать без сжатия. Центральным элементом Bacula является Director, который отвечает за хранение и запуск заданий, ведение журнала. Для хранения журналов архивных копий используется база данных. В настоящее время поддерживаются PostgreSQL, MySQL или SQLite, хотя, если нет проблем с лицензированием, можно использовать еще около 10 других СУБД. На компьютерах клиентов устанавливается File Daemon, который собирает данные для архивирования. Управление осуществляется посредством Bacula Console. Последние два компонента существуют для различных платформ, что позволяет без проблем использовать Bacula в гетерогенных сетях. Также стоит отметить весьма удачный планировщик и систему приоритета выполнения заданий.

BackupPC Высокопроизводительное решение уровня предприятия, позволяющее резервировать данные компьютеров, работающих под управлением UNIX/ Linux, MacOS X и Windows разных версий. Прост в настройке и поддержке. Не требует клиентского ПО. Для резервирования данных Windows-систем, используется про-


администрирование токол smb (или rsync работающий через cygwin), UNIX и Linux – rsync или tar (над ssh/rsh/nfs). Для экономии ресурсов одинаковые файлы с одного и даже нескольких компьютеров загружаются только один раз, затем для привязки к конкретной системе используются жесткие ссылки, если на одной из систем такой файл изменился, то он будет перезаписан. Для управления процессом резервирования и восстановления информации, просмотра журналов и файлов в архиве, настройки, используется вебинтерфейс (т.е. придется ставить еще и веб-сервер), который, к сожалению не локализован. Выбранный для восстановления файл может быть скопирован на любой ресурс. Следует также отметить поддержку резервирования систем, подключающихся к сети периодически без постоянного IP-адреса и работающих через медленные каналы. Резервирования можно настроить как персонально, так и указать параметры, зависящие от операционной системы клиента. Определить различные задачи для полных и инкрементных копий. Если информация с компьютера некоторое время не резервировалась, то пользователю будет послано предупреждение посредством электронной почты. Работает с архивами, созданными AMANDA (т.е. практически может служить к нему интерфейсом).

Backup Manager 0.7.4 Представляет собой инструмент, упрощающий процесс создания резервных копий, как полных, так и инкрементных. Для восстановления информации Backup Manager не используется. Но зато с его помощью очень просто организовать копирование локальных каталогов, баз данных MySQL и SVN-репозитариев в архивы нескольких видов, на CD/DVD-диски, а также на удаленные ресурсы. В качестве протоколов последних поддерживаются FTP, SSH, RSYNC и Amazon S3 (Simple Storage Service, http://aws.amazon.com). Кроме того, есть возможность выполнения pre и post-скриптов, что позволяет, например, автоматически монтировать и размонтировать SMB, NFSресурсы.

№9, сентябрь 2006

Для верификации записанной информации используется MD5, опционально архив можно зашифровать с помощью GnuPG.

Backupninja Большинство свободных скриптов и программ предназначенных для создания резервных копий имеют неудобный файл конфигурации или Рисунок 3. Мультиплатформенный интерфейс к Box Backup - Boxi вообще обходятся без такового. Целью проекта backupninja как раз и яв- клиента bbackupd, задача которого ляется повышение удобства при ис- контролировать изменения и загрупользовании таких программ, путем жать их на сервер и bbackupquery, инссоздания набора конфигурационных трумента, предназначенного для софайлов расположенных в etc/backup.d/, здания запросов и восстановления имеющих единую, простую и понят- информации. Особое внимание уделено вопную структуру. И попутно объединение возможностей нескольких про- росам безопасности данных. Так, сограмм. Псевдографическая консоль единение между клиентом и сервеninjahelper упрощает создание конфи- ром по умолчанию происходит по загурационных файлов и кроме того вы- шифрованному каналу, для генериродает подсказки по проведению некото- вания и управления ключей, необходимых при аутентификации, в комплекте рых операций. Поддерживается создание копий имеются скрипты. Кроме того, резерс удаленных ресурсов (посредством вируемые файлы на клиенте шифруrdiff-backup), создание зашифрован- ются при помощи AES, а метаданные ных GnuPG-образов (duplicity), резер- Blowfish. Поэтому даже если сервер вирование Linux-Vserver, баз данных компрометирован, данные все равно MySQL и РostgreSQL, содержимого остаются в безопасности. РезервироOpenLDAP, SVN-репозитариев, выда- вание происходит в режиме «snapshot». ча информации по системе и аппарат- После первого копирования в дальнейному составу. Информация по работе шем для обновления резервной копии может отправляться на указанный поч- используется rsync, поэтому в дальнейшем трафик может быть относительно товый адрес. небольшой. Старые версии не заменяются новыми, а удаляются только когда Box Backup Система резервирования Box Backup остется мало свободного места. По умолчанию в комплекте идут принадлежит к так называемым on-line. Разработчики считают, что в некото- только утилиты командной строки, рых случаях дешевле вместо одно- но отдельно разработан графический го весьма дорогого стримера приоб- клиент Boxi (http://boxi.sourceforge.net), рести обычный сервер с нескольки- использующий мультиплатформенную ми дисками. У такой системы есть од- библиотеку wxWidgets. С его помощью но, но очень ценное достоинство: все довольно просто настроить опции коданные пользователю доступны по пирования и восстановления файлов. первому требованию, ведь все хранится на сервере, и нет необходимос- BRU Server ти в смене кассет. Построен по клиент- Простая в установке и использовасерверной схеме. И состоит из трех нии система, подходящая для создаэлементов: сервера bbstored, бэкап- ния резервных копий индивидуальным

25


администрирование Свободная характеристика систем резервного копирования Название

AMANDA

Версия

Сайт

Лицензия

Платформы

Работа по расписанию

http://www.amanda.org, http://sourceforge.net/projects/amanda

Cвободная

Solaris, OpenBSD, FreeBSD, Ultrix, HP/UX, IRIX, Linux, Digital UNIX, SCO, AIX, Mac OS X, возможна работа в Windows посредством cygwin

2.5.1b1

cron

Arkeia

5.3.12

http://www.arkeia.com

Сервер – Linux, Solaris, SGI, AIX, HP-UX, SCO, Tru64, Irix. Клиенты – дополнительно Коммерческая Windows 2000/XP/2003, Windows 95/98, Novell, VMS, ICL, MacOSX, Open/Net/FreeBSD

Afbackup

3.4

http://sourceforge.net/projects/afbackup

GNU GPL

Сервер – Linux, AIX, IRIX, FreeBSD, Digital Unix (OSF1), Solaris и HP-UX. Клиенты протестированы на SunOS и OpenBSD

Cron на клиенте или дистанционно с сервера

Backupninja

0.9.3

http://dev.riseup.net/backupninja

GNU GPL

POSIX-системы, Linux

cron

Bacula

1.38.11

http://www.bacula.org, http://sourceforge.net/projects/bacula

GNU GPL

Сервер и клиент – Solaris, Linux, FreeBSD, Tru64, MacOS X. Есть клиенты и консоль для Windows (NT, 2000, XP, 2003, 98/Me), OpenBSD, Irix

Внутренний планировщик

BackupPC

3.0.0beta

http://backuppc.sourceforge.net

GNU GPL

Сервер *BSD, Linux, Solaris, MacOS X. Архивирование плюс Windows (NT, 2000, XP, 2003, 98/Me)

Внутренний планировщик

Backup Manager

0.7.4

http://www.backup-manager.org

GNU GPL

GNU/Linux

cron

Box Backup

0.10

http://www.fluffy.co.uk/boxbackup

BSD

Open/Net/FreeBSD,Linux, Solaris. Плюс клиент Windows/cygwin

Внутренний планировщик или cron

BRU Server

1.2.0

http://www.tolisgroup.com

Коммерческая

Сервер Linux, MacOS X, Solaris, IRIX. Клиенты – плюс Free/OpenBSD, SCO OpenServer/UnixWare, AIX, UnixWare и все Windows от 98 до 2003

Внутренний планировщик

Duplicity

0.4.2

http://www.nongnu.org/duplicity

GNU GPL

Linux и другие POSIX-системы

cron

DIBS

0.9.2

http://web.mit.edu/~emin/www/ source_code/dibs/index.html, http://dibs.sourceforge.net

GNU GPL

Linux и другие POSIX-системы, Windows

Команда auto_check, сохраняющая данные в определенных каталогах

rdiff-backup

1.0.4

http://www.nongnu.org/rdiff-backup

GNU GPL

POSIX-системы, Linux или Mac OS X, есть материал по использованию на Windows

сron

Внутренний планировщик

Time Navigator

4.0

http://www.atempo.com

Сервер, устройства хранения и клиенты доступны практически для всех весрий UNIX, Коммерческая Linux, MAC OS и Windows. Есть модули для Oracle, Microsoft Exchange/SQL/Sharepoint, Lotus, Sybase, Informix, DB2, SAP

synbak

1.0.6

http://www.initzero.it/portal/en/ products/opensource/synbak/overview

GNU GPL

Официально поддерживаются только GNU/Linux Red Hat и Fedora Core, но возможна работа и с другими UNIX/Linux системами, использующими UTF-8

сron

Mondo Rescue

2.09

http://www.mondorescue.org

GNU GPL

Linux

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

Hdup2

2.0.14

http://miek.nl/projects/hdup2/hdup.html

GNU GPL

Linux и другие POSIX-системы

cron

Hydra

0.3.1

http://www.cprogrammer.org/trac/hydra

GNU GPL

UNIX-подобные

Внутренний планировщик

26

Внутренний планировщик


администрирование Аутентификация

Защищенность копии

Защищенное соединение

Стратегия архивирования

Компрессия данных

Стратегия восстановления

Kerberos 4/5, OpenSSH, rsh, пароль

Клиент/сервер, amcrypt/GPG. Возможно добавление другого алгоритма

OpenSSL

Полное Инкрементное Выборочное

Клиент/сервер

Полное/выборочное/ другая система

Логин/пароль (передается в открытом виде)

Клиент

Нет, данные шифруются перед передачей

Полное Инкрементное Дифференциальное Выборочное

Есть

Полное/выборочное/ другая система/ клонирование

DES OpenSSL (128 бит)

Клиент, MD5-сигнатура файла

OpenSSL

Полное Инкрементное Выборочное Сохранение «сырых» разделов

На стороне клиента

Полное/выборочное/ другая система/ клонирование

Пароль, OpenSSH, rsh

GnuPG (с помощью duplicity)

OpenSSH или rsh

Полное Инкрементное Выборочное

gzip

Полное/выборочное/ другая система

Пароль CRAM-MD5, ключи OpenSSH, OpenSSL

Нет, только SHA1 или MD5-сигнатура файла

Возможно соединение через SSH-тунель или OpenSSL

Полное Инкрементное Дифференциальное Выборочное

Клиент gzip

Полное/выборочное/ другая система

Пароль, OpenSSH, rsh

Нет, MD5 сигнатура используется только для быстрого поиска

OpenSSH или rsh

Полное Инкрементное Частичное Выборочное

Сервер gzip/bzip2

Полное/выборочное/ другая система

Пароль, OpenSSH, rsh

GnuPG (только архивов tar, tar.gz, tar.bz2)

OpenSSH или rsh

Полное Инкрементное Выборочное

gzip/bzip2/zip

Только резервирование

Сертификаты OpenSSL

Клиент – AES для данных и Blowfish для метаданных

TLS/SSL

Полное Инкрементное Выборочное

Средствами OpenSSL

Полное/выборочное/ другая система

Клиент

Данные шифруются перед передачей

Полное Инкрементное Дифференциальное Выборочное Сохранение «сырых» разделов

Есть

Полное/выборочное/ другая система/ клонирование

Пароль, ssh, ftp

GnuPG

OpenSSH, данные шифруются перед передачей

Полное Инкрементное Выборочное Не поддерживает жестких ссылок

gzip

Полное/выборочное

GPG-ключ

GnuPG

Нет, данные шифруются перед передачей

Полное Инкрементное

Нет

Полное/выборочное

Пароль, OpenSSH

Нет

OpenSSH

Полное Инкрементное Выборочное

Сервер, возможности ssh и опционально gzip

Полное/выборочное/ другая система

Пароль, Active Directory

Клиент, кроме того информация подписывается хэшем

Есть, кроме того данные шифруются перед передачей

Полное Инкрементное Выборочное

Есть

Полное/выборочное/ другая система

Пароль

Нет

OpenSSH

Полное Инкрементное Выборочное

gzip/bzip2

Полное/выборочное/ другая система

Локальный пользователь

Нет

Нет

Полное Сохранение «сырых» разделов

gzip/bzip2

Полное/выборочное/ другая система/ клонирование

Пароль

mcrypt или GnuPG

Данные шифруются перед передачей

Полное Инкрементное Выборочное

gzip/bzip2/lzop

Полное/выборочное/ другая система

Пароль

Нет

Нет

Полное Только каталоги

bzip

Полное/выборочное/ другая система

Пароль, возможна работа через ssh

№9, сентябрь 2006

27


администрирование пользователям и предприятиям, с до- зы данных. Кроме BRU Server TOLIS вольно гибкой лицензией (например, Group представляет еще целый ряд дополнительные серверы рассматри- продуктов предназначенных для реваются как клиенты). Работает по кли- зервирования информации. ент-серверной схеме и включает три составляющих: сервер, клиент и кон- Duplicity соль управления. Систему отличает Несмотря на небольшой размер, возможность проверки правильнос- duplicity является довольно мощной ти записанных данных на ленту дан- системой резервного копирования инных без связи с клиентом. Данные мо- формации. Его использование позвогут быть записаны напрямую на стри- ляет резервировать информацию с ломер, либо использовано промежуточ- кальной системы, хотя его легко можное хранение на диске. Последнее поз- но заставить получать информацию воляет затем более компактно распо- с удаленных систем по ssh. Представложить на одном носителе информа- ляет собой набор скриптов, написанцию с одного компьютера, параллель- ных на языке Python. Данные могут но резервировать данные с нескольких быть сохранены как в другом разделе, клиентов, при наличии одного стри- так и на удаленную систему. Поддемера и проверять правильность запи- рживаются ftp-серверы, ssh/scp, rsync. Использование librsync позволяет коси на ленту. Также стоит отметить возможность пировать только изменившиеся данвосстановления части информации ные. Для работы требует наличия rdiffпри ошибках считывания с ленты или backup о котором пойдет речь ниже. диска. Информация может быть вос- По умолчанию вся информация шифстановлена не только в целевую, но руется с помощью GnuPG. и в другую систему или каталог. Фирменная технология QFA (Quick File DIBS Access) позволяет быстро получить Distributed Internet Backup System – доступ к данным на ленте. Управле- весьма интересная система, написанние может осуществляться не только ная на Python, «выпадает» из общего через графическую консоль, но есть плана. Суть ее работы состоит в том, и командная строка, поддерживаю- что создается сеть участников, котощая скрипты. рые обмениваются между собой данВозможно выполнение на клиен- ными, то есть работает такая сеть нате pre и post-скриптов, позволяющая, подобие Р2Р вроде Napster, Gnutella, например, заморозить состояние ба- Kazaa. Вся информация перед передачей шифруется с помощью GnuGPG, поэтому пользователь на другом компьютере не сможет при всем своем желании ее прочесть. По с ет и п е р е д а ются только изменившиеся файлы. Для повышения надежности используется код РидаСоломона. Система DIBS очень проста в установке и настройке. После первоначальной настройки демон, работающий на системах, через определенное время проРисунок 4. Один из веб-интерфейсов к rdiff-backup

28

веряет данные в каталоге ~/.dibs/ autoBackup, и если будут изменившиеся файлы, то они будут скопированы на удаленный компьютер. Все каталоги, информацию в которых необходимо резервировать, должны содержать здесь символические ссылки. Для поиска подходящих для хранения резервных копий систем используется специальный сервис. При настройке своего сервиса может указываться дисковая квота, при превышении которой прием файлов прекращается. Сервис может быть настроен в активном и пассивном режиме, который используется в том случае, когда компьютер находится за межсетевым экраном.

rdiff-backup Весьма популярная разработка Стенфордского университета, относительно недавно изменившая прописку. За 5 лет было выпущено более 60 релизов. Представляет собой скрипт, написанный на Python. Позволяет производить резервное копирование одного каталога в другой. Конечный каталог содержит копию исходного каталога, плюс в отдельном каталоге хранятся все описания различий копий в diffформате, поэтому возможно восстановление давно утерянных файлов и их версий. Невероятно прост в использовании. Возможно совместное использование с SSH, позволяющее производить безопасное копирование. Функциональность и удобство rdiffbackup могут добавить интерфейсы, разработанные под него. Так, в настоящее время известны веб-интерфейсы rdiffWeb (http://www.rdiffweb.org), написанный на Python, и rdiff-backup-web (http://rdiffbackupweb.sourceforge.net), предс тавляющий собой скрипты на PHP. Последний хотя и находится в состоянии альфы, но его уже можно рекомендовать к применению. И разработанный в рамках Google Summer of Code 2005 pyBackPack (http://projects. sucs.org/projects/pybackpack), использующий GTK+ библиотеки. К сожалению, ни один из них не локализован.

Synbak Основную цель, которую пытались достичь разработчики этого проекта, – объединение нескольких методов со-


администрирование здания резервных копий. Как и боль- тов, то он имеет специальную струкшинство проектов synbak является туру Security and Compliance Manager удобным интерфейсом для существу- (SCM), управляющую ключами и серющих программ. Используется простой тификатами. Вся информация разбии понятный файл конфигурации. Под- та на классы, к которым используютдерживается создание резервных ко- ся разные правила защиты, это позвопий, в том числе и с удаленных ресур- ляет более гибко использовать ресурсов с использованием rsync (ssh, rsync, сы без ущерба безопасности. Для конSMB/CIFS), баз данных MySQL и Oracle, троля безопасности ведутся журнакаталогов LDAP, на архивы tar (tar, tar. лы аудита, в которых заносится вся gz и tar.bz2), стримеры и CDR/CD-RW/ информация о деятельности польDVR/DVD-RW. Ресурсы cifs/smb при не- зователя. Система генерации отчеобходимости могут быть монтированы тов ReporterTM, собирающая данные и размонтированы автоматически. Ло- со всех ресурсов, позволит получить кальные базы MySQL могут быть со- практически всю необходимую при адхранены в разных архивах, удаленные министрировании информацию, опретолько в одном архиве. Любой удален- делить слабые места и выработать опный ресурс может быть указан в стан- тимальную стратегию резервного кодарте URI, то есть протокол://пользо- пирования. ватель:пароль@узел/рeсурс. Система отчетов также стоит внимания, подде- Mondo Rescue рживается вывод на консоль, отправ- Представляет собой набор утилит, уска электронной почты, RSS-сообще- танавливающихся в систему, либо заний, а также генерация html-файла. гружаемых с CD. Он предназначен для При этом synbak имеет модульную ар- создания резервной копии любой лохитектуру, позволяющую легко адапти- кальной области системы и записи их ровать для любой другой задачи, до- затем на CD/DVD, стример, жесткий бавлен как новый метод резервирова- диск или NFS-сетевой ресурс. В слуния, так и любые формы отчетов. чае краха можно будет очень легко восстановить, и в том числе и с нуля, не только сохраненную информаTime Navigator Очень мощная, легко расширяемая цию, но и систему. Поэтому Mondo мокоммерческая разработка компании жет пригодиться не только в аварийAtempo, предназначенная в первую ных случаях, но и при переразбиении очередь для больших предприятий, ра- дискового пространства или, наприботающих в гетерогенной среде. Адми- мер, при переходе на RAID. Также этот пакет весьма удобен для нистрация упрощена благодаря продуманному унифицированному интер- клонирования системы на несколько фейсу, позволяющему без проблем компьютеров с одинаковой конфигурауправлять несколькими серверами. цией. Для создания ежедневных резерПри этом хранение информации про- вных копий он не удобен. Mondo Rescue зрачно для пользователя, хотя копии поддерживает почти все файловые различного назначения могут хранить- системы, о которых знает ядро Linux ся на разных ресурсах с разным време- ext2/3, JFS, XFS, ReiserFS, VFAT, а такнем доступа (месяц – стример, день – же LVM и RAID. Возможность клониродиск и пр.). Поддерживается работа вания позволяет использовать Mondo с протоколом NDMP. Rescue и для резервирования не-Linux Применение Virtual Library System файловых систем, например NTFS. (VLS) позволяет эмулировать стример В работе помогает понятная cursesна жестком диске. Вся информация пе- консоль, позволяющая руководить ред передачей шифруется, кроме то- процессом сохранения и восстановго, возможно создание защищенных ления информации. Кстати, Mondo туннелей, для проверки оригиналь- Rescue используют такие компании, ности создается хеш. После передачи как Siemens, HP, IBM, NASA. на сервер данные повторно проверяются путем сравнения хэшей, вырабо- Hydra Backup System танных клиентом и сервером. Так как Клиент-серверная система, в которой Time Navigator предназначен для ра- клиент используется администратоботы с большим количеством клиен- ром для настройки параметров ре-

№9, сентябрь 2006

зервирования. Всю работу выполняет сервер, результат сохраняется в каталог ftp-сервера. К сожалению, Hydra умеет создавать только полные копии и только локальных каталогов, если нужны инкрементные и дифференциальные, то этот проект не для вас. Каталоги можно копировать ежедневно, еженедельно или ежемесячно. Файл конфигурации не используется, вместо этого все введенные администратором параметры сохраняются в файл /var/lib/hydra/targets_dump. В комплекте с системой поставляется как клиент командной строки, позволяющий управлять процессом удаленно, так и графический PyQT-клиент. Клиенты могут использоваться для администрирования процессов резервного копирования на любом сервере Hydra в сети, для доступа используется пароль, хеш которого сохраняется в ~/.hydra, позволяя в последующем не вводить его при подключении к серверу.

Hdup2 Небольшая по размеру, простая в настройках, но в то же время довольно мощная утилита резервного копирования. Поддерживаются все присущие большинству подобных утилит возможности: include/exclude список, резервирования с удаленных источников, шифрование архива. Кроме того, возможно разбиение резервной копии на файлы установленного размера, для того чтобы записать их затем на CD/DVD-диск, отдельные подкаталоги можно исключить при помощи .nobackup-файлов. Как видите, выбирать есть из чего, и я надеюсь, статья поможет вам в этом. Успехов. 1. Яремчук С. Cпасем пингвина: Mindi Linux и Mondo Rescue.//«Системный администратор», № 2, 2004 г. – С. 14-17. 2. Маркелов А. Linux на страже Windows. Обзор и установка системы резервного копирования BackupPC.//«Системный администратор», № 9, 2004 г. – С. 2-7. 3. Гринько А. Архивируем данные с помощью Bacula.//«Системный администратор», № 4, 2005 г. – С. 42-47. 4. Коршунов А. Box Backup – горячие резервные копии.//«Системный администратор», № 5, 2006 г. – С. 6-11.

29


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

Упаковщики исполняемых файлов в Linux/BSD

Крис Касперски Большинство UNIX-программ распространяются в исходных текстах, но количество коммерческих продуктов с закрытым кодом неуклонно растет. Зачастую они распространяются в упакованном виде, что не только препятствует анализу, но снижает производительность и ухудшает совместимость с UNIX-клонами. Покажем на примере ELFCrypt, UPX, Burneye и Shiva, как можно освободиться от упаковщиков.

В

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

30

ках уже есть (и многие коммерческие и погубило. На всех Linux/BSD-сисфирмы хотели бы выпустить закрытые темах, до которых я только смог допорты своих продуктов под UNIX, ос- тянуться, Shiva падает с сообщением новательно их защитив), но рынок про- «Segmentation fault». Какое же это счастекторов еще не успел сформировать- тье Windows-программистам иметь одся, а потому разработкой упаковщиков ну, ну пусть две (с учетом 9x) ОС, пракзанимается от силы десяток энтузиас- тически полностью совместимые межтов, повторяющих трюки времен ран- ду собой даже на уровне недокументиней молодости MS-DOS, и только Shiva рованных возможностей! попытался предпринять качественный Создание надежной защиты, запусрывок вперед, вплотную приблизив- кающейся более чем на одной версии шись к протектору Software Passport Linux, – практически безнадежное де(бывший Armadillo), однако, это его ло, а если вспомнить про BSD и экс-


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

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

полностью утратила смысл и стала только вредить (она хорошо работала в эпоху господства MS-DOS, но те времена давно прошли). Теперь упаковывать (а точнее, зашифровывать) файл стоит только ради того, чтобы затруднить его анализ, да и то… стоит ли? Хакеры все равно взломают (ни один из существующих протекторов не избежал этой участи), а вот у легальных пользователей снижается производительность и появляются проблемы совместимости, тем более, что будущее все равно за открытым программным обеспечением. Как показывает практика, по мере взросления любая отрасль неизбежно приходит к открытым стандартам – взять хотя бы автомобилестроение или электронику. Лет тридцать назад японцы (в то время лидеры в этой области) закладывали в свои радиоприемники/магнитофоны ампулы с кислотой, чтобы при вскрытии корпуса все разъедало. Чуть позже для этой же цели стали применять эпоксидную смолу, а сейчас… принципиальные схемы раздаются всем сервисным центрам или отдаются под чисто формальное соглашение о неразглашении.

Достаточно просто установить точку сразу же за конпериментальные ядра типа Hurd, то к программированию можно даже не приступать. В то же время, слабость защит- цом расшифровщика (в данном случае она расположена по ных механизмов компенсируется отсутствием достойного адресу 80495F9h), после чего в нашем распоряжении окахакерского инструментария, поэтому даже простейшая за- жется расшифрованный elf, с которого можно снять дамп. щита представляет собой большую проблему, превращая В случае с gdb последовательность команд будет выгляраспаковку программ в довольно нетривиальную задачу! деть приблизительно так (см. листинг 2). Но мы ее решим! Начиная с самых простых упаковщиков Кстати говоря, последние версии IDA Pro, портировани приобретая в сражении тактические навыки и необходи- ные под Linux, содержат интерактивный отладчик в стиле мый инструментарий, в конечном счете, мы сможем сра- Turbo-Debugger, работающий через prtace() и позволяющий делать такие вещи прямо в дизассемблере! Но специально зиться с кем угодно! на этот случай JunkCode подложил хакерам большую свинью, сбивающую IDA Pro с толку. ELF-Crypt Изменив точку входа в elf-файл (entrypoint) путем переПростейший шифровщик (не упаковщик!) elf-файлов, созданный индийским студентом по прозвищу JunkCode направления ее на тело своего расшифровщика, он «забыл» (junkcode@yahoo.com) и распространяющийся в исходных тек- скорректировать символьную метку _start, продолжающую стах: http://www.infogreg.com/ Листинг 1. Дизассемблерный листинг расшифровщика, внедряемого ELFCrypt в файл source-code/public-domain/ (как он выглядит в hiew) elfcrypt-v1.0.html. :entrypoint Он шифрует кодовую .080495DC: EB02 jmps .0080495E0 ; переходим на расшифровщик секцию (которой, как пра.080495DE: 06 push es ; \ мусор, оставленный... .080495DF: C6 ??? ; / ...транслятором ассемблера вило, является секция .text) .080495E0: 60 pushad ; сохраняем все регистры в стеке и встраивает в elf-файл кро.080495E1: 9C pushfd ; сохраняем флаги в стеке .080495E2: BEC0820408 mov esi, 0080482C0 ; начало расшифровываемого фрагмента хотный расшифровщик, .080495E7: 8BFE mov edi, esi ; EDI := EDI (расшифровка на месте) возвращающий ее в ис.080495E9: B978000000 mov ecx, 000000078 ; количество двойных слов для расшифровки .080495EE: BBBD03CC09 mov ebx, 009CC03BD ; ключ расшифровки ходный вид. Не содержит .080495F3: AD lodsd ; читаем очередной двойное слово <-----+ никаких антиотладочных .080495F4: 33C3 xor eax,ebx ; расшифровываем через xor | .080495F6: AB stosd ; записываем результат на место | приемов и замечательно .080495F7: E2FA loop .0080495F3 ; мотаем цикл -------------------------+ распаковывается любым .080495F9: 9D popfd ; восстанавливаем флаги из стека .080495FA: 61 popad ; восстанавливаем все регистры отладчиком, в том числе .080495FB: BDC0820408 mov ebp, 0080482C0 ; адрес оригинальной точки входа (OEP) и gdb/ald (см. листинг 1). .08049600: FFE5 jmp ebp ; передаем управление расшифрован. коду

№9, сентябрь 2006

31


администрирование Листинг 2. Быстрая расшифровка elf-файла в отладчике gdb ; определяем точку входа в файл root@5[elf_crypt]#objdump -f elfcrypt-demo elfcrypt-demo: формат файла elf32-i386 архитектура: i386, флаги 0x00000112: EXEC_P, HAS_SYMS, D_PAGED начальный адрес 0x080495dc

root@5[elf_crypt]# gdb elfcrypt-demo ; ставим точку останова на точку входа (gdb) b *0x80495DC Breakpoint 1 at 0x80495dc

; пускаем программу (gdb) r Starting program: /home/elf_crypt/elfcrypt-demo

; сработала точка останова Breakpoint 1, 0x080495dc in ?? ()

; говорим отображать команды Ассемблера (gdb) display/i $pc

1: x/i $pc 0x80495dc: jmp 0x80495e0

; начинаем трассировать программу (gdb) si 0x080495e0 in ?? ()

; продолжаем трассировать 1: x/i $pc 0x80495e0: pusha ... 0x080495f7 in ?? ()

; видим цикл 1: x/i $pc 0x80495f7: loop

0x80495f3

; ставим точку останова за его концом (gdb) b *0x80495F9 Breakpoint 2 at 0x80495f9

; запускаем программу «вживую» (gdb) c Continuing.

; точка останова достигнута Breakpoint 2, 0x080495f9 in ?? ()

; программа расшифрована! 1: x/i $pc 0x80495f9: popf

Рисунок 1. Домашняя страница создания JunkCode – создателя шифровщика ELFCrypt

32

указывать на оригинальную точку входа (в настоящий момент зашифрованную!), в результате чего IDA Pro показывает нечто совершенно бессмысленное: Листинг 3. Нет, это не хитрый антиотладочный код, это просто оригинальная точка входа в программу, еще не расшифрованная расшифровщиком .text:080482C0 _start .text:080482C0 8C EE .text:080482C2 92 .text:080482C3 80 5C 80 28 F9 [eax+eax*4+28h], 0F9h .text:080482C8 ED .text:080482C9 57 .text:080482CA 9E .text:080482CB 61 .text:080482CC AD .text:080482CD 87 C8 .text:080482CF 01 D5 .text:080482D1 B3 4F .text:080482D3 0D B5 52 9A 61 .text:080482D8 2D 80 C8 01 55 ; Trap to Debugger .text:080482DD CC .text:080482DE 33 F6 .text:080482E0 42 .text:080482E1 F7 5C 99 E8 [ecx+ebx*4-18h] .text:080482E1 _start endp

proc near mov esi, gs xchg eax, edx sbb byte ptr ↵ in push sahf popa lodsd xchg add mov or sub

eax, dx edi

int xor inc neg

3 esi, esi edx dword ptr ↵

ecx, eax ebp, edx bl, 4Fh eax, 619A52B5h eax, 5501C880h

Кстати говоря, если установить точку останова на _start и дать отладчику немного поработать, мы попадем в самое начало расшифрованной программы, после чего ее будет можно анализировать в обычным режиме или снять дамп. Только это должна быть именно аппаратная (команда «hbreak _start» в gdb), а не программная («b _start») точка останова, иначе все рухнет (программная точка внедряет в расшифровываемую программу код CCh, который после расшифровки превращается совсем не в то, что было до нее). Это очевидный просчет создателя шифратора. Вот если бы он перенаправил _start в какое-нибудь интересное место, вот тогда бы хакерам пришлось попыхтеть, а так… «защита» снимается в считанные секунды безо всякого труда, однако представляет интерес посмотреть, как выглядит код расшифровщика в IDA Pro, точка входа в который, как мы помним, равна 80495DCh: Листинг 4. Дизассемблерный листинг расшифровщика, внедряемого ELFCrypt в файл (как он выглядит в IDA Pro) extern:80495DC 7F 01 00 00 extrn puts@@GLIBC_2_0:near extern:80495E0 FA 00 00 00 extrn ↵ __libc_start_main@@GLIBC_2_0:near ; CODE XREF: .plt:_puts↑j extern:80495E4 7F 01 00 00 extrn puts:near ; DATA XREF: .got:off_80495CC↑o extern:80495E4 extern:80495E8 FA 00 00 00 extrn ↵ __libc_start_main:near ; CODE XREF: ___libc_start_main↑j extern:80495E8 ; DATA XREF: .got:off_80495D0↑o extern:80495E8 ; weak extern:80495EC 00 extrn _Jv_RegisterClasses ; weak extern:80495F0 00 extrn __gmon_start__ ; DATA XREF: .got:080495D4↑o extern:80495F0

Что за чертовщина?! Каким образом расшифровщик может существовать в extern, когда здесь прямым текстом прописаны фактические адреса динамически загружаемых


администрирование функций! Но тот факт, что файл все-таки работает, убеждает нас, что да – может! Просто IDA Pro в попытке «эмуляции» загрузки elf-файла помещает в extern то, чего там на стадии загрузки файла еще нет. Здесь мы подходим к одной из самых любопытных особенностей строения elf-файлов. В отличие от Windows, где заполнение extern происходит на стадии загрузки файла в память, в UNIX это делает стартовый код, причем делает он это очень хитрым способом. Ниже показан протокол трассировки программы под отладчиком с моими комментариями, отмеченными знаком «;» и содержимым дизассемблерного листинга IDA Pro, отмеченным знаком «#». Как говорится – сравните и почувствуйте разницу! Для облегчения понимания возьмем незашифрованную программу, необработанную ELFCrypt: Листинг 5. Протокол отладки, иллюстрирующий ход динамической загрузки ; устанавливаем точку останова на начало стартового кода (gdb) b _start Breakpoint 1 at 0x80482c0: file ../sysdeps/i386/elf/start.S, line 47.

; запускаем программу на выполнение (gdb) r Breakpoint 1, _start () at ../sysdeps/i386/elf/start.S:47

; ок, мы в точке входа. Смотрим на extern (gdb) x 0x80495DC # extern:80495DC 0x80495dc:

7F 01 00 00 0x00000000

extern puts@@GLIBC_2_0:near

; IDA Pro нас уверяет, что extern содержит адрес 0000017Fh, ; но в действительности область extern на момент запуска ; файла девственно чиста и забита нулями #.text:080482C0 #.text:080482C0 31 ED 1: x/i $pc 0x80482c0 <_start>:

_start xor xor

proc near ebp, ebp %ebp,%ebp

; незначащие машинные инструкции пропущены #.text:080482D7 68 90 1: x/i $pc 0x80482d7 #.text:080482DC E8 CF 1: x/i $pc 0x80482dc

; ; ; ; ;

83 04 08 <_start+23>: FF FF FF <_start+28>:

push push call call

offset main $0x8048390 ___libc_start_main 0x80482b0 <_init+56>

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

#.plt:080482B0 ___libc_start_main #.plt:080482B0 FF 25 D0 95 04 08 1: x/i $pc 0x80482b0 <_init+56>:

; ; ; ; ; ; ; ; ; ;

ничего! Отладчик же показывает код, засылающий в стек смещение первого (считая от нуля) элемента таблицы .got и передающего управление по адресу, записанному во втором элементе таблицы .got. Как следует из спецификации elf-формата, первые три элемента секции .got зарезервированы для служебных целей и вторая из них хранит адрес функции _dl_map_object_deps, которая, получив в качестве аргумента адрес начала .got, читает его содержимое (а содержатся там ссылки на библиотечные функции) и заполняет extern фактическими адресами

0x4000bbd0 in _dl_map_object_deps () from /lib/ld-linux.so.2 1: x/i $pc 0x4000bbd0 <_dl_map_object_deps+4384>: push %eax

; ; ; ; ; ; ; ;

ага! Вот эта функция, расположенная на моей машине по адресу 4000BBD0h, принадлежащему библиотеке libc.so.6 (на других машинах этот адрес может быть иным) она-то и выполняет всю работу по инициализации extern, в котором находится наш расшифровщик, уже расшифровавший программу, а затем вызывает __libc_start_main, так что загрузка динамической библиотеки происходит совершенно прозрачно

Вот такая, оказывается, она IDA Pro! Чтобы скрыть код от глаз исследователя, достаточно разместить его в extern. Для вирусов, червей и прочего malware это очень даже актуально (особенно в свете того факта, что IDA Pro уже давно стала дизассемблером де-факто). На самом деле, IDA Pro (а точнее, elf-загрузчик) тут совсем не причем, «просто мы не умеем его готовить» . Чтобы все заработало правильно, необходимо при загрузке файла взвести флажок «Manual Load» и в появившемся диалоговом окне «Loading options» выбрать «Force using of PHT instead of SHT» (см. рис. 2). Теперь и точка входа отображается нормально и файл можно расшифровать прямо встроенным в IDA Pro расшифровщиком (см. рис. 3), после чего продолжить дизассемблирование или снять готовый дамп. Тот факт, что функция _dl_map_object_deps() вызывается из стартового кода, дает в наши руки универсальный способ распаковки elf-файлов, упакованных практически любым упаковщиком, за исключением тех случаев, когда файл слинкован со всеми используемыми библиотеками статическим образом (то есть действует по принципу «все свое всегда ношу с собой»), но такие файлы встречаются достаточно редко. Если только упаковщик не сопротивляется отладчику, достаточно всего лишь установить точку останова на _dl_map_object_deps() и... дождаться, когда она сработает. Тут же в стеке по адресу [ESP+08h] будет адрес возврата из CALL __libc_start_main, а по адресу

proc near jmp ds:off_80495D0 jmp *0x80495d0

; IDA Pro корректно отобразила plt-переходник, вызывающий ; функцию, указатель на которую расположен в двойном слове ; по адресу 80495D0h #.got:080495D0 E8 95 04 08 off_80495D0 dd offset __libc_start_main 1: x/i $pc 0x80482b6 <_init+62>: push $0x8 1: x/i $pc 0x80482bb <_init+67>: jmp 0x8048290 <_init+24>

; ; ; ; ;

а вот тут уже начались расхождения... IDA Pro уверяет, что здесь расположено смещение функции __libc_start_main, в то время как отладчик показывает, что здесь находится специальный код push 08h/jmp 8048290h. Посмотрим, что покажет IDA Pro по адресу 8048290h

# .plt:08048290 ?? ?? ?? ?? ?? ?? 1: x/i $pc 0x8048290 <_init+24>: 1: x/i $pc 0x8048296 <_init+30>:

dd 4 dup(?) pushl 0x80495c4 jmp *0x80495c8

; парад различий продолжается! IDA Pro вообще не показывает

№9, сентябрь 2006

Рисунок 2. Выбор альтернативного метода загрузки elf-файлов в IDA Pro

33


администрирование 0xbffffb00:

0x08048390

; судя по адресу это так и есть ; проверяем наше предположение (gdb) disassemble 0x80482e1 Dump of assembler code for function _start: 0x080482c0 <_start+0>: xor %ebp,%ebp 0x080482c2 <_start+2>: pop %esi 0x080482c3 <_start+3>: mov %esp,%ecx 0x080482c5 <_start+5>: and $0xfffffff0,%esp 0x080482c8 <_start+8>: push %eax 0x080482c9 <_start+9>: push %esp 0x080482ca <_start+10>: push %edx 0x080482cb <_start+11>: push $0x8048410 0x080482d0 <_start+16>: push $0x80483b0 0x080482d5 <_start+21>: push %ecx 0x080482d6 <_start+22>: push %esi 0x080482d7 <_start+23>: push $0x8048390 0x080482dc <_start+28>: call 0x80482b0 <_init+56> 0x080482e1 <_start+33>: hlt End of assembler dump.

Рисунок 3. Расшифровка файла непосредственно в IDA Pro

[ESP+0Ch] указатель непосредственно на саму main. Если, конечно, нам повезет… Проблемы начинаются с того, что gdb с большой неохотой устанавливает точки останова на shared-функции и потому точка останова обязательно должна быть аппаратной, причем срабатывать она может несколько раз. Левые, срабатывая, распознаются легко. Если по [ESP+08h] и [ESP+0Ch] лежит совсем не то, что ожидалось (а это легко определить по диапазону адресов), пропускаем текущее срабатывание точки останова и продолжаем выполнение программы командой «c». Примерный сеанс работы с отладчиком может выглядеть так: Листинг 6. Распаковка программы путем установки точки останова на _dl_map_object_deps ; загружаем программу в отладчик root@5[elf_crypt]# gdb elfcrypt-demo ; ставим brkpnt на _dl_map_object_deps (gdb) hbreak *0x4000BBD0 Hardware assisted breakpoint 1 at 0x4000bbd0

; запускаем программу (gdb) r Breakpoint 1, 0x4000bbd0 in _dl_map_object_deps () from /lib/ld-linux.so.2

; первое всплытие установленной точки останова ; сейчас будем проверять - «наше» ли оно или нет ; смотрим стек (gdb) x $esp+8 0xbffffa6c:

0x40100498

; адрес указывает на libc.so.6 ; это «левое» всплытие, идем дальше (gdb) c Continuing. Breakpoint 1, 0x4000bbd0 in _dl_map_object_deps () from /lib/ld-linux.so.2

; второе всплытие установленной точки останова ; проверяем - «наше» ли оно или нет ; должен быть ret из call main (gdb) x $esp+8 0xbffffafc:

0x080482e1

; судя по адресу, это возможно так и есть ; должен быть указатель на main (gdb) x $esp+0xC

34

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

Как вариант, изучив код распаковщика, можно написать скрипт для IDA Pro, выполняющий распаковку самостоятельно. Это хорошо работает с несложными расшифровщиками/распаковщиками, и в данном случае листинг укладывается всего в несколько строк: Листинг 7. Скрипт для IDA Pro, расшифровывающий программу auto a,x; for(a=0x80482C0;a<0x8048338;) { x=Dword(a); x = x ^ 0x9CC03BD; PatchDword(a,x); a = a + 4; }

Естественно, чтобы написать скрипт, необходимо знать, откуда и докуда шифровать, а также ключ шифровки, для чего необходимо проанализировать алгоритм расшифровщика (см. листинг 1). Кстати говоря, IDA Pro не обновляет модифицируемый код в окне дизассемблера (точнее обновляет, но делает это как-то странно), поэтому нам необходимо нажать <U>, разрушая ранее дизассемблированные инструкции в поток байт, а затем <C> для превращения их в дизассемблерный код. Другой способ противодействия упаковщикам заключается в подключении (attach) к уже запущенному процессу (задолго после того, как упаковщик все уже распаковал). В gdb за это делается так: «gdb --pid=<PID>», где PID – идентификатор исследуемого процесса, который можно узнать с помощью команды «ps -a». Однако это не самый лучший путь, поскольку мы вторгаемся в программу уже после инициализации кучи структур данных и снятый дамп может оказаться неработоспособным. К тому же изза игр с extern и несоответствия _start реальной точке входа, существующие UNIX-дамперы не могут реконструировать elf-файл, получая Segmentation fault. Правда, можно воспользоваться утилитой PD (более подробно она рассматривается в разделе, посвященном упаковщику UPX), указав «волшебный» ключик -l, предписывающий не трогать секцию .got, тогда Segmentation fault станет вызывать сдампленный файл, но зато он будет полностью расшиф-


администрирование рован, что (теоретически) должно существенно упростить дизассемблирование, но практически из-за отсутствия символьных имен библиотечных функций анализ рискует превратиться в пытку. Если же снимать дамп необязательно и достаточно просто «посмотреть», что делает упакованная программа, можно использовать утилиту ltrace, сеанс работы с которой показан ниже. Как видно, ELFCrypt совсем не пытается ей противостоять. Листинг 8. Результат работы ltrace __libc_start_main(0x80483c4, 1, 0xbffffb34, 0x8048410, 0x8048470 <unfinished ...> printf(0xbffffac0, 0x40017a50, 0xbffffad8, 0x804842b, 0x6c6c6568) = 13 hello, world! gets(0xbffffac0, 0x40017a50, 0xbffffad8, 0x804842b, 0x6c6c6568) = 0xbffffac0 +++ exited (status 192) +++

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

UPX Это один из наиболее древних упаковщиков, созданный тройкой магов Markus F.X.J. Oberhumer, Laszlo Molnar и John F. Reiser, поддерживающий рекордное количество форматов файлов (от Amiga до UNIX) и расшифровывающий свою аббревиатуру как the «Ultimate Packer for eXecutables». Свежую версию вместе с исходными текстами можно бесплатно скачать с «родного» сайта проекта: http://www.upx.org или с «кузни»: http://upx.sourceforge.net. UPX не имеет никакого защитного кода, никак не противодействуя ни отладке, ни дизассемблированию, более того, он даже содержит встроенный распаковщик, за который «отвечает» ключ командной строки -d. С коммерческой точки зрения UPX выгоден тем, что упакованные им файлы работают практически на всем спектре UNIX-подобных систем, однако наличие встроенного упаковщика делает его совершенно бесполезным для защиты программ. Но это еще как посмотреть! Доступность исходных текстов позволяет слегка модифицировать структуру упаковываемого файла так, что родной распаковщик уже не сможет с ней работать. Самое простое, что можно сделать – это затереть сигнатуру «UPX!», расположенную в конце файла, тогда UPX не сможет распознать упакованный файл, и встроенный распаковщик откажется с ним работать:

Листинг 10. Затертая сигнатура 000013B390: 92 24 FF 00 55 50 58 21 │ 0D 0C 08 07 8F F1 E8 8C Т$ 6669♪♀◘•ПёшМ 000013B3A0: 05 97 B4 63 8C 6F 43 00 │ 19 EC 0D 00 00 41 52 00 ♣Ч┤cМoC ↓ь♪ AR 000013B3B0: 49 14 00 37 80 00 00 00 │ I 7А

Файл запускается так же, как и раньше, но теперь UPX наотрез отказывается его распаковывать: Листинг 11. Встроенный распаковщик UPX не смог распаковать файл с затертой сигнатурой root@5[upx-2.01-i386_linux]# ./upx -d elinks Ultimate Packer for eXecutables Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006 UPX 2.01 Markus Oberhumer, Laszlo Molnar & John Reiser Jun 06th 2006 File size Ratio Format Name -------------------- ------ ----------- ----------upx: elinks_2: NotPackedException: not packed by UPX Unpacked 0 files.

Поскольку UPX не использует libc и работает через интерфейс системных вызовов, то динамические библиотеки подключаются только после того, как распаковка будет завершена. А это значит, что, установив точку останова на функцию _dl_map_object_deps(), мы сорвем банк, ворвавшись в уже распакованную программу. Так же сработает подключение отладчика к активному процессу. При желании можно получить не только сырой дамп, но и готовый к работе elf-файл. К сожалению, прямых аналогов знаменитого proc-dump под UNIX нет (команда «generatecore-file» отладчика gdb создает файл, пригодный для дизассемблирования, но, увы, не запуска), но некоторые действия в этом направлении уже наблюдаются. Утилита PD, исходный код которой (с объяснением принципов его работы) опубликован в 63 номере журнала «PHRAK» (www.phrack.org/phrack/ 63/p63-0x0c_Process_Dump_and_Binary_Reconstruction.txt), легко дампит большинство простых файлов, но со сложным пока еще не справляется (однако оставляет шанс доработать их руками). Самое печальное, что PD не может снимать дампы программ, исполняющихся под отладчиком (а ведь в мире Windows хакеры поступают именно так – находят оригинальную точку входа отладчиком, после чего зовут proc-dump или его более современный аналог PE-TOOLS). Однако существует возможность отсоединиться от процесса коман-

Листинг 9. Сигнатура «UPX!», расположенная в конце упакованных файлов 000013B390: 92 24 FF 00 55 50 58 21 │ 0D 0C 08 07 8F F1 E8 8C Т$ UPX!♪♀◘•ПёшМ 000013B3A0: 05 97 B4 63 8C 6F 43 00 │ 19 EC 0D 00 00 41 52 00 ♣Ч┤cМoC ↓ь♪ AR 000013B3B0: 49 14 00 37 80 00 00 00 │ I 7А

Проведем небольшой эксперимент. Откроем упакованный файл в любом hex-редакторе и запишем поверх «UPX!» что-то свое, например: «6669».

№9, сентябрь 2006

Рисунок 4. Авторская страница упаковщика UPX

35


администрирование Burneye Первый UNIX-упаковщик с претензией на протектор, созданный молодым 25-летним хакером по кличке Scut (scut@segfault.net), он же «The Tower», живущим в Западной Германии и входящим в группу TESO, в настоящее время работающей над linice – аналогом soft-ice под UNIX. Burneye – это экспериментальный протектор, распространяющийся на бесплатной основе. Сначала его исходные тексты были недоступны, но затем (под напором общественности) выложено ~30% от общего объема кода, а затем и весь проект целиком. Все это добро можно скачать с packetstorm. Архив packetstorm.linuxsecurity.com /groups /teso / burneye-1.0-linux-static.tar.gz содержит откомпилированную версию, работающую под LINUX и частично под BSD («частично» потому, что иногда падает), в packetstorm.linuxsecurity. Рисунок 5. Сайт группы TESO com/groups/teso/burneye-stripped.tar.gz лежит 30% исходдой «detach», и до выхода из отладчика он будет находить- ных текстов и несколько статей с новыми, но так и не реася в «замороженном» состоянии, что позволяет беспрепятс- лизованными идеями по усилению защиты, а packetstorm. твенно снять с него дамп. linuxsecurity.com/groups/teso/burneye-1.0.1-src.tar.bz2 вклюТам же в статье присутствует ссылка на базовый сайт чает в себя все исходные тексты. проекта (http://www.reversing.org), но никаких новых версий Протектор умеет шифровать файлы по алгоритмам там нет, так что будем пользоваться тем, что дают. Ниже по- SHA1 и RC4, требуя от пользователя пароль при запуске. казан сеанс работы с утилитой PD: Теоретически взломать программу можно и без знания пароля (криптография не стоит на месте, и подходящий пеЛистинг 12. Снятие дампа с последующей реконструкцией реборщик можно найти на http://byterage.hackaholic.org/ elf-файла source/UNFburninhell1.0c.tar.gz), но в практическом плане ; запускаем упакованный процесс на выполнение гораздо проще купить одну-единственную лицензионную root@5[src]# ./demo копию, а потом выложить ключ на всеобщее обозрение. ; определяем его pid root@5[src]# ps -a Чтобы этого не произошло, в протектор заложена возможPID TTY TIME CMD ность «привязки» к оборудованию пользователя (так назы9771 pts/7 00:00:00 demo ваемый fingerprint). Это довольно интересная тема, но луч9779 pts/5 00:00:00 ps ше оставим ее на потом, сосредоточившись исключитель; дампим процесс в файл но на распаковке. root@5[src]# ./pd -o dumped 9771 Burneye состоит из множества вложенных друг в друpd V1.0 POF <ilo@reversing.org> га расшифровщиков, генерируемых произвольным обраdownload last version from: http://www.reversing.org зом, что, впрочем, не сильно препятствует его трассировsource distribution for testing purposes.. ке, поскольку расшифровщики реализованы как процедуperforming search.. ры. (Имеющиеся антидизассемблерные приемы сводятonly PAGESZ method implemented in this version AT_PAGESZ located at: 0xbffffbc8 ся к прыжку в середину команды и легко обходятся как в IDA Pro, так и в hiew). gather process information and rebuild: Во всем протекторе содержится всего один антиотла-loadable program segments, elf header and minimal size.. дочный прием, препятствующий трассировке под gdb и отanalyzing dynamic segment.. ладчиком, интегрированным в IDA Pro. Agressive fixing Global Object Table.. vaddr: 0x8049620 daddr: 0x8049000 foffset: 0x620 * plt unresolved!!!

section headers rebuild this distribution does not rebuild section headers saving file: dumped Finished.

; утилита PD окончила процесс дампинга ; запускаем полученный процесс на выполнение root@5[src]# ./dumped

А вот ltrace работать не будет, поскольку она нуждается в секциях .dynsym или .dynstr, которых в файлах, упакованных UPX, нет! Тем не менее, как было показано выше, это все равно не спасает его от взлома.

36

Листинг 13. Дизассемблерный листинг единственного антиотладочного приема в Burneye LOAD:053714A7 mov ebx, 5 ; SIGTRAP ; обработчик LOAD:053714AC mov ecx, offset anti_handler LOAD:053714B1 mov edx, 30h ; signal LOAD:053714B6 mov eax, edx ; signal(SIGTRAP, anti_handler); LOAD:053714B8 int 80h LOAD:053714BA add esi, offset word_5375A00 LOAD:053714C0 mov [ebp-2DCh], esi LOAD:053714C6 int 3 ; Trap to Debugger ; если ноль, мы под отладчиком LOAD:053714C7 cmp anti_debug, 0 LOAD:053714CE jnz short debugger_not_present ... ; обработчик сигнала SIGTRAP (получает управление только ; при запуске без отладчика) LOAD:05371A0C anti_handler: LOAD:05371A0C push ebp


администрирование LOAD:05371A0D mov ebp, esp ; увеличиваем секретную переменную LOAD:05371A0F inc anti_debug LOAD:05371A15 leave LOAD:05371A16

retn

; выходим из обработчика

Листинг 15. Фрагмент файла, упакованного протектором Burneye .05371035: .0537103B: .0537103C: .0537103D: .05371043:

FF3508103705 9C 60 8B0D00103705 E93A000000

push pushfd pushad mov jmp

d,[05371008] ecx,[05371000] .005371082 ---↓ (1)

Программа устанавливает свой собственный обработчик (в приведенном выше листинге он обозначен как anti_ После запуска упакованного файла на диске автомаhandler), ожидающий прихода сигналов типа SIGTRAP, а за- тически образуется распакованный ./burnout, который уже тем вызывает прерывание INT 03h. При нормальном разви- не привязывается к машине и который можно свободно оттии событий управление получает anti_handler, увеличиваю- лаживать или дизассемблировать в свое удовольствие. Выгрузка резидентного модуля из памяти осуществлящий значение переменной anti_debug, которая тут же проверяется со своим первоначальным значением. При рабо- ется командой «rmmod burndump», но не спешите с ним те под отладчиком сигнал SIGTRAP «поглощается» отлад- расставаться! Слегка доработав исходный текст, мы смочиком, и anti_handler управления не получает. жем распаковывать и другие протекторы (когда они появятОсновная проблема протектора в том, что переменная ся), а не только один лишь Burneye. Дампер уровня ядра – anti_debug проверяется в одном-единственном месте, один- это вещь! Это настоящее оружие, с которым очень трудно единственный раз! Чтобы обойти защиту, можно либо за- справиться на прикладном уровне! (Впрочем, Burneye с легписать в переменную anti_debug любое значение, отличное костью снимается и PD). Короче, победу над Burneye можот нуля, либо трассировать программу вплоть до достиже- но считать полной и окончательной. ния INT 03h, после чего «вручную» изменить значение регистра $pc на anti_debug и спокойно продолжить отладку. Shiva Так же можно заменить инструкцию «cmp anti_debug, 0» Весьма амбициозный протектор, созданный двумя гуру Neel на «cmp anti_debug, 1» (но это только в том случае, если Mehta и Shaun Clowes (Email: shiva@securereality.com.au) в программе нет проверки целостности собственного ко- и представленный ими на конференции Black Hat, прохода). Короче, вариантов много, но все они требуют участия дившей в Азии в 2003 году. человека, что напрягает. Когда борьба с Byrneye всех хакеров окончательно достала, некто по имени ByteRage (byterage@yahoo.com) написал автоматический распаковщик – burneye unwrapper, по обыкновению бесплатно распространяемый в исходных текстах. Впрочем, называть «исходными текстами» крошечную C-программу, представляющую собой загружаемый модуль ядра, можно только с большой натяжкой. К ач а е м h t t p : / / b y t e r a g e . h a c k a h o l i c . o r g / s o u r c e / burndump.c, компилируем своим любимым компилятором «gcc c burndump.c» (на некоторых системах необходимо явно указать включаемые файлы «gcc c I/usr/src/linux/include burndump.c») и загружаем внутрь ядра «insmod burndump» (естественно, для этого необходимо иметь права root). Теперь burndump будет сидеть резидентно в памяти и перехватывать системный вызов brk(), который нужен упаковщику Рисунок 6. Обход антиотладочного приема в отладчике, для расширения сегментов elf-файла в памяти. К моменинтегрированном в IDA Pro ту вызова этой функции файл уже распакован – остается только снять с него дамп и записать на диск. Чтобы не писать все подряд, необходимо как-то отождествить упаковщик. В burndump за это отвечает следующая малопонятная конструкция: Листинг 14. Фрагмент burndump, отождествляющий упаковщик по «сигнатуре» codeptr = current->mm->start_code + 1; /* caller == burneye ??? */ if ((codeptr >> 16) == 0x0537) printk("<1> 7350 signature 0x0537 found!\n");

Но все сразу же становится ясным, если взглянуть на файл, обработанный протектором Burnyey: как видно, протектор располагает себя по довольно нехарактерным адресам, и дампер просто сравнивает 16 старших байт адреса, вызывающего функцию brk().

№9, сентябрь 2006

Рисунок 7. Сайт создателя утилиты ByteRage

37


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

Рисунок 8. Неизменный Segmentation fault при попытке запустить протектор shiva, возникающий на всех доступных мне ядрах/машинах

Рисунок 9. Внешний вид ядерного отладчика linice, своеобразного аналога soft-ice для Linux

Исходные тексты не разглашаются (как будто там есть что скрывать!), а сам бинарник можно скачать как с сайта разработчиков www.securereality.com.au/ archives/shiva-0.95.tar.gz, так и с сервера Black Hat: blackhat.com/presentations/bh-usa-03/bh-us-03-mehta/ bh-us-03-shiva-0.96.tar, причем версия с Black Hat посвежее будет, что наводит на определенные размышления. Там же, на Black Hat, можно найти тексты мультимедийной презентации от обоих разработчиков и в pdf. Первый: www.blackhat.com/presentations/bh-usa-03/bh-us-03-mehta/ bh-us-03-mehta.pdf и второй: http://www.blackhat.com/ presentations/bh-asia-03/bh-asia-03-halvar.pdf. Разработчики реализовали мощную антиотладку, многоуровневую динамическую шифровку, эмуляцию некоторых процессорных инструкций… в общем получился почти что Armadillo, только под Linux. Но если Armadillo хоть как-то работает, то Shiva на всех доступных мне системах выпадет в Segmentation fault. Конкретно тестировались: KNOPPIX с ядрами 2.6.7/4.2.7 и SUSE c ядром 2.6.8, пускаемых как под VMWare, так и на «живой» машине с процессором AMD Athlon-1700. Поэтому вся информация, приведенная ниже, получена исключительно путем дизассемблирования и отладки протектора. Начнем с отладки, так как под Linux это самый больной вопрос. Операционная система предоставляет механизм ptrace, которым пользуется gdb и подавляющее боль-

38

шинство остальных отладчиков (отладчик, интегрированный в IDA Pro, ALD – Assembly Language Debugger и т. д.). Собака зарыта в том, что механизм ptrace нерентабелен, то есть программу, уже находящую под отладкой, отлаживать нельзя! Shiva воспользовался этим фактом, породив дочерний процесс, отлаживающий сам себя (ну все, как у Armadillo!), чем надежно защитился как от трассировки, так и от вызова PTRACE_ATTACH, поскольку он тоже работает через ptrace! Найти же удобоваримый отладчик, работающий в обход ptrace, оказалось, на удивление, сложной задачей (тем более что в дополнение к этому Shiva распознает TRAP-флаг, анализируя бит трассировки в регистре EFLAGS процессора и выполняет контроль таймингов). Поиск обнаруживает только кладбища заброшенных проектов. Заброшенный, заново воскрешенный и снова заброшенный ядерный отладчик The-DUDE (http://the-dude. sourceforge.net), другой ядерный отладчик – privateICE (http://pice.sourceforge.net) – поддерживает лишь фиксированный набор ядер, среди которых нет ни одного «моего». Из всех отладчиков удалось запустить лишь linice (http:// www.linice.com), да и то в VGA-режиме. Морской волк Chris Eagle (cseagle@nps.navy.mil) пошел другим путем и на той же самой конференции продемонстрировал автоматический депротектор. Вместо поиска отладчиков, работающих в обход ptrace, он разработал отладчик-эмулятор x86-процессора, выполненный в виде подключаемого модуля для IDA Pro и бесплатно распространяемый в исходных текстах: http://sourceforge.net/projects/ ida-x86emu, однако имейте в виду, что для его компиляции требуется IDA SDK, который есть не у всех. Текст мультимедийной презентации с описанием методики взлома лежит на Black Hat: http://www.blackhat.com/ presentations/bh-federal-03/bh-federal-03-eagle/bh-fed-03eagle.pdf, а набор утилит для взлома (включающий в себя автоматический распаковщик и несколько полезных скриптов для IDA Pro, упрощающих расшифровку), находится в соседнем файле: www.blackhat.com/presentations/ bh-federal-03/bh-federal-03-eagle/bh-federal-03-eagle.zip. Теперь что касается расшифровки. Чтобы противостоять дампу даже на уровне ядра, Shiva использует динамическую расшифровку по требованию (on demand). Неиспользуемые в данный момент страницы заполняются байтами CCh, представляющими собой инструкцию INT 03h, передающую управление материнскому процессу-отладчику при попытке их выполнения, что сигнализирует о необходимости их расшифровки, которая осуществляется «подкачкой» недостающих байтов из «резервного» хранилища (Armadillo, помнится, менял атрибуты доступа страниц). Разумеется, этот трюк работает только с кодом, но не с данными, и их приходится расшифровывать статическим расшифровщиком. В дополнение к этому Shiva замеРисунок 10. Структура файла, няет в расшифрозашифрованного Shiva


администрирование ванных блоках инструкции PUSH, JMP и CALL на INT 03h и эмулирует их выполнение. Все очень просто. Shiva держит в памяти специальную таблицу с адресами замещенных инструкций, и если TRAP по выполнению INT 03 приходит по одному из этих адресов – задействуется механизм эмуляции. В практическом плане это означает, что даже расшифровав все зашифрованные блоки, мы все равно не сможем избавиться от Siva RTL (среды исполнения) и будем вынуждены «тащить» протектор за собой, если, конечно, не декодируем эту таблицу адресов и не восстановим «украденные» команды. Для противодействия дизассемблеру Shiva генерирует большое количество полиморфного кода и постоянно совершает прыжки в середину инструкций, что ужасно напрягает. Короче говоря, Shiva – это кривая калька с Armadillo и к тому же неработающая. В то время как под Windows протектор Armadillo уже давно не является чудом инженерной мысли, ситуация в мире UNIX напоминает СССР в эпоху «персональных компьютеров коллективного использования».

Заключение Через несколько лет, когда рынок закрытого программного обеспечения под UNIX достигнет критической точ-

№9, сентябрь 2006

Основные характеристики наиболее популярных UNIX-упаковщиков (неблагоприятные для хакеров свойства затемнены) Характеристика

ELF-Crypt

UPX

Byrneye

Shiva

anti-debug

нет

нет

да

да

anti-dissembler

есть

нет

да

да

anti-ltrace

нет

да

да

да

allow to attach

да

да

да

нет

anti «procdump»

да

нет

нет

да

интерфейс

libc

syscall

syscall

syscall

содержит распаковщик

нет

да

нет

нет

взломан

да

да

да

да

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

39


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

Zlock: контролируйте доступ к USB-устройствам

Андрей Гущин Вы в очередной раз не можете понять, откуда у конкурентов база данных ваших клиентов? Или кто из сотрудников периодически использует рабочее место для перекачки, обработки и записи гигабайтов личных фотографий с цифровой камеры на CD? Без надежной системы контроля доступа к мобильным устройствам вряд ли удастся избежать подобных ситуаций.

Что мы имеем сегодня? Проблема контроля над нелегальной миграцией данных за пределы организации с использованием переносных устройств (flash-накопители, переносные HDD, PCMCIA-карты, КПК и пр.) давно актуальна для многих компаний. Но до сих пор ее решение сводится к созданию нетривиальных политик безопасности. Однако такие решения, во-первых, сложны и нестандартны, во-вторых – в большинстве реализаций не позволяют проводить централизованный аудит событий, связанных с копированием данных на съемные устройства. Помимо этого, при создании жесткой политики безопасности системному администратору бывает трудно решить проблему предоставления выборочного доступа к таким устройствам, а уж про прямые и наглядные разрешения типа ACL – вообще говорить не приходится. Как итог – большинство системных администраторов либо смирилось с проблемой утечки информации через мобильные устройства, либо скрупулезно пытаются создавать политики безопасности, способные решить задачу предотвращения доступа к таким устройствам. Себя я отношу к первой категории, так как управлять сетью IT-компании и пытаться запретить копировать что-либо на съемные носители почти невозможно, а управление

40

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

Есть ли варианты?

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

Несколько месяцев назад компания SecurIT (http://www.securit.ru), разработчик популярных систем защиты информации при ее хранении на дисках и лентах, анонсировала новый продукт – систему Zlock, основное назначение которой – разграничение прав пользователей на использование внешних устройств, например USB-flash-дисков и пр. В статье речь пойдет о последней версии продукта – Zlock 1.2. Для каждого типа устройств Zlock предполагает возможность гибкой настройки прав доступа на основе спис- Тестируем Zlock ков контроля доступа (ACL). Для каж- Протестировать этот продукт было дого физического или логического ус- весьма интересно, поскольку иментройства и для каждого пользователя но такие решения редко используютили группы пользователей из Active ся в большинстве сетей, хотя мысли Directory можно разрешить либо пол- о возможности подобного контроля наный доступ, либо чтение, либо вообще верняка возникали у каждого системдоступ запретить. Подключаемые уст- ного администратора. Однако при выройства могут идентифицироваться по боре любых систем корпоративного любым признакам, таким как класс ус- уровня для внедрения в своей локальтройства, код производителя, код уст- ной сети, а также в сетях наших клиенройства, серийный номер и т. д. Это да- тов (я работаю в IT-фирме и любое расет возможность назначать разные пра- сматриваемое решение «примеряется» ва доступа к устройствам одного клас- на потенциальную возможность реалиса, например, запретить использова- зовать это у заказчиков) основным криние USB-flash-дисков, но при этом раз- терием, помимо самого функционала, решить использование USB-ключей для нас является эта самая «корпорадля аутентификации пользователей тивная направленность» продукта.


безопасность Главными предполагаемыми преимуществами системы, наряду с основными функциональными характеристиками, должны быть простота внедрения и интуитивная понятность действий по ее настройке и конфигурированию. После изучения руководства администратора я приступил к установке на сервер управляющей консоли и клиентской части программы. Процесс инсталляции прошел успешно. Правда, после установки вручную пришлось обновить драйверы ключа защиты – по указанию «найти автоматически» ключ стал работать штатно. Никаких конфликтов с двумя соседними HASP-ключами от систем 1С:Предприятие не произошло. Первая же проверка на соответствие моим задачам («Помощь → О программе») показала, что я стал обладателем версии системы на 10 пользователей. Продолжать установку я не стал, так как сеть нашей компании включает в себя около 150 рабочих мест. Связавшись с техническим отделом разработчика, я пояснил, что для полноценного тестирования потребуется внедрить систему во всей работоспособной локальной сети, а не на искусственном полигоне из 10 рабочих станций, после чего количество лицензий увеличили до 150. Апгрейд был произведен удаленно, по системе «запрос-ответ», с инструкцией, как добавить полученные лицензии в ключ защиты, что является несомненным преимуществом при масштабировании сети компании, так как не придется останавливать работу всей системы, отсылать разработчику старый ключ защиты и ждать новый, как бы оперативно не работали службы почтовой доставки.

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

№9, сентябрь 2006

   

Продукт: Zlock. Производитель: SecurIT. Сайт производителя: www.securit.ru. Назначение: контроль доступа к внешним устройствам в масштабе предприятия.  Основные возможности:  Управление доступом к устройствам на базе политик доступа.  Идентификация устройств по 16 признакам.  Ведение каталога устройств.

 Централизованная установка и уп-

«получения навыков администрирования» путем постоянной беготни между компьютерами пользователей, а посему предпочитают использовать такие технологии, которые позволяют вообще не покидать своего кабинета для решения любых системно-административных задач (понятно, что физические поломки устраняют специалисты технического отдела). Выяснилось, что возможностей для удаленной установки клиентской части у Zlock как минимум две: при помощи стандартного распространения установочного msi-файла политиками AD и с использованием службы удаленной установки, имеющейся в консоли управления. Эта служба, кстати, позволяет таким образом запустить на клиентском компьютере любой установочный дистрибутив любого другого продукта. То есть вместе с основным продуктом вы заодно получите приятную «добавку», упрощающую удаленную установку программ на рабочие станции в локальной сети. После тестовой проверки на нескольких рабочих станциях и убеждения в том, что продукт не валит сразу систему в BSOD, следующим тестом «права на жизнь» стала попытка установить клиентскую часть на все компьютеры локальной сети. Процесс удаленной установки, на мой взгляд, слегка усложнен необходимостью сначала создать службу удаленного управления, затем «подключиться» к группе компьютеров и только затем запустить групповую инсталляцию. На самом деле проще было бы эти 3 шага объединить в одном действии: «Установить программу», так как логично предположить, что если вы хотите что-то удаленно установить на клиентский компьютер, то и программу удаленного уп-

равления также необходимо подключить. Думаю, что авторы программы прислушаются к таким «косметическим» замечаниям и в следующей версии поправят это. Хотя про следующую версию я напишу отдельно. Учитывая, что при установке клиентской части автоматически будут приняты определенные настройки «по умолчанию», разумно создать их заранее и сохранить в виде файла default.zcfg в папку, откуда будет производиться установка. Данную папку предоставим в общий доступ для возможности установки программы с наследованием настроек по сети, чем всегда смогут воспользоваться специалисты технического отдела, которые подключают пользователям новые рабочие станции, а также проводят профилактические работы с ними (например, переустановка ОС). Это тоже понравилось, так как направлено на реализацию той самой «корпоративности продукта» и освобождения главного специалиста от необходимости постоянного вмешательства в работу helpdesk-специалистов. Для своей сети я сразу воспользовался общепринятым принципом построения практически любых систем защиты: «что не разрешено – то запрещено» и в политике по умолчанию запретил запись на все съемные носители для всех пользователей, кроме Администраторов Домена. При создании такой политики безопасности «по умолчанию» очень внимательно отнеситесь к разрешениям на локальные жесткие диски (Zlock позволяет заблокировать доступ и к ним). Если вы случайно создадите неверную политику и запретите любой доступ к дискам с ОС – то компьютеры просто не загрузятся. Также не забывайте про обяза-

равление.

 Мониторинг клиентских рабочих станций для оперативного реагирования на попытки несанкционированного отключения или изменения настроек клиентского модуля Zlock.  Запись событий в локальный или централизованный журнал в форматах TXT, XML и EventLog.  Встроенные средства анализа логов.

41


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

Рисунок 1. Политика доступа по умолчанию

тельное предоставление доступа для учетной записи SYSTEM, от имени которой запущено большинство системных процессов (см. рис. 1). После необходимо продумать политики доступа к самой службе Zlock, которая также распространится при установке на клиентские места. Отредактируйте политику доступа к настройкам клиентской части программы, разрешив или запретив пользователям видеть значок и получать предупреждения об изменении политики доступа. С одной стороны – данные предупреждения являются удобными, так как, отправив администратору заявку на получение доступа, пользователь будет оповещен, если измененная политика будет применена к его рабочей станции. С другой стороны – часто системные администраторы предпочитают не предоставлять пользователям лишние визуальные подтверждения работающих на рабочей станции защитных служб (см. рис. 2). Затем созданная политика (в данном случае она пока остается локальной для консольной рабочей станции) сохраняется в виде файла с именем default.zcfg в папку с дистрибутивом клиентской части. Все. На этом глобальная подготовка системы к массовой установ-

Рисунок 2. Разрешения на управление Zlock

42

ке закончена. В продукте импонирует простота создания политик, связанная с применением стандартного принципа создания прав пользователей типа ACL. Для установки на все компьютеры пользователям было отправлено pop-up-сообщение с просьбой включить все рабочие станции сети, находящиеся рядом, но не используемые в данный момент. Выбрав из списка компьютеров для подключения все рабочие станции сети (вернее, выбрав все и затем исключив серверы), я запустил процесс подключения для дальнейшей установки клиентской части. Подключение к такому количеству компьютеров (150), конечно, заняло относительно продолжительное время, так как осуществляется последовательно, а если компьютер выключен – то происходит ожидание тайм-аута по подключению. Однако процедуру придется выполнить только при первоначальной установке, дальше политики будут контролироваться на основе персональных потребностей пользователей. При попытке «разом» установить клиентскую часть на все 150 компьютеров локальной сети я столкнулся с незначительными проблемами на нескольких рабочих станциях, однако на большинство компьютеров система установилась автоматически. Проблема в установке, собственно была одна – несовместимость Zlock с устаревшими версиями драйвера защиты CD-дисков – StarForce. Для корректного взаимодействия необходимо обновить драйвер StarForce, скачав его с сайта производителя. Это было также сделано удаленно, при помощи службы удаленной установки. Объяснение причины этой несовместимости, на мой взгляд, имеет право на жизнь – ведь Zlock взаимодействует с подсистемой ввода-вывода на более низком уровне, нежели прикладные функции ОС, – так же, как защита от копирования CD.

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

Стремясь к полной конфиденциальности… После этого, собственно говоря, и начинается тонкая настройка системы Zlock. Если в вашей компании сотрудникам часто необходимо что-то сохранять на съемных носителях, а политику безопасности хотелось бы поддерживать на самом строгом уровне, то скоординируйте свой рабочий график так, чтобы иметь возможность в следующую за установкой неделю как можно чаще присутствовать на рабочем месте. Для поддержания максимальной строгости политики доступа рекомендуется создавать правила для конкретных съемных устройств, так как Zlock позволяет предоставлять доступ к устройствам даже на основе его полных характеристик, таких, как марка, модель, серийный номер и т. п. Сложнее обстоит дело в IT-фирмах, так как сотрудникам постоянно приходится записывать всевозможную информацию на диски CD/DVD-R/RW. В данном случае можно порекомендовать использовать выделенные рабочие станции с записывающими приводами, на которых системными политиками безопасности будут созданы правила, не позволяющие получить с этих компьюте-


безопасность ров доступ в сеть. Однако такие тонкости выходят за рамки статьи, посвященной Zlock.

Как это работает на практике? Теперь посмотрим, как это все выглядит в работе. Напоминаю, что созданная мной политика доступа позволяет пользователям производить чтение со всех съемных устройств и запрещает запись на них. Сотрудник отдела обслуживания приходит в офис для того, чтобы сдать отчеты и записать задания на диск. При подключении съемного устройства система ограничивает доступ и выдает соответствующее предупреждение (см. рис. 3). Сотрудник считывает с него принесенную информацию, после чего безуспешно пытается записать полученные от руководителя задания. При необходимости получить доступ он либо связывается с администратором по телефону, либо формирует автоматический запрос при помощи Zlock Tray Applet с указанием устройства, к которому он хотел бы получить доступ, называет свою учетную запись и мотивирует необходимость такого доступа. Администратор, получив такой запрос, принимает решение о предоставлении/не предоставлении такого доступа и при положительном решении изменяет политику для данной рабочей станции. При этом созданный за-

Рисунок 3. Предупреждение об ограничении доступа

Рисунок 4. Создание политики на основании запроса пользователя

№9, сентябрь 2006

прос содержит всю информацию об устройстве, включая производителя, модель, серийный номер и т. д., а система Zlock позволяет создавать любые политики на основании этих данных. Таким образом мы получаем возможность предоставить право записи конкретному пользователю на указанное устройство, при необходимости ведя журнал всех файловых операций (см. рис. 4). Таким образом процесс создания дополнительных разрешающих политик облегчен для администратора до предела и сводится к принципу Check&Click, что, несомненно, радует.

Что еще? Очевидно, «закон 80-20» справедлив и для Zlock, поэтому в данной статье удалось подробно рассмотреть только 20% возможностей продукта, которые, тем не менее, должны удовлетворить 80% клиентов. Для того чтобы соблюсти историческую справедливость, приведем краткий обзор неохваченных возможностей.

Мониторинг

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

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

Чего ожидать в будущем?

Возвращаясь к обещанному анонсу ноДанная функция обеспечивает пери- вой версии, могу сказать, что в неофиодический опрос клиентских рабочих циальной беседе с одним из разработстанций на предмет несанкциониро- чиков эта тема обсуждалась с неподванного отключения или изменения дельным интересом, так как именно настроек клиентских модулей Zlock. в ней планируется ввести полноценДля уведомления компетентных лиц ное понятие «сервер Zlock», который о такой «неавторизованной» актив- полностью возьмет на себя все взаиности пользователей может приме- модействия с клиентами. В настоящий няться как запись информации о со- момент централизованное управление бытии в журнал, так и любое дейс- осуществляется при помощи консоли твие, выполняемое с помощью скрип- Zlock. Введение сервера упразднит нетов VBscript или Jscript, например, от- обходимость описанного выше послеправка сообщения по электронной поч- довательного подключения к каждому те, SMS и т. д. Это может стать сущест- клиенту и сделает еще более удобным венным подспорьем в деле выявления распространение настроек. Сервер особо талантливых и любознательных будет осуществлять централизовансотрудников и своевременного направ- ное управление клиентскими частяления их способностей в более продук- ми – мониторинг, применение политик и конфигураций, а также все остальтивное русло. ные функции, необходимые для полноценного администрирования систеЖурналирование О возможности ведения журнала мы. Если все это окажется полноценуже шла речь, однако стоит написать но реализованным, то продукт станет об этом более подробно, посколь- еще более удобным помощником для ку анализ логов – один из основных, системного администратора. Хотя уже а иногда и единственный инструмент сейчас Zlock успешно внедрен в нашей для выявления инсайдеров. Журнал компании и стабильно работает на 150 может вестись в формате TXT, XML рабочих станциях. и Windows EventLog, как на локальной На правах рекламы рабочей станции, так и на сервере.

43


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

Защищаемся от malware с помощью BufferZone

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

44


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

О

бнаружить попытку внедрения практически любой злонамеренной программы можно тремя способами: опираясь на базу знаний, пытаясь предугадать действия и контролируя работу и целостность системы. Сегодня самым популярным является первый, самый простой в реализации вариант, заключающийся в том, что на основе известного вируса создается его описание (сигнатура), которое заносится в базу. Проблем здесь несколько. Неизвестные вирусы таким способом обнаружить невозможно, а занесение новой сигнатуры требует некоторого времени (по данным лаборатории Касперского, от 30 минут до полутора часов). Но очень часто пользователи игнорируют обновления. Некоторые обновляют антивирусную базу раз в неделю, другие раз месяц, не говоря о том, что на некоторых компьютерах часто антивирус вообще не установлен. Изучая действия различных типов malware (термин malware произошел от слов malicious и software. Под malware понимают все программы, которые могут нанести какой-либо ущерб, включая вирусы, троянцы, сетевых и почтовых червей, а также рекламное (adware) и шпионское (spyware) программное обеспечение.) можно попытаться описать их при помощи правил. Если программа нарушит одно из правил, то ее можно считать подозрительной. У злоумышленника всегда будет возможность изучить работу такой системы защиты и вероятно найдется вариант, позволяющий ее обойти. К тому же под описание могут попасть и некоторые легальные программы, пользователь будет сбит с толку и может принять неверное решение, блокирующее работу легальной утилиты. Немного другой подход реализуют различные механизмы, опирающиеся на регистрацию аномалий, но, к сожалению, сегодня это в большинстве своем лишь теоретические разработки. В стороне стоят системы, задача которых ограничение деятельности не доверенных программ. Запуская программу в ограниченной среде «песочнице» (sandbox) они позволяют предохранить систему от подозрительных или неразрешенных действий. Хо-

№9, сентябрь 2006

тя такой подход и позволяет обнаружить и остановить практически любую угрозу, тем не менее многим программам требуется доступ в системную область, возможность записи и изменения файлов. Распознать вредные действия подчас довольно сложно, поэтому всегда есть вероятность ошибки, как запрет легального действия, так и, наоборот, разрешение неправильного. Пользователю придется выбирать между максимальной защитой, а значит, постоянными запросами, либо меньшей защитой, с возможностью спокойно работать. Поэтому такие «песочницы» должны использоваться в паре с антивирусом. Из всего сказанного можно сделать вывод, что всегда приходится выбирать между удобством и уровнем безопасности, а беззаботный или невнимательный пользователь может свести на нет все старания по защите сети. В журнале уже рассказывалось о различных решениях, позволяющих защитить компьютер без использования антивируса CORE FORCE [2] и Prevx1 [3], сегодня познакомимся еще с одним из них.

Подход BufferZone Разработчики израильской компании Trustware Inc., образованной в 2003 году, предлагают иной подход, позволяющий активно защищать операционную систему Windows против злонамеренного программного обеспечения и компьютерных атак. Без каждодневных обновлений, с максимальной защитой при минимальном участии пользователя. Суть технологии Virtualization, используемой в продукте, имеющем название BufferZone, заключается в том, что непроверенная программа помещается в виртуальную среду, наподобие sanbox. Но с некоторым отличием. Такие программы могут видеть файлы на жестком диске, но не могут их изменить. Если же программе потребуется изменение, например параметра реестра, то в виртуальном пространстве будет создана копия и программа будет в дальнейшем работать с ней, не трогая оригинал. Для того чтобы избежать утечки информации, непроверенные программы могут вообще не иметь доступа к определенным (confidential) ресурсам.

Рисунок 1. Главное окно программы

И, наоборот, доверенные процессы могут видеть все ресурсы (принцип прозрачности) или не иметь доступа к таким ресурсам. Любая доверенная программа может изменить статус в том случае, когда работает с недоверенным источником. Например, при помощи MS Word пользователь открывает документ, полученный через Интернет. Таким образом, ненадежные программы всегда создают недоверенные ресурсы, а надежный процесс всегда производит доверенный ресурс. Надежный процесс может получить доступ к непроверенному ресурсу, полученному результату система защиты также не будет доверять. Если файл, либо реестр изменен доверенной программой, то программа, помеченная как недоверенная, увидит это изменение. А если наоборот? Недоверенная программа, работая с копией, будет уверена, что изменила требуемый ресурс, остальных это изменение не коснется. Таким образом любой троянец, даже проникнув в систему, не сможет полноценно работать, так как вся информация о его автозагрузке будет находиться в подставном ресурсе. Кроме того, дисплей и клавиатура для доверенных и недоверенных процессов как бы разделены, поэтому даже если троянцу и удастся в последующем запуститься, то считать с них информацию он не сможет.

Варианты BufferZone В настоящее время доступны четыре варианта продукта: Home, Corporate,

45


безопасность CSP (Critical Systems Protection) и freeware. Каждый из них обеспечивает защиту на одном из трех уровней: отдельное приложение, компьютер или корпоративная сеть. Так вариант Corporate позволяет администратору осуществлять полный и принудительный контроль над всеми устройствами, устанавливаемыми и работающими приложениями, централизованное управление настройками и правилами. Централизованная сертификация устанавливаемых программ может осуществляться как локально, так и через сеть (например LDAP). В каждой версии ведется подробный журнал работы, поэтому всегда можно узнать о происходящем в системе. Свободная версия программы защищает только отдельное приложение, не затрагивая сменные носители. В настоящее время обеспечивается защита 13 утилит:  клиенты обмена сообщениями – MSN Messenger, Yahoo Messenger, I C Q , AO L I n s t a n t M e s s e n g e r, GoogleTalk и Skype.  P2P-приложения – Limewire, Kazaa, Emule.  веб-браузеры и менеджеры закачек – Internet Explorer, FireFox, Download Accelerator Plus. Минимальные требования к клиентскому компьютеру: процессор класса Pentium III с 128 Мб оперативной

Рисунок 2. Вывод списка процессов

46

памяти и установленная ОС Windows 2000/XP/2003.

Тестируем работу BufferZone Home В настоящее время на сайте проекта можно скачать триал-версию BufferZone Home, сохраняющую работоспособность без регистрации в течение 60 дней и все freeware-утилиты. Установка варианта Home стандартная, после чего потребуется перезагрузка системы. На установку и запуск новой программы отреагировал брандмауер Jetico Personal Firewall, сообщивший, что приложение пытается «Event attacker injects own code into application» и «Event attacker writes to application’s memory» и так для всех процессов, автоматически запускающихся вместе с системой. Кроме того, программа WinPatrol сообщила о добавлении клиента BufferZone в автозапуск и появлении нового сервиса ClntSvc.exe. После загрузки системы на рабочем столе появились новые папки My Confidential Documents, C:\Virtual и в трее новый значок, щелчок по которому вызовет появление окна настройки (см. рис. 1). После установки все файлы из папки Program Files будут перенесены в Virtual и помечены как Untrusted. На старом месте останутся только ярлыки, указывающие на файлы в Virtual. Главное окно программы состоит из 4 вкладок:

 Summary – выводит список запущенных на компьютере (см. рис. 2) и помещенных в BufferZone программ. Здесь же можно просмотреть, сохранить и распечатать журналы событий, редактировать список запрещенных, конфиденциальных файлов, а также распределить программы по зонам. Также отсюда можно запустить небольшой тур на Flash, рассказывающий о возможностях BufferZone.  Po l i cy – н ас т р о й к а «Ac t i vate Application Control», т.е. действия программы при появлении нового процесса и сообщение выводимого при этом пользователю. Также в этом пункте определяются зоны (none, BufferZone, Confidential, Forbidden) для внешних и сетевых устройств, а также реакция системы на запуск неизвестных, но подписанных программ.  Firewall – содержит настройки межсетевого экрана для приложений, работающих в двух зонах Trusted и BufferZone. В качестве параметров принимается имя приложения (возможно с указанием полного пути), сетевой адрес, порт и действие (Allow, Deny). По умолчанию запрещен доступ по 25 порту для всех приложений, находящихся в BufferZone, остальные соединения разрешены.  Setting – здесь также две вкладки. В «General» установки администраторского пароля, рисунков статуса на файлах и папках, вывод иконки в трее, оповещение о появлении новой версии программы, действие по-умолчанию в том случае, когда доверенная программа открывает недоверенный ресурс (спросить, запретить, открыть в BufferZone, разрешить). В «Maintenance» можно установить очистку виртуальных файлов в BufferZone. Обозначения файлов и каталогов при использовании BufferZone помечаются специальной маркировкой. Доверенные файлы не маркируются, недоверенные получают красную окантовку вокруг значка. Значки программ, которые могут работать как в том, так и другом режиме, кроме красной окантовки, дополнительно перечеркиваются красной полосой. Файлы, помеченные поль-


безопасность Таблица сравнения версий программы BufferZone зователем как confidential, дополнительно маркируются замком, а forbidden – Возможности версии Free Home Laptop CSP Server Corporate запрещающим знаком (см. рис. 3). Эле- Защита от вирусов, червей и троянов из Интернета + + + + + + менты экранного интерфейса, запуЗащита от вирусов, червей и троянов из внешнего – + + + + + щенные в BufferZone, также получают источника (дискета, компакт-диск, USB-устройства) красную окантовку по контуру окна. Защита файлов, регистра, выполняющихся + + + + + + прикладных программ и объектов Windows В контекстном меню, вызываемом Интеграция со сторонними сертификатами кода + + + + + + по щелчку правой кнопкой, появились дополнительные опции (см. рис. 4), поз- Возможность полного запрещения инсталляции – – + + + + программного обеспечения из любого внешнего воляющие перемещать файл или катаисточника лог в/из BufferZone, запускать прилоДля изменения уровня безопасности требуется – – + + + + жение в BufferZone, установить атрипароль администратора бут Confidential и Forbidden. ПользоваПолитики на рабочих станциях сети – – – – – + телю доступны два виртуальных рабоЦентрализованные параметры настройки – – – – – + чих стола: Desktop и Security, сменить и правила политики их можно при помощи пункта меню, выЦентрализованное развертывание новых ревизий – – – – – + зываемого при помощи значка в трее. Детализированный файл регистрации событий + + + + + + Первый же час работы выявил и не- безопасности от всех рабочих станций которые недостатки, которые, правПоддержка Windows 2000, XP и 2003 Server + + + + + + да, устраняются настройкой. Наприцентной защиты, но они показывают, мер, 700 Мб свободного места на дис- доверенном режиме вручную. Для тестирования работы систе- что у технологии BufferZone есть все ке C:\\ были быстро забиты работающими приложениями, ведь для каждо- мы защиты я запустил файл, содержа- возможности противостоять угрозе. Пользователь должен немного го все настройки создавались факти- щий вирус I-Worm/Netsky.B. В режиме чески повторно. Открытие документов Security при запуске вируса было отка- привыкнуть к работе с таким типом в Microsoft Word в первые несколько зано, система сослалась на то, что бы- программ, хотя в некоторых случаях запусков после активации BufferZone ла предпринята попытка записи в ох- система сама его подстраховывает постоянно сопровождалось доуста- раняемую системную область. Тогда я и лишних вопросов не задает. Кроме новкой каких-то компонентов. Поэто- обозначил архиватор WinRaR как до- того, еще сказывается инерция мышму при установке необходимо плани- веренную программу и попробовал за- ления, мы все хорошо знаем о раборовать и некоторый запас дискового пустить файл с вирусом, содержащим- те антивирусов, межсетевых экранов, ся в архиве. Сразу же выскочило сооб- а вот работая с одним BufferZone всепространства (хотя бы двойной). После активации BufferZone стоит щение (см. рис.5), говорящее о том, что таки чувствуешь себя несколько непросмотреть установленные програм- на диске была создана новая програм- уверенно. Но нельзя не обратить внимание мы и неопасные сразу же перевести ма, которая на всякий случай будет зав нормальный режим работы, исполь- пущена в BufferZone. И опять вирус был на наметившуюся активность в раззуя пункт контекстного меню «Move out остановлен. Удалось запустить вирус работке альтернативных приложений, of BufferZone», выбрав нужную папку только в режиме Desktop. Но если в сис- предназначенных для защиты персов C:\Virtual\Untrusted\C_\Program Files. теме без работающего BufferZone ра- нальных систем, без использования В случае надобности любую програм- бота вируса не была заметна, то после базы знаний. Это может свидетельсму всегда можно будет запустить в не- «заражения» компьютера с активиро- твовать только о том, что вполне веванным BufferZone сразу стало понятно, роятно в будущем такие системы стачто что-то не так. Загрузка процессора нут более распространенными. подскочила до 70-80 % и начал активКроме того, BufferZone является отно работать жесткий диск. После пере- личным инструментом, позволяющим Рисунок 3. Маркировка файлов загрузки компьютера в списке процес- запускать неизвестные программы без при использовании BufferZone сов уже отсутствовал service.exe, рабо- боязни нанести ущерб работе операцитающий с папки Windows, а в виртуаль- онной системы. ной папке было обнаружено несколько созданных копий вируса с разными 1. Сайт проекта Trusware – http://www. названиями, что характерно для этого trustware.com. Рисунок 4. Новые опции в контекстном вируса. Если выставить автоматичес2. Яремчук С. Защита Windows-систем меню кую очистку виртуальной папки в конпри помощи CORE FORCE. //«Сисце рабочего дня, то о вирусе можно вотемный администратор», №1, 2006 г. – обще не узнать. С. 54-59.

Что имеем? Рисунок 5. Сообщение о запуске неизвестного файла

№9, сентябрь 2006

Эксперименты с несколькими вирусами не могут дать гарантию стопро-

3. Яремчук С. Чем уникальна общественная система предотвращения атак Prevx1. //«Системный администратор», №2, 2006 г. – С. 56-59.

47


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

Как обнаружить malware-программы? Универсальный метод

Крис Касперски В Windows постоянно обнаруживаются новые дыры, через которые лезет malware, создающая новые процессы или внедряющаяся в уже существующие. Предлагаем вам универсальный метод обнаружения malware, основанный на определении подлинного стартового адреса потока, чего другие приложения (включая могучий отладчик soft-ice) делать не в состоянии.

А

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

48

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

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

Как malware внедряется в компьютер Наиболее примитивные экземпляры malware-программ создают новый процесс, который вниматель-


безопасность ный пользователь легко обнаружит в «диспетчере задач». Конечно, для этого необходимо знать, какие процессы присутствуют в «стерильной» системе и где располагаются их файлы. В частности, explorer.exe, расположенный не в WINNT, а в WINNT\System32, это уже никакой не explorer, а самая настоящая malware-программа! Впрочем, «диспетчер задач» крайне уязвимая штука, и malware-программы без труда скрывают свое присутствие от его взора. То же самое относится к FAR, Process Explorer, tlist и другим системным утилитам, основанным на недокументированной API-функции NtQuerySystemInformation(), экспортируемой динамической библиотекой NTDLL.DLL и потому очень легко перехватываемой с прикладного уровня, без обращения к ядру и даже без администраторских привилегий. Отладчик soft-ice – единственный известный мне инструмент, не использующий NtQuerySystemInformation() и разбирающий структуры ядра «вручную». Спрятаться от него на порядок сложнее, и в «живой природе» такие malware-программы пока не замечены (а лабораторные экземпляры нежизнеспособны и могут обманывать только известные им версии отладчика), так что на soft-ice вполне можно положиться. Для просмотра списка процессов достаточно дать команду «PROC» и проанализировать результат. Кстати, malware-программы, скрывающиеся от «диспетчера задач», немедленно выдают свое присутствие путем сличения «показаний» soft-ice с «диспетчером задач». Один из таких случаев продемонстрирован на рис. 1. Смотрите, soft-ice отображает процесс sysrtl, но в «диспетчере задач» он… отсутствует! Следовательно, это либо malware-программа, либо какойнибудь хитроумный защитный механизм, построенный по root-kit-технологии. В общем – нехорошая программа, от которой можно ждать все что угодно и желательно избавиться как можно быстрее! Д ля до с ти же ния наи больш ей скрытности malware-программа должна не создавать новый процесс, а внедряться в один из уже существующих, что она с успехом и делает. Классический алгоритм внедрения реализуется так:

№9, сентябрь 2006

Рисунок 1. Зловредный процесс sysrtl замаскировал свое присутствие от «диспетчера задач», но не смог справиться с soft-ice

 получив идентификатор процесса-жертвы (что можно сделать, например, через семейство процедур TOOLHELP32), malware-программа «скармливает» его API-функции OpenProcess(), возвращающей дескриптор процесса (или ошибку, если у malware-программы недостаточно прав);  возвращенный дескриптор процесса передается API-функции VirtualAllocEx(), выделяющей в адресном пространстве процесса-жертвы блок памяти требуемых размеров с атрибутами PAGE_READWRITE или PAGE_READ (но тогда все оперативные данные придется хранить в стеке);  поверх выделенного блока копируется зловредный код (который должен быть полностью перемещаемым, т.е. сохранять свою работоспособность независимо от базового адреса загрузки), что осуществляется API-функцией WriteProcessMemory(), которую наличие атрибута PAGE_READ ничуть не смущает, поскольку она наличие атрибута PAGE_WRITE никак не проверяет;  с помощью все тех же процедур TOOLHELP32 malware-программа находит главный поток процесса, получает его идентификатор, который тут же преобразует в дескриптор. В Windows 2000 (и ее благородных потомках) это осуществляется API-функцией OpenThread(), а в более ранних версиях приходилось прибегать к вызову недокументированной native-API-функции NtOpenThread(), экспортируемой библиотекой NTDLL.DLL. Под 9x за-

дача решается «серединным» вызовом API-функции OpenProcress() путем передачи управления по смещению 24h от ее начала и расшифровкой идентификатора операцией XOR со специальным «магическим» словом; добытый дескриптор потока передается API-функции SuspendThread(), останавливающей его выполнение; содержимое контекста остановленного потока читается API-функцией GetThreadContext() с флагом CONTEXT_CONTROL, в результате чего в структуре CONTEXT оказывается значение регистра EIP, указывающего на текущую машинную инструкцию; запомнив полученный EIP, malwareпрограмма тут же корректирует его с таким расчетом, чтобы он указывал на точку входа в ранее скопированный зловредный код, и вызывает API-функцию SetThreadContext(), чтобы изменения EIP вступили в силу, после чего «размораживает» остановленный поток посредством ResumeThread(); во избежание утечки ресурсов дескрипторы процесса и потока закрываются – больше они не понадобятся (хотя далеко не всякая malware-программа заботится о таких мелочах); получив управление, зловредный код создает новый поток вызовом CreateThread() и восстанавливает исходное значение регистра EIP.

Примечание: до появления процессоров, поддерживающих биты NX/XD, предотвращающих выполнение кода в

49


безопасность  получив идентификатор процесса жертвы, malware-про-

грамма «скармливает» его API-функции OpenProcess(), возвращающей дескриптор процесса (или ошибку, если у malware недостаточно прав); возвращенный дескриптор процесса передается API-функции VirtualAllocEx(), выделяющей внутри процесса-жертвы блок памяти требуемых размеров с атрибутами PAGE_EXECUTE; поверх выделенного блока копируется зловредный код (который так же, как и в предыдущем случае, должен быть полностью перемещаемым), что осуществляется API-функцией WriteProcessMemory(); malware-программа вызывает API-функцию CreateRemoteThread(), передавая ей дескриптор процесса и указатель на стартовый адрес потока, находящийся внутри блока памяти, выделенного VirtualAllocEx(); дескриптор процесса и дескриптор удаленного потока, возвращенный CreateRemoteThread(), закрываются, а зловредный код тем временем делает все, что ему вздумается.

Единственный недостаток, присущий последнему способу внедрения, – это требование перемещаемости кода, Рисунок 2. Отладчик soft-ice, пытающийся определить означающее, что его придется писать на Ассемблере, исстартовые адреса потоков, но возвращающий вместо этого нечто необъяснимое пользуя только относительную адресацию, что весьма затруднительно. Усовершенствованный алгоритм внедрения позволяет загружать внутрь чужого процесса свою собственную динамическую библиотеку, для чего достаточно передать функции CreateRemoreThread() в качестве стартового адреса удаленного потока адрес API-функции LoadLibraryA() или LoadLibraryW(), а вместо указателя на аргументы – указатель на имя загружаемой библиотеки. API-функция CreateRemoreThread() вызовет LoadLibraryA/LoadLibraryW вместе с именем библиотеки, в результате чего библиотека загрузится в память, а управление получит процедура DllMain(). Зловредная динамическая библиотека может быть написана на любом языке – хоть на C/C++, хоть на DELPHI, хоть… на Visual Basic, что значительно расширяет круг потенциальных malware-писателей, поскольку Ассемблер знают немногие. Вся беда в том, что имя библиотеки должно находиться в контексте удаленного процесса, а как оно там окаРисунок 3. Process explorer успешно определил стартовые жется?! Существует два пути: самое простое, но не самое адреса двух «честных» потоков, но споткнулся умное, это выделить блок памяти вызовом VirtualAllocEx() о «нечестный» поток и скопировать туда имя через WriteProcessMemory(), но для стеке и куче, malware-программы обычно выделяли в целевом этого процесс должен быть открыт с флагом «виртуальные процессе регион памяти с атрибутами PAGE_READWRITE, а операции» (PROCESS_VM_OPERATION), прав на которые теперь – PAGE_EXECUTE_READWRITE, что, впрочем, слиш- у malware-программы может и не быть. ком заметно, поэтому грамотные malware-писатели выдеВыручает тот фак т, что библиотеки NTDLL.DLL ляют блок с атрибутами PAGE_EXECUTE, что никак не пре- и KERNEL32.DLL во всех процессах проецируются по одипятствует функции WriteProcessMemory() записывать туда наковым адресам. Получив базовый адрес загрузки зловредный код. NTDLL.DLL или KERNEL32.DLL с помощью LoadLibrary(), Описанный алгоритм работает на всем зоопарке опера- malware-программа сканирует свое собственное адресное ционных систем, но довольно громоздок и сложен в реали- пространство на предмет наличия ASCIIZ-строки, совершензации, поэтому malware-программы, ориентированные толь- но уверенная в том, что в удаленном процессе эта строка ко на поражение NT, предпочитают создавать удаленный окажется расположенной по тому же самому адресу. Остапоток API-функции CreateRemoteThread(), при этом после- ется только переименовать зловредную динамическую бибдовательность выполняемых ею действий выглядит так: лиотеку в эту самую строку. Кстати, приятным побочным

50


безопасность эффектом такого алгоритма становится автоматическая генерация псевдослучайных имен (если, конечно, malwareпрограмма не будет использовать первую попавшуюся ASCIIZ-строку). Обобщив сказанное, мы получаем следующий план:  выбрав идентификатор процесса-жертвы, malware-программа «скармливает» его API-функции OpenProcess(), возвращающей дескриптор процесса (или ошибку, если у malware-программы недостаточно прав);  определив базовый адрес загрузки NTDLL.DLL или KERNEL32.DLL, malware-программа ищет подходящую ASCIIZ-строку, переименовывая свою, заранее созданную, динамическую библиотеку;  определив а дрес API-функРисунок 4. Определение стартового адреса потока с помощью отладчика OllyDbg ции LoadLibrar yA / LoadLibrar yW, malware -программа перед ает его API - функции LoadLibraryA()/LoadLibraryW() – этот поток создан malwareCreateRemoteThread() вместе с указателем на имя биб- программой или чем-то сильно на нее похожим. Вот тутлиотеки, которую необходимо загрузить внутрь целево- то и начинается самое интересное! Ни soft-ice, ни process explorer Марка Руссиновича определять стартовые адрего процесса;  дескриптор процесса и дескриптор удаленного пото- са не умеют (хоть и пытаются). Они очень часто ошибаютка, возвращенный CreateRemoteThread(), закрываются, ся, особенно при работе с потоками, созданными malwareа зловредный код, расположенный в DllMain(), делает программами. Давайте напишем «макетную» программку, создаювсе что ему вздумается. щую поток тем же самым методом, что и malware-програмВот три основных алгоритма внедрения в атакуемый мы, и попробуем обнаружить факт «вторжения» при помопроцесс, которыми пользуется порядка 90% всех malware- щи подручных утилит. Предельно упрощенный исходный текст «макетника» выглядит так: программ.

По следам malware, или Как обнаружить внедрение Если количество процессов в системе вполне предсказуемо, то потоки многократно создаются/уничтожаются в ходе выполнения легальных программ, и вопрос «сколько потоков должна иметь «стерильная» программа» лишен смысла. Достаточно открыть «диспетчер задач» и, некоторое время понаблюдав за колонкой «потоки», прийти в полное отчаяние. Но… если присмотреться повнимательнее, можно обнаружить, что потоки, созданные malware-программами, значительно отличаются от всех остальных. При внедрении malware-программы по двум первым сценариям зловредный код располагается в блоках памяти, выделенных VirtualAllocEx() и имеющих тип MEM_PRIVATE, в то время как нормальные исполняемые файлы и динамические библиотеки загружаются в блоки памяти типа MEM_IMAGE. При внедрении по третьему сценарию зловредный код как раз и попадает в такой блок, но стартовый адрес его потока совпадает с адресом функции LoadLibraryA() или LoadLibrayW(), а указатель на аргументы содержит имя зловредной библиотеки. Таким образом, алгоритм обнаружения вторжения сводится к определению стартовых адресов всех потоков, и если он лежит внутри MEM_PRIVATE или совпадает с адресом

№9, сентябрь 2006

Листинг 1. «Макетная» программа va_thread.c, создающая поток тем же самым методом, что и malware // код потока, который ничего не делает, а только мотает цикл thread(){while(1);} main() { void *p; // переменная многоцелевого использования // создаем «честный» поток CreateThread(0,0,(void*)&thread,0x999,0,&p); // создаем «нечестный» поток так, как это делает malware // выделяем блок памяти из кучи, копируем туда // код потока и вызываем CreateThread p = VirtualAlloc(0, 0x1000, MEM_COMMIT, ↵ PAGE_EXECUTE_READWRITE); memcpy(p,thread,0x1000);CreateThread(0,0,p,0x666,0,&p);

}

// ждем нажатия на любую клавишу getchar();

Компилируем с настройками по умолчанию. В случае MS VC++ командная строка выглядит так: cl.exe va_thread.c

и запускаем. Загрузка процессора (даже на двухпроцессорной машине!) сразу подпрыгивает до 100%, но так и долж-

51


безопасность но быть, поскольку мы создаем два потока, мотающих бесконечный цикл, один из которых «честный», а другой «зловредный» (имитирующий malware-программу). Плюс главный поток приложения, ожидающий нажатия на клавишу, по которой происходит завершение программы. Итого три потока. Загружаем soft-ice и нажимаем <CTRL-D>, дожидаясь его вызова, после чего даем команду: THREAD x va_thread

нечто очень интересное (см. рис. 4), а именно – два двойных слова: 666h и 520000h. Первое из них напоминает аргумент, переданный «нечестному» потоку (см. листинг 1), а по второму расположена функция, мотающая бесконечный цикл, весьма напоминающая нашу функцию thread(). Обратившись к карте памяти («View → Memory»), мы убедимся, что этот адрес принадлежит региону MEM_PRIVATE, выделенному VirtualAlloc(). Аналогичным образом определяются стартовые адреса и двух других потоков. Свершилось! Мы научились определять подлинные стартовые адреса «честных» и «нечестных» потоков вместе с переданным им указателем на аргументы. Однако использовать для этих целей OllyDbg не слишком удобно. Потоков в системе много, и пока их все вручную переберешь… рабочий день давно закончится и солнце зайдет за горизонт. Вообще-то можно написать простой скрипт (OllyDbg поддерживает скрипты), но при этом отладчик придется всюду таскать за собой, что напрягает. Лучше (и правильнее!) создать свой собственный сканер, тем более что он легко укладывается в сотню строк и на его разработку уйдет совсем немного времени. Полный исходный текст содержится в файле ProcList.c, находящемся на сайте журнала www.samag.ru в разделе «Исходный код», а здесь для экономии места приводятся лишь ключевые фрагменты. Но прежде чем углубляться в теоретическую дискуссию, проверим сканер в работе. Наберем в командой строке:

для отображения детальной информации о потоках и смотрим на полученный результат (см. рис. 2). Да! Тут есть на что посмотреть! Стартовый адрес первого потока (Start EIP) определен как KERNEL32!SetUnhandledExceptionFilter+001 (77E878C1h), а двух остальных – KERNEL32!CreateFileA+00C3 (77E92C50h), что вообще ни в какие ворота не лезет. Отбросив бесполезный soft-ice в сторону, обратимся к process explorer. Щелкнув правой клавишей мыши по процессу «va_thread» (или нажав <SHIFT-F10>, если мыши под рукой нет), идем в «Properties» и открываем вкладку «Threads». Что мы видим? Process explorer корректно определил адреса двух потоков (см. рис. 3): va_thread+0x1405 (основной системный поток – если заглянуть дизассемблером по этому адресу, мы обнаружим точку входа в файл va_thread.exe) и va_thread+0x1000 («честный» поток, созданный вызовом CreateThread(0,0,(void*)&thread,0x999,0,&p) – proclist.exe > out это следует из того, что по адресу va_thread+0x1000 расположена процедура thread). Но вот вместо стартового адреса третьего, «нечестного» потока, process explorer вы- и загрузим образовавшийся файл out в любой текстодал какую-то ерунду, «засунув» его внутрь KERNEL32.DLL, вой редактор (например, встроенный в FAR). Нажмем а точнее – KERNEL32.DLL + B700h, где его заведомо не мо- <F7> (search) и введем имя интересующего нас процесса («va_thead.exe»). Запомним его идентификатор (в данном жет быть. Если бы process explorer ошибался только на «нечес- случае равный 578h) и, снова нажав <F7>, введем его тных» потоках, он вполне бы сгодился для определения для поиска принадлежащих ему потоков. Вот они, переmalware-программ, но, увы, он ошибается слишком часто, численные в листинге 2, находятся рядом. в том числе и на легальных потоках, созданных операциЛистинг 2. Фрагмент отчета сканера proclist.exe, онной системой или ее компонентами. определяющего стартовые адреса всех потоков вместе Исследования, проведенные мной, показали, что истинс типами блоков памяти ный стартовый адрес потока лежит на дне пользовательLoadLibraryA at : 79450221h ского стека во втором или третьем двойном слове (счиLoadLibraryW at : 794502D2h ----------------------------------------------------тая от единицы), а следом на ним идет указатель на аргуszExeFile : va_thread.exe менты, в чем легко удостовериться с помощью отладчиcntUsage : 0h ка OllyDbg. th32ProcessID : 578h … Запустив отладчик, в меню «File» выбираем «Attach» --thr-----------------------------------------------и подключаемся к процессу «va_thread.exe», после чего th32ThreadID : 5E0h th32OwnerProcessID : 578h открываем окно «Threads» (в меню «View») и видим не три, … а целых четыре потока! Все правильно – четвертый поток handle : 3D8h создан отладчиком для своих нужд. Это единственный поESP : 0012FD30h start address : 00401595h ток, чье поле entry (точка входа) не равно нулю. Стартоpoint to args : 00000000h вые адреса трех остальных потоков OllyDbg определить type : MEM_IMAGE [0012FFF0h: 00000000 00000000 00401595 00000000] не смог, предоставив нам возможность сделать это само--thr-----------------------------------------------стоятельно. th32ThreadID : 608h Дважды щелкнув мышью по любому из потоков, мы th32OwnerProcessID : 578h … попадаем внутрь его «закромов». Отладчик обновляет соhandle : 3D8h держимое регистров, окно CPU, дамп памяти и окно стеESP : 0051FFB4h start address : 00401000h ка, которое нас интересует больше всего. Прокручиваем point to args : 00000999h мышью ползунок до самого конца и обнаруживаем на дне

52


безопасность type : MEM_IMAGE [0051FFF0h: 00000000 00401000 00000999 00000000] --thr-----------------------------------------------th32ThreadID : 5C8h th32OwnerProcessID : 578h … handle : 3D8h ESP : 0062FFB4h start address : 00520000h point to args : 00000666h type : MEM_PRIVATE [0062FFF0h: 00000000 00520000 00000666 00000000]

ти говоря, считывать контекст можно и без остановки потока. На Windows 2000 (и ее потомках) это делается так (более ранние версии требуют использования native-API-функции NtOpenThread() и, поскольку доля таких систем сравнительного невелика, здесь они не рассматриваются): Листинг 4. Фрагмент кода, считывающего значение ESP потока с идентификатором thr.th32ThreadID HANDLE ht; CONTEXT context; context.ContextFlags = CONTEXT_CONTROL;

Первые два потока находятся внутри блоков MEM_IMAGE, // преобразуем идентификатор потока в дескриптор и ни у одного из них стартовые адреса не совпадают с адреht = OpenThread(THREAD_GET_CONTEXT, 0, thr.th32ThreadID); сами функций LoadLibraryA()/LoadLibraryW(), следовательно, // считываем регистровый контекст это «честные» потоки, созданные легальным путем. А вот GetThreadContext(ht,&context); третий поток лежит внутри региона MEM_PRIVATE, выде// закрываем дескриптор ленного API-функцией VirtualAlloc(). Значит, это «нечестCloseHandle(ht); ный» поток, и мы не бьем тревогу только потому, что сами же его и создали. Заметим, что API-функция OpenThread() не входит Теперь, как было обещано, обсудим технические детали. ни в заголовочные файлы, ни в библиотеку KERNEL32.LIB, Прежде всего нам потребуется получить список потоков, поставляемую вместе с компилятором Microsoft Visual C++ имеющихся в системе. Это можно сделать как документиро- 6.0, поэтому, необходимо либо скачать свежий Platform SDK ванными средствами через TOOLHELP32, так и недокумен- (а это очень-очень много мегабайт), либо загружать ее дитированной native-API-функций NtQuerySystemInformation(), намически через GetProcAddress(), либо преобразовать на которой TOOLHELP32, собственно говоря, и осно- KERNEL32.DLL в KERNEL32.LIB (линкер unilink от Юрия Хаван. Конечно, если она перехвачена malware-программой, рона это сделает автоматически). мы никогда не увидим зловредных потоков, но техника Зная идентификатор процесса, владеющий данным пообнаружения/снятия перехвата – это тема отдельной ста- током (thr.th32OwnerProcessID), мы можем открыть его APIтьи, пока же придется ограничиться тем, что есть (на вся- функцией OpenProcerss(), получив доступ к его адресному кий случай сравните показания TOOLHELP32 c командой пространству (если, конечно, у нас на это есть права). Откры«THREAD» отладчика soft-ice, вдруг обнаружатся какие-то вать мы будем с флагами PROCESS_QUERY_INFORMATION различия). (просмотр виртуальной памяти) и PROCESS_VM_READ Короче, список потоков в простейшем случае получа- (чтение содержимого виртуальной памяти). Следующий шаг – определение дна пользовательскоется так: го стека. Передав API-функции VirtualQueryEx() значение Листинг 3. Фрагмент кода, ответственный за перечисление ESP, полученное из регистрового контекста, мы узнаем всех имеющихся потоков базовый адрес выделенного блока (mbi.BaseAddress) и его #include <stdio.h> размер в байтах (mbi.RegionSize). Путем алгебраического #include <windows.h> сложения базового адреса с его длиной мы получим ука#include <tlhelp32.h> затель на первый байт памяти, лежащий за концом стека. print_thr(THREADENTRY32 thr) Отступив на несколько двойных слов назад (например, на { printf("cntUsage : %Xh\n",thr.cntUsage); четыре), нам остается только прочитать его содержимое printf("th32ThreadID : %Xh\n",thr.th32ThreadID); API-функцией ReadProcessMemory(). printf("th32OwnerProcessID : ↵

}

%Xh\n",thr.th32OwnerProcessID); printf("tpBasePri : %Xh\n",thr.tpBasePri); printf("tpDeltaPri : %Xh\n",thr.tpDeltaPri); printf("dwFlags : %Xh\n",thr.dwFlags);

main() { HANDLE h; THREADENTRY32 thr; int a; // создаем «слепок» потоков h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

}

// перебираем все потоки один за другим thr.dwSize = sizeof(THREADENTRY32); ↵ a = Thread32First(h, &thr); if (a && print_thr(thr)) ↵ while(Thread32Next(h, &thr)) print_thr(thr);

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

№9, сентябрь 2006

Листинг 5. Фрагмент кода, определяющий положение дна стека и считывающий байт GET_FZ с его конца (в которых хранится стартовый адрес потока) #define GET_FZ 4 // на сколько двойных слов отступать DWORD buf[GET_FZ]; DWORD x; HANDLE hp; MEMORY_BASIC_INFORMATION mbi; // открываем процесс, владеющий данным потоком hp = OpenProcess(PROCESS_VM_READ| ↵ PROCESS_QUERY_INFORMATION,0,thr.th32OwnerProcessID); // определяем параметры блока памяти, на который // указывает регистр ESP VirtualQueryEx(hp, (void*)context.Esp, &mbi, sizeof(mbi)); // вычисляем положение дна стека x = (DWORD) mbi.BaseAddress + mbi.RegionSize; // читаем GET_FZ слов со дна стека в буфер buf ReadProcessMemory(hp,(char*)x-GET_FZ*sizeof(DWORD), ↵ buf,GET_FZ*sizeof(DWORD),&a);

53


безопасность // закрываем дескриптор процесса CloseHandle(hp);

Ввиду того, что положение стартового адреса относительно дна стека непостоянно, применяется следующий эвристический алгоритм: если третье двойное слово со дна стека равно нулю, то стартовый адрес потока находится во втором двойном слове, а указатель на аргументы – в первом, в противном случае стартовый адрес находится в третьем двойном слове, а указатель на аргументы – во втором. Конечно, предложенная схема не очень надежна: в некоторых случаях стартовый адрес находится в первом двойном слове, а бывает (хоть и редко), что на дне стека его вообще нет. В общем, этот вопрос еще требует дальнейших исследований и тщательной проработки, а пока воспользуемся тем, что дают: Листинг 6. Декодирование содержимого буфера buf и определение стартового адреса потока эвристическим методом DWORD st_adr; // определяем стартовый адрес потока st_adr = ((buf[GET_FZ-3])?buf[GET_FZ-3]:buf[GET_FZ-2]); // выводим стартовый адрес на экран или DEADBEEF, // если стартовый адрес определить не удалось printf("start address : ↵ %08Xh\n",st_adr?st_adr:0xDEADBEEF); // определяем указатель на аргументы потока // и выводим его на экран printf("point to args : ↵ %08Xh\n", ↵ ((buf[GET_FZ-3])?buf[GET_FZ-2]:buf[GET_FZ-1]));

Остается последнее – «скормить» полученный стартовый адрес потока API-функции VirtualQueryEx() и определить тип региона, к которому он принадлежит (MEM_IMAGE, MEM_PRIVATE или MEM_MAPPED): Листинг 7. Фрагмент кода, определяющий тип блока памяти, к которому принадлежит стартовый адрес потока // определение типа региона памяти, // к которому принадлежит стартовый адрес VirtualQueryEx(hp, (void*)st_adr, &mbi, sizeof(mbi)); // декодирование полученного результата // и вывод его на экран printf("type : %s\n", (mbi.Type==MEM_IMAGE)?"MEM_IMAGE": (mbi.Type==MEM_MAPPED)?"MEM_MAPPED": (mbi.Type==MEM_PRIVATE)?"MEM_PRIVATE":"UNKNOWN");

Объединив все фрагменты мозаики воедино, мы получим вполне работоспособный сканер, показавший при тестировании на большой коллекции malware-программ вполне удовлетворительный результат – ни одного ложного срабатывания и до 90% обнаруженной «заразы» (естественно, речь идет только о malware-программах, внедряющихся в уже существующие процессы, а не создающих новый).

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

54

еще можно хоть как-то бороться, например, просканировать все MEM_PRIVATE-блоки и попытаться найти в них машинный код, поискать в стеке адреса возврата, смотрящие в MEM_PRIVATE, и т. д., гораздо хуже, что существует возможность внедрения в атакуемый процесс без создания нового потока! Самое простое, что только приходит в голову, – прочитать текущий EIP одного из потоков атакуемого процесса, сохранить лежащие под ним машинные команды, после чего записать крохотный код, вызывающий LoadLibrary() для загрузки зловредной библиотеки в текущий контекст и устанавливающий таймер API-функций SetTimer() для передачи зловредному коду управления через регулярные промежутки времени. Сделав это, malware-программа восстанавливает оригинальные машинные команды, и процесс продолжает выполняться как ни в чем не бывало. При желании можно обойтись и без таймера. Достаточно воспользоваться асинхронными сокетами. В отличие от синхронных, они не блокируют выполнение текущего потока, а немедленно отдают управление, вызывая call-back-процедуру при наступлении определенного события (например, при подключении удаленного пользователя по back-door-порту, открытого malware-программой). Также malware-программа может внедриться в процедуру диспетчеризации сообщений или подменить адрес оконной процедуры для главного окна GUI-приложения. Во всех этих случаях зловредный код будет выполняться в контексте уже существующего потока, и malware-программа сможет обойтись без создания нового. Такие способы внедрения предложенный сканер не обнаруживает. Правда, это не сильно ему мешает, поскольку в живой природе подобных malware-программ до сих пор замечено не было. Универсальных способов борьбы против них нет. Единственное, что можно предложить, – периодически выводить список динамических библиотек, и если вдруг среди них появилась новая – это сигнал! Но если malware-программа откажется от загрузки DLL, размещая свой код в свободном месте (например, в конце кодовой секции), мы опять проиграем войну. Впрочем, не стоит пытаться решить проблемы задолго до их появления. Возможно, завтра случится глобальное оледенение (землетрясение, наводнение), мы все умрем, и бороться с malware-программами станет некому и незачем. 1. OllyDbg – замечательный и абсолютно бесплатный отладчик, собравший вокруг себя целое сообщество поклонников: http:// www.ollydbg.de; 2. soft-ice – 3 апреля 2006 Compuware прекратила продажу DriverStudio, похоронив soft-ice и отрезав все пути его легального приобретения, тем не менее прежние версии до сих пор можно найти в Сети, в том числе и в магазинах, торгующих лицензионными дисками, завалявшимися на складе. 3. process explorer – в июне 2006 года фирма Марка Руссиновича была куплена Microsoft и хотя Марк обещает, что его утилиты останутся бесплатными, скорее всего они будут бесплатны только для легальных пользователей Windows, так что спешите скачивать: http://www.sysinternals.com/Utilities/ ProcessExplorer.html.



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

Пират виртуального мира «Перевоспитавшийся» хакер Кевин Митник решает новые головоломки. Теперь он защищает компании от былых коллег.

К

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

56

гим Сильвером или капитаном Воробьем. Такой необыкновенный случай представился участникам конгресса Interop Moscow, который этим летом впервые прошел в России. Его выступление слушали затаив дыхание и задержали дорогого московского гостя на целый час. А мне к тому же повезло взять у знаменитого хакера небольшое интервью.

Милый лжец На лекцию господин Митник вышел так, как выходит к публике актер, уверенный в своей популярности. Кстати,

в кино суперхакер действительно снимался, когда вышел из тюрьмы после пятилетней отсидки и должен был выполнять жестокое предписание властей – не пользоваться компьютером, не работать техническим консультантом и даже не писать о компьютерных технологиях без специального разрешения. Похоже, что о прошлом Кевин Митник не слишком сожалеет. Впрочем, он рассказывает о нем так, словно взломы самых известных компаний совершал не он, а скажем, его младший братик – хулиган, но такой милашка: «Я когдато был шутником, любил разыгрывать, любил проделки. Я помню случай, когда я получил доступ к компьютеру телефонной компании. Я нашел возможность проникнуть в телефонный справочник Род-Айленда. И когда кто-то запрашивал информацию, они выходили на меня. Представляете? Мне 17 лет всего было. Мне понравилась эту шутка. Но самый лучший розыгрыш получился с Макдональдсом. Я связался с частотой, на которой переговаривались водители, и ловил все их сообщения. Представляете, звонил и говорил: «Такой-то клиент просит доставить обед…». Много шутил, в общем». Одну историю из своей буйной молодости 43-летний Митник рассказал подробно, но не потому, что хотел похвастаться своей ловкостью, а в назидание тем, кто может попасться на удочку его коллег-хакеров: «Еще в 1992 году я скрывался от ФБР, от правительства и от прочих правоохранительных органов США. Я работал в Денвере в юридической компании под именем Эрик Вайс. Почему Эрик Вайс? Потому что это реальное имя Гарри Гудини. Мой друг занимался телефонами «Моторола», и я как хакер хотел узнать, что там за технология. Я решил, что это очень передовая технология. Это было 15 лет назад, не забывайте. Однажды я пораньше ушел из офиса и позвонил в «Моторолу» по телефону бесплатной информации. Я сказал: «Привет, я Эрик. Мне нужен менеджер проекта по продаже сотовых телефонов».


человек номера Мне ответили: «Этим занимается такой-то отдел в Иллинойсе». Я попросил: «Дайте мне телефон этого отдела». Позвонил туда, опять объяснил: «Я Эрик, мне нужен менеджер проекта по распространению мобильных телефонов». Меня отфутболивали к разным сотрудникам раз восемь и в конце концов направили к нужному человеку. Но менеджер оказалась в отпуске, мне вежливо рассказали: «Она вернется через две недели, но если вы хотите, чтобы вам помогли, звоните Алише». Конечно, я позвонил Алише! И сказал: «Я Эрик из Департамента по распространению телефонов. Такая-то уехала в отпуск?» – «Да, уехала». «Какая жалость! Прежде чем уезжать, она мне должна была выслать код источника». – «И как, выслала?» – «Нет, она мне ничего не выслала, может быть, вы мне поможете?» – «Да, а какая версия нужна?» – «Я говорю: давайте новую версию». «Хорошо, сейчас гляну в систему». Я помог Алише разобраться с системой, дал ей свой IP-адрес и сказал: «Попытайтесь связаться с ним». Она связалась два или три раза, но что-то не срабатывало. Алиша забеспокоилась: «Эрик, здесь что-то с безопасностью. Я сейчас поговорю с нашим советником по безопасности». Она выяснила, что надо использовать определенный прокси-сервер. Я сказал: «Хорошо, давайте». И прежде чем я дошел до дома, у меня уже был на компьютере код исходника и все остальное, просто благодаря тому, что я сделал несколько звонков. Как видите, достаточно найти человека, у которого есть информация, и раскрутить его». К чести Кевина Митника, он тут же признался, что и сам бывает обманут. Последний такой случай произошел с ним буквально накануне лекции, когда хакер возвращался из Петербурга, где тоже читал лекцию в рамках своего нынешнего визита в Россию. Кевин и его сотрудница наняли носильщика, чтобы перенести вещи. У поезда парень сгрузил чемоданы и подбежал к иностранцу с вопросом: «Где деньги?». Митник спросил: «Вам еще не заплатили?» – «Нет». Носильщик получил свои 500 рублей, исчез. И тут же выяснилось, что коллега Митника уже заплатила пройдохе такую же сумму». Вот потому знаменитый американец и повторяет назидательно: «Люди

№9, сентябрь 2006

считают: со мной это не случится, я не шей же компании и хочет создать ватакой дурак, чтобы выдавать пароль! шу учетную запись! Бойтесь, вы полуЯ не буду пристегиваться в машине, чили по электронной почте сообщение потому что я хороший водитель. Ава- с приложением якобы от Windows, вам предлагается это приложение устанории случается только с другими!». вить. Как только ваши данные входят в систему, вы уже раскрыли свои коДобрый советчик Собственно, лекции Кевин Митник чи- ординаты! Бойтесь и такой «шутки»: тает с одной целью – предупредить лю- «Вы можете также получить е-mail с гидей об опасности и вооружить знания- перссылкой на сайт какой-то компании, ми против мошенников. Звучит стран- в услугах которой, как известно хакеру, но, ведь мы знаем, что сам лектор не- вы нуждаетесь. Стоит нажать на ссыдавно был «в стане врага». Но с другой лочку – и специальная программа свястороны, все логично: никто не станет зывает вас с атакующим». сомневаться в компетентности главы Вот какой мудрый совет дает КеMitnick Security Consulting. вин Митник бизнесменам, которые хоПохоже, Кевина просто шокирует тят избежать взлома: «Я бы рекомендоверчивость его сограждан: «Как ду- довал следующее. Компании по-размаете, сколько людей согласились от- ному разрабатывают свою политику дать свой пароль после телефонно- безопасности. Одни создают ее с пого звонка якобы от Налоговой служ- мощью своих сотрудников, другие набы США? 25 из ста. На рождество сис- нимают кого-то со стороны. Во втором темные администраторы, пользовате- случае есть опасность, что у людей не ли, сотрудники компании выдали свои будет мотивации следовать правилам. пароли за мелкие сувениры. Из 10 че- Если же сотрудники компании будут ловек семь отдали свои пароли. Вы мо- сами разрабатывать правила безопасжете создавать систему безопаснос- ности, то они начнут более тщательно ти, и ничего не помогает. Люди сов- их выполнять. Они будут думать так: сем не чувствуют опасности! Социаль- «Раз я участвовал в этом деле, то долная инженерия проще, чем несанкци- жен это как-то применять в своей рабоонированные попытки доступа. Обыч- те». Таким образом, вы сможете измено преступник находит кого-то из ком- нить вашу корпоративную культуру и пании, побуждает его войти в систе- мотивировать ваш персонал. Подумайму и проникает туда же вслед за об- те об этом. Это ведь важно для вашей манутым сотрудником. И хакер поч- компании, правда? Если вы наказыти ничем не рискует, он даже не пла- ваете своих сотрудников за невыполтит за связь. Глупость и доверчивость – нение правил, это, конечно, тоже спокачества, которыми страдают многие соб, но это не так показательно. Нужсотрудники компаний. Социальный ин- но, чтобы люди видели, что их работа женеринг – это самая большая пробле- приносит реальную пользу. И тогда рема в нашем гиперпространстве. Необ- зультат будет намного лучше». ходимы какие-то технологии, которые защищают все звенья цепи». Этичный хакер Митник рассказал о наиболее рас- Мне почему-то казалось, что Митник пространенных способах атаки и даже не захочет давать мне интервью. Вот продемонстрировал опыт с сотовым те- если бы со мной был оператор с камелефоном. Оказывается, наши мобиль- рой… Но он посмотрел мне в глаза, миники совершенно беззащитны перед нуту поразмышлял и сказал, что погонастоящим специалистом своего де- ворит, вот только минут пять побеседула. Похоже, американские власти были ет по телефону. Пять минут превратиправы, когда не позволяли Кевину Мит- лись в час, но неважно, потому что вот нику в тюрьме пользоваться даже не- он, Кевин Митник, и я задаю ему первинным лэптопом без модемной связи. вый вопрос: А если разрешали поработать на ком– Почему вы выбрали эту професпьютере, сразу его уничтожали. сию? Разнообразные виды социальной – Я начал изучать эту сферу мноинженерии – конек Митника. Он приво- го лет назад в качестве фрикера (тедит примеры один за другим. Бойтесь, лефонного хулигана. – О.Р.) и хакера. если вам звонит якобы сотрудник ва- Я действовал в одиночку, мне было ин-

57


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

Кевин Митник с выступлением на конференции Interop Moscow 2006

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

58

определять наличие слабых мест рожными… Неосторожными! Люди в системе компьютерной безопаснос- не глупы, они беспечны. – Наш мир опасен – войны, конфти. Да, это образ мышления. – Хакер – это человек, который лю- ликты, терроризм и тому подобное. И сфера IT – лишь отражение того, бит риск, опасность? – Да, взлом – это риск, это своего что происходит в обществе. Это зеррода приключение, и опасность вполне кало, вы не находите? реальна. Это – добровольное принятие – Ну, в чем-то да…Что-то вроде повызова, здесь есть интрига… Да. ля боя, где надо отстреливаться. Здесь – Что вам нравится в этом деле – тоже нет никаких правил. Это как «Диуход от скучной действительности?.. кий Дикий Запад» в американской ис– Ну да, конечно! Это волнующе, тории… Это опасная работа, это опасинтересно и развлекательно... Одна- ная сфера деятельности, где вы должко в последнее время хакерство имеет ны защищать себя, чтобы не стать тенденцию становиться все более уг- жертвой. – Так, может быть, людям не нарожающим для общества. Кстати, недавно я был в Боготе, это Колумбия, до пользоваться Интернетом, вообще и зашел на пару минут в магазин, тор- компьютерами, раз это так опасно? – Я так не думаю. Вы знаете, масса гующий компьютерами. Там я увидел эту женщину (Митник показал на мо- людей на рубеже 21 века не делали пониторе своего лэптопа фотографию), купок – потому что боялись. Феномен у которой на шее была вот эта штука. Миллениума, знаете ли… Я не боюсь, Вот вам и представление людей о бе- поскольку я человек квалифицированзопасности. Знаете, что это такое? ный и знаю как справиться с компью– Нет. терными мошенниками. И могу другим – Это телефон, на дисплее которого предложить мою помощь… высвечивается пароль доступа в течеЯ открыла рот, чтобы задать следуние 60 секунд. Любой может его уви- ющий вопрос. Но у Кевина заверещал деть и узнать пароль, ведь телефон ви- телефон. «СМСка пришла, – виновато сит у нее на шее и дисплей прекрасно сообщил он мне. – Вы простите, но мне надо идти». И ушел со свежим номевсем виден. Ну, не глупо ли? – Да уж… Это опасно. ром «Системного администратора» – Разумеется. Как можно выжить под мышкой. Вдруг пригодится? в этом мире при таком легкомысленОксана Родионова, ном отношении? фотографии предоставленны – Вы считаете людей глупыми? организаторами Interop Moscow – Нет, просто недостаточно осто-


bugtraq Множественные уязвимости в Mozilla Firefox Программа: Mozilla Firefox версии до 1.5.0.5, Mozilla SeaMonkey версии до 1.0.3, Mozilla Thunderbird версии до 1.5.0.5. Опасность: Критическая. Описание: 1. Уязвимость существует из-за ошибки при обработке очистки JavaScrip-ссылок на фрейм или окно. Удаленный пользователь может выполнить произвольный JavaScript-код в браузере жертвы. 2. Уязвимость существует из-за ошибки при обработке очистки JavaScrip-ссылок на свойства объекта window. navigator. Удаленный пользователь может выполнить произвольный код, если страница заменяет navigator до запуска Java. 3. Повреждение памяти обнаружено при обработке одновременных XPCOM-событий во время использования удаленного объекта таймера. Удаленный пользователь может выполнить произвольный код на целевой системе. 4. Уязвимость существует из-за недостаточной проверки прав доступа к стандартным DOM-методам объекта верхнего уровня (например, document.getElementById()). Удаленный пользователь может выполнить произвольный код сценария в браузере жертвы в контексте безопасности произвольного сайта. 5. Уязвимость состояния операции существует при удалении временных JavaScript-файлов, если они используются в это время для создания нового объекта Function. Удаленный пользователь может выполнить произвольный код на целевой системе. 6. Уязвимость существует из-за большого количества ошибок в JavaScript engine в механизме garbage collection при обработке длинных строк, передаваемых методом toSource(). Удаленный пользователь может выполнить произвольный код на целевой системе. 7. Уязвимость существует в JavaScript-функциях, у которых родительский объект создан с помощью стандартного конструктора Object(), который может быть переопределен в сценарии. Удаленный пользователь может выполнить код с повышенными привилегиями, если конструктор Object() возвращает ссылку на привилегированный объект. 8. Уязвимость существует из-за ошибки при обработке PAC (Proxy AutoConfig) сценария. Злонамеренный PAC прокси сервер может выполнить произвольный сценарий в браузере жертвы с повышенными привилегиями. 9. Уязвимость существует из-за ошибки в сценариях, наделенных привилегиями UniversalBrowserRead. Удаленный пользователь может повысить свои привилегии на системе. 10. Уязвимость существует из-за ошибки в конструкции XPCNativeWrapper(window).Function(...). Удаленный пользователь может выполнить произвольный код сценария на целевой системе в контексте безопасности произвольного сайта. 11. Повреждение памяти обнаружено при вызове функции nsListControlFrame::FireMenuItemActiveEvent(); обнаружено также несколько потенциальных переполнений буфера и ошибок повреждения памяти. Удаленный пользователь

№9, сентябрь 2006

может выполнить произвольный код на целевой системе. 12. Уязвимость существует из-за ошибки при обработке chrome: URI, которые могут ссылаться на произвольные файлы и запускать их с повышенными привилегиями. URL производителя: www.mozilla.com. Решение: Установите последнюю версию с сайта производителя.

Выполнение произвольного кода при обработке DNS-расширений в Microsoft Windows Программа: Windows 2000, Windows XP, Windows 2003. Опасность: Критическая. Описание: 1. Уязвимость существует из-за ошибки в проверке границ данных в Winsock API при обработке имен хостов. Злоумышленник может обманом заставить пользователя посетить злонамеренный сайт и выполнить произвольный код на целевой системе. 2. Уязвимость существует из-за ошибки проверки границ данных в службе DNS Client при обработке ответов от DNS-сервера. Удаленный пользователь может с помощью специально сформированного DNS-ответа выполнить произвольный код на целевой системе. URL производителя: www.microsoft.com. Решение: Установите исправление с сайта производителя.

Переполнение буфера в Microsoft Visual Basic for Applications Программа: Microsoft Works Suite 2006, Microsoft Works Suite 2005, Microsoft Works Suite 2004, Microsoft Visual Basic for Applications SDK 6.x, Microsoft Visio 2002, Microsoft Project 2002, Microsoft Project 2000, Microsoft Office XP, Microsoft Office 2000, Microsoft Access 2000. Опасность: Критическая. Описание: Уязвимость существует из-за ошибки проверки границ данных при обработке свойств документа. Удаленный пользователь может с помощью специально сформированного документа вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.microsoft.com. Решение: Установите исправление с сайта производителя.

Переполнение буфера в службе Server в Microsoft Windows Программа: Windows 2000, Windows XP, Windows 2003. Опасность: Критическая. Описание: Уязвимость существует из-за ошибки проверки границ данных при обработке RPC-трафика. Удаленный пользователь может послать специально сформированный пакет на порт 139/TCP или 445/TCP и выполнить произвольный код на целевой системе. URL производителя: www.microsoft.com. Решение: Установите исправление с сайта производителя.

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

59


web

Ajax. Новое слово в разговоре клиента и сервера

Алексей Мичурин Разговоры о новой веб-технологии Ajax начались в кругах специалистов примерно год назад, хотя ждали её уже давно. А после того, как Ajax взяли на вооружение такие веб-гиганты, как google и gmail, технологией стали интересоваться практически все: от руководителей крупных проектов до начинающих веб-мастеров.

М

ожно ли описать целую технологию в журнальной статье? Наверно, нет. Но нам повезло, ведь...

...Ajax – это не технология Удивлены? Давайте разберёмся, из чего же складывается Ajax. Это смесь технологий, которые уже всем хорошо знакомы:  CSS (Cascading Style Sheets) – набор средств для описания внешнего вида HTML-конструкций.

60

 DOM (Document Object Model) – формальное представление HTMLили XML-документа, позволяющее управлять его элементами: создавать, удалять, изменять свойства.  JavaScript – язык – двигатель первых двух технологий. Знакомое сочетание? Конечно! Это пресловутый DHTML. Ajax дополняет DHTML всего одной возможностью – обращаться к серверу по HTTP и обрабатывать полученный запрос.

Это в корне меняет дело. DHTML способен «оживить» страницу, но он может оперировать только с теми данными, которые были загружены вместе со страницей. Ajax позволяет разработчику обратиться к серверу, получить новые данные и, пользуясь уже существующими возможностями DHTML, интерпретировать эти данные и изменить страницу. При этом перезагрузки страницы не происходит, новые данные «подкачиваются» на уже открытую страницу.


web Эту новую возможность должно отражать и само название Ajax – сокращение от Asynchronous JavaScript and XML. Описать CSS, DOM и JavaScript в одной статье, конечно, невозможно, но вот рассмотреть то, что отличает DHTML от Ajax, вполне реально. Этим мы и займёмся. Для рассмотрения предлагаю конкретный пример.

Ajax-приложение Давайте рассмотрим приложение, которое вычисляет квадраты целых чисел, а заодно выводит дополнительную отладочную информацию. Сразу после загрузки страницы пользователь увидит следующее (см. рис. 1). После того, как он введёт число и нажмёт на кнопку, страница будет скорректирована (без перезагрузки) и примет следующий вид (см. рис. 2). Давайте посмотрим на код «с высоты птичьего полёта». Он складывается из двух составляющих: клиентской, загружаемой в браузер, и серверной, обрабатывающей Ajax-запросы. Ajax-запросами, для краткости, я буду называть запросы, сгенерированные средствами Ajax. Конечно, с точки зрения сервера, это обычные HTTP-запросы.

На стороне клиента Приведу сразу весь код: <html> <head><title>Test Ajax</title></head> <script> function set_inner(e, v) { b=document.getElementById(e); b.innerHTML=v; } function process_response(r) { set_inner('step', r.readyState); if (r.readyState == 4) { set_inner('status', r.status); text = r.responseText; strings = text.split('\n'); set_inner('time', strings[0]); set_inner('qstring', strings[1]); set_inner('xsq', strings[2]); } } function prepare_http_object() { r = false; if (window.XMLHttpRequest) { // Mozilla, Safari, Opera ... r = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE r = new ActiveXObject("Microsoft.XMLHTTP"); } return r; } function setup_http_object(r) { r.onreadystatechange = function() {process_response(r);}; } function send_http_require(r) { r.open('GET', 'calc.php?x=' ↵ +escape(document.frm.x.value), true); r.send(null); } function do_http_rq() { r=prepare_http_object(); setup_http_object(r); send_http_require(r); } </script> <body> <form name="frm"> Данные для запроса:<br> x = <input type="text" name="x" size="3"> <input type="button" value="отправить запрос" onclick="do_http_rq();"><br> Ход выполнения запроса: <b id="step">null</b><br> Статус ответа: <b id="status">null</b><br>

№9, сентябрь 2006

Результат разбора ответа:<br> время: <b id='time'>null</b><br> строка запроса: <b id='qstring'>null</b><br> x-квадрат: <b id='xsq'>null</b> </form> </body> </html>

Это статическая HTML-страница, которую я назвал незамысловато – index.html. Как видите, она почти полностью состоит из JavaScript-кода. Это и не удивительно, ведь мы создаём не просто HTML-страницу, а Ajax-приложение. Небольшая HTML-составляющая кода не блещет никакими изысками. Все элементы, которые будут изменяться, я выделил жирным шрифтом (тег <b>) и назначил им уникальные идентификаторы, по которым буду на них ссылаться. Для наглядности, сразу после загрузки страницы (до выполнения Ajax-запросов) все динамические элементы заполнены строками «null». Это видно на рис. 1.

На стороне сервера На стороне сервера я предлагаю разместить PHP-сценарий следующего содержания: <? header('Content-type: text/xml'); header('Cache-Control: no-cache'); echo date("M d Y H:i:s\n", time()); echo ('<font color="red">'.$_SERVER['REQUEST_URI']. ↵ "</font>\n"); $x=intval($_REQUEST['x']); $xx=$x*$x; echo "$x²=$xx\n"; ?>

Он будет обслуживать запросы, формируемые Ajaxсценарием. Думаю, что даже человек, не знакомый с PHP, легко разберётся в том, что делает этот сценарий. Сперва он передаёт два HTTP-заголовка: Content-type: text/xml Cache-Control: no-cache

Первый из них весьма важен. Некоторые браузеры не обрабатывают HTTP-ответ, если MIME-тип не text/xml. Эту проблему можно решить и средствами JavaScript на стороне клиента (к этому мы ещё вернёмся), но «бережёного бог бережёт». Второй заголовок тоже рекомендуется добавлять. Он, как вы понимаете, предотвращает кэширование передаваемой информации.

Рисунок 1. Веб-страница сразу после загрузки

Рисунок 2. Веб-страница после нажатия на кнопку

61


web После заголовка мы формируем тело ответа, которое состоит из трёх строк следующего вида: Aug 18 2006 13:09:28 <font color="red">/ajax/calc.php?x=4</font> 4²=16

Первая – дата (по часам сервера). Вторая – строка запроса, переданная клиентом, оформленная HTML-тегами. Когда она будет отображаться на HTML-странице, теги будут корректно интерпретированы браузером, как вы уже видели на рис. 2. Точно так же можно передавать не только элементарное форматирование, но и таблицы, формы, теги img и прочее. Третья строка содержит ответ на вопрос – параметр запроса x, возведённый в квадрат. Обратите внимание, Ajax не делает веб-сервер более защищённым. Он никак не расширяет возможности HTTPпротокола. Чтобы избежать неприятностей, мы использовали функцию intval, гарантированно представляющую аргумент в виде целого числа. Следует оговорить и ещё одну возможность, которую Ajax-приложения эксплуатируют очень часто (в нашем примере мы её не используем). Дело в том, что программно генерировать ответ необходимо не всегда. Часто достаточно хранить на сервере статические файлы с данными, которые будут подгружаться по мере (и в случае) необходимости. Следует только позаботиться о правильном MIME-типе, который обычно можно задать в файле .htaccess директивой: AddType text/xml .xml

После этого все файлы с расширением xml (можно выбрать и любое другое расширение) будут выдаваться с верным типом.

Как это всё работает Давайте теперь перейдём к подробному рассмотрению JavaScript – именно он заставляет работать всю эту «машину». После того как пользователь нажимает на веб-странице магическую кнопку «отправить запрос», вызывается функция do_http_rq, которая по очереди совершает три основные операции:  создаёт объект запроса (функция prepare_http_object);  инициализирует объект нашего запроса (функция setup_http_object);  осуществляет запрос (функция send_http_require). Внимательный читатель спросит: «А кто же обрабатывает результат запроса?». Давайте рассмотрим всё по порядку.

Создаём объект запроса За создание объекта запроса у нас отвечает функция: function prepare_http_object() { r = false; if (window.XMLHttpRequest) { // Mozilla, Safari, Opera ... r = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE r = new ActiveXObject("Microsoft.XMLHTTP");

62

}

} return r;

Это единственное место, где мы сталкиваемся с несовместимостью браузеров. Все браузеры создают объект запроса функцией XMLHttpRequest, и только Microsoft предлагает использовать альтернативный подход – ActiveXObject("Microsoft.XMLHTTP"). Любопытно, что при этом создаётся точно такой же объект, но должен же был Microsoft внести свой вклад. Обратите внимание, если браузер не поддерживает ни XMLHttpRequest, ни ActiveXObject, то наша функция prepare_http_object возвращает false. Эту ситуацию не плохо было бы обработать в do_http_rq. Например так: function do_http_rq() { r=prepare_http_object(); if (r) { setup_http_object(r); send_http_require(r); } else { alert('Эта страница не может быть корректно ↵ отображена вашим браузером'); } }

Я этого не сделал, только чтобы не перегружать код деталями. Здесь уместно вспомнить о том, что некоторые браузеры (например Firefox 1.5 и более поздние(?)) не обрабатывают ответы с типом, отличным от text/xml. Лучше и надёжнее, конечно, решать эту проблему средствами сервера, как мы это делали выше, но если ситуация безвыходная, то в код следует добавить инструкции принудительного корректирования MIME-типа: function prepare_http_object() { r = false; if (window.XMLHttpRequest) { // Mozilla, Safari, Opera ... r = new XMLHttpRequest(); if (http_request.overrideMimeType) { http_request.overrideMimeType('text/xml'); } } else if (window.ActiveXObject) { // IE ...

Как видите, мы ус тановили MIME-тип методом overrideMimeType. Для браузера Internet Explorer этого делать не надо. Если ваш сервер правильно настроен и выдаёт корректный MIME-тип, то необходимости в этом дополнении, конечно, нет вообще.

Настраиваем обработчик ответа После того как объект соединения создан, его следует настроить. Для этого у нас предусмотрена функция setup_http_object. Единственное, что она делает – назначает функцию-обработчик ответа. Саму эту функцию мы рассмотрим ниже, а здесь коснёмся способов её указания. Самый простой способ – по имени (или по ссылке): obj.onreadystatechange = function_name;

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


web Можно задать обработчик, не создавая именованной функции: obj.onreadystatechange = function() { // делаем что-то }

Так мы создадим анонимную функцию и присвоим ссылку на неё свойству obj.onreadystatechange. Оба эти способа обладают одним большим недостатком – функция-обработчик не имеет возможности обрабатывать соответствующий объект запроса. Поэтому в ней, например, невозможно оценить результат запроса, получить код ошибки или тело ответа. Чтобы решить эту проблему, обычно применяется один из двух приёмов. Первый – хранить объект запроса в глобальной переменной. Это очень дурная (хотя и распространённая) практика. Если во время выполнения одного запроса пользователь снова нажмёт на кнопку, то глобальная переменная, хранящая объект первого запроса, будет изменена. Теперь, если будет принят первый запрос, обработчик запроса получит ссылку на второй, который ещё, может быть, не выполнился. Всё это неминуемо приведёт к очень неприятным, плохо воспроизводимым, ошибкам. Второй подход как раз применяется в моём коде: function setup_http_object(r) { r.onreadystatechange = function() {process_response(r);}; }

Здесь мы создаём анонимную функцию, которая только и делает, что вызывает реальный обработчик с соответствующим аргументом. Но и этот подход имеет существенные недостатки. В данном случае возникает ситуация, называемая в программировании «замыкание» (closure): локальная переменная r исчезает после завершения работы функции setup_http_object, но её значение сохраняется, так как данные продолжают использоваться в анонимной функции, которая, в свою очередь, не исчезнет, пока существует сам объект r. То есть сам же объект r становится гарантом своей вечной жизни, и при этом он оказывается недоступен для основной программы. Единственное место, где можно оперировать с r, – тело функции process_response. Подобные ситуации всегда неминуемо ведут к утечкам памяти. Немногочисленные тесты, проведённые мной, показали, что так оно и есть. FireFox на разных платформах показал примерно один и тот же результат – утечка около 600-700 байт на один запрос. Internet Explorer оказался куда более расточительным: на каждый запрос он тратит около 1700 байт и один системный дескриптор. Opera «кушает» примерно по килобайту на запрос, но есть основания полагать, что Opera всё же «освобождает» паять. Она не возвращает память системе, но, возможно, использует её повторно. Замыкания не являются редкостью, но классические методы борьбы с ними в данном случае не работают. Так в любом высокоуровневом языке с автоматическим управлением памятью достаточно было бы создать «деструктор» вида:

№9, сентябрь 2006

function unclose(r) { r.onreadystatechange = function() {}; }

Он бы разорвал замкнутый круг взаимных зависимостей (разомкнул замыкание), и переменная была бы уничтожена системой автоматически. Использование такого приёма, к сожалению, не даёт никаких результатов ни на одном браузере. Более того, в FireFox утечка памяти происходит даже в отсутствии замыканий! Да-да, даже если использовать глобальные переменные, каждый вызов XMLHttpRequest() навсегда съедает половину килобайта оперативной памяти. Очевидно, язык JavaScript ещё есть куда улучшать, если он не справляется с такими простыми задачами. Есть и ещё одна плохая новость: браузеры освобождают память (а IE и дескрипторы) только в случае закрытия окна. Никакие переходы на другие страницы или закрытия вкладок не вызывают очистку памяти. Всё это весьма прискорбно, однако, я нигде не видел и не слышал о том, что утечки памяти являются серьёзной проблемой JavaScript-приложений. Все источники сходятся во мнении, что использование глобальных дескрипторов (да и любых других переменных) – гораздо большее зло, чем замыкания и трудности, связанные с ними. Чтобы покончить с вопросами сбережения памяти, давайте оценим, какова реальная угроза. Допустим, на определённое действие пользователя ваше приложение совершает три запроса (надо сказать, это должно быть весьма и весьма развитое приложение). Пусть пользователь работает достаточно активно и совершает указанное действие один раз в минуту. Ощущать дефицит памяти он начнёт гдето после 500 000-1 000 000 операций. Несложный подсчёт показывает, что на это ему понадобятся месяцы непрерывной работы. В свете результатов этого нашего воображаемого эксперимента проблема утечек памяти уже не кажется столь зловещей. Просто о ней надо помнить, если вы решите делать запросы в циклах по тысяче штук за раз. В заключении обсуждения процедуры инициализации объекта мне осталось добавить, что назначение функцийобработчика – важное, но отнюдь не единственное, полезное действие, которое уместно выполнить именно здесь. Например, если вы будете делать POST-запрос, то будет уместно назначить MIME-тип отправляемых данных: obj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

Итак, мы создали и инициализировали объект запроса. Самое время сделать запрос на сервер.

Посылаем запрос Запрос мы посылаем функцией do_http_object. Она выполняет всего два действия:  открывает поток методом open;  запускает процесс обмена данными методом send. Open получает три входных параметра: HTTP-метод, адрес и флаг асинхронности. r.open('GET', 'calc.php?x=' ↵ +escape(document.frm.x.value), true);

63


web Имя метода следует всегда пи- нозначно и единообразно трактуют «как есть». При этом корректно интерсать большими буквами: не все бра- эти шаги обработки запроса. Каждый претируются специальные символы («²») и HTML-теги (<FONT>). узеры станут преобразовывать ре- из них может вызваться не один раз. Код 0 не используется большинсДанные, переданные сервером гистр, а по протоколу HTTP имя метода должно передаваться именно за- твом браузеров. Это начальное со- в HTTP-ответе, можно получить двуглавными буквами. стояние. мя методами: Адрес может быть и абсолютным, Вызов с кодом 1 обычно происхо-  r.responseText возвращает тело оти относительным, но я бы советовал дит дважды. Согласно спецификации вета без каких-либо изменений – не использовать полных адресов с яв- от W3C, код 1 должен отрабатываться просто как строку; ным указанием имени сервера. Брау- по завершении open(), однако, в реаль-  r.responseXML возвращает объзеры должны допускать Ajax-обраще- ной жизни все вызовы с этим кодом ект XML-документ, предоставляюния только к тому серверу, с которого происходят уже после вызова send. щий программисту массу методов Вызов с кодом 2 не повторяется, был загружен документ. Это приводит для манипулирования данными (тик массе недоразумений при наличии а Opera не генерирует вызов с кодом па getElementsByTagName). синонимов типа www.google.ru и прос- 2 вовсе. По спецификации он знамеМы передавали данные просто то google.ru (без www). В нашем приме- нует конец отправки браузером запрострокой. В нашем случае этого вполре мы генерируем адрес вида: са и переход на приём. Код 3 может поступать много раз не достаточно. Но передача данных /ajax/calc.php?x=4 по мере получения данных от серве- в формате XML открывает гораздо бора; причём разные браузеры вновь ве- лее широкие возможности. Надо тольОбратите внимание, для кодиро- дут себя не одинаково: Internet Explorer ко учитывать, что средства обработки вания передаваемых данных мы ис- не повторяет код 3 (он вообще всегда XML-документов достаточно сильно отпользовали функцию escape. В на- выдаёт одну и ту же последователь- личаются в разных браузерах. И, кошем случае это скорее дань хороше- ность 1-1-2-3-4), а FireFox повторяет нечно, следует формировать коррекму тону, но при передаче более слож- его на каждые четыре переданные ки- тные документы, начинать их с праных данных эта мера становится жиз- лобайта. Согласно спецификации этот вильного заголовка, корректно закрыкод может поступать на обработку не- вать теги, квотировать небезопасные ненно необходима. Третий аргумент интерпретируется сколько раз, но, по замыслу разработ- символы. как логическое значение. Если он ра- чиков, он несёт гораздо более глубовен «истина», то запрос производится кий смысл: первый вызов – принят за- «За» и «против» Ajax асинхронно (это и есть буква A в аббре- головок, второй вызов – принято тело Достоинства Ajax не нуждаются в реквиатуре Ajax). То есть браузер не ждёт, документа. ламе. Эта «технология» открывает неВ большинстве случаев требует- обозримые горизонты перед веб-прокогда отработается запрос, и продолжает выполнять JavaScript-код. ся обработать только ситуацию 4, и, граммистом и позволяет создавать Метод send предназначен для от- к счастью, это, пожалуй, наиболее од- сколь угодно сложные и динамичные интерфейсы. Но и недостатки Ajax правки тела запроса. В нашем случае нозначный и надёжный код. выполняется GET-запрос и тело пусто, В первой строке мы выводим зна- трудноскрываемы. Давайте останоно в случае POST-запроса тело пере- чение r.readyState в элемент с id=step; вимся на них подробнее. в HTML-коде ему соответствует подпись Фундаментальным «дефектом» даётся как раз этим методом. «Ход выполнения запроса». (Для этого Ajax является то, что она нарушает саиспользуется функция set_inner.) му концепцию веб-пространства. Ведь Обрабатываем результат Во второй строке мы проверяем, за- изначально HTTP разрабатывался как Итак, при обработке запроса вызывается функция process_response. вершён ли запрос, и если «да», то вы- протокол передачи данных, а браузеЕё единственным аргументом являет- полняем серию нехитрых действий: ры – как средства отображения данся объект запроса.  получаем код HTTP-ответа мето- ных. Ajax же, являясь вершиной эвоЭта функция вызывается не тольдом status и «выкладываем» его в люции Web, окончательно превращает тело документа (в элемент status – веб-документ в приложение, а браузер ко при принятии ответа, но и на дру«Статус ответа»); – в среду выполнения этого приложегих этапах обработки HTTP-запроса. Об этапе говорит свойство .readyState.  получаем тело ответа методом ния. Эта «придирка» может показаться Возможны следующие значения: слишком надуманной, но все недостатresponseText;  0 – инициализация запроса;  разбиваем его на строки методом ки Ajax проистекают именно из этого нарушения философии Web. split;  1 – формирование запроса; Ajax нарушает основную концеп 2 – формирование запроса оконче-  «выкладываем» три полученные но; строки, соответственно, в элемен- цию адресации документов. Нарушаты time («время»), qstring («строка ется уникальность адресов: по одному  3 – взаимодействие с сервером; запроса»), xsq («x-квадрат»). и тому же адресу можно увидеть раз 4 – взаимодействие завершено (ответ получен). ную информацию. Это не только деКак ви д и те, вс ё, п ер ед анно е лает невозможным реализацию элеЯ не уверен, что все браузеры од- сервером, вставляется в документ ментарных функций браузера, начиная

64


web с использования кнопки «назад», заканчивая возможностью создания закладки, но и делает в принципе невозможным индексацию документов поисковыми системами или даже элементарный обмен ссылками, когда друг «кидает» другу ссылку по «аське». (Конечно, пока ни один поисковик не в состоянии выполнить Ajax-код и правильно проиндексировать ресурс.) В деле разрушения соответствия URL-документ Ajax продвинулся гораздо дальше, чем фреймы, о вреде которых уже много написано. Ну и, конечно, нельзя обойти вниманием пресловутую несовместимость браузеров. В этой статье мы видели её только в одном месте, но это во многом от того, что мы практически не использовали DOM, реализация которого в разных браузерах весьма и весьма различна. Причём, добиться уровня совместимости, необходимого для использования Ajax, будет не просто. Не только потому, что это просто сложно технически, но ещё и потому, что придётся пересмотреть основные механизмы браузеров – программ, которые создавались для просмотра до-

№9, сентябрь 2006

кументов, и от которых теперь требуется стать средами выполнения приложений. Косметическими улучшениями здесь не отделаться. Кроме того, Ajax базируется на технологиях, которые не предназначались для решения тех задач, на которые он направлен. Поэтому Ajax порождает массу неоднозначностей и противоречий. Например, как должен реагировать браузер, если вместо обычного HTML-содержимого в страницу будет встраиваться новый JavaScript-код? Все эти противоречия порождаются той путаницей между данными и управляющим кодом, о которой я говорил в самом начале. Думаю, и браузеры, и технологии должны полностью переродиться, чтобы возможности Ajax стали универсальными и безопасными. Сейчас мы наблюдаем первых ласточек, которые возвещают о грядущих больших переменах в Web. Одним словом, строить сайты на Ajax, наверно, преждевременно, однако его вполне уместно использовать в тех ситуациях, где качество индексирования и комфортность навигации не так важны, как интерфейс.

А то, что Ajax используется в крупнейших веб-проектах, сулит этой «технологии» большое будущее. 1. Прежде всего, мне хотелось бы отметить MDC (Mozilla Developers Center) – http://developer.mozilla.org/en/docs/ AJAX. Информации там не очень много, но она очень качественная. Нет никаких недомолвок, не лоббируются интересы какого-либо одного производителя браузеров, язык очень прост и понятен. 2. Большой «развал» ссылок на различные ресурсы для Ajax-разработчиков можно найти здесь – http:// www.maxkiesler.com/index.php/weblog/ comments/451. 3. Спецификацию метода XMLHttpRequest можно найти тут – http://www.w3.org/TR/ 2006/WD-XMLHttpRequest-20060405. 4. Русский перевод описания протокола HTTP (RFC 2068) можно найти здесь – http://www.lib.ru/WEBMASTER/rfc2068. 5. Кроме того, «Системный Администратор» уже публиковал две статьи об Ajax (№12 за 2005 г. и №6 за 2006 г.), где так же приводились интересные ссылки по этой теме.

65


web

Устанавливаем DACS

Сергей Яремчук Настройка DACS, системы контроля доступа к веб-ресурсам, – дело не простое. Поэтому разберем, как установить ее в минимальной конфигурации, а заодно посмотрим на нее в работе.

С

о времени публикования первой ваться и этими пакетами. Это позво-  библиотека OpenSSL, разработчики рекомендуют 0.9.8b, хотя и части статьи [1] ничего не из- лит сосредоточиться больше на изус 0.9.8а проблем не было. менилось. Текущей версией чении функциональности, чем на на библиотека синтаксического по-прежнему является 1.4.13а. Про- стройке. Мы же не ищем легких путей анализа XML Expat, рекомендуеект придерживается строгих правил, и будем устанавливать DACS с исходмой версией является 2.0. распространяя только исходные тек- ных текстов. сты DACS, и рекомендует полностью Кроме того, в зависимости от трепересобрать всю систему с их помо- Компоненты, необходимые буемой функциональности вам могут щью. Прекомпилированные пакеты для работы DACS удалось найти только на сайте про- Для установки, кроме самого DACS, понадобиться и другие пакеты, устаекта OMSE [2]. Хотя здесь доступ- понадобятся исходные тексты либо за- новка которых опциональна. Так, если планируется сохранение конфигуна версия DACS 1.4.11, собранная головочные devel-пакеты: для Debian 3.1 и Fedora Core 4, кото-  веб-сервер Apache, рекоменду- рации в базе данных, то потребуется емыми версиями являются 2.0.58 Berkeley DB, gdbm или ndbm. Для вклюрые шли в качестве приложения к стаили 2.2.2, с последней DACS начал чения NTLM понадобится пакет Samba, тье «DACS: Nur für Mitglieder» в немецработать с 1.4.13а, и еще не до кон- а возможность работы с LDAP или ком журнале для IT-профессионаца протестирован, поэтому, впол- Active Directory реализуется посредслов IX (http://www.heise.de/ix). Версии не вероятно, возникнут проблемы твом пакета OpenLDAP. Но при первой 1.4.11 и 1.4.13а имеют отличия, но если при установке и работе (по крайней настройке лучше всего ограничиться цель – знакомство с системой DACS, мере, у меня они были). только базовым набором, постепенно то первоначально можно воспользо-

66


web разобравшись с настройками, уже можно установить полнофункциональную систему.

Устанавливаем основные компоненты В большинстве систем уже имеются библиотеки OpenSSL, если их в системе нет, установить их очень просто. Для удобства все необходимые компоненты я установил в свой каталог. $ cd openssl-0.9.8a/ $./config --prefix=/opt/openssl $ make; make test # make install

Теперь очередь веб-сервера. Конфигурировать его необходимо с опцией --enable-ssl, остальные опции по необходимости. Чтобы не повлиять на работу основного Apache, тестовую версию советую установить в отдельный каталог. $ cd apache-2.0.58 $./configure --enable-ssl --with-ssl=/opt/openssl ↵ --prefix=/opt/apache2

После чего стандартные make и make install. По умолчанию поддержка SSL компилируется статически, проверить встроенные модули можно командой: # /opt/apache2/bin/apachectl –l mod_so.c … mod_ssl.c

Если поддержка SSL компилировалась как динамически загружаемый модуль (Dynamic Shared Object), то при дальнейшей настройке необходимо проследить, чтобы при помощи директивы LoadModule в файле веб-сервера httpd.conf, mod_ssl загружался перед mod_auth_dacs. Иначе вы получите ошибку при запуске. Хотя настройкой Apache займемся чуть позже. Теперь для веб-сервера необходимо сгенерировать сертификаты и ключи: # /opt/openssl/bin/openssl req -config ↵ /opt/openssl/openssl.cnf -new -x509 ↵ -keyout gw-ca.pem -out gw-ca.pem -days 365 Generating a 1024 bit RSA private key .......++++++ writing new private key to 'gw-ca.pem'

Далее выбираем пароль и отвечаем на стандартные вопросы скрипта (страна, организация, почтовый адрес и пр.). Разделяем ключ и сертификат, убираем пароль с ключа: # /opt/bin/openssl rsa -in gw-ca.pem -out gw-ca.key Enter pass phrase for gw-ca.pem: writing RSA key

# /opt/ openssl/bin/openssl x509 -in gw-ca.pem ↵ -out gw-ca.crt

И копируем сертификат и ключ на свое место # cp gw-ca.crt /opt/apache2/conf/server.crt # cp gw-ca.key /opt/apache2/conf/server.key

№9, сентябрь 2006

Все настройки SSL по умолчанию описываются в секции: <IfModule mod_ssl.c> Include /opt/conf/ssl.conf </IfModule>

Если заглянуть в файл ssl.conf, в нем файлы сертификата и ключа указываются следующими переменными: SSLCertificateFile /opt/apache2/conf/ssl.crt/server.crt SSLCertificateKeyFile /opt/apache2/conf/ssl.key/server.key

После этих действия Apache должен нормально работать через SSL, для чего соединяемся при помощи браузера или telnet к 443 порту. Теперь Expat. Здесь все стандартно. $ cd expat-2.0.0 $ ./configure --prefix=/opt/expat; make # make install

После чего следует добавить путь к библиотеке /opt/expat/lib в файл /etc/ld.so.conf и дать команду: # /sbin/ldconfig

Установка модуля и утилит DACS Распаковываем архив с исходными текстами. Конфигурационный скрипт находится в подкаталоге src. Для просмотра всех опций конфигурирования вводим. $ cd dacs-1.4.13a $ src/configure --help

Опций много, необходимости в выборе всех нет. Я использовал следующие параметры при конфигурировании: $ src/configure --with-ssl=/opt/openssl ↵ --with-expat=/opt/expat --with-apache=/opt/apache2 ↵ --enable-unix-auth --enable-debug ↵ --enable-apache-auth --enable-native-auth ↵ --prefix=/opt/dacs --enable-ndbm=no --enable-bdb=no

Опции with-ssl, with-expat и with-apache указывают на каталоги, в которых установлены соответствующие приложения, а prefix – куда требуется установить DACS. Все виды аутентификации можно включить при помощи параметра enable-all-auth, сейчас все возможности нам не нужны, поэтому включаем аутентификацию UNIX и Apache опциями enable-unix-auth, enable-native-auth и enable-apache-auth. По умолчанию поддержка ndbm и Berkeley DB включена, и если они не установлены в системе, при конфигурировании будет выдана ошибка, поэтому отключаем их поддержку. Если все прошло нормально, строим зависимости: $ gmake depend

Кстати, теперь можно получить помощь по компиляции mod_auth_dacs, вызвав make help. Модуль mod_auth_dacs можно построить с тремя возможными параметрами, добавляющими информацию о DACS в строку ответа серве-

67


web Все, сервер работает, осталось только указать на катара. Для включения вывода всей информации используйте make tag, для частичной – make smalltag, и для того чтобы логи, которые будут защищены DACS. В «DACS Quick Start в ответе не было упоминания о работе DACS – make notag. Tutorial» для DACS настроен виртуальный сервер, мы тоЯ пробовал при помощи Google проверить, на скольких сер- же поступим аналогичным образом, так легче разобратьверах установлен DACS, и нашел только один сервер. По- ся, что, где и как. Создадим виртуальный сервер testdacs. лучается два варианта, либо DACS малоизвестен, либо со- net, который будет слушать на 8080 порту. Для этого добабирается с опцией notag, как более безопасной. вим в httpd.conf следующие строки: $ gmake smalltag # gmake install

Скрипт сначала запрашивает пользователя и группу владельцев файлов DACS. Which user name/id should own DACS files [sergej]? apache2 Which group name/id should own DACS files [www]? apache2 /opt/dacs/lib /etc/ld.so.conf NOTES: * /opt/apache2/cgi-bin/dacs/local_unix_authenticate may need to be setuid or setgid in order to check passwords: chown root /opt/apache2/cgi-bin/dacs/local_unix_authenticate chmod u+s /opt/apache2/cgi-bin/dacs/local_unix_authenticate * /opt/apache2/cgi-bin/dacs/local_apache_authenticate may need to be setuid or setgid in order to check passwords: chgrp www /opt/apache2/cgi-bin/dacs/local_apache_authenticate chmod g+s /opt/apache2/cgi-bin/dacs/local_apache_authenticate * Run 'make install-autologin' if you require autologin * Check that /opt/dacs/man is on your MANPATH * DACS version info: number="1.4" release="1.4.13a" date="Release date 2-Jun-06 12:12:28" revid="$Id: dacs-stamp-h 1218 2006-06-02 19:15:04Z brachman $" other="Expat 2.0.0, OpenSSL 0.9.8a 11 Oct 2005, Apache 2.0.58"

<Directory /opt/dacs/www/*> Options Indexes FollowSymLinks Order allow,deny Allow from all </Directory> # Настраиваем виртуальный сервер и делаем доступными # каталоги DACS NameVirtualHost 127.0.0.1:8080 Listen 127.0.0.1:8080 <VirtualHost 127.0.0.1:8080> ServerName testdacs.net DocumentRoot "/opt/dacs/www/" ErrorLog "/opt/dacs/logs/error_log" TransferLog "/opt/dacs/logs/access_log" ScriptAlias /cgi-bin/ "/opt/apache2/cgi-bin/dacs/" Alias /css "/opt/dacs/www/css/" Alias /icons/ "/opt/apache2/icons/" Alias /dacs "/opt/dacs/www/" Alias /dtd-xsd "/opt/dacs/www/dtd-xsd/" Alias /examples "/opt/dacs/www/examples/" Alias /handlers "/opt/dacs/www/handlers/" Alias /man "/opt/dacs/www/man/" Alias /misc "/opt/dacs/www/misc/" Alias /mod "/opt/dacs/www/mod/" </VirtualHost>

Конфигурирование DACS

В качестве примера создадим одну федерацию, назоПоследний вывод получен при помощи утилиты version, вем ее DACSTEST и сопоставим ее с доменом testdacs. которая доступна так же, как веб-сервис dacs_version, поз- net. Для упрощения федерация будет состоять из одной воляющая проверить версию DACS и опции конфигуриро- юрисдикции – FIRST. Во время работы DACS использует два файла: site.conf и dacs.conf. Первый является опциования. Ее можно вызвать отдельно: нальным, в нем хранится информация обо всех федера# /opt/dacs/bin/version -v циях, расположенных на узле. Второй dacs.conf может описывать федерацию, юрисдикцию, узел. Каждый указанный После установки убедитесь, что в httpd.conf добавилась элемент может иметь свой файл dacs.conf со своими настройками, или на узле может использоваться всего один строка, загружающая модуль mod_auth_dacs.so. dacs.conf, в котором все свалено в кучу. Разработчики ре# cat httpd.conf | grep LoadModule комендуют использовать утилиту install, которая имеется в большинстве дистрибутивов. С ее помощью очень удобно LoadModule auth_dacs_module modules/mod_auth_dacs.so контролировать права доступа к объектам, а DACS очень Теперь можно запустить веб-сервер и проверить пра- чувствительный к этим параметрам. Если такой утиливильность работы модуля. ты нет, в комплекте имеется скрипт src/conftools/install-sh. Как вариант можно использовать стандартные утилиты # /opt/apache2/bin/apachectl start cp, chown, chgrp и chmod, хотя это не так наглядно и можно допустить ошибку. Обратите внимание, что мы используем пользователя/группу apache2/apache2, от имени коСделать это можно несколькими способами. Журнал работы веб-сервера является самым простым торых работает веб-сервер. Скопируем шаблонный файл site.conf-std на свое место. способом, в нем должна появиться такая запись: [Wed Jun 14 10:33:00 2006] [notice] Apache/2.0.58 (Unix) mod_ssl/2.0.58 OpenSSL/0.9.8a mod_auth_dacs/1.4.13a configured -resuming normal operations

Еще для проверки работы с SSL в комплекте DACS имеется утилита sslclient, позволяющая подсоединиться к вебресурсу по SSL и получить необходимую информацию. # /opt/dacs/bin/sslclient testserver.net:443

68

# install -g apache2 -m 0640 ↵ /opt/dacs/federations/site.conf-std ↵ /opt/dacs/federations/site.conf

Файл хорошо комментирован, многие параметры понятны, поэтому трогать его не будем. На время тестирования можно отключить SSL, установив директиву SECURE_MODE в off, но в рабочей системе, естественно, она должна быть включена.


web Обратите внимание на каталоги, в которых должны храниться настройки, они описаны как: ${Conf::FEDERATIONS_ROOT}/${Conf::FEDERATION_DOMAIN}/ ↵ ${Conf::JURISDICTION_NAME}

То есть в нашем случае полный путь должен быть такой – /opt/dacs/federations/testdacs.net/FIRST/. Создадим файл dacs.conf для федерации. # install -g apache2 -m 0660 /dev/null ↵ /opt/dacs/federations/dacs.conf

Теперь каталоги, в которых будут храниться все ассоциативные настройки федерации и юрисдикции FIRST. # install -d -g apache2 -m 0770 ↵ /opt/dacs/federations/testdacs.net/ # install -d -g apache2 -m 0770 ↵ /opt/dacs/federations/testdacs.net/FIRST

Все списки контроля доступа и revocation list юрисдикции по умолчанию хранятся в подкаталоге acl, и они должны существовать. # install -d -g apache2 -m 0770 ↵ /opt/dacs/federations/testdacs.net/FIRST/acls # install -g apache2 -m 0660 /dev/null ↵ /opt/dacs/federations/testdacs.net/FIRST/acls/revocations

В подкаталогах groups записывается вся информация о том, кто состоит в юрисдикции (FIRST) и федерации (DACS). # install -d -g apache2 -m 0770 ↵ /opt/dacs/federations/testdacs.net/FIRST/groups ↵ /opt/dacs/federations/testdacs.net/FIRST/groups/FIRST ↵ /opt/dacs/federations/testdacs.net/FIRST/groups/DACS

Файл jurisdictions.grp описывает все юрисдикции, входящие в федерацию, в случае внесения изменений в этот файл он должен быть скопирован во все юрисдикции. # install -g apache2 -m 0660 /dev/null ↵ /opt/dacs/federations/testdacs.net/FIRST/groups/ ↵ DACS/jurisdictions.grp

Добавим в созданный jurisdictions.grp информацию о нашей юрисдикции. <groups xmlns="http://dss.ca/dacs/v1.4"> <group_definition jurisdiction="FIRST" name="jurisdictions" mod_date="Tue, 26-Jun-2006 12:00:00 GMT" type="public"> <group_member jurisdiction="FIRST" name="DACS" type="meta" alt_name="My First Test Jurisdiction" dacs_url="http://testdacs.net:8080/cgi-bin/dacs" authenticates="yes" prompts="no"/> </group_definition> </groups>

А в /opt/dacs/federations/dacs.conf данные о федерации и юрисдикции. <Configuration xmlns="http://dss.ca/dacs/v1.4.13а"> <Default> FEDERATION_DOMAIN "testdacs.net" FEDERATION_NAME "DACSTEST" LOG_LEVEL "info" </Default>

№9, сентябрь 2006

<Jurisdiction uri="testdacs.net"> JURISDICTION_NAME "FIRST" </Jurisdiction> </Configuration>

В примере адрес федерации и юрисдикции совпадает, разделение идет на уровне ресурсов. Как вариант можно разделять на юрисдикции при помощи разных доменов, например first.testdacs.net. Чтобы не создавать множество конфигурационных файлов, создадим для FIRST/dacs.conf символическую ссылку: # ln -s /opt/dacs/federations/dacs.conf ↵ /opt/dacs/federations/ testdacs.net/FIRST/dacs.conf

Проверяем настройки Для этого в комплекте DACS идет специальная утилита conf, которая выведет результат слияния всех этих файлов. # /opt/dacs/bin/conf -u testdacs.net -q <Jurisdiction uri="testdacs.net"> JURISDICTION_NAME "FIRST" FEDERATION_DOMAIN "testdacs.net" AUTH_ERROR_HANDLER "* url /handlers/auth_failed.html" HTTP_PROG "/opt/dacs/bin/http" VERIFY_IP "no" AUTH_SUCCESS_HANDLER "url /handlers/auth_ok.html" AUTH_CREDENTIALS_DEFAULT_LIFETIME_SECS "43200" FEDERATION_NAME "DACSTEST" DTD_BASE_URL "/dtd-xsd" XSD_BASE_URL "/dtd-xsd" PASSWORD_DIGEST "SHA1" SSL_PROG "/opt/dacs/bin/sslclient" SSL_PROG_CA_CRT "/opt/apache2/conf/ssl.crt/server.crt" SIGNOUT_HANDLER "url /handlers/signout_ok.html" ALLOW_HTTP_COOKIE "no" AUTH_FAIL_DELAY_SECS "2" ACS_ERROR_HANDLER "* /handlers/acs_failed.html" SECURE_MODE "on" COOKIE_PATH "/" NAME_COMPARE "case" LOG_FILE "/opt/dacs/logs/FIRST-28-Jul»-06.log" LOG_FILTER "filename exact DEBUG "crypto.c"" LOG_LEVEL "info" LOG_SENSITIVE "no" NOTICES_ACCEPT_HANDLER "/handlers/notices_accepted.html" NOTICES_DECLINE_HANDLER "/handlers/notices_declined.html" NOTICES_ACK_HANDLER "" NOTICES_SECURE_HANDLER "yes" NOTICES_WORKFLOW_LIFETIME_SECS "120" NOTICES_NAT_NAME_PREFIX "NAT-DACS" VFS "[dtds]dacs-fs:/opt/dacs/www/dtd-xsd" VFS "[federation_keys]dacs-fs:/opt/dacs/federations/testdacs.net/federation_keyfile" VFS "[jurisdiction_keys]dacs-fs:/opt/dacs/federations/testdacs.net/FIRST/jurisdiction_keyfile" VFS "[revocations]dacs-fs:/opt/dacs/federations/testdacs.net/FIRST/acls/revocations" VFS "[acls]dacs-fs:/opt/dacs/federations/testdacs.net/FIRST/acls" VFS "[dacs_acls]dacs-fs:/opt/dacs/acls" VFS "[groups]dacs-fs:/opt/dacs/federations/testdacs.net/FIRST/groups" VFS "[passwds]dacs-kwv-fs:/opt/dacs/federations/testdacs.net/FIRST/passwd" VFS "[roles]dacs-kwv-fs:/opt/dacs/federations/testdacs.net/FIRST/roles" AUTH_AGENT_ALLOW_ADMIN_IDENTITY "no" LOG_FORMAT "[%t] [%l] [%p,%c,%F] [%sp:"%sm"]" STATUS_LINE "off" </Jurisdiction>

Параметры понятны. Обратите внимание на установленное по умолчанию время жизни credentials, которое составляет 43200 секунд – 12 часов, и на отключенную проверку IP-адреса в credentials.

Создаем ключи Для создания ключей используется утилита mkkey. Ключи необходимо сгенерировать для федерации и каждой юрисдикции. Во избежание компрометации в дальнейшем лучше поручить эту процедуру cron, который будет менять ключи в наименее загруженное время (с учетом жизни credentials, чтобы никто не возмущался). # install -g apache2 -m 0660 /dev/null ↵ /opt/dacs/federations/testdacs.net/federation_keyfile # /opt/dacs/bin/mkkey -u testdacs.net -q ↵ /opt/dacs/federations/testdacs.net/federation_keyfile

69


web Please check ownership and mode of '/opt/dacs/federations/testdacs.net/federation_keyfile'

Проверяем созданный ключ. # cat /opt/dacs/federations/testdacs.net/federation_keyfile <crypt_keys fed_id="27-Jul»-2006@19:33:57, 3375dd487ad8bb2430b37da395ecb2eb4290dbc2" auth_key="p3CEHQymtQi/PJJXW7/nm0" hmac_key="…UA/../" private_key="..."/>

Все нормально. Повторяем процедуру для юрисдикции, но с другими опциями mkkey. # install -g apache2 -m 0660 /dev/null ↵ /opt/dacs/federations/testdacs.net/FIRST/ ↵ jurisdiction_keyfile # /opt/dacs/bin/mkkey -uj FIRST ↵ /opt/dacs/federations/testdacs.net/FIRST/ ↵ jurisdiction_keyfile Please check ownership and mode of '/opt/dacs/federations/testdacs.net/FIRST/jurisdiction_keyfile'

Списки доступа для новой юрисдикции

И чтобы модуль веб-сервера знал о том, что ему контролировать в конец секции VirtualHost, которую мы создали ранее в файле httpd.conf, запишем следующие строки (параметры -t -v позволяют вывести отладочную информацию, которая вам понадобится). AddDACSAuth dacs-acs /opt/dacs/bin/dacs_acs "-t -v" SetDACSAuthMethod dacs-acs external SetDACSAuthConf dacs-acs "/opt/dacs/federations/dacs.conf" <Location /cgi-bin/dacs> AllowOverride AuthConfig Require valid-user Options ExecCGI AuthType DACS AuthDACS dacs-acs </Location>

И перезапускаем Apache: # /opt/apache2/bin/apachectl restart

Если набрать в веб-браузере «http://testdacs.net:8080/ cgi-bin/dacs/prenv», вы должны увидеть результат работы скрипта. Причем к некоторым другим скриптам, лежащим в этом же каталоге, получить доступ вам не удастся, так как они защищены правилом acl-dacs.0, позволяющим работать с ними только пользователю с правами администратора.

В папке /opt/dacs/acls сейчас лежат списки контроля доступа, используемые DACS по умолчанию. Эти правила в основном описывают параметры для стандартных веб-ресурсов. Трогать их не рекомендуется, для того чтобы переопределить правило, следует поместить файл с таким же име- Регистрация пользователя нем в подкаталог acl юрисдикции. Теперь заставим пользователя регистрироваться. Как уже Например, правило acl-prenv.0 разрешает доступ говорилось в первой части, DACS поддерживает несколько к cgi-скрипту prenv, выдающему информацию о рабочем методов аутентификации, в том числе и свой. Изменим опиокружении только администратору. Поэтому попытка за- сание юрисдикции в файле dacs.conf, добавив в него данпуска этого скрипта выдаст ошибку 403. Выглядит прави- ные, позволяющие осуществлять аутентификацию при поло так: мощи паролей UNIX. <acl_rule> <services> <service url_expr= ↵ '"${Conf::dacs_cgi_bin_prefix}/prenv"'/> </services> <rule order="allow,deny"> <allow> dacs_admin() </allow> </rule> </acl_rule>

Давайте разрешим всем просматривать эту информацию. Для этого создадим файл acl-prenv.0, переопределяющий это правило. # install -g apache2 -m 0660 /dev/null ↵ /opt/dacs/federations/FIRST/acls/acl-prenv.0

И поместим в него следующие строки. <acl_rule> <services> <service url_expr= ↵ '"${Conf::dacs_cgi_bin_prefix}/prenv"'/> </services> <rule order="allow,deny"> <allow> user("any") # то есть всем </allow> </rule> </acl_rule>

70

<Jurisdiction uri="testdacs.net"> JURISDICTION_NAME "FIRST" <Auth id="passwd"> URL "http://testdacs.net:8080/cgi-bin/dacs/ ↵ local_unix_authenticate" STYLE "pass" CONTROL "sufficient" </Auth> </Jurisdiction>

Для регистрации используем подготовленную HTML-форму (см. рис. 1), доступную по адресу http://testdacs.net:8080/ examples/login.html, где вводим системный логин и пароль. Как вариант можно использовать аутентификацию DACS, заменив в файле строку local_unix_authenticate на local_passwd_authenticate. Для создания пароля DACS применяется утилита dacspasswd, роль ее аналогична команде htpasswd, предназначенной для работы с паролями пользователей веб-сервера Apache. Создадим файл, в котором будут храниться пароли пользователей юрисдикции. # install -g apache2 -m 0660 /dev/null ↵ /opt/dacs/federations/testdacs.net/FIRST/passwd

И теперь пароль для пользователя sergej. # /opt/dacs/bin/dacspasswd -u testdacs.net -q -a sergej New password for sergej? Re-type new password for sergej?


web

Рисунок 1. HTML-форма для регистрации пользователей DACS

Рисунок 2. Вид страницы при успешной регистрации

Посмотрим, что получилось.

Например, такая запись при наличии самого файла:

# cat /opt/dacs/federations/testdacs.net/FIRST/passwd sergej:2|6Jc.6GFAiA15Rq6X|VbGuYg3H05MU4zzz4fCsvd1bqb1

Теперь пробуем зайти с новыми данными. Если все нормально, то вам будет выведена страница handlers/ auth_ok.html (см. рис. 2), где вы можете просмотреть полученный credentials. Вот он: DACS:DACSTEST::FIRST:sergej=y/ZPRm4Yh………………убрано……………..mOikAoE

Если заглянуть внутрь cookie, то можно увидеть только имя пользователя в формате DACS, остальная информация зашифрована. При помощи утилиты cookie расшифруем полученный credentials. # /opt/dacs/bin/cookie -u testdacs.net -decrypt < cookie federation='DACSTEST' DACS username='FIRST:sergej' ip_address='' roles='' expires_secs='1154148374' auth_style='generated' valid_for='acs' version='1.4'

В файле acl-prenv.0 изменим user("any") на user("auth"). Если параметр изменяется в конфигурационном файле Apache, то для того чтобы он вступил в силу, требуется перезапуск веб-сервера. При правке файлов DACS изменения будут актуальны уже при следующем запросе, поэтому перезапускать ничего не надо. Попробуем теперь получить доступ к prenv без регистрации, авторизовавшись в системе. В последнем случае credential делает свое дело, и мы получаем доступ к требуемому ресурсу.

Загляни в журнал При настройках, описанных в статье, DACS будет вести четыре файла журнала, которые расположены в каталоге /opt/dacs/logs. Три файла описывают все события, а файл, имя которого начинается с FIRST и далее текущая дата, поможет разобраться с происшедшим в конкретной юрисдикции. В режиме отладки выдается большое количество информации, которая при внимательном анализе поможет разобраться с проблемой.

№9, сентябрь 2006

[Wed Jun 14 10:34:25 2006] [error] [8578,18,-] [dacs_acs:"conf"] Could not load config file '/opt/dacs/etc/dacs.conf'

может свидетельствовать о том, что после правки изменились права доступа, и модуль DACS не может его прочитать. Если пользователь не допущен, система проинформирует администратора. [Fri Jul 28 18:57:12 2006] [notice] [8145,266,A] [dacs_acs:"dacs_acs"] *** Access denied to unauthenticated user (FkA74G32) for /cgi-bin/dacs/prenv

Или, например, когда DACS не нашел описание ресурса (требуется testdacs.net). [Thu Jul 27 18:43:32 2006] [error] [8459,1,-] [dacs_version:"conf"] Could not find config in "/opt/dacs/federations/dacs.conf" using service URI http://localhost:8080/cgi-bin/dacs/dacs_version

Вместо заключения Несмотря на то что DACS уже установлен и работает, чтобы окончательно в нем разобраться, потребуется провести не один эксперимент, меняя параметры и отслеживая реакцию системы. Здесь открываются большие просторы для творчества. Следует добавить еще юрисдикций, хотя бы одну федерацию, передать между ними пользователя, поэкспериментировать с revocations list, несколькими пользователями, ролями. Только так можно будет ощутить мощь и гибкость этой системы. Успехов. 1. Яремчук С. Контролируем доступ к веб-сервису с помощью DACS.//Системный администратор, № 8, 2006 г. – C. 74-78. 2. Сай т пр о ек та OMSE – ht tp: //w w w.omse.de /download / download-dacs-ix-07-2006.shtml.en. 3. Сайт DACS – http://dacs.dss.ca. 4. Сайт проекта Apache – http://httpd.apache.org. 5. Сайт OpenSSL – http://www.openssl.org. 6. Сайт Expat – http://expat.sourceforge.net. 7. Базы данных, которые могут использоваться с DACS – Berkeley DB: http://dev.sleepycat.com/downloads/latestreleases.html; gdbm (она может компилироваться в режиме совместимости с ndbm): ftp://ftp.gnu.org/gnu/gdbm. 8. Сайт проекта Samba – http://www.samba.org. 9. Сайт проекта OpenLDAP - http://www.openldap.org.

71


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

Развиваем модуль DBI

Алексей Мичурин DBI – это Perl-модуль для взаимодействия с базами данных. Наверно, я не сильно ошибусь, если скажу, что он используется в доброй половине всех существующих Perl-программ. Можно ли его усовершенствовать или адаптировать, пользуясь его объектно-ориентированной природой? Конечно!

72


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

П

окопаться во внутреннем устройстве модуля DBI ин- тва имён и две директивы package, оформлено ли это одни тересно по двум причинам. Во-первых, он весьма по- файлом или двумя, пакетами или модулями. Так оно и есть. пулярен и используется в проектах самого разного В недрах модуля DBI существуют два разных класса масштаба. Вам, я думаю, знакома ситуация: крупный проект развивался на MySQL 4.0, и, когда было накоплено не- (пакета или модуля; в терминах Perl это практически одмало кода, MySQL 4.0 сменили на 4.1. В этом случае сра- но и тоже). Первый – класс соединений – DBI::db, второй – зу возникают проблемы с кодировками. Наиболее универ- класс запросов – DBI::st. То есть когда вы инициируете носальное решение – выставлять кодировку после каждого вое соединение: вызова connect, но это может потребовать скорректировать my $dbh=DBI->connect(...); код многих сценариев. Аналогичная ситуация возникает, когда с одной базой работают комплексы программ, разработанные из расчё- вы порождаете объект класса DBI::db (а не класса DBI, как та на разные установки времени; например, одна програм- можно было бы подумать). Аналогично, когда вы конструма предполагает, что системные часы идут по Гринвичу, ируете новый дескриптор запроса: а другая – по московскому времени. Тогда выставить едиmy $sth=$dbh->prepare('select ...'); ное время для базы не представляется возможным и каждый клиент должен выставлять локальную переменную time_zone. Как и в предыдущем, в этом случае есть два вы получаете объект класса DBI::st. Причём обратите внивыхода: первый – «перелопатить» весь код; второй – на- мание, метод prepare, который мы только что вызвали писать модуль, наследующий все свойства DBI, но с неко- и который является конструктором для объектов класса DBI::st, принадлежит объекту класса DBI::db. Методы деторыми коррективами. У каждого из этих подходов есть свои плюсы и ми- скрипторов запросов, соответственно, принадлежат обънусы, выбор во многом зависит от конкретной ситуации, ектам класса DBI::st. но для крупных проектов второй подход реализуется гоТаким образом, DBI – это не один, а два тесно связанраздо проще и быстрее, чем первый. ных класса, что незаметно для прикладного программисКроме того, объектно-ориентированный подход более та, но при детальном рассмотрении оказывается вполне универсален и позволяет решать не только эти, но и мно- логично. гие другие задачи. Вторая причина, по которой обратиться к модулю DBI бу- Пустой модуль, наследующий от DBI дет весьма интересно, – это нетривиальность самого моду- Теперь становится понятно, как унаследовать методы моля. Как мы скоро увидим, чтобы унаследовать методы это- дуля DBI. Вот развёрнутый пример, простой и понятный, как букварь: го модуля, совсем недостаточно строчки: # для DBI это не работает @ISA=qw(DBI);

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

Внутренняя структура DBI Чтобы понять логику модуля DBI, следует сперва обратить внимание на то, что этот модуль предоставляет два класса принципиально различных объектов: дескрипторы базы данных (или соединения) и дескрипторы запросов. Каждый из этих классов является самостоятельным и полноценным. Для каждого имеются конструкторы (connect для баз данных и prepare для запросов), множество различных методов и деструкторы (disconnect и finish, соответственно). То есть DBI описывает два класса и, следуя логике Perl, должен быть не одним, а двумя модулями или пакетами. В любом случае должны быть использованы два пространс-

№9, сентябрь 2006

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:

package DBItoo; use strict; use DBI; use vars qw(@ISA); @ISA = qw(DBI); package DBItoo::db; use vars qw(@ISA); @ISA = qw(DBI::db); package DBItoo::st; use vars qw(@ISA); @ISA = qw(DBI::st); 1;

Этот код, естественно, должен находиться в файле DBItoo.pm. Как видите, это три модуля в одном, содержимое каждого модуля я дополнительно выделил отступами. Все просто: первый модуль – DBItoo – является наследником DBI, второй – DBItoo::db – наследник DBI::db, третий – DBItoo::st – DBI::st.

Разные способы использования собственных модулей Наш модуль DBItoo просто наследует все свойства DBI, не привнося ничего нового. Использовать его можно точно так же, как DBI: #!/usr/bin/perl -w use strict; use DBItoo; my $dbh=DBItoo->connect('DBI:mysql:test', 'root', ''); my $sth=$dbh->prepare('SELECT id, txt FROM tbl');

73


программирование $sth->execute(); while (my ($id, $txt)=$sth->fetchrow_array()) { print "$id $txt\n"; } $sth->finish(); $dbh->disconnect();

Однако есть и другой способ: use DBI; my $dbh=DBI->connect('DBI:mysql:test', 'root', '', ↵ {RootClass => 'DBItoo'});

Здесь мы загрузили обычный DBI, но при создании соединения указали атрибут RootClass=>'DBItoo'. После такого вызова модуль DBItoo будет загружен автоматически и вместо обычного объекта DBI::db будет создан объект DBItoo::db со всеми вытекающими последствиями. Обратите внимание, что при втором способе загрузки строка: 3: use DBI

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

Разные варианты оформления модулей

ClassА и содержит собственный метод b. Как будет вести себя объект B класса ClassB? Что будет происходить при вызове метода B->a (унаследованного от A->a)? Опытные ОО-программисты легко ответят на этот вопрос: если метод b виртуальный, то ответ – B->b; если нормальный – A->b. В Perl нет специального синтаксиса описания виртуальных и нормальных методов. Вместо этого существует простое соглашение: при работе с методами класса всё работает нормально, при работе от имени объекта – виртуально. (То есть один и тот же метод, допускающий два разных вызова, может работать по разным схемам.) Напомню, что методами класса называются методы, вызываемые от имени класса (не требующие существования объекта). Типичными представителями таких методов являются конструкторы: $dbh=DBI->connect(...);

Но это могут быть и методы, устанавливающие некоторые глобальные настройки для всех объектов класса (например, DBI->trace) или сообщающие о ресурсах, доступных в равной мере всем объектам класса (DBI->available_drivers). Методами объекта называются методы, оперирующие с данными определённого объекта. Это, например, $dbh->do().

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

Рассмотренный нами модуль DBItoo можно назвать «прилежно составленным». В реальной жизни модуль-наслед- Метод connect (замещение существующего ник DBI может выполнять множество разных функций, тог- виртуального метода) да, возможно, его будет удобнее разбить на отдельные фай- Чаще всего возникает необходимость скорректировать лы; или, наоборот, вам может понадобиться лишь чуть до- поведение DBI при создании соединения. Переопредеполнить стандартный DBI, тогда излишний код будет толь- лять метод connect для этого не требуется, разработчико помехой. Минимальный модуль-наследник (я назвал его ки DBI предусмотрели специальный метод connected, коDBItoo_cmpct) выглядит так: торый вызывается методом connect после успешного соединения с базой. В исходном модуле DBI этот метод ни@DBItoo_cmpct::ISA = qw(DBI); чего не делает, но он может быть переопределён в клас@DBItoo_cmpct::db::ISA = qw(DBI::db); се-наследнике. @DBItoo_cmpct::st::ISA = qw(DBI::st); 1; Для нас существенно то, что метод connected вызывается не как метод класса, а как метод «вновь испечённоЕсли вы хотите, чтобы модуль можно было подключать го» объекта-дескриптора соединения. В качестве аргуменвсеми возможными способами, то в него следует добавить тов методу connected передаются все аргументы соответсстроку «use DBI;». Использование подобных сокращённых твующего connect. конструкций можно одобрять или не одобрять. Я ни в коем Внимательный читатель уже успел оценить всё изяслучае не настаиваю на их применении, но буду использо- щество конструкции. Метод connected является методом вать их далее в статье, просто чтобы не перегружать лис- объекта, то есть он является виртуальным, а это означатинги большими повторяющимися кусками кода. ет, что мы можем его переопределить в модуле-наследнике и метод connect из родителя (DBI) будет вызывать наш метод, а не метод-пустышку из DBI. Несколько слов о наследовании в Perl Если вы используете MySQL старше 4.1, то наверняка Прежде чем перейти к практике, давайте вспомним несколько терминов из теории ОО-программирования, отно- сталкивались с проблемой кодировок. В идеале, сразу поссящихся к наследованию. ле создания соединения клиент должен оговорить, в какой Допустим, у нас имеется объект A класса ClassA. У не- кодировке он работает. Давайте создадим модуль, который при соединении го имеются два метода – A->a и A->b. Причём метод A->a в процессе своей работы вызывает метод A->b. Теперь сразу устанавливает кодировку КОИ8. Я назвал его DBIru мы создаём класс ClassB, который является наследником (файл DBIru.pm):

74


программирование 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:

use strict; @DBIru::ISA = qw(DBI); @DBIru::st::ISA = qw(DBI::st); package DBIru::db; @DBIru::db::ISA = qw(DBI::db); sub connected { my ($dbh, $src, $login, $passwd, $attr)=@_; $dbh->do('SET CHARACTER SET koi8r'); } 1;

Как и следовало ожидать, метод connected принадлежит к пространству имён DBIru::db, так как он является методом дескриптора соединения. Ничего экзотического он не делает, просто устанавливает кодировку. Здесь же можно выставить часовой пояс: $dbh->do(q|SET time_zone='+04:00'|);

Другие способы инициализации соединения Тема инициализации соединения представляется мне настолько важной, что я просто не могу обойти вниманием другие способы настройки соединения, не относящиеся к созданию дочерних модулей. Установить кодировку можно, используя конфигурационный файл. Сперва создаём файл следующего содержания: [dbi_options] default-character-set=koi8r

Допустим, мы назвали его /home/etc/my.cfg. Теперь при создании соединения мы должны указать модулю DBI (а он передаст эту информацию драйверу DBD::mysql), что при соединении следует обратить внимание на настроечный файл: $db=DBI->connect('DBI:mysql:test;'. 'mysql_read_default_file=/home/etc/my.cfg;'. 'mysql_read_default_group=dbi_options', 'root', '');

Имя файла указывается в параметре mysql_read_default_file, а секция файла, которую надо прочитать, – в параметре mysql_read_default_group. Конечно, это работает только для MySQL, подход, которому посвящена статья, гораздо более универсален, но создать конфигурационный файл всё-таки несколько проще, чем модуль-наследник. К сожалению, выставить часовой пояс таким образом не получится. Если вы являетесь единственным пользователем базы данных (или другим пользователям безразлично, какое время возвращают SQL-функции типа NOW()), то зону можно выставить глобально:

Наиболее полезным примером мне представляется метод ping. Конечно, модуль DBD::mysql поддерживает метод ping, но если вы мигрируете на другую базу данных, то можете не обнаружить метода ping в соответствующем DBD-драйвере. (Особенно этим грешат драйверы для работы с файлами.) Модуль DBI содержит только «пустышку», которая всегда возвращает «0 but true». Вместе с тем если вы использовали собственный метод ping, то не почувствуете смены DBD-модуля. Вот текст модуля DBIping.pm: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:

use strict; @DBIping::ISA = qw(DBI); @DBIping::st::ISA = qw(DBI::st); package DBIping::db; @DBIping::db::ISA = qw(DBI::db); sub ping { my ($dbh)=@_; my $r=0; eval { local $SIG{__DIE__} = sub { return (0); }; local $SIG{__WARN__} = sub { return (0); }; $r=$dbh->do('select 1'); }; return ($@)?0:$r; } 1;

Метод ping, как и положено, проверяет, не было ли потеряно соединение с базой. Для этого он пытается сделать элементарный запрос к базе и анализирует результат. Конечно, многие базы данных имеют в своём API самостоятельный метод ping, но наш ping сможет работать практически с любой базой данных. Если вы используете модуль DBIping вместо DBI, то можете навсегда забыть о проблемах с методом ping.

Другие методы соединения Отмечу, что к методам соединения относятся не только connect, disconnect, rollback, begin_work, но и prepare, и do, и даже last_insert_id, selectrow_array, которые, на первый взгляд, работают с данными и интуитивно могут быть отнесены к методам запроса. Не стоит обманываться, смотрите в корень – на объект, для которого вызывается метод.

Наследование методов запросов Аналогично можно переопределить или добавить методы запроса. Я не буду приводить примеры этих действий. Давайте теперь подправим существующий метод – execute.

Модернизация метода execute

Я предлагаю заставить метод execute протоколировать все запросы. Зачем это может понадобиться? Например, вы поддерживаете большой проект. Со временем ресурс наmysql> SET GLOBAL time_zone = '+04:00'; бирает популярность, нагрузка на базу данных возрастает, и вы замечаете, что сервер начинает «задыхаться». ПриНо чаще всего это решение не подходит, так как раз- чину установить бывает трудно, так как все запросы достаный софт, использующий один сервер, требует разных на- точно легки, просто их много. В таком случае бывает очень полезно собрать статистику по запросам за недельку и простроек временной зоны. анализировать их: какие запросы выполняются чаще, не надо ли где-то создать индексы... Из такой статистики порой Метод ping (страхующее замещение метода) Итак, мы попробовали переопределять методы DBI. Давай- можно узнать самые неожиданные вещи и не раз воскликте теперь попробуем создать собственный новый метод. нуть «Эврика!».

№9, сентябрь 2006

75


программирование Вот текст модуля DBIlog: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:

use strict; @DBIlog::ISA = qw(DBI); @DBIlog::db::ISA = qw(DBI::db); package DBIlog::st; @DBIlog::st::ISA = qw(DBI::st); sub execute { my $st=shift; my @args=@_; my $s=$st->{'Statement'}; $s=~s/\s+/ /g; open FH, '>>statments' or die; print FH "$s\n"; close FH; return $st->SUPER::execute(@args); } 1;

Начинается этот модуль аналогично уже рассмотренным, в пространстве имён DBIlog::st расположена одна единственная функция execute, которая заменит одноимённый стандартный метод. В восьмой строке мы получаем указатель на объект (this), в девятой – аргументы, переданные явно. В десятой строке мы получаем строку SQL-запроса. Далее мы выкидываем из неё все повторяющиеся пробелы, а заодно заменяем разрывы строк на пробелы. Это сильно облегчит нам работу с log-файлом; формат у него получается очень простой: одна строка – одна команда. Далее (строки 12-14) открываем файл, записываем строку и закрываем файл. В пятнадцатой строке мы вызываем «родной» метод execute, пользуясь специальным префиксом SUPER::, и возвращаем результат. Конечно, чтобы этим модулем можно было пользоваться в полной мере, в нём надо бы предусмотреть нормальные сообщения об ошибках и блокировку файлов для корректной работы в многозадачной среде, но это уже дело техники.

Работа со свойствами объекта С методами объектов мы уже выполнили все возможные операции, давайте теперь рассмотрим более тонкую материю – данные объекта. Например, можно сделать так, чтобы метод execute фиксировал в объекте-запросе время выполнения, которое потом можно будет получить и проанализировать. Так вы сможете узнать, сколько времени ваша программа потратила на обработку результатов запроса. Большинство баз данных позволяют узнать, сколько времени было потрачено на обработку запроса. Сравнив эти два показателя, вы можете сделать вывод о том, где находятся узкие места в вашем коде. Объект запроса (как и большинство объектов Perl) является хэшем, и наша задача сводится к простому добавлению ещё одного элемента в этот хэш. Для начала, я предлагаю вот такую реализацию: 1: 2: 3: 4: 5: 6: 7: 8: 9:

76

use strict; @DBItime::ISA = qw(DBI); @DBItime::db::ISA = qw(DBI::db); package DBItime::st; @DBItime::st::ISA = qw(DBI::st); sub execute { my $st=shift; my $s=$st->SUPER::execute(@_);

10: $st->{execure_at => time()} if ($s); 11: return $s; 12: } 13: 1;

Теперь в основной программе в любой момент можно обратиться к свойству объекта execure_at и получить время окончания операции execute для этого объекта. С точки зрения чистого ОО-программирования было бы корректнее написать метод для доступа к этому полю, но основные проблемы кроются совсем не в этом.

Конструкторы и подводные камни Основные опасности чаще всего возникают как раз при добавлении данных. Во-первых, все данные лучше всего добавлять в конструкторе, а не в обычном методе, как мы это сделали в предыдущем примере. Иначе получается, что метод, добавляющий данные, какбы доделывает объект – берёт на себя часть функциональности конструктора, что противоречит принципам объектноориентированного программирования. Вас это не смущает? Тогда я скажу ту же мысль иначе: получается, что конструктор создаёт «недоделанный» объект, нуждающийся в дальнейшей доработке. Это нехорошо. Во-вторых, и в конструкторе это надо делать вдвойне осторожно. Дело в том, что SUPER-конструктор в случае ошибки может вернуть не объект, а ноль или неопределённое значение. Если мы не отследим эту ситуацию и попытаемся добавить некоторые данные к объекту, то Perl автоматически создаст ссылку на хэш, но она не будет ассоциирована ни с каким классом. Таким образом ваш конструктор отработает без видимых ошибок, и даже результат его работы будет похож на правду (true), но дальнейшее использование созданного «объекта» может вызвать странные ошибки, природу и причины которых будет не просто понять.

Что ещё можно добавить в DBI В этом разделе мы рассмотрим ещё несколько примеров, которые могут быть полезны, но использовать их нужно осторожно.

Новый метод md5 При работе больших баз данных иногда полезно отслеживать изменения некоторых таблиц (например, чтобы не делать лишних резервных копий больших и редко изменяющихся массивов информации). Как быстро и надёжно определить, изменилась ли таблица, в которой, скажем, несколько миллионов записей? MySQL 4.1 (и выше) предоставляет прекрасную возможность – подсчёт контрольной суммы. (В некоторых ситуациях можно ограничиться просто подсчётом строк, это гораздо быстрее.) Давайте добавим новый метод базы данных $dbh->md5(). Для этого создадим модуль DBImd5: 1: use strict; 2: @DBImd5::ISA = qw(DBI); 3: @DBImd5::st::ISA = qw(DBI::st); 4:


программирование 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:

package DBImd5::db; @DBImd5::db::ISA = qw(DBI::db); sub md5 { my ($db, $table)=@_; my $sql='CHECKSUM TABLE '. $db->quote_identifier($table); my $st=$db->prepare($sql); $st->execute(); my (undef, $md5)=$st->fetchrow_array(); $st->finish(); return $md5; } 1;

Если вместо DBI использовать этот модуль, то в вашем распоряжении окажется ещё один метод соединения: $dbh->md5(имя_таблицы);

который будет возвращать контрольную сумму всех данных таблицы. Чтобы код не потерял наглядность, я не стал проверять в нём ошибки, ограничившись только самыми важными и необходимыми процедурами. Я имею в виду вызов функции quote_identifier. Ни в коем случае не подставляйте в SQL-запрос имя таблицы «как есть». Это сразу создаст большую брешь в безопасности. Остальные проверки не так принципиальны, и читатель может добавить их сам – по вкусу. Чем же плох этот метод? Ответ может показаться философским, но весь мой опыт показывает, что за этой философией стоит железный прикладной смысл. Дело в том, что модуль DBI реализует определённую абстракцию. Он, как известно, передаёт запросы серверу и получает данные. Обратите внимание: он не формирует запросы, он их только передаёт. Конечно, эта абстракция соблюдена не совсем строго, не все методы одинаково хороши для разных запросов и наоборот. Но в данном случае мы нарушили концепцию. Не менее важно и то, что DBI задумывался как интерфейс, не зависящий от конкретной СУБД. Мы же, добавив метод md5, прочно привязались не только к конкретной базе данных, но и к конкретной её версии. Если учитывать тот факт, что мы никому не навязываем наш модуль и не позиционируем его как универсальный, то наше «преступление» не будет казаться столь уж большим, но концепция всё равно оказывается попрана. Я вовсе не утверждаю, что наш метод md5 не применим или вреден. Если посмотреть на него непредвзято, то он ничем не хуже, скажем, метода last_insert_id(). Но, следуя по этому пути, надо быть предельно осторожным. Если вы разрушите абстракцию модуля DBI, то он во многом утратит свою ценность. Возможно, методы и функции, противоречащие философии DBI, лучше выносить в другие модули? Нужно взвесить все «за» и «против», прежде чем начать кодировать.

Замена NULL-значений на лету Давайте переопределим метод fetchrow_array так, чтобы он автоматически заменял все неопределённые значения на строку «N/A». 1: use strict; 2: @DBIautodef::ISA = qw(DBI); 3: @DBIautodef::db::ISA = qw(DBI::db);

№9, сентябрь 2006

4: 5: package DBIautodef::st; 6: @DBIautodef::st::ISA = qw(DBI::st); 7: sub fetchrow_array { 8: my $st=shift; 9: return map {defined($_)?$_:'N/A'} ↵ $st->SUPER::fetchrow_array(); 10: } 11: 1;

Ничего, требующего дополнительных комментариев, в этом коде нет. Мы корректно наследуем методы из DBI, DBI::db и DBI::st; в пространстве имён DBIautodef::st создаём метод fetchrow_array. В нашем методе fetchrow_array мы вызываем оригинальный fetchrow_array, используя префикс SUPER. Результат обрабатываем и возвращаем. В определённых условиях тот метод может быть очень полезен. Одной только заменой DBI на DBIautodef вы избавитесь от всех неопределённых значений, возвращаемых запросами. Если вы выбираете данные для отчётов, наш модуль может весьма и весьма облегчить вашу работу. Но у него есть и важные недостатки. Во-первых, не станет ли подобное поведение метода fetchrow_array помехой? Надеюсь, вы всё хорошо продумали? Во-вторых, а как поведут себя методы fetchrow_arrayref и fetchrow_hashref? А многочисленные методы selectrow_array, selectall_arrayref и их близнецы? Документация DBI не говорит ничего определённого о том, какой из этих методов является «основным». Это может зависеть от конкретного DBD-драйвера, и здесь надо быть предельно осторожным. В-третьих (и, на мой взгляд, это наиболее важно), наш метод снова нарушает логику DBI, ведь DBI не производит никаких манипуляций с данными, он их просто передаёт. Не лучше ли в данном случае сделать одну-единственную функцию, избавляющую вас от неопределённых значений? Этот вопрос не риторический, ответ зависит от конкретных обстоятельств. Если вы выберете более «правильный» подход и создадите простую функцию, то вам придётся скорректировать весь код, включив эту функцию везде, где это необходимо. А если код писали не вы? А те, кто его писали, уже уволились и забыли вообще, как это написано? Тогда, возможно, лучше попрать свои религиозные чувства и грубо наступить на горло идеалам, заложенным в архитектуру DBI.

Заключение DBI не случайно написан объектно-ориентированным. Его конструкторы разделены на продуманные компоненты, которые делают его ещё более гибким при наследовании. Всё это открывает перед разработчиком бескрайние просторы для совершенствования DBI, что может существенно облегчить разработку и/или перенос и адаптацию уже существующего кода. Но прежде чем вы начнёте улучшать DBI, обязательно сделайте две вещи: ещё раз внимательно прочитайте документацию – возможно, то, что вам нужно, уже реализовано; и взвесьте все «за» и «против», ведь DBI является фундаментом многих программ, и малейшие неточности в фундаменте могут покривить всё здание.

77


IMHO

В поисках профессиональной этики сисадминов

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

Ф

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

78

пов задумывался любой автор, добро- на данную тему [2], отслеживая измесовестно подходящий к процессу опи- нение среды и спроса, но разделы, поссания системного администрирования. вященные «вечным вопросам», почти Например, широко известно «толко- не менялись и путешествовали из извание от Эви Немет». В нашей стра- дания в издание. Поэтому оказалось, не познакомились с ним по перево- что принципы деятельности сисадмина ду второго издания руководства сис- Linux, согласно изданию 2002 года [3], темного администратора [1] от группы буквально повторяют морали от 1995 авторов под предводительством это- года [1]. Быть может, авторы нашли то го специалиста. И хотя далее Эви Не- самое, что уже более не совершенсмет опубликовала много литературы твуется? Предполагаю, что нет! Эви


IMHO Немет и компания были проповедниками подчинения деятельности сисадминов корпоративной политике. А признаком зрелости профессии является создание независимой системы профессиональных норм. Например, таких, что регламентируют деятельность адвокатов, врачей и даже бухгалтеров в развитых странах! Когда пытаются рассмотреть данную проблему, то, как правило, рассуждают со стороны некой абсолютной и абстрактной правды или социального заказа. Например, чтобы автомобиль доехал из точки А в точку В с оптимальной скоростью, рассматривают, сколько надо залить бензина, как надо «давить» акселератор, какого качества должно быть дорожное покрытие, и никто, подчеркиваю, – никто! – не пытается рассмотреть данную проблему с точки зрения «самого» автомобиля. А «ему» лучше вообще никуда не ездить, а стоять чистеньким в гараже. Так и с системным администрированием, все варианты рекомендаций созданы явно с подачи заказчиков. Причем трансформация произошла незаметно. Началось все с книжек, подобных пресловутой серии «библий» от Эви Немет. Затем идеи сортировки сисадминов по методам ведения работы на «бандитов», «фашистов» и «идиотов» проникли в массовое сознание [3]. И завершилось все вполне официальным бойскаутским катехизисом [5] от Red Hat Inc., претендующим на истину в последней инстанции. Но представители профессиональной группы тоже имеют свои интересы и тоже могут нуждаться в защите. Этот вопрос также должен регулироваться прозрачным образом. Получается, что и требования общества к представителям профессии, и претензии самих профессионалов должны получить некоторое формальное выражение и закрепление в виде соглашения. Со стороны общества такое закрепление создается признанием норм поведения профессиональной группы и поддержкой этих норм, выраженной законодательно. Конечно, в рамках одной журнальной статьи невозможно решить эти вопросы. Здесь лишь попытаюсь определить направления формирования такой системы норм или профес-

№9, сентябрь 2006

сиональной этики, начиная с книг Эви ми (всем известный конверт с пароНемет и завершая другими публикаци- лем суперпользователя) дает достаями, и поставлю задачи, не нашедшие точно ясную картину ошеломленного отражения в указанных работах. человека, который только-только разобрался с проблемами и спешит поделиться своими рецептами. Особо троПримитивная корпоративная этика гательно упоминание авторов о том, Вопросы общего характера в трудах как «машины другого факультета инЭви Немет и команды рассматрива- фицировали весь университетский гоются в самом начале, как «основные родок». Вот проблема-то! К чести авзадачи системного администратора», торов, они не повторили этот же прии ими же завершаются книги упомя- мер в версии [3]. Вообще в [3] практинутого «сиквела», это глава «Страте- чески нет примеров из университетсгия и политика». Иногда заголовки ва- кой практики. Хотя, быть может, дело рьируются, но общая схема повторяет- в элементарном взрослении и смене ся с педантичностью плана школьного места работы. Но даже на таком примитивном масочинения: введение в профессию, основной блок «технических аргументов» териале Эви Немет сотоварищи сделаи заключительное напутствие. ли ряд очень важных замечаний, котоУчитывая хронологию и некоторые рые нельзя не процитировать и проположения этих материалов, отнесу их комментировать: к начальному этапу осмысления про...Вы ...захотите стать штатным фессиональной этики. Даже «основ- администратором. ...проблем с поные задачи» представляют собой прос- иском работы у вас не будет. Но отто набор абстрактных пожеланий рабо- ношения с коллегами и руководстодателя. Вроде того, что бы вы хотели твом ... обязательно обострятся. от сисадмина, но стеснялись это поп- [1, 1.6] Это фактическое признание, что сиросить. Авторы постоянно сбиваются на бытовые примеры и случаи из уни- садмин является участником обычного верситетской практики самозаявлен- сервисного антагонизма. В версии [3] ных админов. И временами откровен- оно отсутствует, так как там уже деклано признаются, что описывают предмет рируется подчинение сисадмина корс позиции новичка: «Вы можете обна- поративной политике, а внутри корпоружить, что системное администриро- рации антагонизм неприемлем, так как вание вам нравится, и захотите стать там царит «тимбилдинг» (team building – штатным администратором.» [1, раз- методика сплочения коллектива). Ответственное лицо должно дел 1.6]. Забавно, что и к публикации семью годами позже [3, раздел 1.9] ав- иметь диктаторские полномочия. торы снова в нерешительности и бук- [1, 32.2] Конечно, это в адрес сисадмина вально слово в слово повторяют совет. За семь лет можно бы и определиться в период ликвидации проблемы. В позс выбором профессии! дней версии [3] снова отсутствует. Ну Итак, рассмотрим, как специалис- какая диктатура может быть в устоявтами под руководством Эви Немет по- шейся корпоративной иерархии? Вышестоящее руководство часто нимаются принципы деятельности системных администраторов. Буду исхо- не имеет ни малейшего представледить из того, что вы имеете возмож- ния о том, чем занимаются системность ознакомиться с подлинника- ные администраторы. [1, 32.8] Данное положение в [3] еще более ми [2], и здесь стану отмечать только важные, с моей точки зрения, или при- усугублено. Раздел «Как руководить руководителями» стал короче, но намечательные положения. Прежде всего авторы используют полнился конкретными замечаниями эмпирические и экспертные правила. и выводами. Например, в число непоСамые сильные аргументы: «Мы бесе- нятливых руководителей добавлены довали с видными деятелями в облас- «менеджеры нетехнического звена». Удваивайте или утраивайте врети системного администрирования...» и «Мы знаем одну фирму...». Но в це- мя, которое, на ваш взгляд, полом оперирование интуитивно понят- надобится для решения ... задач. ными истинами и бытовыми рецепта- [1, 32.8]

79


IMHO Очень важное положение, присутствующее и в [1] и в [3]. На мой взгляд, это меткое замечание вместе с предыдущим предложением подчеркивает, что сисадмин обязан действовать исходя из профессиональных, а не общепринятых взглядов на его работу. Эви Немет оправдывает это профессиональными рисками. Логика совершенно прозрачна. Поскольку никто не имеет представления о сути работы сисадмина, то в случае неудачи он рискует необъективным расследованием. Если же работа пройдет «гладко», то по той же причине никто не усомнится в оценке трудозатрат. Системные администраторы ... часто забывают, что они – поставщики услуг, а пользователи – их клиенты. Многие администраторы втайне считают, что системы принадлежат им... [1, 32.9] Дословно повторено в [3]. Ну, естественно, надо же показать сисадмину, что все кругом не его, а вот сам он всем окружающим полностью обязан. Очень напоминает: все, что твое, то общее, а вот что общее, то уже не твое. Но обратный вывод, что сисадмин обязан компании лишь в меру оплаты его услуг, почему-то авторы забыли сделать! В продолжении этой мысли авторы возвращаются к тому, что им трудно определиться кто же прав в решении вопросов типа «сисадмин vs наниматель» и признаются: Некоторые качества хорошего системного администратора противоречат друг другу. [1, 32.9] В [3] прояснение так и не снисходит к ним, и авторы снова повторяют это высказывание буквально. Далее замечание на первый взгляд совсем не по теме этики и морали: Что делает резервная копия? Надежно нарушает защиту файла. [1, 32.14] Это самое парадоксальное экспертное мнение, процитированное в [1]. В версии [3] отсутствует. Вероятно, администраторы linux-систем не занимаются резервным копированием, по мнению Эви Немет и компании. Но нам интересно это высказывание, так как оно признает, что даже в повседневной деятельности сисадминов постоянно складываются ситуации, ломающие общепринятые стереоти-

80

пы (в данном случае стереотипы бе- те системных администраторов мнозопасности). гое строится на доверии. [3, 29.8] Но вместе с тем в [3] возник ряд ноВот оно как! То есть этика есть, но как набор моральных норм, укрепвых утверждений: ...администратору необходим до- ляющих доверие к ... К чему же? И даступ к копиям важных данных, на- лее Эви Немет поясняет: Администратор должен соблюходящихся в компьютерах и на внешних носителях. [3, 29.2] дать конфиденциальность инфорИначе говоря, сисадмин тем эф- мации, с которой работают пользофективнее работает, чем меньше ог- ватели, и защищать профессиональраничений в доступе он имеет. ные секреты компании. [3, 29.8] Системные администраторы Ну вот и проговорились – все-таобычно не отвечают за то, что поль- ки интересы компании в первую очезователи хранят на своих компью- редь! И это на фоне того, что сисадтерах. [3, 29.3] мин не несет ответственности за соХорошо подмечено. Если развить держимое пользовательских компьюэту мысль, то системные администра- теров, с одной стороны, и обязан доторы не могут отвечать за процесс ра- носить о нарушении лицензий – с друботы пользователей, в результате ко- гой! Прямо каша какая-то! Уму не посторого образуются те самые данные, тижимо, как выполнить все рекомендаза которые они не отвечают. Но чуть ции хитроумной Эви Немет и ее сумадалее уже не так лаконично авторы тошных соавторов. выворачивают все наизнанку, докаВ заключение можно только позывая, что: радоваться, что работы [1, 3] созданы ...чем больше вы контролируе- выходцами из академической среды, те использование интернет-ресур- а не искушенными последователями сов, тем большую ответственность Хаббарда. И поток поведенческих ренесете за действия пользователей. комендаций, выработанный в локаль[3, 29.3] ных сетях кампусов, не такой уж больИ уж совсем непоследовательно шой. Но обращаю ваше внимание, как группа авторов с Эви Немет во гла- на авторов давит необходимость сдеве высказывается в отношении нели- лать реверансы в пользу их корпорацензионного копирования програм- тивных работодателей. много обеспечения. Там даже нельзя процитировать твердую рекоменда- Народные представления цию. Просто отсутствует конкретная Вне всякой зависимости от литерафраза, которая точно описывает авто- турной версии самоосознания сисадрскую позицию. Вместо этого какие-то минского профессионализма, в предбесхребетные поучения: ставлениях окружающих, да и в са...помните, что речь идет о вашей мой среде системных администратоличной и профессиональной чест- ров, тоже зарождались некие зачатности. [3, 29.3] ки стереотипов поведения. Но только Хотя если следовать предложенно- не в виде моральных кодексов, а в виму ими же принципу разделения отвес- де всяких фольклорных форм, напритвенности, то сисадмин не должен от- мер, анекдотов. Но самое лучшее, навечать за копии ПО, нарушающие ли- иболее полное и, несомненно, известцензии. Но авторы здесь требуют от си- нейшее воплощение этого принадлесадминов вопреки всякой логике «сту- жит перу Стефана Зелински [4]. Отечать» на своих клиентов. чественные любители «сетевого юмоИспользование термина «эти- ра» знакомы с переводом [5], который ка» в [1] можно заметить, но и только. чуть короче оригинала. В этом произВ контексте раздела «Военные исто- ведении рассматривается в утрирории и этика» первое с избытком, а вто- ванной форме поведение 4 типов сисрое лишь как синоним балластной мо- темных администраторов, отличаюрали. А вот в [3] уже специально объ- щихся этическими установками и сояснена авторская позиция: ответственно мотивацией. Невыдуманные истории и этиТехнический бандит, администрака поведения. При чем здесь этика, тор-фашист, маньяк и идиот последоспросите вы? Дело в том, что в рабо- вательно попадают в типичные про-


IMHO изводственные ситуации. Каждый действует в силу собственных убеждений и привычек. По замыслу автора, ни один не добивается успеха. На этом и построен комизм положения. То есть тут должен содержаться определенный юмор. Но, увы, не всегда именно тот, что планировал автор. И возможно, при детальном рассмотрении в этом замечательном произведении оказывается еще более оснований для смеха. Несмотря на желание автора высмеять методы администратора-фашиста, наряду с остальными, очень часто именно его действия происходят в рамках ожидаемого, и именно они оказываются более успешными, чем действия остальных. Рассмотрим выборочно несколько типовых ситуаций из [5].  Ситуация 1. Нехватка дискового пространства. Технический бандит погружается в пучину исследований и прогнозов. Маньяк просто удаляет самые большие файлы. Идиот самые большие файлы пытается упаковать. А вот админ-фашист: «Активно пользуется квотированием диска.» Автор пытается передернуть ситуацию: «Не допускает никаких исключений, чем полностью останавливает деятельность разработчиков». То есть в этом случае разработчики настолько слабоумны, что не реагируют на сообщения операционной системы. Возможно, ситуация взята из практики. (Ситуации 2 и 3 пропустим.)  Ситуация 4. Авария загрузочного диска. Технический бандит совершает чудеса и восстанавливает все сам. Маньяк сводит все к скандалу. Идиот не замечает ничего. А вот админ-фашист: «Начинает расследование аварии...» То есть делает то, что и требуется. Кстати, предложения в [3] наиболее близки действиям администратора-фашиста.  Ситуация 5. Слабая производительность сети. Технический бандит опять занимается какой-то самодеятельной модификацией. Маньяк просто размыкает кабели. Идиот делает нечто непотребное. А вот админ-фашист снова на высоте: «Звонит в Беркли и АТ&Т, приставая к ним, как установить сете-

№9, сентябрь 2006

вые квоты. Пытается уволить поклонников игры в xtrek.» Правилам работы в сети Эви Немет посвящает в [3] целый раздел. Нет нужды повторять, что использование сети для игр они не предусматривают.  Ситуация 6. «Глупые» вопросы пользователей. Технический бандит просто издевается над чайниками. Маньяк ведет себя как идиот из ситуации 5. Идиот увлекается панибратством. И снова админфашист делает практически то, что может привести к успеху: «Блокирует вход пользователя в систему, пока тот не представит веские доказательства своей квалификации». Эви Немет в [3, раздел 29.2] предлагает не допускать к работе пользователей, пока они не согласятся с правилами использования. Если предполагается осознанное согласие, то оно подразумевает наличие квалификации, достаточной для понимания и применения правил.  Ситуация 7. Установка новой операционной системы. Технический бандит ведет себя как типичный пользователь Gentoo. Маньяк просто всех выкидывает из системы. Идиот копирует дистрибутивный диск в ядро. А админ-фашист: «В первую очередь изучает законодательные акты против производителя, поставляющего программное обеспечение с ошибками». Ну разве это не разумно? Раскроем карты, как же Стефан Зелински определил типаж администратора-фашиста – «Обычно законченный тунеядец, вынужденный заниматься администрированием системы». Очень мило! Это так типично для сисадмина. Ведь недаром лень считается добродетелью системного администратора. Похоже, Стефан Зелински попал прямо «в яблочко», совсем не целясь. Он умудрился указать самый правильный стиль поведения сисадмина! Хотел посмеяться, но вместо этого научил!

Изощренная корпоративная этика Но, безусловно, всех превзошли гуру из Red Hat Inc. С русским перево-

дом последней версии можно ознакомиться в [6]. Наиболее старый из размещенных в Сети оригиналов можно найти по адресу [7] и определить, что они слабо эволюционируют. Конечно, можно предположить, что мнение специалистов Red Hat Inc. являет собой наиболее свежий и, значит, наиболее верный взгляд на обсуждаемый предмет. Но на деле это не так. Требования не только много раз продублированы, но и часто противоречат одно другому. Общее впечатление таково, что авторы стремились не оставить сисадмину никаких шансов уклониться от выполнения придуманных ими обязательств. Далее буду по-порядку анализировать каждое утверждение «Философии системного администрирования» от Red Hat Inc. 1. Автоматизировать все, что можно. Естественно, не нужно понимать буквально. Безусловно, не в силах сисадмина автоматизировать все. Но даже с такой поправкой – «уступайте старикам, помогайте женщинам» – данное правило не приемлемо. И оговорка, мол, поищите сначала решение в Интернете, тоже ничего не меняет. Это правило фактически призывает системного администратора заняться несвойственной ему работой в стиле «технического бандита» Стефана Зелински [5]. Задумаемся, чем же должен заниматься сисадмин и кто он такой вообще? Вопервых, сисадмин – это нанятый сотрудник, а во-вторых, он должен обслуживать эксплуатационный цикл информационных систем (далее ИС), и не более! Создание новых сущностей или объектов своей работы не входит в его задачу. Даже самое первое обоснование «любое задание, возникающее более одного раза» надо считать вздорным! В работе системного администратора не возникает никаких заданий. Вся его работа подчинена и полностью обусловлена возможностями программного обеспечения и аппаратуры. Что значит, далее цитирую из [6], «возникло более одного раза» и, чуть далее, «проверка свободного дискового пространства»? Это откровенный бред! Или в эксплуатируемой ИС предусмотрена данная отчетность, или нет. Не может руководство вдруг поставить такую задачу. И не может сам системный ад-

81


IMHO министратор, однажды проснувшись, вдруг озаботиться данной проблемой. Но все проясняется далее. Цитирую: «функции, связанные с деятельностью компании», и, самое смешное, «загрузка новых данных на веб-сервер…». Вот и итог развития подобной ущербной логики. Сисадмина превращают в «палочку-выручалочку», в дополнительного сотрудника рекламного отдела или в аварийного бухгалтера. Вы этого хотите? Я нет! Итак, сисадмин должен заниматься эксплуатацией, а не автоматизацией. Вся автоматизация должна рассматриваться как отдельная задача. И на период выполнения этой задачи системный администратор становится разработчиком. Теперь задумаемся. Если наниматель оплачивает работу сисадмина исходя из 100% занятости, то сисадмин-разработчик или осуществляет свою внедренческую деятельность за свой счет, или в ущерб основной работе. Третьего не дано! Следовательно, какая-либо автоматизация не входит в обязанности сисадмина. Все работы по модификации ИС должны оплачиваться отдельно и, возможно, даже как отдельный проект, с привлечением субподрядчика. Таким образом, исключая примитивное скриптостроительство, сисадмин не должен заниматься никакой автоматизацией! Если же в вашей практике возникает подобная необходимость, рассматривайте ее как модернизацию системы. Если сисадмин, ваш подчиненный, занят этим, значит, в первоначальной спецификации ИС есть ошибки. 2. Документировать все, что можно. Здесь вздорность видно даже невооруженным глазом. Внимательный читатель должен и сам заметить, что такая постановка задачи есть следствие из только что обсужденного заблуждения. Ибо, когда возникает проблема документации? Только тогда, когда сисадмин выполнил нештатную модификацию. И только в этом случае он должен задокументировать ее, так как все ординарные действия уже описаны в руководствах, сопровождающих ИС и ее компоненты. Более того, если задуматься, то процедура документирования, как сугубо ручной процесс, в корне противоречит принципам эксплуатации автома-

82

Хотя, быть может, я что-то не так тизированных систем. Вопрос нужно ставить так, что ИС должны обла- понял. И авторы опуса на самом дедать свойствами самодокументирова- ле предлагают иное. Цитирую: «Отния. Например, из предыдущего тези- дел бухгалтерского учёта испытываса – «проверка свободного дискового ет трудности с сервером базы данных, пространства», если такой параметр который временами очень медленно протоколируется, чем данные отчеты работает. Вы планируете остановить не документация? Ведь можно рас- сервер, заменить процессорный мосматривать некий мониторинг, а мож- дуль на более мощный...». Да нет, все но и задокументировать моментальное верно! Полный вздор! «Перевожу» процитированное: отдел бухучета зазначение выбранного параметра. Таким образом, если ИС строится планировал модернизацию оборудопо устойчивым индустриальным и кор- вания; для этого была запланирована поративным стандартам, то не возни- модернизация сервера; для чего быкает никаких проблем, требующих не- ло куплено новое оборудование; и это штатного документирования. То есть все прошло массу согласований, начидокументировать надо лишь, что нуж- ная с финансовых и кончая процедурно. В противном случае неверно вы- ными... Вам все еще кажется, что сибрано программное обеспечение, садмин должен прийти в бухгалтерию требующее неординарной настройки, и рассказать о запланированной моили принят на работу бездарный си- дернизации? Есть маленькая разница садмин, выполняющий все работы од- между «рассказать» и «известить». Соному ему ведомым способом. Не знаю, гласитесь, что «известить» не укладычто хуже. Вероятно, надо учитывать, вается в категорию общения. Это бличто будет дороже! же к командному наречию. Именно то3. Общаться как можно больше. му, к которому в реальной практике обЭто самый смешной раздел! В глазах щения и приходится прибегать. всех пользователей сисадмин, в лучНо кое-что верно подмечено. Здесь шем случае, «домовой из аппаратной». авторы не могли не признать, что слеВ глазах сисадмина пользователи, дует максимально оградить пользов лучшем случае, назойливые источ- вателей от ненужных им технических ники проблем. Рассказывать пользо- подробностей. Сформулируем наш вателям о структуре системы или не- подход в данном вопросе: надо всебезопасно, если они въедливые, или ми возможными способами ограничибесполезно во всех остальных случа- вать интерес пользователей к операях. Вообще глупо это делать заранее. циям обслуживания ИС. Почему? Если У нормального сисадмина должно хва- вы практикующий сисадмин, а не теотать время только на ответы, а никак ретик, то легко догадаетесь: они никогне на инициативные лекции. В анали- да не должны иметь возможность исзе рассматриваемого тезиса возни- пользовать служебную информацию кает сильное ощущение, что авторы о действиях сисадмина, чтобы списать спутали пользователей и заказчиков. на него свои проблемы! 3.2. Рассказывайте пользоватеПричем это не описка, это системная ошибка, так как, оказывается, у данной лям, что вы делаете. Здесь уже приидеи есть еще и подпункты, детализи- меняется суггестивная технология рующее это заблуждение. Рассмотрим для закрепления рефлекса подчинеих в том же порядке. ния сисадмина. Подумал – рассказал, 3.1. Рассказывайте пользовате- приступил к работе – продолжай боллям, что вы собираетесь делать. Ес- тать непрерывно! Можно в ответ повли выполняется плановая операция, торить контраргументы из предыдущето надо не рассказывать, а предуп- го раздела, чтобы закрепить процесс реждать, иначе выполняется опера- антивнушения. 3.3. Рассказывайте пользоватеция по запросу пользователя и в рамках штатных обязанностей сисадмина, лям, что вы сделали. Ошибка очеи, значит, опять же не о чем рассказы- видна. Безусловно, все модификавать. Да и что может быть вздорнее, ции должны описываться. Безусловчем болтливый и «липучий» сисадмин? но, все работы должны протоколироНу разве что генерал, бегущий вприп- ваться. Но не в качестве темы для берыжку в мирное время! сед с пользователями (вспомните па-


IMHO нибратствующего «маньяка» из заме- шали инструкции, прочли документа- вышать свои полномочия или трактоток Зелински), а именно в том смыс- цию, то непонимание может иметь ис- вать свои обязанности расширительле, как это рекомендует Эви Немет. точник только в неформальном аспек- но. Общечеловеческое правило «можИнформируйте руководство о том, те. Тут мудрецы из Red Hat Inc. впер- но все, что не запрещено» в произчто собираетесь делать, что делае- вые затрагивают этику. Они извиня- водстве не работает. Ну ясно же, если те и что сделали. Для чего? Дословно ются, что употребляют вообще такой за каждое действие заказчик должен из [3, 29.6]: «...если необходимо соб- термин, как «пользователи», но сра- платить, то перечень действий уже зарать аргументы в пользу найма до- зу вслед за этим, ничтоже сумняшись, ранее описан и согласован сторонами. полнительного персонала или покупки именуют их «ключевым звеном успеш- Но далее еще забавнее: «Это не ознанового оборудования.», и, чуть далее, ного администрирования». Здорово, чает, что вы должны относиться к со«он (документ. – А.Б.) может стать се- да! Не люди, а звенья. Но я приветс- трудникам как к злоумышленникам». рьезным оружием в ежедневных раз- твую такую откровенность. Итак, все- Хм! Тогда не понятно, кто может угроборках.». Замечаете, как изменился таки админ-фашист и здесь «рулит»! жать безопасности не подключенных 6. Знать свое дело. Вот это са- к Интернету систем. Наверное, «зелеконтекст работы сисадмина от описанного в работах Эви Немет до того, что мое противоречивое место катехизи- ные человечки»? Но потом изощренсуществует в грезах инженеров из Red са от Red Hat Inc. Вы, наверное, поду- ные авторы из Red Hat Inc. начинают Hat Inc. Задумайтесь, что вам ближе? мали: составил документацию, расска- уже прямо противоречить своим же 4. Знать свои ресурсы. Вот сно- зал ее наизусть, повторно инвентари- рекомендациям. 7.1. Риски социальной инженева элемент внушения. Если, следуя зировал ресурсы, подружился с польрекомендации выше, все задокумен- зователями и их семьями, да еще при рии. Здесь совершенно однозначно тировано и даже, как предложено да- этом можно решить, что производил рекомендуется относиться ко всем лее, несколько раз произнесено вслух все эти действия неосознанно, без зна- пользователям как к потенциальным публично, то что еще нужно? Быть мо- ния, что делает! Бред, конечно! Да и нарушителям. Что, в общем-то, пражет, продекламировать перед сном? не о работе сисадмина здесь вооб- вильно и логично. Но чуть далее все Или, возможно, этап документирова- ще. Вы же прочли заголовок раздела: выворачивается наизнанку. Сначала ния, по логике Red Hat Inc., может про- «Изощренная корпоративная этика». странное: «На самом деле... у вас воизводиться в ситуации, когда предмет Цитирую по [6, раздел 6]: «Вы должны обще не будет полномочий вырабатыработы сисадмина и собственно объ- понимать, чем занимается ваша орга- вать правила, не говоря уже о том, чтоект документирования ему известен низация». Во как! Правда, далее они бы обязывать их выполнять.» Теперь не полностью? Ну а финальное закли- пытаются выкручиваться: «Это можно понятно, зачем надо познакомиться нание вообще трудно понять: «Отсутс- свести к одному вопросу: каково назна- с пользователями поближе? Чтобы уптвие «ситуационной осведомленнос- чение систем, которые вы администри- рашивать их в приватной обстановке! ти» в отношении доступных ресурсов руете?». А, спрашивается, чем отлича- Ну а потом все в точности, как у Стечасто хуже, чем полное отсутствие ос- ются письма с контрактами на постав- фана Зелински в сценарии действий ведомленности». «Покрутил» это, как ку памперсов от переписки риэлторов? «идиота» в [4] ситуация 6: «Публикуйконфетку, ничего не понял! Быть мо- Вероятно, как в известном анекдоте: те ссылки на статьи по вопросам бежет так: «полное отсутствие осведом- пишите письма прописью – они быст- зопасности в вашей внутренней почленности заведомо лучше, чем отсутс- рее дойдут по назначению. Завершает- товой рассылке». Тем, кто примет эту твие осведомленности в конкретной ся все репликой в стиле Дзен: «Вы об- глупость за «чистую монету», рекоменситуации»? Очень напоминает пове- наружите, что ваши повседневные ре- дую сразу представить, как сообщедение «идиота» в описании Стефана шения стали лучше». То есть для вас ние формата BagTrack получит дирекЗелински. Неужели в Red Hat Inc. хо- это станет полной неожиданностью. тор его предприятия. Хотя, быть может, Прямо-таки корпоративная терапия! я не прав. Тут, скорее, предлагаются тели именно такого? 7. Безопасность не может быть действия в стиле «технического бан5. Знать своих пользователей. Загадочное требование. Если сисадмин второстепенной задачей. Начина- дита», когда упомянутый персонаж познает свои ресурсы, все задокумен- ется, как в анамнезе параноика: «Вне мещал советы в практически нечитаетировал и все начитал каждому поль- зависимости от того, что вы думае- мые источники, так как, я уверен, эти зователю, то неужели можно предпо- те о среде, в которой работают ваши письма пользователями станут выкиложить, что он еще не познакомился системы, вы не можете считать ее бе- дываться «в корзину» без прочтения. с каждым из них? А! Быть может, на- зопасной. Даже автономные системы, 8. Планировать. Снова, как в анекдо узнать их приватные данные? Же- не подключенные к Интернету, могут доте: «Мужик, ты ведь не за грибаны, дети, домашние любимцы... Веро- быть в опасности». Прочитав это, я на- ми в лес ходишь?», то есть речь опять ятно, именно так, поскольку подчер- чинаю понимать, откуда у сисадминов не о планировании в технологическивается: «как вы сможете понять, ка- развивается та самая болезнь, что опи- ком смысле. Это очередной гипнокие системные ресурсы нужны пользо- сала еще Эви Немет в своих трудах блок. Его полезная нагрузка нулевателям, не понимая самих пользова- и заметила, что в результате ее си- вая. Ну разве можно всерьез принителей?» Задумаемся, в каком случае садмины склонны считать все ресурсы мать такие рекомендации, как требовозможна ситуация непонимания поль- своей собственностью [1, 32.9]. Сисад- вание экстраполировать заявления рузователей? Если пользователи услы- мин ни в коем случае не должен пре- ководства: «Сказанное вскользь ... за-

№9, сентябрь 2006

83


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

84

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

А о чем вообще речь? Надо признать, что и Эви Немет, и Стефан Зелински гораздо ближе подошли к решению вопроса об успешной стратегии поведения сисадмина, чем сотрудники Red Hat Inc. с их незамысловатыми бойскаутскими рекомендациями. Объяснение тривиально. Этическими нормами может обладать только личность, а не корпорация или какоето иное юридическое лицо, или государственное образование. И, значит, чем далее правила поведения личности от стереотипов поведения толпы, тем больше в них морали. Поэтому рекомендации Red Hat Inc. столь неудачны. Они вообще не служат профессиональным интересам системных администраторов, хотя и размещены в документах, предназначенных в помощь сисадминам. Остальные же просто отражают ранние фазы процесса формирования этики сисадминов. Здесь самое время задуматься. Зачем сисадминам профессиональная этика? Есть масса профессий, которые прекрасно обходятся общечеловеческими этическими нормами. Например, сантехники не имеют собственного морального кодекса ассенизаторов. Почему сисадминые должны обрести собственную этику? Сначала попытаемся определить, что такое профессиональная этика. Итак, существует общечеловеческая этика. Но некоторые профессии вырабатывают собственные, отличные от всеобщих этические нормы. Такие нормы, основываясь на особенностях деятельности представителей некоторой профессии, предписывают им дополнительные ограничения. То есть, всем можно, а вот некоторым запрещено. Такие ограничения компенсиру-

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

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


IMHO лужит отправной точкой для создания врачи, и адвокаты, и служители культа. ресурсам их предприятий, предохрапрофессиональной этики и соответс- Но максимальное сходство наблюдает- няет сисадминов от проблем! В заключение приведу пример твующего закона, ее защищающего. ся с профессией аудиторов. Это тоже Первое, на что можно обратить вни- молодая профессия, и она тоже име- из собственной практики. Один мой мание, это замеченные еще Эви Немет ет дело как с приватной, так и с про- уважаемый заказчик, не желая дечрезвычайные полномочия сисадми- изводственной информацией. И вот ржать электронные сообщения на обнов [1, раздел 32.2] в отношении всех как решается вопрос в данном случае. щем сервере, забирает их не по проинформационных ресурсов [3, раздел В Федеральном законе об аудиторс- токолу IMAP, а по протоколу POP3. 29.2]. Припомним еще и фразочку из [1, кой деятельности присутствует гла- При этом все сообщения, проходящие раздел 32.14] о том, что резервная ко- ва 8 «Аудиторская тайна» [8]. Эта гла- через почтовый сервер, всегда дубпия фактически взламывает любую ва полностью устанавливает обязан- лируются в специальный пул перед защиту. Причем данное соображение ности и ответственность аудиторов пе- фильтрацией на вирусы и спам. И хоимеет значимость как в отношении ред клиентами-доверителями. Указан- тя я в договор обслуживания неизменкомпаний, так и в отношении частных ная норма закона служит в поддержку но вношу пункт, обязывающий меня пользователей. Человек в своей пов- соответствующих принципов из Кодек- исключить работу на возможных конседневной жизни все более становится са этики аудиторов России, а именно курентов, но все-таки снимает беспозависимым от компьютеров. Они дав- понятия о конфиденциальности и свя- койство только вера в правоту утвержно стали нормой в почти каждой го- занных с ним обязательствах [9]. дения Эви Немет на счет неисправиТаким образом, кодекс этики сис- мой неграмотности заказчиков! родской квартире. Они давно проникли в телефоны, фотоаппараты, плейе- темных администраторов, поддержанры DVD и даже в стиральные машины. ный законодательно, должен защитить 1. Evi Nemeth, Garth Snyder, Scott Seebass, Все эти устройства, сопровождая де- интересы клиентов и обеспечить гаTrent R. Hein. UNIX System Andministration ятельность человека, неизбежно на- рантию прав сисадминов, в силу обHandbook. Prentice Hall PRT, 1995. Пекапливают информацию о тех сторо- стоятельств оказавшихся причастныревод на русский: «UNIX: руководство нах жизни, которые принято считать ми к деловым интересам и правовым системного администратора», BHV, личными. конфликтам их клиентов. 1997. Если сейчас комплекс мероприяНо это лишь час ть проблемы 2. Книги Эви Немет на сайте Ozon.ru – тий по изъятию информации начина- и часть возможных преимуществ. http://www.ozon.ru /context/detail /id / ется с обесточивания мест размеще- Здесь снова сделаю лирическое от336421. ния компьютеров, продолжается бло- ступление. В нашей стране государс- 3. Evi Nemeth, Garth Snyder, Trent R. Hein. кированием комнат и завершается твенные мужи издавна озабочены паLinux Andministration Handbook. Prentice непосредственной выемкой систем- дением престижа правоохранительHall PRT, 2002. Перевод на русский: ных блоков, то лишь потому, что за- ных органов. А проблема решается «Руководство администратора Linux», интересованные органы еще не дога- просто! Надо выработать этический Издательский дом «Вильямс», 2003. дались, что к данной процедуре мож- кодекс соответствующих служб и за- 4. Stephan Zielinski. KNOW YOUR UNIX но привлечь системных администра- крепить его законодательно. Что слуSYSTEM ADMINISTRATOR – A FIELD торов, которые по закону не могут от- чается при нарушении этики врачом GUIDE. 1992. – http://stephan-zielinski. казаться (как свидетели) и произвес- или адвокатом в культурной страcom/static/sysad.txt. ти выемку данных в фоновом режиме, не? Провинившийся не только не- 5. «Об администрировании UNIX» – http:// используя служебный доступ систем- сет ответственность в рамках закона, www.sensi.org/~alec/unix/d_admin.html. ного администратора. Ставшие таки- но и изгоняется из самой профессио- 6. «Философия системного администрими привычными попытки спрятать сер- нальной среды. А у нас – нет! Таким рования» от Red Hat, Inc. в переводе вер вместе со всей IT-группой в подвал, путем формируется не только уважиИ.Песина – http://old.linux.kiev.ua:8080/ в филиал, да хоть под лестницу, даже тельное отношение к профессиональ~ipesin/translations/rh-phy/ch-philosophy. отправить сисадмина в отпуск вместе ной этике, но и к самим представитеhtml , оригинал. с главным бухгалтером на время про- лям данных профессий, чего у нас так- 7. Red Hat Enterprise Linux 3: Introduction верки, пусть вас не вводят в заблуж- же не наблюдается. Какую еще выгоto System Administration. Chapter 1. The дение: сисадмины уязвимы! ду получают в этом случае профессии, Philosophy of System Administration – Получается, что системные адми- обладающие подобным строгим коhttp://www.redhat.com/docs/manuals/ нистраторы рискуют подвергнуться дексом поведения? Они гарантируютenterprise/RHEL-3-Manual/admin-guide/ давлению как со стороны государс- ся от случайных стихийных конкуренch-philosophy.html. тва, так и со стороны работодате- тов и становятся участниками культур- 8. Федеральный закон от 7 августа 2001 г. ля. Вспомните рассуждения Эви Не- ного рынка. Ибо в противном случае №119-ФЗ Об аудиторской деятельносмет об ответственности сисадминов лишь недогадливость клиентов, коти. Статья 8. Аудиторская тайна – http:// [3, раздел 29.3]. торые по замечанию наблюдательной www.ckat.ru/normdoc/zau/zaus8.htm. Это не надуманная ситуация. В по- Эви Немет [1, раздел 32.8] совершен- 9. Кодекс этики аудиторов России. IV. Фундобное положение попадают все, но не понимают, какую власть над нидаментальные принципы. 16.5. Конфикто в силу специфики работы прони- ми может иметь человек, обладающий денциальность – http://www.docaudit.ru/ кает за границы частной жизни. Это и доступом ко всем информационным documents/kodeks/4.

№9, сентябрь 2006

85


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

Суровая правда, скрытая за розовыми очками: история компании Transmeta «Мы переработали саму концепцию микропроцессора для создания совершенно нового мобильного мира». Единственная надпись, существовавшая на сайте Transmeta вплоть до 2000 года.

Дмитрий Мороз Компания Transmeta принесла практически совершенные процессоры в массы, однако собственноручно допущенные ошибки, жестокая конкуренция и привередливые пользователи не позволили ей завоевать место под солнцем.

Пятилетняя конспирация В 2000 году в средствах массовой информации стали активно циркулировать слухи о появлении нового игрока

86

на рынке компаний, выпускающих процессоры. До этого момента Transmeta была мало кому известна, поскольку все ее внутренние разработки были

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


ретроспектива Для начала стоит сказать пару слов о Дэвиде Дитцеле (David Ditzel) – одном из основателей компании. Талантливый инженер, Дитцел успел поработать и в AT&T Bell Laboratories, где он возглавлял группу, создавшую микропроцессор CRISP, первый RISC-чипа AT&T, и в Sun Microsystems, где ему довелось руководить лабораторией SPARC Labs, а также занимать пост технического директора подразделения, занимавшегося микроэлектроникой. Впервые же он стал известен в 1980 году как один из авторов публикации «К вопросу о компьютере с сокращённым набором команд» (The Case for the Reduced Instruction Set Computer), в которой впервые была упомянута аббревиатура «RISC». Вернёмся в 1994 год, время его пребывания в Sun. В то время Дитцел вместе со своим коллегой, Колином Хантером (Colin Hunter), экспериментировали с техникой бинарной трансляции в попытке улучшить работу ОС Windows на рабочих станциях Sun. Если кратко, то «бинарная трансляция» представляет собой программный «слой», являющийся посредником между внутренней логикой процессора и операционной системой. Он «на лету» превращает x86код во внутреннюю систему команд процессора, тем самым позволяя ему выполнять программы, написанные для «тандема» Wintel. Благодаря использованию «бинарной трансляции» архитектура чипа может быть значительно упрощена. К сожалению, руководители Sun не были заинтересованы в радикальном изменении дизайна своих процессоров семейства SPARC, поэтому оба инженера, прихватив с собой коллег «по цеху» Боба Смелика (Bob Cmelik) и Дуга Лэирда (Doug Laird), покинули компанию, решив основать свою. Transmeta была зарегистрирована в апреле 1995 года. Основная миссия – разработка процессоров со сверхдлинным командным словом (VLIW – Very Long Instruction Word). Для того чтобы позволить компании развиваться дальше, Дитцел и Лэирд возложили на себя обязанности по поиску инвестиций. К середине 1995 года, дабы более доходчиво объяснять потенциальным инвесторам перспективы бинарной трансляции команд, Смелик

№9, сентябрь 2006

придумал для неё простое и лаконичное название – «ПО для морфинга кода» (Code Morfing Software). Благодаря этому инженеры смогли добиться получения первых денежных вливаний в свою компанию, которые произвели: инвестиционная компания Walden Venture Capital; Пол Аллен (Paul Allen), один из основателей Microsoft; а также скандально известный финансист Джордж Сорос (George Soros). Теперь ничто не мешало Дитцелу, ставшему генеральным директором Transmeta, начать вербовку талантливых кадров. В поисках инженеров он посетил университеты Беркли, Стэнфорда, Вашингтона, а также Масачусетса. Кроме молодых, в компанию набирались и «ветераны» – из компаний Sun, Silicon Graphics и Hewlett-Packard. Однако от добровольцев из Intel Дитцел сразу отказывался, ссылаясь на желание сохранять полнейшую секретность разработки, а также избегать возможного возникновения в будущем судебных исков по вопросам интеллектуальной собственности. Со временем Transmeta обзавелась собственным офисом в городе Санта-Клара, Калифорния, недалеко от штаб-квартиры Intel. Именно здесь трудились 240 набранных сотрудников компании. Правда, узнать, над чем именно, в то время было невозможно. «Они соблюдают большую секретность, – говорил аналитик Dataquest Натан Бруквуд (Nathan Brookwood). – На протяжении года никто из них не проронил ни слова о проделываемой работе». Кстати, именно предположения Бруквуда относительно создаваемого в недрах Transmeta «процессора, отдалённо совместимого с архитектурой х86», высказанные им ещё в 1998 году, оказались наиболее точными. Вот слова независимого разработчика Джона Вартона (John Wharton): «В то время я знал Дитцела уже 15 лет, и тем не менее я не имел ни малейшего понятия, чем они занимаются. Я неоднократно спрашивал Дейва, однако он лишь улыбался и говорил, что расскажет мне, только если я подпишу соглашение о неразглашении». Несмотря на желание Дитцела сохранять всё в тайне, общественность уже в 1997 году стала догадываться, что Transmeta готовит нечто незауряд-

Дэвид Дитцел

ное. Количество патентов, регистрируемых компанией, непрерывно росло, к тому же масла в огонь подлила новость о найме на работу создателя ядра Linux Линуса Торвальдса (Linus Torvalds). Теперь, по словам генерального директора Transmeta, под крылом компании были собраны лучшие специалисты по динамической компиляции. В мае 1998 года партнёр Transmeta, корпорация IBM, прислала ей первые изготовленные образцы процессора, и уже через несколько дней инженеры добились его более или менее стабильной работы. «То, что он вообще заработал, – просто чудо», – говорил инженер компании Скот Дрейвис (Scott Draves). «К сожалению, процессор работал очень медленно. Одно только его включение занимало 30 минут времени. Что же касается производительности, чип работал в сотни раз медленнее нормального процессора Pentium». К счастью, постоянная работа над ошибками позволила с каждой новой ревизией процессора получать всё более быстрые и стабильно работающие чипы. Теперь инженеры могли сконцентрироваться на главной поставленной перед ними задаче – энергопотреблении. Для этого 10 сотрудников Transmeta отделились от остальных и основали группу, занявшуюся разработкой технологии энергосбережения процессора, впоследствии получившей название LongRun. Созданная за девять месяцев, она позволила чипу Transmeta ещё на стадии проекти-

87


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

Программная иерархия процессора Crusoe

рования потреблять ощутимо меньше энергии, чем его конкуренты. К 1999 году разработка архитектуры процессора, на которую, по словам Дуга Лэирда, компания потратила десятки и сотни миллионов долларов, была практически завершена. Приблизительно в это же время начала приобретать популярность концепция переносных устройств с доступом в Интернет – так называемых веб-планшетов. Основными критериями для их создания являлись экономичный процессор и операционная система, способная работать без жёсткого диска. Пункт первый в активе Transmeta уже имелся, недоставало лишь второго. Однако ведь не зря компания взяла на работу Линуса Торвальдса. «Изначально я занимался исключительно вопросами, связанными с бинарной трансляцией, – говорил он. – Приблизительно в начале 1999 года, когда компания уже была готова выйти на рынок, нам необходимо было доказать миру, что мы предлагаем не просто очередной клон процессоров Intel. Мы хотели продемонстрировать общественности продукт, не являвшийся персональным компьютером или же ноутбуком, однако работавший на процессоре от Transmeta под управлением ОС Linux и предоставлявший пользователю доступ к сети Интернет. Вот так у нас и возникла идея создания веб-планшета». Публичное представление нового процессора, получившего название Crusoe, состоялось 19 января 2000 года, через пять лет после начала работ над ним. Компания продемонстрировала общественности два процессора, ТМ5400 (предназначенный для ноутбу-

88

ков) и ТМ3120 (планшетные компьютеры, сверхминиатюрные ПК и проч.), а также один ноутбук и веб-планшет, основанные на них. Ну а сейчас немного приостановим наше повествование и рассмотрим архитектуру Crusoe.

Секретная начинка Crusoe представлял собой процессор, основанный на базе архитектуры VLIW, которая также является сердцем процессоров Intel Itanium, Sun MAJC и Elbrus-2000. Дэвид Дитцел комментировал отказ от использования RISC, приверженцем которой он был на протяжении почти 20 лет, ещё в начале 1998 года: «Изначально архитектура RISC была противником более сложной архитектуры типа CISC, да и предполагала немало достоинств. Недаром практически каждая компания, производившая процессоры, имела в своём активе минимум один RISC-чип. К сожалению, на сегодняшний день дальнейшая разработка и усовершенствование этой архитектуры становится всё более сложной задачей, к тому же сами RISC-процессоры по своим размерам и энергопотреблению догнали конкурентов. Я думаю, что особого смысла в продолжении популяризации RISC больше нет смысла». Как видно со слов Дитцела, выбор новой архитектуры был очевиден. Суть VLIW заключается в объединении нескольких элементарных команд процессора в одну большую инструкцию, которую чип может выполнить за один такт. В случае с Crusoe она называлась молекулой и имела 128-битную длину. Ядро данного процессо-

ра содержало пять модулей четырех различных типов: двух блоков для операций с целыми числами, одного – для операций с числами с плавающей запятой, одного – для операций с памятью и еще одного, представлявшего собой модуль управления переходами. Одна молекула могла содержать до четырёх команд (называемых атомами), предназначенных для разных блоков процессора, благодаря чему они могли выполняться одновременно. Их упаковкой занимался программный транслятор – Code Morphing Software (далее – CMS). Поэтому эффективность полной загрузки молекулы ложилась как раз на его плечи. Работал транслятор следующим образом. Во время процедуры POST процессор отнимал у оперативной памяти компьютера 16 Мб и резервировал их под нужды программного обеспечения CMS. И прежде чем происходила загрузка операционной системы, этот эмулятор транслировал все команды архитектуры х86 в родные для Crusoe инструкции. Любая эмуляция практически всегда отрицательно сказывается на производительности процессора, поэтому весь транслируемый код хранился в вышеупомянутых 16 Мб ОЗУ. Если был необходим повторный «морфинг», готовый материал просто загружался из оперативной памяти. Кроме того, в этом случае CMS производило дополнительную оптимизацию уже транслированного кода для более эффективной работы с внутренней логикой Crusoe. Для увеличения быстродействия транслятора процессор был оснащён сравнительно большим объёмом кэшпамяти. ТМ5400 содержал 128 Кб кэша первого уровня (разделённого пополам для инструкций и данных) и 256 Кб – второго. Изначально для эффективной работы CMS эта величина должна была составить 16 Мб, однако такое решение было бы слишком дорогим, в результате чего разработчики от него отказались. Использование в VLIW комбинированного аппаратно-программного метода позволяет значительно сократить количество транзисторов в процессоре, тем самым уменьшив его потребляемую мощность. В Crusoe на кристалле площадью 73 кв. мм содержалось 36,8 млн. транзисторов. Сравни-


ретроспектива те эти показатели с таковыми для про- на его рыночное продвижение. Вот цессора Pentium III Mobile: 106 кв. мм с этим как раз у Transmeta были больи 44 млн. транзисторов. Однако ин- шие проблемы. женеры Transmeta не остановились на простом уменьшении процессо- Выход в открытый мир ра и пошли ещё дальше, оснастив Во время представления Crusoe в янCrusoe технологией энергосбереже- варе 2000 года Дитцел объявил, что на данный момент компания ещё ния (LongRun). В отличие от схожей технологии не нашла потенциальных клиентов. SpeedStep корпорации Intel того пери- На протяжении последующих шесода, LongRun позволяла процессору ти месяцев результат не стал лучше: Процессор Crusoe TM5600 в зависимости от загрузки изменять в списке появились компания S3, натактовую частоту, а также напряжение мерившаяся производить различные го полугодия 2000 года составила ничпитания на лету (причём без участия Интернет-устройства (Internet Apliance) тожные 358 тыс. долларов. Во время создания Crusoe компав этом операционной системы). Про- типа веб-планшетов, а также Quanta, цессор Crusoe, работающий на часто- занимавшаяся производством ноут- ния существовала за счёт многомилте 700 МГц, в зависимости от нагрузки буков. Однако расплывчатые пресс- лионных инвестиций, которые посмог уменьшать этот параметр вплоть релизы – единственное, чем они кор- ле выхода процессора в свет прекрадо 200 МГц. Напряжение питания в мили общественность на протяжении тились. Последние 88 млн. долларов Transmeta получила в июле. Теперь же этом случае уменьшалось со штат- нескольких месяцев. Кроме отсутствия клиентов многих она должна была кормить 313 человек ных 1,6 В до 1,1 В. В этом режиме чип, по словам Transmeta, потреблял менее волновала скорость работы Crusoe. своего персонала самостоятельно. Вы1 Вт энергии, а в режиме «сна» – нич- Из-за необходимости эмулировать ход компании на фондовую биржу чеархитектуру х86 производительность рез выпуск акций был запланирован тожные 0,08 Вт. Напоследок стоит также отметить, процессора должна была быть ниже на 7 ноября. Общественность ожидачто в Crusoe были встроены: контрол- конкурентов от Intel и AMD. Однако ла, что цены на акции Transmeta сралер оперативной памяти типов SDRAM Transmeta предпочитала обходиться зу же поднимутся до заоблачных выи DDR SDRAM, а также шинный интер- без демонстрации реальной скоро- сот, однако… За неделю до этого корпорация фейс PCI для взаимодействия с мик- сти работы своего детища, что мноросхемой южного моста чипсета и ви- гих вводило в недоумение. «Каждый IBM, производившая Crusoe на своих деоадаптером. По замыслу разработ- человек, которому удаётся погово- производственных мощностях и обечиков интеграция этих комонентов рить с Дэйвом (Дитцелом), спраши- щавшая со временем выпустить мов процессор должна была снизить ко- вает его о клиентах Transmeta. Но ни- дель ноутбука ThinkPad 240 на этом нечную стоимость готовой системы, какого ответа он не даёт, – говорил процессоре, публично заявила о своём уменьшить её размеры, а также энер- аналитик микропроцессорного рын- решении отказаться от его использогопотребление. ка Линли Гвиннеп (Linley Gwennap). – вания. Ещё одна компания, Compaq, На бумаге новоиспечённый про- К тому же компания до сих пор пуб- объявила о своих планах не испольцессор выглядел довольно непло- лично не продемонстрировала про- зовать Crusoe, поскольку она «не нахо и оправдывал вложенные в него изводительность своего процессора. шла в нём больших преимуществ по многомиллионные инвестиции (если Если бы Crusoe был настолько хорош, сравнению с продукцией конкурентов». быть точным, за пять лет на создание насколько о нём говорят, Transmeta За день до выхода на торги за одну акCrusoe было потрачено 119 млн. дол- уже бы давно разослала его обозре- цию компании брокеры собирались отларов). Созданный компанией пакет вателям по всему миру. В большинс- давать не больше 18 долларов. Однако 7 ноября её стоимость содля тестирования скорости работы тве случаев, когда какая-нибудь комCrusoe под названием Mobile Platform пания не отвечает на эти вопросы, она ставила 21 доллар. Почему так получилось? Дело в том, что как раз в это Benchmark, однако, демонстрировал что-то скрывает». не голую производительность, а лишь Молчание было прервано в июле время в Интернете стали активно расеё соотношение к энергопотребле- 2000 года, когда Transmeta объявила пространяться слухи о заключении донию. Конечно же, собственный чип о подписании контракта с Gateway на говора между Microsoft и Transmeta, Transmeta был в этом тесте на высоте: поставку процессоров для проводных согласно которому последняя будет при частоте 533 МГц ТМ5400 шёл прак- и беспроводных веб-планшетов (кста- разрабатывать аппаратную платфортически вровень с 500 МГц Pentium III, ти, тех самых, которые она демонстри- му для новой операционной систеоставляя его далеко позади по коли- ровала в день презентации Crusoe), мы (которая позже получит название честву потребляемой энергии и теп- рекламой и продажей которых бу- Windows for TabletPC), и многие броловыделению. дет заниматься America Online (AOL). керы воодушевились этой новостью. В общем, всё было бы хорошо. Это была первая хорошая новость К счастью для компании, 13 млн. выНо создание нового продукта – лишь для Дитцела и компании, поскольку пущенных акций позволили ей полуполовина дела. Не меньше, а зачас- клиенты им нужны были больше возду- чить дополнительные 273 млн. доллатую гораздо больше труда уходит ха: прибыль компании в течение перво- ров для продолжения своего существо-

№9, сентябрь 2006

89


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

Субноутбук Fujitsu Siemens Loox на базе Transmeta Crusoe

Субноутбук Casio Cassiopeia Fiva на базе Transmeta Crusoe

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

Первые проблемы Производители ноутбуков, анонсировавшие модели на базе Crusoe, всё не спешили с их выпуском на рынок. Фактически первые ноутбуки на базе Crusoe увидели свет лишь спустя 10 месяцев после официальной презентации процессора. На проходившей в октябре 2000 года выставке-конференции Microprocessor Forum Дитцел наконец-то показал опытные экземпляры переносных машин, правда, их производителя присутствовавшие разглядеть не смогли. Эти ноутбуки были построены уже на следующей версии процессора – ТМ5600, поскольку ТМ5400 не был принят рынком «на вооружение». Новый чип отличался от своего предшественника лишь улучшенным техпроцессом, да увеличенной 512 Кб кэш-памятью 2-го уровня. К сожалению, даже он не скрасил опасений многих аналитиков по поводу производительности Crusoe, которые позже всё же оправдались: процессор Transmeta, несмотря на свой быстродействующий транслятор CMS, оказался очень медленным чипом. Резуль-

90

таты первых независимых тестов были Попытка «завоевать» просто разгромными: ТМ5600, работа- Америку ющий на частоте 700 МГц, умудрялся Некоторые компании всё же решили проигрывать чипу Pentium III с практи- рискнуть и выпустили модели своих чески вдвое меньшей частотой, уве- ноутбуков на базе Crusoe. Среди них личивая время автономной работы но- оказались: Sony, Toshiba, Hitachi, NEC, утбука всего на 30%. Негативную роль Fujitsu и Sharp. Производители портав этом сыграли: и неполная «загруз- тивных компьютеров в Стране восхока» молекулы командами; и отсутс- дящего солнца предлагали свою протвие поддержки набора инструкций дукцию на базе Crusoe лишь на собсSSE; и 128-битная линия кэша второ- твенном рынке, однако как раз благого уровня, нивелировавшая его боль- даря им Transmeta удалось продать 500 шой по тем временам объём; и общий тысяч процессоров в течение первого PCI-интерфейс, который разрывался года их выпуска. Этот показатель вселял в Марка между графическим адаптером и южным мостом; и отсутствие AGP-интер- Аллена надежду. К сожалению, за префейса (несмотря на то, что Transmeta делами Японии, устройства на базе ещё с 1998 года являлась членом AGP- чипов Transmeta так и не появились. IF – организации, разработавшей этот Единственная попытка Sony выпустить стандарт); и ещё множество других на рынке США модель ноутбука состофакторов. ялась год назад, и с тех пор ни один Не стоит забывать, что Intel всё это другой производитель не осмелилвремя не сидела сложа руки и вес- ся на подобный шаг. Об американсной 2001 года представила версию ких производителях вообще не могPentium III с пониженным энергопот- ло быть и речи, поскольку их полнореблением, который был чуть-чуть стью удовлетворяли новые процессо«прожорливее» Crusoe, однако обеспе- ры Intel с пониженным и сверхнизким чивал гораздо больший уровень про- уровнем питания, стремительно завоёизводительности. вывавшие рынок. Обвинения, выставленные Transmeta Не менее быстрыми темпами роспо поводу завышения данных относи- ли и убытки Transmeta. К середине 2001 тельно производительности собствен- года её убытки за истёкший год состаного процессора, сыпались отовсюду. вили 97,7 млн. долларов. при доходах Авторитетные издания старались от- в 16 млн. долларов. Ответ компании всему миру зазываться о шокирующих результатах как можно мягче. ключался в выпуске чипа ТМ5800, коДело дошло до того, что против торый отличался от своего предшесTransmeta, которую ещё несколько лет твенника новой версией CMS, а такназад рынок называл чуть ли не на- же более совершенным 0,13 мкм проиболее перспективной молодой ком- цессом изготовления. Остаётся добапанией и пророчил «безоблачное» бу- вить, что IBM более не являлась пардущее, пошли её же собственные «при- тнёром Transmeta по его производсверженцы» – инвесторы и акционеры, тву. Стремясь снизить цену на свою обвинившие компанию в подтасов- продукцию, компания решила смеке результатов и обмане всего мира. нить изготовителя своих процессоВ результате головы полетели с плеч: ров, и заключила контракт с тайвань«отец» Transmeta, генеральный дирек- ской компанией Taiwan Semiconductor тор Дэвид Дитцел был обвинён в со- Manufacturing Co. Но сможет ли новый крытии реальных результатов произво- процессор вернуть Transmeta былую дительности Crusoe и смещён до пос- славу? Об этом мы поговорим в слета технического директора. Его мес- дующий раз. то занял Марк Аллен (Mark Allen), пришедший в январе 2000 года на пост ис- 1. http://www.wired.com полнительного директора. Ранее рабо- 2. http://archive.salon.com тавший в компаниях Nvidia и C-Cube 3. http://www.arstechnica.com Microsystems, Аллен должен был «вы- 4. http://www.pcworld.com вести компанию из сложившегося кри- 5. http://www.forbes.com зиса и сделать её функционирование 6. http://www.theregister.co.uk более эффективным». 7. http://www.transmeta.com


bugtraq Множественные уязвимости в Microsoft Internet Explorer Программа: Microsoft Internet Explorer 5.01, 6.x. Опасность: Высокая. Описание: 1. Уязвимость существует из-за ошибки интерпретации HTML-кода в определенной комбинации позиций. Удаленный пользователь может вызвать повреждение памяти и выполнить произвольный код на целевой системе. 2. Уязвимость существует из-за ошибки при обработке таблицы каскадных стилей. Удаленный пользователь может вызвать повреждение памяти и выполнить произвольный код на целевой системе. 3. Уязвимость существует из-за ошибки в механизме воспроизведения HTML-кода. Удаленный пользователь может вызвать повреждение памяти и выполнить произвольный код на целевой системе. 4. Уязвимость существует из-за ошибок при инициализации COM-объектов, которые не должны быть инициализированы в браузере. Удаленный пользователь может с помощью специально сформированной страницы выполнить произвольный код на целевой системе. 5. Уязвимость существует в механизме определения источника выполняемого сценария. Удаленный пользователь может выполнить произвольный сценарий в браузере жертвы в контексте безопасности другого домена или другой зоны. 6. Удаленный пользователь может с помощью специально сформированного сценария получить доступ к содержимому веб-страницы в другом домене или другой зоне. URL производителя: www.microsoft.com. Решение: Установите исправление с сайта производителя.

Переполнение буфера в Clam AntiVirus Программа: Clam AntiVirus 0.88.3 и более ранние версии. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки проверки границ данных в функции pefromupx() в libclamav/upx.c при распаковке PE-выполняемого файла, сжатого в UPX. Удаленный пользователь может вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. URL производителя: www.clamav.net. Решение: Установите последнюю версию (0.88.4) с сайта производителя.

Повреждение памяти в браузере Safari Программа: Safari 2.0.4 (419.3), возможно другие версии. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки в функции KHTMLParser::popOneBlock(). Удаленный пользователь может с помощью элемента сценария в теге div переопределить содержимое страницы и вызвать повреждение памяти. URL производителя: www.apple.com/macosx/features/ safari. Решение: В настоящее время способов устранения уязвимости не существует.

№9, сентябрь 2006

Обход аутентификации в x11vnc Программа: x11vnc версии до 0.8.2. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки при обработке аутентификационных запросов VNC. Удаленный пользователь может обойти процесс аутентификации и получить доступ к целевой системе. URL производителя: www.karlrunge.com/x11vnc. Решение: Установите последнюю версию (0.8.2) с сайта производителя.

Выполнение произвольного кода в продуктах McAfee Программа: McAfee AntiSpyware 6.x, McAfee Internet Security Suite 2006, McAfee Personal Firewall Plus 7.x, McAfee Privacy Service 6.x, McAfee SpamKiller 7.x, McAfee VirusScan 10.x, McAfee Wireless Home Network Security 2006. Опасность: Высокая. Описание: Уязвимость существует из-за неизвестной ошибки и позволяет выполнение произвольного кода. Подробности уязвимости не сообщаются. URL производителя: www.mcafee.com. Решение: В настоящее время способов устранения уязвимости не существует.

Переполнение буфера в Microsoft Internet Explorer Программа: Microsoft Internet Explorer 6.х с установленным исправлением MS06-042. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки проверки границ данных при обработке URL на веб-сайтах, где используется компрессия HTTP 1.1. Удаленный пользователь может с помощью специально сформированного URL вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.microsoft.com. Решение: Microsoft рекомендует временно запретить использование протокола HTTP 1.1 в Internet Explorer.

Выполнение произвольного кода в WFTPD Программа: WFTPD 3.23, возможно более ранние версии. Опасность: Высокая. Описание: Уязвимость существует из-за недостаточной обработки входных данных в параметре SIZE. Удаленный пользователь может с помощью специально сформированного значения SIZE вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.wftpd.com. Решение: В настоящее время способов устранения уязвимости не существует.

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

91


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

SQL. Задачи и решения Сергей Моисеенко

В процессе работы каждый программист на SQL (особенно начинающий) часто сталкивается с различными типовыми задачами, и что самое главное – ошибками при их реализации. Во время сопровождения сайта www.sql-ex.ru у автора книги накопилось большое количество именно таких задач, часть которых он и изложил

в этой книге. Все вопросы рассматриваются на примере специально подготовленных учебных базах. Надо заметить, что рассмотренные ошибки при реализации не являются выдуманными, это реальные запросы, которые присылали посетители сайта. Первая часть книги посвящена решению задач, связанных с характерными ошибками при выборке данных (оператор SELECT). Начиная с самых простых упражнений (например, найти в базе размеры жестких дисков у всех моделей компьютеров стоимостью менее 500 долларов), последовательно сложность заданий увеличивается. Далее рассматриваются вопросы, связанные с манипуляциями данных в SQL: оператор SELECT, предикаты, получение итоговых значений, использование в запросе нескольких источников данных, традиционные операции над множествами, преобразование типов и оператор CASE. Операторы модификации данных: INSERT, UPDATE,

DELETE. В третей части книги вы ознакомитесь с функциями Transact-SQL для работы со строками и данными типа даты/времени. Также рассмотрены типичные проблемы возникающие при их использовании (генерация числовой последовательности, нумерация, NULL-значения, трехзначная логика и предложения WHERE, коррелирующие запросы). В приложении находятся детальные описания всех учебных баз, а также даны подсказки и решения для каждого из упражнений. Хорошая книга которая будет интересна широкому кругу SQL-программистов, желающих в свободное время порешать интересные задачи, а также занятные упражнения.

    

Издательство: «Питер» Год издания: 2006 Количество страниц: 256 ISBN: 5-469-01362-6 Цена: ≈ 228 руб. Книга предоставлена издательством «Питер».

Ассемблер для процессоров Intel Pentium Юрий Магда

Эту книгу нельзя расценивать как очередной учебник по Ассемблеру, по сути издание – расширенное руководство по применению Ассемблера в тех или иных задачах. Изложение материала начинается с самых азов, а именно с описания базовой архитектуры процессоров Intel X86. Далее автор повествует о синтаксисе языка и структуре программ. Не-

92

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

семблерных процедур для Delphi 2005 и Visual C++ .NET 2005). Не осталось без внимания и рассмотрение ММХи SSE расширений процессоров Intel Pentium (команды передачи данных, арифметические команды, упаковка и распаковка данных, команды сдвига). Также затронута тема технологии SSE2 (команды обработки 128-разрядных данных с плавающей точкой и целочисленные данные). В приложении вы найдете описание базовых и специальных инструкций для 80x86 процессоров. Хорошая книга, с которой смело можно начинать процесс изучения Ассемблера для x86-архитектуры.

    

Издательство: «Питер» Год издания: 2006 Количество страниц: 410 ISBN: 5-469-00662-X Цена: ≈ 284 руб. Книга предоставлена издательством «Питер».


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

Мир связи. Волоконно-оптические системы связи Роджер Фриман

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

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

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

    

Издательство: «Техносфера» Год издания: 2006 Количество страниц: 496 ISBN: 5-94836-010-5 Цена: ≈ 308 руб. Книга предоставлена издательством «Техносфера».

Широкополосные беспроводные сети передачи данных В.М. Вишневский, А.И. Ляхов, С.Л. Портной, И.В. Шахнович

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

№9, сентябрь 2006

нологий, классификацию и обзор тех- ние в системах передачи информации. нологий беспроводных сетей, а также Беспроводные локальные сети станознакомитесь с моделью взаимодейс- дарта IEEE 802.11 и оценка их произвотвия открытых систем. Из следующей дительности. Оценка производительглавы вы узнаете о технологиях и ар- ности городских и региональных бесхитектуре беспроводных сетей (под- проводных сетей. Стандарт широкопоробно рассмотрены Bluetooth, Home лосного доступа IEEE 802.16-2004. АрRF, IEEE 802.15.3(4), стандарты DECT хитектура и технические средства беси IEEE 802.11, а также спутниковые се- проводных региональных сетей. Замети и оптические атмосферные линии чательная книга, которая будет интесвязи). Математические основы пере- ресна широкому кругу сетевых адмидачи информации (функциональная нистраторов и архитекторов сети. схема систем передачи дискретной информации, описание элементов систе-  Издательство: «Техносфера» мы: кодеки, модемы, каналы; аналого-  Год издания: 2005 вая и цифровая передача информа-  Количество страниц: 592 ции, теорема отсчетов и ее использо-  ISBN: 5-94836-049-0 вание для выбора режимов функцио-  Цена: ≈ 583 руб. нирования канала связи, теоремы Най- Книга предоставлена издательством «Техквиста и Шеннона). Коды и их примене- носфера».

Обзор книжных новинок подготовил Александр Байрак

93


bugtraq Отказ в обслуживании в Sun Solaris Переполнение буфера в RealSecure/BlackICE Программа: BlackICE PC Protection 3.x, BlackICE Server Protection 3.x, ISS Proventia Desktop System 8.x, Proventia Server 1.x, RealSecure Desktop Protector 7.x, RealSecure Network 7.x, RealSecure Server Sensor 7.x. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки в механизме обнаружения переполнения буфера в Mailslot-сообщениях. Удаленный пользователь может с помощью специально сформированного SMB-пакета аварийно завершить работу приложения или вызвать отказ в обслуживании системы. URL производителя: www.iss.net. Решение: Установите последнюю версию с сайта производителя.

Множественные уязвимости в IBM WebSphere Application Server Программа: IBM WebSphere Application Server 6.1.x. Опасность: Средняя. Описание: 1. Уязвимость существует из-за ошибки при обработке soap-запросов и ответов. 2. Неизвестная уязвимость существует из-за ошибки в ThreadIdentitySupport. 3. Неизвестная уязвимость существует из-за ошибки в mbean. 4. Некоторые важные данные могут храниться в логфайлах и выводиться в командной строке wsadmin. 5. Некоторые данные могут быть раскрыты в trace. URL производителя: www.ibm.com. Решение: Установите исправление с сайта производителя.

Целочисленное переполнение буфера в ImageMagick Программа: ImageMagick 6.2.8 и более ранние версии. Опасность: Средняя. Описание: Целочисленное переполнение буфера существует в функции ReadSGIImage() при декодировании SGIизображений. Удаленный пользователь может с помощью специально сформированного SGI-изображения вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. URL производителя: www.imagemagick.org. Решение: Установите последнюю версию (6.2.9) с сайта производителя.

Программа: Sun Solaris 10 Опасность: Средняя. Описание: Уязвимость существует из-за неизвестной ошибки, которая позволяет вызвать панику системы в функции drain_squeue() во время большого количества TCP-соединений. URL производителя: www.sun.com. Решение: Установите исправление с сайта производителя.

Целочисленное переполнение буфера в VERITAS Backup Exec Remote Agent Программа: Backup Exec 9.1 for Netware Servers Remote Agent for Windows Servers (all builds), Backup Exec 9.2 for NetWare Servers Remote Agent for Windows Servers (all builds). Опасность: Средняя. Описание: Уязвимость существует из-за ошибки проверки границ данных в RPC-интерфейсе в удаленном агенте Backup Exec. Удаленный пользователь может вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. URL производителя: www.veritas.com. Решение: Установите исправление с сайта производителя.

Раскрытие данных в Sun Java System Application Server Программа: Sun Java System Application Server (Sun ONE) 7.x, Sun Java System Application Server 8.x, Sun Java System Web Server (Sun ONE/iPlanet) 6.x. Опасность: Средняя. Описание: Уязвимость существует из-за неизвестной ошибки. Удаленный пользователь может просмотреть произвольные файлы на системе. URL производителя: www.sun.com. Решение: Установите последнюю версию с сайта производителя.

Отказ в обслуживании в драйвере SRV.SYS в Microsoft Windows Программа: Microsoft Windows 2000, Microsoft Windows XP, Microsoft Windows 2003. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки разыменования нулевого указателя в драйвере srv.sys при обработке определенных SMB-пакетов. Удаленный пользователь может с помощью специально сформированного пакета аварийно завершить работу системы. URL производителя: www.microsoft.com. Решение: В настоящее время способов устранения уязвимости не существует.

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

94


подписка на 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 по каталогу агентства «Пресса России» * **

№9 сентябрь 2006

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

95


СИСТЕМНЫЙ АДМИНИСТРАТОР №9(46), Сентябрь, 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 г.). За содержание статьи ответственность несет автор. За содержание рекламного объявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены.

ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Технологии терминального доступа на службе систем «1С: Предприятие» В последние годы технологии терминального доступа к Windows-приложениям пользуются неимоверной популярностью. В нашей стране основную нишу занимает применение терминального доступа для компенсации недостатков скорости обработки информации наиболее популярной системой учета – 1С: Предприятие. Именно узкие места реализации обработки данных в этой системе (а именно – нерациональные процедуры чтения-записи записей из БД по сети) привели к необходимости решения проблемы ускорения системы в целом.

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

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

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

Многоядерные процессоры и проблемы, ими порождаемые

Многоядерные и Hyper-Threading-процессоры не только увеличивают производительность, но и порождают многочисленные проблемы – некоторые приИстория компании Transmeta. Часть 2 ложения (драйверы) начинают работать Ах, как хотелось Transmeta «прыгнуть нестабильно, выбрасывая критические выше собственной головы»… К сожа- ошибки или обрушивая систему в голулению, суровая реальность быстро бой экран смерти. В чем причина такого «спустила» компанию с «небес на зем- поведения и как его избежать?

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

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

96


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.