Вы находитесь на странице: 1из 98

№7(8) июль 2003

подписной индекс 81655


журнал для cистемных администраторов,
вебмастеров и программистов

Мониторинг
Windows-серверов
с помощью Nagios
Неявный самоконтроль
как средство создания
неломаемых защит
Стартовые
скрипты FreeBSD
Настройка
сервера SSH
Python глазами DBA
Каким видится
хороший системный
администратор
оглавление

Календарь событий 3 Три составных части защиты


Сергей Яремчук
grinder@ua.fm 44
Репортаж с Первого брестского
интернет-форума
Андрей Кухарчик ПРОГРАММИРОВАНИЕ
admin@virtualbrest.ru 4
Python глазами DBA
Каким видится хороший Олег Попов
системный администратор opopov@yandex.ru 52
Вячеслав Калошин
multik@multik.ru 6
Java: работа с файлами
Даниил Алиевский
АДМИНИСТРИРОВАНИЕ daniel@siams.com 56

Мониторинг Windows-серверов ОБРАЗОВАНИЕ


с помощью Nagios
Часть1
Андрей Бешков Mac OS X или То, что должен знать
tigrisha@sysadmins.ru 12 каждый про Macintosh, Apple и
операционные системы
Александр Потемкин
Стартовые скрипты FreeBSD apotemkin@itinfo.spb.ru 68
Денис Пеплин
info@volginfo.ru 20
Обучение через Интернет – это возможно?
Настройка сервера SSH Ольга Игошина
Денис Колисниченко Igoshina@scph.mipt.ru 78
dhsilabs@mail.ru 24

IRC-сервер СЕТИ
Александр Слободской
info@samag.ru 28 Powerline: Интернет из розетки
Денис Колисниченко
Контроль последовательных dhsilabs@mail.ru 86
портов в Linux
Денис Колисниченко
dhsilabs@mail.ru 32 Планируем переезд сети
Вячеслав Калошин
multik@multik.ru 90
БЕЗОПАСНОСТЬ

Неявный самоконтроль как средство BUGTRAQ 10, 31, 42, 94


создания неломаемых защит
Крис Касперски
kk@sendmail.ru 36

WWW.SAMAG.RU
№7(8), июль 2003 1
Две или три недели назад я привезла один
из номеров «Системного администратора»
своему старому знакомому. Жена знакомого
со своей подругой из вполне понятного
женского любопытства тут же выхватили
номер у меня из рук – посмотреть, что же это
за новый журнал, о котором в последнее
время с увлечением говорят их мужья. Спустя
секунду, обе громко заразительно хохотали.
Я в смущении пыталась понять причину столь
неадекватной, на мой взгляд, реакции.
Как оказалось впоследствии, все дело было
в заголовках на обложке. Взгляните
со стороны: «Создаем VPN на основе vtun»,
«LIDS», «Компиляция FreeBSD», «Настройка
Radius-сервера» – думаю, продолжать
не нужно. Для непосвященного
в компьютерные таинства все это звучит
равнозначно китайской грамоте. Поэтому
понять сисадминов, да еще и пообщаться
с ними «на равных» сможет далеко
не каждый. По моему субъективному
ощущению, системный администратор –
это больше, чем профессия. Это стиль жизни.
Это целый мир со своим языком, своей
философией и уже со своими традициями:
каждый год в последнюю пятницу июля
системные администраторы всего мира
отмечают свой профессиональный праздник.
К своему сожалению, я не знаю истории
возникновения этого праздника, но мне
кажется, что день и месяц выбран вполне
в духе сисадминов: можно, не торопясь,
отметить его, выбравшись на природу
или в какое-нибудь уютное место,
одновременно отдохнув и пообщавшись
с коллегами.
Мне лишь остается поздравить всех
«посвященных» от нашей редакции
с профессиональным праздником, пожелать
вам творческих успехов и бесперебойной
работы вверенного «хозяйства»!

Наталья Хвостова

2
календарь событий
Cеминар
12 системных администраторов 25-27 Пятый ежегодный фестиваль
разработчиков и пользователей
ИЮЛЯ и инженеров ИЮЛЯ свободного ПО
Портал SysAdmins.RU (htttp://sysadmins.ru) объявляет о С 25 по 27 июля 2003 года в Калужской области будет
проведении первого в России Семинара системных ад- проходить пятый ежегодный фестиваль разработчиков и
министраторов и инженеров. пользователей свободного программного обеспечения
Данное мероприятие приурочено ко второй годовщине LinuxFest.
проекта SysAdmins.RU и является одной из вех, знаменую- Организатор фестиваля интернет-ресурс Linux.ru.net
щих очередной этап развития проекта. Семинар будет по- приглашает всех желающих посетить этот небольшой
священ проблемам IT, тенденциям рынка IT, рынку труда с праздник свободного ПО, познакомиться с коллегами,
точки зрения IT-специалистов и множеству смежных воп- найти новых единомышленников и просто провести вы-
росов. На семинаре выступят специалисты различных ком- ходные в живописном месте на берегу реки Протвы.
паний, активно работающих на российском и мировом IT- В программе фестиваля: круглые столы по различным
рынке. Тематика выступлений такова, что будет интересна тематикам, конкурсы, общение, активный отдых.
как сугубо техническим специалистам, так и руководите- Самых активных участников сообщества разработчи-
лям IT-подразделений, служб техподдержки, IT-менедже- ков и пользователей Linux ожидают призы от компании
рам разного уровня. В перерывах – кофе и закуски. В нео- ALT Linux и журнала «Системный администратор».
фициальной части – пиво, розыгрыши призов и т. п. Традиционно для участия в фестивале приезжающим
Семинар состоится 12 июля 2003, начнется в 12-00 по необходимо иметь при себе туристическое снаряжение
московскому времени и продлится до 20-00. Семинар бу- (палатка, рюкзак и т. д.) и запас пропитания на все время
дет проводиться в очень уютном и удобном месте – Доме фестиваля.
ветеранов кино (ДВК). Адрес: г. Москва, ул. Нежинская, 5. Подробная карта проезда, FAQ, список участников и
(от м. Киевская на маршрутном такси №7 до остановки прочие подробности – на сайте Linux.ru.net.
«Дом Ветеранов Кино»). Вход на семинар 150 руб. Обязательная регистрация участников производит-
Ознакомиться с подробной программой, зарегистриро- ся на сайте Linux.ru.net в разделе «фестиваль». Орга-
ваться для участия на семинаре и посмотреть карту проез- низационный сбор за участие в фестивале – 100 руб. с
да можно на htttp://SYSM.ru. человека.

№7(8), июль 2003 3


репортаж

ПЕРВЫЙ БРЕСТСКИЙ
ИНТЕРНЕТ-ФОРУМ

14 июня в городе Бресте (Беларусь) прошел первый в рес- Кроме всего прочего, были наглядно продемонстри-
публике региональный интернет-форум. Мероприятие ока- рованы преимущества и модели использования ПК для
залось невероятно популярным благодаря тому, что уча- учебы, работы, творчества и развлечений. В реальном
стники постарались создать для посетителей не столько времени посетители смогли наблюдать за монтажом и
деловую атмосферу, сколько настроение праздника. И обработкой аудио- и видеофрагментов, работой в Интер-
именно поэтому интересно было присутствовать не толь- нете в составе беспроводной сети как в ее обычном виде,
ко специалистам интернет-технологий, но и самым про- с использованием коммутируемого доступа к Интернету,
стым пользователям, делающим свои первые шаги в уди- так и с применением мобильных GPRS-решений.
вительной стране Интернет. Посетители Брестского интернет-форума смогли позна-
Инициаторами и организаторами форума выступили го- комиться и с мобильными технологиями Intel. На стендах
родской портал «Виртуальный Брест» (http://virtual.brest.by) компаний ASBIS и «Успех» демонстрировались ноутбуки
и компьютерный салон «Успех» (http://204040.com). Цель на базе технологии Intel Centrino для мобильных ПК и кар-
интернет-форума заключалась в том, чтобы продемонст- манные компьютеры на основе технологии Intel XScale.
рировать возможности современных цифровых устройств На приглашение принять участие в первом интернет-
и решений для Интернета, и она была с блеском выполне- форуме откликнулось достаточно много участников. В пер-
на в ходе мероприятия. вую очередь, это интернет-проекты и организации города,
Генеральным спонсором интернет-форума стала кор- среди которых – ведущие дизайнерские студии, хостинг-
порация Intel. Ее специалисты продемонстрировали на провайдеры, общественные организации и т. д. И кроме
специально оборудованных стендах преимущества сис- того, не остались в стороне представители ведущего сото-
тем, построенных на основе компьютеров с процессора- вого оператора VELCOM, продемонстрировав преимуще-
ми Intel Pentium 4, в том числе с поддержкой революцион- ства работы мобильного Интернета по системе GPRS.
ной технологии Hyper-Threading. Работа и демонстрации После первой части, в рамках которой проходила выс-
велись в таких областях, как аудиообработка, цифровые тавка цифровых технологий, посетители были приглаше-
фото-, видеосъемка и монтаж, коммуникации (высокоско- ны на интернет-конференцию. В ходе ее были зачитаны
ростной доступ в Интернет), компьютерные игры, работа доклады ведущих специалистов не только города Брес-
с периферийными цифровыми устройствами (принтеры, та, но и республики. Слушатели смогли узнать об особен-
сканеры, фото-, видеокамеры и т. д.). ностях развития и построения сайтов в Беларуси, уточ-

4
репортаж

нить разнообразные вопросы электронной коммерции от- суары. Кроме того, особое внимание привлек розыгрыш до-
носительно национальных стандартов, на примерах раз- менных имен и хостинга от проекта HOSTER.BY. В ходе кон-
ных сайтов увидеть, как нужно и как не не нужно созда- курса, на который отозвались более 30 желающих, были
вать корпоративные решения для Интернета. В конферен- заданы несколько сложных вопросов, и по результатам от-
ции приняли участие специалисты Белорусского портала ветов эти специфические призы были распределены. Пос-
TUT.BY, Государственного Университета им. А.С. Пушки- ле розыгрыша посетители смогли задать свои вопросы док-
на, ведущих интернет-проектов города и т. д. ладчикам и участникам, а также познакомиться и пообщать-
По окончании конференции среди посетителей был про- ся на интересующие их темы.
веден розыгрыш ценных призов, предоставленных участни- Материалы, тезисы и доклады прошедшего интернет-
ками интернет-форума. Счастливчикам были в присутствии форума можно найти на официальном сайте http://
всех вручены современные модемы, оптические мышки, кла- bif.virtualbrest.com.
виатуры, наушники и разнообразные компьютерные аксес- Андрей Кухарчик

№7(8), июль 2003 5


из личного опыта

КАКИМ ВИДИТСЯ
ХОРОШИЙ
СИСТЕМНЫЙ
АДМИНИСТРАТОР

6
из личного опыта
Хороший системный администратор – как много в этих трех
Нет, я не Господь Бог, словах отзывается в сердце любого начальника. В самом
я всего лишь ваш деле, как распознать хорошего системного администрато-
Системный Администратор...
ра среди претендентов на вакантное место? Ведь что ни
(одно из частых высказываний говори, сисадмин в компании – одно из самых незаметных
сисадминов начальству) лиц и в то же время одно из самых важных. Именно от него
(от них, если их много) зависит, будут ли «бесперебойно
работать» ваши сотрудники, и сможете ли вы гарантировать
хоть какой-то уровень обслуживания своим клиентам.
Не стоит путать сисадмина с «аникейщиком». Если
первый рулит серверами и прочим оборудованием, то вто-
рой заменяет картриджи в принтерах, разбирается с не-
читающимися дисками и обьясняет пользователям, куда
и что надо нажать. (Термин «аникейщик» пошел с тех вре-
мен, когда программа выводила на экран сообщение
«press any key to continue» и пользователи, не находя кноп-
ки «any key» на клавиатуре, звали администратора.)
Я периодически с постоянством маятника бываю по
обе стороны «баррикад» и попытаюсь хоть чуть-чуть раз-
веять заблуждения, бытующие в обоих средах. Конечно,
как начальник я еще слаб, но мало кто аргументированно
сможет упрекнуть меня в том, что я плохой сисадмин.

Наиболее частые заблуждения


со стороны начальства
Зачем платить сисадмину $1000, когда на рынке
очень много предложений от людей, готовых работать
за $300-400.
Не забывайте, что скупой платит дважды. Квалифи-
цированный специалист не может стоить дешево, так же,
как вы не сможете найти новый S600 за $20000. Чем выше
квалификация специалиста, тем меньше он допустит про-
стоев в работе системы. Посчитайте, во сколько вам обой-
дется простой в 1 час (когда вообще все не работает) или
периодические перебои в работе в течение хотя бы одно-
го дня (то принтер не печатает, то почта не уходит, то те-
лефон не звонит)...
Зачем мне один сисадмин за $1000? Пусть будут
трое по $300.
Сисадмины – не токари у станка. И не стоит ожидать
от трех сисадминов того, что они разберутся с пробле-
мой быстрее одного за $1000. Плюс у трех сисадминов за
такую цену не будет такого же опыта, как у одного за
$1000. К сожалению, опыт – это такая величина, которая
очень редко поддается суммированию.
Хорошо, пусть будет сисадмин за $1000, но он дол-
жен знать (список из 40 пунктов: от протоколов и на-
стройки Windows до программирования сайта).
Сисадмин – не многорукий Шива. Он может одновре-
менно по телефону выяснять с секретаршей, почему у нее
принтер ничего не печатает, и выяснять, почему на сайте
показываются неактуальные цены, но будет делать это
хреновооо... Попросите своего главного бухгалтера од-
новременно с выставлением счетов партнерам обьяснять
клиенту что-нибудь, и все поймете моментально...
Хорошие сисадмины обычно являются профессиона-
ВЯЧЕСЛАВ КАЛОШИН лами в узкой области, поэтому не стоит специалиста по
сетям заставлять администрировать веб-сайт. Ничего хо-
рошего из этого обычно не получается. Хотя может по-

№7(8), июль 2003 7


из личного опыта
везти, и у вас будет многопрофильный специалист, кото- Признаки хорошего сисадмина
рый сможет и шлюз для подключения сотрудников из дома  В меру здоровая лень. Хороший сисадмин никогда на
настроить, и создать сайт для компании. Но такие редко вопрос «Что делаешь?» не ответит: «Вот, вышла но-
бывают, берегите их. вая софтина, ставлю на сервер». Если примерно 50%
А как узнать о том, что системный администратор времени сисадмин пьет чай и у вас все работает – силь-
хороший? Ведь на лице у него это не написано? но радуйтесь, очень сильно радуйтесь.
Ни в коем случае не полагайтесь на наличие/отсут-  Никогда не спрашивайте у сисадмина «Что делаешь?».
ствие сертификатов. Сертификаты – просто подтвержде- Спросите «Что сделал?» или «Что будешь делать?».
ние того, что человек заплатил деньги, прослушал курсы Многие сисадмины работают в прерывистом режиме:
и правильно поставил галочки на экзамене. Всё. Макси- пообщаются с друзьями, подумают, что-то подправят,
мум, что вы можете предположить – это наличие базовых почитают документацию и так далее по кругу. Это со-
знаний по предмету. Я знаю людей, которые могут гордо вершенно нормальный ритм работы.
показать сертификат MСSE, но все их попытки завести  Хороший сисадмин всегда готов предоставить полную
сервер так, чтобы он не требовал к себе внимания хотя информацию о системе, начиная с того, сколько про-
бы неделю, тщетны. Но я знаю и людей, которые имеют работал сервер, и заканчивая почасовым разбиением
сертификат CCNA и способны легко построить беспере- обьема скачанного на компьютер сотрудника Н. Не
бойно работающую сеть в десятке филиалов. По крайней увлекайтесь паранойей, он не читает вашу почту. Но
мере, поговорите с сисадмином из дружественной ком- готов дать вам информацию, сколько вы писем отпра-
пании и выясните реальную ценность сертификата. вили и какого они были обьема.
Единственно гарантированно работающий способ, ко-  Он всегда держит резервные копии. И просьба «Мне
торый я знаю – это присматриваться к сисадмину в тече- нужен этот файл таким, каким он был 4 месяца на-
ние испытательного срока. Если сисадмин хороший, ваша зад» не должна его удивлять.
компания не должна даже заметить, что появился новый  Привыкните к тому, что сисадмины – вечерне-ночные
человек (если до этого все работало хорошо) или все ста- существа. Дело в том, что серьезные работы лучше
ло работать лучше. Если же примерно дня через два пос- делать тогда, когда сервера меньше всего загружены.
ле того, как приняли на работу сисадмина, компанию на-  Хороший сисадмин обычно умеет очень хорошо гово-
чало лихорадить и лихорадило с день-два-неделю, а по- рить. Это легко вывести из предыдущих пунктов. Есть
том все вошло в норму и стало еще лучше – сисадмин немного свободного времени – почему бы не почитать
нормальный, но опыта маловато. А вот если все залихо- что-нибудь из художественной литературы и отдохнуть.
радило и продолжает лихорадить (сисадмин бегает от со- Дело начинается обычно с фантастики и заканчивает-
трудника к сотруднику и так далее) – срочно изменяйте ся классикой.
свою шкалу зарплаты для сисадмина и ищите нового.  Он никогда не бросает работу на полпути. Если что-то
В общем, рекомендации для выбора сисадмина в ос- сломалось, он уходит в авральный круглосуточный ре-
новном те же, что и для выбора главного бухгалтера. жим до починки. Если вы позаботитесь о том, чтобы
ему в 2 часа ночи привезли пиццу к серверу, находя-
Маленькие рекомендации щемуся в починке, то он будет благодарен вам и в бу-
для размещения сисадминов дущем горы для вас свернет.
 Если есть возможность, выделите для системного адми-  У хороших сисадминов что-то ломается редко. Это не
нистратора просторную комнату и дайте ему некоторую их стиль работы.
свободу действий. Хороший сисадмин через некоторое  Он не пьет пиво, вино, водку и прочий алкоголь на рабо-
время стащит в эту комнату все важное для работы ком- чем месте. Кофе или чай – легко. Алкоголем он нагружа-
пании оборудование. Обеспечьте этой комнате желез- ется в специально отведенных для этого местах. И чем
ную дверь (еще лучше, чтобы и охранник неподалеку си- выше качество (не количество!) алкоголя, тем лучше.
дел) и нормальную вентиляцию (сервера имеют тенден-  И наконец, он не болеет манией величия. Пользовате-
цию очень быстро греть воздух, но сами в жаре работать ли никогда от него не услышат обвинений в тупости и
не любят). Отныне эта комната – серверная. В ней бьет- то, что они его, такую сияющую вершину мироздания,
ся электронное сердце вашей компании. достали до колик в животе.
 Если серверная уже есть, пусть сисадмин сидит где-
нибудь неподалеку. Вы же не просите бухгалтера со- Основные ошибки сисадминов
ставить баланс, находясь дома.  Босс не понимает, что мне надо вот ЭТО.
 И ради бога, уберите подальше от него сотрудников с
кучей телефонов. Или наоборот, уберите сисадмина Вы разговариваете с ним на разных языках. Боссу нет
от них. Постоянные звонки при отладке оборудования никакого дела до какой-то железки и вашей нужды в ней.
раздражают гораздо сильнее, чем плохая секретарша. Но ему вовсе не безразлична работа компании и ее при-
 Хоть иногда прислушивайтесь к тому, что говорит вам быль. Сядьте, подумайте 5 минут и найдите толковое и
сисадмин. Да, иногда он разговаривает на другом язы- разумное обоснование тому, что вы просите. Если вы его
ке, но понять его можно, особенно если выделить ему не можете найти, не обижайтесь, что босс все выслушает
хотя бы полчаса и уведомить его об этом не за пять и вежливо отправит вас ни с чем. Научитесь выражать
минут. свои мысли не только словами «круто» и «рулез».

8
из личного опыта
Пример  он должен зайти в этот каталог и попытаться решить
Ваш workgroup-сервер начал «задыхаться». Да-да, ком- проблему выбора: что ему нужно очень, а что не очень;
пания растет, а сервер – нет. Пусть есть сервер PIII-500/  он должен найти место для того, чтобы положить не
256/20+20 stripe. Вы сели, подумали, посмотрели статис- очень нужное. В общем, как миниум, вы полчаса ото-
тику (см. ниже) и решили, что на следующий год компа- рвете у каждого, кто получил это сообщение.
нии нужен 2xPIII-1000/1024/80 raid5. Поглядели по прай-
сам и выяснили, что обойдется он в $5000 (условно). По- А теперь получайте проблемы, которые вы сами себе
шли к боссу. Просунули голову в дверь: «А... эта, Михаил создали:
Иванович, мне тут нужен сервер новый. $5000 стоит. Ну  невозможность собрать нормальный бэкап или воз-
эта... старый уже старый, и вообще, он уже не так рабо- можность его собрать с куда большими усилиями;
тает и не справляется». Думаете, это шутка? Нет, так про-  вы прививаете пользователю привычку хранить все на
исходило на моих глазах пару раз. Понятно, что потом своей машине. Как вы будете обьяснять боссу, что на
идут жалобы на черcтвость босса и вообще на плохую бухгалтерской машине (кстати, почему-то обычно са-
жизнь сисадминов. мой слабой из парка) пропал из-за поломки диска аван-
Подготовьте графики загрузки сервера хотя бы по совый отчет за прошлый год? И почему этот отчет не
процессору, памяти, сети и дискам. Покажите на них влез в дисковую квоту на живом сервере?
четкую черту, где возможностей сервера уже не будет  вы разрушаете структуру защиты сети (если есть, что
хватать. Распишите кратко, чем это грозит в перспек- разрушать). Пользователю будет проще перекинуть
тиве на 2-3 месяца и на полгода. Предложите желатель- файл по аське или открыть диск С: на запись, чем по-
ную конфигурацию и марку сервера и точно так же рас- ложить файл на сервер;
пишите, что изменится после его ввода в эксплуата-  вы потеряли возможность проверить этот файл в ав-
цию. Затем подойдете к секретарше и ласково догово- томате антивирусом. Береженого бог бережет.
ритесь, что она устроит так, что босс выделит вам пол-
часа и его никто не будет отвлекать телефонными звон- Не ударяйтесь в другую крайность: не потакайте
ками. Всё. 95% того, что сервер купят или включат в пользователям во всем. Пользователь должен быть как
бюджет следующего квартала. цыпленок под курицей. Хорошо, тепло, сухо и еды вдо-
 Не гонитесь за дешевизной. Да, 24-х портовый хаб за воль (говоря другими словами – все работает в удобном
$100 стоит в 10 раз дешевле Cisco2950. Но если вы для него режиме и ему не надо вспоминать ваш телефон
купите и поставите этот хаб в ядре сети из 100 компь- для выяснения вопроса о распечатке цветной диаграммы
ютеров, а на оставшиеся деньги увеличите себе винт на струйном принтере). Но цыпленок одновременно дол-
в машине, то не рассчитывайте оправдаться словами жен знать, что если он высунется из гнезда, то получит
«Михаил Иванович, а что я могу поделать...». Да, са- клювом по лбу. То есть сын секретарши не должен по ве-
мосборный сервер дешевле сервера от HP или IBM. черам ставить новые игры непонятно откуда, и менеджер
Но и работать под нагрузкой он будет во столько же не должен иметь возможности сменить Win2000 на WinXP
раз хуже. Поверьте моему опыту. только потому, что она красивее и вообще она новее и
 Собирайте статистику. Статистика – это не только по- дома у него такая. Пользователи должны знать, что им
вод построить красивые графики, но и мощный инст- можно и что нельзя. Для этого придумали такую вещь,
румент прогнозирования проблем и неприятностей. Вы как корпоративный кодекс, даже если корпорация состо-
же сами лучше поймете, почему вон тот хаб не пере- ит из 10 человек.
стает мигать лампочками. В общем, будьте строго добры к пользователям и они
ответят вам тем же.
Самая главная и распространенная ошибка
 Поймите, наконец, что не компания работает для вас,
и пользователи – не надоедливые «тупые человеч-
ки», которые отвлекают постоянно. Вы работаете для
компании и для того, чтобы эти «тупые человечки»
работали как можно более продуктивно. Если они
не понимают в компьютерах так же, как вы, то это
не означает, что вы понимаете в их области деятель-
ности так же, как они.

Пример
Рассылка по сети: «Немедленно всем почистить свои ка-
талоги на диске W:, а то удалю все, к чему не прикаса-
лись больше месяца. И вообще, сервер не резиновый и
все такое». Вы, извините, создаете проблемы себе, тор-
мозите работу компании и вообще...
Посмотрите на это со стороны пользователя:
 он должен прерваться и осмыcлить сообщение;

№7(8), июль 2003 9


bugtraq

Межсайтовый скриптинг при обработке Удаленное выполнение произвольного


некорректных XML-документов кода в Microsoft Internet Explorer
в Microsoft Internet Explorer Уязвимость обнаружена в Internet Explorer в механизме об-
Уязвимость обнаружена в Internet Explorer в обработчи- работки HTTP-ошибок. Удаленный пользователь может вы-
ке XML-документов. Удаленный атакующий может вы- полнить произвольный код в Local Zone на целевой системе.
полнить произвольный код сценария в контексте целе- Internet Explorer поставляется с несколькими файла-
вого веб-сайта. ми, отвечающими за обработку HTTP-ошибок («Friendly
Internet Explorer автоматически пытается анализиро- HTTP error messages»). Например, если «site.com» сгене-
вать любой XML-файл, который запрашивается браузе- рировал 404 HTTP-ошибку, то следующий внутренний URL
ром. Если анализ прошел успешно, в браузере пользова- будет отображен IE:
теля отобразится динамическое дерево различных XML-
элементов. Если при анализе возникает ошибка, Internet errorres://shdoclc.dll/404_HTTP.htm#http://site.com/file.html
Explorer отобразит ошибку вместе с URL запрашиваемо-
го XML-файла. Обнаружено, что вышеупомянутая процедура разбо-
В некоторых случаях отображенный URL не фильтрует- ра содержит недостаток, который может использоваться
ся на наличие HTML-кода. Фактически это означает, что для выполнения произвольного кода сценария в Local
наличие на вашем сайте XML-файла, который не может Zone. В результате удаленный атакующий может читать
быть правильно проанализирован Internet Explorer и MSXML, произвольные локальные файлы, выполнять произволь-
делает ваш сайт уязвимым к XSS-нападениям. ные команды и выполнять другие потенциально деструк-
Проблема была воспроизведена в различных установ- тивные действия.
ках, но GreyMagic не смог достоверно определить уязви- Удаленный атакующий может представить специаль-
мый компонент. Скорее всего, уязвимость затрагивает не- но обработанное значение после поля #sign, которое зас-
которые версии MSXML, а не Internet Explorer непосред- тавит функцию записать «javascript:» URL в отображае-
ственно. мую ссылку. Пример:
Пример:
res://shdoclc.dll/HTTP_501.htm#javascript: ↵
http://host.with.unparsable.xml.file ↵ %2f*://*%2falert(location.href)/
/flaw.xml?<script>alert(document.cookie)</script>
Чтобы проверить уязвимость, скопируйте URL в брау-
Microsoft смогла воспроизвести обнаруженный недо- зер и кликните на ссылку.
статок только на IE6 Gold. Как сообщает GreyMagic, они Уязвимость обнаружена в Microsoft Internet Explorer 5.5-6.0.
смогли воспроизвести уязвимость на следующих систе- Способов устранения обнаруженной уязвимости не су-
мах: IE5.5 NT4, IE6 Win98, IE6 Win2000. ществует в настоящее время.

Поднятие локальных привилегий Повышение локальных привилегий


в Sun Java Virtual Machine в Progress Database
на Linux-системах Уязвимость обнаружена в Progress Database в нескольких
Уязвимость обнаружена в Sun Java Virtual Machine. Ло- вспомогательных программах. Локальный пользователь
кальный пользователь может получить поднятые приви- может получить root-привилегии на целевой системе.
легии на системе. Sun Java Virtual Machine (JVM) на Linux- Сообщается, что когда выполняются некоторые вспо-
системах небезопасно сохраняет временные лог-файлы могательные файлы, база данных загружает общедоступ-
в '/tmp'-каталоге. Согласно сообщению, JVM создает файл ные файлы объектов с dlopen()-функцией, основываясь
'/tmp/jpsock.**_*' при загрузке, без предварительной про- на пути, определенном в переменной PATH. Локальный
верки существования файла, и если файл существует, не пользователь может изменить переменную PATH, чтобы
проверяет, кто его владелец. сослаться на другое местоположение, в котором распо-
Локальный пользователь может сконструировать сим- ложены альтернативные версии объектных файлов, ко-
вольную ссылку из произвольного файла к временному торые будут выполнены с root-привилегиями.
имени файла. Затем, когда целевой пользователь запус- Согласно сообщению, уязвимо большинство программ,
кает JVM, ссылающийся файл будет перезаписан с при- расположенных в '/usr/dlc/bin'-каталоге.
вилегиями целевого пользователя. Уязвимость обнаружена в Progress Database 9.1 – 9.1D06.
Уязвимость обнаружена в j2re1.4.1_02 on Linux. В качестве временного решения, можно удалить setuid
Способов устранения обнаруженной уязвимости не bit из уязвимых программ.
существует в настоящее время.

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

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

Часть 1

АНДРЕЙ БЕШКОВ
12
администрирование
С момента публикации первой статьи о Nagios прошло примеру, объект «Файл подкачки» содержит внутри
довольно много времени, но вопросы и пожелания все себя набор счетчиков, говорящих о состоянии одного
продолжают приходить. Самый часто встречающийся или нескольких файлов виртуальной памяти, исполь-
вопрос – как настроить слежение за серверами, работа- зуемых системой. Некоторые подсистемы имеют всего
ющими под управлением семейства операционных сис- один экземпляр объекта производительности, другие
тем Windows. В этой статье мы рассмотрим два спосо- же могут иметь несколько. К первому виду относятся
ба, используя которые можно добиться осуществления «Система», «Память», «Сервер». «Жесткий диск» и
наших желаний. Как всегда система, мониторинга Nagios «Процессор», соответственно, ко второму. Согласитесь,
работает под управлением моей любимой системы что жестких дисков в компьютере может быть несколь-
FreeBSD 4.7. Приверженцы Linux, Solaris и других Unix- ко, а значит, внутри системы они должны быть пред-
подобных систем тоже не останутся в стороне. Все опи- ставлены отдельными подсистемами. В то же время
санные ниже приемы с незначительными изменениями оперативная память, вне зависимости от количества
можно с успехом применять и в их системах. чипов, является единым компонентом. А посему иметь
В качестве подопытной системы будет использовать- больше одного экземпляра объекта производительно-
ся русская версия Windows 2000 Professional. Такой вы- сти ей не положено. В случае если подсистема облада-
бор обусловлен тем фактом, что настроить программ- ет несколькими экземплярами объекта, есть возмож-
ное обеспечение для исправной работы с русской вер- ность следить за счетчиками всех экземпляров или за
сией сложнее, чем с аналогичной английской. Придет- одним общим. В зависимости от языка операционной
ся решать проблемы, связанные с локализацией, а зна- системы, объекты и счетчики называются по-разному.
чит, статья получится гораздо полезнее и интереснее. К примеру, посмотрим, как будет называться один и тот
Последовательность действий по настройке программ- же счетчик в локализованных версиях Windows 2000:
ного обеспечения выглядит практически одинаково для
всех версий Windows. Я надеюсь, что никому из вас не
приходит в голову мысль серьезно рассматривать в ка-
честве операционной системы для установки на сер-
вер Windows 3.1, 3.11, 95, 98, ME. Поэтому дальше в этой
статье о них не будет сказано ни слова, соответственно,
вы можете с полным правом считать, что все методы, опи-
санные ниже, работать с ними, скорее всего, не будут. По моему мнению, идеи более глупой, чем подобное
В дальнейшем предполагается, что вы прочитали чрезмерное увлечение локализацией, придумать нельзя.
первую статью, подробно описывающую основы уста- Представьте себе процесс написания программы, ис-
новки и настройки Nagios, либо в февральском номере пользующей в своей работе счетчики. Придется посто-
журнала «Системный администратор», либо на моем янно переделывать программу для каждой новой лока-
сайте http://onix.opennet.ru/. лизованной версии Windows. В дальнейшем все приво-
Покончив с формальностями, приступим к изучению димые примеры будут опираться на русские версии пе-
конструкции и принципов работы подсистемы сбора дан- речисленных операционных систем семейства Windows.
ных о производительности. Такая система встроена в каж- Чтобы закрепить все вышесказанное, давайте рас-
дую версию Windows-системы старше, чем Windows ME. смотрим несколько примеров счетчиков:
Для сбора статистики о своем функционировании
Windows NT, Windows 2000, Windows XP используют \\TIGROID\Ïðîöåññîð(_Total)\% çàãðóæåííîñòè ïðîöåññîðà
объекты производительности. Делать подобные утвер- \\TIGROID\Ïðîöåññîð(0)\% çàãðóæåííîñòè ïðîöåññîðà
ждения о Windows 2003 не буду, потому что потрогать
\\TIGROID\Ïðîöåññîð(1)\% çàãðóæåííîñòè ïðîöåññîðà
ее пока не удалось. Каждый компонент системы в про-
цессе работы генерирует данные о производительнос- Первый компонент – это имя моего домашнего компь-
ти и складывает их в счетчики (performance counters) ютера, на котором я пишу статьи и провожу тестовые ин-
собственного объекта производительности. На самом сталляции. «Процессор» – название объекта. Как вы мог-
деле объект – это абстракция, введенная для облегче- ли бы догадаться, (_Total) – экземпляр, инкапсулирующий
ния понимания материала. Логичнее всего было бы внутри себя данные о производительности всех процес-
представлять объект как группу счетчиков, связанную соров системы. Соответственно, (0) и (1) – экземпляры
с наблюдаемой службой или ресурсом. Чаще всего на- объектов первого и второго процессоров. И наконец, «%
звание объекта совпадает с названием родительского загруженности процессора» – название самого счетчика.
системного компонента. В большинстве случаев объек- В повседневной практике сложилась традиция для крат-
ты производительности соответствуют компонентам кости записывать названия счетчиков без имен компью-
оборудования компьютера – память, процессор, жест- теров. Я считаю, что нам также стоит придерживаться ее.
кие диски. В то же время многие службы и программы Счетчики бывают следующих типов:
могут создавать свои собственные объекты произво-  Моментальный – всегда содержит последнее значение
дительности. Иллюстрацией такого утверждения явля- использования ресурса. В качестве разъяснения приво-
ются объекты службы «Обозреватель компьютеров» дим счетчик \Очередь печати(_Total)\Заданий, собираю-
или серверной программы Internet Information Server. К щий данные о количестве заданий в очереди печати.

№7(8), июль 2003 13


администрирование
 Усредненный – хранит среднее число, созданное на узнать, как правильно называется тот или иной счетчик,
основе двух последних значений счетчика. Примером добавьте его в список отображения. Очень полезно во
такого типа является счетчик \Память\Страниц/сек., со- время просмотра списка доступных счетчиков нажать
держащий в себе среднее значение частоты смены кнопку «Объяснения», так как названия счетчиков недо-
страниц памяти в секунду. статочно информативны. К примеру, как вам такой ше-
девр ясности с первого взгляда: «% времени DPC»? Лад-
Существует возможность создавать счетчики дру- но, оставим названия на совести создателей системы.
гих типов. Но для этого необходимо иметь пакет Platform Хотя если есть желание, можно нажать кноку “Объясне-
Software Development Kit. Впрочем, обсуждение подоб- ние” и на экране появится маленькое окошко с кратким и
ных методик выходит далеко за границы этой статьи. не всегда понятным объяснением предназначения того или
Просмотреть список объектов и счетчиков, существу- иного счетчика. Выбрав нужный счетчик, жмем кнопку
ющих в системе, а также полюбоваться на их содержи- «Добавить». Затем правой клавишей мыши щелкаем в
мое можно с помощью модуля «Монитор производи- центре графика и выбираем пункт меню «Свойства». В
тельности», входящего в состав консоли управления появившемся диалоговом окне наше внимание привле-
Microsoft. А если говорить совсем просто, то открыть кает вкладка «Данные».
вышеописанный модуль можно выполнив программу
perfmon.exe. После ее запуска мы должны увидеть при-
мерно такое окно:

Теперь-то каждый из вас сможет не только выбрать


счетчики по вкусу, но и правильно записать их название.
Ну а если самому от руки перепечатывать названия счет-
чиков в другие программы не хочется, то можно выпол-
нить еще одну хитрость.
Правой клавишей кликаем в центр графика и выбира-
Рассмотрим подробнее, что за чудо дизайна пред- ем «Сохранить как». В открывшемся диалоге вводим имя
стало перед нами. Слева мы видим дерево модуля, файла test.html и жмем “Сохранить”. Затем любым редак-
справа – координатная плоскость для отображения гра- тором открываем получившийся файл и среди кучи вся-
фиков. Сверху у нас находится панель инструментов. ких ненужных данных, ближе к концу файла, видим пол-
Ну а внизу – список счетчиков, используемых для пост- ное и правильно написанное название счетчика. Затем с
роения графика. Для добавления еще одного счетчика помощью буфера обмена его можно будет вставить в
в список нажимаем кнопку «+», находящуюся на пане- любую программу.
ли инструментов. Вкратце обсудив принципы, лежащие в основе сбора
данных о производительности Windows-машин, посмот-
рим, как можно с пользой для дела применять только что
полученные знания.
Подопытная Windows-машина называется win2000rus.
Для начала давайте выполним обязательные действия,
необходимые для того, чтобы Nagios узнал об этой маши-
не. Делать это придется вне зависимости от того, какой
способ мониторинга мы изберем. Поэтому внесем ее дан-
ные в файл hosts.cfg.

# Îïèñûâàåì õîñò ïî èìåíè win2000rus


define host{
use generic-host
host_name win2000rus
alias Windows 2000 Russian
address win2000rus
check_command check-host-alive
max_check_attempts 10
С помощью такого диалога можно просмотреть пол- notification_interval 120
ный список счетчиков, объектов и их экземпляров, суще- notification_period 24x7
notification_options d,u,r
ствующих в системе на данный момент. Для того чтобы }

14
администрирование
Теперь добавляем его в файл hostgroups.cfg, описы- С сайта производителя http://nsclient.ready2run.nl/
вающий группы хостов. download.htmhttp://nsclient.ready2run.nl берем последнюю
версию программы NSClient. Я использовал версию 1.0.7.1.
define hostgroup{ После распаковки дистрибутива должны появиться сле-
hostgroup_name win-servers
alias Windows Servers дующие директории:
contact_groups win-admins
members win2000rus
 LinuxBin – исполняемые файлы для Linux;
}  UnixSource – исходный код для всех версий Unix;
 NTSource – исходный код для всех версий Windows;
Создаем в файле contacts.cfg запись для человека,  Win_2k_XP_Bin – исполняемые файлы для Windows 2000
отвечающего за Windows-сервера. и XP;
 Win_NT4_Bin – исполняемые файлы для Windows NT.
define contact{
contact_name serge
alias Sergei Petrov Заглянув в директорию NTSource, понимаем – про-
service_notification_period 24x7 грамма написана на Delphi. Впрочем, это обстоятель-
host_notification_period 24x7
service_notification_options w,u,c,r ство никоим образом не мешает нам использовать ее
host_notification_options d,u,r для своих далеко идущих целей. Создаем директорию
service_notification_commands notify-by-email, ↵
notify-by-epager c:\Program Files\NSClient. Затем, в зависимости от ус-
host_notification_commands host-notify-by-email, ↵ тановленной у нас операционной системы, копируем в
host-notify-by-epager
email serge@test.ru нее содержимое либо из директории Win_2k_XP_Bin,
pager 172345885@pager.icq.com либо из Win_NT4_Bin. Пользуясь меню Пуск → Выпол-
}
нить запускаем командный интерпретатор cmd.exe. В
Пожалуйста, убедитесь, что вы внесли группу контак- появившемся окне набираем:
тов win-admins в файл contactgroups.cfg.
> C:\Program Files\NSClient\pNSClient /install
define contactgroup{
contactgroup_name win-admins
alias Windows admins По окончании установки система должна продемонст-
members serge рировать нам подобное окошко:
}

NSClient
Закончив с обязательными действиями, перейдем к об-
суждению первого способа мониторинга. Он состоит в
том, чтобы установить на Windows-машину программу
NSClient, доставшуюся нам в наследство от проекта
NetSaint. Запустившись как сервис, она начнет через каж- Это значит, что программе удалось прописать себя в
дые пять секунд читать содержимое определенных сис- реестре подобающим образом.
темных счетчиков Windows. Полученные величины запи- С помощью программы regedit откроем реестр. Ищем вет-
сываются в круговой буфер, в котором хранятся данные ку \HKEY_LOCAL_MACHINE\SOFTWARE\NSClient\Params.
за последние 24 часа. Занимаясь сбором статистики, про- Внутри расположились параметры password и port.
грамма ожидает входящие соединения от клиентов на Я думаю, предназначение каждого из них очевидно. Ду-
1248-й порт. Для считывания данных и передачи их сер- маю, вы согласитесь с утверждением, что возможность
веру мониторинга будет использоваться программа просматривать статистику должна быть предоставле-
check_nt из стандартной коллекции модулей Nagios. на только программам, запущенным на сервере мони-
Давайте посмотрим, какие именно сведения о функ- торинга. Меняем содержимое параметра “password” на
ционировании подопытного Windows-сервера можно по- что-нибудь длинное и трудноподбираемое, например
лучить с помощью check_nt: «PxRT890mY».
 загрузка одного или всех процессоров за последние
24 часа;
 наличие свободного места на любом подключенном к
системе жестком диске;
 состояние запущенных процессов;
 данные об использовании оперативной памяти;
 время работы системы с момента последней пере-
загрузки;
 состояние запущенных сервисов;
 дату изменения любого файла;
 данные любого системного счетчика.

Покончив с теорией, перейдем к инсталляции. Теперь любой, кто попытается подключиться для по-

№7(8), июль 2003 15


администрирование
лучения данных на порт 1248, должен будет предъявить âèðòóàëüíîé ïàìÿòè"
NT4_MemoryCommitByte = "\Ïàìÿòü\Áàéò âûäåëåííîé ↵
пароль. âèðòóàëüíîé ïàìÿòè"
Проверим, как себя чувствует наш новый сервис
W2K_SystemTotalProcessorTime = "\Ïðîöåññîð(_Total) ↵
NetSaint NT agent. Выбираем меню Пуск → Настройка → \% çàãðóæåííîñòè ïðîöåññîðà"
Панель управления. Затем дважды кликаем по пиктог- W2K_SystemSystemUpTime = "\Ñèñòåìà\Âðåìÿ ðàáîòû ñèñòåìû"
W2K_MemoryCommitLimit = "\Ïàìÿòü\Ïðåäåë âûäåëåííîé ↵
рамме «Администрирование», в открывшемся окне так âèðòóàëüíîé ïàìÿòè"
же поступаем со значком «Службы». Должно получиться W2K_MemoryCommitByte = "\Ïàìÿòü\Áàéò âûäåëåííîé ↵
âèðòóàëüíîé ïàìÿòè"
что-то подобное:
Сохранив файл, перезапускаем сервис NetSaint NT agent.
Тем, кому религия не позволяет вносить изменения в фай-
лы собственноручно, предлагаю скачать модифицирован-
ную версию здесь: http://onix.opennet.ru/files/. Еще раз бег-
ло просматриваем журнал событий, дабы убедиться в от-
сутствии ошибок при перезапуске сервиса. Также стоит
удостовериться, что вся цепочка событий происходила в
таком порядке:
Запустив службу и вернувшись в окно «Администри-
рование», щелкаем по значку «Просмотр событий». Во NSClient is now responding to queries.
NSClient 1.0.7.0 has started. Language code : 0x0419
вновь открывшемся окне выбираем «Журнал приложе- NSClient is reading C:\Program Files\NSClient\counters.defs ↵
ний». Находим уведомление от программы NSClient и кли- for counters definitions. Language code : 0x0419
NSClient has stopped
каем на нем дважды.
Закончив возню с Windows, переходим к Unix. В даль-
нейшем я предполагаю, что Nagios установлен в дирек-
торию /usr/local/nagios/. Запускается он с правами пользо-
вателя nagios, принадлежащего к группе nagios.
По крайней мере, именно так это происходит во
FreeBSD. Если вы используете другую операционную си-
стему, то вполне возможно настройки будут слегка от-
личаться. Для начала берем на сайте проекта Nagios
http://www.nagios.org/download/ самую свежую версию
модулей. В моем случае это был файл nagiosplug-1.3-
beta1.tar.gz. Распакуем архив:

# tar zxvf nagiosplug-1.3-beta1.tar.gz

К сожалению, в официальном пакете модулей, под-


ключаемых к Nagios, находится старая версия исходно-
го текста программы check_nt. Если оставить все как
есть, то некоторые функции сбора данных станут для нас
недоступны.
Нам нужно было увидеть следующую строку «NSClient Сейчас мы легко в течение нескольких секунд устра-
1.0.7.0 has started. Language code : 0x0419», опираясь на ним это досадное неудобство. Из дистрибутива, остав-
ее содержимое, мы можем узнать цифровой код языка, ленного на Windows- машине, берем файл check_nt.c,
используемого в системе. Для русского языка это 0x0419, расположившийся в директории UnixSource, и заменяем
а для английского, соответственно, 0x0409. В файле им старую версию, находящуюся на Unix-машине в ди-
C:\Program Files\NSClient\counters.defs находится описа- ректории ./nagiosplug-1.3-beta1/plugins/.
ние системных счетчиков для всех известных програм- Осталось исправить еще одну ошибку. Она касает-
ме языков. Просмотрев его до конца, понимаем, что ко- ся только тех, кто использует FreeBSD или Solaris. От-
дом 0x0419 тут явно не пахнет. Отсюда вывод – для рус- крываем файл ./nagiosplug-1.3-beta1/plugins/utils.c и
ской версии Windows получим дырку от бублика вместо ищем там строку:
статистики. Осознав, что такое несправедливое положе-
ние вещей нас не устраивает, добавляем в counters.defs nchars = vsnprintf (str, size, fmt, ap);
новую секцию с названиями счетчиков, соответствую-
щими нашему языку: Найдя, заменяем ее на вот это:

[0x0419] nchars = vsprintf (str, fmt, ap);


Description = "Russian"
NT4_SystemTotalProcessorTime = "\Ñèñòåìà\% çàãðóçêè ↵
ïðîöåññîðà" Если не выполнить исправления, то все результаты
NT4_SystemSystemUpTime = "\Ñèñòåìà\Âðåìÿ ðàáîòû ñèñòåìû"
NT4_MemoryCommitLimit = "\Ïàìÿòü\Ïðåäåë âûäåëåííîé ↵ работы модуля check_nt будут выглядеть таким образом:

16
администрирование
Memory usage: total:??????? Mb - used: ??????? Mb (???????%) ↵ # Êîìàíäà check_nt_memuse. Ïîêàçûâàåò äàííûå îá èñïîëüçîâàíèè
- free: ??????? Mb (???????%) # ïàìÿòè. Èìååòñÿ â âèäó âèðòóàëüíàÿ ïàìÿòü.
define command{
c:\ - total: ??????? Gb - used: ??????? Gb (???????%) ↵ command_name check_nt_memuse
- free ??????? Gb (???????%) command_line $USER1$/check_nt -H $HOSTADDRESS$ ↵
CPU Load (1 min. 12??????? -v MEMUSE -w $ARG1$ -c $ARG2$ -s $ARG3$
}
Смотрится такое сборище вопросов весьма забавно.
Жаль, но для нас такие данные абсолютно бесполезны. # Êîìàíäà check_nt_uptime. Îòîáðàæàåò âðåìÿ ðàáîòû ñèñòåìû
# ñ ìîìåíòà ïîñëåäíåé ïåðåçàãðóçêè
После работы над ошибками, возвратившись в главную define command{
директорию дистрибутива, проводим конфигурирование, command_name check_nt_uptime
command_line $USER1$/check_nt -H $HOSTADDRESS$ ↵
сборку и инсталляцию. -v UPTIME -s $ARG1$
}
# cd ..
# ./configure --prefix=/usr/local/nagios ↵
--with-nagios-user=nagios --with-nagios-grp=nagios # Êîìàíäà check_nt_disk_space. Îòîáðàæàåò ðàçìåð ñâîáîäíîãî
# gmake all # ïðîñòðàíñòâà íà ëþáîì æåñòêîì äèñêå ñèñòåìû
# gmake install define command{
command_name check_nt_disk_space
command_line $USER1$/check_nt -H $HOSTADDRESS$ ↵
Стоит отметить тот факт, что для компиляции исполь- -v USEDDISKSPACE –l $ARG1$ -w $ARG2$ ↵
зуется gmake вместо стандартной утилиты make. Иначе -c $ARG3$ -s $ARG4$
}
сборка сразу же после старта заканчивается сообщени-
ем о фатальной ошибке:
# Îïèñûâàåì êîìàíäó check_nt_service. Ïîçâîëÿåò ïðîâåðèòü,
# çàïóùåí ëè â ñèñòåìå òîò èëè èíîé ñåðâèñ. Îáðàòèòå âíèìàíèå
Making all in plugins # íà íåîáÿçàòåëüíóþ îïöèþ -d SHOWALL, ïîçâîëÿþùóþ âûâåñòè
“/tmp/nagiosplug-1.3-beta1/plugins/Makefile”, line 760: ↵ # áîëåå ïîäðîáíûå äèàãíîñòè÷åñêèå ñîîáùåíèÿ.
Need an operator define command{
make: fatal errors encountered – cannot continue command_name check_nt_service
*** Error code 1 command_line $USER1$/check_nt -H $HOSTADDRESS$ ↵
-v SERVICESTATE -d SHOWALL –l $ARG1$ ↵
По завершению инсталляции приступаем к созданию -s $ARG2$
}
новых команд, пользуясь которыми Nagios будет собирать
данные. Описание всех используемых команд должно
# Ñàìàÿ ïðîñòàÿ èç âñåõ âûøåîïèñàííûõ êîìàíä
располагаться в файле checkcommands.cfg. Формат это- # check_nt_client_version ïîçâîëÿåò óçíàòü âåðñèþ
го файла довольно прост. # ïðîãðàììû NSClient., ðàáîòàþùóþ â ñèñòåìå
define command{
Каждая команда начинается с открывающего тега command_name check_nt_client_version
define command{. Затем с помощью ключевого слова command_line $USER1$/check_nt -H $HOSTADDRESS$ ↵
-v CLIENTVERSION –s $ARG1$
command_name определяется имя команды. Следующая }
строка command_line определяет имя модуля, вызывае-
мого для осуществления проверки и параметры, переда- # Êîìàíäà check_nt_file_age äàåò âîçìîæíîñòü ïðîâåðèòü âðåìÿ
ваемые ему процессом Nagios. Особое внимание следу- # ìîäèôèêàöèè ëþáîãî ôàéëà íà ëîêàëüíîé ìàøèíå
define command{
ет обратить на макросы подстановки значений $USER1$, command_name check_nt_file_age
$HOSTADDRESS$, $ARG1$, $ARG2$. command_line $USER1$/check_nt -H $HOSTADDRESS$ ↵
-v FILEAGE -l $ARG1$ -w $ARG2$ ↵
Давайте посмотрим, зачем нужен каждый из них: -c $ARG3$ -s $ARG4$
 $USER1$ – путь, где нужно искать выполняемые моду- }
ли. В нашем случае он равен /usr/local/nagios/libexec/.
Значение этого макроса определяется в файле # Îïðåäåëÿåì êîìàíäó check_nt_process. Ïðåäîñòàâëÿåò
# ìåõàíèçì, ñ ïîìîùüþ êîòîðîãî ìîæíî óçíàòü, ñóùåñòâóåò ëè
resource.cfg; # â ñèñòåìå òîò èëè èíîé ïðîöåññ. Îáðàòèòå âíèìàíèå
 $HOSTADDRESS$ – IP-адрес машины, подвергаемой # íà íåîáÿçàòåëüíóþ îïöèþ -d SHOWALL, ïîçâîëÿþùóþ âûâåñòè
# áîëåå ïîäðîáíûå äèàãíîñòè÷åñêèå ñîîáùåíèÿ î ñîñòîÿíèè
проверке. Задается в определении сервисов внутри # ïðîöåññà.
файла services.cfg; define command{
 $ARG1$, $ARG2$ – параметры командной строки, пе- command_name check_nt_process
command_line $USER1$/check_nt -H $HOSTADDRESS$ ↵
редаваемые модулю проверки. Чаще всего использу- -v PROCSTATE –d SHOWALL -l $ARG1$ -s $ARG2$
}
ются для задания временных интервалов, порогов пре-
дупреждений и критических состояний.
# Êîìàíäà check_nt_counter äàåò âîçìîæíîñòü ïðîñìîòðåòü
# ñîäåðæèìîå ëþáîãî ñ÷åò÷èêà ïðîèçâîäèòåëüíîñòè, è ïîýòîìó
Завершается определение команды с помощью зак- # ÿâëÿåòñÿ ñàìîé óíèâåðñàëüíîé èç âñåõ îïèñàííûõ êîìàíä.
define command{
рывающего тега }. Итак, приступим к разбору содержи- command_name check_nt_counter
мого файла checkcommands.cfg. command_line $USER1$/check_nt -H $HOSTADDRESS$ ↵
-v COUNTER -l $ARG1$ -w $ARG2$ ↵
-c $ARG3$ -s $ARG4$
# Îïðåäåëÿåì êîìàíäó check_nt_cpuload . Èñïîëüçîâàòüñÿ îíà }
# áóäåò äëÿ ñáîðà äàííûõ î çàãðóæåííîñòè ïðîöåññîðà
define command{
command_name check_nt_cpuload После того как с файлом команд покончено, перей-
command_line $USER1$/check_nt -H $HOSTADDRESS$ ↵
-v CPULOAD -l $ARG1$ -s $ARG2$ дем к файлу сервисов. Детально формат этого файла
} рассматривался в первой статье о Nagios. Здесь мы только

№7(8), июль 2003 17


администрирование
рассмотрим формат строчки check_command, напрямую max_check_attempts 3
normal_check_interval 1
связанной с обсуждавшимися ранее макросами и $ARG1$ retry_check_interval 1
в частности. contact_groups win-admins
notification_interval 120
notification_period 24x7
check_command check_nt_process!"calc.exe,notepad.exe, ↵ notification_options c,r
mspaint.exe"!PxRT890mY # Âñå ïóòè ê ôàéëàì äîëæíû ñîäåðæàòü äâîéíîé ñèìâîë «\».
check_command check_nt_file_age!"c:\\upload\\update.dbf ↵
В приведенной выше строке check_command – клю- "!70!90!PxRT890mY
}
чевое слово, check_nt_process – название макрокоман-
ды, описанной с файле checkcommands.cfg. Все пара-
# Ýòîò ñåðâèñ ïîêàçûâàåò êîëè÷åñòâî ñâîáîäíîé âèðòóàëüíîé
метры, передаваемые макросам $ARG1$, $ARG2$, # ïàìÿòè, êîòîðîå âû÷èñëÿåòñÿ òàêèì îáðàçîì.
$ARG3$ и так далее, должны быть отделены друг от дру- # NSClient ÷èòàåò ñîäåðæèìîå ñ÷åò÷èêà
# «\Ïàìÿòü\Ïðåäåë âûäåëåííîé âèðòóàëüíîé ïàìÿòè»
га восклицательным знаком. Таким образом, выходит, # è äåëèò åãî íà 100. Òàê ïîëó÷àåòñÿ âåëè÷èíà, ïîêàçûâàþùàÿ,
что значение "calc.exe,notepad.exe,mspaint.exe" будет пе- # ñêîëüêî áàéò ïàìÿòè ïðèíèìàåòñÿ çà îäèí ïðîöåíò.
# Çàòåì äàííûå èç ñ÷åò÷èêà
редано в $ARG1$, а пароль PxRT890mY – в $ARG1$. # «\Ïàìÿòü\Áàéò âûäåëåííîé âèðòóàëüíîé ïàìÿòè»
Определившись с синтаксисом, переходим к файлу # äåëÿòñÿ íà êîëè÷åñòâî áàéò â îäíîì ïðîöåíòå.
# Òàê ìû óçíàåì, ñêîëüêî ïðîöåíòîâ çàíÿòî.
services.cfg: # Ê ñ÷àñòüþ, ëè÷íî çàíèìàòüñÿ ïîäîáíûìè îïåðàöèÿìè
# íåò íåîáõîäèìîñòè. NSClient ñäåëàåò âñå ñàì.
# Íà íàøåì ñåðâåðå ðàáîòàþò íåñêîëüêî ñàìîäåëüíûõ ïðîãðàìì. define service{
# Îíè äîëæíû âûïîëíÿòüñÿ êðóãëîñóòî÷íî, ïîýòîìó ìû ñîçäàëè use generic-service
# ñëåäóþùèé ñåðâèñ. host_name win2000rus
# Äëÿ ïðèìåðà áóäóò èñïîëüçîâàòüñÿ îáùåäîñòóïíûå ïðîãðàììû service_description Free Memory
# «Êàëüêóëÿòîð», «Paint», «Áëîêíîò», ïîñòàâëÿþùèåñÿ is_volatile 0
# ñ êàæäûì äèñòðèáóòèâîì Windows. check_period 24x7
define service{ max_check_attempts 3
use generic-service normal_check_interval 1
host_name win2000rus retry_check_interval 1
service_description User Programs contact_groups win-admins
is_volatile 0 notification_interval 120
check_period 24x7 notification_period 24x7
max_check_attempts 3 notification_options c,r
normal_check_interval 1 # Ïåðåõîä â ñîñòîÿíèå ïðåäóïðåæäåíèÿ ïðîèñõîäèò, åñëè çàíÿòî
retry_check_interval 1 # 70% ïàìÿòè. Êðèòè÷åñêèé ñòàòóñ íàñòóïàåò, êîãäà
contact_groups win-admins # èçðàñõîäîâàíî 90% ïàìÿòè.
notification_interval 120 check_command check_nt_memuse!70%!90%!PxRT890mY
notification_period 24x7 }
notification_options c,r
# Îáðàòèòå âíèìàíèå íà òîò ôàêò, ÷òî ìû ñëåäèì íå çà ñàìèìè
# ïðîãðàììàìè, à çà èõ ïðîöåññàìè â ïàìÿòè. Èìåíà ïðîöåññîâ # Ýòîò ñåðâèñ ïîçâîëÿåò óâèäåòü çàãðóçêó ïðîöåññîðà.
# ìîæíî óçíàòü ñ ïîìîùüþ âñòðîåííîãî â Windows ñòàíäàðòíîãî define service{
# äèñïåò÷åðà çàäà÷. Òàêæå ñòîèò âíèìàòåëüíî ïðèñìîòðåòüñÿ use generic-service
# ê ôîðìàòó ñïèñêà ïðîöåññîâ. host_name win2000rus
check_command check_nt_process!"calc.exe,notepad.exe, ↵ service_description CPU Load
mspaint.exe"!PxRT890mY is_volatile 0
} check_period 24x7
max_check_attempts 3
normal_check_interval 1
# Ýòîò ñåðâèñ ïîêàçûâàåò âåðñèþ ïðîãðàììû NSClient, retry_check_interval 1
# ðàáîòàþùåé â ñèñòåìå. contact_groups win-admins
define service{ notification_interval 120
use generic-service notification_period 24x7
host_name win2000rus notification_options c,r
service_description NSClient Version # Íàãðóçêà ñ÷èòàåòñÿ â èíòåðâàëå çà îäíó ìèíóòó. Ïåðåõîä
is_volatile 0 # â ñîñòîÿíèå ïðåäóïðåæäåíèÿ ïðîèñõîäèò ïðè äîñòèæåíèè óðîâíÿ
check_period 24x7 # â 80%, à êðèòè÷åñêèé ñòàòóñ íàñòóïàåò, åñëè çàãðóçêà 90%
max_check_attempts 3 # è áîëåå. Âñå ýòè õàðàêòåðèñòèêè çàäàþòñÿ öèôðàìè 1, 80, 90.
normal_check_interval 1 check_command check_nt_cpuload!1,80,90!PxRT890mY
retry_check_interval 1 }
contact_groups win-admins
notification_interval 120
notification_period 24x7 # Âðåìÿ áåñïåðåáîéíîé ðàáîòû ñèñòåìû ñ ìîìåíòà ïîñëåäíåé
notification_options c,r # ïåðåçàãðóçêè.
# Ôîðìàò êîìàíäû î÷åíü ïðîñòîé.  $ARG1$ ïåðåäàåòñÿ ïàðîëü define service{
check_command check_nt_client_version!PxRT890mY use generic-service
} host_name win2000rus
service_description Up time
is_volatile 0
# Êàæäûé ÷àñ óäàëåííûé ñåðâåð áàçû äàííûõ êëàäåò â ëîêàëüíóþ check_period 24x7
# ïàïêó îáùåãî äîñòóïà c:\upload\ ôàéë update.dbf. Â ýòîì max_check_attempts 3
# ôàéëå íàõîäÿòñÿ îáíîâëåíèÿ áàçû äàííûõ. normal_check_interval 1
# Åñëè âðåìÿ ñîçäàíèÿ ôàéëà íå ìåíÿåòñÿ áîëüøå, ÷åì 70 ìèíóò, retry_check_interval 1
# çíà÷èò, ïðîèñõîäèò ÷òî-òî íåõîðîøåå, è íóæíî ïåðåéòè contact_groups win-admins
# â ñîñòîÿíèå ïðåäóïðåæäåíèÿ. notification_interval 120
#  ñëó÷àå, êîãäà íåò èçìåíåíèé â òå÷åíèè 90 ìèíóò, ñåðâèñ notification_period 24x7
# ïåðåõîäèò â êðèòè÷åñêîå ñîñòîÿíèå. notification_options c,r
define service{ check_command check_nt_uptime!PxRT890mY
use generic-service }
host_name win2000rus
service_description File age
is_volatile 0 # Ïðîâåðÿåì, ôóíêöèîíèðóåò ëè ñåðâèñ MS SQL SERVER
check_period 24x7 # è ñàìîïèñíûé ñåðâèñ vmxposman.

18
администрирование
define service{ check_command check_nt_counter! ↵
use generic-service "\Ôàéë ïîäêà÷êè(_Total)\% èñïîëüçîâàíèÿ", ↵
host_name win2000rus "Usage %.2f %%"!80%!90%!PxRT890mY
service_description CPU Load }
is_volatile 0
check_period 24x7
max_check_attempts 3 Стоит отметить тот факт, что названия счетчиков, ис-
normal_check_interval 1
retry_check_interval 1 пользуемых в определении двух последних сервисов, на-
contact_groups win-admins писаны русскими буквами в кодировке cp1251.
notification_interval 120
notification_period 24x7 Если нарушить это требование, то NSClient не смо-
notification_options c,r жет понять, чего мы хотим от него добиться, и будет
# Ïðîáëåìà â òîì, ÷òî â ïðîãðàììå óïðàâëåíèÿ ñåðâèñàìè
# Windows ïîêàçûâàåò ïîëíûå íàçâàíèÿ ñåðâèñîâ, возвращать заведомо неправильные данные. Кодиров-
# ïðåäíàçíà÷åííûå äëÿ ÷åëîâåêà. ка cp1251 используется для записи текстов по умолча-
# Íàì íóæíî íàçâàíèå, êîòîðîå èñïîëüçóåòñÿ äëÿ âíóòðåííèõ íóæä
# Windows. Óçíàòü ýòó òàéíó ìîæíî ëèáî ïîñìîòðåâ âåòâü ðååñòðà: нию всеми русскими Windows-системами.
# HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services., Вот тут-то нас и поджидает проблема. Дело в том, что в
# ëèáî óñòàíîâèâ áåñïëàòíóþ óòèëèòó 'Service Manager NT',
# äîñòóïíóþ äëÿ ñêà÷èâàíèÿ ïî ñëåäóþùåìó àäðåñó: http://www большинстве Unix-подобных систем для символов русско-
# rnks.informatik.tu-cottbus.de/~fsch/english/nttols.htm го языка используется кодировка KOI8-R. Конечно, можно
# Îáðàòèòå âíèìàíèå íà òîò ôàêò, ÷òî ïî àíàëîãèè ñ ïðîöåññàìè
# èìåíà ñåðâèñîâ òîæå ìîæíî ïåðå÷èñëÿòü ÷åðåç çàïÿòóþ. перенастроить консоль, на которой работаете под cp1251,
check_command check_nt_service!”mssqlserver,vmxposman” но такой подход лично мне кажется неудобным.
}
Поэтому я поступил гораздо проще. Используя FTP,
перенес файл checkcommands.cfg на Windows-машину.
# Ñëåäèì çà êîëè÷åñòâîì çàäàíèé, íàõîäÿùèõñÿ
# â î÷åðåäè ïðèíòåðà. Затем с помощью стандартного редактора «Блокнот» внес
define service{ требуемые изменения. Сохранился, перенес файл обрат-
use generic-service
host_name win2000rus но на Unix-машину и заменил старую копию в /usr/local/
service_description Print Queue nagios/etc/.
is_volatile 0
check_period 24x7 В принципе нужного результата можно добиться раз-
max_check_attempts 3 ными путями. Немного подумав, я решил сделать это дру-
normal_check_interval 1
retry_check_interval 1 гим более простым способом. Набрал все нужные рус-
contact_groups win-admins скоязычные надписи в формате koi8-r. Из пакетов уста-
notification_interval 120
notification_period 24x7 новил несколько программ для конвертирования текстов
notification_options c,r в разные кодировки:
# Èñïîëüçóÿ êîìàíäó check_nt_counter, ìîæíî ïîëó÷èòü äàííûå
# ñ ëþáîãî ñ÷åò÷èêà.  äàííûì ñëó÷àå –
# \Î÷åðåäü ïå÷àòè(_Total)\Çàäàíèé siconv-0.2.1
# Ñòðîêà «%.0f job(s)» óêàçûâàåò ìîäóëþ ïðèìåíèòü ê ðåçóëüòàòó fconv-1.1
# ïðåîáðàçîâàíèå ê òèïó float è âûâåñòè ÷èñëî â ôîðìàòå ru-xcode-1.0
# ñ òî÷íîñòüþ íîëü çíàêîâ ïîñëå çàïÿòîé. ru-dt1489-1.4
# Çàòåì ê ÷èñëó äëÿ íàãëÿäíîñòè äîáàâëÿåòñÿ ñòðîêà «job(s)». ru-mtc-1.3
# Åñëè âàì íåïîíÿòíî, ÷òî ýòî çíà÷èò, – ïîñìîòðèòå
# äîêóìåíòàöèþ ïî ôóíêöèè printf ( ) ÿçûêà Ñ. После тестирования выяснилось, что удобнее всего
# Ïåðåõîä â ñîñòîÿíèå ïðåäóïðåæäåíèÿ ïðîèñõîäèò
# ïðè íàêîïëåíèè 5 çàäàíèé, à êðèòè÷åñêèé ñòàòóñ использовать утилиту ru-mtc.
# íàñòóïàåò, åñëè èõ ñòàíîâèòñÿ 10 è áîëåå. Для конвертирования нужно выполнить такую после-
check_command check_nt_counter! ↵
"\Î÷åðåäü ïå÷àòè(_Total)\Çàäàíèé", ↵ довательность команд:
"%.0f job(s)"!5!10!PxRT890mY
}
# cat checkcommands.cfg | mtc –f koi8 ↵
–t win 1251 > checkcommands.tmp
# mv checkcommands.tmp checkcommands.cfg
# Ïðîâåðÿåì ïðîöåíò èñïîëüçîâàíèÿ ôàéëà ïîäêà÷êè
define service{
use generic-service Теперь осталось только заставить Nagios перечитать
host_name win2000rus
service_description Paging File файлы конфигурации:
is_volatile 0
check_period 24x7
max_check_attempts 3 # /usr/local/etc/rc.d/nagios.sh restart
normal_check_interval 1
retry_check_interval 1
contact_groups win-admins Убедившись в отсутствии ошибок, можно начать ста-
notification_interval 120 вить разные садистские эксперименты по проверке
notification_period 24x7
notification_options c,r того, насколько надежно и оперативно система мони-
# Òóò ìû ñíîâà èñïîëüçóåì check_nt_counter, õîòÿ è íåìíîãî торинга реагирует на критические ситуации, происхо-
# äðóãèì ñïîñîáîì.
# Ñòðîêà «Usage %.2f %%» óêàçûâàåò ìîäóëþ ïðèìåíèòü дящие на Windows-машине. Например, для того чтобы
# ê ðåçóëüòàòó ïðåîáðàçîâàíèå ê òèïó float è âûâåñòè ÷èñëî посмотреть, как работает слежение за очередью прин-
# â ôîðìàòå ñ òî÷íîñòüþ äâà çíàêà ïîñëå çàïÿòîé.
# Çàòåì äëÿ íàãëÿäíîñòè ïðèêëåèâàåì ñïåðåäè ñòðîêó «Usage». тера, можно выключить питание принтера и отправить
# Îáðàòèòå âíèìàíèå íà äâîéíîé çíàê «%» â ñòðîêå несколько заданий на печать. Впрочем, я думаю, вы и
# ôîðìàòèðîâàíèÿ.
# Ñíîâà âñïîìíèâ õîðîøèìè ñëîâàìè ôóíêöèþ printf ( ), сами сможете придумать разные способы создаия кри-
# ïîíèìàåì, ÷òî â ðåçóëüòàòå èç äâóõ ïîëó÷èòñÿ îäèí ñèìâîë «%». тических ситуаций. Наигравшись вдоволь, можно пе-
# Ïåðåõîä â ñîñòîÿíèå ïðåäóïðåæäåíèÿ ïðîèñõîäèò ïðè äîñòèæåíèè
# óðîâíÿ â 80 ïðîöåíòîâ, à êðèòè÷åñêèé ñòàòóñ íàñòóïàåò, реходить ко второму способу мониторинга, который я
# åñëè ôàéë ïîäêà÷êè çàïîëíåí íà 90 è áîëåå ïðîöåíòîâ. опишу в следующей статье.

№7(8), июль 2003 19


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

ДЕНИС ПЕПЛИН
20
администрирование
Знакомство с системой зачастую начинается с ее уста- копировать /etc/defaults/rc.conf в /etc/rc.conf, что без та-
новки и настройки, причем эти два процесса обычно со- кой защиты привело бы к зацикливанию.
вмещены. Для систем Unix настройка сводится к созда- Включение в rc.conf команд нежелательно. Хотя та-
нию текстовых файлов конфигурации. В FreeBSD основ- кой метод и работает, процесс загрузки будет нарушен,
ная работа идет над файлом /etc/rc.conf, который являет- ведь обычно в rc.conf ничего, кроме установки перемен-
ся частью системы стартовых скриптов /etc/rc*. ных не происходит, все действия выполняются позже
Настроить систему после установки можно путем за- стартовыми скриптами. При правильной настройке (ус-
пуска /stand/sysinstall или вручную. Оба способа хороши, тановка переменных) порядок запуска сервисов и уста-
а первый к тому же лишен недостатка большинства про- новки параметров системы определяется не положени-
грамм автоматической настройки: уже заданные парамет- ем строк в rc.conf, которое может быть произвольным, а
ры не перезаписываются, а добавляются в конец файла содержимым скриптов.
/etc/rc.conf, где их можно затем отредактировать под соб- Начиная с FreeBSD 5.x, содержимое это поменялось
ственные нужды или вообще удалить, чтобы вернуться к почти полностью: из NetBSD были заимствованы скрип-
настройкам по умолчанию. ты «нового поколения» /etc/rc.d. После некоторой паузы,
Многие, казалось бы, сложные вещи, которые мо- потребовавшейся на тестирование новых скриптов, ста-
гут поставить новичка в тупик, в FreeBSD делаются рые были убраны. Наиболее важные из оставшихся в /etc
путем добавления пары строк в этот файл. Чтобы не скриптов и файлы конфигурации:
быть голословным, приведу пример настройки шлюза  rc – запускается init при загрузке системы.
в Интернет для локальной сети с частными адресами  rc.shutdown – запускается init при останове системы.
(192.168.0.0/24) на внутреннем интерфейсе и NAT на  rc.subr – часть системы, импортированной из NetBSD.
внешнем, кэширующим DNS-сервером и SSH для уда-  rc.firewall – предназначен для настройки ipfw и natd.
ленного управления всем этим хозяйством. Хотя это не  rc.conf – содержит настройки системы, переписываю-
самый простой пример, конфигурация умещается все- щие параметры по умолчанию.
го на 11 строчках:  rc.conf.local – специфичные для хоста настройки. Если
используется этот файл, rc.conf может быть общим для
sshd_enable="YES" группы хостов.
ifconfig_rl0="inet 123.123.123.2 netmask 0xfffffff0"
ifconfig_rl1="inet 192.168.0.1 netmask 0xffffff00"  rc.local – все еще поддерживается для запуска локаль-
hostname="example.com" ных сервисов. Вместо него рекомендуется использо-
defaultrouter="123.123.123.1"
firewall_type="OPEN" вать скрипты /usr/local/etc/rc.d.
firewall_enable="YES"
gateway_enable="YES"
natd_enable="YES" Для редактирования предназначены только скрипт
natd_interface="rl0" rc.firewall и файлы конфигурации. Ситуация, в которой
named_enable="YES
потребовалось бы приспосабливать к своей системе ос-
Такая лаконичность достигается благодаря тому, что тальные скрипты, возникнуть не должна (по крайней мере,
параметры по умолчанию хранятся в /etc/defaults/rc.conf, теоретически). Если она все же возникла – сообщите об
а строки из /etc/rc.conf лишь изменяют и дополняют эти этом разработчикам.
параметры. Редактировать файл с параметрами по Принципиальное отличие скриптов нового поколения –
умолчанию не нужно (это только усложнит последую- поддержка параметров запуска. По сравнению со скрип-
щие обновления), но вот просмотреть его хотя бы раз тами из /usr/local/etc/rc.d список этих параметров суще-
будет полезно. ственно расширен. К минимальному набору (start|stop)
Строки rc.conf означают не что иное, как установку добавились:
переменных Bourne shell (/bin/sh). Когда в процессе заг-  restart – последовательно stop и start.
рузки системы init запускает скрипт /etc/rc, одним из  reload – перегружает процесс, посылая ему сигнал.
первых его действий становится установка параметров  status – показывает статус процесса.
настройки:  poll – ждет завершения процесса.
 rcvar – показывает соответствующие переменные
if [ -r /etc/defaults/rc.conf ]; then rc.conf.
. /etc/defaults/rc.conf
source_rc_confs
elif [ -r /etc/rc.conf ]; then Параметры status, reload и poll реализуются только в
. /etc/rc.conf
fi том случае, если скрипт запускает какой-либо процесс.
Введение параметров запуска существенно облегча-
В данном случае перезаписыванием параметров по ет задачу запуска и рестарта отдельных сервисов без
умолчанию занимается функция source_rc_confs (рас- перезагрузки всей системы. Конечно, это было возмож-
положенная в /etc/defaults/rc.conf), которая и включает но и раньше, но рекомендация «перегрузиться на вся-
/etc/rc.conf, /etc/rc.conf.local или любые другие файлы кий случай» теперь имеет под собой гораздо меньше
из списка, определенного в переменной rc_conf_files. оснований.
Конструкция эта могла бы быть несколько проще, но ис- Перезагрузка после настройки системы нужна для
пользуемая функция уже содержит «защиту от дурака», того, чтобы проверить правильность внесенных в фай-
поскольку некоторые пользователи считают удобным лы конфигурации изменений. Когда стартовые скрипты

№7(8), июль 2003 21


администрирование
представляют собой нечто монолитное, разделенное # PROVIDE: nfsd
# REQUIRE: mountd
только по общей функциональности, воспользоваться # KEYWORD: FreeBSD NetBSD
ими для старта сервисов без перезагрузки можно разве
что в качестве практического пособия «как это устрое- Этот скрипт предоставляет сервис nfsd, требует пред-
но». В этом случае запуск сервисов распадается на два варительного запуска mountd и работает в FreeBSD и
этапа: внесение изменений в конфигурационный файл, NetBSD.
чтобы все работало и после перезагрузки, и запуск про- Должен быть хотя бы один скрипт без ключевого сло-
грамм вручную. ва REQUIRE, чтобы rcorder мог определить первый стар-
Проблема в том, что второй этап никак не проверя- товый скрипт. Например, /etc/rc.d/devd содержит сле-
ет правильность первого: может возникнуть ситуация, дующий блок:
когда вручную все запущено правильно, а в конфигу-
рационном файле допущена ошибка. Если это так, то # PROVIDE: devd
# BEFORE: disks
при любой последующей перезагрузке соответствую- # KEYWORD: FreeBSD
щий сервис не стартует, и придется все исправлять (хо-
рошо, если вы будете в этот момент рядом, а не в от- Ключевое слово BEFORE помогает определить последую-
пуске, например). щие скрипты (в которых анализируется строка «# PROVIDE:
К тому же запуск вручную не всегда тривиален: к приме- disks»).
ру, для запуска NFS сервера в FreeBSD 4.x так, как это про- В FreeBSD правильную последовательность скриптов
исходит при установке параметра nfs_server_enable=«YES» выдает следующая команда:
в rc.conf, потребуются следующие команды:
# rcorder -k FreeBSD -s nostart /etc/rc.d/* 2>/dev/null
# portmap
# mountd -r
# nfsd В полученном списке по именам скриптов можно вы-
# rpc.statd делить три группы. Скрипты с именами в верхнем реги-
стре служат только для определения основных зависи-
В FreeBSD 5.x достаточно добавить эту переменную и мостей. Это своеобразные «контрольные точки», кото-
выполнить команду: рые определяют набор зависимостей на отдельных эта-
пах загрузки.
# /etc/rc.d/nfsd start Таких скриптов всего четыре: NETWORKING, SERVERS,
DAEMON, LOGIN (man rc(8)). Они используются только
Очевидно, это гораздо проще и к тому же проверена rcorder, для sh это всего лишь набор комментариев. Ос-
на правильность соответствующая переменная. В приме- тальные скрипты делятся по признаку наличия или отсут-
ре с NFS в обеих случаях сначала необходимо подгото- ствия расширения «.sh». Если расширение присутствует,
вить файл /etc/exports (man exports(5)). скрипт запускается в текущей оболочке.
Другие параметры также достаточно интересны: на- В локальных скриптах поддержка параметров реали-
пример, status поможет узнать, какие процессы запуще- зуется с помощью конструкции case. Параметр start пред-
ны в данный момент, а rcvar – познакомиться со скрипта- полагает запуск программы, stop – отправку ему сигна-
ми поближе: ла TERM. Любой другой параметр – вывод краткой справ-
ки по параметрам. Шаблон локального скрипта выгля-
# for i in /etc/rc.d/*; do $i status 2>/dev/null; done дит так (man rc(8)):
# for i in /etc/rc.d/*; do echo $i; $i rcvar 2>/dev/null; ↵
echo; done
#!/bin/sh -
case "$1" in
Для стартовых скриптов системы, в отличие от локаль- start)
ных скриптов в /usr/local/etc/rc.d, очень важен порядок за- /usr/local/sbin/prog -d && echo -n ' prog'
;;
пуска. Локальные скрипты не имеют механизма реализа- stop)
ции зависимостей и определения порядка запуска. Они kill `cat /var/run/prog.pid` && echo -n ' prog'
;;
стартуют в алфавитном порядке и если необходимо, что- *)
бы какой-то скрипт стартовал раньше, нужно «повысить» echo "unknown option: $1 - should be 'start' or 'stop'" >&2
;;
его место по алфавиту. Обычно перед именем скрипта esac
добавляют пару-тройку нулей.
Зависимости и определение порядка запуска в сис- Реализация таким методом большего числа парамет-
темных стартовых скриптах FreeBSD 5.x реализуются с ров потребует соответствующего числа ключевых слов в
помощью rcorder(8). case и множества довольно тривиального и одинакового
Эта программа использует специальные ключевые для всех скриптов кода (более сложного, чем в приведен-
слова, содержащиеся в каждом скрипте: REQUIRE, ном примере). Видимо, разработчикам NetBSD такое ре-
PROVIDE, BEFORE, KEYWORD. Для оболочки строки, со- шение изящным не показалось и вся функциональность
держащие эти слова, являются комментариями. Вот при- стартовых скриптов нового поколения была реализована
мер блока ключевых слов /etc/rc.d/nfsd (все пробелы обя- в отдельном скрипте (/etc/rc.subr). Вот шаблон простей-
зательны): шего скрипта «нового поколения».

22
администрирование
#!/bin/sh  command_interpreter – командный интерпретатор, с по-
#
# PROVIDE: prog мощью которого запускается command.
# REQUIRE: before_prog  extra_commands – дополнительные параметры за-
# BEFORE: after_prog
# KEYWORD: FreeBSD пуска.
 pidfile – полный путь к файлу PID. Если эта перемен-
. /etc/rc.subr
ная установлена, для проверки процесса использу-
name="prog" ется check_pidfile $pidfile $procname. Иначе, если ус-
rcvar=`set_rcvar`
command="/usr/local/bin/prog" тановлена переменная command, используется
check_process $procname.
load_rc_config $name
run_rc_command "$1"  procname – имя процесса для проверки. По умолча-
нию – procname.
Функционально этот скрипт превосходит предыдущий  required_dirs – проверка на наличие директории перед
за счет добавления новых параметров (и к тому же, бла- стартом программы.
годаря параметрам rcorder, он «знает свое место»). Ви-  required_files – проверка на читаемость файлов.
зуально он делится на четыре части: ключевые слова,  required_vars – проверка переменной с помощью
включение /etc/rc.subr, переменные и запуск функций checkyesno.
из включенного rc.subr. Между переменными и запус-  ${name}_chdir – каталог, в который нужно войти перед
ком функций rc.subr могут быть включены собственные запуском command, если нет – ${name}_chroot.
функции скрипта. В скрипт могут быть помещены пе-  ${name}_chroot – каталог для запуска chroot(8) перед
ременные argument_cmd. Слово argument означает па- запуском command.
раметр запуска. Если запустить любой из стартовых  ${name}_flags – эта переменная используется для пе-
скриптов без параметров, он выдаст информацию при- резаписи соответствующей переменной из rc.conf.
мерно в таком виде:  ${name}_nice – устанавливает уровень nice(1) перед за-
пуском command.
Usage: /etc/rc.d/prog ↵
[fast|force](start|stop|restart|rcvar|reload|status|poll)
 ${name}_user – пользователь, под которым запускается
command. Если установлена переменная ${name}_chroot,
используется chroot(8), иначе – su(1).
Параметрами скрипта могут быть start, faststart,  ${name}_group – группа для запуска command в chroot.
forcestart, stop, faststop... и соответственно переменная  ${name}_groups – разделенный запятыми список групп
argument_cmd на самом деле означает набор start_cmd, для запуска в chroot.
stop_cmd...  argument_cmd – перезаписывает действие по умол-
Получить примерное представление о том, какие на чанию.
самом деле используются переменные, поможет следую-  argument_precmd – выполняется перед argument_cmd или
щая команда: действием по умолчанию, которое выполняется только в
случае успешного завершения argument_precmd.
$ cat /etc/rc.d/[a-z]* | egrep "^[a-z]+_?[a-z]+=.*$" ↵
| awk -F= '{print $1}' | sort -u | less
 argument_postcmd – выполняется, если argument_cmd
или действие по умолчанию успешно выполнены.
Не менее интересен может быть просмотр перемен-  sig_stop – сигнал, который посылается процессу для
ных вместе с их значениями: его завершения вместо SIGTERM.
 sig_reload – сигнал, который посылается процессу для
$ cat /etc/rc.d/[a-z]* | egrep "^[a-z]+_?[a-z]+=.*$" ↵ перезагрузки вместо SIGHUP.
| sort -u | less

В man rc.subr(8) дано описание всех используемых Префикс fast означает отсутствие проверки запущен-
функций и переменных. ных процессов перед запуском нового и установку пере-
Задаваемые в стартовых скриптах переменные ис- менной rc_fast=YES, а префикс force – установку пере-
пользуются функцией run_rc_command. Вот список этих менной rc_force=YES и игнорирование статуса заверше-
переменных в сокращенном виде: ния argument_precmd.
 name – имя скрипта. Указывается в обязательном по- В отличие от локальных скриптов, для работы скрипта
рядке. «нового поколения» в rc.conf должна быть помещена пе-
 rcvar – значение переменной, имя которой помещено ременная, имя которой определяется значением rcvar.
в rcvar, берется из rc.conf и проверяется с помощью Кроме того, туда же можно поместить и дополнительные
checkyesno. Истинными считаются значения «YES», переменные, например ${name}_flags.
«TRUE», «ON» или «1». Ложными «NO», «FALSE», В целом с переходом на новые скрипты настройка
«OFF» или «0». системы в rc.conf не изменилась (совместимость остав-
 command – полный путь к команде. Переменная не нуж- лена с целью минимизации проблем при обновлении си-
на, если для каждого поддерживаемого параметра стемы). Возможностей по перенастройке системы на
указана переменная argument_cmd. ходу явно прибавилось, и к тому же стартовые скрипты
 command_args – опциональные аргументы и/или ди- теперь еще лучше подходят в качестве инструмента изу-
рективы оболочки. чения системы.

№7(8), июль 2003 23


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

НАСТРОЙКА
СЕРВЕРА SSH

ДЕНИС КОЛИСНИЧЕНКО

24
администрирование
Сервис Telnet обеспечивает базовую эмуляцию термина- Программу ssh можно скачать по адресу http://
лов удаленных систем, поддерживающих протокол Telnet www.cs.hut.fi/ssh/. Версия ssh для UNIX распространяется
над протоколом TCP/IP. Обеспечивается эмуляция терми- бесплатно, а за Windows-версию (имеется в виду клиент
налов Digital Equipment Corporation VT 100, Digital для Windows) нужно заплатить.
Equipment Corporation VT 52, TTY. Любые команды, вы- Оболочка ssh незаменима в тех случаях, когда уда-
полняемые с помощью Telnet, обрабатываются telnet-сер- ленно нужно администрировать сервер или когда сервер
вером, а не локальным компьютером. Пользователь лишь не имеет собственного монитора. При использовании
видит результат выполнения этих команд. telnet все данные, которые передаются через telnet-соеди-
Для использования Telnet на удаленном компьюте- нение, доступны в открытом виде. А значит, имена пользо-
ре должен быть установлен telnet-демон. На компьюте- вателей и пароли будут доступны всем, кто прослушива-
ре пользователя нужно установить программу-клиент. ет трафик с помощью анализатора. SSH выполняет шиф-
Практически в каждой операционной системе суще- рование, используя несколько различных алгоритмов,
ствует утилита telnet, которая является клиентом для включая DES и 3DES.
протокола telnet. Программа состоит из демона sshd, который запуска-
Сервис Telnet был и остается одним из самых попу- ется на Linux/UNIX-машине, и клиента ssh, который рас-
лярных способов удаленной регистрации и работы на уда- пространяется как для Linux, так и для Windows. Чтобы
ленной машине. Основным его недостатком является то, установить ssh, возьмите исходные тексты и поместите
что любая информация, в том числе и пароли, передает- их по традиции в каталог /usr/src/. Затем распакуйте ар-
ся в открытом виде без какого-либо кодирования. хив и установите программу, выполнив следующую пос-
SSH (Secure Shell) – программа, позволяющая вам за- ледовательность действий:
регистрироваться на удаленных компьютерах и устано-
вить зашифрованное соединение. Существует также «бе- cd /usr/src/
tar xzf ssh-2.4.0.tar.gz
зопасная» версия telnet – stelnet. cd ssh-2.4.0
SSH использует криптографию открытого ключа для ./configure
make
шифрования соединения между двумя машинами, а так- make install
же для опознавания пользователей. Оболочку ssh можно
использовать для безопасной регистрации на удаленном Чтобы ssh начал работать, необходимо запустить де-
сервере или копировании данных между двумя машина- мон sshd на той машине, к которой предполагается под-
ми, в то же время предотвращая атаки путем присоеди- ключение. Желательно добавить команду запуска в сце-
нения посредине (session hijacking) и обманом сервера нарий загрузки системы для автоматического запуска.
имен (DNS spoffing). Демон sshd работает по 22 порту (см. листинг 1). Если
Оболочка Secure Shell поддерживает следующие ал- не ошибаюсь, ssh невозможно использовать вместе с
горитмы шифрования: xinetd/inetd – его нужно запускать подобно httpd-серверу
 BlowFish – это 64-разрядная схема шифрования. Этот в режиме standalone.
алгоритм часто используется для высокоскоростного
шифрования данных больших объемов. Ëèñòèíã 1. Ôðàãìåíò ôàéëà /etc/services
ssh 22/tcp # SSH Remote Login Protocol
 Тройной DES (Data Encryption Standard) – стандарт для ssh 22/udp # SSH Remote Login Protocol
шифрования данных. Данный алгоритм довольно ста-
рый, поэтому не рекомендуется его использовать. Обычно с настройкой sshd не возникает никаких не-
Обычно DES используется для шифрования несекрет- приятных моментов. Подробно о настройке sshd пого-
ных данных. ворим чуть позже. Теперь попробуйте зарегистриро-
 IDEA (International Data Encryption Algorithm) – между- ваться на этой машине через ssh. Для этого нужно ус-
народный алгоритм шифрования информации. Этот тановить этот же пакет на другую машину под управле-
алгоритм работает со 128-разрядным ключом и поэто- нием Linux/UNIX (или установить Windows-клиент ssh)
му он более защищен, чем BlowFish и DES. и ввести команду:
 RSA (Rivest-Shamir-Adelman algorithm) – алгоритм Ри-
веста-Шамира-Адельмана. Представляет собой схему $ ssh hostname.domain
шифрования с открытым и секретным ключами.
ssh запросит вас ввести пароль пользователя. В каче-
При выборе алгоритма шифрования нужно исходить стве имени пользователя для установки соединения бу-
из конфиденциальности информации, которую вам нуж- дет использовано имя текущего пользователя, то есть
но передать. Если информация секретна, лучше исполь- имя, под которым вы сейчас зарегистрированы в сис-
зовать алгоритмы IDEA или RSA. Если же вы просто не теме. В случае если аутентификация пройдет успеш-
хотите передавать данные в открытом виде, используйте но, начнется сеанс связи. Прекратить сеанс можно ком-
алгоритм BlowFish, поскольку он работает значительно бы- бинацией клавиш Ctrl+D. Если вам нужно указать дру-
стрее, чем DES. гое имя пользователя, используйте параметр -l програм-
Оболочка ssh очень эффективна против анализаторов мы ssh:
протоколов, так как она не только шифрует, но и сжимает
трафик перед его передачей на удаленный компьютер. ssh -l user hostname.ru

№7(8), июль 2003 25


администрирование
Так можно указать программе ssh, от имени какого сервера. Обе стороны используют этот случайный но-
пользователя нужно регистрироваться на удаленной ма- мер как ключ сессии, который используется для коди-
шине (см. рис. 1). рования всех передаваемых во время сессии данных.
Затем клиент пытается аутентифицировать себя, ис-
пользуя .rhosts-аутентификацию, аутентификацию RSA
или же аутентификацию с использованием пароля.
Обычно .rhosts-аутентификация небезопасна и поэто-
му она отключена.

Протокол SSH версия 2


Версия 2 работает аналогично: каждый узел имеет опре-
деленный DSA-ключ, который используется для иденти-
фикации узла. Однако при запуске демона ключ сервера
не генерируется. Безопасность соединения обеспечива-
ется благодаря соглашению Диффи-Хелмана (Diffie-
Hellman key agreement).
Сессия может кодироваться следующими методами:
128-разрядный AES, Blowfish, 3DES, CAST128, Arcfour,
Ðèñ. 1. Ðåãèñòðàöèÿ íà óäàëåííîé ìàøèíå. 192-разрядный AES или 256-разрядный AES.
При использовании Windows-клиента имя компьюте-
ра, имя пользователя и пароль нужно ввести в диалого- Опции демона sshd указаны в таблице 1.
вом окне программы. Если соединение не устанавлива- Файл конфигурации демона /etc/ssh/sshd_config до-
ется, попробуйте выбрать метод кодирования blowfish. вольно большой, поэтому я не стану приводить в статье
Если и это не поможет, выберите 3DES. Работа в ssh ана- его полный листинг. Сейчас мы остановимся только на
логична работе в telnet. Вы можете администрировать самых важных директивах файла конфигурации.
удаленную машину также легко, как и локальную. Директива Port предназначена для указания порта,
Оболочка ssh использует два файла конфигурации которые демон будет прослушивать (данная директива
ssh_conf и sshd_conf. Думаю, что нет смысла говорить о аналогична опции -p):
том, что они находятся в директории /etc/ssh. Рекомен-
дую в файле sshd_conf прописать следующую строчку: Port 22

allowedadress 10.1.1.1 10.1.2.1 10.1.3.1 Следующая директива – это директива Protocol. С по-
мощью этой директивы можно указать в порядке пред-
Это означает, что доступ по ssh может быть выполнен почтения номера поддерживаемых протоколов SSH:
только с машин с адресами 10.1.1.1, 10.1.2.1, 10.1.3.1. Это
оградит ваш компьютер от нежелательных вторжений Protocol 2,1
извне. Программа stelnet во всем полностью аналогична
программе telnet, но она выполняет шифрование трафи- Такое определение директивы означает, что сначала
ка, который передается во время telnet-соединения. сервер будет пытаться установить соединение с клиен-
Демон sshd – это программа-демон для оболочки ssh. том по протоколу SSH версии 2, а потом – по протоколу
Обычно sshd запускается на машине, к которой подклю- SSH версии 1. Можно указать использование только од-
чаются клиенты SSH. Последние версии демона sshd под- ной версии протокола, например: Protocol 1. Директива
держивают две версии протокола SSH: SSH версия 1 и ListenAddress указывает локальный адрес, который дол-
SSH версия 2. жен прослушивать демон.
Директива определяет файлы ключей. Файлами по
Протокол SSH версия 1 умолчанию являются:
У каждого узла есть свой RSA-ключ (обычно 1024 бит),
который используется для идентификации узла. Этот ключ /etc/ssh/ssh_host_key
/etc/ssh/ssh_host_rsa_key
еще называется открытым. Дополнительно при запуске /etc/ssh/ssh_host_dsa_key
демона генерируется еще один RSA-ключ – ключ серве-
ра (обычно 768 бит). Этот ключ создается заново каждый Директива ServerKeyBits определяет разрядность клю-
час и никогда не сохраняется на диске. ча сервера для протокола SSH первой версии. По умол-
Каждый раз при установке соединения с клиентом чанию используется 768-разрядный ключ (768 бит).
демон отправляет ему в ответ свой открытый ключ и Директива LoginGraceTime аналогична опции -g : пре-
ключ сервера. Клиент сравнивает полученный откры- доставляет клиенту дополнительное время, чтобы аутен-
тый ключ со своей базой данных, чтобы проверить, не тифицировать себя. По умолчанию время равно 600 се-
изменился ли он. Затем клиент случайным образом кундам. Если за это время клиент не смог аутентифици-
генерирует 256-разрядное число и кодирует его, исполь- ровать себя, соединение будет прекращено.
зуя одновременно два ключа – открытый ключ и ключ Директива KeyRegenerationInterval аналогична опции -k.

26
администрирование
Òàáëèöà 1. Îïöèè äåìîíà sshd.

Она определят время, спустя которое ключ сервера бу-


дет создан заново. По умолчанию время составляет 3600
секунд (1 час).
Директива PermitRootLogin определяет, разрешено ли
пользователю root регистрироваться по ssh. Значение по
умолчанию:

PermitRootLogin yes

Еще две директивы, имеющие непосредственное от-


ношение к аутентификации – это PasswordAuthentication
и PermitEmptyPasswords. Первая разрешает (при значе-
нии yes) аутентификацию с помощью пароля, а вторая
разрешает (при значении yes) использовать пустые паро-
ли. Значения по умолчанию:

PasswordAuthentication yes
PermitEmptyPasswords no

Описание остальных опций вы найдете в справочной


системе, введя команду man sshd. Ваши вопросы и ком-
ментарии присылайте на dhsilabs@mail.ru.

№7(8), июль 2003 27


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

IRC-CЕРВЕР

АЛЕКСАНДР СЛОБОДСКОЙ

28
администрирование
Итак, вы администрируете небольшую локальную сеть. Так Примечание: если сервер при запуске сразу выпадает в
или иначе пользователям хочется общаться. Такие програм- core, возможно, проблемы с share-библиотеками, тогда нуж-
мы, как lantalk, естественно, не подходят, потому что рассы- но вернуться к компиляции снова:
лают широковещательные пакеты по всей сети, что не есть
хорошо. Выход – установка irc-сервера, который лишен очень [user@server]$ make LDFLAGS=static && make install
многих недостатков и имеет массу преимуществ. Например,
быстрота работы по сравнению с www-чатами – ведь клиен- Теперь, скорее всего, все будет в порядке.
ту не приходится грузить громоздкую страницу, чаще всего Переходим в директорию, которую указали при компи-
наполненную всяческими баннерами; расходование меньше- ляции и видим там несколько файлов:
го количества трафика, что не может не радовать. Суще-  ircd – основной бинарный файл.
ствует несколько разновидностей irc-серверов, имеющих не-  ircd.conf – файл конфигурации.
кие свои особенности, но похожие друг на друга в целом,  ircd.motd – файл, который выдается всем пользователям
например, unreal ircd, bahamut ircd и так далее, но в данном при каждом заходе на irc. Можете изменять и дополнять
обзоре я рассмотрю PTlink ircd как более простой для описа- его нужной информацией или картинкой, например.
ния и использующийся в российской irc-сети – IrcNET.Ru.  help.user – файл помощи для простых смертных, выво-
Приступим. Качаем сам сервер с http://www.aldem.net/irc. дится командой /helpsys.
Выберите ли вы бинарный файл или скомпилируете из ис-  help.oper – файл помощи для irc-операторов.
ходных кодов, зависит от того, какая операционная система  help.admin – файл для irc-администраторов.
на вашем сервере. В статье пойдет речь именно о Unix-вер-
сии. В Unix-версии компилирование должно обязательно про- Файл sendbug необходим в случае падения ircd в core,
ходить под обычным пользователем, то есть у того, у кого id таким образом можно отправить им этот файл для исправ-
больше 0, иначе сервер откажется компилироваться. ления ошибок. Синтаксис: sendbug ircd.core.
Распаковываем архив, заходим в папку и пишем: После запуска и использования irc-сервера в этой же
папке появится пара новых файлов, таких как ircd.pid, в ко-
[user@server]$ ./configure тором находится номер процесса запущенного сервера, и
gline.log, в котором находится список всех gline, которые ста-
Появится экран с описанием изменений и дополнений, вились в сети. (Gline – запрет доступа ко всем серверам сети
начиная с самого старого. Пролистываем описание и нажи- для определенных IP).
маем enter. Теперь нужно выбрать опции сборки сервера. Переходим к составлению конфигурационного файла.
Сначала вас спросят о типе компилятора: выбираем gcc, Все опции пишутся через двоеточие.
если, конечно, вы не являетесь счастливым обладателем В M-line содержится техническая информация о сервере:
экзотической операционной системы типа HP-UX, в этом
случае выбирайте cc. Дальше идут опции компиляции, их M:èìÿ_ñåðâåðà:ip:îïèñàíèå_ñåðâåðà:ñòàíäàðòíûé_ïîðò
можно оставить по умолчанию, так как они автоматически
определяются в зависимости от операционной системы. А-line – отражает информацию об администраторе дан-
Затем выбираем место, где будет лежать папка со всеми ного сервера, эта информация доступна через команду
необходимыми файлами для ircd. /admin на irc-сервере.
Выбираем название бинарного файла. Далее идет оп-
ция – компилировать ли сервер как Hub или как Leaf. (Hub – A:îïèñàíèå:Admin:e-mail
сервер, способный присоединять к себе другие сервера. Leaf
– одиночный сервер, привязанный к хабу, не имеющий воз- Y-line – определяет классы коннектов серверов друг к
можности присоединять сервера). другу, Y-lines нужно оставить без изменений.
Выберите нужный вам тип в зависимости от стоящих Все же некоторое описание необходимо, т.к. оно приго-
перед вами задач. Затем вас спросят, осуществлять ли крип- дится далее при написании C\N-lines.
тование паролей irc-операторов: если нет, то пароли в Класс-1 – определяет соеднинения простых смертных с
O-lines вписываем простым текстом; если да, то пароли не- сервером:
обходимо зашифровать. Для этого необходимо зайти на irc-
сервер и набрать команду /mkpasswd ваш_пароль: получит- Y:1:90:0:250:100000
ся некая последовательность букв и цифр – их и нужно впи-
сать в O-line на место пароля. У вас возникнет вопрос: «Как предпоследний параметр, определяет разрешенное количе-
зайти-то, ведь мы еще не настроили ircd?». Ответ прост: ство коннектов к серверу.
сначала настройте сам сервер, а пароль для O-line можно Класс-30 – коннект Hub to Leaf:
сделать в самом конце, он не критичен для работоспособно-
сти ircd. Далее выбираем число разрешенных соединений к Y:30:180:0:0:3500000
серверу. И последний пункт – выбор типа сети. Компиляция:
Класс-40 – как раз наоборот, Leaf to Hub:
[user@server]$ make && make install
Y:40:90:90:1:3500000
Если все прошло гладко, то сервер готов к использованию.

№7(8), июль 2003 29


администрирование
Класс-50 – класс коннекта Hub to Hub, с автоконнектом: N:óäàëåííûé_ñåðâåð:ïàðîëü:èìÿ_óäàëåííîãî_ñåðâåðà: ↵
êëàññ_ êîííåêòà

Y:50:90:60:1:4000000 Q-line – запрет использования ников.


Пример:
И класс-51 – тоже класс коннекта Hub to Hub, но без ав-
токоннекта: Q:*:ïðè÷èíà:nickname

Y:51:90:60:0:4000000 H-line – определяет сервер как Hub, на серверах Leaf все-


гда должен указываться H-line на вышестоящий Hub:
I-line – для разрешения доступа к irc-серверу по IP или
паролю: H:*::hub.server.ru

I:*@*:Ïàðîëü:*@*::1 P-line – позволяет открывать прослушивание коннектов


на дополнительный порт:
синтаксис понятен. Если же вам не надо кого-нибудь огра-
ничивать, вот пример I-line стандартного: P:*:*:*:port

I:*@*::*@*::1 e-line – исключение проверки на open socks:

Теперь обратимся к O-line. Строка, определяющая дос- e:127.0.0.1::*


туп к irc-операторству:
На этом описание конфигурационного файла можно
O:host:ïàðîëü:login:modes:1 закончить.
А вот небольшой пример реально работающего конфи-
Параметр modes вы, естественно, выбираете сами, ниже гурационного файла:
даны основные режимы.
Данные режимы устанавливаются для пользователя M:irc.server.ru:*:Network server:6667
A:My cool server:mr_Black:email@server.ru
irc, набравшего команду /oper и нужны для управления Y:1:90:0:30:100000
сервером irc: Y:50:90:60:1:4000000
Y:51:90:60:0:4000000
Y:30:180:0:0:3500000
r = äîñòóï ê êîìàíäå /rehash. Y:40:90:90:1:3500000
R = äîñòóï ê êîìàíäå /restart. I:*@*::*@*::1
D = äîñòóï ê êîìàíäå /die.
g = ìîæåò ñëàòü /globops. Пароль здесь представлен без криптования.
c = äîñòóï ê ëîêàëüíîìó ïðîèçâåäåíèþ /connect è /squit.
C = äîñòóï ê óäàëåííûì /squits è /connects.
k = äîñòóï ê ëîêàëüíûì /kills. O:*@*:qwerty:mr_Black:*:1
K = äîñòóï ê ãëîáàëüíûì /kills. U:services.server.ru:*:*
b = äîñòóï ê /kline ïîëüçîâàòåëåé ñ ñåðâåðà. X:qwerty:qwerty
o = ëîêàëüíûé àäìèíèñòðàòîð, âêëþ÷åíû òàêèå ôëàãè, êàê, C:127.0.0.1:services:services.server.ru:50
rhgwlckbBnuf. N:127.0.0.1:services:services.server.ru::50
Q::Reserved for services:ChanServ
O – глобальный оператор, включены такие флаги, как: Q::Reserved for services:NickServ
Q::Reserved for services:MemoServ
oRDCKN. Q::Reserved for services:OperServ
U-line – определяет сервисы, чтобы правильно понимать Q::Reserved for services:HelpServ
Q::Reserved for services:NewsServ
смену топиков, модов на irc: Q::Reserved for services:Global
Q::Reserved for operators:IRCop
H:*::services.server.ru
U:services.some.net:*:*
Вот пример конфигурации с настроенными на сервисы
X-line – определяет пароли для restart и die: C\N\H lines.
Запускайте ircd. Попробуем приконнектиться на порт,
X:diepass:restartpass который вы указали в ircd.conf.
Видим, что все работает, и уже можно оповестить пользо-
C-line – строка описывает сервер, пытающийся прикон- вателей о появлении нового сервиса и как с ним работать.
нектиться. Для работы в irc есть очень много интересных клиентов, вот
N-line – строка, описывающая возможность коннекта с некоторые из них:
данного сервера.  для windows: mIRC; http://www.mirc.com, BersIRC; http://
Обязательно использование C- и N-lines в паре друг с www.bersirc.com.
другом.  для Unix-систем: xchat; http://www.xchat.org, BitchX; http:/
/www.bitchx.org.
C:óäàëåííûé_ñåðâåð:ïàðîëü:èìÿ_óäàëåííîãî_ñåðâåðà: ↵
port:êëàññ _êîííåêòà
 http://www.ptlink.net/Coders – сайт разработчиков серве-
ра PTlink, там же можно найти и сервисы для ircd.
который был определен в Y-line.  http://www.ircd.ru – интересный ircd-сервер.

30
bugtraq

Уязвимость шестилетней давности Несколько уязвимостей в mod_gzip


для IE работает на новых версиях позволяют удаленному пользователю
Mozilla, Netscape и Opera выполнять произвольный код на системе
Уязвимость в управлении доступом обнаружена в Java и Несколько уязвимостей обнаружено в mod_gzip в подпрог-
Javascript, выполненных в браузерах Netscape, Mozilla и раммах отладки. Удаленный пользователь может выпол-
Opera. Злонамеренный сценарий или апплет может вы- нить произвольный код. Локальный пользователь может
полнить произвольный код и подключиться к произволь- получить root-привилегии на уязвимой системе.
ным доменам. Сообщается, что удаленный пользователь может зап-
Сообщается, что удаленный пользователь может создать росить длинное имя файла, которое должно быть обрабо-
HTML, который, когда будет загружен целевым пользовате- тано gzip, чтобы вызвать буферное переполнение в меха-
лем, внедрит и выполнит произвольный Javascript-код в низме регистрации. Уязвимость может использоваться для
JavaScript-консоли в браузере целевого пользователя, при- выполнения произвольного кода. Пример:
меняя функцию «view-source:».
Эксплоит: GET [overflow] HTTP/1.1
Host: www.apachesite.com
Accept-Encoding: gzip, deflate
<script>
function werd()
Также сообщается, что удаленный пользователь мо-
a.document.open(); жет представить специально обработанный HTTP GET
a.document.write("<h1>werd</h1>");
a.document.close(); запрос, чтобы эксплуатировать уязвимость форматной
строки в механизме регистрации Apache. Уязвимость мо-
function winopen() { жет использоваться для удаленного выполнения произ-
вольного кода.
a=window.open("view-source:javascript:location= ↵
'http://www.iss.net';"); Пример:
setTimeout('werd()',23000);
GET /cgi-bin/printenv.pl?x=%25n%25n%25n%25n%25n HTTP/1.1
Host: www.apachesite.com
</script> Accept-Encoding: gzip, deflate

Также сообщается, что злонамеренный апплет может или


выполнить подключения к произвольным доменам. Демон-
страционный эксплоит был написан несколько лет назад GET /cgi-bin/printenv.pl?x=%n%n%n%n%n HTTP/1.1
Host: www.apachesite.com
для уязвимости в Microsoft Internet Explorer, которая была Accept-Encoding: gzip, deflate
устранена с того времени, но появилась в Mozilla, Opera и
Netscape: http://neurosis.hungry.com/~ben/msie_bug/. Также сообщается, что когда регистрация Apache не
Способов устранения обнаруженной уязвимости не используется, программное обеспечение использует не-
существует в настоящее время. безопасные файлы регистрации, основанные на ID про-
цесса (например “t.log”). Локальный пользователь может
сконструировать символьную ссылку из временного фай-
ла к критическому системному файлу на системе. Когда
Выполнение произвольных команд mod_gzip выполняется, ссылающийся фал будет переза-
оболочки в Adobe Acrobat Reader и Xpdf писан с root-привилегиями.
Уязвимость обнаружена в Adobe Acrobat Reader и Xpdf для Уязвимость обнаружена в mod_gzip 1.3.26.1a.
Linux-систем. Удаленный пользователь может создать зло-
намеренный PDF-файл, который выполнит произвольные
команды оболочки при клике на ссылку в PDF-файле.
Сообщается, что удаленный пользователь может вне-
дрить команды оболочки в пределах внешней гиперссыл- DoS против Microsoft Windows 2000/XP/2003
ки. Согласно сообщению, PDF reader передает гиперссыл- Уязвимость обнаружена в Microsoft Windows 2000/XP/2003.
ку к операционной системе, используя команду 'sh -c'. В Удаленный атакующий может остановить работу сетевых
результате ссылка может быть обработана в следующей служб.
форме: Сообщается, что если на целевом сервере включена
поддержка IPV6, то удаленный пользователь может запу-
mailto:[address]`[malicious command]` стить ICMP flood нападение, чтобы отключить работу се-
тевых служб.
Уязвимость обнаружена в Adobe Acrobat Reader 5.06 Уязвимость обнаружена в Microsoft Windows 2000/XP/2003.
для Linux/UNIX и Xpdf 1.01.
Способов устранения обнаруженной уязвимости не
существует в настоящее время. Составил Александр Антипов

№7(8), июль 2003 31


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

КОНТРОЛЬ
ПОСЛЕДОВАТЕЛЬНЫХ
ПОРТОВ В Linux

ДЕНИС КОЛИСНИЧЕНКО

32
администрирование
Интерфейс RS-232C является одним из самых распрост- Òàáëèöà 2. Êîíòàêòû è ñèãíàëû (25 pin).
раненных способов связи компьютеров и периферийных
устройств. Кто же не помнит старый добрый Norton
Commander и его функцию Связь (Link), позволяющую об-
мениваться файлами двум компьютерам, соединенным
нуль-модемным кабелем? Интерфейс RS-232C подразу-
мевает наличие двух типов оборудования:
 Терминального (DTE);
 Связывающего (DCE).

Терминальное устройство принимает и/или отправляет


данные. К терминальному типу относятся, например, ком-
пьютеры. Терминальные устройства служат окончанием
линии передачи данных, отсюда и название – terminate. Свя-
зывающее оборудование (DCE) обеспечивает передачу дан-
ных между терминальными устройствами по линии связи.
Иногда нам нужно знать состояние терминального ус-
тройства, или же мы хотим заставить связное устройство
DCE работать как терминальное DTE, для этого нам нуж-
но сделать небольшое изменение в линиях данных интер-
фейса RS-232C. Для этого нужно знать, какие функции
выполняет тот или иной сигнал интерфейса.
Терминальное оборудование оснащено 9- или 25-кон-
тактными D-образными разъемами. На следующем рисун-
ке изображены сами порты, а также нумерация контактов.

Следующая программа выводит состояние последо-


вательного устройства.

Ëèñòèíã 1. Ïðîãðàììà äëÿ êîíòðîëÿ ïîñëåäîâàòåëüíîãî ïîðòà


#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
int main(int argc, char **argv)
{
int fd;
int flags;
if (argc<1) {
fprintf(stderr,"Usage: pctrl serial_device");
fprintf(stderr,"For example: sns /dev/ttyS0");
Ðèñ. 1. Ïîñëåäîâàòåëüíûå ïîðòû. exit(1);
В таблицах 1 и 2 описаны функции контактов для 9- и }
25-контактных портов соответственно. if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
// Íåâîçìîæíî îòêðûòü ïîðò
Òàáëèöà 1. Êîíòàêòû è ñèãíàëû (9 pin). fprintf(stderr, "Cannot open port");
exit(1);
}
// Áåñêîíå÷íûé öèêë. Äëÿ âûõîäà èç ïðîãðàììû íàæìèòå Ctrl + C
while (1)
{
ioctl(fd, TIOCMGET, &flags);
/*
Èñïîëüçóåìûå êîíñòàíòû (ñì. òàáëèöó 1)
#define TIOCM_LE 0x001
#define TIOCM_DTR 0x002
#define TIOCM_RTS 0x004
#define TIOCM_ST 0x008
#define TIOCM_SR 0x010
Интерфейс RS-232C обеспечивает два независимых #define TIOCM_CTS 0x020
последовательных канала данных: основной и вспомога- #define TIOCM_CAR 0x040
#define TIOCM_RNG 0x080
тельный (вторичный), но на практике используется толь- #define TIOCM_DSR 0x100
ко основной, поэтому в асинхронном режиме использу- #define TIOCM_CD TIOCM_CAR
#define TIOCM_RI TIOCM_RNG
ются только первые 9 линий из 25. */

№7(8), июль 2003 33


администрирование
// Âûâîäèì ñîñòîÿíèå óñòðîéñòâà int main(int argc, char **argv)
if (flags & TIOCM_CD) fprintf(stderr,"1 [CD] "); {
if (flags & TIOCM_SR) fprintf(stderr,"2 [RD] "); int fd;
if (flags & TIOCM_ST) fprintf(stderr,"3 [TD] "); int flags=TIOCM_RNG;
if (flags & TIOCM_DTR) fprintf(stderr,"4 [DTR] ");
if (flags & TIOCM_DSR) fprintf(stderr,"6 [DSR] "); if (argc<1) {
if (flags & TIOCM_RTS) fprintf(stderr,"7 [RTS] "); fprintf(stderr,"Usage: sns serial_device");
if (flags & TIOCM_CTS) fprintf(stderr,"8 [CTS] "); fprintf(stderr,"For example: sns /dev/ttyS0");
if (flags & TIOCM_RNG) fprintf(stderr,"9 [RNG] "); exit(1);
}
fprintf(stderr,"\n");
ioctl(fd, TIOCMSET, &flags);
// Çàñûïàåì íà 1 ñåêóíäó
sleep(1); close(fd);
} }
close(fd);
}

Для компилирования программы введите команду:

gcc -o pctrl pctrl.c

Каждую секунду программа выводит на экран состоя-


ние указанного порта. Вывод программ можно увидеть на
рисунке 2. Для установки какого-нибудь сигнала можно
воспользоваться следующей программой:

Ëèñòèíã 2. Óñòàíîâêà ñèãíàëà RNG

#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h> Ðèñ. 2. Âûâîä ïðîãðàììû.
#include <stdlib.h>
#include <unistd.h> Примечание. Обе программы нужно запускать от име-
#include <stdio.h>
#include <signal.h> ни пользователя root (пользователя с UID = 0). Все ваши
вопросы присылайте по адресу dhsilabs@mail.ru.

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

НЕЯВНЫЙ САМОКОНТРОЛЬ
КАК СРЕДСТВО СОЗДАНИЯ
НЕЛОМАЕМЫХ ЗАЩИТ

КРИС КАСПЕРСКИ

36
безопасность
Основная ошибка подавляющего большинства разработ- та контрольной суммы: напичкивать его антиотладочны-
чиков защитных механизмов состоит в том, что они дают ми приемами, реализовать его на базе собственных вир-
явно понять хакеру, что защита еще не взломана. Если туальных машин (то есть интерпретаторов), некоторые из
защита сообщает «неверный ключевой файл (пароль)», них, например, Стрелку Пирса, достаточно трудно про-
то хакер ищет тот код, который ее выводит и анализирует анализировать. Но если такие меры и остановят взлом-
условия, которые приводят к передаче управления на дан- щика, то ненадолго.
ную ветку программы. Если защита в случае неудачной
аутентификации блокирует некоторые элементы управ- Техника неявного контроля
ления и/или пункты меню, хакер либо снимает такую бло- Ошибка традиционного подхода заключается в его пред-
кировку «в лоб», либо устанавливает точки останова (в сказуемости. Любая явная проверка чего бы то ни было
просторечии называемые «бряками») на API-функции, по- независимо от ее алгоритма – это зацепка! Если хакер
средством которых такое блокирование может быть осу- локализует защитный код, то все – пиши пропало. Един-
ществлено (как правило, это EnableWindows), после чего ственный надежный способ отвадить его от взлома –
он опять-таки оказывается в непосредственной близости «размазать» защитный код по всей программе с таким
от защитного механизма, который ничего не стоит про- расчетом, чтобы нейтрализовать защиту без полного
анализировать и взломать. Даже если защита не выво- анализа всей программы целиком – было заведомо не-
дит никаких ругательств на экран, а просто молчаливо возможным. К сожалению, существующие методики
выходит из программы, то хакер либо ставит точку оста- «размазывания» либо многократно усложняют реализа-
нова на функцию exit, либо тупо трассирует программу и, цию программы, либо крайне неэффективны. Некоторые
дождавшись момента передачи управления на exit, ана- программисты вставляют в программу большое количе-
лизирует один или несколько последующих условных пе- ство вызовов одной и той же защитной функции, иду-
реходов в цепи управления – какой-то из них непосред- щих из различных мест, наивно полагая тем самым, что
ственно связан с защитой! хакер будет искать и анализировать их все. Да как бы не
В некоторых защитных механизмах используется кон- так! Хакер ищет ту самую защитную функцию и правит
троль целостности программного кода на предмет выяв- ее. К тому же, зная смещение вызываемой функции,
ления его изменений. Теперь, если хакер подправит не- найти и отследить ее вызовы можно без труда! Даже если
сколько байтиков в программе, защита немедленно об- встраивать защитную функцию непосредственно в мес-
наружит это и взбунтуется. «Святая простота!» – восклик- то ее вызова, хакер сможет найти все такие места ту-
нет хакер и отключит самоконтроль защиты, действуя тем пым поиском по сигнатуре. Пусть оптимизирующие ком-
же самым способом, что описан выше. По наблюдениям пиляторы несколько меняют тело inline-функций с уче-
автора, типичный самоконтроль выявляется и нейтрали- том контекста конкретного вызова, эти изменения не-
зуется за несколько минут. Наиболее сильный алгоритм принципиальны. Реализовать же несколько десятков раз-
защиты: использовать контрольную сумму критических личных защитных функций слишком накладно, да и фан-
участков защитного механизма для динамической рас- тазии у разработчика не хватит, и хакер, обнаружив и
шифровки некоторых веток программы, которые ломают- проанализировав пару-тройку защитных функций, на-
ся уже не за минуты, а за часы (в редчайших случаях – столько проникнется «духом» и ходом мысли разработ-
дни). Алгоритм взлома выглядит приблизительно так: чика, что все остальные найдет без труда.
 подсмотрев контрольную сумму в оригинальной про- Между тем существует и другая возможность – неяв-
грамме, хакер переписывает код функции CalculateCRC, ная проверка целостности своего кода. Рассмотрим сле-
заставляя ее всегда возвращать это значение, не вы- дующий алгоритм защиты: пусть у нас имеется зашиф-
полняя реальной проверки; рованная (а еще лучше упакованная) программа. Мы,
 если защита осуществляет подсчет контрольной сум- предварительно скопировав ее в стековый буфер, рас-
мы различных участков программы и/или разработ- шифровываем (распаковываем) ее и… используем осво-
чик использовал запутанный самомодифицирующий- бодившийся буфер под локальные переменные защищен-
ся код, труднопредсказуемым способом меняющий ной программы. С точки зрения хакера, анализирующего
свою контрольную сумму, то хакер может изменить дизассемблерный код, равно как и гуляющего по защите
защиту так, чтобы она автоматически самовосстанав- отладчиком, все выглядит типично и «законно». Обнару-
ливалась после того, как все критические участки жив защитный механизм (пусть для определенности это
будут пройдены; будет тривиальная парольная проверка), хакер правит со-
 отследив все вызовы CalculateCRC, хакер может про- ответствующий условный переход и с удовлетворением
сто снять динамическую шифровку, расшифровав ее убеждается, что защита больше не ругается и программа
вручную, после чего надобность в CalculateCRC про- работает. Как будто бы работает! – через некоторое вре-
падает. мя выясняется, что после взлома работа программы ста-
ла неустойчивой: то она неожиданно виснет, то делает из
Стоит отметить, что независимо от способа своей ре- чисел винегрет, то… Почесав репу, хакер озадаченно ду-
ализации любой самоконтроль элементарно обнаружива- мает: «А как это вообще ломать? На что ставить точки
ется установкой точек останова на те участки защитного останова? Ведь не анализировать же весь код целиком!».
механизма, которые были изменены. Остальное – дело Весь фокус в том, что некоторые из ячеек буфера,
техники. Можно сколь угодно усложнять алгоритм подсче- ранее занятого зашифрованной (упакованной) програм-

№7(8), июль 2003 37


безопасность
мой при передаче их локальным переменным не были про- на модифицированный им защитный код, то он вообще
инициализированы! Точнее, они были проинициализиро- не обнаружит к ней обращения, т.к. защита контролирует
ваны теми значениями, что находились в соответствую- именно зашифрованный (упакованный) код, содержащий-
щих ячейках оригинальной программы. Как нетрудно до- ся в нашем буфере. Даже если хакер поставит точку ос-
гадаться, именно эти ячейки и хранили критичный к из- танова на буфер, он быстро выяснит, что:
менениям защитный код, а потому и неявно контролируе-  ни до, ни в процессе, ни после расшифровки (распа-
мый нашей программой. Теперь я готов объяснить, зачем ковки) программы содержимое модифицированных им
вся эта котовасия с шифровкой (упаковкой) нам вообще ячеек не контролируется (что подтверждает анализ
понадобилась: если бы мы просто скопировали часть кода кода расшифровщика/распаковщика – проверок цело-
программы в буфер, а затем «наложили» на него наши стности там действительно нет);
локальные переменные, то хакер сразу бы заинтересо-  обращение к точке останова происходит лишь тогда,
вался происходящим и, бормоча под нос «что-то здесь не когда буфер затерт локальными переменными и (по
так», вышел бы непосредственно на след защиты. Рас- идее!) содержит другие данные.
шифровка нам понадобилась лишь для усыпления бди-
тельности хакера. Вот он видит, что код программы копи- Правда, ушлый хакер может обратить внимание, что
руется в буфер. Спрашивает себя: «А зачем?». И сам же после «затирания» значение этих ячеек осталось неиз-
себе отвечает: «Для расшифровки!». Затем, дождавшись менным. Совпадение? Проанализировав код, он сможет
освобождения буфера с последующим затиранием его убедиться, что они вообще не были инициализированы и
содержимого локальными переменными, хакер (даже про- тогда защита падет! Однако мы можем усилить свои по-
ницательный!) теряет к этому буферу всякий интерес. зиции: достаточно лишь добиться, чтобы контролируемые
Далее, если хакер поставит контрольную точку останова байты попали в «дырки», образующиеся при выравнива-

Ðèñóíîê 1.

38
безопасность
нии структуры (этим мы отвечаем хакеру на вопрос: а чего защиты приведен в листинге 1. Для упрощения понима-
это они не инициализированы?), а затем скопировать эту ния и абстрагирования от всех технических деталей здесь
структуру целиком (вместе с контролируемыми «дырка- используется простейшая схема аутентификации, «ло-
ми»!) в десяток-другой буферов, живописно разбросан- мать» которую совершенно необязательно: достаточно
ных по всей программе. Следить на всеми окажется не лишь подсмотреть оригинальный пароль, хранящийся в
так-то просто: во-первых, не хватит контрольных точек, а защищенном файле прямым текстом. Для демонстраци-
во-вторых, это просто не придет в голову. онного примера такой прием с некоторой натяжкой допу-
стим, но в реальной жизни вам следует быть более изощ-
Практическая реализация ренными. По крайней мере, следует добиться того, чтобы
Правила хорошего тона обязывают нас проектировать ваша защита не ломалась изменением одного-единствен-
защитные механизмы так, чтобы они никогда, ни при ка- ного байта, поскольку в этом случае даже неявный конт-
ких обстоятельствах не могли нанести какой бы то ни было роль будет легко выявить. Следует также отметить, что
вред легальному пользователю. Даже если вам очень- контролировать все критические байты защиты – не
очень хочется наказать хакера, ломающего вашу програм- очень-то хорошая идея, т.к. хакер сможет это легко обна-
му, форматировать диск в случае обнаружения модифи- ружить. Если защита требует для своего снятия хотя бы
кации защитного кода, категорически недопустимо! Во- десяти модификаций в различных местах, три из которых
первых, это просто незаконно и попадает под статью о контролируются, то с вероятностью ~70% факт контроля
умышленном создании деструктивных программ, а во- не будет обнаружен. Действительно, среднестатистичес-
вторых, задумайтесь, что произойдет, если искажение кий хакер следить за всеми модифицированными ими бай-
файла произойдет в результате действий вируса или не- тами просто не будет. Вместо этого, он в надежде что ту-
которого сбоя? Если вы не хотите, чтобы пострадали не- пая защита контролирует целостность своего кода цели-
винные, вам придется отказаться от всех форм вреда, в ком, будет следить за обращениями к одной, ну макси-
том числе и преднамеренном нарушении стабильности ра- мум двум-трем измененным им ячейкам и… с удивлени-
боты самой защищенной программы. ем обнаружит, что защита их вообще не контролирует.
Стоп! Ведь выше мы говорили как раз об обратном. После того как контрольные точки выбраны, вы долж-
Единственный путь сделать защиту трудноломаемой, не ны определить их смещение в откомпилированном фай-
выдавая никаких ругательных сообщений, по которым нас ле. К сожалению, языки высокого уровня не позволяют
можно засечь, – молчаливо делать винегрет из обраба- определять адреса отдельных машинных инструкций и,
тываемых данных. А теперь выясняется, что делать этого если только вы не пишите защиту на ассемблерных встав-
по этическим (и юридическим!) соображениям нельзя. На ках, то у вас остается один-единственный путь – восполь-
самом деле, если хорошо подумать, то все эти ограниче- зоваться каким-нибудь дизассемблером (например, IDA).
ния легко обойти. Что нам мешает оснастить защиту яв- Допустим, критическая часть защиты выглядит так, и
ной проверкой целостности своего кода? Хакер найдет и нам необходимо проконтролировать целостность услов-
нейтрализует ее без труда, но это и не страшно, посколь- ного оператора if, выделенного красным цветом:
ку истинная защита находится совершенно в другом мес-
те, а вся эта бутафория нужна лишь затем, чтобы предот- int my_func()
{
вратить последствия непредумышленного искажения кода if (check_user())
программы и поставить пользователя в известность, что {
fprintf(stderr, "passwd ok\n");
все данные нами гарантии (как явные, так и предполагае- }
мые) ввиду нарушения целостности оригинального кода else
{
аннулируются. Правда, при обсуждении защиты данного fprintf(stderr, "wrong passwd\n");
типа некоторые коллеги мне резонно возразили, а что, exit(-1);
}
если в результате случайного сбоя окажутся изменены и return 0;
контролируемые ячейки, и сама контрольная сумма? За- }
щита сработает у легального пользователя!!! Ну что мне
на это ответить? Случайно таких «волшебных» искаже- Загрузив откомпилированный файл в дизассемблер,
ний просто не бывает, их вероятность настолько близка к мы получим следующий код (чтобы быстро узнать, кото-
нулю, что… К тому же, в случае срабатывания защиты рая из всех процедур и есть my_func, опирайтесь на тот
мы ведь не форматируем легальному пользователю диск, факт, что большинство компиляторов располагает функ-
а просто нарушаем нормальную работу программы. Пусть ции в памяти в порядке их объявления, т.е. my_func будет
и предумышленно, все равно, если в результате того или вторая по счету функция):
иного сбоя был искажен исполняемый файл, то о коррек-
тности его работы более говорить не приходится. Ну хо- .text:00401060 sub_401060 proc near ↵
; CODE XREF: sub_4010A0+AF?p
рошо, если вы так боитесь сбоев, можно встроить в за- .text:00401060 call sub_401000
щиту хоть десяток явных проверок, – трудно нам что ли?! .text:00401065 test eax, eax
.text:00401067 jz short loc_40107E
Ладно, оставим этические проблемы на откуп тем са- .text:00401069 push offset aPasswdOk ↵
мым пользователям, которые приобретают титул «лицен- ; "passwd ok\n"
.text:0040106E push offset unk_407110
зионных» исключительно через крак, и перейдем к конк- .text:00401073 call _fprintf
ретным вещам. Простейший пример реализации данной .text:00401078 add esp, 8

№7(8), июль 2003 39


безопасность
.text:0040107B xor eax, eax int my_func()
.text:0040107D retn {
.text:0040107E ; ----------------------------------------- if (check_user())
.text:0040107E {
.text:0040107E loc_40107E: ↵ fprintf(stderr, "passwd ok\n");
; CODE XREF: sub_401060+7?j }
.text:0040107E push offset aWrongPasswd ↵ else
; "wrong passwd\n" {
.text:00401083 push offset unk_407110 fprintf(stderr, "wrong passwd\n");
.text:00401088 call _fprintf exit(-1);
.text:0040108D push 0FFFFFFFFh ↵ }
; int return 0;
.text:0040108F call _exit }
.text:0040108F sub_401060 endp
main()
Как нетрудно сообразить, условный переход, распо- {
int a, b = 0;
ложенный по адресу 0x401067, и есть тот самый «if», ко- #pragma pack(1)
торый нам нужен. Однако это не весь if, а только малая
union anti_hack
его часть. Хакер может и не трогать условного перехо- {
да, а заменить инструкцию test eax, eax на любую дру- char buf[MAX_CODE_SIZE];
struct code_control
гую инструкцию, сбрасывающую флаг нуля. Также он {
может модифицировать защитную функцию sub_401000, int local_var_1;
int local_var_2;
которая и осуществляет проверку пароля. Словом, тут char gag_1[OFFSET_1-sizeof(int)*2];
много разных вариантов и на этом несчастном услов- int x_val_1;
char gag_2[OFFSET_2 - OFFSET_1 - sizeof(int)];
ном переходе свет клином не сошелся, а потому для int x_val_2;
надежного распознавания взлома нам потребуются до- };
};
полнительные проверки. Впрочем, это уже детали. Глав- union anti_hack ZZZ;
ное, что мы определили смещение контролируемого
// TITLE
байта. Кстати, а почему именно байта? Ведь мы можем fprintf(stderr, "crackeme.0xh by Kris Kaspersky\n");
контролировать хоть целое двойное слово, расположен-
// ðàñøèôðîâêà êîäà
ное по данному смещению! Особого смысла в этом нет, // ======================================================
просто так проще.
// êîïèðóåì ðàñøèôðîâûâàåìûé êîä â áóôåð
Чтобы не работать с непосредственными смещения- memcpy(&ZZZ, &check_user, (int) &main - (int) &check_user);
ми (это неудобно и вообще некрасиво), давайте загоним
// ðàñøèôðîâûâàåì â áóôåðå
их в специально на то предназначенную структуру: for (a = 0; a < (int) &main - (int) &check_user; a++)

union anti_hack {
{ (*(char *) ((int) &ZZZ + a)) ^= x_crypt;
char buf[MAX_CODE_SIZE]; }
struct code_control
{ // êîïèðóåì îáðàòíî
int local_var_1; memcpy(&check_user, &ZZZ, (int) &main - (int) &check_user);
int local_var_2;
char gag_1[OFFSET_1-sizeof(int)*2];
int x_val_1; // ÿâíàÿ ïðîâåðêà èçìåíåíèÿ êîäà
char gag_2[OFFSET_2 - OFFSET_1 - sizeof(int)]; // ======================================================
int x_val_2; for (a = 0; a < (int) &main - (int) &check_user; a++)
};
}; {
b += *(int *) ((int) &check_user + a);
}
if (b != x_original_all)
Исходный текст: {
fprintf(stderr, "-ERR: invalid CRC (%x) hello, hacker\n", b);
Ëèñòèíã 1. return 0;
#include <stdio.h> }

#define PASSWD "+++"


#define MAX_LEN 1023 // ÿâíàÿ ïðîâåðêà "âàëèäíîñòè" ïîëüçîâàòåëÿ
#define MAX_CODE_SIZE (0x10*1024) // ======================================================
#define OFFSET_1 0x42 my_func();
#define OFFSET_2 0x67

#define x_original_1 0xc01b0574 // íîðìàëüíîå âûïîëíåíèå ïðîãðàììû


#define x_original_2 0x44681574 // ======================================================
#define x_original_all 0x13D4C04B
// ñêðûòûé êîíòðîëü
#define x_crypt 0x66 ZZZ.local_var_1 = 2;
ZZZ.local_var_2 = 2;x_original_2;
int check_user() sprintf(ZZZ.gag_1, "%d * %d = %d\n", ZZZ.local_var_1, ↵
{ ZZZ.local_var_2, ZZZ.local_var_1*ZZZ.local_var_2 + ↵
char passwd[MAX_LEN]; ((x_original_1^ZZZ.x_val_1)+ ↵
(x_original_2^ZZZ.x_val_2)));
fprintf(stderr,"enter password:");
fgets(passwd, MAX_LEN, stdin); printf("DEBUG: %x %x\n", ZZZ.x_val_1, ZZZ.x_val_2);
return ~strcmp(passwd, PASSWD); fprintf(stderr, "%s",ZZZ.gag_1);
}
}

40
безопасность
Заключение каждую новую версию защищенной программы придет-
Итак, для надежной защиты своих программ от вездесу- ся ломать индивидуально и опыт предыдущих взломов
щих хакеров вам совершенно необязательно прибегать к ничуть не упрощает задачу, а сама логика защиты до
помощи широко разрекламированных, но дорогостоящих безобразия проста. Как защита проверяет целостность
электронных ключей (которые, как известно, склонны в своего кода, хакеру более или менее ясно, но вот где
самый неподходящий момент "сгорать", к тому же "отвя- конкретно осуществляется такая проверка, он не смо-
зать" программу от ключа для опытного взломщика не жет сказать до тех пор, пока не проанализирует всю
проблема). Также совершенно необязательно спускаться программу целиком.
на уровень "голого" ассемблера (ассемблерные защиты Допустим, объем кода защищенного приложения со-
непереносимы и к тому же чрезвычайно трудоемки в от- ставляет порядка 256-512 Кб (не слишком много, прав-
ладке, про сопровождение я и вовсе молчу). Как было да?), тогда при средней длине одной машинной инструк-
показано выше, практически неломаемую защиту можно ции в 2,5 байта, хакеру придется проанализировать 100 –
создать и на языках высокого уровня, например, на Си/ 200 тысяч ассемблерных команд! При "крейсерской" ско-
Си++, Delphi или Фортране. рости анализа 10-20 инструкций в минуту (а это предел
Защиты, основанные на неявном контроле целост- мечтаний для профессионалов экстракласса) ориентиро-
ности своего кода, ни один здравомыслящий хакер ло- вочное время взлома составит по меньшей мере полто-
мать не будет (конечно, при условии, что они не содер- раста часов работы – почти неделя напряженного труда!
жат грубых ошибок реализации, значительно упроща- А на практике (с учетом затрат на тестирование взло-
ющих взлом), ибо трудоемкость взлома сопоставима с манного приложения) даже более того. Другими слова-
разработкой аналогичной программы "с нуля", а ведь ми, взломать защиту за разумное время нереально.

№7(8), июль 2003 41


bugtraq
KDE Konqueror Embedded не в состоянии Просмотр содержания произвольных
в некоторых случаях подтвердить файлов в памяти системы в HP/UX 'ftpd'
подлинность SSL-сертификатов Уязвимость обнаружена в HP/UX 'ftpd' в команде REST. Уда-
Уязвимость обнаружена в KDE Konqueror. Программное ленный пользователь может просматривать содержание
обеспечение не проверяет имя хоста в SSL-сертификатах. произвольных файлов в памяти системы.
Сообщается, что выполнение KDE SSL в KDE Konqueror Сообщается, что удаленный пользователь может ис-
Embedded проверяет сертификаты, основанные на IP-ад- пользовать команду REST (reset) и определить местопо-
ресе, но не проверяет, соответствует ли Common Name ложение памяти, чтобы просматривать содержание фай-
имени хоста. Удаленный пользователь может подделать лов из памяти.
безопасный веб-сервер или выполнить SSL man-in-the- Пример: (еще несколько примеров можно найти в ис-
middle нападение таким образом, что его не сможет об- точнике сообщения):
наружить KDE Konqueror Embedded.
Патчи можно скачать отсюда: frieza elguapo $ ftp 192.168.1.111
Connected to 192.168.1.111.
ftp://ftp.kde.org/pub/kde/security_patches 220 kakarot FTP server (Version 1.1.214.4 Mon Feb 15 08:48:46 ↵
4c252809dec8be73bbe55367350c27ca post-2.2.2-kdelibs- GMT 1999) ready.
Name (192.168.1.111:root): elguapo
kssl-2.diff 331 Password required for elguapo.
441afec72fab406f8c1cd7d6b839b3e0 post-2.2.2-kdelibs- Password:
230 User elguapo logged in.
kio-2.diff Remote system type is UNIX.
Уязвимость обнаружена в KDE 2.2.2 и более ранних Using binary mode to transfer files.
ftp> rest 1111111111111111
версиях. restarting at 2147483647. execute get, put or append ↵
to initiate transfer
ftp> get .
Множественные переполнения буфера local: . remote: .
в MDaemon IMAP-сервере 200 PORT command successful.
Несколько уязвимостей обнаружено в MDaemon IMAP-сер- # gdb /usr/lbin/ftpd 2862
вере. Удаленный пользователь может аварийно завершить GNU gdb 4.18-hppa-991112
Copyright 1998 Free Software Foundation, Inc.
работу сервиса или выполнить произвольный код с System-
привилегиями. /home/elguapo/2862: No such file or directory.
Attaching to program: /usr/lbin/ftpd, process 2862
Сообщается, что несколько переполнений буфера суще-
ствует в обработке IMAP4-протокола. Удаленный пользова- Unable to find __dld_flags symbol in object file.
тель может послать чрезмерно большое количество данных (gdb) c
с командами EXAMINE, DELETE, SUBSCRIBE, RENAME, Continuing.
UNSUBSCRIBE, LIST, LSUB, STATUS, LOGIN, CREATE и Program received signal SIGSEGV, Segmentation fault.
SELECT, чтобы вызвать переполнение. Для выполнения не- 0xc00ef0b8 in ?? ()
(gdb) bt
которых команд требуется авторизация. #0 0xc00ef0b8 in ?? ()
Уязвимость обнаружена в MDaemon 6.7.8. Error accessing memory address 0x7fffffff: Bad address.
(gdb) info registers r3 r11
Обход ограничений доступа r3: 7fffffff
r11: 7fffffff
по хостам в OpenSSH
Уязвимость в проверке правильности доступа обнаружена Уязвимость может использоваться, например, для полу-
в OpenSSH. Удаленный пользователь, способный управ- чения пароля root из памяти. Уязвимость связана с непра-
лять DNS, может обойти ограничения по хостам в OpenSSH. вильным использованием конверсионного символа в стро-
Сообщается, что при получении нового подключе- ке формата. Уязвимость обнаружена в HP/UX ftpd 1.1.214.4.
ния OpenSSH выполняет обратный DNS-просмотр и про- Hewlett Packard выпустил заплату PHNE_18377, уст-
веряет результаты поиска против IP-адресов или име- раняющую эту уязвимость.
ни хостов, указанных в файле конфигурации OpenSSH,
как разрешенные или запрещенные хосты. Если файл DoS против Microsoft Windows XP
конфигурации определяет числовой IP-адрес или ин- Уязвимость обнаружена во всех версиях Microsoft Windows
тервал IP-адресов, удаленный пользователь, контроли- XP. Локальный пользователь может аварийно завершить
рующий DNS-сервер, может заставить DNS-сервер воз- работу системы.
вратить имя хоста, содержащее строку IP-адреса (на- Проблема связана с тем, что Windows не в состоянии
пример, '[ipaddress].[domain]'). Если строка IP-адреса со- правильно обработать множественные вложенные дирек-
ответствует разрешенным IP-адресам в конфигураци- тории. Локальный пользователь может создать каталог,
онном файле, OpenSSH некорректно определит подклю- содержащий 122 вложенные директории и обратиться к
чение как разрешенное. В результате удаленный последней директории, чтобы аварийно завершить рабо-
пользователь может получить доступ к SSH-порту от ту системы.
запрещенного хоста. Уязвимость обнаружена в Microsoft Windows XP.
Уязвимость обнаружена в OpenSSH 3.6.1 и более ран-
них версиях. Для устранения уязвимости, включите оп- Составил Александр Антипов
цию 'VerifyReverseMapping' на SSH-сервере.

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

СЕРГЕЙ ЯРЕМЧУК

44
безопасность
В статье «Контрольная сумма на защите Linux/FreeBSD» компилятором С при обработке файлов заголовков, по-
июньского номера журнала «Системный администратор» этому удалять их не надо. После набираем:
была рассмотрена настройка утилиты Tripwire, позволя-
ющей системному администратору контролировать цело- # make linux (openbsd, freebsd, netbsd)
стность важных системных файлов и быть предупрежден-
ным о взломе. Но хотелось бы не доводить до всего этого чтобы откомпилировать программу и затем под логином root:
и иметь возможность защититься и предотвратить взлом.
Существует множество утилит, позволяющих определить # make install
признаки подготовки и начала атаки (сканирование пор-
тов, множество неудачных удаленных подключений к сер- Теперь в /usr/local должен появиться каталог psionic с под-
веру), в этой статье познакомимся с тремя из них. каталогом portsentry2, в котором будут находиться три фай-
Набор программ TriSentry от компании Psionic ла: portsentry – исполняемый файл программы, portsentry.conf
Technologies Inc. (http://www.psionic.com/) разработаны, что- и portsentry.ignore. В portsentry.ignore содержатся IP-адре-
бы увеличить защиту компьютерных сетей и уменьшить ве- са узлов, которые не дожны блокироваться.
роятность проникновения, эти приложения относятся к IDS По умолчанию там содержится два адреса 127.0.0.1 и
(Intrusion Detection System – система обнаружения вторже- 0.0.0.0, остальные при необходимости заносятся в фор-
ний). Состоит TriSentry из трех ключевых компонентов: мате <IP Address>/<Netmask>. Например:
PortSentry, HostSentry и LogSentry, распространяемых как
freeware и предназначенных для использования на Unix-по- 192.168.2.0/24
192.168.0.0/16
добных операционных системах как вместе, так и раздель- 192.168.2.1/32
но, в зависимости от задач и необходимости.
По умолчанию используется 32-битная маска. Теперь
PortSentry самое время заглянуть в главный конфигурационный файл
PortSentry – программа, предназначенная для обнаружения portsentry.conf. Опции в этом файле для удобства условно
сканирования портов, которое, как правило, всегда пред- сгруппированы по секциям и имеют вид ОПЦИЯ=«значение».
шествует атаке. Она не только позволяет регистрировать
это в системных журналах при помощи syslog, но и позволя-
ет запустить в ответ любую программу (блокировки хоста Значения опций файла portsentry.conf
firewall или переадресации на несуществующий dead host,
traseroute, свой скрипт), которой могут быть переданы IP- Interface Configurations
адрес атакующего и номер атакуемого порта, или просто  INTERFACE=«auto» – названия подконтрольного интер-
прописать адрес компьютера в файле /etc/hosts.deny. фейса, при наличии одного возможен вариант «auto»,
PortSentry обнаруживает практически все известные виды и он будет найден автоматически; если же их несколь-
сканирования: Strobe-style, SYN/half-open, Null, XMAS, FIN, ко, то необходимо указать на выбранный для контро-
TCP connect и другие. В файле README.stealth архива вы ля, например INTERFACE=«eth0», Portsentry может кон-
найдете описание обнаруживаемых методов Stealth-скани- тролировать только один интерфейс.
рования. В настоящее время имеется уже версия 2.0 про-  INTERFACE_ADDRESS=«XXX.XXX.XXX.XXX» – IP-адрес
граммы, отличающаяся от первой поддержкой libpcap, т.е. интерфейса, без него Portsentry не сможет работать дол-
методами обнаружения сканирования. После закачки паке- жным образом, в данное время не поддерживается ди-
та распакуйте (tar xfz portsentry-2.0b.tar.gz) его и откройте в намическое определение адреса, в этом случае придет-
любимом редакторе файл portsentry_config.h, в котором со- ся писать скрипт (но в ближайшее время, по заверени-
держатся некоторые опции конфигурирования, для большин- ям разработчиков, такая опция будет реализована).
ства случаев подойдут используемые по умолчанию:
 CONFIG_FILE “/usr/local/psionic/portsentry2/portsentry.conf” – Port Configurations
содержится путь к конфигурационному файлу, если зна-  TCP_PORTS – перечисляются через запятую все про-
чение по умолчанию не подходит, изменив его, не за- веряемые Portsentry TCP-порты (диапазоны не поддер-
будьте подправить его и в Makefile в опциях INSTALLDIR живаются), список желательно не делать слишком
(/usr/local/psionic) и CHILDDIR (/portsenry2); большим, чтобы уменьшить количество срабатываний,
 WRAPPER_HOSTS_DENY “/etc/hosts.deny” – путь к фай- но он должен охватывать весь диапазон и содержать
лу hosts.deny для работы tcpwrapper; порт номер 1, так как в большинстве сканеров скани-
 SYSLOG_FACILITY LOG_DAEMON – тип логов для рование начинается именно с него, также не надо вклю-
syslogd (подробности в man 3 syslog); чать сюда порты, открытые работающими приложени-
 SYSLOG_LEVEL LOG_NOTICE – уровень syslogd для ями (20 – ftp, 25 – sendmail, 80 – httpd и пр.). При по-
посылки сообщений; пытке подключения к указанному порту информация
 MAXSTATE 50 – максимальное количество запоминае- об этом заносится в логи, затем выполняется пользо-
мых хостов для проверки повторного подключения. вательская команда и после узел блокируется при по-
мощи ipchains.
Знак решетки (#) в этом файле в начале строк с пере-  UDP_PORTS – то же самое, только касается UDP-пор-
менными – это не признак комментария, они требуются тов.

№7(8), июль 2003 45


безопасность
Configuration Files Scan trigger value
 IGNORE_FILE – полный путь к файлу portsentry.ignore. SCAN_TRIGGER – определяет разрешенное количество
 HISTORY_FILE – путь к файлу с историей, в котором подключений, прежде чем Portsentry начнет действовать.
содержатся записи о времени блокирования, имени и Значение по умолчанию 0 означает немедленную реак-
IP-адреса хоста, атакованный порт и протокол (TCP или цию. Установка в 1 или 2 уменьшит количество ложных
UDP). срабатываний. Но можно оставить как есть.
 BLOCKED_FILE – шаблон, из которого формируется
файл блокировки, имеющий имя BLOCKED_FILE.про- Это все опции применительно к версиям 1.1 и 2.0, но в
токол. версии 1.1, которая до сих пор пользуется популярнос-
тью, имеется еще одна опция – PORT_BANNER, которая
Misc. Configuration Options задает сообщение, выводимое при подключении к прове-
RESOLVE_HOST – при установлении в 1 производится ряемому порту.
запрос сервера DNS имени хоста нападавшего. На мед-
ленных компьютерах это может увеличить время реакции PORT_BANNER="** UNAUTHORIZED ACCESS PROHIBITED *** YOUR
CONNECTION ATTEMPT HAS BEEN LOGGED. GO AWAY."
и может предупредить нападающего о наличии Portsentry,
если он контролирует сервер имен. Значение по умолча- Сами авторы программы не рекомендуют пользоваться
нию – 0. ею, чтобы не злить взломщика, очевидно поэтому она и была
убрана со второй версии программы. Хотя можно попытать-
Ignore Options ся при помощи этой опции сбить начинающего взломщика с
 BLOCK_UDP – позволяет задать ответную реакцию толку, указав, например, неправильные данные о системе.
на сканирование в зависимости от установленного После того как все параметры установлены, можно за-
значения. При значении 0 ничего не происходит, узел пускать утилиту. Во второй версии это просто запуск ис-
не блокируется, команда не запускается; 1 означает полняемого файла без параметров.
блокировать узел и запустить на выполнение коман-
ду; 2 – только запустить заданную команду. Команда # /usr/local/psionic/portcentry2/portcentry
задается при помощи опции KILL_RUN_CMD.
 BLOCK_TCP – то же самое, только для TCP-прото- После этого в файле /var/log/message должно появить-
кола. ся примерно такое сообщение, в котором описываются
контролируемый интерфейс и порты:
Dropping Routes
В этой секции описывается команда, которая будет вы- Jun 4 09:00:32 grinder portsentry[1881]: adminalert: ↵
Monitoring interface eth0 and address:
полнена при обнаружении сканирования, при этом пе- 192.168.0.4
ременная $TARGET$ заменяется IP-адресом, а в пере- Jun 4 09:00:32 grinder portsentry[1881]: adminalert: ↵
Initializing PortSentry BPF filters.
менную $PORT$ будет подставлен номер порта, к ко- Jun 4 09:00:32 grinder portsentry[1881]: adminalert: ↵
торому было подключение. В файле содержатся шаб- Monitoring TCP ports:
1,11,15,79,111,119,143,515,540,635,666,1080,1524,2000,6667, ↵
лоны команд (удаление маршрута, установка firewall) 12345,12346,20034,27374,27665,3133
для различных операционных систем, необходимую 7,32771,32772,32773,32774,40421,49724,54320,54321
Jun 4 09:00:32 grinder portsentry[1881]: adminalert: ↵
нужно раскомментировать или дописать свою, исполь- Monitoring UDP ports:
зуя параметр KILL_ROUTE. 1,7,9,69,161,162,513,635,2049,27444,32770,32771,32772,32773,32774,31337,54321
Jun 4 09:00:32 grinder portsentry[1881]: adminalert: ↵
PortSentry is initialized and monitoring.
# FreeBSD
#KILL_ROUTE="route add -net $TARGET$ ↵
-netmask 255.255.255.255 127.0.0.1 -blackhole" Последняя строка указывает на счастливый запуск
# iptables support for Linux утилиты, если ее нет, то что-то сделано неправильно. При
#KILL_ROUTE="/usr/local/bin/iptables -I INPUT -s $TARGET$ ↵
-j DROP" этом могут быть следующие специфические сообщения:
 adminalert – это сообщение выводит текущий статус
PortSentry.
TCP Wrappers  securityalert – сообщение о том, что некое защитное
KILL_HOSTS_DENY – опция задает строку, которая будет событие произошло.
помещена в /etc/hosts.deny для блокировки доступа (ALL:  attackalert – компьютер был атакован и соответствую-
$TARGET$). щие данные занесены в /etc/host.deny.

External Command В первой же версии программы использовалось шесть


 KILL_RUN_CMD – команда, которая будет выполнена режимов по три на каждый протокол (TCP и UDP):
в сторону нападающего. Можно запустить отправку по-  portsentry -tcp (basic port-bound TCP mode)
чты администратору или на любителя порцию фраг-  portsentry -udp (basic port-bound UDP mode)
ментированных пакетов.  portsentry -stcp (Stealth TCP scan detection)
 KILL_RUN_CMD_FIRST – установка значения в 0 запу-  portsentry -atcp (Advanced TCP stealth scan detection)
стит команду, перед тем как маршрут будет удален из  portsentry -sudp («Stealth» UDP scan detection)
таблицы; в 1 – после.  portsentry -audp (Advanced «Stealth» UDP scan detection)

46
безопасность
Для каждого протокола может запускаться только один После этого скомпилированная программа logtail
выбранный режим. В режиме basic открываются описан- вместе со вспомогательными файлами скопируется в
ные в файле portsentry.conf контролируемые порты и при каталоги, указанные в переменных INSTALLDIR_BIN,
попытке соединиться с ними происходит блокировка, при INSTALLDIR и INSTALLDIR_SH. По умолчанию это под-
этом PortSentry не реагирует на Stealth-сканирование. Ре- каталоги /usr/local/bin, /usr/local/etc и /usr/local/etc. Кро-
жим Stealth отличается от предыдущего тем, что не дер- ме основного скрипта logcheck.sh и программы logtail,
жит порты открытыми, и атакующий получает достовер- в комплекте идут несколько вспомогательных файлов.
ную информацию об используемых портах, а также выяв- Файл logcheck.hacking содержит ключевые слова (вро-
ляет практически все виды Stealth-сканирования. Режим де LOGIN root REFUSED или attackalert от Portcentry),
Advanced является самым быстрым и рекомендуется раз- появление которых в лог-файлах может свидетельство-
работчиками (во второй версии используется именно этот вать только об одном – компьютер атакован, т.е. если
режим совместно со Stealth). При этом контролируются такое слово будет обнаружено, то суперпользователь
все порты ниже значений ADVANCED_PORTS_TCP и получит сообщение, которое просто не сможет не при-
ADVANCED_EXCLUDE_UDP. влечь его внимания: «ACTIVE SYSTEM ATTACK». А
файл logcheck.violations содержит набор слов, свиде-
LogSentry тельствующих, как правило, о каком-либо негативном
В системных журналах имеется довольно ценная инфор- действии (например, failed, denied и даже su root). На-
мация, так как любое событие оставляет там свой след, пример, сравните следующие два сообщения:
но большинство системных администраторов заглядыва-
ют туда один-два раза в неделю, иногда даже вручную, Jun 4 09:00:32 grinder sendmail[5475]: VAA05473: ↵
to=crowland, ctladdr=root (0/0), delay=00:00:02, ↵
что, согласитесь, очень утомительно. Утилита Logsentry xdelay=00:00:01, mailer=local, stat=refused
(или logcheck) как раз и предназначена для автоматичес-
Jun 4 09:00:32 grinder rshd: ↵
кой проверки системных журналов на предмет наруше- refused connect from hacker@evil.com:1490
ний безопасности и других необычных действий, таким
образом немного облегчая труд. Берет свою родослов- Первая строка указывает на довольно обычную житей-
ную от скрипта frequentcheck.sh, входящего в состав скую ситуацию с sendmail, отдаленный компьютер отка-
firewall Gauntlet компании Trusted Information Systems Inc. зался от подключений, т.е. слово refused к нашему слу-
(http://www.tis.com). Сценарий logcheck запускается при по- чаю не имеет абсолютно никакого отношения. А вот в сле-
мощи демона cron, при этом программа при помощи ути- дующей некто с hacker@evil.com пробовал запускать rsh-
литы grep проверит системные журналы на предмет на- сеанс на компьютере, это как раз наш случай (rshd при-
личия определенных ключевых слов, и в случае наличия веден только для примера, использование его на компь-
их в файле сисадмин получит извещение по почте. Чтобы ютере, по-моему, плохая идея) и опять присутствует сло-
не проверять каждый раз все файлы полностью, для за- во refused. Для того чтобы события, подобные первому,
поминания последней прочитанной в журнале позиции не отвлекали в файл logcheck.violations.ignore, добавля-
Logcheck использует программу, называемую logtail, ко- ем строку, наличие которой заставит logsentry проигно-
торая запоминает ее и использует эту позицию на после- рировать событие. В нашем случае это будет:
дующем шаге, чтобы обработать новую порцию инфор-
мации. При этом в каталоге с лог-файлами появятся еще mailer=local, stat=refused
несколько файлов хххххх.offset, где хххххх – название лог-
файла; если удалить его, утилита начнет проверять лог- Но с занесением данных в этот файл надо быть ос-
файл опять сначала. Также утилита контролирует номер торожным, чтобы не пропустить важное. По умолчанию
inode и размер лог-файла; при уменьшении размера или в нем содержится только одна строка stat=Deferred, по-
изменении номера inode счетчик сбрасывается и файл зволяющая игнорировать сообщения grep. Чтобы иметь
проверяется сначала. Поэтому можно не беспокоиться при возможность искать некоторые слова и не сообщать об
удалении лог-файлов (точнее, переносе на резервный но- их наличии, предназначен файл logcheck.ignore. Поис-
ситель), когда они разрастутся. Инсталляция программы ки по ключевым словам в файлах logcheck.hacking и
очень проста, распаковываем архив. logcheck.violations, чтобы гарантировать, что ничего не
пропущено, нечувствительны к регистру. А в файлах
# tar xfzv logsentry-1.1.1.tar.gz logcheck.violations.ignore и logcheck.ig-nore, наоборот, чув-
ствительны к регистру, чтобы гарантировать 100% попа-
И заходим в каталог (да, название немножко измени- дание и не пропустить что-нибудь интересное. Все *.ignore-
лось). файлы требуют точного текста.
Теперь необходимо сделать так, чтобы все сообщения
# cd logcheck-1.1.1 системы записывались в один файл /var/log/messages. Для
этого открываем в любимом редакторе /etc/syslog.conf.
И теперь вводим команду mаке с указанием использу- Он имеет приблизительно такую структуру: в левой час-
емой операционной системы, например для Linux. ти через точку с запятой перечисляются системные со-
бытия, а в правой – файл или устройство (что для Unix
# make linux одно и то же), в которое сообщение, соответствующее

№7(8), июль 2003 47


безопасность
данному событию, будет выводиться. Т.е. необходимо ному языку системы. Естественно, после того как пере-
просто собрать все записи, которых нет в левой части, менная LANG будет равняться KOI8-R, все сообщения
соответствующей /var/log/messages со всех таких событий- будут выводиться на русском языке (и запись в лог-фай-
ных частей и дописать их (это в самом простом случае, лы также), дополнительно в последнее время обостри-
либо почитайте man syslog.conf). Например, в RedHat 9 у лась ситуация с продвижением единой кодировки
меня такая строка: Unicode, т.е. в RedHat 8.0 и 9 LANG=«ru_RU.UTF-8».
Logcenry в этом случае ничегошеньки (или почти) не най-
*.info;mail.none;authpriv.none;cron.none;uucp,news.crit ↵ дет. И все потому, что все шаблоны записаны на анг-
/var/log/messages
лийском. Поэтому лучше всего использовать Pan-
После этого на всякий случай устанавливаем новые European version, т.е. когда сообщения выводятся на ан-
права доступа к файлу /var/log/messages: глийском (в AltLinux сейчас примерно так все и работа-
ет). Для этого в файле /etc/sysconfig/i18n меняем соот-
# chown root.wheel /var/log/messages ветствующие строки на:
# chmod 600 /var/log/messages

Аналогично устанавливаем права для logcheck.sh и logtail: LANG="en_US"


SYSFONT="Cyr_a8x16"
SYSFONTACM="koi2alt"
# chown root.wheel /usr/local/etc/logcheck.sh
# chmod 600 /usr/local/etc/logcheck.sh
# chown root.wheel /usr/local/bin/logtail Остальные можно оставить как есть. После этого про-
# chmod 700 /usr/local/bin/logtail блем уже быть не должно.

После всего загляните в скрипт logcheck.sh и измени- HostSentry


те значения переменных SYSADMIN (пользователя, кото- И последняя, самая молодая, утилита HostSentry. Пред-
рому будет высылаться e-mail), а также MAIL и LOGTAIL в ставляет собой инструмент обнаружения вторжения, ос-
соответствии с вашей системой (в последнем случае до- нованный на технологии Login Anomaly Detection (LAD),
статочно закомментировать одни и раскомментировать который определяет подозрительные действия при входе
другие строки). в систему и позволяет быстро выявлять скомпрометиро-
Для начала, чтобы убедиться, что все работает нор- ванные пользовательские аккаунты и необычное поведе-
мально, запускаем скрипт logcheck.sh вручную, причем ние. HostSentry включает динамическую базу данных и
желательно несколько раз, чтобы удостовериться в том, фактически изучает поведение входа в систему пользо-
что вы не получаете одни и те же сообщения. Если это вателя. Это поведение используется модульными сигна-
так, то что-то не в порядке с logtail, попробуйте запустить турами, чтобы обнаружить необычные действия. Прошу
ее вручную и посмотрите наличие файлa *.offset. Пробле- обратить внимание на словосочетание «при входе в сис-
мы здесь могут быть две: или программа запукается не тему», если компьютер уже скомпрометирован, и взлом-
от имени root, или придется перекомпилировать. щик уже имеет легальный вход в систему, здесь уже по-
И теперь, когда все в порядке, заносим в файл /etc/crontab мочь будет трудно, а вот когда делаются первые шаги,
приблизительно такие строки (для каждой системы свои), применение HostSentry будет как раз к месту. При этом
при этом демон cron должен быть, естественно, запущен. необходимо помнить, что обнаружив ее, злоумышленник
также может подменить утилиту.
00 * * * * root /bin/sh /usr/local/etc/logcheck.sh При этом HostSentry определяет:
 необычные действия при входе в систему;
И теперь каждый час запускается logcheck.sh, кото-  подозрительные домены, с которых осуществляется вход;
рая запускает в свою очередь logtail:  подозрительные каталоги пользователей;
 logtail анализирует log-файлы с последней запомнен-  обнаруживает вмешательство в файлы истории ко-
ной позиции; манд и входа в систему;
 logcheck при помощи grep проверяет оставшийся текст  неизвестные входы в систему;
на наличие сообщений о возможной атаке;  имеет расширяемые модули сигнатур.
 при помощи grep проверяются все возможные нега-
тивные сообщения; Когда HostSentry находит проблему, то она регистри-
 на следующем шаге отбираются из них те, которые рует событие, в дальнейшем дополнительно планируется
нужно проигнорировать (logcheck.violations.ignore); обеспечить следующее: автоматически отключать учет-
 все сообщения, которые нужно проигнорировать, за- ную запись и выгонять уже зарегистрированного пользо-
носятся в logcheck.ignore; вателя-нарушителя, блокировать IP-адрес компьютера на-
 после всего этого сисадмин получает e-mail с остав- рушителя или удалять маршрут из маршрутной таблицы,
шимися сообщениями. но пока это все в проекте.
Программа полностью написана на объектно-ориенти-
Еще одна проблема может возникнуть с использова- рованном интерпретируемом языке Python, в большинстве
нием утилиты logsentry. Связана она с локализацией. современных дистрибутивов он уже имеется, если же нет,
Дело в том, что в большинстве дистрибутивов local ус- то первоначально необходимо его установить, взяв с до-
танавливается автоматически по используемому основ- машней страницы http://www.python.org. После этого ус-

48
безопасность
тановка HostSentry проблем вызвать не должна, просто После первого запуска образуются две базы данных:
распаковываем архив, заходим в образовавшийся ката- hostsentry.db, содержащая записи обо всех пользовате-
лог и вводим make install, после чего все необходимые лях, которые регистрировались с тех пор, пока HostSentry
файлы будут просто перенесены в каталог /usr/local/ был в действии, и hostsentry.tty.db об используемых (ак-
abacus/hostsentry (на него указывает переменная тивных) терминалах. В пользовательской базе данных
INSTALLDIR в Makefile). хранятся объекты входа в систему пользователя, которые
В файле hostsentry.conf устанавливаются пути к мо- сформированы со следующей схемой:
дулям, используемым утилитой, базам данных, необхо-  username – имя входящего в систему пользователя;
димым для сбора информации, переменная WTMP_FILE  recordCreated – дата начала записи в Unix-формате;
должна указывать на wtmp-файл (для Linux обычно /var/  firstLogin – первый вход в систему для этого пользова-
log/wtmp) и некоторым другим файлам, о них ниже. Един- теля;
ственная переменная, на которую можно обратить вни-  trackLogins – список входов в систему этого пользова-
мание поначалу (остальные можно не трогать, а оста- теля (будет постоянно расти);
вить как есть, хотя базы данных я бы переместил в ката-  validLoginDays – дни, когда данному пользователю раз-
лог /var, где и положено им быть) – это WTMP_FORMAT, в решено регистрироваться в системе;
которой устанавливается формат сохранения информа-  validLoginHours – часы, когда пользователю разреше-
ции о логинах. Вся проблема здесь в том, что учет пара- но регистрироваться;
метров входа в систему (Name, TTY, Time, Host) в различ-  adminDisabled – флаг, указывающий на то, что данная
ных реализациях Unix ведется по-разному, например, имя запись была отключена администратором;
хоста в BSD урезается до 16-32 байт, в RFC 1034 имя ог-  securityDisabled – флаг, указывающий на то, что дан-
раничено 256 символами, а в переменной MAXDNAME ный пользователь был лишен возможности регистри-
(arpa/nameser.h) имя узла ограничено 1024 символами. роваться модулем программы;
Это приводит к тому, что если нападавшим использовано  totalLogins – общее количество регистраций для дан-
длинное имя, то оно наверняка урежется (подробности в ного пользователя;
README.wtmp). Так вот в WTMP_FORMAT и устанавли-  version – версия схемы базы данных.
вается формат, чтобы обеспечить запись необходимых
данных применительно к используемой системе (в про- База данных терминалов помогает HostSentry поддер-
стейшем случае необходимо будет раскомментировать со- жать список активных подключений и позволяет програм-
ответствующую строчку, в будущем планируется макси- ме знать, когда пользователь регистрировался. Посколь-
мально автоматизировать процесс). ку эти данные не используются между включениями, она
В файле hostsentry.modules описывается, какие моду- обнуляется каждый раз при перезапуске HostSentry. При
ли должны выполняться при регистрации пользователя в этом отслеживаются следующие элементы:
системе и при logout. В большинстве случаев можно ос-  tty – TTY, с которого зарегистрировался пользователь;
тавить как есть. При необходимости сменить очередность  username – имя пользователя;
выполнения модулей, их нужно просто переместить вверх/  loginStamp – уникальный timestamp для login;
вниз. В файл hostsentry.ignore заносятся пользователи,  version – версия схемы базы данных.
которых не нужно отслеживать при помощи HostSentry,
это может быть полезно, например, для пользователей В loginStamp заносится информация, необходимая для
типа «ftp», который обнаруживается в wtmp и вызывает обработки компонентами системы и формируется следу-
большое количество ложных тревог из-за анонимного до- ющим образом:
ступа (при этом все равно в базу данных пользователь
будет включен). Для этого нужно просто разместить ис- loginIP@loginHostname@loginTTY@loginTime@logoutTime
ключаемых пользователей по одному в строке (и надо заг-
лядывать в него периодически, чтобы там не оказался Где:
root). Файл hostsentry.action описывает действия, которые  LoginIP – IP-адрес пользователя при регистрации;
должна предпринимать утилита, пока она только регист-  LoginHostname – имя хоста (полностью уточненное при
рирует залогинившихся пользователей. Теперь можно и помощи DNS);
запускать (для автоматического старта вместе с систе-  LoginTTY – TTY пользователя;
мой нужно включить эту строку в файл rc.local).  LoginTime – время входа в систему в Unix-формате;
 LogoutTime – время выхода из системы в Unix-формате.
# python hostsentry.py
Если попробовать теперь зарегистрироваться, то до-
При этом в файле /var/log/messages должны появить- полнительно появится сообщение, в котором указывает-
ся такие строки. ся кто, когда, откуда и какие модули были выполнены.

Jun 8 18:26:42 grinder hostSentry[23306]: adminalert: ↵ Jun 8 18:30:19 grinder -- sergej[1639]: ↵


HostSentry version 0.02 is initializing. LOGIN ON tty1 BY sergej
Jun 8 18:26:42 grinder hostSentry[23306]: adminalert: ↵ Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: ↵
Send bug reports to <crowland@psionic.com> LOGIN User: sergej TTY: tty1 Host:
Jun 8 18:26:43 grinder hostSentry[23460]: adminalert: ↵ Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: ↵
HostSentry is active and monitoring logins. First time login for user: sergej

№7(8), июль 2003 49


безопасность
Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: ↵  moduleFirstLogin – единственная цель этого модуля –
Action being taken for user: sergej
Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: ↵ предупреждение администратора, когда пользователь
Module requesting action is: moduleFirstLogin входит в систему первый раз после запуска HostSentry,
Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: ↵
Action complete for module: moduleFirstLogin т.е. когда пользователь ввел пароль и получил Unix
Jun 8 18:30:21 grinder hostSentry[23460]: securityalert: ↵ shell. Может, это и есть наш Вася Пупкин, а может и
Foreign domain login detected for user: sergej from:
Jun 8 18:30:21 grinder hostSentry[23460]: securityalert: ↵ нет; во всяком случае, администратору будет интерес-
Action being taken for user: sergej но узнать, зачем бухгалтеру интерактивная оболочка;

Jun 8 18:30:21 grinder hostSentry[23460]: securityalert:
Module requesting action is: moduleForeignDomain  moduleForeignDomain – очень часто нападающие, ском-
Jun 8 18:30:21 grinder hostSentry[23460]: securityalert: ↵ прометировавшие какую-то учетную запись, входят в
Action complete for module: moduleForeignDomain
систему с домена, которому, в общем-то, нечего делать
При этом сообщение securityalert не пройдет еще и мимо на вашем компьютере. Если такой домен не перечис-
Logcentry. Теперь требуется некоторое время, чтобы детек- лен в файле moduleForeignDomain.allow, то он причис-
тор аномалий изучил то, как пользователи обычно действу- ляется к подозрительным, и администратор получает
ют при входе в систему, постепенно количество сообщений предупреждение. Примечание: из-за ограничений в не-
будет уменьшаться, но зато когда бухгалтер Вася Пупкин, которых системах, связанных с максимально хранимым
работавший обычно из соседнего офиса, и не знающий во- именем хоста, о чем говорилось выше, данный модуль
обще, что такое Unix, попытается вдруг зарегистрироваться может давать противоречивые результаты, в этом слу-
из Китая, то администратор будет предупрежден. чае, скорее всего, придется данный модуль отключить,
Список модулей, применяемых в HostSentry: для информации загляните в файл utmp.h заголовка
 moduleOddDirnames – скорее, вспомогательный мо- ядра (в RedHat максимальное число – 256, что являет-
дуль, проверяет домашний каталог пользователя. ся вполне достаточным);
Обычно хакеры пытаются скрыть свое пребывание в  moduleHistoryTruncated – модуль при регистрации про-
системе и каталоги называют «.. » , «...». Вот это и веряет файл историй используемого командного ин-
пытается выяснить данный модуль; терпретатора, прописанного в /etc/passwd (поддержа-
 moduleRhostCheck – этот модуль проверяет пользова- ны bash, csh и tcsh). Тревожный сигнал выдается, если
тельский .rhosts-файл при выходе из системы, и если файл не существует или нулевого размера, или это
в нем содержатся постановочные знаки (“+”), это бу- символическая ссылка на /dev/null;
дет зарегистрировано, и администратору можно будет  moduleLoginLogout – просто регистрирует, когда
заняться исследованием (использование r-сервисов – пользователь входит и выходит из системы.
плохая идея);
 moduleMultipleLogins – все просто, если пользователь Вот такой вот набор TriSentry. Ничего сверхъестествен-
несколько раз одновременно зарегистрировался на ного, но все работает отменно, автоматизирует процесс
компьютере, то он (компьютер) уже, скорее, взломан администрирования системы и позволяет предупредить
и администратора об этом предупредят; сисадмина о начале неприятностей.

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

Python глазами DBA

ОЛЕГ ПОПОВ

Почему, собственно, Python  Огромное количество библиотек:


Администраторы БД очень часто нуждаются в инструмен- XML-парсеры;
тах для автоматизации разной рутинной работы, напри- GUI (Win32, GTK/GNOME, KDE/QT, TK, FOX,
мер: загрузка, преобразования данных в разного рода WXWindows);
форматы или сбор и анализ различной статистики. Для Сетевые протоколы;
меня в свое время такой палочкой-выручалочкой стал Perl. Разработка веб-приложений.
Через некоторое время я набрел на Python. Что я могу  Переносимость кода между различными платфор-
сказать после года знакомства: практичный и полезный мами.
инструмент.  Мощные интерфейсы к конкретным ОС (особенно
Достоинства языка Python: к Linux/Unix и win32).
 Многоплатформенность и масштабируемость: работа-  Поддержка разных стилей программирования:
ет на большинстве известных программно-аппаратных процедурного, объектного, функционального.
платформ от PDA до CRAY и IBM 390.  Встроенная поддержка Unicode и множества
 Гармоничная архитектура языка: национальных кодировок (включая 5 русских).
 Простой и удобный для понимания логики программ  Возможность писать самодокументированные
синтаксис. программы и автоматическая генерация докумен-
 Встроенные структуры данных: списки, кортежи, тации на модули. ОЛЕГ ПОПОВ
словари.

52
программирование
С чем в действительности сталкивается программист SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME,SUM(BLOCKS)SIZE_BLOCKS,
при использовании Python – это простой и ясный синтак- COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTS
GROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME
сис. Я ловлю себя часто на мысли, что просмотр чужого """)
кода зачастую не требует значительного напряжения. И except cx_Oracle.DatabaseError,info:
print "SQL Error:",info
здесь помогает то, что отступы являются частью синтак-
сиса и определяют вложенность операторов.
Библиотеки зачастую имеют очень лаконичную доку- Печатаем результат на stdout. Замечу здесь, что
ментацию, но этого достаточно, так как API очень выра- my_cursor.description возвращает описание столбцов зап-
зительны и внятны. роса в виде списка кортежей. Для каждого столбца воз-
Сам процесс кодирования и тестирования достаточно вращаются следующие данные: (name, type_code,
комфортен. Здесь помогает качественная диагностика display_size, internal_size, precision, scale, null_ok).
ошибок. Оттестированные модули очень легко расширять Далее следует форматированный вывод на stdout (по-
и складывать из них приложения. чти как printf в языке C).
Для работы с RDBMS Oracle существует несколько print
различных модулей для Python, использующих разные print 'Database:',my_connection.tnsentry
print
механизмы: print "Used space by owner, object type, tablespace "
 ODBC (Win32, Linux) print "-------------------------------------------------"
 DCOM (Win32) title_mask=('%-16s','%-16s','%-16s','%-8s','%-8s')
i=0
 PERL_DBI (Win32, Linux, Solaris, HP-UX, AIX) for column_description in my_cursor.description:
 NATIVE API (Win32, Linux, Solaris, HP-UX, AIX) print title_mask[i]%column_description[0],
i=1+i
print ''
print "-------------------------------------------------"
Более подробную информацию вы можете найти на row_mask='%-16s %-16s %-16s %8.0f %8.0f '
www.python.org. for recordset in my_cursor.fetchall():
print row_mask%recordset

Выполняем простой запрос В результате мы увидим что-то вроде:


Я предпочитаю использовать модуль cx_Oracle, который
был проверен мною в ОС NT и Linux (автор Anthony Database: testdb
Used space by owner, object type, tablespace
Tuininga утверждает, что он работает в Solaris и, похоже, -------------------------------------------------------------
на всех Unix-подобных ОС должен также работать). В ос- OWNER SEGMENT_TYPE TABLESPACE_NAME SIZE_BLOCKS SIZE_EXTENTS
-------------------------------------------------------------
новном этот модуль следует спецификации Python ADU2 INDEX USERS 784 25
Database API 2.0 и поддерживает работу с RDBMS Oracle ADU2 TABLE USERS 512 24
ADUGKS INDEX DEVELOP_DATA 984 123
версий 8.1-9.xx. ADUGKS TABLE DEVELOP_DATA 664 83
Для быстрого погружения в предмет я приведу фраг- ADUGPA INDEX USERS 784 25
ADUGPA TABLE USERS 496 23
менты кода, демонстрирующего основные приемы исполь- AGNKS_SG INDEX USERS 352 22
зования модуля. AGNKS_SG TABLE USERS 240 15
ATU INDEX USERS 3968 244
ATU TABLE DEVELOP_DATA 8 1
try: ATU TABLE USERS 2688 160
import cx_Oracle ATU1 INDEX DEVELOP_DATA 1600 200
except ImportError,info: ATU1 INDEX USERS 608 38
print "Import Error:",info ATU1 TABLE DEVELOP_DATA 1032 129
sys.exit() ATU1 TABLE USERS 544 34
if cx_Oracle.version<'3.0': BUX INDEX DEVELOP_DATA 64 8
print "Very old version of cx_Oracle :",cx_Oracle.version BUX TABLE DEVELOP_DATA 1736 217
sys.exit() DISP INDEX USERS 400 25
DISP TABLE USERS 528 33
EPE INDEX USERS 80 5
EPE TABLE USERS 48 3
В этом фрагменте демонстрируется безопасная заг- EXZ INDEX USERS 1088 61
рузка модуля cx_Oracle и проверка версии. (Надеюсь, эле- EXZ TABLE DEVELOP_DATA 8 1
EXZ TABLE USERS 832 41
гантность синтаксиса все-таки заметили).
Далее создадим экземпляр класса connect – именно
этот объект и обеспечивает взаимодействие с сервером Запросы с параметрами
Oracle. Согласно спецификации Python Database API 2.0 для вы-
полнения запросов с параметрами каждый модуль дол-
try: жен реализовывать переменную paramstyle, которая оп-
my_connection=cx_Oracle.connect('system/manager@test_db')
except cx_Oracle.DatabaseError,info: ределяет, каким образом будут передаваться параметры
print "Logon Error:",info запросов. Текущая версия cx_Oracle(3.0) поддерживает
exit(0)
режим 'named', то есть в модуле установлена переменная
cx_Oracle.paramstyle='named' и можно создавать конструк-
Теперь создаем курсор и выполняем запрос: ции в запросах в виде:

my_cursor=my_connection.cursor()
try: select * from all_users where USERNAME LIKE :S
my_cursor.execute("""

№7(8), июль 2003 53


программирование
При этом связывание параметров запроса со значе- except cx_Oracle.DatabaseError,info:
ниями можно выполнить двумя способами. print "SQL Error:",info
Именованый параметeр метода exec: exit(0)
Очевидно, что теперь var содержит текущее время
cursor2.execute("select * from all_users where ↵ сервера. Доступ к значениям переменной выполняется с
USERNAME LIKE :S ",S='S%')
помощью метода var.getvalue():
Словарь {':переменная':значение,...}:
CDATE=var.getvalue()
print 'Date: %02u/%02u/
cursor2.execute("select * from all_users where ↵ %4u'%(CDATE.day,CDATE.month,CDATE.year)
USERNAME LIKE :S ",{':S':'S%'}) print 'Time:
%02u:%02u:%02u'%(CDATE.hour,CDATE.minute,CDATE.second)

Анонимные блоки PL/SQL Этот пример демонстрирует также и форматирование


В некоторых случаях очень удобно использовать нестан- даты и времени для экземпляра var. В результате напеча-
дартные средства сервера: для Oracle таким нестандарт- тается нечто вроде:
ным, но очень удобным механизмом является возможность
исполнения анонимных блоков PL/SQL. Модуль сx_Oracle Date: 12/05/2003
Time: 16:42:54
реализует этот механизм, который, естественно, не опи-
сан в спецификации Python Database API 2.0. В связи с тем, что работа с типами времени и даты внут-
Чтобы связать переменные блока PL/SQL c перемен- ри сервера Oracle реализована особенным образом (неза-
ными языка Python, в модуле сx_Oracle реализован класс висимо от ОС), модуль сx_Oracle реализует следующие
var. Экземпляр можно создать следующим образом: функции для для преобразования значений дат и времени:

var=my_cursor.var(cx_Oracle.DATETIME) Date( year, month, day)


DateFromTicks( ticks)
Time( hour, minute, second)
Конструктор my_cursor.var(...) в качестве параметра TimeFromTicks( ticks)
Timestamp( year, month, day, hour, minute, second)
требует указать тип создаваемой переменной. Варианты: TimestampFromTicks( ticks)
var=my_cursor.var(cx_Oracle.DATETIME)
var.setvalue(0,cx_Oracle.Date( 2002, 02,12))
BINARY CDATE=var.getvalue()
DATETIME print'Date:%02u/%02u/%4u'%(CDATE.day,CDATE.month,CDATE.year)
FIXEDCHAR print'Time:%02u:%02u:%02u'%(CDATE.hour,CDATE.minute,CDATE.second)
LONGBINARY
LONGSTRING
NUMBER Результат будет следующий:
ROWID
STRING Date: 12/02/2002
Time: 00:00:00
var=my_cursor.var(cx_Oracle.DATETIME)
try:
my_cursor.execute("""begin Ссылки:
SELECT SYSDATE INTO :p_Value from dual;
end;""",p_Value = var) http://computronix.com/utilities.shtml
http://www.python.org/topics/database/DatabaseAPI-2.0.html

54
программирование
Листинг 1 Листинг 2
Выполняем простой запрос Запрос с параметрами
"" ""
cx_Oracle demo cx_Oracle demo
simple query query with parameters
""" """
__AUTHOR__='POPOV O.' __AUTHOR__='POPOV O.'
__COPYRIGHT__='POPOV O. 2002 Samara, Russia' __COPYRIGHT__='POPOV O. 2002 Samara, Russia'
from sys import exit from sys import exit
try: try:
import cx_Oracle import cx_Oracle
except ImportError,info: except ImportError,info:
print "Import Error:",info print "Import Error:",info
sys.exit() sys.exit()

if cx_Oracle.version<'3.0': if cx_Oracle.version<'3.0':
print "Very old version of cx_Oracle :",cx_Oracle.version print "Very old version of cx_Oracle :",cx_Oracle.version
sys.exit() sys.exit()
try: try:
my_connection=cx_Oracle.connect('system/gasdba@sqlmt') my_connection=cx_Oracle.connect('system/manager@test_db')
except cx_Oracle.DatabaseError,info: except cx_Oracle.DatabaseError,info:
print "Logon Error:",info print "Logon Error:",info
exit(0) exit(0)

my_cursor=my_connection.cursor() my_cursor=my_connection.cursor()
try: try:
my_cursor.execute(""" my_cursor.execute("""
SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME, ↵ SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME, ↵
SUM(BLOCKS)SIZE_BLOCKS, SUM(BLOCKS)SIZE_BLOCKS,
COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTS COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTS
GROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME WHERE OWNER LIKE :S
""") GROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME
except cx_Oracle.DatabaseError,info: """,S='SYS%')
print "SQL Error:",info except cx_Oracle.DatabaseError,info:
exit(0) print "SQL Error:",info
exit(0)
print
print 'Database:',my_connection.tnsentry print
print print 'Database:',my_connection.tnsentry
print "Used space by owner, object type, tablespace " print
print "--------------------------------------------------" print "Used space by owner, object type, tablespace "
title_mask=('%-16s','%-16s','%-16s','%-8s','%-8s') print "---------------------------------------------------"
i=0 title_mask=('%-16s','%-16s','%-16s','%-8s','%-8s')
for column_description in my_cursor.description: i=0
print title_mask[i]%column_description[0], for column_description in my_cursor.description:
i=1+i print title_mask[i]%column_description[0],
print '' i=1+i
print "--------------------------------------------------" print ''
row_mask='%-16s %-16s %-16s %8.0f %8.0f ' print "----------------------------------------------------"
for recordset in my_cursor.fetchall(): row_mask='%-16s %-16s %-16s %8.0f %8.0f '
print row_mask%recordset for recordset in my_cursor.fetchall():
for column_description in my_cursor.description: print row_mask%recordset
print column_description

№7(8), июль 2003 55


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

JAVA: РАБОТА С ФАЙЛАМИ

ДАНИИЛ АЛИЕВСКИЙ

56
программирование
Средства для работы с файлами – одно из немногих слабых Обратите внимание: если файл удалось открыть (конст-
мест системы библиотек языка Java. Файловые библиотеки руктор FileInputStream успешно сработал), то мы закрываем
появились в самых первых версиях Java и были ориентиро- файл в любом случае, даже если процесс чтения оборвался
ваны на операционные системы того времени, главным об- из-за исключения. Однако исключения в процессе закрытия
разом на Unix. С тех пор операционные системы ушли дале- файла мы игнорируем. Действительно, если предыдущее
ко вперед, а области применения Java чрезвычайно расши- чтение произошло безошибочно, т.е. мы успешно прочита-
рились. Например, для текстовых файлов стали популярны ли весь файл, то на невозможность закрыть файл можно не
форматы Unicode (16-битовые, UTF-8). Файловая иерархия обращать внимания (тем более, что ошибка на этом этапе
в мире Windows резко усложнилась – появились такие поня- чрезвычайно маловероятна). Если же исключение произош-
тия, как «Desktop», «My Computer», «My Documents». По со- ло в процессе чтения, то, очевидно, оно представляет боль-
ображениям совместимости фирма Sun была вынуждена ший интерес, чем ошибка при попытке закрыть файл. Зна-
сохранять старые классы и интерфейсы, дополняя их новы- чит, «наружу» следует выдать именно исключение, связан-
ми. Получилась довольно запутанная система. В итоге пра- ное с чтением. Если бы мы не проигнорировали исключения
вильная организация работы с файлами в современной Java- при закрытии файла, то мы, в соответствии с известным
программе может оказаться достаточно непростой задачей. неудобным свойством Java, рисковали бы «потерять» ис-
В этой статье мы попытаемся рассмотреть наиболее ключение при чтении файла в методе f.read().
типичные задачи, возникающие при работе с файлами, и Обращение к методу length() во втором варианте фун-
предложить по возможности правильные способы их ре- кции loadFileAsBytes достаточно «безопасно». Этот ме-
шения. Все приведенные решения являются фрагмента- тод не порождает исключений, а при отсутствии файла
ми готовых отлаженных библиотек. или других возможных проблемах просто возвращает 0,
что в данном контексте не приведет ни к чему плохому.
Чтение и запись бинарного файла Запись файла:
Самая простая задача – прочитать некоторый файл в виде
массива байт, и наоборот, записать массив байт обратно public static void saveFileFromBytes(
String fileName, byte[] buf)
в файл. throws IOException
Это одна из немногих задач, решаемых стандартными {
saveFileFromBytes(new File(fileName),buf);
библиотеками вполне очевидным способом. Основную труд- }
ность здесь представляет корректная обработка исключе-
public static void saveFileFromBytes(
ний. К сожалению, в большинстве учебников по Java пред- File file, byte[] buf)
лагаются не вполне корректные решения, чреватые в слу- throws IOException
{
чае ошибки «утечкой» ресурсов системы (файл остается saveFileFromBytes(file,buf,0,buf.length);
незакрытым) или потерей информации об исключении. }
Вот пример возможного решения. public static void saveFileFromBytes(
Чтение файла: File file, byte[] buf, int off, int len)
throws IOException
{
public static byte[] loadFileAsBytes( FileOutputStream f= new FileOutputStream(file);
String fileName) throws IOException try {
{ f.write(buf,off,len);
return loadFileAsBytes(new File(fileName)); } catch (IOException e) {
} try {f.close();} catch (Exception e1) {};
return;
public static byte[] loadFileAsBytes( }
File file) throws IOException f.close();
{ }
byte[] result= new byte[(int)file.length()];
loadFileAsBytes(file,result);
return result; Используется вариант FileOutputStream байтового по-
} тока OutputStream.
public static void loadFileAsBytes(File file, Здесь обработка исключений несколько сложнее, чем в
byte[] buf) throws IOException случае чтения. Дело в том, что операционная система или
{
loadFileAsBytes(file,buf,0,buf.length); реализация FileOutputStream для конкретной платформы
} могут кэшировать операции с диском. Например, данные,
public static void loadFileAsBytes( посылаемые в файл методом f.write(), могут на самом деле
File file, byte[] buf, int off, int len) накапливаться в некотором буфере, и только при закрытии
throws IOException
{ файла действительно записываться на диск. Это означает,
FileInputStream f= new FileInputStream(file); что потенциальные ошибки на этапе закрытия файла столь
try {
f.read(buf,off,len); же важны, что и ошибки в процессе работы метода f.write().
} finally { Игнорировать их, как мы делали в случае чтения, нельзя.
try {f.close();} catch (Exception e) {};
} Приведенное выше решение игнорирует ошибки на эта-
} пе закрытия файла только в том случае, если какие-то ошиб-
ки уже имели место при записи методом f.write() – после-
Используется вариант FileInputStream байтового пото- дние в любом случае окажутся не менее информативными.
ка InputStream. Если же метод f.write() отработал безошибочно, то закрытие

№7(8), июль 2003 57


программирование
файла выполняется вне каких-либо блоков try/catch, возмож- Секрет здесь заключается в организации современных
ные исключения на этом этапе будут переданы наружу. операционных систем, таких как Windows NT/2000/XP. Если
сразу после создания файла «проинформировать» опе-
Копирование файла рационную систему о желаемой итоговой длине файла
Как скопировать файл в новый файл с другим именем? Ко- вызовом setLength(), то она сможет более эффективно вы-
нечно, если файл небольшой, его можно скопировать впол- делить место на диске под этот файл, сведя к минимуму
не тривиальным методом: вначале прочитать в массив байт, возможную фрагментацию диска. Если же наращивать
а затем записать под другим именем с помощью методов файл постепенно, как получилось бы при отсутствии вы-
из предыдущего раздела. Но для многомегабайтных или зова setLength(), то операционная система будет резер-
гигабайтных файлов такой подход непригоден. вировать под файл достаточно случайные свободные
Очевидный путь решения задачи – последовательно фрагменты дискового пространства. Возможно, первого
читать файл небольшими блоками и записывать их в дру- выделенного свободного фрагмента не хватит для запи-
гой файл. си всего файла, и операционной системе придется выде-
Вот предлагаемый текст решения: лять дополнительные фрагменты – файл окажется фраг-
ментированным.
public static void copyFile( Другой плюс вызова setLength(): уже в самом начале
String source, String target)
throws IOException копирования операционная система сможет сообщить об
{ ошибке, если окажется, что места на дисковом носителе
copyFile(new File(source),new File(target));
} недостаточно для размещения полного файла.
С другой стороны, вызов setLength() приводит к тому, что
public static void copyFile(
File source, File target) в случае каких-либо ошибок результирующий файл полу-
throws IOException чится либо полной (правильной) длины, но с неверным со-
{
RandomAccessFile input= держимым, либо длины 0. Как правило, в таком поведении
new RandomAccessFile(source,"r"); нет ничего страшного – ошибки при копировании файлов
RandomAccessFile output=
new RandomAccessFile(target,"rw"); вообще редкость. Тем не менее это следует иметь в виду.
try { (Вообще говоря, исходя из тех же самых соображений,
byte[] buf = new byte[65536];
long len= input.length(); можно было бы добавить вызов setLength() в процедуру
output.setLength(len); записи бинарного файла, приведенную в первом разделе.
int bytesRead;
while ((bytesRead= Но во-первых, та процедура все-таки рассчитана на неболь-
input.read(buf,0,buf.length))>0) шие файлы, для которых фрагментация диска не столь
output.write(buf,0,bytesRead);
} catch (IOException e) { существенна. Во-вторых, в той процедуре мы имеем дело
try {input.close();} catch (Exception e1) {}; с единственным вызовом метода write. Вероятнее всего,
try {output.close();} catch (Exception e1) {};
return; операционная система и так сумеет принять правильное
} решение о размещении сохраняемого блока на диске.)
try {input.close();} catch (Exception e) {};
output.close(); Приведенную функцию копирования файла можно оче-
} видным образом усовершенствовать – добавить стира-
ние результирующего файла, если при копировании были
Логика обработки исключений здесь подобна логике, исключения.
предложенной в предыдущем разделе. Ошибки на этапе
чтения или записи (методы read()/write()) считаются при- Чтение и запись
оритетными – при появлении таких ошибок дальнейшие текстового файла: кодировки
исключения при закрытии файла игнорируются. В случае Работа с текстовыми файлами в Java далеко не так триви-
нормального выполнения всех методов read()/write() ошиб- альна, как с бинарными. Внутри Java текстовые данные все-
ки при закрытии исходного файла также игнорируются гда хранятся в кодировке Unicode – 16 бит на каждый сим-
(ведь он уже успешно прочитан), а ошибки при закрытии вол. Но на диске текстовые файлы могут храниться в самых
выходного файла передаются наружу (пока файл не зак- разных кодировках. Для преобразования кодировок файлов
рыт, нельзя быть уверенными, что он действительно по- в Unicode и обратно нужны специальные классы-преобра-
явится на диске именно в таком виде – из-за возможного зователи: InputStreamReader и OutputStreamWriter.
кэширования операций записи на диск). Кодировка (encoding) – это способ описания (кодирова-
Неочевидным в данном решении является исполь- ния) всех возможных символов цепочками битов. «Ранние»
зование класса RandomAccessFile вместо традицион- кодировки, разработанные еще до появления Unicode, были
ных FileInputStream и FileOutputStream. На самом деле рассчитаны на 8- или даже 7-битовое представление сим-
RandomAccessFile здесь использован ради возможнос- вола: с их помощью можно записать текст, содержащий
ти вызвать метод output.setLength(), отсутствующий в максимум 256 (или соответственно 128) различных симво-
классе FileOutputStream. лов алфавита. Современные кодировки, такие как UTF-8
Зачем нужен вызов метода output.setLength()? Каза- или UTF-16, резервируют более 8 бит на 1 символ и позво-
лось бы, это совершенно излишняя операция – ведь в ляют представить текст, содержащий любые из 65536 стан-
итоге скопированный файл все равно будет иметь пра- дартных символов Unicode, в том числе иероглифы и все-
вильный размер. возможные специальные знаки.

58
программирование
Каждая кодировка в Java идентифицируется своим ле, в общем случае невозможно определить, не прочитав
именем. Стандартные библиотеки Java гарантированно файл, за исключением некоторых простых кодировок.
«понимают» кодировки со следующими именами: Наиболее естественно использовать для чтения тек-
 «ASCII» – 7-битовая кодировка ASCII для англоязычных стового файла постепенно увеличивающийся буфер
текстов; StringBuffer. Вот вариант готового решения:
 «Cp1252», «ISO8859_1» – 8-битовые расширения ASCII
для западноевропейских языков; public static String loadFileAsString(
File file, String encoding)
 «UnicodeBig», «UnicodeBigUnmarked», «UnicodeLittle», throws IOException
«UnicodeLittleUnmarked», «UTF-16» – основные вари- {
InputStreamReader f= encoding==null?
анты 16-битовой кодировки Unicude; new FileReader(file):
 «UTF-8» – псевдо-8-битовая кодировка Unicode (в дей- new InputStreamReader(
new FileInputStream(file),encoding);
ствительности на разные символы отводится разное StringBuffer sb= new StringBuffer();
число бит). try {
char[] buf= new char[32768];
int len;
7- и 8-битовые кодировки предполагают, что каждый while ((len=f.read(buf,0,buf.length))>=0) {
sb.append(buf,0,len);
символ текста хранится в отдельном байте файла. В слу- }
чае 7-битовой кодировки старший бит каждого байта по- return sb.toString();
} finally {
просту не используется (предполагается равным 0). try {f.close();} catch (Exception e) {};
16-битовые кодировки Unicode отводят на каждый сим- }
}
вол 16-битовое («короткое») слово файла. Друг от друга
они отличаются наличием или отсутствием в файле спе- Прокомментирую основные тонкости.
циального 16-битового префикса, идентифицирующего Прежде всего нужно обратить внимание на параметр
формат Unicode, и порядком байт в 16-битовом слове. encoding. Чтобы прочитать текстовый файл, необходимо
Кодировки «UnicodeBig», «UnicodeLittle» и «UTF-16» пред- указать кодировку, в которой он записан. Функция допус-
полагают, что первые 16 бит файла содержат префикс кает передачу null в качестве encoding, но это всего лишь
0xFEFF, указывающий, что файл записан в формате Unicode. означает, что файл будет прочитан в текущей кодировке
Кодировки «UnicodeBigUnmarked» и «UnicodeLittleUnmarked» операционной системы. Скажем, файл с русским текстом,
интерпретируют первые 16 бит файла как первый символ записанный в традиционной для России кодировке Windows
текста. Кодировки «UnicodeBig» и «UnicodeBigUnmarked» (формальное название «Cp1251»), прочитается правиль-
предполагают порядок байт big-endian: старший байт каж- но только при условии, что текущим языковым стандартом
дого слова следует в файле перед младшим. Кодировки (Regional Options) является русский.
«UnicodeLittle» и «UnicodeLittleUnmarked» предполагают по- Все это означает, что параметр encoding можно не ука-
рядок little-endian, более привычный пользователям Intel-про- зывать в единственном случае: когда предполагается, что
цессоров: младший байт каждого слова имеет в файле мень- файл записан в текущей кодировке операционной систе-
шее смещение от начала файла. При наличии префикса мы. Если файл записан в какой-то другой кодировке, то
0xFEFF порядок байт касается и способа записи этого пре- он может быть прочитан в виде совершенно непредска-
фикса: в случае big-endian первым байтом файла будет 0xFE, зуемого «мусора». Это вполне допустимо, например, если
в случае little-endian – 0xFF. Кодировка «UTF-16» не уточня- речь идет о написании простого одноплатформенного
ет, какой именно будет порядок байт, но в этом случае пре- текстового редактора типа Notepad.
фикс 0xFEFF является обязательным. Исходя из способа Внимание! Передавая null в качестве encoding, не
записи этого префикса, в готовом файле можно будет опре- следует полагаться, что латинские символы из стандар-
делить порядок байт в слове. Кодировка «UTF-8», строго та ASCII-7 (с кодами 0..127), если таковые в файле име-
говоря, не является 8-битовой, хотя и ориентирована на по- ются, будут гарантированно прочитаны правильно. Бо-
байтовое хранение данных. В этой кодировке стандартные лее того, теоретически возможна ситуация, когда файл,
символы ASCII, имеющие в терминах Unicode коды 0..127, содержащий только символы с кодами 0..127, будет про-
кодируются с помощью только одного байта, а все прочие читан неверно! В принципе в какой-то операционной си-
символы «расходуют» 2 или более байт. Эта кодировка – стеме может оказаться, что текущей кодировкой явля-
наиболее универсальная и удобная в большинстве случаев. ется UTF-8, UTF-16 или какая-нибудь новая кодировка,
Для текстов, не содержащих национальных и специальных которая будет разработана в будущем и которая коди-
символов, кодировка «UTF-8» столь же компактна, как и рует символы совершенно непредсказуемым способом.
традиционная ASCII, но при этом сохраняется принципиаль- В данный момент на известных мне версиях Windows
ная возможность записывать любые символы Unicode. все кодировки, предлагаемые операционной системой,
хранят латинские символы «как есть», согласно стан-
Чтение и запись дарту ASCII-7. Но никто не может гарантировать, что
текстового файла: алгоритмика так будет всегда. Чтобы правильно читать файлы с ла-
Прочитать целиком текстовый файл несколько сложнее, тинскими символами, записанные в традиционном фор-
чем бинарный. В случае бинарного файла мы заранее мате ASCII, нужно явно указывать кодировку «ASCII»
знали размер требуемого буфера – он был равен длине или одно из стандартных 8-битовых расширений:
файла. Число символов, содержащихся в текстовом фай- «Cp1252» либо «ISO8859_1».

№7(8), июль 2003 59


программирование
Следующее замечание касается начальной емкости Запись текстового файла – сравнительно простая за-
StringBuffer (необязательный параметр конструктора). дача, принципиально не отличающаяся от записи бинар-
Можно было бы попытаться оценить требуемую емкость, ного файла. Возможное решение:
исходя из длины файла и заказанной кодировки. Но для
сложных кодировок здесь легко ошибиться, заказав слиш- public static void saveFileFromString(
String fileName, String encoding, String v)
ком много памяти, особенно учитывая возможное появ- throws IOException
ление новых кодировок в будущем. А это чревато возник- {
saveFileFromString(
новением ошибки «Out of memory», даже когда на самом new File(fileName),encoding,v);
деле виртуальной памяти Java достаточно для размеще- }
ния файла. Ускорение же, которого можно добиться та- public static void saveFileFromString(
ким способом, крайне незначительно и теряется на фоне File file, String encoding, String v)
throws IOException
«расшифровки» сложных кодировок и дисковых опера- {
ций чтения файла. if (v==null) {
file.delete(); return;
Описанную функцию loadFileAsString можно дополнить }
версиями, читающими файл в виде массива символов, а char[] buf= new char[v.length()];
v.getChars(0,buf.length,buf,0);
также работающими с именем файла вместо объекта File: saveFileFromChars(file,encoding,buf);
}
public static String loadFileAsString( public static void saveFileFromChars(
String fileName, String encoding) String fileName, String encoding,
throws IOException char[] buf)
{ throws IOException
return loadFileAsString( {
new File(fileName),encoding);
saveFileFromChars(
} new File(fileName),encoding,buf);
}
public static char[] loadFileAsChars(
String fileName, String encoding) public static void saveFileFromChars(
throws IOException File file, String encoding, char[] buf)
{ throws IOException
return loadFileAsChars( {
new File(fileName),encoding); if (buf==null) {
}
file.delete(); return;
}
public static char[] loadFileAsChars( saveFileFromChars(
File file, String encoding) file,encoding,buf,0,buf.length);
throws IOException }
{
String buf= loadFileAsString(file,encoding); public static void saveFileFromChars(
char[] result= new char[buf.length()]; File file, String encoding,
buf.getChars(0,result.length,result,0); char[] buf, int off, int len)
return result; throws IOException
} {
if (buf==null) {
public static void loadFileAsChars( file.delete(); return;
File file, String encoding, char[] buf) }
throws IOException
OutputStreamWriter f= encoding==null?
{ new FileWriter(file):
loadFileAsChars( new OutputStreamWriter(
file,encoding,buf,0,buf.length); new FileOutputStream(file),encoding);
} try {
f.write(buf,off,len);
public static void loadFileAsChars( } catch (IOException e) {
File file, String encoding, try {f.close();} catch (Exception e1) {};
char[] buf, int off, int len) return;
throws IOException
}
{ f.close();
InputStreamReader f= encoding==null? }
new FileReader(file):
new InputStreamReader(
new FileInputStream(file),encoding); Как и в случае чтения файла, параметр encoding в этих
try {
f.read(buf,off,len); функциях может быть равен null, в этом случае файл будет
} finally { записан в текущей кодировке операционной системы. Все
try {f.close();} catch (Exception e) {};
} функции в конце концов сводятся к вызову последней фун-
} кции, записывающей фрагмент массива символов. Логи-
ка исключений полностью соответствует логике, исполь-
Те из приведенных функций, которые читают файл пол- зованной в первом разделе для записи бинарного файла.
ностью, в конце концов сводятся к вызову описанной выше Небольшой нюанс. Приведенные выше функции выпол-
функции loadFileAsString. Последние две функции, запол- няют специальное действие – стирание файла, если в каче-
няющие переданный им массив символов – целиком или стве данных (строки или буфера) им передано значение null.
заданный фрагмент, реализованы более просто. В этом В моей практике такое поведение оказалось довольно удоб-
случае заранее известно требуемое число символов, и ным. Действительно, при хранении текстовых данных в фай-
нет необходимости использовать постепенно увеличива- лах может возникнуть ситуация «данные отсутствуют», ко-
ющийся StringBuffer. торую проще всего идентифицировать с помощью значе-

60
программирование
ния null строковой переменной. В этом случае стереть файл На основе такого маршрута можно создать работоспо-
(если таковой существует) – самое логичное решение. Про- собный объект java.io.File и в случае файла передать его
верять наличие файла перед вызовом метода delete() не прочим классам пакета java.io.* для работы с этим фай-
нужно: при отсутствии файла (или при возникновении дру- лом. Для такого маршрута можно традиционными средства-
гих проблем) метод delete() возвращает false, не порождая ми класса java.io.File перейти к родительскому каталогу
никаких исключений. (File.getParent()), и получится вполне корректный новый
маршрут, если только текущий маршрут не является кор-
Путешествие по файловой системе: нем диска или верхнеуровневым псевдонимом подкатало-
основные трудности га для компьютера из локальной сети. Наконец, если эк-
Средства для анализа файловой системы: для работы с земпляр класса java.io.File соответствует обычному ката-
каталогами и путями, определения системных свойств логу (в том числе корню диска), то традиционные средства
файлов, работы с файлами-ссылками (links) и пр. в Java, к этого класса позволяют корректно получить все подката-
сожалению, реализованы довольно непоследовательно. логи и файлы, лежащие внутри него, и работать с ними.
Пакет для работы с файлами java.io.* был разработан в Пока приложение нуждается только в манипуляциях с
те времена, когда на рынке господствовали MS-DOS, ран- файлами внутри некоторого обычного каталога (имя ко-
ние версии Windows и всевозможные варианты Unix. В ре- торого получено из диалога выбора файла или из конфи-
зультате этот пакет хорошо «справляется» только с про- гурационного файла), проблем не возникает. Такая ситу-
стейшими путями к файлам, подчиненными жесткой иерар- ация достаточно типична для «невизуальных» и даже для
хии в соответствии с идеологией Unix (эту идеологию унас- многих визуальных приложений, в которых вся работа с
ледовала MS-DOS и вслед за ней Windows). А именно: име- диском сводится к манипуляциям с файлами внутри не-
на файлов и подкаталогов, лежащих в некотором катало- которого специального каталога, отведенного под это при-
ге, образуются добавлением их имен к имени этого ката- ложение. Но если нужно, например, показать пользова-
лога через символ-разделитель File.separator («\» – для телю полное дерево всех доступных файлов, включая се-
Windows, «/» – для Unix). В корне иерархии должен лежать тевое окружение, причем стандартные диалоги выбора
общий для всех корневой каталог «/» – в случае Unix, в файла почему-либо не устраивают, – тут средства пакета
случае MS-DOS и Windows – корневой каталог диска «C:\», java.io.* недостаточны. Другой пример нехватки возмож-
«A:\» или аналогичный. Все средства объекта java.io.File, ностей java.io.*: этот пакет не способен определить ката-
предназначенные для работы с путями, такие как лог документов текущего пользователя Windows 2000/XP,
File.getParent(), рассчитаны на эту логику. а это очень неплохая «точка отсчета» для размещения
В то же время все современные версии Windows с точ- рабочих файлов приложения.
ки зрения пользователя организуют свою файловую сис- Чтобы поддержать современные файловые системы,
тему совершенно иначе. Корнем иерархии обычно являет- компания Sun разработала новый отдельный пакет
ся «рабочий стол» («Desktop»). Его дочерними подкатало- javax.swing.filechooser.* Он размещен внутри графической
гами (или, если быть точным, дочерними узлами иерар- библиотеки Swing и рассчитан на использование совмест-
хии) являются «компьютер» («My Computer»), «папка с до- но с диалогом выбора файла javax.swing.JFileChooser. Тем
кументами» («My Documents»), подкаталог для доступа к не менее возможности, предлагаемые этим пакетом, точ-
локальной сети («My Network Places»). Дисковые накопи- нее, классом javax.swing.filechooser.FileSystemView, не име-
тели появляются уже как дочерние узлы «My Computer». ют никакого отношения к визуальному интерфейсу. В дей-
При этом, разумеется, маршрут вроде: Desktop\My ствительности методы этого класса куда логичнее смотре-
Computer\Local Disk (C:)\подкаталог в Windows никакого лись бы в пакете java.io.*
смысла не имеет. Сегодня средства для анализа и управления файло-
Тем не менее для большинства приложений такая орга- вой системой в Java распределены по двум классам:
низация файловой системы никак не конфликтует с бо- java.io.File и javax.swing.filechooser.FileSystemView. Клас-
лее простой логикой пакета java.io.* Дело в том, что «на сы эти непохожи по организации и частично перекрыва-
нижнем уровне» с точки зрения функций работы с фай- ют возможности друг друга, так что порой не так просто
лами даже самые последние версии Windows сохранили определить, какой из них выбрать.
старую, унаследованную от MS-DOS структуру файловой Попробуем разобраться в этих двух классах.
системы: в корне находятся диски «C:\», «A:\» и т. д. Ка-
талоги типа «Desktop» и «My Documents» соответствуют Путешествие по файловой системе:
некоторым каталогам главного диска операционной сис- класс java.io.File
темы: в случае Windows 2000/XP они расположены в ка- Класс java.io.File, вопреки названию, является представ-
талоге текущего пользователя внутри каталога лением не собственно файла, а маршрута к файлу или
«Documents and Settings». Любой файл или «обычный» подкаталогу. (И почему его не назвали, скажем, «Path»?)
каталог таким образом имеет вполне традиционный Unix- Создание экземпляра File никак не связано с созданием
подобный «низкоуровневый» маршрут. Даже файлы из файла, для работы с файлами служат потоки ввода-вы-
локальной сети Windows имеют традиционные Unix-подоб- вода. По сути, класс File можно считать специализиро-
ные «низкоуровневые» маршруты типа: ванным вариантом класса String, рассчитанным на рабо-
ту с маршрутами к файлам/подкаталогам и, что отличает
"\\èìÿ_êîìïüþòåðà\ïñåâäîíèì_ïîäêàòàëîãà\îáû÷íûé_ìàðøðóò..." его от String, допускающим создание наследников.

№7(8), июль 2003 61


программирование
Экземпляр File обычно создается одним из конструк- так как с точки зрения Windows каталоги «E:\tm» и «E:\TM»
торов: идентичны. Методы getCanonicalFile() и getCanonicalPath(),
разумеется, не гарантируют получения одного результа-
public File(String pathname) та для всех возможных маршрутов к одному и тому же
public File(File parent, String child)
public File(String parent, String child) файлу/подкаталогу. Скажем, в случае Windows они «ни-
чего не знают» о маршрутах в локальной сети типа
Смысл их достаточно очевиден. В качестве pathname «\\имя_моего_компьютера\e\tm\1.txt». Эти методы могут
(или parent) нужно указывать маршрут к файлу/подката- порождать исключение IOException.
логу (соответственно к каталогу, содержащему файл/под- Главные методы класса File, обеспечивающие «нави-
каталог), например, «/tmp/a», «myfile.txt» или «c:\abc.java». гацию» по файловой системе, следующие:
Путь (маршрут) считается абсолютным, если начинается
со слэша (/ или \) или c буквы диска с последующим слэ- public File getParentFile()
public String getParent()
шем в случае DOS/Windows. В противном случае путь счи- public String getName()
тается относительным и отсчитывается от текущего ка- public File[] listFiles()
public File[] listFiles(FileFilter filter)
талога операционной системы. public String[] list()
Разработчики Java разрешили при создании экзем- public String[] list(FilenameFilter filter)
public static File[] listRoots()
пляра File для разделения каталогов в маршруте все-
гда использовать «универсальный» прямой слэш /, по- А также уже упомянутые конструкторы:
мимо стандартного разделителя File.separator (\ в слу-
чае Windows). public File(File parent, String child)
public File(String parent, String child)
Преобразование объекта File в строку (метод toString()
или полностью эквивалентный ему getPath()), как и сле- Смысл их достаточно понятен, а точное поведение мож-
довало ожидать, возвращает исходный маршрут, который но узнать из документации. Я бы только обратил внимание
был передан в конструктор. Но все прямые слэши при этом (это легко не заметить при изучении документации), что
заменяются на File.separator. Вообще, все методы класса методы list возвращают в массиве строк короткие имена
File, возвращающие путь к файлу в виде строки, возвра- файлов (не включающие путь к родительскому каталогу),
щают его в «нормализованном» виде, т.е. с заменой всех в то время как listFiles возвращают маршруты, содержа-
прямых слэшей на File.separator. щие в начале родительский маршрут. Причем, если объект
Если объект File содержит относительный маршрут к File, у которого вызывается один из методов listFiles, пред-
файлу/подкаталогу, то его можно преобразовать в абсо- ставляет относительный маршрут, то пути в полученном
лютный методами getAbsoluteFile() или getAbsolutePath() массиве маршрутов тоже будут относительными.
(первый возвращает File, второй – String). Все, что дела- Как раз эти методы, прекрасно работавшие в DOS и Unix,
ют эти методы, – добавляют перед началом относитель- безнадежно «морально устарели» в современных версиях
ного пути маршрут к текущему каталогу. Эти методы ис- Windows. «Подъем» к родителю по файловому дереву озна-
ключений не порождают, но могут вызвать обращение к чает банальное удаление последнего элемента в цепочке
диску для определения текущего каталога. каталогов, разделенных слэшем или File.separator.
Два похожих метода – getCanonicalFile() и getCanonical- Например, у каталога «\\имя_моего_компьютера\e»
Path() – делают несколько больше. Пользуясь средства- (диск E моего компьютера в виде «сетевого» маршрута)
ми операционной системы, они пытаются привести имя родителем оказывается «\\имя_моего_компьютера», а у
файла/подкаталога к единообразному виду, одинаково- него, в свою очередь, «\\» – «фальшивые» каталоги, с ко-
му для одинаковых реальных положений файла/подката- торыми класс File не может сделать ничего полезного. По-
лога в файловой системе. Например, на моем компьюте- пытка узнать все корневые каталоги вызовом listRoots()
ре (Windows XP) c текущим основным диском E: вызовы: даже в современной Windows XP вернет список корневых
каталогов всех дисков, полностью игнорируя такие поня-
(new File("\\tm/../tm/1.txt")).getCanonicalPath() тия, как «сетевое окружение», «рабочий стол», «мои до-
кументы». Ниже мы обсудим «современную» альтернати-
и ву – класс javax.swing.filechooser.FileSystemView.
Кроме основной задачи – работы с маршрутами – класс
(new File("e://tm/1.txt")).getCanonicalPath() File реализует некоторые вспомогательные операции над
физическими файлами: проверку существования, удаление,
возвращают одинаковую строку: создание файла или подкаталога, переименование и т. п.
Для этого служат методы:
E:\tm\1.txt
public boolean exists()
public boolean isDirectory()
Каталога E:\tm у меня на самом деле нет. Если бы он public boolean isFile()
был, но реально назывался «TM» (заглавными буквами), public boolean isHidden()
public long lastModified()
то указанные вызовы вернули бы строку: public long length()
public boolean canRead()
public boolean canWrite()
E:\TM\1.txt public boolean delete()

62
программирование
public void deleteOnExit() конструктором класса File) до корня иерархии, последова-
public boolean createNewFile()
public boolean mkdir() тельно вызывая метод getParentDirectory, то под Windows
public boolean mkdirs() мы в конце концов доберемся до каталога «Desktop». Ме-
public boolean renameTo(File dest)
public boolean setLastModified(long time) тод getRoots также честно возвращает этот единственный
public boolean setReadOnly() каталог. Если мы будем считывать дерево каталогов, вы-
зывая getFiles для корневого каталога «Desktop», затем для
Все эти методы, кроме createNewFile(), не порождают его элементов, затем для их элементов и т. д., мы увидим
исключений. примерно то же самое, что видит пользователь в любом
Как видите, набор возможностей для современных опе- стандартном диалоге выбора файла Windows: «My Com-
рационных систем исключительно бедный, учитывая, что puter», «My Network Places» и т. д.
это единственный класс пакета java.io.*, предлагающий Очень поучительно написать тест, считывающий «вер-
подобный сервис. (Мы не считаем класс java.io.FileSystem, хние этажи» дерева каталогов с помощью этих методов и
обеспечивающий то же самое, но несколько менее удоб- распечатывающий для каждого элемента (объекта File)
ным способом.) Удивительно, что метод isHidden() не име- результаты вызовов toString(), getAbsolutePath(), getCano-
ет парного setHidden(), а setReadOnly() работает только nicalPath(), getParent(), listFiles(), а также имя класса
«в одну сторону», не позволяя снять атрибут «read-only». getClass(). Также интересно распечатать аналогичную ин-
Еще класс File обеспечивает несколько вспомогатель- формацию для каталогов, получаемых подъемом к кор-
ных возможностей – создание временных файлов и пре- ню вызовами getParentDirectory от произвольных обычных
образование маршрута к формату URI, и наоборот. Так- маршрутов, созданных конструктором класса File.
же этот класс предоставляет строковые константы Оказывается, что классы объектов File, полученных та-
separator, pathSeparator и их синонимы типа char: ким способом, в действительности часто являются наслед-
separatorChar и pathSeparatorChar. никами стандартного класса java.io.File, чаще всего (в слу-
чае Windows) это класс sun.awt.shell.Win32ShellFolder. Этого
Путешествие по файловой системе: класс следовало ожидать. Обычный класс File в принципе не спо-
javax.swing.filechooser.FileSystemView собен представить такую сущность, как «My Computer».
Класс javax.swing.filechooser.FileSystemView – это библиоте- Действительно, практически любой маршрут, хранящийся
ка методов для работы с объектами типа File. Эта библиоте- в объекте File, который мы бы могли придумать для обо-
ка, прежде всего, позволяет перемещаться по файловой значения «My Computer», одновременно соответствовал бы
системе (переходить к «родителю» и получать список «де- какому-нибудь вполне допустимому файлу, а его методы
тей»), причем в современном стиле: корнем иерархии для вроде getParent() вообще возвращали бы ерунду.
Windows служит рабочий стол «Desktop», в нем имеется На самом деле любой вызов getParentDirectory возвра-
выход в «My Computer» и локальную сеть, и т. д. Кроме того, щает для Windows объект «внутреннего» класса фирмы
библиотека FileSystemView открывает доступ к дополнитель- Sun sun.awt.shell.Win32ShellFolder (наследника File), при-
ным свойствам файлов, подкаталогов и иных, «нефайло- чем если исходный маршрут был относительным, он ав-
вых» элементов файловой системы типа «Desktop». томатически преобразуется в абсолютный. У такого объек-
Чтобы использовать FileSystemView, нужно вначале та методы getParent() и listFiles() работают уже «правиль-
получить экземпляр библиотеки с помощью статическо- но», так же, как getParentDirectory и getFiles. Метод list(),
го метода getFileSystemView(): судя по всему, возвращает имена только для «обычных»
файлов/подкаталогов, опуская имена дисков или элемен-
FileSystemView fsv=FileSystemView.getFileSystemView(); тов типа «My Computer».
Методы getPath() и getAbsolutePath() для «нефайловых»
Это единственный способ получить экземпляр: класс объектов типа «Desktop» возвращают путь к каталогу, ко-
FileSystemView – абстрактный и не имеет открытых на- торый в операционной системе соответствует данной вы-
следников. В действительности указанный метод возвра- сокоуровневой сущности, при отсутствии такового (как в
щает экземпляр одного из закрытых классов-наследни- случае «My Computer») – некоторые абстрактные имена.
ков, разных для разных операционных систем. Описанные свойства наследников класса File, возвраща-
Получив экземпляр, можно использовать следующие емых методами FileSystemView, выяснены из тестирования
методы: на версии JDK 1.4.1. В документации они, судя по всему, не
описаны, так что полагаться на них не стоит. Для переме-
public File getParentDirectory(File dir) щения по файловой системе следует использовать докумен-
public File getChild(File parent, String fileName)
public File createFileObject(File dir, String filename) тированные методы FileSystemView getParentDirectory,
public File createFileObject(String path) getChild, getFiles...
public File[] getFiles(File dir, boolean useFileHiding)
public File[] getRoots() Важное замечание: в отличие от класса File, библио-
тека FileSystemView рассчитана на работу не с произволь-
Эти методы «перекрывают» основные методы и конст- ными маршрутами, а только с путями к реально существу-
рукторы класса File, предназначенные для «навигации» по ющим файлам или подкаталогам. Например, метод
файловой системе. Данные методы работают уже в «со- getParentDirectory для несуществующего файла/подката-
временном» стиле. Если мы попытаемся подняться от лю- лога (созданного конструктором File для маршрута, не со-
бого файла (созданного либо через createFileObject, либо ответствующего реальному файлу или каталогу) попрос-

№7(8), июль 2003 63


программирование
ту вернет null. Метод File.getParent() в этом случае на об- может быть «File Folder», «Text Document» для txt-файла,
щих основаниях «отрезал» бы от маршрута конечную «Application» для exe-файла. Наконец, метод getSystemIcon
часть, начиная от последнего слэша. возвращает иконку, которую операционная система реко-
Кроме описанных, библиотека FileSystemView предла- мендует использовать для графического представления
гает также следующие методы: данного файла или подкаталога.

public File getDefaultDirectory() public boolean isParent(File folder, File file)


public File getHomeDirectory()

Первый из них под Windows возвращает каталог «My Этот метод не имеет аналогов в классе File. В рамках
Documents», а второй – каталог «Desktop». пакета java.io.* для аналогичных целей должен был бы
использоваться примерно такой вызов:
public boolean isFileSystem(File f)
public boolean isRoot(File f) file.getParent().equals(folder.getPath())
public boolean isFileSystemRoot(File dir)
public boolean isDrive(File dir)
public boolean isFloppyDrive(File dir)
public boolean isComputerNode(File dir) (возможно, с предварительным приведением маршрутов
к каноническому виду методами getCanonicalPath). При ра-
Эти методы (в дополнение к традиционным методам боте с более сложными современными файловыми систе-
isDirectory() и isFile() класса File) позволяют распознать «спе- мами подобная проверка строк была бы некорректна. Дей-
циальные» узлы файловой иерархии, не соответствующие ствительно, folder.getPath() может вернуть «My Computer»
обычным файлам или подкаталогам. Точный их смысл опи- как для настоящего элемента «My Computer» – родителя
сан в документации на FileSystemView. Все «обычные» фай- каталога «C:\», так и для подкаталога с именем «My
лы и подкаталоги, которые можно корректно представить Computer» в текущем каталоге Windows. Попытка исполь-
классом File, относятся к категории isFileSystem. Часто бы- зовать getCanonicalPath не привела бы к успеху – для «My
вает полезно сочетание свойств: Computer» метод getCanonicalPath порождает исключение,
так как никакому осмысленному каталогу подобный эле-
fsv.isFileSystem(f) мент файловой системы не соответствует.
&& !fsv.isRoot(f)
&& !fsv.isFileSystemRoot(f); На самом деле современная реализация метода isParent
(JDK 1.4.1) устроена крайне неэффективно. Если folder –
В этом случае есть гарантия, что не только сам марш- наследник некоего внутреннего класса sun.awt.shell.Shell-
рут f, но и его родитель является вполне «добропорядоч- Folder (именно такие наследники получаются для всех ка-
ным» маршрутом, допускающим представление с помо- талогов, возвращаемых методами FileSystemView), то ме-
щью класса File. тод isParent, не мудрствуя лукаво, получает полный список
всех «детей» folder (вызовом getFiles) и поочередно срав-
public boolean isHiddenFile(File f) нивает объект file с каждым из них.
Вот типичный пример скрытой квадратичности, глубо-
Если судить по документации, это просто дубликат ко «закопанной» в исходниках библиотечных модулей. В
обычного f.isHidden(). частности, такая реализация порождает ужасающее «тор-
можение» визуального компонента JFileChooser при попыт-
public Boolean isTraversable(File f) ке просматривать с помощью клавиатуры каталог из со-
тен или тысяч файлов. Связано это с тем, что любое пере-
Этот метод обобщает f.isDirectory() на случай «необыч- мещение курсора по каталогу приводит к вызову метода
ных» элементов файловой системы, таких как соседние setSelectedFile, делающему новый файл активным. Этот
компьютеры в локальной сети. Несколько необычный тип метод проверяет (вызовом isParent), точно ли текущий
результата, видимо, выбран по аналогии с другим клас- выбранный каталог является «родителем» по отношению
сом javax.swing.filechooser.FileView, обслуживающим нуж- к новому файлу, и если это не так, изменяет текущий ката-
ды визуального компонента JFileChooser. лог. Действие в данной ситуации, вообще говоря, бессмыс-
ленное. (Это издержки общей организации модуля
public String getSystemDisplayName(File f) JFileChooser: один и тот же метод setSelectedFile использу-
public String getSystemTypeDescription(File f)
public javax.swing.Icon getSystemIcon(File f) ется и для управления компонентом «снаружи», когда те-
кущий каталог действительно может измениться, и при ре-
Эти методы предназначены для визуального отображе- акции на стрелки «вверх»/«вниз».) Проверка нового выб-
ния файлов или подкаталогов в виде списка (например, в ранного файла методом isParent требует полного перебо-
диалоге выбора файла). Метод getSystemDisplayName по- ра всех файлов текущего каталога, так как каталоги в
зволяет узнать, как операционная система рекомендует JFileChooser всегда представлены наследниками File, сге-
именовать данный элемент. Для корня диска C:\ может быть нерированными методами FileSystemView. В результате
получено что-то вроде «WINDOWS (C:)», для рабочего сто- каждое нажатие на стрелку «вверх»/«вниз» приводит к
ла – «Desktop». Метод getSystemTypeDescription дополняет линейному перебору каталога, а полная прокрутка катало-
имя элемента описанием, которое обычно можно увидеть га с помощью стрелок на клавиатуре означает квадратич-
при просмотре каталога в режиме «Details». Например, это ное число операций.

64
программирование
Аналогичное «скрытое» торможение легко можно полу- лыками». С точки зрения стандартных библиотек Java файл
чить, легкомысленно пользуясь методами getDefault- с расширением «.lnk» – это просто некоторый двоичный
Directory() и getHomeDirectory(), которые могут понадобить- файл с недокументированным строением, а подкаталог-
ся и в совершенно «невизуальной» программе. Эти методы «ярлык» из «My Network Places», ссылающийся на другой
тоже возвращают наследников ShellFolder, и для них isParent компьютер – это самый обычный подкаталог с двумя слу-
работает медленно. В моей практике был случай, когда про- жебными файлами. В результате дерево файловой систе-
грамма начала загружаться в десятки раз медленнее (не- мы, построенное с помощью документированных библио-
сколько минут) только из-за того, что в момент старта был тек Java в Windows XP, оказывается принципиально не-
добавлен простой анализ содержимого каталога getDefault- полным – содержимое компьютеров локальной сети туда
Directory(). Причина оказалась именно в методе isParent, не попадает. Это особенно заметно при использовании
превратившего нормальный линейный алгоритм анализа в стандартного диалога выбора файла JFileChooser – ком-
квадратичный. Самое неприятное, что проблема проявля- пьютеры из «My Network Places» там видны, но попытка
лась только в случае, когда каталог «My Documents» содер- зайти на них заканчивается, мягко говоря, странно.
жал много элементов – ситуация типичная для рядового К счастью, фирма Sun уже реализовала механизм об-
пользователя, но сравнительно редкая для хорошо структу- работки файлов-«ссылок» Microsoft Windows, хотя пока не
рированных файловых систем профессионалов. документировала его. Это уже упоминавшийся выше класс
Надо надеяться, что в будущих версиях Java фирма sun.awt.shell.ShellFolder. Помимо прочих методов, имеющих
Sun оптимизирует метод isParent, устранив оттуда пере- документированные эквиваленты в классе FileSystemView,
бор. Для подавляющего числа ситуаций, когда каталог класс ShellFolder содержит следующие два метода:
вполне «нормальный» (что можно определить вызовом
isFileSystem), перебор совершенно не нужен. Пока что я public abstract boolean isLink();
public abstract ShellFolder getLinkLocation()
рекомендую, если это возможно и допустимо логикой про- throws FileNotFoundException
граммы, всегда конвертировать каталоги, полученные от
класса FileSystemView, в обыкновенные объекты File: Вот как можно ими пользоваться:

f= new File(f.getPath()); public static boolean isLink(File f) {


try {
return sun.awt.shell.ShellFolder
Например, это можно проделать с каталогом .getShellFolder(f).isLink();
} catch (FileNotFoundException e) {
getDefaultDirectory(), если программе нужно просто про- return false;
читать оттуда какие-то конфигурационные или другие }
}
файлы. Кроме того, это почти всегда можно сделать, если
выполнено условие: public static File getLinkLocation(File f)
throws FileNotFoundException
{
fsv.isFileSystem(f) File result= sun.awt.shell.ShellFolder
.getShellFolder(f).getLinkLocation();
if (result==null ||
result.getPath().trim().length()==0)
throw new FileNotFoundException(
Путешествие по файловой системе: "Incorrect link - it is empty");
недокументированный класс }
return result;
sun.awt.shell.ShellFolder
Как оказывается, даже с помощью класса FileSystemView Надо надеяться, что скоро эти методы станут докумен-
нельзя написать программу, адекватно работающую с фай- тированными или, что более вероятно, получат документи-
ловыми системами современной Windows XP. В этой вер- рованные эквиваленты в классе FileSystemView. Вероятно,
сии Windows большое значение имеют «ссылки» (links) или что одновременно компания Sun исправит диалог выбора
«ярлыки». В ранних версиях Windows это были файлы с файла JFileChooser, с тем чтобы он начал корректно рабо-
расширением «.lnk», сейчас к ним добавились специально тать с локальной сетью Windows XP. Пока что можно при
организованные подкаталоги. С точки зрения пользовате- желании «исправить» поведение JFileChooser для локаль-
ля «ярлык», ссылающийся на некоторый каталог, должен ной сети и других ярлыков XP самостоятельно. Простейший
вести себя подобно этому каталогу. Щелчок по «ярлыку» способ это сделать – реализовать собственного наследни-
(например, в диалоге выбора файла) должен открывать этот ка JFileChooser и перекрыть в нем методы isTraversable,
каталог. Доступ к локальной сети из основной файловой setCurrentDirectory, getCurrentDirectory. Приблизительно это
иерархии в Windows XP организован именно через «ярлы- выглядит так (здесь isLink и getLinkLocation – приведенные
ки»: компьютеры пользователей-«соседей» («My Network выше методы):
Places») представлены маленькими виртуальными подка-
талогами-«ярлыками» в локальном дисковом каталоге те- public boolean isTraversable(File f) {
if (super.isTraversable(f)) return true;
кущего пользователя. (Эти подкаталоги физически нахо- if (f!=null && isLink(f)) {
дятся внутри скрытого подкаталога NetHood, лежащего в try {
return super.isTraversable(
главном каталоге пользователя.) getLinkLocation(f));
К сожалению, в текущей версии Java не предусмотре- } catch (FileNotFoundException e) {
}
но никаких документированных средств для работы с «яр- }

№7(8), июль 2003 65


программирование
return false; тупа файловой системы NTFS. Остались «за бортом»
}
многие понятия Windows, такие как каталоги «My Pictures»
public void setCurrentDirectory(File f) { или «My Music». Если все-таки подобные возможности
if (f!=null && isLink(f)) {
try { необходимы, то, к сожалению, единственный выход – ре-
super.setCurrentDirectory( ализовывать недостающие функции самостоятельно в
getLinkLocation(f));
} catch (FileNotFoundException e) { виде native-кода для всех операционных систем, под ко-
} торыми предполагается эксплуатировать программу.
}
super.setCurrentDirectory(f);
} Заключение
public File getCurrentDirectory() { Мы рассмотрели ряд основных задач, возникающих при
File dir= super.getCurrentDirectory(); работе с файлами в Java, а также всевозможные нюансы
if (dir!=null && isLink(dir)) {
try { и «подводные» камни, связанные с их решением. Я поста-
return getLinkLocation(dir); рался приводить только тщательно протестированные и
} catch (FileNotFoundException e) {
} продуманные фрагменты кода. К сожалению, этот код был
} должным образом протестирован только под Windows. Не
return dir;
} исключено, что файловые системы Unix или Macintosh мо-
гут добавить свои сюрпризы к уже описанным здесь.
Даже прибегая к недокументированным функциям, на В любом случае, надеюсь, приведенная информация
Java нельзя реализовать многие операции с файлами, послужит хорошим дополнением к документации для всех,
имеющиеся в современных операционных системах. На- кто хочет достаточно полно и грамотно взаимодейство-
пример, из Java нельзя читать и управлять правами дос- вать с файловой системой из Java.

66
образование

MAC OS X

или

ТО, ЧТО ДОЛЖЕН ЗНАТЬ КАЖДЫЙ


ПРО MACINTOSH, APPLE
И ОПЕРАЦИОННЫЕ СИСТЕМЫ

АЛЕКСАНДР ПОТЕМКИН
68
образование
Мое первое знакомство с Маком происходило заочно: по версией была так называемая Tiny Basic, что совсем не
скриншотам, описаниям и восторженным крикам людей, подходило Возняку – ему нужна была полноценная вер-
которые хоть раз работали с ним. Вполне закономерным сия. Без интерпретатора языка программирования ком-
было желание познакомиться с этим компьютером, и чем пьютер не представлял бы из себя особенного интереса.
быстрее, тем лучше. Друг Возняка Стив Джобс был вдохновлен этой пла-
Итак, желание осуществилось – нас «познакомили», той и потому решил, что они просто обязаны выпускать
вот тут все и началось... свой компьютер так же, как это делали и другие фирмы.
Я расскажу историю развития компьютеров Apple (тем Так было положено начало легендарному компьютеру
самым затронув создание первых персональных компью- Apple II, презентация работы которого никого не могла
теров) и самой фирмы Apple, а также расскажу про пос- оставить равнодушным к такой технике.
леднюю (на момент написания этих строк) версию опера-
ционной системы Mac OS X. Компания Apple Inc.
Джобсу удалось заполучить в команду менеджера по име-
ни Майк Марккула, который раньше занимался организа-
Появление первого цией продаж и добился на этом поприще больших успе-
персонального компьютера хов. С тех пор как он уволился из Intel, Марккула зани-
(небольшая историческая вводная) мался различными бизнес-проектами.
Первым персональным компьютером (в том смысле, что Джобс попросил его написать бизнес-план для Apple и
его можно было «взять с собой») следует считать компь- Марккула включился в работу: с его помощью компании
ютеры Altair. Однако первые Altair сложно назвать полно- удалось привлечь капитал для инвестиций, переманить
ценными «компьютерами» – раз; компьютерами, «пригод- Майка Скотта – одного из менеджеров из Fairchild
ными» для обычного пользователя – два. Semiconductor, которому был предложен пост президента
О полноценности: все, что из себя представляла эта фирмы. Кроме того, Марккула также расписывался на
техника, было обычной «коробкой» с большим количе- документах в качестве первого председателя совета ди-
ством переключателей. Более того, собрать такую техни- ректоров.
ку пользователю предлагалось самому, так что особен- Следующим привлеченным в компанию человеком был
ными пользовательскими качествами такая техника так- Джон Скалли – президент отделения Pepsi-Cola, крупней-
же не обладала. шего в составе PepsiCo.
Небольшое лирическое отступление о развитии ком- У Скалли не было специального технического образо-
пьютеров в 1970-х годах: основными пользователями были вания, однако он давно был поклонником передовых тех-
компьютерные профессионалы – хакеры. Их карьера в нологий и, кроме того, был очарован Джобсом.
основном начиналась за большими компьютерами фир- Фраза Джобса, обращенная к Скалли: «У вас никогда
мы Dell либо IBM (последние популярностью не пользова- не возникало желания изменить мир? Или вы намерены
лись). Компьютерное время было весьма дорогим, а тяга провести остаток жизни, продолжая торговать подслащен-
к компьютерам – очень высока. Так стали появляться пер- ной водой?» положила начало весьма тесным отношени-
вые компьютеры, собранные «для себя». ям между ними, которым в дальнейшем, увы, будет суж-
Одним из таких компьютеров, пущенных в «промыш- дено распасться.
ленное» производство, были компьютеры Altair фирмы Джон Скалли становится президентом компании в ап-
MITS. Сразу же после организации этой фирмы она была реле 1983 года.
завалена заказами на год вперед. Люди платили деньги К началу 1980 года годовой оборот фирмы превысил
за возможность получить пакет с микросхемами и схемой 10 миллионов долларов.
сбора всех деталей в один блок.
Количество людей, желающих владеть таким «компь- Первые проблемы
ютером», неуклонно росло, что увеличивало общий уро- После Apple II у компании начались первые неприятнос-
вень технического образования, а значит, и количество ти. 19 мая 1980 г. был презентован новый компьютер –
людей, приобщающихся к хакерству. Apple III. Технически эта машина была более совершен-
Такие «коробки» пользовались спросом, однако все- на, однако именно с нее и начинается череда неудач: пос-
гда есть люди, которые хотят сделать что-то свое, сде- ле серии задержек продукт был выпущен на рынок в не-
лать лучше. Одним из таких людей был Стив Возняк. Он доработанном виде, в результате чего так и не был «при-
регулярно посещал собрания хакеров и в конечном итоге знан» пользователями. Одной из основных причин подоб-
решил создать компьютер для собственного удовольствия. ных проблем была следующая: это был первый компью-
Процессором компьютера стал чип 6502 от MOS тер, который собирался в условиях «фирмы» командой
Technology (основным критерием при выборе этого чипа была инженеров, которыми руководил Джобс.
цена), микросхемы, способные работать с этим процессо- В 1983 году выходит компьютер Lisa, использующий
ром, ему подарил Дэн Сокол на одном из собраний клуба. все преимущества графического интерфейса (разрабо-
Через некоторое время Возняк собрал свой компью- танного в Xerox) и оснащенный 1Mb оперативной памяти,
тер так, что все уместилось на одну плату (что было дос- Motorolla 68000 CPU (32 bit, 5Mhz), 2 приводами для дис-
таточно красивым решением). Кроме того, ему пришлось кет, жестким диском на 5Mb.
написать свой Basic, так как единственной на тот момент Марккула отстранил Стива (Джобса, Возняк сам ото-

№7(8), июль 2003 69


образование

шел от дел после серьезной авиакатастрофы в 1981 году) ли сокращаться, в то время как рыночная доля персональ-
от работы над этим компьютером, в результате чего вся ных компьютеров IBM и совместимых с ней моделей все
энергия Джобса была брошена на компьютер Macintosh. увеличивалась. Apple попала в непростую ситуацию, тре-
Компьютеры Lisa станут популярными с выходом бующую немедленного вмешательства старших.
«Lisa 2» и значительным снижением цены ($3495 против …Apple было крайне необходимо сократить цикл раз-
$9995), однако после назначения на должность руководи- работки новых моделей, большую часть которого состав-
теля проектами Lisa и Macintosh Стив позаботится о зак- ляли задержки, вызванные неудержимым стремлением
рытии первого проекта. Джобса к совершенству. Кроме того, Джобс все чаще стал
Джобс активно продвигал свое детище, в результате вмешиваться в деятельность других подразделений ком-
чего Macintosh стал гораздо более популярным, нежели пании, уже не довольствуясь властью только над отделе-
Lisa. Тому способствовала и грамотная маркетинговая нием компьютеров Macintosh. Менеджеры всех подразде-
компания, и, что самое главное, сам неутомимый Джобс. лений завалили Скалли жалобами, суть которых своди-
При разработке этого компьютера была сделана лась к одному: либо над Джобсом будет быстро установ-
одна серьезная ошибка – по цене в более $2500 его лен контроль, либо все судно пойдет ко дну.
нельзя было назвать дешевым компьютером, и в то же …Наконец, после долгих и мучительных колебаний,
время его техническое оснащение (в частности, отсут- Скалли принял решение лишить своего друга и учите-
ствие жесткого диска, невозможность присоединения ля реального влияния над деятельностью компании,
внешних устройств, наличие небольшого количества удалив его на символическую должность председателя
программ) не позволяло рассматривать этот компью- совета директоров Apple. Столь принципиальное изме-
тер как серьезную технику. нение баланса сил внутри компании требовало одоб-
рения Майка Марккула и совета директоров Apple. Не-
NeXT Inc. задолго до начала заседания совета директоров 10 ап-
«К 1985 году объемы продаж Apple достигли $2 млрд реля 1985 года Скалли отозвал Джобса в сторону и
впервые за непродолжительную историю компании нача- рассказал ему о своих планах. Джобс отреагировал

70
образование
словно ребенок, которого отправляют в чужую семью 10 миллионов долларов в NeXT.
на воспитание против его воли. В 1994 году NeXT публикует спецификации программ-
…Наконец, после бесконечного обсуждения, начавше- ного обеспечения, названные OpenStep, базирующиеся
гося ранним вечером и завершившегося почти сутки спу- на системе NeXTSTEP 3.2. Инициатива получает поддер-
стя, совет директоров Apple принял единогласное реше- жку в лице GNU – начато развитие GNUstep.
ние отправить Джобса в почетную отставку…» (1) В апреле 1995 года NeXT выкупает все права на
Итак, Стив Джобс «ушел». Впрочем, история его де- Object-C у Stepstone. В это же время выходит PDO (PDO –
ятельности на этом не заканчивается – он основывает Portable Distributed Objects – система для распределен-
новую фирму, сыгравшую большую роль в развитии опе- ных вычислений) и NetInfo – программа, шедшая стандар-
рационных систем, а впоследствии и самой компании тно с NeXTSTEP.
Apple, так что вкратце о стремительном развитии ком- В июне 1995 NeXT выпускает NeXTSTEP 3.3J и EOF
пании NeXT. 1.1J – японские версии программного обеспечения.
20 декабря 1996 года Apple выкупает NeXT за 400
Создание компании миллионов долларов. Впрочем, некоторые утверждают
Джобс с помощью семи сооснователей, покинувших Apple обратное. Загадочная картина на официальном сайте
вместе с ним, в 1985 году создает компанию NeXT Inc. предшествовала анонсу. В любом случае, это уже дру-
(позже преобразованную в NeXT Computer Inc.) с устав- гая история, которая начинается 24 марта 2001 года с
ным фондом в 7 миллионов долларов. выходом Mac OS X.
Стив Джобс посещает большинство американских уни-
верситетов в поисках интересных технологий, так, в Уни- Возвращение основателя
верситете Карнеги Милона он знакомится с Avie Tevanian, 20 декабря 1996 года Стив Джобс возвращается в род-
работающим над ядром Mach. ную компанию, что последней идет только на пользу.
Adobe и NeXT начинают совместную разработку Display Стив продолжает политику оригинального дизайна
PostScript, базу будущей системы NeXTSTEP. В 1987 году корпуса машины (машины NeXT были «упакованы» в
NeXT создает завод, способный выпускать 150’000 ком- весьма стильный черный корпус) и доводит ее до логи-
пьютеров в год (всего NeXT за всю свою историю собра- ческого завершения: с момента своего зарождения
ла 50’000 компьютеров). «Маки» по праву считались самыми простыми и понят-
12 октября 1988 Стив Джобс организовывает шоу в ными в использовании.
Сан-Франциско, демонстрирует все возможности новой Политика Стива Джобса основывается на том, что ком-
элегантной машины NeXTcube (с магнитооптическим дис- пьютер не должен более восприниматься как нечто слож-
ком на 256Mb, 68030 процессором, без жесткого диска и ное, скорее, как еще одна часть интерьера, бытовой тех-
привода для дискет) и системы NeXTSTEP (версии 0.8). ники. Именно этим обуславливается исключительный ди-
18 сентября 1990 Стив Джобс устраивает новое шоу в зайн корпусов последних компьютеров (самый яркий при-
Сан-Франциско для презентации новой машины и новой мер – iMac) от Apple, а также серия программ, начинаю-
системы NeXTSTEP 2.0. Эта дата считается датой офи- щихся с буквы «i» (iTunes, iMovie, iDVD, iPhoto) – идеоло-
циального выхода компьютера NeXT. гия простых программ. Apple видит компьютер как про-
Tim Berners-Lee, работающий в CERN, разрабатывает стое, но в то же время весьма мощное средство для вы-
первый веб-клиент (браузер) для NeXTSTEP. полнения любых задач любыми пользователями.
25 апреля 1991 Стив Джобс организовывает шоу в
CNIT в Париже, приуроченное к официальному выходу Macintosh: каков создатель,
компьютеров NeXT во Франции. таков и компьютер...
Были произведены многочисленные демонстрации Маки – творение фирмы Apple под четким руководством
машин NeXT и NeXTSTEP2. В частности, Джобс показал Стива Джобса – человека, благодаря бешеной энергии
таблицы Lotus 1-2-3, работающие через эмулятор SoftPC, которого и была создана эта «яблочная фирма». Крат-
после чего, заметив, что можно сделать и лучше, проде- кой характеристикой Джобса может служить такое опи-
монстрировал революционную программу для работы с сание: самоуверенный, немного эгоистичный и, несом-
таблицами – Improv. Также была продемонстрирована ра- ненно, талантливый харизматичный лидер. Однако со-
бота графической подсистемы. здателем первого Мака был друг Джобса – Стив Возняк,
Вышедшая 25 мая 1993 года на NeXTWORLD Expo, талантливый хакер (в изначальном значении этого сло-
операционная система NeXTSTEP 3.1 была первой вер- ва) по натуре достаточно спокойный, оригинальный и ве-
сией NeXTSTEP, работающей на машинах, отличных от селый человек. Пожалуй, именно эти качества можно
NeXT, – на PC 486. Версия NeXTSTEP 3.1 для PC называ- найти в Маках до сих пор. Каждая машина по-своему
лась NEXTSTEP 486. оригинальна, имеет свои достоинства и недостатки. Кро-
23 ноября 1993 года Sunsoft объявляет о лицензиро- ме того, основным преимуществом фирма Apple может
вании части кода NeXTSTEP для будущего использова- считать по праву тот факт, что можно взять любого че-
ния в операционной системе Solaris. NeXT, в свою оче- ловека с улицы, посадить его за Макинтош и через 15-
редь, анонсирует порт NeXTSTEP на компьютеры на плат- 20 минут он уже сможет выполнять большинство необ-
форме SUN – SPARC. ходимых функций. Однако это уже операционная систе-
Сразу же после этого соглашения SUN инвестирует ма, а о ней разговор отдельный.

№7(8), июль 2003 71


образование

Операционные системы от Apple область памяти. Такой подход может показаться кому-
то странным, однако он работал более 10 лет, и до сих
Mac OS 9 (Classic) пор большинство «макузеров» (от англ. – macintosh user)
На Маках от рождения могут «бегать» две операционные не собираются покидать свою любимую систему, обосно-
системы – Mac OS X и Mac OS 9 – это родное. Впрочем, вывая свое решение просто и лаконично: «Нам и здесь
последнее творение Apple упорно пытается вытеснить с неплохо». Впрочем, их можно понять: «девятка» очень
рынка своей более новой системой («десяткой»). простая и гибкая система в отличие от «десятки», в ос-
Приживить на Мак можно любую систему, работаю- нове которой лежит Unix. Этот факт мало кому нравится
щую на процессорах PowerPC, а это как минимум Linux, из всех ветеранов Мака, зато очень привлекает пользо-
OpenBSD, NetBSD, QNX, однако в родной системе, по- вателей Unix-систем...
моему, есть своя прелесть и менять ее особого смысла я
не вижу. Mac OS X
Итак, в арсенале компании Apple существует две опера- Итак, «десятка». Мое знакомство началось с Mac OS 9.2.2,
ционные системы: Mac OS 9 и Mac OS X. Первая из них сей- и эта система своим устройством успела достаточно силь-
час именуется классикой, точнее, это более ранняя систе- но меня расстроить, и, возможно, не писал бы я этих строк
ма, не использующая таких прелестей жизни, как защита (с некоторым агитационным оттенком), если бы не попа-
памяти и вытесняющая многозадачность. лось бы на мои глаза новое творение «яблочников» –
В одном из описаний этой системы я встретил хоро- Mac OS X (10.2, известная также как Jaguar). Тут уже есть
шую аналогию: Mac OS 9 предполагает, что все програм- о чем рассказать.
мы дружески относятся друг к другу и к пользователю,
и, кроме того, грамотно написаны. Если кто-то «заявля- Устройство системы Mac OS X
ет», что ему и только ему нужны все ресурсы процессо- «Десятка» – достаточно оригинальная система. Системную
ра, причем прямо здесь и сейчас, то система предоста- архитектуру у Mac OS X проще всего представить в виде
вит эти ресурсы. В свое время святой обязанностью про- многослойного пирога. На первом уровне находится мик-
граммы является «отдать» все позаимствованное, как роядро Mach, над ним находится Darwin, далее Core
только это более не будет нужно, и не «лезть» не в свою Services, Application Services. Над ними еще два уровня:

72
образование

Carbon и Cocoa. На самом верху – собственно программы. сколько грубым) определением будет следующее: Mach –
Итак, рассмотрим каждый из этих подуровней отдельно. это ядро, системный уровень; Darwin – это оболочка для
пользователя со всеми его приложениями.
Микроядро Mach Такая структура устройства системы пошла с 4.4BSD
Микроядро отвечает за следующие задачи: Lite – первой свободно-распространяемой в исходных ко-
 управление виртуальной памятью (virtual memory); дах *nix-системой, очищенной от кода AT&T – первона-
 взаимодействие процессов (IPC); чально, Unix был детищем этой компании, и вышел из ее
 поддержка ввода/вывода (I/O) и прерываний; исследовательских лабораторий; вначале коммуникаци-
 поддержка взаимодействия аппаратного и программ- онный гигант смотрел на распространение этой системы
ного обеспечения; сквозь пальцы, однако затем, как только была осознана
 управление заданиями и потоками (Tasks & Threads). возможная экономическая выгода, все, использующие
код, написанный в AT&T, были вынуждены убрать его под
Подобный подход предоставляет достаточно четкую, угрозой судебного преследования.
понятную и легко портируемую структуру операционной
системы. Модульность системы реализуется через «кли- Core Services, Application Services
ент-серверную» модель – единственным процессом, ра- На этом уровне расположены общие для всей системы
ботающим в защищенном режиме процессора, является компоненты, такие как Core Foundation, Carbon Core, Apple
микроядро – первоочередная задача заключается в том, Events... (уровень Core Services) и Quartz, QuickDraw... (уро-
чтобы переместить максимальное количество кода на вень Application Services). Рассказ о каждом из них выхо-
пользовательский уровень. После загрузки микроядро дит за рамки задачи общего рассмотрения системы, но
предоставляет все необходимые сервисы для работы общее у них одно – все они являются базой для всех при-
серверов, одним из которых является Darwin. ложений системы, да и для системы в частности.

Darwin Carbon, Cocoa


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

№7(8), июль 2003 73


образование
Mac OS X – это «следующий шаг» после Mac OS 9 компьютера запрещены. Затем ядро запускает только
(Classic), но в то же время это логическое продолжение один процесс – init.
развитие NeXT (и спецификаций OpenStep). Посему же- Третий этап – работа процесса init (от англ. –
лательно, чтобы приложения каждой из вышеупомянутых «initialization») – заключается в последовательном испол-
систем могли быть портированы на новое творение «яб- нении команд, записанных в файлах конфигурации (ди-
лочной компании» без особых затруднений. ректории /etc).
Выход был найден достаточно оригинальный – новая Первым делом обычно проверяется отсутствие оши-
система поддерживает «классические» приложения через бок на диске, затем устанавливаются переменные среды
среду Carbon, а «новые» (на самом деле – Next-овские) (такие как пути для поиска исполняемых программ, сис-
через среду Cocoa. Для того чтобы приложение заработа- темная языковая кодировка, тип терминала и другие).
ло в новой системе, для приложений NeXT достаточно про- Потом запускаются системные «демоны» – програм-
сто произвести перекомпиляцию, в то время как приложе- мы, исполняющиеся на заднем плане (background) и ожи-
ния из классики будут требовать некоторых доработок. дающие определенного события, например, веб-сервер
По заявлениям Apple, «карбонизация» есть лишь вре- ожидает поступления подключения на 80 порт, после чего
менное решение – возможность быстрого портирования обслуживает поступающие команды.
приложений на новую систему (в противном случае «де- Напоследок для пользователя готовят терминал, и за-
сятка» бы просто лишилась бы своих основных приложе- пускается программа «login», предлагающая ввести ло-
ний, начиная от графики и заканчивая MS Office). гин и пароль для начала работы.
«Карбонизированные» приложения не являются Это был стандартный вариант запуска системы. Су-
сколь либо ущербными – грамотно портированные при- ществуют и другие варианты: среди основных – так назы-
ложения мало чем уступают своим новым собратьям ваемый single-mode и графический.
(например, одно из основных приложений графическо- Первый используется для возращения системы к жиз-
го взаимодействия системы с пользователем – Finder – ни, если что-то произошло. В таком случае доступ разре-
написано с использованием именно этой среды), одна- шен только локальный, при старте осуществляется мини-
ко же данная среда не поддерживает всех возможнос- мальное количество действий (обычно это монтирование
тей системы, предоставляемых в полном объеме через диска в режиме только для чтения, инициализация одно-
вызовы Cocoa. го терминала).
Существует мнение, что Carbon останется в системе Второй, графический, уже своего рода добавка: пос-
как стандарт на гораздо больший срок, чем это предпо- ле основного запуска вместо или вместе с инициализа-
лагает сама Apple – слишком велико количество «старых» цией текстового терминала также запускается «нечто гра-
приложений, и немногие фирмы решатся переписывать фическое». В случае стандартной *nix-системы «нечто
их с нуля с использованием новых возможностей, кото- графическое» – это «X server», в случае Мака –
рые могут быть не всем нужны, тем более что в большин- «WindowServer». С этого момента большинство пользо-
стве случаев это повлечет за собой огромные финансо- вателей попадают в родную для них графическую среду.
вые расходы.
Идеи, заложенные в Mac OS X
Системная архитектура Mac OS X *nix-системы всегда отличались гибкостью, они создава-
Системная архитектура Mac OS X, впрочем, как и NextStep/ лись и разрабатывались как многозадачные, многополь-
OpenStep, основана на операционной системе Unix. зовательские, сетевые ОС. Нормальным взаимодействи-
Для лучшего понимания работы этой системы рассмот- ем с компьютером во время создания этой системы счи-
рим более подробно схему работы *nix-системы от заг- талась работа за текстовым терминалом, тем или иным
рузки до «приглашения к работе» (графического либо образом соединенным с главным компьютером.
текстового). Чуть позже компьютеры начали персонализировать-
Загрузка системы может быть разбита на 3 этапа. ся, а количество пользователей увеличиваться. Причем
Первый начинается сразу после того, как программ- далеко не всем нравился текстовый режим, впрочем, как
ное обеспечение, прошитое в компьютере (то, что назы- и командная строка.
вается BIOS на x86 платформе, Firmware на PowerPC и Через некоторое время и не без помощи фирмы Apple
некоторых других) передает управление программе, за- (а также компании Xerox) пользователи узнали, что ин-
писанной на винчестере (или CD/DVD-диске). терфейс компьютера может быть еще и графическим, то
Здесь в дело вступает загрузчик. Его задача относи- вбивать команды хотелось все меньшему и меньшему
тельно проста – загрузить ядро в память и передать ему количеству людей.
управление. Возможно, предварительно осведомившись Спрос рождает предложение, и многие платформы и
у пользователя, не хочет ли он задать какие-либо допол- операционные системы стали добавлять возможность ра-
нительные параметры для загрузки ядра, либо указать, боты в графической среде, и *nix не остался в стороне –
что грузить необходимо другой образ. был реализован проект графического сервера, который
Второй этап – загрузка ядра. Основной его задачей запускается на одной машине (сервере), и обрабатывает
является определение доступного оборудования и его подключения к нему на определенном порте (клиентов).
инициализация. В дальнейшем ядро будет ответственно Время шло, и компьютер стал все чаще использоваться
за работу всех программ – вызовы напрямую к железу одним человеком, и идея «раздачи» ресурсов для других

74
образование

машин становилась все менее актуальной, и сервер уже  единого графического интерфейса (выбор – это хоро-
обрабатывал подключения с той же машины, на которой шо, но наличие стандарта необходимо);
был запущен и сам.  его продуманности (сейчас зачастую интерфейсы либо
Кроме того, архитектура работы с графикой была «мно- копируют коммерческие реализации, такие как
гослойна». После запуска X server запускалось приложе- Microsoft, Apple, Motif, либо не очень ясны для обыч-
ние, позволяющее пользователю взаимодействовать с ком- ных пользователей);
пьютером – Window manager (оконный менеджер) в терми-  грамотной реализации (качество кода, стабильность
нологии *nix. Оконный менеджер, в свою очередь, мог за- работы).
пускать дополнительные программы (например, приложе-
ния, отвечающие за рабочий стол, за панель снизу экрана Apple решила выбрать в качестве своей базовой плат-
и другие мелкие приложения, апплеты). Завершение рабо- формы *nix, расширить его под себя и переделать всю гра-
ты оконного менеджера означает выход из X server. фическую систему. Так, одним из нововведений является
Такая многослойность вполне в духе *nix-системы, где формат сохранения данных конфигурации – теперь все на-
множество приложений хорошо выполняют свою работу, стройки хранятся в файлах формата XML, более трудного
а их соединение позволяет получить один хороший резуль- для ручного редактирования, однако родного для «про-
тат. Однако обратной стороной подобной гибкости явля- граммного» хранения данных; кому приходилось редакти-
ется значительная фрагментация системы (что, как пока- ровать файлы конфигурации после того, как по ним про-
зывает практика, может быть хорошо для системы в це- шелся автоматический, дружественный к пользователю
лом, но не для графического интерфейса), а также поте- графический конфигуратор на *nix-платформе, поймет о
ря производительности. чем я, для остальных поясню: в результате подобных кон-
Именно эти факторы и мешают продвижению *nix-си- фигураций оказывается сбита вся логика построения фай-
стемы: ла, в ней нередко остается немало мусора, и далеко не все
 отсутствие единой стандартной графической библио- параметры могут быть выставлены корректно.
теки для разработчиков (присутствующей в каждом Кроме того, фирма не может терять наработки про-
дистрибутиве и не меняющейся от версии к версии); шлых лет, в виде большого количества программного

№7(8), июль 2003 75


образование

обеспечения, написанного для «классики» (Mac OS до 9 вер- мандами “cd” и “make install”) как графических, так и ра-
сии включительно) и чуть меньшего для NextStep/OpenStep. ботающих из командной строки.
Для этого в новой системе поддерживается два вида Дополняя картину, нельзя не упомянуть продукт под
библиотек – Carbon и Cocoa. Первая из них – для совмес- названием Virtual PC – эмулятор x86 компьютера на Mac
тимости с «классикой», вторая объявлена новой и приори- OS (последняя 6 версия эмулирует Pentium II MMX, такто-
тетной. Для того чтобы старое (для «классики» или удов- вая частота зависит от мощности самого Мака).
летворяющее спецификациями OPENSTEP) программное Таким образом, компании удалось сохранить старых раз-
обеспечение заработало в новой системе, необходимо про- работчиков, а также привлечь новых, среди которых и такие
извести перекомпиляцию с незначительными изменения- ценные «outsource-кадры», как *nix-хакеры и просто пользо-
ми (либо и вовсе без них). Кроме того, в качестве еще од- ватели по всему миру, не требующие оплаты, однако же
ной рабочей среды объявлена среда Java – виртуальная привносящие весьма ощутимый вклад в развитие системы.
машина на Mac OS X считается лучшей реализацией сре-
ди прочих, и достаточно тесно интегрирована с системой. Mac OS X в работе
Не следует забывать и про слой BSD, и X server, кото-
рый компания скоро уже должна выпустить в окончатель- Desktop
ной версии (на данный момент доступна только beta-вер- Что нужно от жизни обычному пользователю? Простота на-
сия). Также не была упомянута возможность запуска стройки, наличие офиса, приложений для работы в Интер-
«классических» приложений, не портированных на новую нете, работа с родным (в нашем случае – русским) языком.
систему. Так что получается, что сейчас, прямо «из ко- Офисных пакета как минимум два: Microsoft Office (ста-
робки» система способна запускать приложения для бильно работающим не замечен) и Open Office. И тот и
«классики», приложения OPENSTEP, Java и огромное ко- другой обеспечивают совместимость с документами, со-
личество *nix-приложений (для чего создан отдельный зданными на «обычных» компьютерах. Причем Office от
проект переноса так называемых портов с FreeBSD на Microsoft снабжен даже большим количеством «фич», чем
Darwin, позволяющих установить приложение двумя ко- его собрат для Windows.

76
образование
Приложения для работы в Интернете Mac OS X Server) в графической версии его настройки
Здесь выбор весьма велик, а имена производителей дос- имеет два варианта работы с трафиком: allow/deny. И в
таточно известны, посему просто приведу название при- том случае, если администратор решит настроить NAT
ложения и имя производителя: (masquerading в терминах других систем), то правила бран-
Браузеры: Internet Explorer (Microsoft), Safari (Apple), Mozilla дмауэра (стандартного ipfw, кстати) придется прописывать
(Open Source), Opera (Opera Software) и многие другие. напрямую в конфигурационных файлах, что требует дос-
ICQ: ICQ (ICQ Inc.), Fire.app (Open Source), Proteus. таточно плотного знакомства с устройством системы.
E-mail: Outlook Express (Microsoft), Entourage (Microsoft), В общем, можно сказать, что сервер под управлением
Mail (Apple). Mac OS X Server имеет смысл ставить туда, где необходи-
ма простота администрирования, возможно, в некоторых
Локализация случаях в ущерб гибкости. С другими системами такой
Системной кодировкой является Unicode, так что все гра- сервер будет жить очень даже недурно (с системой идет
мотно написанные приложения не испытывают никаких samba, nfs, ssh, ftpd и ранее упоминаемый apache), а его
затруднений при работе с любым языком (систему можно обновление производится не более чем 6 нажатиями мыш-
в любой момент заставить «говорить» как на китайском, ки (и не вызывает таких печальных последствий, как ав-
так и на украинском; то же относится к любому приложе- томатическое обновление на другой популярной платфор-
нию, если его разработчик озаботился многоязыковой ме известного производителя ПО), и кроме того, наличие
поддержкой). обновлений может проверяться каждый день/неделю/ме-
Кроме того, перекодировка текста предусмотрена на сяц, и пользователю будет предложено установить имею-
уровне системных вызовов. щиеся обновления.

Server Developer station


Требования системного администратора обычно несколь- Разработчик – человек, которому нужно немного и от си-
ко другие, а именно – не позволять пользователям делать стемного администратора, и от обычного пользователя,
того, что им не нужно, и иметь возможность настроить но в первую очередь необходима удобная система разра-
все необходимые параметры под конкретную задачу, а ботки (IDE), полная документация и, возможно, примеры
также поддержка системы up-to-date. реализации.
Системе известно такое понятие, как пользователь Это все можно найти в системе. Project Builder позво-
«root», здесь он также царь и бог и при желании может ляет создавать приложения AppleScript (язык автомати-
делать с системой все что угодно (особенно из команд- зации действий с программами), приложения Carbon,
ной строки). Cocoa, Java и C++.
Настройка системы здесь производится несколько про- Документация достаточно полно описывает все прин-
ще, чем в обычном *nix – для этого существуют графи- ципы работы системы и снабжена примерами реализа-
ческие программы. Однако в отличие от обычного *nix, ции приложения (и/или драйвера). Кроме того, не стоит
где все графическое обычно вызывает горестную ухмыл- забывать про открытый исходный код Darwin и другие
ку Unix-гуру, здесь все продумано. наработоки Apple (более подробную информацию можно
Во-первых, Apple не зря начала создание своей Unix- найти здесь: http://developer.apple.com/darwin/projects/).
системы, наслоив на классическую архитектуру свои на- Не могу также пропустить и такое приложение, как
стройки. До момента чтения и исполнения /etc/rc*-файлов Virtual PC, – приложение, позволяющее запускать любую
здесь все идет как обычно, однако затем из этих же фай- x86 операционную систему и эмулирующее Pentium II MMX,
лов происходит вызов скриптов от «яблочной компании». S3 Trio 32/64 (4/8/12MB), Sound Blaster, Intel 21041 Based
Т.е. фактически происходит так: грузится Mach, грузится Ethernet Adapter и выделяющее то количество жесткого
init, который затем, как это и положено, отвечает за все диска и оперативной памяти, которое будет ему указано.
процессы в системе, однако запускает большинство этих Данное приложение можно отнести и к категории для раз-
процессов SystemStarter, который читает и запускает дру- работчиков (тестирование своей программы под различ-
гие файлы (из директории /System/Library/StartupItems). ные системы), и к категории системщика (количество од-
Так вот формат файлов конфигурации для всякого при- новременно работающих систем ограничено только сис-
ложения в Mac OS X – это XML. Данный формат файлов темными ресурсами «хоста») и просто для обычного
чуть хуже читабелен для человека, зато легко читабелен пользователя – «окошки» в «окошке» позволяют работать
для приложений, кроме того, запись конфигурации в ито- с приложениями, которые еще не портированы на Мак,
ге не генерирует «мусор», который обычно всегда можно или даже играть в игры (правда, не очень ресурсоемкие).
найти в обычных файлах конфигурации.
Однако отсюда минус: то, что нельзя настроить графи- При подготовке статьи были использованы материалы:
чески, необходимо делать «руками». Нет, дело не в том, 1. Джим Карлтон. Apple. Взгляд изнутри: история инт-
что это сложно сделать (командный интерпретатор tcsh и риг, ошибок и эгоизма. Издательство «ЛОРИ», 2001.
редактор vi никто не отменял), а в том, что все изменения, 2. Стивен Леви. Хакеры – герои компьютерной рево-
внесенные непредусмотренным системой образом, могут люции. ( www.cooler.it/hackers/)
быть впоследствии переписаны обновлением системы. 3. История развития NeXT. (http://www.levenez.com/
Кроме того, брандмауэр (в серверной версии системы NeXTSTEP).

№7(8), июль 2003 77


образование

ОБУЧЕНИЕ ЧЕРЕЗ
ИНТЕРНЕТ –
ЭТО ВОЗМОЖНО?

ОЛЬГА ИГОШИНА

78
образование
Лето. С самого детства это слово согревает душу. В нем Интернет и обучение в Америке:
звучат наполненные солнцем неправдоподобно теплые дол- успешное совмещение
гие дни, душистые ласковые вечера и, пожалуй, главное – В качестве примера, характеризующего положительный
свобода. Свобода принадлежать себе, быть собой, наслаж- опыт педагогов США, расскажу немного о практике комп-
даться жизнью, изумляться ее неповторимости. Не надо боль- лексных обучающих пособий, получившей в Америке ши-
ше каждый день торопиться на лекции, сдавать экзамены. рокое распространение. Суть ее заключается в том, что
И пусть многим из нас уже нельзя провести все лето в донесению информации служит не просто отдельный учеб-
счастливом ничегонеделании, пусть многие работают, и уда- ник, но и интернет-сайт, сопровождающий информацию,
стся ли вырваться в отпуск – неясно. Все равно слово «лето» данную в учебнике, практическим материалом.
еще хранит на себе отблески юношеской беззаботности. Для примера возьму крупнейшую американскую груп-
Но, к сожалению или к счастью, все проходит. Лето пу издателей учебной литературы – Thomson Learning
закончится, и загоревшие и еще чуть-чуть повзрослев- (www.thomson.com). Понятно, что в Америке, стране боль-
шие юноши и девушки начнут вновь втягиваться в уче- ших возможностей и очень дорогого образования, учеб-
бу, в ежедневные посещения своих школ, колледжей, ников действительно много. Это богатый рынок с жёст-
университетов. кой конкуренцией, и подавляющее большинство учебных
Увы, приходится признать, что, несмотря на многие и материалов подготовлено на хорошем теоретическом и
весьма значительные достоинства бывшей советской си- выполнено на отличном полиграфическом уровне. И тут в
стемы образования, учиться у нас (особенно в вузах – это игру вступает такое весомое конкурентное преимущество,
становится все заметнее по мере взросления) не всегда как поддержка обучения через Интернет.
интересно. Едва ли не большинство выпускников россий- Покупает, допустим, студент учебник по математике,
ских институтов и университетов сохранили воспомина- в этом учебнике находится PIN-код. Зайдя на определен-
ния о томительно тянущихся лекциях, нудных объяснени- ный сайт в Интернете и воспользовавшись этим кодом,
ях, казенным языком написанных учебниках. Смысл упор- он будет уже не просто листать учебник, а в соответствии
но ускользает от тебя, и чувствуешь, что отстаешь от ку- с содержанием каждой главы решать задачи, проходить
рьерского поезда, уносящего вперед мысль преподава- тесты, смотреть интерактивные модели. Все его резуль-
теля. А как результат – напряженные семинары, непонят- таты будут автоматически проверены и учтены, а если с
ные лабораторные работы, нервная сдача экзаменов. В какой-то темой возникнут затруднения, то он может по-
итоге основная цель учёбы – сохранить требуемые све- практиковаться; изучить пошаговый разбор задач с под-
дения в голове до зачета или экзамена. А потом благопо- робными объяснениями; проделать столько сходных за-
лучно забыть. Начисто. даний, сколько необходимо, для того чтобы понять алго-
И студентов ведь можно понять. Они прекрасно видят, ритм решения; еще раз проверить свои силы в тестах.
что слишком часто преподаваемые знания не имеют прак- Очевидно, что это и удобно, и эффективно.
тической ценности, что жизнь, общество, наука давно Группа Thomson Learning и создала проект ВСА (http:/
ушли вперед. /bca.brookscole.com) с целью использовать преимущества,
Нынешняя политика модернизации российской обра- предоставляемые повсеместным распространением «па-
зовательной системы в целом ориентируется на общеми- утины». Проект – это та самая комплексная интернет-си-
ровой и, в частности, на американский опыт. Многие этим стема дистанционного обучения, интегрирующая обуче-
недовольны, ведь не однажды уже было сказано о пре- ние, тестирование и систему управления курсами. Очень
имуществах российского образования по сравнению с важно, что содержание проекта опирается именно на ма-
американским. Дескать, и четкой системы у них в препо- териалы учебников, издаваемых компанией.
давании нет, и учатся студенты за оценку, и широкого Все учебные материалы по университетским курсам –
кругозора такое высшее образование не дает. теория, тесты, задачи, задания сервера коррелируются с
Спорить не буду, недостатки есть, и весьма значитель- определенной темой, главой или вопросом одного из учеб-
ные. Но если вспомнить, что американский диплом счи- ников, на основании которых и строится программа учеб-
тается одним из самых востребованных и престижных во ного заведения. Система используется в колледжах и уни-
всем мире, становится понятно, что все-таки здесь есть верситетах Америки, как для поддержки обычного очно-
что перенимать и использовать. США на данный момент го учебного процесса, так и для дистанционного обуче-
– безусловный лидер по использованию современных ин- ния. Ежедневно сервер посещают свыше 50 000 пользо-
формационных технологий и Интернета в образовании. вателей примерно из 300 учебных заведений по всем
Использование новейших достижений и разработок по- Соединенным Штатам. В число вузов, пользующихся
зволяет американским студентам спокойно учиться и де- именно этой системой, входят такие известные универ-
лать это с комфортом. Они могут сдавать тесты, делать ситеты, как MIT (Massachusetts Institute of Technology) и
домашние задания, где и когда им удобно, повторять не- The University of Texas в Остине.
понятные темы и изучать новые в тех объемах, в каких Понятно, что популярность эта не случайна и говорит,
это необходимо им для понимания. Преподаватели с при- скорее всего, о реальных преимуществах такой системы.
менением того же Интернета могут проводить постоян- Кратко опишу самый простой и, пожалуй, самый распро-
ный мониторинг успеваемости своих учеников, что не дает страненный метод использования возможностей серве-
закостенеть системе преподавания, а студентам – безна- ра. Преподаватель заходит на сайт и, введя свой PIN-код
дежно отстать. (указанный, например, в учебнике или методическом по-

№7(8), июль 2003 79


образование

собии), создает свою страничку (при этом не требуется вания, что поняли его ученики из объяснений, он тоже
даже регистрироваться). Используя обширнейшую тесто- сможет лишь по окончании учебного курса. В этом вопро-
вую базу (свыше 200 тысяч тестов, задач, заданий по раз- се стандартная ситуация в вузе США весьма схожа с рос-
личным предметам), он формирует задание в соответ- сийской, но найден удачный способ ее разрешения: в те-
ствии с изучаемой темой и своими представлениями о чение семестра регулярно проводятся тестирования, пре-
методике обучения. Ссылку на задание он рассылает сво- подаватель отслеживает усвоение сложных тем и коррек-
им студентам, и они его выполняют в режиме он-лайн. тирует чтение курса с успеваемостью аудитории. В дан-
Результаты автоматически проверяются системой, зано- ном случае именно наличие интернет-поддержки вовле-
сятся в электронный журнал успеваемости и высылаются кает студента в сам процесс обучения.
преподавателю. Так как использование ресурсов серве- Основным средством мониторинга успеваемости в
ра предельно упрощено, сложно даже подсчитать точно, американских школах, колледжах и университетах тра-
сколько преподавателей из скольких университетов ежед- диционно служат тесты. Обычно используются два ос-
невно прибегают к помощи ВСА. новных вида тестов: true/false (да/нет) и multiple choice
Что и говорить, студентам такая форма обучения тоже (выбор из нескольких альтернатив). Американские сту-
очень удобна. Можно изучать нужную тему в индивиду- денты называют тесты вида true/false «угадайкой» и по
альном режиме, выполнять задания в любом месте и в понятным причинам любят их значительно больше, чем
удобное время. Самостоятельно решать, моделировать, multiple choice, в которых угадать сложнее и требуется
конструировать и чертить всегда гораздо интереснее, чем что-то знать по теме.
читать или пассивно присутствовать на лекции. Понятно, что и списывать при тестировании значитель-
В американских университетах семинарская форма за- но легче, поэтому большинство заданий в банке тестов
нятий вообще не принята, как это ни удивительно для нас. сервера составляют алгоритмические задачи. Это зада-
Их обучение – это, как правило, только лекции, и со мно- чи, в условиях которых все числовые значения генериру-
гими своими студентами преподаватель встречается во ются случайным образом из заданного определенным
время экзаменационного тестирования в конце семест- алгоритмом множества. И каждый студент в одинаковых,
ра. И судить о том, насколько удачна его манера препода- по сути, заданиях получает разные исходные цифры, со-

80
образование

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

№7(8), июль 2003 81


образование

Самое же, пожалуй, важное, что для того, чтобы взять формулу можно ввести разными способами, например,
на вооружение все эти технологии, не нужно никого при- поменяв порядок слагаемых или помножив и разделив на
глашать, перенимать опыт, создавать команды програм- одно и то же число.
мистов и т. д. Все эти разработки для ВСА на протяжении Именно в российской компании была разработана тех-
уже четырех лет выполняет российская компания – нология, которая, обладая дружественным, интуитивно
ФИЗИКОН (http://www.physicon.ru/) – разработчик учебных понятным студенту интерфейсом для ввода формул, по-
компьютерных программ для средней и высшей школы. зволяет компьютеру «распознавать» формулу, оценивать
Ее интерактивные учебники вошли в Федеральный набор по своей собственной логике правильность ответа, кото-
электронных учебников и были поставлены в 40 000 школ рый может быть введен разными способами.
России. Компания успешно завершила свыше 40 проек- Программисты компании создали уникальный инстру-
тов по разработке программного обеспечения для зару- ментарий для введения в систему свыше 50 видов задач
бежных заказчиков. и тестов. За время сотрудничества с Thomson Learning
В России разрабатывают как программное обеспече- была сформирована большая группа редакторов матема-
ние, так и интерактивные учебные материалы для амери- тических задач, которые алгоритмизировали около 120
канского сервера. Около 70% его уникального в масшта- тысяч задач. Большинство редакторов – студенты и аспи-
бах всего мира содержания создано именно российскими ранты Московского физико-технического института, их
разработчиками. При работе над системой наши програм- фундаментальное образование позволяет им быстро ори-
мисты использовали значительное количество своих соб- ентироваться в предметах и алгоритмах.
ственных наработок и технологий и внесли в разработку
сервера существенный интеллектуальный вклад. Тестирование ВСА в России
Например, одна из задач была такова: студенту, рабо- Весной этого года компанией был проведен очень ин-
тающему он-лайн, в процессе ответа на вопрос надо вве- тересный эксперимент, немаловажный в отношении об-
сти сложную формулу, содержащую степени, квадратные суждаемой темы. В течение недели в Лицее Информа-
корни и т. д. К тому же сложность была в том, чтобы ком- ционных Технологий г. Москвы тестировалась очеред-
пьютер смог автоматически проверить правильность та- ная версия ВСА.
кого ответа. Трудность такой задачи очевидна, так как За эту неделю в тестировании приняло участие девять

82
образование

классов трех специализаций обучения – «менеджеры», Происходило все так: школьники приходили в компь-
«дизайнеры» и «программисты». Всего было задейство- ютерный класс и обнаруживали, что вместо урока инфор-
вано около ста учеников. матики они сейчас будут проходить тест по математике, а
Мероприятие преследовало несколько целей: точнее, работать в трех разных учебных режимах. Пер-
 выявить особенности сервера, затрудняющие его ин- вый режим – «Практика» – позволяет проходить тест
туитивное использование; сколько угодно раз и сразу проверять, был ли правиль-
 решить, пригодна ли система для использования в ным ответ на вопрос. Второй – «Опрос» – позволяет ре-
России. шать тест три раза, правильный ответ ученик видит толь-
ко после того, как выполнит весь тест до конца.
Очевидно, что при разработке столь сложной систе- И наконец, третий режим – «Экзамен» – разрешает
мы возможны различные ошибки и/или недостатки сер- только одну попытку, а уж о ее результатах сообщит учи-
вера (его интерфейса, системы регистрации, заданий, тель. В каждом тесте учащимся предлагалось 12 задач,
системы ввода ответа и т. д.), которые затрудняют его на прохождение всех трех видов теста отводилась одна
продуктивное использование, интуитивно не ясны и оза- пара (два урока).
дачивают пользователя. Необходимо учитывать, что все Нельзя сказать, что всем ученикам пришлась по душе
задачи, созданные для ВСА, формулируются, естествен- перспектива два урока подряд решать задачки. Но боль-
но, на английском языке и к тому же программы обуче- шинству все же становилось интересно разобраться с чем-
ния в США и России сильно отличаются. Так что учите- то новым. Ученики регистрировались в системе и прохо-
лям лицея совместно с сотрудниками компании-разра- дили поэтапно все виды тестов. На возникавшие по ходу
ботчика пришлось основательно потрудиться, чтобы вопросы тут же отвечали сотрудники ФИЗИКОНа, пере-
сформировать тесты по математике, которые по содер- вод заданий раздавался всем желающим в распечатан-
жанию задач не вызвали бы больших проблем у учащих- ном виде, а непривычные для российского школьника
ся. Самым важным все же было протестировать систе- математические обозначения были выписаны на доске.
му, а не знания учеников. В процессе тестирования за реакцией школьников вни-

№7(8), июль 2003 83


образование
мательно наблюдали специалисты компании, все их воп- вые задачи, разработанные соответственно специфике
росы записывались и тщательно обрабатывались, весь русского образования и уровню учебного заведения. То
процесс был снят на видео. Так как в тестировании при- есть на основе уже имеющихся разработок можно создать
нимали участие школьники нескольких специализаций, учебные системы как для школ, так и для вузов. В после-
естественно, что возникавшие затруднения были разно- днее время в российском образовании тестирование ста-
го характера. И если «менеджеры», наименее продвину- ло активно использоваться, например, введен Единый
тые пользователи, в основном задавались вопросами, Государственный экзамен (ЕГЭ) и т. д. Методисты компа-
«как отсюда перейти к другому заданию», «как закончить нии пришли к выводу, что на базе технологий, использо-
работу» и «где я могу посмотреть свой результат», то «про- ванных в разработке сервера, можно создать интеллек-
граммисты», как самые прогрессивные, быстро пройдя все туальную тестирующую систему для подготовки и прове-
тесты, заинтересовались системой безопасности и даже дения тестирований в России.
пытались взломать систему. Правда, неудачно. В общем, можно сделать вывод, что эксперименталь-
Всего от учеников было принято свыше ста различ- ная работа системы с российскими школьниками прошла
ных замечаний, отзывов, предложений. Сами организа- достаточно успешно. Не исключено, что хорошие откли-
торы в процессе тестирования сделали для себя около 40 ки об использовании возможностей сервера в русских
заметок, столько же поступило и от учителей. школах наведут руководителей американской компании
В процессе тестирования обнаружились некоторые зат- на мысль о продвижении этой системы в России.
руднения, в большинстве случаев с вводом ответа в виде В заключение хочется отметить, что описанный опыт
графика или формулы. и наличие в России разработчиков, обладающих всеми
В целом ученики хорошо справились с электронным необходимыми знаниями и практическим опытом, может
заданием, правильно решив до 80% задач. существенно помочь внедрению интернет-технологий в
Все полученные в результате замечания анализиру- российскую образовательную систему. Особенно актуаль-
ются, а наиболее полезные и целесообразные из них вне- но это в свете развернувшейся в последнее время инфор-
сены в следующую версию сервера. матизации российского образования (снабжаются компь-
Другой интересный вопрос, затронутый в эксперимен- ютерами самые отдаленные населенные пункты РФ, раз-
те – возможность использования системы ВСА в России. рабатываются электронные учебники по грантам Мини-
Как оказалось, несмотря на разницу в учебных програм- стерства образования РФ). Появляется надежда, что но-
мах (например, традиционно все курсы высшей математи- вые интерактивные полезные и интересные студентам
ки в США начинаются с азов – арифметических задач), в методы обучения войдут в нашу повседневную жизнь.
банках данных задач сервера нашлось немало заданий, Введение Единого Государственного Экзамена (которое
которые были интересны нашим школьникам и заставили также немыслимо без информационных технологий) по-
их призадуматься, хотя основное затруднение составил, степенно делает тестирование важной составной частью
конечно, английский язык и непривычная система тести- всей системы нашего образования, приводит российское
рования. Стало понятно, что при продуманной выборке из образование к стандартам оценок, принятых в большин-
имеющейся обширной тестовой базы и переводе на рус- стве западных стран. Если Россия хочет занять в обозри-
ский язык можно составить значительный массив заданий, мом будущем подобающее ей место среди ведущих госу-
которые будут соответствовать пройденной программе и дарств мира, ей уже сейчас необходимо обратить самое
не окажутся слишком легкими для наших школьников. пристальное внимание на новые технологии в образова-
Очень важно то, что в систему возможно ввести и но- нии. Завтра начинается сегодня!

84
сети

POWERLINE:
ИНТЕРНЕТ
ИЗ РОЗЕТКИ

ДЕНИС КОЛИСНИЧЕНКО
86
сети
Все, кто хотя бы один раз в жизни прокладывал сеть  Среднескоростной обмен (Medium baud rate) – пред-
собственными руками, скажут, что это занятие не из назначен для передачи информации на средние рассто-
приятных. Одно дело – проектировать сеть, совсем дру- яния – до двух-трех километров. При этом максималь-
гое – заниматься монтажом оборудования и проклады- ная скорость передачи данных в этом режиме составля-
ванием кабелей. Конечно, когда все компьютеры нахо- ет 50 Кб/с, а минимальная – 0,05. В принципе, если поду-
дятся в одной комнате, особых проблем с кабелем, как мать, 50 Кб/с – это не так уж и мало, если учесть, что
правило витой парой, не возникает. Но когда нужно существующие линии телефонной связи, особенно ана-
объединить в сеть два, три, четыре, пять или более эта- логовые, еле обеспечивают надежную передачу данных
жей, невольно начинаешь думать: «Кто бы за меня все на скорости 33,6 Кб/с. Мой модем, подключенный к ана-
это сделал?». логовой АТС, работает по такому сценарию: сначала под-
Конечно же Powerline! Powerline Communications – это ключается на скорости 33,6 Кб/с, затем (минут через 15-
семейство технологий связи, использующее в качестве 20) сбрасывает скорость до 28,8 Кб/с, потом скорость то
физической среды передачи информации существующую понижается (до 21 Кб/с), то повышается (до 28,8 Кб/с).
сеть электропитания (220В или 120В).  Низкоскоростной обмен (Low baud rate). Обеспечива-
Выходит, чтобы объединить в единую сеть целый жи- ет передачу данных на расстояние более 10 километ-
лой дом, не нужно прокладывать кабели, монтировать ров. Максимальная скорость передачи – 0,05 Кб/с.
различные сетевые устройства и заботиться о том, что- Данный режим будет полезен для передачи какой-ни-
бы однажды ночью они не исчезли вместе с кабелем. будь служебной информации небольшого объема.
Среда передачи данных уже есть – это обычная элект-
ропроводка. И количество этажей не играет особой роли. Как подключиться к электросети?
Удобно? Еще бы. Кроме этого, мы получаем еще одно Предположим, что у нас есть самый обыкновенный ком-
преимущество: безопасность передачи данных – пере- пьютер, снабженный самым обыкновенным Ethernet-адап-
хватить данные в электросети не так уж просто, если тером (имеется в виду FastEthernet). Как можно его под-
сравнивать с обычной Ethernet-сетью. К тому же исполь- ключить в PLC-сеть? Неужели прямо в розетку? Почти:
зуется аппаратное шифрование потока данных, о кото- для подключения компьютера к электросети использует-
ром мы поговорим позже. ся специальный адаптер – Powerline to Ethernet adapter.
Вам мало одного дома? Вы хотите подключить еще Вот он-то и подключается к электросети, а Ethernet-адап-
один? Технология Powerline позволяет передавать дан- тер подключается к нему. На рисунке 1 изображен при-
ные на расстояние до десяти километров. Естествен- мер небольшой домашней сети, состоящей из трех ком-
но, если мы что-то приобретаем, то нужно что-то от- пьютеров, использующей технологию Powerline.
дать взамен. В нашем случае мы жертвуем скоростью
передачи. Если объекты находятся на расстоянии бо-
лее двух километров, скорость передачи данных пада-
ет до 0,05 Кб/с (максимум 50 Кб/с). Поэтому для связи
удаленных объектов целесообразнее использовать дру-
гие технологии, например RadioEthernet.

Скорость передачи
данных и расстояние
В зависимости от расстояния между объектами изменя-
Ðèñ. 1. Ïðèìåð íåáîëüøîé ñåòè ñ èñïîëüçîâàíèåì
ется скорость передачи данных: òåõíîëîãèè Powerline.
 Высокоскоростной обмен (High baud rate). В этом ре-
жиме обеспечивается передача данных на расстоя- Один из компьютеров подключается непосредствен-
ние до нескольких сотен метров. Скорость передачи но к среде передачи данных, то есть к электропроводке,
данных обратно пропорциональна расстоянию, мини- используя адаптер Powerline to Ethernet. На данном ком-
мальная скорость передачи в высокоскоростном ре- пьютере должен быть установлен интернет-адаптер. Дру-
жиме – 100 Кб/с, максимальная – 14 Мб/с (практи- гие два компьютера подключены в нашу домашнюю сеть
чески никогда не достигается). Данный вариант иде- через самый обыкновенный интернет-коммутатор (switch),
ально подходит для создания небольшой SOHO-сети который, в свою очередь, подключается к электросети с
(Small Office – Home Office) или объединения в одну помощью адаптера Powerline to Ethernet. Далее, к одному
сеть компьютеров друзей, живущих в одном доме. из компьютеров подключен модем. Если правильно на-
Однако подключить сразу все желаемые PLC-уст- строить программное обеспечение, этот компьютер будет
ройства не получится: может не хватить полосы про- выступать в роли интернет-шлюза и все компьютеры по-
пускания, а она для PLC-устройств составляет не лучать доступ к Интернету.
более 10 Мб/с. Да, видео в реальном времени пере- На вашем компьютере нет сетевой платы? Не беда:
давать не получится, но для передачи файлов с при- кроме адаптера Powerline to Ethernet существуют адапте-
емлемой скоростью вполне хватит. О максимальной ры Powerline to USB, позволяющие использовать USB-порт
скорости, а также о полосе пропускания мы еще по- компьютера вместо сетевой платы. Такой адаптер целе-
говорим чуть позже. сообразнее использовать на одиночных компьютерах, как

№7(8), июль 2003 87


сети
в нашем случае. Во-первых, не нужно покупать сетевую ся бесполезной, если вы забудете изменить пароль по
плату, а во-вторых, адаптер Powerline to USB стоит де- умолчанию. Данный пароль должен быть одинаковым на
шевле, чем адаптер Powerline to Ethernet (цена зависит от всех устройствах вашей сети.
модели и производителя).
А что делать, если у вас старенький компьютер без USB- Выбор устройства
порта? Тогда есть два выхода: купить специальный USB- Следующая таблица поможет вам выбрать ваше PLC-ус-
адаптер или специальную Powerline PCI-карту. В первом тройство.
случае у вас появится так необходимый вам USB-порт, к Òàáëèöà 1. Òåõíè÷åñêèå õàðàêòåðèñòèêè PLC-óñòðîéñòâ.
которому можно подключить адаптер Powerline to USB, а
во втором – вы будете подключаться к электросети с помо-
щью купленной вами Powerline PCI-платы. PLC-устройства,
выполненные в виде PCI-платы, являются самыми деше-
выми, но наименее распространенными.

Устройства производства
Planet Technology
Рассмотрим два устройства производства Planet
Technology:
 Powerline to Ethernet converter (PL-101E)
 USB to Powerline Network Adapter (PL-101U)
Примечание: в таблице 1 указана приблизительная
Первое устройство позволяет подключаться к элект- цена, которая может измениться в зависимости от раз-
росети с помощью сетевого адаптера, а второе представ- личных факторов.
ляет собою сетевой адаптер, подключаемый к USB и спо-
собный работать по электросети – такой себе набор 2 в 1. Тестирование
Устройства представлены на рисунках 2 и 3 соответ- К сожалению, у меня не получилось раздобыть все пере-
ственно. численные в таблице 1 устройства, поэтому ограничимся
теми, что были: Powerline to Ethernet converter (PL-101E) и
USB to Powerline Network Adapter (PL-101U).
Установка устройства происходит без проблем. USB-
адаптер операционная система Windows 2000 определи-
ла как Safely Remove Hardware, после чего был проин-
сталлирован драйвер с компакт-диска.
Ðèñ. 2. Powerline to Ethernet converter (PL-101E). Ethernet-устройства вообще не требуют никакого драй-
вера, нужно только изменить пароль по умолчанию (обыч-
но это слово «HomePlug»). Напомню, что пароль должен
быть одинаковым на всех PLC-устройствах.
На прилагаемом компакт-диске также находилась про-
грамма конфигурации, позволяющая изменить парамет-
ры устройства, а также оценить скорость передачи дан-
Ðèñ. 3. USB to Powerline Network Adapter (PL-101U). ных между устройствами.
Оба устройства поддерживают спецификации Несмотря на то что заявленная максимальная скорость
HomePlug PowerLine Alliance v1.0 и USB Spec 1.1. Основ- передачи данных равна 14 Мб/с, на практике она состав-
ные технические характеристики: ляла 5-6 Мб/с.
 Максимальная скорость до 14 Мб/с; При передаче файла объемом 10 Мб наилучший ре-
 Для надежности передачи данных используют кодиро- зультат был следующим: 5, 55 Мб/с. Всего было сделано
вание с ключом 56 бит (DES); 10 попыток в идеальных условиях: оба устройства нахо-
 Максимальное расстояние – до 90 м; дились в пределах одной квартиры, и не было включено
 Метод сетевого доступа – CSMA/CA (Carrier Sense ни одно устройство, способное создавать помехи – даже
Multiple Access with Collision Avoidance – метод коллек- холодильник был временно отключен.
тивного доступа с избежанием коллизий); При включении водонагревателя, холодильника и мик-
 Поддержка QoS (Quality of Service, IEEE 802.3u); роволновой печи скорость передачи этого же файла со-
 Полоса занимаемых частот для обмена данными: 4,3 – ставила 3,14 Мб/с. Очень даже неплохо, учитывая, что
29,9 Mhz; сигнал преодолел сопротивление в 70 Ом и несколько
 Схема модуляции – OFDM, прямая коррекция ошибок автоматов-выключателей.
(FEC, Forward Error Correction). В отличие от PLC-устройств типа HomePlug, существу-
ет еще один тип подобных устройств – HomePNA, позво-
Стоимость каждого устройства – около $130. ляющий для передачи данных использовать обычные те-
Примечание: 56-битная система шифрования окажет- лефонные линии. А что если подключить наши HomePlug

88
сети
(PLC)-устройства к телефонной линии? Они работают, несколько компьютеров друзей, находящихся в одном
причем их работа оценивается утилитой мониторинга как доме, лучшим выбором окажется Powerline. А если объек-
«Excellent», то есть с максимальной скоростью. В то же ты находятся на расстоянии более 1 километра, исполь-
время мы можем набрать номер и нормально разговари- зовать Powerline вряд ли целесообразно: при таком рас-
вать по телефону – качество голосовой связи не постра- стоянии скорость передачи данных будет очень низкой.
дало. Теоретически можно подключить PLC-устройства и Используемое 56-битное шифрование DES создает до-
к радио, то есть к ретрансляционной сети. Однако я не полнительный барьер при перехвате информации. Также
стал этого делать. стоит отметить, что шифрование выполняется на аппа-
В начале статьи мы акцентировали внимание не толь- ратном уровне, и вам не нужно заботиться о различных
ко на удобстве, но и на надежности. Мол, самые надеж- программных средствах для шифрования трафика, как в
ные и самые безопасные... Неужели нет способа «зава- случае с Ethernet-сетью.
лить» PLC-сеть? Способ есть: соедините сетевым кабе- Стоимость Powerline-устройств на сегодняшний день
лем два устройства Ethernet to PL и увидите, что будет. пока высока. Например, чтобы объединить в сеть два ком-
Если боитесь экспериментировать, скажу, что в резуль- пьютера, вам понадобится минимум $200. При использо-
тате блокируется работа всех устройств в подсети. вании FastEhternet вам понадобятся всего лишь два сете-
вых адаптера ($5-10 каждый) и до 100 метров витой пары
Выводы пятой категории (от $20 за 100 метров). Как известно, если
Теперь подытожим все вышесказанное. Powerline-устрой- нужно соединить сетью два компьютера, можно обойтись
ства являются самыми удобными в плане внедрения в уже без концентратора/коммутатора, поэтому итоговая сто-
существующую среду передачи информации – электро- имость такой сети 40-50 долларов: в четыре раза ниже,
сеть. В отличие от устройств HomePNA, использующих чем стоимость Powerline-сети. Однако в FastEthernet мы
для передачи информации телефонные кабели, PLC-уст- не учли стоимость прокладки кабеля (если вы будете за-
ройства являются более удобными, поскольку телефон- ниматься этим сами, то стоимость будет определяться вре-
ный провод есть не в каждой комнате, а вот розетка на- менем, потраченным на монтаж такой сети) и возможно-
верняка найдется. го ремонта помещения, если придется прокладывать ка-
Хотя заявленная пропускная способность 14 Мб/с, на бель через стену.
практике она составляет 6 Мб/с, это не так уж и мало. Кроме стоимости ограничивает распространение PLC-
Сравнивать PLC-устройства с сетью FastEhternet не сто- устройств максимальная полоса пропускания. Да, мы
ит – они находятся в разных весовых категориях. Гораздо можем объединить в сеть компьютеры, которые располо-
корректнее сравнивать Powerline-устройства с жены на разных этажах и даже в разных подъездах (если
RadioEthernet и другими беспроводными сетями. Что луч- это жилой дом), но мы не можем объединить в сеть все
ше – RadioEthernet или Powerline сказать однозначно тоже компьютеры, находящиеся в одном доме. Ограниченная
нельзя: это зависит от того, как вы хотите использовать полоса пропускания не позволяет работать с относитель-
данные технологии. Если вы хотите объединить в сеть но высокой скоростью более чем 10-15 PLC-устройствам.

№7(8), июль 2003 89


из личного опыта

ПЛАНИРУЕМ
ПЕРЕЕЗД СЕТИ

90
из личного опыта
Создание сети сродни волшебству. В самом начале на
Переезд – это не только головная боль, но и взгляд непосвященного у вас будет лишь куча коробок с
два-три вусмерть уставших сисадмина... запакованными железками. Затем эти железки будут рас-
ставляться, включаться, вы будете с таинственным видом
всматриваться в мигающие огоньки и священнодейство-
вать, производя непонятные пассы руками и произнося
магические заклинания. И потом симпатичные секретар-
ши будут шептаться между собой, вспоминая, что делал
этот приличный с виду человек у них под столом…
Мне недавно повезло: довелось поучаствовать в со-
здании сети с нуля на два офиса для фирмы в 300 чело-
век. После привлечения всех необходимых доказательств
о невозможности переезда «просто так», был дан карт-
бланш на производимые работы и покупку необходимого
оборудования. В этой статье я хочу поделиться тем, как
происходил весь процесс. Я намеренно опущу название
фирмы, подвергшейся моему «консультантству», не буду
рекламировать фирму-поставщика СКС и телефонной
станции. В общем, кто знает, тот догадается. А кто не зна-
ет, тому ничего не поможет…

Этап первый
И что мы будем с этим делать?
На тот момент вся фирма ютилась в небольших комнатах
рядом с арендуемым складом. Было тесно, душно и не-
удобно перед клиентами. Наконец размер финансовых
запасов совпал с амбициями директора по размещению
и был назначен переезд. Переезд работников предпола-
гался в строящийся бизнес-центр. Одновременно на ок-
раине города снималось просторное помещение под
склад. Переезд должен осуществиться с минимальными
потерями во времени. Таковы простые условия, постав-
ленные нам директором.
С трудом утихомирив радость местного сисадмина по
поводу переезда («Наконец-то я выкину эти каджуны!» –
кто знает, тот понимает, для остальных поясню: речь идет
о Lucent Cajun), я усадил его и спросил о том, что будет
переезжать и куда. Если на вопрос про список техники,
которая подвергнется переезду, он ответил довольно бод-
ро, то на вопрос про место переезда он не смог ничего
внятно сказать. Пришлось сесть и накидать небольшой
план по работам, которые необходимо выполнить до изу-
чения прайсов. План получился примерно таким:
 Из чего состоит компьютерная и телефонная сеть фир-
мы сейчас?
 Что поедет в бизнес-центр, а что – на склад?
 Как будет сделана сеть в бизнес-центре и как – на
складе?
 Как центр и склад будут связаны между собой?
 Как будет происходить процесс переезда?

Вроде бы план небольшой, а разобраться по пунктам


оказалось довольно тяжело.

Этап второй
«Я знаю, здесь будет город-сад»
Первая проблема, которая возникла перед нами – это ут-
вержденный план размещения, в котором никак не про-
ВЯЧЕСЛАВ КАЛОШИН сматривалось «уголка сисадмина». Проблема решилась

№7(8), июль 2003 91


из личного опыта
простым походом к директору, выдиранием плана из его 10. и разбивается на 5 диапазонов. Первый диапазон – шеф
рук и отметкой на этом плане желаемого места размеще- и его замы. Могут видеть всех, заходить на любые ресурсы
ния. Попутно скорректировали схему электропитания и кон- сети, кроме управления сетевым оборудованием. Во время
диционирования для этого помещения. После тщательно- работы в Интернете доступ к внутренним ресурсам забло-
го разъяснения важности и нужности всех изменений ди- кирован. Второй диапазон – сисадмины и программисты.
ректор схватил трубку и, используя местные идиоматичес- Разрешен доступ до всего сетевого оборудования, в Интер-
кие выражения, утвердил все изменения. Кто сказал, что нет и к другим подсетям. Третий диапазон – бухгалтерия.
сисадминов не любят? Вы просто не умеете их готовить! Разрешен доступ только к бухгалтерскому серверу. Четвер-
Вторая проблема – кто все это будет делать? На фир- тый диапазон – секретарши, менеджеры и прочий офисный
ме 300 сотрудников, их обслуживают 2 человека. Бизнес- люд. Доступ в Интернет – только http через прокси, выреза-
центр предоставляет только помещение и вход электри- ющий баннеры и прочую мерзость. Пятый диапазон – ин-
чества, Интернета и телефонов. Развести сеть на 300 че- тернетчики. Здесь сидят рекламщики и прочие люди, кото-
ловек за требуемое время мы не успевали, поэтому ре- рым Интернет необходим для работы, сюда же попадают
шили воспользоваться услугами одной из компаний-сис- боссы, когда захотят воспользоваться Интернетом. А также
темных интеграторов. На пару устроили «кастинг» фир- заведен отдельный компьютер из бухгалтерии – бухгалте-
мам. Приезжали менеджеры в дорогих пиджаках и пред- ры тоже люди и лишать их доступа к anekdot.ru плохо. Дос-
лагали сделать так, что все будет просто красиво. К сча- тупа из этой подсети в другие подсети нет. Все сервера, кро-
стью, у меня уже есть опыт подобного общения, поэтому ме бухгалтерского, располагаются в админской подсети.
менеджерам после красивых речей и заверений вручал- Все адреса выдаются DHCP-сервером согласно МАС-ад-
ся этажный план здания с указанием отделов, серверной ресам сетевых карт компьютеров. В VIP-зонах МАС- и IP-
и точек подключения сотрудников, и они разворачивались адреса прикреплены к портам соответствующего коммута-
с напутствием через недельку подготовить план сети и тора. Доступ с этих портов другим адресам запрещен сред-
спецификацию оборудования с ценами. ствами ОС коммутатора. В других зонах неизвестным МАС-
Видимо, их всех выращивают в одном инкубаторе, по- адресам выдаются IP-адреса из зоны, которая заблокиро-
тому что планы различались в таких незначительных дета- вана на роутерах. Таким образом, друг менеджера (партнер
лях, что даже неинтересно было сравнивать. Не подумай- или еще кто), который принес свой ноутбук и включился в
те, что я хвастаюсь, но базируясь на тех данных, которые сеть, с очень большой вероятностью не сможет без помощи
мы им выдали, я нарисовал чуть более симпатичную схему администратора воспользоваться ресурсами сети.
сети. Выбрали трех наиболее приглянувшихся поставщи- Смену VIP-клиентам адреса при выходе в Интернет
ков, попросили скорректировать схему сети так, как надо cделали просто. Им на десктоп ложится иконка, кликнув по
нам (к примеру, я выделил бухгалтерию и начальство с которой, они поднимают VPN-соединение с «интернетовс-
замами в отдельные сетки и увеличил число розеток из кой» подсетью. Одновременно по факту поднятия VPN-со-
расчета 3 розетки на 2 человека) и предоставить оконча- единения на коммутаторе поднимаются дополнительные
тельные предложения с графиком и спецификациями. Тут правила, которые разрешают машине из VIP-зоны обмени-
один из поставщиков хмыкая, начал рассказывать о том, ваться пакетами только с VPN-сервером. На VPN-сервере
что «это неправильно, так не делают и вообще, как-то не- стоят дополнительные правила, которые блокируют любые
интересно», за что с удивлением был послан ни с чем. Два пакеты на опасные порты вроде 139-го и пакеты, используе-
других с радостью вгрызлись зубами в предложенное. На- мые наиболее популярными атаками. В общем, дешево и
конец необходимые экскурсии в проходящий отделку биз- сердито. Боссы пользуются Интернетом, а подростки, обчи-
нес-центр и на склад, крики «Вы нас разорите!» и прочее тавшиеся «Хакера», «пощупать» или достать их не смогут.
полагающееся были пройдены. (Запомните: если вы согла- Разрисовали на этажном плане ареалы подсетей, рас-
ситесь с ценами сразу же, вы кровно обидите другую сто- пределили VLAN по портам коммутаторов, мысленно все про-
рону. Вас будут считать за ламера и все остальное пойдет верили несколько раз и повесили получившийся плакат на
под этим знаком. Доставьте удовольствие людям, сторгуй- стенку для консультаций.
те хотя бы 5%. В общем, как на восточном базаре.) Итак, у Теперь пора обратить свои взгляды к телефонии. В ста-
нас на руках были два проекта будущей сети, которые мы ром здании была станция, которая могла обслужить 100 внут-
вручили директору. Там пошли уже другие переговоры, не ренних номеров и расширяться дальше не умела. А дирек-
касающиеся нас. В общем, через неделю в бизнес-центре тору хотелось поставить каждому сотруднику по телефон-
появились ребята в синих спецовках и начали «согласно ному аппарату. Значит надо рисовать схему распределения
вновь утвержденному плану» делать СКС. телефонных номеров. Задача осложнялась тем, что не хо-
телось лишать сотрудников привычных им двухзначных те-
Этап третий лефонных номеров.
«Кто куда, а мы к зайцам» Была устроена консультация с инженером фирмы, по-
Этап этот оказался самым сложным и нудным. Нудным – из- ставляющей АТС. И был создан новый телефонный план:
за того, что пришлось обойти весь офис и выяснить, кто куда двузначные номера и их привязка к сотрудникам остаются
ходит, у кого какой внутренний номер телефона и так далее. теми же. Новые четырехзначные номера формируются сле-
А сложным – из-за того, что требовалось определить буду- дующим образом: первая цифра номера обозначает принад-
щую политику безопасности и адресный план сети. лежность сотрудника к подразделению фирмы. Следующие
Было решено следующее: берется подсеть в диапазоне три цифры обозначают «порядковый номер» сотрудника.

92
из личного опыта
Например: Алексей Алексеевич имеет внутренний номер Наклейки изготовляли очень просто: печатали цифры
34 и работает в бухгалтерии. После переезда на новое мес- на бумаге, вырезали и приклеивали под скотч. Такой рас-
то ему можно будет позвонить, просто набрав 34 и подож- писанный по пунктам план очень помог при неразберихе,
дав пару секунд. Однако у него появится и другой номер: неизбежно возникающей при переезде. Когда ответствен-
2034. При переходе, скажем, в юридический отдел, у него ный за перевозку звонил и спрашивал: «А чего куда вез-
сменится номер на 1034. В итоге любому по номеру будет ти?» просто говорилось: «Идешь к нам, берешь листок и
понятно, где работает человек и исчезает путаница с номе- начинаешь танцевать с 8-го пункта».
рами при переводах. Теперь пользователи. На мгновение представьте себе
После некоторого размышления была рождена идея чуть 300 человек, которые обустраиваются, распаковываются
подправить адресацию сети: привели IP-адрес сети к номе- и делают прочие необходимые телодвижения… Против
ру телефона человека. К примеру, адрес 10.5.20.34 стал обо- них всего 3 человека. Страшно? Нам тоже было страшно.
значать того же Алексея Алексеевича, находящегося в Ин- Поэтому составили маленькую инструкцию в духе: «По-
тернете и имеющего телефон 2034. А 10.2.20.34 – его же, здравляем, вы переехали на новое место работы. Пожа-
только занимающегося юридическими делами на благо фир- луйста, занимайте указанные вам на плане столы. Пожа-
мы. Как оказалось впоследствии, это очень удобно при раз- луйста, не передвигайте мебель. Если вам не нравится
борке всяких сетевых конфликтов. ваше место, мы поможем изменить его, но только после
С удаленным складом решили очень просто: местная окончания переезда…». В общем, памятка молодому бой-
фирмочка бросила туда выделенку. Мы поставили там млад- цу, расписывающая схему номеров, порядок включения и
шую модель cisco в качестве роутера и брандмауэра. Зару- так далее. В конце добавили пару угроз от имени дирек-
били на ней вообще все. Рядом взгромоздили VoIP-шлюз на тора, размножили все это и положили каждому на стол.
4 аналоговых порта. Через cisco подняли VPN в общую сеть. Вздохнули и дали отмашку на переезд. В воскресенье
На стороне бизнес-центра стоял такой же VoIP-шлюз, толь- перевезли серверы и настроили их. В понедельник вся
ко с портами, приспособленными для включения в АТС. Ус- фирма пришла в офис и начала собираться. Нам в по-
танавливать плату VoIP прямо в АТС было не выгодно – слиш- мощь были выданы наиболее подкованные пользовате-
ком дорого. Все. Склад получил сеть и телефоны, включен- ли, которые следили за аккуратностью разборки машин и
ные в общую сеть компании. правильную упаковку их принадлежностей по пакетам.
Вначале наша диспозиция была следующей: все трое
Этап четвертый находились на старом месте. Затем с первой партией
«Ох, рано встает охрана …» cотруд-ников двое уехали в новый офис и распаковыва-
Самый скучный. Программирование новой АТС и комму- лись, а оставшийся «подчищал хвосты». Было тяжело, но
таторов, проверка разводки (ползание под фальшпотол- вовремя расписанные планы помогли выдержать этот су-
ками и под новыми столами), накладка схемы сети на ре- масшедший день.
альную разводку и корректировка всего этого дела. За- Как ни странно, но наиболее часто задаваемый вопрос:
тем проход еще раз по всей сети и очередная корректи- «А когда все заработает?» мы намеренно не включили в
ровка. Проверка электропитания и кондиционирования памятку. Ибо было дико приятно отвечать: «А все уже ра-
(путем включения в будущей серверной тепловой пушки) ботает». И в самом деле, телефоны были теми же, про-
и так далее и тому подобное. граммы показывали все то же самое, что и должны были
По окончании этого этапа получилось следующее: показывать, в общем, люди включались в работу «с колес».
Около каждого телефонного стола мы имели сиротли-
во ожидающую своего включения телефонную и компью- Этап шестой
терную розетки. Каждая розетка была промаркирована. Последний
Маркировка совпадала с указанной на плане разводки. Од- Он двигался параллельно: происходили разборки с дама-
новременно была составлена таблица кроссировки и схе- ми, которые по своей извечной женской натуре начали
матическая схема сети с указанием IP-адресов и отделов. переставлять мебель и столы. Надо было зафиксировать
Вздохнув, мы начали следующий этап. все перемещения, сделать изменения на схемах, в неко-
торых случаях изготовить новые патч-корды и так далее
Этап пятый и тому подобное. Второй поток заключался в просмотре
«Мы едем, едем в далекие края …» оставляемой территории. Было захвачено то, что забыли
Так как переезд сродни пожару, то решили запастись ог- в суматохе. То, что решили оставить (провода, обзывае-
нетушителями заранее. Расписали последовательность мые сетью и коммутаторы от Lucent, старая АТС), отдали
действий на уровне: на растерзание в дирекцию. Если я не ошибаюсь, все это
 Выключить сервер. оптом купила фирма, которая въехала туда после нас. Не-
 Выключить блок бесперебойного питания. известный администратор, я очень тебе сочувствую…
 Собрать все шнуры в пакет. Ну и короткое резюме: системные администраторы по-
 Завязать пакет и пометить цифрой «1». лучили по премии и повышению зарплаты за прекрасно
 Аккуратно вынуть сервер и поставить тут (схематич- проведенный переезд. Плюс в их распоряжении оказалась
ное изображение соседней комнаты). правильно сделанная и полностью документированная
 Наклеить на сервере и UPS цифры «1». сеть. Они счастливы. А я… Я получил дополнительный
…. опыт. Мне пока хватает.

№7(8), июль 2003 93


bugtraq
Удаленное переполнение буфера Неавторизованный доступ от имени
в базе данных MySQL других апплетов в Sun Java (JRE/SDK)
Переполнение буфера обнаружено в MySQL libmysqlclient. Уязвимость обнаружена в Sun’s Java Runtime Environment
Удаленный или локальный пользователь может выполнить (JRE). Недоверяемый апплет может нарушить управление
произвольный код или аварийно завершить работу при- доступом Java.
ложения в зависимости от того, как приложение исполь- Sun сообщил, что недоверяемый апплет может полу-
зует уязвимую библиотеку libmysqlclient. чить доступ к информации от имени доверяемого аппле-
Переполнение буфера обнаружено в функции та. Дополнительные подробности не раскрываются.
mysql_real_connect(). Имя Unix-сокета длиннее 300 сим- Уязвимость обнаружена в Sun Java (JRE/SDK) 1.4.0_01.
волов приведет к переполнению буфера и возможному Sun выпустил заплаты, которые можно скачать отсюда:
выполнению произвольного кода. http://java.sun.com/j2se/
Пример: Windows Production Releases
 SDK and JRE 1.4.0_02 and later
mysql -S `perl -e 'print "A" x 350'` -hlocalhost  SDK and JRE 1.3.1_05 and later
 SDK and JRE 1.2.2_013 and later
Степень воздействия этой уязвимости зависит от при-
ложения, использующего уязвимую функцию. В некоторых Solaris Operating Environment (OE) Reference Releases
приложениях удаленный или локальный пользователь мо-  SDK and JRE 1.2.2_013 and later
жет заставить приложение выполнять произвольный код.
Эксплоит: Solaris OE Production Releases
 SDK and JRE 1.4.0_02 and later
<?php
for ($i;$i<350;$i++)
 SDK and JRE 1.3.1_05 and later
$buff .= "A";  SDK and JRE 1.2.2_13 and later
ini_set("mysql.default_socket","$buff");
mysql_connect("localhost", "blabla", "blabla");
?> Linux Production Releases
 SDK and JRE 1.4.0_02 and later
Уязвимость обнаружена в MySQL 4.х и более ранних  SDK and JRE 1.3.1_05 and later
версиях.
В настоящее время способов устранения обнаружен- Раскрытие произвольных частей памяти
ной уязвимости не существует. в Ethernet-фреймах в некоторых
драйверах сетевых карт
Просмотр некоторых паролей в Apple OS X в Microsoft Windows Server 2003
Уязвимость обнаружена в операционной системе Apple OS Уязвимость раскрытия информации обнаружена в
X в команде dsimportexport. Локальный пользователь мо- Microsoft Windows Server 2003. Некоторые Microsoft-под-
жет просматривать некоторые пароли. писанные драйверы раскрывают информацию из памяти
Apple сообщает, что локальный пользователь может по- системы удаленному пользователю.
тенциально просматривать имя пользователя и пароль учет- NGSSoftware Insight Security Research предупреждает,
ной записи, под которой запущена утилита dsimportexport. что несколько Ethernet-драйверов, которые поставляются
Уязвимость обнаружена в Apple Mac OS X 10.2. с Windows Server 2003, могут раскрыть информацию из
Apple выпустил патч (Security Update 2003-06-12), ко- памяти при заполнении Ethernet-фреймов в TCP-потоке.
торый можно скачать отсюда: Несколько месяцев назад @stake сообщил, что некото-
http://www.info.apple.com/kbnum/n120215 рые Ethernet-драйверы могут раскрыть информацию от лю-
бой области физической памяти при заполнении ICMP-со-
Выполнение произвольных общений. Согласно NGSSoftware, подобная проблема суще-
подключений через AdSubtract ствует в Windows Server 2003 в Ethernet-пакетах, которые
Уязвимость обнаружена в программе блокирования бан- содержат закрытую часть TCP FIN-ACK обмена. В сообще-
неров AdSubtract. Удаленный пользователь может выпол- нии указывается, что уязвимы несколько драйверов, по-
нить произвольные подключения через приложение. ставляемых с Windows Server 2003 и сертифицированных
Удаленный пользователь может обойти ограничения Microsoft, включая драйвера для сетевой карты VIA Rhine II
доступа, предназначенные ограничить доступ к 'localhost'- (интегрированной в некоторые материнские платы) и драй-
интерфейсу. Если при выполнении обратного DNS-поиска вера для AMD PCNet карт. Несколько байт информации,
IP-адрес преобразует к имени домена '127.0.0.1.[domain]' включая пароли и другую чувствительную информацию,
или другому имени, в котором содержится '127.0.0.1', то могут быть включены в часть данных Ethernet-фреймов.
при выполнении обратного DNS-поиска на IP-адресе соеди- Уязвимость обнаружена в Microsoft Windows Server 2003.
няющегося удаленного пользователя AdSubtract решит, что В настоящее время способов устранения обнаружен-
подключение происходит от 127.0.0.1 (localhost). ной уязвимости не существует.
Уязвимость обнаружена в AdSubtract 2.55.
В настоящее время способов устранения обнаружен- Составил Александр Антипов
ной уязвимости не существует.

94
подписка

Альтернативная подписка: ООО «Интер-Почта» по тел. (095) 500-00-60


Курьерская доставка по Москве
Открыта редакционная подписка на II полугодие 2003 г.
Информация на сайте www.samag.ru в разделе «Подписка»

81655

Единый
подписной
индекс:

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

Рады видеть
Вас нашими
читателями!

№7(8), июль 2003 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№7(8), Июль, 2003 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
НОМЕРЕ:
sekretar@samag.ru
Технический редактор
Владимир Лукин OpenBSD. Первые шаги Протокол V.90
Продолжим наше знакомство с В этой статье мы поговорим об осо-
РЕКЛАМНАЯ СЛУЖБА OpenBSD. Мы остановились на успеш- бенностях протокола V.90. Сам про-
тел.: (095) 928-8253 (доб. 112) ной установке системы и предложени- токол не очень новый и уже давно
факс: (095) 928-8253 ем перезагрузиться, что, собственно применяется многими пользователя-
Константин Меделян говоря, и выполняем. Итак, первая заг- ми и провайдерами. Однако в процес-
reсlama@samag.ru рузка системы уже по традиции для се эксплуатации у пользователей по
BSD-систем выполняется на синем тем или иным причинам возникают
Верстка и оформление фоне, и вы можете видеть, как ядро си- разные проблемы, понять суть кото-
imposer@samag.ru стемы опрашивает все устройства, ко- рых мы сможем, рассмотрев принци-
maker_up@samag.ru торые находит. Отлично, ядро загрузи- пы работы самого протокола V.90.
лось, дальше пошел init системы (про-
Дизайн обложки цесс, который запускает все остальные Построение
Николай Петрочук процессы системы). Мы видим, как под- переносимого shell-кода
нимается сетевой интерфейс (в моем для Windows-систем
103012, г. Москва, случае le1), добавляется маршрут по Всё чаще и чаще обсуждаются аспек-
Ветошный переулок, дом 13/15 умолчанию (в большинстве случаев ты атак на Windows-системы. Основ-
тел.: (095) 928-8253 (доб. 112) надо прописать его в /etc/mygate, я рас- ные возможности атак на семейство
факс: (095) 928-8253 скажу об этом файле при конфигури- данных систем были уже рассмотре-
Е-mail: info@samag.ru ровании сети), запускаются демоны ны, но не стоит забывать о том, что
Internet: www.samag.ru sendmail inetd и sshd. Торжественный при построении атаки на переполне-
момент... Волшебная дверь в систему, ние буфера в большинстве случаев
РУКОВОДИТЕЛЬ ПРОЕКТА которая тщательно выбирает себе дру- атакующий сталкивается с построе-
Петр Положевец зей, но если вы станете ее другом – она нием shell-кода.
сделает все для вас. Твердо и уверен-
УЧРЕДИТЕЛИ но вводим root, затем пароль, который Мониторинг
Владимир Положевец мы указывали при инсталляции. Windows-серверов
Александр Михалев с помощью Nagios
Плохое электропитание, Часть 2
ИЗДАТЕЛЬ или «Грабли» с UPS Первая часть этой статьи рассказыва-
ЗАО «Издательский дом К сожалению, отечественные сети элек- ла об одной из нескольких методик
«Учительская газета» тропитания не обеспечивают достаточ- настройки Nagios для слежения за сер-
ную стабильность подаваемого напря- верами под управлением семейства
Отпечатано типографией жения. Напряжение может изменяться операционных систем Windows. Для
ООО «Мастер Печати» по значению и пропадать на время от достижения наших целей на контроли-
Тираж 5500 экз. нескольких миллисекунд до нескольких руемую машину устанавливалась про-
часов без предварительного предуп- грамма NSClient, а данные собирались
Журнал зарегистрирован реждения. Данная нестабильность в с помощью модуля check_nt.
в Министерстве РФ по делам печати, электропитании есть следствие особен- В этой части мы изучим второй
телерадиовещания и средств мас- ностей российского законодательства. способ мониторинга. Для получения
совых коммуникаций (свидетельство В идеале проблемы и последствия сбо- необходимых данных мы будем ис-
ПИ № 77-12542 от 24 апреля 2002г.) ев электропитания должны решать пользовать SNMP (Simple Network
юристы. Однако мы живём далеко не в Management Protocol). На данный мо-
За содержание статьи ответственность идеальной стране, полной исключений. мент SNMP является самым популяр-
несет автор. За содержание рекламно- Все знают, что «русский сервис нена- ным протоколом управления и мони-
го обьявления ответственность несет вязчив», и за разумные деньги выби- торинга сетей. Первоначально он раз-
рекламодатель. Все права на опубли- рать особо не приходится. рабатывался для работы с маршрути-
кованные материалы защищены. Ре- Данная статья показывает доволь- заторами, но постепенно стал исполь-
дакция оставляет за собой право изме- но дешёвый вариант решения пробле- зоваться и во многих других устрой-
нять содержание следующих номеров. мы электропитания. ствах.

96