№4(29) апрель 2005 подписной индекс 81655 www.samag.ru
Почтовая система Alt-N MDaemon Базовая настройка маршрутизатора Cisco Windows Server Update Services Apache как прокси-сервер Виртуальная машина SVISTA Архивируем данные с помощью Bacula Защита коммуникаций Windows Mobile
№4(29) апрель 2005
Система создания документации POD Оптимизация циклов под Linux
оглавление настройка маршрутизатора 3 Базовая Cisco начального уровня 5, 6 Андрей Маркелов
СОБЫТИЯ ТЕНДЕНЦИИ
andrew@markelov.net
АДМИНИСТРИРОВАНИЕ Windows Server Update Services Сергей Сергеев
Slackware на ракетном топливе, или Обзор VectorLinux 5.0.1 SOHO 8
sergs13@yandex.ru
Сергей Яремчук
51
grinder@ua.fm
Автоматизация MS Windows, или AutoIt как мечта эникейщика Часть 1
Реинкарнация данных Сергей Супрунов
Алексей Барабанов
11
alekseybb@mail.ru
54
amsand@rambler.ru
БЕЗОПАСНОСТЬ Защита коммуникаций Windows Mobile
Чудо-юдо Resource Kit Александр Шибенко
16
pulse@hotmail.r
Роман Марков
60
Управление безопасностью Internet Explorer 18
stepan-razin@newmail.ru
Наталья Мельникова hataha@yandex.ru
Alt-N MDaemon – почтовая система для средних и крупных компаний
Наталья Мельникова
66
hataha@yandex.ru
Kaspersky Anti-Spam 2.0 + Sendmail
ПРОГРАММИРОВАНИЕ 25 Система создания документации POD Часть 2
Денис Городецкий denik27@nm.ru
Система вещания на основе Windows Media Services 9
Алексей Мичурин
72
alexey@office-a.mtu-net.ru
Михаил Платов
28 Техника оптимизации под Linux Часть 3
platov@cs.vsu.ru
Apache как прокси-сервер
Крис Касперски Валентин Синицын
34
val@linuxcenter.ru
Сергей Яремчук
38
grinder@ua.fm
Архивируем данные с помощью Bacula zeiba@zeiba.org.ua
78
kk@sendmail.ru
ОБРАЗОВАНИЕ Сервер для школ
SVISTAть всех наверх!
Алексей Гринько
48
Сергей Яремчук
88
grinder@ua.fm
КНИЖНАЯ ПОЛКА 42 BUGTRAQ
93 87, 94
Спешите оформить подписку на второе полугодие 2005 года! Подписной купон на стр. 95 ¹4, àïðåëü 2005
1
конкурс
IT-ТУРНИР СТУДЕНЧЕСКИХ КОМАНД «КУБОК СЕТЕВЫХ ПРОЕКТОВ MICROSOFT» Какому человеку, постоянно или время от времени выполняющему роль системного администратора, не хочется расти профессионально и получать достойную оплату? Хотя студенческий турнир IT-команд «Кубок сетевых проектов Microsoft» и не решает проблему роста (профессионального и зарплаты) кардинально, он тем не менее дает всем участникам возможность набраться опыта, заработать денег и получить весьма неплохие призы. «Кубок сетевых проектов Microsoft» – это конкурс студенческих проектов по созданию функциональной компьютерной сети небольшого предприятия. Проект требует первоначального планирования, согласно заданному техническому заданию, а затем выполняется на реальном оборудовании командой студентов и защищается перед независимой комиссией. В ходе проекта студентам предстоит настроить серверы и рабочие станции, соединить удаленные офисы предприятия, обеспечить беспроводной доступ и подумать о проблемах безопасности. В составе команды может быть 3 или 4 человека. За каждым человеком закрепляется определенная функция: Руководитель проекта, Исполнитель решения, Составитель проектной документации или Демонстратор решения. Чтобы защитить оборудование от совершенных «чайников», студенты, претендующие на роли Руководителя проекта или Исполнителя решения, должны будут пройти небольшой технический тест.
Среди призов следует особо отметить домашний интернет-центр ZyXEL P-662 HW ЕЕ, лицензионную копию Windows XP Professional и бесплатное обучение по любому курсу Microsoft с последующей международной сертификацией. Участники лучшей команды получат в подарок годовую подписку на журнал «Системный администратор». К участию в турнире приглашаются студенты всех московских вузов. При этом организаторы заявляют, что «Кубок сетевых проектов Microsoft» – это не олимпиада и не соревнование «для самых умных», так как не всем в команде нужна техническая подготовка. Многое в итоге будет зависеть не только от тех, кто будет настраивать оборудование, а от тех, кто будет писать техническую документацию и демонстрировать проект независимой комиссии. Для всех, кто сомневается в собственных силах, Учебный центр ВМК МГУ & SoftLine Academy (на базе которого проводится турнир) будет проводить специальное обучение, готовящее к выполнению проекта. Поскольку турнир командный, главное – собрать команду и зарегистрироваться on-line на сайте до 31 мая. Лучше всего собрать собственную команду из своих друзей. Можно также участвовать индивидуально и собрать свою команду на специальном семинаре позже. Само выполнение проекта на оборудовании начнется 1 июня, а награждение победителей состоится 1 октября. По описанию турнир кажется достаточно интересным, чтобы принять в нем участие, потратить немного собственного времени и вплотную познакомиться с современными IT-технологиями, такими как ADSL, VPN, беспроводной доступ, распределенная система Active Directory, WEP/WPA и 802.1x. Если учесть, что в рамках турнира также предлагается и обучение, в ближайшее время организаторам следует ждать настоящего шквала заявок на участие. Турнир организован компаниями Microsoft и SoftLine при поддержке московского представительства компании ZyXEL. Регистрация на него открыта с 4 апреля 2005 г. на сайте http://www.it-university.ru/itproject.
Организаторы турнира:
Генеральный партнер:
Информационная поддержка:
Ãëàâíûé ïðèç îò êîìïàíèè ZyXEL – èíòåðíåò-öåíòð P-662 HW ÅÅ
2
события
27-29
Open Source Forum Russia: все двери открытому коду открыты!
Как мы уже писали в одном из последних номеров, с 27 по 29 апреля в Москве будет проходить Open Source Forum Russia – первое в России информационно-выставочное мероприятие, которое соберет вместе российских, американских и европейских лидеров индустрии Open Source, ведущих поставщиков технологий с открытым исходным кодом и заказчиков, заинтересованных в развертывании надежных и экономичных Linux-решений, а также российские ITкомпании, которые намерены развивать собственные решения на базе программного обеспечения Open Source. Сообщаем вам подробности предстоящего события.
рен приехать в Россию, чтобы выступить с докладом на Open Source World Russia. Именно Ларри Уолл в 1987 году создал язык программирования Perl. Он удостоился первой награды Free Software Foundations за продвижение ПО на открытом коде. Господин Уолл также известен как соавтор знаменитой книги «Programming Perl» и создатель программы для чтения новостей rn Usenet. Свою заинтересованность в участии в конференции подтвердил Рич Боуен (Rich Bowen) СТО компании Cooper McGregor CTO и эксперт по Apache. Он является соавтором книг «Apache Administrator’s Handbook», «Apache Server Unleashed». Господин Боуен внес огромный вклад в проект по развитию Apache, и он регулярно принимает участие в международных конференциях, посвященных открытому коду.
Узнайте о новых возможностях
Развивайте свой бизнес
Open Source Forum Russia откроет для посетителей мир новейших технологий с открытым исходным кодом, совершенных бизнес-приложений на платформе Linux и IT-услуг корпоративного уровня. Главными темами первого российского Open Source Forum станут безопасность программных продуктов и технологий, возможности и преимущества использования Linux-решений в государственных учреждениях России, а также перспективы использования продуктов Open Source в корпоративном секторе.
Open Source Forum Russia соберет лучших IT-профессионалов, работающих над созданием и продвижением технологий с открытым исходным кодом. На сегодня это мероприятие – наилучшая в России площадка для завязывания деловых контактов, установления и развития партнерских связей в сфере продуктов, решений и услуг Open Source. Участвуя в первом российском Open Source Forum, вы определяете дальнейшие пути влияния Linux и технологий Open Source на развитие общественных структур, бизнеса и технологий России. Вход свободный – регистрация обязательна! Подробную информацию и регистрационную форму можно найти здесь: http://www.opensource-forum.ru.
АПРЕЛЯ
Обсуждайте стратегии с лидерами мировой ИТ-индустрии На выставке и конференции Open Source Forum Russia будут представлены все лидирующие мировые поставщики IT, активно участвующие в развитии технологий Open Source, – IBM, Novell, Hewlett Packard и др. Руководители высшего звена глобальных корпораций – Ричард Зайбт (President Novell EMEA) и Адам Джолланс (IBM) – обратятся напрямую к представителям государственных организаций и частных компаний России. Посетив Open Source Forum Russia, вы получите уникальную возможность услышать выступления выдающихся экспертов по Linux-технологиям, обсудить с руководителями мировых корпораций стратегические тенденции мира Open Source, а также опробовать в действии и оценить новейшие продукты и решения на базе ПО с открытым исходным кодом. Специально для выступления в конференции в Москву приезжает Джон «мэддог» Холл (John maddog Hall), исполнительный директор Linux International. Господин Холл – один из основателей движения сторонников открытого кода. Его перу принадлежит книга «Linux for Dummies», и он является автором многочисленных статей, посвященных специфике открытого кода. Свое участие подтвердил один из основателей MySQL – Дэвид Аксмарк (David Axmark). Господин Аксмарк более 20 лет работает в качестве консультанта в области разработки ПО. В 80-е годы он увлекся идей свободного программного обеспечения, и сейчас он является сторонником бизнес-модели, основанной на технологиях открытого кода. В MySQL господин Аксмарк работал над стратегией и аспектами, касающихся бизнеса и коммерции, установки и документации. СЕО компании Perl Ларри Уолл (Larry Wall) также наме-
¹4, àïðåëü 2005
3
тенденции Новости проекта OpenNet.ru Завершен первый конкурс разработчиков открытого программного обеспечения, проводимый проектом OpenNet.ru совместно с ассоциацией РУССОФТ, компанией LinuxCenter и журналом «Системный администратор». Всего на участие в конкурсе было подано 25 заявок, из которых, путем открытого голосования, определились три победителя: ! 1 место – Глеб Смирнов (525 баллов). Разработчик и коммиттер операционной cистемы FreeBSD. ! 2 место – Андрей Бешков (254 балла). Автор статей и редактор журнала «Системный Администратор», занимается локализацией и продвижением системы Nagios. ! 3 место – Михаил Кашкин (223 балла). Занимается поддержкой и продвижением проектов python, zope, plone и системы Asterisk. Является автором сайтов: plone.org.ru, xen.ru, cook.python.ru. Конкурсанты, занявшие призовые места, примут бесплатное участие в форуме Open Source Forum Russia. Также победителям конкурса вручена годовая подписка на журнал «Системный администратор» от редакции издания и комплект призов от компании LinuxCenter. Кроме того, специальный приз от проекта OpenNet.ru, в виде 3 тысяч рублей, вручается Константину Осипову, принимающему активное участие в разработке СУБД MySQL. В десятке лидеров: ! 4 место (201 балл) Максим Кошелев (автор Downloader for X); ! 5 место (142 балла) Руслан Старицын (WIPFW – Windows-порт пакетного фильтра ipfw); ! 6 место (141 балл) Владислав Харчев (автор патчей к огромному числу проектов); ! 7 место (140 баллов) Юрий Хныкин (CLIP – Clipper/xBase-совместимый компилятор); ! 8 место (122 балла) Виктор Костромин (автор нескольких книг по Linux, поддерживает проект rus-linux.net); ! 9 место (118 баллов) Андрей Маркелов (статьи и переводы); ! 10 место (102 балла) Андрей Елсуков (статьи, патчи, помощь в форумах).
¹4, àïðåëü 2005
Планируется, что проводимое в рамках OpenNet.ru мероприятие получит продолжение в серии конкурсов, направленных на поддержание и стимулирование русскоязычных разработчиков открытых программ.
Максим Чирков
64-битные серверные платформы от HP Пресс-конференция HP, посвященная презентации нового поколения серверов HP ProLiant ML570 G3 и DL580 G3, состоялась 5 апреля в отеле «Катерина» в Москве. Главной темой стали 4-х процессорные сервера третьего поколения на базе новейших 64-разрядных процессоров Intel Xeon MP Cranford (3.66 ГГц и 1 Mб L2) и Potomac (3.33 ГГц и 8 Mб L3). В этом секторе рынка HP лидирует (44%) и новые сервера, построенные с использованием чипсета Intel Twin Castle, лишь усиливают отрыв от конкурентных аналогов. Четыре процессора, соединенные с четырьмя контроллерами памяти двумя шинами, могут работать с общей памятью, как с однородным пространством. Такое архитектурное решение, кроме значительного увеличения объема оперативной памяти, позволяет реализовать на ней новые технологии, ранее доступные только для дисковой памяти: зеркалирование, RAID-5 и горячая замена (Hot Plug RAID memory). В случае отказа происходит определение поврежденного модуля памяти и оперативное восстановление информации за счет избыточности RAID, что позволяет, отключив соответствующий блок памяти, вынуть его из корпуса и произвести замену поврежденного модуля, естественно, все без разгрузки сервера. Добавив к этому RAID6 на дисковом массиве вместе с бэкапной батареей на 72 часа для write-back кеша SCSI контроллера получаем превосходную платформу для систем высокой степени готовности, ориентированных на приложения с интенсивным использованием памяти. И не удивительно, что на эталонном тесте SAP ® Standard Application Benchmark сервер DL580 G3 обеспечил работу на 270 пользователей больше, чем его предшественник второго поколения, что обозначило рост производительности на 40%!
Алексей Барабанов
5
тенденции Уменьшение числа лицензий Open Source
Изменение курса Mozilla Foundation
Организация Open Source Initiative, как и обещала, начала инициативу по снижению числа используемых лицензий Open Source. По словам представителей OSI, группа вводит трехбалльную систему оценки и в качестве «предпочтительных» будет называть лишь небольшое число открытых лицензий. Какие из действующих лицензий удостоятся этого статуса, пока еще не решили. Кроме того, OSI приняла три новых административных постановления, что помогут проводить проверку появляющихся лицензий для выяснения меры их бесполезности. Реакция на данное решение не заставила себя ждать: компания Intel отозвала свою открытую лицензию, основанную на BSD License.
Некоммерческая организация Mozilla Foundation объявила о том, что более не будет обновлять веб-браузер Mozilla, отдав предпочтение другим открытым продуктам: Firefox и Thunderbird. По словам разработчиков, несмотря на предварительные редакции Mozilla 1.8, альфа- и бета-релизы которой, как выяснилось, были предназначены для тестирования движка, финальная версия «Seamonkey» так и не увидит свет, а ветка 1.7.x станет последней для Mozilla. Однако совсем забывать про Mozilla Suite в ближайших планах Mozilla Foundation нет: уже 21 марта выходит очередное обновление – 1.7.6 (одновременно с релизом Thunderbird 1.0.2), ни о каких окончательных сроках прекращения поддержки Mozilla не сообщается.
Linux-инициативы Novell Компания не перестает активное выступление на ИТ-сцене со своими Linuxпредложениями. Сначала Novell объявляет о том, что до октября 2005 года агентства государственного сектора Германии с числом пользователей до 500 человек получают скидку в размере 60% на все продукты, объявив главной целью акции популяризацию идей миграции на ОС Linux. Позже совместно с HP и Red Hat запускает веб-сайт VersiBa, предназначенный для немецких банков и страховых компаний, желающих воспользоваться Linux-услугами. На новом портале представлена информация о ПО, специально разработанном для финансовой области, а также об офисных и коммуникационных Linux-предложениях от Novell, Red Hat и других независимых поставщиков.
Mandrakesoft меняет название на Mandriva Причин произошедшей смены названия было две: недавнее слияние компании Mandrakesoft с бразильским Linux-производителем Conectiva, а также судебное разбирательство с корпорацией Hearst, для завершения которого, как решили, куда проще пойти на некоторые уступки. Все сервисы и продукты Mandrakesoft получили соответствующие наименования: дистрибутив Mandriva Linux, клуб пользователей Mandriva Club и т. п. Официальный вебсайт теперь доступен по адресу www.mandriva.com.
6
Составил Дмитрий Шурупов по материалам www.nixp.ru
HDDlife PRO: профессиональный подход к мониторингу состояния жесткого диска Компания BinarySense объявила о выходе профессиональной версии HDD life – удобной и функциональной программы, позволяющей пользователю полностью контролировать состояние жесткого диска своего компьютера и предотвратить таким образом потерю данных. Использование принципиально новой уникальной технологии JustNow, реализованной в программе HDDlife Pro, делает возможным получение информации о состоянии здоровья и производительности жестких дисков компьютера при первом же запуске программы, исключая необходимость длительного предварительного контроля. Функция AnywhereView обеспечивает возможность увидеть эти данные из любой программы и приложения: в меню «Мой компьютер», в окне «Открыть файл» в Microsoft Word и т. д. Программа поддерживает все распространенные виды жестких дисков (IDE, Serial ATA, SCSI), обладает удобным и красивым пользовательским интерфейсом, переведенным на 15 языков, а также возможностью настройки проверки по расписанию и рассылки уведомлений о проблемах по e-mail.
администрирование
WINDOWS SERVER UPDATE SERVICES
СЕРГЕЙ СЕРГЕЕВ Одним из необходимых мероприятий по обеспечению надежного и безопасного функционирования современной информационной системы является своевременная установка обновлений для существующих программных продуктов. На компьютерах под управлением операционной системы Microsoft Windows загрузкой и установкой критических обновлений системных компонентов занимается служба
8
Automatic Updates (автоматическое обновление). В крупных компьютерных сетях Windows отслеживание и установка обновлений без специального средства может занимать значительную часть рабочего времени системного администратора, либо увеличивать трафик интернет-соединения. Начиная с 2002 года Microsoft предоставляет бесплатный продукт для управления обновлениями в сетях Windows.
администрирование Сначала это был сервер Software Update Services (SUS), и, наконец, 22 марта 2005 года на сайте Microsoft (http:// www.microsoft.com/windowsserversystem/updateservices/ default.mspx) была опубликована информация о выходе в свет Release Candidate-версии нового продукта – Windows Server Update Services (WSUS RC). Документация и файлы установки WSUS RC доступны для свободной загрузки с сайта Microsoft. Служба WSUS предназначена для централизованного управления обновлениями и исправлениями корпоративных продуктов Microsoft: Windows XP Professional, Windows 2000, Windows Server 2003, Office XP, Office 2003, SQL Server 2000, SQL Server 2000 Desktop Engine (MSDE) 2000, Exchange Server 2000 и Exchange Server 2003. Скорее всего, набор поддерживаемых продуктов будет увеличиваться. Это подтверждается тем фактом, что при первой же синхронизации WSUS с сайтом Microsoft Update список обновляемых продуктов в окне настройки параметров синхронизации значительно вырос. От предыдущего продукта Microsoft для управления обновлениями (SUS), WSUS отличается значительным набором функций и возможностей: ! расширен набор обновляемых продуктов; ! объединение клиентских компьютеров в группы, настройка правил обновлений для каждой группы; ! возможность автоматической загрузки и установки необходимых обновлений без ручного вмешательства администратора; ! развитая система отчетов позволяет получать информацию о клиентских компьютерах, а также о требуемых, загруженных и установленных обновлениях; ! использование базы данных для хранения настроек сервера, описаний обновлений, состояния клиентских компьютеров; ! возможность загрузки так называемых файлов экспресс-установки, обеспечивающих ускоренную загрузку и установку обновлений на клиентские компьютеры, но увеличивающих время получения обновлений сервером; ! дочерние серверы WSUS могут управляться как централизованно основным сервером, так и независимо от него; ! применение технологии Background Intelligent Transfer Service (BITS) 2.0 для более эффективного использования сетевого трафика сервером и клиентом WSUS; ! передача базы обновлений между серверами WSUS через переносные устройства хранения информации; ! специальная утилита WSUSUTIL позволяет управлять сервером WSUS из командной строки; ! возможна установка WSUS поверх существующего сервера SUS, а также при помощи специальной утилиты импорт базы обновлений с другого сервера SUS; ! возможность доверять локальным администраторам самим настраивать порядок загрузки и установки обновлений на управляемые ими компьютеры. WSUS является весьма полезным инструментом для системных администраторов сетей разных масштабов. Эта служба позволяет снизить трафик интернет-соединения организации за счет однократной загрузки обновлений с
¹4, àïðåëü 2005
сайта Microsoft Update, централизованно управлять обновлениями программных продуктов Microsoft в сети организации. Интерфейс консоли администрирования WSUS, доступ к которой осуществляется по протоколу http через Internet Explorer версии 6.0 или старше, достаточно понятен и удобен для работы. Доступ к средствам администрирования из другого интернет-браузера, а также из операционных систем ниже Windows 2000, не поддерживается.
Ðèñóíîê 1. Ãëàâíîå îêíî êîíñîëè àäìèíèñòðèðîâàíèÿ WSUS
Существует возможность настроить службу таким образом, что обновления не будут храниться локально на сервере WSUS, а загружаться по запросу клиентов с сайта Microsoft. Тем не менее этот вариант в большинстве случаев представляется менее целесообразным, особенно в средних и крупных сетях с большим количеством компьютеров с одинаковым набором программного обеспечения. Для сетей с развитой инфраструктурой возможно использование последовательности (цепочки) серверов WSUS, один из которых загружает обновления с сайта Microsoft Update, а остальные синхронизируют свою базу обновлений с базой этого (или вышестоящего) сервера. Причем имеется возможность передачи обновлений с одного сервера WSUS на другой не только по каналам связи, но и при помощи процедуры выгрузки на переносное устройство хранения информации с последующей загрузкой на другой сервер. Это особенно актуально для территориально удаленных подразделений организаций в случае отсутствия или низкой скорости и качества каналов связи с ними (рис. 2). WSUS состоит из серверной и клиентской частей. Серверная часть устанавливается на компьютеры с операционными системами Windows 2000 Server или Windows Server 2003. Клиентами WSUS могут быть компьютеры под управлением Windows 2000 с установленными Service Pack 3 или 4, Windows XP Professional Service Pack 1 или 2, Windows Server 2003. Для своей работы WSUS использует сервер баз данных MS SQL Server 2000. Возможно использование как полно-
9
администрирование функциональной версии MS SQL Server 2000, так и бесплатной Microsoft SQL Server 2000 Desktop Engine (MSDE) (доступна для загрузки на сайте Microsoft) при установке на компьютер с операционной системой Windows 2000 Server; или Microsoft Windows SQL Server 2000 Desktop Engine (WMSDE), которая включена в состав дистрибутива WSUS и доступна только при установке на Windows Server 2003. В базе данных хранятся описания обновлений, конфигурация сервера WSUS, информация о состоянии обновлений клиентских компьютеров.
Ðèñóíîê 2. Îäíà èç âîçìîæíûõ ñõåì îðãàíèçàöèè ðàáîòû WSUS
Клиент WSUS – служба Automatic Updates (автоматическое обновление) – работает с сервером по протоколу http, поэтому на сервере должна быть установлена и запущена служба WWW (World Wide Web) из состава сервера IIS (Internet Information Services). Администратор сервера WSUS имеет возможность выбирать обновления для синхронизации по версии продукта, типу (классу) обновления (драйверы, критические обновления, накопительные пакеты обновлений, обновления системы безопасности, и т. д.) и языку. К сожалению, нет возможности выбирать конкретные классы обновлений и языки интерфейса в зависимости от продукта. Например, невозможно настроить WSUS так, чтобы синхронизировать список обновлений Windows 2000 только для английской версии и в то же время обновлений Windows XP только для русской версии. При включении в списке языков русского и английского будут синхронизироваться обновления на обоих языках и для Windows 2000, и для Windows XP (естественно, при условии включения загрузки обновлений этих операционных систем в настройках списка продуктов). Синхронизацию списка обновлений сервера WSUS с базой Microsoft Update можно выполнять как в ручном режиме, так и автоматически ежедневно в заданное время. После получения списка доступных обновлений и, как правило, после сбора информации о состоянии обновлений клиентских компьютеров («обнаружения»), можно отметить для
10
загрузки и установки («одобрить», в терминологии WSUS) только необходимые обновления. Есть возможность автоматизировать операции одобрения обнаружения и установки обновлений, задав соответствующие условия для правил. Другими словами, WSUS можно настроить таким образом, что синхронизация с Microsoft Update и установка обновлений будет выполняться в полностью автоматическом режиме. В сетях, использующих Active Directory (AD), настройка параметров автоматического обновления клиентов выполняется при помощи групповой политики, в сетях без AD – настройкой параметров реестра операционных систем Windows клиентских компьютеров. Параметры службы автоматических обновлений позволяют настроить получение и установку обновлений как с участием конечного пользователя, так и автоматически с последующим уведомлением о необходимости перезагрузки компьютера. Протоколирование работы службы WSUS ведется в журналах событий, а также в файлах с расширением *.log, и на сервере, и на клиенте. Исходя из собственного опыта и сообщений в форумах, можно сделать вывод, что основные проблемы при внедрении WSUS возникают при подключении клиентов к серверу, установке клиентской части WSUS и необходимых программ для загрузки обновлений. Зачастую диагностика и определение источника проблемы вызывает затруднение даже у опытных администраторов. К примеру, возникали проблемы при подключении компьютера с операционной системой Windows 2000 Professional SP4 к серверу WSUS. В файле WindowsUpdate.log фиксировалась серия ошибок с кодом 0x80244001. Проблему удалось решить только с помощью специалистов Microsoft, обратившись на сайт Beta News. Она заключалась в неправильной настройке компонентов Internet Explorer 5.0 на клиентском компьютере. После установки Internet Explorer 6.0 ошибка исчезла. Поэтому хотелось бы, чтобы содержание сообщений WSUS (особенно об ошибках) было более информативным. Окончательный выход WSUS намечен на конец второго квартала 2005 года. Согласно информации от Microsoft, для пользователей WSUS RC будет возможно обновление до финальной версии. На данный момент WSUS RC доступен только на двух языках: английском и японском. Окончательная версия продукта будет локализована для всех языков, поддерживаемых серверными и клиентскими операционными системами Windows. Развертывание службы WSUS в сети организации практически не связано с дополнительными затратами. Эту службу можно установить на уже существующий сервер, при этом нужно использовать либо имеющийся сервер баз данных MS SQL Server 2000, либо бесплатный MSDE. Службу можно настроить так, что пользователи даже не будут знать о ее существовании. Несмотря на явные выгоды от внедрения систем управления обновлениями, многие администраторы все еще не используют их в своих сетях. Думается, что с выходом такого мощного и в то же время простого и удобного в администрировании средства, как WSUS, количество организаций, использующих централизованные средства управления установкой обновлений, увеличится.
администрирование
АВТОМАТИЗАЦИЯ MS WINDOWS, ИЛИ AUTOIT КАК МЕЧТА ЭНИКЕЙЩИКА ЧАСТЬ 1
Если не работает ксерокс, вызывайте сисадмина. Это ведь электронный прибор, разве нет?1
АЛЕКСЕЙ БАРАБАНОВ Со дня появления компьютеров человечество разделилось на пользователей и «компьютерщиков». Они стояли по разные стороны от электронной вычислительной машины, иногда путаясь в точной принадлежности к своему классу или группе. Но постепенно всё и все стали на свои места. Число пользователей увеличивалось, а число «компьютерщиков» лишь уточнялось. Пока компьютеров было мало, и они представляли собой большие инженерные сооружения, обслуживаемые целыми бригадами «компьютерщиков», в составе которых находилось изрядно механиков и электриков, то и число пользователей, приходящееся на один компьютер, старались сделать максимально большим. Общее соотношение пользователей к «компьютерщикам» мало кого интересовало, поскольку главным ресурсом были именно компьютеры. Но с появлением персональных компьютеров, когда пропорция их числа к количеству пользователей бесповоротно перешла в разряд целых чисел, иметь бригаду для обслуживания каждого компьютера стало очень накладно. Именно с этого момента, с момента создания персональных компьютеров, разработчики как оборудования, так и программного обеспечения стали задумываться о снижении затрат на обслуживание своих изделий. Именно тогда абстрактные «компьютерщики» стали превращаться в системных администраторов, специализирующихся на обслуживании компьютерных систем. Одновременно с этим стали появляться и специальные программные продукты, предназначенные именно для системных администраторов или ориентированные в первую очередь на решение задач обслуживания. 1
Например, пользователи IBM 360, работающие в среде DOS, должны были так или иначе знать и уметь применять язык управления заданиями JCL, а если они работали в консольном режиме, то и язык управления работой всей системы. А вот те же пользователи IBM PS/2, работающие в среде OS/2, уже могли ничего не знать про настройки системы и довольствоваться лишь тем, что им предоставляет графический интерфейс. Таким образом, вопрос отличия пользователей от системных администраторов свелся к отличию применяемых ими интерфейсов. Пользователь компьютера, встроенного в мобильный телефон, управляет устройством с помощью графического интерфейса и кнопок на корпусе аппарата, а техник, обслуживающий этот же телефон, пользуется консольными командами или графическим интерфейсом программы специального компьютера, к которому упомянутый телефон подключается через технологический разъем JTAG. Другими словами, интерфейс должен соответствовать решаемым задачам. Но для персональных компьютеров интерфейс имел поистине судьбоносное значение. Ведь самое главное отличие их от компьютеров, использующихся коллективно, заключался в монопольном предоставлении всех ресурсов одному пользователю. Это не могло не сказаться на способе решения проблемы интерфейса. Многие из первых персональных компьютеров продавались как приставка к телевизору, например Sinclair. То есть без телевизора это был еще не компьютер, а вот после его подключения компьютером уже можно было пользоваться. В этом проявлялась важность интерфейса.
Здесь и далее, околокомпьютерный фольклор.
¹4, àïðåëü 2005
11
администрирование Коммерческий успех ПК в очень большой степени зависел от того, как решался вопрос интерфейса, и насколько легко этим интерфейсом могли пользоваться неподготовленные потребители. Если бы первые ПК имели такой же текстовый интерфейс, как мейн-фреймы (для сведения, JCL многие за сверхзапутанность называли «птичьим языком»), то, скорее всего, лишь появившись, эти устройства канули бы в Лету. Но этого не произошло именно благодаря доступному и привлекательному графическому интерфейсу. Сначала главное было в самом экране, то есть в телевизионной трубке. Вероятно, людей привлекало то, что с помощью ее можно было просматривать не только новости и кинофильмы. Но затем в компании Xerox прошли удачные опыты по обучению разумных прямоходящих млекопитающих навыкам использования манипулятора «мышь» с одной кнопкой. Это было поистине революционным событием. И хотя «мышь» с того времени успела увеличить число кнопок, но предложенный способ взаимодействия с ПК путем нажатия на кнопки мыши, или «кликов», прочно вошел в обиход компьютерных пользователей. И точно так же однозначно заставил принять системных администраторов негативную позицию к этому процессу – «мышиному» кликанью.
Интерфейсы Если сисадмин по телефону говорит вам, какие кнопки надо нажимать, почитайте газету. Hа самом деле я не хочу, чтобы вы что-то делали. Мне просто нравится звук моего голоса.
Чем же «мышки» так не устроили сисадминов? Дело было не столько в манипуляторах «мышь», а в особенностях применяемого тогда графического интерфейса. Поскольку главным показателем уровня системного администрирования стало число обслуживаемых одним сотрудником компьютеров, то средства обеспечения автоматизации системных операций, установки ОС, ее настройки и управления, приобретали решающее значение. И вплотную решение этого вопроса соприкасалось с обеспечением всех этих же работ по каналам удаленного доступа. Естественно, для платформ с текстовым интерфейсом и первое, и второе решалось легко. Существовали простые скриптовые языки, которые позволяли очень быстро запрограммировать любую операцию управления ОС, и средства обеспечения удаленного доступа в текстовом режиме обеспечивались на достаточно слабом технологическом уровне коммуникаций. Например, так решались вопросы администрирования в ОС семейства UNIX. Но в операционных системах, ориентированных на работу в графической среде, все было не так просто. Во-первых, графический интерфейс с семантической точки зрения полностью определяется прикладной программой. То есть, реакция на активацию кнопки «ОК» в графическом меню зависит от фазы диалога и от назначения программы, его обслуживающей. Во-вторых, обеспечение удаленной работы в графической среде требовало гораздо большей пропускной полосы от каналов связи, чем работа в текстовом интерфейсе. Все это привело к тому, что автоматизация графических настроек практически не развивалась. Ну разве что самим разработчиком ОС, в данном случае Microsoft, путем увеличения сложности вложенных меню. И для системных администраторов работа в сре-
12
де Microsoft Windows превращалась в бесконечную тренировку кистевых мышц, поскольку ничем практически их возможности не отличались от тех, что были предоставлены рядовым пользователям, менялись лишь заголовки и содержание выпадающих окон. Это сыграло свою положительную роль – манипулятор типа «мышь» за последнее время из примитивной «каталки» с крыльчатками и обрезиненным шариком превратился в высокотехнологическое устройство на основе оптического (лазерного) сканера и оснащенное радиоканалом для связи с компьютером. Но ясно, что даже если манипулятор «мышь» будет преобразован в имплантант с компьютерным интерфейсом, это все равно не позволит одному системному администратору обслуживать одновременно большее число компьютеров, как этого требует современная IT-индустрия, подчиняющаяся жестким рамкам TCO: http://www.telecominfo.ru/?t=2012, таблица 2. И рост показателя числа одновременно обслуживаемых пользовательских компьютеров (Full Time Equivalent – FTE) сдерживался неразвитостью средств автоматизации системных работ в ОС, построенных на основе графических интерфейсов. Нельзя сказать, что все было ограничено лишь технологическими проблемами. Дело в том, что на платформе MS Windows, которая долгое время была безальтернативной для персональных компьютеров, применяются в основном проприетарные программные продукты. А решение проблемы их массовой установки идет в разрез с требованиями соблюсти обязательную процедуру регистрации (легализации, активации) каждой копии программы. Обычно процедура регистрации копии обставлена специальными защитными протокольными и не всегда техническими действиями, например, требуется согласиться с лицензией, ввести серийный номер с бокса или CD-диска, вставить ключевой диск в лоток привода, провести активацию через Интернет и многое иное, что взбредет в голову озабоченного получением прибыли разработчика. Даже сама ОС MS Windows в ее коробочном воплощении не предназначена для создания автоматизированных систем установки на ее основе. В чем смысл автоматического размножения одной копии, если по маркетинговому замыслу все продаваемые копии этой системы требуют оригинальной для каждой из них процедуры регистрации. Были, конечно, оставлены лазейки и прочие оговорки. Ну не могли же «отцы-основатели» этой софтверной «пирамиды» просто низвести весь институт системных администраторов до положения «эникейщиков». Поэтому существовали так называемые «корпоративные» версии, которые допускали серийную установку, как копирование одной и той же установочной процедуры на множество компьютеров. Правда, в отместку там вводились иные ограничения, например, на установку обновлений. Но даже такую суррогатную свободу автоматизации рутинных операций установки собственной продукции могла позволить далеко не каждая фирма-производитель программного обеспечения. Поэтому еще одна проблема автоматизации работ в среде GUI заключена в том, что многие программные продукты не предназначены для автоматической установки и настройки в силу дизайна, так как требовали в процессе установки именно «человеческих» действий.
администрирование Анимация вместо автоматизации Если вы увидели сообщение «Are you sure?», нажмите «Yes» как можно быстрее! Черт побери, если бы вы не были уверены, вы бы не делали этого, не так ли?
И вот все эти проблемы получили свое решение. Появилось средство автоматизации операций в графической оконной среде, которое имитировало работу человека-оператора, названное AutoIt и предназначенное изначально для автоматизации операций установки программ. Сейчас можно воспользоваться версией 2.64, загрузив ее с http:// www.hiddensoft.com/AutoIt, и версией 3.1.0, доступной по адресу: http://www.autoitscript.com/autoit3/index.php .Эти программы распространяются под открытыми лицензиями. Версия 2.64, написанная Джонатаном Беннетом (Jonathan Bennet), в некоммерческих проектах может быть использована без ограничений, а в коммерческих необходимо вместе с продуктом указывать ссылку на сайт разработчика. Версия 3.1.0, авторство которой принадлежит упомянутому Джонатану Беннету вместе с AutoIt Team, уже идет под GNU GPL, что свидетельствует о зрелости подхода и о невозможности в дальнейшем изъять эту программу из свободного оборота, переведя под какую-нибудь закрытую лицензию. На обе версии есть, кроме прилагаемого файла Help на английском языке, еще и русская версия документации в формате chm, подготовленная Валерием Ивановым. Если рассмотреть эту программу отдельно от контекста предполагаемого применения, то это всего лишь средство перехвата анализа состояния оконного интерфейса и эмуляции нужных сообщений якобы от лица оператора. Практически смотрится как демонстрационная мультипликация. Но с точки зрения языковой машины, например, юниксового bash, интерпретирующей некоторый скрипт, все действия выглядят точно так же мультипликативно. Только это никому не заметно, если происходит не на экране, а в текстовой консоли. И тем более что в текстовых интерпретаторах есть возможность прятать и перенаправлять обрабатываемые потоки символов. Но можно назвать и полную текстовую аналогию из мира *nix обсуждаемой здесь программе. Это известное средство expect. Оно позволяет заменить для некоторой прикладной программы общение с текстовыми терминалами и тем самым автоматизировать работу оператора путем эмуляции процесса его работы. Применяется это обычно для автоматизации работ с интерактивными средами, например с ftp. Примечательно, что и expect, и AutoIt имеют в своем составе средство, облегчающее создание сценариев путем записи перехваченных реальных интерфейсных данных. Конечно, в AutoIt это пока очень незрелое ручное средство, которое в модальном окне показывает характеристики выбранного элемента графического интерфейса. С точки зрения технологии AutoIt всего лишь использует возможности, заложенные в API графического интерфейса. Того же самого результата можно добиться с помощью Visual Basic или даже C++. Но в том-то и разница, что использование AutoIt позволяет избежать программирования на «тяжелых» языках. Ибо сисадмин не программист, и ему нужно не писать программы, а лишь решать стандартные проблемы автоматизации, возникающие в ходе его работы.
¹4, àïðåëü 2005
Итак, как же это работает. Такое средство должно иметь возможность ввести в управляемую им среду все необходимые данные, проанализировать ответ и в меру стандартных языковых возможностей организовать интерактивное выполнение описанного процесса. Все! Если интерфейс текстовый, что верно в отношении expect, то такая система должна вводить строковые последовательности, принимать и анализировать ответные строки и в зависимости от результата и в силу возможностей своего синтаксиса организовывать некоторый алгоритмический процесс. Если интерфейс графический, то к перечисленному добавляется GUIспецифика. К вводимым данным добавляются управление поведением окон (обнаружение, активация, минимизация, закрытие и проч.), закладок и других элементов оконного интерфейса, передвижение мыши и нажатия кнопок на ней. Точно так же, к получаемым данным добавляются события по созданию, активации и прочим операциям с окнами. Ну а оставшееся всецело определяется дизайном встроенного языка. В версии 2.* используется язык с синтаксисом подобным ассемблерному с разделителями в виде запятых и примитивными управляющими операторами, основанными на условных переходах. В 3-й версии это уже практически полноценный язык программирования с привычными управляющими структурами, включая функции, и как следствие goto из употребления в этом релизе изъят. И та и другая версии позволяют, как интерпретировать операторы, записанные в отдельный скриптовой файл, так и создавать исполняемую версию на основе runtime-компонентов. Но версия 3.* «тяжелее» в полтора раза. Поэтому исполняемые файлы на основе 2-й версии имеют размер от 40 Кб, а версии 3.* – от 116 Кб. Вероятно, из-за большего числа встроенных функций. Кроме уже перечисленного версия 3.* имеет встроенные тайм-ауты в операторах ожидания, что позволяет решать проблемы «зависаний» неустойчивых приложений, но в практике автоматизации стандартных действий можно с успехом обойтись и без этого. Другими словами, решения, построенные на версии 2.* не утратили актуальности для 90% задач, решаемых с помощью AutoIt, но релиз 3.* позволяет создавать полноценные приложения, если такое нужно. В интернет-ресурсах, посвященных AutoIt есть даже примеры игровых программ.
Установка программного обеспечения Если вы занимаетесь на вечерних компьютерных курсах, обязательно проверьте свои знания на своем и всех соседских компьютерах. Мы любим работать до 2:30 ночи, исправляя это.
Думаю, теории достаточно. Далее рассмотрим разнообразные примеры реального использования предложенной технологии. Здесь не ставится целью писать большие и изощренные программы. Главное, чтобы это были работоспособные и применимые в практике скрипты и программы. Часть из них будет разобрана в тексте, другая просто указана в ссылках и предназначена для самостоятельного изучения. Многие из них будут использованы в заключительном комплексном примере создания диска для автоматической установки MS Windows. Начиная с самой простой предложенные программы будут усложняться постепенно, что не мешает после прочтения всей статьи вернуться к
13
администрирование началу и переработать рассмотренные программы с использованием всего арсенала AutoIt. В качестве первого практического примера рассмотрим автоматизацию установки самого AutoIt. Поскольку мы располагаем сразу двумя работоспособными релизами, 2-м и 3-м, то решим задачу автоматической установки AutoIt версии 3 с помощью скрипта для 2-й. Для этого установим AutoIt версии 2 в систему и создадим с помощью текстового редактора Notepad файл setup_autoit3.aut. Расширение «aut» является стандартным для скриптов AutoIt2. Запишем следующую последовательность операторов: // óñòàíîâèì ðåæèì äåòåêòèðîâàíèÿ ñêðûòîãî òåêñòà â îêíàõ SetTitleMatchMode, 2 DetectHiddenText, on // óáåðåì âñå îêíà ñ ýêðàíà WinMinimizeAll // ïîäîæäåì ñåêóíäó Sleep, 1000 // çàïóñòèì óñòàíîâêó èç òîé æå äèðåêòîðèè Run, autoit-v3-setup.exe // âûâåäåì îêîøêî ñ ñîîáùåíèåì MsgBox, 0, AutoIt, Setup done // çàâåðøåíèå Exit
// óñòàíîâèì ðåæèì äåòåêòèðîâàíèÿ ñêðûòîãî òåêñòà â îêíàõ SetTitleMatchMode, 2 DetectHiddenText, on // óáåðåì âñå îêíà ñ ýêðàíà WinMinimizeAll // ïîäîæäåì ñåêóíäó Sleep, 1000 // çàïóñòèì óñòàíîâêó èç òîé æå äèðåêòîðèè Run, autoit-v3-setup.exe // äîæäåìñÿ íóæíîãî îêíà è íàæìåì Next WinWaitActive, AutoIt v3.1.0 Setup Send, {ENTER} // âûâåäåì îêîøêî ñ ñîîáùåíèåì MsgBox, 0, AutoIt, Setup done // çàâåðøåíèå Exit
Для проверки отменим установку и запустим скрипт по новой. После остановки снова завершим наш скрипт, развернем все окна и проанализируем результат, изображенный на рисунке.
Это очень короткая программка станет основой разрабатываемого скрипта. Все операторы снабжены комментариями и совершенно очевидны по содержанию. Но прежде чем запускать ее на выполнение загрузим «AutoIt Reveal Mode» – специальное средство для просмотра информации, скрытой в структурах связанных, с окнами в MS Windows. Затем запустим скрипт и дождемся завершения. После появления сообщения о завершении закроем его нажатием на кнопку «ОК» и снова развернем все окна. Должно получиться так, как показано на рисунке. Ðèñóíîê 2
Здесь аналогично первому запуску проследим за участками, отмеченными красным. Задача заключается в том, что надо «отловить» новое окно и активировать нужное действие. Но окно имеет такое же название, что и предыдущее! Тогда смотрим в окошке перехватчика, какие еще строковые значения нам доступны. Находим строку «License Agreement». Эта строка как нельзя лучше отражает специфическое значение полученного окна. И поскольку здесь снова нужное действие сразу стоит по умолчанию, то после обнаружения этого окна нужно снова отправить в него Enter. Меняем текст следующим образом:
Ðèñóíîê 1
Здесь обратите внимание, что в окне AutiIt v2.64 приводится весь перечень текстовых строк с активного окна, начиная с его заголовка. Именно на эти строки и будет далее «ловиться» установщик в нашем скрипте, и поскольку кнопка Next уже выделена как активная, то сразу, как только скрипт дождется активности окна с названием «AutoIt v3.1.0. Setup», можно отправлять этому окну Enter, что приведет к нажатию активной кнопки, то есть к переходу на следующий экран установщика. Вот текст следующей, более сложной фазы разработки:
14
// óñòàíîâèì ðåæèì äåòåêòèðîâàíèÿ ñêðûòîãî òåêñòà â îêíàõ SetTitleMatchMode, 2 DetectHiddenText, on // óáåðåì âñå îêíà ñ ýêðàíà WinMinimizeAll // ïîäîæäåì ñåêóíäó Sleep, 1000 // çàïóñòèì óñòàíîâêó èç òîé æå äèðåêòîðèè Run, autoit-v3-setup.exe // äîæäåìñÿ íóæíîãî îêíà è íàæìåì Next WinWaitActive, AutoIt v3.1.0 Setup Send, {ENTER} // àíàëîãè÷íî äîæäåìñÿ license agreement WinWaitActive, , License Agreement Send, {ENTER} // âûâåäåì îêîøêî ñ ñîîáùåíèåì MsgBox, 0, AutoIt, Setup done // çàâåðøåíèå Exit
администрирование Обратите внимание, как изменился синтаксис оператора WinWaitActive, поскольку теперь нужно определить окно не по названию, а по тексту внутри, то детектируемая строка записывается в третьем поле. Снова прекратим установку и проделаем те же операции, что и в предыдущем запуске. После остановки должен получиться результат, сходный с изображенным на рисунке.
Ðèñóíîê 3
Здесь все аналогично второму такту разработки скрипта автоматизации. Находим строку для детектирования окна, определяем, какие кнопки надо нажать. Все записываем в скрипт. Точно так же происходит разработка и четвертого такта. Собственно, можно прогнать всю установку в непрерывном цикле и просто запоминать строки, определяющие каждое из окон установщика, и записывать клавиатурные коды, которые вводятся в этом процессе. Программирование в AutoIt чрезвычайно простое занятие. В итоге получается следующая программа: // óñòàíîâèì ðåæèì äåòåêòèðîâàíèÿ ñêðûòîãî òåêñòà â îêíàõ SetTitleMatchMode, 2 DetectHiddenText, on // óáåðåì âñå îêíà ñ ýêðàíà WinMinimizeAll // ïîäîæäåì ñåêóíäó Sleep, 1000 // çàïóñòèì óñòàíîâêó èç òîé æå äèðåêòîðèè Run, autoit-v3-setup.exe // äîæäåìñÿ íóæíîãî îêíà è íàæìåì Next WinWaitActive, AutoIt v3.1.0 Setup Send, {ENTER} // àíàëîãè÷íî äîæäåìñÿ license agreement WinWaitActive, , License Agreement Send, {ENTER} // îêíî ñ âûáîðîì ìåñòà óñòàíîâêè WinWaitActive, , Choose Install Location Send, {ENTER} // çàâåðøåíèå óñòàíîâêè WinWaitActive, , Click Finish to close Send, {ENTER} // âûâåäåì îêîøêî ñ ñîîáùåíèåì MsgBox, 0, AutoIt, Setup done // çàâåðøåíèå Exit
Эта программа устанавливает AutoIt v3 в автоматическом режиме. Её можно преобразовать в исполняемый, а не интерпретируемый код. Но предлагаю прогнать ее полностью и далее перейти к работе в AutoIt v3, который как раз и будет установлен к этому моменту. Прежде всего, воспользуемся утилитой перевода тестов из 2-й версии в 3-ю «v2
¹4, àïðåëü 2005
to v3 Converter». Такой подход позволяет сразу получить синтаксически верную программу. Вот результат: // V2.64 to V3.0.100 (Version 1.0.6) // Converted with AutoItV2toV3 [Version 1.0.6] // (C) Copyright 2004 J-Paul Mesnage. // óñòàíîâèì ðåæèì äåòåêòèðîâàíèÿ ñêðûòîãî òåêñòà â îêíàõ AutoItSetOption ( "WinTitleMatchMode", 2 ) AutoItSetOption ( "WinDetectHiddenText", 1 ) // óáåðåì âñå îêíà ñ ýêðàíà WinMinimizeAll ( ) // ïîäîæäåì ñåêóíäó Sleep ( 1000 ) // çàïóñòèì óñòàíîâêó èç òîé æå äèðåêòîðèè Run ( 'autoit-v3-setup.exe' ) // äîæäåìñÿ íóæíîãî îêíà è íàæìåì Next WinWaitActive ( 'AutoIt v3.1.0 Setup' ) Send ( '{ENTER}' ) // àíàëîãè÷íî äîæäåìñÿ license agreement WinWaitActive ( '', 'License Agreement' ) Send ( '{ENTER}' ) // îêíî ñ âûáîðîì ìåñòà óñòàíîâêè WinWaitActive ( '', 'Choose Install Location' ) Send ( '{ENTER}' ) // çàâåðøåíèå óñòàíîâêè WinWaitActive ( '', 'Click Finish to close' ) Send ( '{ENTER}' ) // âûâåäåì îêîøêî ñ ñîîáùåíèåì $__msgbox = MsgBox ( 0, 'AutoIt', 'Setup done' ) // çàâåðøåíèå Exit
Как видно по тексту, никаких существенных изменений новый синтаксис не несет. Скрипт после конвертации был помещен в файл setup_autoit3.au3, расширение у которого имеет стандартное для версии 3 значение. Но программа делает все то же самое. Если преобразовать ее в исполняемый код с помощью имеющегося в версии 3 компилятора, то после удаления AutiIt v3 из системы его можно снова установить с помощью новой программы. Это и будет проверкой работоспособности. Совершенно таким же способом можно создать средства автоматической установки практически любого программного обеспечения вне зависимости от особенностей использованного разработчиками установщика. Конечно же, в реальной работе можно сразу начать создание скрипта в среде AutoIt версии 3, и тогда для определения строк, по которым происходит детектирование нужных окон, надо будет воспользоваться «перехватчиком» окон из версии 3, который называется «AutoIt v3 Active Window Info». Но в остальном последовательность действий будет точно такой же: запускаются приложения, определяются названия окон или тексты внутри них, записываются клавиатурные нажатия (например, клавиша ALT как активатор меню) и все это переводится в скрипты AutoIt. Полученные скрипты, преобразованные в исполняемые файлы, можно разместить в соответствующих дистрибутивных директориях под красноречивыми названиями auto_setup.exe. И в практической деятельности установку очередного 1С клиента можно свести к запуску только одной программы. Более того, можно даже поделиться почетной обязанностью установить 1С с тем бухгалтером, которому это нужно. Чего же проще – кликнуть один раз! Но точно так же, как не вся работа системного администратора сводится лишь к установке прикладного программного обеспечения, так и возможности AutoIt не ограничиваются лишь обслуживанием программ типа setup.exe. Но об этом в следующей части.
15
администрирование
ЧУДО-ЮДО RESOURCE KIT
АЛЕКСАНДР ШИБЕНКО В многолетнем споре между приверженцами Linux1 и сторонниками Windows первые в качестве одного из аргументов часто утверждают, что большинство задач по управлению производимыми компанией Microsoft ОС невозможно выполнить без графического интерфейса, и администратор фактически становится его заложником. Что ж, доля истины в этом есть, но целиком согласиться с ним можно, только если забыть (или не знать) о том, что в дополнение к операционным системам «парни из Редмонда» уже давно выпускают Resource Kit2, включающие комплект отпечатанной документации и набор утилит. 1
2 3
16
Что же такое Windows 2000 Resource Kit? Это семь томов документации и установочный CD. После инсталляции пакета, а она необходима, если нужна его полная функциональность3, на жестком диске появляется занимающий почти 60 Мб каталог C:\Program Files\Resource Kit. Он содержит электронные версии вышеупомянутых семи книг и еще четырех справочников, руководство и документацию по утилитам, а также сами утилиты общим числом около трехсот. Выражаясь языком Хрюна Моржова: «Внушает»... Описывать здесь каждую утилиту в отдельности не имеет смысла. Имеющаяся документация достаточно подроб-
Именно Linux, т.к. по наблюдениям знатоки AIX, HP-UX, Solaris и других *nix-подобных систем редко тратят время на участие в подобных дебатах. Правда, за отдельную плату и с определенными лицензионными ограничениями. Многие утилиты нормально работают и без инсталляции.
администрирование на, кроме синтаксиса, хорошо структурирована, содержит еще и примеры. В зависимости от решаемых задач утилиты в ней разделены на следующие основные группы: ! Утилиты управления компьютером (computer management tools). Сюда входят инструменты для работы с реестром, для управления сервисами и процессами и для обработки журналов событий. ! Утилиты для развервертывания системы (deployment tools). Типичный представитель утилит этой группы – небезызвестная sysprep.exe. ! Диагностические средства (diagnostic tools). Это несколько утилит по отображению информации о распределении так называемой «кучи»4, snmp-монитор, компилятор MIB и ряд других. ! Утилиты для работы с файлами и дисками (file and disk tools). Основные представители этой группы – разнообразные средства для копирования. ! Инструментарий для Internet Information Service (IIS tools). Здесь можно найти сканер безопасности, стресс-тест для веб-сервера и предопределенные шаблоны безопасности для его конфигурирования. ! Утилиты управления сетью (network monitor tools). Большая часть утилит этой группы позволяет из командной строки управлять пользователями и группами и выполнять другие администраторские задачи на локальном и удаленном компьютерах. ! Утилиты оценки производительности (performance tools). Их назначение понятно и без комментариев. Кроме этих, достаточно представительных групп, существует еще несколько, объединяющих всего по нескольку утилит: ! утилиты отладки (debugging tools); ! утилиты рабочего стола (desktop tools); ! утилиты для Internet Explorer (IE tools); ! инструментарий для сценариев (scripting tools); ! утилиты безопасности (security tools). Многие утилиты позволяют получать информацию или выполнять какие-либо действия не только на локальном компьютере, но и при наличии соответствующих прав, на удаленном. Так, c помощью команды вида: netsvc /list \\REMOTESERVER
можно получить список запущенных сервисов на компьютере REMOTESERVER, а команда: shutdown
\\REMOTESERVER /r
его перезагрузит. Даже этой информации достаточно для того, чтобы понять, какие возможности открываются перед системными администраторами и каким мощным потенциалом обладают эти средства. Усилия, затраченные на их освоение, с лихвой окупятся за счет так любимой и ценимой юниксоидами автоматизации многих рутинных задач. Правда, для полноценной обработки информации крайне 4
желательно, а может, даже и необходимо использовать дополнительный инструментарий вроде Excel или Access. В завершение приведем примеры из реальной практики. Наверняка во многих организациях руководство спрашивает у системного администратора, кто из пользователей на каких принтерах и в каких количествах распечатывает документы. Для решения воспользуемся входящей в группу диагностических средств утилитой dumpel, позволяющей обрабатывать журналы событий: dumpel -f pr.txt -l system -m print -e 10
В данном случае из системного журнала (ключ -l system) выбираются события «печать» (ключ -m print) с кодом, соответствующим постановке задания в очередь печати (ключ -e 10) и помещаются в текстовый файл pr.txt. Каждая строка файла соответствует одному заданию. Как видно, здесь присутствует и имя пользователя, и название принтера, и количество напечатанных страниц (последнее число в строке). Наиболее простым способом получения требуемого отчета мне представляется написание макроса в Excel. Приводить его здесь, пожалуй, не стоит. Для умеющего программировать человека сделать это не составит большого труда, а новичку подобную задачу вполне можно рекомендовать в качестве имеющего прикладное значение практикума. И еще один пример. Однажды возникла необходимость после перезагрузки компьютера копировать на него с сервера некий каталог, в свою очередь, содержащий подкаталоги и файлы. Но необходимо было получить «зеркальную копию» серверного каталога за исключением пустых подкаталогов. Для этого был написан следующий командный файл, который вызывался штатным планировщиком задач по событию «загрузка системы» от имени администратора: @echo off sleep 60 now.exe > c:\log\copy.log net use m: \\server\backup /user:oper 123 if errorlevel 1 echo net use error >> c:\log\copy.log ↵ robocopy.exe m:\daily\ d:\archive\ /log:c:\log\rc.log /np /mir /s if errorlevel 1 echo robocopy error >> c:\log\copy.log
Утилиты now.exe, sleep.exe и robocopy.exe входят в состав Resource Kit. Now.exe выдает в стандартный вывод текущую дату и время. Sleep.exe нужна для того, чтобы подключить каталог сервера после того, как запустятся все необходимые службы и сервисы. Иначе команда net use может просто не выполниться. Ну а требуемую величину задержки можно подобрать опытным путем. И наконец, зеркальное копирование (ключ /mir) с помощью robocopy.exe содержимого каталога m:\daily\ в d:\archive\. При этом если d:\archive\ содержит каталоги и файлы, не имеющие аналогов в m:\daily\, они будут удалены. Ключ /s запрещает копировать пустые каталоги, а /np подавляет вывод на экран информации о ходе копирования. Ключ /log:c:\log\rc.log, надеюсь, понятен без комментариев. На самом деле robocopy.exe обладает широкими возможностями, включая копирование разрешений NTFS, что может оказаться весьма полезным.
Куча – пул оперативной памяти, из которого программы ее запрашивают под динамические переменные.
¹4, àïðåëü 2005
17
администрирование
ALT-N MDAEMON – ПОЧТОВАЯ СИСТЕМА ДЛЯ СРЕДНИХ И КРУПНЫХ КОМПАНИЙ РОМАН МАРКОВ Alt-N MDaemon – почтовый сервер корпоративного уровня для ОС семейства Windows. Уже с первых версий данный продукт пользовался заслуженной популярностью среди администраторов Windows-систем, благодаря чему постоянно совершенствовался и дополнялся новыми возможностями. На сегодняшний день MDaemon – это SMTP/POP/IMAP сервер с полным набором возможностей: защита от спама, безопасный доступ к почте через веб-интерфейс при помощи обычного браузера, удаленное администрирование, а также при установленном MDaemon AntiVirus защита вашей системы от почтовых вирусов. MDaemon AntiVirus был разработан Alt-N совместно с Kaspersky Labs для обеспечения хорошего уровня встроенной защиты для пользователей MDaemon. Он перехватывает, подвергает карантину, исправляет и/или удаляет любое сообщение, в котором найден вирус. Большой набор гибких правил для Content Filter позволяет производить дополнительный анализ, сортировку и обработку писем. Например, явное запрещение вложений в виде исполняемых файлов позволяет максимально защититься от новых вирусов, сигнатуры которых еще не включены в антивирусную базу. К сожалению, антивирусные продукты других производителей не анонсированы на официальном сайте Alt-N, что является минусом для администраторов, предпочитающих другие решения. Однако «прикрутить» к Mdaemon другой антивирус все же можно, используя нетривиальные подходы. Например, правила сортировки с запуском сторонней программы при поступлении письма, а также запуск программы при наличии сообщений в очереди. Помимо этого можно использовать online-сканирование папок, в которых сохраняются временные файлы при получении письма, а также папок пользователей. Причина отсутствия штатной интеграции с другими антивирусами автору данной статьи, к сожалению, неизвестна. Помимо этого с MDaemon интегрируются следующие продукты от Alt-N: ! LDaemon – LDAPv3-сервер (Lightweight Directory Access Protocol). С LDaemon ваши адресные книги путешествуют вместе с вами. LDaemon скачивается отдельно и предлагается пользователям MDaemon бесплатно. ! MDaemon GroupWare – вместе с MDaemon Pro раскрывает функции групповой работы Microsoft Outlook, используя MDaemon в качестве серверной платформы. Пользователи Outlook могут совместно использовать папки Календаря, Задач, Контактов, Заметок и Дневника без применения Microsoft Exchange Server.
18
! RelayFax – факс-сервер с возможностями OCR и поддержкой TWAIN. Входящие и исходящие факсы маршрутизируются в соответствии с гибкими правилами и могут включать различные критерии, такие как OCR, Caller-ID или факс-аппарат.
Системные требования и первоначальная установка MDaemon не слишком требователен к ресурсам при минимальной нагрузке, однако при ее возрастании (увеличение количества учетных записей, многочисленные правила сортировки, большой поток писем) эти требования резко меняются. Прежде всего необходимо обеспечить достаточно большой объем оперативной памяти. Именно ее может не хватить при большой нагрузке на почтовый сервер. Производитель (www.altn.com) указывает следующие минимальные требования к оборудованию: ! Pentium III 500 МГц и выше. ! 512 Мб RAM (рекомендуется 1 Гб). ! Свободное место на диске для установки – 30 Мб + дополнительное место под хранение писем, а также logфайлов. ! Microsoft Windows 95 OSR2/98/ME/XP/NT/2000/2003. ! Winsock 2 (для старых версий ОС). ! Internet Explorer 4.0 и выше. К сожалению, на сайте производителя не указывается, для какой нагрузки необходимы именно такие требования. Поэтому ниже приведены проверенные автором на практике данные о необходимых ресурсах. Многолетний опыт использования почтового сервера MDaemon (начиная с версии 3.xx и до сегодняшней – 7.xx) показал, что он идеально подходит для организаций любого масштаба – от малого бизнеса до крупной компании. Поэтому использование этого продукта даже для сети из 5-10 компьютеров оправдано: гибкая система сортировки практически по любым условиям и в зависимости от этих условий – выполнение разнообразных действий (например, при наличии в письме вложения с «запароленным» архивом – отсечь вложение, отправить автоответ, запустить указанную программу, и изменив тему письма, доставить пользователю), наличие веб-интерфейса и другие описанные выше возможности помогают сделать любую почтовую систему безопасной и удобной. Причем минимальные системные требования, указанные производителем, являются несколько завышенными применительно к объему оперативной памяти.
администрирование Автор статьи использует в качестве почтового сервера на базе MDaemon 7.xx компьютер с объемом оперативной памяти 256 Мб. При этом в системе функционирует около 200 почтовых ящиков, встроенный антивирус, веб-интерфейс, а также довольно много правил сортировки. Правда, одновременное использование всех возможностей, дополнительных модулей, а также дальнейший рост количества пользователей как раз и увеличит этот лимит до 512 Мб. Для установки почтового сервера рекомендуется использовать ОС семейства Windows NT (Windows NT/2000/ XP/2003), так как MDaemon, как и любое серверное приложение, лучше устанавливать в качестве системной службы. Дистрибутив скачиваем с официального сайта: http:// www.altn.com/download. В этой статье описывается установка и настройка английской версии MDaemon. Существует локализованная сторонней компанией русская версия (www.MDaemon.ru), однако чаще всего системные администраторы не доверяют «нефирменным» локализациям, предпочитая оригинальные версии от производителя продукта. Если система будет масштабной и критичной к сбоям, выбираем качественный и надежный носитель, например, RAID-1 из SCSI-дисков. В окне «Registration Information» вводим имя приобретенной лицензии и имя компании, а также регистрационный ключ. Продукт имеет 30-дневный trial-период, в течение которого его можно протестировать бесплатно. После окончания срока работы пробной версии необходимо будет активировать продукт. Сразу после установки запустится мастер, при помощи которого можно ввести первоначальную информацию о почтовой системе. В первом окне «What is your domain name» введите имя своего домена (то, что находится справа от символа @, не включая сам символ). Например, тестовый домен: lagman.spb.ru. Здесь же можно кликнуть по ссылке и воспользоваться услугами бесплатного сервиса по регистрации доменов «dns4you». Однако такой способ хорош только для тестового режима. Для создания корпоративной почтовой системы рекомендуется зарегистрировать доменное имя, воспользовавшись услугами провайдеров. В следующем окне «Please Setup your first account» необходимо ввести первую учетную запись нашей почтовой системы, которой автоматически будут делегированы полные права по конфигурированию домена, а также сопоставлен alias «Postmaster» как обязательный согласно требованиям RFC. Вводим имя, предпочитаемый вами login (без символа @ и имени домена – они будут автоматически добавлены при создании), а также пароль. Помните, что пароль этой учетной записи должен быть сложным. Убедимся, что флажок «This account is an administrator – full configuration access is granted» установлен и перейдем на следующую страницу мастера. В окне «Please Setup Your DNS» вводим адреса DNS-серверов, предоставленных нам провайдером подключения к сети Интернет, либо других доступных DNS-серверов. Флажок «Use Windows DNS-settings» снимаем – такие настройки лучше прописывать явно. В следующем окне мастера выбираем режим, в котором будет запускаться сервер – Easy или Advanced. Отличия данных режимов описаны на сайте производителя в раз-
¹4, àïðåëü 2005
деле Features. Мы выбираем полный функционал – Run MDaemon in «Advanced Mode». В следующем окне будет предложено установить MDaemon в качестве системной службы. Устанавливаем флажок «Setup MDaemon as a system service». Оставляем флажок «Start MDaemon» в последнем окне мастера и выбираем «Finish». Сервер должен запуститься. Если по каким-либо причинам этого не произошло при первоначальной установке, выберите из меню «Пуск → MDaemon» ярлык «Start MDaemon». Если вы используете не тестовую, а полноценную версию программы, прежде всего необходимо активировать ваш программный продукт. Делается это в меню «Help → Activate your software». Запустится мастер активации. Вам будет предложено активировать автоматически через интернет или вручную, введя код активации. На этом установка завершена, и сервер готов к настройке.
Начальная настройка почтового сервера Настройка почтового сервера начинается с конфигурирования системных параметров. Не будем расписывать все опции каждого меню конфигурирования – это тема отдельного справочника. К тому же встроенная справочная система подробно и полностью описывает назначение каждой настройки (на английском языке). Опишем только те опции, которые необходимо изменить либо проверить их значение. Для настройки в качестве примера можно использовать приведенные скриншоты. Меню «Setup → Miscellaneous Options». На закладке GUI задаем параметры запуска сервера MDaemon. Тут все индивидуально и зависит от личных предпочтений. Скажем лишь, что полезно установить опцию «Start MDaemon…» в «In the system tray» и «Create Sessions…» в «In a hidden window». Первая при старте сворачивает MDaemon в системный трей, а вторая задает запуск активных сессий (отправка и получение почты) в скрытом окне, которое не будет мешать при просмотре логов и настроек. Параметр «Max number of log lines…» задает количество строк, которое будет отображаться в окнах протоколирования сессий перед их затиранием. Обращаем внимание на то, что эти параметры влияют только на количество отображаемых на экране строк – размер лог-файлов задается в другом меню. Раздел «Composite log windows contains» позволяет включить/отключить отображение требуемых окон протоколирования. То есть если мы не используем LDAP и IMAP – можно смело отключить вывод этих окон (рис. 1). На закладе Servers оставляем почти все, как есть. В поле «POP/IMAP server always accept connections from IP» устанавливаем адрес локальной петли 127.0.0.1 или IP-адрес нашего сервера. Подключения с этого адреса будут возможны всегда, независимо от параметров защиты MDaemon. Если ваш сервер предоставляет POP3 доступ для клиентов с тонкими и нестабильными интернет-каналами, полезно установить флажок «POP DELE command immediately removes messages from mailbox». Тогда уже полученные клиентами сообщения будут удаляться немедленно и при обрыве связи получение продолжится с первого еще не доставленного сообщения (в обычном режиме полученные сообщения удаляются только после завершения сессии POP3, и при обрыве связи доставка начинается с начала,
19
администрирование дублируя уже полученные письма и создавая лишний трафик). При необходимости можно установить лимит на объем отсылаемых/получаемых по протоколу SMTP писем. Для этого предназначены опции Data Transfer Limits. Крайне рекомендуется установить значение Max acceptable SMTP message size отличным от 0. В противном случае неопытные пользователи будут беспрепятственно отсылать письма любой величины (частый пример – огромные фотографии или видеоролики). Приемлемое значение – от 2500 до 10000 Кб. Не рекомендуется устанавливать значение менее 2500 Кб, так как стандартный размер дискеты 1.44 Мб при пересылке достигает примерного объема 2,2 Мб. Более 10 Мб также устанавливать не стоит – приучайте пользователей разбивать файлы на части. Даже если ваш почтовый сервер отправит такое сообщение – не всякий почтовый сервер его примет. В итоге сообщение вернется к вам, создав никому не нужный входящий трафик. Если передающий клиент поддерживает команду ESMTP SIZE, то соединение будет разорвано сразу. В противном случае MDaemon начнет прием сообщения, и после завершения соединения отвергнет его доставку адресату. Опция «Kill the connection if data transmission exceeds» позволяет задать суммарный объем данных на сессию, при превышении которого данное соединение будет разорвано (рис. 2).
солютно все почтовые адреса почтового сервера. Данные списки позволяют организовывать корпоративную рассылку для всех сотрудников, что является очень удобным способом оповещения работников предприятия. При соблюдении политики сложных паролей и прочих параметров безопасности можно быть уверенным, что спаммеры не воспользуются данным списком, так как по умолчанию отправить письмо для списка рассылки может только администратор почтовой системы либо пользователь, которому администратором явно делегировано такое право.
Ðèñóíîê 2
Ðèñóíîê 3
Ðèñóíîê 1
На следующем скриншоте видно, что сеанс был завершен принимающим сервером сразу после того, как обнаружилось несоответствие размера принимаемого письма и заданного на сервере ограничения (рис. 3). Следующие закладки до «Misc» пропускаем – для нашей настройки они пока не нужны. На закладке «Misc» проверяем и устанавливаем флажки «Create ‘Everyone Lists’», «Create ‘MasterEveryone’ Lists». В предыдущих версиях MDaemon данные опции были включены по умолчанию. Они создают списки рассылки. Everyone@<domain> включает в себя все почтовые адреса конкретного почтового домена (почтовых доменов может быть несколько), а MasterEveryone@<domain> – аб-
20
Флажок «Require strong passwords» предписывает использовать только сложные пароли (не менее 6 символов, включающие в себя буквы и цифры в разных регистрах, а также не содержащие частей названия ящика) к ящикам для предотвращения возможности несанкционированного доступа. Если вы будете предоставлять доступ к почтовому серверу извне – крайне рекомендуем использовать именно такие пароли, причем увеличить их длину до 8 символов. Минимальная длина пароля задается в файле MDaemon.ini (MDaemon\Apps) → Секция [Special] → MinPassword Length=XX. Пароли для всех протоколов едины и задаются в свойствах каждой учетной записи (либо, если используется сквозная аутентификация в домене NT/AD, берутся из соответствующей БД). Флаг «Periodically check for new MDaemon updates» разрешает серверу MDaemon самостоятельно проверять наличие обновлений на сайте производителя. В случае появления новой версии значок в трее будет мигать (рис. 4).
администрирование вание старых файлов, возраст которых превысил количество дней, задаваемое в поле «Automatically ZIP and archive log file older than ….. days». При этом следует помнить, что данная опция действует, только если на предыдущей закладке выбрана опция «Create a standard set of log files». На закладке Options отмечаем те службы, протокол работы которых необходимо записывать в log-файлы. Также устанавливаем флажки «Always log to screen» и «Log session in real time». Первая опция устанавливает одновременный вывод протоколов, записываемых в log-файлы на экран, а вторая – разрешает этот вывод в режиме реального времени, а не постфактум после осуществления операции. Это полезно при анализе и устранении возможных ошибок.
Ðèñóíîê 4
Теперь настроим размер и расположение log-файлов. По непонятной причине (ошибка разработчиков или сомнительная задумка) независимо от пути установки MDaemon создает на диске C: папку MDaemon и в ней подпапку Logs, куда и записывается часть log-файлов. Сразу исправим эту ошибку: остановим сервис MDaemon, откроем файл \Apps\ MDaemon.ini и заменим значение переменной LogFiles в секции [Directories] на путь установки MDaemon. После этого перенесем все файлы из папки C:\MDaemon\Logs в папку установки, удалим с диска C: уже ненужный каталог и снова запустим службу. Затем в окне «Setup → Logging» настроим необходимые нам параметры. На закладке «Log Mode» необходимо выбрать вид имен log-файлов (стандартные или основанные на дате/дне недели). Для общего комплексного анализа рекомендуется выставить «Create a standard set of log files». Если необходимо осуществлять поиск записей по дням – лучше воспользоваться набором log-файлов с именами, основанными на днях недели или дате. То же самое с опциями «Log detailed mailsessions» (записывать подробный протокол сессий) и «Log summarized mail sessions» (записывать краткий протокол сессий). Если необходимо будет анализировать возможные проблемы с отправкой/приемом писем по протоколу SMTP – лучше записывать подробный протокол. Это может понадобиться при рассмотрении жалоб пользователей, связанных с функционированием системы доставки почты. Если logфайл служит только для краткого анализа успеха/неудачи (например, анализ системой подсчета трафика) – лучше выбирать краткий формат файлов. Разумеется, что подробное протоколирование требует гораздо большего дискового пространства. Опция «Log each service into separate log file» позволяет разделять протоколы различных служб MDaemon по отдельным файлам, что, несомненно, удобнее при поиске необходимой информации. Опции закладки «Maintenance» позволяют задать максимальный размер log-файлов, а также настроить архивиро-
¹4, àïðåëü 2005
Ðèñóíîê 5
Настройка доменной почтовой системы Определимя со способом доставки почты. MDaemon – полнофункциональный почтовый сервер и имеет различные механизмы для получения почты, которые при необходимости могут использоваться одновременно. Первый способ – настройка MX-записи с наивысшим приоритетом в DNS-записях вашего домена на внешний IP-адрес сервера MDaemon. Помните, что такой способ требует от вас внимательной настройки безопасности почтового сервера. В противном случае вы рискуете предоставить спамерам открытый relay, что неизбежно повлечет за собой жалобы вашему провайдеру, а также создаст большой паразитный трафик. Замечание. Если почтовый сервер, на который установлен MDaemon, находится внутри локальной сети и выходит в Интернет, используя технологию NAT, необходимо организовать проброс портов (Port-Map) с 25-го порта внешнего интерфейса сети на внутренний интерфейс почтового сервера. Также не забудьте прописать шлюз по умолчанию и DNSсервера в свойствах TCP/IP-соединения по локальной сети. Второй способ – это создание провайдером доменного почтового ящика, в который будут доставляться абсолют-
21
администрирование но все письма, посланные на ваш почтовый домен (или домены, если их несколько). MDaemon будет получать письма с этого ящика по протоколу POP3, сортировать и складывать в папки существующих пользователей. В этом случае при расположении сервера MDaemon на интернет-шлюзе компании не забудьте о принудительном запрете входящих подключений к порту TCP/25 внешнего интерфейса для предотвращения попыток несанкционированной рассылки с использованием вашего сервера. В некоторых случаях порт TCP/25 требуется открыть, например, если вы разрешите использовать ваш сервер в качестве SMTP-сервера для обладателей ящика на нем. В этом случае необходимо очень тщательно спланировать безопасность, например, включив обязательную авторизацию SMTP-сессий и задав всем учетным записям сложные пароли. Mdaemon поддерживает шифрованные протоколы аутентификации, а также STARTTLS, STLS для SMTP, POP3, IMAP-сессий. Помимо этого имеется возможность шифровать сессии веб-доступа к почтовым ящикам. Настройку можно произвести в меню Security – SSL/TLS/Certificates. В обоих случаях мы получаем полную независимость от провайдера (кроме содержания DNS-записи, если, конечно, вы не делаете это своими средствами) и возможность управления своими почтовыми ящиками внутри нашей сети, мгновенно активизируя внесенные изменения. Поддерживается и третий способ получения почты – ETRN. Он объединяет в себе преимущества первого метода и безопасность второго и заключается в том, что провайдер собирает всю адресованную вам почту в одну очередь, которую и перенаправляет на ваш IP-адрес по протоколу SMTP, когда ваш хост доступен, либо по сигналу от вашего сервера на разбор очереди. В этом случае мы должны будем разрешить входящие подключения на порт TCP/25 только для Relay-сервера провайдера. Устанавливаем расписание обмена почтой: «Setup → Event Scheduling». Для постоянной доставки почты через определенный интервал времени устанавливаем флажок «Deliver/collect remote mail at this interval» и передвигаем указатель интервала на необходимое нам время. Также устанавливаем флаг «Deliver remote mail immediately upon reception» для того, чтобы полученные письма сразу доставлялись пользователю. Если вам необходимо создать другое, более гибкое расписание, то в вашем распоряжении все средства для этого. Снимаем флаг: «Deliver/collect remote mail at this interval» и вручную настраиваем любое расписание. Если вы используете Dial-Up, то здесь же можно настроить параметры подключения и отключения (RAS setup). Помните, что если почтовый сервер будет получать письма напрямую от отправителей по протоколу SMTP, то письма начнут доставляться сразу после создания домена, поэтому если вы переводите на MDaemon уже существующую внешнюю систему, сначала необходимо завести учетные записи пользователей (почтовые ящики), а только затем производить открытие порта TCP/25 на вход. Однако это спорное решение, т.к. в данном случае отправителям будут возвращены все письма, которые были посланы ими в момент перевода MX-записи домена на ваш IP-адрес. Если же сначала открыть порт TCP/25, а затем заводить пользователей, то в зависимости от настройки условий доставки
22
писем для неопознанных адресатов, такие сообщения будут либо приняты и направлены пользователю Postmaster, либо – так же, как и в предыдущем случае – возвращены отправителю. Как выход, при грамотном планировании перевода почтовой системы от провайдера к себе можно настроить MX-запись с более высоким приоритетом на свой IP-адрес уже после полной настройки почтового сервера. В случае перевода на MDaemon системы с получением почты по протоколу POP3 с единого ящика, перед настройкой параметров в DomainPOP (см. далее) необходимо создать все необходимые ящики. Произведем настройку нашего почтового домена (Primary Domain). Меню «Setup → Primary Domain». На закладке «Domain» уже указаны настройки, которые мы ввели во время установки почтового сервера. При необходимости их можно изменить. Если используется прямое получение почтовым сервером почты по протоколу SMTP (MX-запись соответствует нашему внешнему IP-адресу), то в поле «Primary Domain IP» указываем именно этот IP-адрес. В противном случае можно указать либо внутренний IP, либо адрес локальной петли 127.0.0.1. На закладке «Delivery» указывается способ отправки писем нашим почтовым сервером во внешний мир: ! «Always send every outbound email to the server specified below» – всегда отправлять исходящие сообщения на сервер, указанный в поле «Mail server». В поле «Mail server» указывается SMTP-сервер вашего провайдера. ! «Try direct delivery but send problem emails to the server specified below» – пытаться отправить напрямую, а в случае неудачи – через хост, указанный в поле «Mail Server». ! «Always send all outbound email directly to the recipient’s mail server» – всегда отправлять почту только напрямую получателям. Закладка Ports позволяет изменить стандартные привязки служб MDaemon к портам. В случае если вы поменяли какое-либо значение, для вступления изменений в силу необходимо нажать «Bind to new port values now». В противном случае изменения вступят в силу только после перезагрузки службы MDaemon. В закладке «DNS» находятся данные об используемых почтовым сервером DNS-серверах, указанные нами еще на этапе установки. При необходимости их можно сменить. Помимо этого можно настроить параметры опроса MX- и A-записей, согласно которым будут производиться действия над письмами в случае получения сообщений об ошибках. В частности, установка флага «Use ‘A’ record IP addresses found within MX record packets» разрешает серверу MDaemon при отсутствии MX-записи для домена попытаться доставить сообщения по IP-адресу, возвращенному A-записью получателя. Более подробно о протоколе SMTP можно прочитать в RFC1891 (для хорошего понимания принципов обмена по почтовым протоколам настойчиво рекомендуется это сделать). Установка флага «Immediately return mail when DNS says domain does not exists» позволит сразу же возвращать отправителю письмо, если DNS-запрос имени домена возвратил результат «Домен не существует». Это предотвратит постановку такого письма в очередь системы повтора, что, в общем-то, является в данном случае бесполезным (исклю-
администрирование чения составляют некорректные переносы зон их держателями, однако это редкое исключение из правил). Раздел «Timers» предоставляет возможность изменить величины тайм-аутов на различные события при соединении. На закладке «Sessions» рекомендуется настроить предельное количество одновременных сессий различных типов. При медленной исходящей скорости канала рекомендуется установить величину «Maximum concurrent SMTP outbound sessions» значением не более 2-4. В любом случае даже при наличии быстрого канала не стоит злоупотреблять этим параметром. Приемлемая величина этой переменной для быстрых каналов (512 kbit/s и более) – 10-20. Параметр «Maximum concurrent SMTP inbound sessions» влияет на максимальное количество одновременно входящих сессий по протоколу SMTP. В случае превышения заданной величины клиенты получат сообщение «Server too busy». Закладка «Unknown mail» позволяет указать на действие, которое необходимо производить с письмами, адресат которых не опознан. Подразумевается, что доменный адрес в доставленном письме соответствует обслуживаемым доменам MDaemon, однако такого пользователя в системе не существует. Имеется возможность возвращать письмо отправителю с комментарием «No such user», а также отправлять копию такого письма администратору почтового сервера (копия отправляется как вложение). Возврат письма отправителю возможен только при получении почты по протоколу SMTP. На закладке «Pruning» задаются образцы доменных квот. Здесь рекомендуется задать значения, отличные от 0, так как в противном случае редко проверяемые ящики, на которые приходит большое количество писем, будут занимать много места на диске. Это же замечание относится к ящикам пользователей, которые бездумно устанавливают в свойствах почтового клиента опцию «Оставлять письма на сервере», не указывая максимальный срок их хранения. Разумные сроки удаления неактивных учетных записей и устаревших писем для каждой организации свои. Просто рекомендуем не забывать про наличие этого раздела. Письма в Mdaemon хранятся для каждого ящика отдельно, в папке Users. Каждое письмо представляет собой отдельный файл с расширением *.msg. Раздел «Archival» позволяет отправлять копию абсолютно всех входящих и исходящих писем указанным пользователям (адреса разделяются запятой), а также архивировать их в общую IMAP-папку, доступ к которой по умолчанию имеет только Postmaster. Данная опция применяется для контроля службой безопасности любой проходящей через ваш почтовый сервер информации. «Dequeue» – данная закладка служит для настройки получения почты от провайдера по ETRN. Укажите здесь адрес, по которому ваш сервер должен посылать сигнал о начале сеанса доставки вам почты по протоколу SMTP со стороны провайдера. Если у нас несколько почтовых доменов, то необходимо их сконфигурировать. Заходим в Setup – Secondary Domains, указываем имя для вторичного домена, в поле Ip Address указываем IP адрес для этого домена. Если подключение к вторичному почтовому домену будет осуществляться с использованием IP адреса, не совпадающего с IP адресом первичного домена, необходимо указать Bind sockets to this IP
¹4, àïðåëü 2005
only. При этом создаваемые нами учетные записи пользователей уникальны и принадлежат только конкретному домену. То есть при создании новой учетной записи через Account Manager в системе с несколькими доменами нам необходимо ввести его Login, а также указать, к какому домену он принадлежит, выбрав из выпадающего списка требуемый. При импорте пользователей из базы NT/AD необходимо выбрать, в какой домен будут внесены записи. Если необходимо, чтобы один пользователь получал почту с разных доменов, необходимо создать соответствующие алиасы. Если почтовый сервер будет забирать почту у провайдера по протоколу POP3 c доменного почтового ящика, то последним шагом первоначальной настройки MDaemon будет указание свойств этого ящика (их может быть несколько). Меню «Setup → DomainPOP». На закладке Account устанавливаем переключатель «Enable DomainPOP mail collection engine» и вводим адрес POP3-сервера, имя и пароль для доступа. Если ящиков, с которых будет доставляться почта, несколько (например, при наличии нескольких почтовых доменов), то можно задать параметры остальных ящиков, нажав «Extra hosts» и отредактировав текстовый конфигурационный файл по указанному в нем же шаблону. После принятия изменений MDaemon будет собирать почту с указанных ящиков согласно расписанию, созданному нами в меню «Event Scheduling». Можно задать дополнительные параметры, например, оставлять письма на сервере – «Leave a copy of message on host server», не скачивать (и при необходимости удалять прямо с сервера) письма, размер которых больше, чем указанная величина, – «Don’t download messages larger than [XX] KB (0 = no limit)». При медленном входящем канале полезно установить опцию «Download messages according to size (small messages first)». В этом случае сообщения будут скачиваться согласно их размеру – меньшие по размеру в первую очередь. Это позволит большому количеству малых по размеру сообщений быть полученными быстрее, не заставляя многих получателей страдать из-за одного пользователя, которому было послано многомегабайтное письмо. На закладке «Foreign mail» обязательно установите опцию «Do not deliver mail addressed to non-local addresses». При парсинге полученных сообщений в поле TO: могут попадаться другие, нелокальные для вас адреса. Данная опция запретит пересылать такие письма указанным адресатам. Она наиболее безопасна с точки зрения защиты от несанкционированной рассылки с использованием вашего почтового сервера.
Заведение учетных записей пользователей Управление учетными записями производится при помощи меню Accounts. MDaemon поддерживает импорт учетных записей пользователей из домена NT/Active Directory и сквозную аутентификацию пользователей. Для этого выбираем из меню Accounts – Importing опцию «Import accounts from the NT SAM database». Если имя домена NT/AD не совпадает с созданным нами, то в открывшемся окне указываем домен, из которого будет производиться импорт, а также имя сервера, если оно не было найдено автоматически, и нажимаем кнопку Refresh. Если учетные записи для импорта не появились (либо появились далеко не все – например, только
23
администрирование учетные записи администраторов домена), то скорее всего учетная запись, от имени которой запущена служба MDaemon не имеет привилегии «SE_TCB_NAME» в указанном домене. Для выхода из этой ситуации необходимо создать в домене учетную запись с минимальными правами доступа, единственной задачей которой будет получение доступа на чтение базы учетных записей домена. Затем в свойствах службы MDaemon необходимо настроить ее запуск с этими учетными данными и перезапустить службу (эту настройку можно произвести в меню «Setup → System Service»). После этого перезапускаем процедуру импорта, выделяем требуемые учетные записи, указываем способ задания паролей для создаваемых пользователей почтового сервера, и подтверждаем выбор кнопкой «Import Selected Account». Не стоит устанавливать опцию «Set account passwords equal to account names», так как это выходит за рамки любых требований безопасности. Лучше всего установить сквозную аутентификацию в домене (не забыв при этом усилить политику безопасности паролей в домене), либо вручную задать единый сложный пароль и затем вручную генерировать и изменять пароли для каждой учетной записи. По умолчанию пользователи могут изменять свои пароли двумя способами – через веб-интерфейс и при помощи специально сформированного письма на адрес Mdaemon@domain содержащего в поле письма адрес электронной почты и пароль (однако пароли, которые проверяются через сквозную аутентификацию NT/AD, изменить таким образом не удастся). Если данные аутентификации совпадают, то тело письма интерпретируется сервером как последовательность инструкций. Более подробно о них можно узнать из встроенной системы помощи. Из соображений безопасности рекомендуется сменить стандартные шаблоны прав пользователей, по умолчанию запретив им изменение собственных настроек – особенно возможность самостоятельной смены пароля, адресов пересылки и автоответчика (меню «Accounts → Account Manager → New Account Default»). В любом случае при правильной политике паролей сменить данные настройки возможно, только зная пароль учетной записи. Кстати, из соображений безопасности тема таких писем не записывается в файлы и окна протоколирования (рис. 6). Дальнейшее управление учетными записями пользователей, а также заведение пользователей, не используя импорт из домена, производится через меню Accounts, используя консоль Account Manager, а также другие функции данного меню. Рассмотрим свойства отдельной учетной записи, прокомментировав назначение некоторых параметров в различных закладках. «Account» – кроме понятных всем стандартных параметров имеется кнопка «Aliases», нажав на которую можно задать для учетной записи так называемые «Алиасы» (дополнительные почтовые адреса, почта для которых также будет доставляться данному пользователю). То есть для указания множества почтовых адресов, письма с которых должны адресоваться одному пользователю, достаточно создать для него алиас. Например, после создания алиаса vasya@domain.com для пользователя user2@domain.ru все полученные письма, в поле адресата которых будет встречаться адрес vasya@domain.com, будут доставляться в ящик пользователя user2@domain.ru.
24
Ðèñóíîê 6
«Forwarding» – позволяет отсылать копии письма на указанные (через запятую) адреса. Установив флаг «Retain a local copy of forwarded mail», копия письма будет оставаться в ящике пользователя. «Admin» – здесь можно делегировать пользователю права глобального администратора (имеющего полный доступ к администрированию почтового сервера), либо только администратора домена, который обладает только правами по конфигурированию данного домена, используя WebAdmin (описывается в разделе «Настройка веб-доступа»). «Quota» – здесь настраиваются персональные квоты пользователей. Если опция квотирования включена, то при превышении заданного количества сообщений или объема, занимаемого письмами, последующие письма для такого пользователя будут отвергаться с сообщением «User over quota». В отличие от квот домена по умолчанию, которые первоначально применяются на все ящики, данная опция перекрывает общие настройки, задавая персональные квоты. Таким образом можно выделять привилегированных или наоборот, более ограниченных пользователей. Последним действием при запуске системы в действие является проверка запуска минимально необходимых сервисов MDaemon – POP3, SMTP, Antivirus, DomainPOP. Это делается в левой части основного окна программы. Если нужный нам сервис имеет статус «Inactive», дважды кликните по нему и проконтролируйте, что статус изменился на «Active». В следующем номере читайте продолжение статьи про более тонкую первоначальную настройку MDaemon.
администрирование
KASPERSKY ANTI-SPAM 2.0 + SENDMAIL
ДЕНИС ГОРОДЕЦКИЙ Ответив на простой вопрос: «Сколько ненужных писем было удалено из почтового ящика?», вы легко можете рассчитать, какие объемы занимает трафик, создаваемый ненужной почтой. Спамеры забрасывают нас рекламой в таком количестве, что при чистке своего ящика удалить «полезное письмо» можно, даже не заметив его среди мусора. Способов борьбы с этими преступниками довольно много. Рассматривать все сразу в одной статье смысла особого не имеет, разве что в виде краткого обзора. Предлагаю остановиться на рассмотрении следующей схемы: Kaspersky Anti-Spam (KAS) + Sendmail. Первое, что мне поручили, когда я пришел на новое место работы, – это борьба со спамом. Читая документацию и разбираясь в конфигурации, был приятно удивлен тем, что разработчики данного продукта на славу потрудились, до того как представить его для повсеместного использования. Итак, что такое KAS 2.0 и каковы принципы его работы. Как и большинство ныне действующих фильтров, KAS фильтрует почтовое сообщение в процессе приема, т.е до того как письмо попадет в почтовый ящик пользователя. KAS обрабатывает сообщение и, руководствуясь правилами и действиями, установленными администратором, может: ! доставлять получателю в неизменном виде; ! блокировать получение; ! генерировать сообщение о невозможности приема письма; ! добавлять или изменять заголовок.
¹4, àïðåëü 2005
Все правила и профили уже предустановлены, на этом мы остановимся чуть позже, но подробно описывать каждое из них мы не будем, т.к. эта тема отдельной статьи. Вы можете сами понять, что необходимо, а что вы не будете использовать, после того как ответите на несколько вопросов: какая информация нужна, а какая нет, критично ли потерять «полезное письмо», можно ли пропустить несколько «ненужных» писем и т. п. Что нужно, чтобы KAS смог работать: ! Операционная система Linux или FreeBSD 4.х, 5.х (тестирование проходило на Red Hat 9.0). ! Процессор Intel Pentium III с частотой не менее 500 МГц. ! Оперативная память не менее 256 Mб. ! Наличие установленных программ wget, bzip2. ! Наличие одной из почтовых систем: Sendmail, Postfix, Exim, Qmail, Communigate Pro. Замечание. Перед установкой я всегда рекомендую делать резервные копии тех конфигурационных файлов, которые будут затронуты, в данном случае это файлы с настройками вашего почтового агента. Внедрение продукта не требует особенных знаний и навыков, т.к. все делается при помощи входящих в пакет инсталляторов, начиная от установки программ из состава KAS и заканчивая интеграцией в почтовую систему. # rpm -i <èìÿ ïàêåòà>
25
администрирование подразумевает: ! создание пользователя и группы mailflt; ! установку всех программ, входящих в состав KAS, создание и установку скрипта запуска всех сервисов, который выполняется при перезапуске операционной системы; ! запуск необходимых программ и сервисов; ! создание записи в crontab пользователя mailflt для автоматического запуска скрипта загрузки обновлений базы контентной фильтрации.
В каталоге CONFSRC имеются следующие подкаталоги:
! CONFSRC/profiles – каталог, содержащий файлы с описаниями профилей;
! CONFSRC/emails – каталог, включающий файлы со списками адресов e-mail;
! CONFSRC/iplists – каталог файлов со списками IP-адресов;
! CONFSRC/dnsblacklists – каталог файлов со списками служб DNSbasedRBL;
! CONFSRC/samples – каталог, содержащий файлы с образцами спамерских писем.
Затем командой: # /usr/local/ap-mailfilter/bin/install-key ↵ <èìÿ_êëþ÷åâîãî_ôàéëà>
устанавливаем лицензионный ключ. Перед началом работы необходимо создать список лицензированных почтовых адресов, для которых почта будет проверяться на наличие спама. Интеграция в почтовую программу происходит тоже достаточно легко и безболезненно. Запускаете: # /usr/local/ap-mailfilter/bin/MTA-config.pl
Это универсальный скрипт, который определит тип почтового агента и изменит его конфигурацию. Также для каждой почтовой системы существуют конкретные программы настройки. Особых отличий я не нашел, и в том случае, если ваш МТА настроен нестандартно, все равно нужно будет указать правильное размещение файлов конфигурации МТА. Для Sendmail скрипт-интегратор запускается командой: #/usr/local/ap-mailfilter/bin/sendmail-config.pl
Для интеграции kas-milter с Sendmail в конфигурационном файле /etc/sendmail.cf прописывается: Xfilter1, S=local:/usr/local/ap-mailfilter/run/ ↵ kasmilter.sock, F=R O InputMailFilters=kasfi
Подробное описание настройки фильтров в sendmail.cf приведено в документации по Sendmail На этом будем считать процесс установки законченным и перейдем к конфигурированию. Конфигурационные файлы Kaspersky Anti-Spam находятся в каталоге /usr/local/ap-mailfilter/conf/src (далее . CONFSRC) и его подкаталогах. Непосредственно в CONFSRC находятся файлы с фиксированными именами: ! profiles.xml – список профилей фильтрации; ! emails.xml – набор списков e-mail-адресов; ! iplists.xml – набор списков IP-адресов; ! dnsblacklists.xml – набор списков служб DNS-based RBL; ! samples.xml – список пользовательских образцов спамерских писем; ! settings.xml – файл дополнительных настроек фильтра.
26
Собственно говоря, разработчиками было сделано многое, чтобы упростить жизнь администратора, и все конфигурационные файлы после инсталляции, мной, были оставлены без изменения за исключением blacklist_ip.xml (о нем мы поговорим позже) и kas-thhtpd.conf (в данном файле определены настройки для доступа к конфигурации через вебинтерфейс). Здесь была изменена всего одна строка. # document root dir=/usr/local/ap-mailfilter/www user=mailflt port=2880 host=0.0.0.0 # ïî óìîë÷àíèþ çíà÷èòñÿ 127.0.0.1, # ÷òî îçíà÷àåò äîñòóï ê êîíôèãóðàöèè # ÷åðåç âåá òîëüêî ñ ëîêàëüíîãî õîñòà pidfile=/usr/local/ap-mailfilter/run/kas-thttpd.pid
Конфигурирование через веб предоставляет удобный, интуитивно понятный интерфейс. В нем есть свои плюсы и минусы. Данный инструмент позволит человеку, заменяющему системного администратора, быстро и с минимальными усилиями управлять настройками фильтра, даже если он ни разу не работал с UNIX-подобными системами. Однако самому же администратору для понимания принципов функционирования системы я бы рекомендовал изменять конфигурационные файлы используя редакторы, входящие в состав ОС. Действия с письмами, определенными как спам, могут быть как самыми жесткими (отказ принять сообщение), так и достаточно мягкими (например, приписать сообщению дополнительный заголовок-«ярлык» для последующей обработки в почтовой программе пользователя). Применение различных действий к спаму – прерогатива администратора почтового сервиса. Скажу лишь одно, в состав KAS входит несколько предустановленных профилей с определенными наборами правил и действий по этим правилам. Для тех, кто не хочет, и даже для тех, кто хочет изобретать велосипед, того, что есть, хватит с лихвой. Существующие общие профили различаются «строгостью» оценки признаков спама (профили Soft признают спамом меньше писем, а профили Hard, больше писем) , использованием или не использованием проверок по RBL (а также на наличие имени посылающего сервера в DNS). Оставив общим профилем тот, который был по умолчанию, проблем с распознаванием спама я не обнаружил. За месяц после изменения настроек антиспамного фильтра фильтр отследил порядка 25000 спам писем (и это всего на 10 лицензированных пользователей) при этом произошло всего лишь одно ложное срабатывание.
администрирование Сделать активным профиль можно редактируя файл:
...
# /usr/local/ap-mailfilter/conf/src/profiles.xml <?xml version="1.0" encoding="koi8-r"?> <Profiles> <Common> <ProfileRef active="no" file="detect-standard.xml" name="Spam Detection Standard"/> <ProfileRef active="yes" ↵ file="detect-standard-no-rbl.xml" ↵ name="Spam Detection Standard (no RBL &amp; DNS check)"/> <ProfileRef active="no" file="detect-soft.xml" ↵ name="Spam Detection Soft"/> <ProfileRef active="no" file="detect-soft-no-rbl.xml" name="Spam Detection Soft (no RBL &amp; ↵ DNS check)"/> <ProfileRef active="no" file="detect-hard.xml" ↵ name="Spam Detection Hard"/> <ProfileRef active="no" file="detect-hard-no-rbl.xml" name="Spam Detection Hard (no RBL &amp; ↵ DNS check)"/> <ProfileRef active="yes" file="syslog.xml" ↵ name="Logging"/> </Common> <Personal> <ProfileRef active="yes" file="rcpt-root.xml" ↵ name="root: No Filtering"/> <ProfileRef active="no" file="do-mark-subject.xml" name="Marking Spam - Subject"/> <ProfileRef active="no" file="do-mark-keywords.xml" name="Marking Spam - Keywords"/> <ProfileRef active="yes" file="do-archive.xml" ↵ name="Archiving Spam"/> <ProfileRef active="no" ↵ file="do-archive-or-reject.xml" ↵ name="Archiving/Rejecting Spam"/> </Personal> </Profiles>
</Profile> ↵
↵
↵
¹4, àïðåëü 2005
<?xml version="1.0" encoding="koi8-r"?> <IPList description="This list contains ip-addresses of spam senders relays. Must be filled up by user." name="Spam Senders' Relays"> <IP mask="0.0.0.0"/> <IP mask="212.185.0.0/16"/> <IP mask="66.112.0.0/17"/> <IP mask="62.84.0.0/16"/>
<IP mask="141.156.192.0/18/> <IP mask="24.239.0.0/16/> </IPList>
↵ ↵
Как мы видим, из персональных профилей активирован тот, который пересылает спамные письма в выделенный почтовый ящик (пока это сделано в целях получения статистической информации, в дальнейшем планируется применить «Archiving/Rejecting Spam»). В примере конфигурационного файла активного персонального профиля приводим лишь ту часть, которая претерпела изменения.
<Rule> <Conditions> <HeaderMatch header="X-SpamTest-Status" ↵ regexp="SPAM" /> </Conditions> <Actions> # íåîáõîäèìî çàìåíèòü àäðåñ íà ðåàëüíî ñóùåñòâóþùèé <DoRcptReplaceAll new="spam@domain.ru" /> <!-- Must be changed to a real address --> <DoAccept /> </Actions>
Теперь пришло время остановиться на файле blacklist_ ip.xml. Выглядит он примерно вот так:
... ↵
На выходе данного этапа в письмо добавляются следующие специальные заголовки: ! X-SpamTest-Categories – заголовок, содержащий информацию о том, какие контентные категории были присвоены письму по результатам фильтрации. ! X-SpamTest-Status – заголовок, указывающий на окончательный статус письма по результатам всех проверок: SPAM, Probable Spam, Trusted или Not detected. Данный заголовок используется при последующей обработке письма персональными профилями. Он может также использоваться для обработки письма почтовым клиентом получателя.
...
</Rule>
Значение атрибута mask может быть указано в двух форматах: aaa.bbb.ccc.ddd/nn или aaa.bbb.ccc.ddd (равнозначно aaa.bbb.ccc.ddd/32). Поддерживая его в актуальном состоянии, вы можете быть уверенными, что 95% тех писем, которые нам не желательно получать, будут распознаваться, и дальнейшая их судьба будет определена в соответствии с вашими пожеланиями. В итоге, приложив немного усилий, поэкспериментировав с профилями и правилами, получаем эффективный антиспамный фильтр. По сравнению с решением на основе SpamAssasin понравились следующие удобные особенности KAS: ! простая установка и интеграция в почтовую систему; ! легкая и гибкая конфигурация; ! возможность применять персональные профили к отдельным пользователям или группам; ! отсутствие балловой оценки (хотя кому-то это покажется не плюсом, а минусом, поскольку не позволит проводить тонких граней в оценке письма); ! меньшая загрузка системы. Единственное чего, как мне кажется, не хватает – отсутствие возможности самобучения распознавания спама, которое позволило бы администратору более гибко использовать фильтрацию. Фильтр, конечно, позволяет добавлять образцы спамерских писем в базу, кроме того, он ее сам регулярно обновляет, но поскольку спамеры постоянно самосовершенствуются, то и стиль написания меняется, и как следствие, некоторые письма все равно просачиваются и обычно это не одно, а сразу несколько одинаковых писем. Вот поэтому считаю необходимым добавить следущее свойство – фильтр отслеживает повторяющиеся письма и при достижении определенного количества самостоятельно добавляет их в базу. Так же дело обстоит и с IP-адресами сервера отправителя, поскольку хакерами ежедневно взламывается несколько новых, через которые идет рассылка, и они не успевают попадать в black-листы и обновления. Особую благодарность хочу выразить Таранову Александру, ведущему инженеру ЗАО «Телепорт-ТП», за содействие и интеллектуальную поддержку при написании статьи.
27
администрирование
СИСТЕМА ВЕЩАНИЯ НА ОСНОВЕ WINDOWS MEDIA SERVICES 9
МИХАИЛ ПЛАТОВ Вы когда-нибудь слушали интернет-радио? Смотрели любимые телепередачи через спутник или Интернет? Или, быть может, работали с системой видеонаблюдения через сеть? Если ответ на любой из этих вопросов положительный, можете смело причислять себя к пользователям систем вещания! Впрочем, даже если вышеприведенные вещи вам не знакомы, не расстраиваетесь, потому что после прочтения этой статьи вы не только узнаете, что это такое и как оно работает, но и получите представление о том, что происходит «по ту сторону кулис», а именно – о создании систем вещания. Предметом нашего изучения будет один из наиболее популярных продуктов организации систем медиавещания – Microsoft Windows Media Services 9.
Теоретическое отступление А каким оно вообще бывает, это «вещание»? Человек, который работал с системами вещания на уровне пользователя, скажет «аудио и видео», люди, которые общались с
28
ними с другой стороны, скорее всего, приведут иную классификацию – по способу доставки медиаданных: ! системы с одноадресным вещанием (unicast); ! системы с многоадресным вещанием (broadcast, multicast). Для того чтобы понять, в чем заключаются плюсы и минусы каждого из способов, давайте более пристально посмотрим на процесс передачи данных. В случае одноадресного вещания данные передаются в рамках установленного TCP-соединения. Соответственно для каждого клиента, подключающегося к нашему серверу, будет создан собственный «канал», по которому клиент получит запрашиваемую информацию. На первый взгляд никаких подводных камней здесь нет, ведь этот же принцип лежит в основе большинства служб Интернета, однако с увеличением количества одновременно обслуживаемых клиентов начинает проявляться проблема, казавшаяся ранее несуще-
администрирование ственной. Давайте рассмотрим простой пример: пусть у нас есть один аудиопоток с битрейтом 64 Кбит, который необходимо доставлять 100 клиентам одновременно. Для решения этой задачи с использованием режима unicast нам потребуется канал с пропускной способностью 6,4 Мбит1! Во втором подходе данная проблема отсутствует, так как при использовании многоадресного вещания сервер передает данные либо сразу на всю подсеть (режим broadcast), либо на определенную группу многоадресной рассылки (multicast group, адрес сети класса D стандарта 802.3 Ethernet). Соответственно в нашем примере для передачи потока 64 Кбит от сервера требуется возможность обеспечить канал именно в 64 Кбит, независимо от количества подключенных в данный момент клиентов (0 или 10000). Минусом же является то, что сетевая инфраструктура, используемая для передачи вещаемых данных, должна быть соответствующим образом сконфигурирована для передачи multicast – трафика2. Как правило, это легко достижимо в корпоративных сетях и с трудом реализуемо в масштабах современного Интернета (представьте себе dial-up-пользователя, который вынужден принимать multicast-поток от радиостанции провайдера при каждом соединении). Поэтому исторически сложилась следующая ситуация: ! multicast используется в корпоративных сетях, при организации «вещания» для большого количества клиентов, получающих один и тот же неинтерактивный контент (интернет-радио, IP-телевидение, видеоконференции с большим числом «зрителей»); ! unicast же используется при передаче в Интернете, а также для организации дополнительных сервисов, персонифицированных с конкретным абонентом (Video on Demand, Time Shift, и другие сервисы, при которых клиент может «управлять» передаваемым ему потоком). А как же обстоит дело с реальными продуктами? Если рассматривать системы коммерческого видеовещания, то безусловными лидерами здесь являются компании Microsoft c продуктом Windows Media Services 9 (вещание в формате wma и wmv) и Real Media с системой вещания Helix Server (в самой функциональной редакции поддерживает вещание в 55 различных форматах). Оба решения поддерживают вещание как аудио, так и видеоданных, нацелены на один сектор рынка и архитектурно очень похожи. Из «открытых» решений хотелось бы упомянуть о проекте VideoLAN [1], первоначально ориентированном на организации вещания спутниковых DVB-каналов в локальную сеть. На данный момент поддерживается гораздо большее число видов источников, все широкоиспользуемые форматы видеоданных (MPEG1, MPEG2, MPEG4, divx) и большинство распространенных кодеков. Для поклонников Macintosh и формата QuickTime существует продукт QuickTime Streaming Server 5 (входит в состав Mac OS X Server) и его «открытый» брат Darwin Streaming Server (доступный в том числе и для x86), позволяющие рас1 2
3
пространять медиаданные в форматах MPEG4 и 3GPP (однако, по моим субъективным впечатлениям, функциональность Darwin Streaming Server сильно уступает ближайшим конкурентам от Microsoft и Real Networks). Среди систем аудиовещания хотелось бы упомянуть NullSoft ShoutCast (продукт, созданный авторами Winamp) и Open Source-проекты iceCast [2] и SlimServer [3], описание настройки которой можно найти в [4]. На этом позвольте закончить теоретическое отступление и перейти к описанию нашего сегодняшнего героя – Windows Media Services 9.
Так вот он какой, серверный олень! Windows Media Services (WMS) – это программный продукт, разработанный и распространяемый корпорацией Microsoft как средство для организации вещания аудио- и видеоинформации в локальных сетях, Интернете и беспроводных сетях. Данный продукт представляет собой набор компонентов, работающих под управлением различных версий операционных систем семейства Windows. Помимо средств, позволяющих быстро и просто организовывать различные виды вещания аудио- и видеоинформации, в состав WMS также входят компоненты, обеспечивающие тесную интеграцию с Active Directory и IIS, средства оценки и контроля производительности сервера, а также инструменты сбора статистики об общей работе служб. Серверная часть WMS является частью ОС Windows 2000 Server и Windows Server 20033. Клиентская же часть доступна практически для всех ОС от Microsoft (от Windows 9х до Windows Mobile 2005. Кроме того, поддержка видео в формате Windows Media присутствует в двух наиболее популярных проигрывателях для Linux – xine [5] и mplayer [6]. Спектр применения Windows Media Services достаточно широк. На их основе может быть организована как небольшая интернет-радиостанция с небольшим (менее ста) количеством обслуживаемых одновременно пользователей, так и крупный медиапортал в Интернет, ежедневно обслуживающий десятки тысяч посетителей. Секрет этой гибкости кроется в структуре самой системы:
Ðèñóíîê 1
В случае видеовещания требуемая пропускная способность потребуется еще больше. Для передачи в нескольких сетях требуется настройка маршрутизаторов. Если же локальная сеть построена на неуправляемых свитчах и хабах (без маршрутизаторов), то и настраивать ничего не придется. Кроме Windows Server 2003 Web Edition.
¹4, àïðåëü 2005
29
администрирование Итак, в состав Windows Media Services входят следующие основные компоненты: ! Сервер Windows Media. Этот компонент по праву можно считать «сердцем» системы WMS. Именно он занимается организацией самого процесса вещания и отвечает за «раздачу» медиапотоков конечным пользователям. В качестве источника этих потоков могут выступать .wma-, .wmv- и .mp3-файлы (расположенные либо локально на самом сервере, либо на файл-сервере, доступном по протоколу SMB), а также потоки, получаемые с других серверов или непосредственно с кодировщика Windows Media. Ядро сервера реализовано в виде набора DCOM-компонентов и системных служб, для управления которыми используется стандартный для продуктов Microsoft инструмент – консоль MMC (Microsoft Management Console). ! Кодировщик Windows Media. Задачей этого компонента является приведение информации к форме, пригодной для передачи сервером Windows Media, или, проще говоря, перекодирование входных данных (будь то аудиоили видеофайлы, сигнал с TV-тюнера или веб-камеры) в потоковый формат .wma или .wmv. Кодировщик распространяется свободно и может быть загружен с сайта Microsoft. В состав этого продукта входят две программы: Windows Media Encoder с графическим интерфейсом и консольный скрипт WMCmd.vbs на языке Visual Basic Scripting. Кроме того, с сайта Microsoft также можно загрузить пакет разработчика (SDK), содержащий все необходимое для разработки собственных приложений, использующих интерфейсы кодировщика Windows Media. Таким образом, можно добавить возможности кодирования в уже существующие приложения. ! Проигрыватель Windows Media. Задача этого компонента в системе вещания достаточно очевидна – декодирование и воспроизведение потока информации, получаемого с сервера Windows Media. В качестве отличительных особенностей этого проигрывателя можно отметить поддержку защиты авторских прав (DRM) и потоковых кодеков Windows Media. ! Веб-сервер. Играет вспомогательную функцию и используется для размещения информации об имеющихся на медиасервере потоках. В отличие от предыдущих компонентов в качестве веб-сервера может использоваться практически любой веб-сервер. Теперь, после того как мы получили общее представление о системе, самое время перейти непосредственно к ее настройке.
Тяжело в учении – легко в бою! Однако прежде давайте определимся, что же мы все-таки хотим получить. Будем считать, что у нас есть маленькая корпоративная сеть, пользователям которой мы хотим предоставить следующие сервисы: 4 5
6
30
! круглосуточное вещание музыки (локальный аналог интернет-радио);
! multicast-вещание4 в сеть телевизионного канала с TVтюнера;
! multicast-вещание в сеть картинки с веб-камер, расположенных в интересующих нас местах5; ! доступ к обширному видеоархиву «важных производственных мероприятий»6. Кроме того, будем считать, что у нас есть «толстый» канал в Интернет и нам не жалко отдавать наружу одновременно несколько потоков музыки и пару потоков с «избранной» веб-камеры, общим объемом не более 500 Кбит/сек. При реализации будем руководствоваться общей структурной схемой Windows Media Services (см. выше). Заметим, что для каждого «внешнего» устройства (TV-тюнера или веб-камеры) нам, скорее всего, понадобится отдельная машина. Аудиофайлы для радиостанции и файлы видеоархива будем хранить либо на самом медиасервере, либо на удаленном общем ресурсе (хоть бы и на самбе, включенной в Windows-домен). Также нам понадобится веб-сервер, в качестве которого мы для простоты будем использовать IIS6.0, установленный на компьютере с медиасервером (хотя все то же самое будет великолепно работать практически на любом Linux веб-сервере, включенном в Windows-домен согласно способу, описанному в [7]). С постановкой задачи мы определились, и теперь можно плавно перейти к ее реализации.
Настройка сервера Windows Media Сервер Windows Media Services поставляется вместе с операционной системой. Для его установки необходимо воспользоваться мастером установки и удаления компонентов системы: «Start → Control Panel → Add/Remove Programs/ Add/Remove Windows components». Выберем пункт «Windows Media Services», нажмем на «Details» и выберем компоненты «Windows Media Services» и «Windows Media Services Snap-in». При нажатии кнопки «Next» выбранные компоненты будут установлены на компьютер. После завершения процесса установки в списке оснасток появится новая запись – «Windows Media Services», с помощью которой мы и будем управлять нашим сервером (рис. 2). Проблем у нас пока нет, кэшировать мы тоже пока ничего не будем, поэтому прямиком направляемся в раздел «Publishing Points». В оснастке WMS точки распространения можно создать двумя способами: с помощью «мастера» и с помощью более функционального «диалогового окна». Интерфейс «мастера» вполне понятен и разобраться с ним самостоятельно не составит большого труда, а вот на содержимом «диалогового окна» хотелось бы остановится поподробнее (рис. 3). Первым делом мы определяем тип точки распространения: В WMS их может быть 2:
Для поддержки multicast-вещания нам понадобится Enterprise или Datacenter редакция ОС Windows Server 2003. Например, «очередь к окошку кассы в период зарплаты», хроники событий в местном буфете или просто «панорама города» или автостоянка перед офисом. Для простоты будем считать, что у нас есть набор AVI-файлов, выбор их содержимого пусть будет за вами.
администрирование ! Точки для «загрузки по требованию». Представляют собой инструмент для организации централизованных хранилищ медиаданных. Преимуществами таких хранилищ являются централизованный доступ к размещаемым медиаресурсам 7, возможность создания динамических play-листов с навигацией (остановка, пауза, переход к следующему файлу и т. д.) между ними8, легкая интеграция с различными веб-приложениями, возможность контроля доступа к каждому ресурсу и т. д. Работа с такими точками распространения сильно персонифицирована, поэтому для передачи данных может использоваться только режим unicast. В нашем примере мы будем использовать on-demand точки распространения для создания маленькой корпоративной видеотеки; ! Точки для «вещания». При использовании точек распространения этого типа возможна организация потокового аудио- и видеовещания (без возможностей остановки, пауз, перемотки и т. д.). В качестве способа доставки видеоданных может использоваться как unicast, так и multicast. Именно этот тип точек распространения будет основным при реализации описанных выше задач.
ранения (режим push)9. Выбор того или иного режима определяется характером кодируемых данных. Так, если кодировщик работает постоянно (24/7), то имеет смысл использовать более легкий в настройке режим pull. Если же кодируемые данные носят периодический характер (несколько часов в день), то лучше использовать режим push. В нашем случае можно использовать режим pull для ретрансляции TV-канала, и режим push для веб-камер.
Затем мы определяем источник медиаданных. В качестве источников могут использоваться: ! отдельный медиафайл; ! папка с файлами; ! play-лист; ! cgi-скрипт, возвращающий play-лист; ! кодировщик Windows Media Encoder; ! другая точка распространения (unicast или multicast). Ðèñóíîê 3
Ðèñóíîê 2
При использовании в качестве источника кодировщика возможны два способа получения данных: либо сервер WMS самостоятельно «забирает» поток (режим pull), либо активной стороной выступает кодировщик, помещающий поток на сервер и создающий соответствующую точку распрост7 8 9
Итак, создадим on-demand точку распространения с названием «library», источником которой будет являться папка «c:\library», содержащая архивные видеозаписи в формате wmv (рис. 4). Теперь создадим анонс для точки вещания. Для этого перейдем в раздел «Properties» и в закладке «General» включим опцию «Enable access to directory content using wildcards». После этого перейдем на закладку «Announce» и нажмем на кнопку «Run Unicast Announcement Wizard». В качестве источников файлов выберем «All files in the directory», путь подключения оставим без изменений, для местоположения .asx-файла укажем одну из папок, доступную для веб-сервера. На завершающем шаге мастера убедимся, что флажок «Test files when this wizard finished» отмечен, и нажмем «Finish» (рис. 5). Если все было сделано правильно, то после нажатия на кнопку «Test» запустится Media Player, воспроизводящий play-лист, состоящий из всех файлов, находящихся в данной папке. Перейдем к следующему номеру нашей программы – настройке вещания телевизионного канала с TV-тюнера.
При этом сами ресурсы физически могут находиться на различных компьютерах. Например, тематическая инструкция, разбитая на главы с возможностью перехода между ними. Вообще говоря, в оснастке WMS мы не можем создать работающую push-точку вещания (это может сделать только кодировщик). Все, что мы можем сделать – шаблон, который будет использован кодировщиком при создании точки на сервере.
¹4, àïðåëü 2005
31
администрирование Для выполнения этого этапа нам понадобится машина10 с TV-тюнером. В моем случае это был AverMedia Model 203 с драйверами от Ивана Ускова [8].
вое» вещание с TV-тюнера, так что выберем наиболее подходящий нам шаблон «Broadcast a live event».
Ðèñóíîê 6
Ðèñóíîê 4
С помощью соответствующих кнопок «Configure» настраиваем параметры TV-тюнера11 и звуковой карты. Нажимаем «Next» и переходим к следующему окну. Здесь мы выбираем режим доставки закодированного потока до сервера (pull или push). Выберем pull с портом 2187 и перейдем к следующему шагу – настройке кодеков. Из списка предопределенных шаблонов выберем Live broadcast video и CD Quality Audio для видео и звукового потока соответственно. Разрешение и битрейт оставим по умолчанию – 320x240 и 323 Кбит. Для всех остальных шагов оставим стандартные значения. После завершения мастера кодирования мы увидим следующее сообщение:
Ðèñóíîê 7 Ðèñóíîê 5
Первым делом нам нужно установить кодировщик Windows Media Encoder 9. Для этого идем на сайт http:// www.microsoft.com, вводим в поле поиска «Windows Media Encoder 9 download» и неспешно загружаем 10-мегабайтный исполняемый файл. После установки и запуска соответствующего ярлыка нас поприветствует очередной мастер настройки. Мы собираемся настраивать более чем «жи10
11
32
Вообще говоря, для того чтобы «вещать», не обязательно использовать сервер Windows Media. Можно настроить кодировщик на работу в режиме pull и подключать к нему клиентов напрямую. Однако в этом случае о таких вещах как «отслеживание обращений»,«ограничение пропускной способности», «аутентификация с Active Directory», «поддержка multicast» и других возможностях сервера придется забыть. Единственное, что будет нам доступно – возможность запрета/разрешения доступа к потоку кодировщика
И хотя технически возможно размещение сервера вещания и кодировщика на одной машине, делать этого не рекомендуется. Дело в том, что процесс real-time кодирования является достаточно ресурсоемким (так, при реализации описанного ниже примера средняя загрузка процессора Celeron 2.0GHz составляла 50%), что может создать проблемы для других приложений, работающих на машине с кодировщиком. При настройке TV-тюнера удобно использовать следующий прием. Предварительно, перед запуском кодировщика, с помощью идущей в комплекте с тюнером программы определяем номер нужного канала и его цветовое представление (PAL или SECAM). Полученные цифры вводим в свойствах драйвера после нажатии кнопки «Configure».
администрирование для конкретных IP-адресов через диалог «Broadcast security» из меню «Tools». Причем даже в нашем случае не лишним будет разрешить доступ к кодировщику только со стороны сервера Windows Media. Итак, после успешного завершения мастера перед нами предстанет картинка с TV-тюнера:
казываться картинка с TV-тюнера. Также можно протестировать веб-страницу (рис. 10).
Ðèñóíîê 9
Ðèñóíîê 8
Далее нажмем на кнопку «Start Encoding» и перейдем к настройке сервера. На сервере нам нужно создать broadcast точку распространения с источником Encoder (Pull). В поле «Location of content» нужно ввести имя машины, на которой работает кодировщик в формате: http://ip_адрес:номер_ порта. Точка вещания создана, и теперь нужно отредактировать некоторые ее свойства. Для этого перейдем на закладку «Properties». В первую очередь нам нужно включить «WMS Multicast Data Writer» из раздела «Multicast Streaming» (там же указать адрес multicast группы и сетевой интерфейс, с которого будет производиться рассылка). При необходимости для данной точки распространения в разделе «Limits» можно задать ограничения на количество одновременно работающих клиентов и отводимой им пропускной способности. Наигравшись вдоволь с настройками, перейдем к следующему шагу – созданию анонса для multicast точки распространения. Для этого перейдем на уже знакомую нам закладку «Announce» и нажмем на кнопку «Run Multicast Announcement Wizard». На первом шаге мастера отметим пункт «Automaticaly create a web page», затем в окне «Stream Formats» добавим источник-кодировщик, точно так же, как и при создании точки распространения (рис. 9). В диалоге «Save Multicast Announcement Files» выберем место сохранения файлов (внутри webroot веб-сервера) и перейдем к следующему шагу – диалогу выбора способа доступа к точке вещания. В нашем варианте мы будем обращаться к файлам через веб-сервер, поэтому выберем первый вариант, дополнительно удостоверившись, что имя сервера совпадает с тем, по которому будут обращаться пользователи. Для остальных вопросов используем стандартные ответы, в заключительном окне отметим пункты, отвечающие за активацию точки распространения и ее тестирование. Если все было сделано правильно, то, как и в первом случае, при нажатии кнопки «Test» напротив «Test announcement» запустится Media Player, в котором будет по-
¹4, àïðåëü 2005
Ðèñóíîê 10
В следующей статье мы продолжим изучение Windows Media Services 9 и подробно рассмотрим следующие моменты: настройка параметров авторизации и аутентификации клиентов, использование push-режима для кодировщика, unicast rollover, архивирование передаваемых данных, а также посмотрим, как можно использовать программные интерфейсы Windows Media Encoder 9 в собственных приложениях.
Литература, ссылки: 1. 2. 3. 4.
5. 6. 7. 8.
http://videolan.org. http://www.icecast.org. http://www.slimdevices.com/su_downloads.html. Яремчук С. Лейся песня или сервер потокового аудио своими руками. – Журнал «Системный администратор», №11, ноябрь 2004 г. – 28-31 с. http://xinehq.de/index.php/features. http://mplayerplug-in.sourceforge.net. Гребенников Р. Танцуем Самбу. – Журнал «Системный администратор», №11, ноябрь 2004 г. – 32-38 c. http://www.iulabs.com/download/848wdm_iu.zip.
33
администрирование
APACHE КАК ПРОКСИ-СЕРВЕР
ВАЛЕНТИН СИНИЦЫН Рассмотрим типичную для небольшой организации конструкцию – шлюз в Интернет, работающий под управлением UNIX или Microsoft Windows, прокси-сервер, веб-сервер сети Интранет, почтовый сервер и т. д. Оказывается, число ее элементов можно несколько сократить, и в соответствии с золотым правилом инженера увеличить тем самым общую надежность системы. Сегодня мы поговорим о делегировании Apache основных функций кэширующего прокси-сервера (например, Squid) и даже кое-чего сверх них. В качестве базовой ОС будем использовать Linux, хотя многое из сказанного ниже может быть без ограничения общности применено и для других платформ. Согласен, использование Apache в качестве прокси-сервера выглядит несколько нестандартно, однако, оно имеет ряд преимуществ. Это, в первую очередь, возможность динамического сжатия документов, отправляемых клиентам, что может вылиться в серьезную экономию, если для передачи данных используется арендованный канал с помегабайтной оплатой входящего трафика (допустим, офисов у фирмы два, а сервер всего один). Кроме того, оно сокращает число сервисов, работающих в системе, а значит, у потенциального злоумышленника будет меньше мишеней для проведения атаки, а у администратора в свою очередь меньше объектов, требующих неусыпного наблюдения и поддержки. Впрочем, как и все в нашем неидеальном мире, Apache в роли прокси-сервера имеет и некоторые недостатки, как то: содержит экспериментальные или написанные сторонними разработчиками модули (при желании можно обойтись и без них) и неизвестным образом ведет себя при увеличении нагрузки (вполне допускаю, что все будет прекрасно работать, однако, специализированного стресс-тестирования не проводил). Какая чаша перевесит – решать вам. Руководствуясь личным опытом, я вполне могу рекомендовать применение прокси-сервера на базе Apache в небольших сетях. Покончив с теоретическими вопросами, перейдем к техническим деталям. Для реализации задуманного нам понадобится Apache версии 2.0.53 и выше1 с включенными mod_proxy, mod_cache и mod_deflate. В отличие от специализированных решений вроде упомянутого выше Squid, прокси-сервер на базе Apache имеет модульную архитектуру, все мыслимые и немыслимые функции которой пост1
34
роены по принципу: общая база + провайдеры. Мы не раз убедимся в этом по ходу изложения. Итак, приступим к первой фазе.
Запуск прокси-сервера Для того чтобы Apache мог принимать и обрабатывать прокси-запросы, необходимо загрузить модуль mod_proxy, входящий в стандартный комплект поставки и прекрасно документированный. Здесь и далее в этой статье мы не будем дублировать страницы руководства, останавливаясь лишь на нетривиальных моментах. Mod_proxy, как и большая часть других упомянутых в статье модулей, обычно не собирается в стандартной конфигурации Apache, поэтому вам, вероятно, придется заново скомпилировать сервер, указав соответствующие параметры сценарию configure. За поддержку mod_proxy отвечает опция «--enable-proxy», прочие же параметры я буду приводить в тексте в скобках после имени соответствующего модуля. В соответствии с представленной выше формулой, mod_ proxy образует фундамент, на котором работает система поддержки прокси-запросов. Их реализации, специфичные для различных протоколов, вынесены в отдельные модули: mod_proxy_http (--enable-proxy-http), mod_proxy_ftp (--enableproxy-ftp) и mod_proxy_connect (--enable-proxy-connect). Последний из них необходим для работы с запросами HTTP CONNECT, в частности, защищенными SSL-соединениями. Прежде чем говорить о настройке mod_proxy, сделаем пару замечаний. Первое – Apache поддерживает два типа прокси-серверов: прямые (forwarding proxy) и обратные (reverse proxy). Нас будут интересовать исключительно прямые прокси-сервера, т.е. промежуточные сервисы, передающие запросы от нашего локального клиента к удаленному (чужому) серверу. Обратные прокси действуют с точностью до наоборот, т.е. передают запросы от удаленного (чужого) клиента локальному веб-серверу и применяются в основном для балансировки нагрузки. Второе – прокси-запрос не является для Apache чем-то чужеродным. Заглянув в исходные тексты сервера, вы обнаружите, что все клиентские запросы, независимо от того, кому они адресованы, описываются одной и той же структурой. Apache помечает запросы, предназначенные другим серверам, специальным флагом, но не более того. Из этого, к примеру, следует, что
Более ранние версии имеют ошибки в mod_cache, препятствующие нормальной работе с кэшированными документами.
администрирование в параметрах модуля mod_proxy отсутствует директива для указания порта, который следует использовать для приема входящих соединений2. Apache способен принимать и обрабатывать прокси-запросы на любом порту, который разрешен к «прослушиванию» директивой Listen. Впрочем, на практике зачастую оказывается удобнее провести границу между локальными и переадресуемыми запросами. Для достижения этой цели можно создать специальный виртуальный хост, например, на порту 3128, пользуясь директивой VirtualHost. Подробности ищите в документации к Apache. Дальнейшее изложение неявно предполагает, что вы уже настроили виртуальный хост и размещаете предлагаемые директивы внутри принадлежащей ему секции httpd.conf (Подсказка для самых нетерпеливых: в конце статьи приведен завершенный фрагмент конфигурационного файла, практически пригодный для непосредственного применения). Чтобы Apache мог принимать прокси-запросы, необходимо явным образом разрешить их, используя директиву «ProxyRequests On». Однако не спешите этого делать, не позаботившись о безопасности сетевых соединений! Оплачивать мегабайты, загруженные предприимчивыми подростками с ProxyHunter в руках – не самое приятное времяпровождение. Параметры доступа к серверу задаются в секции <Proxy> и, в частности, могут иметь следующий вид: <Proxy *> # Äëÿ âñåõ ïðîêñè-çàïðîñîâ Order deny,allow # Ñïåðâà çàïðåòèòü, ïîòîì ðàçðåøèòü Deny from All # Çàïðåòèòü âñåì Allow from 192.168.0.1/24 # Ðàçðåøèòü äîñòóï èç âíóòðåííåé # ñåòè îðãàíèçàöèè </Proxy>
Здесь реализована простейшая схема контроля доступа, базирующаяся на IP-адресах клиентов. Во многих случаях ее будет достаточно. Но что делать, если вы хотите разрешить использование сервера с компьютеров, не имеющих фиксированного IP-адреса (например, домашних машин особо приближенных сотрудников, которые не прочь получить «городской прокси»)? Для этих целей можно применить авторизацию по имени пользователя и паролю. Поскольку директивы контроля доступа, заключенные между тегами <Proxy> и </Proxy> на самом деле обрабатываются теми же самыми модулями, что обеспечивают защиту локальных каталогов сервера (ну, не говорил ли я вам, что Apache практически не отличает прокси-запрос от обычного?), вы можете использовать привычную конструкцию: <Proxy *> # Äëÿ âñåõ ïðîêñè-çàïðîñîâ AuthName “Tresspassers” # «Ïîñòîðîííèì â.» AuthFile /some/secret/file # Èìÿ ôàéëà, ñîäåðæàùåãî # ðåêâèçèòû ïîëüçîâàòåëåé AuthType Basic # Ìåòîä àâòîðèçàöèè – áàçîâûé Require valid-user # Ïðîïóñêàòü âñåõ, êòî ïåðå÷èñëåí # â /some/secret/file </Proxy>
Естественно, предварительно следует создать файл /some/ secret/file при помощи утилиты htpasswd(1) и загрузить соответствующие модули (mod_access и/или mod_auth). При необходимости оба метода можно комбинировать. Также бывает полезно пользоваться директивой «Satisfy All|Any», 2
указывающей, требовать ли от потенциального клиента соответствия всем условиям (применительно к нашей задаче это означает «иметь разрешенный IP-адрес и ввести правильное имя пользователя/пароль») или лишь одному из них. Последний вариант наиболее интересен с практической точки зрения, поскольку позволяет избежать раздражающей процедуры ввода пароля для пользователей внутренней сети организации. Внеся необходимые изменения в httpd.conf, не забудьте перезапустить Apache. После этого откройте свой любимый браузер и удостоверьтесь, что настройки безопасности действуют именно так, как вы задумали.
Кэширование Мы успешно справились с первым этапом, а именно: научили Apache обрабатывать запросы, адресованные внешним серверам. Нашей следующей задачей будет организация локального кэширования запрашиваемых данных. По некоторым сведениям, это позволяет сэкономить 10-20% внешнего трафика, что, согласитесь, не так уж мало. Кэшированием данных в Apache заведует модуль mod_ cache (--enable-cache). Именно он принимает решение о том, допустимо ли локальное сохранение того или иного объекта. Непосредственной записью данных на носители занимаются модули-«провайдеры», из которых нас в первую очередь будет интересовать mod_disk_cache (--enable-diskcache), реализующий хранение кэша на жестком диске. Отметим, что в Apache 2.0 оба этих модуля (mod_cache и mod_disk_cache) имеют статус экспериментальных. Ситуация обещает измениться в Apache 2.1, который пока что пребывает в состоянии альфа-версии. Чтобы включить кэширование, используйте директиву «CacheEnable disk /», где «disk» – идентификатор модуляпровайдера. Местоположение дискового кэша и его желаемый объем (в килобайтах) задается соответственно директивами «CacheRoot <имя каталога>» и «CacheSize <NNN>», относящимися уже не к mod_cache, а к mod_disk_cache. Apache предпринимает меры к тому, чтобы конфиденциальные данные никогда не попадали в кэш сервера, однако лишняя безопасность все же не повредит. Я рекомендую сделать каталог, в котором хранится кэш, недоступным ни для кого, кроме Apache. # chown apache:apache /path/to/cache # chmod 0700 /path/to/cache
Естественно, если в вашей системе Apache работает от имени другого пользователя, имя и группу владельца каталога также следует изменить соответствующим образом. В целях повышения производительности дисковый кэш имеет многоуровневую структуру. Глубиной вложенности подкаталогов и максимальной длиной их имени управляют директивы CacheDirLevels и CacheDirLength. По умолчанию для них используются следующие значения: CacheDirLevels 2, CacheDirLength 3. К сожалению, Apache 2.0 не имеет никаких штатных средств для управления содержимым кэша. Вы не можете постепенно удалять старые данные или делать это при пре-
Напомним, что согласно общепринятым соглашениям для этих целей используется порт 3128.
¹4, àïðåëü 2005
35
администрирование вышении кэшем некоторой дисковой квоты. Часть из этих проблем решена в Apache 2.1 при помощи специальной утилиты htcacheclean, которая очищает кэш по мере необходимости. Мне не известно, перенесена ли она в ветвь 2.0, однако в качестве некоторой замены вы можете написать сценарий, периодически очищающий каталог (и для верности перезапускающий Apache), самостоятельно. Если вы все же не последовали данному выше совету – выделить проксисерверу отдельный виртуальный хост, – имейте в виду, что настройки кэширования влияют не только на переадресованные, но и на обычные запросы, что может иметь неожиданные побочные эффекты вроде задержки между редактированием файла на диске и фактическим изменением веб-страницы с точки зрения внешнего пользователя. На данном этапе мы завершили все работы, необходимые для получения «идентичного натуральному ароматизатора» Squid, а точнее, того подмножества его функций, которое используется в типичной малой сети. Теперь мы пойдем несколько дальше и реализуем нечто новое – прозрачное сжатие веб-страниц.
Сжатие Модуль для сжатия HTTP-документов известен каждому уважающему себя веб-мастеру. Называется он mod_deflate (--enable-deflate), и, к вящей радости замученного бесконечными сборками из исходных текстов читателя, обычно включен даже в стандартной конфигурации. Его основное предназначение – сжимать локальные HMTL-страницы перед отправкой их пользователю, но, коль скоро Apache «близорук» и не делает особых различий между обычным и переадресованным запросом, он вполне годится и для последних. После своей загрузки mod_deflate создает фильтр «DEFLATE», который может быть установлен стандартным образом, например, при помощи директивы «SetOutputFilter DEFLATE». Руководство к модулю рекомендует поостеречься и отключить сжатие данных для браузеров, которые, несмотря на заявленную функциональность3, не могут обеспечить должный уровень поддержки (например, Netscape Navigator 4.x может корректно обрабатывать только сжатые данные типа text/html, а его версии 4.06-4.08 не способны даже на это), однако применительно к прокси-серверу это имеет смысл лишь в том случае, когда такие «динозавры» до сих пор имеют хождение в вашей организации. Из других директив, поддерживаемых mod_deflate, следует упомянуть DeflateCompressionLevel, устанавливающую степень сжатия данных (число от 0 до 9). Большее значение этой величины обеспечивает меньший размер результирующих файлов, но повышает нагрузку на процессор. Для среднестатистической системы оптимальным выбором считается 6. Вы можете не использовать эту директиву, тогда будут иметь место значения по умолчанию, принятые при сборке системной библиотеки Zlib.
mod_filter Казалось бы, все хорошо. Наш Apache теперь умеет обрабатывать прокси-запросы, хранить их в кэше и даже сжи3
36
мать перед отправкой. Однако спустя некоторое (обычно – весьма непродолжительное) время обнаруживаются странные артефакты. Архивы почему-то оказываются упакованными дважды, что пугает неподготовленных пользователей. И тут же возникают два вековечных русских вопроса: «Кто виноват?» и «Что делать?» Благо, за ответом на первый из них далеко ходить не надо. Как наверняка уже догадался проницательный читатель, проблема кроется в излишней «жадности» нашего mod_deflate, который сжимает все и вся, тогда как браузер готов распаковать лишь вполне определенные типы файлов: текст, HTML-страницы, графические изображения... Лежащее на поверхности решение – ограничить список файлов, подлежащих динамическому сжатию, по расширению (кстати, оно очень хорошо описано в документации к mod_deflate), можно отбросить сразу же. Расширение файла далеко не всегда соответствует его содержимому (те же архивы иногда называются как-нибудь вроде http:// www.some-tricky-company.ru/download/download.pl?id= 1234&uid=5678), кроме того, вариантов, подлежащих фильтрации, оказывается чересчур много. На самом деле, нам проще сказать, что должно сжиматься и выкинуть остальное.. Вторая идея – использовать директиву «AddOutputFilter ByType DEFLATE <список MIME-типов>» также терпит фиаско, поскольку она принципиально не способна работать с прокси-запросами (это редкое исключение, подтверждающее правило). Да и нужные нам шаблоны, типа «text/*», не говоря уж о более сложных, ей явно не по зубам. Что же делать? Решение существует! Это специализированный модуль mod_filter, написанный Ником Кью (Nick Kew) и включенный в стандартный комплект поставки Apache 2.1, усеченная версия которого была портирована автором этих строк обратно в 2.0. В данном разделе речь будет вестись именно о ней. Исходный код модуля доступен по адресу: http://ktf. physics.usu.ru/~val/mod_filter.zip. Чтобы установить его, распакуйте архив во временный каталог на вашем сервере и дайте команду: apxs -c -i -a mod_filter.c
Основная идея mod_filter состоит в том, чтобы заменить обычный фильтр так называемым «умным» (smart filter). «Умный» фильтр – это некоторая абстрактная конструкция, содержащая условия срабатывания и набор так называемых провайдеров (опять это слово!), которые, в свою очередь, являются обычными фильтрами. В перспективе подобный подход может сократить количество дублирующегося кода, встречающегося практически в каждом модуле и дающего ответ на вопрос: «Должны ли мы обработать эту порцию данных?» Впрочем, сейчас нас будут интересовать сугубо практические аспекты. Условия срабатывания «умного» фильтра могут использовать самую различную информацию: поля заголовков прямого запроса (req) и ответа на него (resp), значения внут-
Отметим, что отсечение клиентов, не поддерживающих сжатие данных, mod_deflate производит сам, без всякого участия администратора.
администрирование ренних переменных Apache, устанавливаемых с помощью mod_setenvif (env), имена обработчиков (handler), а также тип передаваемых данных (Content-type). Для создания «умного» фильтра используется директива «FilterDeclare <имя фильтра>». Подключением отдельных провайдеров управляет директива «FilterProvider <имя фильтра> <имя провайдера> <условие>». Здесь под именем провайдера подразумевается название «обычного» фильтра, например, DEFLATE. Завершив настройку «умного» фильтра, следует добавить его в «цепочку» командой FilterChain. При обработке поступившего запроса звенья цепочки последовательно просматриваются до тех пор, пока не будет найден фильтр, условие срабатывания которого для данного конкретного запроса окажется истинным. По умолчанию добавление нового «умного фильтра» происходит в конец цепочки, однако это поведение можно подавить, используя специальные префиксы в директиве FilterChain. Подробности ищите в документации. Теперь путь решения проблемы становится ясным. Нам необходимо добавить «умный» фильтр «Compressor» (конечно, вы можете использовать другое имя), который будет обрабатывать данные с типом «text/*». На самом деле диапазон MIME-типов, подлежащих сжатию, может быть более широким. Я, например, использую следующую конструкцию: FilterProvider Compressor DEFLATE resp=Content-type $text/ FilterProvider Compressor DEFLATE resp=Content-type ↵ $application/xhtml FilterProvider Compressor DEFLATE resp=Content-type ↵ $application/xml
Знак долара «$» в начале каждого условия обозначает операцию поиска по подстроке. Кроме него, доступен поиск по регулярному выражению (обрамляется символами «/»), а также весь спектр арифметических операций сравнения и специальное условие «*», которое всегда истинно. Обратите внимание, что мы используем «resp=Content-type» вместо «Content-type». Между этими двумя вариантами существует тонкое различие. В первом случае MIME-тип определяется по заголовкам, сформированным удаленным сервером, тогда как в последнем сведения поступают из локальной базы MIME-типов. Некоторые сайты, например, репозитарий SourceForge.net, используют для своих файлов двусмысленные имена, что приводит к недопониманию: http://prdownloads.sourceforge.net/project/release-x.y.tar.gz? download на проверку оказывается HTML-страницей, содержащей список доступных зеркал для файла release-x.y.tar.gz, поэтому лучше доверить право определения типа содержимого удаленному серверу. Уж он-то точно знает, что нам отправил.
Заключение Вот и подошла к концу данная статья. Если вы внимательно и творчески следовали всем перечисленным рекомендациям, то сейчас в вашем распоряжении имеется многофункциональный сервер Apache, который может самостоятельно обрабатывать запросы, переадресовывать их удаленным веб-узлам, кэшировать и динамически сжимать передаваемые данные, причем делает все это в рамках одной кодовой базы. Некоторые из описанных в статье функций в настоя-
¹4, àïðåëü 2005
щий момент имеют статус экспериментальных или являются сторонними разработками. Ситуация изменится с выходом финальной версии Apache 2.1, который будет содержать «штатные» реализации mod_cache и mod_filter. До тех пор вы при желании можете рассматривать предлагаемое решение как перспективное, хотя мой личный опыт показывает, что надежности вышеупомянутых модулей вполне достаточно для решения «бытовых» задач. Попробуйте сами!
Приложение Пример вызова configure, обеспечивающий поддержку всех необходимых модулей ñonfigure \ --enable-proxy –-enable-proxy-http -–enable-proxy-ftp -– enable-proxy-connect\ --enable-cache –enable-disk-cache\ --enable-deflate\ --enable-mods-shared=all
Фрагмент файла httpd.conf, реализующий описанную в статье систему ... # Ñëóøàòü ïîðò 3128 Listen 3128 ... # Çàãðóçèòü íåîáõîäèìûå ìîäóëè LoadModule cache_module modules/mod_cache.so LoadModule disk_cache_module modules/mod_disk_cache.so ... LoadModule deflate_module modules/mod_deflate.so ... LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so ... LoadModule filter_module modules/mod_filter.so ... # Ñîçäàòü âèðòóàëüíûé õîñò íà ïîðòó 3128 NameVirtualHost *:3128 <VirtualHost *:3128> # Âêëþ÷èòü ïîääåðæêó ïðîêñè-çàïðîñîâ ProxyRequests On <Proxy *> # Îãðàíè÷åíèå äîñòóïà ïî IP Order deny,allow Deny from all Allow from 192.168.0.1/24 # èëè àâòîðèçàöèÿ ïî èìåíè ïîëüçîâàòåëÿ è ïàðîëþ AuthName "No trespassers" AuthType Basic AuthUserFile <ôàéë ñ ðåêâèçèòàìè ïîëüçîâàòåëåé> Require valid-user # Åñëè îáå ñõåìû èñïîëüçóþòñÿ ñîâìåñòíî, óêàæèòå çäåñü # All, ÷òîáû çàòðåáîâàòü ðàçðåøåííûé IP-àäðåñ # è ïðàâèëüíûé ïàðîëü Any, ÷òîáû çàòðåáîâàòü # ðàçðåøåííûé IP-àäðåñ èëè ïðàâèëüíûé ïàðîëü Satisfy Any </Proxy> # Íàñòðîéêè êýøà CacheEnable disk / CacheRoot <ïóòü ê êàòàëîãó êýøà> CacheSize 51200 CacheDirLevels 2 CacheDirLength 3 # «Óìíûé» ôèëüòð äëÿ äèíàìè÷åñêîãî ñæàòèÿ FilterDeclare Compressor FilterProvider Compressor DEFLATE resp=Content-type $text/ FilterProvider Compressor DEFLATE resp=Content-type ↵ $application/xhtml FilterProvider Compressor DEFLATE resp=Content-type ↵ $application/xml FilterChain Compressor </VirtualHost>
37
администрирование
SVISTAТЬ ВСЕХ НАВЕРХ!
СЕРГЕЙ ЯРЕМЧУК Сегодня на рынке виртуальных машин, позволяющих запускать на одном компьютере сразу несколько операционных систем, признанным лидером является VMWare. Это действительно мощный продукт, обладающий понятным интерфейсом, простой в настройке, разобраться с использованием которого под силу и новичку. Но есть и некоторые неудобства. Так как VMWare является коммерческим продуктом, то придется либо купить лицензионную версию, либо смириться с тем, что лицензия ограничивает пользователя по времени. Довольно часто, особенно во время выхода новых версий программы, сайт бывает так перегружен, что не сразу удается получить новый ключ. Продукт Microsoft Virtual PC, по моему мнению, еще не пользуется большой популярностью хотя бы потому, что не достиг того уровня функциональности, который позволит тягаться с VMWare. Свободные же версии виртуальных машин вроде Bochs, Qemu и пр. несмотря на свои возможности (в неко-
38
торых случаях даже превосходящие VMWare), пользуются популярностью в большей степени или в основном среди сторонников UNIX-систем, скорее всего из-за отсутствия понятного интерфейса. К тому же Bochs, при всех его достоинствах, еще и очень медленно работает, поскольку не использует динамическую трансляцию. Хотя в последнее время Qemu уже обзавелся вполне понятными оболочками, но боюсь, что настоящая популярность придет к нему позже. Между тем существует по крайней мере еще один коммерческий проект, предлагающий виртуальную машину, и самое интересное, что в его разработке участвуют программисты из России. SerenityVirtual Station 2004 – SVISTA, именно так называется решение, предлагаемое Serenity Systems International – SSI (http://www.serenityvirtual.com/index.php), первый прессрелиз с упоминанием о ней датируется 1 ноября 2004 года. Разработкой SVISTA занимается компания «Параллели –
администрирование Программная Студия» (http://www.parallels.ru), образованная в феврале 2001 года в Москве. Итак, что умеет SVISTA? В качестве основной операционной системы могут использоваться Linux, FreeBSD, Windows, IBM OS/2 и eСomStation. В качестве гостевых операционных систем могут применяться: ! OS/2 2.1, OS/2 Warp 3.0, 4.0, 4.5, eComStation 1.0, 1.1, 1.2 ! MS-DOS, Windows 3.0, 3.1, 3.11 ! Windows 95 ! Windows NT 4.0, Windows 2000, Windows XP, Windows Server 2003 ! Linux (kernel 2.2, 2.4 и 2.6) ! FreeBSD Конкретные версии и дистрибутивы в официальной информации не названы, и скорее всего здесь особых ограничений нет. Я запускал виртуальную машину в ALT Linux 2.4 Master, ASPLinux v10, FreeBSD 5.3 и Windows XP SP1 и 2 – проблем не заметил. Системные требования также обычные для такого рода продуктов, и принцип один – чем больше, тем лучше. В SVISTA часть кода выполняется на реальном процессоре, минуя виртуальный, что увеличивает быстродействие системы. Доскональных испытаний я не проводил, но на компьютере 1.1 Celeron с 256 ОЗУ, SVISTA работает примерно с такой же скоростью, что и VMWare, но медленнее Qemu. Если в SVISTA и VMWare загрузка в гостевой ОС такого монстра как KDE, происходит минут за 15, то в Qemu на это уходит около 10 минут. SVISTA 2004 имеет набор инструментов для гостевой OС, например совместный буфер обмена, который позволяет сделать работу более удобной. Версия для Windows специально оптимизирована для работы с Citrix Metaframe. В качестве применения своему продукту разработчики видят в первую очередь различные варианты клиент-серверных архитектур (One technology – many environments), когда терминалы «тонких клиентов» загружают с сервера необходимую рабочую среду. Подробности смотрите в документации на сайте. Пользователь, запустивший SVISTA, получает в свое распоряжение следующую виртуальную машину: ! CPU Pentium II или AMD Duron (в зависимости от марки процессора на компьютере); ! материнская плата, совместимая с Intel i815; ! до 512 Мб оперативной памяти (но не больше половины имеющейся на PC); ! VGA и SVGA-совместимая видеокарта с поддержкой VESA 3.0, что позволяет использовать любые режимы вплоть до 1280x1024x256; ! дисковод формата 3.5'' на 1.44 Мб (может быть представлен как реальным устройством, так и образом); ! виртуальный жесткий диск IDE объемом до 32 Гб, представленный как образ; ! виртуальный CD-ROM (может быть как реальным устройством, так и iso-образом); ! до 4 последовательных портов (COM); ! до 3 параллельных портов (LPT); ! виртуальная Ethernet-сетевая карта, совместимая (на выбор) с RTL8029, NE2000 или NE2000plus, версия для Windows дополнительно поддерживает виртуальную Token-Ring сетевую карту;
¹4, àïðåëü 2005
! AC97-совместимая звуковая карта; ! клавиатура с поддержкой расширенных 104 клавиш; ! мышь PS/2 с колесом. Как видите, SVISTA несколько проигрывает VMWare, нет поддержки SCSI-, USB-устройств (планируется в следующей версии), да и сетевая карта всего одна (в VMWare – три). Однако разработчиками заявлено о поддержке нестандартного оборудования вплоть до картридеров.
Установка SVISTA SVISTA очень проста в установке и настройке. Но для начала необходимо кроме самого дистрибутива, предназначенного для конкретной основной системы, получить лицензионный ключ. Под UNIX-системы приложение, т.е. оболочка, распространяется по лицензии GPL и доступно в исходных текстах, библиотеки и файлы ресурсов являются закрытыми. Сам продукт является коммерческим, поэтому у нас есть два варианта: купить полную лицензию за 99 у.е., либо запросить демонстрационный ключ, который позволит использовать программу без каких-либо ограничений в течение 30 дней, если вы не хотите, чтобы работе мешало сообщение об использовании нелицензионной версии. Правда, по истечении этого срока никто не запрещает повторить всю процедуру с самого начала. Здесь все как в VMWare, только с тем отличием, что в SVISTA необходимо для каждой основной системы получать ключ отдельно, но зато можно пользоваться одним и тем же почтовым ящиком. В VMWare в получении ключа на e-mail, который уже имеется в базе данных, будет отказано. При использовании в качестве основной системы Linux получаем архив svista-2004-lnx.zip размером 1.93 Мб. После распаковки вы найдете ReadMe-файл и два пакета: SVISTA-2004.1056-Lin.i386.rpm и SVISTA-2004.1056-Lin.tgz. Первый предназначен для дистрибутивов, поддерживающих rpm-пакеты, второй – для всех остальных. # rpm –i SVISTA-2004.1056-Lin.i386.rpm
Или для tgz: # tar xzvf SVISTA-2004.1056-Lin.tgz #./install.sh
После чего запускаем скрипт SVISTA-config: # /usr/bin/SVISTA-config Configuring SVISTA 2004 build 1056 You must read and accept license agreement to run SVISTA 2004 To list by pages use Spacebar key. Press 'ENTER' to continue...
Далее будет выведен текст лицензии: Do you accept terms of license agreement ? (Y/N) y Trying to configure SVISTA 2004 drivers... configure: error: C compiler cannot create executables Can't configure ! Read "/usr/lib/SVISTA/Doc/INSTALL" and follow instructions that written there
Смотрим в указанный файл. Выясняется, что для компиляции (под UNIX-системы часть SVISTA поставляется в
39
администрирование исходных текстах) необходимо наличие исходных текстов ядра, библиотек QT 3.xx и конечно же, gcc с glibc. Если какого-либо из этих компонентов нет – установите. Теперь компиляция происходит нормально. Trying to configure SVISTA 2004 drivers... Trying to rebuild drivers... Drivers rebuilt successfully. Installing drivers... Starting drivers... Starting SVISTA 2004 main driver Starting SVISTA 2004 network driver Adding adapter eth0 to bridge 0... succeed. Configuration completed successfully
Удалять также просто, вводим «rpm -e SVISTA» или запускаем скрипт uninstall.sh. Установка в Windows происходит обычным образом, т.е. запуском исполняемого файла. Дальнейшая работа версий для UNIX и Windows также не отличается, за исключением того, что в Windows интерфейс локализован и пользователю будет легче разобраться с непонятными терминами и настройками. Исходя из этого, все дальнейшее описание будет относиться к версии для Linux, но если будут различия, о них будет рассказано отдельно.
Запуск виртуальной машины После установки работать от имени суперпользователя уже не обязательно. Запускаем утилиту: # SVISTA&
После чего появляется экран новой виртуальной машины.
Ðèñóíîê 2
Если при запуске не будет найдено загрузочное устройство или оно не правильно сконфигурировано, то вы получите предупреждение «No boot device available, press enter to continue». Параметр Memory определяет количество реальной оперативной памяти, которое будет выделено виртуальной машине, установите его в пределах от 4 до 512 Мб, но не более половины размера ОЗУ. Если конфигуратор Windows сразу устанавливает предел в половину имеющейся памяти (кроме случаев, когда часть ОЗУ отдана встроенной карте, см. рис. 3), то в Linux его придется контролировать самому. Если переусердствуете, то получите ошибку «System error E4003: Can't map VM memory».
Ðèñóíîê 3
Ðèñóíîê 1
Для дальнейшей работы необходимо ввести регистрационный номер, зайдя в пункт Help/Registration. Теперь приступаем к созданию новой виртуальной машины, выбрав меню New. Во вкладке Main (рис. 2) устанавливаются основные параметры виртуальной машины, тип гостевой системы, параметр Boot sequence позволяет выбрать один из трех типов загрузки: ! Floppy, Hard drive, CD-ROM. ! Hard drive, Floppy, CD-ROM. ! CD-ROM, Hard drive, Floppy.
40
В Options определяются действия, выполняемые при старте виртуальной машины. Так, «Start immediately after opening configuration» позволяет запустить виртуальную машину сразу после выбора конфигурационного файла, без дополнительных действий со стороны пользователя. Опция «Start virtual machine in full screen mode» запускает виртуальную машину в полноэкранном режиме (в него можно также перейти, нажав кнопку на панели, либо через соответствующий пункт меню). Включив «Show full screen mode startup warning message», вы будете получать предупреждения о переходе в полноэкранный режим. Опция «Enable acceleration» включена по умолчанию, но
администрирование для некоторых гостевых систем (Windows NT и 2000), при работе которых возможны сбои, появляется возможность отключить ускорение. И наконец, «Enable write-back disk cache» также включена по умолчанию и разрешает производить запись не сразу в образ, а в кеш. Вкладки Floppy drives и IDE drives похожи. В них указываются соответствующие устройства (дисковод, жесткий диск и CD-ROM), которые будут доступны на виртуальной машине. При этом могут быть указаны как реальные устройства, так и предварительно созданные образы. Для создания файл-образа используется кнопка «Create file», при этом задается размер файла (дисковод 1.44 Мб по умолчанию имеет расширение .fdd, жесткий диск от 20 до 32768 Мб, расширение hdd). В Windows файл создается автоматически, а в Linux его необходимо предварительно создать вручную:
шей частью автоматически, для RTL8029 compatible система сама выбирает IRQ. Для остальных типов адаптеров придется IRQ выставлять самому. После установки всех параметров будущей гостевой системы выходим из настроек и сохраняем конфигурацию (по умолчанию файл с расширением *.svs). Если в процессе использования гостевой системы возникла необходимость в редактировании параметров, воспользуйтесь пунктом Edit. Òàáëèöà.1 Ñïèñîê ïîääåðæèâàåìûõ ñåòåâûõ àäàïòåðîâ â çàâèñèìîñòè îò òèïà ãîñòåâîé ñèñòåìû
# touch /home/sergej/vm/knoppix.hdd
Я не экспериментировал со всеми возможными образами, но отмечу, что для работы можно использовать образы, подготовленные для Qemu. Напомню, что в составе Qemu имеется утилита qemu-img, которая с параметром convert позволяет конвертировать образы в различные форматы. Флажок «Compress free space» позволяет сэкономить дисковое пространство. Так, только что созданный 4-гигабайтовый контейнер занимает всего 100 Кб, но затем расширяется по мере заполнения. Опции «Start floppy disk connected» и «Start CD-ROM disk connected» автоматически включают устройство при подаче питания на виртуальный компьютер. В Windows для создания образов удобно использовать программу ImageTool.exe, идущую в комплекте.
Ðèñóíîê 4
Следующие две вкладки «Serial ports» и «Parallel ports» открывают доступ к соответствующим портам. Во вкладке «Sound settings» доступны опции «PC speaker support enable» и «Sound support enable», активация которых позволяет использовать спикер и виртуальную AC’97звуковую карту. При использовании в качестве основной системы Windows в каталоге, в который установлен SVISTA, имеется файл tools.fdd, содержащий драйвера AC’97 и сетевых устройств в основном для OS/2 и Windows NT. И наконец, вкладка «Network settings» позволяет активировать сетевое устройство (рис. 5). В зависимости от используемой гостевой системы будут доступны различные сетевые адаптеры (таб. 1). И последним шагом настройки является установка port, IRQ и MAC-адреса. Параметр port устанавливается боль-
¹4, àïðåëü 2005
Ðèñóíîê 5
Теперь на виртуальную машину можно подавать питание. В дальнейшем работа происходит обычным образом. Наличие всего одного сетевого адаптера не позволяет создавать такие разветвленные конфигурации, как в VMWare, но имеющихся возможностей SVISTA вполне достаточно для тестирования программного обеспечения и сетевых сервисов, работы или презентации возможностей тех или иных приложений, написанных под разные операционные системы.
41
администрирование
АРХИВИРУЕМ ДАННЫЕ С ПОМОЩЬЮ BACULA
АЛЕКСЕЙ ГРИНЬКО Bacula – это мощное средство создания и управления резервными копиями данных, а также восстановления информации при необходимости. Имея модульную архитектуру, Bacula легко масштабируется и может быть использована как на нескольких, так и на сотнях компьютеров. Кому будет полезен этот инструментарий? Как сказано в документации, «... если вы используете такие программы, как tar, dump, bru для создания резервных копий, и хотели бы иметь удобное средство для сетевой работы, то Bacula, скорее все-
42
го, имеет полный набор необходимых вам функций». Что ж, проверим это утверждение разработчиков. Начнем с описания компонентов, из которых состоит эта система. Bacula имеет клиент-серверную архитектуру, ее схема представлена ниже (рис. 1).
Взаимодействие служб в Bacula Сердцем системы является «центр управления» (Director), в его функции входит хранение заданий, их запуск, ведение
администрирование журнала всего происходящего. Эта часть на данный момент реализована только для FreeBSD и Linux. Для хранения журналов создания архивных копий и их содержимого используется SQL Server (служба хранения каталога). В его роли может выступать PostgreSQL, MySQL и SQLite. Созданные архивные копии передаются в «хранилище» (Storage Server), где они записываются в «тома» (Volume). Тома физически могут записываться в простейшем случае в файл, но Bacula поддерживает работу с накопителями на магнитной ленте, в том числе и устройства с автоматической сменой кассеты. Если выбран вариант хранения томов в виде файлов, то после достижения файлом длины 650-700 Мб (CD) или же 4.5 Гб (DVD), целесообразно закончить работу с этим томом и записать его на носитель CD/DVD. Еще одним элементом системы является «Служба файлов» (File Daemon). Это клиентская часть, которая устанавливается на компьютеры, хранящие данные для архивации. Вся прелесть в том, что данная часть реализована для различных платформ: FreeBSD, Linux и Windows. Таким образом, собирать данные для размещения в архив можно вне зависимости от того, какая операционная система установлена на компьютер. Остался еще один элемент – «Консоль» (Bacula Console). Он также существует в версиях для различных ОС, его целью является создание, управление и контроль выполнения архивных копий, а также менеджмент томов и пулов.
управления), bacula-sd.conf (хранилище). Начнем с самого простого – bacula-fd.conf: Director { Name = main-dir Password = "bacula" }
# îïèñàíèå öåíòðà óïðàâëåíèÿ, # êîòîðîìó ðàçðåøåíî îáðàùàòüñÿ # ê ýòîé ñëóæáå ôàéëîâ
FileDaemon { # îïèñàíèå ñëóæáû ôàéëîâ Name = main-fd # èìÿ êëèåíòà FDport = 9102 # èñïîëüçóåìûé ïîðò WorkingDirectory = /var/lib/bacula # ðàáî÷èé êàòàëîã Pid Directory = /var/run # ôàéë ñ íîìåðîì ïðîöåññà } Messages { # îïèñàíèå êàíàëà ñîîáùåíèé Name = Standard # èìÿ êàíàëà director = main-dir = all, !skipped # ãäå îí íàõîäèòñÿ }
Конфигурационные файлы состоят из объектов (директив), параметры каждого объекта находятся внутри фигурных скобок {}. Здесь приведены следующие объекты: Director (центр управления), FileDaemon (служба файлов) и Messages (канал сообщений). Описанием первого объекта мы разрешаем центру управления с именем main-dir подключаться и передавать задания. Второй объект задаёт параметры работы самой службы файлов. В третьем же задается имя канала сообщений, в который будут передаваться отчеты о проделанной работе, состояние, ошибки. Для оповещения о ходе работы, поставленных задачах и результатах их выполнения используются каналы сообщений. Можно задействовать несколько каналов, к примеру, по числу заданий, и отправлять отчеты пользователям, чьи данные были заархивированы. Мы же создадим один канал для отправки всех сообщений администратору. Также по почте будут приходить уведомления о смене кассеты или подключении нового файлового тома, если текущий заполнен. Для отправки сообщения Bacula использует собственный инструментарий – bsmtp, который может отправлять сообщения не только локально, но и на удаленный smtpсервер. Следующий конфигурационный файл описывает настройки хранилища: Storage { # îïðåäåëåíèå õðàíèëèùà Name = main-sd # èìÿ SDPort = 9103 # èñïîëüçóåìûé ïîðò WorkingDirectory = "/var/lib/bacula" # ðàáî÷èé êàòàëîã Pid Directory = "/var/run" # ôàéë ñ íîìåðîì ïðîöåññà }
Ðèñóíîê 1
Как видно, поместить службу хранения каталогов, хранилище и центр управления разумнее всего на одном сервере. В FreeBSD есть следующие порты для установки: ! /usr/ports/sysutils/bacula-server ! /usr/ports/sysutils/bacula-client Нам понадобятся оба, так как компьютер, на котором будет запущен центр управления Bacula, тоже будет выступать в роли клиента. После установки необходимо настроить три конфигурационных файла, находящихся в $PREFIX/ etc/: bacula-fd.conf (служба файлов), bacula-dir.conf (центр
¹4, àïðåëü 2005
Director { Name = main-dir Password = "bacula" }
# îïèñàíèå öåíòðà óïðàâëåíèÿ, # êîòîðîìó ðàçðåøåíî îáðàùàòüñÿ # ê ýòîìó õðàíèëèùó
Messages { # îïèñàíèå êàíàëà ñîîáùåíèé Name = Standard # èìÿ êàíàëà director = main-dir = all, !skipped # ïåðåäàâàòü ñîîáùåíèÿ â öåíòð óïðàâëåíèÿ } Device { Name = FileStorage Media Type = File Archive Device = /tmp LabelMedia = yes Random Access = Yes AutomaticMount = yes RemovableMedia = no AlwaysOpen = no }
# # # # # # # # #
óñòðîéñòâî õðàíåíèÿ òîìîâ èìÿ òèï íîñèòåëÿ (ôàéëîâûé) ïóòü ê óñòðîéñòâó äàâàòü òîìàì ìåòêè óñòðîéñòâî ñ ïîçèöèîíèðîâàíèåì àâòîìàòè÷åñêîå ïîäêëþ÷åíèå òîìà ÿâëÿåòñÿ ëè ñúåìíûì íîñèòåëåì áëîêèðîâêà èçâëå÷åíèÿ íîñèòåëÿ
43
администрирование
ëÿ
Device { # óñòðîéñòâî õðàíåíèÿ òîìîâ Name = DDS-4 # èìÿ Description = "DDS-4" # îïèñàíèå Media Type = DDS-4 # òèï íîñèòåëÿ (êàññåòà ñòðèììåðà) Archive Device = /dev/nsa1 # ïóñòü ê óñòðîéñòâó AutomaticMount = yes # àâòîìàòè÷åñêîå ïîäêëþ÷åíèå òîìà AlwaysOpen = yes # áëîêèðîâêà èçâëå÷åíèÿ íîñèòåOffline On Unmount = no Hardware End of Medium = no BSF at EOM = yes Backward Space Record = no Fast Forward Space File = no TWO EOF = yes }
# # # # # # # # # # #
èçâëåêàòü êàññåòó ïðè ðàçìîíòèðîâàíèè àïïàðàòíîå îïðåäåëåíèå êîíöà êàññåòû ñòàâèòü ìåòêó â êîíöå (äëÿ FreeBSD) íàñòðîéêè äëÿ óñòðîéñòâ ñ íåïðîèçâîëüíûì ïîçèöèîíèðîâàíèåì ïîìå÷àòü êîíåö êàññåòû äâóìÿ EOF
В этом файле описываются следующие объекты: Storage (хранилище), центр управления, имеющий право работать с данным хранилищем, канал сообщений и, наконец, два устройства для архивирования – файловое и накопитель на гибкой магнитной ленте (стриммер). Перед тем как приступить к последнему, самому сложному файлу конфигурации, необходимо подготовить службу каталога. Подойдет PostgreSQL, MySQL или SQLite. Я остановил свой выбор на MySQL, это довольно распространенный SQL-сервер, присутствующий почти в каждой UNIX-системе. В комплекте с Bacula есть скрипты для конфигурирования базы данных: создание пользователя и установка необходимых прав (grant_mysql_privileges), (create_mysql_database) и таблиц (make_mysql_tables), находящихся в $PREFIX/bacula. Для создания пользователя и назначения ему необходимых прав, лучше использовать скрипт, поставляемый по умолчанию. Поэтому создаем новую базу данных ./create_mysql_database и затем выполняем следующее: mysql -u root -p mysql> grant all privileges on bacula.* to bacula@localhost ↵ identified by 'baculapwd' with grant option; mysql> flush privileges;
Далее запуском скрипта ./make_mysql_tables создаем необходимые для работы Bacula таблицы. На этом подготовка службы каталога завершена и можно приступать к настройке центра управления. Файл конфигурации имеет несколько частей: ! описание центра управления; ! описание заданий; ! клиенты, графики запуска; ! доступные хранилища; ! набор файлов; ! служба каталога; ! каналы сообщений; ! пулы хранения томов. Некоторые директивы нам уже знакомы, но есть и новые – описание заданий (Job), набор файлов (FileSet), график запуска (Schedule). Начнем с описания заданий (Job) и шаблона задания (JobDefs). Задание может быть нескольких типов (Type) – архивирование данных (Backup), восстановление данных (Restore), проверка целостности данных (Verify) и обслуживание каталога (Admin). С первыми дву-
44
мя вопросов возникнуть не должно. Verify используется для проверки, изменялись ли данные с момента последнего архивирования. Тип задания Admin используется для удаления устаревших записей из каталога. Задание обязательно должно содержать следующие элементы: имя (Name), тип (Type), типы архивирования (только для заданий Backup), какие файлы архивировать (FileSet), с какого клиента (Client), в какое хранилище (Storage), какой пул (Pool – группа томов) использовать, приоритет задания (Priority). Целесообразно часть этих опций описать в шаблоне задания и создавать задания на его основе. В этом случае не нужно каждый раз указывать одни и те же опции. Если же мы хотим использовать значение элемента, отличное от приведенного в шаблоне, достаточно его переопределить в описании задания. Ниже приведен пример шаблона и описания задания архивирования: JobDefs { # øàáëîí çàäàíèÿ Pool = Default # ïóë ñ òîìàìè # îïèñàíèå ïóëîâ äëÿ ðàçíûõ òèïîâ àðõèâèðîâàíèÿ Full Backup Pool = FullBackups Differential Backup Pool = DiffBackups Incremental Backup Pool = IncBackups Name = DefaultJob # èìÿ Type = Backup # òèï çàäàíèÿ Level = Full # òèï àðõèâèðîâàíèÿ Client=main-fd # êëèåíò Storage = File # õðàíèëèùå Messages = Standard # êàíàë ñîîáùåíèé Priority = 10 # ïðèîðèòåò Reschedule On Error = yes # ïîâòîðÿòü ëè ïðè îøèáêå Reschedule Interval = 6h # èíòåðâàë äëÿ ïîâòîðà Reschedule Times = 3 # êîëè÷åñòâî ïîâòîðîâ } Job { Name = "UnixCfg" JobDefs = DefaultJob FileSet="UnixCfg" Storage = File }
# # # # #
îïèñàíèå çàäàíèÿ èìÿ èñïîëüçóåìûé øàáëîí íàáîð ôàéëîâ èñïîëüçóåìîå õðàíèëèùå
Как видно, в шаблоне мы описали используемый по умолчанию пул, указали, что для каждого типа архивирования будем использовать свой пул, – это довольно удобно. Делать полные копии большого количества файлов еженедельно неразумно. Гораздо удобнее сделать раз в месяц (или реже) полные копии, а еженедельно создавать инкрементальные (Incremental) копии, в которых будут храниться только измененные с момента последней архивации файлы. Приведу еще одно немаловажное задание: Job { Name = "BackupCatalog" # èìÿ çàäàíèÿ JobDefs = DefaultJob # èñïîëüçóåìûé øàáëîí FileSet="Catalog" # íàáîð ôàéëîâ # çàïóñêàòü ïî ãðàôèêó, âûïîëíèòü ïåðåä çàäàíèåì è ïîñëå íåãî Schedule = "WeeklyCycleAfterBackup" RunBeforeJob = "/usr/local/etc/bacula/make_catalog_backup ↵ -u bacula -pbaculapwd"
}
RunAfterJob = "/usr/local/etc/bacula/ ↵ delete_catalog_backup" Write Bootstrap = "/var/lib/bacula/BackupCatalog.bsr" Storage = FileStorage # èñïîëüçóåì ôàéëîâîå õðàíèëèùå Priority = 11 # ïðèîðèòåò
Использование этого задания очень важно, ведь оно создает дамп SQL-базы службы каталога. Делать это необходимо для того, чтобы застраховать себя от сбоев на са-
администрирование мом сервере. Если что-то случится со службой каталога, то, имея на руках одни кассеты с архивами, восстановить данные будет совсем непросто. Поэтому данные записываются в другое хранилище (файловое). Хранить эти файлы после их заполнения рекомендуется на другом сервере или на носителях CD/DVD. Кроме того, здесь используются новые элементы RunBeforeJob и RunAfterJob и, как ясно из названия, это скрипты, которые необходимо запустить до и после начала архивирования. Перед запуском задания создается дамп базы, с помощью скрипта make_catalog_ backup (входящего в дистрибутив Bacula). Дамп помещается в файл /var/lib/bacula/bacula.sql. Элемент Schedule (график запуска) показывает, что это задание необходимо выполнять периодически. Выбранный график запуска «Weekly CycleAfterBackup», как будет рассмотренно позже, указывает на то, что архивирование будет запускаться ежедневно, после выполнения всех основных резервных заданий. Заметим, добились мы этого установкой приоритета ниже обычного. По умолчанию значение приоритета для задания равно 10. Если мы хотим повысить приоритет задания, его необходимо назначить меньше 10, и наоборот. Если в одно и то же время запланировано несколько задач, то первой будет выполнена задача с более высоким приоритетом, остальные будут поставлены в очередь на ожидание. Задание, поступившее в очередь позже, но имеющее приоритет выше, будет выполнено в обход тех, что уже стоят в очереди. При этом работа выполняемого архивирования не прерывается даже при поступлении в очередь задания с более высоким приоритетом. Переходим к следующим объектам – описание набора файлов для архивирования. В задании с именем UnixCfg мы указали, что будем использовать набор файлов UnixCfg. Расшифруем, что мы имели в виду: FileSet { Name = "UnixCfg" # èìÿ íàáîðà ôàéëîâ Include = signature=MD5 { # îïöèè – ïîñ÷èòàòü # ñóììû MD5 äëÿ ôàéëîâ /etc # àðõèâèðîâàòü êàòàëîã /etc /usr/local/etc # à òàêæå /usr/local/etc } Exclude = { # ôàéëû-èñêëþ÷åíèÿ *.bak # èñêëþ÷èòü èç àðõèâà ôàéëû ïî ìàñêå } } FileSet { Name = "Catalog" Include = signature=MD5 { /var/lib/bacula/bacula.sql } }
Все интуитивно понятно. Описаны два набора файлов – соответственно для двух вышесозданных заданий. Добавлю только то, что при использовании файлового хранилища, а не стриммера, будет полезным добавить вслед за опцией «signature=MD5» опцию «compression=GZIP», которая указывает на необходимость архивирования файлов перед помещением в том. В случае со стриммером это не имеет смысла – большинство устройств имеют аппаратную поддержку сжатия. На очереди следующий элемент – описание графика выполнения заданий. Делается это для того, чтобы можно
¹4, àïðåëü 2005
было сконфигурировать автоматический запуск архивирования. Если в описании задания не указана директива Schedule, то оно будет запускаться только вручную. Запуск задания в этом режиме осуществляется из консоли Bacula. Schedule { Name = "WeeklyCycle" Run = Full 1st sun at 1:05 Run = Differential 2nd-5th sun at 1:05 Run = Incremental mon-sat at 1:05 } Schedule { Name = "WeeklyCycleAfterBackup" Run = Full sun-sat at 1:10 }
Первый график запуска определяет выполнение полного архивирования файлов в первое воскресенье месяца в 1.05. Инкрементальное архивирование осуществляется с понедельника по субботу в 1.05. А дифференционное архивирование в каждое воскресенье, кроме первого, в 1.05. Второй график будет запускать задания каждый день, после того как будут выполнены дневные архивирования. Теперь настала очередь описания клиентов и параметров обращения в службе каталогов. Настройки клиента (службы файлов, которой будут отправляться задания) и службы каталогов прокомментированы и должны быть интуитивно понятны. Client { Name = main-fd # Address = localhost # FDPort = 9102 # Catalog = MyCatalog # Password = "bacula" # File Retention = 30 days
}
èìÿ êëèåíòà åãî àäðåñ, èìÿ DNS èñïîëüçóåìûé ïîðò èñïîëüçóåìàÿ ñëóæáà êàòàëîãà ïàðîëü äëÿ äîñòóïà # ñðîê õðàíåíèÿ ôàéëîâ # â àðõèâå Job Retention = 6 months # ñðîê õðàíåíèÿ çàïèñåé # â êàòàëîãå AutoPrune = yes # óäàëÿòü ñòàðûå çàïèñè è ôàéëû
Catalog { Name = MyCatalog # èìÿ êàòàëîãà # èìÿ SQL-áàçû äàííûõ, ïîëüçîâàòåëü è ïàðîëü dbname = bacula; user = bacula; password = "baculapwd" }
Ниже приведены описания настроек устройств, используемых в качестве хранилища. Его имя, а также тип носителя обязательно должны быть такими же, как и те, что указаны в bacula-sd.conf. Storage { Name = File Address = localhost SDPort = 9103 Password = "bacula" Device = FileStorage Media Type = File } Storage { Name = DDS-4 Address = localhost SDPort = 9103 Password = "bacula" Device = DDS-4 Media Type = DDS-4 }
# # # # # # # #
èìÿ õðàíèëèùà IP-àäðåñ èëè DNS-èìÿ èñïîëüçóåìûé ïîðò ïàðîëü óñòðîéñòâî (òàêîå æå, êàê â bacula-sd.conf) òèï íîñèòåëÿ (òàêîå æå, êàê â bacula-sd.conf)
# # # # # # # #
èìÿ õðàíèëèùà IP-àäðåñ èëè DNS-èìÿ èñïîëüçóåìûé ïîðò ïàðîëü óñòðîéñòâî (òàêîå æå, êàê â bacula-sd.conf) òèï íîñèòåëÿ (òàêîé æå, êàê â bacula-sd.conf)
45
администрирование Подробно стоит остановиться на системе информирования о ходе выполнения заданий. Ниже приведено описание канала сообщений с именем Standard, в который мы будем передавать сообщения со всех служб Bacula. Команда оповещения о результате выполнения задается с помощью mailcommand. Для отправки сообщений, не дожидаясь окончания задания, используется команда, определенная с помощью operatorcommand. Для информативности можно использовать следующие переменные: ! %c – имя клиента; ! %d – имя центра управления; ! %e – код завершения задания; ! %i – номер задания; ! %n – имя задания; ! %l – тип архивирования; ! %r – получатель; ! %t – тип задания. Запись, определяющая передачу сообщений, может иметь два формата: <ïóòü> = <òèï ñîîáùåíèé1>, <òèï ñîîáùåíèé2>,... <ïóòü> = <àäðåñàò> = <òèï ñîîáùåíèé1>, <òèï ñîîáùåíèé2>,...
В первом варианте в качестве <путь> может быть стандартный взвод (stdout), стандартный поток ошибок (stderr) или консоль Bacula (console). При использовании второго типа формата путь может принимать следующие значения: ! центр управления (director); ! файл (file); ! добавление в существующий файл (append); ! системный лог (syslog); ! сообщение по почте (mail); ! сообщение по почте при ошибке (mail on error); ! немедленное сообщение (operator). Отличие пути «operator» от «mail» состоит в том, что поступившее сообщение будет отправлено немедленно, а не после завершения задания. Это удобно для отправки сообщения о том, что текущий том заполнен, и для продолжения выполнения задания необходимо подключение нового. Bacula имеет следующие типы сообщений: ! информационное (info); ! предупреждение (warning); ! ошибка (error); ! критическая ошибка (fatal); ! остановка службы (terminate); ! сохранение без ошибок(saved); ! файл не сохранен (notsaved); ! необходимо подключение нового тома (mount); ! файл восстановлен (restored); ! все типы (all). Если перед типом сообщения указать модификатор «!», то это будет означать, что данный тип сообщений включать не нужно. Исключение определенных сообщений используется совместно с типом «all». Messages { Name = Standard # èìÿ êàíàëà ñîîáùåíèé # êîìàíäà îòïðàâêè îò÷åòà
46
# # # # # # # }
mailcommand = "bsmtp -h localhost \"\(Bacula\) %r\" ↵ -s \"Bacula: %t %e of %c %l\" %r" êîìàíäà îòïðàâêè çàïðîñà ñìåíû íîñèòåëÿ operatorcommand = "bsmtp -h localhost \"\(Bacula\) %r\" ↵ -s \"Bacula: Intervention needed for %j\" %r" îòïðàâëÿòü ïî ïî÷òå âñå òèïû ñîîáùåíèé, çà èñêëþ÷åíèåì ïðîïóùåííûõ ôàéëîâ mail = root@localhost = all, !skipped àäðåñ îïåðàòîðà ñìåíû íîñèòåëÿ operator = root@localhost = mount ïðîäóáëèðîâàòü âñå òèïû ñîîáùåíèé â êîíñîëü Bacula, çà èñêëþ÷åíèåì ïðîïóùåííûõ è íåñîõðàíåííûõ ôàéëîâ console = all, !skipped, !saved çàïèñûâàòü ñîîáùåíèÿ â ôàéë append = "/var/lib/bacula/log" = all, !skipped
Как видно выше, мы направляем на адрес root@localhost все типы сообщений, за исключением пропуска файлов. Все эти сообщения будут продублированы в файл /var/lib/bacula/ log. Пропущенными могут быть файлы, попавшие под маску исключения в описании набора файлов или в случае инкрементального архивирования, если эти файлы со времени последнего резервирования не изменялись. В консоль Bacula будут направляться все сообщения, кроме пропущенных по желанию пользователя файлов (!skipped), а также ошибок при сохранении файлов (!saved). Если мы не хотим получать сообщения по почте и записывать отчеты в файл, достаточно закомментировать эти строки. Но хоть один из видов уведомления рекомендуется оставить, иначе не будет видно возникновения ошибок или запроса на смену носителя. Последний элемент, который необходимо рассмотреть, – это описание пула томов. Приведено описание только одного пула, но нам необходимо для работы еще три – для полного, дифференционного и инкрементального архивирования. Имена им необходимо дать те, что были использованы при описании шаблона задания (FullBackups, Diff Backups, IncBackups). Pool { Name = Default Pool Type = Backup Recycle = yes
}
AutoPrune = yes Volume Retention = 3m LabelFormat = "File-"
# # # # # # #
èìÿ òîìà òèï ïóëà ñòèðàòü ëè ïîìå÷åííûå íà óäàëåíèå òîìà ïîìå÷àòü íà óäàëåíèå ñòàðûå òîìà ñðîê õðàíåíèÿ òîìà 3 ìåñÿöà ôîðìàò ìàðêèðîâêè òîìà
Теперь можно проверить правильность созданных конфигурационных файлов. Сделать это можно, запустив по очереди каждого из демонов с ключами -t -c /$PREFIX/bacula/ bacua-<daemon>.conf: bacula-fd -t -c bacula-fd.conf bacula-sd -t -c bacula-sd.conf bacula-dir -t -c bacula-dir.con
Задав нужное количество заданий, периодически запускаемых планировщиком, мы получим удобную систему по созданию резервных копий данных. Вмешательство со стороны администратора будет необходимо в случае, если закончится место на кассете и нужно будет ее сменить, о чем Bacula уведомит по почте. В следующей части статьи пойдет речь о консольных командах работы с этой системой – запуск заданий вручную, проверка целостности данных, восстановление информации из архивов и управлением томами и пулами.
администрирование
БАЗОВАЯ НАСТРОЙКА МАРШРУТИЗАТОРА CISCO НАЧАЛЬНОГО УРОВНЯ
АНДРЕЙ МАРКЕЛОВ Устав бороться дома с несогласным стабильно работать маршрутизатором DLink 624+, я наконец решил поменять это недорогое, но проблемное устройство на что-нибудь более надежное. Необходимо было выполнение следующих типичных для дома или небольшого офиса функций: ! подключение до пяти сетевых устройств (реально у меня одновременно работало не больше двух, требующих выхода за пределы домашней сети); ! развитый брандмауэр и сетевая трансляция адресов (NAT);
48
! DHCP-сервер; ! поддержка протокола Point-to-Point Protocol over Ethernet (PPPoE), по которому осуществлялось подключение к провайдеру; ! надежность и возможность мониторинга состояния маршрутизатора, которой так не хватало в DLink 624+. В итоге я остановил свой выбор на младшем маршрутизаторе модельного ряда компании Cisco Systems. Далее я приведу описание процесса базовой настройки маршрутизатора, которое может послужить отправной
администрирование точкой для самостоятельного конфигурирования домашней/ офисной «кошки» UNIX- или Windows-администратором, ранее не работавшим с оборудованием Cisco.
Подключение Для первоначальной настройки маршрутизатора необходимо подключиться к консольному порту на задней панели устройства. Консольный порт с разъемом RJ-45 представляет собой обыкновенный асинхронный последовательный порт TIA/EIA-232. Для подключения к ПК вам понадобится помимо так называемого rollover-кабеля, идущего в комплекте с маршрутизатором, переходник к DB-9, и, естественно, COM-порт на рабочей станции. Установка соединения осуществляется со стандартными значениями – 9600 бод/8 бит данных/1 стоп бит/без проверки четности и контроля прохождения. В Windows-системах вы можете использовать утилиту HyperTerminal, а в Linux – cu или minicom. В дальнейшем, когда маршрутизатору будет присвоен IP-адрес, вы сможете обращаться к нему по протоколам telnet или ssh, но первый раз без консольного подключения не обойтись. Итак, даем с рабочей станции команду на подключение, и после нажатия <Enter> оказываемся в командной строке маршрутизатора. Router>
Теперь необходимо перейти в привилегированный режим, в котором и будем осуществлять настройку:
Home(config)#no ip http server Home(config)#no ip http secure-server Home(config)#no cdp run
Теперь включим режим хранения паролей в файле конфигурации устройства в зашифрованном виде: Home(config)#service password-encryption
После чего можно задать и сами пароли. Для начала на консольное подключение: Home(config)#line con 0 Home(config-line)#password пароль Home(config-line)#login Home(config-line)#exit Home(config)#
Затем таким же способом, но уже на подключение с помощью telnet. Вместо команды line con 0 в этом случае будет line vty 0 4, остальное останется неизменным. Зададим также пароль, который маршрутизатор будет спрашивать у уже подключившегося пользователя при попытке перейти из пользовательского в привилегированный режим командой enable: Home(config)#enable secret пароль_enable_режима
Думаю, к этому моменту я привел достаточно примеров того, как выглядит работа с командной строкой маршрутизатора Cisco и в оставшейся части статьи, чтобы избегать повторов, я просто буду ссылаться на соответствующие строки конфигурации маршрутизатора, приведенной в конце материала.
Router>enable Router#
Нужно заметить, что в дальнейшем мы установим на вход в привилегированный режим маршрутизатора пароль, ну а пока что свежекупленное устройство должно пустить нас без дополнительных вопросов. Следующий шаг – удаляем имеющуюся конфигурацию, находящуюся во флэшпамяти, и перезагружаем маршрутизатор (рис. 1): Router#erase startup-config Router#reload
За ходом перезагрузки можно наблюдать по появляющимся сообщениям в окне терминала. По окончании процесса перезагрузки снова заходим в командную строку и переходим в привилегированный enable-режим. После чего можно приступить к конфигурированию маршрутизатора.
Ðèñóíîê 1
Базовые настройки
Настройка интерфейсов и PPPoE
Для начала присвоим маршрутизатору имя. Переходим в глобальный конфигурационный режим и в нем используем команду hostname:
Поскольку мы настраиваем маршрутизатор, то, естественно, у него имеется минимум два интерфейса. Внутренний – Ethernet0 и внешний Ethernet1. Определяются они в строках 31-35 и 37-43 соответственно. Для внутреннего интерфейса мы задаем IP-адрес 192.168.0.88 и маску 255.255.255.0, а для внешнего указываем команду: no ip address. Все внешние параметры будут получены через PPPoE (строки 42 и 43). Для того чтобы закрыть обсуждение ethernet-интерфейсов, но несколько забегая вперед, обращаю внимание на строчку 33, где указан внутренний интерфейс для NAT. В строках с 45 по 55 приведено описание интерфейса Dialer0. Это виртуальный интерфейс, через который и осу-
Router#configure terminal Enter configuration commands, one per line. End with CNTL/Z. Router(config)#hostname Home Home(config)#
Как мы видим, отображение приглашения несколько изменилось. Теперь займемся безопасностью. Отключим управление маршрутизатором через http и https, а также проприетарный Cisco Discovery Protocol, который нам в данном случае абсолютно не нужен.
¹4, àïðåëü 2005
49
администрирование ществляется подключение к PPPoE. Хочу обратить особое внимание на 53 и 54 строки, где нужно задать имя и пароль, выданные вам провайдером. А также на строку 55 – без которой маршрутизатор не получит IP-адресов DNSсерверов провайдера. Помимо описания Dialer0 к настройке PPPoE относятся также строки 25-29 и 77. За более подробной информацией я рекомендую обратиться к документации и сайту www.cisco.com. Последнее, о чем необходимо упомянуть, – строка 59, где задается маршрут по умолчанию, указывающий на Dialer0.
Настройка NAT, DHCP и брандмауэра Переходим к настройке NAT. Тут в IOS все достаточно просто. Помимо 33 строки, про которую уже упоминалось во время разбора конфигурации внутреннего интерфейса, за NAT отвечают строки 57 и 64. Как мы видим, 57 строка ссылается на 64, в которой описан так называемый access-list, определяющий внутренние IP-адреса, которые мы будем транслировать во внешний на интерфейсе Dialer0. С помощью тех же «листов доступа» мы в строках с 65 по 76 на Dialer0 организуем простейший межсетевой экран, безусловно пропуская icmp, www, smtp, pop3, ftp и dns-трафик. Также при уже установленной tcp-сессии будем принимать пакеты с номером порта, большим чем 1023. Кроме того, в строке 49 определен IP-адрес рабочей станции, с которой разрешен доступ по telnet для управления маршрутизатором. Если вам понадобится подкорректировать правила – опять же смотрите документацию. Последнее, что мы рассмотрим, – это настройку DHCPсервера. В строке 17 мы указываем область, выделенную под статические IP-адреса. В нее должен попасть и IP-адрес внутреннего интерфейса маршрутизатора. В строках 19 – 23 описан пул адресов нашего DHCP-сервера. Командой import all клиентам передаются полученные через Dialer0 сетевые настройки. В качестве шлюза по умолчанию выступает внутренний интерфейс с IP-адресом 192.168.0.88.
Ðèñóíîê 2
Полный конфигурационный лист В заключение статьи приведу полную конфигурацию маршрутизатора, полученную по команде show running-config. В листинге вы можете увидеть часть команд, которые не были описаны в статье, они или были сформированы самим устройством или не имеют принципиального значения для первого знакомства с маршрутизатором. Для уточнения значения этих команд рекомендую обратиться к документации. 01: 02: 03: 04:
50
version 12.3 no service pad service timestamps debug uptime service timestamps log uptime
05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91:
service password-encryption ! hostname Home ! enable secret xxxxxx enable password xxxxxx ! username homeuser password xxxxxx aaa new-model ! aaa session-id common ip subnet-zero ip dhcp excluded-address 192.168.0.1 192.168.0.90 ! ip dhcp pool CLIENT import all network 192.168.0.0 255.255.255.0 default-router 192.168.0.88 lease 0 2 ! vpdn enable ! vpdn-group 1 request-dialin protocol pppoe ! interface Ethernet0 ip address 192.168.0.88 255.255.255.0 ip nat inside ip tcp adjust-mss 1452 no cdp enable hold-queue 32 in ! interface Ethernet1 no ip address no ip unreachables ip tcp adjust-mss 1452 duplex auto pppoe enable pppoe-client dial-pool-number 1 ! interface Dialer0 ip address negotiated ip access-group 110 in ip mtu 1492 ip nat outside encapsulation ppp dialer pool 1 dialer-group 1 ppp chap hostname homehostname ppp chap password xxxxxx ppp ipcp dns request ! ip nat inside source list 102 interface Dialer0 overload ip classless ip route 0.0.0.0 0.0.0.0 Dialer0 no ip http server no ip http secure-server ! access-list 49 permit 192.168.0.13 access-list 102 permit ip 192.168.0.0 0.0.0.255 any access-list 110 permit tcp any any gt 1023 established access-list 110 permit tcp any any eq www access-list 110 permit tcp any any eq smtp access-list 110 permit tcp any any eq pop3 access-list 110 permit tcp any any eq ftp access-list 110 permit tcp any any eq ftp-data access-list 110 permit tcp any any eq domain access-list 110 permit udp any any eq domain access-list 110 permit udp any eq domain any access-list 110 permit tcp any eq domain any access-list 110 permit icmp any any access-list 110 deny ip any any dialer-list 1 protocol ip permit no cdp run ! line con 0 exec-timeout 120 0 password xxxxxx no modem enable stopbits 1 line aux 0 line vty 0 4 access-class 49 in exec-timeout 120 0 password xxxxxx ! end
администрирование
SLACKWARE НА РАКЕТНОМ ТОПЛИВЕ ИЛИ ОБЗОР VectorLinux 5.0.1 SOHO ...Built on Slackware Linux, one of the most stable and best performing distributions available today... http://distrowatch.com/?newsid=02042
СЕРГЕЙ ЯРЕМЧУК Пока идут горячие споры по поводу возможности использования GNU/Linux на рабочих столах пользователей, практически все основные производители дистрибутивов уже представили соответствующие версии своих продуктов. В последнее время наметилась устойчивая тенденция к появлению версий дистрибутивов, направленных на конкретную целевую аудиторию, которая, очевидно, будет наблюдаться и в дальнейшем. Причин достаточно. Так, пользователи не желают платить за ненужные диски, особенно когда задача состоит в простом знакомстве с новинками (в этом случае хватит и LiveCD), с другой стороны, на сервере совсем не нужны графические оболочки и различные мультимедиапроигрыватели. К тому же очень жесткие требования к защите серверов на домашнем компьютере будут скорее мешать, так как пользователю важно в первую очередь удобство. Среди других позиций, которые хотелось бы иметь в дистрибутиве, ориентированном на неподготовленного пользователя, – простая и понятная программа установки и максимально возможная поддержка оборудования, включая различные USB, Bluethooth и беспроводные устройства, TV-тюнеры, не говоря уже о принтерах, сканерах и программах записи CD и DVD. Далее хотелось бы иметь нормальную локализацию и понятную программу постустановочной настройки дистрибутива, а также софт на все (или почти на все) случаи жизни. Еще не хочется долго искать нужное приложение в меню, т.к. даже при минимальной установке Linux количество различных программ переваливает за тысячу, и пользователю необходимо иметь хоть какую-то подсказку, что у него установлено и для чего оно предназначено. Наиболее популярные производители настольных версий Linux, вроде SuSE, Mandrake, Fedora, пытаются разместить все приложения на трех-пяти дисках, и пользователю приходится долго выбирать из длинного списка то, что ему действительно нужно. Создатели канадского VectorLinux SOHO (http://www.vectorlinux.com), основой которого послужил Slackware, решили ограничиться одним-единственным диском, на который поместилась полноценная рабочая среда со всеми необходимыми библиотеками и приложениями. В феврале 2005 года был анонсирован 5.0 релиз этого дистрибутива, о котором и пойдет речь в статье. Как видно из названия SOHO (Small Office/Home Office), этот дистрибутив предназначен для использования в настольных компьютерах. Главная задача SOHO версии VectorLinux – создать удобную рабочую среду с хорошей интеграцией приложений, работающую быстро, простую в установке и не
¹4, àïðåëü 2005
занимающую много места. Последнее реализуется за счет тщательного отбора утилит, в которых реализованы наибольшая функциональность и удобство с одновременным уменьшением количества дублирующих приложений. Дистрибутив свободно доступен с ftp-архива в виде iso-образа, кроме того, продается в онлайн-магазинах по цене 26.97 USD. Последний вариант комплектуется extra-диском, содержащим дополнительные приложения (ядро 2.6.10, RealPlayer, Opera, Adobe Acrobat Reader и пр.) и книгу по установке дистрибутива. Кроме SOHO, у VectorLinux есть и другие варианты. Так Standard Edition, размером 350 Мб, содержит минимально необходимую среду, его главный девиз – скорость и легкость. Версия Deluxe Edition также имеет диск с дополнительным софтом и брошюру, содержащую информацию об установке, и во многом напоминает SOHO, но составом приложений предназначена больше для профессионального использования. И наконец, «нестабильная ветка» Dynamite Edition используется в основном разработчиками, на ней отрабатываются все нововведения, которые, возможно, появятся в следующих релизах VectorLinux. Вероятно, «динамит» является самым дружелюбным Slackware на сегодняшний день. Также хотелось бы отметить, что не так давно проект обзавелся более-менее понятной документацией (имеющейся в том числе и на диске, правда, на английском языке), позволяющей разобраться с особенностями работы в VectorLinux. Единственный недостаток VectorLinux, который в наших условиях является критичным, – это полное отсутствие локализации, в системе доступен только английский интерфейс. Поэтому ею придется заниматься самому, взяв необходимые пакеты из Slackware.
Установка Устанавливать VectorLinux можно несколькими способами, в том числе и используя скачанный iso-образ без записи его на диск. Начинающие пользователи не очень любят Slackware, в том числе и за программу-инсталлятор. Надо отметить, что в VectorLinux, как и в родительском дистрибутиве, программа установки не блещет графическими красотами: все та же простота и управляемость. Но создатели проделали хорошую работу и упростили то, что упростить, казалось, уже невозможно. Мне приходилось иметь дело с предыдущими версиями VectorLinux. Почти полгода на моем компьютере стояла версия SOHO 3.2. Тогда установка заключалась в распаковке 650-мегабайтового архива в указанный раздел, и единственное действие, которое необхо-
51
администрирование димо было сделать пользователю, – это создать его при помощи cfdisk, отформатировать под необходимую файловую систему и указать на него программе. Причем можно было использовать только одну точку монтирования – корневую, что было не совсем удобно. В версии 5.0 у пользователя, производящего установку, выбор несколько больше. Так можно запросто восстановить загрузчик, для чего достаточно выбрать нужный пункт меню. Для создания разделов используется GNUParted (в пункте меню RESIZE) и cfdisk, но теперь в ходе установки позволяется выбрать две точки монтирования (корневой и /home, рис. 1), которые можно отформатировать под reiserfs, ext2 или ext3.
(VectorLinux System Menu). Полная установка занимает около 2 Гб. Оборудование определилось нормально, проблема была только с мышью. Причем здесь по сравнению с версией 3.2 положение даже ухудшилось. Тогда внешняя USBмышь исправно работала, а touchpad пришлось настраивать, вручную изменив параметр Protocol с IMPS/2 на PS/2. Теперь же выяснилось, что не работают обе мыши. Также не советую выбирать русскую раскладку клавиатуры для X-Window, иначе после перезагрузки, которая последует после окончания настроек, в систему вы не попадете, потому что не сможете изменить раскладку. Все это лучше будет сделать потом, вручную подправив файл /etc/X11/ xorg.conf. Что ж, удобство программы установки VectorLinux весьма спорно, если учесть ориентацию дистрибутива на SOHO-пользователя. Но поскольку процессом инсталляции обычно заправляют администраторы, то простота интерфейса является, наоборот, преимуществом, к тому же времени на установку уходит минимум. Начинающие пользователи редко устанавливают систему сами, доверяя эту процедуру товарищам поопытнее.
Работа в VectorLinux
Ðèñóíîê 1
Если что-то не выходит, то, выбрав соответствующий пункт меню, можно выйти в оболочку (причем это будет полноценная оболочка с mc и прочими удобствами), где будет доступен fdisk и другие утилиты для форматирования и проверки указанных выше файловых систем. Также пользователи получили некоторую свободу в выборе программ. Предлагаются две группы приложений. В первую, названную «Bulk», входит три пакета: veclinux, содержащий базовую систему и основные приложения, OpenOffice, назначение которого понятно из названия, и XAMPP, представляющий из себя удобную инфраструктуру для программирования и тестирования веб-приложений (Apache + MySQL + PHP + ProFTP и пр.). Вторая группа packages включает общим счетом 61 приложение, представляющие в большинстве своем альтернативу входящим в базовый комплект. Среди них MPlayer, AmaroK, Kaffeine, XMMS, Sylpheed, GIMP, Inkscape, Firefox (с плагинами Flash, Java и Mplayer), QCad и пр. После копирования файлов установка собственно и заканчивается, система предлагает извлечь диск и перезагрузиться. После чего наступает этап постинсталляционной настройки, в ходе которой необходимо будет определиться, куда устанавливать загрузчик, настроить X.Org, временной пояс, сеть, звук, задать пароль root и создать дополнительных пользователей, а также выбрать вариант работы (текстовый или графический, настольный или серверный). При выборе графического режима работы сразу же загружает X-Window. В серверном варианте, дополнительно стартуют Samba и sshd. Можно все настроить сейчас, но лучше – потом, загрузившись и воспользовавшись утилитой VASM
52
Основной вывод после первого моего знакомства с Vector Linux заключался в том, что это удобный настольный дистрибутив. Буквально с первых шагов чувствовалась забота о пользователе, в консоли выводились подсказки, на рабочем столе лежали «нужные» ярлыки. Особенно понравилось меню Midnight Commander, в котором были дополнительные пункты, позволяющие конвертировать, установить, распаковать, создавать пакеты для установки в дистрибутиве. Причем работа с rpm, deb и tgz-пакетами была реализована так, что пользователь вообще не задумывался о разнице между ними. Плюс дистрибутив имел свой аналог aptget из Debian, который назывался vec-get. Вопрос о быстроте как-то не стоял, очевидно, быстродействие версии 3.2 было приблизительно на одном уровне с другими дистрибутивами. Хотя, учитывая продуманные загрузочные скрипты и то, что без спроса не один сервис не запускался, грузился он действительно быстро. К версии 5.0 применим только один термин – ракета. По сравнению с ней остальные – это медленно ползущие черепахи. Рядом с ним по быстродействию можно поставить разве что Gentoo stage3. Я довольно редко работаю в KDE, которую считаю хоть и удобной, но все же несколько медленной средой. В случае с VectorLinux реакция системы была так быстра, что от этих предрассудков не осталось и следа. И это при том, что среди остальных вариантов SOHO считается самым медленным, отчасти от того, чтобы сделать пребывание пользователя более удобным и комфортным. Огорчает то, что в ранних версиях дистрибутива пакеты для локализации KDE хотя и не устанавливались вместе с системой, но все же имелись на диске. Теперь их, как было отмечено выше, просто нет. Если же KDE (рис. 2) все равно покажется слишком медленным, то пользователю предлагается альтернатива в виде IceWM. Причем его можно загрузить, так сказать, в чистом виде, а можно и с включенным ROX-Filer (http://rox.sourceforge.net), который расширяет возможности IceWM, добавляя поддержку иконок рабочего стола.
администрирование Обычно у пользователей возникает проблема при монтировании/размонтировании сменных носителей. В Vector Linux работа с такими устройствами реализована на должном уровне, а при помощи контекстного меню, вызываемого правой кнопкой мыши, можно всегда отмонтировать устройство даже в том случае, когда оно занято. В том числе успешно получается проделать это и CD-ROM.
ивает сеть, принтеры, межсетевой экран, устанавливает загрузчик, производит резервное копирование файлов и пр. Как видите, разработчики собрали в одной простой утилите все возможные настройки, с которыми обычно приходится иметь дело пользователю. Естественно, есть fdisk, Центр Управления KDE, GuardDog (настройка межсетевого экрана) и прочие утилиты, предназначенные для настройки отдельных параметров и сервисов, но в VASM сочетается одновременно интеграция возможностей и простота, позволяющая без труда понять, как сделать ту или иную операцию, что в совокупности делают его хорошим орудием. Хотя до возможностей SUSE YaST и Mandrake Control Center он пока не дотягивает. В последних версиях дистрибутива появилась еще одна утилита, на которую возложена задача по установке/удалению приложений, т.е. по работе с пакетами, называющаяся VLAPT.
Ðèñóíîê 2
Дистрибутив, кроме стандартных утилит, для настройки, имеет и свой конек – VASM (рис. 3), который появился в версии 2.0 и постоянно модернизировался с учетом предложений пользователей.
Ðèñóíîê 4
Ðèñóíîê 3
Начиная с версии 3.2, SOHO VASM получил графический интерфейс (ранее можно было работать только из консоли), некоторые пункты стали доступны в виде отдельных команд. При вызове проверяется значение переменной $DISPLAY и в зависимости от того, в каком режиме (консоль или X-Window) его запускают, используется соответствующий интерфейс. Некоторые надстроечные функции, предоставляемые скриптом, будут доступны только пользователю root, а часть параметров (настройка X-сервера, обнаружение нового оборудования) работают только в консоли. VASM позволяет автоматически отключить, определить и настроить новое оборудование, берет на себя работу с пользователями (добавление, удаление, изменение пароля, быстрые команды /sbin/vuser, /sbin/vuseradd, /sbin/ vuserdel и /sbin/vpasswd), конфигурацию X-Window и настройку менеджера входа в систему, уровень запуска системы, задает сервисы, запускаемые при загрузке, настра-
¹4, àïðåëü 2005
Базируется VLAPT на slapt-get. В более ранних версиях эту работу можно было сделать при помощи VASM, vec-get, пунктов меню Midnight Commander (традиционные утилиты от Slackware вроде installpkg, upgradepkg, естественно, тоже доступны). Сейчас все лишнее убрано, и, очевидно, в дальнейшем пользователю, не желающему вникать в особенности работы slapt-get и других консольных утилит из pkgtools, будет предложен только VLAPT. О конкретных приложениях особого смысла говорить нет. Достаточно отметить, что поставляемые по умолчанию в дистрибутиве утилиты охватывают весь спектр потребностей среднестатистического пользователя. Меню организовано традиционно, а по клику на файле вызывается сопоставленное приложение. Так, веб-браузером по умолчанию является Firefox, как альтернатива Konqueror. И все. Пользователю не нужно будет выбирать между 5 разными браузерами. Аналогично и с остальными приложениями. В VectorLinux нет десятка текстовых редакторов, проигрывателей музыкальных и видеофайлов, почтовых клиентов. Пользователю предоставлен необходимый, но удобный в работе минимум. В общем, он будет чувствовать себя здесь достаточно комфортно. Пора подвести итоги. Подойдет ли VectorLinux SOHO начинающему пользователю? Сомнительно, хотя в уже настроенной системе ему будет трудно запутаться. Но он придется по вкусу пользователю с небольшим уровнем подготовки или желающему освоить работу в Linux, использующему Slackware, но считающему его несколько неудобным или непонятным.
53
администрирование
РЕИНКАРНАЦИЯ ДАННЫХ
СЕРГЕЙ СУПРУНОВ Трудно представить себе предприятие или организацию, где не использовались бы базы данных для хранения информации. Это и списки инвентаризации основных средств, и базы абонентов – пользователей услуг предприятия, и т. п. На российских просторах все еще огромной популярностью пользуется формат DBF, в частности, именно в нем хранит свои таблицы старый добрый FoxPro. Тем не менее жизнь не стоит на месте, рано или поздно возникает вопрос о переносе всех накопленных данных на более функциональные СУБД. В данной статье рассматривается несколько способов осуществления такой миграции из FoxPro в БД PostgreSQL. Способы различаются как сложностью реализации (хотя это довольно субъективный критерий), так и степенью автоматизации. Естественно, перечень возможных реализаций никоим образом не ограничивается приведенным здесь. Итак, задача – перенести информацию, хранящуюся в формате DBF (СУБД FoxPro 2.6), в базу данных PostgreSQL (используемая версия сервера – 8.0.1, операционная система – FreeBSD 5.3). Прежде чем приступать к решениям, рассмотрим, что представляет собой DBF-файл.
Формат DBF Формат DBF достаточно прост: 32 байта заголовка файла, «оглавление» таблицы, данные. В таблице представлен формат заголовка с кратким описанием каждого поля: Òàáëèöà 1. Ñòðóêòóðà çàãîëîâêà DBF-ôàéëà
Далее следует оглавление таблицы – каждые 32 байта описывают одно поле данных (имя поля, тип данных, длину поля и т. д.) (см. таблицу 2). «Оглавление» завершается символом 0x0D, после которого следуют записи данных. Самый первый байт каждой записи – признак удаления. Если запись удаляется ко-
54
мандой delete, она физически остается в файле, а в поле признака удаления заносится символ 0x2A («*»). Такая запись считается помеченной на удаление и по умолчанию в операциях не участвует. Физическое удаление осуществляется только в результате так называемой упаковки (pack) таблицы данных. Таким образом, нужно помнить, что длина каждой записи будет определяться суммой длин полей плюс один байт. Òàáëèöà 2. Ñòðóêòóðà «îãëàâëåíèÿ» òàáëèöû
Импорт внешних файлов в PostgreSQL СУБД PostgreSQL позволяет осуществлять загрузку данных из внешних файлов и экспорт во внешние файлы с помощью команды COPY. Ее синтаксис следующий: serg=> \h copy Команда: COPY Описание: копировать данные между файлом и таблицей Синтаксис: COPY tablename [ ( column [, ...] ) ] {FROM | TO} { 'filename' | STDIN } [ [ WITH ] [ BINARY ] [ OIDS ] [ DELIMITER [ AS ] 'delimiter' ] [ NULL [ AS ] 'null string' ] [ CSV [ QUOTE [ AS ] 'quote' ] [ ESCAPE [ AS ] 'escape' ] [ FORCE NOT NULL column [, ...] ]
Для загрузки данных из внешних файлов используется команда COPY FROM. Таблица tablename, в которую будет осуществляться загрузка, должна существовать и иметь поля, тип которых соответствует формату полей загружаемого текстового файла. Обратите внимание, что исходная таблица и таблица PostgreSQL не обязательно должны иметь одинаковую структуру – в процессе подготовки данных, как будет показано ниже, и количество и типы экспортируемых полей могут меняться. Например, в процессе экспорта исходное поле типа Date может быть записано в
администрирование файл в виде «2005-04-04», что позволит в дальнейшем загрузить его также в поле даты. А может принять вид «4 апреля 2005 года», и его уже можно будет импортировать только в текстовое поле. Опции BINARY и OIDS в данном случае нас не интересуют – они могут быть полезны, когда и импорт, и экспорт выполняется в PostgreSQL. Текстовый формат загружаемого файла достаточно прост – каждая запись должна размещаться в одной строке, поля разделяются с помощью одиночного символа «delimiter». Если символ-разделитель встречается внутри поля данных, он должен экранироваться символом «\». Одиночный символ «\», встречающийся в данных, должен также экранироваться, чтобы исключить его специальную трактовку. Начиная с версии PostgreSQL 8.0 поддерживается также загрузка из CSV-файла, который является, по сути, файлом с разделителем (обычно – запятая), с той разницей, что поля данных для исключения неоднозначности при обработке символов могут заключаться в кавычки. Еще один параметр, NULL AS, задает символьную строку, которая будет рассматриваться как значение NULL. По умолчанию используется последовательность «\N». Нужно заметить, что при работе в терминале psql доступны две команды: COPY и \COPY. Первая – это SQL-команда, выполняемая сервером, вторая – команда интерактивного клиента. Разница между ними в правах, с которыми они выполняются. В первом случае возможности доступа определяются правами процесса postmaster, во втором – правами пользователя, запустившего psql. Обратите внимание, что если в процессе загрузки возникает ошибка (например, в какой-то строке не хватает поля или имеется лишнее, формат данных не соответствует типу поля, в которое осуществляется запись и т. д.), то ни одна из записей в итоговую таблицу не попадает, то есть импорт выполняется как единый транзакционный блок.
Несколько слов о кодировках Как всегда, если речь идет о переносе данных между различными системами, встает вопрос о преобразовании используемых кодировок. FoxPro обычно хранит данные в cp866 (FoxPro for DOS) или в cp1251 (FoxPro for Windows). В то же время кодировка баз PostgreSQL может быть иной (у меня, например, это koi8-r). Решить эту проблему можно одним из трех способов: ! Создать базу данных PostgreSQL с кодировкой, соответствующей кодировке DBF-файлов. Это выполняется с помощью ключа ENCODING команды CREATE DATABASE. Однако при этом могут возникнуть дополнительные трудности при обработке данных, если кодировка БД не соответствует установленной локализации операционной системы. ! Если сервер будет использоваться преимущественно как сервер баз данных, а БД будет хранить в основном данные, импортированные из FoxPro, то имеет смысл сразу «подогнать» кодировку операционной системы и базы данных под кодировку файла DBF. ! Наиболее универсальный способ – перекодировка данных на стадии импорта.
¹4, àïðåëü 2005
Первые два способа особых сложностей вызвать не должны, поэтому в дальнейшем сосредоточимся на третьем, и будем осуществлять преобразование данных из cp866 в koi8-r в процессе переноса данных.
Замечание о memo-полях FoxPro использует поля типа MEMO для хранения больших текстовых данных неопределенного размера во внешнем файле (обычно используется расширение fpt). Работа с этими полями имеет ряд особенностей, но о них поговорим в следующей части статьи, поэтому сейчас будем полагать, что экспортируемые таблицы полей такого типа не содержат.
Путь 1: подготовка данных с помощью FoxPro СУБД FoxPro предоставляет пользователю достаточно мощный язык программирования, чем мы и воспользуемся. В данном разделе мы напишем несложную программу, которая будет формировать текстовый файл с разделителями, пригодный для импорта в PostgreSQL с помощью команды COPY. В качестве разделителя будем использовать символ табуляции. Ëèñòèíã 1. Ïðîãðàììà dbf2pg.prg íà FoxPro *  FoxPro êîììåíòàðèè íà÷èíàþòñÿ ñèìâîëîì «*» * Óñòàíàâëèâàåì ôîðìàò äàòû SET DATE TO YMD SET CENTURY ON * Îòêðûâàåì òàáëèöó äëÿ ýêñïîðòà USE s_cats ALIAS tab * Îïðåäåëÿåì ðàçäåëèòåëü êàê ñèìâîë òàáóëÿöèè m.delimiter = CHR(9) * Îïðåäåëÿåì ñòðîêè äëÿ ïåðåêîäèðîâêè â koi8 !Ö¤ ·°¹ð¸' m.koiabcb = 'ñò¢÷ôõ¡·ùúûüýþÿ¨ªº¯¿öøó! m.koiabcs = ' ' m.koiabc = m.koiabcb + m.koiabcs m.dosabcb = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß' m.dosabcs = 'àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ' m.dosabc = m.dosabcb + m.dosabcs * Óêàçûâàåì êîäèðîâêó m.dstcp = 'koi8' * Ñîçäàåì ðåçóëüòèðóþùèé ôàéë è îòêðûâàåì åãî * íà çàïèñü (äåñêðèïòîð – â ïåðåìåííîé m.txf) m.txf = FCREATE('table.txt') * Äåëàåì òàáëèöó àêòèâíîé SELECT tab * Öèêë ïî âñåì çàïèñÿì òàáëèöû SCAN * Ôîðìèðóåì ñòðîêó, óäàëÿÿ ëèøíèå ïðîáåëû m.temp = ALLTRIM(uniqueid) + m.delimiter + ; ALLTRIM(user) + m.delimiter + ; ALLTRIM(city) + m.delimiter + ; ALLTRIM(address) + m.delimiter + ; ALLTRIM(tariff) + m.delimiter + ; ALLTRIM(category) + m.delimiter + ; IIF(EMPTY(date), '\N', ; STRTRAN(DTOC(date), '/', '-')) * Åñëè âñòðå÷àåòñÿ òàáóëÿöèÿ – ìåíÿåì íà 4 ïðîáåëà m.temp = STRTRAN(m.temp, CHR(9), SPACE(4)) IF m.dstcp == 'koi8' * Åñëè â koi8, òî èñïîëüçóåì ñâîþ ôóíêöèþ m.temp = dos2koi(m.temp) ELSE * èíà÷å – ïîëüçóåìñÿ øòàòíîé ôóíêöèåé ïåðåêîäèðîâêè m.temp = CPCONVERT(866, m.dstcp, m.temp) ENDIF * Ýêðàíèðóåì ñèìâîëû '\'
55
администрирование m.temp = STRTRAN(m.temp, '\', '\\') * Çàïèñü ïîëó÷åííîé ñòðîêè â ôàéë =FPUTS(m.txf, m.temp) ENDSCAN =FCLOSE(m.txf) USE IN tab *=============================================== * Ôóíêöèÿ ïåðåêîäèðîâêè èç cp866 â koi8-r PROCEDURE dos2koi PARAMETER m.string m.res = '' FOR m.i = 1 TO LEN(m.string) m.pos = AT(SUBSTR(m.string, m.i, 1), m.dosabc) IF m.pos > 0 m.res = m.res + SUBSTR(m.koiabc, m.pos, 1) ELSE m.res = m.res + SUBSTR(m.string, m.i, 1) ENDIF ENDFOR RETURN m.res
Все здесь достаточно просто – сканируем таблицу, для каждой записи формируем строку, содержащую данные, разделенные указанным в начале программы символом. Если в данных встречается символ табуляции – заменяем его четырьмя пробелами (не самое красивое решение, но вполне пригодное). Повозиться приходится с перекодировкой. Если PostgreSQL работает в cp1251, то для преобразования кириллицы можно воспользоваться штатной функцией FoxPro CPCONVERT. Перекодировать в koi8-r она, к сожалению, не умеет, поэтому здесь придется использовать самописную функцию dos2koi. Смысл ее в том, чтобы посимвольно заменить все, что входит в строку m.dosabc символами из m.koiabc, расположенными на тех же местах. Вообще, чтобы не возиться с перекодировкой силами FoxPro (к слову, приведенная выше функция будет работать очень медленно), можно сформировать файл в исходной кодировке, а затем пропустить его через внешний перекодировщик (когда-то мне попадался замечательный плагин к FAR). После того как текстовый файл сформирован, готовим таблицу в базе PostgreSQL и выполняем команду COPY: serg=> create table s_cats(uid char(10), catname char(35)); CREATE TABLE serg=> \copy s_cats from '/usr/home/serg/test/psql/TABLE.TXT' \. serg=> select * from s_cats; uid | catname ------------+------------------------------------P0RH0S0SXJ | Без льгот P0RH0S0SXN | Без начисления абонплаты P0RH0S0SXR | ВОВ инвалиды .. .. ..
К достоинствам рассмотренного способа можно отнести то, что на этапе подготовки файла мы можем выполнить любую предварительную обработку данных – разбить одно поле (например, «Абонент») на несколько («Фамилия», «Имя», «Отчество»), объединить несколько полей в одно, выбрать для экспорта только некоторые поля. Недостатки – достаточно большой объем ручной работы, поскольку программу dbf2pg.prg каждый раз нужно править под конкретные поля экспортируемой таблицы. Кроме того, обработку всего, что не касается данных в таблицах, FoxPro выполняет сравнительно медленно. Например, преобразование таблицы абонентов, содержащей 6 символьных полей и около 5000 записей, выполняется порядка 40 секунд.
56
Путь 2: формирование файла с разделителями с помощью сценария на Python Если у вас нет под рукой FoxPro или вы с ним не очень дружны, то преобразование можно выполнить с помощью любого другого языка программирования, правда, в этом случае DBF-файл придется разбирать вручную, отыскивая поля данных в соответствии с информацией заголовка и «оглавления». В данном разделе мы воспользуемся языком Python, а в следующем аналогичные действия реализуем на Perl. Из информации заголовка (первые 32 байта) интерес для нас представляют только количество записей в таблице и смещение первой записи, чтобы не вычислять эти значения лишний раз. Сценарий будет выглядеть следующим образом: Ëèñòèíã 2. Ñöåíàðèé dbf2pg.py – ðó÷íîé ðàçáîð ôàéëà DBF #!/usr/local/bin/python # Êëàññ äëÿ õðàíåíèÿ èíôîðìàöèè î ïîëÿõ òàáëèöû class field: def __init__(self): self.name = '' self.type = 'C' self.len = 0 self.dec = 0 self.pos = 0 # Ôóíêöèÿ ôîðìèðîâàíèÿ ôàéëà ñ ðàçäåëèòåëÿìè def dbf2pg(fname): # Îòêðûâàåì dbf-Ôàéë â áèíàðíîì ðåæèìå dbf = open(fname, 'rb') # Ñ÷èòûâàåì çàãîëîâîê head = dbf.read(32) # Âûáèðàåì èç çàãîëîâêà ÷èñëî çàïèñåé dblen = ord(head[7]) * 16777216 + ↵ ord(head[6]) * 65536 + ord(head[5]) * 256 + ↵ ord(head[4]) # è ïîçèöèþ ïåðâîé çàïèñè posfirst = ord(head[9]) * 256 + ord(head[8]) wexit = 0 num = 0 totlen = 1 fields = [] while not wexit: # ×èòàåì èíôîðìàöèþ î ïîëÿõ òàáëèöû line = dbf.read(1) if ord(line) == 0x0D: # Åñëè ïåðâûé ñèìâîë – 0x0D, òî âûõîä – # «îãëàâëåíèå» çàêîí÷åíî wexit = 1 else: # Èíà÷å äî÷èòûâàåì äî 32-õ ñèìâîëîâ line = line + dbf.read(31) # Íîâûé îáúåêò êëàññà field fld = field() # Èìÿ ïîëÿ – ñíà÷àëà äî ïåðâîãî ñèìâîëà 0x00 fld.name = line[:line.find('\0')] # Òèï ïîëÿ – 11-é áàéò fld.type = line[11] # Ñìåùåíèå ïîëÿ äàííûõ îò íà÷àëà çàïèñè fld.pos = ord(line[15]) * 16777216 + ↵ ord(line[14]) * 65536 + ↵ ord(line[13]) * 256 + ↵ ord(line[12]) # Äëèíà fld.len # Äëèíà fld.dec
ïîëÿ = ord(line[16]) äðîáíîé ÷àñòè = ord(line[17])
# Çàíîñèì èíôîðìàöèþ â ìàññèâ
администрирование fields.append(fld) num = num + 1 totlen = totlen + fld.len if withcommand: # Åñëè ïåðåìåííàÿ èñòèííà, òî ôîðìèðóåì êîìàíäó # íà ñîçäàíèå òàáëèöû cmd = 'CREATE TABLE %s (' % tablename for i in range(num): fld = fields[i] cmd = cmd + fld.name + ' ' if fld.type == 'C': cmd = cmd + ↵ 'char(' + str(fld.len) + '), ' elif fld.type == 'D': cmd = cmd + 'date, ' elif fld.type == 'N' : cmd = cmd + ↵ 'numeric(' + str(fld.len) + ↵ ',' + str(fld.dec) + '), ' # Ïîñëåäíþþ çàïÿòóþ è ïðîáåë ìåíÿåì # íà çàêðûâàþùóþ ñêîáêó è òî÷êó ñ çàïÿòîé cmd = cmd[:-2] + ');' print cmd # Ôîðìèðóåì êîìàíäó ÷òåíèÿ äàííûõ èç ïîòîêà ââîäà cmd = 'COPY users FROM stdin;' print cmd # Ôîðìèðóåì ñàì ïîòîê ââîäà dbf.seek(posfirst) for rec in range(dblen): if dbf.read(1) != '*': # Åñëè çàïèñü íå ïîìå÷åíà íà óäàëåíèå, òî îáðàáîòêà: line = '' for i in range(num): # Öèêë ïî âñåì ïîëÿì fld = dbf.read(fields[i].len) # Åñëè äàòà – ïðåîáðàçóåì # â ôîðìàò YYYY-MM-DD # èç ôîðìàòà YYYYMMDD if fields[i].type == 'D': fld = fld[:4] + '-' + ↵ fld[4:6] + '-' + ↵ fld[6:] # Åñëè äàòà ïóñòàÿ, ìåíÿåì # åå íà çíà÷åíèå NULL if fld == ' - - ': fld = '\N' # Äëÿ ïóñòûõ ÷èñëîâûõ ïîëåé # ñòàâèì çíà÷åíèå 0 if fields[i].type == 'N' ↵ and fld[-1] == ' ': fld = '0' # Ýêðàíèðóåì ñèìâîë ‘\’, # åñëè òàêîâîé âñòðå÷àåòñÿ # â êîíöå ïîëÿ, # ò.ê. îí ýêðàíèðóåò ðàçäåëèòåëü if fld[-1] == '\\': fld = fld + '\\' # Äëÿ ñòðîêîâûõ ïîëåé âûïîëíÿåì # ïåðåêîäèðîâêó if fields[i].type == 'C': fld = unicode(fld, ↵ 'cp866').encode('koi8-r') # Äîïèñûâàåì ê ñòðîêå çàïèñè # ÷åðåç ðàçäåëèòåëü line = line + fld + delimiter # Âûâîäèì ïîëó÷åííóþ ñòðîêó, îòðåçàâ # ïîñëåäíèé ðàçäåëèòåëü print line[:-1]
else: # Åñëè çàïèñü ïîìå÷åíà íà óäàëåíèå, # òî ïðîñòî äî÷èòûâàåì åå îñòàòîê, # íè÷åãî íå îáðàáàòûâàÿ dbf.read(totlen - 1) dbf.close
¹4, àïðåëü 2005
# Åñëè ôîðìèðóþòñÿ êîìàíäû äëÿ \i, òî çàêàí÷èâàåì # äàííûå ñòðîêîé ‘\.’ if withcommand: print '\\.' # Óñòàíàâëèâàåì íàñòðîå÷íûå ïåðåìåííûå delimiter = "\t" withcommand = 1 tablename = 'users' # âûçûâàåì ôóíêöèþ ïðåîáðàçîâàíèÿ dbf2pg('users.dbf')
Вывод в данном случае направляется в стандартный поток stdout, поэтому для формирования файла следует использовать перенаправление: $ ./dbd2pg.py > USERS.TXT
При переменной withcommand, установленной в 0, мы получаем такой же файл с разделителями, как и ранее с помощью FoxPro. Соответственно импортироваться в PostgreSQL информация будет аналогично. Однако обратите внимание, что теперь мы имеем всю информацию о полях данных, включая тип поля и его название. Так почему бы не воспользоваться этим для автоматического формирования таблицы PostgreSQL нужной структуры? Именно эта идея и реализуется, если переменной withcommand присвоить значение 1. При этом загрузка данных будет осуществляться по тому же принципу, какой используется при восстановлении из текстовой резервной копии: при выполнении команды «\i файл» в терминале psql содержимое указанного файла будет рассматриваться как ввод с клавиатуры в интерактивном режиме. Таким образом, мы формируем команду CREATE TABLE в соответствии с информацией о названиях и типах полей таблицы, а затем команду COPY .. FROM stdin, которая будет считывать последующие данные, пока не обнаружит строку «\.». Здесь следует обратить внимание на то, что имена полей должны быть допустимы в PostgreSQL. Так, например, имя USER, вполне нормальное для FoxPro, PostgreSQL рассматривает как служебное слово, не позволяя создавать таблицу с таким столбцом. Впрочем, это ограничение можно обойти, если имена полей заключить в кавычки – в таком случае любое имя будет восприниматься «как есть», правда, и в дальнейшей работе нужно будет использовать кавычки и строго соблюдать регистр символов. Еще одно замечание – теперь, поскольку таблицу мы создаем автоматически, на момент импорта она не должна существовать. Рассмотренный способ хотя и требует несколько больших усилий на разработку сценария, но заметно упрощает перенос данных, автоматизируя создание нужных таблиц. При этом работа идет заметно быстрее – на обработку той же таблицы абонентов тратится менее секунды.
Путь 3: непосредственная запись в базу данных Рассмотренные выше способы так или иначе привязаны к команде COPY. А что, если мы не можем записать текстовый файл на диск в том месте, где он будет доступен процессу postmaster? Или нет доступа к клиенту psql? В этом случае можно непосредственно формировать команды
57
администрирование INSERT серверу БД вместо создания промежуточных файлов. Конечно, это будет работать заметно медленнее, но в некоторых ситуациях такой путь может оказаться единственно возможным. Рассмотрим этот способ на примере. Для разнообразия воспользуемся языком Perl. Алгоритм разбора DBF-файла остался прежним, даже синтаксис похож. Только на этот раз нужно будет для каждой записи формировать команду INSERT и отсылать ее на сервер СУБД: Ëèñòèíã 3. Ñöåíàðèé dbf2pg.pl #!/usr/bin/perl -w
} $sqlcommand = substr($sqlcommand, 0, length($sqlcommand) - 2); $sqlcommand .= ');'; # Îòïðàâëÿåì åå íà ñåðâåð $sth = $dbh->prepare($sqlcommand); $sth->execute; # Ïåðåõîä íà íà÷àëî äàííûõ seek(DBF, $posfirst, 0); for($rec = 0; $rec < $dblen; $rec++) { read(DBF, $first, 1); if($first ne '*') { $sqlcommand = "INSERT INTO $tabname VALUES ("; for($i = 0; $i < $num; $i++) { read(DBF, $fld, $fields[$i]{len}); if($fields[$i]{type} eq 'C') { ($fld) = &alt2koi($fld); $fld = "'" . $fld . "'"; } else { $fld =~ s/\s//g; }
# Ïîäêëþ÷àåì ìîäóëè äëÿ ïåðåêîäèðîâêè è ðàáîòû ñ ÑÓÁÄ use Lingua::RU::Charset qw(alt2koi); use DBI; # Óñòàíàâëèâàåì ñîåäèíåíèå ñ ÁÄ $dbh = DBI->connect('dbi:Pg:dbname=serg', 'serg', ''); # Èñõîäíûé ôàéë è èìÿ èòîãîâîé òàáëèöû $fname = 'S_CATS.DBF'; $tabname = 's_cats_pl'; # Îòêðûâàåì ôàéë DBF â áèíàðíîì ðåæèìå open(DBF, "$fname"); binmode(DBF); read(DBF, $head, 32); $dblen = ord(substr($head, 7, 1)) * 16777216 + ↵ ord(substr($head, 6, 1)) * 65536 + ↵ ord(substr($head, 5, 1)) * 256 + ↵ ord(substr($head, 4, 1));
if($fields[$i]{type} eq 'D') { if($fld ne '') { $fld = '"' . substr($fld, 0, 4) . '-' . substr($fld, 4, ↵ 2) . '-' . substr($fld, 6, ↵ 2) . '"'; } else { $fld = 'NULL'; } } if(($fields[$i]{type} eq 'N') && ↵ ($fld eq '')) { $fld = '0'; }
$posfirst = ord(substr($head, 9, 1)) * 256 + ↵ ord(substr($head, 8, 1)); $wexit = 0; $num = 0; $totlen = 1; while(! $wexit) { read(DBF, $first, 1); if(ord($first) == 13) { $wexit = 1; } else { # Äàëåå ÷èòàåì ôàéë ñðàçó â ïåðåìåííûå read(DBF, $name, 10); $name = $first . $name; # Âûðåçàåì èç èìåíè ñèìâîëû 0x00 # (çäåñü ^@ - íå äâà ñèìâîëà, ïðîñòî 0x00 # òàê âûãëÿäèò â vi) $name =~ s/^@//g; read(DBF, $type, 1); read(DBF, $tmp, 4); read(DBF, $tmp, 1); $len = ord($tmp); read(DBF, $tmp, 1); $dec = ord($tmp); read(DBF, $tmp, 14); $fields[$num]{name} = $name; $fields[$num]{type} = $type; $fields[$num]{len} = $len; $fields[$num]{dec} = $dec;
}
}
$num++; $totlen += $len;
# Ôîðìèðóåì êîìàíäó ñîçäàíèÿ òàáëèöû $sqlcommand = "CREATE TABLE $tabname ("; for($i = 0; $i < $num; $i++) { $sqlcommand .= $fields[$i]{name} . ' '; if($fields[$i]{type} eq 'C') { $tmp = 'char(' . $fields[$i]{len}; } elsif($fields[$i]{type} eq 'D') { $tmp = 'date'; } elsif($fields[$i]{type} eq 'N') { $tmp = 'numeric(' . $fields[$i]{len} . ',' . $fields[$i]{dec}; } $sqlcommand .= $tmp . '), ';
58
$sqlcommand .= $fld . ', '; } $sqlcommand = substr($sqlcommand, 0, length($sqlcommand) - 2); $sqlcommand .= ');'; # Îòïðàâëÿåì êîìàíäó INSERT $sth = $dbh->prepare($sqlcommand); $sth->execute; } else { read(DBF, $tmp, 31); }
} close(DBF); $dbh->disconnect;
Рассмотренный способ универсален как в плане доступа к базе данных (достаточно иметь возможность отправлять на сервер SQL-команды), так и в плане использования конкретной СУБД. При минимальных синтаксических изменениях данный сценарий можно использовать для работы практически с любой системой управления базами данных – MySQL, Oralce и т. д. К тому же в данном случае каждая запись переносится отдельно от других, и если при этом возникнет ошибка, на импорт других записей это никак не повлияет. Правда, если предъявляются высокие требования к целостности данных, то подход «все или ничего» более предпочтителен. За указанные удобства приходится расплачиваться быстродействием – та же тестовая таблица из 5000 записей переносится почти одну минуту.
Завершение Итак, мы рассмотрели несколько способов переноса данных из формата DBF в таблицу PostgreSQL. Каждый из них имеет свои особенности, и я надеюсь, вам удастся найти тот, который лучше всего подойдет именно к вашим условиям.
безопасность
ЗАЩИТА КОММУНИКАЦИЙ WINDOWS MOBILE
НАТАЛЬЯ МЕЛЬНИКОВА В последний год рынок мобильных устройств переживает настоящий бум. Стремительно совершенствуясь, мобильные телефоны по уровню «интеллектуальной» начинки догоняют карманные компьютеры (КПК), а те, в свою очередь, развивают свои коммуникационные возможности. И порой уже трудно понять, чем является то или иное устройство – смартфоном (т.е. интеллектуальным сотовым телефоном) или коммуникатором (КПК с расширенными сетевыми возможностями). Большинство современных КПК оснащено модулями беспроводной связи 802.11, и имеют возможность использовать GPRS-функции сотового телефона для подключения к Интернету (причем делать это тоже «по воздуху» – через инфракрасный порт или Bluetooth). Этот потенциал сначала поражает, но быстро становится привычным, и через некоторое время отсутствие возможности синхронизировать свой КПК с корпоративным сервером Exchange воспринимается как нечто совершенно «дикое». Но как обычно бывает в жизни, удобства в одной области приносят проблемы в других сферах. Так, серьезным препятствием на пути внедрения мобильных клиентов в корпоративных сетях является низкий уровень стандартных средств защиты беспроводных коммуникаций, таких как A5/A8, WEP и т. д. Мобильные клиенты на основе Windows Mobile 2003 предоставляют администратору богатый арсенал средств защиты сетевых соединений. В него входят прекрасно зарекомендовавшие себя протоколы, такие как WPA и 802.1X, L2TP/IPSec, SSL/TLS. Большинство этих технологий исполь-
60
зует цифровые сертификаты, в связи с чем первым этапом в настройке защищенных коммуникаций является настройка клиентских компонентов PKI на КПК.
Управление сертификатами В мобильной версии Windows существует только одно хранилище сертификатов, управлять которым можно с помощью приложения Certificates («Start → Settings → System → Certificates»). В приложении имеется две закладки: Personal и Root.
Ðèñóíîê 1. Óïðàâëåíèå ñåðòèôèêàòàìè
Первая из них относится к персональным сертификатам устройства или пользователя (в Windows Mobile нет такого жесткого разделения, как в настольной версии). Во второй перечислены доверенные центры сертификации (CA).
безопасность За редким исключением сертификат корпоративного центра сертификации не является доверенным по умолчанию. Для того чтобы устройство могло проверять сертификаты, выданные корпоративным центром сертификации, необходимо поместить сертификат CA в список доверенных (корневых) центров. Для этого достаточно скопировать сертификат CA на КПК с помощью ActiveSync и щелкнуть на нем.
Session», перейти на закладку «Security» и присвоить право Enroll группе мобильных пользователей. Затем нужно снова щелкнуть на пункте «Certificate Templates» в оснастке управления CA и выбрать пункт контекстного меню «New → Certificate Template To Issue», после чего дважды щелкнуть на пункте «Authenticated Session».
Ðèñóíîê 2. Óñòàíîâêà ñåðòèôèêàòà CA
После подтверждения намерений сертификат будет добавлен в список доверенных сертификатов (рис. 1). Получить сертификат CA можно и через Web, для чего необходимо зайти на основную страницу веб-интерфейса сервера сертификатов и щелкнуть по ссылке «Download a CA certificate, certificate chain, or CRL». После этого необходимо загрузить сертификат в кодировке DER и установить его (рис. 3) как в предыдущем случае.
Ðèñóíîê 4. Äîáàâëåíèå øàáëîíà ñåðòèôèêàòîâ
Затем на мобильном устройстве запускается утилита Enroll («Start → Settings → System → Enroll»). В утилите необходимо указать имя пользователя, пароль и адрес сервера сертификатов.
Ðèñóíîê 5. Çàïðîñ ñåðòèôèêàòà
Ðèñóíîê 3. Óñòàíîâêà ñåðòèôèêàòà CA ÷åðåç âåá-èíòåðôåéñ
Следующим этапом является получение персональных сертификатов. В стандартную поставку Windows Mobile входит утилита Enroll, которая генерирует ключевую пару, создает запрос на получение сертификата и отправляет его серверу сертификатов. Для взаимодействия с сервером сертификатов используются HTTP-запросы к веб-интерфейсу стандартного CA Windows 2000/2003. Утилита Enroll имеет возможность запрашивать только сертификаты, основанные на шаблоне «Authenticated Session». Они могут быть использованы для аутентификации устройства в протоколах EAP, IPSec и SSL. Чтобы настроить сервер сертификатов на выдачу сертификатов данного типа, необходимо открыть оснастку управления CA, щелкнуть правой кнопкой мыши на пункте «Certificate Templates» и выбрать пункт «Manage». В появившемся окне открыть свойства шаблона «Authenticated
¹4, àïðåëü 2005
Утилита Enroll обладает рядом недостатков. Во-первых, она позволяет запрашивать только сертификаты, основанные на шаблоне «Authenticated Session». Во-вторых, Enroll не поддерживает возможности запроса сертификата у сервера, требующего использования SSL. Кроме того, утилита имеет возможность работать только с сервером сертификатов Microsoft. Если возникает необходимость получать сертификаты, основанные на других шаблонах, можно модифицировать содержимое файла C:\WINDOWS\system32\certsrv\certfnsh.asp. В строке 47 необходимо заменить sAttributes=Request.Form («CertAttrib») на название требуемого шаблона, например sAttributes=«CertificateTemplate:User». В случае если на предприятии используется сервер сертификатов, отличный от Microsoft Certification Authority, можно воспользоваться одной из утилит, например PPCCert (http://webs.ono.com/usr030/kiko_vives/ppccert), позволяющих импортировать файлы в формате PKCS#12 (pfx) в хранилище Windows Mobile.
61
безопасность Беспроводные соединения Основой современных стандартов защиты беспроводных сетей, таких как Wi-Fi Protected Access (WPA) и 802.11i является технология 802.1X. Она была разработана для предотвращения возможности несанкционированного доступа к ресурсам сети даже при наличии физического соединения. Перед тем как получить доступ к сети на канальном уровне каждое подключаемое устройство должно пройти аутентификацию с использованием протокола Extensible Authentication Protocol (EAP) или его модификаций. В инфраструктуре 802.1X разделяют три основных компонента: клиентский компьютер (Supplicant), коммутатор или точка доступа (Authenticator), сервер аутентификации (Authentication Server). Функции сервера аутентификации выполняет корпоративный сервер RADIUS. Он проверяет подлинность предоставленных клиентом для аутентификации данных и контролирует доступ к ресурсам сети. Точка доступа или коммутатор являются своеобразным посредником (proxy), преобразующим клиентские запросы EAPoL (EAP over LAN) в данные протокола RADIUS и обратно. Windows Mobile 2003 поддерживает стандарт WPA с аутентификацией 802.1X. При использовании 802.1X, для аутентификации клиента может быть задействован цифровой сертификат (EAP-TLS) либо пароль пользователя (PEAPMSCHAPv2). Во втором случае протокол MSCHAPv2 будет
Ðèñóíîê 6. Íàñòðîéêà ïîëèòèê óäàëåííîãî äîñòóïà RADIUS
62
работать внутри виртуального канала, зашифрованного с помощью TLS (PEAP расшифровывается как Protected EAP). Чтобы обеспечить нормальную работу протоколов EAP и PEAP, необходимо установить сертификат, основанный на шаблоне «RAS and IAS Server», на сервер RADIUS и указать этот сертификат в политиках удаленного доступа (рис. 6). Настройки со стороны устройства довольно просты. После активации беспроводного интерфейса необходимо перейти в пункт настроек беспроводного подключения («Settings → Connections → Connections → Advanced → Network Card») и нажать на ссылке «Add new». В появившемся окне указывается SSID сети, после чего на закладке «Network key» выбирается тип аутентификации WPA и шифрование TKIP. На странице 802.1X указывается используемый тип аутентификации (рис. 7). В случае если был выбран метод «Smart Card or Certificate», на устройстве должен присутствовать действующий клиентский сертификат. При использовании метода PEAPMSCHAPv2 необходимо указать имя и пароль пользователя. Для отладки соединения очень удобно пользоваться журналом System сервера RADIUS. В случае сбоя подключения в нем сохраняются события с EventID 2, содержащие подробную информацию о причине возникновения ошибки. Например, сообщение, приведенное ниже, характерно для тех ситуаций, когда в политиках удаленного доступа
безопасность сервера RADIUS указан протокол аутентификации, отличный от протокола, используемого устройством. Event Type: Warning Event Source: IAS Event Category: None Event ID: 2 Date: 02.04.2005 Time: 14:13:40 User: N/A Computer: DC Description: User dom01\User was denied access. Fully-Qualified-User-Name = dom01.infosec.ru/Users/User NAS-IP-Address = 192.168.0.50 NAS-Identifier = DWL-2000AP Called-Station-Identifier = 00-0d-88-84-a2-b1 Calling-Station-Identifier = 00-30-05-73-60-06 Client-Friendly-Name = Access Point Client-IP-Address = 192.168.0.50 NAS-Port-Type = Wireless - IEEE 802.11 NAS-Port = 0 Proxy-Policy-Name = Use Windows authentication for all users Authentication-Provider = Windows Authentication-Server = <undetermined> Policy-Name = Wireless Authentication-Type = EAP EAP-Type = <undetermined> Reason-Code = 22 Reason = The client could not be authenticated because the Extensible Authentication Protocol (EAP) Type cannot be processed by the server.
необходимо нажать на кнопку Network Card и указать, что данные сетевые карты подключены к Интернету (рис. 9).
Ðèñóíîê 8. Íàñòðîéêà ïðîôèëÿ VPN
For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Ðèñóíîê 9. Íàñòðîéêà ñåòåâûõ àäàïòåðîâ
После того как беспроводной адаптер подключится к точке доступа, можно будет инициировать VPN-соединение.
Ðèñóíîê 7. Íàñòðîéêà WPA íà êëèåíòå
Построение VPN Мобильный клиент на основе Windows может использовать технологии VPN для подключения к ресурсам сети. Поддерживаются протоколы PPTP и L2TP/IPSec. В случае использования IPSec для аутентификации устройства могут применяться цифровые сертификаты или общий ключ. Если при соединении с сервером VPN используется не модем, а беспроводной адаптер, необходимо настроить профили подключения. Для этого в настройках соединения («Settings → Connections → Connections → Advanced → Select Network») нужно открыть настройки «внутренней» сети, нажав на нижнюю кнопку «Edit», после чего на закладке «VPN» нажать кнопку «New» и указать параметры подключения к VPN (рис. 8). Затем указывается, что беспроводной адаптер подключает устройство к Интернету, а не к внутренней сети. Это делается для того, чтобы Windows могла задействовать VPN при активном соединении. Для этого в настройках соединений («Settings → Connections → Connections → Advanced»)
¹4, àïðåëü 2005
Ðèñóíîê 10. Ñîåäèíåíèå VPN
Для мониторинга соединений удобно пользоваться оснасткой «MMC IP Security Monitor» или утилитой командной строки netsh.
Ðèñóíîê 11. Ïðîñìîòð ñîåäèíåíèé IPSec â óòèëèòå nesh
63
безопасность Подробнее об устранении неисправностей в работе IPSec можно узнать из статьи «Неизвестный IPSec», Windows & .NET Magazine №6, 2003 г.
Доступ к серверу Exchange Для доступа к серверу Exchange из Windows Mobile 2003 применяется синхронизация ActiveSync или online-доступ через Outlook Mobile Access (OMA). Обе эти технологии используют в качестве транспорта HTTP и должны быть защищены с помощью SSL. Для включения поддержки этих функций на сервере Exchange необходимо в оснастке Exchange System Manager открыть свойства пункта Mobile Services и разрешить синхронизацию со стороны пользователя (Enable user initiated synchronization) и поддержку OMA. Дополнительно можно включить обработку запросов от неподдерживаемых устройств.
Ðèñóíîê 13. Íàñòðîéêè ActiveSync
Ðèñóíîê 14. Äîñòóï ê OMA
Ðèñóíîê 12. Íàñòðîéêà ìîáèëüíîãî äîñòóïà ê Exchange
Это бывает удобно, когда доступ к Exchange осуществляется с настольного компьютера или ноутбука, но посредством слабого канала связи. Поскольку интерфейс OMA гораздо более «лаконичен», чем интерфейс OWA, его использование помогает экономить время и нервы при чтении почты. Поскольку и OMA, и ActiveSync используют аутентификацию Basic, необходимо убедиться, что в настройках аутентификации сервера IIS установлено правильное имя домена по умолчанию. Кроме того, необходимо включить обязательное использование SSL при обращении к виртуальным директориям OMA и Microsoft-Server-ActiveSync. Это можно проделать с помощью стандартных средств настройки безопасности Internet Information Server. Настройка ActiveSync на КПК довольно проста. Необходимо запустить приложение ActiveSync («Start → Programs → Activesync»), выбрать пункт меню «Tools → Options» и на закладке Server указать имя сервера и синхронизируемые объекты. Дополнительно можно настроить автоматическую синхронизацию через заданные интервалы времени (кнопка «Options»). Если сервер настроен на поддержку SSL, то необходимо установить опцию «This server uses an SSL connection» (рис. 13). Для работы с OMA достаточно подключиться к сети, запустить Pocket Internet Explorer и ввести в строке URL вида https://<servername>/oma (рис. 14).
64
Лаконичный интерфейс OMA мало подходит для работы с заполненными почтовыми ящиками, но позволяет сэкономить ресурсы устройства. Хотя, если пропускная способность канала связи не является ограничивающим фактором, даже при разрешении экрана 320x240 можно довольно комфортно работать с полнофункциональной версией Outlook Web Access (рис. 15). В современных КПК, поддерживающих расширение 640x480, OWA практически не отличается от своего настольного варианта.
Ðèñóíîê 15. OWA â ðàçðåøåíèè 320x240
Таким образом, мобильные клиенты могут задействовать современные технологии защиты коммуникаций, начиная с канального уровня модели OSI (WPA) и заканчивая защитой доступа к приложениям. К неудобствам, возникающим при настройке Windows Mobile, можно отнести отсутствие возможности импорта сертификатов в формате PKCS#12 и списков отозванных сертификатов. Кроме того, отсутствует возможность настраивать IPSec отдельно от L2TP.
безопасность
УПРАВЛЕНИЕ БЕЗОПАСНОСТЬЮ INTERNET EXPLORER
НАТАЛЬЯ МЕЛЬНИКОВА Проблема защиты клиентского рабочего места становится всё более и более актуальной. Это связано с рядом причин, но в первую очередь – со смещением вектора атак с серверного на клиентское программное обеспечение. Статистика инцидентов показывает, что больший процент нарушений компьютерной безопасности как в корпоративном, так и в частном секторе, происходит именно посредством компрометации рабочих мест пользователя. К сожалению, проблеме защиты приложений пользователя уделяется меньше внимания, чем защите серверов. В современных корпоративных информационных системах большинство средств защиты сконцентрировано на периметре сети, и если они были обойдены, сеть становится беззащитной. Злоумышленник получает доступ к рабочей станции и соответственно ко всем ресурсам сети, с которыми может работать пользователь. Этого вполне достаточно для решения широкого спектра задач – от рассылки спама и сбора конфиденциальной информации до промышленного шпионажа. Конечно, индустрия не стоит на месте, и появляются новые методы и продукты для защиты приложений пользователя. Однако, как показывает практика, на настоящий момент их недостаточно. Недавно опубликованное исследо-
66
вание российских специалистов в области информационной безопасности [1] показывает, что для обхода большинства современных средств защиты клиентских приложений достаточно умения работы с программой «Блокнот» и элементарных навыков программирования на VBScript. Наиболее часто рассматриваемым в данном контексте приложением является браузер Internet Explorer. Его возможности не только обеспечивают создание многофункциональных интерактивных веб-приложений, но позволяют злоумышленнику повышать свои привилегии на рабочей станции пользователя. В связи с большим количеством уязвимостей в IE, опубликованных во второй половине прошлого года, в сообществе специалистов в области безопасности довольно бурно обсуждается идея перехода на альтернативные программы работы с World Wide Web. Даже такая уважаемая организация, как CERT, не удержалась от спекуляций на эту тему [2]. Однако при попытке заменить Internet Explorer в корпоративных сетях администратору приходится столкнуться с некоторыми проблемами. Первая – отсутствие необходимых функциональных возможностей. Многие распространенные серверные приложения, такие как Outlook Web Access, SharePoint Portal Server активно используют различные рас-
безопасность ширения DHTML, реализованные только в Internet Explorer. Многие клиентские приложения также используют COMобъекты Internet Explorer для формирования интерфейса пользователя. Таким образом, на клиентском рабочем месте оказывается две программы для работы с WEB – Internet Explorer для обращения к корпоративным приложениям, и альтернативный браузер для выхода в Интернет. Это снижает удобство использования и повышает вероятность возникновения пользовательских ошибок. Кроме того, возникает ряд дополнительных проблем. Усложняется задача управления сетью. Поскольку большинство из альтернативных программ работы с WWW не поддерживает функции централизованного управления (тиражирование конфигурационных файлов через групповые политики – не самый удобный путь), повышаются затраты на поддержку клиентских машин. Вновь встает задача управления оперативными обновлениями, поскольку миф об отсутствии ошибок в альтернативных браузерах, как и предполагалось [3], был быстро развеян. Выходят обновления и новые версии программ, но современные средства управления обновлениями (и поиска уязвимостей) их не поддерживают, и администратору приходится следить за актуальностью версий программ самостоятельно. Кроме того, в сети на основе Active Directory часто происходит снижение уровня безопасности, поскольку вместо привычных протоколов аутентификации NTLMv2 и Kerberos начинают использоваться гораздо более уязвимые механизмы Digest или Basic. Не всегда хорошо работает аутентификация с использованием клиентских сертификатов из хранилища Windows или Smartcard. Учитывая все вышеперечисленное, вполне вероятно предположить, что снижение рисков, которое сулит переход на альтернативные браузеры, не окупит повышения затрат на эксплуатацию. Давайте рассмотрим стандартные возможности настройки Internet Explorer, использование которых позволяет поднять уровень защищенности клиентских рабочих мест на довольно высокий уровень. Дополнительным преимуществом использования данных настроек является то, что они легко тиражируются с помощью стандартных средств управления корпоративной сетью на базе Windows, таких как Active Directory. Основным средством настройки безопасности интернетприложений Microsoft были и остаются зоны безопасности. Зоны безопасности представляют собой группы адресов (URL), которым соответствуют те или иные настройки подсистемы безопасности. Настройки Internet Explorer сохраняются в разделах HKLM(HKCU) Software\Microsoft\Windows\ CurrentVersion\Internet Settings. По умолчанию Internet Explorer считывает настройки из ветви HKCU, однако это поведение можно изменить. Установка значения Enabled в параметре объекта групповой политики (ОГП) Computer Configuration\Administrative Templates\ Windows Components\Internet Explorer\Security Zones: Use only machine settings присваивает значение параметру реестра. HKLM\Software\Policies\Microsoft\Windows\CurrentVersion\ Internet Settings\Security_HKLM_only равным 1, после чего Internet Explorer начинает использовать настройки из ветви HKLM.
¹4, àïðåëü 2005
Поскольку разрешения на ветвь HKLM запрещают пользователю модифицировать значения, содержащиеся в нижележащих разделах, то у него не будет возможности изменить параметры, назначенные администратором. В большинстве случаев рекомендуется задействовать данную настройку, поскольку пользователь или вредоносное программное обеспечение, работающее в его контексте безопасности, может менять настройки браузера, снижая уровень защищенности. Примером может являться троянская программа Win32.Secdrop.C [4], при установке разрешающая загрузку и запуск неподписанных компонентов ActiveX из Internet. В случае если задействована эта настройка, все параметры Internet Explorer необходимо изменять в ветви HKLM (или разделе Computer Configuration ОГП). Соответственно, если для изменения параметров будут задействованы сценарии, то необходимо использовать те из них, которые выполняются с достаточными привилегиями, а именно – Startup Script и Shutdown Script. Кроме того, для применения параметров необходимо, чтобы отработала групповая политика уровня компьютера, что в некоторых случаях требует перезагрузки. Ещё одной потенциальной проблемой является то, что исчезает возможность персонифицировать настройки Internet Explorer для разных пользователей одного и того же компьютера. Однако необходимость в различных настройках IE для разных пользователей является скорее исключением, чем правилом. Для настройки зон безопасности используются следующие подразделы: HKLM(HKKU)\Software\Microsoft\Windows\ CurrentVersion\Internet Settings: ! TemplatePolicies ! ZoneMap ! Zones Раздел TemplatePolicies содержит предопределенные уровни безопасности, которые в дальнейшем могут использоваться для настройки зон. Этот раздел содержится только в ветке HKLM, и модифицировать его не рекомендуется, поскольку такая операция затруднит процесс восстановления стандартных настроек в случае возникновения сбоев. В разделе ZoneMap описывается привязка узлов и доменов к зонам безопасности. Подраздел Domains содержит иерархическую структуру, в которой в качестве ключей выступают имена доменов и узлов, параметры описывают протоколы, а значения параметров указывают на номер зоны безопасности. Нижеприведенная структура разделов реестра указывает на то, что при обращении к серверу www.isc2.org по протоколу https будут задействованы настройки второй зоны безопасности (Trusted Sites, Доверенные узлы): ZoneMap → Domains → sc2.org → www → https (DWORD)=2. Структура может быть более сложной. Например, следующий вариант предписывает при обращении к любому узлу в домене *.microsoft.com по протоколу https использовать зону безопасности Trusted Sites. Для обработки содержимого страниц на сервере www.microsoft.com, полученных по протоколу http, будут использоваться настройки зоны Internet: ZoneMap → Domains → microsoft.com → https (DWORD)=2, www → http (DWORD)=3.
67
безопасность Если клиентом является Microsoft Windows Server 2003 и задействована опция Internet Explorer Enhanced Security Configuration, то настройки следует сохранять в подразделе EscDomains, а не Domains. В случае если разграничение уровня безопасности происходит не на основе FQDN, а с помощью IP-адресов, задействуется подраздел Ranges. Нижеприведенная структура описывает ситуацию, когда для IP-адресов, принадлежащих сети 10.1.1.0/24, используется зона безопасности Trusted Sites: ZoneMap → Ranges → Range1 → * (DWORD)=2, :Range (SZ)=10.1.1.1-10.1.1.254. В подразделе ProtocolDefaults описывается, какая зона будет задействована в случае использования того или иного протокола, если дополнительные правила не применимы. По умолчанию большинство протоколов используют зону 3 – Internet. Кроме описанных параметров оказывать влияние на то, какая зона безопасности будет использоваться для обработки содержимого того или иного сервера, может значение параметра Flags, содержащегося в разделе, описывающем зону. Например, по умолчанию этот параметр для зоны 1 (Intranet) имеет значение 219: HKLM(HKCU)\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1: Flags(DWORD)= 219
Это значение формируется на основе параметров битовой маски (таблица 1) и содержит значения 128, 16 и 8. Соответственно в зону Intranet будут автоматически включаться те узлы, обращение к которым произошло по имени Net BIOS и узлы, работающие не через Proxy-сервер (параметр HKLM(HKCU)\Software\Microsoft\Windows\CurrentVersion\ Internet Settings\ProxyOverride). Òàáëèöà 1. Çíà÷åíèå ïàðàìåòðà Flags
него есть только два уровня доверия – Internet и Trusted Sites. Он не может разрешить выполнение сценариев для одной группы серверов, включить поддержку ActiveX для второй и отключить активное содержимое для остальных. Òàáëèöà 2
Чтобы решить эту проблему, удобно изменить зону по умолчанию, применяемую для различных протоколов: HKLM (HKKU)\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\ProtocolDefaults: ftp(DWORD)=4 http(DWORD)=4 https(DWORD)=4
После этого узлы, ранее принадлежащие зоне Internet, автоматически попадут в зону Restricted Sites. Зона Internet станет промежуточной, и в неё будут включаться сервера, для работы которых необходима поддержка сценариев или некоторых компонентов ActiveX. Зона Trusted Sites не изменит своих функций, в неё включаются узлы, работа с которыми требует всех функциональных возможностей Internet Explorer. Для того чтобы появилась возможность модифицировать состав зоны Internet, параметру Flags для этой зоны необходимо присвоить значение, равное 3.
Функции зон безопасности
Настройка зон
В подразделе Zones содержатся непосредственно настройки безопасности каждой из зон. Стандартно Windows содержит 5 зон безопасности (таблица 2). Каждая из этих зон содержит настройки параметров безопасности, подробное описание которых доступно в статье KB182569. Таким образом, сайты, не принадлежащие зоне безопасности Local Intranet, обрабатываются в контексте зоны Internet. В случае если эти настройки чрезмерно жесткие, можно включить сервер или домен в зону Trusted Sites. Если сервер является потенциально опасным, он включается в зону Restricted Sites. Этот подход не соответствует текущим реалиям, поскольку весь Internet является слабо доверенной системой. Кроме того, администратор ограничен в настройках, поскольку у
Зона безопасности My Computer является основной целью атакующих. Многие опубликованные уязвимости в Internet Explorer нацелены именно на получение возможности обработки данных в контексте этой зоны, что дает возможность обращаться к файловой системе и запускать программы [5]. В Windows XP Service Pack это поведение изменено с помощью механизма «Local Machine Zone Lockdown» [6]. Однако, как показывает практика, задействованные настройки недостаточно строги, поэтому рекомендации по усилению параметров безопасности для XP SP2 также актуальны. Рекомендуется дополнительно настраивать безопасность для этой зоны, запрещая обработку сценариев и/или компонентов ActiveX. В статье KB833633 описано, как настраивать параметры зоны безопасности с помощью моди-
68
безопасность фикации реестра. Однако зачастую удобней предварительную настройку осуществлять с помощью GUI. Для того чтобы зона безопасности отображалась в Internet Explorer, необходимо уменьшить значение параметра Flags для этой зоны на 32: HKLM(HKCU)\Software\Microsoft\Windows\Current Version\Internet Settings\Zones\0: Flags(DWORD)=1
После этих изменений зона появится на закладке Security приложения Internet Options и станет доступной для модификации через графический интерфейс. В результате настройки могут возникнуть проблемы при работе с некоторым программным обеспечением, использующим Internet Explorer. Типичным примером являются оснастки управления MMC. Поскольку правая панель в оснастках представляет собой компонент ActiveX, их отключение в зоне безопасности My Computer приводит к неработоспособности некоторых оснасток. Наиболее приемлемым решением здесь является разрешение использования только одобренных администратором компонентов, для чего необходимо установить параметр безопасности Run ActiveX Controls and Plugins равным Administrator Approved. После этого необходимо описать разрешенные элементы ActiveX, что можно сделать через редактор групповых политик (см. рис. 1) в разделе «User
Configuration → Administrative Templates → Windows Components → Internet Explorer → Administrator Approved Controls». По умолчанию набор компонентов невелик и может не содержать необходимые ActiveX. В этом случае целесообразно изменить административный шаблон %systemroot%\ inf\inetres.adm, добавив в него CLSID используемых элементов ActiveX.
Ðèñóíîê 2. Ðåäàêòèðîâàíèå àäìèíèñòðàòèâíîãî øàáëîíà
Аналогичные настройки осуществляются различными утилитами, осуществляющими настройку безопасности
Ðèñóíîê 1. Ðàçðåøåííûå ýëåìåíòû ActiveX
¹4, àïðåëü 2005
69
безопасность компьютера. Например, Qwik-Fix Pro [7] в качестве одного из защитных механизмов устанавливает более строгие разрешения в зоне My Computer. При использовании описанного выше подхода Restricted Sites является стандартной зоной безопасности для внешних узлов, необходимо ослабить настройки этой зоны. Для нормальной работы большинства пользователей достаточно разрешить загрузку файлов из неё. Ещё одной полезной настройкой является разрешение обработки файлов Cookie в Restricted Sites. Это устранит проблемы со многими серверами, отслеживающими сессию с помощью Cookie. Включать обработку сценариев для этой зоны не рекомендуется, поскольку она же используется при обработке содержимого почтовых сообщений в программах Outlook и Outlook Express, соответственно чрезмерное ослабление настроек безопасности может привести к снижению общего уровня безопасности. В случае если необходимо разрешить выполнение сценариев для всех узлов, лучше воспользоваться методом расширения набора зон безопасности, описанным далее. В зоне безопасности Internet обычно разрешается поддержка сценариев и некоторых ActiveX-компонентов, например, Macromedia Flash. Загрузку и инициализацию всех подписанных и неподписанных элементов в этой зоне лучше отключить. Для доверенных узлов (Trusted Sites) можно включить поддержку загрузки подписанных элементов ActiveX. Желательно отключить формирование состава зоны безопасности Local Intranet на основе сетевой топологии и добавлять узлы или сети в неё вручную. Это защитит от внутренних атак, таких как установка ложных веб-серверов, NTLM Relaying [8] и т. д. Не забывайте включить в эти зоны адреса Proxy-серверов для корректной работы функции автоматической аутентификации пользователя. В обратном случае возможны различные проблемы, особенно при аутентификации с помощью Smartcard.
Расширение набора зон При необходимости можно расширить набор зон безопасности, доступный для Internet Explorer. Для этого в реестр добавляется зона с новым номером (например, 5). Самый простой способ произвести подобную операцию – это экспортировать раздел реестра, содержащий наиболее близкую по настройкам зону в текстовый файл, изменить его и импортировать в реестр (рис. 3). Используя этот подход, можно изменить идеологию применения зон. Например, все внешние узлы по умолчанию попадают в зону Internet, в которой запрещена обработка сценариев и компонентов ActiveX. Серверы со средним уровнем доверия включаются в дополнительную зону, выполнение сценариев в которой разрешено. Ну и наиболее функциональные серверы попадают в зону Trusted Sites.
Развертывание и поддержка Перед внедрением описанного подхода необходимо провести некоторые подготовительные операции. Первая из них – выяснение влияния настроек безопасности на используемое программное обеспечение. Хорошим примером является раздражающее сообще-
70
ние об отключенных ActiveX, выскакивающее при обращении к каждой странице, где содержится запрещенный компонент. До выхода Windows XP Service Pack 2 эту проблему приходилось решать путем модификации соответствующего компонента Internet Explorer. Также могут возникнуть проблемы с некоторыми приложениями при изменении настроек безопасности для зоны My Computer.
Ðèñóíîê 3. Äîáàâëåíèå çîíû áåçîïàñíîñòè
Наиболее эффективным методом будет настройка предполагаемых параметров для организационного подразделения отдела IT с последующей коррекцией по результатам тестирования. Все крупные эксперименты лучше сначала проводить на себе. Список доверенных или частично доверенных серверов проще всего формировать на основе журналов межсетевого экрана с последующим согласованием у руководства. Не забывайте про формальную процедуру включения необходимых узлов в зоны безопасности по запросу работников. Эта процедура должна быть документально оформлена, доведена до пользователей и являться не слишком обременительной для них. Централизованно настраивать параметры безопасности для Internet Explorer удобнее всего через групповые политики. Для этого в соответствующем ОГП необходимо открыть раздел User configuration/Windows settings/IE User configuration/Windows settings/IE Maintenance/Security, дважды щёлкнуть на Security Zones and Content Ratings и поставить переключатель в положение Import the current security zones and privacy settings (рис. 4). В административном шаблоне, входящем в Windows XP Service Pack 2, настройка зон безопасности была вынесена в отдельную ветку (рис. 5). Соответственно появилась возможность настройки параметров для всех зон, включая My Computer непосредственно в объекте групповой политики. Для того чтобы применять эти настройки в домене, достаточно импортировать в групповую политику админис-
безопасность тративный шаблон %systemroot%\inf\inetres.adm из дистрибутива Windows XP Service Pack 2.
опубликованным проблемам. Кроме того, не стоит забывать о других средствах защиты, таких как управление обновлениями безопасности и фильтрация содержимого. Например, на сервере www.isatools.org можно найти сценарии, настраивающие ISA Server 2004 на блокировку распространенных атак.
Литература:
Ðèñóíîê 4. Èìïîðò íàñòðîåê çîí áåçîïàñíîñòè â ÎÃÏ
Хотя распространенность уязвимостей типа «Внедрение сценариев» (Cross-Site Scripting) в веб-серверах делает концепцию разделения уровня безопасности по зонам на основе имен доменов и IP-адресов серверов очень условной, не стоит отказываться от этого механизма защиты. Описанные настройки позволяют значительно повысить защищенность Internet Explorer от 0day-угроз, т.е. тех уязвимостей, которые ещё не были устранены производителем. Всегда стоит отслеживать новые уязвимости и тестировать свою конфигурацию на подверженность недавно
1. Обход средств защиты клиентских приложений. – http:// www.security.nnov.ru/advisories/bypassing.asp. 2. US-CERT. Vulnerability Note VU#713878. – http://www.kb. cert.org/vuls/id/713878. 3. Drew Copley. Switching Software Because of Bugs. – http:// www.securityfocus.com/archive/1/367723/2004-06-25/200407-01/0. 4. Trojan Win32.Secdrop.C. – http://www3.ca.com/security advisor/virusinfo/virus.aspx?id=40225. 5. Internet Explorer «Object Type» vulnerability. – http://www.cve. mitre.org/cgi-bin/cvename.cgi?name=CAN-2003-0532. 6. Windows XP Service Pack 2 Enhancements to Internet Explorer 6. – http://www.microsoft.com/windows/ieak/ techinfo/deploy/60/en/appendix.mspx. 7. Qwik-Fix Pro. – http://www.pivx.com/qwikfix.asp. 8. NTLM и корпоративные сети. – http://www.securitylab.ru/ 49547.html.
Ðèñóíîê 5. Íàñòðîéêè çîí áåçîïàñíîñòè â ÎÃÏ
¹4, àïðåëü 2005
71
программирование
СИСТЕМА СОЗДАНИЯ ДОКУМЕНТАЦИИ POD ЧАСТЬ 2
АЛЕКСЕЙ МИЧУРИН Напомню коротко, что POD – это система разработки электронной документации. Она предполагает, что документ разрабатывается в определённом достаточно простом формате, и предоставляет средства конвертирования исходного POD-документа в другие форматы для печати и просмотра. В первой части статьи мы рассмотрели средства конвертирования в форматы «неразмеченный текст», man-страница и HTML. В этой части рассмотрим конвертирование в PostScript и PDF. Напомню, что POD-документ состоит из абзацев, которые разделяются пустой строкой. Абзацы бывают трёх типов: форматированные, для представления обычного текста, неформатированные, для листингов программ, и управляющие, для формирования структурных элементов (заголовков, списков) и внедрения формат-специфических вставок. Неформатированные абзацы начинаются с пробела. Управляющие – с команды. В форматированных и управляющих абзацах допустимо элементарное оформление текста (например, I<курсив> или B<жирный шрифт>) и вставка не ASCII-символов (например, E<deg> – значок градуса). Команды начинаются со знака «равно» (например, =head1 задаёт заголовок первого уровня). В качестве примера я использовал тот же POD-документ, что и в первой части статьи. На сайте журнала http://www.samag.ru в разделе «Исходный код» вы можете взять архив с POD-кодом и всеми обсуждаемыми здесь скриптами.
Конвертирование POD в TeX, PostScript и PDF Для конвертирования POD-документов в форматы PostScript и PDF проще всего сперва сконвертировать POD в LaTeX, a из LaTeX-исходника получить все необходимые PostScriptи PDF-файлы. На первый взгляд такой путь может показаться излишне сложным. Действительно, мы уже умеем создавать manстраницы (см. первую часть статьи). А из них легко можно получить PS- или PDF-файл; например так: cat page.man | /usr/bin/tbl | /usr/bin/groff -S -Wall -mtty-char -man -Tps >page.ps
Но это экстенсивный путь. Во-первых, man-документ не несёт никакой информации о кодировке и корректное кон-
72
вертирование русской man-страницы в тот же PostScript оказывается не такой уж простой задачей. Во-вторых, LaTeXисходник открывает перед вами все возможности системы LaTeX. Вы можете вставлять в документ рисунки, форматировать документ в несколько колонок, формировать автоматические оглавления, пользоваться системой автоматической расстановки переносов и многое другое. В формате man все эти возможности недоступны. Согласитесь, некоторое усложнение вполне стоит того.
Первое знакомство с pod2latex Первое знакомство с pod2latex может окончиться конфузом. Скорее всего, конвертер pod2latex откажется обрабатывать русскоязычные документы. Насколько мне удалось разобраться, скрипт pod2latex и все модули, вызываемые в нём, полностью игнорируют локализацию. Источник проблемы – модуль Pod::Find, который с помощью Perl-оператора -T проверяет, является ли файл действительно текстовым. Этот оператор может счесть ваш документ двоичным файлом из-за присутствия в нём русских букв. Более того, насколько я понимаю, оператор -T делает своё заключение, проанализировав только небольшую часть информации в начале файла. Поэтому если файл начинается с некоторого английского текста, а первые русские буквы начинают встречаться ниже, то pod2latex может обработать такой файл. Но если русские буквы появятся ближе к началу файла, то pod2latex наотрез откажется с ним работать. Такое поведение утилиты может сбить с толку при поиске причины недоразумений. Идеологически верным решением является подключение в pod2latex поддержки локализации, за которую отвечает прагма locale. То есть в начало скрипта pod2latex следует добавить строку: use locale;
И конечно, вам следует настроить локаль. Проще всего это сделать, установив переменную среды LANG. У меня LANG=ru_RU.KOI8-R. В вашей системе называние русской локали может слегка отличаться. Вы можете посмотреть полный список локалей, установленных в вашей системе, выполнив команду locale -a.
программирование Другой, более вероломный путь, практически не потребует знания Perl и перенастройки системы (иногда настройка русской локали бывает нежелательна). Самое простое решение – отредактировать модуль Pod::Find, удалив соответствующую проверку. Внимание! Cохраните оригинальную версию файла, прежде чем редактировать его! В моей системе это файл /usr/local/lib/perl5/5.8.5/ Pod/Find.pm. У меня установлен Pod::Find версии 0.24_01, в нём проверка выполняется в строке 251. Чтобы отменить проверку замените unless(-f $file && -T _ && ($file =~ /\.(pod|pm|plx?)\z/i ↵ || -x _ ))
на unless(-f $file && ($file =~ /\.(pod|pm|plx?)\z/i || -x _ ))
Так или иначе теперь мы заставили pod2latex работать с русскими документами, и вы точно сможете сконвертировать русскоязычный POD-документ в формат LaTeX. Но документ окажется неполным. Дело в том, что LaTeX-документы, как и HTML-документы, состоят из заголовка и тела. Утилита pod2latex создаёт только тело. Надо сказать, что эта утилита способна создать и полный документ, но в нём не будет содержаться никакой информации о языке и кодировке, то есть для русскоязычных документов эта возможность не очень полезна. Видимо, и разработчики POD считают её не очень полезной, так как по умолчанию она отключена. В полученном документе не хватает завершения (его следует добавить): \end{document}
и так называемой преамбулы, о которой следует сказать подробнее.
Преамбула LaTeX документа В преамбуле LaTeX-документов располагаются инструкции, в соответствии с которыми производится вёрстка документа. Вот пример преамбулы. Я постарался упомянуть в ней все пакеты и директивы, которые часто бывают полезны при разработке документов. Поэтому часть директив закомментирована (во избежание противоречий). Комментариями в LaTeX являются все символы от «%» до «конца строки» включительно. Мы обсудим и закомментированные директивы. % Çàäà¸ì ãëîáàëüíûå àòðèáóòû äîêóìåíòà \documentclass[10pt, a5paper]{article} \usepackage[magstep2]{scale} %\usepackage[a3paper]{geometry} % Èçìåíÿåì ïîëÿ \addtolength{\hoffset}{-1cm} \addtolength{\textwidth}{2cm} \addtolength{\voffset}{-1in} \addtolength{\textheight}{2in} % Êðàñíàÿ ñòðîêà \setlength{\parindent}{0.3cm} % Ðàññòîÿíèå ìåæäó àáçàöàìè \setlength{\parskip}{0pt} % Ðóññêèé ñòèëü îôîðìëåíèÿ àáçàöåâ \usepackage{indentfirst}
¹4, àïðåëü 2005
% Îãîâàðèâàåì êîäèðîâêó äîêóìåíòà %\usepackage[cp866]{inputenc} \usepackage[koi8-r]{inputenc} \usepackage[russian]{babel} \selectlanguage{russian} \usepackage{draftcopy} % Âêëþ÷àåì ãðàôè÷åñêèé ïàêåò \usepackage[dvips]{graphicx} %\graphicspath{{ps/}} % Ìàêðîñ äëÿ âñòàâêè êàðòèíîê \newcommand{\inspsfig}[3]{ \begin{figure}[!htbp] \begin{center} \includegraphics[angle=0, width=#2\textwidth]{#1} \end{center} \caption{#3} %\label{text} \end{figure} } % Çàäà¸ì ìåæñòðî÷íûé èíòåðâàë \linespread{1} % Äîêóìåíò íà÷àëñÿ \begin{document} %  íà÷àëå äîêóìåíòà ãåíåðèðóåì îãëàâëåíèå è ... \tableofcontents % ... ñïèñîê èëëþñòðàöèé \listoffigures % Ìîæíî íà÷àòü äîêóìåíò ñî ñëåäóþùåé ñòðàíèöû %\newpage % à ìîæíî ïðîñòî çàäàòü îòñòóï %\vspace{50mm}
Первым делом мы задаём класс документа (\documentclass). Настраиваем размер шрифта (10pt), размер бумаги (A5), если вам необходимо сверстать документ в две колонки, добавьте через запятую параметр twocolumn. Здесь же указан класс документа (article). LaTeX поддерживает три размера шрифта 10, 11 и 12 пунктов. Необычный размер бумаги мы используем умышленно. Стиль article наиболее подходит для короткой статьи, LaTeX поддерживает и другие стили. При разработке крупных пакетов документации вам может пригодиться стиль report (документы, объёмом около пятисот тысяч печатных знаков) или даже book. От стиля article они отличаются практически только одной, но очень важной особенностью. В документах класса article предусмотрены заголовки section, subsection и subsubsection, то есть заголовки первого второго и третьего уровней. В классах report и book добавляется возможность разбивать документы на главы, новая команда chapter (и её близнец part), создаёт заголовок как бы нулевого уровня. Pod2latex не создаёт глав. С одной стороны, это делает результаты работы pod2latex малопригодными для вёрстки в классах report и book; с другой стороны, получаемые article-документы легко и естественно могут входить как отдельные главы в большой report-документ. Если вы планируете разрабатывать документы большого объёма и объединять POD-документы, в первую очередь обратите внимание на ключ -h1level утилиты pod2latex. Он позволяет получить документы, в которых все заголовки логически «сдвинуты», например POD-команде =head1 соответствует подзаголовок (второй уровень) и так далее. Такие документы можно использовать, как разделы или подразделы более крупных документов. Из возможностей LaTeX обратите внимание на колонтитулы (команды pagestyle и thispagestyle). Если в вашем
73
программирование документе более ста страниц, колонтитулы перестают быть просто украшением. Очень полезной при слиянии документов может оказаться LaTeX-команда include. В завершение отступления о больших документах позволю себе небольшой психологический этюд. Весь мой опыт показывает, что большие документы отпугивают пользователя. Если предоставить пользователю пару десятков коротеньких инструкций, то он в них легко ориентируется. А если ту же самую информацию сверстать на полусотне страниц одного документа, то пользователь не читает этот документ вообще (даже оглавление не читает), а вместо этого звонит (пишет по e-mail, ICQ...) разработчику. Если вы создаёте руководства, чтобы уменьшить количество глупых вопросов на вашу голову, то следует избегать пугающих документов. Если вы будете создавать одностраничные инструкциипамятки, то наверняка захотите подавить нумерацию страниц. Это делается командой \pagestyle{empty}. Продолжим наше знакомство с преамбулой. В следующей строке мы подключаем пакет scale, который масштабирует листы, увеличивая их в 1.4 раза. Таким образом, мы получим документ на бумаге привычного формата A4 и шрифт из «десятого» превратится в «четырнадцатый». Если вам нужен, скажем, «двенадцатый» шрифт, то вы можете просто сразу указать 12pt, размер бумаги A4 и не использовать пакет scale. Пакет geometry позволяет задать размер бумаги A3 и больше. Это можно использовать, чтобы потом отмасштабировать документ и получить необычно мелкий шрифт. Серия команд \addtolength изменяет поля документа. По умолчанию LaTeX делает очень большие поля. Считается, что это правильно с точки зрения профессиональной вёрстки, но людям, навсегда испорченным программой MSWord, невозможно привыкнуть к этой красоте. Двумя следующими командами \setlength мы устанавливаем отступ красной строки абзаца и расстояние между абзацами. В иностранной литературе принято не делать красных строк, отделяя абзацы небольшим дополнительным интервалом. Отечественная традиция иная. Пакет indentfirst предписывает делать красную строку и у первого абзаца. По умолчанию LaTeX следует западному стандарту, не делая красную строку у первого в главе абзаца. Пакет inputenc задаёт кодировку LaTeX-файла. Я использовал koi8-r. LaTeX поддерживает огромное количество кодировок, среди которых cp866, cp1251, maccyr. Поддерживаются и украинские кодировки. Пакет babel и команда \selectlanguage{russian} русифицирует LaTeX. После подключения этого пакета LaTeX будет автоматически использовать русские слова «Оглавление», «Рисунок», «Глава» и другие. Пакет draftcopy выполняет чисто декоративную функцию. На всех страницах наискосок печатается слово draft. Это удобно, когда вы распечатываете неокончательную, «черновую» версию документа. Далее мы подключаем графический пакет graphicx. Если вы храните включаемые графические файлы в отдельной директории, удобно использовать директиву \graphicspath, чтобы раз и навсегда указать путь к картинкам. Вам, во-
74
первых, не придётся указывать путь к каждому графическому файлу, а во-вторых, будет легко изменить сразу все пути, если вы переместите файлы. С помощью команды \newcommand я создал макрос, позволяющий в дальнейшем легко добавлять иллюстрации. Подробное описание способов включения графики в LaTeX выходит за рамки настоящей статьи. На первых порах вы вполне можете ограничиться этим макросом или его подредактированными версиями. Подробнее о том, как его использовать, я расскажу чуть позже. В конце преамбулы задаём межстрочный интервал командой \linespread. С команды \begin{document} начинается тело LaTeX-документа. Преамбула закончилась, всё дальнейшее будет попадать на страницы. Я включил в тело автоматически создаваемые оглавление (команда \tableofcontents) и список иллюстраций (\listoffigures). Если вы хотите, чтобы кроме оглавления на первой странице ничего не было, раскомментируйте директиву \newpage. Если вы предпочитаете просто сделать дополнительный отступ, укажите его величину в аргументе директивы \vspace. LaTeX – мощная система вёрстки. Я, конечно, не смогу осветить здесь все её возможности. Тем не менее я постарался не забыть ничего, что когда-либо требовалось мне при подготовке документа. Тем, кто хочет лучше узнать LaTeX, я бы очень рекомендовал книгу «Не очень краткое введение в LaTeX2e». Она очень проста, компактна и охватывает широкий спектр возможностей LaTeX. Перевод этой книги (Б. Тоботрас) доступен по адресу: http://xtalk.msk.su/tex. О кириллизации LaTeX (включая настройку системы автоматических переносов) подробно написано в «The Linux Cyrillic HOWTO (russian)» Евгения Балдина, доступном по адресу: http://www.inp.nsk.su/~baldin. Вот как выглядят первые две страницы моего примера, свёрстанные с приведённой преамбулой (рис. 1). Незначительные изменения в преамбуле позволяют существенно изменить результат (рис. 2). Здесь документ свёрстан «двенадцатым» шрифтом в две колонки.
Итак, конвертируем POD в PostScript и PDF Вы видите, что pod2latex выдаёт достаточно «сырой» материал. С одной стороны, это хорошо, потому что из этого «материала» можно «вылепить» практически что угодно. С другой стороны, «лепить» каждый раз с нуля – не оправданно трудоёмко. В собранном мною архиве вы найдёте скрипты, выполняющие всю сборку автоматически. Принцип их действия прост. Сперва создаём «сырой» файл: pod2latex -out file file.pod
Будет создан файл file.tex (расширение добавляется автоматически). Затем чуть корректируем «сырой» файл:
программирование cat file.tex | sed 's/\\label{_}//g' | sed 's/\(subsection\)\*/\1/g' > file.tex.temp
Первый sed-конвейер уничтожает пустые метки, которые создаются из-за нашей русскоязычности. Второй sed-конвейер удаляет звёздочку во всех директивах «subsection*». Это не обязательная операция. Звёздочка говорит о том, что раздел не должен отображаться в оглавлении. Pod2latex предполагает, что в оглавление войдут только заголовки первого уровня. Обычно, это как раз то, что нужно. Но мне захотелось, чтобы все заголовки попали в оглавление. Как видите, добиться этого совсем не сложно. Далее мы присоединяем к документу преамбулу и завершение: cat doc-head-14pt.tex file.tex.temp doc-tail.tex > file-14pt.tex
Теперь мы получили полноценный LaTeX-файл file-14pt.tex. Дважды обработав его системой latex, мы получаем одноимённый dvi-файл. DVI (DeVice Independent) – стандартный формат, генерируемый системой LaTeX. Несмотря на громкое название, его не следует использовать для обмена информацией. Дело в том, что dvi-файл обычно далеко не самодостаточен. Например, он не включает графические объекты, а содержит только ссылки на них. Поэтому, если вы перенесёте dvi-файл на другую машину или просто перепишете его в другую директорию, не предприняв никаких дополнительных мер, то скорее всего его уже не удастся просмотреть или конвертировать в другой формат. К счастью, из dvi-файла можно сделать полноценный PostScriptи/или PDF-файл:
latex file-14pt.tex latex file-14pt.tex dvips -o file-14pt.ps file-14pt.dvi ps2pdf file-14pt.ps
Двойная обработка необходима, чтобы latex смог создать оглавление. Кстати, утилита dvips тоже может масштабировать документы (ключ -x). Можно было не использовать пакет scale, а отмасштабировать страницы на этапе конвертирования dvi-файла в PostScript-формат. В скрипте, который я включил в архив примеров, все эти команды вложены в цикл, в котором «собираются» две модификации документа: в одну колонку шрифтом 14pt и в две колонки шрифтом 12pt, как это было показано на рисунках. Напоследок скажу, что я даже не ставил перед собой задачу описать все опции конвертера pod2latex. Эта утилита предоставляет возможности и выделения только части документа, и включения преамбулы и завершения, указанные пользователем, и многие другие. Просто мой опыт показывает, что использование многих из этих возможностей или неоправданно, или невозможно для русскоязычных документов. Если вы хотите получить исчерпывающую информацию по pod2latex, обращайтесь к соответствующей документации perldoc pod2latex.
Графика в PostScript и PDF Для LaTeX естественным форматом представления графики является PostScript. Существуют средства, позволяющие работать и со многими другими форматами, но эти средства представлены отдельными пакетами, которые могут и
Ðèñóíîê 1
¹4, àïðåëü 2005
75
программирование не входить в ваш дистрибутив LaTeX (особенно если вы пользуетесь LaTeX под Windows). Я бы советовал работать только с PostScript, тем более что получить файл в этом формате совсем не сложно. С таким преобразованием легко может справиться, например, утилита convert из набора ImageMagic. convert file.bmp file.ps
LaTeX предоставляет множество способов вставки графики. Мой способ далеко не единственный, но, как мне кажется, наиболее неприхотливый и простой. Пользуясь предлагаемым мною макросом, вы можете легко вставить картинку в текст: =for latex \inspsfig{two.eps}{.35}{Íåòðóäíî çàìåòèòü, ÷òî, ñîâìåñòèâ äâóõ ìàëåíüêèõ äðàêîí÷èêîâ, ìû ïîëó÷èì áîëüøîãî.}
Этот параграф предназначен для LaTeX-документов (=for latex). В нём вызван мой макрос \inspsfig. Первый параметр, как вы видите, имя eps-файла. Второй – доля листа, которую должна занять картинка по горизонтали. Третий – подпись к картинке. Нумерацию рисунков LaTeX ведёт автоматически. Давайте вкратце рассмотрим, как работает этот макрос, и что в нём можно изменить и адаптировать под ваши нужды. Итак, текст макроса таков: \newcommand{\inspsfig}[3]{ \begin{figure}[!htbp] \begin{center}
Ðèñóíîê 2
76
\includegraphics[angle=0, width=#2\textwidth]{#1} \end{center} \caption{#3} %\label{text} \end{figure} }
В первой строке мы создаём новую команду \inspsfig, у которой будет три аргумента. В теле команды создаётся окружение \begin{figure}-\end{figure}. Команда \begin{figure} имеет строку-параметр, о которой следует сказать отдельно. Этот параметр определяет, где будет расположен плавающий объект (каковым является иллюстрация). В строке-параметре «!htbp» первый символ заставляет LaTeX не рассматривать большинство своих правил и стараться выполнить инструкции «во что бы то ни стало». Буква h говорит о том, что первым делом LaTeX должен попытаться разместить иллюстрацию там, где она находится в тексте документа. Если это невозможно, то LaTeX рассмотрит букву t и постарается разместить картинку вверху страницы. Если и это ему не удастся, будет рассмотрена b, предписывающая размещать плавающий объект внизу страницы. И, наконец, если все попытки закончатся неудачей, то в силу вступит инструкция p, и LaTeX выделит для плавающего объекта отдельную страницу и разместит его там. Теперь становится ясно, что если вы хотите, например, чтобы все рисунки размещались вверху страницы, то параметр должен начинаться с буквы t, за которой могут следовать альтернативные варианты. Команда \includegraphics вложена в окружение \begin {center}-\end{center}. Картинка будет отцентрована по горизонтали. Вы видите, что мы не поворачиваем картинку (angle=0), а ширину рассчитываем как произведение вто-
программирование рого параметра макроса \inspsfig на ширину текста (width=#2\textwidth). В качестве имени файла с картинкой будет использован первый параметр \inspsfig. Команда \caption задаёт подпись к рисунку. Закомментированная команда \label бывает полезна, если вы хотите ссылаться на рисунки из текста. Она (в сочетании с другими командами) позволяет автоматически поддерживать корректность ссылок. Я не буду на ней подробно останавливаться.
Конвертирование в другие форматы В большинстве случаев уже рассмотренных форматов вполне достаточно. Не надо торопиться отказываться от Post Script. Он весьма гибок. Например, вы можете сразу подготовить документ для печати в виде брошюры: pstops '4:-3L@.7(21cm,0)+0L@.7(21cm,14.85cm)' ↵ page-14pt.ps page-14pt-booklet-up.ps pstops '4:1L@.7(21cm,0)+-2L@.7(21cm,14.85cm)' ↵ page-14pt.ps page-14pt-booklet-down.ps
Теперь можно на одной стороне листов напечатать содержимое файла page-14pt-booklet-up.ps, а на другой – page14pt-booklet-down.ps и сброшюровать. Вряд ли MSWord позволит вам сделать буклет (и не только буклет) так же легко. Подробнее о pstops вы можете почитать в соответствующем man. Имея в распоряжении PostScript, легко сделать DjVu-файл или даже jpeg, что тоже может пригодиться, например, при написании подобной статьи. Следующая команда обработает файл page-12pt.ps и создаст серию файлов file001.jpeg, file002.jpeg и так далее, по одному на каждую страницу. gs -sDEVICE=jpeg \ -sOutputFile=file%03d.jpeg \ -dBATCH \ -dNOPAUSE \ -r72x72 \ page-12pt.ps
Улучшить качество изображения (и увеличить размер файлов) можно, изменив разрешение в параметре -r. Создать DjVu-файл тоже несложно. Последовательность действий во многом определяется набором инструментов, которым вы располагаете. Я могу предложить следующий алгоритм. Сперва создаём PPM-изображения каждой страницы: gs -sDEVICE=ppm \ -sOutputFile=file%d.ppm \ -dBATCH \ -dNOPAUSE \ -r120x120 \ page-12pt.ps
Далее конвертируем все страницы (пусть иx будет четыре) в формат DjVu: for i in 1 2 3 4 do cpaldjvu -dpi 120 file$i.ppm file$i.djvu done
И объединяем полученные файлы в один документ:
¹4, àïðåëü 2005
djvm -create result.djvu file1.djvu file2.djvu ↵ file3.djvu file4.djvu
В файле result.djvu объединены все страницы. Если проделать все эти операции с четырёхстраничным документом-примером к этой статье, то размер DjVu-файла составит менее 25 Кб. Если вам понадобится документ MSWord или RTF, то проще всего создать HTML-документ (конвертирование в HTML мы рассматривали в предыдущей статье), скопировать его из Explorer в Word и «сохранить как...». Хотя POD поддерживает не все существующие в природе форматы, я ни разу не сталкивался с безвыходной ситуацией.
Проверка корректности POD Для проверки корректности POD-исходника существует очень полезная программа podchecker. Если вы укажете ей опцию -warnings, то получите все возможные предупреждения. Пример: podchecker -warnings file.pod
Недостатки и перспективы POD Огромным недостатком POD является отсутствие средств формирования таблиц. Частично это компенсируется возможностью вставки формат-ориентированных фрагментов. Так, HTML-таблица может быть создана средствами HTML: =for html <table><tr><th>A</th><th>B</th></tr> <tr><td>A</td><td>B</td></tr></table>
Но если вам требуется создать множество достаточно сложных таблиц, если вы хотите видеть их в документах разных форматов, то скорее всего вам следует использовать другое средство. Существенным недостатком является и то, что POD не позволяет создавать документы, разнесённые в разные файлы. В POD-языке отсутствуют операции типа include, что не удобно при разработке больших документов. Это можно частично скомпенсировать, создавая некий гибридный документ, предназначенный для предварительной обработки каким-нибудь препроцессором, например, cpp или m4. Упростит ли это усовершенствование жизнь – решать вам. Система POD продолжает развиваться. Наиболее многообещающей мне представляется команда =encoding. Согласно документу perlpod, она должна использоваться в начале документа. Приведён даже пример (цитирую!): =encoding koi8-r
Упоминается эта команда и в perldocspec. Но я, честно говоря, так и не понял, как её использовать. Podchecker сообщает, что такая команда ему не знакома. Конвертеры предупреждают об ошибке и игнорируют её. Тем не менее, работа над форматом и средствами POD продолжается, и сделано уже немало. Работать с POD просто, приятно и эффективно.
77
программирование
ТЕХНИКА ОПТИМИЗАЦИИ ПОД LINUX ЧАСТЬ 3
Áîëüøîå òåñòîâîå ñðàâíåíèå Linux-êîìïèëÿòîðîâ ïðîäîëæàåòñÿ! Òåìà ñåãîäíÿøíåãî èññëåäîâàíèÿ – öèêëû è èõ îïòèìèçàöèÿ. Â îñíîâíîì ìû áóäåì ãîâîðèòü î òðåõ íàèáîëåå ïîïóëÿðíûõ êîìïèëÿòîðàõ – GCC 3.3.4, Intel C++ 8.0 è Microsoft Visual C++ 6.0, ê êîòîðûì òåïåðü ïðèñîåäèíèëñÿ è GCC 4.0.0 ñî ñâîèì íîâûì îïòèìèçàòîðîì öèêëîâ.
КРИС КАСПЕРСКИ По статистике до 90% времени исполнения приходится на глубоко вложенные циклы, от качества оптимизации которых зависит быстродействие всей программы в целом. Современные компиляторы поддерживают множество прогрессивных технологий оптимизации и способны буквально творить чудеса! Стратегия оптимизации циклов тесно связана с архитектурой процессора, кэш-контроллера и контроллера оперативной памяти. Это слишком объемная, можно даже сказать, монументальная тема, и в рамках настоящей статьи она не обсуждается. Читайте документацию, распространяемую фирмами Intel и AMD (причем не только по процессорам, но и по чипсету) или мою книгу «Техника оптимизации программ – эффективная работа с оперативной памятью», в ней эти вопросы освещены достаточно подробно.
Выравнивание циклов Выравнивание циклов (loop alignment) имеет много общего с выравниванием ветвлений, о котором мы уже говорили в предыдущей статье. Кратко опишем ситуацию для тех, кто не читал ее. Компиляторы msvc и icl вообще не выравнива-
78
ют циклы, располагая их в памяти как угодно. В худшем случае это приводит к трех-четырехкратному падению производительности. В среднем же теряется порядка 30%. Компилятор gcc позволяет выравнивать циклы на величину, кратную степени двойки. За это отвечает ключ -falignloops=n (по умолчанию n равен двум, что, как уже отмечалось, далеко не самая лучшая стратегия выравнивания, и лучше выравнивать циклы по границе четырех байт). Ключ -fno-align-loops (аналогичный ключу -falign-loops=1) отключает выравнивание. На уровнях оптимизации -O2 и -O3 выравнивание циклов по умолчанию включено, и отключать его было бы неразумно. Итого: ! msvc – не выравнивает. ! icl – не выравнивает. ! gcc – выравнивает по границе степени двойки.
Разворот циклов Микропроцессоры с конвейерной архитектурой (а к таковым относятся все современные x86-процессоры), плохо приспособлены для работы с циклами. Для достижения наи-
программирование высшей производительности процессору необходим достаточно протяженный участок «трассы выполнения», свободный от ветвлений. Компактные циклы вида: for(a=0;a<n;a++) *dst++= *src++;
исполняются очень медленно и для увеличения быстродействия приходится прибегать к их развороту (unrolling). Под «разворотом» в общем случае понимается многократное дублирование цикла, которое реализуется приблизительно так:
for(a=0;a<n;a++)
всегда разворачиваются на 5 итераций, а оставшиеся (n % 5) итераций выполняются в отдельном неразвернутом цикле. Циклы с ветвлениями разворачиваются только при трансформации в линейный код (при этом ветвления, естественно, исчезают): for (a=0; a<3;a++) if (a%2) x[a]++; else x[a]--;
преобразуется в: x[0]--; x[1]++; x[2]--;
Ëèñòèíã 1. Öèêë äî ðàçâîðîòà for(i=1; i<n;i+) k += (n % i); Ëèñòèíã 2. Öèêë ïîñëå ðàçâîðîòà (áîëüøèé ðàçìåð — áîëüøàÿ ñêîðîñòü) // ðàçâîðîò öèêëà íà 4 èòåðàöèè // âûïîëíÿåì ïåðâûå n – (n % 4) èòåðàöèé for(i=1; i<n;i+=4) { k += (n % i) + \ (n % i+1) + \ (n % i+2) + \ (n % i+3); } // âûïîëíÿåì îñòàâøèåñÿ èòåðàöèè for(i-=4; i<n;i++) k += (n % i); Ëèñòèíã 3. Öèêë ïîñëå ðàçâîðîòà (ìåíüøèé ðàçìåð, ìåíüøàÿ ñêîðîñòü — ìàøèííîå ïðåäñòàâëåíèå i++ íàìíîãî áîëåå êîìïàêòíî, ÷åì i+const, îäíàêî åñëè âûðàæåíèÿ …(n % i+const_1) + (n % i+const_2) … ìîãóò âûïîëíÿòüñÿ îäíîâðåìåííî, òî …(n % i++) + (n % i++)… âû÷èñëÿþòñÿ ïîñëåäîâàòåëüíî, ïîñêîëüêó ñîäåðæàò çàâèñèìîñòü ïî äàííûì) for(i=1; { k += (n % (n % (n % }
i<(n-3);) (n % i++) + \ i++) + \ i++) + \ i++);
for(;i<n;i++) k += (n % i);
Компилятор msvc вообще не разворачивает циклы, и эту работу приходится выполнять вручную. Компилятор icl разворачивает только циклы for по сценарию больший размер – большая скорость. Причем циклы с заранее известным количеством итераций: for(a=0;a<const;a++)
где const <= 32 трансформируются в линейный код, и цикл как таковой при этом исчезает (см. раздел «Шелушение циклов»). Как следствие – размер программы существенно возрастает, а вместе с ним возрастает и риск «вылететь» за пределы кэша первого уровня, после чего производительность упадет так, что не поднимешь и домкратом. Если const >32, цикл разворачивается на количество итераций, кратное const, но не более 16, при этом компилятор учитывает число инструкций в теле цикла – более компактные циклы разворачиваются на большее число итераций. Циклы, количество итераций которых компилятору неизвестно:
¹4, àïðåëü 2005
Компилятор gcc по умолчанию не разворачивает циклы даже на уровне оптимизации O3, и делает это только с ключом -funroll-all-loops, поддерживающим все виды циклов, а не только цикл for. Циклы с известным количеством итераций, где const <= 32 разворачиваются полностью, при const > 32 – приблизительно на 4 итерации (точное значение зависит от количества инструкций в теле цикла). Если внутри цикла присутствуют одно или несколько ветвлений, при развороте они неизбежно дублируются, в результате чего производительность оказывается даже ниже, чем была до оптимизации! Циклы с неизвестным количеством итераций не разворачиваются вообще. Для тонкой настройки существуют ключи max-unrolled-insns (максимальное количество инструкций, при котором цикл еще может быть развернут, и если он будет развернут, это значение определяет величину разворота), max-average-unrolled-insns (максимальное среднее количество инструкций, которое цикл может иметь после разворота) и max-unroll-times (максимальная степень разворота). Разворот по всех случаях выполняется по сценарию больший размер – большая скорость. Итого: ! msvc: ! не разворачивает никакие циклы. ! icl: ! циклы с переменным количеством итераций разворачивает на 5 итераций; ! циклы с cost <= 32 разворачивает полностью; ! циклы с const > 32 разворачивает на величину, кратную const, но не больше 10h; ! учитывает количество инструкций в цикле; ! циклы разворачиваются по сценарию: больший размер – большая скорость. ! gcc: ! на уровне O3 по умолчанию не разворачивает; ! циклы с переменным количеством итераций никогда не разворачиваются; ! циклы с постоянным количеством итераций развариачиваются приблизительно на 4 итерации (но тут все зависит от числа инструкций).
Шелушение циклов Идея шелушения циклов (по-английски «peeling») заключается в «сдирании» с цикла одной или нескольких итераций с последующей трансформацией в линейный код. Фактически шелушение циклов является частным случаем раз-
79
программирование ворота, однако, область его применения этим не ограничивается. Рассмотрим следующий код: Ëèñòèíã 4. Êàíäèäàò íà îïòèìèçàöèþ for(i=0; i<n; i++) a[i] = b[i] + 1; for(j=0; j<n+1; j++) c[j] = d[j] – 1;
Чтобы объединить оба цикла в один (см. раздел «Объединение циклов»), необходимо «содрать» с цикла j одну «лишнюю» итерацию:
}
sum sum sum sum
+= += += +=
a[i]; a[i+1]; a[i+2]; a[i+3];
for (i -= 4; i<XXL; i++) sum += a[i];
Все три рассматриваемых компилятора поддерживают данную стратегию оптимизации. Итого: ! msvc – фальцует. ! gcc – фальцует. ! icl – фальцует.
Ëèñòèíã 5. Îïòèìèçèðîâàííûé âàðèàíò
Векторизация
for(i = 0; { a[i] = c[i] = } c[i] =
Начиная с Pentium MMX, в x86-процессорах появилась поддержка векторных команд (они же «мультимедийные команды»). К сожалению, в ANSI C векторные операции отсутствуют, а нестандартные языковые расширения создают проблему переносимости, поэтому вся забота по векторизации циклов ложится на компилятор. Он должен проанализировать исходный код и определить, какие операции могут выполняться параллельно, а какие нет. Допустим, исходный цикл выглядел так:
i < n; i++) b[i] + 1; d[i] - 1; d[i] - 1;
Компилятор msvc шелушить циклы не умеет, icl и gcc – умеют, но особой радости от этого никто не испытывает, поскольку они никогда не комбинируют шелушение с другими приемами оптимизации, что практически полностью его обесценивает. А вот компиляторы от SUN или HewlettPackard – комбинируют! Компилятор gcc содержит специальный ключ -fpeelloops, полностью разворачивающий циклы с небольшим количеством итераций. Пороговое значение назначается ключами: max-peel-times (сколько итераций можно сдирать с одного цикла), max-completely-peel-times (максимальное количество итераций цикла, который еще может быть развернут), max-completely-peeled-insns (максимальное количество инструкций, при которых цикл еще может быть развернут) и max-peeled-insns (максимальное количество инструкций развернутого цикла). Итого: ! msvc – не шелушит. ! gcc – шелушит. ! icl – шелушит.
Фальцевание циклов Фальцевание циклов (fold loops) внешне очень похоже на разворот, но преследует совсем другие цели, а именно: увеличение количества потоков данных на одну итерацию. Чем выше плотность (strength) потоков, тем выше параллелизм обработки данных, а, значит и скорость выполнения цикла. Рассмотрим следующий пример: Ëèñòèíã 6. Íåîïòèìèçèðîâàííûé âàðèàíò – îäèí ïîòîê äàííûõ íà èòåðàöèþ for(i=0; i<XXL; i++) sum += a[i];
Чтобы сократить время выполнения цикла, необходимо увеличить количество потоков, переписав наш код так: Ëèñòèíã 7. Îïòèìèçèðîâàííûé âàðèàíò — ÷åòûðå ïîòîêà äàííûõ íà èòåðàöèþ for(i=0; i<XXL; i += 4)
80
{
Ëèñòèíã 8. Öèêë äî âåêòîðèçàöèè for(i=0; i<XXL; i++) a[i] += b[i];
Используя общепринятую векторную нотацию, его можно переписать следующим образом: Ëèñòèíã 9. Òîò æå öèêë, çàïèñàííûé â âåêòîðíîé íîòàöèè a[0:N] = a[0:N] + b[0:N];
Старшие представители процессоров Pentium могут обрабатывать до 8 порций данных параллельно, и если N превышает это число, приходится поступать так: Ëèñòèíã 10. Öèêë ïîñëå âåêòîðèçàöèè // îáðàáàòûâàåì ïåðâûå (N-N%VF) ÿ÷ååê âåêòîðíûì ñïîñîáîì // VF –êîëè÷åñòâî ïîðöèé äàííûõ, êîòîðûå ïðîöåññîð áóäåò // îáðàáàòûâàòü çà îäèí ðàç for (i=0; i<XXL; i+=VF) a[i:i+VF] = a[i:i+VF] + b[i:i+VF]; // îáðàáàòûâàåì îñòàâøèéñÿ «õâîñò» îáû÷íûì ñïîñîáîì for (i -= VF ; i < XXL; i++) a[i] = a[i] + b[i];
Однако эта методика срабатывает далеко не всегда. Вот пример цикла, который нельзя векторизовать: Ëèñòèíã 11. Öèêë, êîòîðûé íåëüçÿ âåêòîðèçîâàòü for (i=1; i<XXL; i++) a[i] = a[i-1] + b[i];
Поскольку последующая ячейка (a[i]) вычисляется на основе предыдущей (a[i-1]), данные не могут обрабатываться параллельно. Компилятор msvc не поддерживает векторизацию, а icl
программирование поддерживает, но задействует ее только в том случае, если указан ключ -ax. Компилятор gcc поддерживает векторизацию только начиная с версии 3.4.3, да и то если присутствует флаг -ftree-vectorize. Итого: ! msvc – не векторизует. ! icl – векторизует. ! gcc – векторизует начиная с версии 3.4.3.
Вернемся к листингу 3. Хотя загрузка обрабатываемых ячеек происходит параллельно (практически параллельно, они будут ползти по конвейеру, находясь на различных стадиях готовности), следующая операция сложения не может быть начата до тех пор, пока не будет завершена предыдущая. Для усиления параллелизма необходимо суммировать все ячейки в своих переменных, как показано ниже: Ëèñòèíã 14. Îïòèìèçèðîâàííûé âàðèàíò
Автопараллелизм Многопроцессорные машины на рабочем столе – это не утопия, а объективная данность, и с каждым годом их количество будет только расти. В операционных системах семейства Linux многозначность заканчивается на уровне потоков (в старых ядрах – процессов). Всякий поток в каждый момент времени может выполняться только на одном процессоре. Программы, состоящие целиком из одного потока, на многопроцессорной машине исполняются с той же скоростью, что и на однопроцессорной. Некоторые компиляторы автоматически разбивают большие (с их точки зрения) циклы на несколько циклов меньшего размера, помещая каждый из них в свой поток. Такая техника оптимизации называется автопараллелизмом (auto-parallelization). Продемонстрируем ее на следующем примере: Ëèñòèíã 12. Íåîïòèìèçèðîâàííûé âàðèàíò for (i=0; i<XXL; i++) a[i] = a[i] + b[i] * c[i];
Поскольку зависимость по данным отсутствует, цикл можно разбить на два. Первый будет обрабатывать ячейки от 0 до XXL/2, а второй – от XXL/2 до XXL. Тогда на двухпроцессорной машине скорость выполнения цикла практически удвоится. А если еще учесть, что многопроцессорные машины, как правило, имеют MMX-команды, да использовать векторизацию...
// îáðàáàòûâàåì ïåðâûå XXL – (XXL % 4) èòåðàöèé for(i=0; i<XXL;i+=4) {
}
sum_1 sum_2 sum_3 sum_4
+= += += +=
a[i+0]; a[i+2]; a[i+3]; a[i+4];
// îáðàáàòûâàåì îñòàâøèéñÿ «õâîñò» for(i-=XXL; i<XXL;i++) sum += a[i]; // ñêëàäûâàåì âñå âîåäèíî sum += sum_1 + sum_2 + sum_3 + sum_4;
Такая техника оптимизации называется программной конвейеризацией (software pipelining), и из трех рассматриваемых компиляторов ею не обладает ни один. Только gcc робко пытается ослабить зависимость по sum, используя два регистра при развороте на четыре итерации. Остальные же компиляторы грузят все ячейки в один и тот же регистр, очевидно, руководствуясь принципом экономии. Регистров общего назначения всего семь, и их постоянно не хватает. К сожалению, компилятор не отличает ситуацию действительно дефицита регистров от их избытка, вынуждая нас прибегать к ручной оптимизации. Итого: ! msvc – программная конвейеризация не поддерживается. ! icl – программная конвейеризация не поддерживается. ! gcc – программная конвейеризация частично поддерживается.
Ëèñòèíã 13. Îïòèìèçèðîâàííûé âàðèàíò /* ïîòîê A */ for (i=0; i<XXL/2; i++) a[i] = a[i] + b[i] * c[i]; /* ïîòîê B */ for (i=XXL/2; i<XXL; i++) a[i] = a[i] + b[i] * c[i];
Компилятор icl – единственный из всех трех, способный на «параллелизацию» циклов. Чтобы ее задействовать, используйте ключ –parallel, только помните, что при выполнении кода на однопроцессорных машинах, оптимизация дает обратный эффект (накладные расходы на организацию потоков дают о себе знать). Итого: ! msvc – автопараллелизм не поддерживается. ! icl – автопараллелизм поддерживается. ! gcc – автопараллелизм не поддерживается.
Предвычисление индуктивных циклов Цикл называется индуктивным, если его тело целиком состоит из выражения, последующее значение которого вычисляется на основе предыдущего. Легко доказать, что значение индуктивного цикла зависит только от количества итераций и начального значения аргументов выражения, благодаря чему оно может быть вычислено еще на стадии компиляции. Рассмотрим следующий пример: Ëèñòèíã 15. Èíäóêòèâíûé öèêë äî îïòèìèçàöèè for (i=0; i<XXL; i++) sum++;
Очевидно, что конечное значение sum равно: Ëèñòèíã 16. Èíäóêòèâíûé öèêë ïîñëå îïòèìèçàöèè
Программная конвейеризация
sum += XXL;
Разворот цикла традиционными методами (см. раздел «Разматывание циклов») порождает зависимость по данным.
Компилятор msvc всегда пытается предвычислить зна-
¹4, àïðåëü 2005
81
программирование чение индуктивного цикла, однако далеко не всегда это ему удается, особенно если индуктивное выражение представляет собой сложную математическую формулу. Два остальных компилятора оставляют индуктивные циклы такими, какие они есть, даже не пытаясь их оптимизировать! Итого: ! msvc – предвычисляет некоторые индуктивные циклы. ! icl – не предвычисляет индуктивные циклы. ! gcc – не предвычисляет индуктивные циклы.
} else { }
}
return result;
return fact(n - 1, result * n);
Вызов функции – достаточно «дорогостоящая» операция, и от него лучше избавиться. Это легко! Хвостовая рекурсия легко трансформируется в цикл. Смотрите: Ëèñòèíã 20. Õâîñòîâàÿ ðåêóðñèÿ ïîñëå îïòèìèçàöèè
Разбивка длинных цепочек зависимостей Если индуктивный цикл предвычислить не удалось, необходимо по крайней мере ослабить зависимость между итерациями, чтобы они могли исполняться параллельно. Рассмотрим следующий код: Ëèñòèíã 17. Èíäóêòèâíûé öèêë äî îïòèìèçàöèè for(i=0;i<XXL;i++) { x += 2; a[i] = x; }
Выражение (a[i]=x) не может быть выполнено до тех пор, пока не будет вычислено (x+=2), а оно в свою очередь должно дожидаться завершения предыдущей итерации. Индукция однако! От нее можно избавится, вычисляя значение n-ой итерации на «лету»: Ëèñòèíã 18. Èíäóêòèâíûé öèêë ïîñëå îïòèìèçàöèè for(i=0;i<XXL;i++) { a[i] = i*2 + x; }
Расплатой за отказ от индукции становится появление «лишней» инструкции умножения, однако накладные расходы на ее выполнение с лихвой окупаются конвейеризацией (а при желании и векторизацией!) цикла. Такая техника оптимизации называется «разбивка длинных цепочек зависимостей» (breaks long dependency chains) и реализована только в gcc, начиная с версии 4.0 (за это отвечает ключ -fsplit-ivs-in-unroller), а все остальные рассматриваемые компиляторы на это, увы, не способны. Итого: ! msvc – не разбивает длинные цепочки зависимостей. ! icl – не разбивает длинные цепочки зависимостей. ! gcc – разбивает длинные цепочки зависимостей.
Устранение хвостовой рекурсии Хвостовой рекурсией (tail recursion) называется такой тип рекурсии, при котором вызов рекурсивной функции следует непосредственно за оператором return. Классическим примером может служить алгоритм вычисления факториала: Ëèñòèíã 19. Õâîñòîâàÿ ðåêóðñèÿ äî îïòèìèçàöèè int fact(int n, int result) { if(n == 0) {
82
for(i=0; i<n; i++) result *= n;
Компиляторы msvc и gcc всегда разворачивают хвостовую рекурсию в цикл, а вот icl этого делать не умеет. Итого: ! msvc – устраняет хвостовую рекурсию. ! icl – не устраняет хвостовую рекурсию. ! gcc – устраняет хвостовую рекурсию.
Объединение циклов Несколько циклов с одинаковым заголовком могут быть объединены в один, что сокращает накладные расходы на его организацию. Эта методика имеет множество названий – loops fusion, merge loops, jam loops, создающих большую путаницу и вводящих программистов в заблуждение. В действительности же это не три различные стратегии оптимизации, а всего одна, но какая! Продемонстрируем ее на следующем примере: Ëèñòèíã 21. Öèêëû äî îáúåäèíåíèÿ (íåîïòèìèçèðîâàííûé âàðèàíò) for(i=0; i<XXL; i++) a[i] = b[i] + 1; for(j=0; j<XXL; j++) d[j] = ó[j] -1;
Поскольку заголовки обоих циклов абсолютно идентичны, нам достаточно лишь «коллективизировать» их содержимое: Ëèñòèíã 22. Öèêëû ïîñëå îáúåäèíåíèÿ (îïòèìèçèðîâàííûé âàðèàíò) for(i = 0; i < XXL; i++) { a[i] = b[i] + 1; d[j] = ó[j] -1; }
А вот более сложный пример: Ëèñòèíã 23. Êàíäèäàò íà îïòèìèçàöèþ ïóòåì îáúåäèíåíèÿ for(i=0; a[i] for(j=0; d[j]
i<XXL; i++) = b[i] + 1; j<XXL-1; j++) = ó[j] -1;
Непосредственно объединить циклы невозможно, поскольку цикл j на одну итерацию короче. Чтобы уравнять оба заголовка в правах, предварительно необходимо «содрать» (см. «loop peeling» фирменного руководства) с цикла i одну итерацию:
программирование Ëèñòèíã 24. Îïòèìèçèðîâàííûé âàðèàíò for(i = 0; i < XXL; i++) { a[i] = b[i] + 1; d[i] = ó[i] -1; }
a[i] = b[i] + 1;
Документация на компилятор icl утверждает: объединение циклов как будто бы поддерживается (см. главу «loop transformation» фирменного руководства), однако дизассемблирование показывает, что это не так. Остальные компиляторы объединение циклов также не выполняют. Итого: ! msvc – не объединяет циклы. ! icl – не объединяет циклы. ! gcc – не объединяет циклы.
и если они к этому времени уже заняты ячейками остальных потоков, происходит их неизбежное вытеснение из кэша, многократно снижающее производительность. Рассмотрим следующий пример: Ëèñòèíã 27. Íåîïòèìèçèðîâàííûé âàðèàíò for(j = 0; j < n; j++) { c[j] = 0; for(i = 0; i<m; i++) a[j][i] = a[j][i] + b[j][i] * c[j]; }
Чтобы сократить количество потоков данных, следует вынести выражение (c[j] = 0) в отдельный цикл, переписав код так: Ëèñòèíã 28. Îïòèìèçèðîâàííûé âàðèàíò
Разматывание циклов Разматывание циклов (loop spreading) представляет собой разновидность шелушения, при котором «содранные» итерации упаковываются в самостоятельный цикл, что бывает полезным, например, при объединении двух циклов с «разнополыми» заголовками. Рассмотрим следующий код: Ëèñòèíã 25. Äâà öèêëà ñ ðàçëè÷íûì êîëè÷åñòâîì èòåðàöèé (íåîïòèìèçèðîâàííûé âàðèàíò) for(i=0; i<n; i++;) a[i] = a[i] + c; for(j=0; j<m; j++;) s[j] = s[j] + s[j+1];
Если n не равно m, полное объединение циклов i и j уже невозможно, но min(n,m) итераций мы все же можем объединить: Ëèñòèíã 26. ×àñòè÷íîå îáúåäèíåíèå öèêëîâ ïóòåì «ðàçìàòûâàíèÿ» (îïòèìèçèðîâàííûé âàðèàíò) for(i=0; i<min(n,m); i++;) { a[i] = a[i] + c; s[i] = s[i] + s[i+1]; } for(i = min(n,m); i<max(n,m); i++;) s[i] = s[i] + s[i+1];
Ни msvc, ни icl, ни gcc способностью к «разматыванию» циклов не обладают, однако это умеют делать, например, компиляторы от Hewlett-Packard. Итого: ! msvc – не разматывает циклы. ! icl – не разматывает циклы. ! gcc – не разматывает циклы.
for(j = 0; j < n; j++) c[j] = 0; for(i=0; i<m; i++) for(j = 0; j < n; j++) a[j][i] = a[j][i] + b[j][i] * c[j];
Компилятор icl именно так и поступает, снимая это бремя с плеч программиста. Остальные рассматриваемые компиляторы этой способностью, увы, не обладают. Итого: ! msvc – не расщепляет циклы. ! icl – расщепляет циклы. ! gcc – не расщепляет циклы.
Нормализация циклов Нормализованным называется цикл, начинающийся с нуля, и в каждой итерации увеличивающий свое значение на единицу, а приведение произвольного цикла к указанной форме называется его нормализацией (loop normalization). Принято считать, что на большинстве архитектур нормализованный цикл компилируется в более компактный и быстродействующий код, однако в отношении x86-процессоров это совсем не так, и более компактным оказывается цикл, стремящийся к нулю (см. раздел «Стремление циклов к нулю»). Тем не менее нормализация бывает полезной, например, при объединении двух циклов с различными заголовками. Если эти циклы предварительно нормализовать, тогда они будут отличаться друг от друга всего лишь числом итераций, а как объединять циклы с несовпадающим количеством итераций, мы уже знаем (см. раздел «Разматывание циклов»). Возьмем произвольный цикл: Ëèñòèíã 29. Íåíîðìàëèçîâàííûé öèêë
Расщепление циклов Расщепление циклов (loop distribution, loop fission, loop splitting…) прямо противоположно их объединению. К такому трюку прибегают в тех случаях, когда оптимизируемый цикл содержит слишком много данных. Ассоциативность кэш-памяти первого уровня у большинства x86-процессоров равна четырем, реже – восьми, а это значит, что каждая обрабатываемая ячейка данных может претендовать лишь на одну из четырех (восьми) возможных кэш-линеек
¹4, àïðåëü 2005
for (i = lower; i < upper; i+=(-incre)) { // òåëî öèêëà }
В общем случае стратегия нормализации выглядит так: Ëèñòèíã 30. Íîðìàëèçîâàííûé öèêë for (NCL = 0; i < (upper - lower + incre)/incre - 1; 1) {
83
программирование i = incre*NLC + lower; // òåëî öèêëà
} i = incre * _max((upper - lower + incre)/incre, 0) + lower;
Легко показать, что нормализация дает выигрыш только на циклах с заранее известным количеством итераций, позволяющих вычислить значение выражения (upper lower + incre)/incre еще на стадии компиляции. Все три рассматриваемых компилятора поддерживают нормализацию циклов (см. раздел «loop normalization» в документации на icl и описание ключа -fivcanon компилятора gcc), но не всегда ею пользуются. Рассмотрим следующий пример: Ëèñòèíã 31. Íåíîðìàëèçîâàííûé öèêë int i, x[10]; for(i=1; i<10; i++) x[i]=i-1;
Очевидно, что его можно нормализовать, избавляясь от операции вычитания в выражении (i-1): Ëèñòèíã 32. Íîðìàëèçîâàííûé öèêë int i, x[10]; int *p; p = &x[1]; for(i=0; i<9; i++) p[i]=i;
Поразительно, но ни один из трех рассматриваемых компиляторов этого не делает, поэтому все они получают незачет. Итого: ! msvc – нормализует некоторые циклы. ! icl – нормализует некоторые циклы. ! gcc – нормализует некоторые циклы.
Масштабирование циклов Масштабированием (scaling) в общем случае называется умножение индекса массива на некоторое, как правило, целочисленное значение, например, x = a[4*i]. Идея масштабирования циклов заключается в выносе множителя в индуктивный инкремент счетчика цикла. Допустим, исходный цикл выглядел так:
оставляя цикл немасштабированным даже тогда, когда это ему явно не помешало бы. Итого: ! msvc – масштабирует некоторые циклы. ! icl – масштабирует некоторые циклы. ! gcс – масштабирует некоторые циклы.
Замена циклов с предусловием на циклы с постусловием Циклы с предусловием (for, while) содержат по меньшей мере на одно ветвление больше, чем аналогичные им циклы с постусловием. Как нетрудно сообразить – в конце цикла с предусловием находится безусловный переход, возвращающий управление в начало, а в цикле с постусловием передача управления по «совместительству» еще выполняет и проверку условия. Все три рассматриваемых компилятора всегда заменяют циклы с предусловием на циклы с постусловием, когда это выгодно. Итого: ! msvc – заменяет циклы с предусловием на циклы с постусловием. ! icl – заменяет циклы с предусловием на циклы с постусловием. ! gcc – заменяет циклы с предусловием на циклы с постусловием.
Стремление циклов к нулю На большинстве процессорных архитектур инструкция декремента (уменьшения регистра на единицу) автоматически взводит специальный флаг при достижении нуля, поэтому, цикл, стремящийся к нулю (incrementing by zero, хотя правильнее было назвать его decrementing by zero), намного выгоден как с точки зрения компактности, так и с точки зрения быстродействия. Операция инкремента при достижении нужного нам значения (n) никаких флагов, конечно, не возводит, поэтому приходится тратить процессорное время на операцию сравнения. Рассмотрим следующий код: Ëèñòèíã 35. Íåîïòèìèçèðîâàííûé âàðèàíò
Ëèñòèíã 33. Èñõîäíûé öèêë (íåîïòèìèçèðîâàííûé âàðèàíò) for(i=0; i < XXL; i++) a[4*i]= b[i];
После масштабирования он приобретает следующий вид:
for(i=0; i<n; i++) printf("hello!\n");
Поскольку никаких обращений к счетчику цикла здесь нет, его можно развернуть в обратном направлении. Это легко. А вот пример посложнее: Ëèñòèíã 36. Íåîïòèìèçèðîâàííûé âàðèàíò
Ëèñòèíã 34. Öèêë ïîñëå ìàñøòàáèðîâàíèÿ (îïòèìèçèðîâàííûé âàðèàíò) for(i=0; i < 2*XXL; i+=2) a[i]= *b++;
В времена XT/AT такая оптимизация еще имела смысл, но начиная с 80386, в процессорах появилась аппаратная поддержка масштабирования на 2х, 4х, 8х и с некоторыми ограничениями на 3х, 5х и 9х, поэтому масштабировать такие циклы уже не нужно. Масштабирование поддерживают все три рассматриваемых компилятора, но пользуются им довольно неумело,
84
for(i=0;i<n; i++) sum+=a[i];
В этом случае за трансформацию цикла приходится расплачиваться усложнением его тела, однако несмотря на это скорость выполнения все равно возрастает: Ëèñòèíã 37. Îïòèìèçèðîâàííûé âàðèàíò i=n; do { sum+=*a; a++; } while(--i);
программирование Компилятор msvc всегда стремится генерировать циклы, стремящиеся к нулю, icl этого не делает вообще, а gcc прибегает к трансформации циклов только в некоторых наиболее очевидных случаях. В частности, он избегает трогать циклы, содержащие ссылки на память. Итого: ! msvc – всегда устремляет циклы к нулю. ! icl – никогда не устремляет циклы к нулю. ! gcc – устремляет некоторые циклы к нулю.
Отказ от branch-count-reg Многие микропроцессоры имеют специальную команду: «уменьши-регистр-на-единицу-и-ветвись-если-нуль» (branchcount-reg). На x86-процессорах этим занимается LOOP, часто встречающаяся в ассемблерных вставках начинающих программистов, но практически никогда в коде, сгенерированном компилятором. И вовсе не потому, что компилятор «тупой», а потому, что эта инструкция медленная, хотя и компактная. Компиляторы msvc и icl никогда ее не используют, а gcc предоставляет специальный ключ -fbranch-count-reg, предписывающий выбирать LOOP вместо DEC reg/JNZ begin_loop, (см. раздел «Стремление циклов к нулю»), правда, до машинного она все равно не доживает и уничтожается оптимизатором. Итого: ! msvc – не использует branch-count-reg. ! icl – не использует branch-count-reg. ! gcc – не использует branch-count-reg.
Вынос инвариантных ветвлений Ветвления, инвариантные по отношению к циклу, могут быть вынесены за его пределы путем расщепления одного цикла на два или более. Размеры кода при этом возрастают, но и производительность увеличивается (конечно, при условии, что цикл влезает в кэш). Покажем это на следующем примере: Ëèñòèíã 38. Öèêë ñ èíâàðèàíòíûì âåòâëåíèåì (íåîïòèìèçèðîâàííûé âàðèàíò) for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (flag < 0x669) a[i][j]=i+j; else a[i][j]=0; } }
Поскольку ветвление if (n < 0x669) инвариантно по отношению к циклу j, мы от него избавляемся: Ëèñòèíã 39. Îïòèìèçèðîâàííûé âàðèàíò if (flag < 0x669) for (i = 0; i < n; i++) for (j = 0; j < n; j++) a[i][j]=i+j; else for (i = 0; i < n; i++) for (j = 0; j < n; j++) a[i][j]=0;
На суперкомпьютерных компиляторах такая техника оптимизации используется уже давно и называется loop
¹4, àïðåëü 2005
promotion, loop interchange или loop unswitching, но на PC она впервые появилась только в последней версии компилятора gcc. Этим заведует ключ -funswitch-loops (задействовать вынос инвариантных ветвлений), max-unswitch-insns (максимальное количество инструкций, которое может иметь «расщепляемый» цикл) и max-unswitch-level (максимальное количество инвариантных ветвлений, которые может иметь «расщепляемый цикл»). Приверженцы остальных компиляторов пока вынуждены выносить инварианты самостоятельно. Итого: ! msvc – не выносит инвариантные ветвления. ! icl – не выносит инвариантные ветвления. ! gcc – выносит инвариантные ветвления, начиная с версии 3.4.3.
Ротация ветвлений Бесконечные циклы с выходом по break могут быть преобразованы в конечные циклы с постусловием. При этом тело цикла как бы прокручивается, чтобы оператор break переместился на место while(1), а сам while(1) сомкнулся с оператором do и «коллапсировал». Продемонстрируем это на следующем примере: Ëèñòèíã 40. Íåîïòèìèçèðîâàííûé âàðèàíò do {
printf("1é îïåðàòîð öèêëà\n"); if (--a<0) break; printf("2é îïåðàòîð öèêëà\n"); } while(1);
После ротации ветвлений наш код будет выглядеть так: Ëèñòèíã 41. Îïòèìèçèðîâàííûé âàðèàíò // äóáëèðóåì îïåðàòîðû öèêëà, ðàñïîëîæåííûå äî break printf("1-é îïåðàòîð öèêëà\n"); a--; // à äîëæåí ëè âîîáùå âûïîëíÿòüñÿ îñòàòîê öèêëà? if (a>=0) { a++; do { // ïîñëå òðàíñôîðìàöèè âòîðîé îïåðàòîð // ñòàë ïåðâûì printf("2-é îïåðàòîð\n");
}
// …à ïåðâûé îïåðàòîð — âòîðûì printf("1-é îïåðàòîð öèêëà\n"); } while(–-a<0); // ñþäà ïîïàëî óñëîâèå èç if - break
Из всех трех рассматриваемых компиляторов удалять лишние ветвления умеет лишь один msvc. Итого: ! msvc – выполняет ротацию ветвлений. ! icl – не выполняет ротацию ветвлений. ! gcc – не выполняет ротацию ветвлений.
Упорядочение обращений к памяти При обращении к одной-единственной ячейке памяти в кэш первого уровня загружается целая строка, длина которой в зависимости от типа процессора варьируется от 32 до 128 или даже 256 байт, поэтому большие массивы выгоднее всего обрабатывать по строкам, а не по столбцам. К сожа-
85
программирование лению, многие программисты об этом забывают и отдуваться приходится компилятору: Ëèñòèíã 42. Îáðàáîòêà ìàññèâîâ ïî ñòîëáöàì (íåîïòèìèçèðîâàííûé âàðèàíò) for(j=0;j<m;j++) for(i=0;i<n;i++) a[i][j] = b[i][j] + c[i][j];
Здесь три массива обрабатываются по столбцам, что крайне непроизводительно и для достижения наивысшей эффективности циклы i и j следует поменять местами. Устоявшегося названия у данной методики оптимизации нет, и в каждом источнике она называется по-разному: loop permutation/interchange/reversing, rearranging array dimensions и т. д. Как бы там ни было, результирующий код выглядит так: Ëèñòèíã 43. Îáðàáîòêà ìàññèâîâ ïî ñòîëáöàì (îïòèìèçèðîâàííûé âàðèàíò) for(i=0;i<n;i++) for(j=0;j<m;j++) a[i][j] = b[i][j] + c[i][j];
Все три рассматриваемых компилятора поддерживают данную стратегию оптимизации, однако их интеллектуальные способности очень ограничены и со следующим примером не справился ни один. Ëèñòèíã 44. Ñëîæíûé ñëó÷àé îáðàáîòêè äàííûõ ïî ñòîëáöàì for (i=0; i<n; i++) for (j=0; j<n; j++) for (k=0; k<n; k++) a[j][i] = a[j][i] + b[k][i] * c[j][k];
А вот компиляторы от Hewlett-Packard оптимизируют этот цикл так (хвост цикла для простоты не показан): Òàáëèöà1. Ñâîáîäíàÿ òàáëèöà êà÷åñòâà îïòèìèçàöèè
86
Ëèñòèíã 45. Îïòèìèçèðîâàííûé âàðèàíò ñ ðàçâîðîòîì íà 4 èòåðàöèè (îáðàòèòå âíèìàíèå, êàêîé öèêë áûë ðàçâåðíóò!) for(i=0; i<n; i+=4) { for (j=0; j<n; j++) { for (k=0; k<n; k++) { a[j][i] = a[j][i] + b[k][i] * c[j][k]; a[j][i+1] = a[j][i+1] + b[k][i+1] * c[j][k]; a[j][i+2] = a[j][i+2] + b[k][i+2] * c[j][k]; a[j][i+3] = a[j][i+3] + b[k][i+3] * c[j][k]; } } }
Оптимизатор скомбинировал сразу три методики: разворот, объединение и переупорядочение циклов, благодаря чему скорость выполнения значительно возросла. К сожалению, еще долгое время PC-программистам придется оптимизировать свои программы самостоятельно, хотя стремительное совершенствование gcc дает робкую надежду на изменение ситуации. Итого: ! msvc – частично упорядочивает обращения к памяти. ! icl – частично упорядочивает обращения к памяти. ! gcc – частично упорядочивает обращения к памяти.
Заключение Прогресс не стоит на месте, и со времени появления msvc компиляторы сделали большой шаг вперед. Особенно порадовал gcc 4.0.0 с его новым оптимизатором циклов, который намного превосходит icl и msvc вместе взятые. Тем не менее до совершенства ему еще далеко. Некоторые техники, присутствующие еще в msvc, в нем не реализованы (например, ротация ветвлений), не говоря уже про «серьезные» компиляторы от Hewlett-Packard. Так что на компилятор надейся, а сам не плошай!
bugtraq Межсайтовый скриптинг в Oracle Reports Server
Обход ограничений безопасности в Kerio Personal Firewall
Программа: Oracle Reports Server 10g (9.0.4.3.3). Опасность: Низкая. Описание: Уязвимость позволяет удаленному пользователю произвести XSS-нападение и получить доступ к потенциально важным данным других пользователей. Уязвимость существует из-за некорректной фильтрации входных данных в демонстрационном сценарии test.jsp. Удаленный пользователь может с помощью специально сформированного URL выполнить произвольный HTML-сценарий в браузере жертвы. Пример:
Программа: Kerio Personal Firewall 4.1.2 и более ранние версии. Опасность: Низкая. Описание: Уязвимость существует из-за ошибки, которая позволяет злонамеренному процессу выдать себя за разрешенное приложение. Удачная эксплуатация уязвимости позволит злонамеренному процессу или локальному пользователю обойти правила ограничения межсетевого экрана и получить доступ к Интернету. URL производителя: www.kerio.com. Решение: Установите обновления от производителя.
http://[target]/reports/examples/Tools/test.jsp? ↵ repprod&desname='&lt;script&gt; ↵ alert(document.cookie);&lt;/script&gt; http: //[target]/reports/examples/Tools/test.jsp? ↵ repprod"&lt;script;&gt;alert(document.cookie); ↵ &lt;/script&gt;
URL производителя: http://www.oracle.com. Решение: Способов устранения уязвимости не существует в настоящее время.
Отказ в обслуживании в продуктах Symantec Программа: Symantec Norton System Works, Symantec Norton Internet Security, Symantec Norton AntiVirus версии 2004, 2005. Опасность: Средняя. Описание: Уязвимость существует в модуле AutoProtect. Злоумышленник может специальным образом создать или изменить файл и вызвать отказ в обслуживании системы. Злоумышленник может потребить все возможные ресурсы системы при включенной опции SmartScan. Программное обеспечение некорректно обрабатывает переименование файлов. URL производителя: www.symantec.com. Решение: Установите обновления от производителя.
Удаленное переполнение буфера в telnet-клиенте на различных платформах Программа: telnet-клиент на многих UNIX-системах. Опасность: Средняя. Описание: Уязвимость обнаружена в функции slc_add_ reply(). Злонамеренный telnet-сервер может послать клиенту большое количество специально сформированных LINEMODE Set Local Character (SLC)-команд и вызвать переполнение буфера. Пример: perl -e 'print "\377", "\372\42\3\377\377\3\3" x 43, ↵ "\377\360"' | nc -l 23
Уязвимость в функции env_opt_add() при обработке escape-символов может позволить злонамеренному серверу вызвать переполнение буфера. Удаленный злонамеренный сервер может выполнить произвольный код на системе клиента с привилегиями пользователя, запустившего telnet-приложение. Большинство клиентов на BSD-системах уязвимы. Решение: Установите обновления от производителя.
¹4, àïðåëü 2005
Переполнение буфера при обработке MIME-вложений в Sylpheed Программа: Sylpheed 0.8.0 – 1.0.3. Опасность: Высокая. Описание: Уязвимость существует при обработке вложения с зашифрованным в MIME-формате именем файла в e-mail-сообщении. Удаленный пользователь может создать специальным образом e-mail-сообщение и выполнить произвольный код на целевой системе с привилегиями пользователя, запустившего Sylpheed. URL производителя: sylpheed.good-day.net. Решение: Установите последнюю версию 1.0.4 от производителя.
Отказ в обслуживании при обработке SACK-опций в OpenBSD Программа: OpenBSD 3.5, 3.6. Опасность: Высокая. Описание: Уязвимость существует в файлах tcp_input.c и tcp_usrreq.c. Удаленный пользователь может послать системе специально сформированные TCP-пакеты, содержащие некорректные SACK-опции, что приведет к ошибке в TCP-стеке. Атакующий может вызвать отказ в обслуживании системы. URL производителя: www.openbsd.org. Решение: Установите патчи от производителя.
Переполнение буфера в Microsoft Jet database Программа: Microsoft Jet database msjet40.dll версия библиотеки 4.00.8618.0. Опасность: Высокая. Описание: Уязвимость существует из-за недостаточной обработки входных данных при обработке имен файлов баз данных в компоненте msjet40.dll. Удаленный пользователь может создать специальным образом .mdb-файл, который при открытии его целевым пользователем выполнить произвольный код на системе. URL производителя: www.microsoft.com. Решение: Способов устранения уязвимости не существует в настоящее время.
Составил Александр Антипов
87
образование
СЕРВЕР ДЛЯ ШКОЛ Сегодня как никогда велик интерес к использованию свободного ПО в учебных заведениях. Если к применению GNU/ Linux, как признанного флагмана движения Open Source, на настольных системах предстоит еще пройти долгий путь, то на серверах положение не так плачевно. Энтузиасты уже давно используют преимущества свободного ПО, остается только подобрать необходимые приложения, чтобы решить возникшие задачи. OpenAdministrationforSchools – OpenAdmin (http://richtech.ca/openadmin/index.html) представляет собой свободный Open Source-проект, предназначенный для решения задач по автоматизации учета, сбора и вывода информации, адаптированный для применения в школах и других, в том числе и высших учебных заведениях. Вся собранная информация сохраняется в базе данных, доступ к которой осуществляется при помощи веб-сервера, поэтому OpenAdmin не диктует особых требований к клиентскому ПО. Во избежание проблем с безопасностью для выдачи информации различным группам пользователей используются раздельные виртуальные веб-узлы. Так, каждая школа имеет по умолчанию три веб-узла. Все они защищены паролем. Кроме того, учителя используют индивидуальный пароль на преподавательском сайте, а устанавливаемые для удобства работы cookies имеют короткий период действия по умолчанию. Для доступа к данным на родительском и студенческом сайтах также используются индивидуальные логин и пароль. Отдельный виртуальный сайт может использоваться для вывода информации третьим лицам, что позволяет избежать делегирования прав. При этом если преподаватели ведут отдельные курсы со своими программами, для их учета используется отдельный сайт (iep). В дальнейшем планируется полная поддержка https, но пока этим заниматься придется самому. Распространяется OpenAdmin по лицензии GNU GPL. Единственное обстоятельство,затрудняющее применение OpenAdmin в наших условиях, состоит в том, что интерфейс системы сугубо английский, хотя с учетом того, что все данные хранятся в обычных текстовых файлах, перевод можно проделать самостоятельно по мере ввода сервера в эксплуатацию. По сравнению с трудоемкостью заполнения самой базы и оптимизацией количества действительно необходимых записей это будет не так уж тяжело. Итак, в настоящее время OpenAdmin позволяет хранить и выводить по запросу следующую информацию: ! Student Demographics – все необходимые сведения об учащихся, причем можно занести не только стандартные паспортные, контактные данные и сведения о родителях, но и при необходимости этническую, религиозную, медицинскую и другую информацию, а также организовать поиск, отбор, предварительный анализ и вывод фактически по каждому пункту. ! Attendance System – сюда заносятся данные о посещаемости, а точнее отсутствии учащихся на занятиях. Позволяет отследить посещаемость ученика не только по
88
СЕРГЕЙ ЯРЕМЧУК
!
!
!
!
дням, но и по занятиям и конкретным темам. По результатам можно вывести разнообразные отчеты, включающие в том числе и информацию по различным группам, получить сведения о студентах, хорошо посещающих занятия, или наоборот, вывести список заядлых прогульщиков. Discipline – простой дисциплинарный модуль, поможет контролировать дисциплину учащихся. Записи можно вводить без ограничения объема, при потребности удалять, плюс для удобства учета можно создать до шести категорий нарушений. Как результат можно вывести все проделки, совершенные отдельными учащимися, в школе в целом, статистику в течение определенного периода, что позволит выявить специфические виды проблем. Gradebook – функция, доступная только с сайта преподавателей и позволяет выставлять оценки по предметам и тестам. Кроме ведения общей статистики, автоматически вычисляется средний бал успеваемости, который затем может быть выведен на родительском сайте. Report Card System – гибкая система генерации отчетов с выводом до 20 сообщений в теме при неограниченном количестве тем, кроме web может выводиться в файл формата PDF, что очень удобно при распечатывании. Parent Viewing – скрипты, позволяющие родителям просматривать результаты успеваемости, посещаемости и поведение своих чад.
Кроме того, имеются специальные модули экспорта/импорта, позволяющие легко переносить данные учащихся, например при их переходе в другую школу. Вполне естественно, что никто не запрещает добавить или, наоборот, удалить лишние компоненты и записи, изменить значение и положение полей, создать дополнительные отчеты и прочее.
Установка сервера OpenAdmin Сервер OpenAdmin полностью построен на основе свободных компонентов. Все применяемые скрипты написаны на Perl, для хранения информации используется база данных MySQL. В качестве веб-сервера может быть использован любой продукт, поддерживающий виртуальные узлы. Разработчиками рекомендуется Apache. Кроме этого, необходимо наличие LibXML2 (http://www.xmlsoft.org), OpenSSL (http://www.openssl.org), TeX и нескольких модулей Perl. В большинстве дистрибутивов GNU/Linux все эти компоненты, как правило, уже имеются. Если же в качестве сервера используется Windows, то придется позаботиться об их инсталляции. Перед тем как начать установку – общая информация о структуре веб-сервера. Каждая школа по умолчанию имеет три отдельных веб-узла. Один предназначен для общего управления содержанием, т.е. администрирования, второй предназначен для преподавателей и третий – для учащихся и их родителей. Все эти сайты находятся в архиве каталога school в соответствующих папках. Скрипты и сайт ад-
образование министрирования – в admin и cgi, преподавательский сайт – в tadmin и tcgi, родительский – в padmin и pcgi. При этом на одном веб-сервере можно одновременно разместить сайты нескольких школ, настройки этих серверов находятся в разных каталогах со структурой, описанной выше. Два сайта sis (Student Information System) и iep предназначены для специального (централизованного) доступа ко всем информационным ресурсам. Так как все эти сайты находятся на одном сервере, то необходимо обеспечить разрешение имен, прописав все узлы в файле /etc/hosts (что безопаснее) или в настройках DNS-сервера. Чтобы меньше путаться в настройках, разработчики рекомендуют создать для школьных сайтов отдельный каталог, в котором и разместить всю вышеописанную иерархию.
ет, и устанавливаем его владельцем вновь созданных каталогов: # chown -R apache:apache /schools
А для каталогов cgi устанавливаем права доступа в 755: # chmod 755
/schools/4school/cgi
При необходимости можно установить логотип учебного заведения, заменив файл logo.gif и logotn.gif в подкаталоге admin/images. Теперь можно приступить к созданию необходимой базы данных. # mysql -u root myschool -p
# # # #
mkdir /schools cd /schools cp /tmp/openadmin-1.70.tar.gz tar xvzf openadmin-1.70.tar.gz
Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 to server version: 3.23.58 Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
Для того чтобы в дальнейшем была возможность расширять сервер, добавляя новые учебные заведения, создадим для школы отдельную папку, в которую скопируем шаблоны с сайтами. # mkdir 4school # cp -r /schools/school /schools/4schoo
Смотрим в файле веб-сервера Apache httpd.conf в строках User и Group, от имени какого пользователя он работа-
¹4, àïðåëü 2005
Назначаем необходимые привилегии, чтобы не работать от имени администратора. mysql> grant all on myschool.* to school@localhost identifiedby 'schoolpasswd'; Query OK, 0 rows affected (0.01 sec) mysql> quit
И при помощи файла blank.sql, содержащего необходимые команды, создаем таблицы в нашей базе данных. # mysql -p -u school myschool < /schools/utility/blank.sql
89
образование Если будет использована SIS, то в целях безопасности необходимо создать отдельного пользователя, обладающего правами только на выборку данных из таблиц школ (select). Специальный ресурс iep имеет свою структуру таблиц базы данных, для создания которых используются файлы iepdata.sql и iepstruct.sql. Теперь об Apache. В конце файла httpd.conf имеется секция «Virtual Hosts», в которой даны примеры и краткие комментарии по настройке виртуальных веб-узлов. Фактически для минимальной настройки необходимо будет создать три одинаковых секции, отличающиеся параметрами Document Root, ServerName и ScriptAlias. Для учительского и администраторского сайта, кроме того, создаются разделы, ограничивающие доступ. ### Ïðîâåðüòå íàëè÷èå ýòèõ ñòðîê AddTypetext/html .shtml AddHandler server-parsed .shtml ### Section 3: Virtual Hosts NameVirtualHost schools ### Àäìèíèñòðàòîðñêèé ñàéò <VirtualHost schools> ServerAdmin grinder@ua.fm DocumentRoot /schools/4school/admin ServerName admin.schools.com ErrorLog logs/schools.error_log CustomLog logs/schools.access_log common ScriptAlias /cgi-bin "/schools/4school/cgi" </VirtualHost> ### Îãðàíè÷èâàåì äîñòóï <Directory ”/schools/4school/admin”> Authtype Basic Authname Admin
90
AuthUserFile /usr/local/apache/private/admin4school Options +Includes <Limit GET POST> require valid-user </Limit> </Directory> <Directory ”/schools/4school/cgi”> Authtype Basic Authname Admin AuthUserFile /usr/local/apache/private/admin4school <Limit GET POST> require valid-user </Limit> </Directory> </VirtualHost> ### Ó÷èòåëüñêèé ñàéò <VirtualHost schools> ServerAdmin grinder@ua.fm DocumentRoot /schools/4school/tadmin ServerName teacher.schools.com ErrorLog logs/schools.error_log CustomLog logs/schools.access_log common ScriptAlias /cgi-bin "/schools/4school/tcgi" </VirtualHost> ### Îãðàíè÷èâàåì äîñòóï <Directory ”/schools/4school/tadmin”> Authtype Basic Authname teacher AuthUserFile /usr/local/apache/private/teacher4school Options +Includes <Limit GET POST> require valid-user </Limit> </Directory> <Directory ”/schools/4school/tcgi”> Authtype Basic Authname Admin AuthUserFile /usr/local/apache/private/admin4school <Limit GET POST> require valid-user </Limit>
образование </Directory> </VirtualHost> ### Ðîäèòåëüñêî-ñòóäåí÷åñêèé ñàéò <VirtualHost schools> ServerAdmin grinder@ua.fm DocumentRoot /schools/4school/padmin ServerName parent.schools.com ErrorLog logs/schools.error_log CustomLog logs/schools.access_log common ScriptAlias /cgi-bin "/schools/4school/pcgi" </VirtualHost>
Теперь проверяем правильность новых настроек. # apachectl configtest Syntax OK
Создаем пароли для каждого пользователя. # htpasswd /usr/local/apache/private/teacher4school physicist
Перезапускаем веб-сервер. # /etc/init.d/httpd restart Останавливается httpd: Запускается httpd:
[ ОК ] [ ОК ]
И наконец, последний этап. В подкаталогах cgi и tcgi имеются файлы admin.conf, в которых необходимо изменить параметры для доступа к базе данных, расположение каталогов администраторского и учительского серверов, местонахождение утилиты pdflatex и почтовый адрес администратора, который будет выводиться в случае ошибок. В дальнейшем для упрощения настроек планируется использовать один такой файл, расположенный в /etc. При внима-
¹4, àïðåëü 2005
тельном подходе к чтению на данном этапе все три сервера должны работать. Единственная проблема, с которой вы можете столкнуться, – это занесение в базу данных больших объемов информации. Регистрация одного-двух десятков учеников – терпима, но если их число превышает несколько сотен, то этот процесс превратится в настоящий кошмар. Для удобства рекомендуется воспользоваться скриптом studentupload.pl, который находится в подкаталоге utility. Этот скрипт считывает файл в формате CSV (Comma Separated Values) и заносит все сведения в базу данных. По умолчанию сценарий считывает 40 параметров и перед началом использования его необходимо подправить под свои требования. При работе скрипт не обновляет файл cgi/entry/studentnumber, в котором хранятся номера следующей записи, поэтому, чтобы не получились записи с одинаковыми порядковыми номерами, цифру в нем необходимо подправить самому. Если все же это произошло, то в решении проблемы могут помочь скрипты dupcheck.pl и sentry2.pl. Несмотря на то что OpenAdmin ориентирован в первую очередь на применение в учебных заведениях, его наработки вполне можно использовать и в своих проектах, связанных с учетом большого количества персонала. Например, в библиотеках, дополнительно создав отдельную таблицу с книгами и используя поля оценок, контролировать для выданную литературу. Впрочем, вариантов много. По крайней мере, есть от чего оттолкнуться при возникновении такой задачи. Это довольно полезный инструмент, позволяющий избежать большого количества рутинной ручной работы.
91
книжная полка Профессиональное руководство по SQL Server: хранимые процедуры, XML, HTML Кен Хендерсон
Антихакинг в сети. Трюки. 100 профессиональных примеров Эндрю Локхарт
Книга рассчитана на программистов и разработчиков, которые имеют представление о Transact-SQL и создании хранимых процедур. Ни для кого не секрет, что за счет грамотного использования хранимых процедур происходит многократное увеличение производительности приложения. Что входит в число освещенных тем? Непосредственно хранимые процедуры, объекты (обработка ошибок, триггеры, представления), технологии HTML, XML, .NET, которые, как правило, сопутствуют любой разработке, связанной с хранимыми процедурами. Особенно стоит отметить, что в книге рассмотрены такие сложные темы, как отладка и профилирование, автоматизация. Отдельная глава посвящена недокументированным возможностям Transact-SQL. Достаточно интересны размышления автора о производительности приложений. На прилагающемся диске вы найдете более 700 различных SQL-сценариев, исходный код всех примеров из книги, а также различные утилиты для разработчиков.
Издание является переводом «Network security hacks» издательства O'Reilly. В книге содержится описание 100 трюков, с помощью которых можно существенно повысить степень защищенности вверенной вам сети. Затронуты основные области безопасности: защита узла UNIX, безопасность узла Windows, сетевая безопасность, протоколирование, наблюдение и выявление тенденций, защита каналов связи, обнаружение сетевого вторжения, восстановление и ответные действия. Достаточно подробно рассказано про создание VPN-сети, рассмотрены различные межсетевые экраны, система обнаружения атак Snort, и множество других, не менее интересных тем. Книга, по сути, является сборником статей, выполненных в стиле mini-howto. Изложенный материал рассчитан на широкий круг читателей, от новичков до системных администраторов с солидным стажем. Издание прежде всего следует порекомендовать всем без исключения администраторам UNIX/Linux-систем.
Издательство «Питер», 2005 г. – 620 стр. ISBN 5-469-00046-X.
Издательство «Питер», 2005 г. – 296 стр. ISBN 5-496-00385-x.
Информационная безопасность предприятия Искандер Конеев Андрей Беляев В наше время тема информационной безопасности актуальна для всех, начиная с маленьких офисов, и заканчивая крупными компаниями с множеством филиалов. Среди рассмотренных тем: общие понятия информационной безопасности, классификация информационных систем, описаны типовые модели нападения, методики оценки рисков. Отдельная часть книги посвящена криптографии, в которой рассмотрена симметричная и асимметричная криптография, рассказано о различных криптографических протоколах. Подробно изложено о методах защиты. В приложении вы можете найти примеры форматов различных административных документов. После прочтения читатель приобретет знания, необходимые для грамотного создания и обслуживания IT-инфраструктуры предприятия. Книга хорошо систематизирована, излагаемый материал написан простым и доступным языком и будет полезным приобретением для системных и сетевых администраторов.
Основы построения трансляторов. Учебное пособие Ю.Г. Карпов Материал, изложенный в книге, рассчитан прежде всего на преподавателей технических вузов и студентов. Автор – авторитетнейший человек в этой области – доктор технических наук, профессор, член Американского Математического общества с 1975 г. В книге рассмотрены формальные модели грамматик и языков, методы синтаксического анализа формальных языков. Подробно рассмотрен вопрос генерации кода в современных компиляторах, сети Петри. Особенно подробно рассмотрены такие темы, как постановка базовых проблем формальных языков, понимание основных задач построения трансляторов. Отдельная глава посвящена грамматике Хомского. После прочтения книги читатель получит знания, достаточные для проектирования и разработки транслятора с собственного несложного языка. Нельзя не отметить большое количество примеров и задач к каждой главе, которые помогают наилучшим образом усвоить прочитанный материал. Издательство «Питер», 2005 г. – 272 стр. ISBN 5-94157-285-9.
Издательство «Питер», 2005 г. – 752 стр. ISBN 5-94157-280-X.
Рубрику ведет Александр Байрак
¹4, àïðåëü 2005
93
bugtraq Отказ в обслуживании в PHP в функции getimagesize() Программа: версии до 4.3.11 и 5.0.4. Опасность: Средняя. Описание: Уязвимость обнаружена в функциях php_handle_ iff() и php_handle_jpeg(), доступных из функции getimagesize(). Функция getimagesize() используется для определения размеров и разрешения изображений различных форматов: GIF, JPG, PNG, TIFF и т. д. Отказ в обслуживании возможен в функции php_handle_ iff() файла ext/standard/image.c из-за некорректной обработки входного потока данных. Удаленный пользователь может создать специальным образом файл, указать размер равным -8, что заставит функцию зациклиться и приведет к потреблению всех возможных ресурсов на системе. Уязвимость в функции php_handle_jpeg() существует изза недостаточной обработки входных данных в заголовках файлов формата JPEG. Злоумышленник может создать специальным образом файл и заставить приложение потреблять все возможные ресурсы на системе. URL производителя: www.php.net. Решение: Установите исправление от производителя.
Отказ в обслуживании в Computer Associates eTrust Intrusion Detection System Программа: Computer Associates eTrust Intrusion Detection System 3.0. Опасность: Высокая. Описание: Уязвимость существует из-за недостаточной проверки значений, передаваемых Microsoft Crypto API функции CPImportKey. Большое количество данных приведет к генерации исключения и память не будет освобождена. Удаленный пользователь может создать специально сформированный пакет и потребить все доступные ресурсы на системе. URL производителя: http://www3.ca.com/Solutions/Product.asp?ID=163. Решение: Установите обновление от производителя.
Обход авторизации в реализации IKE Xauth в Cisco Программа: Cisco 12.2T, 12.3, и 12.3T. Опасность: Средняя. Описание: Удаленный пользователь может послать специально сформированный пакет на порт UDP 500 службы Cisco Easy VPN Server Xauth version 6, удачно закончить Xauthаутентификацию и получить доступ к ресурсам сети. Для удачной эксплуатации уязвимости атакующий должен знать публичный ключ группы для удачного завершения первой IKE-фазы. Вторая уязвимость связана с некорректной обработкой ISAKMP-профиля в Cisco 12.3(8)T, когда профиль присвоен пользователю, но атрибуты не обработаны. Удаленный неавторизованный пользователь может досрочно начать 2-ю фазу переговоров и удачно пройти аутентификацию. URL производителя: www.cisco.com Решение: Установите обновления с сайта производителя.
Раскрытие важной информации в Mozilla Программа: Mozilla 1.7.6 и более ранние версии, Mozilla Firefox 1.0.2 и более ранние версии. Опасность: Средняя. Описание: Уязвимость обнаружена при обработке Javascript «lambda-выражений» в функции find_replen() файла js/src/ jsstr.c. Удаленный пользователь может получить доступ к потенциально важной информации на целевой системе. Пример/Эксплоит: http://cubic.xfo.org.ru/firefox-bug/index.html. URL производителя: www.mozilla.org. Решение: Установите обновление от производителя.
Удаленное переполнение буфера в MailEnable Программа: MailEnable Enterprise 1.04 и более ранние версии, MailEnable Professional 1.54 и более ранние версии. Опасность: Критическая. Описание: Уязвимость существует при обработке Unicodeсимволов в команде EHLO в SMTP-службе. MailEnable интерпретирует Unicode-символ как адрес в памяти и при попытке обратиться к нему аварийно завершает работу. Подобная уязвимость существует также IMAP-службе. Удаленный пользователь может выполнить произвольный код на целевой системе с привилегиями уязвимой службы. Пример: EHLO x99
URL производителя: www.mailenable.com. Решение: Установите обновление от производителя.
Отказ в обслуживании в Сisco при использовании SSH+TACACS Программа: Сisco IOS 12.0S (SSH version 1), IOS 12.1T (SSH version 1), IOS 12.2 (SSH version 1), IOS 12.2T (SSH version 1), IOS 12.3T (SSH version 2). Опасность: Средняя. Описание: Уязвимость позволяет удаленному пользователю перегрузить устройство, если используется SSH-сервер 2-й версии вместе с TACACS: ! Если устройство сконфигурировано для авторизации пользователей с помощью TACACS+ и имя учетной записи содержит доменное имя, устройство будет перегружено. ! Если в процессе аутентификации пользователя, когда сервер ожидает от пользователя ответ с именем учетной записи и паролем, авторизованный пользователь шлет устройству команду send, устройство будет перегружено. ! Если логировние сообщений перенаправляется SSHсессией с помощью команды terminal monitor, устройству будут посылаться данные этой сессии, даже если сессия уже завершена. Утечка памяти возможна в процессе авторизации при использовании SSH версий 1 и 2. Удаленный пользователь может вызвать отказ в обслуживании. URL производителя: www.cisco.com. Решение: Установите обновление от производителя.
Составил Александр Антипов
94
подписка на II полугодие 2005 Российская Федерация ! Подписной индекс: 81655
Каталог агентства «Роспечать»
!
Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» Альтернативные подписные агентства: Агентство «Интер-Почта» (095) 500-00-60, курьерская доставка по Москве Агентство «Вся Пресса» (095) 787-34-47 Агентство «Курьер-Прессервис» Агентство «ООО Урал-Пресс» (343) 375-62-74 Подписка On-line http://www.arzy.ru http://www.gazety.ru http://www.presscafe.ru
!
! Подписной индекс: 87836
!
!
! Казахстан
!
! !
СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры АРЗИ: ! Азербайджан – по объединенному каталогу российских изданий через предприятие по распространению печати «Гасид» (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
Подписные индексы:
81655 по каталогу агентства «Роспечать»
87836 по каталогу агентства «Пресса России»
¹4, àïðåëü 2005
95
СИСТЕМНЫЙ АДМИНИСТРАТОР №4(29), Апрель, 2005 год РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Редакторы Андрей Бешков Валентин Синицын Алексей Барабанов Михаил Платов РЕКЛАМНАЯ СЛУЖБА тел./факс: (095) 928-8253 Константин Меделян reсlama@samag.ru Верстка и оформление imposer@samag.ru maker_up@samag.ru Дизайн обложки Николай Петрочук 107045, г. Москва, Ананьевский переулок, дом 4/2 стр. 1 тел./факс: (095) 928-8253 Internet: www.samag.ru РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета» Отпечатано типографией ГП «Московская Типография №13» Тираж 8400 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002г.)
ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Технологии IP-телефонии Часть 1 – исторический экскурс Данная статья является первой из цикла, посвященного изучению теоретических и практических аспектов систем IP-телефонии. Как водится, начнем мы с теории, а именно – с изучения прошлого и настоящего основных протоколов IP-телефонии. Затем мы рассмотрим основные продукты, эти протоколы реализующие. После чего плавно перейдем к практической части – настройке наиболее популярных общедоступных решений.
Решение проблем производительности Microsoft SQL Server Microsoft SQL Server обладает большим набором инструментов для анализа его состояния и устранения узких мест в производительности. Однако часто бывает непонятно, как воспользоваться этим богатством, когда сервер вдруг начал работать медленно. В статье рассматриваются типичные причины падения скорости работы Microsoft SQL Server 2000 и методы их диагностики и устранения.
Solaris 10 на рабочей станции К лету нынешнего года Sun Microsistems обещает закончить открытие исходных кодов своей новой операционной системы Solaris 10. Исходники будут доступны по лицензии CDDL на специально созданном сайте. И хотя пока невозможно определенно сказать, насколь-
ко удачно пойдут дела у Sun Microsistems, и удастся ли Solaris получить приток «свежей крови» благодаря открытию исходных кодов, посмотреть, что же представляет из себя эта операционная система, без сомнения, стоит.
Базовая HTTP-авторизация – защита от честных людей Базовая авторизация используется повсеместно для ограничения доступа к «личным кабинетам», «панелям управления», администраторским веб-интерфейсам, форумам и многим другим вебресурсам. Думаю, рядовым пользователям сети будет любопытно узнать, как работает это средство и насколько оно надёжно? Начинающим веб-мастерам будет интересно, как его подключить? А веб-программисты со стажем наверняка задавались вопросом, можно ли усилить защиту?
Файловая система USF/FFS и ее восстановление Файловая система USF (равно как и ее наследница FFS) практически недокументирована, и основным источником информации становятся исходные тексты и заголовочные файлы, в которых далеко не каждый с ходу сможет разобраться. Готовых утилит для восстановления тоже нет. А ведь USF/FFS – это основная файловая система FreeBSD, под которой вращается множество серверов и рабочих станций. В масштабах сообщества FreeBSD разрушения данных случаются постоянно. Хотите узнать, как противостоять энтропии? Тогда читайте эту статью.
Уважаемые читатели! За содержание статьи ответственность несет автор. За содержание рекламного обьявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены. Редакция оставляет за собой право изменять содержание следующих номеров.
96
Спешите оформить подписку на второе полугодие 2005 года! Приобрести новые и старые номера журнала вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru. Доставка почтой в любую точку России.