ТР О ТИ РАС РА КУ Ж ПИ
НИ НО КУ ВО ЛЫ ГО ЗА ДНИ ТЯ Е НУ ЛИ
ЛИ
СЬ
Так видит журнал читатель, который забыл оформить подписку:
КО НЕО НЧ ЖИ ИЛ ДА ИС НН ЬД О ЕН ЬГ И
Настраиваем Kerberos поверх LDAP Open-Xchange – свободу группам!
ЗА
ПО АВ СЛ РА Е О Л НА ТПУ РА СКА БО ТЕ
УЕ ХА Л
ВО ТП УС К
КА
БЫ С
№7(32) ИЮЛЬ 2005 подписной индекс 81655 www.samag.ru
Есть ли жизнь без антивируса? Так видит журнал читатель, оформивший подписку:
Запускаем spamd на FreeBSD Проверяем HTTP-трафик на лету Настраиваем WSUS Устанавливаем связку Postfix + Exchange Удаленно управляем BIOS Setup
Роспечать – 81655 Пресса России – 87836 Интер-почта – тел. (095) 500-00-60
№7(32) июль 2005
ПОДПИШИТЕСЬ И ЧИТАЙТЕ!
Автоматизируем подключение баз 1С новой версии 8.0
оглавление 2 СОБЫТИЯ 3 ТЕНДЕНЦИИ БЕЗОПАСНОСТЬ 4 Проверяем HTTP-трафик на лету
Настраиваем антивирус-прокси на основе ClamAV и HTTP AntiVirus Proxy. Андрей Маркелов andrew@markelov.net
6 DansGuardian + ClamAV
Фильтруем веб-содержимое и строим антивирусную защиту. Андрей Авраменко liksx@mail.ru
9 Проактивные системы защиты, или Есть ли жизнь без антивируса?
Обзор приложений, способных конкурировать с антивирусами. Сергей Яремчук grinder@ua.fm
14 Запускаем spamd на FreeBSD
Тонкости настройки программы для эффективного блокирования спама. Сергей Супрунов amsand@rambler.ru
20 Развертываем Heimdal Kerberos
Инфраструктура Kerberos в локальной сети. Михаил Кондрин mkondrin@hppi.troitsk.ru
26 Настраиваем Kerberos поверх LDAP...
… и получаем однородную информационную среду для аутентификации и авторизации пользователей в Linux. Алексей Барабанов alekseybb@mail.ru
АДМИНИСТРИРОВАНИЕ 32 Asterisk и Linux: миссия IP-телефония Действие 2
Как подключить Asterisk к обычной телефонной сети. Михаил Платов platov@cs.vsu.ru
39 FreeBSD tips: работаем с TFTP
Для некоторых задач возможности протокола FTP оказываются избыточными. Чтобы не тратить ресурсы на их поддержку, воспользуемся TFTP. Сергей Супрунов amsand@rambler.ru
42 Устанавливаем связку Postfix + Exchange
Как организовать внутрикорпоративный документооборот на базе MS Exchange, оставив пользователям возможность общаться по электронной почте с внешним миром, и при этом не уменьшить уровень внутренней безопасности? Владимир Агапов onix@deepnet.ru
46 Автоматизация MS Windows, или AutoIt как мечта эникейщика. Часть 4
Диск с автоматически установленной ОС Windows готов. Теперь и рядовой сотрудник компании сможет установить новую и переустановить поврежденную станцию без локального участия системного администратора. Алексей Барабанов alekseybb@mail.ru
№7, июль 2005
48 Автоматизируем подключение баз 1С новой версии 8.0
Рассматриваем новый механизм подключения баз 1C. Иван Коробко ikorobko@prosv.ru
54 Устанавливаем и настраиваем Windows Server Update Services
Служба WSUS облегчит отслеживание выхода новых версий программ, позволит своевременно устанавливать обновления, и, как следствие, повысит уровень безопасности информационной системы вашей компании. Сергей Сергеев sergs13@yandex.ru
60 Open-Xchange – свободу группам!
Появилась альтернатива MS Exchange и Lotus Notes – теперь нам доступна свободная версия Novell/SUSE Linux Open-Xchange сервера. Павел Лебедев lebedev.pavel@gmail.com
HARDWARE 66 LinuxBIOS – фундамент для Linux?
Спроектированная для работы в многоузловых кластерных системах, технология LinuxBIOS сегодня может быть использована не только в серверах, но и в рабочих станциях. Так что же это – еще один BIOS или чтото большее? Антон Борисов a.borisov@tesv.tmb.ru
70 Удаленно управляем BIOS Setup
Каждый из вас сталкивался с необходимостью войти в BIOS Setup и слегка его «подкрутить» или починить «рухнувшую» Windows NT, Linux/FreeBSD. Традиционно эта задача решается при помощи мыши и клавиатуры, но что делать, если сервер физически недоступен? Крис Касперски kk@sendmail.ru
ПРОГРАММИРОВАНИЕ 76 Разрабатываем информационные системы на PHP методом визуального программирования
Если вы часто создаете веб-приложения на языке PHP, вам пригодится инструмент, позволяющий строить PHP-код информационных систем в автоматическом режиме. Евгений Воякин evgy@mail.ru
WEB 82 История развития сайтостроения
Оценим текущее состояние WWW и определим его будущее развитие. Алексей Моисеев tsaralex@alpe.ru
86 Кто, куда, зачем пришел, или Анализируем логи веб-сервера
На каждом веб-сайте работает счетчик посещений. И это неудивительно: всем нам интересно, а кому-то еще и важно для бизнеса, сколько раз пользователи всемирной паутины посещали наш сайт. Денис Городецкий denik27@nm.ru
93 КНИЖНАЯ ПОЛКА 59, 94
BUGTRAQ 1
события 15-17 сентября
Open Source Forum’2005, п. Архыз Некоммерческая общественная организация «ITX community» совместно с Северо-Кавказской группой пользователей Linux «NC LUG» приглашают вас принять участие во втором Международном форуме «Open Source Forum’05», намеченном на 15-17 сентября 2005 года в посёлке Архыз, пансионат компании «ЮгТехМонтаж». Цель форума: съезд IT- специалистов для обмена мнениями, опытом в разработке решений на базе Open Source, практикой внедрения. Все подробности предстоящего события, а также регистрация слушателей и докладчиков на http://lug.kmv.ru/news. php?extend.465 и http://itx.ru/projects/osf/index.html.
27 сентября – 1 октября
SofTool пройдет уже в 16-й раз Ежегодная выставка «СОФТУЛ», отметившая в прошлом году свое 15-летие, будет проводиться в период с 27 сентября по 1 октября 2005 года в Москве, в 69-м павильоне ВВЦ. Выставка «СОФТУЛ» является самым крупным и представительным российским форумом новейших разработок в области информационных технологий и их применения в экономике страны. В этом году в выставке примут участие более 300 компаний и ожидается свыше 60 000 посетителей. Трудно переоценить значение этой выставки для развития российской компьютерной индустрии. Председателем оргкомитета выставки является член президиума Российской академии наук, академик, директор ИРЭ РАН Ю.В. Гуляев, а в числе участников фигурируют такие известные компании, как 1С, ABBYY Software House, Галактика, ГАРАНТ, Консультант Плюс, Лаборатория Касперского, ПРОМТ, РЕЛЭКС, Intel, Microsoft и другие. В рамках выставки также проходит 6-я Всероссийская конференция «Информационные технологии в России». Конференция включает несколько разделов по ключевым направлениям развития IT: Управление, Информационная безопасность, ИТ в образовании. Выставка в этом году включает в себя 5 расширенных экспозиций со своими секциями конференции: Документооборот (DOCFLOW), LinuxLand, АСУТП’Экспо, САПР’Экспо, ИТ в медицине и фармации.
Выставка LinuxLand на SofTool’2005 В этом году впервые в истории выставки под ее эгидой будет проводиться специализированная секция – LinuxLand, предназначенная для компаний, работающих в области Open Source. Ее организатором выступит портал Линуксцентр (httt:\\ www.linuxcenter.ru). На LinuxLand планируется собрать все Linux-компании в одном секторе выставочной площади, выделяющемся среди остальных стендов особой застройкой, приподнятым подиумным полом и освещением. В рамках LinuxLand будет организована Демо-Зона, где посетители выставки смогут непосредственно познакомиться с предлагаемыми решениями для корпоративных, домашних поль-
2
зователей и миграции с Windows. Помимо этого будет проведена конференция по вопросам использования Linux в бизнесе, образовании и обеспечении информационной безопасности. Организаторами конференции являются портал Линуксцентр и компания Linux INK. Помимо собственного сектора выставки Linux будет активно использоваться и в традиционных для SofTool областях. Участникам ежегодных Софтулийских игр будут предложены задания по тематике Open Source, будут проведены Linux-конкурсы для школьников и студентов как наиболее активных и обучаемых членов компьютерного сообщества. Посетители интернет-кафе смогут воспользоваться терминалами с предустановленной ОС Linux. Более подробную информацию о LinuxLand можно получить на официальном сайте выставки по адресу: http:\\ www.linuxland.ru.
13-16 октября
ISDEF’2005: инвестиции в будущее Открыта регистрация на четвертую ежегодную международную конференцию ISDEF’2005. Одной из центральных тем для обсуждения в этом году станет развитие софтверных компаний. Ассоциация ISDEF («Форум независимых разработчиков программного обеспечения») объявляет о начале регистрации участников четвертой международной конференции ISDEF’2005, которая пройдет в гостинице «Holiday Inn» (п. Виноградово, 4 км от МКАД по Дмитровскому шоссе) с 13 по 16 октября 2005 года. Международная конференция ISDEF – это знаковое мероприятие не только для российского, но и мирового IT-рынка. Ежегодно ISDEF собирает все большее количество посетителей со всего мира. В прошлом году ISDEF’2004 собрал около 500 участников, среди которых не только разработчики и производители программного обеспечения, но и журналисты, крупнейшие дистрибьюторы и паблишеры ПО, представители инвестиционных и юридических компаний, государственных организаций и финансовых структур. В этом году самыми насыщенными и объемными (как по количеству участников, так и продолжительности) станут секции, посвященные развитию компаний. Выбор темы обусловлен в первую очередь новым этапом становления российских компаний-производителей ПО, работающих как на отечественный, так и западный рынок. От стадии становления российские софтверные компании переходят к этапу бурного роста, сталкиваясь с необходимостью грамотно решать проблемы по эффективному управлению, продвижению продуктов на международный рынок, привлечению инвестиций и их оптимальному использованию. Обсуждению этих вопросов будет посвящены все три дня конференции. Также пройдут уже ставшие традиционными тематические секции по юриспруденции, маркетингу и игровому рынку ПО. Без всякого сомнения, участие в конференции ISDEF’2005 станет самой важной инвестицией в будущее для многих софверных компаний. Для участия в конференции вам необходимо зарегистрироваться на сайте: www.isdef.org.
тенденции Mozilla Suite будет жить Новый учрежденный проект SeaMonkey Project продолжит совершенствование набора открытых продуктов Mozilla Suite. Результаты работы SeaMonkey не станут официальным обновлением к Mozilla Suite от Mozilla Foundation, однако организация будет взаимодействовать с группой разработчиков, предоставит им всю необходимую инфраструктуру, а улучшения, проводимые в SeaMonkey, будут возвращаться в кодовую базу Mozilla, откуда затем уже попадать в другие продукты Mozilla (Firefox и Thunderbird). Первые релизы SeaMonkey должны появиться в ближайшее время, и сообщается, что пользователи Mozilla 1.7.x и Mozilla 1.8 Alpha/ Beta смогут найти в них множество улучшений.
Проблемы в безопасности Debian Как стало известно от Мартина Шульца, после выпуска Debian GNU/Linux 3.1 (Sarge) в инфраструктуре обеспечения безопасности возникли некоторые проблемы, из-за которых команда Debian Security Team не могла выпускать обновления к уязвимым пакетам. Майкл Стоун в свою очередь жаловался на нехватку людских ресурсов для своевременного создания необходимых патчей. Однако уже в скором времени все проблемы были полностью решены, и с первой половины июля инфраструктура обеспечения безопасности для двух последних стабильных релизов дистрибутива Debian GNU/Linux (3.1 «Sarge» и 3.0 «Woody») вновь полностью функционирует, патчи ко всем пакетам предоставляются в обычном режиме.
сменить номер будущего major-релиза – им станет 1.5, а не ожидавшийся ранее 1.1. Данные преобразования связаны с желанием разработчиков отразить значимость и число новшеств, которые появятся в Firefox 1.5. По ориентировочному плану выхода Firefox 1.5 «Deer Park», его бета-версия (1.4) выйдет в августе 2005 года, а сам стабильный релиз 1.5 – в сентябре этого же года. Среди изменений отмечается новый движок Gecko, совместимость с HIG, новая система обновлений, улучшения в менеджере расширений.
Проект корпоративного дистрибутива Linux на базе Debian Появились первые известия и подробности о проекте создания корпоративного дистрибутива на базе Debian GNU/ Linux. Среди компаний, подтвердивших свое участие в разработке новой системы отмечаются: credativ GmbH, Knoppix, LinEx, Linspire, MEPIS, Progeny, Skolelinux, Sun Wah Linux, UserLinux, VA Linux Japan, Xandros. Союз получил название DCC (Debian Core Consortium), а в качестве руководителя и главного инициатора – Progeny Linux Systems Inc., исполнительным директором которой является основатель Debian Ян Мердок. Стандартными для дистрибутива станут пакеты формата DEB, но обещается и совместимость с RPM. Система будет соответствовать стандарту LSB (Linux Standard Base) 2, положит основу для будущих релизов собственных дистрибутивов компаний-участников.
Составил Дмитрий Шурупов по материалам www.nixp.ru
Вена начинает переход на Linux В столице Австрии стартовала программа по миграции на программное обеспечение с открытым кодом на настольных ПК. Городской советник Вены Руди Шикер представил на пресс-конференции специально разработанный Linux-проект, получивший название Wienux. Дистрибутив базируется на Debian GNU/Linux с Linux-ядром 2.6.11, графической средой KDE и такими программами, как OpenOffice.org, Firefox и GIMP. Департаменты городской администрации получили возможность перевода своих десктопов на Open Source. Из 16 тысячи городских настольных ПК с Windows 2000 на OpenOffice.org могут перейти 7,5 тысяч, а на Linux из них – 4,8 тысяч.
IBM предлагает переход с OS/2 на Linux Корпорация IBM официально прощается со своей операционной системой OS/2 – 23 декабря этого года продажи OS/2 будут прекращены, а поддержка ОС продлится до 31 декабря 2006 года. В то же время IBM опубликовала документ для пользователей OS/2 по миграции на открытую операционную систему Linux: «Среди продукции IBM замены нет. IBM предлагает пользователям OS/2 рассматривать Linux как альтернативную операционную систему для клиентских и серверных систем с OS/2». А петицию с просьбой открыть исходные коды OS/2 к концу июля подписало свыше 12 тысяч человек.
Mozilla меняет план выпуска Firefox 1.1 Некоммерческая организация Mozilla Foundation обновила план выпуска следующей версии браузера Firefox и решила
№7, июль 2005
3
безопасность
ПРОВЕРЯЕМ HTTP-ТРАФИК НА ЛЕТУ
Сегодня антивирусная защита – непременный атрибут грамотно спланированной IT-стратегии организации. Для не обремененного лишними деньгами бюджета IT-отдела закупка и установка на всех пользовательских компьютерах антивирусных программ может стать вполне весомой статьей расходов. Можно ли как-то как-то избежать лишних лишних затрат затрат??
АНДРЕЙ МАРКЕЛОВ
П
редставим, что у пользователей отсутствуют или отключены НГМД (про CD-ROM и USB я даже не упоминаю – на мой взгляд, это непозволительная роскошь для клиентских рабочих мест). Почта уже проверяется каким-нибудь открытым антивирусом типа Clamav. В таком случае единственным возможным источником вирусов может являться «дикий Интернет». И если доступ пользователям открыт только через протокол HTTP, то только его нам и остается сканировать на предмет вирусов. Делать это удобнее и дешевле на сервере при помощи открытого ПО, чем мы и займемся. Для проверки наличия вирусов традиционно предлагаю использовать наиболее распространенный из свободных антивирусов – Clam AntiVirus (http://www.clamav.net). Я не буду подробно рассказывать о его преимуществах и особенностях, о которых уже написано в статьях [1, 2, 3]. Сегодня мы разберем практические вопросы установки и интеграции антивируса с прокси-сервером. В качестве прокси мы возьмем HTTP AntiVirus proxy (HAVP) [4]. Помимо HAVP также рассматривались и другие варианты. Но они либо на платной основе в случае коммерческого применения как dansguardian.org (plug-in к нему), либо показались менее стабильными, по отзывам в форумах. Наверняка это не единственное, и, возможно, не самое лучшее решение, но тем не менее оно существует и вполне справляется с поставленными задачами. С возможными альтернативными вариантами вы можете ознакомиться по ссылке [5]. HTTP AntiVirus proxy – это прокси-сервер с фильтром – антивирусом. Сканируется весь трафик, и проверка на вирусы является единственной задачей данного прокси-сервера. Поэтому вполне разумным было бы использовать HAVP в связке с кэширующим прокси, умеющим фильтровать трафик, например Squid. Ключевыми особенностями HAVP являются возможность непрерывной проверки трафика без тайм-аутов и блокировок, а также корректная работа с динамическими и защищенными паролем страницами.
4
Предполагается, что у вас уже имеется настроенный прокси-сервер, например Squid. На момент написания статьи последней версией HAVP была 0.62. Установка производилась на Red Hat Linux Enterprise 4, но без проблем все должно работать и на других UNIX-системах.
Устанавливаем HAVP Для начала создадим отдельную ФС для временных файлов HAVP. Отдельную – потому что ее необходимо монтировать с поддержкой так называемых «ручных блокировок» для файлов (mandatory locks). Это делается при помощи опции mand, команды mount. Я предпочел для ускорения работы и снижения нагрузки на дисковый массив создать такую файловую систему в ОЗУ: # # # #
mkdir chown chgrp mount
/var/tmp/havp nobody /var/tmp/havp nobody /var/tmp/havp -t tmpfs -o size=100M,mand tmpfs /var/tmp/havp
Соответствующая строчка, которую необходимо добавить в /etc/fstab для автоматического создания файловой системы во время загрузки, выглядит следующим образом: # <fs> <mt _ point> <type> <dump> <pass> tmpfs /var/tmp/havp tmpfs 0 0
<options> ↵ auto,size=100M,mand ↵
Проверяем, как смонтировалась наша файловая система. Мы должны получить что-нибудь похожее на: # df –h /var/tmp/havp tmpfs
100M
0 100M
0% /var/tmp/havp
Кроме того, создадим директорию для лог-файлов прокси-сервера и выставим владельца:
безопасность # mkdir /var/log/havp # chown nobody /var/log/havp # chgrp nobody /var/log/havp
Теперь развернем предварительно скачанный со странички [4] исходные коды прокси-сервера. # tar zxvf havp-0.62.tar.gz
Далее, заходим в директорию havp-0.62 и начинаем править файл havp/default.h. Изменить требуется следующее: #deÞne GROUP "nobody" // В дополнение к пользователю, из-под которого будет // запускаться служба, меняем на nobody и группу #deÞne PARENTPROXY "localhost" #deÞne PARENTPORT 3128 // Указываем хост и порт, на котором установлен кэширующий // прокси-сервер, например Squid. Если «родительского» // прокси у вас нет, то комментируем #deÞne SCANTEMPFILE "/var/tmp/havp-XXXXXX" #deÞne ACCESSLOG "/var/log/havp/access.txt" #deÞne ERRORLOG "/var/log/havp/error.txt" // Указываем шаблон временных файлов и имена файлов // журналов. При этом все три указанные директории и два // файла журналов должны быть созданы вручную и иметь // соответствующие разрешения для пользователя, // из-под которого запускается HAVP. Естественно, вы можете // изменить пути и названия файлов по своему усмотрению
StreamSaveToDisk
и удаляем строчку: Example
Наконец, запускаем демон командой: # /usr/local/sbin/clamd
Теперь пробуем проверить наше свежеустановленное решение. После того как в настройках браузера укажете порт, назначенный HAVP, и IP-адрес прокси, по ссылке [7] можно попробовать скачать тестовую сигнатуру вируса. Что должно получиться при этой попытке, вы видите на рис. 1, 2.
Остальное можно оставить без изменений. Теперь выполним стандартные для компиляции и установки программы шаги: # ./conÞgure # make # make install
Сервис запускается командой /usr/local/bin/havp. Следующим шагом необходимо установить антивирус Clamav. Как это делать, описано ниже.
Рисунок 1. Пытаемся скачать файл с вирусом
Устанавливаем Clamav Про установку антивируса Clamav читайте в [1, 2, 3]. Здесь же я приведу минимально необходимые для установки сведения. Добавляем группу и пользователя, из-под которого будет запускаться демон: # groupadd clamav # useradd -g clamav -s /bin/false clamav
Скачиваем с сайта проекта [6] последнюю версию исходников, разархивируем и правим в clamav-config.h переменную SCANBUFF. Ее значение должно быть меньше, чем указанное в переменной MAXRECV файла havp/default.h. После чего выполняем привычные: # ./conÞgure # make # make install
Добавляем в crontab строчку, запускающую команду по обновлению антивирусных баз: 1 * * * * /usr/local/bin/freshclam -quiet
Правим файл /usr/local/etc/clamav.conf. Добавляем: LocalSocket /var/run/clamd.sock
№7, июль 2005
Рисунок 2. Сработала защита
Не забудьте запретить пользователям подключаться напрямую к Squid. Если все получилось, то я могу вас поздравить с очередным успешным шагом в создании защищенной локальной сети.
Литература, ссылки: 1. Маркелов А. Броня моллюска. Обзор и установка антивируса ClamAV. – Журнал «Компьютерра» №21, 2004 г. – 34-35 с. Статья доступна в Интернете по адресу: http:// www.markelov.net/articles.php?lng=ru&pg=44. 2. Яремчук С. Свободный антивирус. – Журнал «Системный администратор», №8, 2004 г. – 24-25 с. 3. Супрунов С. Еще раз о ClamAV: особенности установки в FreeBSD. – Журнал «Системный администратор», №3, 2004 г. – 32-37 с. 4. HAVP – http://www.server-side.de. 5. Методы проверки HTTP-трафика при помощи Clamav – http://www.clamav.net/3rdparty.html#webftp. 6. http://www.clamav.net. 7. Тестовая сигнатура вируса – http://www.eicar.org/anti_virus_test_file.htm.
5
безопасность
Dans ansG Guardian + C Clam lamAV: AV: ФИЛЬТРУЕМ ВЕБ-СОДЕРЖИМОЕ И СТРОИМ АНТИВИРУСНУЮ ЗАЩИТУ
АНДРЕЙ АВРАМЕНКО Сегодня многие компании все больше внимания уделяют информационной безопасности. Для ее обеспечения, по данным исследования IDC, российские пользователи затратили почти 42$ млн. на специализированное программное обеспечение. Но существуют и бесплатные продукты, не уступающие коммерческим по функциональности.
Я
думаю, ни для кого не секрет, что большая часть вирусов попадает на компьютеры локальной сети из Интернета. Конечно, проверку на вирусы можно прово-
6
дить и на локальной машине, но централизованная фильтрация трафика гораздо проще в обслуживании и позволяет экономить ресурсы компьютеров локальной сети.
безопасность DansGuardian – фильтр веб-содержимого для ОС Linux, FreeBSD, OpenBSD, NetBSD, Mac OS X, HP-UX и Solaris, использует прокси-серверы squid или oops. Он фильтрует содержимое несколькими методами: по фразам, картинкам и URL. В отличие от некоторых других фильтров, он не использует «черный лист» URL, который надо постоянно обновлять (да и к тому же Интернет большой, все не перечислишь). Проект постоянно дорабатывается, имеется коммерческая версия под названием SmoothGuardian. В ней есть несколько дополнительных возможностей: блокировка лицензионной музыки, удаление рекламы, многоязыковая поддержка фраз фильтрования, генерация стандартных отчетов, таких как самые популярные сайты, пользователи и сайты, заблокированные чаще всего, позволяет блокировать «по часам», т.е. блокировка происходит в определенное время, и другое. Я буду использовать именно бесплатную версию, так как ее конфигурирование считается более сложным. Я устанавливал dansguardian на ОС Linux Alt Master 2.4: ! Версия dansguardian – 2.8.0.3 (версия антивирусного патча 6.3.8). ! Версия squid – 2.5.STABLE9. ! Версия clamav – 0.86.1. ! Версия libesmtp – 1.0.3r1. Dansguardian не является редиректором (как, например, squidGuard), хотя многие первоначально думают именно так. Это прокси-сервер, и он использует squid как веббраузер. Для того чтобы пользователи не использовали squid напрямую, необходимо в конфигурационном файле firewall указать перенаправление с порта squid на порт dansguardian. Либо установить dansguardian на порт 3128, а squid перенести на какой-либо другой, открыв доступ только с 127.0.0.1 Для начала установим СlamAV. Скачать его можно с официального сайта http://www.clamav.net. ./conÞgure make make install
Конфигурирование clamav не займет много времени. Просто немного подредактируйте clamd.conf. Dansguardian требует библиотеку libesmtp для отправки сообщений системному администратору. Скачать ее можно с http://www.stafford.uklinux.net/libesmtp. Устанавливается просто: ./conÞgure –-preÞx=/usr make make install
Пропатчивать dansguardian для поддержки firewall не нужно, скачать его с поддержкой антивируса можно с http:// www.harvest.com.br/asp/afn/dg.nsf. ./conÞgure --sysconfdir=/etc/dansguardian/ --cgidir=/var/www/cgi-bin/ --runas _ usr=squid
№7, июль 2005
--runas _ grp=squid make make instal
Далее следует настроить dansguardian. Конфигурационный файл /etc/dansguardian/dansguardian.conf оснащен отличными комментариями, так что, я думаю, не будет затруднений в конфигурировании: reportinglevel = 3 languagedir = '/etc/dansguardian/languages' # К сожалению, русского языка в списке нет. Я сделал # перевод и в ближайшее время отправлю автору. Вы можете # скачать архив с сайта журнала http://www.samag.ru, # раздел «Исходный код». Чтобы установить язык, необходимо # разархивировать файл в папку /etc/dansguardian/languages # и в конфигурационном файле указать: language = 'russian' # Что записывать в лог # 0 = none 1 = just denied 2 = all text based # 3 = all requests loglevel = 2 # Протоколировать, если страница была передана пользователю logexceptionhits = on # формат ведения лога # 1 = DansGuardian format # 3 = Squid Log File Format logÞleformat = 1
2 = CSV-style format 4 = Tab delimited
# Местонахождение лог-файла loglocation = '/var/log/dansguardian/access.log' # Сетевые опции # IP-адрес, на котором слушает dansguardian Þlterip = Þlterport = 8080 # IP-адрес и порт прокси-сервера (squid или oops) proxyip = 127.0.0.1 proxyport = 3128 # URL, на который произойдет переадресация при блокировке accessdeniedaddress = ↵ 'http://YOURSERVER.YOURDOMAIN/cgi-bin/dansguardian.pl' nonstandarddelimiter = on # Заменять запрещенную картинку какой-нибудь своей usecustombannedimage = 1 custombannedimageÞle = '/etc/dansguardian/transparent1x1.gif' # Создать фильтр для группы пользователей. # Dansguardian будет автоматически смотреть в файл # dansguardianfN.conf, где N – номер группы Þltergroups = 1 # Чтобы поставить пользователей в соответствие с группами, # отредактируйте файл Þltergrouplist Þltergroupslist = '/etc/dansguardian/Þltergroupslistv # Местоположение файлов аутентификации bannediplist = '/etc/dansguardian/bannediplist' exceptioniplist = '/etc/dansguardian/exceptioniplist' banneduserlist = '/etc/dansguardian/banneduserlist' exceptionuserlist = '/etc/dansguardian/exceptionuserlist' # Записывать в лог найденные причины блокировки. showweightedfound = on # 0 = off – не использовать # 1 = on, normal – использовать в стандартном режиме # 2 = on, singular – записывать каждый аргумент, # но только один раз для страницы weightedphrasemode = 2 urlcachenumber = 2000 urlcacheage = 900 # Фильтрация содержимого по фразам # 0 – фильтрация html вместе с мета-тэгами # 1 - удаление многочисленных пробелов и html-тэгов # перед фильтрацией # 2 – оба метода phraseÞltermode = 2 preservecase = 0
7
безопасность # Перекодировка в hex для фильтрования документов # с различными кодировками hexdecodecontent = 0 # Использовать алгоритм «Quick Search», в отличие от # алгоритма DFA. Алгоритм DFA позволяет работать быстрее, # но его текущая версия не совсем совместима с 16-битными # символами. Если вы хотите использовать 16-битные символы, # включите эту опцию. forcequicksearch = 0
# файлов, в которых можно вписывать исключения, # т.е. информация с данных сайтов, url, ip или по запросам # данных пользователей не будет фильтроваться. virusscanexceptions = on urlcachecleanonly = on virusscannertimeout = 60 # Использование почтового оповещения notify = 0
reverseaddresslookups = off reverseclientiplookups = off
# Настройки CLAMDSCAN # -------------------# Сокет демона clamd (указывается в clamd.conf) localsocket = '/tmp/clamd'
# Создавать файлы bannedsitelist и bannedurllist # со списком запрещенных сайтов и URL createlistcacheÞles = on # Максимальный размер передаваемого от клиента файла # в байтах # 0 – блокировать # -1 – не блокировать # или размер файла maxuploadsize = -1 maxcontentÞltersize = 256 # Методы аутентификации пользователя на прокси-сервере usernameidmethodproxyauth = on # **На данный момент не работает** usernameidmethodntlm = off usernameidmethodident = off preemptivebanning = on # Добавлять заголовки X-Forwarded-For: <IP-адрес клиента> forwardedfor = off usexforwardedfor = off logconnectionhandlingerrors = on # Опции дочерних процессов # Максимальное количество процессов maxchildren = 120 # Первоначальное количество процессов minchildren = 8 # Количество процессов, которые должны быть готовы # к соединению minsparechildren = 4 preforkchildren = 6 # Максимальное количество бездействующих процессов maxsparechildren = 32 # Максимальное количество сайтов, обработанных процессом maxagechildren = 500 # Опции коммуникации между процессами ipcÞlename = '/tmp/.dguardianipc' urlipcÞlename = '/tmp/.dguardianurlipc' # PID Þlename pidÞlename = '/var/run/dansguardian.pid' nodaemon = off nologger = off # Пользователь и группа, с чьими правами запускается # dansguardian daemonuser = 'squid' daemongroup = 'squid' softrestart = off # Антивирусные настройки # -------------------# Включить проверку на вирусы virusscan = on # Способ проверки clamdscan, clamav или kav virusengine = 'clamav' # Максимальное количество информации, переданной клиенту, # если файл содержит вирус tricklelength = 32768 Þrsttrickledelay = 30 followingtrickledelay = 60 # Список типов MIME, не проверяемых на вирусы exceptionvirusmimetypelist = ↵ '/etc/dansguardian/exceptionvirusmimetypelist' # Максимальный размер содержимого для проверки, # если 0 – не ограничено maxcontentscansize = 0 # Файлы с определенными расширениями не будут проверяться exceptionvirusextensionlist = ↵ '/etc/dansguardian/exceptionvirusextensionlist' # Временная директория, в которую сохраняется файл # для проверки downloaddir = '/tmp/dgvirus' # В директории /etc/dansguardian содержатся несколько
8
# Настройки CLAMAV # -------------------clmaxÞles = 1500 clmaxreclevel = 3 clmaxÞlesize = 10485760
Конфигурационный файл squid менять не будем. Будем считать, что squid настроен и нормально функционирует, за исключением того случая, если вы хотите установить Dansguardian на порт 3128. Тогда необходимо изменить порт в конфигурационном файле squid. Теперь необходимо настроить firewall на перенаправление. В Linux это делается примерно так: iptables -t nat -A PREROUTING --dst x.x.x.x -p tcp ↵ --dport 3128 -j DNAT --to-destination x.x.x.x:8080
x.x.x.x поменяйте на IP интерфейса, который смотрит в сторону локальной сети. Ну вот и все. Теперь при скачивании файла, содержащего вирус, у вас в этом файле появится сообщение о вирусе. Конечно, не очень удобно, но зато безопасно. Лучшим вариантом теперь, наверное, будет не сохранять файлы на диск, а сразу открывать, тогда не будет недоразумений. К недостаткам dansguardian относится отсутствие русификации, т.е. происходит фильтрация по английским фразам (придется самим придумывать фразы для фильтра). При проверке больших файлов также придется подождать. Dansguardian использует больше ресурсов сервера, по сравнению с редиректорами, что тоже нельзя отнести к плюсам. В заключение хотел бы сказать, что необходимо отредактировать файлы, находящиеся в каталоге /etc/ dansguardian, на которые есть ссылки из основного конфигурационного файла, так как при тестировании, например, выяснилось, что по умолчанию он блокирует zip-архивы. Программа должна быть настроена под политику безопасности организации, то есть если организация позволяет скачивать музыку, то какой смысл блокировать mp3-файлы. В целом у меня о программе сложилось хорошее впечатление. Простая в установке, несложная в настройке, она имеет достаточно обширные возможности. Хотелось бы, чтобы данный проект и дальше развивался, позволяя системным администраторам защищать локальную сеть от нежелательных данных.
Ссылки: 1. Введение в dansguardian и руководство по детальной инсталляции dansguardian: www.dansguardian.org. 2. Информация о продукте SmoothGuardian: www.smoothwall.net.
безопасность
ПРОАКТИВНЫЕ СИСТЕМЫ ЗАЩИТЫ, ИЛИ ЕСТЬ ЛИ ЖИЗНЬ БЕЗ АНТИВИРУСА?
СЕРГЕЙ ЯРЕМЧУК Антивирусное программное обеспечение так тесно вошло в жизнь каждого пользователя компьютеров, что редко кто задумывается о наличии альтернативного решения. Существуют программы проактивной защиты компьютеров, которые в отличие от реактивных систем, используемых в настоящее время, способны обнаруживать новые угрозы.
О
тношения пользователей по отношению к антивирусам варьируется от полной уверенности в защите до осознания того, что главное – выдержать первый удар. Действительно антивирусы сегодня несут уже не столько защитную функцию, а скорее используются как средство оценки нанесенного ущерба и удаления заразы. Антивирусные компании, полностью осознавая то, что вирус – это некий алгоритм, включающий не только программу со всеми командами, но и определенные действия, приводящие к поражению данных, упорно продолжают идти наиболее простым путем. И мы до сих пор пользуемся антивирусами, которые просто сравнивают набор знаков, взятых из антивирусных баз, с другим (файлом пользователя или оперативной памятью). В итоге традиционные антивирусные решения фактически оказались не способны в одиночку противостоять качественному разнообразию существующих угроз. На одном из курсов, для того чтобы убедить скептиков, я распаковал вирус MyDoom, до этого благополучно распознаваемый антивирусами с обновленными базами, а затем запаковал уже другим упаковщиком. Антивирусы оказались не способны найти модернизированный, но работоспо-
№7, июль 2005
собный вариант вируса. Система обнаружения, основанная на опыте предыдущих атак, становится бесполезной при столкновении с неизвестным вирусом или шпионской программой. Для того чтобы сгенерировать сигнатуру, антивирусной компании необходимо получить экземпляр вируса, выделить специфический только для него фрагмент, и только после этого он будет занесен в базу. На все это уходит некоторое время (а вслучае полиморфного вируса процесс создания сигнатуры может еще более затянуться), в течение которого антивирусы не способны, противостоять новому врагу, но вполне достаточному, чтобы новый червь заразил сотни тысяч компьютеров. Классические сигнатурные антивирусы оказываются не способны предотвратить глобальные эпидемии. С другой стороны, наблюдение за работой системы либо за основными файлами позволяет определить неприятности и предотвратить нападение, такие системы принято относить к классу систем предотвращения проникновения (Intrusion prevention systems) и проактивным системам защиты. В мире Linux давно известны такие проекты, как LIDS, RSBAC, grsecurity, tripwire и другие которые при правильной настройке надежно защища-
ют систему. В последнее время стало заметно оживление и среди разработчиков систем безопасности для ОС Windows. Прежде чем приступить к конкретным решениям, хотелось бы пару слов сказать об проблемах. Первое и самое трудное, что придется сделать – это убедить самого себя в том, что такая утилита способна защитить компьютер или хотя бы отреагировать. В течение двух лет мой подопытный компьютер защищался одним из бесплатных антивирусов, как правило, с базами полугодичной давности, межсетевым экраном и одной из программ, описанных ниже. За это время система подвергалась (и постоянно подвергается) многочисленным атакам, но заражения так и не произошло. Вполне возможно, что просто повезло, а может, пора действительно пересмотреть взгляды. Но вся загвоздка в том, что утилиты требуют от пользователя определенных знаний и некоторого понимания происходящего в системе. Появление нового процесса должно насторожить пользователя, он должен как минимум прочитать предупреждающее сообщение и затем принять верное решение. Щелчок по кнопке без раздумий может привести к заражению. Хотя стоит отметить, что в
9
безопасность последнее время такие программы, задают уже меньше вопросов, самостоятельно принимая решение. Далее, если утилиты отреагируют на новый процесс, вызванный атакой червя, то, вполне возможно, смогут проспать макровирус, если он будет заражать только файл шаблонов или рабочий документ без создания новых файлов и процессов. Но в большинстве своем они реагируют на возникшую проблему. Естественно, лучше всего подобные программы устанавливать на «чистую» систему, так легче будет контролировать добавление программ в «белый» список. Плюс ко всему поведенческие программы не всегда могут остановить проникновение, и для того чтобы вылечить или найти зараженные файлы, все равно необходимо использовать антивирус, поэтому такие средства следует относить скорее к вспомогательным (подстраховочным), основной их задачей остается недопущение эпидемий, поскольку они могут блокировать массовые заражения. Для основной защиты по-прежнему необходимо использовать связку – межсетевой экран + антивирус.
Часовой по имени Scotty Начну с программы, которой пользуюсь уже более двух лет. WinPatrol (http://www.winpatrol.com) текущая версия 9.1, статус freeware, поддерживаются Windows 95, 98, ME, 2000, NT и XP, размер – 0.98 Кб. WinPatrol делает снимок критических системных ресурсов и предупреждает в случае любых изменений. После запуска в трее возле часов появится значок с изображением собаки, названной Scotty the Windows Watch Dog. Вот теперь этот самый Scotty WWD безустанно и будет следить за всем, что происходит на доверенном ему компьютере, «разнюхает» все о саморазмножающиеся вирусах, Adware, Spyware, троянах, пробравшихся на ваш компьютер и, конечно, Cookies, которые будут поступать к вам постоянно. Scotty позволяет подтверждать установку любых новых программ на компьютере. Вызвав программу, получим окно программы с несколькими вкладками (рис. 1): ! Startup Programs – позволяет просмотреть все запущенные прило-
10
Рисунок 1. Основное окно WinPatrol
жения, остановить или вообще удалить из автозапуска ненужные, получить информацию о каждом (имя, версия программы, ключ реестра и пр.) или нажатием кнопки «Full Report» получить отчет о всех программах за один раз. При первом запуске Scotty просматривает список автоматически запускающихся программ и при его изменении предупреждает об этом пользователя. ! IE Helpers – контроль за Browser Helper Objects, т.е. информация об имеющихся объектах, запрос на установку новых объектов, удаление подозрительных объектов. Надо сказать, что Browser Helper Objects запускаются каждый раз вместе с Internet Explorer (который стараниями Microsoft является неотделимой частью систему), в том числе и при открытии папок на локальном компьютере. Поэтому при их помощи можно без проблем следить за пользователем, что и применяется в программах типа SpyWare. ! Scheduled Task Monitoring – отображение запланированных задач, контроль над добавлением новых и получение дополнительной информации о планируемых работах ! Services – отключить или временно остановить запущенные сервисы и получение дополнительной информации о них. Чтобы не выискивать подозрительные программы в большом списке, можно включить пункт «List non-Microsoft services
!
!
!
!
!
only», убрав таким образом системные. View Active Tasks – получение информации о запущенных на данный момент программах и задачах, уничтожение и приостановка ненужных и подозрительных. Также при помощи этого пункта можно разобраться в работе запущенной системы, т.е. узнать, для чего предназначена та или иная программа. Cookies – информирование о появлении новых Cookies, отклонение, управление и просмотр информации записанной в Cookies для принятия решения. Можно также составить правило фильтрования для Cookies, которые всегда должны удаляться (Cookies with Nuts). Options – установка опций самой программы. Здесь же устанавливается контроль за подменой домашней страницы в веб-браузере, реакция на изменение файла hosts или его полная блокировка, выведение полного отчета по системе, ведение истории изменений. File Types – позволяет просматривать, контролировать и восстанавливать измененную ассоциацию приложений с расширениями файлов. PLUS – зарегистрировавшись, вы получаете доступ к сетевой базе данных программ, цель которой помочь пользователям разобраться в списке незнакомых названий, ведь надпись servise.exe в таблице процессов большинству ничего не ска-
безопасность жет. На момент написания статьи регистрация была бесплатной.
Менеджер процессов AnVir Task Manager Первое, что приходит в голову после знакомства с менеджером процессов AnVir Task Manager (http://anvir.com/anvirrus.exe), что это не серьезно. Виной является небольшой размер программы, чуть меньше 380 Кб. А зря. Несмотря на такой маленький размер, программа помогает: ! получить полную информацию о запущенных процессах (путь к файлу, описание, время работы, родительский процесс, командная строка, использование процессора, памяти, список используемых dll, файлов, драйверов, потоков, окон и пр.); ! вылечить зараженный компьютер от вирусов, spyware и резидентных вирусов-троянов; ! управлять приложениями, запускающимися при старте Windows, с возможностью отложенного (через 1 минуту) запуска и блокировки добавления новых программ (рис. 2).
Рисунок 2. Предупреждающее сообщение AnVir Task Manager
вания. Новая разработка Safe’n’Sec, представленная в ноябре прошлого года, практически сразу получила признание и была названа журналом PC Magazine/RE антивирусом месяца. При этом Safe’n’Sec не относится к антивирусам, а принадлежит к классу систем проактивной защиты, которые анализируют подозрительное поведение пользователя или программы. Для малых и средних предприятий, а также индивидуального использования предназначена версия Personal. В корпоративной версии Safe’n’Sec Business имеется административная консоль, которая позволяет системному администратору дистанционно инсталлировать и настраивать программу на компьютерах пользователей. Версия 1.1, актуальная на момент написания статьи, доступна в двух вариантах – усеченная Safe’n’Sec ver. 1.1 и полная Safe’n’Sec ver. 1.1 + antivirus. Последняя, как понятно из названия, включает возможность антивирусной проверки. Основу продукта составляет модуль Intelligent activity control, позволяющий обнаруживать комбинированные атаки, предотвратить попытки внести изменения в системный реестр или состояние сервисов операционной системы, открыть доступ к регистрационным данным пользователя и пр. При этом механизм принятия решения Safe’n’Sec действует на основе правил, учитывающих все возможные последовательности действий, классифицируемых как вредоносные. Защита
всех данных на компьютере пользователя осуществляется в соответствии с политикой контроля активности, определяющую, какие действия и их последовательность нужно считать вредоносными. На данный момент имеются три политики – жесткая, строгая и доверительная. После обнаружения подозрительного приложения Safe’n’Sec самостоятельно принимает решение об его вредоносности и уведомляет пользователя, который должен определить, что делать с таким приложением (разрешить или заблокировать) (рис. 4). Причем для упрощения принятия решения доступна история активности, по которой он может подробно изучить последовательность действий, выполненных приложением. Дополнительно из консоли можно получить доступ к списку запрещенных и доверенных приложений, который можно здесь же отредактировать. Для тестирования работоспособности вместе с программой поставляется утилита snstest.exe, которая имитирует занесение данных в системный реестр, попытку записи и удаления из системного каталога.
Всесторонний контроль с RegRun RegRun Security Suite (http://www.greatis.com) работает со всеми версиями Windows. Еще один комплект средств для защиты компьютера против вирусов или троянцев, spyware и adware. Он доступен в трех основных вариантах: Standart (для обычных пользователей,
При помощи AnVir Task Manager возможно остановить любой процесс, изменить приоритет, добавить в автозагрузку (рис. 3). Антивирусная база содержит только наиболее распространенные вирусы, все запускаемые программы и записи реестра автоматически проверяются на наличие вирусов. Кроме всего прочего, в трее отображаются иконки загрузки процессора и диска, а из консоли управления можно быстро получить доступ к основным системным утилитам.
Перехват системных вызовов с Safe’n’Sec Российская компания StarForce (http:// www.star-force.ru) уже давно известна своим одноименным механизмом защиты дисков от нелегального копиро-
№7, июль 2005
Рисунок 3. AnVir Task Manager позволяет получить полную информацию о процессах
11
безопасность обеспечивает легкое управление и безопасность), Professional (имеет дополнительные возможности по работе с системным реестром, позволят быстро оптимизировать системные параметры и обеспечить надежную защиту), и самые большие возможности имеет Gold, предназначенная для профессионалов. По ссылке http://www.greatis.com/ security/rus.exe доступен русификатор программы, к тому же на сайте http://www.ruhelp. narod.ru имеется неофициальный перевод файла помощи, облегчающий знакомство с программой. После запуска RegRun активизируется защита, определяемая уровнем безопасносРисунок 4. Предупреждающее сообщение Safe’n’Sec ти – от низкого до ультравыновления они копируются в хранилисокого. В Центре Управления RegRun ще, которое находится в «Мои докунастраиваются параметры работы ос- менты\RegRun2». Правда, само храновных модулей (рис. 5). Например, нилище почему-то программа никак не «WATCH DOG» обеспечивает контроль защищает и на подмену файлов никак за автозагрузкой в течение работы, не реагирует. он может быть настроен на проверку При обнаружении модификации конфигурации автозагрузки при стар- защищаемых файлов будет выведено те и выключении Windows либо через предупреждение, с указанием размера заданные промежутки времени. Если и даты создания обоих файлов. Теперь при проверке обнаруживаются изме- этот файл можно копировать, переименения, пользователь будет извещен новать, удалить, открыть или проскаоб этом, и дополнительно запустится нировать антивирусной программой. утилита Start Control, при помощи ко- Для поиска вирусов, не известных анторой можно получить детальную ин- тивирусным программам, RegRun отформацию об автоматически запуска- крывает и контролирует множество емых программах. программ-«приманок», если обнаруживается изменение любого из этих файлов, RegRun сообщит о присутствии вируса. Для Windows такой приманкой является файл winbait.exe, автозапуск которой заносится в реестр и сравнивается с winbait.org, кроме того, предусмотрена возможность добавления своего подконтрольного файла. RegRun имеет базу данных приложений, которая содержит описание наиболее часто встречающихся программ, помогающую пользователю опредеРисунок 5. Центр Управления RegRun лить принадлежность к одной из четыОдной из самых полезных функций рех групп: необходимые, бесполезные, является File Protection, защищающая опасные и по вашему выбору. RegRun компьютер от вирусов, троянов и рабо- проверяет присутствие любых потентающих со сбоями программ. Первона- циально опасных программ и инфорчально создается список файлов, со- мирует пользователя о них, кроме тостояние которых необходимо контро- го, он совместим со всеми известными лировать. Для последующего восста- антивирусами, и Антивирус Координа-
12
тор может быстро проверить файлы, помещенные в автозагрузку. Дополнительно детектор подстановки сравнивает реальный путь к исполняемому файлу с загруженным. Например, если процесс с именем explorer.exe запускается не из папки c:\windows\ system, а из другого места, то пользователь будет оповещен. Трассировщик системного реестра Registry Tracer, который имеется в версиях Professional или Gold, позволяет указать список ключей реестра, при попытке изменения которых RegRun выдаст предупреждающее сообщение. Менеджер процессов позволяет не только просмотреть и при необходимости убить подозрительный процесс, а также выдает информацию по загруженным DLL и сетевой активности приложений. Утилита RunGuard, доступная в версии Gold, проверяет файлы перед выполнением. Контролируются файлы Microsoft Office (doc, dot, xls, xlt, ppt), html, Windows script (vbs, wsh, js, bat pif, cmd), hta и reg. При появлении подозрительных запросов они блокируются, и пользователь может проанализировать содержание файла, проверить его антивирусом, заблокировать или разрешить дальнейшее выполнение (см. рис. 6).
Контроль целостности с Xintegrity Немного другим путем пошли разработчики Xintegrity (http://www.xintegrity.com). Основная задача которой – контроль целостности и обнаружение любого даже самого незначительного изменения файлов. Кроме контроля содержания файлов, утилита обнаруживает изменения в структуре каталога, включая альтернативные потоки данных (Alternate Data Streams), изменения параметров доступа к файлам, регистрационных данных и сервисах. Для этого первоначально создается база данных, содержащая информацию о контролируемых приложениях. Интересно, что разработчики учли возможность скрытого применения утилиты, и можно задать любое название, расширение
безопасность и месторасположение баз. Поэтому, назвав файл как-то буднично, например, kursovik.rtf или song.mp3 и положив в группу подобных файлов, можно ее скрыть. При создании базы возможны три варианта: в нее заносятся только контрольные суммы файлов, делается резервная копия всех данных, и резервные копии дополнительно шифруются (256 бит AES). В последних двух случаях, кроме контроля, позволяют восстанавливать измененные файлы. В качестве контрольной суммы можно использовать несколько вариантов – от 128-разрядной хеш-функции MD5 до AES с 256разрядной длиной ключа. При помощи Xintegrity можно проверять целостность файлов по требованию или запустить ее в фоновом режиме, тогда при обнаружении изменения пользователь будет сразу же уведомлен. Когда Xintegrity обнаружит такой измененный файл, пользователю будет выдана подробная информация о том, как и когда файл был изменен, и при определенных опциях создания базы будет предложено заменить его резервной копией. Например, на рис. 7 выведено различие контролируемого файла и этого же файла, зараженного вирусом Win32. HLLP.Underscore.36864. В целях безопасности при открытии базы Xintegrity автоматически проверяет как себя, так и все зарегистрированные базы на предмет целостности. При создании базы данных в нее можно занести все файлы, лежащие в определенном каталоге, либо при помощи набора фильтров отобрать файлы, удовлетворяющие определенным критериям (размер, время модификации или создания, по типу, содержимому, атрибутам и функциональным возможностям). Имеется пункт, включающий в себя все вышеперечисленное, а также поддерживается Drag’and’Drop и вставка файла с буфера обмена. Файлы, расположенные на дисках с файловой системой FAT32, NTFS, и сетевые папки могут быть перечислены в одной базе данных. Как видите, можно задать практически любые условия. Поэтому можно создать несколько баз, в одну собрать исполняемые и системные файлы, в другую – сетевые ресурсы, к которым имеете доступ, в третью – ресурсы, способные работать
№7, июль 2005
Рисунок 6. Предупреждающее сообщение RegRun Run Guard
Рисунок 7. Xintegrity позволяет сравнить измененный файл с оригиналом
в сети. И для каждой задать свой режим проверки.
Заключение Существующие на сегодняшний день решения в области защиты информации эффективны в борьбе с уже известными угрозами и уязвимостями. Время реакции антивирусных компаний после обнаружения неизвестного вируса можно назвать медленным и достаточным для поражения тысяч компьютеров. Но тенденции позволяют говорить о том, что нас ждет появление новых методов распространения угроз, с еще большей скоростью размножения. Новые угрозы требуют нового подхода. В статье описаны только самостоятель-
ные приложения. Между тем производители уже встраивают подобные инструменты в свои утилиты. Например, Tiny Firewall (http://www.tinysoftware.com) содержит Host Security Engine (HSE), по принципу работы несколько напоминающий проактивные антивирусы, а при помощи Track’n Reverse позволяет в случае обнаружения зловредной утилиты вернуть систему в исходное состояние. Или продукт компании Aladdin (http://www.eAladdin.com) eSafe (http://www.esafe.com) использует, кроме традиционных средств, и проактивный антивирус (Proactive Security Engine). По мнению многих аналитиков, ближайшее время пройдет под знаком проактивной защиты.
13
безопасность
ЗАПУСКАЕМ SPAMD НА FreeBSD Бороться и искать, Найти и не сдаваться!
Программа spamd, являющаяся частью OpenBSD, призвана блокировать нежелательную почту. Благодаря своей эффективности и оригинальному подходу к решению проблемы она была портирована на ряд других систем, включая FreeBSD. Об особенностях работы на этой платформе и пойдет речь в сегодняшней статье.
СЕРГЕЙ СУПРУНОВ Найти и не сдаваться Spamd – система фильтрации спама, использующая механизм «черного», «белого» и «серого» списков. Интересен алгоритм работы по серому списку: сообщение, отправитель которого не входит ни в белый, ни в черный списки, отклоняется с ошибкой 451 (временная ошибка, повторите попытку позже). И по реакции удаленной системы на эту вежливую просьбу принимается решение о занесении отправителя в белый список. В следующих подразделах будет описан принцип работы spamd, а необходимые для этого настройки рассмотрены далее в соответствующем разделе.
Работа в «нормальном» режиме Spamd может быть сконфигурирован для работы в одном из двух режимов – «нормальном» и «сером» (greylisting mode). Схема работы spamd в нормальном режиме представлена на рис. 1.
220 test.ru ESMTP spamd IP-based SPAM blocker; Thu Jul 7 07:56:09 2005 HELO me 250 Hello, spam sender. Pleased to be wasting your time. MAIL FROM: me@me.ru 250 You are about to try to deliver spam. Your time will be spent, for nothing. RCPT TO: serg@test.ru 250 This is hurting you more than it is hurting me. data 354 Enter spam, end with "." on a line by itself Hello, spamd! I test you!!! . 450 SPAM. Blocked by me.
Ко всему прочему, каждый символ ответных сообщений выводится с задержкой в 1 секунду (по умолчанию, может быть изменено). То есть для соединений, попавших на вход spamd, стандартный диалог будет отрабатываться чрезвычайно медленно, и в итоге отправитель получает сообщение об ошибке. Таким образом, время соединения затягивается, спаммер должен полностью сформировать отправляемое сообщение, но в самый последний момент, буквально после завершающей точки, соединение разрывается. Причем в случае 450-го кода ответа оно обычно остается в очереди на отправку, и столь же безнадежные попытки могут повторяться неоднократно.
Работа в «сером» режиме
Рисунок 1. Схема работы spamd в нормальном режиме
Соединение на порт 25 (SMTP) в зависимости от принадлежности отправителя черному списку пакетный фильтр pf либо пропускает как есть (на 25-й порт, прослушиваемый MTA) либо перенаправляет на вход spamd (по умолчанию используется порт TCP 8025, см. /etc/services). Типичный SMTP-диалог со spamd (для перенаправленных соединений) выглядит следующим образом:
14
Будучи запущенным в greylisting mode (см. рис. 2), spamd для отправителей, занесенных в описанные в конфигурационном файле списки, работает так же, как и в нормальном режиме. Однако для соединений от неизвестных адресатов алгоритм работы меняется – они отклоняются с кодом 451, но задержка вывода символов диалога при этом не выполняется. Одновременно идентификационная информация соединения (IP-адрес источника, почтовые адреса отправителя и получателя) заносятся в базу данных /var/db/spamd с пометкой GREY. Так же фиксируется и время первой попытки. И в дальнейшем, если сообщение будет получено спустя время, равное значению параметра passtime (значение по умолчанию – 25 минут), то адрес отправителя заносится в белый список. Если же повторная попытка не будет выполнена в течение времени, указанному параметром greyexp (по умолчанию 4 часа), запись для данного соединения удаляется из /var/db/spamd.
безопасность адреса на 25-й порт до указанного правила (своеобразная альтернатива белым спискам) и т. д.
«Запятая» для размышления
Рисунок 2. Схема работы spamd в greylisting mode
Для адресов, занесенных в белый список, выполняется отслеживание соединений на 25-й порт (эту работу выполняет spamlogd), и если активности не наблюдалось в течение времени, равного значению параметра whiteexp (864 часа по умолчанию), то адрес удаляется из белого списка.
Поскольку принцип действия spamd связан с задержкой сообщений, в ряде случаев это может оказаться критичным. Например, установка этого фильтра на сервере провайдера может породить массу возмущений со стороны пользователей, привыкших к мгновенной доставке сообщений. Поэтому spamd, особенно в «сером» режиме, больше пригоден для «внутреннего потребления», когда перечень легальных отправителей известен и может быть занесен в белый список, а остальную почту можно и задержать ненадолго. Если вы, взвесив все «за» и «против», решили поставить фильтр spamd или по крайней мере глубже познакомиться с ним, то продолжим.
Установить и не запутаться Инсталляция из системы портов никаких сложностей не вызывает. Все традиционно: # cd /usr/ports/mail/spamd; make install
Перенаправление За перенаправление почтового трафика, согласно спискам spamd, на порт 8025 отвечает пакетный фильтр pf (также портированный во FreeBSD из OpenBSD). Для этого в /etc/ pf.conf нужно создать следующие записи: table <spamd> persist rdr pass inet proto tcp from <spamd> ↵ to any port smtp -> 1.2.3.25 port 8025
Обратите внимание на такую особенность. В man 8 spamd в качестве примера показано перенаправление на адрес 127.0.0.1. Однако если на вашей системе запущен еще и ipfw (что вполне вероятно), то для него по умолчанию имеются такие правила (см. /etc/rc.firewall): ${fwcmd} add 200 deny all from any to 127.0.0.0/8 ${fwcmd} add 300 deny ip from 127.0.0.0/8 to any
В итоге пакеты, которые перенаправит pf, ipfw безжалостно заблокирует. Поэтому, на мой взгляд, лучше использовать адрес другого интерфейса (дополнительно можно указать его при запуске демона spamd с помощью ключа -b). И в любом случае нужно обеспечить прохождение пакетов на порт 8025 через все фильтры, работающие в системе (это особенно актуально в случае закрытого брандмауэра). Таблица <spamd> формируется утилитой spamd-setup, которая получает информацию из файла конфигурации /usr/ local/etc/spamd.conf. Адреса, входящие в списки, помеченные в конфигурационном файле как black, будут занесены в указанную таблицу при запуске фильтра spamd. Подробнее использование списков будет рассмотрено позже при обсуждении конфигурации. Естественно, приведенный выше шаблон ни в коем случае не является обязательным. Вы можете ограничиться перенаправлением только запросов, приходящих на конкретный адрес, пропускать нужные (например, собственные)
№7, июль 2005
Теперь осталось в файле /etc/rc.conf включить поддержку spamd и пакетного фильтра pf (если он не был запущен ранее): pf _ enable="YES" pf _ ßags="" pßog _ enable="YES" pfspamd _ enable="YES" pfspamd _ ßags="-v"
Нужно обратить внимание вот на что: файл с именем spamd уже может находиться в вашей системе. Это гордое имя носит также и демон Spamassassin, и если вы устанавливали этот пакет, то соответствующий файл будет лежать в /usr/local/bin/ (при условии, что не менялись стандартные пути). Однако беспокоиться по этому поводу не стоит – наш spamd устанавливается в другое место, и перезаписи файлов произойти не должно. Чтобы было проще разобраться, что к чему относится, приведу сравнительную таблицу: Таблица 1. Расположение компонентов Spamassasin и Spamd
Небольшая проблема возникает при «ручном» управлении фильтром с использованием сценария из /usr/local/ etc/rc.d: поскольку spamd не использует PID-файл, то при запуске соответствующего скрипта с ключом «start» выполняется проверка по имени запущенных процессов. Так как при этом обнаруживаются процессы, принадлежащие spamassassin, то запуск не выполняется:
15
безопасность # ./pfspamd.sh start pfspamd already running? (pid=26357 26359 26361 26363 26366).
Обойти это можно, запуская pfspamd.sh с ключом «faststart» вместо «start». При этом проверка того, запущен ли соответствующий процесс, выполняться не будет, эта забота ложится на плечи администратора. При автоматическом запуске во время загрузки системы первым стартует pfspamd.sh (rc-сценарии исполняются в порядке, определяемом утилитой rcorder, но в данном случае требования к порядку запуска у рассматриваемых скриптов одинаковы, и они будут выполняться в алфавитном порядке, так что pfspamd.sh имеет преимущество). Поскольку запускаемый вторым скрипт sa-spamd.sh ориентируется по своему PID-файлу, то и его старт проходит нормально.
Настроить и запустить Настройки белых и черных списков для spamd сосредоточены в файле /usr/local/etc/spamd.conf. Сразу после установки в указанном каталоге будет находиться только файл spamd. conf.sample, который следует переименовать в spamd.conf и подправить под собственные нужды. Кроме того, потребуется внести ряд изменений в файл /etc/pf.conf (конфигурационный файл пакетного фильтра pf). Также нужно знать ключи запуска spamd, поскольку именно ими определяется режим работы демона и значения используемых параметров.
Параметры spamd.conf Данный конфигурационный файл используется утилитой spamd-setup для первоначальной настройки таблиц pf при запуске spamd. Формат spamd.conf достаточно прост и соответствует getcap(3). В нем обязательно должна присутствовать запись all: all:\
:spamhaus:blacklist:whitelist:
В этой записи перечислены используемые списки в порядке их применения. В данном случае описаны следующие три списка: spamhaus:\ :black:\ :msg="SPAM. Your address %A is in the Spamhaus ↵ Block List\n\ See http://www.spamhaus.org/sbl and\ http://www.abuse.net/sbl.phtml?IP=%A for more details":\ :method=http:\ :Þle=www.openbsd.org/spamd/SBL.cidr.gz:
Данный список для блокировки нежелательной почты использует информацию о спаммерах, собираемую сайтом spamhaus.org (для загрузки по http используется файл, сохраненный на сервере openbsd.org). blacklist:\ :black:\ :msg="SPAM. Blocked by me":\ :Þle=/usr/local/etc/spamd/blacklist.txt:
Эта запись указывает на необходимость загрузить в черный список адреса из указанного локального файла. Поскольку этот метод используется по умолчанию, ключ «method» опущен.
16
whitelist:\ :white:\ :Þle=/usr/local/etc/spamd/whitelist.txt:
А это белый список. Параметр «msg» здесь за ненадобностью не используется. Если адрес отправителя занесен в указанный файл, то он будет исключен из предыдущего черного списка, если там окажется. На основании данного конфигурационного файла spamd-setup формирует черные списки. При этом адреса в них упорядочиваются по возрастанию, исключаются дублирования и пересечения подсетей так, чтобы любой адрес был представлен только в единственном экземпляре. Адреса, присутствующие в белом списке, исключаются из предыдущего черного (и только из него). Если «белый» адрес должен быть исключен из нескольких черных списков, в секции «all» соответствующий белый список следует указать после каждого такого черного списка. Сформированные списки утилита spamd-setup загружает в таблицу <spamd> фильтра pf (используя команду pfctl), а также отправляет их на управляющий порт (tcp/8026) демону spamd. В ходе тестирования было выявлено интересное поведение демона (используемая версия программы – 3.7) – то ли из-за ошибки разработчика, то ли по иной недосягаемой для моего понимания причине spamd при обработке данных, поступающих на порт 8026, не воспринимает последний (самый большой) адрес. Поскольку в таблицу <spamd> он заносится нормально, то перенаправление на порт 8025 его соединений выполняется, но spamd как «черный» данный адрес не воспринимает, помечая его как серый (GREY) и возвращая вместо ответа 450 или 550, определяемого ключами запуска, код 451 «Временная ошибка». Но так как на MTA такое соединение все равно не проходит, на корректность работы фильтра эта ошибка практически не влияет. Несколько слов нужно сказать о формате списков. Это обычные текстовые файлы (могут быть упакованы утилитой gzip), в которые заносятся черные или белые адреса, интервалы адресов или подсети, по одному в каждой строке. Допускаются комментарии, начинающиеся с символа «#». После адреса могут содержаться любые пометки – при обработке используется только первая часть строки, соответствующая одному из указанных форматов. Например, файл списка может выглядеть так: # Пример черного списка 192.168.0.5 # Отдельный IP-адрес 10.0.0.1 – 10.0.2.255 # Диапазон адресов наглых спаммеров!!! 5.6.7.0/24 # Так можно задать подсеть # Попытка обмануть spamd: 255.255.255.254
Последняя строчка может быть использована для решения описанной выше проблемы. Поскольку при сортировке данный адрес окажется последним (независимо от его места в файле списка), то именно он не будет воспринят демоном spamd. Все остальные адреса нормально будут обработаны как «черные». Однако не забывайте, что такой «завершающий» адрес все равно попадет в <spamd> и будет перенаправляться. Наблюдать за процессом заполнения черных списков можно, запустив spamd-setup с ключом -d:
безопасность # /usr/local/sbin/spamd-setup -d Getting http://www.openbsd.org/spamd/spews_list_level1.txt.gz blacklist spews1 18541 entries Getting http://www.openbsd.org/spamd/spews_list_level2.txt.gz blacklist spews2 22641 entries Getting http://www.openbsd.org/spamd/chinacidr.txt.gz blacklist china 321 entries Getting http://www.openbsd.org/spamd/koreacidr.txt.gz blacklist korea 162 entries blacklist myblack 1 entries whitelist mywhite 4 entries
Не забывайте выполнять spamd-setup каждый раз после перезапуска pf, чтобы вновь заполнить таблицу <spamd>. Так же полезно занести вызов этой утилиты в crontab, чтобы периодически (например, раз в сутки) обновлять внешние черные списки.
Настройка журналирования Демон spamd пишет свои сообщения в syslog. Чтобы собрать все сообщения в одно место, удобно направить их в отдельный файл, для чего в /etc/syslog.conf поместим строки: !spamd *.*
/var/log/spamd.log
Правда, при такой настройке Spamassassin (если он запущен) тоже будет использовать этот файл. Поскольку syslogd не создает отсутствующие файлы, то это придется сделать вручную, после чего нужно отправить сигнал HUP процессу syslogd: # touch /var/log/spamd.log # kill –HUP `cat /var/run/syslog.pid`
Теперь сообщения от демона spamd будут собираться в файле /var/log/spamd.log. На стадии отладки для повышения информативности можно будет запускать spamd с ключом -v. Типичный вывод выглядит следующим образом: Jul Jul Jul Jul Jul Jul Jul Jul Jul Jul Jul Jul
7 7 7 7 7 7 7 7 7 7 7 7
07:39:49 07:39:55 07:39:58 07:39:58 07:39:58 07:39:58 07:39:58 07:39:58 07:39:58 07:39:58 07:39:58 07:39:58
konst konst konst konst konst konst konst konst konst konst konst konst
spamd[23]: spamd[23]: spamd[23]: spamd[23]: spamd[23]: spamd[23]: spamd[23]: spamd[23]: spamd[23]: spamd[23]: spamd[23]: spamd[23]:
1.2.3.4: connected (2/2), lists: korea (BLACK) 1.2.3.4: <br9@tlcm.ru> -> <kp@test.ru> 1.2.3.4: From: =?Windows-1251?B?gg6vPv4O3o5ewu?= 1.2.3.4: To: kp@test.ru 1.2.3.4: Subject: =?Windows-1251?B?wg6vPv4O3o5ewu?= 1.2.3.4: Body: <head> 1.2.3.4: Body: <title></title> 1.2.3.4: Body: </head> 1.2.3.4: Body: <body bgcolor="#FFFFFF"> 1.2.3.4: Body: <p align="center"> 1.2.3.4: Body: <p align="right"> 1.2.3.4: disconnected after 9 seconds. lists: korea
То есть здесь можно найти информацию о времени установления и разрыва соединения, а также об отправителе и получателе сообщения. Кроме того, в лог-файл (в режиме подробного вывода, настраиваемого опцией -v) выводятся заголовок и несколько первых строк тела сообщения. Если для протоколирования работы spamd вы используете отдельный файл, то не забудьте добавить для него правило ротации в /etc/newsyslog.conf.
Нормальный режим В нормальном режиме spamd используется только для задержки спам-трафика, поэтому перенаправление выполняется лишь для адресов, занесенных в черный список. Белые списки используются для удаления адресов из черных списков. Например, рассмотрим такой конфигурационный файл:
№7, июль 2005
all:\
:blacklist:
blacklist:\ :black:\ :msg="SPAM. Blocked by me":\ :Þle=/usr/local/etc/spamd/blacklist.txt:
В данном случае в таблицу <spamd> фильтра pf заносятся все адреса из файла blacklist.txt. Все остальные источники будут пропущены на реальный MTA. Если же добавить белый список: all:\
:blacklist:whitelist:
blacklist:\ :black:\ :msg="SPAM. Blocked by me":\ :Þle=/usr/local/etc/spamd/blacklist.txt: whitelist:\ :white:\ :Þle=/usr/local/etc/spamd/whitelist.txt:
то в таблицу <spamd> попадет содержимое blacklist.txt за исключением адресов, перечисленных в whitelist.txt. Причем таким свойством «вычитания» обладает только белый список, приведенный в строке «all» непосредственно после имени черного.
«Серый» режим В сером режиме, как было показано выше, белый список применяется явно, в то время как адреса, не представленные ни в одном из списков, получают серый оттенок и обрабатываются особым образом. Для реализации этого, вопервых, требуется дополнительная таблица и правило перенаправления в /etc/pf.conf: table <spamd-white> persist rdr pass inet proto tcp from !<spamd-white> to ↵ any port smtp -> 1.2.3.25 port spamd
В итоге соединения, источник которых не включен в <spamd-white>, тоже будут перенаправляться на порт 8025. За формирование белого списка теперь отвечает сам spamd, динамически добавляя нужные адреса в таблицу <spamd-white>. За черный список по-прежнему отвечает spamd-setup. Обратите внимание, что адреса, занесенные в белые списки spamd.conf, лишь исключаются из черных. То есть spamd будет воспринимать их как серые. Во-вторых, чтобы spamd запустился в сером режиме, используется ключ «-g», который нужно указать в файле /etc/rc.d в строке pfspamd_flags: pfspamd _ ßags="-g –G 25:4:864 -v"
Необязательный ключ «-G» задает временные интервалы соответственно для pastime, greyexp и whiteexp. Здесь же можно добавить ключ «-v», чтобы на период отладки получать более подробную информацию о работе фильтра. Возможно, я что-то упустил в процессе настройки, но при включении серого режима на экран стали выводиться такие сообщения об ошибке: pfctl : /dev/fd/7: No such file or directory
17
безопасность Добиться нормальной работы удалось после ручного монтирования файловой системы дескрипторов fdescfs (см. man 5 fdescfs): # mount _ fdescfs 7 /dev/fd/
Как видно на представленном ниже листинге, spamd в «сером» режиме запускает еще два процесса – отвечающий за обновление белого списка (процесс 6017) и за обновление базы /var/db/spamd (процесс 6020): 6017 ?? Ss 6018 ?? S 6020 ?? S
0:00,02 spamd: (pf <spamd-white> update) (spamd) 0:00,07 /usr/local/libexec/spamd -v -g -G5:1:2 0:00,00 spamd: (/var/db/spamd update) (spamd)
Файл /var/db/spamd, хранящий информацию о поступивших запросах и их дальнейшей судьбе, создается автоматически, когда spamd запускается с ключом -g. Посмотреть состав этой базы можно, если выполнить команду spamdb без параметров: # /usr/local/sbin/spamdb GREY|1.2.3.4|<ab@cd.com>|<qw@test.ru>|1120715668|1120719268|1120719268|1|0 GREY|5.6.7.8|<sv@ef.com>|<fort@test.ru>|1120716752|1120720352|1120720352|1|0 WHITE|10.0.0.203|||1120715625|1120717099|1120724330|2|0
Поля в каждой строчке означают следующее (слева направо): тип записи (GREY, WHITE и т. п.), IP-адрес источника, адрес отправителя, адрес получателя, время первой попытки, время перехода адреса из статуса GREY в статус WHITE, время удаления записи из базы, количество заблокированных попыток, количество пропущенных соединений. Если повторная попытка соединения будет выполнена спустя интервал pastime, но до истечения периода greyexp, адрес заносится в таблицу <spamd-white>, и в дальнейшем соответствующие соединения пропускаются на MTA. Состав таблицы <spamd-white> можно посмотреть следующей командой: # pfctl -t spamd-white -Tshow 10.0.0.203
С помощью команды /usr/local/sbin/spamdb можно добавлять в базу данных новые «белые» адреса либо удалять имеющиеся: # /usr/local/sbin/spamdb GREY|1.2.3.4|<ab@cd.com>|<qw@test.ru>|1120715668|1120719268|1120719268|1|0 GREY|5.6.7.8|<sv@ef.com>|<fort@test.ru>|1120716752|1120720352|1120720352|1|0 WHITE|10.0.0.203|||1120715625|1120717099|1120724330|2|0
root# /usr/local/sbin/spamdb -d 10.0.0.203 root# /usr/local/sbin/spamdb GREY|1.2.3.4|<ab@cd.com>|<qw@test.ru>|1120715668|1120719268|1120719268|1|0 GREY|5.6.7.8|<sv@ef.com>|<fort@test.ru>|1120716752|1120720352|1120720352|1|0
root# /usr/local/sbin/spamdb -a 10.161.193.253 root# /usr/local/sbin/spamdb WHITE|10.0.0.203|||1120730510|1120730510|1123840910|1|0 GREY|1.2.3.4|<ab@cd.com>|<qw@test.ru>|1120715668|1120719268|1120719268|1|0 GREY|5.6.7.8|<sv@ef.com>|<fort@test.ru>|1120716752|1120720352|1120720352|1|0
Механизм «greylisting mode», конечно, не дает абсолютной гарантии, что спам не попадет в ящики пользователей. В этом режиме лишь предпринимается попытка отсеять случайные соединения (для которых не будут выполняться по-
18
вторные попытки) либо слишком частые попытки «протолкнуть» вам свое письмо.
Используем ловушки При работе в «сером» режиме возможно использование так называемых ловушек – фиктивных адресов электронной почты, которые в вашей системе отсутствуют. Если на такой адрес будет получено письмо, его отправитель автоматически заносится в черный список сроком на 24 часа. Хороший эффект дает использование в качестве ловушки популярных у спаммеров адресов (alex, max, oao, sales и др.). Подобная ловушка заносится в базу /var/db/spamd следующей командой: # /usr/local/sbin/spamdb -T -a "<max@test.ru>" # /usr/local/sbin/spamdb -t -a 10.0.0.225 # /usr/local/sbin/spamdb | grep TRAP SPAMTRAP|max@test.ru TRAPPED|10.0.0.225|1120817623
Ключ -T позволяет добавить ловушку. Адреса, с которых будут выполняться попытки доставить почту на адрес ловушки, заносятся в базу как TRAPPED и обрабатываются как принадлежащие черному списку, пока не пройдут сутки с момента последней попытки соединения. Через 24 часа адрес удаляется из базы и вновь обрабатывается как «серый». С помощью ключа -t можно вручную добавить в базу адрес как «пойманный», как это показано для адреса 10.0.0.225.
Подробнее о ключах запуска Spamd помимо ключей g, G, v, которые нам уже встречались, может быть запущен еще с несколькими полезными опциями: ! -b: указывается IP-адрес интерфейса, на котором spamd будет ожидать входящие соединения (по умолчанию прослушиваются все имеющиеся интерфейсы). ! -s: задает время задержки перед выводом каждого символа в диалоге с отправителем, занесенным в один из черных списков. По умолчанию задано значение, равное 1 секунде. ! -4 или -5: код ответа спаммеру, 450 (по умолчанию) или 550 соответственно. ! -c: максимальное число одновременных подключений. ! -B: максимальное число одновременных подключений для адресов, занесенных в черный список. ! -n: строка, выводимая в баннере приветствия. ! -d: запущенный с этим ключом spamd не переключается в фоновый режим, что позволяет наблюдать на экране то, как он работает. Поскольку spamd не имеет конфигурационного файла (напомню, что spamd.conf обрабатывается утилитой spamdsetup), то единственный способ настроить его работу – использование ключей запуска.
Доработать и … Пожалуй, одного инструмента для комфортной работы со spamd не хватает – при первоначальном запуске в сером режиме адреса разрешенных отправителей (например, удаленных сотрудников, адреса главного офиса и т. д.) приходится заносить в таблицу <spamd-white> вручную. Попробуем устранить это неудобство подручными средствами, разработав
безопасность на Python несложный скрипт, который будет заносить белые адреса в базу /var/db/spamd из текстового файла: Листинг 1. Сценарий a2w.py #!/usr/local/bin/python import sys, os def Usage(): print 'Usage: a2w.py Þlename' sys.exit(-1) # Подпрограмма «разворачивает» подсеть в список адресов def Expand(subnet): global whitelist if subnet.Þnd(‘/’) == -1: subnet = subnet + '/32' netaddr, masklen = subnet.split('/') masklen = int(masklen) # Если ошибка – оставляем запись как есть if masklen < 1 or masklen > 32: whitelist.append(subnet) return # Здесь используется синтаксис «расширенного списка» – # результат будет получен как список значений функции int # для каждого элемента в списке, возвращаемом функцией split o1, o2, o3, o4 = [int(o) for o in netaddr.split('.')] for i in range(0, 2 ** (32 - masklen + 1)): addr = '%d.%d.%d.%d' % (o1, o2, o3, o4) whitelist.append(addr) o4 += 1 if o4 == 256: o3 += 1; o4 = 0 if o3 == 256: o2 += 1; o3 = 0 if o2 == 256: o1 += 1; o2 = 0 # Если нельзя, но очень хочется – то можно! # (Это про несколько операторов в одной строке…) #---------------------------------------------if len(sys.argv) != 2: Usage() DEBUG = 1 errcnt = 0 spamdbcmd = '/usr/local/sbin/spamdb' Þlelist = open(sys.argv[1], 'r').readlines() whitelist = [] for line in Þlelist: Expand(line[:-1]) for addr in whitelist: cmd = spamdbcmd + ' -a ' + addr # Запятая после аргументов команды print # оставляет курсор на текущей строке if DEBUG: print 'Try: ' + cmd, # Функция os.system вернет 0, если указанная # как аргумент команда будет выполнена успешно err = os.system(cmd) if err: errcnt += 1 if DEBUG: print 'Failed' else: if DEBUG: print 'ok' if errcnt: print 'WARNING: executed with errors (see above)'
Приведенный сценарий считывает данные из текстового файла, передаваемого как аргумент командной строки, и заносит их в базу spamdb, используя команду /var/local/sbin/ spamdb -a. Формат текстового файла не допускает комментариев, пустых строк и т. д. Он может содержать только IP-адреса или подсети в формате CIDR, по одной записи в строке:
№7, июль 2005
# cat wl.txt 10.10.29.192/29 1.2.3.4/33
Подсети, определяемые по наличию символа «/», функцией Expand «разворачиваются» в список отдельных IPадресов whitelist, который затем поэлементно передается программе spamdb. Если длина маски задана неправильно, то сценарий оставляет запись как есть, возлагая обработку ошибки на утилиту spamdb (вторая запись в файле wl.txt демонстрирует поведение в этом случае). Если отладка включена (переменная DEBUG не равна 0), то каждая попытка и ее результат будут отображаться на экране: # ./a2w.py wl.txt Try: /usr/local/sbin/spamdb -a 10.20.29.192 ok Try: /usr/local/sbin/spamdb -a 10.20.29.193 ok Try: /usr/local/sbin/spamdb -a 10.20.29.194 ok Try: /usr/local/sbin/spamdb -a 10.20.29.195 ok Try: /usr/local/sbin/spamdb -a 10.20.29.196 ok Try: /usr/local/sbin/spamdb -a 10.20.29.197 ok Try: /usr/local/sbin/spamdb -a 10.20.29.198 ok Try: /usr/local/sbin/spamdb -a 10.20.29.199 ok Try: /usr/local/sbin/spamdb -a 10.20.29.200 ok Try: /usr/local/sbin/spamdb -a 10.20.29.201 ok Try: /usr/local/sbin/spamdb -a 10.20.29.202 ok Try: /usr/local/sbin/spamdb -a 10.20.29.203 ok Try: /usr/local/sbin/spamdb -a 10.20.29.204 ok Try: /usr/local/sbin/spamdb -a 10.20.29.205 ok Try: /usr/local/sbin/spamdb -a 10.20.29.206 ok Try: /usr/local/sbin/spamdb -a 10.20.29.207 ok spamdb: invalid ip address 1.2.3.4/33 Try: /usr/local/sbin/spamdb -a 1.2.3.4/33 Failed WARNING: executed with errors (see above)
После выполнения сценария можно убедиться, что соответствующие адреса добавлены в базу как «белые»: # /usr/local/sbin/spamdb | grep WHITE WHITE|10.20.29.192|||1120801435|1120801442|1123911842|1|1 WHITE|10.20.29.193|||1120801435|1120801442|1123911842|1|1 WHITE|10.20.29.194|||1120801435|1120801442|1123911842|1|1 WHITE|10.20.29.195|||1120801435|1120801442|1123911842|1|1 WHITE|10.20.29.196|||1120801435|1120801442|1123911842|1|1 WHITE|10.20.29.197|||1120801435|1120801442|1123911842|1|1 WHITE|10.20.29.198|||1120801436|1120801442|1123911842|1|1 WHITE|10.20.29.199|||1120801436|1120801442|1123911842|1|1 WHITE|10.20.29.200|||1120801436|1120801442|1123911842|1|1 WHITE|10.20.29.201|||1120801436|1120801442|1123911842|1|1 WHITE|10.20.29.202|||1120801436|1120801442|1123911842|1|1 WHITE|10.20.29.203|||1120801436|1120801442|1123911842|1|1 WHITE|10.20.29.204|||1120801436|1120801442|1123911842|1|1 WHITE|10.20.29.205|||1120801436|1120801442|1123911842|1|1 WHITE|10.20.29.206|||1120801436|1120801442|1123911842|1|1 WHITE|10.20.29.207|||1120801436|1120801442|1123911842|1|1
Кстати, аналогично можно поступить и с ловушками, если вы планируете создать их достаточно большое количество. Эту задачу оставлю вам в качестве упражнения.
… поставить точку Итак, мы рассмотрели работу пакета spamd в системе FreeBSD. Используемый им оригинальный подход к решению проблемы спама в ряде случаев оказывается весьма эффективным. К тому же можно порадоваться, что теперь не только спаммеры могут портить нам жизнь – есть инструмент, с помощью которого можно ответить им тем же.
19
безопасность
РАЗВЁРТЫВАЕМ HEIMDAL KERBEROS
Мы изучили принципы работы Kerberos и взглянули на него с пользовательской точки зрения [1]. Теперь перейдем к практической части и начнем развертывать инфраструктуру Kerberos в локальной сети.
МИХАИЛ КОНДРИН Устанавливаем контроллер Kerberos Начнем установку сервера Heimdal на компьютере с ОС Linux. Если Heimdal не включен в состав вашего дистрибутива, то вы можете получить исходный код Heimdal с ftp-сервера Стокгольмского университета (ftp://ftp.pdc. kth.se/pub/heimdal/src), сконфигурировать и скомпилировать его. tar xzvf heimdal-0.6.3.tar.gz cd heimdal-0.6.3 ./conÞgure --preÞx=/usr --enable-shared make make install
Опции конфигурации позволяют вам собрать Heimdal в виде разделяемых библиотек, что в дальнейшем упрощает сборку программ с поддержкой Kerberos, и установить Heimdal в каталог /usr. При этом пользовательские программы (kinit, klist, telnet и т. д.) записываются в каталог /usr/bin, программы для удаленного администрирования контроллера Kerberos – в /usr/sbin, а серверная часть Kerberos – в /usr/libexec. Если предполагаемое число принципалов невелико (например, порядка сотни), то Heimdal не требует особенно большого количества вычислительных ресурсов. В моем случае в качестве kdc используется 486 компьютер. Желательно тем не менее держать базу данных Kerberos на специально выделенном для этой цели компьютере, т.к. захват злоумышленником этого сервера полностью компрометирует безопасность всей системы. После того как компьютер выбран, на нем нужно создать каталог для хранения баз данных Kerberos. mkdir /var/heimdal chmod 600 /var/heimdal
Далее нужно проделать две вещи: создать конфигурационный файл kdc и инициализировать (заселить несколькими основными принципалами) базу данных Kerberos. Конфигурационный файл (/etc/krb5.conf) используется как сервером Kerberos, так и приложениями, собранными с поддержкой Kerberos. Поэтому этот файл (практически без изменений) можно перенести на все компьютеры, входящие в ваш сектор (будем считать, что его доменное имя myreal.ru).
20
[libdefaults] default _ realm=MYREALM.RU [realms] MYREALM.RU={ kdc=kdc.myrealm.ru admin _ server=kdc.myrealm.ru kpasswd _ server = kdc.myrealm.ru } [logging] kdc=FILE:/var/log/krb5kdc.log admin _ server=FILE:/var/log/kadmin.log default=FILE:/var/log/krb5.log
В этом файле содержится необходимый минимум настроек Kerberos – название сектора по умолчанию (строка, которая будет добавляться к именам принципалов без доменной части), расположение серверов Kerberos : kdc, сервера удаленного администрирования и их лог-файлов. В качестве альтернативы для передачи настроек Kerberos можно использовать службу DNS, для чего в файл зоны для домена myrealm.ru нужно добавить записи (предполагается, что адрес для kdc уже записан в файле зоны): _ kerberos kerberos _ kerberos. _ udp _ kerberos. _ tcp _ kerberos-adm. _ tcp _ kpasswd. _ udp
TXT CNAME SRV SRV SRV SRV
"MYREALM.RU" kdc 0 0 88 kdc 0 0 88 kdc 0 0 749 kdc 0 0 464 kdc
Передача настроек Kerberos по DNS полезна при большом числе клиентских компьютеров, когда синхронизировать файлы /etc/krb5.conf вручную сложно. Теперь можно приступать к пополнению баз данных Kerberos. sudo /usr/sbin/kadmin -l kadmin>init MYREALM.RU kadmin>add admin/admin@MYREALM.RU kadmin>add mike@MYREALM.RU kadmin> add --random-key host/kdc.myrealm.ru@MYREALM.RU kadmin>ext */kdc.myrealm.ru@MYREALM.RU
Ключ -l позволяет запускать kadmin в локальном режиме без аутентификации в Kerberos. Команда init создает базу данных Kerberos и заселяет ее несколькими принципалами со случайным образом сгенерированными ключами для сервисов, предоставляемых самим Kerberos. Это krbtgt/MYREALM.RU для Ticket Granting Service, kadmin/admin для сервиса kadmind и kadmin/changepw для сервиса kpasswd, поз-
безопасность воляющего пользователям менять свой пароли в Kerberos. Принципал kadmin/hprop, также создаваемый при инициализации Kerberos, используется при синхронизации баз данных между дополнительными и основным контроллерами сектора Kerberos, и в нашем случае он не актуален. С помощью команда add в эту вновь созданную базу записываются пользователи и сервисы. В данном случае добавляются пользователи – администратор Kerberos (admin/admin), еще один рядовой пользователь (mike) и принципал для компьютера, на котором работает контроллер Kerberos (host/kdc.myrealm.ru). В отличие от первых двух случаев для сервиса пароль выбирается случайным образом (ключ – random-key), поскольку знать его ни администратору Kerberos, ни тем более рядовым пользователям необязательно. Затем этот ключ извлекается из базы данных Kerberos (команда ext) и дописывается в файл /etc/krb5.keytab. Керберизованные серверные программы знают, что их «пароли» записаны в этом файле и при подключении клиента (см. схему работы Kerberos, изложенную выше) могут извлечь свой пароль оттуда. В данном случае права root для запуска kadmin необходимы, поскольку в результате помимо файла /etc/krb5.keytab в папке /var/ heimdal, куда запись простым пользователям запрещена, создается файл heimdal.db с паролями принципалов. Теперь все готово для запуска сервера kdc. Если после команды: /usr/libexec/kdc -c /etc/krb5.conf --detach
в log-файле появились сообщения вида: 2005-03-15T23:43:46 listening on IPv4:127.0.0.1 port 88/udp 2005-03-15T23:43:46 listening on IPv4:127.0.0.1 port 88/tcp
значит, сервер успешно стартовал и можно переходить к запуску сервера удаленного администрирования kadmind (749/tcp-порт) и службы смены паролей kpasswdd (464/udpпорт). /usr/libexec/kadmind /usr/libexec/kpasswdd
Хотя для смены паролей можно использовать программу kadmin (/usr/sbin/kadmin passwd mike), но для пользователей более удобно проделать то же самое с помощью утилиты kpasswd, которая подключается к службе kpasswdd. Поскольку сервис kadmind нужен не очень часто (при добавлении/удалении принципалов), то имеет смысл использовать его вызов в сервере inetd (xinetd). Для этого вам, во-первых, нужно убедиться, что ссылки на сервисы, собранные с поддержкой Kerberos (и kadmind в том числе) присутствуют в файле /etc/services. Необходимые для этого данные содержатся в файле heimdal-0.6.3/etc/services. append в дистрибутиве heimdal. Во-вторых, нужно добавить запись, касающуюся сервера удаленного администрирования, в файл /etc/inetd.conf и перeзапустить inetd. kerberos-adm stream tcp nowait root ↵ /usr/libexec/kadmind kadmind
В то же время kpasswdd может работать только как самостоятельная служба, и организовать его вызов с помощью inetd невозможно.
№7, июль 2005
Контроль доступа к kadmind и управлению пользователями Kerberos обеспечивается списками, хранящимися в файле /var/heimdal/kadmin.acl. Разумная политика – предоставить администратору (admin/admin) полный контроль по управлению записями Kerberos, а всем остальным – позволить лишь менять свои пароли. Для такой цели достаточно иметь такой acl-файл: admin/admin@MYREALM.RU *@MYREALM.RU
all cpw
Для проверки работоспособности сервера Kerberos попробуйте аутентифицироваться на нем (как администратор) и посмотреть содержимое его баз данных: kinit -p admin/admin kadmin kadmin> list *
На этом установку сервера Kerberos можно считать законченной. Настройка же клиентов для использования этого сервера различается в случае рабочей станции и серверов приложений. Разберем два случая – настройку только сервера (компьютера, предлагающего сетевые сервисы) и только рабочей станции (которая не предлагает никаких сервисов и предназначена только для локальной работы).
Настраиваем серверные программы Настройка серверов приложений достаточно проста (при условии, что на сервере работает UNIX-подобная система). Во-первых, устанавливайте дистрибутив Heimdal, как описано выше. Этого уже достаточно, чтобы компьютер (предположим, что его сетевое имя server.myrealm.ru) работал как клиент Kerberos, нужно только скопировать файл krb5.conf с сервера Kerberos на настраиваемый компьютер. Конфигурационный файл можно не редактировать – приведенный выше файл подойдет как для серверов, так и рабочих станций. Кроме того, как уже говорилось, на хосте с сетевыми сервисами должен присутствовать файл /etc/krb5.keytab с набором ключей для этих сетевых служб (точнее, для принципалов Kerberos, соответствующим этим сетевым службам). Также сервису должно быть известно имя принципала, который представляет его в Kerberos. Как правило, этот параметр настраивается для каждого сервиса индивидуально (с помощью конфигурационных файлов) или используются какие-то фиксированные значения. В любом случае вам придется изучить документацию, предлагаемую разработчиками программы. Как уже говорилось ранее, для сервисов используются имена, состоящие из трех компонентов – поле instance содержит сетевое имя компьютера, а основное имя обозначает тип предлагаемого сервиса. Предположим, вы хотите установить все сервисы, входящие в дистрибутив Heimdal (telnet, ftp, несколько r*-служб). Для этого регистрируйтесь в Kerberos как администратор, добавляете принципалов host/server.myrealm.ru@MYREALM.RU, ftp/ server.myrealm.ru@MYREALM.RU и извлекаете их ключи в локальный /etc/krb5.keytab файл. kinit admin/admin kadmin kadmin>add --random-key host/server.myrealm.ru@MYREALM.RU kadmin>add --random-key ftp/server.myrealm.ru@MYREALM.RU
21
безопасность kadmin>ext */server.myrealm.ru@MYREALM.RU
Если вы ошиблись – добавили в /etc/krb5.keytab ключ службы, которая не используется на данном компьютере, то для управления ключами в файле /etc/krb5.keytab предназначена утилита ktutil. Удалить лишнюю запись можно командой /usr/sbin/ktut il remove -p ftp/server.myrealm.ru, точно так же, как и просмотреть все записи в keytab-файле (ktutil list) или добавить новый ключ (ktutil get ftp/server. myrealm.ru). Теперь настроим запуск сервисов через демон inetd, для чего нужно добавить следующие строки в файл inetd.conf (не забудьте также добавить записи из файла heimdal-0.6.3/ etc/services.append к системному файлу /etc/services): telnet stream tcp nowait root ↵ /usr/libexec/telnetd telnetd -L /usr/bin/login ftp stream tcp nowait root /usr/libexec/ftpd ftpd shell stream tcp nowait root /usr/libexec/rshd rshd ↵ -vkshell stream tcp nowait root ↵ /usr/libexec/rshd rshd -k ekshell stream tcp nowait root /usr/libexec/rshd ↵ rshd -kx kx stream tcp nowait root /usr/libexec/kxd kxd
Почти все сервисы стандартные, shell/kshell/ekshell – это вариации на тему rshd. Первый из них работает просто как «заглушка», выдает сообщение об ошибке, если пользователь подключается по старинке, без TGT. Второй и третий – керберизованные сервисы, использующие Kerberos в последнем случае с шифрованием трафика. Нестандартным является сервис kx (использует 2111/tcp-порт), который предназначен для организации соединений по X-протоколу через шифрованный канал. Если вы, например, подключитесь к серверу server.myrealm.ru с помощью команды rxtelnet server.myrealm.ru, то при успешном соединении на вашем X-сервере откроется окно xterm с командным интерпретатором, запущенном на удаленном компьютере (server. myrealm.ru). Вся графика при этом будет прозрачно переадресовываться на вашу рабочую станцию. В некотором смысле мы имеем аналог ssh – X server.myrealm.ru. Поскольку время действия любого сертификата Kerberos ограничено, то одной из задач при настройке сектора Kerberos является синхронизация времени между компьютерами в локальной сети. Локальное время компьютера используется клиентами Kerberos при запросе на выдачу билета, и если это время значительно отличается от времени контроллера Kerberos (более чем на 5 минут), то такие запросы отвергаются. Так что бесполезно, например, предлагать контроллеру Kerberos просроченный TGT, просто переведя часы на локальном компьютере. Но с другой стороны, удаленный доступ к какому-то компьютеру также может быть невозможным только потому, что его часы опережают часы контроллера Kerberos, скажем, на 10 минут. Поэтому синхронизация времени внутри сектора необходима для корректного функционирования Kerberos. Если у вас в локальной сети уже работает сервер ntp, то можно воспользоваться им. Об установке и настройке сервера ntpd написано в статье [2]. Однако для целей Kerberos достаточно, если вы выберете какой-то из компьютеров в вашей сети (допустим, тот же самый server.myrealm.ru) в качестве эталонного и будете сверять по нему часы осталь-
22
ных компьютеров (и контроллера Kerberos в том числе) по протоколу time. Служба time уже встроена в сервер inetd, нужно только убедиться, что в файле /etc/inetd.conf не закомментирована строка: time
dgram
udp
wait
root
internal
Синхронизация осуществляется с помощью базовой UNIX-утилиты netdate server.myrealm.ru. Для рабочих станций ее достаточно запускать при загрузке, для серверов, которые перегружаются не так часто, имеет смысл вызывать ее периодически с помощью демона cron. Еще один технический вопрос – вопрос о правах, которые нужно выставить на keytab-файл. Поскольку он содержит пароли сетевых служб, то первая мысль, которая приходит в голову, ограничить к нему доступ так же, как и к /etc/ shadow – чтение только для root. Но сервисы тоже должны иметь возможность извлекать свои ключи из этого файла, т.е. Keytab-файл также должен быть открыт для чтения пользователем, с правами которого запущены сервисы. В нашем случае это замечание не столь важно, поскольку все сервисы работают с правами root, но бывает ситуации, когда нужно дать доступ к keytab-файлу непривилегированным службам. В таком случае стоит завести специальную группу и занеcти в нее всех системных пользователей, используемых керберизованными службами, а файл /etc/krb5.keytab открыть для чтения этой группе.
Настраиваем рабочие станции Для этого достаточно иметь упоминавшийся выше конфигурационный файл /etc/krb5.conf и собственно сам дистрибутив heimdal. Но бывает также удобно настроить системный login на этой рабочей станции таким образом, чтобы при входе на компьютер, пользователь автоматически получал TGT с контроллера Kerberos. Для рабочих станций под управлением Linux такой функциональности можно добиться, заменив системный login (/bin/login) на керберизованный аналог из состава Heimdal (/usr/bin/login). Проще всего это сделать, отредактировав файл /etc/inittab: c1:123:respawn:/sbin/agetty c2:123:respawn:/sbin/agetty k1:5:respawn:/sbin/agetty -l k2:5:respawn:/sbin/agetty -l
38400 tty1 linux 38400 tty2 linux /usr/bin/login 38400 tty1 linux /usr/bin/login 38400 tty2 linux
и заменив default run-level на 5. Таким образом, по умолчанию загрузка компьютера будет осуществляться в керберизованном режиме, а для аварийных ситуаций у администратора компьютера сохраняется возможность заходить на компьютер в стандартном режиме (в run-level 1,2,3). Следует только иметь в виду, что керберизованный login запрашивает помимо собственно супербилета еще и session ticket для доступа к рабочей станции. Как вы понимаете, это требует наличия принципала, соответствующего данной рабочей станции в базе данных Kerberos и ее ключа в файле /etc/krb5.keytab. Заметим также, что если по каким-то причинам аутентификация пользователя на сервере Kerberos закончилась неудачей, то login переключается в стандартный режим и аутентифицирует пользователя по локальному файлу /etc/shadow.
безопасность Для рабочих станций под управлением Windows2000/ XP получить такую же функциональность несколько сложнее. Во-первых, авторы Heimdal не предлагают свой продукт в виде стандартного Windows-приложения, и Heimdal может работать только в Cygwin-окружении (www.cygwin. com) – эмуляторе POSIX-системы для Windows. Вы можете установить Cygwin целиком с помощью установщика, который можно скачать с сайта cygwin и затем скомпилировать исходный код Heimdal. Гораздо проще, однако, взять уже готовые бинарные пакеты Heimdal и урезанную версию Сygwin с ftp-сервера Стокгольмского университета: ftp://ftp.pdc.kth.se/pub/heimdal/binaries/i386-pc-cygwin/latest <http://www.cygwin.com/>. Поскольку Cygwin для приложений, запущенных в нем, выглядит как полное UNIX-окружение, то дальнейшая конфигурация ничем не отличается от установки под Linux. После установки Cygwin и Heimdal пользователь по крайней мере может аутентифицироваться на сервере Kerberos, запустив терминал Cygwin и введя команду kinit. Полученный сертификат в дальнейшем может быть использован клиентскими программами из дистрибутива Heimdal (ftp, telnet и т. д.). При этом остаются две проблемы – заставить Heimdal использовать ваше имя и пароль, введенный при входе в Windows для аутентификации на сервере Kerberos, и обеспечить доступ к Kerberos не только для Cygwin, но и Windowsприложений. К сожалению, только средствами Heimdal эти проблемы не решаются. Разберемся со второй проблемой. Хотя библиотеки Cygwin, и библиотеки Heimdal в том числе, являются стандартными, динамически линкуемыми библиотеками Windows, но использование их для приложений Windows невозможно (подробнее об этом написано на сайте cygwin – http://cygwin.com/faq.html). Поэтому для Windows-приложений есть две возможности – или использовать API предлагаемой самой Windows, или использовать библиотеки MITKerberos, которые доступны в Windows-версии, но при этом бесполезны для Cygwin-приложений. Возникает вопрос – какие из библиотек лучше установить на свой компьютер? Правильный ответ – ставить все! Пакет Support Tools от Microsoft [3] включает в себя две утилиты ksetup и kpasswd, с помощью которых можно настроить получение начальных сертификатов Kerberos при входе пользователя на рабочую станцию, а пакет Kerberos-For-Windows от МТИ [5] позволяет обеспечить доступ к этим сертификатам как для библиотек MIT-Kerberos, так и Heimdal. Так что начнем с настройки керберизованного входа в Windows. Я использую WindowsXP-Pro без сервиспаков, но тот же метод работает и для более новых версий Windows. Установка Support Tools не должна вызвать затруднений. Затем вам нужно добавить принципала для этой машины (для определенности назовем ее xp.myrealm.ru) в базу данных Kerberos. Сделать это можно, например, из терминала Cygwin (я полагаю, что вы уже настроили Heimdal в нем), но в отличие от рабочих станций, под управлением LInux вам нужно будет придумать пароль для этого компьютера: kinit admin/admin kadmin kadmin>add -pw passwordforWinXP host/xp.myrealm.ru@MYREALM.RU
№7, июль 2005
23
безопасность Затем с помощью утилиты ksetup.exe, зайдя на машину под администраторским логином, из командной строки Windows вы должны указать название сектора Kerberos, адрес контроллера Kerberos и ввести пароль для машины (тот самый, что вы только что придумали): C:> ksetup /setdomain MYREALM.RU C:> ksetup /addkdc MYREALM.RU kdc.myrealm.ru C:> ksetup /setcomputerpassword passwordforWinXP
После чего перегрузить компьютер. При загрузке машины обратите внимание, что форма с приглашением входа в Windows изменилась. На ней должно появиться еще одно поле выбора с двумя вариантами – зарегистрироваться на компьютере xp.myrealm.ru или в секторе Kerberos MYREALM.RU. Но второй вариант пока не работоспособен, т.к. вы еще не настроили соответствия между локальными именами пользователей и именами принципалов Kerberos. Так что вам нужно снова войти на компьютер как Администратор и настроить эти соответствия. Тут есть два варианта: C:> ksetup /mapuser * * C:> ksetup /mapuser mike@MYREALM.RU mikeXP
В первом случае каждый принципал из базы данных Kerberos отображается на пользователя Windows c темже именем (только без доменной части). Во втором случае (если вас такая политика не устраивает) вы разрешаете только определенному пользователю (mikeXP) аутентифицироваться в Kerberos под именем принципала mike@MYREALM.RU. Так или иначе, но теперь вы можете при входе на рабочую станцию одновременно получать сертификаты Kerberos. Но этот сертификат хранится в памяти, а не на дисковом файле, как у Heimdal, и доступ к нему осуществляется посредством API Windows. Чтобы сделать его доступным для Heimdal, нужно воспользоваться утилитой ms2mit из пакета MIT-Kerberos, разработчики которого работают в тесном контакте с Microsoft и поэтому представляют себе особенности ее реализации Kerberos. Установка MIT-Kerberos очень проста. Помимо инсталлятора [4] они предлагают свой пакет в виде обычного zipархива [6], который можно распаковать в удобный для вас каталог. Не стоит только устанавливать его в директорию Program Files, т.к. она входит в переменную PATH Cygwin, что может привести к конфликтам между одноименными утилитами Heimdal и MIT-Kerberos. Так что лучше распаковать его в какой-нибудь из каталогов на диске C: (у меня это С:\ kfw-2.6.5). Помимо утилиты ms2mit, в него входят уже знакомый вам набор стандартных утилит Kerberos (kinit, klist, kdestroy) и также графический интерфейс к ним (Leash32). После установки MIT-Kerberos вам нужно настроить Heimdal и MIT-Kerberos таким образом, чтобы они использовали один и тотже кэш сертификатов, с тем чтобы начальный сертификат, полученный с помощью одной из этих библиотек, был бы автоматически доступен и другой. У Heimdal кэш – это (как вы помните) файл с именем krb5cc_ + id пользователя во временном каталоге (временный каталог Cygwin – это С:\Cygwin\tmp), но это название можно поменять с помощью переменной окружения Сygwin KRB5CCNAME.
24
безопасность У MIT-Kerberos в дефолтной установке используется кэш в памяти, но его можно настроить на использование дискового файла. Сделать это можно с помощью установки переменной окружения Windows (KRB5CCNAME) и записей в реестре Windows HKCU\Software\MIT\Kerberos5\ccname, HKLM\Software\MIT\Kerberos5\ccname. Системой используется первое непустое значение в этой последовательности или значение по умолчанию – «API:». Я использую batфайл, запускаемый при входе в Windows, который устанавливает переменную окружения KRB5CCNAME на название файла, используемого Heimdal, и затем перемещает сертификат Windows в этот файл утилитой ms2mit. Для каждого из пользователей Windows этот файл свой, поскольку значение KRB5CCNAME зависит от идентификатора этого пользователя в Сygwin-окружении. set KRB5CCNAME = FILE:C:\Cygwin\tmp\krb5cc _ 1017 ms2mit
То же самое вы можете проделать с помощью программы Leash32 (меню «Action → Import Ticket(s)/Token(s)»), так же как просматривать/удалять имеющиеся сертификаты и настраивать кэш сертификатов (меню «Options → Kerberos v5 Properties Dialog»). Здесь имеется еще одна ловушка, заботливо расставленная компанией Microsoft. Для большей безопасности в установке по умолчанию Support Tools экспорт начального сертификата из памяти Windows запрещен, что делает его использование бесполезным для MIT-Kerberos и Heimdal. К счастью (точнее, благодаря давлению со стороны разработчиков из MIT), Microsoft оставила ключи в реестре, с помощью которых можно снять этот запрет. Так что, для того чтобы утилита ms2mit работала, в реестре должны быть установлены значения: HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters AllowTGTSessionKey = 0x01 (DWORD) HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos AllowTGTSessionKey = 0x01 (DWORD)
Заключение Еще несколько слов о совместимости различных версий Kerberos. Как вы могли только что убедиться, билетики, получаемые от сервера Heimdal, работают во всех версиях клиентов Kerberos (Microsoft, MIT, Heimdal). То же самое верно, если бы в качестве сервера использовался KDC от MIT. Пример же использования библиотеки MIT-Kerberos в домене Windows 2000 c Active Directory, где реализован сервер Kerberos от Microsoft, разобран в статье [7]. Так что на уровне протокола совместимость между реализациями удовлетворительная. В то же время на уровне API совместимость даже между Heimdal и MIT Kerberos оставляет желать лучшего. Для того чтобы приложение (клиент или сервер) могло использовать Kerberos, соответствующая поддержка должна быть заложена в код программы. Реализация протокола Kerberos c нуля сложна, поэтому, как правило, приложение использует динамические библиотеки Kerberos. Реализации от MIT пользуется большей популярностью, поэтому, скорее всего, интересующее вас приложение будет исполь-
№7, июль 2005
зовать именно ее библиотеки. При этом поддержка Heimdal тоже может быть реализована авторами программы. Хотя заголовки функций Heimdal практически повторяют функции MIT-Kerberos, но структуры данных существенно различны. Поэтому перелинковка приложения, разработанного под MIT Kerberos c библиотеками Heimdal, даже если у вас получится это проделать, скорее всего, приведет к некорректной работе приложения. Таким образом, модификация кода приложения, пусть и небольшая, неизбежна в любом случае. Это замечание особенно актуально для Windows. Многие керберизованные приложения, разработанные под UNIX-системы, можно использовать в Windows в среде Cygwin, поскольку для авторов портирование под Cygwin дается легче, чем перелицовывание программы под полноценное Windows-приложение. Единственная реализация Kerberos, доступная для такого рода программ, – это Heimdal, и вам следует убедиться, что интересующее вас приложение поддерживает Heimdal. Удивительно, хотя MIT-Kerberos и разрабатывается под UNIX-системы, но в Cygwin-окружении он неработоспособен. Исключением является ситуация, когда приложение использует Kerberos не напрямую, а через интерфейс GSSAPI. Примером такого приложения является ftp из дистрибутива Heimdal. GSSAPI (Generic Security Service Application Program Interface) – это интерфейс, обеспечивающий стандартизованный доступ к функциям аутентификации Kerberos. Как MIT-Kerberos, так и Heimdal предлагают свои реализации GSSAPI, поэтому в данном случае обе библиотеки оказываются полностью взаимозаменямыми. На этом установку Kerberos в гетерогенной сети можно считать завершенной. В итоге вы можете управлять регистрационной информацией пользователей из одного места (сервера kdc). Ваши пользователи получают регистрацию в секторе Kerberos при входе на свои рабочие станции, прозрачный доступ к компьютерам внутри сети с помощью команд telnet и rsh, удаленный доступ к файлам при помощи ftp и rcp, шифрованный канал доступа к X-серверам. Разумеется, количество керберизованных сервисов не ограничивается только службами из состава Heimdal, но установка и конфигурирование других сервисов требует отдельного обсуждения.
Литература, ссылки: 1. Кондрин М. Изучаем принципы работы Heimdal Kerberos. – Журнал «Системный администратор», №6, 2005 г. – 56-59 с. 2. Платов М. Атомные часы на вашем столе. – Журнал «Системный администратор», №4, 2004 г. – 16-21 с. 3. http://www.microsoft.com /downloads /details.aspx? familyid=49AE8576-9BB9-4126-9761-BA8011FABF38&dis playlang=en. 4. http://web.mit.edu/kerberos/www/dist/kfw/2.6/kfw-2.6.5/ MITKerberosForWindows-2.6.5.exe. 5. http://web.mit.edu/kerberos/www/dist/kfw/2.6/kfw-2.6.5/ MITKerberosForWindows-2.6.5.exe; 6. http://web.mit.edu/kerberos/www/dist/kfw/2.6/kfw-2.6.5/kfw2-6-5.zip. 7. Гребенников Р. Танцуем самбу. – Журнал «Системный администратор», №11, 2004 г. – 32-38 с.
25
безопасность
НАСТРАИВАЕМ KERBEROS ПОВЕРХ LDAP
АЛЕКСЕЙ БАРАБАНОВ Сегодня мы рассмотрим настройку открытой версии Kerberos Heimdal для работы с OpenLDAP в качестве хранилища учетных данных. Такое решение позволит вам создать однородную информационную среду для обеспечения процесса аутентификации и авторизации пользователей в Linux.
С
истемы аутентификации на основе стандартов Kerberos все чаще используются в практических решениях. Безусловно, Kerberos обладает массой привлекательных качеств. Но сама по себе аутентификация – это «паспорт» несуществующей страны, поскольку всегда успешная аутентификация предполагает следующую фазу – авторизацию. Если продолжим паспортную аналогию, то именно на стадии авторизации владелец действительного «паспорта» получает соответствующие права. Авторизационная база, содержащая перечень данных на каждую снабженную «паспортом» персону должна содержать еще и данные, позволяющие установить соответствие персоны и паспорта. Но ведь и база аутентификации, т.е. база фактически проверяемых при сопоставлении «паспорта» и персоны данных, тоже содержит информацию, частично продублированную в «паспорте», как минимум имя персоны. Возвращаясь к информационным технологиям, далее будем называть набор прав к «паспорту» бюджетом, как это принято в практике администрирования, а персону с «паспортом» – принципалом, как это принято в Kerberos. Итак, если информация о бюджетах хранится в одной базе, а информация о принципалах в другой, то получается, что для нормального функционирования неразрывного механизма аутентификации и авторизации необходимо поддерживать обе базы, обеспечивать их связанность, иметь для каждой собственное средство управления доступом. Кроме этого, архивирование информации системы ау-
26
тентификации и авторизации тоже в таком случае не может производиться единым образом. Напрашивается очевидное решение – разместить обе базы в одном хранилище. В качестве такого хранилища может выступать LDAP. Для реализации этой идеи надо обеспечить возможность для системных средств получать информацию о бюджетах из базы LDAP, во-первых, и, во-вторых, заставить Kerberos хранить свои записи о принципалах и соответствующих им ключах тоже в LDAP. И то и другое уже достижимо. Размещение бюджетной информации в LDAP – это отдельная большая тема. Ей посвящено много руководств и даже учебников. Вы можете воспользоваться рекомендациями из заметок [1] на эту тему. Кроме того, использование LDAP зачастую является стандартнным для некоторых платформ. Поэтому предположим, что данный вопрос уже решен. Вся дальнейшая работа будет производится в среде SuSE Linux с уже настроенным хранением бюджетов в OpenLDAP, например, так как это сделано согласно требованиям Samba PDC. Теперь к такой системе добавляем Kerberos. Воспользуемся открытой версией Kerberos, что поставлялась в SuSE до версии 9.3 – Heimdal. С версии 9.3 в SuSE произошел переход на Kerberos от MIT, в опциях настройки которого отсутствует возможность работы с LDAP, поэтому далее эту реализацию Kerberos не будем рассматривать. Итак, в OpenLDAP уже хранятся аутентификационные данные, соответствующие системным службам в атрибуте userPassword, аутентификационные данные, соответствую-
безопасность щие Samba в атрибутах sambaLMPassword и sambaNTPassword. Если в систему добавится Kerberos, то дополнительно каждому бюджету будет сопоставлены данные о принципале Kerberos. Это тот же пароль и права на участие в отношениях внутри определенной области Kerberos (Kerberos realm). Далее рассмотрим настройку Kerberos, работающего с LDAP, по шагам.
Собираем Heimdal Да-да, собираем. Оказывается, стандартный Heimdal, поставляемый в SuSE, собирается без поддержки LDAP. Для проверки установим дистрибутивные пакеты: # rpm -qa | grep heimdal heimdal-devel-0.6-67 heimdal-lib-0.6-67 heimdal-tools-0.6-67 heimdal-0.6-67
И посмотрим, с какими библиотеками скомпонован демон kdc: # ldd /usr/lib/heimdal/sbin/kdc | grep ldap
Так как ссылок на ldap нет, то придется пересобрать Heimdal заново. Для этого установим исходные тексты: # rpm -ivh heimdal-0.6-67.src.rpm
Можно даже взять версию поновее с сайта разработчиков [2]. Режим сборки задается в файле rpm-спецификации в строках, где производится конфигурирование пакета перед непосредственным выполнением команды make. Заглянем в оригинальный файл rpm-спецификации: # cat /usr/src/packages/SPECS/heimdal.spec | ↵ sed -n "/^# building with openldap/,+14p" # building with openldap support does not work right now because # autobuild cannot handle circular dependencies such as # libhdb -> libldap -> libsasl -> libgssapi -> libhdb #with_openldap="--with-openldap=/usr" # CFLAGS="$RPM_OPT_FLAGS -DOPENSSL_DES_LIBDES_COMPATIBILITY" \ ./configure --enable-shared --prefix=/usr/lib/heimdal \ --with-x --mandir=%{_mandir} \ --libdir=%{_libdir} \ --infodir=%{_infodir} --libexecdir=/usr/lib/heimdal/sbin \ --includedir=/usr/include/heimdal \ --with-readline-include=/usr/include/readline \ --with-readline-lib=/usr/lib \ $with_openldap make
Читаем предупреждение. Не верим. Снимаем комментарий с управляющей переменной и собираем пакеты заново. Протокол сборки завершается сообщениями об успешной записи новых rpm: # rpmbuild -ba /usr/src/packages/SPECS/heimdal.spec ..... Wrote: Wrote: Wrote: Wrote: Wrote:
/usr/src/packages/SRPMS/heimdal-0.6-67.src.rpm /usr/src/packages/RPMS/i586/heimdal-0.6-67.i586.rpm /usr/src/packages/RPMS/i586/heimdal-devel-0.6-67.i586.rpm /usr/src/packages/RPMS/i586/heimdal-lib-0.6-67.i586.rpm /usr/src/packages/RPMS/i586/heimdal-tools-0.6-67.i586.rpm
№7, июль 2005
Удивительно, но все собралось вопреки предупреждениям SuSE-гуру. Устанавливаем полученное. # rpm -Uvh --force /usr/src/packages/RPMS/i586/heimdal-*.rpm
Проверяем, что теперь сборка выполнена с поддержкой LDAP: # ldd /usr/lib/heimdal/sbin/kdc | grep ldap libldap.so.2 => /usr/lib/libldap.so.2 (0x4007a000)
Все отлично, ссылка на библиотеку LDAP появилась. Как и следовало ожидать, в информационных технологиях здоровый скепсис всегда кстати.
Настраиваем OpenLDAP В отличие от NSS и PAM сервер Kerberos не имеет специального файла настройки LDAP-клиента. В отличие от Postfix, Squid, Courier-IMAP он не имеет также опций настройки LDAP-клиента в своих конфигурационных файлах. И это совершенно правильное решение. Дело в том, что если подключения Kerberos к LDAP будет использовать уязвимый способ аутентификации, то грош цена всей остальной системной безопасности, которую несет технология Kerberos. Защита внутри Kerberos, а в предлагаемом способе подключения LDAP становится частью Kerberos, должна гарантироваться физическими, а не информационными условиями. Другими словами, Kerberos может работать только с локальным сервером LDAP и только через локальное подключение, не допускающее перехвата информационного обмена. Для этого настроим LDAP на прослушивание локального сокета. В SuSE это делается путем изменения специального файла в sysconfig. # cat /etc/sysconÞg/openldap | grep LDAPI OPENLDAP_START_LDAPI="yes"
А в других дистрибутивах надо просто настроить ключи запуска LDAP. Вся информация внутри LDAP размещается согласно определенным схемам. Есть такая схема и для размещения информации Kerberos. Эта схема не входит в состав дистрибутивных пакетов. Но ее нетрудно разыскать в Интернете. Авторство этой схемы принадлежит PADL Software Pty Ltd. Можно взять версию, прилагаемую к статье [3], или поискать поновее по ссылке [4]. Эту схему надо положить ко всем остальным схемам и добавить соответствующую ссылку на нее в файл настроек LDAP : # cat /etc/openldap/slapd.conf | grep krb5 include
/etc/openldap/schema/krb5-kdc.schema
Разрешим полный доступ через локальный сокет, добавив соответствующие строки в настройки ограничений доступа LDAP. Здесь используется специальный подключаемый файл slapd.access.conf , содержащий очень грубую настройку условий доступа. Можно даже сказать так, что эта настройка носит только учебный характер.
27
безопасность # cat /etc/openldap/slapd.access.conf | grep -v "^\(#\|$\)" access to by by by
dn=".*,dc=office,dc=localnet" sockurl="^ldapi:///$" self *
write write read
Согласно указанным правилам все пользователи могут читать всю базу LDAP, а вот править могут только лишь собственные контейнеры. Строка «by sockurl=”^ldapi:///$”» выбирает из всех запросов те, что поступают в LDAP через локальный сокет, и дает таким клиентским подключениям права на запись, то есть самые высокие по шкале эскалации прав LDAP. Как уже стало понятно, базовый контейнер LDAP имеет имя dc=office,dc=localnet. Заметим, что хотя все атрибуты, использованные для хранения ключей принципалов, шифруются по мастерключу конкретного KDC (Kerberos Key Distribution Ceter или в русской аналогии ЦРК – центр распределения ключей), для предотвращения доступа к таким записям со стороны иных служб рекомендуется настроить соответствующим образом правила доступа к LDAP базе. Да и права, собственно, Kerberos тоже можно ограничить определенным уровнем дерева LDAP. Но разрешить все со стороны локального сокета не достаточно. Поскольку Kerberos никак себя не аутентифицирует при подключении к LDAP, то в сеансе связи он будет считаться анонимным пользователем. В версиях OpenLDAP с индексом более 2 модификация базы через такое подключение приводит к ошибке. Например, попытка инициализации области Kerberos завершается сообщением: kadmin: kadm5_create_principal: ldap_add_s: Strong(er) authentication required
Добавим специальную опцию «allow update_anon» в управляющий файл LDAP перед директивами, описывающими базу данных. Эта опция допускает изменение базы LDAP анонимным клиентом, если последнее разрешено операторами access. Теперь можно запустить LDAP. # rcldap start Starting server:~ tcp unix 2 unix 2
ldap-server done # netstat -apn | grep slapd 0 0 127.0.0.1:389 0.0.0.0:* LISTEN 11036/slapd [ ACC ] STREAM LISTENING 82235 11036/slapd /var/run/slapd/ldapi [ ] DGRAM 182233 11036/slapd
Видно, что процесс slapd слушает не только локальный адрес, но и сокет /var/run/slapd/ldapi. Здесь есть еще один «подводный камень», который, возможно, будет иметь значение для владельцев дистрибутивов, отличных от SuSE. Дело в том, что традиционно LDAP запускается от соответствующего пользователя. # ps -eo user,args | grep slapd | grep -v grep | head –n 1 ldap /usr/lib/openldap/slapd -h ldapi:/// ldap://127.0.0.1:389/ -u ldap -g ldap
И несмотря на это, сокет для связи создается от пользователя root и с правами, ограничивающими доступ к нему от иных пользователей и групп, но с установленным битом
28
«set user ID». Вроде все верно, только расположен он внутри директории, доступной лишь для ldap.ldap. # ls -als /var/run/slapd total 24 4 drwx-----4 drwxr-xr-x 0 srwx-----4 drwx-----4 drwx-----4 -rw-r--r-4 -rw-r--r--
4 20 1 2 2 1 1
ldap root root ldap ldap ldap ldap
ldap root root ldap ldap ldap ldap
4096 4096 0 4096 4096 76 5
Jun Jun Jun Sep Sep Jun Jun
12 12 12 24 24 12 12
13:04 23:02 13:04 2003 2003 13:04 13:04
. .. ldapi openldap-data openldap-slurp slapd.args slapd.pid
Процесс kdc в SuSE запускается от пользователя root, и поэтому нет никаких проблем с подключением к сокету для связи с LDAP. Если в некоторой системе приняты иные соглашения, то недоступность локального сокета, созданного LDAP, со стороны процесса kdc может быть причиной отказа Kerberos. Для исправления этого надо просто поменять права доступа у сокета после запуска slapd. Подключенный через локальный сокет Kerberos имеет исключительно доверительные права на доступ к базе LDAP. Но это нужно только для режима наполнения базы данными. Для регулярной работы Kerberos, аутентификации и выдачи билетов достаточно иметь доступ на чтение. То есть всегда остается возможность «заморозить» состояние базы Kerberos. Хотя верно это лишь для применяемой версии Heimdal, которая не обновляет индексы в базе при выдаче билетов, и, естественно, в таком случае станет невозможным изменение паролей принципалов.
Настраиваем Kerberos Создадим файл управления службой Kerberos. Рабочей областью Kerberos (в оригинале realm) назначим OFFICE. LOCALNET и ограничим перечень прослушиваемых адресов внутрисетевыми. Должно получиться так: # cat /etc/krb5.conf [kdc] database = { dbname = ldap:ou=KerberosPrincipals,dc=office,dc=localnet log_file = /var/heimdal/log acl_file = /var/heimdal/kadmind.acl } addresses = 127.0.0.1 192.168.0.1 [libdefaults] default_realm = OFFICE.LOCALNET clockskew = 300 dns_lookup_kdc = 1 [realms] OFFICE.LOCALNET = { kdc = kerberos.office.localnet admin_server = kerberos.office.localnet kpasswd_server = kerberos.office.localnet } [domain_realm] .office.localnet = OFFICE.LOCALNET [logging] default = SYSLOG:NOTICE:DAEMON kdc = FILE:/var/log/kdc.log kadmind = FILE:/var/log/kadmind.log [appdefaults] pam = { ticket_lifetime = 1d renew_lifetime = 1d forwardable = true proxiable = false }
безопасность Проверим настройки специальной программой. # verify _ krb5 _ conf
verify_krb5_conf: /kdc/database/log_file: unknown entry verify_krb5_conf: /kdc/database/acl_file: unknown entry
Сообщения игнорируем, так как они ошибочные. Можно или собрать более свежую версию verify_krb5_conf, или сразу писать авторам сообщение об ошибке. Прокомментирую секцию kdc и оператор database. Внутри указывается контейнер LDAP, в котором будут размещаться записи, используемые Kerberos. Дополнительно определим файл протокола и файл с установками ограничений доступа к самой базе со стороны принципалов. Эти строки надо указывать обязательно. Но Kerberos работает со своей базой на очень примитивном уровне и поэтому не имеет возможности анализировать специфические ошибки LDAP. Иначе говоря, он не может распознать отсутствие подготовленного контейнера в LDAP и создать его самостоятельно. Значит, нужно предварительно создать контейнер для Kerberos ou=KerberosPrin-cipals,dc=office,dc=localnet. Для этого подготовим данные в специальном файле kerberos.ldif. # cat kerberos.ldif dn: ou=KerberosPrincipals,dc=office,dc=localnet ou: KerberosPrincipals objectClass: top objectClass: organizationalUnit objectClass: domainRelatedObject associatedDomain: office.localnet
Здесь отмечу одну забавную особенность. На сайте [4] в описании аналогичной настройки записан контейнер с ou= KerberosPrincpals, который отличается отсутствием буквы «i» в слове «Principals». Это именно описка, поскольку там же в примере с ldapsearch приведен грамматически правильный вариант. Но тем не менее многими такая форма была воспринята как стандарт и бездумно повторена. Этот случай свидетельствует о высоком уровне априорного доверия всякому экспертному мнению в области компьютерной безопасности. Создадим контейнер для Heimdal. # ldapadd -v -H ldap://localhost -D "cn=ldapadmin, ↵ dc=ofÞce,dc=localnet" -x -w secret -f kerberos.ldif ldap_initialize( ldap://localhost ) add ou: KerberosPrincipals add objectClass: top organizationalUnit domainRelatedObject add associatedDomain: office.localnet adding new entry "ou=KerberosPrincipals,dc=office,dc=localnet" modify complete
Теперь все готово для настройки Kerberos.
Оффлайновое администрирование В первую очередь подготовим мастер-ключ. # kstash
№7, июль 2005
Master key: Verifying - Master key: kstash: writing key to `/var/heimdal/m-key'
Проверим, что появился соответствующий файл. # ls -als /var/heimdal 4 -rw-------
1 root
root
72 Jun 11 00:04 m-key
В дальнейшем пароль, использованный для генерации мастер-ключа, можно забыть. Самое главное, не терять файл с мастер-ключом, так как без него KDC не сможет работать с собственной базой. Считается, что копию файла с мастер-ключом надо хранить отдельно от архива базы Kerberos. Подключимся к Kerberos в оффлайне (ключ -l) и настроим область Kerberos. # kadmin -l kadmin> init OFFICE.LOCALNET Realm max ticket life [unlimited]: Realm max renewable ticket life [unlimited]: kadmin> exit
Проверим, используя опять же оффлайновое подключение, что вышло. # kadmin -l kadmin> list * krbtgt/OFFICE.LOCALNET@OFFICE.LOCALNET kadmin/changepw@OFFICE.LOCALNET kadmin/admin@OFFICE.LOCALNET changepw/kerberos@OFFICE.LOCALNET kadmin/hprop@OFFICE.LOCALNET default@OFFICE.LOCALNET kadmin> exit
Интерпретируем результат. Итак, выше приведен перечень служебных принципалов, созданных автоматически. Структура именования принципалов следующая: primary_ name/instance@REALM. Но в данном случае часть instance имеет значение «роль». Для администрирования зарегистрируем принципала sysadmin/admin. # kadmin -l kadmin> add sysadmin/admin Max ticket life [1 day]: Max renewable life [1 week]: Principal expiration time [never]: Password expiration time [never]: Attributes []: sysadmin/admin@OFFICE.LOCALNET's Password: Verifying - sysadmin/admin@OFFICE.LOCALNET's Password: kadmin> exit
Вот пароль этого принципала надо запомнить обязательно. Хотя в случае утери его можно восстановить через оффлайновое подключение. Создание sysadmin/admin в файле-реплике LDAP отображается следующим образом: time: 1118439261 dn: cn=sysadmin/admin@office.localnet,ou=KerberosPrincipals,dc=office,dc=localnet changetype: add objectClass: top objectClass: person objectClass: krb5Principal objectClass: krb5KDCEntry krb5PrincipalName: sysadmin/admin@OFFICE.LOCALNET krb5KeyVersionNumber: 1
29
безопасность krb5MaxLife: 86400 krb5MaxRenew: 604800 krb5KDCFlags: 126 krb5Key:: MCWhIzAhoAMCARChGgQYCCzqjwcCvAduYvIOzSVKuq33j9qeBJe5 krb5Key:: MBWhEzARoAMCAQOhCgQIUl6ATDGML2g= krb5Key:: MBWhEzARoAMCAQKhCgQIUl6ATDGML2g= krb5Key:: MBWhEzARoAMCAQGhCgQIUl6ATDGML2g= cn: sysadmin/admin@office.localnet sn: sysadmin/admin@office.localnet structuralObjectClass: person entryUUID: 271bfa42-6e43-1029-90f0-b1a0d84cadb1 creatorsName: cn=anonymous createTimestamp: 20050610213421Z entryCSN: 2005061021:34:21Z#0x0001#0#0000 modifiersName: cn=anonymous modifyTimestamp: 20050610213421Z
Здесь видно, что создатель записей в контейнерах Kerberos anonymous.
Настраиваем DNS Перейдем к настройкам удаленного доступа к сервисам Kerberos. Сначала настроим DNS. Здесь предполагается, что KDC запускается в локальной сети 192.168.0.0/24 на хосте 192.168.0.1. Добавим в описание зоны office.localnet следующие строки: $ORIGIN .ofÞce.localnet. $TTL 86400 ; 1 day _ kerberos TXT "OFFICE.LOCALNET." kdc A 192.168.0.1 kerberos A 192.168.0.1 $ORIGIN _ tcp.ofÞce.localnet. $TTL 600 ; 10 minutes _ kerberos SRV 0 100 88 kerberos.ofÞce.localnet. _ kerberos-adm SRV 0 100 749 kerberos.ofÞce.localnet. _ kpasswd SRV 0 100 464 kerberos.ofÞce.localnet. $ORIGIN _ udp.ofÞce.localnet. $TTL 600 ; 10 minutes _ kerberos SRV 0 100 88 kerberos.ofÞce.localnet. _ kpasswd SRV 0 100 464 kerberos.ofÞce.localnet.
Перезапустим сервер DNS и проверим, что разрешение имен работает нужным образом. # dig _ kerberos. _ tcp.ofÞce.localnet any +short
Настало время запустить службы Kerberos. # rckdc start
# netstat -apn | grep "\(kdc\|kadmin\|kpasswd\)" 0 192.168.0.1:88 0 127.0.0.1:88 0 :::749 0 XX.XXX.XX.XX:464 0 192.168.0.1:464 0 YYY.YY.Y.YY:464 0 10.0.0.1:464 0 127.0.0.1:464 0 192.168.0.1:88 0 127.0.0.1:88 0 ::1:464 [ ] DGRAM
0.0.0.0:* LISTEN 10984/kdc 0.0.0.0:* LISTEN 10984/kdc :::* LISTEN 10986/kadmind 0.0.0.0:* 10988/kpasswdd 0.0.0.0:* 10988/kpasswdd 0.0.0.0:* 10988/kpasswdd 0.0.0.0:* 10988/kpasswdd 0.0.0.0:* 10988/kpasswdd 0.0.0.0:* 10984/kdc 0.0.0.0:* 10984/kdc :::* 10988/kpasswdd 359313 10988/kpasswdd
Примечательно, что kdc, т.е. сервис аутентификации и выдачи билетов, запустился на внутренних адресах и порту 88, как и планировалось. Сервис удаленного админист-
30
# kadmin -p sysadmin/admin kadmin> list * sysadmin/admin@OFFICE.LOCALNET's Password: kadmin: get *: Operation requires `get' privilege kadmin> exit
Это значит, в базе Kerberos не настроены права доступа. Ранее все подключения делались напрямую к базе данных, и права доступа не учитывались. Настроим их. # cat >/var/heimdal/kadmind.acl <<EOT > sysadmin/admin all > * cpw > EOT
Это значит, sysadmin/admin может делать все, а остальные только менять пароли. И теперь повторим попытку подключения.
done
Посмотрим, что вышло.
0 0 0 0 0 0 0 0 0 0 0
Теперь проверим, как будет работать не оффлайновое, а сетевое администрирование Kerberos.
kadmin> list * sysadmin/admin@OFFICE.LOCALNET's Password: krbtgt/OFFICE.LOCALNET@OFFICE.LOCALNET kadmin/changepw@OFFICE.LOCALNET kadmin/admin@OFFICE.LOCALNET changepw/kerberos@OFFICE.LOCALNET kadmin/hprop@OFFICE.LOCALNET default@OFFICE.LOCALNET sysadmin/admin@OFFICE.LOCALNET kadmin> exit
Запускаем Kerberos
tcp tcp tcp udp udp udp udp udp udp udp udp unix 2
Работаем в сети
# kadmin -p sysadmin/admin
0 100 88 kerberos.office.localnet.
Starting kdc
рирования kadmind прослушивает все возможные адреса по порту 749, а вот kpasswdd, т.е. сервис изменения паролей, слушает на всех активных в данный момент адресах по порту 464, не исключая и двух внешних подключений к ISP. Другими словами, без firewall не обойтись, иначе если не атаки, то сканирований не избежать. Но все вышесказанное относится только к принятой в SuSE схеме запуска. Ничего не мешает запустить kadmind и kpasswdd через суперсервер xinetd, и уже средствами последнего ограничить доступ. Схема запуска через суперсервер, кроме прочего, еще и позволит сэкономить ресурсы.
Как показала эта проверка, kdc перечитывает правила доступа к базе при каждом обращении, то есть нет необходимости перезагружать демон. И теперь проделаем все то же самое, но с удаленного компьютера, предварительно переложив туда файл настроек krb5.conf, который одновременно является и файлом настроек клиента Kerberos. Получим билет для принципала sysadmin/admin на рабочей станции: alekseybb@wsalekseybb:~> kinit sysadmin/admin sysadmin/admin@OFFICE.LOCALNET's Password: kinit: NOTICE: ticket renewable lifetime is 1 week alekseybb@wsalekseybb:~> klist Credentials cache: FILE:/tmp/krb5cc_500 Principal: sysadmin/admin@OFFICE.LOCALNET Issued Expires Principal Jun 11 02:14:33 Jun 11 12:15:57 krbtgt/OFFICE.LOCALNET@OFFICE.LOCALNET
безопасность Здесь видно, что в кеше Kerberos для локального клиента alekseybb лежит билет от krbtgt/OFFICE.LOCALNET, выписанный на принципала – администратора sysadmin/ admin@OFFICE.localnet. Такой билет называется супербилет (в оригинале – Ticket Granting Ticket), поскольку он дает право на получение билетов на доступ ко всем другим принципалам, расположенным в той же области Kerberos. В нашем случае это список, полученный по команде «list *». Проверим доступ к базе на правах администратора. alekseybb@wsalekseybb:~> /usr/sbin/kadmin kadmin> list * krbtgt/OFFICE.LOCALNET@OFFICE.LOCALNET kadmin/changepw@OFFICE.LOCALNET kadmin/admin@OFFICE.LOCALNET changepw/kerberos@OFFICE.LOCALNET kadmin/hprop@OFFICE.LOCALNET default@OFFICE.LOCALNET sysadmin/admin@OFFICE.LOCALNET kadmin> exit
Теперь снова заглянем в кеш билетов. alekseybb@wsalekseybb:~> klist Credentials cache: FILE:/tmp/krb5cc_500 Principal: sysadmin/admin@OFFICE.LOCALNET Issued Expires Principal Jun 11 02:14:33 Jun 11 12:15:57 krbtgt/OFFICE.LOCALNET@OFFICE.LOCALNET Jun 11 02:14:47 Jun 11 03:14:47 kadmin/admin@OFFICE.LOCALNET
Кроме супербилета, там появился второй билет, полученный на основании универсального и предназначенный для доступа к принципалу kadmin/admin@ OFFICE.LOCALNET. Оба билета выданы на «имя» sysadmin/admin. Значит, работает. Удостоверимся в том, что Heimdal не модифицирует в процессе аутентификации записи в базе. Для этого есть много способов, но достаточно более внимательно просмотреть записи в самой базе. alekseybb@wsalekseybb:~> /usr/sbin/kadmin kadmin> list -l kadmin/admin Principal: kadmin/admin@OFFICE.LOCALNET Principal expires: never Password expires: never Last password change: never Max ticket life: 1 hour Max renewable life: 1 hour Kvno: 1 Mkvno: 0 Policy: none Last successful login: never Last failed login: never Failed login count: 0 Last modified: 2005-06-10 20:04:12 UTC Attributes: requires-pre-auth Keytypes(salttype[(salt-value)]): des-cbc-crc(pw-salt), des-cbc-md4(pw-salt), des-cbc-md5(pw-salt), des3-cbc-sha1(pw-salt) kadmin> exit
Видно, что поля с указанием времени последней аутентификации и прочие не установлены. Точно также можно убедиться в отсутствии модификаций по файлуреплике LDAP, в который должны заноситься все такие операции.
Взвесим «за» и «против» Итак, давайте взвесим, какие преимущества достигаются комбинацией Kerberos и LDAP. Быть может, не стоило все это и городить.
№7, июль 2005
Перечислим положительные приобретения:
! Вся аутентификационная и бюджетная информация хра-
нится в одной базе и, значит, может быть архивирована единым образом. ! Появляется возможность «заморозки» изменений в базе Kerberos, что позволяет сделать его работу более надежной. ! Появляется второй канал репликации базы Kerberos за счет реплики LDAP. То есть возрастает доступность (availability) службы KDC. Теперь подсчитаем отрицательные:
! У KDC появляется зависимость от дополнительной служ-
бы, надежность предоставления сервиса которой надо гарантировать теперь вдвойне. ! Хотя использование мастер-ключа не позволяет вскрыть или подменить ключи принципалов, но гарантия того, что они не будут простого уничтожены, теперь лежит на другом сервисе и его настройках. Значит, в подобной схеме хранения надежность определяется по наислабейшему компоненту. Скорее всего, таким нужно считать LDAP. Во всех руководствах по созданию KDC записано требование размещать KDC на отдельном хосте, который более ничем не может быть занят. Ну разве что SSH для администрирования. Но здесь же основанием для сочетания Kerberos и LDAP главными были мотивы интегрального характера. С другой стороны, есть успешный пример такой интеграции – разработка фирмы Microsoft под названием ActiveDirectory. Конечно, вопросы безопасности нужно прорабатывать очень тщательно и применительно к конкретному составу приложений, которые будет обслуживать LDAP. Поскольку если в общей директории хранится еще и информация Kerberos, то надо будет оградить ее от потенциально небезопасных приложений. Ну и последнее соображение. Как следует из материалов работы [5], использование LDAP в качестве хранилища увеличило среднее время обработки запроса с 8 мс до 2.4 с, то есть почти в 300 раз. Конечно, измерения проводились на области, содержащей 1000 принципалов, и на не очень сильном компьютере. Но даже с поправкой на закон Мура надо учитывать фактор снижения производительности при переводе системы на подобную конфигурацию.
Ссылки: 1. Заметки по настройке размещения пользовательских бюджетов в LDAP: http://www.barabanov.ru/arts/LDAPremarks-2.pdf. 2. Домашний сайт проекта Heimdal: http://www.pdc.kth.se/ heimdal. 3. Схема для размещения информации Kerberos в LDAP: http://www.barabanov.ru/arts/kerberos_over_ldap/krb5-kdc. schema. 4. Лидер в области разработок АиА с использованием LDAP: http://www.padl.com. 5. Different database methods in Heimdal. Assar Westerlund, Swedish Institute of Computer Science: http://www.chips. chalmers.se/Chips/conference/made2000/presentations/ danielsson.et.al.pdf.
31
администрирование
ASTERISK И LINUX: МИССИЯ IP-ТЕЛЕФОНИЯ ДЕЙСТВИЕ 2
МИХАИЛ ПЛАТОВ В прошлой статье [1] мы познакомились с основными возможностями Asterisk PBX, настроив небольшую мини-АТС, работающую по протоколу SIP. Сегодня мы значительно расширим ее функциональность, добавив поддержку протокола H323 и обеспечив связь с городской сетью.
Альтернативный межгород В прошлый раз мы предоставили нашим пользователям возможности дешевой междугородной связи. Для этого мы подключили наш сервер к сети одного из провайдеров по «родному» для Asterisk протоколу SIP. Однако, как показывает практика, провайдеры в большинстве своем не спешат переходить на SIP и при предоставлении своих услуг продолжают использовать более традиционный H323. Сильно расстраиваться по этому поводу не стоит – рано или поздно все равно все перейдут. А пока этого не произошло, решим эту проблему со своей стороны – установим H323-модуль Asterisk. На данный момент мне известно о существования четырех различных H323-драйверов (см. таблицу 1)для Asterisk: ! chan_oh323 – исторически первый H323-драйвер для Asterisk. При работе использует RTP-стек библиотеки OpenH323, со всеми вытекающими отсюда последствиями (поддерживаемые кодеки, стабильность, совместимость). Поддерживается компанией inAccess Networks [2]. ! chan_h323 – отличительной особенностью данного драйвера является более тесная интеграция с Asterisk (используется Asterisk-реализация протокола RTP), что позволяет достичь большей производительности по сравнению с chan_oh323. Платой же за это является несколько меньшая функциональность. Так, например, chan_h323 не имеет собственного буфера дрожания (jitter buffer) [3], а также не поддерживает некоторые кодеки. ! chan_ooh323c – драйвер компании Objective Systems Inc [4], основанный на их открытом H323 стеке – Objective Open H.323 for C. И хотя количество поддерживаемых кодеков и H323-настроек несколько меньше, чем у конкурентов, драйвер вполне можно использовать. На данный момент статус драйвера – «beta», но со слов разработчиков, модуль в скором времени должен войдет в состав официальной версии Asterisk. ! chan_woomera – драйвер, позволяющий связать Asterisk с сервером Woomera. На данный момент через woomera можно совершать только H323-звонки, хотя в будущем разработчики обещают обеспечить поддержку универсального уровня абстракции OPAL.
32
Что же выбрать? Ответ на этот вопрос нужно искать исходя из конкретных задач. Если вы используете STABLE-версию Asterisk, то варианты ограничиваются первыми двумя представителями. При этом, если планируемое количество одновременных звонков, совершаемых через H323, достаточно велико, то более предпочтительным будет chan_h323, если желательна более «качественная» реализация H323, то лучше использовать chan_oh323. Драйверы chan_ooh323 и chan_woomera можно рекомендовать к использованию разработчикам и «очень продвинутым пользователям», желающим заглянуть в завтрашний день (H323 и SIP поверх IPv6 и т. д.). Для наших же задач возможностей chan_h323 или chan_oh323 будет более чем достаточно. Определенности ради будем считать, что мы выбрали chan_oh323, хотя приведенные ниже настройки с небольшими изменениями будут работать и с chan_h323.
Устанавливаем chan_oh323 Для канальных драйверов Asterisk отсутствуют готовые бинарные пакеты, поэтому воспользуемся единственно возможным способом установки – компиляцией из исходного кода. При этом будем использовать машину следующей конфигурации: ! CPU AthlonXP 1500+ ! MB Epox 8KHA+ (VIA KT266A) ! 512 Мб RAM ! HDD 40 Гб IDE Samsung ! Gentoo Linux Linux 2005.0 (ядро 2.6.12, gcc 3.4.3 и glibc 2.3.4) Нам понадобятся следующие версии программ и библиотек: ! pwlib 1.6.6 ! openh323 1.13.5 ! chan_oh323 0.6.6 ! Asterisk 1.0.9
администрирование Таблица 1. Сравнение H323-драйверов для Asterisk
Очень большое количество проблем при установке канальных драйверов H323 возникает именно из-за использования других версий pwlib и openh323. Кроме того, у некоторых людей наблюдались трудности при использовании готовых бинарных пакетов, входящих в состав у некоторых дистрибутивов. Взять нужные версии лучше всего с сайта inAccessNetworks (к сожалению, у меня не получилось собрать openh323 с сайта inAccessNetworks, поэтому я взял эту же версию библиотеки из репозитория исходных кодов Gentoo) [5, 6, 7]. Итак, загружаем чуть меньше 4 Мб исходных кодов в /root/src/oh323 и переходим к установке. Начинать необходимо с pwlib. # # # # # #
cd /root/src/oh323 tar xfz ./pwlib-Janus _ patch4-src-tar.gz cd pwlib ./conÞgure make opt make install
Оптимизированная версия pwlib установлена, переходим к openh323. # # # # # #
cd .. tar xfz ./openh323-v1 _ 13 _ 5-src.tar.gz cd openh323 ./conÞgure make opt make install
Библиотека OpenH323 собирается достаточно долго (в моем случае на это ушло чуть больше часа). Кроме того, во время компиляции вам понадобятся около 150 Мб дискового пространства и 300 Мб swap. Теперь перейдем к канальному драйверу chan_oh323: # # # # #
стройку, а также внести соответствующие изменения в номерной план. Параметры chan_oh323 хранятся в файле /etc/asterisk/oh323.conf. Итак, в контексте [general] определим следующие параметры (для остальных оставим значения по умолчанию): [general] listenAddress=IP _ адрес _ интерфейса fastStart=yes inBandDTMF=yes gatekeeper=IP _ адрес _ GateKeeper gatekeeperPassword=secret context=generic-inc
Здесь мы указали:
! IP-адрес, который chan_oh323 будет использовать для
! ! ! !
работы с H323-устройствами (очень полезно, если у Linux-машины имеется несколько адресов в различных сетях); IP-адрес GateKeeper, пароль, с которым мы будем регистрироваться; контекст Asterisk, в который будут попадать все звонки, приходящие со стороны H323; включили режим faststart для более быстрой установки H323-соединений; сообщили серверу, что тоновые сигналы (DTMF) необходимо передавать внутри RTP-пакетов (inBandDTMF=yes).
Заметим, что приведенные значения параметров не являются «лучшими для всех случаев жизни», просто в моей ситуации именно этот набор вызывает наименьшее количество проблем.
cd .. tar xfz ./asterisk-oh323-0.6.6.tar.gz cd ./asterisk-oh323-0.6.6 make make install
Драйвер установлен. Запустим Asterisk с режимом консоли (asterisk -cvvvvv) и выполним команду: * CLI> show modules
Модуль chan_oh323 должен присутствовать в списке загруженных модулей (см. рис. 1).
Настраиваем chan_oh323 Прежде чем приступить к использованию chan_h323 в Asterisk, нам необходимо предварительно произвести на-
№7, июль 2005
Рисунок 1. Список загруженных модулей Asterisk
33
администрирование Если провайдер предоставляет нам телефонные номера для входящих звонков, запишем их в секцию [register]: [register] context=generic _ inc alias=телефонный _ номер _ 1 _ от _ провайдера alias=телефонный _ номер _ 2 _ от _ провайдера
Звонки, приходящие на указанные номера, будут попадать в контекст generic_inc (при необходимости звонки на разные номера можно направить в различные контексты). Для кодеков определим следующие параметры: [codecs] codec=G729 frames=6 codec=G711U frames=20 codec=G729A frames=6 codec=G729B frames=6 codec=G729AB frames=6 codec=GSM0610 frames=4 codec=G7231 frames=4
Данные настройки определяют количество голосовых кадров, упаковываемых в один IP-пакет. Значение по умолчанию («1») слишком расточительно, поэтому поставим здесь типичные значения для голосового оборудования H323 – «4,6». Заданные параметры будут применены после следующего перезапуска Asterisk (см. «Перезагрузка конфигурации»). Перейдем к изменениям номерного плана. Для входящих звонков (со стороны H323) подойдет контекст, который мы создавали в прошлый раз (ведь по большому счету нам все равно посредством какой технологии до нас дозвонились): [generic-inc] exten => s,1,Wait, 1 exten => s, 2, Answer exten => s,3, BackGround(local-welcomе) exten => s,4, WaitExten exten => 200,1, Macro(stdexten,200,SIP/200) exten => 201,1, Macro(stdexten,201,SIP/201) exten => 202,1, Macro(stdexten,202,SIP/202) exten=> 8500,1, VoiceMailMain exten=> 8500,n, Hangup
А вот для исходящих звонков потребуются некоторые изменения. Добавим в контекст [office] следующую запись: exten => _ 6 Dial(OH323/{EXTEN:1},20,rT)
При наборе номера с префиксом «6» звонок будет осуществляться с помощью chan_oh323, т.е. согласно номерному плану провайдера определенному на его GateKeeper. Если же провайдер не использует Getekeeper (схема терминации на шлюз), то в файле oh323.conf необходимо указать: gatekeeper=DISABLE
А в номерном плане написать так:
34
exten => _ 6 Dial(OH323/preÞx{EXTEN:1}@gw _ addr,20,rT)
Здесь prefix – служебный номерной префикс провайдера IP-телефонии, а gw_addr – IP-адрес его H323-шлюза.
Выход в город Как вы могли заметить, на данный момент наша система обладает одним недостатком, несколько затрудняющим ее широкое использование, – отсутствие связи с городской телефонной сетью. Действительно довольно сложно представить себе ситуацию, в которой связь с ТФОП (или c уже существующей мини-АТС) не требовалась. Сейчас мы исправим это недоразумение. Как вы помните из [3], существуют два основных способа подключения к городской телефонной сети: аналоговый (через стандартный телефонный провод) и цифровой (например, 30 каналов через интерфейс E1). Также нам известно, что «переводом» звонков из телефонной сети в VoIP занимаются шлюзы. Так вот, с Asterisk можно не только использовать обычные шлюзы H323, SIP с портами FXO, FXS, E1, но и специализированные модули выпускаемые специально для Asterisk. Фактически они представляют собой PCI-платы с соответствующими разъемами, необходимой электроникой «на борту», а также драйверами, позволяющими всему этому добру работать с Asterisk.
В город вместе с Digium Наиболее известным (но не единственным [8]) производителем таких плат является компания Digium [9] – основной спонсор Open Source-проекта Asterisk. Спектр выпускаемых ею плат достаточно велик – от однопортовых FXS и FXO адаптеров, до модулей с четырьмя интерфейсами E1/T1. Платы с аналоговыми портами наиболее привлекательны для малых предприятий (2 платы 4FXO = 8 аналоговых линий (рис. 2)), цифровые модули наиболее интересны средним предприятиям (1 плата 4E1 – 120 цифровых каналов!).
Рисунок 2. Модуль Digum TDM22B (2 FXO + 2 FXS)
С точки зрения стоимости особенно привлекательными являются платы Digium Wildcard X100P/X101P. С ними связана одна интересная история. Первоначально Wildcard X100P/X101P продавалась Digium по цене около 100$. Однако через какое-то время пользователи заметили, что на самом деле эти платы есть ни что иное, как обычные PCI-софт-модемы на широко распространенных чипсетах (Intel 537PU, 537PG, Ambient MD3200, Motorola 62802-51, первые 3 определятся как X101P или generic clone, последний как X100P), продаваемые в обычном компьютерном магазине за 10-15$. После того как эта информация стала общеизвестной, Digium ничего не оставалось, кроме как свернуть продажи линейки X100P/X101P (в последствии ее место занял внешний модуль IAXy). Впрочем, это не означает, что остальные поступили также. Наоборот, во многих online-магазинах эту плату (X100P, X101P
администрирование или их клоны) по-прежнему можно купить по цене 10-15$. К сожалению, в России софт-модемы на нужных чипсетах не продаются в широкой рознице (у нас более популярны модемы на микросхемах Conexant и Lucent, а не Intel и Motorola), поэтому я заказал эту плату (X101P) через Интернет [10, 11]. Итак, вставим модем в компьютер и настроим его с Asterisk. Первое, что нам необходимо сделать, – убедиться, что модем определился системой. Для этого выполним команду: # lspci
Если среди вывода этой утилиты присутствует строчка, похожая на эту: 0000:00:09.0 Network controller: Tiger Jet Network Inc. Intel 537
можете считать, что ядро Linux PCI-плату увидело и можно пробовать загружать ее драйверы: # modprobe zaptel # modprobe wcfxo
Если модули загрузились без ошибок, то в /var/log/messages мы увидим следующее: Found a Wildcard FXO: Generic Clone
Данная строчка является лучшей иллюстрацией того, что с «железом» у нас все в порядке. Однако прежде чем перейти к настройке Asterisk остановимся на еще одном важном моменте. Дело в том, что платы Digium реализуют «телефонный» интерфейс (FXO, FXS, E1, T1) программно (в zaptel-драйвере), используя для этого вычислительные ресурсы компьютера (в то время как производители других систем телефонии используют специализированные (и более дорогие) сигнальные процессоры – DSP). При этом ввиду специфики задачи (быстрая обработка сигналов) работа с платой ведется в режиме прерываний. Поэтому для нормальной работы очень важно настроить систему так, чтобы платы Digium ни с кем не делили одно прерывание, в противном случае возможны ухудшения качества звука. Посмотрим, как с этим обстоит ситуация у нас: # cat /proc/interrupts 0: 384085652 1: 287894 2: 0 8: 2 9: 0 10: 181360 11: 48942244 12: 2690249 14: 810676 15: 699164 NMI: 0 LOC: 0 ERR: 0
XT-PIC XT-PIC XT-PIC XT-PIC XT-PIC XT-PIC XT-PIC XT-PIC XT-PIC XT-PIC
timer i8042 cascade rtc acpi wcfxo hci_hcd, uhci_hcd, uhci_hcd, eth0 i8042 ide0 ide1
Все нормально, плата монопольно использует прерывание 10. Перейдем к настройке Asterisk. Первым делом отредактируем файл /etc/zatel.conf: fxsls=1 loadzone=us defaultzone=us
№7, июль 2005
Первая строчка означает, что для платы 1 необходимо использовать сигнализацию FXS loop-start (в Asterisk для плат FXO используется сигнализация FXS, и, наоборот; если при указанных настройках сервер не будет определять сигнал «занято», попробуйте другие разновидности fxs-сигнализации: fxs_ks, fxs_gs). Если плат в системе несколько (например, две), то в первой строчке нужно написать fxsks=1-2. Строки 2 и 3 определяют параметры телефонной сети для используемого оборудования (частоты тоновых сигналов, их длительность и т. д.). К сожалению, в списке доступных стран России нет, поэтому, для того чтобы в вашем конкретном случае все заработало, возможно, придется перебрать несколько стран. Список всех доступных вариантов проще всего посмотреть в исходном тексте – файл zonedata.c библиотеки zaptel. Следующим шагом при настройке нашего сервера является определение параметров карты в файле /etc/asterisk/zapata.conf. Выбор значения того или иного параметра определяется конкретной АТС, к которой мы подключаем Asterisk. Как известно, в России могут встречаться различные типы АТС. Привести универсальную конфигурацию, подходящую для всех случаев жизни, достаточно сложно, поэтому ограничимся описанием двух наиболее типичных – с импульсным набором (для старых АТС), с тоновым набором (для более-менее новых АТС). Итак, вначале определим общие параметры, подходящие практически для всех АТС: [channels] context=[generic-inc] signalling=fxs _ ls group=1 callgroup=1 pickupgroup=1 busydetect=yes busycount=5 channel=1
Замечание. Приводимые параметры сгруппированы для более удобного изложения. При фактическом редактировании файла Zapata.conf настоятельно рекомендуется сохранять порядок, принятый в файле. Итак, мы задали контекст, в который будут попадать все телефонные звонки, приходящие со стороны ТФОП. Определили тип сигнализации, используемой Asterisk при работе с FXO-портом. Кроме того, мы создали группу каналов (состоящую из одной телефонной линии), включили распознавание сигнала «занято» (параметр busycount определяет количество коротких гудков, необходимое для того, чтобы Asterisk освободил линию), а также разрешили перехват звонков с ТФОП. Теперь перейдем к параметрам, определяемым в зависимости от возможностей конкретной АТС: callerid=asreceived callprogres=yes usecallerid=yes usecallingpres=yes callwaitingcallerid=yes threewaycalling=yes transfer=yes canpark=yes cancallforward=yes
35
администрирование Первой строкой мы сказали, что сигналы «европейского АОН», приходящие из города, нужно передавать в Asterisk без изменений. Вторая строка включает отслеживание состояния линии (сигналы вызова, ответ, занято) при звонках. (На данный момент эта опция является экспериментальной и может работать некорректно). Следующие 3 строки актуальны, если телефон, подключенный к данной линии, может нормально работать с flash (извещение о входящем вызове, конференц-связь, АОН должны поддерживаться и быть активизированы на АТС). Последние два параметра разрешают парковку и передачу звонков с ТФОП. Заметим, что приведенные выше настройки актуальны для более-менее современных АТС (электронные, цифровые). Для их престарелых собратьев (координатных, шаговых, декадно-шаговых) вышеперечисленные параметры, скорее всего, придется установить в «no». Кроме того, для активизации импульсного набора нужно будет добавить следующую строчку: pulsedial=yes
В независимости от АТС нам, скорее всего, понадобится включить подавление «эха» для zaptel-каналов. Для этого добавим следующие две строчки: echocancel=yes echocancelwhenbridging=yes
Если же с помощью этих настроек полностью избавиться от эха не удается, можно дополнительно задействовать следующие: echotraining=yes txgain=0.0 rxgain=0.0
Первой строкой мы включаем режим тренировки эхоподавления (полезно, если «эхо» регулярно слышно в начале разговора), а последними двумя задаем усиление для входного и выходного сигналов. Для определения конкретных значений последних можно воспользоваться утилитой ztmonitor, входящей в модуль zaptel. Перейдем к настройке номерного плана. В качестве префикса для выхода в город будем использовать цифру «5». В уже знакомый нам контекст [office] добавим следующую строку: exten=> _ 5.,1,Dial(ZAP/g1/EXTEN:1,20,rT)
Этим мы указали Asterisk, что если все номера, начинающиеся с цифры 6, должны передаваться на группу каналов 1 zaptel-интерфейса. Первая цифра набранного номера будет отбрасываться сервером Asterisk. Необходимо заметить, что способ маршрутизации звонков с использованием префиксов не является единственным. Так ничто не мешает использовать нам следующую конструкцию: [pstn-dialout] exten => s,1,Wait, 1 exten => s,2, Answer exten => s,3, BackGround(pstn-announce)
36
exten => s,4, Read(ext) exten => s,5, Dial(ZAP/g1/${ext:1},20,rT) [ofÞce] exten => 101,1,Goto(pstn-dialout,s,1)
Таким образом, при наборе номера 101 Asterisk перейдет в контекст pstn-dialout, зачитает приветствие pstn-announce (которое необходимо предварительно записать), после чего совершит звонок в город по введенному нами номеру. Подобную схему можно с успехом использовать и для других технологий (H323, SIP).
Выход через SIP-шлюз К сожалению, далеко не всегда имеется возможность использования оборудования Digium. Например, в ввиду физических ограничений иногда бывает несколько затруднительно установить PCI-платы в стандартные стоечные серверы (1U, 2U). Кроме того, рынок оборудования IP-телефонии в России все еще находится в состоянии, близком к зачаточному, и найти в продаже платы Digium по разумным ценам может быть несколько проблематичным. Для решения этих проблем рассмотрим альтернативный вариант сопряжения Asterisk с городской сетью – c помощью «внешних» голосовых шлюзов. Теоретически совместно с Asterisk можно использовать любые из шлюзов, поддерживающих протоколы SIP/H323/SCCP, однако, по моему мнению, на практике совместно с Asterisk лучше использовать шлюзы c протоколом SIP. Наиболее известными производителями таких устройств (совместимых с Asterisk) являются – Cisco, Mediatrix, Quintum, AddPac, VegaStream и D-Link. В качестве примера рассмотрим сопряжение Asterisk с городской сетью с использованием шлюза AddPac AP200D. Данный шлюз представляет собой отдельное устройство, имеющее 2 порта FXO (рис. 3).
Рисунок 3. Шлюз IP-телефонии AddPac AP200D (2FXO)
Устройство поддерживает все наиболее популярные способы конфигурации (console, telnet, web, EMS), а его командный интерфейс очень сильно похож на интерфейс устройств Cisco (таким образом, с некоторыми поправками приведенное ниже применимо и к голосовому оборудованию Cisco). Для базовой конфигурации устройства необходимо определить сетевые и голосовые параметры. И если с первыми все достаточно просто (нужно всего лишь определить стандартные настройки – IP-адрес, маску подсети и маршрут по умолчанию), то со вторыми могут возникнуть затруднения. Остановимся на них более подробно. При описании голосовых параметров ключевым является понятие dial-peer – точка, участвующая в голосовом соединении. Существует два типа dial-peer (см. рис. 4): ! POTSdial-peer – описывает параметры соединения с традиционной телефонной сетью. POTS dial-peer «привязываются» к аппаратным портам (FXO, FXS) шлюза. ! VOIPdial-peer – описывает параметры соединения с VoIPсетью. Для простоты понимания VOIP dial-peer можно ассоциировать с Ethernet-разъемом шлюза.
администрирование Полезные советы Запись звуков При создании голосовых меню часто возникает необходимость использования собственных файлов озвучки. Звуковые файлы, используемые в Asterisk, хранятся в формате gsm. Наиболее просто и быстро записать такие файлы можно с помощью самого Asterisk. Для этого в номерном плане можно создать специальный контекст со следующим содержанием: [gsm-record] exten => 150,1,Wait(2) exten => 150,2,Record(testrecord:gsm) exten => 150,3,Wait(2) exten => 150,4,Hangup exten => 151,1,Playback(testrecord2) exten => 151,2,Wait(2) exten => 151,3,Hangup
Позвонив на номер 150, мы сможем наговорить необходимый текст, который будет сохранен в стандартной папке звуков Asterisk (/var/lib/asterisk/sound) в файле ivrrecording. gsm. Прослушать содержимое этого файла можно, позвонив по номеру 151. Помимо записи с помощью Asterisk можно использовать специальные утилиты конвертации форматов, например sox [12]: # sox inputÞle.wav -r 8000 -c 1 outputÞle.gsm resample -ql
Перезагрузка конфигурации Как вы могли заметить, после редактирования конфигурационных файлов мы всегда перезапускали сервер. Действительно для некоторых модулей (например, zaptel и oh323) такая операция обязательна. Однако при незначительных изменениях (добавление нового устройства, изменение номерного плана и т. д.) полного перезапуска сервера можно Для минимальной настройки нам понадобится сконфигурировать два dial-peer (по одному каждого типа), а также определить правила маршрутизации между ними внутри нашего шлюза. POTS dial-peer «привяжем» к FXO-линии, а VOIP dial-peer «настроим» на Asterisk. Звонок из ТФОП на наш сервер будут делаться с помощью донабора внутреннего номера. При наборе городских номеров из Asterisk будем добавлять префикс «9» перед исходным номером. Для конфигурирования воспользуемся telnet-интерфейсом шлюза. Для этого подключимся к устройству и перейдем в интерфейс конфигурирования с помощью команды conf: AP200# conf Enter configuration commands, one per line. End with CNTL/Z AP200(config)#
избежать. Для этого в консоли asterisk достаточно выполнить следующую команду: *CLI > reload
Ежедневная перезагрузка Некоторые пользователи [13] отмечали проблемы с утечками памяти при очень интенсивном использовании Asterisk. Эта проблема в той или иной степени присуща всем продуктам и вызвана ошибками в исходном коде. Безусловно, самым правильным способом ее решения является исправление исходного кода. Однако в качестве временной меры (до тех пор пока ошибки в коде не будут исправлены разработчиками) можно предложить регулярно (для профилактики) перезапускать сервер с Asterisk в свободное время, например, ночью. Для этого можно добавить в файл /etc/ crontab строку следующего содержания: 0 0 * * *
root
/etc/init/asterisk restart> /dev/nu
Восстановление после сбоев Не исключено, что во время работы процесс Asterisk «совершит недопустимую операцию и будет закрыт». (И хотя такая ситуация для STABLE-версии является из ряда вон выходящей, не учитывать ее появление для «боевой» системы все же нельзя.) Как это отразится на пользователях? Думаю, что не нужно быть пророком, чтобы понимать, что в этом случае связи не будет. Возможным решением этой проблемы может быть сокращение общего времени простоя сервиса путем его быстрого перезапуска. Для Asterisk эта возможность является практически стандартной – достаточно просто для запуска использовать файл asterisk_ safe (вместо asterisk). Теперь при «авариях» сервис будет перезапускаться автоматически. В принципе аналогичного результата можно добиться и с помощью простого shellскрипта, выполняемого по cron. Определим для него следующие параметры: dial-peer voice 0 pots destination-pattern 9T port 0/0 user-name 100 user-password potsfxopwd1
Только что мы сказали, что все звонки, приходящие на шлюз и начинающиеся с номера «9», должны уходить на первый порт FXO, ассоциированный с dial-peer 0. При звонках из ТФОП на указанный FXO-порт шлюз будет аутентифицироваться на Asterisk с использованием указанных имени пользователя и пароля. Правда, для этого устройству предварительно необходимо указать, где именно находится Asterisk, которому будут передаваться звонки из ТФОП. Опишем VOIP dial-peer: AP200(conÞg)# dial-peer voice 1000 voip
Создадим POTS-dial-peer с номером 0 (для второго порта нужно произвести аналогичные действия): AP200(conÞg)# dial-peer voice 0 pots AP200(config-dialpeer-pots-0)#
№7, июль 2005
AP200(config-dialpeer-voip-1000)#
Определим следующие параметры: dial-peer voice 1000 voip
37
администрирование destination-pattern T session target sip-server session protocol sip dtmf-relay rtp-2833 no vad
Перейдем в контекст определения настроек sip useragent: AP200(conÞg)# sip-ua AP200(config-sip-ua)#
Зададим следующие параметры: sip-ua user-register sip-server 192.168.0.20 register e164
Этим мы сказали шлюзу, что SIP-сервер находится по адресу 192.168.0.20. и при регистрации на нем необходимо использовать e164-номер (международный стандарт, определяющий правила нумерации абонентов в телефонных сетях) и пароль, указанными для POTS dial-peer. Теперь разберемся со «служебным» префиксом «9». Очевидно, что передавать его в ТФОП нельзя, поэтому его необходимо отбрасывать. Делать это можно как на Asterisk (см. выше примеры для межгорода и плат Digium), так и непосредственно на шлюзе. Воспользуемся вторым способом. Для этого создадим translation-rule и применим его к POTS dial-peer: AP200(conÞg)# translation-rule 0 AP200(conÞg-translation-rule#0)# rule 0 9T T AP200(conÞg-translation-rule#0)# exit AP200(conÞg)# dial-peer voice 0 AP200(conÞg-dialpeer-pots-0)# translate-outgoing ↵ called-number 0
Теперь при наборе номера через первый голосовой порт FXO префикс «9» будет отбрасываться.
secret= potsfxopwd1 dtmfmode=rfc2833 context=generic-inc
Звонки из ТФОП будем направлять в наш стандартный контекст для входящих звонков – generic_inc. Для исходящих звонков добавим в контекст [office] следующую строчку: exten => _ 9,Dial(SIP/EXTEN@100,20,rT)
Перезапустим Asterisk.Через некоторое время шлюз зарегистрируется на сервере, о чем можно будет узнать, выполнив на нем следующую команду: AP200# show sip Proxyserver Registration Information proxyserver registration option = e164 Proxyserver list : --------------------------------------------------------------Server address Port Priority Status --------------------------------------------------------------192.168.0.20 5060 128 Registered(E.164) Proxyserver registration status : -----------------------------------------------UserName Regist Status -----------------------------------------------100 yes Registered
Теперь мы можем звонить не только нашим соседям по офису, но и любым абонентам городской телефонной сети!
Заключение Оглядываясь на проделанное, можно смело сказать – теперь у нас есть полноценная (по функциональности) миниАТС. Изучение Asterisk на этом не заканчивается! В следующий раз мы более подробно остановимся на способах облегчения управления сервером, рассмотрев установку различных веб-интерфейсов. До встречи!
Литература и ссылки:
Рисунок 4. POTS и VOIP dial-peer
Итак, с настройками шлюза мы закончили. Применим конфигурацию и перейдем к настройке Asterisk: AP200(conÞg)# write Do you want to WRITE configuration ? [y|n] y Writing configuration....done AP200(config)# reboot System Reboot...
Для того чтобы использовать шлюз из Asterisk, нам понадобится создать для него учетную запись SIP, а также внести необходимые изменения в номерной план. Добавим в файл /etc/asterisk/sip.conf следующие строки: [100] ;AP200 type=friend host=dynamic username=100
38
1. Платов М.В. Asterisk и Linux: миссия IP-телефония. – Журнал «Системный администратор», №6, 2005 г. – 12-19 c. 2. http://www.inaccessnetworks.com/projects/asteriskoh323. 3. Платов М. Что важно знать об IP-телефонии. – Журнал «Системный администратор», №5, 2005 г. – 20-25 c. 4. http://obj-sys.com/open/index.shtml. 5. http://www.inaccessnetworks.com/ian/projects/asteriskoh323/Libraries/pwlib-Janus_patch4-src-tar.gz. 6. ftp://ftp.gtlib.cc.gatech.edu/pub/gentoo/distfiles/openh323v1_13_5-src.tar.gz. 7. http://www.inaccessnetworks.com/projects/asterisk-oh323/ download/asterisk-oh323-0.6.6.tar.gz. 8. http://www.voipsupply.com/index.php?cPath=99. 9. http:/www.digium.com. 10. http://www.goods2world.com. 11. http://www.iaxtalk.com. 13. http://sox.sourceforge.net. 14. http://www.voip-info.org/tiki-index.php?page=Asterisk+adm inistration.
администрирование
Free reeBSD BSD TIPS: РАБОТАЕМ С TFTP Для некоторых задач обмена файлами по сети многие возможности протокола FTP оказываются избыточными. Чтобы не тратить ресурсы на их поддержку, был разработан протокол TFTP.
СЕРГЕЙ СУПРУНОВ
П
ротокол TFTP (Trivial File Transfer Protocol – тривиальный протокол передачи файлов) благодаря своей предельной простоте довольно часто используется в различном оборудовании (маршрутизаторах, коммутаторах, модулях DSLAM и т. п.). Его удобно применять для обмена файлами внутри локальной сети, при необходимости он легко может быть интегрирован в разрабатываемую программу. В последнее время все большую популярность приобретают бездисковые рабочие станции, первоначальная загрузка которых выполняется по сети также с использованием протокола TFTP. В данной статье мы рассмотрим реализацию TFTP в системе FreeBSD.
Протокол TFTP (a.k.a. RFC1350) Сначала коротко рассмотрим сам протокол, как он определен в документе RFC1350. Поскольку главное требование к протоколу – простота, то в нем поддерживается лишь необходимый минимум функций: возможность чтения файла с удаленного хоста и записи файла на хост. Протоколом не предусматривается ни аутентификация/авторизация пользователя, ни навигация по каталогам, ни даже просмотр содержимого каталога. Нет в TFTP и отдельной процедуры соединения, как это происходит в случае с FTP – соединение устанавливается
№7, июль 2005
по запросу на чтение или запись, после завершения операции оно разрывается. С этой точки зрения TFTP больше похож на HTTP, также работающий без поддержания постоянного соединения. В качестве стандартного порта для протокола TFTP определен порт 69. Основным транспортным протоколом для TFTP является UDP, однако работа поверх TCP также возможна. Чтобы прочитать файл, на этот порт посылается запрос на чтение, содержащий код операции (opcode, равный 1 (RRQ)), имя запрашиваемого файла и режим передачи, который может быть «netascii» или «octet». Стандартом также определен режим «mail», предназначенный для передачи сообщений электронной почты, но он считается устаревшим и не рекомендуется к применению. Эти значения соответствуют тому, что обычно именуется «текстовым» и «двоичным» режимами: в режиме netascii предусматривается обработка управляющих символов (например, перевода строки) в соответствии со стандартами, принятыми на той или иной платформе; в режиме octet данные должны быть переданы в «сыром» виде, без какой-либо обработки. В ответ на запрос, если нужный файл существует и доступен для чтения, сервер отсылает первую порцию данных, содержащую opcode 3 «DATA», номер блока (1) и собственно данные. Данные передаются блоками по 512 байт,
39
администрирование после отправки каждого из них сервер должен дождаться подтверждения от клиента (opcode 4, ACK). Если подтверждение не будет получено, то через определенный период времени сервер должен повторить отправку последнего блока. Если подтверждение так и не придет в течение тайм-аута, заданного для сеанса связи, то соединение разрывается. Вообще нужно иметь в виду, что тайм-ауты играют очень важную роль в TFTP-соединении. Блок данных менее 512 байт рассматривается как последний, и соединение после его получения разрывается. Если размер файла кратен 512 и последний блок имеет размер также 512 байт, то должен быть отправлен еще один блок нулевой длины. Запись файла выполняется аналогично, с той разницей, что в ответ на запрос о записи (opcode 2, WRQ) сервер отсылает подтверждение с номером блока 0. Для оповещения удаленной стороны о возникновении ошибки используются специальные пакеты с opcode = 5 (ERROR). Как видите, протокол отводит два байта для указания номера отсылаемого блока, что накладывает ограничение на размер передаваемого файла в 32 Мб. Существуют документы RFC 1782 – 1785, расширяющие возможности TFTP. В частности, RFC1783 определяет дополнительный параметр blksize, позволяющий задать размер блока, отличный от 512 байт. Помимо увеличения максимального размера файла данная возможность также способствует увеличению скорости передачи в средах с большим значением MTU.
Клиент tftp Система FreeBSD включает в себя как TFTP-сервер (tftpd), так и утилиту tftp, выполняющую функции клиента. Программа tftp представляет собой интерактивную оболочку для работы с TFTP-серверами (в отличие от одноименной утилиты в Windows, которая требует в качестве параметра сразу указывать и выполняемую операцию). По команде «?» можно получить список и краткое описание всех доступных команд (в приведенном листинге вместо оригинальных описаний команд стоят мои комментарии): serg$ tftp tftp> ? Команды могут сокращаться, пока сохраняется уникальность. connect mode put get quit verbose trace status binary ascii rexmt timeout ?
указать сервер, с которым будет устанавливаться соединение установить режим передачи (ascii|netascii|binary|image|octet) отправить файл на сервер получить файл с сервера выйти из tftp вкл./откл. подробные сообщения вкл./откл. трассировку пакетов в ходе обмена с сервером показать текущие настройки включить режим обмена octet включить режим обмена netascii установить таймаут, используемый для каждого пакета установить общий таймаут сеанса вывести на экран эту справку
Установка соединения и обмен данными обеспечивается командами put и get, все остальные служат для настройки поведения клиента: tftp> trace Packet tracing on. tftp> verbose
40
Verbose mode on. tftp> conn localhost tftp> status Connected to localhost. Mode: netascii Verbose: on Tracing: on Rexmt-interval: 5 seconds, Max-timeout: 25 seconds tftp> get config getting from localhost:config to config [netascii] sent RRQ <file=config, mode=netascii> sent RRQ <file=config, mode=netascii> sent RRQ <file=config, mode=netascii> sent RRQ <file=config, mode=netascii> sent RRQ <file=config, mode=netascii> Transfer timed out.
На приведенном выше листинге показана попытка считать файл при неработающем сервере. Как видите, клиент не обнаруживает наличие проблемы и через каждые 5 секунд (параметр Rexmt-interval) повторяет попытки установить соединение, передавая запрос RRQ и ожидая первый блок данных. Спустя 25 секунд (Max-timeout) эти попытки прекращаются. Обратите внимание, что приглашение вы получите в любом случае, независимо от того, запущен ли на указанном узле TFTP-сервер или нет. Как было описано выше, попытка установить соединение выполняется только при отправке запроса на чтение или запись. До этого момента клиент ничего не знает о наличии сервера на удаленной машине. Пример успешной записи файла на сервер выглядит так (включена трассировка): tftp> verbose Verbose mode on. tftp> trace Packet tracing on. tftp> put messages putting messages to test.ru:messages [netascii] sent WRQ <file=messages, mode=netascii> received ACK <block=0> sent DATA <block=1, 512 bytes> received ACK <block=1> sent DATA <block=2, 512 bytes> received ACK <block=2> sent DATA <block=3, 512 bytes> received ACK <block=3> sent DATA <block=4, 512 bytes> received ACK <block=4> sent DATA <block=5, 512 bytes> received ACK <block=5> sent DATA <block=6, 512 bytes> received ACK <block=6> sent DATA <block=7, 512 bytes> received ACK <block=7> sent DATA <block=8, 512 bytes> received ACK <block=8> sent DATA <block=9, 120 bytes> received ACK <block=9> Sent 4216 bytes in 0.1 seconds [337280 bits/sec]
Клиент tftp не поддерживает согласование размера блока по RFC1783, поэтому размер передаваемого файла ограничивается значением 32 Мб. На трассировке это выглядит следующим образом: .. .. .. .. sent DATA <block=65534, 512 bytes> received ACK <block=65534> sent DATA <block=65535, 512 bytes> received ACK <block=65535> sent WRQ <file=messages, mode=netascii> sent WRQ <file=messages, mode=netascii> received ACK <block=65535> sent WRQ <file=messages, mode=netascii> received ACK <block=65535>
администрирование sent WRQ received sent WRQ received Transfer
<file=messages, mode=netascii> ACK <block=65535> <file=messages, mode=netascii> ACK <block=65535> timed out.
То есть клиент (рассматривается отправка файла), отослав блок номер 65535, не может отослать следующий изза переполнения счетчика и повторно отправляет запрос на запись WRQ. Сервер же ожидает следующий блок, повторяя периодически подтверждение блока 65535. По истечении тайм-аута соединение разрывается. При этом передаваемый файл сохраняется на сервере частично (он вроде бы и есть, но попытка его использовать приведет к ошибке). Таким образом, не следует использовать TFTP для обмена большими файлами.
Сервер tftpd Несмотря на букву «d» в конце имени, tftpd не является демоном, его запуск выполняется супердемоном inetd при появлении запроса на порту 69. По умолчанию соответствующая строка в /etc/inetd.conf закомментирована, и для активизации сервера комментарий нужно удалить и перезапустить процесс inetd. Все настройки поведения сервера выполняются с помощью ключей командной строки путем редактирования файла /etc/inetd.conf. Наиболее часто используются следующие опции: ! -s <каталог>: после запуска tftpd установит указанный каталог как корневой, используя функцию chroot. Если не указан пользователь (см. опцию –u), то процесс получает права nobody. ! -c: позволяет привязывать корневой каталог сервера к IP-адресу удаленного хоста. Используется совместно с опцией –s, указывающей базовый каталог. Например, если базовый каталог определен как /var/tftp, то при получении запроса с адреса 1.2.3.4 корневым каталогом будет являться /var/tftp/1.2.3.4. Если данный каталог отсутствует, соединение разрывается. ! -C: аналогична ключу -c, но при отсутствии каталога, соответствующего адресу клиента, корневым каталогом становится базовый. ! -l: включает режим протоколирования работы, используя syslog (сообщения сохраняются как LOG_FTP). ! -u <пользователь>: указывается имя непривилегированного пользователя, с правами которого будет работать сервер после переключения в chroot. Пользователь должен быть задан по имени, использование UID недопустимо. ! -w: разрешает создавать несуществующие файлы по запросу на запись. По умолчанию запись файла разрешена только в том случае, если он существует и доступен для записи пользователю, от имени которого работает процесс tftpd. Особое внимание следует уделить вопросу безопасности. Поскольку сам сервер tftpd не выполняет никаких проверок авторизации, то доступ к нему необходимо ограничивать. Наиболее часто для этого используют брандмауэры, пропуская пакеты на 69-й порт только с разрешенных узлов. Также может быть удобен файл /etc/hosts.allow, ко-
№7, июль 2005
торым руководствуется inetd, решая, запускать ли соответствующий процесс при попытке установить соединение на том или ином порту или нет. Если нужно позволить клиентам запись любых файлов, то рекомендуется использовать опцию -w совместно с -c, чтобы такая запись была разрешена только с указанных известных адресов. Однако не забывайте о возможности подмены IP-адреса отправителя, что открывает возможность для атаки типа «Отказ в обслуживании» путем переполнения соответствующей файловой системы. Также рекомендуется с файлов, которые предназначены только для считывания, снимать права на запись. Если файл требуется записывать на сервер, но он не предназначен для чтения другими пользователями, можно поставить на него права 222 (-w--w--w-). При включенной опции –w это можно автоматизировать с помощью ключа «-U mask», который определяет маску для создаваемых (самим процессом tftpd по запросу на запись) файлов. Для описанного выше примера следует указать «-U 555» – в этом случае каждый созданный по запросу клиента файл получит разрешение только на запись и не сможет быть никем прочитан (кроме администратора сервера, разумеется).
Обмен файлами с маршрутизатором CISCO В качестве примера рассмотрим применение TFTP для сохранения на сервер конфигурации с CISCO (например, для более удобного редактирования или как резервную копию) и последующую загрузку на CISCO с сервера. Итак, предполагая, что обмен с CISCO выполняется по изолированной сети 10.100.100.0/24, а интересующие нас устройства имеют адреса 10.100.100.1 и 10.100.100.2, запуск tftpd удобно выполнять со следующими ключами: tftpd -clw -s /var/tftp/cisco -u tftp
Создаем каталог /var/tftp/cisco, и в нем две директории 10.100.100.1 и 10.100.100.2, владельцем которых делаем пользователя tftp (создать его придется вручную). Разрешаем прохождение соединений на порт 69 с указанных адресов через все запущенные в системе пакетные фильтры. Теперь после перезапуска inetd (или перезагрузки сервера) tftpd готов к работе. На CISCO копирование на сервер выполняется командой copy: Host>ena Password: Host #copy running-config tftp: Address or name of remote host []? 10.100.100.254 Destination filename [host-confg]? config !!!!!! 20693 bytes copied in 1.044 secs (19821 bytes/sec)
Аналогично можно загружать конфигурацию с сервера на CISCO, поменяв местами аргументы команды copy.
Заключительное слово Надеюсь, эта статья поможет вам эффективно использовать протокол TFTP в своей работе. Главное – не забывайте о безопасности, которую приходится обеспечивать внешними по отношению к TFTP средствами.
41
администрирование
УСТАНАВЛИВАЕМ СВЯЗКУ POSTFIX + EXCHANGE
Перед нами нетривиальная задача. Требуется организовать внутрикорпоративный документооборот на базе MS Exchange, оставив пользователям возможность общаться по электронной почте с внешним миром. И при этом не уменьшить уровень внутренней безопасности. Предлагаем вам быстрое и эффективное решение данной задачи.
ВЛАДИМИР АГАПОВ
И
так, вы – системный администратор. Большой конторы или маленькой, принципиального значения не имеет. Равно как и то, настроена ли у вас почтовая система или это только предстоит сделать в ближайшее время. Главное другое: однажды вас вызывает к се-
42
бе начальник и говорит: «хочу». Хочу, чтобы у нас все было как у людей: и книга адресная единая, корпоративная, и планировщик задач, и календарь событий на месяцы и годы, ну, в общем, все, что только он где-то слышал или, не дай бог, видел. Озадаченные этим вопросом, вы возвра-
администрирование щаетесь к себе, попутно думая, а что же проще: настроить The Bat на работу с LDAP и найти какие-нибудь утилиты, позволяющие получить данный функционал, или снести The Bat со всех машин, и поставить туда Outlook, закрыв глаза на резко упавшую в этом случае безопасность? Подумав с полчасика, приходим к выводу: придется ставить Outlook, и не только его, что было бы только половиной беды, но и Exchange в качестве почтового сервера. Поскольку начальнику может прийти в голову и еще что-нибудь неприличное, типа внутрикорпоративного документооборота. Вместо MS Exchange можно, конечно, использовать и OpenXchange, Hula, Opengroupware и пр. Но мы остановимся на первом варианте. Скорее всего, у вас совершенно нет желания вывешивать наружу машину с установленной на ней ОС Windows и Exchange в придачу. Значит, придется разделить функции внешнего и внутреннего почтовых серверов. На внутреннем пусть себе крутится Exchange, а на внешнем поставим UNIX-подобную операционную систему и, например, Postfix в качестве почтового сервера. Вот из этих предпосылок и будем исходить. Поставить и запустить эти два сервера – задача сама по себе для новичка нетривиальная, но такой вариант нас не устраивает, в нашем случае необходимо, чтобы эти сервера взаимодействовали между собой и прозрачно пропускали почту в мир и обратно. В результате всех размышлений получается примерно следующий список задач: 1. Установка на все рабочие машины Microsoft Office Outlook в качестве почтового клиента. 2. Установка на первый сервер (exchange) ОС Windows и Microsoft Exchange (в данном документе будет подразумеваться версия 2003). 3. Установка на второй сервер (gate) ОС из семейства UNIX и Postfix (FreeBSD 5.3 и postfix 2.2 соответственно). 4. Настройка Exchange для работы с Postfix 5. Настройка Postfix для работы с Exchange 6. Дополнительное конфигурирование для поддержки alias и прочего. Пункты с 1-го по 3-й выходят за рамки обсуждения данной статьи, поэтому детально описывать их я не буду, а более подробно остановлюсь на пунктах 4, 5 и 6. Одно из решений задачи уже было предложено в журнале [1]. Мы же в отличие от него будем использовать вариант проверки Postfix наличия почтового аккаунта в Windows-домене перед приемом почты.
Настраиваем Exchange для работы совместно с Postfix Для начала определимся, что именно мы хотим получить от Exchange в данной конфигурации: ! Он должен получать почту, которую будет перенаправлять ему Postfix и доставлять ее в соответствующие почтовые ящики пользователей. ! Почта пользователей, отправляемая за пределы домена, должна попадать в Exchange и пересылаться им для дальнейшей обработки на внутренний интерфейс gate для дальнейшей отсылки ее в мир уже Postfix.
№7, июль 2005
! В связи с тем, что название Windows-домена в AD часто не совпадает с почтовым доменом, необходимо включить маскарадинг. ! Во избежание локальных эпидемий внутреннюю почту также необходимо проверять на вирусы.
Приступим к настройке Exchange Запускаем Exchange System Manager: ! Разворачиваем «Administrative Group → company → Servers → Exchange → protocols SMTP». Открываем свойства default. На закладке «Access» выбираем «Relay Restrictions» и записываем туда IP-адрес нашего Postfix-сервера. В некоторых случаях может потребоваться указать подсети целиком. Например, в случае использования приложений, напрямую общающихся с SMTP-сервером. ! Там же, на закладке «Delivery», выбираем «Advanced» и указываем в поле «Smart Host» IP-адрес Postfix-сервера в квадратных скобках. ! Здесь же, в поле «masquerade domain», указываем наш почтовый домен, для того чтобы Exchange отправлял всю почту от имени этого домена. ! Выбор антивирусного сканера под Exchange я оставляю за вами, поскольку почти все крупные производители антивирусных продуктов имеют в своих линейках такие решения. Этих настроек на данный момент достаточно. Более детальную настройку и конфигурирование оставляю на ваше усмотрение.
Настраиваем Postfix для работы с Exchange Определимся, что мы ожидаем от Postfix. ! Принимать почту, пересылаемую ему Exchange и отправлять ее дальше в мир. ! Проверять всю входящую и исходящую почту на вирусы. ! Проверять всю входящую почту на наличие спама и выставлять ей соответствующие балы. ! Для экономии трафика необходимо проверять, есть ли получатель входящего письма в нашем домене, и в зависимости от результата либо принимать, либо отвергать письмо. ! Пересылать все прошедшие проверку входящие письма на Exchange. Прежде всего нам потребуется установить Postfix. Об этом достаточно много имеется информации в Интернете, поэтому остановлюсь лишь на главных моментах. У нас есть два варианта установки: ! просто пересылать всю входящую почту внутрь сети, не задумываясь, есть ли такой почтовый пользователь; ! предварительно проверять наличие пользователя в AD и в случае его отсутствия не принимать почтовое сообщение. По первому варианту вы можете посмотреть уже упоминавшуюся здесь статью [1]. Однако я предпочел остано-
43
администрирование виться на втором варианте. Это позволит нам существенно сэкономить трафик и поможет уменьшить количество приходящего спама. Для начала установим LDAP-client. # cd /usr/ports/net/openldap22-client/ # make install clean
Далее устанавливаем Postfix с поддержкой LDAP. Если вы собираете его из портов, отметьте соответствующий пункт, в другом случае вам потребуется указать это явно: # gmake tidy # gmake makeÞles CCARGS="-I/usr/local/include -DHAS _ LDAP" ↵ AUXLIBS="-L/usr/local/lib -R/usr/local/lib -lldap ↵ -L/usr/local/lib -R/usr/local/lib -llber" # gmake install
! Чтобы Postfix после всех проверок отправлял письмо Exchange, добавим в main.conf:
virtual _ transport = hash:/etc/postÞx/virtual _ transport transport _ maps = hash:/etc/postÞx/virtual _ transport
и создадим файл /etc/postfix/virtual_transport: company.ru
smtp:[192.168.16.5]
где 192.168.16.5 – IP-адрес Exchange-сервера, а company.ru – домен, всю приходящую для которого почту следует пересылать на другой сервер. Не забываем после создания или редактирования этого файла делать: postmap /etc/postÞx/virtual _ transport
Приступаем к конфигурированию Postfix
Дополнительное конфигурирование
Для начала установите все минимально необходимые значения. Что именно, можно узнать в документации на Postfix и в Интернете. ! Добавим в значение переменной «mynetworks» IP-адрес Exchange-сервера (например, 192.168.1.2/32). ! В качестве антивирусного сканера я использую ClamAV. Как его подключить к Postfix, можно прочитать в статье [2]. ! Как подключить SpamAssassin, можно прочитать там же. ! Для проверки наличия учетной записи будем использовать LDAP-запросы к AD. Именно для этого мы и собирали Postfix с поддержкой LDAP. Внесем следующие записи в main.conf:
Для полноценной работы нам, возможно, потребуется еще несколько штрихов, а именно: ! Создать группы рассылок на Exchange. Для этого необходимо сделать следующее: ! Создать группу распределения. ! Создать почтовый аккаунт для этой группы. ! Добавить в эту группу всех, кто должен быть подписан на эту рассылку. ! Разобраться, как можно сделать алиасы в Exchange. Для этого можно использовать два варианта: ! Создать в Active Directory дополнительные SMTP-записи для каждого пользователя, которому необходимо прописать alias. Этот вариант проще и предпочтительнее. ! Там же можно создать запись типа CC для тех же целей.
# имя Windows-домена ldapmap _ search _ base = dc=ofÞce, dc=company, dc=ru # IP-адрес PDC ldapmap _ server _ host = 192.168.16.1 # LDAP-порт ldapmap _ server _ port = 3268 ldap _ timeout = 60 ldapmap _ query _ Þlter = (&(proxyAddresses=smtp:%s) ↵ (|(objectClass=user)(objectClass=group) ↵ (objectClass=contact))) ldapmap _ result _ Þlter = %s ldapmap _ result _ attribute = canonicalName ldapmap _ special _ result _ attribute = ldapmap _ scope = sub ldapmap _ bind = yes ldapmap _ bind _ dn = ldapquery@ofÞce.company.ru ldapmap _ bind _ pw = LdaPassworD ldapmap _ cache = no ldapmap _ dereference = 0 ldapmap _ domain = ofÞce.company.ru ldapmap _ debuglevel = 0 virtual _ mailbox _ maps = ldap:ldapmap virtual _ mailbox _ domains = company.ru
Для того чтобы у Postfix были права на выборку информации о пользователях домена, заведем в домене нового пользователя ldapquery с паролем LdaPassworD. В результате данной процедуры Postfix будет опрашивать домен на наличие пользователя с заведенным почтовым ящиком типа user@company.ru. В случае положительного ответа письмо будет приниматься для дальнейшей доставки, в случае отрицательного – отвергаться с кодом, указанным в переменной unknown_local_recipient_reject_code.
44
На этом можно считать минимально необходимую настройку для работы данной связки законченной. Все возможные ошибки и проблемы всегда возможно отследить в логах postfix, где все достаточно информативно пишется. Так же для обсуждения этой статьи и всех дополнительных вопросов существует специально созданный топик на форуме [3]. Данный вариант является рабочим, проверен на офисе компании. Но у него есть как минимум один недостаток – он потенциально не защищен от атак типа DoS на AD, в случае большого количества одновременных внешних SMTP-сессий. Чтобы этого избежать, можно либо настроить в Postfix ограничения на количество одновременных сессий, либо скриптом по cron забирать информацию из AD и складывать ее на машине с Postfix. Но это тема уже совсем другой статьи.
Литература, ссылки: 1. Полянский И. Postfix как шлюз для Exchange. – Журнал «Системный администратор», №5, 2004 г. – 34-37 с. 2. Почтовая система на базе Postfix, PostgreSQL, с фильтрацией вирусов и спама на FreeBSD 5.3 – www.deepnet.ru, раздел «Статьи». 3. http://forum.deepnet.ru.
администрирование
АВТОМАТИЗАЦИЯ MS WINDOWS, ИЛИ AUTOIT КАК МЕЧТА ЭНИКЕЙЩИКА ЧАСТЬ 4 Итак, когда диск для автоматической Итак, установки уже у вас в руках, надо правильно его использовать. А после установки рабочей станции еще и получить отчет. Обо всем этом в последней, заключительной части статьи об AutoIt.
Полная виртуализация работы
АЛЕКСЕЙ БАРАБАНОВ ! Перезагрузка и далее снова подключение к рабочему столу как localadmin.
Если у вас дома в телефоне нет гудка, позвоните в службу компьютерной поддержки. Мы можем это починить прямо из офиса.
! Рабочая станция включается в домен. ! Перезагрузка с последующим подключением к рабоче-
Наконец-то диск с автоматически устанавливаемым Windows готов. Самое главное, что пользоваться им должны не системные администраторы, а обычные рядовые сотрудники обслуживаемых компаний. Такой диск позволяет произвести установку новой станции или переустановку поврежденной станции без локального участия системного администратора. Сотрудник, оставшийся без рабочего места, должен лишь в общих чертах представлять процесс установки. Ему достаточно поместить диск, заранее созданный по указанной методе и оставленный для такого случая на предприятии, в лоток CD-Rom и произвести перезагрузку компьютера, не забыв нажать «any key», чтобы активировать загрузку с CD. Единственный раз, когда ему придется проявить самостоятельность, это выбор места, точнее, раздела, установки. Так как используется руссифицированная версия Windows, то все диалоги, определяющие выбор, переведены на русский язык и снабжены комментариями. У меня не было случая, чтобы кто-нибудь ошибся разделом. Это ведь так просто – нажать <Enter> и затем <L>. После чего самое главное для окружающих не трогать ни клавиатуру, ни мышку. Установка продолжается от 40 минут до полутора часов, в зависимости от мощности компьютера. В результате будет запущен сеанс Администратора с уже известным паролем. Вот в этот момент приходит черед для приложения рук реального сисадмина-аутсорсера. Обычно этому предшествует звонок с сообщением, что установка завершена. С точки администрирования через сеть (автор это делает по каналам openvpn или pptp) поднимается подключение к удаленному рабочему столу. И затем неторопливо производится завершение настройки рабочей станции. Например, так: ! Бюджетам Администратор и localadmin устанавливаются надежные пароли. ! Оба бюджета назначаются в список удаленного доступа. ! Рабочей станции меняется имя на реальное.
! Выбранный доменный пользователь прописывается на
46
му столу как localadmin.
рабочей станции как администратор и назначается в список удаленного доступа. ! Устанавливается принтер. ! Пользователь localadmin выходит из системы.
Все! Станция готова к работе. Можно перед выходом распечатать на локальном принтере приглашение для сотрудника приступить к работе. После этого обрадованный решением его проблем сотрудник прекращает курить и начинает работать. А «утомленный» сисадмин переходит к кофе-брейку, что никак не раздражает его работодателя, так как происходит за десятки или даже сотни километров от кабинета строгого руководителя. Шутка, конечно, но так или иначе все свои действия сисадмин может выполнять в весьма комфортных условиях. Скорее всего, с только что установленной станции надо будет снять информацию для отчета или дождаться, когда эта информация поступит в автоматизированную систему учета, так как именно для этого была предусмотрена установка snmp и настройка файрвола для доступа из локальной сети. Отчет можно оформить по вкусу, например, так, как приведено на снимке с экрана http://www.barabanov.ru/arts/autoit/draw7-8.png, после чего остается его распечатать и заполнить приватной информацией. Если одновременно устанавливается большое число станций, то возможность автоматически получить их характеристики сильно облегчает создание отчетности, что уже прямо связано с закрытием работ у заказчика. Но даже на изолированной рабочей станции можно получить ту же самую отчетность прямо в процессе установки. Например, используя утилиту cpu-z для детектирования оборудования с http://www.panopsys.com, «обернув» ее скриптом на AutoIt, или просто воспользоваться данными из реестра MS Windows, которые можно считать тем же самым AutoIt, и после форматирования записать в файл с отчетом. Вариант с cpu-z рассмотрим подробнее.
администрирование При написании этого скрипта опять немного усложним использованный инструментарий. Обратите внимание, в команду запуска добавим флаг @SW_HIDE, заставляющий спрятать окошко с запускаемым командным интерпретатором. Далее все по обычной схеме : запуск → анализ перехватчика → написание команд. Но в случае с этой программкой все оказывается не так просто. После выхода на закладку с кнопкой для генерации отчета в форме html оказывается, что нет способа сделать ее активной с помощью клавиатурных нажатий. Приходится воспользоваться эмуляцией мышиных кликов. Для этого, как показано на рис. 1, надо определить относительные координаты точки, в которой должно произойти нажатие мыши. Эта задача должна иметь решение, независимое от размера экрана и положения рабочего окна на нем. Для этого способ указания координат мыши переводим в относительный, отсчитываемый от верхнего левого угла активного окна режим, задавая параметр «MouseCoordMode», равный 0. Но координаты курсора, отражаемые в перехватчике, имеют абсолютное значение. Поэтому сначала определяем координаты точки, соответствующей верхнему левому краю окна, затем координаты нужной точки и только тогда переводим координаты второй точки в относительные. В нашем случае получается так: X=455-308=147, а Y=528-116=412. И именно 147 и 412 надо использовать в программе. Полный текст программы приведен далее:
Рисунок 1. Определяем координаты точки нажатия
Листинг 1. Программа получения состава оборудования AutoItSetOption ( "WinTitleMatchMode", 2 ) AutoItSetOption ( "WinDetectHiddenText", 1 ) AutoItSetOption ( "SendAttachMode", 1 ) ; open free desktop WinMinimizeAll ( ) Sleep ( ‘1000’ ) ; run test Run ( @ComSpec & " /c cpuz.exe", '' ,@SW _ HIDE ) If WinWaitActive ( 'CPU-Z','',10 ) == 0 Then Exit EndIf Send ( '{RIGHT}' ) Sleep ( '1000' ) Send ( '{LEFT 2}' ) Sleep ( '1000' ) Send ( '{RIGHT 5}' ) Sleep ( '1000' ) FileDelete ( @WindowsDir & '\' & @ComputerName & '.html') AutoItSetOption ( "MouseCoordMode", 0 ) MouseClick ( 'left', 147, 412, 1 ) If WinWaitActive ( 'Сохранить как','',10 ) == 0 Then ProcessClose ( 'cpuz.exe' ) Exit EndIf Send ( '{DEL}' ) Sleep ( '1000' ) Send ( @WindowsDir & '\' & @ComputerName & '.html') Sleep ( '1000' ) Send ( '{ENTER}' ) If WinWaitActive ( 'CPU-Z','',10 ) == 0 Then ProcessClose ( 'cpuz.exe' ) Exit EndIf Send ( '!{F4}' ) If WinWaitClose ( 'CPU-Z','',10 ) == 0 Then ProcessClose ( 'cpuz.exe' ) Exit EndIf If FileExists ( @WindowsDir & '\' & @ComputerName & ↵ '.html') == 1 Then ; run browser Run ( @ComSpec & " /c rundll32 url.dll, ↵ FileProtocolHandler " & @WindowsDir & ‘\’ ↵ & @ComputerName & '.html','',@SW _ HIDE ) EndIf Exit
№7, июль 2005
Рисунок 2. Отчет о завершении установки
Для работы этого скрипта нужно скачать с указанного сайта утилиту cpu-z и, для того чтобы эта утилита могла запускаться автоматически без указания точного пути до исполняемого файла, подложить ее в $OEM$/$$/System32. Скрипт, который будет производить запуск, поместить в $OEM$/$1/InstData в откомпилированном виде. Далее команду запуска запишем в общий командный файл : Листинг 2. Вызов программы получения состава оборудования /heap/Windows/uawsp2 # grep cpu-z ↵ \$OEM\$/\$1/InstData/GuiRunOnce.cmd %systemdrive%\InstData\get_cpu-z_info.exe
По завершении установки будет создаваться отчет по оборудованию в формате html и записываться автоматически в файл «Имя рабочей станции.html». Примерно так, как это показано на рис. 2. В заключение добавлю, что некоторые тексты, обсуждаемые в статье, но не удостоившиеся отдельной ссылки, можно найти в архиве по ссылке 1. Hикогда нас не благодарите. Мы любим это, и нам за это платят!
Ссылки: 1. Архив исходных текстов: http://www.barabanov.ru/arts/ autoit/src.tgz.
47
администрирование
АВТОМАТИЗИРУЕМ ПОДКЛЮЧЕНИЕ БАЗ 1С НОВОЙ ВЕРСИИ 8.0
ИВАН КОРОБКО Специалисты компании 1С значительно переработали систему безопасности в базах 1С новой версии 8.0 по сравнению с прошлой 1С 7.7. В связи с этим архитектура программы изменилась коренным образом. Как следствие стал иным и механизм подключения баз.
48
администрирование
М
ы уже знакомили вас с автоматическим управлением подключения баз 1С v.7.7 с помощью сценария регистрации пользователей в сети (см. [1]). Пользователям, которые входили в соответствующие группы безопасности, сценарий автоматически подключал необходимые сетевые базы и отключал те, к которым пользователь не имел прав доступа, при этом подключенные локальные базы сценарием не затрагивались. С появлением 1С v.8.0 ситуация изменилась: сценарий для подключения баз 1С v.7.7 не подходит для новой версии 1С, поскольку информация о подключаемых базах для версии 7.7 хранилась в системном реестре на рабочей станции, а для версии 8.0 – в файлах. Сегодня мы подробно рассмотрим механизм подключения баз 1С v.8.0, ее итогом будет сценарий, который в автоматическом режиме управляет подключением сетевых баз, записи, соответствующие в браузере локальным базам, будут перенесены в отдельную папку.
Выбираем язык программирования Для создания сценариев регистрации пользователей существует множество языков, однако остановим свой выбор на KIXTart. Этот язык является стандартным языком программирования сценариев компании Microsoft. Его дистрибутив можно найти в Microsoft Resource Kit или бесплатно загрузить последнюю версию из сети Интернет (http://kixtart.org). Подробное описание функционала языка можно найти на этом же сайте. Замечание: сценарии, созданные вами ранее на VBScript, Jscript, могут быть легко переписаны под KIXtart.
Рассмотрим внутреннее устройство клиентской части 1C v.8.0 Как было сказано ранее, информация о подключенных базах для версий 7.7 и 8.0 находится в разных местах. Теперь все данные хранятся в каталоге «Documents and Settings\ %username% \Application Data\1C\1Cv8». Для успешного подключения баз необходимо в нем создать минимум два файла (1Cv8strt.pfl и v8ib.lst) и соответствующие ID баз папки. В каждой из них также должен быть создан файл usr.def. Файловая структура подключаемых баз приведена на рис. 1.
Рисунок 2. Браузер 1С
тивном случае данные в браузере 1С будут отображаться некорректно либо не будут отображаться вовсе.
Управляем текстовыми файлами в кодировке utf-8 Объект FSO, традиционно используемый для создания текстовых файлов, не подходит, поскольку он не поддерживает требуемой кодировки (utf-8). Для решения поставленной задачи предлагается использовать объект ADODB.Stream. Управление текстовыми файлами подразумевает чтение и запись данных в файл. Приведу два соответствующих примера. Чтение данных из текстового файла: $Stream = CreateObject("ADODB.Stream") $Stream.Type =2 $Stream.CharSet = "Utf-8" $Stream.Open $Stream.LoadFromFile("1.txt") $GetFile = $Stream.Readtext() $Stream.Close
В примере данные считываются из файла 1.txt в переменную $GetFile. Параметр $Stream.Type может принимать значения 1(binary) или 2(text), в зависимости от типа данных, содержащихся в файле. С помощью параметра $Stream.CharSet управляют кодировкой чтения/записи данных в файл. Доступные для данной ОС кодировки перечислены в системном реестре HKEY_CLASSES_ROOT\ MIME\Database\Charset. Запись данных в текстовый файл: $Stream = CreateObject("ADODB.Stream") $Stream.CharSet = "utf-8" $Stream.Mode = 3 $Stream.Open $Stream.WriteText("Записываемые данные") $Stream.SaveToFile("1.txt") $Stream.Close
Рисунок 1. Файловая структура клиентской части 1С 8.0
Управление отображением списка баз (визуальная структура) в браузере 1С осуществляется с помощью файла v8ib.lst (рис. 2). С помощью второго файла – 1Cv8strt.pfl реализовано манипулирование такими параметрами, как размер и положение браузера 1С на экране, сортировка списка баз и т.д. В файле usr.def содержится имя пользователя, который последний открывал данную информационную базу. Все три файла имеют кодировку utf-8, и соответственно создавать их необходимо именно в этой кодировке. В про-
№7, июль 2005
В приведенном примере данные, на которые ссылается функция Stream.WriteText(), записываются в файл 1.txt; С помощью параметра $Stream.Mode осуществляется управление режимом работы с данными файла. Основные принимаемые значения – 1 (чтение – по умолчанию), 2 (запись) и 3 (чтение/запись).
Структура файла v8ib.lst В файле v8ib.lst содержащиеся данные описывают один из двух объектов: папку или ссылку на базу. Существуют ссыл-
49
администрирование ки на локальную или серверную базу. Описываемый файл имеет структуру ini-файла, названия разделов в котором совпадают с именами баз, отображаемыми в браузере.
Таблица 2. Описание параметров, управляющих конфигурацией браузера 1С
Синтаксис баз Как уже говорилось, название разделов должно совпадать с соответствующими именами баз. В каждом разделе присутствует пять обязательных параметров, описания которых приведены в таблице 1. Таблица 1. Описание параметров, используемых в файле v8ib.lst
Рисунок 3. Параметры настройки браузера 1С
Пример подключения локальной базы: [Тестовая локальная база] Connect=File="С:\Base"; ID=28f15724-3c41-4753-b5a4-42bb454b8be3 OrderInList=32768 Folder=/Тестовые базы OrderInTree=65536
Пример подключения сетевой базы: [Тестовая сетевая база] Connect=Srvr="sql.server.domain.ru";Ref="Enterprise _ test"; ID=28f15724-3c41-4753-b5a4-42bb454b8be3 OrderInList=16384 Folder=/ OrderInTree=32768
Параметры «ShowIBsAsTree», «AutoSortIBs», «LRInfoBaseIDList» могут принимать значения 0 или 1, исключение составляет параметр «ShowRecentIBs» – принимаемые значения от 1 до 9.
Алгоритм работы скрипта Работу скрипта условно можно разделить на несколько частей: 1. Генерация файла 1Сv8strt.pfl 2. Обработка данных файла v8ib.lst: ! Чтение, анализ и вычленение данных о локальных базах. ! Определение и формирование данных для подключения доступных сетевых баз. ! Формирование файла v8ib.lst, создание соответствующих каталогов, файлов def.usr.
Скрипт: файл 1cv8strt.pfl Синтаксис подкаталога Описание каталога аналогично описанию баз, однако есть два принципиальных отличия: отсутствие параметра connect и значение параметра OrderInList=-1: [Локальные базы] ID=7fa1d5a9-d087-4026-9eea-f18a233d618f OrderInList=-1 Folder=/ OrderInTree=16384
Структура файла 1Сv8strt.pfl Анализируя создаваемый 1С файл и изменяя различные параметры, были приобретены знания по управлению настройками визуального представления браузера 1С, умение назначать базу по умолчанию (при открытии браузера). Проанализируем фрагменты файла (листинг файла см. на сайте www.samag.ru, в разделе «Исходный код»): {"N",1},"ShowIBsAsTree", {"B",1},"AutoSortIBs", {"B",0},"ShowRecentIBs", {"B",0},"LRInfoBaseIDList",
50
Файл 1cv8strt.pfl статичен и меняется крайне редко, поэтому существует два варианта его создания на рабочей станции пользователя: первый – копирование с сервера (см. листинг файла в приложении на сайте журнала www.samag.ru в разделе «Исходный код»), второе – его генерация с помощью сценария. Рассмотрим второй случай. Для упрощения управления базами по умолчанию и упорядочиванию структуры рекомендуется считывать соответствующую информацию из конфигурационного файла. Пример файла приведен ниже: [1c8] ShowAsTree=1 AutoSort=1 DefaultBaseName=Сетевая база данных 1
Считывание данных из конфигурационного файла осуществляется следующим образом: … $DefaultBaseName=readproÞlestring("$conÞg _ ini","1c8", ↵ "DefaultBaseName") $meta _ 1c8=readproÞlestring("$conÞg _ ini","1c8", ↵
администрирование "base1c8preÞx") $ShowAsTree=readproÞlestring("$conÞg _ ini","1c8", ↵ "ShowAsTree") $AutoSort=readproÞlestring("$conÞg _ ini","1c8","AutoSort") …
где переменная $config_ini содержит имя и полный путь, в случае необходимости, к конфигурационному файлу. Второй параметр – название раздела, третий – соответственно параметра, значение которого возвращает функция. Ранее описывалась структура этого файла. ID-номер базы по умолчанию определяется в двойном цикле Do…Loop и зафиксируется в переменной $default_guid. … if instr(ucase($des), ucase($DefaultBaseName))<>0 $default _ guid=right( $infos[1],len( $infos[1])-3) Endif …
Перед записью в файл данные накапливаются в переменную, в данном случае $cfg. Полностью листинг генерации файла 1cv8strt.pfl приведен в приложении. В данном примере покажем лишь принцип, лежащий в основе формирования. Использование кавычек вносит коррективы в механизм генерации файла: в листинге скрипта кавычка выглядит следующим образом: « + chr(34) + ». $en=chr(13)+chr(10) … $cfg = $cfg + "{"+$en $cfg = $cfg + "{" + chr(34) + "LRInfoBaseIDListSize" + ↵ chr(34) + ","+$en $cfg = $cfg + "{" + chr(34) + "N" + chr(34) + ","+ ↵ $ShowAsTree+"}," + chr(34) + "ShowIBsAsTree" + ↵ chr(34) + ","+$en $cfg = $cfg + "{" + chr(34) + "B" + chr(34) + ","+ ↵ $AutoSort+"}," + chr(34) + "AutoSortIBs"+ ↵ chr(34) + ","+$en … $cfg = $cfg + "}"+$en
После наполнения переменной данными осуществляется запись ее содержимого в файл. Напомним, что файл 1cv8strt.pfl находится в каталоге «Documents and Settings\ %username%\Application Data\1C\1Cv8». $FSO = CreateObject("Scripting.FileSystemObject"). ↵ GetFile($path _ to _ base+"1cv8strt.pß") if @error=0 $FSO.Delete endif $FSO.close $Stream = CreateObject("ADODB.Stream") $Stream.CharSet = "utf-8" $Stream.Mode = 3 $Stream.Open $Stream.WriteText($cfg) $Stream.SaveToFile($path _ to _ base+"1cv8strt.pß") $Stream.Closeendif
$fso = CreateObject("Scripting.FileSystemObject") $fso.DeleteFile($f _ name) $fso.close
Имеющиеся данные необходимо разбить на подстроки и записать в массив, затем, проанализировав их, вычленить локальные базы. В качестве признака, по которому будут формироваться подстроки, рекомендуется использовать символ «[». При таком преобразовании элементами массива будут содержать описания баз целиком, например: a[0]= "[Тестовая сетевая база]" + chr(13) + chr(10) + ↵ "Connect= File = " + chr(34) + "С:\Base" + chr(34) + ↵ ";" + chr(13) + chr(10) + ↵ "ID=28f15724-3c41-4753-b5a4-42bb454b8be3" + chr(13) + ↵ chr(10) + "OrderInList=16384" + chr(13) + chr(10) + ↵ "" + chr(13) + chr(10) + "Folder=/" + chr(13) + ↵ chr(10) + "OrderInTree=32768"
Затем просмотрите и отберите элементы массива, характеризующие локальные базы. Признаком локальности базы является значение элемента connect, начинающегося с file=. Накопление данных осуществляется в переменную, которая потом также будет разложена в массив, но уже по другому признаку: переводу и возврату каретки на новую строку, а именно chr(13)+chr(10): $en=chr(13)+chr(10) … $temp="" ' расчленение строки на элементы массива. ' Признак – наличие "[" $array _ 0=split($GetFile,"[") for each $element in $array _ 0 ' "connect=Þle=" – признак локальности БД if instr(ucase($element),ucase("connect=Þle="))<>0 $element="["+$element $temp=$temp+$element endif next $array _ base=split($temp, $en)
Поскольку нумерация баз меняется, существующие локальные базы данных необходимо переместить в отдельную виртуальную папку, например, «Локальные базы», поэтому значения параметров OrderInList и OrderInTree необходимо обнулить, значения параметра Folder исправить на Folder=/ Локальные базы. Для этого необходимо обновить значения элементов массива: $virtual _ local _ folder="Локальные базы" for $i=0 to ubound($array _ base) $element=$array _ base[$i] if instr(ucase($array _ base[$i]),ucase("orderin"))<>0 $array _ base[$i]=left($element, ↵ instr($element,"=")) endif
Скрипт: файл v8ib.lst
if instr(ucase($element),ucase("folder="))<>0 $array _ base[$i]=left($element, ↵ instr($element,"=")+1)+ ↵ $virtual _ local _ folder endif
Локальные базы На первом этапе осуществляется чтение существующего файла и вычленение списка локальных баз. Пример чтения файла был приведен ранее, поэтому сразу перейдем к обработке считанных данных в переменную, например, $GetFile: после того как данные считаны, файл необходимо удалить:
№7, июль 2005
' массив локальных баз
next
После переприсвоения элементы массива $array_base могут иметь следующий вид:
51
администрирование $array _ base[0]= $array _ base[1]= $array _ base[2]= $array _ base[3]= $array _ base[4]= $array _ base[5]= ………………………………….
"[Тестовая сетевая база]" "Connect=File="С:\Base";" "ID=28f15724-3c41-4753-b5a4-42bb454b8be3" "OrderInList=" "Folder=/ Локальные базы" "OrderInTree="
Сетевые базы Составление списка сетевых баз основано на чтении данных из AD по следующему алгоритму: с помощью встроенной в KIX функции EnumGroup() просматривается список групп, в которые входит настоящий пользователь, и отфильтровываются только те из них, которые имеют заранее оговоренный префикс в названии, например, «1с8$_»: $i=0 $Temp="" Do $Group = EnumGroup($i) $i = $i + 1 If instr(ucase($group), ucase("1c8$ _ "))<>0 ………….. EndIf Until Len($Group) =0 MessageBox("$Temp","",0,0)
Итак, если пользователь входит в группу с указанным префиксом, то ему должна быть подключена соответствующая сетевая база данных. Параметры ее подключения находятся в свойствах группы (см. рис. 4). Поле Description содержит название базы, которое совпадает с названием раздела в файле v8ib.lst. Месторасположение и ID-базы – значение параметра notes. Обратите внимание, что параметр Description представляет собой массив элементов, а notes – строку, которую будет необходимо превратить в массив. Однако прежде всего необходимо получить доступ к Active Directory с помощью ADODB.Connection и ADODB. Command и составить запрос.
Поскольку название группы все время меняется, то в соединение с AD необходимо интегрировать функцию EnumGroup(): ' определение имени текущено домена $Domain = "LDAP://"+GetObject("LDAP://RootDSE"). ↵ Get("defaultNamingContext") $objConnection = CreateObject("ADODB.Connection") $objCommand = CreateObject("ADODB.Command") $objConnection.CommandTimeout = 120 $objConnection.Provider = "ADsDSOObject" $objConnection.Open ("Active Directory Provider") $objCommand.ActiveConnection = $objConnection $i=ubound($array _ base) DO $Group = ENUMGROUP($p) if instr("$Group","$meta _ 1c8")<>0 $1c8 _ group=right($group, ↵ len($group)-instrrev($group,"\")) $strADSQuery = "SELECT name,info,description FROM ↵ '" +$domain+"' WHERE objectClass='group’ ↵ and samaccountname='"+$1c8 _ group+"'" $objCommand.CommandText = $strADSQuery
Do
$st = $objCommand.Execute $st.MoveÞrst
$name = $St.Fields("name").Value $description = $St.Fields("description").Value $des="" For each $element in $description $des=$des+$element Next $infos = split($St.Fields("info").Value,chr(13)+chr(10)) ………………………………. $st.MoveNext Until $st.EOF endif $p=$p+1 UNTIL Len($Group) = 0
Замечание: в приведенном примере название группы, возвращаемое функцией enumgroup() имеет вид domain\ groupname, где domain – короткое имя домена. В SQL-запросе к Active Directory должно фигурировать только имя группы, т.е. необходимо отбросить префикс «domain\», поэтому короткое имя группы будет выглядеть: $1c8 _ group=right($group,len($group)-instrrev($group,"\"))
Данные, содержащиеся в массиве $infos необходимо преобразовать и добавить их в конец массива $array_base. При этом добавляемые в него элементы должны соответствовать ранее описанному шаблону для сетевых баз: $i=ubound($array _ base) DO … $array _ base[$i]="["+$des+"]" $infos = split($St.Fields("info").Value,chr(13)+chr(10)) $array _ base[$i+1]= "Connect="+$infos[0] $array _ base[$i+2]= $infos[1] $array _ base[$i+3]= "OrderInList=" $array _ base[$i+4]= $infos[2] $array _ base[$i+5]= "OrderInTree=" $i=$i+6 …
Формирование файловой структуры Рисунок 4. Группа безопасности
52
Файловая структура формируется внутри каталога «Documents and Settings\%username%\Application Data\1C\
администрирование 1Cv8». Расположение данного каталога на рабочей станции не фиксировано, поэтому для каждого пользователя путь необходимо определять индивидуально с помощью функции: $path _ to _ base=CreateObject("WScript.Shell").↵ SpecialFolders(5)+"\1C\1Cv8\"
Определив ID сетевой базы, в том же цикле Do..Loop (см. листинг скрипта на сайте www.samag.ru в разделе «Исходный код»), необходимо создать соответствующую базе файловую структуру. В каталоге «Documents and Settings\%username%\Application Data\1C\1Cv8» для каждой базы необходимо создать папку, название которой совпадает с ID этой базы, а в нем файл usr.def в кодировке UTF-8 со следующим содержанием: {«У Вас нет доступа. Обратитесь к системному администратору»}. Это сообщение будет появляться в том случае, если у пользователя нет прав доступа к данной базе данных 1С. … $id _ dir _ name=$path _ to _ base+right( $infos[1], ↵ len( $infos[1])-3) … md $id _ dir _ name ; создание каталога ; создание файла def.usr $FSO = CreateObject("Scripting.FileSystemObject"). ↵ GetFile($id _ dir _ name+"\def.usr") if @error=0 $FSO.Delete endif $FSO.close $Stream = CreateObject("ADODB.Stream") $Stream.CharSet = "utf-8" $Stream.Mode = 3 $Stream.Open $Stream.WriteText("{"+chr(34)+"У Вас нет доступа. ↵ Обратитесь к системному администратору."+chr(34)+"}") $Stream.SaveToFile($id _ dir _ name+"\def.usr") $Stream.Close …
Запись данных в файл На последнем этапе осуществляется запись сформированных данных в файл. В решении данной задачи есть несколько нюансов: помимо сформированных данных в файле необходимо в него записать информацию, касающуюся каталогов, и обновить нумерацию параметров OrderInList и OrderInTree. Листинг описания папок для тестовых и локальных баз выглядит следующим образом: $local _ folder = "[Локальные базы]" + $en + ↵ "ID=7fa1d5a9-d087-4026-9eea-f18a233d618f" + $en + ↵ "OrderInList=-1" + $en + "Folder=/" + $en + ↵ "OrderInTree=16384" $test _ folder = "[Тестовые базы]" + $en + ↵ "ID=7fa1d5a9-d087-9636-9eea-f18a233d618f" + $en + ↵ "OrderInList=-1" + $en + "Folder=/" + $en + ↵ "OrderInTree=32768"
ID должен быть уникальным. Каким конкретно? – не известно. Был проведен эксперимент, в результате которого выяснилось, что ID может быть любым. На практике рекомендуется выбрать один из ID, созданных 1C, и изменить одну из его частей произвольным образом.
№7, июль 2005
Из примера видно, что максимальное значение параметра OrderInTree=32768. Ранее отмечалось, что начало нумераций и шаг значений параметров OrderInList и OrderInTree не имеют значения. Этот факт подтвержден многочисленными экспериментами. В качестве начала отсчета были выбраны число 16384 и такой же шаг (заимствовано из 1С). Для удобства корректировки значений введены два коэффициента $w_1 и $w_2. Один из них управляет значениями OrderInList, а второй – OrderInTree соответственно. При таком способе установки нумерации получится, что в одном из каталогов нумерация параметра OrderInList начнется с одного числа, например, 32768, а в другом – 65536. В каждом из разделов нумерация произвольна и содержимое файла будет корректно считано браузером 1С. Листинг корректировки данных следующий: $const _ w=16384 $w _ 1=1 $w _ 2=3 for each $element in $array _ base if instr(ucase($element),ucase("orderintree"))<>0 $s=$s+$element+cstr($const _ w*$w _ 2)+$en $w _ 2=$w _ 2+1 else if instr(ucase($element), ↵ ucase("orderinlist"))<>0 $s=$s+$element+cstr ↵ ($const _ w*$w _ 1)+$en $w _ 1=$w _ 1+1 else $s=$s+$element+$en endif endif next
После того как все данные к записи приготовлены, можно приступить к записи в файл. В него следует записать содержание трех переменных: две переменные содержат информацию о создаваемых каталогах в браузере 1С, третья – накопленные элементы массива $array_base (переменная s). Напомню, что файл v8ib.lst находится в каталоге «Documents and Settings\%username%\Application Data\ 1C\1Cv8». $en=chr(13)+chr(10) … $Stream = CreateObject("ADODB.Stream") $Stream.CharSet = "utf-8" $Stream.Mode = 3 $Stream.Open $Stream.WriteText($local _ folder+$en+$test _ folder+$en+$s) $Stream.SaveToFile($path _ to _ base+"v8ib.lst") $Stream.Close
Таким образом, мы создали компонент сценария регистрации пользователей в сети, который позволил нам в автоматическом режиме управлять подключением сетевых баз данных, при этом локальные базы остаются неприкосновенными. Также выполняется сортировка существующего списка по локальным, сетевым и тестовым базам.
Литература: 1. Коробко И. Автоматизация процесса подключения баз 1С с помощью сценария регистрации пользователей в сети. – Журнал «Системный администратор» №3, 2005 г. – 48-51 с.
53
администрирование
УСТАНАВЛИВАЕМ И НАСТРАИВАЕМ WINDOWS SERVER UPDATE SERVICES СЕРГЕЙ СЕРГЕЕВ В компьютерной сети любого масштаба обновление всех программных продуктов без специального средства будет занимать значительную часть вашего рабочего времени. Внедрение службы управления этим процессом освободит ваше время для решения других задач, облегчит отслеживание выхода новых версий программ, позволит своевременно устанавливать обновления и, как следствие, повысит уровень безопасности информационной системы вашей компании.
В
июне этого года вышла официальная версия службы Windows Server Update Services (WSUS), предназначенной для централизованного управления обновлениями и исправлениями корпоративных продуктов Microsoft: Windows XP Professional, Windows 2000, Windows Server 2003, Office XP, Office 2003, SQL Server 2000, Exchange Server 2000 и Exchange Server 2003. С большинством возможностей WSUS мы уже познакомили читателя в обзоре «Windows Server Update Services» (см. №4, 2005 г). А сегодня займемся установкой и первоначальной настройкой сервера WSUS на компьютер с операционной системой Windows Server 2003 в среде Active Directory. Установка на компьютер с Windows 2000 Server несколько отличается. Так, Microsoft SQL Server 2000 Desktop Engine (MSDE) для Windows 2000 Server не входит в состав дистрибутива WSUS, в отличие от Microsoft Windows SQL Server 2000 Desktop Engine (WMSDE) для Windows Server 2003. Подробнее об этом можно прочитать в документации к WSUS. Ссылки на все необходимые для установки WSUS программы и документацию (в основном на английском языке) можно найти на домашней странице WSUS (http://www.microsoft.com/ windowsserversystem/updateservices/ default.mspx).
Готовим все необходимое к установке Для работы сервера WSUS, обслужи-
54
вающего до 500 клиентов, Microsoft рекомендует использовать компьютер с процессором частотой не ниже 1 ГГц, оперативной памятью не менее 1 Гб. Для установки WSUS файловая система сервера должна соответствовать следующим требованиям: ! системный раздел и раздел, предназначенный для установки WSUS, должны быть отформатированы в файловой системе NTFS; ! для системного раздела требуется не менее 1 Гб свободного пространства; ! необходимо не менее 6 Гб свободного пространства на диске, где хранятся данные WSUS; рекомендуется 30 Гб; ! необходимо не менее 2 Гб свободного пространства на диске, куда программой установки WSUS устанавливается Windows SQL Server 2000 Desktop Engine (WMSDE). На компьютере, предназначенном для сервера WSUS, предварительно необходимо установить следующие компоненты Windows Server 2003: ! Microsoft Internet Information Services (IIS) 6.0; ! Microsoft .NET Framework 1.1 с пакетом обновления 1 для Windows Server 2003; ! Background Intelligent Transfer Service (BITS) 2.0. На клиентских компьютерах должна функционировать служба автоматического обновления. Она существует для операционных систем:
! Семейство Microsoft Windows 2000 с пакетом обновления 3 или выше; ! Microsoft Windows XP Professional с пакетами обновления SP1 и SP2 или без них; ! Семейство серверов Microsoft Windows Server 2003.
Приступаем к установке Установку WSUS могут выполнить только члены локальной группы «Администраторы». Размер дистрибутива WSUS – около 125 МБ. Для запуска мастера установки необходимо выполнить файл WSUSSetup.exe. После принятия лицензионного соглашения вам будет предложено выбрать источник обновлений клиентских компьютеров: либо они будут храниться локально на сервере, либо каждый раз по запросу клиента будут загружаться с узла Microsoft Update. Гораздо рациональнее представляется хранить обновления локально. Во-первых, в этом случае уменьшаются затраты на интернеттрафик. Во-вторых, клиентские компьютеры будут обновляться быстрее. В любом случае при желании эту настройку вы сможете позже изменить. В следующем окне необходимо выбрать параметры базы данных: можно установить WMSDE вместе с WSUS или использовать существующий Microsoft SQL Server 2000. Поскольку WMSDE входит в состав дистрибутива WSUS и является бесплатным продуктом, вряд ли найдутся причины отказаться от его установки. Следующее окно позволяет вы-
администрирование брать веб-узел для использования сервером WSUS. Microsoft рекомендует использовать существующий вебузел IIS по умолчанию и 80-й порт. Если этот порт уже занят, потребуется создать отдельный узел IIS (специально для WSUS), работающий по настраиваемому порту. В окне «Параметры зеркального обновления» можно указать управляющую роль этого сервера. Если это первый сервер WSUS в сети, пропускаем это окно. Иначе, ставим флажок и вводим имя сервера верхнего уровня в поле «Имя сервера». После установки WSUS будет предложено запустить консоль администрирования, которая также доступна с других компьютеров сети по адресу: http://<имя сервера WSUS>/wsusadmin. Для запуска консоли администрирования необходимо быть членом группы «Администраторы WSUS» или членом локальной группы безопасности «Администраторы» на сервере WSUS.
Настраиваем WSUS Теперь мы выполним первоначальную настройку сервера WSUS: создадим группу компьютеров, на которых будем тестировать обновления, установим параметры синхронизации и автоматического одобрения. А затем с помощью групповых политик настроим службу автоматического обновления клиентских компьютеров.
Для начала нужно настроить способ назначения компьютеров в группы: либо они будут добавляться в группы со стороны сервера (т.е. вручную через консоль WSUS), либо со стороны клиента (т.е. с помощью групповых политик или настроек реестра Windows). Для этого откроем страницу «Параметры компьютеров», щелкнув по ссылке «Параметры» в верхней части консоли администрирования WSUS, затем «Параметры компьютеров». На открывшейся странице можно выбрать способ назначения компьютеров в группы. Если сеть небольшая и количество групп WSUS невелико, можно оставить значение по умолчанию. (Использовать задание «Переместить компьютеры» в Windows Server Update Services.) Для создания группы необходимо щелкнуть по ссылке «Компьютеры» в консоли администрирования WSUS. Затем на открывшейся странице нажать на ссылку «Создать группу компьютеров» и ввести ее имя. В нашем случае назовем группу Тест. В нее необходимо включить несколько типичных по конфигурации компьютеров, находящихся в сети. Однако сделать это можно будет только после настройки
параметров службы автоматического обновления клиентских компьютеров.
Параметры синхронизации Теперь необходимо настроить типы загружаемых обновлений. Для этого на странице консоли администрирования WSUS щёлкаем по ссылке «Параметры → Параметры синхронизации». Откроется страница с настройками синхронизации WSUS (рис. 1). В разделе «Расписание» можно выбрать ручную либо автоматическую ежедневную синхронизацию в определенное время. Пока оставляем ручной режим запуска процесса синхронизации. В разделе «Продукты и классы» можно указать программные продукты и типы обновлений для них. Щёлкнув по кнопке «Изменить» в левой части раздела, открываем окно со списком программ, для которых можно загружать обновления (рис. 2). Отмечаем продукты, которые есть в нашей сети и которые хотим обновлять. Таким же образом, щелкнув по кнопке «Изменить» под перечнем классов обновлений, в открывшемся окне (рис. 3) отмечаем нужные типы (классы). Для загрузки доступны следую-
Создаём группы компьютеров Важным моментом в настройке WSUS является создание групп компьютеров. Хорошей практикой является тестирование вновь полученных с узла Microsoft Update обновлений на небольшой группе типичных для сети компьютеров. Затем в случае успешного функционирования тестовых компьютеров в течение некоторого времени, распространение обновлений на остальные компьютеры сети.
№7, июль 2005
Рисунок 1. Параметры синхронизации
55
администрирование
Рисунок 2. Добавление и удаление продуктов
щие классы: драйверы, критические обновления, накопительные пакеты обновления, обновления системы безопасности и пакеты новых функций. Для каждого типа приводится описание. По умолчанию загружаются только критические обновления и обновления системы безопасности. На первое время можно оставить загрузку обновлений только этих классов. Следующий раздел – «Прокси-сервер». Если в сети для доступа в интернет используется прокси-сервер, заполняем необходимые поля этого раздела. Следующий раздел – «Источник обновления». Если это первый сервер WSUS в сети, оставляем загрузку с узла Microsoft Update. В противном случае указываем адрес и порт вышестоящего сервера WSUS, с которого будут загружаться обновления. Последний раздел – «Файлы обновлений и языки». Нажав на кнопку «Дополнительно», попадаем в окно настройки дополнительных параметров синхронизации (рис. 4). В группе параметров «Файлы обновлений» задаётся место хранения и в случае выбора мес-
Рисунок 3. Добавление и удаление классов
та на локальном сервере указывается способ загрузки и тип файлов обновлений. В большинстве случаев оптимальным вариантом будет локальное хранение файлов обновлений при включенном флажке «Загружать файлы обновлений на этот сервер, только если они одобрены». В этом случае обновления будут загружаться с узла Microsoft Update только в случае одобрения установки (администратором или автоматически). Файлы так называемой экспресс-установки имеют больший размер, т.е. будут увеличивать трафик интернет-соединения, и соответственно увеличится время их загрузки на сервер, но обновления клиентских компьютеров будут происходить быстрее. Здесь нужно сделать выбор в зависимости от конкретной конфигурации сети, скорости, загруженности и стоимости интернет-соединения. Пока можно не включать параметр «Загружать файлы экспресс-установки».
Параметры автоматического одобрения
Далее необходимо настроить автоматическое одобрение обнаружения и установки обновлений. Под обнаружением понимается проверка необходимости и возможности установки обновления для клиентского компьютера. В консоли WSUS щелкаем ссылк у «Параметры → Параметры автоматического одобрения». На открывшейся странице (рис. 5) в разделе «Обновления» настраиваем параРисунок 4. Дополнительные параметры синхронизации
56
метры автоматического одобрения для обнаружения и установки обновлений. Пожалуй, будет вполне логичным автоматически обнаруживать все синхронизируемые с узлом Microsoft Update классы обновлений для всех компьютеров сети, но автоматически устанавливать их пока не будем. В разделе «Новые редакции обновлений» устанавливается реакция сервера WSUS на выход новых версий уже одобренных обновлений. Полагаю, что вполне естественным будет установить параметр «Автоматически одобрять новейшую редакцию этого обновления». В разделе «Обновления Windows Server Update Services» настраивается автоматическая загрузка обновлений самого сервера WSUS. Естественно, нужно включить этот параметр для своевременной установки обновлений и исправлений WSUS.
Брандмауэр Если между сетью организации и интернетом находится брандмауэр, возможно, понадобится его настроить. Для получения обновлений с узла Microsoft Update сервер WSUS использует 80-й порт при подключении по протоколу HTTP и 443-й при подключении по HTTPS. Поэтому эти порты должны быть открыты на брандмауэре для исходящих соединений. Если политикой информационной безопасности организации запрещен доступ к этим портам, можно разрешить доступ только для определенных доменов, список которых приведен в документации к WSUS.
Параметры службы автоматического обновления клиентских компьютеров Теперь можно приступить к настройке службы автоматического обновления клиентских компьютеров. Если в сети используется служба каталогов Active Directory, можно и нужно использовать объекты групповой политики (GPO) для настройки клиентов. При отсутствии в сети развернутой службы каталогов можно использовать локальную групповую политику. Для этого в редакторе объектов групповой политики нужно открыть узел «Конфигурация компьютера → Административные шаблоны → Ком-
администрирование поненты Windows → Windows Update» (рис. 6). Если этого узла нет, то необходимо самостоятельно добавить административный шаблон wuau. adm. Каждый из параметров достаточно подробно описан, поэтому остановимся только на тех, которые необходимы для первоначальной настройки. Откройте свойства параметра «Настройка автоматического обновления» (рис. 7). Во включенном состоянии этот параметр может принимать одно из четырех значений: ! Уведомлять перед загрузкой обновлений и уведомлять повторно перед их установкой. При выборе этого варианта зарегистрированный в системе пользователь с правами администратора уведомляется перед началом загрузки и установки обновлений на компьютер. ! Загружать автоматически и уведомлять перед установкой. Если установить это значение параметра, обновления начинают загружаться автоматически, а зарегистрированный в системе пользователь с правами администратора оповещается перед началом установки. ! Загружать автоматически и устанавливать по заданному расписанию. В этом случае нужно указать дни и время принудительной установки обновлений на клиентские компьютеры. Выберем это значение параметра и назначим время, к примеру, на начало обеденного перерыва (12:00). Это позволит нам выполнять установку обновлений в часы наименьшей загрузки сети и компьютеров, и без вмешательства и лишних вопросов со стороны пользователей. ! Разрешить локальному администратору указывать настройки. Если вы решите доверить локальным администраторам самим настраивать параметры автоматического обновления, выберите это значение. Следующий параметр – «Указать раз-
№7, июль 2005
мещение службы обновлений Microsoft в интрасети» (рис. 8). Включаем и вводим путь к серверу WSUS в виде: http://<Имя сервера WSUS>. Параметр Разрешать пользователям, не являющимися администраторами, получать уведомления об обновлениях. Не стоит обременять пользователей лишней информацией, они и без того постоянРисунок 5. Параметры автоматического одобрения но загружены работой. Отключим этот параметр. За- на домашней странице консоли WSUS одно уменьшим количество входящих или на странице настройки параметров телефонных звонков на наше рабо- синхронизации. Сервер WSUS подключится к узлу Microsoft Update для прочее место. Теперь откроем страницу Компью- верки новых доступных обновлений. теры консоли WSUS. Через некоторое После окончания синхронизации сервремя, после применения рабочими вер начнет процесс обнаружения. Отстанциями групповых политик, на этой кроем страницу со списком обновлестранице начнут появляться имена ком- ний, щелкнув по ссылке «Обновлепьютеров. После этого можно перемес- ния» (рис. 9). В соответствии с нашими настройтить несколько в созданную ранее группу Тест для установки и проверки об- ками автоматически были одобрены новлений. Для этого выделим нужные для обнаружения все синхронизируекомпьютеры в списке, нажмём ссылку мые обновления для всех компьюте«Перемещение выбранных компьюте- ров. А для группы Тест автоматически ров» и в открывшемся окне выберем разрешена установка критических пакетов и обновлений системы безопасгруппу Тест. ности (у них в столбце «Одобрение» указан тип «Смешанное»). После тесСинхронизация После настройки параметров щелкаем тирования эти обновления можно устапо ссылке «Синхронизировать сейчас» новить на остальные компьютеры сети.
Рисунок 6. Настройка автоматического обновления
57
администрирование
Рисунок 7. Настройка автоматического обновления
Естественно, изменив настройки, можно возложить обязанности по одобрению на сервер WSUS, тем самым сделав процесс установки обновлений полностью автоматическим. После синхронизации, сбора данных о требуемых для клиентских компьютеров обновлениях и их одобрения для установки (автоматического или ручного) начнётся процесс загрузки необходимых файлов с узла Microsoft Update на сервер WSUS. В списке обновления помечаются характерными значками в зависимости от состояния загрузки. Естественно, первона-
Рисунок 9. Список обновлений
58
Рисунок 8. Размещение службы обновлений Microsoft в интрасети
чальная загрузка всех требуемых файлов обновлений может занять достаточно долгое время. Это зависит от многих факторов: разнообразия операционных систем, программных продуктов, настроек параметров синхронизации, пропускной способности интернет-канала. При выборе обновления в списке в нижней части страницы (вкладка «Подробности») появится соответствующая дополнительная информация: название, описание, дата, класс, оценка критичности, и т. д. На вкладке «Состояние» приводится информация о теку-
щем состоянии установки данного исправления на клиентские компьютеры. На вкладке «Редакции» выводится список всех версий данного обновления. Для изменения статуса одобрения необходимо щелкнуть по ссылке «Изменить одобрение» в левой верхней части страницы в разделе «Задачи обновлений». В разделе «Представление страницы обновления» можно задать условия для фильтра отображения списка обновлений. Щелкнув по ссылке «Отчеты», попадем на страницу со списком доступных для генерации отчетов. С их помощью можно получить информацию о состоянии обновлений, компьютеров, результатах синхронизации, а также параметрах настройки сервера WSUS. Работа с системой генерации отчетов достаточно понятна, поэтому не будем рассматривать ее подробно. В самом простом случае настройка сервера WSUS практически закончена. Осталось поменять ручной режим запуска синхронизации на выполнение в определенное время, например, ночью, в часы наименьшей загрузки сети. В списке загружаемых классов обновлений в параметрах синхронизации можно отметить Пакеты обновления. Также можно включить автоматическое одобрение установки обновлений на компьютеры из группы Тест. Но здесь необходимо быть осторожным, так как в результате интернеттрафик может оказаться значительным (сотни мегабайт и даже гигабайты), поскольку локальная база ещё не содержит файлов обновлений. При последующих загрузках, разумеется, объем входящего трафика будет значительно меньше. В большинстве случаев установка и настройка службы WSUS достаточно проста и понятна и не должна вызвать особых трудностей у системных администраторов.
bugtraq Выполнение произвольных команд в CSV_DB
Отказ в обслуживании в IA eMailServer при обработке команды IMAP LIST
Программа: CSV_DB 1.00. Опасность: Высокая. Описание: Уязвимость существует из-за недостаточной обработки входных данных в параметре file сценария csv_ db.cgi. Удаленный пользователь может добавить произвольную команду к параметру и выполнить ее с привилегиями веб-сервера на целевой системе. Пример:
Программа: IA eMailServer версии до 5.3.4.2019. Опасность: Средняя. Описание: Уязвимость существует из-за недостаточной обработки входных данных в команде LIST IMAP-сервера. Удаленный авторизованный пользователь может с помощью специально сформированной строки, содержащей символы (%x), вызвать аварийное завершение работы процесса MailServer.exe. URL производителя: www.tnsoft.com. Решение: Установите последнюю версию (5.3.4.2019) с сайта производителя.
http://[target]/csv _ db/csv _ db.cgi?Þl e=Þle.extention|command|
URL производителя: www.k-collect.net/cgi_lab/csv_db.htm. Решение: Способов устранения уязвимости не существует в настоящее время.
Удаленное выполнение PHP-кода в XML-RPC for PHP Программа: XML-RPC for PHP 1.1 и более ранние версии. Опасность: Высокая. Описание: Уязвимость в XML-RPC for PHP может позволить злоумышленнику выполнить произвольный PHP-код на целевом сервере. Подробности не сообщаются. URL производителя: http://phpxmlrpc.sourceforge.net. Решение: Способов устранения уязвимости не существует в настоящее время.
Отказ в обслуживании в реализации TCP-стека во FreeBSD Программа: FreeBSD 4.10, 4.11, 5.3, 5.4. Опасность: Средняя. Описание: Уязвимость в опции PAWS Timestamp позволяет удаленному пользователю послать большое количество специально сформированных пакетов с большим значением таймера, что заставит систему воспринимать все последующие пакеты как старые и отвергать их. Удаленный пользователь может разорвать все текущие TCP-соединения. Удаленный пользователь может послать специально сформированный TCP-пакет с флагом SYN и перезаписать определенные TCP-опции. URL производителя: www.freebsd.org. Решение: Установите обновление с сайта производителя.
Отказ в обслуживании в браузере Netscape при обработке Javascript-функций Программа: Netscape 8.0.2. Опасность: Средняя. Описание: Уязвимость существует при обработке специально сформированных Javascript-функций. Удаленный пользователь может создать специально сформированную HTMLстраницу и вызвать отказ в обслуживании браузера. Эксплоит: www.kurczaba.com/html/security/0506241_poc.htm. URL производителя: browser.netscape.com/ns8/product/ default.jsp. Решение: Способов устранения уязвимости не существует в настоящее время.
№7, июль 2005
HTTP Request Smuggling-атака в различных proxy и веб-серверах Программа: Squid 2.5.STABLE7 и более ранние версии; Sun Java System Web Proxy Server 3.6 SP4; SunONE Web Server 6.1 SP4; DeleGate 8.9.2; Microsoft Internet Information Server 5.0, 6.0; Apache Tomcat 4.1.24, 5.0.19; BEA WebLogic Server 8.1 SP1; IBM WebSphere 5.0, 5.1; Oracle Application Server Web Cache 9.0.2; Oracle Application Server 9.0.2; Apache web server версии 2.x до 2.1.6. Опасность: Низкая. Описание: Уязвимость позволяет удаленному пользователю произвести HTTP Request Smuggling-атаку (атаку со скрытым HTTP-запросом) и отравить кеш прокси-сервера. Удаленный пользователь может послать специально сформированный HTTP-запрос, содержащий два поля заголовка Content-Length, что заставит уязвимый сервер и следующий за ним HTTP-агент (веб-сервер или еще один прокси-сервер) обработать этот запрос по-разному. Злоумышленник может внедрить злонамеренный запрос в обычный и потенциально отравить кеш прокси-сервера. Злоумышленник может также создать специальный HTTP-запрос, содержащий большое количество пробелов и дополнительный взвод каретки в именах HTTP-заголовков для удачной эксплуатации этой уязвимости. Решение: Способов устранения уязвимости не существует в настоящее время. Примечание: Только некоторые производители выпустили исправления.
Выполнение произвольного PHP-сценария в phpBB в коде highlighting Программа: phpBB 2.0.15. Опасность: Высокая. Описание: Уязвимость существует из-за некорректного использования функции preg_replace() в сценарии viewtopic.php при обработке входных данных. Удаленный пользователь может с помощью специально сформированного запроса заставить приложение интерпретировать входные данные как PHP-сценарий и выполнить его. URL производителя: www.phpbb.com. Решение: Установите последнюю версию (2.0.16) с сайта производителя.
Составил Александр Антипов
59
администрирование
OPEN-XCHANGE – СВОБОДУ ГРУППАМ! Многие из вас задумываются об альтернативе таким Groupware-продуктам, как MS Exchange и Lotus Notes. Наконец, нам стала доступна свободная версия Novell/SUSE Linux Open-Xchangeсервера (SLOX).
ПАВЕЛ ЛЕБЕДЕВ
O
pen-Xchange (OX) базируется на компонентах с открытым исходным кодом, таких как веб-сервер, почтовый сервер c IMAP, база данных и сервер директорий. Сервер почти целиком написан на JAVA с присутствием элементов на языке С для участков, которые требуют большей безопасности. OX предоставляет пользователю такие модули: портал, календарь, контакты, адреса, задачи, проекты, документы, знания, закладки, доска голосований, форум, веб-интерфейс для почты. Доступ к серверу OX можно получить из многих браузеров и программных пакетов, например: KDE Kontact, Apples iCAL, Konqueror, Mozilla Suite и многих других, основанных на открытых стандартах и интерфейсах. Также можно подключаться из MS Outlook или Palm-устройств с помощью OX-клиента, который доступен для скачивания с сайта. В данной статье как операционную систему для OX будем использовать FreeBSD версии 5.3, с локально установленными пакетами: Apache2/Tomcat, Postfix/Cyrus, PostgreSQL, OpenLDAP и т. д. Но это не говорит о том, что вы жестко привязаны к такому набору компонентов. OX прекрасно работает на многих UNIX/Linux-подобных системах. Связки пакетов можно менять по вашему вкусу или основываясь на уже установленных программных комплексах. Например, Apache2/Tomcat можно заменить на Apache1.3/jserv, Postfix/Cyrus на Exim/Сourier, использовать внешние базы данных, серверы директорий, почтовые серверы и т. д. До того как вы приступите к установке OX, чтоб лучше представлять себе, как выглядит система, ее возможности, интерфейс пользователя, рекомендую посмотреть скриншоты (http://mirror.open-xchange.org/ox/EN/community/ screenshots.htm), поработать в demo-режиме с порталом и веб-интерфейсом для почты (http://mirror.open-xchange.org/ ox/EN/community/online.htm). Будьте внимательны! Автор не несет ответственности за возможную потерю данных при использовании данной статьи. Все бренды и названия продуктов являются или могут быть торговыми марками и используются, чтобы иден-
60
тифицировать продукты или услуги, их соответствующих владельцев.
Подготовим окружение для OX Введем переменные для простоты написания и понимания: ! OX_home=/usr/local/openxchange – папка, в которую будет установлен OX; ! OX_install=/home/user/OX – в эту папку будем складывать файлы, требуемые для установки; ! p_dir=/usr/ports – папка, где лежит дерево портов FreeBSD. Для компиляции, инсталляции и работы OX потребуется установить такие программы из коллекции портов: ! shells/bash – мощный интерпретатор команд, требуется для запуска OX и просто в повседневной жизни админа; ! security/sudo – программа для ограниченной раздачи прав администратора пользователям, нужна для запуска OX-сервера; ! java/jdk15 – Sun’s Java Development Kit под FreeBSD; ! www/jakarta-tomcat5 – веб-сервер, позволяющий запускать Java Servlet и JavaServer Pages; ! lang/perl5.8 – язык программирования Perl; ! www/apache2 – очень распространенный веб-сервер; ! devel/apache-ant – основанная на Java утилита для сборки приложений; ! net/openldap22-server – сервер директорий LDAP.
Java Мы будем устанавливать Native JDK для FreeBSD (http://www. freebsd.org/java/install.html). Напомню, что при установке Java понадобится около 2 Гб свободного места для раздела, на котором будет происходить компиляция пакета. Также для этого потребуются исходники и бинарные архивы Java. Замечание: файлы надо скачать самостоятельно в связи с лицензионными ограничениями. Для этого надо заре-
администрирование гистрироваться на сайте www.sun.com, а потом со страницы http://www.sun.com/software/java2/download.htm, выбрав платформу Java(TM) SDK 1.5.0, скачать: ! jdk-1_5_0-src-scsl.zip ! jdk-1_5_0-bin-scsl.zip Со страницы http://www.eyesbeyond.com/freebsddom/java/jdk15.html: ! bsd-jdk15-patches-1.tar.bz2 И положить архивы в папку $p_dir/distfiles. Как написано в BUILD, для начала процесса компиляции нужен рабочий javac-компилятор. По умолчанию порт ставит java/linux-sun-jdk14, но можно использовать и родной java/jdk14 и java/linux-blackdown-jdk14: > cd $p _ dir/java/jdk15 > sudo make install
Замечание: если процесс завис, нужно остановить его нажатием <Ctrl-C> и добавить Linux proc-файловую систему командами: > sudo kldload linprocfs > sudo mount -t linprocfs linprocfs /compat/linux/proc
Запускаем процесс компиляции еще раз, предварительно почистив порт java/jdk15 от уже скомпилированного кода. По окончании проверяем, если вывод команды java -version похож на приведенный ниже, значит, установка прошла успешно: > sudo make clean && sudo make install clean > java -version java version "1.5.0-p1" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-p1-root_08_apr_2005_22_00) Java HotSpot(TM) Client VM (build 1.5.0-p1-root_08_apr_2005_22_00, mixed mode)
Для работы OX потребуются дополнительные jar-компоненты: ! mail.jar – http://java.sun.com/products/javamail/downloads/ index.htm ! activation.jar – http://java.sun.com/products/javabeans/ glasgow/jaf.html ! xerces.jar – http://xml.apache.org/xerces2-j/download.cgi ! jdom.jar – http://www.jdom.org/dist/binary На момент написания статьи были использованы следующие версии jar-архивов: ! javamail-1_3_2.zip ! jaf-1_0_2-upd.zip ! Xerces-J-bin.2.6.2.tar.gz ! jdom-1.0.tar.gz Теперь создадим папки и распакуем в них архивы: > > > > > > >
cd $OX _ install unzip javamail-1 _ 3 _ 2.zip sudo mv ./javamail-1.3.2 /usr/local/javamail unzip jaf-1 _ 0 _ 2-upd.zip sudo mv ./jaf-1.0.2 /usr/local/jaf tar xzvf Xerces-J-bin.2.6.2.tar.gz sudo mv ./xerces-2 _ 6 _ 2 /usr/local/xerces
№7, июль 2005
> tar xzvf jdom-1.0.tar.gz > sudo mv ./jdom-1.0 /usr/local/jdom
Tomcat Установим сервлет-сервер и проверим его работу, для этого нужно запустить сервис Tomcat и пройти по ссылке http://127.0.0.1:8180. В результате должна появиться страница с информацией о Tomcat: > > > >
cd $p _ dir/www/jakarta-tomcat5 sudo make install clean sudo /usr/local/etc/rc.d/020.jakarta-tomcat50.sh start lynx http://127.0.0.1:8180
Perl + модули, требуемые для OX Из дерева портов нам нужно установить следующие компоненты: ! devel/p5-Storable ! devel/p5-Time-Local ! net/p5-URI ! net/p5-perl-ldap ! www/p5-CGI.pm ! converters/p5-MIME-Base64 ! converters/p5-Convert-ASN1 ! security/p5-Net-SSLeay ! security/p5-Digest-MD5 ! security/p5-Authen-SASL ! security/p5-IO-Socket-SSL ! textproc/p5-XML-NamespaceSupport ! textproc/p5-XML-SAX-Base Установка perl-модулей происходит так же, как и обычных портов, например, установим devel/p5-Storable: > cd $p _ dir/devel/p5-Storable > sudo make install clean
PostgreSQL Установим SQL-сервер и добавим автоматический запуск при старте системы. Для этого в файл /etc/rc.conf внесем строку: postgresql_enable=”YES”: > cd $p _ dir/databases/postgresql80-server > sudo make install clean
Запустим скрипт инициализации базы данных OX. Следует напомнить, что пароль для пользователя openxchange в PostgreSQL-сервере будет использоваться при конфигурировании OX в директиве --with-dbpass=: > sudo /usr/local/etc/rc.d/010.pgsql.sh initdb > sudo /usr/local/etc/rc.d/010.pgsql.sh start
После этого добавляем пользователя и создаем базу: > sudo su -l -m pgsql %createuser –pwprompt Введите имя нового пользователя: openxchange Введите пароль для нового пользователя: Введите снова: Разрешить новому пользователю создавать базы данных? (y/n) y Разрешить новому пользователю создавать пользователей? (y/n) n CREATE USER
61
администрирование %createdb -O openxchange -E UNICODE openxchange CREATE DATABASE
Кроме этого, для работы OX с PostgreSQL надо скачать JDBC (http://jdbc.postgresql.org). В портах есть версия 8.0 databases/postgresql-jdbc, но мы предлагаем использовать коннектор версии pg74.215. jdbc3.jar, скачать который можно с сайта http://jdbc.postgresql.org/download.htm: > sudo mkdir /usr/local/jdbc > sudo cp pg74.215.jdbc3.jar /usr/local/jdbc
Apache2 и Ant Настала очередь веб-сервера, установим его и настроим автозапуск. Также установим утилиту для сборки приложений. Для автозапуска Apache2 при старте системы в файл /etc/rc.conf добавляем строку: apache2_ enable=”YES”. > > > >
cd $p _ dir/www/apache2 sudo make install clean cd $p _ dir/devel/apache-ant sudo make install clean
Для соединения сервлет-сервера Tomcat и веб-сервера Apache2 нам потребуется установить модуль mod_jk. На данный момент есть 2 версии этого модуля – mod_jk и mod_jk2, но так как mod_jk2 официально больше не поддерживается, использовать его не будем. Опираясь на рекомендации разработчиков, вместо него возьмем www/ mod_jk-apache2. > cd $p _ dir/www/mod _ jk-apache2 > sudo make install clean
LDAP Для работы OX надо собрать LDAP-сервер с экспериментальной функцией ACI (inside-the-tree access controls). Эта функция дает контроль над правами объекта в дереве. > cd $p _ dir/net/openldap22-server > sudo make -DWITH _ ACI install clean
Добавляем автоматический запуск при старте системы и разрешаем слушать только на внутреннем интерфейсе, для этого в файл /etc/rc.conf добавляем строки: slapd _ enable="YES" slapd _ ßags='-h "ldap://127.0.0.1/"'
Установливаем OX и настраиваем взаимодействие с окружением Инсталляция OX Все готово для начала инсталляции OX. Первым делом необходимо скачать исходники OX с сайта (www.openxchange.org). Я взял исходники версии 0.7.5, так как для нее на момент установки была русификация. Нам потребуются файлы: ! open-xchange-0.7.5.tar.gz
62
! OX-RU-Groupware.0.7.5.tar.gz ! OX-RU-Webmail.0.7.5.tar.gz Далее делаем такие операции: > cd $OX _ install > tar xzvf open-xchange-0.7.5.tar.gz > cd open-xchange-0.7.5
Чтобы посмотреть возможные опции конфигурации, выполняем команду: > ./conÞgure -help
Конфигурируем, компилируем и устанавливаем пакет OX. При этом обратите внимание на опцию --with-dbpass= и укажите тот самый пароль, который задан для пользователя openexchnge в PostgreSQL. > > > > > > > > > > > >
./conÞgure –preÞx=$OX _ home \ --enable-webdav --enable-doc \ --with-mailjar=/usr/local/javamail/mail.jar \ --with-activationjar=/usr/local/jaf/activation.jar \ --with-jdomjar=/usr/local/jdom/build/jdom.jar \ --with-xercesjar=/usr/local/xerces/xercesImpl.jar \ --with-jsdkjar=/usr/local/jakarta-tomcat5.0/common/lib/ ↵ servlet-api.jar \ --with-jdbcjar=/usr/local/jdbc/pg74.215.jdbc3.jar \ --with-dbpass=open \ --with-runuid=www –with-rungid=www make sudo make install
На данный момент у нас есть установленный OX и его окружение, приступим к пост-инсталляционному конфигурированию.
Login.pl (Perl/CGI) Настроим и проверим окно авторизации пользователя OX: > > > >
cd $OX _ home/share/perl/ sudo cp login.pl login.pm /usr/local/www/cgi-bin/ sudo /usr/local/etc/rc.d/apache2.sh start lynx http://127.0.0.1/cgi-bin/login.pl
Замечание: если окно ввода имени и пароля пользователя OX не появилось, нужно смотреть настройки и логфайлы, веб-сервера Apache2.
Servlets Настроим servlet-движок так, чтоб он обрабатывал запросы OX. Для этого скопируем нужные файлы из пакета OX. > cd /usr/local/jakarta-tomcat5.0/webapps > sudo mkdir -p servlet/WEB-INF/classes ↵ servlet/WEB-INF/lib > sudo cp $OX _ home/share/servlets/*.class ↵ ./servlet/WEB-INF/classes > cd servlet/WEB-INF/
Создаём файл web.xml с таким содержимым. Этот файл требуется для того, чтобы Tomcat понимал, как обрабатывать запросы к groupware и webmail: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.// ↵
администрирование DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app _ 2 _ 3.dtd">
worker.list=test worker.test.port=8009 worker.test.host=localhost worker.test.type=ajp13 worker.test.lbfactor=1 workers.tomcat _ home=/usr/local/jakarta-tomcat5.0 workers.java _ home=/usr/local/jdk1.5.0
<web-app> <display-name>Servlet OpenXchange</display-name> <description>Servlet OpenXchange 0.7.5</description> <servlet> <servlet-name>intranet</servlet-name> <servlet-class>intranet</servlet-class> <display-name>OX Groupware</display-name> <description>OX</description> </servlet> <servlet-mapping> <servlet-name>intranet</servlet-name> <url-pattern>/intranet</url-pattern> </servlet-mapping> <servlet> <servlet-name>webmail</servlet-name> <servlet-class>webmail</servlet-class> <display-name>OX Webmail</display-name> <description>OX</description> </servlet> <servlet-mapping> <servlet-name>webmail</servlet-name> <url-pattern>/webmail</url-pattern> </servlet-mapping> </web-app>
Скопируем jar-файлы для Tomcat из установленного пакета OX и проверим правильность работы Tomcat, просмотрев в браузере вывод http://127.0.0.1:8180/servlet/ intranet: > > > > > >
cd /usr/local/jakarta-tomcat5.0/webapps/servlet/WEB-INF/lib sudo cp $OX _ home/lib/*.jar . sudo chown -R www:www /usr/local/jakarta-tomcat5.0/webapps/ sudo /usr/local/etc/rc.d/020.jakarta-tomcat50.sh stop sudo /usr/local/etc/rc.d/020.jakarta-tomcat50.sh start lynx http://127.0.0.1:8180/servlet/intranet
Если сервер ответил: No running Server found. Please inform the Administrator!
это говорит о том, что всё идет нормально, продолжаем настраивать OX.
mod_jk Настроим взаимодействие Apache2 и Tomcat с помощью mod_jk. Для этого добавим в файл /usr/local/etc/apache2/ httpd.conf, такие строки: LoadModule jk _ module libexec/apache2/mod _ jk.so <IfModule mod _ jk.c> JkWorkersFile /usr/local/etc/apache2/workers.properties JkLogFile /var/log/apache2/mod _ jk.log JkLogLevel error JkMount /servlet/* test Alias /servlet "/usr/local/jakarta-tomcat5.0/webapps/servlet" <Location "/servlet/WEB-INF/"> AllowOverride None deny from all </Location> </IfModule>
Скопируйте /usr/local/etc/apache/workers.properties.sample в workers.properties. Измените hostname. Убедитесь, что две последние строки с правильными путями, в нашем случае файл должен выглядеть так:
№7, июль 2005
PostgreSQL С базой данных PostgreSQL проведем те же операции, которые написаны в [1], сначала инициализируем базу, а потом наполним данными из файла, который идёт с пакетом OX: > sudo su -l -m pgsql %psql -U openxchange openxchange < $OX_home/share/init_database.sql %psql -U openxchange openxchange openxchange=>INSERT INTO sys_gen_rights_template values openxchange->('now','admin','now','','default_template','y','y','y','y', openxchange(>'y','y','y','y','y','y','y','y','y','y','y','y','y','y','y', openxchange(>'y','y','y','y','y','y','y','y','y','y','y','y','y','y','y', openxchange(>'y','y','y','y','y','y','y','y','y','y','y','y','y'); openxchange=> \q
Также потребуется изменить файлы конфигурации servers.conf в папках: ! /usr/local/openxchange/etc/groupware ! /usr/local/openxchange/etc/webmail Для того чтобы OX получил доступ к созданной нами базе данных, нужно изменить: NAS _ CON _ CLASS _ NAME: ↵ jdbc:postgresql://localhost/openexchange NAS _ CON _ USER: openexchange
на NAS _ CON _ CLASS _ NAME: ↵ jdbc:postgresql://localhost/openxchange NAS _ CON _ USER: openxchange
OpenLDAP Приступим к настройке сервера директорий. Обратите внимание на то, что, если поменять суффикс «dc=example,dc=org» на что-то более родное типа «dc=good-domain,dc=ua», то это надо будет сделать во всех файлах конфигурации (до запуска OpenLDAP), а именно: ! /usr/local/etc/openldap/ldap.conf ! /usr/local/etc/openldap/slapd.conf ! /usr/local/openxchange/share/init_ldap.ldif ! /usr/local/openxchange/etc/admintools.conf Изменяем конфигурацию OpenLDAP. Для этого в файле /usr/local/etc/openldap/ldap.conf добавляем строки: BASE HOST
dc=example,dc=org localhost
а в файл /usr/local/etc/openldap/slapd.conf такие: include include include include include
/usr/local/etc/openldap/schema/core.schema /usr/local/etc/openldap/schema/cosine.schema /usr/local/etc/openldap/schema/nis.schema /usr/local/etc/openldap/schema/inetorgperson.schema /usr/local/openxchange/share/openxchange.schema
pidÞle
/var/run/openldap/slapd.pid
63
администрирование argsÞle /var/run/openldap/slapd.args database bdb sufÞx "dc=example,dc=org" rootdn "cn=Manager,dc=example,dc=org" rootpw secret directory /var/db/openldap-data index objectClass eq index uid,mailEnabled,cn,sn,givenname, ↵ lnetMailAccess,alias,loginDestination eq,sub
Теперь запускаем OpenLDAP: > sudo /usr/local/etc/rc.d/slapd.sh start
Редактируем файл /usr/local/openxchange/share/init_ ldap.ldif и меняем пароль для доступа к базе: userPassword: {CRYPT}newmailadminpass
В этой строке newmailadminpass меняем на вывод команды: > perl -e 'print crypt(YOURPASSHERE, ↵ pack("C2",(int(rand 26)+65),(int(rand 26)+65)));'
где YOURPASSHERE – пароль для доступа к OpenLDAP. Теперь импортируем данные для OX из файла /usr/local/ openxchange/share/init_ldap.ldif командой: > sudo slapadd -l $OX _ home/share/init _ ldap.ldif
Создадим символические ссылки для OX на ldap.conf: > sudo ln -s /usr/local/etc/openldap/ldap.conf ↵ $OX _ home/etc/groupware/ldap.conf > sudo ln -s /usr/local/etc/openldap/ldap.conf ↵ $OX _ home/etc/webmail/ldap.conf
Добавляем пользователя Так как многие скрипты в папке /usr/local/openxchange/sbin используют в качестве оболочки /bin/bash, а оригинальное расположение bash в FreeBSD /usr/local/bin/bash, сделаем символическую ссылку и добавим первого пользователя OX: > > > > > > > >
sudo ln -s /usr/local/bin/bash /bin/bash sudo $OX _ home/sbin/adduser _ ox \ --username="test" \ --passwd="test" \ --name="Pavel" \ --sname="Lebedev" \ --maildomain="example.org" \ --ox _ timezone="Europe/Kiev"
Если скрипт запустить от обычного пользователя, он выдаст: Execute as root...or make sure slappasswd is in PATH
Запускаем от root, появилась надпись зеленого цвета, что с LDAP все хорошо, а красным цветом, что база openexchange в PostgreSQL не существует: LDAP Success psql: FATAL: database "openexchange" does not exist SQL Error Deleting User from LDAP
64
Возвращаемся в пункт PostgreSQL и смотрим, наша база называлась openxchange, а OX использует для доступа базу openexchange, находим и исправляем строки, в файле /usr/local/openxchange/etc/admintools.conf, который отвечает за конфигурацию сервера: DEFAULT _ SQL _ DB="openxchange" DEFAULT _ SQL _ USER="openxchange"
Запускаем еще раз и получаем в ответ: LDAP Success SQL Success
Теперь добавим группу: > sudo $OX _ home/sbin/addgroup _ ox –group=developers Added Group developers to LDAP
Добавление первого пользователя и группы успешно завершено.
Apache2 / Website Настроим взаимодействие веб-сервера и OX. Для этого создаем папки в директории data веб-сервера и скопируем в них контент, который идет вместе с OX. > > > >
cd /usr/local/www/data sudo mkdir -p cÞntranet/webmail cd $OX _ home/share/groupware/data/ sudo cp -R images css javascript ↵ /usr/local/www/data/cÞntranet/ > cd $OX _ home/share/webmail/data/ > sudo cp -R images css javascript ↵ /usr/local/www/data/cÞntranet/webmail
Хранилище файлов Создадим хранилище данных, для этого запустим скрип, который на медленных машинах, с многими файловыми системами, может выполняться довольно долго. Как написано в [2], файл sbin/correctfilespool в качестве интерпретатора содержит «#!/bin/sh», но, скорее всего, это какая-то модификация bash. Так что поменяем «#!/bin/ sh» на «#!/usr/local/bin/bash». Также скрипт sbin/correctfilespool использует GNU seq для счета от 0 до 255, но в составе FreeBSD ее нет. Для решения проблемы можно выбрать два пути. Первый поставить порт sysutils/coreutils и заменить все seq на gseq. Второй вместо seq использовать программу jot, идущую в стандартной поставке FreeBSD, и везде заменить «seq 0 255» на «jot 256 0». > cd $OX _ home/sbin/ > sudo sh ./correctÞlespool
Русификация интерфейса Перейдем в папку, где лежат архивы, скачанные с сайта OX, раз архивируем и установим русификацию для Groupware и Webmail: > cd $OX _ install > tar xzvf ./OX-RU-Groupware.0.7.5.tar.gz > sudo cp -r ~/opt/html/RU ↵ $OX _ home/share/groupware/data/templates/ > sudo cp -r ~/opt/locales/RU.dlc ↵ $OX _ home/etc/groupware/locales/
администрирование > rm -r ./opt > tar xzvf ./OX-RU-Webmail.0.7.5.tar.gz > sudo cp -r ~/opt/html/RU ↵ $OX _ home/share/webmail/data/templates/ > sudo cp -r ~/opt/locales/RU.dlc ↵ $OX _ home/etc/webmail/locales/ > rm -r ./opt
ps axwww | grep -E '.*java.*-DappName=groupwareApp' | ↵ grep -v grep | awk '{print $1}'
и su $USER -s /bin/bash $OX _ BIN >> $LOGFILE 2>&1 &
Теперь надо открыть файл login.pm. в папке /usr/local/ www/cgi-bin и для добавления возможности выбора языка интерфейса изменить строку: my $languages = ['DE','EN'];
на my $languages = ['EN','RU'];
Замечание: если после перезапуска Groupware, Webmail и Apache2, появится ошибка в файлах webmail.log или groupware.log:
Далее можно пробовать запустить openxchange: > sudo $OX _ home/etc/init.d/openexchange start
Если появились ошибки при старте groupware, webmail и sessiond, нужно по аналогии со скриптами из папки /usr/ local/openxchange/sbin в папке /usr/local/openxchange/etc/ init.d для всех файлов заменить командный интерпретатор с «#!/bin/sh» на «#!/bin/bash». После пробных неудачных запусков выяснились еще некоторые изменения, которые нужно внести. Для файлов в папке /usr/local/openxchange/bin изменить командный интерпретатор с «#!/bin/sh» на «#!/bin/bash» и заменить строку:
Language RU is in the wrong version
Значит установлена неправильная версия OX-русификации. Скачайте пакет русификации с такой же версией, как и устанавливаемый пакет OX. Как, оказалось, для отображения иконок панели в русифицированном интерфейсе потребуется создать папки RU и скопировать в них содержимое папок EN. Или как в примере сделать ссылку: > sudo ln -s ↵ /usr/local/www/data/cÞntranet/images/top/EN ./RU > sudo ln -s ↵ /usr/local/www/data/cÞntranet/webmail/images/top/EN ./RU
Запускаем ОХ Вот наступил долгожданный момент первого запуска OX. Чтобы вступили в силу сделанные изменения в настройках веб сервера и сервера сервлетов, нужно перезапустить службы Apache2 и Tomcat, для этого надо выполнить такие команды: >cd /usr/local/etc/rc.d >sudo ./020.jakarta-tomcat50.sh stop >sudo ./020.jakarta-tomcat50.sh start >sudo ./apache2 .sh stop >sudo ./apache2.sh start
Перед запуском OX нужно отредактировать скрипты:
! /usr/local/openxchange/etc/init.d/groupware ! /usr/local/openxchange/etc/init.d/sessiond ! /usr/local/openxchange/etc/init.d/webmail
на предмет того, что в FreeBSD используется синтаксис команды ps, отличный от GNU/Linux ps. Для этого нужно заменить «ps xao “%p %a”» на «ps xao “pid args”», и раскомментировать строки: sudo -u $USER $OX _ BIN >> $LOGFILE 2>&1 & ps xao "pid args" | grep -E ↵ '.*java.*-DappName=groupwareApp' | grep -v grep | ↵ awk '{print $1}'
После этого надо закомментировать строки:
№7, июль 2005
SERVER=$(test "$HOSTTYPE" == "i386" && echo "-server")
на SERVER=$(test "$HOSTTYPE" == "FreeBSD" && echo "-server")
Хочется обратить внимание на то, что скрипт /usr/local/ openxchange/etc/init.d/openexchange с опцией start будет работать, но вот опция status и stop работать не будут. Это связанно с тем, что в FreeBSD очень длинная командная строка с опциями, в выводе команды ps укорачивается до названия команды, и однозначно определить, что запущено под этой командой, будет невозможно. Для проверки после старта openexchange советую зайти по адресу: http://server_ip/cgi-bin/login.pl, где server_ip – адрес вашего сервера, ввести логин и пароль созданного пользователя, выбрать groupware, язык локализации RU и нажать login. Во время входа портал будет медленнее работать. Но это нормально, OX проверяет новую почту для пользователя, а почтовый сервер еще не настроен. По наступлению таймаута ответа почтового сервера отобразится главная страница портала. Все остальные функции портала будут работать, и можно будет насладиться проделанной работой. В следующей статье вы узнаете, как настроить дополнительную функциональность OX-сервера: ! почтовый сервер для работы с OX; ! настройка доступа через webdav; ! безопасные соединения HTTPS; ! контроль над доступом к данным пользователей.
Литература: 1. Файл INSTALL из архива пакета OX. 2. Установка OX на FreeBSD от Peter Schober – http://homepage.univie.ac.at/peter.schober/OX_on_FreeBSD.html. 3. Форум OX – http://www.open-xchange.org/cgi-bin/simpleforum.cgi. 4. Документация по установке на другие операционные системы – http://www.open-xchange.org/oxwiki/OXInstallations.
65
hardware
Linux inuxBIOS BIOS – ФУНДАМЕНТ ДЛЯ LLinux inux??
Будучи спроектированной для работы в многоузловых кластерных системах, технология LinuxBIOS за 5 лет оказалась настолько универсальной, что может быть сегодня использована не только в серверах, но и в рабочих станциях. Так что же это – еще одна Basic Input/ Output System или что-то большее?
АНТОН БОРИСОВ
L
inuxBIOS является альтернативой обычным BIOS [1], выполняет те же самые функции, что и выпускаемые фирмами AMI (American Megatrends), Phoenix (Phoenix Technologies), IBM, DELL и некоторыми другими, только на порядок быстрее, т.е. в 10-20 раз. LinuxBIOS производит инициализацию оборудования, проверку на исправность модулей памяти и собственно начинает загрузку операционной системы уже после 3 секунд (!) после включения питания. Многие коммерческие изделия затрачивают на эту же процедуру от 30 до 60 секунд. В дополнение ко всему, LinuxBIOS может быть сконфигурирован уже из-под самого Linux во время работы.
Структура LinuxBIOS Прежде чем начать, проведем небольшой экскурс в современную архитектуру персональных ЭВМ. ПЭВМ состоит из набора чипов, в первую очередь самого большого и любимого – процессора, затем чипа с графическим процессором и контроллера клавиатуры, далее из соединяющих всё это богатство шин данных. Шина – это набор одного или нескольких проводников, которые соединяют между собой два или более чипа. Некоторые шины используют два провода – сигнальный и «землю», другие используют десятки или сотни проводников. Сильно упрощенная схема PC-архитектуры представлена на рис. 1. Разные типы шин не могут быть напрямую соединены между собой, поэто-
66
му используют промежуточные чипы, известные как мосты. Первая шина – это FSB (Front Side Bus) – системная шина, на большинстве персоналок она соединяет процессоры между собой и между северным мостом. Серверный мост в свою очередь соединяет процессор с шиной памяти и PCI-шиной. На диаграмме показан только один северный мост, хотя их может быть и несколько. На платформах с процессорами AMD Opteron, например, используется свой северный мост к каждому процессору, и системная шина соединяет только конкретный процессор к своему северному мосту. Другими словами, не существует общей системной шины для Opteron. Южный мост, который почти всегда расположен на 0-й PCI-шине, является следующим мостом в схеме. Задача южного моста – соединять PCI-шину с устройствами с набором более медленных устройств и отвечать за функции записи/чтения BIOS Flash (рис. 1). Когда ПЭВМ включается или же идет на перезагрузку, процессор передает управление на адрес, который традиционно располагается на самой вершине памяти (TOM – Top Of Memory) за вычетом 16 байт. То есть на архитектурах 8086 это был адрес 0xffff0, на платформах с современными процессорами этот адрес – 0xfffffff0. На первоначальном этапе единственным языком, который понимает машина – это машинный код (Ассемблер). Машина активируется в несколько этапов. В результате, LinuxBIOS переходит из одной фазы в другую последователь-
но, по мере инициализации определенных ресурсов. Фазы запуска LinuxBIOS (рис. 2): ! Обрабатываются инструкции, которые инициализируют процессор, лишнюю виртуальную память в минимальной конфигурации (32-битную адресацию), а также другие ресурсы, необходимые для включения памяти (например, I2C-шину). Затем производится сброс кеша процессора. ! Происходит старт кода, отвечающий за дальнейшую настройку процессора и установку параметров памяти. ! Загружается объектный «C»-код из Flash-памяти в оперативную память. Объектный код может быть сжатом виде (заархивирован). ! Выполняется код, который функционирует только при настроенной памяти. Происходит сканирование и инициализация всех аппаратных ресурсов. ! Дополнительная фаза, в ходе которой происходят финальная настройка и затем старт операционной системы. LinuxBIOS содержит опциональную возможность старта при наличии проблем с обычным BIOS. Такая поддержка добавляется при компиляции проекта. Дополнительный код проверяет сохранность CMOS-памяти и определяет, был ли удачным старт ПЭВМ в предыдущей попытке. Если нет, то используется альтернативная загрузка. В таком случае используется LinuxBIOS-
hardware
Рисунок 1. Упрощенная схема классической PC-архитектуры. Мосты – это логика, которая соединяет одну шину с другой
Так получилось, что некоторые технологические разработки 1999 года послужили толчком для начала проекта. В какой-то степени это и появление 1 Мб модулей FLASH-памяти на системных платах и широкое использование PCI-шины, которая заменила устаревшую ISA-шину. Также показательно, что Linux начал работать на таких машинах, как SGI Visual Workstation, на которых использовался свой вариант BIOS. Что казалось ясным на том этапе, так это то, что если бы удалось скрестить Linux с кодом в BIOS, то цели были бы достигнуты. Linux настраивает аппаратные средства намного лучше, нежели варианты BIOS того дня. Требовалось написать простейший загрузчик BIOS, который бы в свою очередь пускал ядро Linux. Дальнейшая инициализация была бы прерогативой Linux. Таким образом, возникло выражение – «Пусть этим займется Linux!» Прежде чем начался полномасштабный LinuxBIOS проект, в декабре 1999 года была продемонстрирована работа под названием «LOBOS», в ходе которой ядро Linux грузилось из Flash-памяти и дальше передавало управление опять Linux-ядру, но находящемуся на жестком диске.
Проще и быстрее
Рисунок 2. Фазы запуска LinuxBIOS
образ, который позволяет загрузиться с другого, гарантированного источника, например, по сети.
Корни и эволюция LinuxBIOS Проект LinuxBIOS был начат в Национальной Лаборатории Лос Аламос (Los Alamos National Lab – LANL) в сентябре 1999 года под руководством Рона Минниха (Ron Minnich). В предыдущие восемь лет он занимался построением кластеров всех видов, в частности в 1994 году он подготовил свой первый кластер на базе PC. Всё это время BIOS был краеугольным камнем в создании больших кластеров.
№7, июль 2005
Самый простой способ достичь результата в Open Source-среде – это найти решения, которые уже работают. Поэтому следующим логическим шагом в развитии проекта стал поиск программного обеспечения схожей тематики. Джеймс Хендрикс (James Hendricks) вместе с Дейлом Вебстером (Dale Webster) нашли нечто похожее в проекте OpenBIOS. После ознакомления с проектом за пять дней удалось создать тестовый вариант на платформе Intel L440GX+. Она загружалась, правда, не с холодной загрузки (когда система первоначально выключена и затем включается), а с горячего старта. Чтобы добавить эту функциональность (возможность холодного старта) пришлось затратить пять месяцев. Выяснилось, что ассемблерный код не сможет стать языком LinuxBIOS-проекта. Проект OpenBIOS почти полностью состоял из ассемблерных вставок, и было проблематично добавить что-то новое, свое. Неудивительно, что следующим шагом было удачное
открытие Джефом Гарзиком (Jeff Garzik) следующего факта – автор проекта STPC BIOS предоставляет в общественный доступ свой труд. Так, STPC BIOS становится фундаментом новой структуры LinuxBIOS. Дальнейшая работа над кодом потребовала постоянной реорганизации, чтобы проект смог поддерживать многие системные платы и логику, таким образом был заложен хороший фундамент для дальнейшего развития. Следующие шесть месяцев были посвящены запуску LinuxBIOS на новых платформах. Первой платформой без использования графических средств настройки (как в классических программах BIOS Setup) стала системная плата Intel L440GX+, за которой последовала SiS 630. Именно с этого момента, т.е. с приходом фирмы SiS в проект, началась новая эра. Компания предоставляла схемотехнику, техническую поддержку, ассемблерный код, т.е. действительно серьезно подошла к тому, чтобы запустить LinuxBIOS на своем продукте. Вскоре выяснилось, что Linux может делать, а чего нет. Выяснилось, что ядро 2.2, с которым тогда работали в проекте, не способно с нуля произвести инициализацию PCI-шины. Этим пришлось заниматься LinuxBIOS. Пришлось вытащить код из Linux и с небольшими изменениями использовать непосредственно в LinuxBIOS, добавляя по мере необходимости расширения. Также вскоре выяснилось, что загрузка происходит настолько быстро, что IDE-диски не успевают стартовать. Но вскоре и эта проблема была успешно решена. По истечении следующих девяти месяцев LinuxBIOS успешно работал на двух платформах, будучи написанным почти полностью на C. Корпорации стали проявлять интерес к разрабатываемому продукту. Так, VIA и Acer предоставили спецификации на свои новые продукты, таким образом также была включена поддержка для их плат. Джеймс Хендрикс начал работу над SMP-поддержкой тем же летом. Патчи стали включаться в разработку Linux-ядра, а не как расширения в LinuxBIOS. С этой стороны Linux-ядро стало походить на унипроцессорное – добавление поддержки новых процессоров стало занимать меньше времени.
67
hardware Летом того же года к проекту присоединился Linux NetworX, и Эрик Бьедерман (Eric Biederman) стал ключевой фигурой при добавлении поддержки Alpha-архитектуры. Он также произвел реорганизацию стартового кода управления памятью. Сотрудничество с Linux NetworX продолжается и по сей день – фирма является самым крупным продавцом систем на основе LinuxBIOS. Также немаловажной заслугой Эрика является создание архитектуры LinuxBIOS следующей, второй версии. В конце года участники проекта выступали на Atlanta Linux Showcase 2000 и там познакомились со Стивом Джеймсом (Steve James) из Linux Labs. Это партнерство позволило менее чем за месяц построить 13-узловой кластер на базе LinuxBIOS для Supercomputing 2000. К следующему, 2001 году Linux NetworX завершила портирование под Alpha-платформу для машин DS10. Был построен кластер из 104 машин класса DS10, все под управлением LinuxBIOS. Машины грузились значительно медленнее, нежели системы на Pentium, поэтому для выхода в рабочий режим требовалось примерно 50 секунд, но все-таки скорость была достаточно высокой. По сравнению с тем немодифицированные машины за то же время успевали выполнить лишь тест памяти. Портирование под Alpha-машины продемонстрировало, что проект можно перенести и на другие платформы. Для того чтобы LinuxBIOS заработал на 64-битных системах, пришлось немного переработать программный код – раньше он ориентировался в основном на 32-битные системы. С 2001 года пришли новые разработчики (всего их сейчас 11 человек) и продолжился перенос на другие платформы. Одна из них – это AMD Opteron. Оказалось, что все-таки некоторые процедуры лучше выполнять именно в LinuxBIOS, нежели в Linux, например, SMP-инициализацию. На примере SMP-инициализации для платформы AMD K7 SMP стало ясно, что некоторые процедуры лучше выполнять именно в LinuxBIOS, нежели в Linux. Ожидалось, что производители поддержат начинание. Но прошло четыре года развития, и вот только в на-
68
чале пятого начинает проявляться заинтересованность крупных фирм в данном проекте. Так, в 2003 г. было продано продуктов, основанных на LinuxBIOS, на сумму 30 миллионов долларов. По сравнению с 2000 г., когда продаж таких продуктов не было. Неплохое начало, не правда ли?
Аппаратные платформы LinuxBIOS работает на многих платформах. Официально поддерживаются более 50 системных плат. Многие платы похожи друг на друга и компании используют код от одной системной платы, запускают на другой. Поэтому шансы, что LinuxBIOS заработает на «неподдерживаемой» модели, достаточно высоки. Это возможно в том случае, когда системные платы собраны на одной аппаратной основе, т.е. северный и южный мосты, а также схема инициализации совпадают как для заявленной системной платы, так и для «неподдерживаемой». LinuxBIOS работает на 64- и 32-битных процессорах. Среди них: Alpha, K8, K7, PowerPC, P4, PIII, PII, Cyrix (VIA), Geode (сейчас AMD) и SC520 (AMD). Список системной логики слишком обширный, чтобы упоминать. Формфакторы: от малых систем (PC/104), до самых больших K8. Портирование под IBM PPC 970 сейчас находится в развитии.
Секреты успеха развития LinuxBIOS Исторически сложилось, что производители аппаратного обеспечения очень рьяно хранили в секрете спецификации выпускаемых процессоров, чипсетов, системных плат. Как получилось, что разработчики свободного проекта получили столь секретные сведения? Очень просто – если компании не видят выгоды, то они и не выпустят эту информацию. С другой стороны, как только появляется интерес, то развитие происходит с удивительной скоростью. Бросая беглый взгляд на сегодняшнюю ситуацию, можно сказать, что два фактора повлияли на успех – богатство выбора. Богатство выбора заключалось в разнообразии системных плат, чипсетов и процессоров. Создав прецедент, производители сами стали подтягиваться.
Успех в LANL показателен. В требованиях министерства по энергетике США (а именно оно в конечном итоге является заказчиком LinuxBIOS) для постройки 2 последних кластеров значилось – «необходимо построить на основе LinuxBIOS». Всего же на данную работу предназначалось освоить около 19 миллионов долларов. Те компании, которые не захотели участвовать в движении проекта LinuxBIOS, не смогли отреагировать на данный заказ. Те же, которые предвидели нечто подобное, были подготовлены. Предвидение в данном случае сыграло значительную роль.
Выводы LinuxBIOS прошел длинный путь за четыре года – от стадии «Это возможно» до «Сделано!». LinuxBIOS используется везде – от огромных кластеров до встраиваемых (embedded) систем, в MP3-плейерах, портативных кластерах и т. п. LinuxBIOS позволяет построить системы без громадного PC-багажа. Их можно оптимизировать под Linux и сделать еще более компактными и простыми. Для таких систем находится применение. Проект сейчас находится в своей второй стадии, LinuxBIOS V2. За четыре года 6 видов процессоров, более 50 системных плат и огромный багаж опыта. Сейчас для переноса на новую систему требуются дни, по сравнению с месяцами, как было раньше. Влияние проекта на мир вычислений только начинается! Когда готовилась эта статья, главный идеолог проекта Ron Minnich выпустил статью об использовании LinuxBIOS в разработке учебной мини-ракеты. Подробности смотрите в [3, 4]. На этой оптимистичной волне разрешите с вами распрощаться до следующего выпуска, в котором мы непосредственно займемся настройкой LinuxBIOS для аппаратной системы VIA EPIA-M.
Ссылки: 1. http://en.wikipedia.org/wiki/BIOS. 2. http://www.linuxbios.org. 3. http://www.linuxjournal.com/article/ 8120. 4. http://www.linuxjournal.com/article/ 8310.
hardware
УДАЛЕННО УПРАВЛЯЕМ BIOS SETUP
КРИС КАСПЕРСКИ Каждый из вас хотя бы раз в жизни сталкивался с необходимостью войти в BIOS Setup и слегка его «подкрутить» или починить «рухнувшую» Windows NT, Linux/FreeBSD. Традиционно эта задача решается при помощи мыши и клавиатуры, но что делать, если сервер физически недоступен?
К
омпьютеры семейства IBM PC долгое время рассматривались как недорогие рабочие станции и сервера на их основе начали строить лишь недавно. Разработчики увеличили количество процессоров, добавили поддержку коррекции памяти, отказоустойчивые дисковые массивы и прочие прелести, однако полное превращение в сервер так и не наступило. В частности, сохранилась проблема удаленного администрирования. Операционные системы семейства Windows NT поддерживают удаленный контроль лишь формально. Даже такие программы, как Remote Admin, выполняют ограниченный спектр простейших операций, и на полноценное обслуживание сервера по сети не способны. В мире UNIX дела обстоят чуть-чуть получше, но проблемы все равно есть. Вот, например, BIOS отказывается грузиться, предлагая нажать <F1> для входа в BIOS Setup или <F2> для загрузки с параметрами по умолчанию (см. рис. 1). Но сервер находится в другом конце города, да еще в помещении, ключей от которого у администратора нет. Знакомая ситуация, не правда ли? Другой вариант: после ус-
70
тановки очередного пакета обновления операционная система «умерла», стала жертвой хакерской атаки или просто зависла. Во всех этих случаях стандартные средства удаленного управления уже не работают и приходится приближаться к серверу вплотную, что достаточно затруднительно. Даже если сервер расположен на соседнем этаже, намного предпочтительнее управлять им без отрыва от своего любимого кресла, чем бегать с дискетами (лазерными дисками) туда-сюда. И это действительно можно сделать! Существуют по меньшей мере три пути, о которых я и хочу рассказать.
Удаленный контроль за BIOS Порядок загрузки BIOS в общих чертах выглядит так. Первым получает управление BOOT-block (загрузочный блок или первичный загрузчик, не путать с boot-сектором!). Он выполняет инициализацию основного оборудования (оперативная память, контроллер прерываний, системный таймер и т. д.), сканирует ISA-шину и подключает BIOS всех обнаруженных устройств (например, SCSI-контроллеров, видео-, сетевых карт и т. д.). Перед завершени-
ем своей работы BOOT-block распаковывает основной код BIOS (так называемый BIOS extensions, или вторичный загрузчик) и передает ему управление. Вторичный загрузчик сканирует PCI-шину и выполняет окончательную инициализацию оборудования – распознает IDE-диски, при необходимости выводит интерактивный редактор BIOS Setup, распределяет системные ресурсы между PnP-устройствами и, наконец, считывает boot-сектор с гибкого или жесткого диска. Таким образом, BIOS, установленные на картах расширения, получают управление на самой ранней стадии инициализации, задолго до того, как начинается подсчет контрольной суммы CMOS или распаковка вторичного загрузчика. Кстати говоря, большинство утилит «прожига» BIOS не трогают BOOT-block и даже если прожиг прошел неудачно, ISA-слоты расширения все-таки инициализируются. С PCI-слотами все обстоит намного сложнее, и в общем случае они доступны только из вторичного загрузчика (а он гибнет при неудачном прожиге). Некоторые производители, например ASUS, включают в BOOT-block специальный драйвер для работы с
hardware Все управление происхоPCI-шиной, чтобы материнсдит либо через telnet, либо кая плата могла инициализичерез веб-браузер. Как буровать видеокарту и хоть чтодет удобнее администратору. то вывести на экран, даже есНа сервере может быть устали основной код BIOS поверновлена практически любая жен. Но мне не известен ни операционная система: Winодин BIOS, BOOT-block котоdows 2000/2003 (Advanced рого мог бы работать с шиной Server, Data Center, Terminal AGP или PCI-express. Server, Standard или Enterprise Следовательно, все, что Рисунок 1. BIOS отказывается грузиться до тех пор, Edition), Novell NetWare 5.1, 6.0, нам нужно, – изготовить «фикпока не будет нажата клавиша <F1> или <F2> Red Hat Advanced Server2.1, тивную» ISA- или PCI-карту, установить на ней «свой» BIOS и имеется возможность подключать уда- Red Hat Linux 7.3/8.0, SuSE Linux Enзапрограммировать его на удален- ленный дисковод и привод CD-ROM, terprise Server V7/V8 и некоторые друное управление. Когда-то я «дораба- без которых не обходится ни одна пе- гие (см. рис. 4). Карту можно приобрести в магазитывал» древние сетевые карты (кото- реустановка системы. Это просто фанрые просто выбрасывались), превра- тастика! Всегда можно загрузиться с не или заказать по Интернету непосщая их в «пульт» удаленного управле- Live CD и посмотреть, что случилось с редственно в самой Hewlett-Packard. ния, позволяющий редактировать на- сервером и сохранить уцелевшие дан- Она обойдется в $399, которые явно стройки BIOS по локальной сети. Это ные на любой носитель, который толь- стоят того! В принципе можно найти совсем несложно сделать! Достаточно ко будет под рукой. Это усиливает бе- производителя и подешевле, но в отуметь программировать на Ассембле- зопасность системы, поскольку сер- ношении цена/функциональность этой ре и чуть-чуть разбираться в архитек- вер, оснащенный «Remote Insight», мо- карте равных нет, тем не менее она дажет вообще не иметь никаких съемных лека от идеала. Исходных текстов протуре «железа» (см. рис. 2). шивки нам никто не даст, и дорабоВпрочем, корпеть над отладчиком носителей! Кстати, о безопасности. Remote In- тать «напильником» под свои конкретсовсем необязательно, все можно купить и готовое. Такие платы (они назы- sight поддерживает SSL и 128-битное ные нужны ее не удастся (теоретичесваются Remote Boards) выпускает мно- шифрование, что позволяет ему фун- ки это возможно, но очень затруднижество фирм. Обычно они представ- кционировать даже на незащищенных тельно). К тому же качество реализаляют из себя стандартную VGA-кар- каналах (а других каналов в распоря- ции протоколов шифрования находитту с интегрированным COM-портом, к жении рядового администратора за- ся под большим вопросом. Возможно, в карте присутствуют отладочные люкоторому подключается внешний мо- частую просто не оказывается). ки или переполняющиеся будем. В некоторых моделях феры, которые позволят атаимеется Ethernet-порт. Его кующему захватить штурвал можно воткнуть в DSL-модем управления в свои руки ( см. или соединить со Switch. Черис. 5)! рез эти порты передается коЭтих недостатков лишепия экрана на удаленный мона PC Weasel 2000 от однонитор и принимаются команименной компании. Вместе с ды от клавиатуры, в результасамой платой покупатель поте чего IBM PC превращается лучает полный исходный код в самый настоящий «мейнпрошивки и лицензию на прафрейм» и физического дово его изменения. Это все та ступа к нему уже не требуетРисунок 2. Удаленное редактирование настроек BIOS Setup же самая VGA-плата, только ся (см. рис. 3)! по терминалу — это реальность! вместо Ethernet-порта на ней Большой популярностью находится контроллер UART пользуется модель Remote In(он же стандартный COMsight от Hewlett-Packard, котопорт типа 16550). К сожалерая вставляется в PCI-слот и нию, ее функциональность науправляется через 10/100 Мбит много беднее. ПоддерживаEthernet-порту. Она поддеются только текстовые видерживает как текстовые, так и орежимы и отсутствуют удаграфические режимы (вплоть ленные приводы, правда, содо 1280х1024/256 цветов), пихраняется возможность «натается от внешнего источнижать» серверу на «Reset» или ка, что позволяет ей «нажипосмотреть POST-коды, чтомать» на кнопки «Power» и бы сразу оценить масштабы «Reset». В дополнение к уданеисправности (см. рис. 6). ленной мыши и клавиатуре Рисунок 3. Удаленная настройка дисков
№7, июль 2005
71
hardware
Рисунок 4. Плата удаленного управления Remote Insight от Hewlett-Packard
Рисунок 5. Еще одна плата удаленного управления – PC Weasel 2000
Рисунок 6. Инженерное меню, высвечиваемое PC Weasel 2000
ISA-вариант обойдется вам в $250, а PCI – во все $350. Не слишком ли большая цена за открытую лицензию при урезанной функциональности? Не торопитесь с выводами. Исходные тексты – великая штука! Можно купить одну плату и установить ее на неограниченном количестве машин. Клонировать аппаратное обеспечение нам не понадобится. Если слегка переделать прошивку можно обойтись и стандартными компонентами, но об этом – чуть позже. Сначала познакомимся с диаметрально противоположным классом устройств удаленного управления, среди которых, возможно, притаилось устройство вашей мечты (см. рис. 7).
KVM, или Удаленный контроль продолжается Главный недостаток VGA-плат с модифицированным BIOS состоит в том, что они требуют вскрытия корпуса сервера, что не всегда желательно. К тому же техника перехвата изображения и эмуляция клавиатурного ввода далека от идеала и чрезвычайно конфликтна. KVM-коммутаторы исповедуют совер-
72
шенно иной подход. Свое название они получили по трем первым буквам: Keyboard, Video-monitor и Mouse. Коммутатор представляет собой автономное устройство, подключаемое к компьютеру через стандартные PS/2 и DB-15 VGA-коннекторы. Их сигнал преобразуется в цифровой поток и передается на соседний KVM-терминал, подключенный к удаленному компьютеру. Грубо говоря, мы как бы подключаем клавиатуру, мышь и монитор очень длинными кабелями (см. рис. 8). Можно настраивать BIOS Setup или рассматривать Windows, свалившуюся в синий экран, но ни удаленных дисководов, ни даже возможности нажать на Reset у нас нет, то есть иллюзия полного физического доступа оказывается не такой уж и полной. Зато поддерживаются практически все видеорежимы и в код BIOS не вносится никаких изменений, а в критических инфраструктурах это очень актуально. Внедрять посторонний эмулятор в банковский компьютер нам попросту не дадут, поскольку эта технология не сертифицирована, а вот у KVM-коммутаторов все необходимые сертификаты, как правило, имеются (см. рис. 9). Подавляющее большинство моделей рассчитано на управление несколькими серверами с одного терминала, при этом сигнал пускается по экранированной витой паре с максимальной длиной в несколько сотен метров. Это совсем не Ethernet и в сетевой концентратор его вставлять нельзя! Для реального удаленного управления по Интернету или модему нам потребуется установить дополнительный компьютер, принимающий KVM-сигнал и с помощью специального программного обеспечения ретранслирующий его в «удобоваримую» сетевую форму. А это нехорошо! К счастью, некоторые модели поддерживают работу по модему или локальной сети. Такой тип KVM-коммутаторов называется «over IP», хотя здесь не обходится без вариаций. Просто загляните в спецификацию: если там встретится чтото похожее на LAN или Dial-Up, это то, что нам нужно (рис. 10)! Довольно хорошо зарекомендовала себя фирма Minicom, в ассортименте которой можно обнаружить по меньшей мере две подходящие модели – Phantom Dial-Up Remote Access и
Smart IP Extender Switch Over IP. Первая стоит в районе $800, вторая… – $3500. Для банков и прочих денежных учреждений такая сумма, может быть, и подойдет, но вот для мелкой конторы – навряд ли. Кончено, порывшись в магазинах, можно найти KVM-коммутатор и подешевле, но лучше собрать систему удаленного управления самостоятельно.
Как это работает, или Удаленный контроль своими руками! Для создания собственной системы удаленного управления нам понадобится любая PCI-карта и материнская плата, поддерживающая работу с PCIшиной через BOOT-block (например, ASUS). На борту карты обязательно должна присутствовать «кроватка» с BIOS. На худой конец BIOS может находиться в отдельной микросхеме, которую несложно выпаять с платы и воткнуть в программатор. К сожалению, сетевые карты с «внешним» BIOS выходят из употребления и найти их становится все сложнее и сложнее. Современные Ethernet-контроллеры интегрируют BIOS в микросхему чиспета, и мы уже не можем ничего с ним сделать (только не перепутайте BIOS с панельной для Boot-ROM, это совсем не одно и то же!). Вот и приходится пересаживаться на SCSI-контроллеры, цены на которые упали до 10$-14$. Разумеется, речь идет о простейших моделях, но
Рисунок 7. Плата удаленного управления типа eRIC enhanced Remote Management Card
Рисунок 8. KVM-коммутатор за работой
hardware грабить весь вывод на экран и ведь нам ничего, кроме BIOS, не передавать его на удаленный нужно! Поэтому, даже дешевая компьютер («грабить» – вполне модель будет работать ничуть легальный термин, позаимствоне хуже дорогой. Заботиться о ванный у англоязычных инженесохранении работоспособносров, которые говорят в этом слути контроллера не обязательчае «grab», звучит грубовато, зано. Намного проще переписать то почестному). BIOS с чистого листа, чем доРазумеется, без сложностей бавлять свои собственные модуздесь не обходится. Поскольку в ли в уже существующий (однапроцессе инициализации BIOS ко при желании это можно сдевектора прерывания могут пелать) (см. рис. 11). реустанавливаться многократДополнительный UART-конно, одной лишь модификации троллер приобретать не нужно. таблицы прерываний (т.е. класЛучше воспользоваться тем, что сического способа перехвата) встроен в материнскую плату, Рисунок 9. Схема подключения KVM-коммутатора будет явно недостаточно. Да, а при желании можно задейсдля удаленного управления через Интернет мы можем изменить far-указатвовать еще и интегрированили по модемному соединению тель по адресу: 0000h:10h*size ный Ethernet или любое другое of(DWORD) == 0000h:0040h,пе средство коммуникации. ренаправив его на свой собсРазработка прошивок обычтвенный обработчик, но… чено ведется на Ассемблере, но рез некоторое время контроль при желании можно использоза INT 10h будет утерян. Чтобы вать и высокоуровневые языки этого избежать, необходимо устипа Си/Си++. Только ни в коем Рисунок 10. Внешний вид некоторых KVM-коммутаторов тановить аппаратную точку осслучае не используйте стандартанова на запись этой ячейки тные библиотеки ввода/вывопамяти. В этом нам помогут отда и прикажите линкеру отклюладочные регистры семейства чить Start-Up. Для этого достаDRx. Регистры Dr0-Dr3 хранят точно переименовать функцию линейный физический адрес main в нечто вроде MyMain. Посточки останова, а Dr7 опредекольку Си не поддерживает баРисунок 11. SCSI-контролер с несъемным BIOS (слева), он нам не подходит. Справа SCSI-контроллер со съемным ляет условия, при которых она зирования, откомпилированный BIOS, который легким движением руки превращается срабатывает, заставляя прокод должен быть полностью пев плату удаленного управления цессор генерировать прерываремещаем (то есть выполняться независимо от базового адреса за- ние должно быть инициализировано ние INT 01h, на котором должен нахогрузки в память). Этого можно добить- вручную. В частности, интегрирован- диться наш обработчик, выполняющий ся, отказавшись от глобальных пере- ный COM-порт еще не имеет ни базо- повторную «экспроприацию» INT 10h менных и выключив все опции ком- вого адреса, ни IRQ, ведь PnP-менед- у системы. Пример работы с отладочными репилятора, которые могут генериро- жер, распределяющий системные ревать неперемещаемый код, о котором сурсы, еще не получил управления! гистрами приведен ниже. мы даже не подозреваем (например, Приходится открывать документацию Листинг 1. Перехватчик передает контроль «срыва» стека). Если вы не на южный мост чипсета и программиуправление нашему коду в момент уверены, что хорошо знаете «задний ровать все железо с нуля. Это самый загрузки Boot-сектора двор» компилятора, – не используйте низкий уровень «общения» с аппара; перехватываем INT 01h его! Программируйте на Ассемблере. турой! Необычайно сложный, но в то MOV ax, CS XOR bx,bx же время захватывающе интересный! Он не подведет! MOV DS,bx Код прошивки исполняется в 16- К счастью, серверный мост уже час; смещение нашего обработчика MOV [bx], offset our _ vx _ code разрядном сегменте реального режи- тично инициализирован, поэтому на; относительно сегмента 0000h ма, однако никто не запрещает нам пе- страивать контроллер памяти не обяMOV [bx+2],bx MOV DS, ax реходить в защищенный режим и вы- зательно. Теперь поговорим о методиках эмуходить оттуда, правда, не совсем по; устанавливаем точку останова ; на исполнение нятно, зачем это нужно. Использовать ляции и перехвата. Для вывода инMOV eax,302h служебные функции BIOS недопусти- формации на экран BIOS использует ; линейный физический адрес ; точки останова мо, поскольку часть аппаратуры еще свою собственную сервисную службу MOV ebx,7С00h не инициирована, да и сам BIOS еще INT 10h. Она же используется на ста; Заносим значения в отладочные не распакован. Работайте только че- дии первичной загрузки операционных ; регистры рез порты ввода/вывода, однако пе- систем семейства Windows и UNIX. ПеMOV dr7,eax mov dr0,ebx ред этим не забудьте, что оборудова- рехватив это прерывание, мы сможем
№7, июль 2005
73
hardware Прерывание INT 10h поддерживает свыше сотни различных функций, номер которых передается в регистре AH. В частности, 02h управляет курсором, а 09h печатает символ. Естественно, чтобы грабить вывод на экран, необходимо уметь отличать одну функцию от другой и знать, чем именно каждая из них занимается. Описание функций можно найти либо в технической документации на конкретную видеокарту (а если карта встроена в материнскую плату, то в документации на серверный мост чипсета), либо в знаменитом Interrupt List Ральфа Брауна, правда, он уже давно не обновлялся и сильно устарел. Последняя версия датируется летом 2000 года. С тех пор вышло множество новых карт! Впрочем, базовые видео-функции не претерпели никаких изменений, и если отбросить нестандартные видеорежимы, все будет работать на ура. Текстовые режимы грабятся просто замечательно, а вот графические в пропускную способность аналоговых модемов уже не вмещаются, и передаваемую информацию приходится както сжимать. Самое простое – передавать только изменения, предварительно упаковав их по gzip-алгоритму, для работы с которым существует множество готовых библиотек. Правда, с переходом операционной системы в защищенный режим, весь наш перехват будет «подавлен», и удаленный компьютер отобразит унылый застывший экран. В принципе с этим можно и смириться. Главное, что нам подконтролен BIOS Setup и начальная стадия загрузки оси, а там можно и стандартным telnet воспользоваться, если, конечно, на середине загрузки Windows не выбросит синий экран. В своих первых моделях систем удаленного управления я поступал так: отслеживал попытку перехода в защищенный режим (а отследить ее можно с помощью все тех же отладочных регистров), переходил в защищенный режим сам, устанавливал свои обработчики прерывания и отдавал управление операционной системе, не позволяя ей ничего менять. Это работало! Хотя и сбоило тоже. Универсального перехватчика создать не получилось, и пришлось учитывать особенности реализации всех операционных систем. В конце концов я махнул рукой и написал
74
обыкновенный драйвер-фильтр, работающий, как VGA-miniport, и пересылающий экранный вывод на «нашу» карту расширения (рис. 12).
Рисунок 12. Принцип работы платы удаленного управления
Некоторые системы удаленного контроля (например, уже упомянутый комплекс PC Weasel 2000) вместо перехвата INT 10h просто грабят видеобуфер, что на первый взгляд существенно упрощает реализацию. Не нужно возиться с отладочными регистрами, рыться в Interrupt List и т. д. На самом деле даже в текстовом режиме имеется множество экранных страниц, а уж про графический мы вообще молчим! Причем совершенно неясно, как синхронизовать экранный вывод с его перехватом. Сканировать видеопамять с частой 50-60 Гц вполне реально, но вот запихать награбленные данные в модемный канал получится едва ли. А как это дело будет тормозить! Неудивительно, что PC Weasel 2000 работает только с текстовыми режимами! Теперь перейдем к эмуляции ввода с клавиатуры. Мышь рассматривать не будем, поскольку нормальные администраторы свободно обходятся и без нее. Весь клавиатурный сервис сосредоточен в прерывании INT 16h, которое мы должны перехватить. Когда программа (и в частности, BIOS Setup) ожидает нажатия на клавишу, она обнуляет регистр AH и вызывает INT 16h. Конечно, существуют и другие варианты, но этот – самый популярный. В этом случае наш обработчик прерывания должен поместить ASCII-код символа, нажатого на удаленной клавиатуре, в регистр AL и возвратить управление. Естественно, все это будет работать только до перехода операционной системы в защищенный режим, а по-
сле – придется подгружать свой драйвер, «садящийся» поверх стандартного клавиатурного драйвера и эмулирующего ввод. Удаленные диски реализуются совсем тривиально. За это отвечает прерывание INT 13h. Функция 02h обеспечивает чтение сектора, 03h – его запись. Номер сектора передается в регистрах CX и DX в CHS-формате. Удаленный CD-ROM реализуется чуть-чуть сложнее. Если вы не сильны в системном программировании, на первых порах лучше ограничиться виртуальными дискетами. Между прочим, использовать физические дискеты совсем не обязательно – удаленная машина может работать с их образом, записанным на жестком диске в виде файла. Для удаленной переустановки Windows NT этот прием вполне подходит. А смену виртуальных дискет автоматизировать совсем нетрудно. В результате мы получим довольно могучий комплекс удаленного управления, и самое главное – очень дешевый. Конечно, наше время тоже что-то стоит (а времени на разработку и пуско-наладку уйдет много), но если такие комплексы изготавливать под заказ, они быстро себя окупят, тем более что на них наблюдается устойчивый спрос, ведь западные аналоги большинству просто не по карману. Для завершения картины остается сущая мелочь – удаленный Reset, без которого наше творение будет неполноценно. Ну тут все просто. Достаточно подключить к LPT-порту реле, ведущее к «заветной» кнопке, и проблема будет решена. Из прошивки SCSI-контроллера мы можем управлять LPT-портом, конечно, не забыв, что перед этим его нужно инициализировать. Один маленький трюк напоследок. Если полноценная система удаленного управления вам не нужна и всего лишь требуется запретить BIOS требовать нажатия на клавишу при загрузке, то без дополнительного оборудования легко обойтись. Достаточно загрузить прошивку основного BIOS в дизассемблер и найти все «ругательные» сообщения. Перекрестные ссылки приведут нас к машинному коду, который эти строки и выводит. Там же будет код, ожидающий нажатия на клавишу, который мы должны удалить. Прямой вызов INT 16h используется редко.
администрирование Скорее всего, мы увидим что-то вроде CALL xxx, где xxx – адрес функцииобертки. Для достижения задуманного мы должны заменить CALL xxx на «MOV AX,scan-code», указав скэн-код требуемой клавиши. Например, клавиша <F2> в большинстве BIOS означает «загрузку с настройками по умолчанию», однако в некоторых случаях может потребоваться нажать <Enter> или <Esc>. Проблема в том, что основной образ BIOS упакован и защищен контрольными суммами. Практически все разработчики BIOS распространяют утилиты для распаковки/упаковки и пересчета контрольных сумм, однако никакой гарантии, что модифицированный BIOS будет исправно работать, у нас нет. Ошибки могут появляться в самых неожиданных местах. Работа системы становится нестабильной, материнская плата без всяких видимых причин начинает зависать и т. д. Разумеется, для серверов это неприемлемо, поэтому приходится идти другим путем. Вместо того чтобы модифицировать упакованный образ основного кода BIOS, мы возьмем неупакованный BOOT-block и добавим в него автоматический патчер, правящий нужные байты прямо в памяти, когда распаковка уже завершена. Поскольку основной код BIOS распаковывается в RAM, ни-
hardware
каких проблем с его исправлением не возникает. Главное – определить нужные адреса. В этом нам поможет тот факт, что сам BIOS свой образ не затирает и в момент загрузки boot-сектора он присутствует в памяти. Достаточно написать крошечную ассемблерную программу, считывающую первые 640 Кб нижней памяти и записывающую их на гибкий диск, а затем внедрить ее в boot-сектор. После перезагрузки системы мы станем обладателями распакованного BIOS, лежащего по своим «родным» адресам. Остается только прожечь обновленный BOOT-block и можно наслаждаться бесперебойной работой сервера!
Заключение Полноценный удаленный контроль за системой – это реальность! Ассортимент возможных решений необычайно широк: от готовых (и весьма дорогостоящих!) KVM-устройств до более дешевых, но вместе с тем и более функциональных (!) плат расширения, которые большинство программистов легко изготовят самостоятельно. Физический доступ к серверу будет требоваться только при его ремонте (здесь без него никак не обойтись, ведь плоскогубцы с отверткой по модему не передашь), однако фатальные отказы происходят не так уж и часто.
Ссылки: 1. Remote Insight «Lights Out» boards – обзор систем удаленного управления (на англ.): http://www.paul.sladen.org/lights-out/riloe.html; 2. Remote Insight Lights-Out Edition II – описание платы удаленного управления от Hewlett-Packard с возможностью заказа по Интернету (на англ.): http://h18004.www1.hp.com/ products/servers/management/riloe2/ server-slot-matrix.html; 3. PC Weasel 2000 – описание альтернативной платы удаленного управления, микрокод, который распространяется по открытой лицензии (на англ.): http://www.realweasel. com/intro.html; 4. Технические характеристики огромного количества систем удаленного управления (преимущественно KVM-коммутаторов, на англ.): http://www.kvms.com;
№7, июль 2005
5. Raritan IP-Reach TR364 – описание KVM-коммутатора TR364 (на англ.): http://www.42u.com/telereach_bk.htm; 6. Архитектура ввода-вывода персональных ЭВМ IBM PC – электронная версия книги, посвященной устройству IBM PC, которую настоятельно рекомендуется прочитать перед разработкой собственной системы удаленного управления (на русском языке): http:// redlib.narod.ru/asmdocs/asm_doc_ 07.zip; 7. Ralf Brown Interrupt List – электронный справочник по всем прерываниям, портам ввода/вывода, «волшебным» адресам памяти, включая нестандартные расширения и недокументированные возможности (на англ.): http://www.ctyme.com/ rbrown.htm.
75
75
программирование
РАЗРАБАТЫВАЕМ ИНФОРМАЦИОННЫЕ СИСТЕМЫ НА PHP МЕТОДОМ ВИЗУАЛЬНОГО ПРОГРАММИРОВАНИЯ
Если вы часто создаете веб-приложения на языке PHP, вам приходится выбирать средства разработки под свои задачи. Некоторых устраивает Блокнот, другие предпочитают Zend Studio или Macromedia Dreamweaver. Мы предлагаем вам инструмент, позволяющий в ряде случаев строить PHP-код целых информационных систем в автоматическом режиме.
ЕВГЕНИЙ ВОЯКИН Как построить информационную систему Ни для кого не секрет, что в последнее время автоматизированные информационные системы (ИС) стали сердцем многих бизнес-процессов предприятий и основой общедоступных сетевых сервисов. Как известно, в большинстве информационных систем данные хранятся в БД. Одновременный доступ к ИС нескольких пользователей реализуется с помощью специализированного программного обеспечения, ориентированного на работу в сети. Чтобы поддержать такое взаимодействие, программное обеспечение должно располагаться на обеих сторонах сети – на сервере и на компьютере клиента. Безусловно, такой подход имеет недостаток: помимо однократной установки ПО на сервер подключение каждого нового клиентского компьютера подразумевает уста-
76
новку клиентских программ и на него. Поэтому в последнее время у разработчиков все четче заметно стремление перенести максимально возможную часть специализированного программного обеспечения с клиентских рабочих станций на серверы. Такой подход позволит вам использовать менее сложные компьютеры с минимальным набором программного обеспечения в качестве клиентских. А это в свою очередь означает снижение затрат на аппаратную составляющую системы. При этом разработчики все чаще основываются на использовании веб-технологий для доступа к информационным системам. В архитектуре системы между клиентским программным обеспечением и серверной СУБД появляется дополнительный уровень, который можно назвать уровнем веб-транспорта. На стороне сервера он представлен веб-сервером с
модулями функционального расширения, на клиентской – веб-браузером в качестве универсального клиентского программного обеспечения. Этот уровень реализует возможность информационного обмена в сети.
Какой инструмент выбрать разработчику Учитывая эти тенденции, многие фирмы направляют свои усилия на развитие и совершенствование технологий и инструментария в области веб-программирования. Примерами могут служить технологии от Microsoft, под которые созданы мощные средства разработки (к примеру, Interdev), среда Zend Studio, созданная разработчиками языка PHP (см. [1]). Познакомившись с этими пакетами и осознав, насколько отличаются их функциональные возможности, у меня сложилось ощущение некой ограниченности в средствах
программирование доброй части программистов, пишущих на PHP. Действительно, предлагаемая компанией Microsoft среда Interdev содержит всё необходимое для построения динамических веб-страниц, поддерживает визуальное программирование интерфейса, параметры оформления документов и работу с базами данных. В то же время почти все представленные на рынке средства разработки на языке PHP, включая даже достаточно мощную среду Zend Studio, представляют собой лишь развитые текстовые редакторы, ориентированные на работу с текстами на языках программирования. Тем не менее, именно язык PHP, СУБД MySQL или PostgreSQL, как показывает практика, наиболее часто выбираются нами при разработке целого ряда информационных систем, особенно на *nix-платформах. Эти средства обоснованно заслужили популярность своей простотой и, одновременно с этим мощностью и надежностью. Кроме того, они доступны бесплатно, что немаловажно для многих разработчиков. С моей точки зрения, современные инструменты разработки на PHP должны предоставлять следующие возможности: ! максимальная автоматизация разработки веб-документов; ! комплексная поддержка разработки приложений, ориентированных на работу с базами данных, возможно, с поддержкой создания самих баз данных; ! поддержка визуальной методики программирования (как у «больших братьев» – Delphi, C Builder). Частичное решение этих задач в той или иной мере успешно достигалось различными разработчиками средств программирования, но полного комплексного решения этих задач в едином инструменте мне до сих пор не встречалось. Имея определенный опыт разработки информационных систем, я опишу некоторые методы, которые позволят перенести технологию визуальной разработки в область программирования на языке PHP. Объединение этих методов и алгоритмов по работе с информацией в базе данных позволило мне создать интегрированную ви-
№7, июль 2005
зуальную среду программирования. Эта среда дает возможность разрабатывать интерфейсы доступа к базам данных посредством веб-технологий и в ряде случаев комплексно автоматизирует создание ИС в целом.
Что следует автоматизировать Разработка любой информационной системы не является простой задачей. Вне зависимости от того, какую информационную систему бы вы ни проектировали, будьте готовы столкнуться с некоторыми «классическими» этапами разработки, а именно вам придется: ! спроектировать базу данных (а перед этим будет изучение предметной области, построение ее модели, разработка логической, а затем физической модели данных в средствах той или иной СУБД, нормализация базы и т. д.); ! запрограммировать базу данных непосредственно в СУБД; ! выбрать, как пользователи будут получать доступ к данным – то есть спроектировать интерфейсы (определить их количество и функциональные требования к ним, выбрать средства и инструменты программирования, разработать алгоритмы); ! осуществить программирование интерфейсов; ! отладить ИС в целом. Нетрудно заметить, что данная работа потребует от вас значительных знаний в как минимум трех областях – программирования, проектирования баз данных и знания веб-технологий. Безусловно, если вы гуру в SQL и постоянно занимаетесь разработками в данной сфере, решение этих задач не составит труда. Однако для начинающего программиста, сталкивающегося с такой задачей время от времени, ее решение займет много времени. Как я заметил ранее, почти все призванные помочь разработчику в данной ситуации средства программирования на языке PHP по сути представляют собой лишь развитые текстовые редакторы, поддерживающие работу с текстами на языках программирования. Исключением, пожалуй, может являться только Macromedia
Dreamweaver, позволяющий осуществлять визуальную разработку вебформ и поддерживающий подключение к MySQL. Технология визуального программирования даст вам возможность существенно сократить время создания программного модуля. Представьте любой веб-интерфейс к базе данных в некой информационной системе. При традиционном написании кода с увеличением числа элементов в веб-форме время, затраченное вами на создание такой страницы, будет возрастать не линейно, а более стремительными темпами. Это объясняется тем, что для реализации тех или иных особенностей вам потребуется вводить все больше переменных, циклов, ветвлений. Станет сложнее отслеживать синтаксис и логику сценария. Кроме того, при этом возрастет и сложность базы данных – наличие большого числа интерфейсных элементов означает существование соответствующего числа полей таблиц для хранения значений. Применение визуальной интегрированной среды может снять с вас все эти трудности. В идеале время должно затрачиваться лишь на определение связи интерфейсного элемента вебформы с теми или иными данными в базе. Остальные задачи – включение в код сценария тегов HTML, реализующих элемент, функций, осуществляющих запросы к базе данных для отображения значений в элементе, разработка структуры базы данных, процедуры верификации и во многом отладки создаваемого программного кода – должны выполняться для вас средой.
«Визуализируем» программирование Как перенести концепцию визуального программирования в, казалось бы, изначально «невизуальную» область? Ведь по своей сути PHP не является языком программирования широкого назначения и не позволяет строить пользовательские интерфейсы. Но в нашем случае от него это и не требуется. Как известно, основу для интерактивного взаимодействия посредством веб-технологий содержит сам язык HTML, позволяющий строить вебформы. Следовательно, «визуализировав» работу с интерфейсными элементами формы и разработав систе-
77
программирование му взаимосвязи этих элементов с базой данных посредством языка PHP, мы получим методику визуального программирования на PHP в области разработки веб-интерфейсов для информационных систем. Можно сказать, что данный подход создает достаточный фундамент для существенной автоматизации процесса разработки. Замечу, что этот метод, разумеется, не автоматизирует разработку любых сценариев на PHP полностью, но он позволяет строить целый класс приложений на PHP (в частности – веб-интерфейсов к БД), вообще не сталкиваясь с кодом сценария на языке PHP. Для многих других приложений (отображающих информацию из баз данных или содержащих вебформы) применение данного метода позволит снять с разработчика большую часть работы по рутинному написанию кода приложения на языке PHP и тегов HTML.
Среда визуальной разработки Не найдя «идеальной» среды под свои задачи, я решил опробовать данный подход на практике и создать инструмент визуального программирования на языке PHP самостоятельно. При создании своей среды, получившей условное название «Синбад» (от «Сетевой ИНтерфейс к БАзе Данных»), я не ставил задачи получить полностью универсальное средство программирования на PHP. Действительно, сложно разработать инструмент, более полно использующий средства языка, нежели Zend Studio, созданный разработчиками PHP. Но обладая меньшими функциональными возможностями в области работы с веб-формами и базами данных, «Синбад» существенно превосходит Zend Studio: он позволяет реализовать методику визуального программирования и осуществляет комплексную разработку компонентов информационной системы. При этом среда не ограничит вас только возможностью разработки интерфейсов. В конечном итоге применение среды позволяет задействовать для реализации целого ряда задач программистов существенно менее высокой квалификации, нежели могло бы потребоваться при тради-
78
ционной процедуре разработки приложений. «Мощность», или степень, до которой данная среда позволит вам автоматизировать процесс разработки вебприложений на PHP, вполне сопоставима с той, до которой позволяет автоматизировать разработку обычных приложений хорошо известные среды Borland Delphi и C Builder, а в некоторых случаях и превосходит их. Так, при использовании Синбада для построения интерфейсов к БД результатом работы программы может быть полностью функционально готовый интерфейс, полученный абсолютно без применения ручного написания кода. В продуктах Borland визуальное программирование позволяет лишь построить пользовательский интерфейс – окно приложения. Любую смысловую связку интерфейсных элементов окна вам придется осуществлять вручную. Разработка программы осуществлена на Delphi, Синбад рассчитан на выполнение под управлением операционной системы Microsoft Windows. Работоспособность программы проверена в версиях 98, 2000 Professional, XP Pro, XP Home.
Работа с новым инструментом Работа в среде предусматривает редактирование проектов. Каждый проект предполагает работу со своей БД и имеет ряд настроек – название, каталог, в котором хранятся файлы проекта, нацеленность на различные операционные системы (кодировки символов Windows-1251, koi-8r, символы переноса строки #13#10 или #10). Также задаются параметры для подключения к базе данных: ее тип, имя, логин, пароль, имя сервера и т. п. Проект состоит из одной или нескольких страниц, работающих с единой базой данных. Каждая из страниц может выполнять одно действие по манипуляции с данными, определяемое назначением страницы. В свойствах проекта можно также определить единые для всех страниц проекта шаблоны заголовков и концевиков страниц, в которых возможно задание параметров оформления. Пользовательский интерфейс (см. рис. 1) программы представляет собой окно, состоящее из двух закладок –
«Мастерская» и «Редактор». В верхней части расположено меню, содержащее вызов основных операций, которые могут потребоваться при разработке приложений. Закладка «Мастерская» предназначена для визуальной разработки PHP-приложения. Панель инструментов включает восемь кнопок для быстрого доступа к пунктам меню: создать, открыть и сохранить страницу проекта, вызов свойств страницы, свойств элемента, удаление элемента, вызов окна базы данных и преобразование, или, по аналогии с другими визуальными средами разработки, «компиляция» страницы в PHP-код. Палитра компонентов состоит из набора некоторых, наиболее часто используемых элементов языка HTML (параграфы, ссылки, списки и т. п.) и интерфейсных элементов для построения веб-форм. Рабочее поле программы служит для визуального построения страницы. На это поле из палитры с помощью мыши могут быть перенесены те или иные элементы в соответствии с вашими задачами. Нажатие на элемент правой кнопкой мыши открывает его контекстное меню. Таким образом, при построении страницы вы сталкиваетесь не с ручным вводом тегов языка HTML, а с «визуализованными» элементами, имеющими такой же внешний вид, какой они приобретут при отображении страницы в браузере, что значительно нагляднее. Определять свойства элементов страницы вы можете с помощью набора окон, позволяющих задать имя элемента и его исходное состояние, закрепить связь с базой данных и т.п. К примеру, вид окна, управляющего списками выбора, представлен на рис. 2. В качестве примера представлены свойства элемента place. Как видите, элемент имеет вид строки с выпадающим списком (размер равен 1). Для списка задано наполнение исходными данными из таблицы place: используются столбец id (для значений элементов списка) и caption (для текстовых меток). При выборе имеется возможность определить условие отбора строк – в данном случае для наполнения списка используются все строки с id>10. Преобразование элемента, имею-
программирование
Рисунок 1. Пользовательский интерфейс среды «Синбад». Режим построения формы
щего эти свойства, в PHP-код приведет к формированию следующего фрагмента кода (для СУБД MySQL): <SELECT NAME="place» SIZE="1"> <?php $rz = mysql _ query("select id, ↵ caption from place ↵ where id>10 order by 1;"); while ($row = ↵ mysql _ fetch _ row($rz)) { print ("<OPTION VALUE=$row[0]> ↵ $row[1]</OPTION>\n"); } ?> </SELECT>
Нижняя часть окна позволяет определить связь с базой данных. В данном случае выбор строки списка, сделанный будущим пользователем этой страницы, повлияет на значения столбца place_id таблицы events. Возможности визуального построения сценариев не ограничиваются только элементами веб-форм. Для элементов палитры HTML-тегов окна свойств в первую очередь позволяют определить параметры отображения в браузере или предоставляют наглядный интерфейс для определения тега (например, для параграфов текста). При построении кода страницы на языке PHP результат помещается в редактор кода для проверки и корректировки. Этот редактор (см. рис. 3) содержит в свою очередь четыре закладки для работы с текстами. Первые две предназначены для редактирования основного (с формой) и подчиненного (вызываемого из формы) сценариев, образующих страницу. В окно третьей помещается текст дампа базы данных, а последняя предназначена для работы в интерфейсе среды с любыми файлами по усмотрению пользователя.
№7, июль 2005
Рисунок 2. Это окно позволит вам управлять свойствами списков выбора
Панель инструментов редактора содержит кнопки, позволяющие вам открыть файл в редакторе или сохранить редактируемый файл, работать с буфером обмена, редактором шаблонов. Для ввода тегов языка HTML редактор имеет дополнительную панель с кнопками (на рис. 4, в левой части окна), нажатие на которые приводит к вставке HTML-тега в позицию курсора. Среда предоставляет возможность создавать свои шаблоны кода, имеет систему предиктивного набора идентификаторов. Список последней системы вы можете изменить по своему усмотрению. Процедура построения файлов на языке PHP, которую по аналогии с другими средами визуального программирования можно назвать компиляцией, запускается по окончании пользователем проектирования интерфейса. Вы можете запускать эту процедуру всякий раз, когда хотите проверить целостность проекта и правильную связанность интерфейсных элементов с теми или иными полями базы данных. В результате компиляции вы получите готовый программный код на языке PHP и требуемые теги HTML, отображающие всю страницу в целом в соответствии с ее функциональным назначением. Для генерируемого кода определяются следующие требования. Код должен: ! отображать все элементы страницы в таком же порядке, как они были расположены вами на рабочем поле среды при проектировании;
! выполнять все необходимые опе-
рации, связанные с элементом: наполнение исходными данными, выбор исходного значения и т. п. – для сценария с формой; манипуляция с определенными пользователем данными в базе данных – для вызываемого сценария.
Среда начинает построение сценариев с файла, в котором будет находиться веб-форма. Прежде всего в текст будущего сценария включаем шаблон заголовка, позволяющий определить единые для всех сценариев параметры оформления. Далее определяем взаимное расположение друг относительно друга интерфейсных элементов и элементов, относящихся к языку HTML. Для этого используется специально разработанный алгоритм. При обработке элементов вебформ для них осуществляется генерация кода на языке PHP, отображающего элемент в браузере, а также кода, реализующего связанные с элементом операции по наполнению его исходными данными и т. п. Для объектов языка HTML генерируем текст тега в соответствии с заданными параметрами. При компиляции кода элемента Синбад проверяет, достаточно ли задано для этого данных. Если при обработке в свойствах встретится ссылка на поле несуществующей таблицы или на несуществующее поле (например, таблица или поле были переименованы после определения связи элемента с ними), преобразование приостановится. Вы получите соответствующее уведомление с указанием элемента, а также поля или таблицы, которые не были обнаружены.
79
программирование
Рисунок 3. Пользовательский интерфейс среды «Синбад». Режим редактора кода
Рисунок 4. Так выглядит спроектированная страница в окне браузера
2) Применение максимально простых дополнен параметрами оформления с По окончании обработки всех элешаблонов кода, упрощающее пони- помощью стилей и т.п. ментов генерация главного сценария Именно в силу этих особенностей мание технологии создания странизавершается включением в него текцы разработчиком и облегчающее (и мой опыт практического применеста шаблона концевика файла. ния Синбада подтверждает это) рабодальнейшую их модификацию; Генерация вызываемого сценария 3) Использование строго ограничен- та с программой значительно ускоряпроисходит по похожей схеме. Основного набора функций на языке PHP ет разработку интерфейсов к инфорным отличием от описанного механиздля работы с базами данных. Име- мационным системам в целом. ма является то, что в тело подчиненного на функций хранятся во внешних сценария встраивается операция по матекстовых файлах, редактирова- Доступ к данным нипуляции данными непосредственно в ние которых позволит вам работать Для проектирования базы данных БД. В случае, когда назначением страв среде с практически любой СУБД, Синбад требует наличия в операционницы является ввод данных, среда проподдерживаемой языком PHP. верит, достаточно ли информации для ной системе подключения к СУБД чедобавления новой записи в таблицу. Есрез источник ODBC с именем Sinbad. Первый критерий, как может снача- Следует отметить, что вы должны соли с каким-либо полем записи не связано элемента, то это поле, в зависимости ла показаться, идет в ущерб функци- здать такой источник в операционной от типа, заполняется либо нулем, либо ональным качествам и возможностям системе до начала работы с програмпустой строкой. При этом вам также вы- среды. Однако эта особенность вклю- мой. Среда имеет интерфейс для ручводится соответствующее предупреж- чена в программу намеренно. Как по- ного управления структурой базы данказывает практика, опытные дизайне- ных (см. рис. 6), позволяющий добавдающее сообщение (см. рис. 5). Пример того, как в окне браузера ры даже после оформления страницы лять и удалять таблицы в базе, управотображается страница, проектирова- с помощью тех или иных автоматизи- лять полями таблиц – удалять ненужние которой показано на рис. 1, пока- рованных средств «шлифуют» стра- ные, создавать новые, задавать их тип, ницы вручную, уже после разработки вводить, изменять и удалять данные в зан на рис. 4. При разработке среды в качестве и отладки программной части. любой из таблиц и т. п. Учет данных критериев позволит параметров оптимизации генерируеВ случае если непосредственное мого кода на языке PHP я выбрал сле- вам достичь получения в результате подключение к серверу базы данных «компиляции» легкочитаемого высо- посредством источника ODBC невоздующие критерии: 1) Не требуется сохранять параметры конадежного кода на языке PHP. Этот можно (отсутствует доступ, в вашей оформления генерируемой страни- код не требует дальнейшей верифи- системе нет источника ODBC требуецы в максимально возможной сте- кации и может быть легко модифици- мого типа и т. п.), можно определить пени. В результате компиляции ко- рован и использован в качестве осно- источник любого типа, например, Miда в полученной странице не гаран- вы при разработке сложной страницы, crosoft Access Driver (*.mdb), ссылатируется расположение элеменющийся на пустую базу данных. тов точно так же и с такими же При разработке в ней будут сорасстояниями между элементазданы необходимые таблицы. Во ми, как они располагались на время построения кода сценариэтапе проектирования. Однако ев (при компиляции) среда также среда обеспечит соблюдение автоматически выполняет генеравзаимного расположения элецию дампа полученной к моменту ментов друг относительно друкомпиляции базы данных. Вы моРисунок 5. Выполняется преобразование в PHP-код. га; жете перенести этот дамп непосОтладочные сообщения
80
программирование редственно в сервер СУБД. тогда с этими данными автоУниверсальность и переноматически будут связаны отсимость дампа достигаетдельные таблицы. Осталься за счет применения в нем ные атрибуты концерта модля управления структурой гут быть введены через текбазы и данными операторов стовые поля и автоматичесна языке SQL. ки попадут в главную таблиСреда предусматривает цу, содержащую помимо этих возможность определения атрибутов и первичный ключ, автоматической связи межи ключ места проведения. ду элементом и столбцом одРазумеется, при построной из таблиц базы данных. ении сложных многоуровнеПри этом у вас возникает возвых систем или при «классиможность автоматизировать ческом» подходе к проектиРисунок 6. Встроенный интерфейс управления базой данных процесс разработки структурованию информационной ры базы данных, основываясь на ин- сколько этапов, среди которых мож- системы такой подход является неверформации, получаемой из визуально- но выделить: ным – проектирование базы данных 1) изучение предметной области, в ко- должно предшествовать разработке го программирования. торой производится разработка; Пример структуры автоматически интерфейса. Но я хочу отметить, что 2) построение модели предметной об- такая функциональная возможность разрабатываемой базы данных приласти; веден на рис. 7. В качестве примера вполне может быть использована в 3) разработка логической модели целом ряде случаев, когда структура приводится интерфейс для базы данданных; ных «афиши концертов». базы данных не очень сложна или из4) разработка физической модели начально очевидна. Таким образом, при построении данных в средствах той или иной нового проекта некой информационСУБД; ной системы Синбад позволяет полЧто дальше 5) программирование базы данных На текущий момент остаются нерешенностью снять с вас задачу проектиронепосредственно в СУБД. вания базы данных – она будет разраными некоторые задачи, касающиеся ботана автоматически. Единственной функциональных возможностей среды Создание БД на этапе построения разработки. Требуется разработка мерекомендацией в данном случае будет необходимость задавать для элемента интерфейса к ней по сути является ме- ханизма сохранения результатов комосмысленное имя до назначения ему тодом, позволяющим вам в целом ря- пиляции с учетом изменений, сделанавтопривязки к БД, так как при созда- де случаев получить готовую физи- ных программистом в конечном коде нии полей таблиц будет использовано ческую модель БД непосредственно программного модуля на языке PHP. из модели предметной области. Дейс- На текущий момент, если вы отредакимя элемента. В классическом случае проектиро- твительно, на этапе создания интер- тировали полученный в результате вание базы данных выполняется в не- фейса достаточно представлять се- компиляции код, то при последующей бе лишь модель пред- компиляции его изменения будут пометной области. Так, теряны. Также необходима доработка в нашем примере БД, редактора кода. В среде пока нет сиссодержащей концерт- темы выделения синтаксических эленую афишу, вам доста- ментов языка различными цветовыми точно разработать эле- схемами и нумерации строк. менты интерфейса для Возможно, отмеченные недостатки ввода свойств пред- будут исправлены в последующих верметной области – на- сиях среды. Также планируется добазвания концерта, вре- вить возможность проверки вводимых мени и места его про- пользователем в элемент значений с ведения, перечня ар- помощью скриптов на JavaScript. тистов и прочее. ЗадаРазрабатываемый продукт будет ча проектирования ко- бесплатным, бета-версии в скором нечных таблиц, ключей времени будут доступны по адресу и связей в них и т. п. с http://evgy.opennet.ru. вас снимается. В данном случае целесооб- Литература: разно для выбора мес1. Воякин Е. Zend Studio 4.0 – новая та проведения концерверсия, новые возможности. – Журта и артиста использонал «Системный администратор», Рисунок 7. Схема автоматизации разработки структуры вать списки выбора, №2, 2005 г. – 75-79 с. базы данных
№7, июль 2005
81
web
ИСТОРИЯ РАЗВИТИЯ САЙТОСТРОЕНИЯ
АЛЕКСЕЙ МОИСЕЕВ WWW является одним из наиболее динамично развивающихся сервисов глобальной сети Интернет. За 14 лет развития сайтостроения была проделана большая работа по созданию существующих стандартов, обеспечивающих не просто существование, а развитие WWW, благодаря чему можно строить планы на будущее, не совершая ошибок прошлого. Только полная картина всего, что было и есть, позволит понять, чего именно не хватает на рынке в данный момент, а значит и определить дальнейший путь веб-разработок.
К
настоящему времени в Интернете уже существует около двух миллиардов страниц. Ни одна из возможных тем не ускользнула от упоминаний в Web. Каждую секунду в Сети добавляется примерно 25 новых сайтов.
Рождение Со времён создания сети Интернет одним из наиболее известных его сервисов стала «Всемирная паутина» – World Wide Web. В 1991 году Пол Линдер (Paul Linder) и Марк П. МакКейгил (Mark P. McCahill) из Университета Миннесоты создали Gopher (полное название Gopher State – штат сусликов, шутливое название штата Миннесота). Технология организации файлов в логическую систему меню обусловила его немедленное принятие как стандарт в сети Интернет. Протокол Gopher является непосредственным предшественником концепции и функций WWW. Серверы Gopher быстро распространились в сети Интернет, хотя в них не было гипертекстовых ссылок и графических элементов. Через короткий отрезок времени стало ясно, что возможностей таких серверов не хватает. Самый большой сервер Gopher принадлежал европейской организации CERN (Европейская лаборатория физики частиц высокой энергии). Эта организация стала движущей силой подключения Европы к Интернету.
82
Первые шаги В 1992 году была создана Всемирная информационная сеть (World Wide Web или просто Web). Разработчиком технологии был Тим Бернерс-Ли (Tim Berners-Lee). Задача Сети заключалась в распространении информации посредством сетевой компьютерной технологии. Технология WWW стала развитием идей Gopher. В истории было немало учёных, чьи мысли опережали время, в котором они живут. Среди них был и Тед Нельсон (Ted Nelson), который первым предложил концепцию гипертекста в своей книге «Computer Lib/Dream Machines», опубликованной в 1974 году. В середине 90-х годов понятие гипертекста расширилось и включило в себя идею гипермедиа, то есть добавление ссылок на графические видеоклипы и музыкальные ролики. На основе результатов работ Теда Нельсона, а также концепции гипертекста он сделал возможным включение графики, типографских текстовых стилей и самое главное – гипертекстовые ссылки в веб-страницы.
«Три кита» новой технологии Основой Web стали три новых технологии: HTML (HyperText Markup Language, язык разметки гипертекста) – язык логической разметки веб-страниц. HTML
«вырос» из более сложного языка SGML (Single Generalized Markup Language, ISO 8879) [1]. HTML как стандарт для разметки веб-страниц вышел в свет в ноябре 1995 года под названием «HTML 2.0». После чего были предприняты попытки его модернизации, однако проект «HTML 3.0» так и не был рекомендован интернет-консорциумом. Возможно, тогда потребностям вебразработчиков вполне отвечал предыдущий стандарт. С течением времени число пользователей WWW увеличивалось, что привело к появлению среди разработчиков всё более талантливых людей, которых возможности второй версии HTML явно не устраивали. То есть паутина всего за два года развилась до «HTML 4.0», который практически в неизменном виде используется и по сей день с незначительными изменениями. В конце 90-х интернет-консорциуму стало ясно, что HTML не отвечает потребностям Web, и любая новая версия HTML быстро устареет. Поэтому было предложено развивать расширяемый язык разметки: XML (eXtensible Markup Language) – новый стандарт оформления самых разнообразных документов, в том числе и веб-страниц. Уникальность XML заключается в его неограниченной расширяемости в силу четкой структурированности данных, возможности определения своих тегов и т.д.
web XML так сильно отличается от HTML, что был разработан XHTML (это основанный на XML язык разметки гипертекста, максимально приближенный к текущим стандартам HTML. Был опубликован консорциумом в первый день 2000 года как переформулирование (Reformulation) HTML в XML. HTTP (HyperText Transfer Protocol, протокол передачи гипертекста) используется для передачи веб-страниц от сервера к пользовательскому браузеру. Веб-браузер – программа, необходимая для просмотра веб-страниц. Практически сразу после создания Web был создан первый браузер, причём он распространялся совершенно бесплатно. Браузер назывался Mosaic, его создали в Национальном центре суперкомпьютерных приложений при университете Иллинойса в 1993 году. Ничто в истории информационных технологий не распространялось с такой же быстротой. Более подробную информацию о WWW можно найти по ссылке [2], где есть ответы на все наиболее часто встречающиеся вопросы. Нововведением в стандарте W3C HTML 4.0 явились листы стилей (style sheets), позволяющие отделять содержание HTML-документов от их представления. Связывая один сценарий со всеми страницами ресурса, вы можете изменять внешний вид сразу всего сайта, даже если со страницами в данный момент работают пользователи. В настоящее время существует стандарт Cascade Style Sheets Level 2 (CSS2), однако полностью его не поддерживает ни один браузер. Элементы, поддержка которых реализована в тех или иных браузерах, как правило, по разному «понимаются». Дальше всех в этой области продвинулись браузеры, выпускаемые под маркой Mozilla (Mozilla, Mozilla ForeFox, Mozilla ThunderBird). В ближайшее время выйдет стандарт Cascade Style Sheets Level 3 (CSS3). Исследования [3] показывают, что в текущее время наиболее популярным браузером является Internet Explorer, им пользуются около 89% пользователей WWW. На втором месте Mozilla, у которого около 6,8%. Среди остальных браузеров можно выделить: Opera, Konqueror, Lynx, а также браузеры, построенные на основе
№7, июль 2005
Mozilla и недавно открытого кода Internet Explorer.
Быстрое развитие Число пользователей WWW лавинообразно увеличивалось, благодаря чему всё большую роль в развитии паутины стал играть бизнес. Каждый день создавалось множество интернет-представительств компаний, работающих в различных сферах рынка. Каждый отдельный сайт представлял собой набор статических HTML-страниц, CSS-таблиц стилей, а также графических файлов. Для оперативного обновления и своевременного добавления новых разделов на сайт было необходимо держать в штате компании группу веб-разработчиков. Сделать переоформление (редизайн) такого сайта вообще не представляется возможным, так как для этого необходимо отредактировать каждую страницу в отдельности. Например, если на одну страницу уходит 20 минут, то на 1000 страниц уйдёт примерно 42 рабочих человеко-дня, что составляет чуть более двух недель работы небольшой группы веб-разработчиков при условии, что в это время им не будут давать срочных заданий. В итоге для переоформления ресурса отдел информационных технологий будет полностью парализован на относительно длительное время, что недопустимо, за редким исключением. На рынке сформировалась потребность в автоматизированной системе построения страниц сайта на основе написанных статей и HTML-шаблонов. Такие системы были названы CMS (Content Management System, системы управления контентом), они, как правило, состоят из трёх частей: ! Статическая часть – HTML-шаблоны. ! Программная часть – в большинстве случаев интерпретируемые модули, которые также можно разделить по назначению ! Пользовательские скрипты, показывающие информацию посетителям, используя шаблоны страниц и информацию из хранилища данных. ! Администраторские скрипты позволяют управлять возможностями веб-ресурса, такими как: голосования, анонсы и т. п.
! Хранилище данных представляет
собой совокупность сервера управления базами данных и самой базы данных. Однако в некоторых случаях можно использовать файлы на жёстком диске.
Благодаря шаблонам количество HTML-кода сокращается в десятки раз. К шаблонам обычно относят также CSS-код и JavaScript-код. Программная часть вполне может быть написана на любом языке программирования, однако при этом появится чрезмерная сложность отладки и платформозависимость. В начале развития CMS использовали Perl (для UNIX-хостингов) и ASP (для Windowsхостингов). Популярность Perl (Practical Extraction and Report Language) в те времена можно было объяснить целым рядом причин: простота синтаксиса, большие возможности интерпретатора, а главное – каждый администратор UNIX использовал его для управления и настройки системы. То есть люди, чья работа хоть как-то связана с UNIXподобными системами, уже владели практически всеми необходимыми знаниями для веб-разработки. Однако Perl изначально не был предназначен для этого. Поэтому параллельно существовали более адаптированные для Web языки (интерпретаторы). К ним можно отнести PHP (раньше понималось как Personal Home Pages, однако в последнее время расшифровывается как Hypertext Preprocessor), Python, KixtArt, Yo-Script (скриптовый язык, который длительное время использовался для отображения страниц в www.yahoo. com) и множество других. Работа над большинством таких языков прекращена, однако остальные начали развиваться быстрыми темпами. Например, PHP до 4-й версии обладал рядом недостатков, не позволявших ему получить абсолютную популярность (например, первые версии PHP позволяли писать лишь небольшие скрипты), однако в 4-й версии все они были устранены. В текущий момент большинство проектов работают именно на PHPскриптах, однако также встречаются и Perl/ASP-движки.
Хранилище информации В качестве хранилища данных на любом, сколько бы то ни было весомом
83
web проекте используется база данных. В большинстве случаев это MySQL или PostgreSQL. Они получили широкую распространённость (особенно MySQL) благодаря тому, что отсутствует плата за использование обоих СУБД, а также они существуют под все платформы, используемые на WWWсерверах. Однако «дёшево хорошо не бывает», в случае если от сервера баз данных требуются работы с огромными объёмами данных, то приходится использовать Oracle, MS SQL либо другие СУБД, осуществляющие достаточно быструю работу с большими объёмами данных. Однако все они являются платными. Об этом можно долго спорить. Для большинства CMS не нужны огромные объемы данных. Важнее скорость обработки SQL-запросов. Помимо перечисленных есть множество других СУБД, каждая из которых обладает как недостатками, так и преимуществами по сравнению со своими конкурентами. Все выше упомянутые СУБД являются SQL-серверами баз данных. Использовать что-то работающее не на технологии Клиент/Сервер не представляется возможным, так как по ряду причин (например, на разных платформах существуют различные СУБД, каждая ориентирована под свой круг задач) нецелесообразно встраивать систему управления базами данных (СУБД) в интерпретатор. С момента опубликования стандарта SQL92 СУБД, работающие на основе SQL-предложений, фактически стали единственным стандартом для серверов управления базами данных, существующих в Web. Под SQL-предложением понимают команду SQL-серверу, однако в отличие от других команд, используемых для управления какимилибо приложениями ЭВМ, SQL-команды являются весьма приближенными к человеческому языку, возможно, это и есть важнейшая причина, по которой их называют именно SQL-предложениями, а не командами. Пример простейшего SQL-предложения «SELECT * FROM table_name».
Итоги развития WWW За несколько лет системы управления содержимым веб-ресурсов серьёзно развились, их можно классифицировать по областям применения.
84
1. Порталы. Используются для информационных ресурсов, основной целью ставят максимальное упрощение публикации статей и новостей. Могут включать в себя нижеследующие типы CMS как самостоятельные модули. Наиболее известные представители данного класса: PHP-Nuke, XOOPS. 2. Движки без SQL. Данное ответвление в разработке CMS развито наиболее слабо, так как использование в качестве хранилища информации файлов вместо таблиц базы данных сопряжено со множеством нерешаемых проблем (таких как одновременная запись в один файл несколькими копиями скрипта). Достоинство таких CMS заключается в том, что они могут быть размещены на бесплатных хостингах. Есть несколько реализаций данной идеи: Cute News, Gruppy. 3. Блог (название «блог» (blog) происходит от английского слова «weblog». Русский термин – «сетевой дневник») – это сайт, на котором находятся личные заметки автора. В основном заметками являются ссылки на сайты, которые кажутся владельцу ресурса наиболее интересными, и комментарии к ним. В большинстве случаев владельцы блогов дают небольшие комментарии на приведенные ресурсы, другие же пытаются подробно описать сайт. Блог может содержать не только ссылки, но и просто электронный дневник пользователя. В эту категорию можно отнести следующие CMS: b2evolution, bBlog. Сетевые дневники приобретают все большую популярность. Уже начинают активно обсуждать, кто же влиятельнее: СМИ или блоги. Они постепенно входят в жизнь рядового пользователя всемирной паутины – например, в Штатах выходит телепередача о блогах. Существует два способа начать вести блог: воспользоваться специальным сервисом (например, LiveJournal) или установить к себе на сервер (платный или бесплатный хостинг) автономный блог, то есть использовать специализированную CMS.
4. Форумы – это инструмент для общения на сайте. Принципиальное свойство форума заключается в том, что сообщения в нем объединены в треды (от англ. thread – «нить»). Когда вы отвечаете в форуме на чье-то сообщение, ваш ответ будет «привязан» к исходному сообщению. Последовательность таких ответов, ответов на ответы и т. д. и создает тред. В итоге форум представляет собой древовидную структуру, состоящую из тредов. 5. Магазины. К магазинам можно отнести любой сайт, при помощи которого можно заказать какой-либо товар. В данном случае в определение «товара» может входить абсолютно всё, включая время доступа в Интернет, минуты сотовой связи. CMS, позволяющие создать виртуальный магазин: MyMarket, osc2nuke. 6. Групповая работа (Groupware) – комплекс программного обеспечения, позволяющий организовать работу предприятия, отношения с клиентами и заказчиками в Интернете. Обычно представляет закрытую полностью или частично часть сайта с возможностью отслеживать сроки выполнения поставленных задач, распределения ролей и временных нормативов. Возможно, выносить вопросы на обсуждения и решения вышестоящего руководства. В большинстве случаев иcпользуются следующие CMS: dotProject, eGroupWare, MoreGroupware, phpCollab, PHProjekt. 7. Обучение (e-Learning) – дистанционная форма обучения с использованием сети Интернет. Онлайновая форма обучения уже не один год является «маяком», на который ориентируются образовательные системы разных стран мира, переживающие сложный процесс реформирования. Процесс их модернизации все больше связан с реализацией задач информатизации, учитывая все возрастающую роль информационных и интернет-технологий в современном обществе и бизнесе. Стратегическим направлением становится обеспечение интеллектуального развития на основе быстрого обновления знаний в области технических
web наук, а также развития навыков эффективного использования информационных ресурсов. Таких систем существует не много: ATutor, Claroline, LogiCampus, Moodle, Segue, Site@School. 8. Базы знаний (KnowledgeBase) позволяют накапливать опыт множества разработчиков, работающих (или работавших) в какой-либо одной организации. Каждая такая база знаний имеет свою специфичную структуру, поэтому общих решений на данный момент предложено крайне мало, а точнее только одно – Wiki. На этом «движке» работает широко известная электронная энциклопедия Wikipedia. Наиболее известная из существующих ныне баз знаний – RFC (Request For Comment, запрос на комментирование, обычно описание работы с каким-либо протоколом и тому подобное, публикуется в виде небольшого документа, как правило, с примером программы.). 9. Биллинг (Billing). Программное обеспечение, позволяющее провайдерам и реселлерам работать со счетами клиентов. Такие CMS являются неотъемлемой частью крупной системы учёта потребления услуг пользователями. Задача же CMS данной категории – в визуализации информации о предоставленных услугах, подключении новых услуг, изменении текущих параметров, приёме платежей и т. п. Во всех случаях такие системы пишутся своими силами. Для примера можно привести биллинг-панель RuWEB. В ней создано огромное количество тарифных планов, позволяющих пользователям платить только за те параметры хостинга (трафик, место на жёстком диске, MySQL, PHP, Perl), которые используются в полном объёме. Пока ни одна другая фирма (работающая в этой секторе рынка ИТуслуг) не воспользовалась этой, несомненно, удачной идеей. 10. Администраторская панель хостинга. К этому классу относятся такие продукты, как «Direct Admin» и «Control Panel». Немало хостингпровайдеров стараются написать панель управления для пользователя хостинга своими силами, од-
№7, июль 2005
нако ни одно такое решение, насколько мне известно, так и не смогло по возможностям и эргономике хоть немного приблизиться к вышеупомянутым системам. Например, админ. панель хостинга net.ru даёт лишь простейшие функции управления и способна показать только то, что может сделать администратор за день работы.
Альтернатива CMS Для того чтобы перевести статический ресурс под управление одной из CMS, необходимо создать его заново. Если на сайте уже имеются сложная структура и большие объёмы данных, то цена вопроса становится ощутимой даже для относительно богатых организаций. Так как продолжение существования в старом формате уже не представляется возможным, то формируется спрос на продукт, позволяющий управлять существующим статическим сайтом. Спрос порождает предложение, и вот уже около пяти лет на рынке существует продукт IPI.CONTROL (www.ipi.ru). В первом приближении он выполняет функции «насадки» на сайт, позволяющей приблизить возможности такого ресурса к функциональности CMS. Текущие возможности системы (в плане CMS) для больших проектов оставляют желать лучшего – IPI предназначена для малого и среднего бизнеса. Однако профессиональные маркетологи сделали своё дело, что дало системе некоторое число постоянных потребителей, ежемесячно пополняющих бюджет компании, из которого идут деньги на дальнейшие разработки. Важно отметить, система сделана таким образом, что позволяет в любой момент прекратить пользоваться её услугами. В этом смысле её можно сравнить с некоторым инструментом (например, отвёрткой), взятым в аренду. Пока пользуетесь – платите, если чувствуете, что некоторое время (больше двух-трёх месяцев) вы не будете использовать её, – то можно временно отключиться… или вообще перестать пользоваться услугами компании. Возможно, в этом заключается одна из причин, почему скрипты системы не продаются, а сдаются в аренду. Описанное свойство является большим плюсом, который пока не реализован ни в одной системе управления
контентом, кроме рассматриваемой). В принципах работы этой организации можно почерпнуть наиболее удачные идеи: если брать деньги не за саму CMS, а за её аренду, причём размещать её на своём сервере (тут важно учесть все условия к хостингу потенциальных будущих заказчиков), то это даст возможность предоставлять более эффективную поддержку клиентам, постоянно повышать безопасность и улучшать качество работы как самой системы, так и всего сервера в целом. При увеличении числа пользователей такой организации, работы программистами добавляется минимум, что позволяет снижать плату для всех пользователей, а самое главное – постоянно расширять возможности системы. Если в первые дни существования IPI.CONTROL могла лишь управлять содержимым сайтов, теперь это полноценный рабочий кабинет администратора сайта. В системе реализован принцип единой администраторской панели. Это можно связать с тем фактом, что за последние четыре года в BugTraq не раз появлялись уязвимости PHPNuke и других CMS, однако о взломах сайтов на базе IPI.CONTROL не было ни одного сообщения. Безусловно, использование IPI не является столь массовым, как PHPNuke, по той причине, что последний бесплатен, а IPI.CONTROL стоит больших денег, однако в случае появления бреши в PHPNuke её будут устранять некоторое (возможно, продолжительное) время, а в случае с IPI можно связаться по сотовому телефону с директором и высказать всё, что наболело. В следующей части, на основе анализа текущего состояния WWW, будут сформулированы требования к CMS, отвечающие потребностям пользователей (как бизнеса, так и частных лиц) завтрашнего дня. Благодаря количественной и качественной оценке ошибок, появлявшихся в истории развития ресурсо-строения, быть может, обозначенный в следующей части путь развития CMS окажется наиболее правильным.
Ссылки: 1. http://www.w3.org/pub/WWW/MarkUp/SGML. 2. http://www.boutell.com/faq. 3. http://www.securitylab.ru/54639.html.
85
web
КТО, КУДА, ЗАЧЕМ ПРИШЕЛ, ИЛИ АНАЛИЗИРУЕМ ЛОГИ ВЕБ-СЕРВЕРА …Стой! Ты куда? Где тапочки, плед, кресло-качалка? Где это все? Я за вас носить буду?... капитан команды КВН «Утомленные солнцем» г. Сочи
ДЕНИС ГОРОДЕЦКИЙ Практически на каждом веб-сайте работает счетчик посещений. И это неудивительно: всем нам интересно, а кому-то еще и важно для бизнеса, сколько раз пользователи всемирной паутины посещали наш сайт. ля компаний и владельцев интернет-ресурсов важно знать, какова информационная эффективность сайта. Поэтому возникает необходимость выбрать инструмент для сбора статистической информации. Для нас важны простота установки и настройки, количество используемых программой ресурсов, информативность получаемых данных и удобство пользования ими. Сегодня мы сравним возможности, приведем основные настройки и осветим тонкости работы наиболее часто используемых некоммерческих средств сбора статистики – анализаторов логов.
Как достичь желаемого результата Для анализа посещаемости сайта существуют всевозможные счетчики посещений, как встраиваемые в конструкцию сайта, так и предоставляемые различными сервисами и провайдерами. Использовать данный инструмент в дополнение к другим средствам сбора статистики можно, но данная мера оправдывает себя на небольших некоммерческих проектах. Для компаний, интернет-ресурсы которых используются для продвижения своей продукции или же в рекламных целях, важно знать несколько основных моментов: ! количество посещений; ! какие разделы наиболее востребованы; ! с помощью каких запросов пользователи находят ваш сайт; ! с какого URL пользователь заходил для просмотра. В данном случае целесообразно использовать программы, которые выдают всю необходимую информацию на основе анализа логов веб-сервера. Плюсы: ! несложная настройка большинства из них; ! возможность с помощью одной программы осуществлять сбор статистики с нескольких сайтов; ! большая информативность полученных результатов.
86
Webalizer Первая из рассмотренных программ и, пожалуй, наиболее распространенная – это Webalizer (http://www.mrunix.net/ webalizer). Webalizer анализирует журналы сервера и генерирует статистические данные в формате HTML на основе информации, полученной из log-файлов. Также умеет рисовать красивые гистограммы для лучшего восприятия информации. Поддерживает анализ log-файлов FTP-серверов wu-ftpd и ProFTPD, а также прокси-сервера Squid. Входит в состав дистрибутива Red Hat 7.0 и выше. Для всех остальных пакет с программой можно взять по адресу: http:// www.mrunix.net/webalizer. Для Webalizer необходимо наличие графической библиотеки GD, которая требуется для генерации встроенных графиков Webalizer. Если GD отсутствует, то вы должны инсталлировать ее. Для проверки наличия установленной библиотеки GD используйте следующую команду: # rpm -qa | grep gd
Если пакет в системе присутствует, то на экран будет выведено его название. Основные позиции конфигурационного файла /etc/ webalizer.example.conf выглядят следующим образом: # Определяет журнал сервера LogFile /usr/local/etc/httpd/logs/access _ log # Определяет месторасположение отчетов Webalizer OutputDir /usr/local/etc/httpd/usage # Имя хоста, который мониторится HostName www.example.com # Задает имя файла, в котором будет содержаться информация # о посещении веб-сервера на протяжении одного года HistoryName HistoryName webalizer.hist # Возрастающая обработка позволяет использовать несколько # относительно небольших файлов журналов вместо одного
web # огромного. Данная опция полезна для больших сайтов, # период ротации журналов которых меньше, чем период # ротации обыкновенных веб-серверов. Incremental # Задает заголовок отчета. Русские заголовки поддерживаются # (при условии настроенной локализации системы) ReportTitle # Определяет расширение для файлов-отчетов HTMLExtension # Позволяет использовать безопасное соединение HTTPS # для просмотра статистики UseHTTPS # Директива PageType указывает расширения файлов, # которые будут считаться веб-страницами. PageType htm* PageType cgi PageType phtml PageType php* PageType pl #GraphLegend #GraphLines #TopSites #TopKSites #TopURLs #TopKURLs #TopReferrers #TopAgents #TopCountries #TopEntry #TopExit #TopSearch #TopUsers #IgnoreSite #IgnoreURL #IgnoreReferrer #IgnoreAgent #IgnoreUser
Рисунок 1. Стартовая страница Webalizer 30 10 30 10 30 15 30 10 10 20 20 bad.site.net /test* Þle:/* RealPlayer root
Изменяя эти опции, можно манипулировать «внешним видом» полученной статистики, количеством строк в таблицах, отображать или нет диаграммы и графики, игнорировать в статистике определенные url, браузеры и т. д. После инсталляции необходимо отредактировать файл httpd.conf и добавить следующие строки между тэгами секции <IfModule mod_alias.c> и </IfModule>: Alias /usage/ "/home/httpd/usage/" <Directory "/home/httpd/usage"> Options None AllowOverride None Order deny,allow Deny from all Allow from 192.168.1.0/24 </Directory>
Для запуска Webalizer может использоваться несколько параметров: ! -c файл – альтернативный файл конфигурации. По умолчанию используется файл /etc/webalizer.conf. ! -n name – имя машины, которое будет отображено при выводе статистики. ! -o каталог – каталог, в который будут помещены файлы статистики. ! -t название – заголовок отчета. ! -F (clf | ftp | squid) – тип журнала: clf или ftp или squid. Для обеспечения сбора статистики с нескольких виртуальных серверов я рекомендую создать несколько конфигурационных файлов и добавить необходимые команды в cron. Например, вот так:
№7, июль 2005
Рисунок 2. Статистика кодов отклика * 2 * * * /usr/local/bin/webalizer * 2 * * * /usr/local/bin/webalizer ↵ -c /etc/call-net.webalizer.conf * 2 * * * /usr/local/bin/webalizer ↵ -c /etc/webalizer.hotofÞce.conf
Исходя из соображений не столько безопасности, сколько нежелательного попадания данной информации в руки наших конкурентов, доступ к результатам по http рекомендуется закрыть с помощью htaccess. Как выглядит отображаемая статистика, смотрите на рис. 1. Usage Summary for yourdomain.com. Этот график визуализирует суммарный трафик за последние 12 месяцев. Информация будет доступна только с момента запуска Webalizer на сайте. Summary by Month. Эта таблица содержит месячную статистику, выраженную в цифрах, средние показатели в день и суммарные показатели за каждый месяц. Кликнув по названию месяца (подчеркнуто красной чертой), вы сможете получить детализированный отчет за каждый месяц. Monthly Summary. Кликнув по ссылкам, вверху страницы, вы перейдете в определенный раздел отчета. Статистический месячный отчет (имеется в виду календарный месяц) предоставляет информацию на текущий момент времени. Hits By Response Code. Анализ кодов отклика (рис. 2)
87
web дает возможность понять, насколько хорошо работает сайт с точки зрения пользователя. Значения кодов: ! Код 200 – все работает должным образом. ! Код 206 – буквально – «частичное отображение содержания». Причиной этого может быть нажатие пользователем кнопки «stop» до полной загрузки страницы. Это не является ошибкой. ! Код 304 – браузер пользователя (в первую очередь Netscape) использует сохраненное содержание либо извлекает страницу из кэша. Это не является ошибкой. ! Код 404 – пользователь получил сообщение об ошибке и не увидел содержания страницы. Запрошенный пользователем документ отсутствует на сервере. Этот код также может выдаваться сервером неавторизованным пользователям, отказывая в доступе к закрытым документам.
! Hits: Количество файлов, запрошенных с сервера кли-
! !
! !
ентами. Включает в себя все графические файлы, CGI скрипты (например, обработчики форм), а также htmlстраницы. Files: Количество файлов, отправленных сервером по запросам. Включает в себя графические файлы и htmlстраницы. Sites: Количество уникальных мест в Интернете (хостов), откуда на сайт заходят посетители. Это самый объективный показатель, по которому можно определить количество уникальных посетителей сайта. Kbytes: Объем информации, которая была переслана сервером веб-браузерам посетителей. Показывает количество исходящего трафика, генерируемого сайтом. URLs: Самые популярные страницы сайта. Этот показатель поможет понять, над какими страницами, возможно, стоит поработать.
Daily Usage Graph & Statistics. Этот раздел содержит информацию о количестве hits, files, sites и Kbytes, зарегистрированных за каждый день. Эти данные помогают определить, на какой день приходится пик трафика (рис. 3). Hourly Usage Graph & Statistics. Этот раздел содержит информацию о количестве hits, files, sites и Kbytes, зарегистрированных для каждого часа суток на протяжении календарного месяца. Эти данные помогут определить, когда на сайт приходит больше всего посетителей, и вы сможете спланировать обновление веб-страниц на менее загруженное время суток (рис. 4). Top 30 Sites. Из этой таблицы вы узнаете, с каких серверов (хостов) на сайт заходят посетители. Вы сможете определить это по IP-адресу (набор цифр) или по DNS-адресу (набор слов; например, coral.tci.com (рис. 5). Top URLs. Эта таблица поможет вам понять, что конкретно посетители ищут на сайте. По крайней мере, вы сможете определить, какие страницы сайта являются наиболее посещаемыми (рис. 6). Usage by Country Graph & Chart. Данная таблица содержит информацию о том, из каких стран и доменов на сайт заходят посетители. Жители США различаются по используемым ими доменам (рис. 7): ! Коммерческие США: .com ! Сетевые: .net ! Образовательные США: .edu ! Правительственные США: .gov Жителей остальных стран можно также различить по используемым расширениям. Например, украинские провайдеры чаще всего имеют окончание .ua, российские – .ru, белорусские – .by и т. д. Достоинства Webalizer:
! Доступность пакета. ! Простота и гибкость настройки. ! Достаточная информативность. Недостатки Webalizer:
! Не очень удобный интерфейс отображения статистики. ! Нет возможности обновлять статистику из браузера.
88
Рисунок 3. Статистика по дням месяца
web
Рисунок 4. Общая статистика по времени суток
! Для поддержки русского языка необходимо «пропатчить» библиотеку GD и пересобрать пакет заново.
AWStats AWStats (http://awstats.sourceforge.net) – это система представления расширенной статистики по веб-сайту. Мощная и удобная программа, которая генерирует статистику на основе логов веб-сервера и представляет ее графически. Этот анализатор работает как через интерфейс CGI, так и в командной строке и отображает всю возможную информацию, содержащуюся в логах, в виде графиков на нескольких страницах. AWStats анализирует log-файлы таких серверов, как Apache, WebStar и многих других веб-, прокси-, wap-, ftp, почтовых и других серверов. В отличие от Webalizer, разработанного на С, AWStats написан на Perl, поэтому и работает помедленнее, но этот недостаток компенсируется куда большей информативностью полученных результатов. Более прост и понятен в установке. Пакет можно взять по адресу http://awstats.sourceforge.net. Последовательность действий при установке очень проста, скачиваете архив, распаковываете, затем запускаете программу awstats_configure.pl. С ее помощью создается файл типа awstats.www.domain.com.conf, в котором необходимо будет явно указать следующие параметры: # Путь к файлу с логами LogFile="/usr/apache/logs/access _ log" # Формат логов. Поддерживаются следующие типы: # 1 - combined log format # 2 - Old IIS log format # 3 - Webstar native log format. # 4 - common log format LogFormat=1 # Где хранить данные от анализатора DirData="/awstatsdatadir" # Размещение ваших CGI, сюда необходимо класть awstats.pl DirCgi="/cgi-bin"
№7, июль 2005
Рисунок 5. Эта таблица показывает 30 сайтов, с которых чаще всего приходят пользователи SiteDomain="www.domain.com" # Разрешать или нет обновлять статистику через браузер # (Wbalizer такого не позволяет) AllowToUpdateStatsFromBrowser=1
А также при работе awstats_configure.pl в конфигурационный файл веб-сервера добавляются строки: Alias /awstatsclasses "/usr/local/awstats/wwwroot/classes/" Alias /awstatscss "/usr/local/awstats/wwwroot/css/" Alias /awstatsicons "/usr/local/awstats/wwwroot/icon/" ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/" <Directory "/usr/local/awstats/wwwroot"> Options None AllowOverride None Order allow,deny Allow from all </Directory>
После создания своего конфигурационного файла и размещения awstats.pl в /cgi-bin (права на файл необходимо сделать 755) можно начать работать двумя способами: ! обновить статистику через командную строку: # ./awstats.pl -conÞg=www.domain.com
! напрямую обратившись к файлу www.domain.com/cgibin/awstats.pl.
При использовании первого способа есть дополнительные возможности: ! обработать статистику за нужный месяц (-month=12 для декабря); ! генерировать только отдельные страницы; ! выдать html-код того, что получится прямо на STDOUT, не записывая в файл. Подробнее о всех функциях можно узнать, задав в командной строке команду:
89
web
Рисунок 6. Наиболее популярные страницы сайта # ./awststs.pl –help
Внешний вид отображаемой статистики смотрите на рис. 8. Совершенно очевидно, что интерфейс более приятный, чем в предыдущем случае, и как мы видим, статистика несколько полнее, есть информации о запросах от роботов (позволяет объективнее оценить общую посещаемость), продолжительность визитов и многое другое. На мой взгляд, программа AWStats намного лучше справляется с возложенными на нее обязанностями, чего не скажешь о Webalizer. Достоинства AWStats:
! Очень красивый и удобный интерфейс отображения ре-
зультатов сбора статистики. ! Возможность работать как из командной строки, так через браузер. ! Возможность создать выборочные статистические результаты. ! Присутствует автоматическое определение языка отображения. Недостатки AWStats:
! Написан на Perl, за счет этого может медленно работать.
Analog Если для вас статистика, получаемая при помощи описанных инструментов, покажется избыточной, существует еще один из анализаторов логов, называемый Analog (http:// www.analog.cx). Самый простой (как мне показалось) из представленных образцов. Инсталяция и настройка заняла не больше 15 минут. Устанавливается из стандартного rpm-пакета analog-6.0-1.i386.rpm. Домашняя страница http://
90
Рисунок 7. Информация о принадлежности посетителей к географическому местоположению
www.analog.cx. После инсталляции в конфигурационном файле были изменены всего три строки: LOGFILE /usr/local/apache/logs/access _ log OUTFILE /usr/local/apache/htdocs/report.html HOSTNAME "myname"
Для обеспечения вывода статистики на русском (или любом из поддерживаемых языков) в конфигурационный файл достаточно добавить строку, указывающую месторасположение языкового файла, например: LANGFILE ru.lng
или LANGFILE /usr/etc/httpd/analog/lang/ru.lng
В первом случае указанный файл будет искаться во всех возможных местах его расположения. Во втором случае месторасположение указывается явно. В результате мы сразу получили работающий анализатор логов веб-сервера. Analog может запускаться со множеством параметров (подробнее о них можно узнать из справочного руководства по данному продукту). После старта все полученные результаты отправляются в указанный файл, и мы, используя наш браузер, можем просмотреть полученную статистику (см. рис. 9). Как видно, полученный результат намного отличается от предыдущих образцов, но тем не менее, оценивая соотношение затраченных усилий на установку к полноте получаемых данных. Analog вполне оправдывает свое предназначение. Достоинства Analog:
! Быстро настраиваем.
web
Рисунок 8. Так выглядитотображаемая статистика в AWStats
! Подойдет для тех, кому не нужна слишком большая информативность.
Недостатки Analog:
! Не слишком эргономичный интерфейс отображения статистики.
! Естественно, если подходит для не желающих получать
много информации, то для тех, кому необходимо знать больше о посещаемости, данная программа не подойдет.
№7, июль 2005
Рисунок 9. Пример отображения cтатистики Analog
! Существует проблема с русскими поисковыми строками.
В представленном мной обзоре рассматривалась лишь малая часть из существующих некоммерческих решений в области анализа посещений, но, на мой взгляд, эти продукты наиболее часто используются для выполнения таких задач. Удачи!
91
книжная полка Java. Карманный справочник Питерд Дж. ДеПаскуале Несмотря на свой небольшой объем, книга предоставляет читателю максимум информации в сжатом виде. Повествование начинается с изложения основ языка Java. Рассмотрены: управляющие последовательности, простые числовые типы, логические операторы, расширяющие преобразования, служащие преобразования, основные исполняемые приложения. После того как читатель получил общее представление о синтаксисе языка, автор переходит к описанию модификаторов, управляющих операторов, типов данных, описаний классов. Не остались без внимания и часто используемые классы и интерфейсы из Java API. Весь материал изложен в очень удобном виде, каждая тема освящена достаточно подробно: синтаксис, описание, пример, примечания. Удобный формат и легкость усвоения изложенного материала делает эту книгу отличным спутником любого программиста на Java. Книгу можно порекомендовать как новичкам, так и людям с солидным стажем разработки. Издательство «КУДИЦ-ОБРАЗ», 2005 г. – 128 стр. ISBN 5-9579-0085-0 (ориг. 0-321-30472-6).
Сетевые распределенные вычисления. Достижения и проблемы Макс К. Гофф Интереснейшая во всех отношениях книга. Изложенный материал по сути является аналитическими рассуждениями автора на тему перманентной технической революции. Основные темы книги: построение «ландшафтов приспособленности» сетевых распределенных вычислений, использование законов Мура и Метклафа, преодоление восьми классических заблуждений в отношении распределенных вычислений, улучшение сотрудничества и безопасности в отношении распределенных вычислений. Любопытен материал про интеграцию проводных и беспроводных сетей – рассмотрены ключевые проблемы существующего ПО. Также рассказано про коммуникационные протоколы и передачу сообщений в распределенных системах, мета-тенденции, семантический web, глобальную прозрачность, нанотехнологии, робототехнику. Несмотря на сложность излагаемых тем, книга написана простым и доступным языком. Любой человек, независимо от специализации, откроет для себя много интересных вещей. Издательство «КУДИЦ-ОБРАЗ», 2005 г. – 320 стр. ISBN 5-9579-0072-9 (ориг. 0-13-100152-3).
№7, июль 2005
Автоматизация процессов тестирования И. Винниченко Эта книга – единственное издание на русском языке, посвященное такой актуальной теме, как тестирование программного обеспечения на этапе разработки. В вводной части – основы автоматизации тестирования ПО. Далее идет детальное описание трех основных программных средств: Segue SilkTest, Mercury Interactive WinRunner и Rational Robot. Отдельная глава посвящена скриптовым языкам, входящим в состав вышеперечисленных продуктов – TSL, 4TEST, SQABasic. В ходе описания представлены примеры работы с переменными, массивами данных, операторами сравнения, цикла и условными операторами. Приводится подробная информация о элементах интерфейса и функций (window, menu, button, editbox и др.) Рассмотрены вспомогательные функции вышеописанных программных средств. Не остались без внимания функции работы с базами данных и управление процессом исполнения. В приложении излагаются методы работы с нестандартными объектами в SilkTest и WinRunner. Издательство «Питер», 2005 г. – 203 стр. ISBN 5-46900798-7.
Теория и практика построения баз данных Д. Крёнке Книга является переводом 9 издания фундаментальной работы известного специалиста в области баз данных. В книге приводится доскональное описание широкого круга задач и технологий, связанных с базами данных. Среди рассмотренных тем: проектирование баз данных (реляционная модель и нормализация), структурированный язык запросов (введение в SQL, использование SQL в приложениях, перепроектирование), обработка многопользовательских баз данных (Oracle 9i и SQL server 2000), стандарты доступа (ODBC, OLE DB, ADO, ASP), рассказано о технологиях XML и ADO.NET. Так же приводятся подробные сведения о работе с объектно-ориентированными базами данных. В приложении вы найдете информацию о структурах данных и семантической объектной модели. Изложенный материал очень удачно сочетает теорию и практические работы. Книгу можно рекомендовать как программистам, так и администраторам баз данных. Издательство «Питер», 2005 г. – 859 стр. ISBN 5-94723583-8 (ориг. 0-12-101514-1).
Рубрику ведет Александр Байрак
93
bugtraq Переполнение буфера в zlib при обработке сжатых потоков данных
Обход ограничений безопасности в Hosting Controller
Программа: zlib 1.2.2. Опасность: Высокая. Описание: Уязвимость существует в функции inflate_table() файла inftrees.c. Удаленный пользователь может создать специально сформированный архив, который вызовет переполнение буфера и аварийно завершит приложение или выполнит произвольный код на системе с привилегиями текущего пользователя. URL производителя: www.gzip.org/zlib. Решение: Установите исправление с сайта производителя.
Программа: Hosting Controller 6.1 HotFix 2.1 и более ранние версии. Опасность: Низкая. Описание: Удаленный авторизованный пользователь может послать специально сформированный HTTP POSTзапрос сценарию /Admin/Accounts/AccountActions.asp?Ac tionType=UpdateCreditLimit с произвольным параметром CreditLimit и изменить свои данные о кредите. URL производителя: hostingcontroller.com. Решение: Способов устранения уязвимости не существует в настоящее время.
Отказ в обслуживании в ASP.NET в RCP-методе Программа: Microsoft .NET Framework 1.x, ASP.NET 1.x. Опасность: Средняя. Описание: Уязвимость существует в функции System.Xml. Serialization.Xml.XmlSerializationReader.ReadReferencedElements() в RCP-веб-методе. Удаленный пользователь может послать методу специально сформированное SOAPсообщение и потребить все доступные ресурсы процессора на системе. URL производителя: microsoft.com. Решение: Способов устранения уязвимости не существует в настоящее время.
Выполнение произвольного кода и отказ в обслуживании в Cisco CallManager Программа: Cisco CallManager 3.2 и более ранние версии, 3.3-3.3(5), 4.0- 4.0(2a)SR2b, 4.1- 4.1(3)SR1. Опасность: Критическая. Описание: 1. Программное обеспечение некорректно обрабатывает тайм-ауты сокетов в Realtime Information Server Data Collection (RISDC). Процесс RisDC.exe может потребить большое количество системных ресурсов и не закрыть сокеты. 2. Удаленный пользователь может послать большое количество специально сформированных пакетов службе CTI Manager (ctimgr.exe), что приведет к потреблению более 1 Гб памяти и рестарту приложения. 3. Удаленный пользователь может послать процессу ccm.exe большое количество специально сформированных пакетов и заставить приложение потребить до 500 Мб памяти. 4. Удаленный пользователь может произвести большое количество неудачных входов в систему и вызвать утечку памяти в Admin Service Tool при включенной опции Multi Level Admin (MLA). Уязвимое приложение может потребить до 750 Мб памяти. 5. Удаленный пользователь может послать службе aupair.exe специально сформированные пакеты, вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.cisco.com. Решение: Установите исправление с сайта производителя.
94
Удаленное выполнение произвольного кода в Mozilla Firefox Программа: Mozilla Firefox версии до 1.0.5. Опасность: Высокая. Описание: Уязвимость существует из-за недостаточной обработки клонированных объектов. Удаленный пользователь может с помощью специально сформированного сценария выйти за пределы песочницы браузера, получить доступ к привилегированным объектам и выполнить произвольный код на системе с привилегиями текущего пользователя. Удаленный пользователь может создать специально сформированную HTML-страницу, которая обращается к внешнему приложению (Flash Player или QuickTime player) и затем с помощью javascript: и chrome: URL выполнить произвольный код на целевой системе. URL производителя: www.mozilla.com. Решение: Установите последнюю версию (1.0.5) с сайта производителя.
Отказ в обслуживании и выполнение произвольного кода в Kerberos Программа: krb5-1.4.1 и более ранние версии. Опасность: Высокая. Описание: 1. Двойное освобождение памяти обнаружено в функции krb5_recvauth(). Удаленный пользователь может выполнить произвольный код на целевой системе. 2. Уязвимость в реализации центра распределения ключей позволяет удаленному пользователю вызвать отказ в обслуживании или выполнить произвольный код на целевой системе. Удаленный пользователь может послать KDC специально сформированные TCP-пакеты, освободить случайную область памяти и вызвать отказ в обслуживании. 3. Удаленный пользователь может послать специально сформированные TCP- или UDP-пакеты и вызвать однобайтовое (single-byte) переполнение стека. Удаленный пользователь может выполнить произвольный код на целевой системе. Уязвимость обнаружена в файлах kdc/do_ as_req.c и kdc/do_tgs_req.c. URL производителей: web.mit.edu. Решение: Установите последнюю версию (krb5-1.4.2) от производителя.
Составил Александр Антипов
подписка на II полугодие 2005 Российская Федерация
! Казахстан – по каталогу «Российская Пресса» через
Каталог агентства «Роспечать» ! Подписной индекс: 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» ! Альтернативные подписные агентства: Агентство «Интер-Почта» (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
! Беларусь – по каталогу изданий стран СНГ через РГО
! Подписной индекс: 81655
ОАО «Казпочта» и ЗАО «Евразия пресс»
«Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10)
! Узбекистан – по каталогу «Davriy nashrlar» российские
!
! !
СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры АРЗИ: ! Азербайджан – по объединенному каталогу российских изданий через предприятие по распространению печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21)
!
издания через агентство по распространению печати «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 по каталогу агентства «Пресса России»
№7, июль 2005
95
СИСТЕМНЫЙ АДМИНИСТРАТОР №7(32), Июль, 2005 год РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Редакторы Андрей Бешков Алексей Барабанов Михаил Платов РЕКЛАМНАЯ СЛУЖБА тел./факс: (095) 928-8253 Константин Меделян reсlama@samag.ru Верстка и оформление maker_up@samag.ru Дизайн обложки Николай Петрочук
ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: DSPAM: персонифицированная система фильтрации спама Фильтрация почты, особенно на сервере провайдера, затруднена тем, что администратор не может брать на себя вынесение вердикта, что доставить абоненту, а что нет. Система DSPAM позволяет переложить принятие такого решения на пользователя.
Asterisk и Linux: миссия IP-телефония Действие 3
По вопросам распространения обращайтесь по телефону: (095) 928-8253 (доб. 120) 107045, г. Москва, Ананьевский переулок, дом 4/2 стр. 1 тел./факс: (095) 928-8253 Сайт журнала: www.samag.ru РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета» Отпечатано типографией ГП «Московская Типография №13» Тираж 8400 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002 г.) За содержание статьи ответственность несет автор. За содержание рекламного обьявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены.
96
Мы достаточно подробно изучили возможности Asterisk в сопряжении с городской телефонной сетью. Теперь, после того как в нашем распоряжении оказалась полноценная мини-АТС, самое время приступить к плановому улучшению ее возможностей. Начнем с вещей наиболее приятных – облегчим процесс администрирования.
Управление удаленными базами AIDE Программа AIDE предназначена для контроля за изменениями файловой системы посредством создания отдельной базы, содержащей информацию об атрибутах файлов – дате и времени создания и модификации, размере, владельце, а также контрольную сумму содержимого файла для проверки его на неизменность содержимого. Правильное использование AIDE гарантирует в достаточной степени неизменность файлов. Но, допустим, имеется
некоторое количество серверов, на всех установлена AIDE, базу которой рекомендуется хранить на сменном носителе с целью не допустить попадания ее в чужие руки. Как реализовать это требование? Не вручную ведь копировать базу с каждого сервера? Для автоматизации этой задачи и был разработан скрипт AIDEControl.
SAP + MySQL = MaxDB При выборе СУБД для проекта перед нами часто встаёт проблема выбора между низкой (часто нулевой) стоимостью открытых БД, таких как MySQL или PostgreSQL, и мощью и широтой возможностей «серьёзных» СУБД – Oracle, DB2, MSSQL. MaxDB от компании MySQL AB, наследница SAP DB – прекрасная альтернатива такому выбору. Это промышленная, SAB-сертифицированная база данных, распространяемая под лицензией GPL. Установим MaxDB и познакомимся поближе с возможностями, которые она предоставляет.
Копирование без границ Копировщики лазерных дисков совершенствуется с каждым днем, но и разработчики защитных механизмов не дремлют, тем не менее, новые защиты тут же ломаются. Почему? Предлагаем вам обзор наиболее популярных ошибок и конструктивных просчетов с рекомендациями по их устранению, а так же законченный алгоритм чрезвычайно стойкой защиты, не копируемой никаким копировщиком.
Уважаемые читатели! Спешите оформить подписку на второе полугодие 2005 года! Приобрести новые и старые номера журнала вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru. Доставка почтой в любую точку России.