Top Banner
журнал для cистемных администраторов, вебмастеров и программистов №7(8) июль 2003 подписной индекс 81655 Мониторинг Windows-серверов с помощью Nagios Неявный самоконтроль как средство создания неломаемых защит Стартовые скрипты FreeBSD Настройка сервера SSH Python глазами DBA Каким видится хороший системный администратор Мониторинг Windows-серверов с помощью Nagios Неявный самоконтроль как средство создания неломаемых защит Стартовые скрипты FreeBSD Настройка сервера SSH Python глазами DBA Каким видится хороший системный администратор
98

008 Системный Администратор 07 2003

Mar 23, 2016

Download

Documents

Мониторинг Windows-серверов с помощью Nagios Неявный самоконтроль как средство создания неломаемых защит Стартовые скрипты FreeBSD Настройка сервера SSH Python глазами DBA Каким видится хороший системный администратор №7(8) июль 2003 подписной индекс 81655
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 008 Системный Администратор 07 2003

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

№7(8) июль 2003подписной индекс 81655

МониторингWindows-серверовс помощью Nagios

Неявный самоконтролькак средство созданиянеломаемых защит

Стартовыескрипты FreeBSD

Настройкасервера SSH

Python глазами DBA

Каким видитсяхороший системныйадминистратор

МониторингWindows-серверовс помощью Nagios

Неявный самоконтролькак средство созданиянеломаемых защит

Стартовыескрипты FreeBSD

Настройкасервера SSH

Python глазами DBA

Каким видитсяхороший системныйадминистратор

Page 2: 008 Системный Администратор 07 2003
Page 3: 008 Системный Администратор 07 2003

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

оглавление

СЕТИ

Стартовые скрипты FreeBSDДенис Пеплин[email protected] 20

Настройка сервера SSHДенис Колисниченко[email protected]

12

Мониторинг Windows-серверовс помощью NagiosЧасть1

Андрей Бешков[email protected]

24

IRC-серверАлександр Слободской[email protected] 28 Powerline: Интернет из розетки

Денис Колисниченко[email protected] 86Контроль последовательных

портов в LinuxДенис Колисниченко[email protected]

BUGTRAQ 10, 31, 42, 94

АДМИНИСТРИРОВАНИЕ

32

Обучение через Интернет – это возможно?Ольга Игошина[email protected]

ОБРАЗОВАНИЕ

78

Mac OS X или То, что должен знатькаждый про Macintosh, Apple иоперационные системы

Александр Потемкин[email protected] 68

Планируем переезд сетиВячеслав Калошин[email protected] 90

Каким видится хорошийсистемный администратор

Вячеслав Калошин[email protected] 6

Репортаж с Первого брестскогоинтернет-форума

Андрей Кухарчик[email protected]

Календарь событий 3

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

Python глазами DBAОлег Попов[email protected] 52

ПРОГРАММИРОВАНИЕ

Три составных части защитыСергей Яремчук[email protected] 44

Неявный самоконтроль как средствосоздания неломаемых защит

Крис Касперски[email protected] 36

Java: работа с файламиДаниил Алиевский[email protected] 56

4

WWW.SAMAG.RU

Page 4: 008 Системный Администратор 07 2003

2

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

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

Page 5: 008 Системный Администратор 07 2003

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

календарь событий

С 25 по 27 июля 2003 года в Калужской области будетпроходить пятый ежегодный фестиваль разработчиков ипользователей свободного программного обеспеченияLinuxFest.

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

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

Самых активных участников сообщества разработчи-ков и пользователей Linux ожидают призы от компанииALT Linux и журнала «Системный администратор».

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

Подробная карта проезда, FAQ, список участников ипрочие подробности – на сайте Linux.ru.net.

Обязательная регистрация участников производит-ся на сайте Linux.ru.net в разделе «фестиваль». Орга-низационный сбор за участие в фестивале – 100 руб. счеловека.

Портал SysAdmins.RU (htttp://sysadmins.ru) объявляет опроведении первого в России Семинара системных ад-министраторов и инженеров.

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

Семинар состоится 12 июля 2003, начнется в 12-00 помосковскому времени и продлится до 20-00. Семинар бу-дет проводиться в очень уютном и удобном месте – Домеветеранов кино (ДВК). Адрес: г. Москва, ул. Нежинская, 5.(от м. Киевская на маршрутном такси №7 до остановки«Дом Ветеранов Кино»). Вход на семинар 150 руб.

Ознакомиться с подробной программой, зарегистриро-ваться для участия на семинаре и посмотреть карту проез-да можно на htttp://SYSM.ru.

12ИЮЛЯ

Cеминарсистемных администраторови инженеров

Пятый ежегодный фестивальразработчиков и пользователейсвободного ПО

25-27ИЮЛЯ

Page 6: 008 Системный Администратор 07 2003

4

репортаж

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

Инициаторами и организаторами форума выступили го-родской портал «Виртуальный Брест» (http://virtual.brest.by)и компьютерный салон «Успех» (http://204040.com). Цельинтернет-форума заключалась в том, чтобы продемонст-рировать возможности современных цифровых устройстви решений для Интернета, и она была с блеском выполне-на в ходе мероприятия.

Генеральным спонсором интернет-форума стала кор-порация Intel. Ее специалисты продемонстрировали наспециально оборудованных стендах преимущества сис-тем, построенных на основе компьютеров с процессора-ми Intel Pentium 4, в том числе с поддержкой революцион-ной технологии Hyper-Threading. Работа и демонстрациивелись в таких областях, как аудиообработка, цифровыефото-, видеосъемка и монтаж, коммуникации (высокоско-ростной доступ в Интернет), компьютерные игры, работас периферийными цифровыми устройствами (принтеры,сканеры, фото-, видеокамеры и т. д.).

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

Посетители Брестского интернет-форума смогли позна-комиться и с мобильными технологиями Intel. На стендахкомпаний ASBIS и «Успех» демонстрировались ноутбукина базе технологии Intel Centrino для мобильных ПК и кар-манные компьютеры на основе технологии Intel XScale.

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

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

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

Page 7: 008 Системный Администратор 07 2003

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

репортаж

Андрей Кухарчик

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

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

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

Материалы, тезисы и доклады прошедшего интернет-форума можно найти на официальном сайте http://bif.virtualbrest.com.

Page 8: 008 Системный Администратор 07 2003

6

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

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

Page 9: 008 Системный Администратор 07 2003

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

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

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

Не стоит путать сисадмина с «аникейщиком». Еслипервый рулит серверами и прочим оборудованием, то вто-рой заменяет картриджи в принтерах, разбирается с не-читающимися дисками и обьясняет пользователям, кудаи что надо нажать. (Термин «аникейщик» пошел с тех вре-мен, когда программа выводила на экран сообщение«press any key to continue» и пользователи, не находя кноп-ки «any key» на клавиатуре, звали администратора.)

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

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

Зачем платить сисадмину $1000, когда на рынкеочень много предложений от людей, готовых работатьза $300-400.

Не забывайте, что скупой платит дважды. Квалифи-цированный специалист не может стоить дешево, так же,как вы не сможете найти новый S600 за $20000. Чем вышеквалификация специалиста, тем меньше он допустит про-стоев в работе системы. Посчитайте, во сколько вам обой-дется простой в 1 час (когда вообще все не работает) илипериодические перебои в работе в течение хотя бы одно-го дня (то принтер не печатает, то почта не уходит, то те-лефон не звонит)...

Зачем мне один сисадмин за $1000? Пусть будуттрое по $300.

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

Хорошо, пусть будет сисадмин за $1000, но он дол-жен знать (список из 40 пунктов: от протоколов и на-стройки Windows до программирования сайта).

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

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

Нет, я не Господь Бог,я всего лишь вашСистемный Администратор...

(одно из частых высказыванийсисадминов начальству)

ВЯЧЕСЛАВ КАЛОШИН

Page 10: 008 Системный Администратор 07 2003

8

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

Признаки хорошего сисадмина� В меру здоровая лень. Хороший сисадмин никогда на

вопрос «Что делаешь?» не ответит: «Вот, вышла но-вая софтина, ставлю на сервер». Если примерно 50%времени сисадмин пьет чай и у вас все работает – силь-но радуйтесь, очень сильно радуйтесь.

� Никогда не спрашивайте у сисадмина «Что делаешь?».Спросите «Что сделал?» или «Что будешь делать?».Многие сисадмины работают в прерывистом режиме:пообщаются с друзьями, подумают, что-то подправят,почитают документацию и так далее по кругу. Это со-вершенно нормальный ритм работы.

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

� Он всегда держит резервные копии. И просьба «Мненужен этот файл таким, каким он был 4 месяца на-зад» не должна его удивлять.

� Привыкните к тому, что сисадмины – вечерне-ночныесущества. Дело в том, что серьезные работы лучшеделать тогда, когда сервера меньше всего загружены.

� Хороший сисадмин обычно умеет очень хорошо гово-рить. Это легко вывести из предыдущих пунктов. Естьнемного свободного времени – почему бы не почитатьчто-нибудь из художественной литературы и отдохнуть.Дело начинается обычно с фантастики и заканчивает-ся классикой.

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

� У хороших сисадминов что-то ломается редко. Это неих стиль работы.

� Он не пьет пиво, вино, водку и прочий алкоголь на рабо-чем месте. Кофе или чай – легко. Алкоголем он нагружа-ется в специально отведенных для этого местах. И чемвыше качество (не количество!) алкоголя, тем лучше.

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

Основные ошибки сисадминов� Босс не понимает, что мне надо вот ЭТО.

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

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

А как узнать о том, что системный администраторхороший? Ведь на лице у него это не написано?

Ни в коем случае не полагайтесь на наличие/отсут-ствие сертификатов. Сертификаты – просто подтвержде-ние того, что человек заплатил деньги, прослушал курсыи правильно поставил галочки на экзамене. Всё. Макси-мум, что вы можете предположить – это наличие базовыхзнаний по предмету. Я знаю людей, которые могут гордопоказать сертификат MСSE, но все их попытки завестисервер так, чтобы он не требовал к себе внимания хотябы неделю, тщетны. Но я знаю и людей, которые имеютсертификат CCNA и способны легко построить беспере-бойно работающую сеть в десятке филиалов. По крайнеймере, поговорите с сисадмином из дружественной ком-пании и выясните реальную ценность сертификата.

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

В общем, рекомендации для выбора сисадмина в ос-новном те же, что и для выбора главного бухгалтера.

Маленькие рекомендациидля размещения сисадминов� Если есть возможность, выделите для системного адми-

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

� Если серверная уже есть, пусть сисадмин сидит где-нибудь неподалеку. Вы же не просите бухгалтера со-ставить баланс, находясь дома.

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

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

Page 11: 008 Системный Администратор 07 2003

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

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

ПримерВаш 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.Но и работать под нагрузкой он будет во столько жераз хуже. Поверьте моему опыту.

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

Самая главная и распространенная ошибка� Поймите, наконец, что не компания работает для вас,

и пользователи – не надоедливые «тупые человеч-ки», которые отвлекают постоянно. Вы работаете длякомпании и для того, чтобы эти «тупые человечки»работали как можно более продуктивно. Если онине понимают в компьютерах так же, как вы, то этоне означает, что вы понимаете в их области деятель-ности так же, как они.

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

Посмотрите на это со стороны пользователя:� он должен прерваться и осмыcлить сообщение;

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

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

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

можность его собрать с куда большими усилиями;� вы прививаете пользователю привычку хранить все на

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

� вы разрушаете структуру защиты сети (если есть, чторазрушать). Пользователю будет проще перекинутьфайл по аське или открыть диск С: на запись, чем по-ложить файл на сервер;

� вы потеряли возможность проверить этот файл в ав-томате антивирусом. Береженого бог бережет.

Не ударяйтесь в другую крайность: не потакайтепользователям во всем. Пользователь должен быть какцыпленок под курицей. Хорошо, тепло, сухо и еды вдо-воль (говоря другими словами – все работает в удобномдля него режиме и ему не надо вспоминать ваш телефондля выяснения вопроса о распечатке цветной диаграммына струйном принтере). Но цыпленок одновременно дол-жен знать, что если он высунется из гнезда, то получитклювом по лбу. То есть сын секретарши не должен по ве-черам ставить новые игры непонятно откуда, и менеджерне должен иметь возможности сменить Win2000 на WinXPтолько потому, что она красивее и вообще она новее идома у него такая. Пользователи должны знать, что имможно и что нельзя. Для этого придумали такую вещь,как корпоративный кодекс, даже если корпорация состо-ит из 10 человек.

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

Page 12: 008 Системный Администратор 07 2003

Межсайтовый скриптинг при обработкенекорректных XML-документовв Microsoft Internet ExplorerУязвимость обнаружена в Internet Explorer в обработчи-ке XML-документов. Удаленный атакующий может вы-полнить произвольный код сценария в контексте целе-вого веб-сайта.

Internet Explorer автоматически пытается анализиро-вать любой XML-файл, который запрашивается браузе-ром. Если анализ прошел успешно, в браузере пользова-теля отобразится динамическое дерево различных XML-элементов. Если при анализе возникает ошибка, InternetExplorer отобразит ошибку вместе с URL запрашиваемо-го XML-файла.

В некоторых случаях отображенный URL не фильтрует-ся на наличие HTML-кода. Фактически это означает, чтоналичие на вашем сайте XML-файла, который не можетбыть правильно проанализирован Internet Explorer и MSXML,делает ваш сайт уязвимым к XSS-нападениям.

Проблема была воспроизведена в различных установ-ках, но GreyMagic не смог достоверно определить уязви-мый компонент. Скорее всего, уязвимость затрагивает не-которые версии MSXML, а не Internet Explorer непосред-ственно.

Пример:

Microsoft смогла воспроизвести обнаруженный недо-статок только на IE6 Gold. Как сообщает GreyMagic, онисмогли воспроизвести уязвимость на следующих систе-мах: IE5.5 NT4, IE6 Win98, IE6 Win2000.

http://host.with.unparsable.xml.file ↵/flaw.xml?<script>alert(document.cookie)</script>

Удаленное выполнение произвольногокода в Microsoft Internet ExplorerУязвимость обнаружена в Internet Explorer в механизме об-работки HTTP-ошибок. Удаленный пользователь может вы-полнить произвольный код в Local Zone на целевой системе.

Internet Explorer поставляется с несколькими файла-ми, отвечающими за обработку HTTP-ошибок («FriendlyHTTP error messages»). Например, если «site.com» сгене-рировал 404 HTTP-ошибку, то следующий внутренний URLбудет отображен IE:

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

Удаленный атакующий может представить специаль-но обработанное значение после поля #sign, которое зас-тавит функцию записать «javascript:» URL в отображае-мую ссылку. Пример:

Чтобы проверить уязвимость, скопируйте URL в брау-зер и кликните на ссылку.

Уязвимость обнаружена в Microsoft Internet Explorer 5.5-6.0.Способов устранения обнаруженной уязвимости не су-

ществует в настоящее время.

errorres://shdoclc.dll/404_HTTP.htm#http://site.com/file.html

res://shdoclc.dll/HTTP_501.htm#javascript: ↵%2f*://*%2falert(location.href)/

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

bugtraq

10

Поднятие локальных привилегийв Sun Java Virtual Machineна Linux-системахУязвимость обнаружена в Sun Java Virtual Machine. Ло-кальный пользователь может получить поднятые приви-легии на системе. Sun Java Virtual Machine (JVM) на Linux-системах небезопасно сохраняет временные лог-файлыв '/tmp'-каталоге. Согласно сообщению, JVM создает файл'/tmp/jpsock.**_*' при загрузке, без предварительной про-верки существования файла, и если файл существует, непроверяет, кто его владелец.

Локальный пользователь может сконструировать сим-вольную ссылку из произвольного файла к временномуимени файла. Затем, когда целевой пользователь запус-кает JVM, ссылающийся файл будет перезаписан с при-вилегиями целевого пользователя.

Уязвимость обнаружена в j2re1.4.1_02 on Linux.Способов устранения обнаруженной уязвимости не

существует в настоящее время.

Повышение локальных привилегийв Progress DatabaseУязвимость обнаружена в Progress Database в несколькихвспомогательных программах. Локальный пользовательможет получить root-привилегии на целевой системе.

Сообщается, что когда выполняются некоторые вспо-могательные файлы, база данных загружает общедоступ-ные файлы объектов с dlopen()-функцией, основываясьна пути, определенном в переменной PATH. Локальныйпользователь может изменить переменную PATH, чтобысослаться на другое местоположение, в котором распо-ложены альтернативные версии объектных файлов, ко-торые будут выполнены с root-привилегиями.

Согласно сообщению, уязвимо большинство программ,расположенных в '/usr/dlc/bin'-каталоге.

Уязвимость обнаружена в Progress Database 9.1 – 9.1D06.В качестве временного решения, можно удалить setuid

bit из уязвимых программ.

Page 13: 008 Системный Администратор 07 2003
Page 14: 008 Системный Администратор 07 2003

12

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

АНДРЕЙ БЕШКОВ

Часть 1

Page 15: 008 Системный Администратор 07 2003

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

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

С момента публикации первой статьи о Nagios прошлодовольно много времени, но вопросы и пожелания всепродолжают приходить. Самый часто встречающийсявопрос – как настроить слежение за серверами, работа-ющими под управлением семейства операционных сис-тем Windows. В этой статье мы рассмотрим два спосо-ба, используя которые можно добиться осуществлениянаших желаний. Как всегда система, мониторинга Nagiosработает под управлением моей любимой системыFreeBSD 4.7. Приверженцы Linux, Solaris и других Unix-подобных систем тоже не останутся в стороне. Все опи-санные ниже приемы с незначительными изменениямиможно с успехом применять и в их системах.

В качестве подопытной системы будет использовать-ся русская версия Windows 2000 Professional. Такой вы-бор обусловлен тем фактом, что настроить программ-ное обеспечение для исправной работы с русской вер-сией сложнее, чем с аналогичной английской. Придет-ся решать проблемы, связанные с локализацией, а зна-чит, статья получится гораздо полезнее и интереснее.Последовательность действий по настройке программ-ного обеспечения выглядит практически одинаково длявсех версий Windows. Я надеюсь, что никому из вас неприходит в голову мысль серьезно рассматривать в ка-честве операционной системы для установки на сер-вер Windows 3.1, 3.11, 95, 98, ME. Поэтому дальше в этойстатье о них не будет сказано ни слова, соответственно,вы можете с полным правом считать, что все методы, опи-санные ниже, работать с ними, скорее всего, не будут.

В дальнейшем предполагается, что вы прочиталипервую статью, подробно описывающую основы уста-новки и настройки Nagios, либо в февральском номережурнала «Системный администратор», либо на моемсайте http://onix.opennet.ru/.

Покончив с формальностями, приступим к изучениюконструкции и принципов работы подсистемы сбора дан-ных о производительности. Такая система встроена в каж-дую версию Windows-системы старше, чем Windows ME.

Для сбора статистики о своем функционированииWindows NT, Windows 2000, Windows XP используютобъекты производительности. Делать подобные утвер-ждения о Windows 2003 не буду, потому что потрогатьее пока не удалось. Каждый компонент системы в про-цессе работы генерирует данные о производительнос-ти и складывает их в счетчики (performance counters)собственного объекта производительности. На самомделе объект – это абстракция, введенная для облегче-ния понимания материала. Логичнее всего было быпредставлять объект как группу счетчиков, связаннуюс наблюдаемой службой или ресурсом. Чаще всего на-звание объекта совпадает с названием родительскогосистемного компонента. В большинстве случаев объек-ты производительности соответствуют компонентамоборудования компьютера – память, процессор, жест-кие диски. В то же время многие службы и программымогут создавать свои собственные объекты произво-дительности. Иллюстрацией такого утверждения явля-ются объекты службы «Обозреватель компьютеров»или серверной программы Internet Information Server. К

примеру, объект «Файл подкачки» содержит внутрисебя набор счетчиков, говорящих о состоянии одногоили нескольких файлов виртуальной памяти, исполь-зуемых системой. Некоторые подсистемы имеют всегоодин экземпляр объекта производительности, другиеже могут иметь несколько. К первому виду относятся«Система», «Память», «Сервер». «Жесткий диск» и«Процессор», соответственно, ко второму. Согласитесь,что жестких дисков в компьютере может быть несколь-ко, а значит, внутри системы они должны быть пред-ставлены отдельными подсистемами. В то же времяоперативная память, вне зависимости от количествачипов, является единым компонентом. А посему иметьбольше одного экземпляра объекта производительно-сти ей не положено. В случае если подсистема облада-ет несколькими экземплярами объекта, есть возмож-ность следить за счетчиками всех экземпляров или заодним общим. В зависимости от языка операционнойсистемы, объекты и счетчики называются по-разному.К примеру, посмотрим, как будет называться один и тотже счетчик в локализованных версиях Windows 2000:

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

Чтобы закрепить все вышесказанное, давайте рас-смотрим несколько примеров счетчиков:

Первый компонент – это имя моего домашнего компь-ютера, на котором я пишу статьи и провожу тестовые ин-сталляции. «Процессор» – название объекта. Как вы мог-ли бы догадаться, (_Total) – экземпляр, инкапсулирующийвнутри себя данные о производительности всех процес-соров системы. Соответственно, (0) и (1) – экземплярыобъектов первого и второго процессоров. И наконец, «%загруженности процессора» – название самого счетчика.В повседневной практике сложилась традиция для крат-кости записывать названия счетчиков без имен компью-теров. Я считаю, что нам также стоит придерживаться ее.

Счетчики бывают следующих типов:� Моментальный – всегда содержит последнее значение

использования ресурса. В качестве разъяснения приво-дим счетчик \Очередь печати(_Total)\Заданий, собираю-щий данные о количестве заданий в очереди печати.

\\TIGROID\Ïðîöåññîð(_Total)\% çàãðóæåííîñòè ïðîöåññîðà

\\TIGROID\Ïðîöåññîð(0)\% çàãðóæåííîñòè ïðîöåññîðà

\\TIGROID\Ïðîöåññîð(1)\% çàãðóæåííîñòè ïðîöåññîðà

Page 16: 008 Системный Администратор 07 2003

14

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

� Усредненный – хранит среднее число, созданное наоснове двух последних значений счетчика. Примеромтакого типа является счетчик \Память\Страниц/сек., со-держащий в себе среднее значение частоты сменыстраниц памяти в секунду.

Существует возможность создавать счетчики дру-гих типов. Но для этого необходимо иметь пакет PlatformSoftware Development Kit. Впрочем, обсуждение подоб-ных методик выходит далеко за границы этой статьи.Просмотреть список объектов и счетчиков, существу-ющих в системе, а также полюбоваться на их содержи-мое можно с помощью модуля «Монитор производи-тельности», входящего в состав консоли управленияMicrosoft. А если говорить совсем просто, то открытьвышеописанный модуль можно выполнив программуperfmon.exe. После ее запуска мы должны увидеть при-мерно такое окно:

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

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

узнать, как правильно называется тот или иной счетчик,добавьте его в список отображения. Очень полезно вовремя просмотра списка доступных счетчиков нажатькнопку «Объяснения», так как названия счетчиков недо-статочно информативны. К примеру, как вам такой ше-девр ясности с первого взгляда: «% времени DPC»? Лад-но, оставим названия на совести создателей системы.Хотя если есть желание, можно нажать кноку “Объясне-ние” и на экране появится маленькое окошко с кратким ине всегда понятным объяснением предназначения того илииного счетчика. Выбрав нужный счетчик, жмем кнопку«Добавить». Затем правой клавишей мыши щелкаем вцентре графика и выбираем пункт меню «Свойства». Впоявившемся диалоговом окне наше внимание привле-кает вкладка «Данные».

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

Правой клавишей кликаем в центр графика и выбира-ем «Сохранить как». В открывшемся диалоге вводим имяфайла test.html и жмем “Сохранить”. Затем любым редак-тором открываем получившийся файл и среди кучи вся-ких ненужных данных, ближе к концу файла, видим пол-ное и правильно написанное название счетчика. Затем спомощью буфера обмена его можно будет вставить влюбую программу.

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

Подопытная Windows-машина называется win2000rus.Для начала давайте выполним обязательные действия,необходимые для того, чтобы Nagios узнал об этой маши-не. Делать это придется вне зависимости от того, какойспособ мониторинга мы изберем. Поэтому внесем ее дан-ные в файл hosts.cfg.

# Îïèñûâàåì õîñò ïî èìåíè win2000rusdefine host{use generic-hosthost_name win2000rusalias Windows 2000 Russianaddress win2000ruscheck_command check-host-alivemax_check_attempts 10notification_interval 120notification_period 24x7notification_options d,u,r}

Page 17: 008 Системный Администратор 07 2003

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

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

Теперь добавляем его в файл hostgroups.cfg, описы-вающий группы хостов.

Создаем в файле contacts.cfg запись для человека,отвечающего за Windows-сервера.

Пожалуйста, убедитесь, что вы внесли группу контак-тов win-admins в файл contactgroups.cfg.

NSClientЗакончив с обязательными действиями, перейдем к об-суждению первого способа мониторинга. Он состоит втом, чтобы установить на Windows-машину программуNSClient, доставшуюся нам в наследство от проектаNetSaint. Запустившись как сервис, она начнет через каж-дые пять секунд читать содержимое определенных сис-темных счетчиков Windows. Полученные величины запи-сываются в круговой буфер, в котором хранятся данныеза последние 24 часа. Занимаясь сбором статистики, про-грамма ожидает входящие соединения от клиентов на1248-й порт. Для считывания данных и передачи их сер-веру мониторинга будет использоваться программаcheck_nt из стандартной коллекции модулей Nagios.

Давайте посмотрим, какие именно сведения о функ-ционировании подопытного Windows-сервера можно по-лучить с помощью check_nt:� загрузка одного или всех процессоров за последние

24 часа;� наличие свободного места на любом подключенном к

системе жестком диске;� состояние запущенных процессов;� данные об использовании оперативной памяти;� время работы системы с момента последней пере-

загрузки;� состояние запущенных сервисов;� дату изменения любого файла;� данные любого системного счетчика.

Покончив с теорией, перейдем к инсталляции.

С сайта производителя http://nsclient.ready2run.nl/download.htmhttp://nsclient.ready2run.nl берем последнююверсию программы NSClient. Я использовал версию 1.0.7.1.После распаковки дистрибутива должны появиться сле-дующие директории:� LinuxBin – исполняемые файлы для Linux;� UnixSource – исходный код для всех версий Unix;� NTSource – исходный код для всех версий Windows;� Win_2k_XP_Bin – исполняемые файлы для Windows 2000

и XP;� Win_NT4_Bin – исполняемые файлы для Windows NT.

Заглянув в директорию NTSource, понимаем – про-грамма написана на Delphi. Впрочем, это обстоятель-ство никоим образом не мешает нам использовать еедля своих далеко идущих целей. Создаем директориюc:\Program Files\NSClient. Затем, в зависимости от ус-тановленной у нас операционной системы, копируем внее содержимое либо из директории Win_2k_XP_Bin,либо из Win_NT4_Bin. Пользуясь меню Пуск → Выпол-нить запускаем командный интерпретатор cmd.exe. Впоявившемся окне набираем:

По окончании установки система должна продемонст-рировать нам подобное окошко:

Это значит, что программе удалось прописать себя вреестре подобающим образом.

С помощью программы regedit откроем реестр. Ищем вет-ку \HKEY_LOCAL_MACHINE\SOFTWARE\NSClient\Params.

Внутри расположились параметры password и port.Я думаю, предназначение каждого из них очевидно. Ду-маю, вы согласитесь с утверждением, что возможностьпросматривать статистику должна быть предоставле-на только программам, запущенным на сервере мони-торинга. Меняем содержимое параметра “password” начто-нибудь длинное и трудноподбираемое, например«PxRT890mY».

Теперь любой, кто попытается подключиться для по-

define hostgroup{ hostgroup_name win-serversalias Windows Serverscontact_groups win-adminsmembers win2000rus}

define contact{contact_name sergealias Sergei Petrovservice_notification_period 24x7host_notification_period 24x7service_notification_options w,u,c,rhost_notification_options d,u,rservice_notification_commands notify-by-email, ↵

notify-by-epagerhost_notification_commands host-notify-by-email, ↵

host-notify-by-epageremail [email protected] [email protected]}

define contactgroup{contactgroup_name win-adminsalias Windows adminsmembers serge}

> C:\Program Files\NSClient\pNSClient /install

Page 18: 008 Системный Администратор 07 2003

16

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

лучения данных на порт 1248, должен будет предъявитьпароль.

Проверим, как себя чувствует наш новый сервисNetSaint NT agent. Выбираем меню Пуск → Настройка →Панель управления. Затем дважды кликаем по пиктог-рамме «Администрирование», в открывшемся окне также поступаем со значком «Службы». Должно получитьсячто-то подобное:

Запустив службу и вернувшись в окно «Администри-рование», щелкаем по значку «Просмотр событий». Вовновь открывшемся окне выбираем «Журнал приложе-ний». Находим уведомление от программы NSClient и кли-каем на нем дважды.

Нам нужно было увидеть следующую строку «NSClient1.0.7.0 has started. Language code : 0x0419», опираясь наее содержимое, мы можем узнать цифровой код языка,используемого в системе. Для русского языка это 0x0419,а для английского, соответственно, 0x0409. В файлеC:\Program Files\NSClient\counters.defs находится описа-ние системных счетчиков для всех известных програм-ме языков. Просмотрев его до конца, понимаем, что ко-дом 0x0419 тут явно не пахнет. Отсюда вывод – для рус-ской версии Windows получим дырку от бублика вместостатистики. Осознав, что такое несправедливое положе-ние вещей нас не устраивает, добавляем в counters.defsновую секцию с названиями счетчиков, соответствую-щими нашему языку:

Сохранив файл, перезапускаем сервис NetSaint NT agent.Тем, кому религия не позволяет вносить изменения в фай-лы собственноручно, предлагаю скачать модифицирован-ную версию здесь: http://onix.opennet.ru/files/. Еще раз бег-ло просматриваем журнал событий, дабы убедиться в от-сутствии ошибок при перезапуске сервиса. Также стоитудостовериться, что вся цепочка событий происходила втаком порядке:

Закончив возню с Windows, переходим к Unix. В даль-нейшем я предполагаю, что Nagios установлен в дирек-торию /usr/local/nagios/. Запускается он с правами пользо-вателя nagios, принадлежащего к группе nagios.

По крайней мере, именно так это происходит воFreeBSD. Если вы используете другую операционную си-стему, то вполне возможно настройки будут слегка от-личаться. Для начала берем на сайте проекта Nagioshttp://www.nagios.org/download/ самую свежую версиюмодулей. В моем случае это был файл nagiosplug-1.3-beta1.tar.gz. Распакуем архив:

К сожалению, в официальном пакете модулей, под-ключаемых к Nagios, находится старая версия исходно-го текста программы check_nt. Если оставить все какесть, то некоторые функции сбора данных станут для наснедоступны.

Сейчас мы легко в течение нескольких секунд устра-ним это досадное неудобство. Из дистрибутива, остав-ленного на Windows- машине, берем файл check_nt.c,расположившийся в директории UnixSource, и заменяемим старую версию, находящуюся на Unix-машине в ди-ректории ./nagiosplug-1.3-beta1/plugins/.

Осталось исправить еще одну ошибку. Она касает-ся только тех, кто использует FreeBSD или Solaris. От-крываем файл ./nagiosplug-1.3-beta1/plugins/utils.c иищем там строку:

Найдя, заменяем ее на вот это:

Если не выполнить исправления, то все результатыработы модуля check_nt будут выглядеть таким образом:

[0x0419]Description = "Russian"NT4_SystemTotalProcessorTime = "\Ñèñòåìà\% çàãðóçêè ↵

ïðîöåññîðà"NT4_SystemSystemUpTime = "\Ñèñòåìà\Âðåìÿ ðàáîòû ñèñòåìû"NT4_MemoryCommitLimit = "\Ïàìÿòü\Ïðåäåë âûäåëåííîé ↵

NSClient is now responding to queries.NSClient 1.0.7.0 has started. Language code : 0x0419NSClient is reading C:\Program Files\NSClient\counters.defs ↵

for counters definitions. Language code : 0x0419NSClient has stopped

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

nchars = vsnprintf (str, size, fmt, ap);

nchars = vsprintf (str, fmt, ap);

âèðòóàëüíîé ïàìÿòè"NT4_MemoryCommitByte = "\Ïàìÿòü\Áàéò âûäåëåííîé ↵

âèðòóàëüíîé ïàìÿòè"

W2K_SystemTotalProcessorTime = "\Ïðîöåññîð(_Total) ↵\% çàãðóæåííîñòè ïðîöåññîðà"

W2K_SystemSystemUpTime = "\Ñèñòåìà\Âðåìÿ ðàáîòû ñèñòåìû"W2K_MemoryCommitLimit = "\Ïàìÿòü\Ïðåäåë âûäåëåííîé ↵

âèðòóàëüíîé ïàìÿòè"W2K_MemoryCommitByte = "\Ïàìÿòü\Áàéò âûäåëåííîé ↵

âèðòóàëüíîé ïàìÿòè"

Page 19: 008 Системный Администратор 07 2003

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

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

Смотрится такое сборище вопросов весьма забавно.Жаль, но для нас такие данные абсолютно бесполезны.После работы над ошибками, возвратившись в главнуюдиректорию дистрибутива, проводим конфигурирование,сборку и инсталляцию.

Стоит отметить тот факт, что для компиляции исполь-зуется gmake вместо стандартной утилиты make. Иначесборка сразу же после старта заканчивается сообщени-ем о фатальной ошибке:

По завершению инсталляции приступаем к созданиюновых команд, пользуясь которыми Nagios будет собиратьданные. Описание всех используемых команд должнорасполагаться в файле checkcommands.cfg. Формат это-го файла довольно прост.

Каждая команда начинается с открывающего тегаdefine command{. Затем с помощью ключевого словаcommand_name определяется имя команды. Следующаястрока command_line определяет имя модуля, вызывае-мого для осуществления проверки и параметры, переда-ваемые ему процессом Nagios. Особое внимание следу-ет обратить на макросы подстановки значений $USER1$,$HOSTADDRESS$, $ARG1$, $ARG2$.

Давайте посмотрим, зачем нужен каждый из них:� $USER1$ – путь, где нужно искать выполняемые моду-

ли. В нашем случае он равен /usr/local/nagios/libexec/.Значение этого макроса определяется в файлеresource.cfg;

� $HOSTADDRESS$ – IP-адрес машины, подвергаемойпроверке. Задается в определении сервисов внутрифайла services.cfg;

� $ARG1$, $ARG2$ – параметры командной строки, пе-редаваемые модулю проверки. Чаще всего использу-ются для задания временных интервалов, порогов пре-дупреждений и критических состояний.

Завершается определение команды с помощью зак-рывающего тега }. Итак, приступим к разбору содержи-мого файла checkcommands.cfg.

# cd ..# ./configure --prefix=/usr/local/nagios ↵

--with-nagios-user=nagios --with-nagios-grp=nagios# gmake all# gmake install

Making all in plugins“/tmp/nagiosplug-1.3-beta1/plugins/Makefile”, line 760: ↵

Need an operatormake: fatal errors encountered – cannot continue*** Error code 1

После того как с файлом команд покончено, перей-дем к файлу сервисов. Детально формат этого файларассматривался в первой статье о Nagios. Здесь мы только

# Îïðåäåëÿåì êîìàíäó check_nt_cpuload . Èñïîëüçîâàòüñÿ îíà# áóäåò äëÿ ñáîðà äàííûõ î çàãðóæåííîñòè ïðîöåññîðàdefine command{

command_name check_nt_cpuloadcommand_line $USER1$/check_nt -H $HOSTADDRESS$ ↵

-v CPULOAD -l $ARG1$ -s $ARG2$}

# Êîìàíäà check_nt_memuse. Ïîêàçûâàåò äàííûå îá èñïîëüçîâàíèè# ïàìÿòè. Èìååòñÿ â âèäó âèðòóàëüíàÿ ïàìÿòü.define command{

command_name check_nt_memusecommand_line $USER1$/check_nt -H $HOSTADDRESS$ ↵

-v MEMUSE -w $ARG1$ -c $ARG2$ -s $ARG3$}

# Êîìàíäà check_nt_uptime. Îòîáðàæàåò âðåìÿ ðàáîòû ñèñòåìû# ñ ìîìåíòà ïîñëåäíåé ïåðåçàãðóçêèdefine command{

command_name check_nt_uptimecommand_line $USER1$/check_nt -H $HOSTADDRESS$ ↵

-v UPTIME -s $ARG1$}

# Êîìàíäà check_nt_disk_space. Îòîáðàæàåò ðàçìåð ñâîáîäíîãî# ïðîñòðàíñòâà íà ëþáîì æåñòêîì äèñêå ñèñòåìûdefine command{

command_name check_nt_disk_spacecommand_line $USER1$/check_nt -H $HOSTADDRESS$ ↵

-v USEDDISKSPACE –l $ARG1$ -w $ARG2$ ↵-c $ARG3$ -s $ARG4$

}

# Îïèñûâàåì êîìàíäó check_nt_service. Ïîçâîëÿåò ïðîâåðèòü,# çàïóùåí ëè â ñèñòåìå òîò èëè èíîé ñåðâèñ. Îáðàòèòå âíèìàíèå# íà íåîáÿçàòåëüíóþ îïöèþ -d SHOWALL, ïîçâîëÿþùóþ âûâåñòè# áîëåå ïîäðîáíûå äèàãíîñòè÷åñêèå ñîîáùåíèÿ.define command{

command_name check_nt_servicecommand_line $USER1$/check_nt -H $HOSTADDRESS$ ↵

-v SERVICESTATE -d SHOWALL –l $ARG1$ ↵-s $ARG2$

}

# Ñàìàÿ ïðîñòàÿ èç âñåõ âûøåîïèñàííûõ êîìàíä# check_nt_client_version ïîçâîëÿåò óçíàòü âåðñèþ# ïðîãðàììû NSClient., ðàáîòàþùóþ â ñèñòåìådefine command{

command_name check_nt_client_versioncommand_line $USER1$/check_nt -H $HOSTADDRESS$ ↵

-v CLIENTVERSION –s $ARG1$}

# Êîìàíäà check_nt_file_age äàåò âîçìîæíîñòü ïðîâåðèòü âðåìÿ# ìîäèôèêàöèè ëþáîãî ôàéëà íà ëîêàëüíîé ìàøèíådefine command{

command_name check_nt_file_agecommand_line $USER1$/check_nt -H $HOSTADDRESS$ ↵

-v FILEAGE -l $ARG1$ -w $ARG2$ ↵-c $ARG3$ -s $ARG4$

}

# Îïðåäåëÿåì êîìàíäó check_nt_process. Ïðåäîñòàâëÿåò# ìåõàíèçì, ñ ïîìîùüþ êîòîðîãî ìîæíî óçíàòü, ñóùåñòâóåò ëè# â ñèñòåìå òîò èëè èíîé ïðîöåññ. Îáðàòèòå âíèìàíèå# íà íåîáÿçàòåëüíóþ îïöèþ -d SHOWALL, ïîçâîëÿþùóþ âûâåñòè# áîëåå ïîäðîáíûå äèàãíîñòè÷åñêèå ñîîáùåíèÿ î ñîñòîÿíèè# ïðîöåññà.define command{

command_name check_nt_processcommand_line $USER1$/check_nt -H $HOSTADDRESS$ ↵

-v PROCSTATE –d SHOWALL -l $ARG1$ -s $ARG2$}

# Êîìàíäà check_nt_counter äàåò âîçìîæíîñòü ïðîñìîòðåòü# ñîäåðæèìîå ëþáîãî ñ÷åò÷èêà ïðîèçâîäèòåëüíîñòè, è ïîýòîìó# ÿâëÿåòñÿ ñàìîé óíèâåðñàëüíîé èç âñåõ îïèñàííûõ êîìàíä.define command{

command_name check_nt_countercommand_line $USER1$/check_nt -H $HOSTADDRESS$ ↵

-v COUNTER -l $ARG1$ -w $ARG2$ ↵-c $ARG3$ -s $ARG4$

}

Memory usage: total:??????? Mb - used: ??????? Mb (???????%) ↵- free: ??????? Mb (???????%)

c:\ - total: ??????? Gb - used: ??????? Gb (???????%) ↵- free ??????? Gb (???????%)

CPU Load (1 min. 12???????

Page 20: 008 Системный Администратор 07 2003

18

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

рассмотрим формат строчки check_command, напрямуюсвязанной с обсуждавшимися ранее макросами и $ARG1$в частности.

В приведенной выше строке check_command – клю-чевое слово, check_nt_process – название макрокоман-ды, описанной с файле checkcommands.cfg. Все пара-метры, передаваемые макросам $ARG1$, $ARG2$,$ARG3$ и так далее, должны быть отделены друг от дру-га восклицательным знаком. Таким образом, выходит,что значение "calc.exe,notepad.exe,mspaint.exe" будет пе-редано в $ARG1$, а пароль PxRT890mY – в $ARG1$.

Определившись с синтаксисом, переходим к файлуservices.cfg:

# Íà íàøåì ñåðâåðå ðàáîòàþò íåñêîëüêî ñàìîäåëüíûõ ïðîãðàìì.# Îíè äîëæíû âûïîëíÿòüñÿ êðóãëîñóòî÷íî, ïîýòîìó ìû ñîçäàëè# ñëåäóþùèé ñåðâèñ.# Äëÿ ïðèìåðà áóäóò èñïîëüçîâàòüñÿ îáùåäîñòóïíûå ïðîãðàììû# «Êàëüêóëÿòîð», «Paint», «Áëîêíîò», ïîñòàâëÿþùèåñÿ# ñ êàæäûì äèñòðèáóòèâîì Windows.define service{use generic-servicehost_name win2000russervice_description User Programsis_volatile 0check_period 24x7max_check_attempts 3normal_check_interval 1retry_check_interval 1contact_groups win-adminsnotification_interval 120notification_period 24x7notification_options c,r# Îáðàòèòå âíèìàíèå íà òîò ôàêò, ÷òî ìû ñëåäèì íå çà ñàìèìè# ïðîãðàììàìè, à çà èõ ïðîöåññàìè â ïàìÿòè. Èìåíà ïðîöåññîâ# ìîæíî óçíàòü ñ ïîìîùüþ âñòðîåííîãî â Windows ñòàíäàðòíîãî# äèñïåò÷åðà çàäà÷. Òàêæå ñòîèò âíèìàòåëüíî ïðèñìîòðåòüñÿ# ê ôîðìàòó ñïèñêà ïðîöåññîâ.check_command check_nt_process!"calc.exe,notepad.exe, ↵

mspaint.exe"!PxRT890mY}

# Ýòîò ñåðâèñ ïîêàçûâàåò âåðñèþ ïðîãðàììû NSClient,# ðàáîòàþùåé â ñèñòåìå.define service{use generic-servicehost_name win2000russervice_description NSClient Versionis_volatile 0check_period 24x7max_check_attempts 3normal_check_interval 1retry_check_interval 1contact_groups win-adminsnotification_interval 120notification_period 24x7notification_options c,r# Ôîðìàò êîìàíäû î÷åíü ïðîñòîé.  $ARG1$ ïåðåäàåòñÿ ïàðîëücheck_command check_nt_client_version!PxRT890mY}

# Êàæäûé ÷àñ óäàëåííûé ñåðâåð áàçû äàííûõ êëàäåò â ëîêàëüíóþ# ïàïêó îáùåãî äîñòóïà c:\upload\ ôàéë update.dbf.  ýòîì# ôàéëå íàõîäÿòñÿ îáíîâëåíèÿ áàçû äàííûõ.# Åñëè âðåìÿ ñîçäàíèÿ ôàéëà íå ìåíÿåòñÿ áîëüøå, ÷åì 70 ìèíóò,# çíà÷èò, ïðîèñõîäèò ÷òî-òî íåõîðîøåå, è íóæíî ïåðåéòè# â ñîñòîÿíèå ïðåäóïðåæäåíèÿ.#  ñëó÷àå, êîãäà íåò èçìåíåíèé â òå÷åíèè 90 ìèíóò, ñåðâèñ# ïåðåõîäèò â êðèòè÷åñêîå ñîñòîÿíèå.define service{use generic-servicehost_name win2000russervice_description File ageis_volatile 0check_period 24x7

max_check_attempts 3normal_check_interval 1retry_check_interval 1contact_groups win-adminsnotification_interval 120notification_period 24x7notification_options c,r# Âñå ïóòè ê ôàéëàì äîëæíû ñîäåðæàòü äâîéíîé ñèìâîë «\».check_command check_nt_file_age!"c:\\upload\\update.dbf ↵

"!70!90!PxRT890mY}

# Ýòîò ñåðâèñ ïîêàçûâàåò êîëè÷åñòâî ñâîáîäíîé âèðòóàëüíîé# ïàìÿòè, êîòîðîå âû÷èñëÿåòñÿ òàêèì îáðàçîì.# NSClient ÷èòàåò ñîäåðæèìîå ñ÷åò÷èêà# «\Ïàìÿòü\Ïðåäåë âûäåëåííîé âèðòóàëüíîé ïàìÿòè»# è äåëèò åãî íà 100. Òàê ïîëó÷àåòñÿ âåëè÷èíà, ïîêàçûâàþùàÿ,# ñêîëüêî áàéò ïàìÿòè ïðèíèìàåòñÿ çà îäèí ïðîöåíò.# Çàòåì äàííûå èç ñ÷åò÷èêà# «\Ïàìÿòü\Áàéò âûäåëåííîé âèðòóàëüíîé ïàìÿòè»# äåëÿòñÿ íà êîëè÷åñòâî áàéò â îäíîì ïðîöåíòå.# Òàê ìû óçíàåì, ñêîëüêî ïðîöåíòîâ çàíÿòî.# Ê ñ÷àñòüþ, ëè÷íî çàíèìàòüñÿ ïîäîáíûìè îïåðàöèÿìè# íåò íåîáõîäèìîñòè. NSClient ñäåëàåò âñå ñàì.define service{use generic-servicehost_name win2000russervice_description Free Memoryis_volatile 0check_period 24x7max_check_attempts 3normal_check_interval 1retry_check_interval 1contact_groups win-adminsnotification_interval 120notification_period 24x7notification_options c,r# Ïåðåõîä â ñîñòîÿíèå ïðåäóïðåæäåíèÿ ïðîèñõîäèò, åñëè çàíÿòî# 70% ïàìÿòè. Êðèòè÷åñêèé ñòàòóñ íàñòóïàåò, êîãäà# èçðàñõîäîâàíî 90% ïàìÿòè.check_command check_nt_memuse!70%!90%!PxRT890mY }

# Ýòîò ñåðâèñ ïîçâîëÿåò óâèäåòü çàãðóçêó ïðîöåññîðà.define service{use generic-servicehost_name win2000russervice_description CPU Loadis_volatile 0check_period 24x7max_check_attempts 3normal_check_interval 1retry_check_interval 1contact_groups win-adminsnotification_interval 120notification_period 24x7notification_options c,r# Íàãðóçêà ñ÷èòàåòñÿ â èíòåðâàëå çà îäíó ìèíóòó. Ïåðåõîä# â ñîñòîÿíèå ïðåäóïðåæäåíèÿ ïðîèñõîäèò ïðè äîñòèæåíèè óðîâíÿ# â 80%, à êðèòè÷åñêèé ñòàòóñ íàñòóïàåò, åñëè çàãðóçêà 90%# è áîëåå. Âñå ýòè õàðàêòåðèñòèêè çàäàþòñÿ öèôðàìè 1, 80, 90.check_command check_nt_cpuload!1,80,90!PxRT890mY }

# Âðåìÿ áåñïåðåáîéíîé ðàáîòû ñèñòåìû ñ ìîìåíòà ïîñëåäíåé# ïåðåçàãðóçêè.define service{use generic-servicehost_name win2000russervice_description Up timeis_volatile 0check_period 24x7max_check_attempts 3normal_check_interval 1retry_check_interval 1contact_groups win-adminsnotification_interval 120notification_period 24x7notification_options c,rcheck_command check_nt_uptime!PxRT890mY }

# Ïðîâåðÿåì, ôóíêöèîíèðóåò ëè ñåðâèñ MS SQL SERVER# è ñàìîïèñíûé ñåðâèñ vmxposman.

check_command check_nt_process!"calc.exe,notepad.exe, ↵mspaint.exe"!PxRT890mY

Page 21: 008 Системный Администратор 07 2003

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

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

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

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

Вот тут-то нас и поджидает проблема. Дело в том, что вбольшинстве Unix-подобных систем для символов русско-го языка используется кодировка KOI8-R. Конечно, можноперенастроить консоль, на которой работаете под cp1251,но такой подход лично мне кажется неудобным.

Поэтому я поступил гораздо проще. Используя FTP,перенес файл checkcommands.cfg на Windows-машину.Затем с помощью стандартного редактора «Блокнот» внестребуемые изменения. Сохранился, перенес файл обрат-но на Unix-машину и заменил старую копию в /usr/local/nagios/etc/.

В принципе нужного результата можно добиться раз-ными путями. Немного подумав, я решил сделать это дру-гим более простым способом. Набрал все нужные рус-скоязычные надписи в формате koi8-r. Из пакетов уста-новил несколько программ для конвертирования текстовв разные кодировки:

После тестирования выяснилось, что удобнее всегоиспользовать утилиту ru-mtc.

Для конвертирования нужно выполнить такую после-довательность команд:

Теперь осталось только заставить Nagios перечитатьфайлы конфигурации:

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

define service{use generic-servicehost_name win2000russervice_description CPU Loadis_volatile 0check_period 24x7max_check_attempts 3normal_check_interval 1retry_check_interval 1contact_groups win-adminsnotification_interval 120notification_period 24x7notification_options c,r# Ïðîáëåìà â òîì, ÷òî â ïðîãðàììå óïðàâëåíèÿ ñåðâèñàìè# Windows ïîêàçûâàåò ïîëíûå íàçâàíèÿ ñåðâèñîâ,# ïðåäíàçíà÷åííûå äëÿ ÷åëîâåêà.# Íàì íóæíî íàçâàíèå, êîòîðîå èñïîëüçóåòñÿ äëÿ âíóòðåííèõ íóæä# Windows. Óçíàòü ýòó òàéíó ìîæíî ëèáî ïîñìîòðåâ âåòâü ðååñòðà:# HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services.,# ëèáî óñòàíîâèâ áåñïëàòíóþ óòèëèòó 'Service Manager NT',# äîñòóïíóþ äëÿ ñêà÷èâàíèÿ ïî ñëåäóþùåìó àäðåñó: http://www# rnks.informatik.tu-cottbus.de/~fsch/english/nttols.htm# Îáðàòèòå âíèìàíèå íà òîò ôàêò, ÷òî ïî àíàëîãèè ñ ïðîöåññàìè# èìåíà ñåðâèñîâ òîæå ìîæíî ïåðå÷èñëÿòü ÷åðåç çàïÿòóþ.check_command check_nt_service!”mssqlserver,vmxposman” }

# Ñëåäèì çà êîëè÷åñòâîì çàäàíèé, íàõîäÿùèõñÿ# â î÷åðåäè ïðèíòåðà.define service{use generic-servicehost_name win2000russervice_description Print Queueis_volatile 0check_period 24x7max_check_attempts 3normal_check_interval 1retry_check_interval 1contact_groups win-adminsnotification_interval 120notification_period 24x7notification_options c,r# Èñïîëüçóÿ êîìàíäó check_nt_counter, ìîæíî ïîëó÷èòü äàííûå# ñ ëþáîãî ñ÷åò÷èêà.  äàííûì ñëó÷àå –# \Î÷åðåäü ïå÷àòè(_Total)\Çàäàíèé# Ñòðîêà «%.0f job(s)» óêàçûâàåò ìîäóëþ ïðèìåíèòü ê ðåçóëüòàòó# ïðåîáðàçîâàíèå ê òèïó float è âûâåñòè ÷èñëî â ôîðìàòå# ñ òî÷íîñòüþ íîëü çíàêîâ ïîñëå çàïÿòîé.# Çàòåì ê ÷èñëó äëÿ íàãëÿäíîñòè äîáàâëÿåòñÿ ñòðîêà «job(s)».# Åñëè âàì íåïîíÿòíî, ÷òî ýòî çíà÷èò, – ïîñìîòðèòå# äîêóìåíòàöèþ ïî ôóíêöèè printf ( ) ÿçûêà Ñ.# Ïåðåõîä â ñîñòîÿíèå ïðåäóïðåæäåíèÿ ïðîèñõîäèò# ïðè íàêîïëåíèè 5 çàäàíèé, à êðèòè÷åñêèé ñòàòóñ# íàñòóïàåò, åñëè èõ ñòàíîâèòñÿ 10 è áîëåå.check_command check_nt_counter! ↵

"\Î÷åðåäü ïå÷àòè(_Total)\Çàäàíèé", ↵"%.0f job(s)"!5!10!PxRT890mY

}

# Ïðîâåðÿåì ïðîöåíò èñïîëüçîâàíèÿ ôàéëà ïîäêà÷êèdefine service{use generic-servicehost_name win2000russervice_description Paging Fileis_volatile 0check_period 24x7max_check_attempts 3normal_check_interval 1retry_check_interval 1contact_groups win-adminsnotification_interval 120notification_period 24x7notification_options c,r# Òóò ìû ñíîâà èñïîëüçóåì check_nt_counter, õîòÿ è íåìíîãî# äðóãèì ñïîñîáîì.# Ñòðîêà «Usage %.2f %%» óêàçûâàåò ìîäóëþ ïðèìåíèòü# ê ðåçóëüòàòó ïðåîáðàçîâàíèå ê òèïó float è âûâåñòè ÷èñëî# â ôîðìàòå ñ òî÷íîñòüþ äâà çíàêà ïîñëå çàïÿòîé.# Çàòåì äëÿ íàãëÿäíîñòè ïðèêëåèâàåì ñïåðåäè ñòðîêó «Usage».# Îáðàòèòå âíèìàíèå íà äâîéíîé çíàê «%» â ñòðîêå# ôîðìàòèðîâàíèÿ.# Ñíîâà âñïîìíèâ õîðîøèìè ñëîâàìè ôóíêöèþ printf ( ),# ïîíèìàåì, ÷òî â ðåçóëüòàòå èç äâóõ ïîëó÷èòñÿ îäèí ñèìâîë «%».# Ïåðåõîä â ñîñòîÿíèå ïðåäóïðåæäåíèÿ ïðîèñõîäèò ïðè äîñòèæåíèè# óðîâíÿ â 80 ïðîöåíòîâ, à êðèòè÷åñêèé ñòàòóñ íàñòóïàåò,# åñëè ôàéë ïîäêà÷êè çàïîëíåí íà 90 è áîëåå ïðîöåíòîâ.

siconv-0.2.1fconv-1.1ru-xcode-1.0ru-dt1489-1.4ru-mtc-1.3

# cat checkcommands.cfg | mtc –f koi8 ↵–t win 1251 > checkcommands.tmp

# mv checkcommands.tmp checkcommands.cfg

# /usr/local/etc/rc.d/nagios.sh restart

check_command check_nt_counter! ↵"\Ôàéë ïîäêà÷êè(_Total)\% èñïîëüçîâàíèÿ", ↵"Usage %.2f %%"!80%!90%!PxRT890mY

}

Page 22: 008 Системный Администратор 07 2003

20

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

ДЕНИС ПЕПЛИН

Page 23: 008 Системный Администратор 07 2003

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

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

Знакомство с системой зачастую начинается с ее уста-новки и настройки, причем эти два процесса обычно со-вмещены. Для систем Unix настройка сводится к созда-нию текстовых файлов конфигурации. В FreeBSD основ-ная работа идет над файлом /etc/rc.conf, который являет-ся частью системы стартовых скриптов /etc/rc*.

Настроить систему после установки можно путем за-пуска /stand/sysinstall или вручную. Оба способа хороши,а первый к тому же лишен недостатка большинства про-грамм автоматической настройки: уже заданные парамет-ры не перезаписываются, а добавляются в конец файла/etc/rc.conf, где их можно затем отредактировать под соб-ственные нужды или вообще удалить, чтобы вернуться кнастройкам по умолчанию.

Многие, казалось бы, сложные вещи, которые мо-гут поставить новичка в тупик, в FreeBSD делаютсяпутем добавления пары строк в этот файл. Чтобы небыть голословным, приведу пример настройки шлюзав Интернет для локальной сети с частными адресами(192.168.0.0/24) на внутреннем интерфейсе и NAT навнешнем, кэширующим DNS-сервером и SSH для уда-ленного управления всем этим хозяйством. Хотя это несамый простой пример, конфигурация умещается все-го на 11 строчках:

Такая лаконичность достигается благодаря тому, чтопараметры по умолчанию хранятся в /etc/defaults/rc.conf,а строки из /etc/rc.conf лишь изменяют и дополняют этипараметры. Редактировать файл с параметрами поумолчанию не нужно (это только усложнит последую-щие обновления), но вот просмотреть его хотя бы разбудет полезно.

Строки rc.conf означают не что иное, как установкупеременных Bourne shell (/bin/sh). Когда в процессе заг-рузки системы init запускает скрипт /etc/rc, одним изпервых его действий становится установка параметровнастройки:

В данном случае перезаписыванием параметров поумолчанию занимается функция source_rc_confs (рас-положенная в /etc/defaults/rc.conf), которая и включает/etc/rc.conf, /etc/rc.conf.local или любые другие файлыиз списка, определенного в переменной rc_conf_files.Конструкция эта могла бы быть несколько проще, но ис-пользуемая функция уже содержит «защиту от дурака»,поскольку некоторые пользователи считают удобным

копировать /etc/defaults/rc.conf в /etc/rc.conf, что без та-кой защиты привело бы к зацикливанию.

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

Начиная с FreeBSD 5.x, содержимое это поменялосьпочти полностью: из NetBSD были заимствованы скрип-ты «нового поколения» /etc/rc.d. После некоторой паузы,потребовавшейся на тестирование новых скриптов, ста-рые были убраны. Наиболее важные из оставшихся в /etcскриптов и файлы конфигурации:� rc – запускается init при загрузке системы.� rc.shutdown – запускается init при останове системы.� rc.subr – часть системы, импортированной из NetBSD.� rc.firewall – предназначен для настройки ipfw и natd.� rc.conf – содержит настройки системы, переписываю-

щие параметры по умолчанию.� rc.conf.local – специфичные для хоста настройки. Если

используется этот файл, rc.conf может быть общим длягруппы хостов.

� rc.local – все еще поддерживается для запуска локаль-ных сервисов. Вместо него рекомендуется использо-вать скрипты /usr/local/etc/rc.d.

Для редактирования предназначены только скриптrc.firewall и файлы конфигурации. Ситуация, в которойпотребовалось бы приспосабливать к своей системе ос-тальные скрипты, возникнуть не должна (по крайней мере,теоретически). Если она все же возникла – сообщите обэтом разработчикам.

Принципиальное отличие скриптов нового поколения –поддержка параметров запуска. По сравнению со скрип-тами из /usr/local/etc/rc.d список этих параметров суще-ственно расширен. К минимальному набору (start|stop)добавились:� restart – последовательно stop и start.� reload – перегружает процесс, посылая ему сигнал.� status – показывает статус процесса.� poll – ждет завершения процесса.� rcvar – показывает соответствующие переменные

rc.conf.

Параметры status, reload и poll реализуются только втом случае, если скрипт запускает какой-либо процесс.

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

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

sshd_enable="YES"ifconfig_rl0="inet 123.123.123.2 netmask 0xfffffff0"ifconfig_rl1="inet 192.168.0.1 netmask 0xffffff00"hostname="example.com"defaultrouter="123.123.123.1"firewall_type="OPEN"firewall_enable="YES"gateway_enable="YES"natd_enable="YES"natd_interface="rl0"named_enable="YES

if [ -r /etc/defaults/rc.conf ]; then. /etc/defaults/rc.confsource_rc_confs

elif [ -r /etc/rc.conf ]; then. /etc/rc.conf

fi

Page 24: 008 Системный Администратор 07 2003

22

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

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

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

К тому же запуск вручную не всегда тривиален: к приме-ру, для запуска NFS сервера в FreeBSD 4.x так, как это про-исходит при установке параметра nfs_server_enable=«YES»в rc.conf, потребуются следующие команды:

В FreeBSD 5.x достаточно добавить эту переменную ивыполнить команду:

Очевидно, это гораздо проще и к тому же проверенана правильность соответствующая переменная. В приме-ре с NFS в обеих случаях сначала необходимо подгото-вить файл /etc/exports (man exports(5)).

Другие параметры также достаточно интересны: на-пример, status поможет узнать, какие процессы запуще-ны в данный момент, а rcvar – познакомиться со скрипта-ми поближе:

Для стартовых скриптов системы, в отличие от локаль-ных скриптов в /usr/local/etc/rc.d, очень важен порядок за-пуска. Локальные скрипты не имеют механизма реализа-ции зависимостей и определения порядка запуска. Онистартуют в алфавитном порядке и если необходимо, что-бы какой-то скрипт стартовал раньше, нужно «повысить»его место по алфавиту. Обычно перед именем скриптадобавляют пару-тройку нулей.

Зависимости и определение порядка запуска в сис-темных стартовых скриптах FreeBSD 5.x реализуются спомощью rcorder(8).

Эта программа использует специальные ключевыеслова, содержащиеся в каждом скрипте: REQUIRE,PROVIDE, BEFORE, KEYWORD. Для оболочки строки, со-держащие эти слова, являются комментариями. Вот при-мер блока ключевых слов /etc/rc.d/nfsd (все пробелы обя-зательны):

Этот скрипт предоставляет сервис nfsd, требует пред-варительного запуска mountd и работает в FreeBSD иNetBSD.

Должен быть хотя бы один скрипт без ключевого сло-ва REQUIRE, чтобы rcorder мог определить первый стар-товый скрипт. Например, /etc/rc.d/devd содержит сле-дующий блок:

Ключевое слово BEFORE помогает определить последую-щие скрипты (в которых анализируется строка «# PROVIDE:disks»).

В FreeBSD правильную последовательность скриптоввыдает следующая команда:

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

Таких скриптов всего четыре: NETWORKING, SERVERS,DAEMON, LOGIN (man rc(8)). Они используются толькоrcorder, для sh это всего лишь набор комментариев. Ос-тальные скрипты делятся по признаку наличия или отсут-ствия расширения «.sh». Если расширение присутствует,скрипт запускается в текущей оболочке.

В локальных скриптах поддержка параметров реали-зуется с помощью конструкции case. Параметр start пред-полагает запуск программы, stop – отправку ему сигна-ла TERM. Любой другой параметр – вывод краткой справ-ки по параметрам. Шаблон локального скрипта выгля-дит так (man rc(8)):

Реализация таким методом большего числа парамет-ров потребует соответствующего числа ключевых слов вcase и множества довольно тривиального и одинаковогодля всех скриптов кода (более сложного, чем в приведен-ном примере). Видимо, разработчикам NetBSD такое ре-шение изящным не показалось и вся функциональностьстартовых скриптов нового поколения была реализованав отдельном скрипте (/etc/rc.subr). Вот шаблон простей-шего скрипта «нового поколения».

# portmap# mountd -r# nfsd# rpc.statd

# /etc/rc.d/nfsd start

# for i in /etc/rc.d/*; do $i status 2>/dev/null; done# for i in /etc/rc.d/*; do echo $i; $i rcvar 2>/dev/null; ↵

echo; done

# PROVIDE: devd# BEFORE: disks# KEYWORD: FreeBSD

# rcorder -k FreeBSD -s nostart /etc/rc.d/* 2>/dev/null

#!/bin/sh -case "$1" instart)

/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

# PROVIDE: nfsd# REQUIRE: mountd# KEYWORD: FreeBSD NetBSD

Page 25: 008 Системный Администратор 07 2003

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

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

Функционально этот скрипт превосходит предыдущийза счет добавления новых параметров (и к тому же, бла-годаря параметрам rcorder, он «знает свое место»). Ви-зуально он делится на четыре части: ключевые слова,включение /etc/rc.subr, переменные и запуск функцийиз включенного rc.subr. Между переменными и запус-ком функций rc.subr могут быть включены собственныефункции скрипта. В скрипт могут быть помещены пе-ременные argument_cmd. Слово argument означает па-раметр запуска. Если запустить любой из стартовыхскриптов без параметров, он выдаст информацию при-мерно в таком виде:

Параметрами скрипта могут быть start, faststart,forcestart, stop, faststop... и соответственно переменнаяargument_cmd на самом деле означает набор start_cmd,stop_cmd...

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

Не менее интересен может быть просмотр перемен-ных вместе с их значениями:

В man rc.subr(8) дано описание всех используемыхфункций и переменных.

Задаваемые в стартовых скриптах переменные ис-пользуются функцией run_rc_command. Вот список этихпеременных в сокращенном виде:� name – имя скрипта. Указывается в обязательном по-

рядке.� rcvar – значение переменной, имя которой помещено

в rcvar, берется из rc.conf и проверяется с помощьюcheckyesno. Истинными считаются значения «YES»,«TRUE», «ON» или «1». Ложными «NO», «FALSE»,«OFF» или «0».

� command – полный путь к команде. Переменная не нуж-на, если для каждого поддерживаемого параметрауказана переменная argument_cmd.

� command_args – опциональные аргументы и/или ди-рективы оболочки.

� command_interpreter – командный интерпретатор, с по-мощью которого запускается command.

� extra_commands – дополнительные параметры за-пуска.

� pidfile – полный путь к файлу PID. Если эта перемен-ная установлена, для проверки процесса использу-ется check_pidfile $pidfile $procname. Иначе, если ус-тановлена переменная command, используетсяcheck_process $procname.

� procname – имя процесса для проверки. По умолча-нию – procname.

� required_dirs – проверка на наличие директории передстартом программы.

� required_files – проверка на читаемость файлов.� required_vars – проверка переменной с помощью

checkyesno.� ${name}_chdir – каталог, в который нужно войти перед

запуском command, если нет – ${name}_chroot.� ${name}_chroot – каталог для запуска chroot(8) перед

запуском command.� ${name}_flags – эта переменная используется для пе-

резаписи соответствующей переменной из rc.conf.� ${name}_nice – устанавливает уровень nice(1) перед за-

пуском command.� ${name}_user – пользователь, под которым запускается

command. Если установлена переменная ${name}_chroot,используется chroot(8), иначе – su(1).

� ${name}_group – группа для запуска command в chroot.� ${name}_groups – разделенный запятыми список групп

для запуска в chroot.� argument_cmd – перезаписывает действие по умол-

чанию.� argument_precmd – выполняется перед argument_cmd или

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

� argument_postcmd – выполняется, если argument_cmdили действие по умолчанию успешно выполнены.

� sig_stop – сигнал, который посылается процессу дляего завершения вместо SIGTERM.

� sig_reload – сигнал, который посылается процессу дляперезагрузки вместо SIGHUP.

Префикс fast означает отсутствие проверки запущен-ных процессов перед запуском нового и установку пере-менной rc_fast=YES, а префикс force – установку пере-менной rc_force=YES и игнорирование статуса заверше-ния argument_precmd.

В отличие от локальных скриптов, для работы скрипта«нового поколения» в rc.conf должна быть помещена пе-ременная, имя которой определяется значением rcvar.Кроме того, туда же можно поместить и дополнительныепеременные, например ${name}_flags.

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

#!/bin/sh## PROVIDE: prog# REQUIRE: before_prog# BEFORE: after_prog# KEYWORD: FreeBSD

. /etc/rc.subr

name="prog"rcvar=`set_rcvar`command="/usr/local/bin/prog"

load_rc_config $namerun_rc_command "$1"

Usage: /etc/rc.d/prog ↵[fast|force](start|stop|restart|rcvar|reload|status|poll)

$ cat /etc/rc.d/[a-z]* | egrep "^[a-z]+_?[a-z]+=.*$" ↵| awk -F= '{print $1}' | sort -u | less

$ cat /etc/rc.d/[a-z]* | egrep "^[a-z]+_?[a-z]+=.*$" ↵| sort -u | less

Page 26: 008 Системный Администратор 07 2003

24

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

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

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

Page 27: 008 Системный Администратор 07 2003

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

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

Сервис Telnet обеспечивает базовую эмуляцию термина-лов удаленных систем, поддерживающих протокол Telnetнад протоколом TCP/IP. Обеспечивается эмуляция терми-налов Digital Equipment Corporation VT 100, DigitalEquipment Corporation VT 52, TTY. Любые команды, вы-полняемые с помощью Telnet, обрабатываются telnet-сер-вером, а не локальным компьютером. Пользователь лишьвидит результат выполнения этих команд.

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

Сервис Telnet был и остается одним из самых попу-лярных способов удаленной регистрации и работы на уда-ленной машине. Основным его недостатком является то,что любая информация, в том числе и пароли, передает-ся в открытом виде без какого-либо кодирования.

SSH (Secure Shell) – программа, позволяющая вам за-регистрироваться на удаленных компьютерах и устано-вить зашифрованное соединение. Существует также «бе-зопасная» версия telnet – stelnet.

SSH использует криптографию открытого ключа дляшифрования соединения между двумя машинами, а так-же для опознавания пользователей. Оболочку ssh можноиспользовать для безопасной регистрации на удаленномсервере или копировании данных между двумя машина-ми, в то же время предотвращая атаки путем присоеди-нения посредине (session hijacking) и обманом сервераимен (DNS spoffing).

Оболочка Secure Shell поддерживает следующие ал-горитмы шифрования:� BlowFish – это 64-разрядная схема шифрования. Этот

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

� Тройной DES (Data Encryption Standard) – стандарт дляшифрования данных. Данный алгоритм довольно ста-рый, поэтому не рекомендуется его использовать.Обычно DES используется для шифрования несекрет-ных данных.

� IDEA (International Data Encryption Algorithm) – между-народный алгоритм шифрования информации. Этоталгоритм работает со 128-разрядным ключом и поэто-му он более защищен, чем BlowFish и DES.

� RSA (Rivest-Shamir-Adelman algorithm) – алгоритм Ри-веста-Шамира-Адельмана. Представляет собой схемушифрования с открытым и секретным ключами.

При выборе алгоритма шифрования нужно исходитьиз конфиденциальности информации, которую вам нуж-но передать. Если информация секретна, лучше исполь-зовать алгоритмы IDEA или RSA. Если же вы просто нехотите передавать данные в открытом виде, используйтеалгоритм BlowFish, поскольку он работает значительно бы-стрее, чем DES.

Оболочка ssh очень эффективна против анализаторовпротоколов, так как она не только шифрует, но и сжимаеттрафик перед его передачей на удаленный компьютер.

Программу ssh можно скачать по адресу http://www.cs.hut.fi/ssh/. Версия ssh для UNIX распространяетсябесплатно, а за Windows-версию (имеется в виду клиентдля Windows) нужно заплатить.

Оболочка ssh незаменима в тех случаях, когда уда-ленно нужно администрировать сервер или когда серверне имеет собственного монитора. При использованииtelnet все данные, которые передаются через telnet-соеди-нение, доступны в открытом виде. А значит, имена пользо-вателей и пароли будут доступны всем, кто прослушива-ет трафик с помощью анализатора. SSH выполняет шиф-рование, используя несколько различных алгоритмов,включая DES и 3DES.

Программа состоит из демона sshd, который запуска-ется на Linux/UNIX-машине, и клиента ssh, который рас-пространяется как для Linux, так и для Windows. Чтобыустановить ssh, возьмите исходные тексты и поместитеих по традиции в каталог /usr/src/. Затем распакуйте ар-хив и установите программу, выполнив следующую пос-ледовательность действий:

Чтобы ssh начал работать, необходимо запустить де-мон sshd на той машине, к которой предполагается под-ключение. Желательно добавить команду запуска в сце-нарий загрузки системы для автоматического запуска.Демон sshd работает по 22 порту (см. листинг 1). Еслине ошибаюсь, ssh невозможно использовать вместе сxinetd/inetd – его нужно запускать подобно httpd-серверув режиме standalone.

Обычно с настройкой sshd не возникает никаких не-приятных моментов. Подробно о настройке sshd пого-ворим чуть позже. Теперь попробуйте зарегистриро-ваться на этой машине через ssh. Для этого нужно ус-тановить этот же пакет на другую машину под управле-нием Linux/UNIX (или установить Windows-клиент ssh)и ввести команду:

ssh запросит вас ввести пароль пользователя. В каче-стве имени пользователя для установки соединения бу-дет использовано имя текущего пользователя, то естьимя, под которым вы сейчас зарегистрированы в сис-теме. В случае если аутентификация пройдет успеш-но, начнется сеанс связи. Прекратить сеанс можно ком-бинацией клавиш Ctrl+D. Если вам нужно указать дру-гое имя пользователя, используйте параметр -l програм-мы ssh:

cd /usr/src/tar xzf ssh-2.4.0.tar.gzcd ssh-2.4.0./configuremakemake install

Ëèñòèíã 1. Ôðàãìåíò ôàéëà /etc/servicesssh 22/tcp # SSH Remote Login Protocolssh 22/udp # SSH Remote Login Protocol

$ ssh hostname.domain

ssh -l user hostname.ru

Page 28: 008 Системный Администратор 07 2003

26

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

Так можно указать программе ssh, от имени какогопользователя нужно регистрироваться на удаленной ма-шине (см. рис. 1).

При использовании Windows-клиента имя компьюте-ра, имя пользователя и пароль нужно ввести в диалого-вом окне программы. Если соединение не устанавлива-ется, попробуйте выбрать метод кодирования blowfish.Если и это не поможет, выберите 3DES. Работа в ssh ана-логична работе в telnet. Вы можете администрироватьудаленную машину также легко, как и локальную.

Оболочка ssh использует два файла конфигурацииssh_conf и sshd_conf. Думаю, что нет смысла говорить отом, что они находятся в директории /etc/ssh. Рекомен-дую в файле sshd_conf прописать следующую строчку:

Это означает, что доступ по ssh может быть выполнентолько с машин с адресами 10.1.1.1, 10.1.2.1, 10.1.3.1. Этооградит ваш компьютер от нежелательных вторженийизвне. Программа stelnet во всем полностью аналогичнапрограмме telnet, но она выполняет шифрование трафи-ка, который передается во время telnet-соединения.

Демон sshd – это программа-демон для оболочки ssh.Обычно sshd запускается на машине, к которой подклю-чаются клиенты SSH. Последние версии демона sshd под-держивают две версии протокола SSH: SSH версия 1 иSSH версия 2.

Протокол SSH версия 1У каждого узла есть свой RSA-ключ (обычно 1024 бит),который используется для идентификации узла. Этот ключеще называется открытым. Дополнительно при запускедемона генерируется еще один RSA-ключ – ключ серве-ра (обычно 768 бит). Этот ключ создается заново каждыйчас и никогда не сохраняется на диске.

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

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

Протокол SSH версия 2Версия 2 работает аналогично: каждый узел имеет опре-деленный DSA-ключ, который используется для иденти-фикации узла. Однако при запуске демона ключ серверане генерируется. Безопасность соединения обеспечива-ется благодаря соглашению Диффи-Хелмана (Diffie-Hellman key agreement).

Сессия может кодироваться следующими методами:128-разрядный AES, Blowfish, 3DES, CAST128, Arcfour,192-разрядный AES или 256-разрядный AES.

Опции демона sshd указаны в таблице 1.Файл конфигурации демона /etc/ssh/sshd_config до-

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

Директива Port предназначена для указания порта,которые демон будет прослушивать (данная директивааналогична опции -p):

Следующая директива – это директива Protocol. С по-мощью этой директивы можно указать в порядке пред-почтения номера поддерживаемых протоколов SSH:

Такое определение директивы означает, что сначаласервер будет пытаться установить соединение с клиен-том по протоколу SSH версии 2, а потом – по протоколуSSH версии 1. Можно указать использование только од-ной версии протокола, например: Protocol 1. ДирективаListenAddress указывает локальный адрес, который дол-жен прослушивать демон.

Директива определяет файлы ключей. Файлами поумолчанию являются:

Директива ServerKeyBits определяет разрядность клю-ча сервера для протокола SSH первой версии. По умол-чанию используется 768-разрядный ключ (768 бит).

Директива LoginGraceTime аналогична опции -g : пре-доставляет клиенту дополнительное время, чтобы аутен-тифицировать себя. По умолчанию время равно 600 се-кундам. Если за это время клиент не смог аутентифици-ровать себя, соединение будет прекращено.

Директива KeyRegenerationInterval аналогична опции -k.

Ðèñ. 1. Ðåãèñòðàöèÿ íà óäàëåííîé ìàøèíå.

allowedadress 10.1.1.1 10.1.2.1 10.1.3.1

Port 22

Protocol 2,1

/etc/ssh/ssh_host_key/etc/ssh/ssh_host_rsa_key/etc/ssh/ssh_host_dsa_key

Page 29: 008 Системный Администратор 07 2003

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

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

Она определят время, спустя которое ключ сервера бу-дет создан заново. По умолчанию время составляет 3600секунд (1 час).

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

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

Описание остальных опций вы найдете в справочнойсистеме, введя команду man sshd. Ваши вопросы и ком-ментарии присылайте на [email protected].

Òàáëèöà 1. Îïöèè äåìîíà sshd.

PermitRootLogin yes

PasswordAuthentication yesPermitEmptyPasswords no

Page 30: 008 Системный Администратор 07 2003

28

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

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

IRC-CЕРВЕР

Page 31: 008 Системный Администратор 07 2003

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

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

Итак, вы администрируете небольшую локальную сеть. Такили иначе пользователям хочется общаться. Такие програм-мы, как lantalk, естественно, не подходят, потому что рассы-лают широковещательные пакеты по всей сети, что не естьхорошо. Выход – установка irc-сервера, который лишен оченьмногих недостатков и имеет массу преимуществ. Например,быстрота работы по сравнению с www-чатами – ведь клиен-ту не приходится грузить громоздкую страницу, чаще всегонаполненную всяческими баннерами; расходование меньше-го количества трафика, что не может не радовать. Суще-ствует несколько разновидностей irc-серверов, имеющих не-кие свои особенности, но похожие друг на друга в целом,например, unreal ircd, bahamut ircd и так далее, но в данномобзоре я рассмотрю PTlink ircd как более простой для описа-ния и использующийся в российской irc-сети – IrcNET.Ru.

Приступим. Качаем сам сервер с http://www.aldem.net/irc.Выберите ли вы бинарный файл или скомпилируете из ис-ходных кодов, зависит от того, какая операционная системана вашем сервере. В статье пойдет речь именно о Unix-вер-сии. В Unix-версии компилирование должно обязательно про-ходить под обычным пользователем, то есть у того, у кого idбольше 0, иначе сервер откажется компилироваться.

Распаковываем архив, заходим в папку и пишем:

Появится экран с описанием изменений и дополнений,начиная с самого старого. Пролистываем описание и нажи-маем enter. Теперь нужно выбрать опции сборки сервера.Сначала вас спросят о типе компилятора: выбираем gcc,если, конечно, вы не являетесь счастливым обладателемэкзотической операционной системы типа HP-UX, в этомслучае выбирайте cc. Дальше идут опции компиляции, ихможно оставить по умолчанию, так как они автоматическиопределяются в зависимости от операционной системы.Затем выбираем место, где будет лежать папка со всеминеобходимыми файлами для ircd.

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

Выберите нужный вам тип в зависимости от стоящихперед вами задач. Затем вас спросят, осуществлять ли крип-тование паролей irc-операторов: если нет, то пароли вO-lines вписываем простым текстом; если да, то пароли не-обходимо зашифровать. Для этого необходимо зайти на irc-сервер и набрать команду /mkpasswd ваш_пароль: получит-ся некая последовательность букв и цифр – их и нужно впи-сать в O-line на место пароля. У вас возникнет вопрос: «Какзайти-то, ведь мы еще не настроили ircd?». Ответ прост:сначала настройте сам сервер, а пароль для O-line можносделать в самом конце, он не критичен для работоспособно-сти ircd. Далее выбираем число разрешенных соединений ксерверу. И последний пункт – выбор типа сети. Компиляция:

Если все прошло гладко, то сервер готов к использованию.

Примечание: если сервер при запуске сразу выпадает вcore, возможно, проблемы с share-библиотеками, тогда нуж-но вернуться к компиляции снова:

Теперь, скорее всего, все будет в порядке.Переходим в директорию, которую указали при компи-

ляции и видим там несколько файлов:� ircd – основной бинарный файл.� ircd.conf – файл конфигурации.� ircd.motd – файл, который выдается всем пользователям

при каждом заходе на irc. Можете изменять и дополнятьего нужной информацией или картинкой, например.

� help.user – файл помощи для простых смертных, выво-дится командой /helpsys.

� help.oper – файл помощи для irc-операторов.� help.admin – файл для irc-администраторов.

Файл sendbug необходим в случае падения ircd в core,таким образом можно отправить им этот файл для исправ-ления ошибок. Синтаксис: sendbug ircd.core.

После запуска и использования irc-сервера в этой жепапке появится пара новых файлов, таких как ircd.pid, в ко-тором находится номер процесса запущенного сервера, иgline.log, в котором находится список всех gline, которые ста-вились в сети. (Gline – запрет доступа ко всем серверам сетидля определенных IP).

Переходим к составлению конфигурационного файла.Все опции пишутся через двоеточие.

В M-line содержится техническая информация о сервере:

А-line – отражает информацию об администраторе дан-ного сервера, эта информация доступна через команду/admin на irc-сервере.

Y-line – определяет классы коннектов серверов друг кдругу, Y-lines нужно оставить без изменений.

Все же некоторое описание необходимо, т.к. оно приго-дится далее при написании C\N-lines.

Класс-1 – определяет соеднинения простых смертных ссервером:

предпоследний параметр, определяет разрешенное количе-ство коннектов к серверу.

Класс-30 – коннект Hub to Leaf:

Класс-40 – как раз наоборот, Leaf to Hub:

[user@server]$ ./configure

[user@server]$ make && make install

[user@server]$ make LDFLAGS=static && make install

M:èìÿ_ñåðâåðà:ip:îïèñàíèå_ñåðâåðà:ñòàíäàðòíûé_ïîðò

A:îïèñàíèå:Admin:e-mail

Y:1:90:0:250:100000

Y:30:180:0:0:3500000

Y:40:90:90:1:3500000

Page 32: 008 Системный Администратор 07 2003

30

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

Класс-50 – класс коннекта Hub to Hub, с автоконнектом:

И класс-51 – тоже класс коннекта Hub to Hub, но без ав-токоннекта:

I-line – для разрешения доступа к irc-серверу по IP илипаролю:

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

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

Параметр modes вы, естественно, выбираете сами, нижеданы основные режимы.

Данные режимы устанавливаются для пользователяirc, набравшего команду /oper и нужны для управлениясервером irc:

O – глобальный оператор, включены такие флаги, как:oRDCKN.

U-line – определяет сервисы, чтобы правильно пониматьсмену топиков, модов на irc:

X-line – определяет пароли для restart и die:

C-line – строка описывает сервер, пытающийся прикон-нектиться.

N-line – строка, описывающая возможность коннекта сданного сервера.

Обязательно использование C- и N-lines в паре друг сдругом.

который был определен в Y-line.

Q-line – запрет использования ников.Пример:

H-line – определяет сервер как Hub, на серверах Leaf все-гда должен указываться H-line на вышестоящий Hub:

P-line – позволяет открывать прослушивание коннектовна дополнительный порт:

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

На этом описание конфигурационного файла можнозакончить.

А вот небольшой пример реально работающего конфи-гурационного файла:

Пароль здесь представлен без криптования.

Вот пример конфигурации с настроенными на сервисыC\N\H lines.

Запускайте ircd. Попробуем приконнектиться на порт,который вы указали в ircd.conf.

Видим, что все работает, и уже можно оповестить пользо-вателей о появлении нового сервиса и как с ним работать.Для работы в irc есть очень много интересных клиентов, вотнекоторые из них:� для windows: mIRC; http://www.mirc.com, BersIRC; http://

www.bersirc.com.� для Unix-систем: xchat; http://www.xchat.org, BitchX; http:/

/www.bitchx.org.� http://www.ptlink.net/Coders – сайт разработчиков серве-

ра PTlink, там же можно найти и сервисы для ircd.� http://www.ircd.ru – интересный ircd-сервер.

Y:50:90:60:1:4000000

Y:51:90:60:0:4000000

I:*@*:Ïàðîëü:*@*::1

I:*@*::*@*::1

O:host:ïàðîëü:login:modes:1

r = äîñòóï ê êîìàíäå /rehash.R = äîñòóï ê êîìàíäå /restart.D = äîñòóï ê êîìàíäå /die.g = ìîæåò ñëàòü /globops.c = äîñòóï ê ëîêàëüíîìó ïðîèçâåäåíèþ /connect è /squit.C = äîñòóï ê óäàëåííûì /squits è /connects.k = äîñòóï ê ëîêàëüíûì /kills.K = äîñòóï ê ãëîáàëüíûì /kills.b = äîñòóï ê /kline ïîëüçîâàòåëåé ñ ñåðâåðà.o = ëîêàëüíûé àäìèíèñòðàòîð, âêëþ÷åíû òàêèå ôëàãè, êàê, rhgwlckbBnuf.

U:services.some.net:*:*

X:diepass:restartpass

N:óäàëåííûé_ñåðâåð:ïàðîëü:èìÿ_óäàëåííîãî_ñåðâåðà: ↵êëàññ_ êîííåêòà

O:*@*:qwerty:mr_Black:*:1U:services.server.ru:*:*X:qwerty:qwertyC:127.0.0.1:services:services.server.ru:50N:127.0.0.1:services:services.server.ru::50Q::Reserved for services:ChanServQ::Reserved for services:NickServQ::Reserved for services:MemoServQ::Reserved for services:OperServQ::Reserved for services:HelpServQ::Reserved for services:NewsServQ::Reserved for services:GlobalQ::Reserved for operators:IRCopH:*::services.server.ru

M:irc.server.ru:*:Network server:6667A:My cool server:mr_Black:[email protected]:1:90:0:30:100000Y:50:90:60:1:4000000Y:51:90:60:0:4000000Y:30:180:0:0:3500000Y:40:90:90:1:3500000I:*@*::*@*::1

e:127.0.0.1::*

P:*:*:*:port

H:*::hub.server.ru

Q:*:ïðè÷èíà:nickname

C:óäàëåííûé_ñåðâåð:ïàðîëü:èìÿ_óäàëåííîãî_ñåðâåðà: ↵port:êëàññ _êîííåêòà

Page 33: 008 Системный Администратор 07 2003

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

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

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

Пример:

или

Также сообщается, что когда регистрация Apache неиспользуется, программное обеспечение использует не-безопасные файлы регистрации, основанные на ID про-цесса (например “t.log”). Локальный пользователь можетсконструировать символьную ссылку из временного фай-ла к критическому системному файлу на системе. Когдаmod_gzip выполняется, ссылающийся фал будет переза-писан с root-привилегиями.

Уязвимость обнаружена в mod_gzip 1.3.26.1a.

GET [overflow] HTTP/1.1Host: www.apachesite.comAccept-Encoding: gzip, deflate

GET /cgi-bin/printenv.pl?x=%25n%25n%25n%25n%25n HTTP/1.1Host: www.apachesite.comAccept-Encoding: gzip, deflate

GET /cgi-bin/printenv.pl?x=%n%n%n%n%n HTTP/1.1Host: www.apachesite.comAccept-Encoding: gzip, deflate

Уязвимость шестилетней давностидля IE работает на новых версияхMozilla, Netscape и OperaУязвимость в управлении доступом обнаружена в Java иJavascript, выполненных в браузерах Netscape, Mozilla иOpera. Злонамеренный сценарий или апплет может вы-полнить произвольный код и подключиться к произволь-ным доменам.

Сообщается, что удаленный пользователь может создатьHTML, который, когда будет загружен целевым пользовате-лем, внедрит и выполнит произвольный Javascript-код вJavaScript-консоли в браузере целевого пользователя, при-меняя функцию «view-source:».

Эксплоит:

Также сообщается, что злонамеренный апплет можетвыполнить подключения к произвольным доменам. Демон-страционный эксплоит был написан несколько лет назаддля уязвимости в Microsoft Internet Explorer, которая былаустранена с того времени, но появилась в Mozilla, Opera иNetscape: http://neurosis.hungry.com/~ben/msie_bug/.

Способов устранения обнаруженной уязвимости несуществует в настоящее время.

<script>function werd()

a.document.open();a.document.write("<h1>werd</h1>");a.document.close();

function winopen() {

a=window.open("view-source:javascript:location= ↵'http://www.iss.net';");

setTimeout('werd()',23000);

</script>

bugtraq

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

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

DoS против Microsoft Windows 2000/XP/2003Уязвимость обнаружена в Microsoft Windows 2000/XP/2003.Удаленный атакующий может остановить работу сетевыхслужб.

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

Уязвимость обнаружена в Microsoft Windows 2000/XP/2003.

Выполнение произвольных командоболочки в Adobe Acrobat Reader и XpdfУязвимость обнаружена в Adobe Acrobat Reader и Xpdf дляLinux-систем. Удаленный пользователь может создать зло-намеренный PDF-файл, который выполнит произвольныекоманды оболочки при клике на ссылку в PDF-файле.

Сообщается, что удаленный пользователь может вне-дрить команды оболочки в пределах внешней гиперссыл-ки. Согласно сообщению, PDF reader передает гиперссыл-ку к операционной системе, используя команду 'sh -c'. Врезультате ссылка может быть обработана в следующейформе:

Уязвимость обнаружена в Adobe Acrobat Reader 5.06для Linux/UNIX и Xpdf 1.01.

Способов устранения обнаруженной уязвимости несуществует в настоящее время.

mailto:[address]`[malicious command]`

Page 34: 008 Системный Администратор 07 2003

32

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

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

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

Page 35: 008 Системный Администратор 07 2003

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

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

Интерфейс RS-232C является одним из самых распрост-раненных способов связи компьютеров и периферийныхустройств. Кто же не помнит старый добрый NortonCommander и его функцию Связь (Link), позволяющую об-мениваться файлами двум компьютерам, соединеннымнуль-модемным кабелем? Интерфейс RS-232C подразу-мевает наличие двух типов оборудования:� Терминального (DTE);� Связывающего (DCE).

Терминальное устройство принимает и/или отправляетданные. К терминальному типу относятся, например, ком-пьютеры. Терминальные устройства служат окончаниемлинии передачи данных, отсюда и название – terminate. Свя-зывающее оборудование (DCE) обеспечивает передачу дан-ных между терминальными устройствами по линии связи.

Иногда нам нужно знать состояние терминального ус-тройства, или же мы хотим заставить связное устройствоDCE работать как терминальное DTE, для этого нам нуж-но сделать небольшое изменение в линиях данных интер-фейса RS-232C. Для этого нужно знать, какие функциивыполняет тот или иной сигнал интерфейса.

Терминальное оборудование оснащено 9- или 25-кон-тактными D-образными разъемами. На следующем рисун-ке изображены сами порты, а также нумерация контактов.

В таблицах 1 и 2 описаны функции контактов для 9- и25-контактных портов соответственно.

Интерфейс RS-232C обеспечивает два независимыхпоследовательных канала данных: основной и вспомога-тельный (вторичный), но на практике используется толь-ко основной, поэтому в асинхронном режиме использу-ются только первые 9 линий из 25.

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

Ðèñ. 1. Ïîñëåäîâàòåëüíûå ïîðòû.

Òàáëèöà 1. Êîíòàêòû è ñèãíàëû (9 pin).

Òàáëèöà 2. Êîíòàêòû è ñèãíàëû (25 pin).

Ëèñòèíã 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");exit(1);}

if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {// Íåâîçìîæíî îòêðûòü ïîðòfprintf(stderr, "Cannot open port");exit(1);}

// Áåñêîíå÷íûé öèêë. Äëÿ âûõîäà èç ïðîãðàììû íàæìèòå Ctrl + Cwhile (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#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*/

Page 36: 008 Системный Администратор 07 2003

34

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

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

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

gcc -o pctrl pctrl.c

Примечание. Обе программы нужно запускать от име-ни пользователя root (пользователя с UID = 0). Все вашивопросы присылайте по адресу [email protected].

// Âûâîäèì ñîñòîÿíèå óñòðîéñòâàif (flags & TIOCM_CD) fprintf(stderr,"1 [CD] ");if (flags & TIOCM_SR) fprintf(stderr,"2 [RD] ");if (flags & TIOCM_ST) fprintf(stderr,"3 [TD] ");if (flags & TIOCM_DTR) fprintf(stderr,"4 [DTR] ");if (flags & TIOCM_DSR) fprintf(stderr,"6 [DSR] ");if (flags & TIOCM_RTS) fprintf(stderr,"7 [RTS] ");if (flags & TIOCM_CTS) fprintf(stderr,"8 [CTS] ");if (flags & TIOCM_RNG) fprintf(stderr,"9 [RNG] ");

fprintf(stderr,"\n");

// Çàñûïàåì íà 1 ñåêóíäósleep(1);}

close(fd);

}

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

#include <sys/ioctl.h>#include <fcntl.h>#include <errno.h>#include <stdlib.h>#include <unistd.h>#include <stdio.h>#include <signal.h>

Ðèñ. 2. Âûâîä ïðîãðàììû.

int main(int argc, char **argv){int fd;int flags=TIOCM_RNG;

if (argc<1) {fprintf(stderr,"Usage: sns serial_device");fprintf(stderr,"For example: sns /dev/ttyS0");exit(1);}

ioctl(fd, TIOCMSET, &flags);

close(fd);}

Page 37: 008 Системный Администратор 07 2003
Page 38: 008 Системный Администратор 07 2003

36

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

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

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

Page 39: 008 Системный Администратор 07 2003

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

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

Основная ошибка подавляющего большинства разработ-чиков защитных механизмов состоит в том, что они даютявно понять хакеру, что защита еще не взломана. Еслизащита сообщает «неверный ключевой файл (пароль)»,то хакер ищет тот код, который ее выводит и анализируетусловия, которые приводят к передаче управления на дан-ную ветку программы. Если защита в случае неудачнойаутентификации блокирует некоторые элементы управ-ления и/или пункты меню, хакер либо снимает такую бло-кировку «в лоб», либо устанавливает точки останова (впросторечии называемые «бряками») на API-функции, по-средством которых такое блокирование может быть осу-ществлено (как правило, это EnableWindows), после чегоон опять-таки оказывается в непосредственной близостиот защитного механизма, который ничего не стоит про-анализировать и взломать. Даже если защита не выво-дит никаких ругательств на экран, а просто молчаливовыходит из программы, то хакер либо ставит точку оста-нова на функцию exit, либо тупо трассирует программу и,дождавшись момента передачи управления на exit, ана-лизирует один или несколько последующих условных пе-реходов в цепи управления – какой-то из них непосред-ственно связан с защитой!

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

грамме, хакер переписывает код функции CalculateCRC,заставляя ее всегда возвращать это значение, не вы-полняя реальной проверки;

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

� отследив все вызовы CalculateCRC, хакер может про-сто снять динамическую шифровку, расшифровав еевручную, после чего надобность в CalculateCRC про-падает.

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

та контрольной суммы: напичкивать его антиотладочны-ми приемами, реализовать его на базе собственных вир-туальных машин (то есть интерпретаторов), некоторые изних, например, Стрелку Пирса, достаточно трудно про-анализировать. Но если такие меры и остановят взлом-щика, то ненадолго.

Техника неявного контроляОшибка традиционного подхода заключается в его пред-сказуемости. Любая явная проверка чего бы то ни былонезависимо от ее алгоритма – это зацепка! Если хакерлокализует защитный код, то все – пиши пропало. Един-ственный надежный способ отвадить его от взлома –«размазать» защитный код по всей программе с такимрасчетом, чтобы нейтрализовать защиту без полногоанализа всей программы целиком – было заведомо не-возможным. К сожалению, существующие методики«размазывания» либо многократно усложняют реализа-цию программы, либо крайне неэффективны. Некоторыепрограммисты вставляют в программу большое количе-ство вызовов одной и той же защитной функции, иду-щих из различных мест, наивно полагая тем самым, чтохакер будет искать и анализировать их все. Да как бы нетак! Хакер ищет ту самую защитную функцию и правитее. К тому же, зная смещение вызываемой функции,найти и отследить ее вызовы можно без труда! Даже есливстраивать защитную функцию непосредственно в мес-то ее вызова, хакер сможет найти все такие места ту-пым поиском по сигнатуре. Пусть оптимизирующие ком-пиляторы несколько меняют тело inline-функций с уче-том контекста конкретного вызова, эти изменения не-принципиальны. Реализовать же несколько десятков раз-личных защитных функций слишком накладно, да и фан-тазии у разработчика не хватит, и хакер, обнаружив ипроанализировав пару-тройку защитных функций, на-столько проникнется «духом» и ходом мысли разработ-чика, что все остальные найдет без труда.

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

Весь фокус в том, что некоторые из ячеек буфера,ранее занятого зашифрованной (упакованной) програм-

Page 40: 008 Системный Администратор 07 2003

38

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

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

на модифицированный им защитный код, то он вообщене обнаружит к ней обращения, т.к. защита контролируетименно зашифрованный (упакованный) код, содержащий-ся в нашем буфере. Даже если хакер поставит точку ос-танова на буфер, он быстро выяснит, что:� ни до, ни в процессе, ни после расшифровки (распа-

ковки) программы содержимое модифицированных имячеек не контролируется (что подтверждает анализкода расшифровщика/распаковщика – проверок цело-стности там действительно нет);

� обращение к точке останова происходит лишь тогда,когда буфер затерт локальными переменными и (поидее!) содержит другие данные.

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

Ðèñóíîê 1.

Page 41: 008 Системный Администратор 07 2003

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

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

нии структуры (этим мы отвечаем хакеру на вопрос: а чегоэто они не инициализированы?), а затем скопировать этуструктуру целиком (вместе с контролируемыми «дырка-ми»!) в десяток-другой буферов, живописно разбросан-ных по всей программе. Следить на всеми окажется нетак-то просто: во-первых, не хватит контрольных точек, аво-вторых, это просто не придет в голову.

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

Стоп! Ведь выше мы говорили как раз об обратном.Единственный путь сделать защиту трудноломаемой, невыдавая никаких ругательных сообщений, по которым насможно засечь, – молчаливо делать винегрет из обраба-тываемых данных. А теперь выясняется, что делать этогопо этическим (и юридическим!) соображениям нельзя. Насамом деле, если хорошо подумать, то все эти ограниче-ния легко обойти. Что нам мешает оснастить защиту яв-ной проверкой целостности своего кода? Хакер найдет инейтрализует ее без труда, но это и не страшно, посколь-ку истинная защита находится совершенно в другом мес-те, а вся эта бутафория нужна лишь затем, чтобы предот-вратить последствия непредумышленного искажения кодапрограммы и поставить пользователя в известность, чтовсе данные нами гарантии (как явные, так и предполагае-мые) ввиду нарушения целостности оригинального кодааннулируются. Правда, при обсуждении защиты данноготипа некоторые коллеги мне резонно возразили, а что,если в результате случайного сбоя окажутся изменены иконтролируемые ячейки, и сама контрольная сумма? За-щита сработает у легального пользователя!!! Ну что мнена это ответить? Случайно таких «волшебных» искаже-ний просто не бывает, их вероятность настолько близка кнулю, что… К тому же, в случае срабатывания защитымы ведь не форматируем легальному пользователю диск,а просто нарушаем нормальную работу программы. Пустьи предумышленно, все равно, если в результате того илииного сбоя был искажен исполняемый файл, то о коррек-тности его работы более говорить не приходится. Ну хо-рошо, если вы так боитесь сбоев, можно встроить в за-щиту хоть десяток явных проверок, – трудно нам что ли?!

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

защиты приведен в листинге 1. Для упрощения понима-ния и абстрагирования от всех технических деталей здесьиспользуется простейшая схема аутентификации, «ло-мать» которую совершенно необязательно: достаточнолишь подсмотреть оригинальный пароль, хранящийся взащищенном файле прямым текстом. Для демонстраци-онного примера такой прием с некоторой натяжкой допу-стим, но в реальной жизни вам следует быть более изощ-ренными. По крайней мере, следует добиться того, чтобываша защита не ломалась изменением одного-единствен-ного байта, поскольку в этом случае даже неявный конт-роль будет легко выявить. Следует также отметить, чтоконтролировать все критические байты защиты – неочень-то хорошая идея, т.к. хакер сможет это легко обна-ружить. Если защита требует для своего снятия хотя быдесяти модификаций в различных местах, три из которыхконтролируются, то с вероятностью ~70% факт контроляне будет обнаружен. Действительно, среднестатистичес-кий хакер следить за всеми модифицированными ими бай-тами просто не будет. Вместо этого, он в надежде что ту-пая защита контролирует целостность своего кода цели-ком, будет следить за обращениями к одной, ну макси-мум двум-трем измененным им ячейкам и… с удивлени-ем обнаружит, что защита их вообще не контролирует.

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

Допустим, критическая часть защиты выглядит так, инам необходимо проконтролировать целостность услов-ного оператора if, выделенного красным цветом:

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

int my_func(){

if (check_user()){

fprintf(stderr, "passwd ok\n");}else{

fprintf(stderr, "wrong passwd\n");exit(-1);

}return 0;

}

.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

Page 42: 008 Системный Администратор 07 2003

40

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

Как нетрудно сообразить, условный переход, распо-ложенный по адресу 0x401067, и есть тот самый «if», ко-торый нам нужен. Однако это не весь if, а только малаяего часть. Хакер может и не трогать условного перехо-да, а заменить инструкцию test eax, eax на любую дру-гую инструкцию, сбрасывающую флаг нуля. Также онможет модифицировать защитную функцию sub_401000,которая и осуществляет проверку пароля. Словом, тутмного разных вариантов и на этом несчастном услов-ном переходе свет клином не сошелся, а потому длянадежного распознавания взлома нам потребуются до-полнительные проверки. Впрочем, это уже детали. Глав-ное, что мы определили смещение контролируемогобайта. Кстати, а почему именно байта? Ведь мы можемконтролировать хоть целое двойное слово, расположен-ное по данному смещению! Особого смысла в этом нет,просто так проще.

Чтобы не работать с непосредственными смещения-ми (это неудобно и вообще некрасиво), давайте загонимих в специально на то предназначенную структуру:

Исходный текст:

.text:0040107B xor eax, eax

.text:0040107D retn

.text:0040107E ; -----------------------------------------

.text:0040107E

.text:0040107E loc_40107E: ↵; CODE XREF: sub_401060+7?j

.text:0040107E push offset aWrongPasswd ↵; "wrong passwd\n"

.text:00401083 push offset unk_407110

.text:00401088 call _fprintf

.text:0040108D push 0FFFFFFFFh ↵; int

.text:0040108F call _exit

.text:0040108F sub_401060 endp

union anti_hack{

char buf[MAX_CODE_SIZE];struct code_control{

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;

};};

Ëèñòèíã 1.#include <stdio.h>

#define PASSWD "+++"#define MAX_LEN 1023#define MAX_CODE_SIZE (0x10*1024)#define OFFSET_1 0x42#define OFFSET_2 0x67

#define x_original_1 0xc01b0574#define x_original_2 0x44681574#define x_original_all 0x13D4C04B

#define x_crypt 0x66

int check_user(){

char passwd[MAX_LEN];

fprintf(stderr,"enter password:");fgets(passwd, MAX_LEN, stdin);return ~strcmp(passwd, PASSWD);

}

int my_func(){

if (check_user()){

fprintf(stderr, "passwd ok\n");}else{

fprintf(stderr, "wrong passwd\n");exit(-1);

}return 0;

}

main(){

int a, b = 0;#pragma pack(1)

union anti_hack{

char buf[MAX_CODE_SIZE];struct code_control{

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;

// TITLEfprintf(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++)

{(*(char *) ((int) &ZZZ + a)) ^= x_crypt;

}

// êîïèðóåì îáðàòíîmemcpy(&check_user, &ZZZ, (int) &main - (int) &check_user);

// ÿâíàÿ ïðîâåðêà èçìåíåíèÿ êîäà// ======================================================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);return 0;

}

// ÿâíàÿ ïðîâåðêà "âàëèäíîñòè" ïîëüçîâàòåëÿ// ======================================================

my_func();

// íîðìàëüíîå âûïîëíåíèå ïðîãðàììû// ======================================================

// ñêðûòûé êîíòðîëüZZZ.local_var_1 = 2;ZZZ.local_var_2 = 2;x_original_2;sprintf(ZZZ.gag_1, "%d * %d = %d\n", ZZZ.local_var_1, ↵

ZZZ.local_var_2, ZZZ.local_var_1*ZZZ.local_var_2 + ↵((x_original_1^ZZZ.x_val_1)+ ↵

(x_original_2^ZZZ.x_val_2)));

printf("DEBUG: %x %x\n", ZZZ.x_val_1, ZZZ.x_val_2); fprintf(stderr, "%s",ZZZ.gag_1);

}

Page 43: 008 Системный Администратор 07 2003

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

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

ЗаключениеИтак, для надежной защиты своих программ от вездесу-щих хакеров вам совершенно необязательно прибегать кпомощи широко разрекламированных, но дорогостоящихэлектронных ключей (которые, как известно, склонны всамый неподходящий момент "сгорать", к тому же "отвя-зать" программу от ключа для опытного взломщика непроблема). Также совершенно необязательно спускатьсяна уровень "голого" ассемблера (ассемблерные защитынепереносимы и к тому же чрезвычайно трудоемки в от-ладке, про сопровождение я и вовсе молчу). Как былопоказано выше, практически неломаемую защиту можносоздать и на языках высокого уровня, например, на Си/Си++, Delphi или Фортране.

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

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

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

Page 44: 008 Системный Администратор 07 2003

42

bugtraq

Просмотр содержания произвольныхфайлов в памяти системы в HP/UX 'ftpd'Уязвимость обнаружена в HP/UX 'ftpd' в команде REST. Уда-ленный пользователь может просматривать содержаниепроизвольных файлов в памяти системы.

Сообщается, что удаленный пользователь может ис-пользовать команду REST (reset) и определить местопо-ложение памяти, чтобы просматривать содержание фай-лов из памяти.

Пример: (еще несколько примеров можно найти в ис-точнике сообщения):

Уязвимость может использоваться, например, для полу-чения пароля root из памяти. Уязвимость связана с непра-вильным использованием конверсионного символа в стро-ке формата. Уязвимость обнаружена в HP/UX ftpd 1.1.214.4.

Hewlett Packard выпустил заплату PHNE_18377, уст-раняющую эту уязвимость.

frieza elguapo $ ftp 192.168.1.111Connected to 192.168.1.111.220 kakarot FTP server (Version 1.1.214.4 Mon Feb 15 08:48:46 ↵

GMT 1999) ready.Name (192.168.1.111:root): elguapo331 Password required for elguapo.Password:230 User elguapo logged in.Remote system type is UNIX.Using binary mode to transfer files.ftp> rest 1111111111111111restarting at 2147483647. execute get, put or append ↵

to initiate transferftp> get .local: . remote: .200 PORT command successful.

# gdb /usr/lbin/ftpd 2862GNU gdb 4.18-hppa-991112Copyright 1998 Free Software Foundation, Inc.

/home/elguapo/2862: No such file or directory.Attaching to program: /usr/lbin/ftpd, process 2862

Unable to find __dld_flags symbol in object file.

(gdb) cContinuing.

Program received signal SIGSEGV, Segmentation fault.0xc00ef0b8 in ?? ()(gdb) bt#0 0xc00ef0b8 in ?? ()Error accessing memory address 0x7fffffff: Bad address.

(gdb) info registers r3 r11 r3: 7fffffff r11: 7fffffff

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

DoS против Microsoft Windows XPУязвимость обнаружена во всех версиях Microsoft WindowsXP. Локальный пользователь может аварийно завершитьработу системы.

Проблема связана с тем, что Windows не в состоянииправильно обработать множественные вложенные дирек-тории. Локальный пользователь может создать каталог,содержащий 122 вложенные директории и обратиться кпоследней директории, чтобы аварийно завершить рабо-ту системы.

Уязвимость обнаружена в Microsoft Windows XP.

KDE Konqueror Embedded не в состояниив некоторых случаях подтвердитьподлинность SSL-сертификатовУязвимость обнаружена в KDE Konqueror. Программноеобеспечение не проверяет имя хоста в SSL-сертификатах.

Сообщается, что выполнение KDE SSL в KDE KonquerorEmbedded проверяет сертификаты, основанные на IP-ад-ресе, но не проверяет, соответствует ли Common Nameимени хоста. Удаленный пользователь может подделатьбезопасный веб-сервер или выполнить SSL man-in-the-middle нападение таким образом, что его не сможет об-наружить KDE Konqueror Embedded.

Патчи можно скачать отсюда:ftp://ftp.kde.org/pub/kde/security_patches4c252809dec8be73bbe55367350c27ca post-2.2.2-kdelibs-

kssl-2.diff441afec72fab406f8c1cd7d6b839b3e0 post-2.2.2-kdelibs-

kio-2.diffУязвимость обнаружена в KDE 2.2.2 и более ранних

версиях.

Множественные переполнения буферав MDaemon IMAP-сервереНесколько уязвимостей обнаружено в MDaemon IMAP-сер-вере. Удаленный пользователь может аварийно завершитьработу сервиса или выполнить произвольный код с System-привилегиями.

Сообщается, что несколько переполнений буфера суще-ствует в обработке IMAP4-протокола. Удаленный пользова-тель может послать чрезмерно большое количество данныхс командами EXAMINE, DELETE, SUBSCRIBE, RENAME,UNSUBSCRIBE, LIST, LSUB, STATUS, LOGIN, CREATE иSELECT, чтобы вызвать переполнение. Для выполнения не-которых команд требуется авторизация.

Уязвимость обнаружена в MDaemon 6.7.8.

Обход ограничений доступапо хостам в OpenSSHУязвимость в проверке правильности доступа обнаруженав OpenSSH. Удаленный пользователь, способный управ-лять DNS, может обойти ограничения по хостам в OpenSSH.

Сообщается, что при получении нового подключе-ния OpenSSH выполняет обратный DNS-просмотр и про-веряет результаты поиска против IP-адресов или име-ни хостов, указанных в файле конфигурации OpenSSH,как разрешенные или запрещенные хосты. Если файлконфигурации определяет числовой IP-адрес или ин-тервал IP-адресов, удаленный пользователь, контроли-рующий DNS-сервер, может заставить DNS-сервер воз-вратить имя хоста, содержащее строку IP-адреса (на-пример, '[ipaddress].[domain]'). Если строка IP-адреса со-ответствует разрешенным IP-адресам в конфигураци-онном файле, OpenSSH некорректно определит подклю-чение как разрешенное. В результате удаленныйпользователь может получить доступ к SSH-порту отзапрещенного хоста.

Уязвимость обнаружена в OpenSSH 3.6.1 и более ран-них версиях. Для устранения уязвимости, включите оп-цию 'VerifyReverseMapping' на SSH-сервере.

Page 45: 008 Системный Администратор 07 2003
Page 46: 008 Системный Администратор 07 2003

44

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

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

Page 47: 008 Системный Администратор 07 2003

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

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

В статье «Контрольная сумма на защите Linux/FreeBSD»июньского номера журнала «Системный администратор»была рассмотрена настройка утилиты Tripwire, позволя-ющей системному администратору контролировать цело-стность важных системных файлов и быть предупрежден-ным о взломе. Но хотелось бы не доводить до всего этогои иметь возможность защититься и предотвратить взлом.Существует множество утилит, позволяющих определитьпризнаки подготовки и начала атаки (сканирование пор-тов, множество неудачных удаленных подключений к сер-веру), в этой статье познакомимся с тремя из них.

Набор программ TriSentry от компании PsionicTechnologies Inc. (http://www.psionic.com/) разработаны, что-бы увеличить защиту компьютерных сетей и уменьшить ве-роятность проникновения, эти приложения относятся к IDS(Intrusion Detection System – система обнаружения вторже-ний). Состоит TriSentry из трех ключевых компонентов:PortSentry, HostSentry и LogSentry, распространяемых какfreeware и предназначенных для использования на Unix-по-добных операционных системах как вместе, так и раздель-но, в зависимости от задач и необходимости.

PortSentryPortSentry – программа, предназначенная для обнаружениясканирования портов, которое, как правило, всегда пред-шествует атаке. Она не только позволяет регистрироватьэто в системных журналах при помощи syslog, но и позволя-ет запустить в ответ любую программу (блокировки хостаfirewall или переадресации на несуществующий dead host,traseroute, свой скрипт), которой могут быть переданы IP-адрес атакующего и номер атакуемого порта, или простопрописать адрес компьютера в файле /etc/hosts.deny.PortSentry обнаруживает практически все известные видысканирования: Strobe-style, SYN/half-open, Null, XMAS, FIN,TCP connect и другие. В файле README.stealth архива вынайдете описание обнаруживаемых методов Stealth-скани-рования. В настоящее время имеется уже версия 2.0 про-граммы, отличающаяся от первой поддержкой libpcap, т.е.методами обнаружения сканирования. После закачки паке-та распакуйте (tar xfz portsentry-2.0b.tar.gz) его и откройте влюбимом редакторе файл portsentry_config.h, в котором со-держатся некоторые опции конфигурирования, для большин-ства случаев подойдут используемые по умолчанию:� CONFIG_FILE “/usr/local/psionic/portsentry2/portsentry.conf” –

содержится путь к конфигурационному файлу, если зна-чение по умолчанию не подходит, изменив его, не за-будьте подправить его и в Makefile в опциях INSTALLDIR(/usr/local/psionic) и CHILDDIR (/portsenry2);

� WRAPPER_HOSTS_DENY “/etc/hosts.deny” – путь к фай-лу hosts.deny для работы tcpwrapper;

� SYSLOG_FACILITY LOG_DAEMON – тип логов дляsyslogd (подробности в man 3 syslog);

� SYSLOG_LEVEL LOG_NOTICE – уровень syslogd дляпосылки сообщений;

� MAXSTATE 50 – максимальное количество запоминае-мых хостов для проверки повторного подключения.

Знак решетки (#) в этом файле в начале строк с пере-менными – это не признак комментария, они требуются

компилятором С при обработке файлов заголовков, по-этому удалять их не надо. После набираем:

чтобы откомпилировать программу и затем под логином root:

Теперь в /usr/local должен появиться каталог psionic с под-каталогом portsentry2, в котором будут находиться три фай-ла: portsentry – исполняемый файл программы, portsentry.confи portsentry.ignore. В portsentry.ignore содержатся IP-адре-са узлов, которые не дожны блокироваться.

По умолчанию там содержится два адреса 127.0.0.1 и0.0.0.0, остальные при необходимости заносятся в фор-мате <IP Address>/<Netmask>. Например:

По умолчанию используется 32-битная маска. Теперьсамое время заглянуть в главный конфигурационный файлportsentry.conf. Опции в этом файле для удобства условносгруппированы по секциям и имеют вид ОПЦИЯ=«значение».

Значения опций файла portsentry.conf

Interface Configurations� INTERFACE=«auto» – названия подконтрольного интер-

фейса, при наличии одного возможен вариант «auto»,и он будет найден автоматически; если же их несколь-ко, то необходимо указать на выбранный для контро-ля, например INTERFACE=«eth0», Portsentry может кон-тролировать только один интерфейс.

� INTERFACE_ADDRESS=«XXX.XXX.XXX.XXX» – IP-адресинтерфейса, без него Portsentry не сможет работать дол-жным образом, в данное время не поддерживается ди-намическое определение адреса, в этом случае придет-ся писать скрипт (но в ближайшее время, по заверени-ям разработчиков, такая опция будет реализована).

Port Configurations� TCP_PORTS – перечисляются через запятую все про-

веряемые Portsentry TCP-порты (диапазоны не поддер-живаются), список желательно не делать слишкомбольшим, чтобы уменьшить количество срабатываний,но он должен охватывать весь диапазон и содержатьпорт номер 1, так как в большинстве сканеров скани-рование начинается именно с него, также не надо вклю-чать сюда порты, открытые работающими приложени-ями (20 – ftp, 25 – sendmail, 80 – httpd и пр.). При по-пытке подключения к указанному порту информацияоб этом заносится в логи, затем выполняется пользо-вательская команда и после узел блокируется при по-мощи ipchains.

� UDP_PORTS – то же самое, только касается UDP-пор-тов.

# make linux (openbsd, freebsd, netbsd)

# make install

192.168.2.0/24192.168.0.0/16192.168.2.1/32

Page 48: 008 Системный Администратор 07 2003

46

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

Configuration Files� IGNORE_FILE – полный путь к файлу portsentry.ignore.� HISTORY_FILE – путь к файлу с историей, в котором

содержатся записи о времени блокирования, имени иIP-адреса хоста, атакованный порт и протокол (TCP илиUDP).

� BLOCKED_FILE – шаблон, из которого формируетсяфайл блокировки, имеющий имя BLOCKED_FILE.про-токол.

Misc. Configuration OptionsRESOLVE_HOST – при установлении в 1 производитсязапрос сервера DNS имени хоста нападавшего. На мед-ленных компьютерах это может увеличить время реакциии может предупредить нападающего о наличии Portsentry,если он контролирует сервер имен. Значение по умолча-нию – 0.

Ignore Options� BLOCK_UDP – позволяет задать ответную реакцию

на сканирование в зависимости от установленногозначения. При значении 0 ничего не происходит, узелне блокируется, команда не запускается; 1 означаетблокировать узел и запустить на выполнение коман-ду; 2 – только запустить заданную команду. Командазадается при помощи опции KILL_RUN_CMD.

� BLOCK_TCP – то же самое, только для TCP-прото-кола.

Dropping RoutesВ этой секции описывается команда, которая будет вы-полнена при обнаружении сканирования, при этом пе-ременная $TARGET$ заменяется IP-адресом, а в пере-менную $PORT$ будет подставлен номер порта, к ко-торому было подключение. В файле содержатся шаб-лоны команд (удаление маршрута, установка firewall)для различных операционных систем, необходимуюнужно раскомментировать или дописать свою, исполь-зуя параметр KILL_ROUTE.

TCP WrappersKILL_HOSTS_DENY – опция задает строку, которая будетпомещена в /etc/hosts.deny для блокировки доступа (ALL:$TARGET$).

External Command� KILL_RUN_CMD – команда, которая будет выполнена

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

� KILL_RUN_CMD_FIRST – установка значения в 0 запу-стит команду, перед тем как маршрут будет удален изтаблицы; в 1 – после.

Scan trigger valueSCAN_TRIGGER – определяет разрешенное количествоподключений, прежде чем Portsentry начнет действовать.Значение по умолчанию 0 означает немедленную реак-цию. Установка в 1 или 2 уменьшит количество ложныхсрабатываний. Но можно оставить как есть.

Это все опции применительно к версиям 1.1 и 2.0, но вверсии 1.1, которая до сих пор пользуется популярнос-тью, имеется еще одна опция – PORT_BANNER, котораязадает сообщение, выводимое при подключении к прове-ряемому порту.

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

После того как все параметры установлены, можно за-пускать утилиту. Во второй версии это просто запуск ис-полняемого файла без параметров.

После этого в файле /var/log/message должно появить-ся примерно такое сообщение, в котором описываютсяконтролируемый интерфейс и порты:

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

PortSentry.� securityalert – сообщение о том, что некое защитное

событие произошло.� attackalert – компьютер был атакован и соответствую-

щие данные занесены в /etc/host.deny.

В первой же версии программы использовалось шестьрежимов по три на каждый протокол (TCP и UDP):� portsentry -tcp (basic port-bound TCP mode)� portsentry -udp (basic port-bound UDP mode)� portsentry -stcp (Stealth TCP scan detection)� portsentry -atcp (Advanced TCP stealth scan detection)� portsentry -sudp («Stealth» UDP scan detection)� portsentry -audp (Advanced «Stealth» UDP scan detection)

# 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"

PORT_BANNER="** UNAUTHORIZED ACCESS PROHIBITED *** YOURCONNECTION ATTEMPT HAS BEEN LOGGED. GO AWAY."

# /usr/local/psionic/portcentry2/portcentry

Jun 4 09:00:32 grinder portsentry[1881]: adminalert: ↵Monitoring interface eth0 and address:

192.168.0.4Jun 4 09:00:32 grinder portsentry[1881]: adminalert: ↵

Initializing PortSentry BPF filters.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, ↵

12345,12346,20034,27374,27665,31337,32771,32772,32773,32774,40421,49724,54320,54321Jun 4 09:00:32 grinder portsentry[1881]: adminalert: ↵

Monitoring UDP ports:1,7,9,69,161,162,513,635,2049,27444,32770,32771,32772,32773,32774,31337,54321Jun 4 09:00:32 grinder portsentry[1881]: adminalert: ↵

PortSentry is initialized and monitoring.

Page 49: 008 Системный Администратор 07 2003

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

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

Для каждого протокола может запускаться только одинвыбранный режим. В режиме basic открываются описан-ные в файле portsentry.conf контролируемые порты и припопытке соединиться с ними происходит блокировка, приэтом PortSentry не реагирует на Stealth-сканирование. Ре-жим Stealth отличается от предыдущего тем, что не дер-жит порты открытыми, и атакующий получает достовер-ную информацию об используемых портах, а также выяв-ляет практически все виды Stealth-сканирования. РежимAdvanced является самым быстрым и рекомендуется раз-работчиками (во второй версии используется именно этотрежим совместно со Stealth). При этом контролируютсявсе порты ниже значений ADVANCED_PORTS_TCP иADVANCED_EXCLUDE_UDP.

LogSentryВ системных журналах имеется довольно ценная инфор-мация, так как любое событие оставляет там свой след,но большинство системных администраторов заглядыва-ют туда один-два раза в неделю, иногда даже вручную,что, согласитесь, очень утомительно. Утилита Logsentry(или logcheck) как раз и предназначена для автоматичес-кой проверки системных журналов на предмет наруше-ний безопасности и других необычных действий, такимобразом немного облегчая труд. Берет свою родослов-ную от скрипта frequentcheck.sh, входящего в составfirewall Gauntlet компании Trusted Information Systems Inc.(http://www.tis.com). Сценарий logcheck запускается при по-мощи демона cron, при этом программа при помощи ути-литы grep проверит системные журналы на предмет на-личия определенных ключевых слов, и в случае наличияих в файле сисадмин получит извещение по почте. Чтобыне проверять каждый раз все файлы полностью, для за-поминания последней прочитанной в журнале позицииLogcheck использует программу, называемую logtail, ко-торая запоминает ее и использует эту позицию на после-дующем шаге, чтобы обработать новую порцию инфор-мации. При этом в каталоге с лог-файлами появятся ещенесколько файлов хххххх.offset, где хххххх – название лог-файла; если удалить его, утилита начнет проверять лог-файл опять сначала. Также утилита контролирует номерinode и размер лог-файла; при уменьшении размера илиизменении номера inode счетчик сбрасывается и файлпроверяется сначала. Поэтому можно не беспокоиться приудалении лог-файлов (точнее, переносе на резервный но-ситель), когда они разрастутся. Инсталляция программыочень проста, распаковываем архив.

И заходим в каталог (да, название немножко измени-лось).

И теперь вводим команду mаке с указанием использу-емой операционной системы, например для Linux.

После этого скомпилированная программа logtailвместе со вспомогательными файлами скопируется вкаталоги, указанные в переменных INSTALLDIR_BIN,INSTALLDIR и INSTALLDIR_SH. По умолчанию это под-каталоги /usr/local/bin, /usr/local/etc и /usr/local/etc. Кро-ме основного скрипта logcheck.sh и программы logtail,в комплекте идут несколько вспомогательных файлов.Файл logcheck.hacking содержит ключевые слова (вро-де LOGIN root REFUSED или attackalert от Portcentry),появление которых в лог-файлах может свидетельство-вать только об одном – компьютер атакован, т.е. еслитакое слово будет обнаружено, то суперпользовательполучит сообщение, которое просто не сможет не при-влечь его внимания: «ACTIVE SYSTEM ATTACK». Афайл logcheck.violations содержит набор слов, свиде-тельствующих, как правило, о каком-либо негативномдействии (например, failed, denied и даже su root). На-пример, сравните следующие два сообщения:

Первая строка указывает на довольно обычную житей-скую ситуацию с sendmail, отдаленный компьютер отка-зался от подключений, т.е. слово refused к нашему слу-чаю не имеет абсолютно никакого отношения. А вот в сле-дующей некто с [email protected] пробовал запускать rsh-сеанс на компьютере, это как раз наш случай (rshd при-веден только для примера, использование его на компь-ютере, по-моему, плохая идея) и опять присутствует сло-во refused. Для того чтобы события, подобные первому,не отвлекали в файл logcheck.violations.ignore, добавля-ем строку, наличие которой заставит logsentry проигно-рировать событие. В нашем случае это будет:

Но с занесением данных в этот файл надо быть ос-торожным, чтобы не пропустить важное. По умолчаниюв нем содержится только одна строка stat=Deferred, по-зволяющая игнорировать сообщения grep. Чтобы иметьвозможность искать некоторые слова и не сообщать обих наличии, предназначен файл logcheck.ignore. Поис-ки по ключевым словам в файлах logcheck.hacking иlogcheck.violations, чтобы гарантировать, что ничего непропущено, нечувствительны к регистру. А в файлахlogcheck.violations.ignore и logcheck.ig-nore, наоборот, чув-ствительны к регистру, чтобы гарантировать 100% попа-дание и не пропустить что-нибудь интересное. Все *.ignore-файлы требуют точного текста.

Теперь необходимо сделать так, чтобы все сообщениясистемы записывались в один файл /var/log/messages. Дляэтого открываем в любимом редакторе /etc/syslog.conf.Он имеет приблизительно такую структуру: в левой час-ти через точку с запятой перечисляются системные со-бытия, а в правой – файл или устройство (что для Unixодно и то же), в которое сообщение, соответствующее

# tar xfzv logsentry-1.1.1.tar.gz

# cd logcheck-1.1.1

# make linux

Jun 4 09:00:32 grinder sendmail[5475]: VAA05473: ↵to=crowland, ctladdr=root (0/0), delay=00:00:02, ↵xdelay=00:00:01, mailer=local, stat=refused

Jun 4 09:00:32 grinder rshd: ↵refused connect from [email protected]:1490

mailer=local, stat=refused

Page 50: 008 Системный Администратор 07 2003

48

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

данному событию, будет выводиться. Т.е. необходимопросто собрать все записи, которых нет в левой части,соответствующей /var/log/messages со всех таких событий-ных частей и дописать их (это в самом простом случае,либо почитайте man syslog.conf). Например, в RedHat 9 уменя такая строка:

После этого на всякий случай устанавливаем новыеправа доступа к файлу /var/log/messages:

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

После всего загляните в скрипт logcheck.sh и измени-те значения переменных SYSADMIN (пользователя, кото-рому будет высылаться e-mail), а также MAIL и LOGTAIL всоответствии с вашей системой (в последнем случае до-статочно закомментировать одни и раскомментироватьдругие строки).

Для начала, чтобы убедиться, что все работает нор-мально, запускаем скрипт logcheck.sh вручную, причемжелательно несколько раз, чтобы удостовериться в том,что вы не получаете одни и те же сообщения. Если этотак, то что-то не в порядке с logtail, попробуйте запуститьее вручную и посмотрите наличие файлa *.offset. Пробле-мы здесь могут быть две: или программа запукается неот имени root, или придется перекомпилировать.

И теперь, когда все в порядке, заносим в файл /etc/crontabприблизительно такие строки (для каждой системы свои),при этом демон cron должен быть, естественно, запущен.

И теперь каждый час запускается logcheck.sh, кото-рая запускает в свою очередь logtail:� logtail анализирует log-файлы с последней запомнен-

ной позиции;� logcheck при помощи grep проверяет оставшийся текст

на наличие сообщений о возможной атаке;� при помощи grep проверяются все возможные нега-

тивные сообщения;� на следующем шаге отбираются из них те, которые

нужно проигнорировать (logcheck.violations.ignore);� все сообщения, которые нужно проигнорировать, за-

носятся в logcheck.ignore;� после всего этого сисадмин получает e-mail с остав-

шимися сообщениями.

Еще одна проблема может возникнуть с использова-нием утилиты logsentry. Связана она с локализацией.Дело в том, что в большинстве дистрибутивов local ус-танавливается автоматически по используемому основ-

ному языку системы. Естественно, после того как пере-менная LANG будет равняться KOI8-R, все сообщениябудут выводиться на русском языке (и запись в лог-фай-лы также), дополнительно в последнее время обостри-лась ситуация с продвижением единой кодировкиUnicode, т.е. в RedHat 8.0 и 9 LANG=«ru_RU.UTF-8».Logcenry в этом случае ничегошеньки (или почти) не най-дет. И все потому, что все шаблоны записаны на анг-лийском. Поэтому лучше всего использовать Pan-European version, т.е. когда сообщения выводятся на ан-глийском (в AltLinux сейчас примерно так все и работа-ет). Для этого в файле /etc/sysconfig/i18n меняем соот-ветствующие строки на:

Остальные можно оставить как есть. После этого про-блем уже быть не должно.

HostSentryИ последняя, самая молодая, утилита HostSentry. Пред-ставляет собой инструмент обнаружения вторжения, ос-нованный на технологии Login Anomaly Detection (LAD),который определяет подозрительные действия при входев систему и позволяет быстро выявлять скомпрометиро-ванные пользовательские аккаунты и необычное поведе-ние. HostSentry включает динамическую базу данных ифактически изучает поведение входа в систему пользо-вателя. Это поведение используется модульными сигна-турами, чтобы обнаружить необычные действия. Прошуобратить внимание на словосочетание «при входе в сис-тему», если компьютер уже скомпрометирован, и взлом-щик уже имеет легальный вход в систему, здесь уже по-мочь будет трудно, а вот когда делаются первые шаги,применение HostSentry будет как раз к месту. При этомнеобходимо помнить, что обнаружив ее, злоумышленниктакже может подменить утилиту.

При этом HostSentry определяет:� необычные действия при входе в систему;� подозрительные домены, с которых осуществляется вход;� подозрительные каталоги пользователей;� обнаруживает вмешательство в файлы истории ко-

манд и входа в систему;� неизвестные входы в систему;� имеет расширяемые модули сигнатур.

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

Программа полностью написана на объектно-ориенти-рованном интерпретируемом языке Python, в большинствесовременных дистрибутивов он уже имеется, если же нет,то первоначально необходимо его установить, взяв с до-машней страницы http://www.python.org. После этого ус-

*.info;mail.none;authpriv.none;cron.none;uucp,news.crit ↵/var/log/messages

# chown root.wheel /var/log/messages# chmod 600 /var/log/messages

# 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

00 * * * * root /bin/sh /usr/local/etc/logcheck.sh

LANG="en_US"SYSFONT="Cyr_a8x16"SYSFONTACM="koi2alt"

Page 51: 008 Системный Администратор 07 2003

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

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

тановка HostSentry проблем вызвать не должна, простораспаковываем архив, заходим в образовавшийся ката-лог и вводим make install, после чего все необходимыефайлы будут просто перенесены в каталог /usr/local/abacus/hostsentry (на него указывает переменнаяINSTALLDIR в Makefile).

В файле hostsentry.conf устанавливаются пути к мо-дулям, используемым утилитой, базам данных, необхо-димым для сбора информации, переменная WTMP_FILEдолжна указывать на wtmp-файл (для Linux обычно /var/log/wtmp) и некоторым другим файлам, о них ниже. Един-ственная переменная, на которую можно обратить вни-мание поначалу (остальные можно не трогать, а оста-вить как есть, хотя базы данных я бы переместил в ката-лог /var, где и положено им быть) – это WTMP_FORMAT, вкоторой устанавливается формат сохранения информа-ции о логинах. Вся проблема здесь в том, что учет пара-метров входа в систему (Name, TTY, Time, Host) в различ-ных реализациях Unix ведется по-разному, например, имяхоста в BSD урезается до 16-32 байт, в RFC 1034 имя ог-раничено 256 символами, а в переменной MAXDNAME(arpa/nameser.h) имя узла ограничено 1024 символами.Это приводит к тому, что если нападавшим использованодлинное имя, то оно наверняка урежется (подробности вREADME.wtmp). Так вот в WTMP_FORMAT и устанавли-вается формат, чтобы обеспечить запись необходимыхданных применительно к используемой системе (в про-стейшем случае необходимо будет раскомментировать со-ответствующую строчку, в будущем планируется макси-мально автоматизировать процесс).

В файле hostsentry.modules описывается, какие моду-ли должны выполняться при регистрации пользователя всистеме и при logout. В большинстве случаев можно ос-тавить как есть. При необходимости сменить очередностьвыполнения модулей, их нужно просто переместить вверх/вниз. В файл hostsentry.ignore заносятся пользователи,которых не нужно отслеживать при помощи HostSentry,это может быть полезно, например, для пользователейтипа «ftp», который обнаруживается в wtmp и вызываетбольшое количество ложных тревог из-за анонимного до-ступа (при этом все равно в базу данных пользовательбудет включен). Для этого нужно просто разместить ис-ключаемых пользователей по одному в строке (и надо заг-лядывать в него периодически, чтобы там не оказалсяroot). Файл hostsentry.action описывает действия, которыедолжна предпринимать утилита, пока она только регист-рирует залогинившихся пользователей. Теперь можно изапускать (для автоматического старта вместе с систе-мой нужно включить эту строку в файл rc.local).

При этом в файле /var/log/messages должны появить-ся такие строки.

После первого запуска образуются две базы данных:hostsentry.db, содержащая записи обо всех пользовате-лях, которые регистрировались с тех пор, пока HostSentryбыл в действии, и hostsentry.tty.db об используемых (ак-тивных) терминалах. В пользовательской базе данныххранятся объекты входа в систему пользователя, которыесформированы со следующей схемой:� username – имя входящего в систему пользователя;� recordCreated – дата начала записи в Unix-формате;� firstLogin – первый вход в систему для этого пользова-

теля;� trackLogins – список входов в систему этого пользова-

теля (будет постоянно расти);� validLoginDays – дни, когда данному пользователю раз-

решено регистрироваться в системе;� validLoginHours – часы, когда пользователю разреше-

но регистрироваться;� adminDisabled – флаг, указывающий на то, что данная

запись была отключена администратором;� securityDisabled – флаг, указывающий на то, что дан-

ный пользователь был лишен возможности регистри-роваться модулем программы;

� totalLogins – общее количество регистраций для дан-ного пользователя;

� version – версия схемы базы данных.

База данных терминалов помогает HostSentry поддер-жать список активных подключений и позволяет програм-ме знать, когда пользователь регистрировался. Посколь-ку эти данные не используются между включениями, онаобнуляется каждый раз при перезапуске HostSentry. Приэтом отслеживаются следующие элементы:� tty – TTY, с которого зарегистрировался пользователь;� username – имя пользователя;� loginStamp – уникальный timestamp для login;� version – версия схемы базы данных.

В loginStamp заносится информация, необходимая дляобработки компонентами системы и формируется следу-ющим образом:

Где:� LoginIP – IP-адрес пользователя при регистрации;� LoginHostname – имя хоста (полностью уточненное при

помощи DNS);� LoginTTY – TTY пользователя;� LoginTime – время входа в систему в Unix-формате;� LogoutTime – время выхода из системы в Unix-формате.

Если попробовать теперь зарегистрироваться, то до-полнительно появится сообщение, в котором указывает-ся кто, когда, откуда и какие модули были выполнены.

# python hostsentry.py

Jun 8 18:26:42 grinder hostSentry[23306]: adminalert: ↵HostSentry version 0.02 is initializing.

Jun 8 18:26:42 grinder hostSentry[23306]: adminalert: ↵Send bug reports to <[email protected]>

Jun 8 18:26:43 grinder hostSentry[23460]: adminalert: ↵HostSentry is active and monitoring logins.

loginIP@loginHostname@loginTTY@loginTime@logoutTime

Jun 8 18:30:19 grinder -- sergej[1639]: ↵LOGIN ON tty1 BY sergej

Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: ↵LOGIN User: sergej TTY: tty1 Host:

Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: ↵First time login for user: sergej

Page 52: 008 Системный Администратор 07 2003

50

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

Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: ↵Action being taken for user: sergej

Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: ↵Module requesting action is: moduleFirstLogin

Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: ↵Action complete for module: moduleFirstLogin

Jun 8 18:30:21 grinder hostSentry[23460]: securityalert: ↵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

Jun 8 18:30:21 grinder hostSentry[23460]: securityalert: ↵Action complete for module: moduleForeignDomain

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

Список модулей, применяемых в HostSentry:� moduleOddDirnames – скорее, вспомогательный мо-

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

� moduleRhostCheck – этот модуль проверяет пользова-тельский .rhosts-файл при выходе из системы, и еслив нем содержатся постановочные знаки (“+”), это бу-дет зарегистрировано, и администратору можно будетзаняться исследованием (использование r-сервисов –плохая идея);

� moduleMultipleLogins – все просто, если пользовательнесколько раз одновременно зарегистрировался накомпьютере, то он (компьютер) уже, скорее, взломани администратора об этом предупредят;

� moduleFirstLogin – единственная цель этого модуля –предупреждение администратора, когда пользовательвходит в систему первый раз после запуска HostSentry,т.е. когда пользователь ввел пароль и получил Unixshell. Может, это и есть наш Вася Пупкин, а может инет; во всяком случае, администратору будет интерес-но узнать, зачем бухгалтеру интерактивная оболочка;

� moduleForeignDomain – очень часто нападающие, ском-прометировавшие какую-то учетную запись, входят всистему с домена, которому, в общем-то, нечего делатьна вашем компьютере. Если такой домен не перечис-лен в файле moduleForeignDomain.allow, то он причис-ляется к подозрительным, и администратор получаетпредупреждение. Примечание: из-за ограничений в не-которых системах, связанных с максимально хранимымименем хоста, о чем говорилось выше, данный модульможет давать противоречивые результаты, в этом слу-чае, скорее всего, придется данный модуль отключить,для информации загляните в файл utmp.h заголовкаядра (в RedHat максимальное число – 256, что являет-ся вполне достаточным);

� moduleHistoryTruncated – модуль при регистрации про-веряет файл историй используемого командного ин-терпретатора, прописанного в /etc/passwd (поддержа-ны bash, csh и tcsh). Тревожный сигнал выдается, еслифайл не существует или нулевого размера, или этосимволическая ссылка на /dev/null;

� moduleLoginLogout – просто регистрирует, когдапользователь входит и выходит из системы.

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

Page 53: 008 Системный Администратор 07 2003
Page 54: 008 Системный Администратор 07 2003

52

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

Почему, собственно, PythonАдминистраторы БД очень часто нуждаются в инструмен-тах для автоматизации разной рутинной работы, напри-мер: загрузка, преобразования данных в разного родаформаты или сбор и анализ различной статистики. Дляменя в свое время такой палочкой-выручалочкой стал Perl.

Через некоторое время я набрел на Python. Что я могусказать после года знакомства: практичный и полезныйинструмент.

Достоинства языка Python:� Многоплатформенность и масштабируемость: работа-

ет на большинстве известных программно-аппаратныхплатформ от PDA до CRAY и IBM 390.

� Гармоничная архитектура языка:� Простой и удобный для понимания логики программ

синтаксис.� Встроенные структуры данных: списки, кортежи,

словари.

Python глазами DBA

ОЛЕГ ПОПОВ

� Огромное количество библиотек:�XML-парсеры;�GUI (Win32, GTK/GNOME, KDE/QT, TK, FOX, WXWindows);�Сетевые протоколы;�Разработка веб-приложений.

� Переносимость кода между различными платфор-мами.

� Мощные интерфейсы к конкретным ОС (особеннок Linux/Unix и win32).

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

� Встроенная поддержка Unicode и множестванациональных кодировок (включая 5 русских).

� Возможность писать самодокументированныепрограммы и автоматическая генерация докумен-тации на модули.

ОЛЕГ ПОПОВ

Page 55: 008 Системный Администратор 07 2003

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

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

Печатаем результат на stdout. Замечу здесь, чтоmy_cursor.description возвращает описание столбцов зап-роса в виде списка кортежей. Для каждого столбца воз-вращаются следующие данные: (name, type_code,display_size, internal_size, precision, scale, null_ok).

Далее следует форматированный вывод на stdout (по-чти как printf в языке C).

В результате мы увидим что-то вроде:

Запросы с параметрамиСогласно спецификации Python Database API 2.0 для вы-полнения запросов с параметрами каждый модуль дол-жен реализовывать переменную paramstyle, которая оп-ределяет, каким образом будут передаваться параметрызапросов. Текущая версия cx_Oracle(3.0) поддерживаетрежим 'named', то есть в модуле установлена переменнаяcx_Oracle.paramstyle='named' и можно создавать конструк-ции в запросах в виде:

my_cursor=my_connection.cursor()try:my_cursor.execute("""

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

Библиотеки зачастую имеют очень лаконичную доку-ментацию, но этого достаточно, так как API очень выра-зительны и внятны.

Сам процесс кодирования и тестирования достаточнокомфортен. Здесь помогает качественная диагностикаошибок. Оттестированные модули очень легко расширятьи складывать из них приложения.

Для работы с RDBMS Oracle существует несколькоразличных модулей для Python, использующих разныемеханизмы:� ODBC (Win32, Linux)� DCOM (Win32)� PERL_DBI (Win32, Linux, Solaris, HP-UX, AIX)� NATIVE API (Win32, Linux, Solaris, HP-UX, AIX)

Более подробную информацию вы можете найти наwww.python.org.

Выполняем простой запросЯ предпочитаю использовать модуль cx_Oracle, которыйбыл проверен мною в ОС NT и Linux (автор AnthonyTuininga утверждает, что он работает в Solaris и, похоже,на всех Unix-подобных ОС должен также работать). В ос-новном этот модуль следует спецификации PythonDatabase API 2.0 и поддерживает работу с RDBMS Oracleверсий 8.1-9.xx.

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

В этом фрагменте демонстрируется безопасная заг-рузка модуля cx_Oracle и проверка версии. (Надеюсь, эле-гантность синтаксиса все-таки заметили).

Далее создадим экземпляр класса connect – именноэтот объект и обеспечивает взаимодействие с серверомOracle.

Теперь создаем курсор и выполняем запрос:

try: import cx_Oracleexcept ImportError,info: print "Import Error:",info sys.exit()if cx_Oracle.version<'3.0': print "Very old version of cx_Oracle :",cx_Oracle.version sys.exit()

try:my_connection=cx_Oracle.connect('system/manager@test_db')except cx_Oracle.DatabaseError,info: print "Logon Error:",info exit(0)

SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME,SUM(BLOCKS)SIZE_BLOCKS,COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTSGROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME """)except cx_Oracle.DatabaseError,info: print "SQL Error:",info

printprint 'Database:',my_connection.tnsentryprintprint "Used space by owner, object type, tablespace "print "-------------------------------------------------"title_mask=('%-16s','%-16s','%-16s','%-8s','%-8s')i=0for column_description in my_cursor.description: print title_mask[i]%column_description[0], i=1+iprint ''print "-------------------------------------------------"row_mask='%-16s %-16s %-16s %8.0f %8.0f 'for recordset in my_cursor.fetchall():print row_mask%recordset

Database: testdbUsed space by owner, object type, tablespace-------------------------------------------------------------OWNER SEGMENT_TYPE TABLESPACE_NAME SIZE_BLOCKS SIZE_EXTENTS-------------------------------------------------------------ADU2 INDEX USERS 784 25ADU2 TABLE USERS 512 24ADUGKS INDEX DEVELOP_DATA 984 123ADUGKS TABLE DEVELOP_DATA 664 83ADUGPA INDEX USERS 784 25ADUGPA TABLE USERS 496 23AGNKS_SG INDEX USERS 352 22AGNKS_SG TABLE USERS 240 15ATU INDEX USERS 3968 244ATU TABLE DEVELOP_DATA 8 1ATU TABLE USERS 2688 160ATU1 INDEX DEVELOP_DATA 1600 200ATU1 INDEX USERS 608 38ATU1 TABLE DEVELOP_DATA 1032 129ATU1 TABLE USERS 544 34BUX INDEX DEVELOP_DATA 64 8BUX TABLE DEVELOP_DATA 1736 217DISP INDEX USERS 400 25DISP TABLE USERS 528 33EPE INDEX USERS 80 5EPE TABLE USERS 48 3EXZ INDEX USERS 1088 61EXZ TABLE DEVELOP_DATA 8 1EXZ TABLE USERS 832 41

select * from all_users where USERNAME LIKE :S

Page 56: 008 Системный Администратор 07 2003

54

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

При этом связывание параметров запроса со значе-ниями можно выполнить двумя способами.

Именованый параметeр метода exec:

Словарь {':переменная':значение,...}:

Анонимные блоки PL/SQLВ некоторых случаях очень удобно использовать нестан-дартные средства сервера: для Oracle таким нестандарт-ным, но очень удобным механизмом является возможностьисполнения анонимных блоков PL/SQL. Модуль сx_Oracleреализует этот механизм, который, естественно, не опи-сан в спецификации Python Database API 2.0.

Чтобы связать переменные блока PL/SQL c перемен-ными языка Python, в модуле сx_Oracle реализован классvar. Экземпляр можно создать следующим образом:

Конструктор my_cursor.var(...) в качестве параметратребует указать тип создаваемой переменной. Варианты:

Очевидно, что теперь var содержит текущее времясервера. Доступ к значениям переменной выполняется спомощью метода var.getvalue():

Этот пример демонстрирует также и форматированиедаты и времени для экземпляра var. В результате напеча-тается нечто вроде:

В связи с тем, что работа с типами времени и даты внут-ри сервера Oracle реализована особенным образом (неза-висимо от ОС), модуль сx_Oracle реализует следующиефункции для для преобразования значений дат и времени:

Результат будет следующий:

Ссылки:

cursor2.execute("select * from all_users where ↵USERNAME LIKE :S ",S='S%')

BINARYDATETIMEFIXEDCHARLONGBINARYLONGSTRINGNUMBERROWIDSTRING

var=my_cursor.var(cx_Oracle.DATETIME)try: my_cursor.execute("""begin SELECT SYSDATE INTO :p_Value from dual; end;""",p_Value = var)

Date( year, month, day)DateFromTicks( ticks)Time( hour, minute, second)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))CDATE=var.getvalue()print'Date:%02u/%02u/%4u'%(CDATE.day,CDATE.month,CDATE.year)print'Time:%02u:%02u:%02u'%(CDATE.hour,CDATE.minute,CDATE.second)

cursor2.execute("select * from all_users where ↵USERNAME LIKE :S ",{':S':'S%'})

except cx_Oracle.DatabaseError,info: print "SQL Error:",info exit(0)

Date: 12/05/2003Time: 16:42:54

var=my_cursor.var(cx_Oracle.DATETIME)

CDATE=var.getvalue()print 'Date: %02u/%02u/

%4u'%(CDATE.day,CDATE.month,CDATE.year)print 'Time:

%02u:%02u:%02u'%(CDATE.hour,CDATE.minute,CDATE.second)

Date: 12/02/2002Time: 00:00:00

http://computronix.com/utilities.shtmlhttp://www.python.org/topics/database/DatabaseAPI-2.0.html

Page 57: 008 Системный Администратор 07 2003

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

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

Листинг 1Выполняем простой запрос

""cx_Oracle demosimple query"""__AUTHOR__='POPOV O.'__COPYRIGHT__='POPOV O. 2002 Samara, Russia'from sys import exittry: import cx_Oracleexcept ImportError,info: print "Import Error:",info sys.exit()

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

my_cursor=my_connection.cursor()try: my_cursor.execute(""" SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME, ↵ SUM(BLOCKS)SIZE_BLOCKS, COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTS GROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME """)except cx_Oracle.DatabaseError,info: print "SQL Error:",info exit(0)

printprint 'Database:',my_connection.tnsentryprintprint "Used space by owner, object type, tablespace "print "--------------------------------------------------"title_mask=('%-16s','%-16s','%-16s','%-8s','%-8s')i=0for column_description in my_cursor.description: print title_mask[i]%column_description[0], i=1+iprint ''print "--------------------------------------------------"row_mask='%-16s %-16s %-16s %8.0f %8.0f 'for recordset in my_cursor.fetchall():print row_mask%recordsetfor column_description in my_cursor.description: print column_description

""cx_Oracle demoquery with parameters"""__AUTHOR__='POPOV O.'__COPYRIGHT__='POPOV O. 2002 Samara, Russia'from sys import exittry: import cx_Oracleexcept ImportError,info: print "Import Error:",info sys.exit()

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

my_cursor=my_connection.cursor()try: my_cursor.execute(""" SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME, ↵ SUM(BLOCKS)SIZE_BLOCKS, COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTS WHERE OWNER LIKE :S GROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME """,S='SYS%')except cx_Oracle.DatabaseError,info: print "SQL Error:",info exit(0)

printprint 'Database:',my_connection.tnsentryprintprint "Used space by owner, object type, tablespace "print "---------------------------------------------------"title_mask=('%-16s','%-16s','%-16s','%-8s','%-8s')i=0for column_description in my_cursor.description: print title_mask[i]%column_description[0], i=1+iprint ''print "----------------------------------------------------"row_mask='%-16s %-16s %-16s %8.0f %8.0f 'for recordset in my_cursor.fetchall():print row_mask%recordset

Листинг 2Запрос с параметрами

Page 58: 008 Системный Администратор 07 2003

56

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

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

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

Page 59: 008 Системный Администратор 07 2003

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

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

Средства для работы с файлами – одно из немногих слабыхмест системы библиотек языка Java. Файловые библиотекипоявились в самых первых версиях Java и были ориентиро-ваны на операционные системы того времени, главным об-разом на Unix. С тех пор операционные системы ушли дале-ко вперед, а области применения Java чрезвычайно расши-рились. Например, для текстовых файлов стали популярныформаты Unicode (16-битовые, UTF-8). Файловая иерархияв мире Windows резко усложнилась – появились такие поня-тия, как «Desktop», «My Computer», «My Documents». По со-ображениям совместимости фирма Sun была вынужденасохранять старые классы и интерфейсы, дополняя их новы-ми. Получилась довольно запутанная система. В итоге пра-вильная организация работы с файлами в современной Java-программе может оказаться достаточно непростой задачей.

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

Чтение и запись бинарного файлаСамая простая задача – прочитать некоторый файл в видемассива байт, и наоборот, записать массив байт обратнов файл.

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

Вот пример возможного решения.Чтение файла:

Используется вариант FileInputStream байтового пото-ка InputStream.

Обратите внимание: если файл удалось открыть (конст-руктор FileInputStream успешно сработал), то мы закрываемфайл в любом случае, даже если процесс чтения оборвалсяиз-за исключения. Однако исключения в процессе закрытияфайла мы игнорируем. Действительно, если предыдущеечтение произошло безошибочно, т.е. мы успешно прочита-ли весь файл, то на невозможность закрыть файл можно необращать внимания (тем более, что ошибка на этом этапечрезвычайно маловероятна). Если же исключение произош-ло в процессе чтения, то, очевидно, оно представляет боль-ший интерес, чем ошибка при попытке закрыть файл. Зна-чит, «наружу» следует выдать именно исключение, связан-ное с чтением. Если бы мы не проигнорировали исключенияпри закрытии файла, то мы, в соответствии с известнымнеудобным свойством Java, рисковали бы «потерять» ис-ключение при чтении файла в методе f.read().

Обращение к методу length() во втором варианте фун-кции loadFileAsBytes достаточно «безопасно». Этот ме-тод не порождает исключений, а при отсутствии файлаили других возможных проблемах просто возвращает 0,что в данном контексте не приведет ни к чему плохому.

Запись файла:

Используется вариант FileOutputStream байтового по-тока OutputStream.

Здесь обработка исключений несколько сложнее, чем вслучае чтения. Дело в том, что операционная система илиреализация FileOutputStream для конкретной платформымогут кэшировать операции с диском. Например, данные,посылаемые в файл методом f.write(), могут на самом деленакапливаться в некотором буфере, и только при закрытиифайла действительно записываться на диск. Это означает,что потенциальные ошибки на этапе закрытия файла стольже важны, что и ошибки в процессе работы метода f.write().Игнорировать их, как мы делали в случае чтения, нельзя.

Приведенное выше решение игнорирует ошибки на эта-пе закрытия файла только в том случае, если какие-то ошиб-ки уже имели место при записи методом f.write() – после-дние в любом случае окажутся не менее информативными.Если же метод f.write() отработал безошибочно, то закрытие

public static byte[] loadFileAsBytes( String fileName) throws IOException { return loadFileAsBytes(new File(fileName)); }

public static byte[] loadFileAsBytes( File file) throws IOException { byte[] result= new byte[(int)file.length()]; loadFileAsBytes(file,result); return result; }

public static void loadFileAsBytes(File file, byte[] buf) throws IOException { loadFileAsBytes(file,buf,0,buf.length); }

public static void loadFileAsBytes( File file, byte[] buf, int off, int len) throws IOException { FileInputStream f= new FileInputStream(file); try { f.read(buf,off,len); } finally { try {f.close();} catch (Exception e) {}; } }

public static void saveFileFromBytes( String fileName, byte[] buf) throws IOException { saveFileFromBytes(new File(fileName),buf); }

public static void saveFileFromBytes( 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 { FileOutputStream f= new FileOutputStream(file); try { f.write(buf,off,len); } catch (IOException e) { try {f.close();} catch (Exception e1) {}; return; } f.close(); }

Page 60: 008 Системный Администратор 07 2003

58

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

файла выполняется вне каких-либо блоков try/catch, возмож-ные исключения на этом этапе будут переданы наружу.

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

Очевидный путь решения задачи – последовательночитать файл небольшими блоками и записывать их в дру-гой файл.

Вот предлагаемый текст решения:

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

Неочевидным в данном решении является исполь-зование класса RandomAccessFile вместо традицион-ных FileInputStream и FileOutputStream. На самом делеRandomAccessFile здесь использован ради возможнос-ти вызвать метод output.setLength(), отсутствующий вклассе FileOutputStream.

Зачем нужен вызов метода output.setLength()? Каза-лось бы, это совершенно излишняя операция – ведь витоге скопированный файл все равно будет иметь пра-вильный размер.

Секрет здесь заключается в организации современныхоперационных систем, таких как Windows NT/2000/XP. Еслисразу после создания файла «проинформировать» опе-рационную систему о желаемой итоговой длине файлавызовом setLength(), то она сможет более эффективно вы-делить место на диске под этот файл, сведя к минимумувозможную фрагментацию диска. Если же наращиватьфайл постепенно, как получилось бы при отсутствии вы-зова setLength(), то операционная система будет резер-вировать под файл достаточно случайные свободныефрагменты дискового пространства. Возможно, первоговыделенного свободного фрагмента не хватит для запи-си всего файла, и операционной системе придется выде-лять дополнительные фрагменты – файл окажется фраг-ментированным.

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

С другой стороны, вызов setLength() приводит к тому, чтов случае каких-либо ошибок результирующий файл полу-чится либо полной (правильной) длины, но с неверным со-держимым, либо длины 0. Как правило, в таком поведениинет ничего страшного – ошибки при копировании файловвообще редкость. Тем не менее это следует иметь в виду.

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

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

Чтение и записьтекстового файла: кодировкиРабота с текстовыми файлами в Java далеко не так триви-альна, как с бинарными. Внутри Java текстовые данные все-гда хранятся в кодировке Unicode – 16 бит на каждый сим-вол. Но на диске текстовые файлы могут храниться в самыхразных кодировках. Для преобразования кодировок файловв Unicode и обратно нужны специальные классы-преобра-зователи: InputStreamReader и OutputStreamWriter.

Кодировка (encoding) – это способ описания (кодирова-ния) всех возможных символов цепочками битов. «Ранние»кодировки, разработанные еще до появления Unicode, былирассчитаны на 8- или даже 7-битовое представление сим-вола: с их помощью можно записать текст, содержащиймаксимум 256 (или соответственно 128) различных симво-лов алфавита. Современные кодировки, такие как UTF-8или UTF-16, резервируют более 8 бит на 1 символ и позво-ляют представить текст, содержащий любые из 65536 стан-дартных символов Unicode, в том числе иероглифы и все-возможные специальные знаки.

public static void copyFile( String source, String target) throws IOException { copyFile(new File(source),new File(target)); }

public static void copyFile( File source, File target) throws IOException { RandomAccessFile input= new RandomAccessFile(source,"r"); RandomAccessFile output= new RandomAccessFile(target,"rw"); try { byte[] buf = new byte[65536]; long len= input.length(); 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) {}; try {output.close();} catch (Exception e1) {}; return; } try {input.close();} catch (Exception e) {}; output.close(); }

Page 61: 008 Системный Администратор 07 2003

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

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

Каждая кодировка в Java идентифицируется своимименем. Стандартные библиотеки Java гарантированно«понимают» кодировки со следующими именами:� «ASCII» – 7-битовая кодировка ASCII для англоязычных

текстов;� «Cp1252», «ISO8859_1» – 8-битовые расширения ASCII

для западноевропейских языков;� «UnicodeBig», «UnicodeBigUnmarked», «UnicodeLittle»,

«UnicodeLittleUnmarked», «UTF-16» – основные вари-анты 16-битовой кодировки Unicude;

� «UTF-8» – псевдо-8-битовая кодировка Unicode (в дей-ствительности на разные символы отводится разноечисло бит).

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

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

Кодировки «UnicodeBig», «UnicodeLittle» и «UTF-16» пред-полагают, что первые 16 бит файла содержат префикс0xFEFF, указывающий, что файл записан в формате Unicode.Кодировки «UnicodeBigUnmarked» и «UnicodeLittleUnmarked»интерпретируют первые 16 бит файла как первый символтекста. Кодировки «UnicodeBig» и «UnicodeBigUnmarked»предполагают порядок байт big-endian: старший байт каж-дого слова следует в файле перед младшим. Кодировки«UnicodeLittle» и «UnicodeLittleUnmarked» предполагают по-рядок little-endian, более привычный пользователям Intel-про-цессоров: младший байт каждого слова имеет в файле мень-шее смещение от начала файла. При наличии префикса0xFEFF порядок байт касается и способа записи этого пре-фикса: в случае big-endian первым байтом файла будет 0xFE,в случае little-endian – 0xFF. Кодировка «UTF-16» не уточня-ет, какой именно будет порядок байт, но в этом случае пре-фикс 0xFEFF является обязательным. Исходя из способазаписи этого префикса, в готовом файле можно будет опре-делить порядок байт в слове. Кодировка «UTF-8», строгоговоря, не является 8-битовой, хотя и ориентирована на по-байтовое хранение данных. В этой кодировке стандартныесимволы ASCII, имеющие в терминах Unicode коды 0..127,кодируются с помощью только одного байта, а все прочиесимволы «расходуют» 2 или более байт. Эта кодировка –наиболее универсальная и удобная в большинстве случаев.Для текстов, не содержащих национальных и специальныхсимволов, кодировка «UTF-8» столь же компактна, как итрадиционная ASCII, но при этом сохраняется принципиаль-ная возможность записывать любые символы Unicode.

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

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

Наиболее естественно использовать для чтения тек-стового файла постепенно увеличивающийся буферStringBuffer. Вот вариант готового решения:

Прокомментирую основные тонкости.Прежде всего нужно обратить внимание на параметр

encoding. Чтобы прочитать текстовый файл, необходимоуказать кодировку, в которой он записан. Функция допус-кает передачу null в качестве encoding, но это всего лишьозначает, что файл будет прочитан в текущей кодировкеоперационной системы. Скажем, файл с русским текстом,записанный в традиционной для России кодировке Windows(формальное название «Cp1251»), прочитается правиль-но только при условии, что текущим языковым стандартом(Regional Options) является русский.

Все это означает, что параметр encoding можно не ука-зывать в единственном случае: когда предполагается, чтофайл записан в текущей кодировке операционной систе-мы. Если файл записан в какой-то другой кодировке, тоон может быть прочитан в виде совершенно непредска-зуемого «мусора». Это вполне допустимо, например, еслиречь идет о написании простого одноплатформенноготекстового редактора типа Notepad.

Внимание! Передавая null в качестве encoding, неследует полагаться, что латинские символы из стандар-та ASCII-7 (с кодами 0..127), если таковые в файле име-ются, будут гарантированно прочитаны правильно. Бо-лее того, теоретически возможна ситуация, когда файл,содержащий только символы с кодами 0..127, будет про-читан неверно! В принципе в какой-то операционной си-стеме может оказаться, что текущей кодировкой явля-ется UTF-8, UTF-16 или какая-нибудь новая кодировка,которая будет разработана в будущем и которая коди-рует символы совершенно непредсказуемым способом.В данный момент на известных мне версиях Windowsвсе кодировки, предлагаемые операционной системой,хранят латинские символы «как есть», согласно стан-дарту ASCII-7. Но никто не может гарантировать, чтотак будет всегда. Чтобы правильно читать файлы с ла-тинскими символами, записанные в традиционном фор-мате ASCII, нужно явно указывать кодировку «ASCII»или одно из стандартных 8-битовых расширений:«Cp1252» либо «ISO8859_1».

public static String loadFileAsString( File file, String encoding) throws IOException { InputStreamReader f= encoding==null? new FileReader(file): new InputStreamReader( new FileInputStream(file),encoding); StringBuffer sb= new StringBuffer(); try { char[] buf= new char[32768]; int len; while ((len=f.read(buf,0,buf.length))>=0) { sb.append(buf,0,len); } return sb.toString(); } finally { try {f.close();} catch (Exception e) {}; } }

Page 62: 008 Системный Администратор 07 2003

60

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

Следующее замечание касается начальной емкостиStringBuffer (необязательный параметр конструктора).Можно было бы попытаться оценить требуемую емкость,исходя из длины файла и заказанной кодировки. Но длясложных кодировок здесь легко ошибиться, заказав слиш-ком много памяти, особенно учитывая возможное появ-ление новых кодировок в будущем. А это чревато возник-новением ошибки «Out of memory», даже когда на самомделе виртуальной памяти Java достаточно для размеще-ния файла. Ускорение же, которого можно добиться та-ким способом, крайне незначительно и теряется на фоне«расшифровки» сложных кодировок и дисковых опера-ций чтения файла.

Описанную функцию loadFileAsString можно дополнитьверсиями, читающими файл в виде массива символов, атакже работающими с именем файла вместо объекта File:

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

Запись текстового файла – сравнительно простая за-дача, принципиально не отличающаяся от записи бинар-ного файла. Возможное решение:

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

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

public static String loadFileAsString( String fileName, String encoding) throws IOException { return loadFileAsString( new File(fileName),encoding); }

public static char[] loadFileAsChars( String fileName, String encoding) throws IOException { return loadFileAsChars( new File(fileName),encoding); }

public static char[] loadFileAsChars( File file, String encoding) throws IOException { String buf= loadFileAsString(file,encoding); char[] result= new char[buf.length()]; buf.getChars(0,result.length,result,0); return result; }

public static void loadFileAsChars( File file, String encoding, char[] buf) throws IOException { loadFileAsChars( file,encoding,buf,0,buf.length); }

public static void loadFileAsChars( File file, String encoding, char[] buf, int off, int len) throws IOException { InputStreamReader f= encoding==null? new FileReader(file): new InputStreamReader( new FileInputStream(file),encoding); try { f.read(buf,off,len); } finally { try {f.close();} catch (Exception e) {}; } }

public static void saveFileFromString( String fileName, String encoding, String v) throws IOException { saveFileFromString( new File(fileName),encoding,v); }

public static void saveFileFromString( File file, String encoding, String v) throws IOException { if (v==null) { file.delete(); return; } char[] buf= new char[v.length()]; v.getChars(0,buf.length,buf,0); saveFileFromChars(file,encoding,buf); }

public static void saveFileFromChars( String fileName, String encoding, char[] buf) throws IOException { saveFileFromChars( new File(fileName),encoding,buf); }

public static void saveFileFromChars( File file, String encoding, char[] buf) throws IOException { if (buf==null) { file.delete(); return; } saveFileFromChars( file,encoding,buf,0,buf.length); }

public static void saveFileFromChars( File file, String encoding, char[] buf, int off, int len) throws IOException { if (buf==null) { file.delete(); return; } OutputStreamWriter f= encoding==null? new FileWriter(file): new OutputStreamWriter( new FileOutputStream(file),encoding); try { f.write(buf,off,len); } catch (IOException e) { try {f.close();} catch (Exception e1) {}; return; } f.close(); }

Page 63: 008 Системный Администратор 07 2003

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

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

ния null строковой переменной. В этом случае стереть файл(если таковой существует) – самое логичное решение. Про-верять наличие файла перед вызовом метода delete() ненужно: при отсутствии файла (или при возникновении дру-гих проблем) метод delete() возвращает false, не порождаяникаких исключений.

Путешествие по файловой системе:основные трудностиСредства для анализа файловой системы: для работы скаталогами и путями, определения системных свойствфайлов, работы с файлами-ссылками (links) и пр. в Java, ксожалению, реализованы довольно непоследовательно.

Пакет для работы с файлами java.io.* был разработан вте времена, когда на рынке господствовали MS-DOS, ран-ние версии Windows и всевозможные варианты Unix. В ре-зультате этот пакет хорошо «справляется» только с про-стейшими путями к файлам, подчиненными жесткой иерар-хии в соответствии с идеологией Unix (эту идеологию унас-ледовала MS-DOS и вслед за ней Windows). А именно: име-на файлов и подкаталогов, лежащих в некотором катало-ге, образуются добавлением их имен к имени этого ката-лога через символ-разделитель File.separator («\» – дляWindows, «/» – для Unix). В корне иерархии должен лежатьобщий для всех корневой каталог «/» – в случае Unix, вслучае MS-DOS и Windows – корневой каталог диска «C:\»,«A:\» или аналогичный. Все средства объекта java.io.File,предназначенные для работы с путями, такие какFile.getParent(), рассчитаны на эту логику.

В то же время все современные версии Windows с точ-ки зрения пользователя организуют свою файловую сис-тему совершенно иначе. Корнем иерархии обычно являет-ся «рабочий стол» («Desktop»). Его дочерними подкатало-гами (или, если быть точным, дочерними узлами иерар-хии) являются «компьютер» («My Computer»), «папка с до-кументами» («My Documents»), подкаталог для доступа клокальной сети («My Network Places»). Дисковые накопи-тели появляются уже как дочерние узлы «My Computer».

При этом, разумеется, маршрут вроде: Desktop\MyComputer\Local Disk (C:)\подкаталог в Windows никакогосмысла не имеет.

Тем не менее для большинства приложений такая орга-низация файловой системы никак не конфликтует с бо-лее простой логикой пакета java.io.* Дело в том, что «нанижнем уровне» с точки зрения функций работы с фай-лами даже самые последние версии Windows сохранилистарую, унаследованную от MS-DOS структуру файловойсистемы: в корне находятся диски «C:\», «A:\» и т. д. Ка-талоги типа «Desktop» и «My Documents» соответствуютнекоторым каталогам главного диска операционной сис-темы: в случае Windows 2000/XP они расположены в ка-талоге текущего пользователя внутри каталога«Documents and Settings». Любой файл или «обычный»каталог таким образом имеет вполне традиционный Unix-подобный «низкоуровневый» маршрут. Даже файлы излокальной сети Windows имеют традиционные Unix-подоб-ные «низкоуровневые» маршруты типа:

На основе такого маршрута можно создать работоспо-собный объект java.io.File и в случае файла передать егопрочим классам пакета java.io.* для работы с этим фай-лом. Для такого маршрута можно традиционными средства-ми класса java.io.File перейти к родительскому каталогу(File.getParent()), и получится вполне корректный новыймаршрут, если только текущий маршрут не является кор-нем диска или верхнеуровневым псевдонимом подкатало-га для компьютера из локальной сети. Наконец, если эк-земпляр класса java.io.File соответствует обычному ката-логу (в том числе корню диска), то традиционные средстваэтого класса позволяют корректно получить все подката-логи и файлы, лежащие внутри него, и работать с ними.

Пока приложение нуждается только в манипуляциях сфайлами внутри некоторого обычного каталога (имя ко-торого получено из диалога выбора файла или из конфи-гурационного файла), проблем не возникает. Такая ситу-ация достаточно типична для «невизуальных» и даже длямногих визуальных приложений, в которых вся работа сдиском сводится к манипуляциям с файлами внутри не-которого специального каталога, отведенного под это при-ложение. Но если нужно, например, показать пользова-телю полное дерево всех доступных файлов, включая се-тевое окружение, причем стандартные диалоги выборафайла почему-либо не устраивают, – тут средства пакетаjava.io.* недостаточны. Другой пример нехватки возмож-ностей java.io.*: этот пакет не способен определить ката-лог документов текущего пользователя Windows 2000/XP,а это очень неплохая «точка отсчета» для размещениярабочих файлов приложения.

Чтобы поддержать современные файловые системы,компания Sun разработала новый отдельный пакетjavax.swing.filechooser.* Он размещен внутри графическойбиблиотеки Swing и рассчитан на использование совмест-но с диалогом выбора файла javax.swing.JFileChooser. Темне менее возможности, предлагаемые этим пакетом, точ-нее, классом javax.swing.filechooser.FileSystemView, не име-ют никакого отношения к визуальному интерфейсу. В дей-ствительности методы этого класса куда логичнее смотре-лись бы в пакете java.io.*

Сегодня средства для анализа и управления файло-вой системой в Java распределены по двум классам:java.io.File и javax.swing.filechooser.FileSystemView. Клас-сы эти непохожи по организации и частично перекрыва-ют возможности друг друга, так что порой не так простоопределить, какой из них выбрать.

Попробуем разобраться в этих двух классах.

Путешествие по файловой системе:класс java.io.FileКласс java.io.File, вопреки названию, является представ-лением не собственно файла, а маршрута к файлу илиподкаталогу. (И почему его не назвали, скажем, «Path»?)Создание экземпляра File никак не связано с созданиемфайла, для работы с файлами служат потоки ввода-вы-вода. По сути, класс File можно считать специализиро-ванным вариантом класса String, рассчитанным на рабо-ту с маршрутами к файлам/подкаталогам и, что отличаетего от String, допускающим создание наследников."\\èìÿ_êîìïüþòåðà\ïñåâäîíèì_ïîäêàòàëîãà\îáû÷íûé_ìàðøðóò..."

Page 64: 008 Системный Администратор 07 2003

62

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

Экземпляр File обычно создается одним из конструк-торов:

Смысл их достаточно очевиден. В качестве pathname(или parent) нужно указывать маршрут к файлу/подката-логу (соответственно к каталогу, содержащему файл/под-каталог), например, «/tmp/a», «myfile.txt» или «c:\abc.java».Путь (маршрут) считается абсолютным, если начинаетсясо слэша (/ или \) или c буквы диска с последующим слэ-шем в случае DOS/Windows. В противном случае путь счи-тается относительным и отсчитывается от текущего ка-талога операционной системы.

Разработчики Java разрешили при создании экзем-пляра File для разделения каталогов в маршруте все-гда использовать «универсальный» прямой слэш /, по-мимо стандартного разделителя File.separator (\ в слу-чае Windows).

Преобразование объекта File в строку (метод toString()или полностью эквивалентный ему getPath()), как и сле-довало ожидать, возвращает исходный маршрут, которыйбыл передан в конструктор. Но все прямые слэши при этомзаменяются на File.separator. Вообще, все методы классаFile, возвращающие путь к файлу в виде строки, возвра-щают его в «нормализованном» виде, т.е. с заменой всехпрямых слэшей на File.separator.

Если объект File содержит относительный маршрут кфайлу/подкаталогу, то его можно преобразовать в абсо-лютный методами getAbsoluteFile() или getAbsolutePath()(первый возвращает File, второй – String). Все, что дела-ют эти методы, – добавляют перед началом относитель-ного пути маршрут к текущему каталогу. Эти методы ис-ключений не порождают, но могут вызвать обращение кдиску для определения текущего каталога.

Два похожих метода – getCanonicalFile() и getCanonical-Path() – делают несколько больше. Пользуясь средства-ми операционной системы, они пытаются привести имяфайла/подкаталога к единообразному виду, одинаково-му для одинаковых реальных положений файла/подката-лога в файловой системе. Например, на моем компьюте-ре (Windows XP) c текущим основным диском E: вызовы:

и

возвращают одинаковую строку:

Каталога E:\tm у меня на самом деле нет. Если бы онбыл, но реально назывался «TM» (заглавными буквами),то указанные вызовы вернули бы строку:

так как с точки зрения Windows каталоги «E:\tm» и «E:\TM»идентичны. Методы getCanonicalFile() и getCanonicalPath(),разумеется, не гарантируют получения одного результа-та для всех возможных маршрутов к одному и тому жефайлу/подкаталогу. Скажем, в случае Windows они «ни-чего не знают» о маршрутах в локальной сети типа«\\имя_моего_компьютера\e\tm\1.txt». Эти методы могутпорождать исключение IOException.

Главные методы класса File, обеспечивающие «нави-гацию» по файловой системе, следующие:

А также уже упомянутые конструкторы:

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

Как раз эти методы, прекрасно работавшие в DOS и Unix,безнадежно «морально устарели» в современных версияхWindows. «Подъем» к родителю по файловому дереву озна-чает банальное удаление последнего элемента в цепочкекаталогов, разделенных слэшем или File.separator.

Например, у каталога «\\имя_моего_компьютера\e»(диск E моего компьютера в виде «сетевого» маршрута)родителем оказывается «\\имя_моего_компьютера», а унего, в свою очередь, «\\» – «фальшивые» каталоги, с ко-торыми класс File не может сделать ничего полезного. По-пытка узнать все корневые каталоги вызовом listRoots()даже в современной Windows XP вернет список корневыхкаталогов всех дисков, полностью игнорируя такие поня-тия, как «сетевое окружение», «рабочий стол», «мои до-кументы». Ниже мы обсудим «современную» альтернати-ву – класс javax.swing.filechooser.FileSystemView.

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

(new File("\\tm/../tm/1.txt")).getCanonicalPath()

(new File("e://tm/1.txt")).getCanonicalPath()

E:\TM\1.txt

E:\tm\1.txt

public File(String pathname) public File(File parent, String child) public File(String parent, String child)

public File getParentFile() public String getParent() public String getName() public File[] listFiles() public File[] listFiles(FileFilter filter) public String[] list() public String[] list(FilenameFilter filter) public static File[] listRoots()

public File(File parent, String child) public File(String parent, String child)

public boolean exists() public boolean isDirectory() public boolean isFile() public boolean isHidden() public long lastModified() public long length() public boolean canRead() public boolean canWrite() public boolean delete()

Page 65: 008 Системный Администратор 07 2003

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

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

Все эти методы, кроме createNewFile(), не порождаютисключений.

Как видите, набор возможностей для современных опе-рационных систем исключительно бедный, учитывая, чтоэто единственный класс пакета java.io.*, предлагающийподобный сервис. (Мы не считаем класс java.io.FileSystem,обеспечивающий то же самое, но несколько менее удоб-ным способом.) Удивительно, что метод isHidden() не име-ет парного setHidden(), а setReadOnly() работает только«в одну сторону», не позволяя снять атрибут «read-only».

Еще класс File обеспечивает несколько вспомогатель-ных возможностей – создание временных файлов и пре-образование маршрута к формату URI, и наоборот. Так-же этот класс предоставляет строковые константыseparator, pathSeparator и их синонимы типа char:separatorChar и pathSeparatorChar.

Путешествие по файловой системе: классjavax.swing.filechooser.FileSystemViewКласс javax.swing.filechooser.FileSystemView – это библиоте-ка методов для работы с объектами типа File. Эта библиоте-ка, прежде всего, позволяет перемещаться по файловойсистеме (переходить к «родителю» и получать список «де-тей»), причем в современном стиле: корнем иерархии дляWindows служит рабочий стол «Desktop», в нем имеетсявыход в «My Computer» и локальную сеть, и т. д. Кроме того,библиотека FileSystemView открывает доступ к дополнитель-ным свойствам файлов, подкаталогов и иных, «нефайло-вых» элементов файловой системы типа «Desktop».

Чтобы использовать FileSystemView, нужно вначалеполучить экземпляр библиотеки с помощью статическо-го метода getFileSystemView():

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

Получив экземпляр, можно использовать следующиеметоды:

Эти методы «перекрывают» основные методы и конст-рукторы класса File, предназначенные для «навигации» пофайловой системе. Данные методы работают уже в «со-временном» стиле. Если мы попытаемся подняться от лю-бого файла (созданного либо через createFileObject, либо

конструктором класса File) до корня иерархии, последова-тельно вызывая метод getParentDirectory, то под Windowsмы в конце концов доберемся до каталога «Desktop». Ме-тод getRoots также честно возвращает этот единственныйкаталог. Если мы будем считывать дерево каталогов, вы-зывая getFiles для корневого каталога «Desktop», затем дляего элементов, затем для их элементов и т. д., мы увидимпримерно то же самое, что видит пользователь в любомстандартном диалоге выбора файла Windows: «My Com-puter», «My Network Places» и т. д.

Очень поучительно написать тест, считывающий «вер-хние этажи» дерева каталогов с помощью этих методов ираспечатывающий для каждого элемента (объекта File)результаты вызовов toString(), getAbsolutePath(), getCano-nicalPath(), getParent(), listFiles(), а также имя классаgetClass(). Также интересно распечатать аналогичную ин-формацию для каталогов, получаемых подъемом к кор-ню вызовами getParentDirectory от произвольных обычныхмаршрутов, созданных конструктором класса File.

Оказывается, что классы объектов File, полученных та-ким способом, в действительности часто являются наслед-никами стандартного класса java.io.File, чаще всего (в слу-чае Windows) это класс sun.awt.shell.Win32ShellFolder. Этогоследовало ожидать. Обычный класс File в принципе не спо-собен представить такую сущность, как «My Computer».Действительно, практически любой маршрут, хранящийсяв объекте File, который мы бы могли придумать для обо-значения «My Computer», одновременно соответствовал быкакому-нибудь вполне допустимому файлу, а его методывроде getParent() вообще возвращали бы ерунду.

На самом деле любой вызов getParentDirectory возвра-щает для Windows объект «внутреннего» класса фирмыSun sun.awt.shell.Win32ShellFolder (наследника File), при-чем если исходный маршрут был относительным, он ав-томатически преобразуется в абсолютный. У такого объек-та методы getParent() и listFiles() работают уже «правиль-но», так же, как getParentDirectory и getFiles. Метод list(),судя по всему, возвращает имена только для «обычных»файлов/подкаталогов, опуская имена дисков или элемен-тов типа «My Computer».

Методы getPath() и getAbsolutePath() для «нефайловых»объектов типа «Desktop» возвращают путь к каталогу, ко-торый в операционной системе соответствует данной вы-сокоуровневой сущности, при отсутствии такового (как вслучае «My Computer») – некоторые абстрактные имена.

Описанные свойства наследников класса File, возвраща-емых методами FileSystemView, выяснены из тестированияна версии JDK 1.4.1. В документации они, судя по всему, неописаны, так что полагаться на них не стоит. Для переме-щения по файловой системе следует использовать докумен-тированные методы FileSystemView getParentDirectory,getChild, getFiles...

Важное замечание: в отличие от класса File, библио-тека FileSystemView рассчитана на работу не с произволь-ными маршрутами, а только с путями к реально существу-ющим файлам или подкаталогам. Например, методgetParentDirectory для несуществующего файла/подката-лога (созданного конструктором File для маршрута, не со-ответствующего реальному файлу или каталогу) попрос-

FileSystemView fsv=FileSystemView.getFileSystemView();

public File getParentDirectory(File dir) public File getChild(File parent, String fileName) public File createFileObject(File dir, String filename) public File createFileObject(String path) public File[] getFiles(File dir, boolean useFileHiding) public File[] getRoots()

public void deleteOnExit() public boolean createNewFile() public boolean mkdir() public boolean mkdirs() public boolean renameTo(File dest) public boolean setLastModified(long time) public boolean setReadOnly()

Page 66: 008 Системный Администратор 07 2003

64

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

ту вернет null. Метод File.getParent() в этом случае на об-щих основаниях «отрезал» бы от маршрута конечнуючасть, начиная от последнего слэша.

Кроме описанных, библиотека FileSystemView предла-гает также следующие методы:

Первый из них под Windows возвращает каталог «MyDocuments», а второй – каталог «Desktop».

Эти методы (в дополнение к традиционным методамisDirectory() и isFile() класса File) позволяют распознать «спе-циальные» узлы файловой иерархии, не соответствующиеобычным файлам или подкаталогам. Точный их смысл опи-сан в документации на FileSystemView. Все «обычные» фай-лы и подкаталоги, которые можно корректно представитьклассом File, относятся к категории isFileSystem. Часто бы-вает полезно сочетание свойств:

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

Если судить по документации, это просто дубликатобычного f.isHidden().

Этот метод обобщает f.isDirectory() на случай «необыч-ных» элементов файловой системы, таких как соседниекомпьютеры в локальной сети. Несколько необычный типрезультата, видимо, выбран по аналогии с другим клас-сом javax.swing.filechooser.FileView, обслуживающим нуж-ды визуального компонента JFileChooser.

Эти методы предназначены для визуального отображе-ния файлов или подкаталогов в виде списка (например, вдиалоге выбора файла). Метод getSystemDisplayName по-зволяет узнать, как операционная система рекомендуетименовать данный элемент. Для корня диска C:\ может бытьполучено что-то вроде «WINDOWS (C:)», для рабочего сто-ла – «Desktop». Метод getSystemTypeDescription дополняетимя элемента описанием, которое обычно можно увидетьпри просмотре каталога в режиме «Details». Например, это

может быть «File Folder», «Text Document» для txt-файла,«Application» для exe-файла. Наконец, метод getSystemIconвозвращает иконку, которую операционная система реко-мендует использовать для графического представленияданного файла или подкаталога.

Этот метод не имеет аналогов в классе File. В рамкахпакета java.io.* для аналогичных целей должен был быиспользоваться примерно такой вызов:

(возможно, с предварительным приведением маршрутовк каноническому виду методами getCanonicalPath). При ра-боте с более сложными современными файловыми систе-мами подобная проверка строк была бы некорректна. Дей-ствительно, folder.getPath() может вернуть «My Computer»как для настоящего элемента «My Computer» – родителякаталога «C:\», так и для подкаталога с именем «MyComputer» в текущем каталоге Windows. Попытка исполь-зовать getCanonicalPath не привела бы к успеху – для «MyComputer» метод getCanonicalPath порождает исключение,так как никакому осмысленному каталогу подобный эле-мент файловой системы не соответствует.

На самом деле современная реализация метода isParent(JDK 1.4.1) устроена крайне неэффективно. Если folder –наследник некоего внутреннего класса sun.awt.shell.Shell-Folder (именно такие наследники получаются для всех ка-талогов, возвращаемых методами FileSystemView), то ме-тод isParent, не мудрствуя лукаво, получает полный списоквсех «детей» folder (вызовом getFiles) и поочередно срав-нивает объект file с каждым из них.

Вот типичный пример скрытой квадратичности, глубо-ко «закопанной» в исходниках библиотечных модулей. Вчастности, такая реализация порождает ужасающее «тор-можение» визуального компонента JFileChooser при попыт-ке просматривать с помощью клавиатуры каталог из со-тен или тысяч файлов. Связано это с тем, что любое пере-мещение курсора по каталогу приводит к вызову методаsetSelectedFile, делающему новый файл активным. Этотметод проверяет (вызовом isParent), точно ли текущийвыбранный каталог является «родителем» по отношениюк новому файлу, и если это не так, изменяет текущий ката-лог. Действие в данной ситуации, вообще говоря, бессмыс-ленное. (Это издержки общей организации модуляJFileChooser: один и тот же метод setSelectedFile использу-ется и для управления компонентом «снаружи», когда те-кущий каталог действительно может измениться, и при ре-акции на стрелки «вверх»/«вниз».) Проверка нового выб-ранного файла методом isParent требует полного перебо-ра всех файлов текущего каталога, так как каталоги вJFileChooser всегда представлены наследниками File, сге-нерированными методами FileSystemView. В результатекаждое нажатие на стрелку «вверх»/«вниз» приводит клинейному перебору каталога, а полная прокрутка катало-га с помощью стрелок на клавиатуре означает квадратич-ное число операций.

fsv.isFileSystem(f) && !fsv.isRoot(f) && !fsv.isFileSystemRoot(f);

public File getDefaultDirectory() public File getHomeDirectory()

public boolean isFileSystem(File f) public boolean isRoot(File f) public boolean isFileSystemRoot(File dir) public boolean isDrive(File dir) public boolean isFloppyDrive(File dir) public boolean isComputerNode(File dir)

public boolean isHiddenFile(File f)

public Boolean isTraversable(File f)

public String getSystemDisplayName(File f) public String getSystemTypeDescription(File f) public javax.swing.Icon getSystemIcon(File f)

public boolean isParent(File folder, File file)

file.getParent().equals(folder.getPath())

Page 67: 008 Системный Администратор 07 2003

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

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

Аналогичное «скрытое» торможение легко можно полу-чить, легкомысленно пользуясь методами getDefault-Directory() и getHomeDirectory(), которые могут понадобить-ся и в совершенно «невизуальной» программе. Эти методытоже возвращают наследников ShellFolder, и для них isParentработает медленно. В моей практике был случай, когда про-грамма начала загружаться в десятки раз медленнее (не-сколько минут) только из-за того, что в момент старта былдобавлен простой анализ содержимого каталога getDefault-Directory(). Причина оказалась именно в методе isParent,превратившего нормальный линейный алгоритм анализа вквадратичный. Самое неприятное, что проблема проявля-лась только в случае, когда каталог «My Documents» содер-жал много элементов – ситуация типичная для рядовогопользователя, но сравнительно редкая для хорошо структу-рированных файловых систем профессионалов.

Надо надеяться, что в будущих версиях Java фирмаSun оптимизирует метод isParent, устранив оттуда пере-бор. Для подавляющего числа ситуаций, когда каталогвполне «нормальный» (что можно определить вызовомisFileSystem), перебор совершенно не нужен. Пока что ярекомендую, если это возможно и допустимо логикой про-граммы, всегда конвертировать каталоги, полученные откласса FileSystemView, в обыкновенные объекты File:

Например, это можно проделать с каталогомgetDefaultDirectory(), если программе нужно просто про-читать оттуда какие-то конфигурационные или другиефайлы. Кроме того, это почти всегда можно сделать, есливыполнено условие:

Путешествие по файловой системе:недокументированный классsun.awt.shell.ShellFolderКак оказывается, даже с помощью класса FileSystemViewнельзя написать программу, адекватно работающую с фай-ловыми системами современной Windows XP. В этой вер-сии Windows большое значение имеют «ссылки» (links) или«ярлыки». В ранних версиях Windows это были файлы срасширением «.lnk», сейчас к ним добавились специальноорганизованные подкаталоги. С точки зрения пользовате-ля «ярлык», ссылающийся на некоторый каталог, долженвести себя подобно этому каталогу. Щелчок по «ярлыку»(например, в диалоге выбора файла) должен открывать этоткаталог. Доступ к локальной сети из основной файловойиерархии в Windows XP организован именно через «ярлы-ки»: компьютеры пользователей-«соседей» («My NetworkPlaces») представлены маленькими виртуальными подка-талогами-«ярлыками» в локальном дисковом каталоге те-кущего пользователя. (Эти подкаталоги физически нахо-дятся внутри скрытого подкаталога NetHood, лежащего вглавном каталоге пользователя.)

К сожалению, в текущей версии Java не предусмотре-но никаких документированных средств для работы с «яр-

лыками». С точки зрения стандартных библиотек Java файлс расширением «.lnk» – это просто некоторый двоичныйфайл с недокументированным строением, а подкаталог-«ярлык» из «My Network Places», ссылающийся на другойкомпьютер – это самый обычный подкаталог с двумя слу-жебными файлами. В результате дерево файловой систе-мы, построенное с помощью документированных библио-тек Java в Windows XP, оказывается принципиально не-полным – содержимое компьютеров локальной сети тудане попадает. Это особенно заметно при использованиистандартного диалога выбора файла JFileChooser – ком-пьютеры из «My Network Places» там видны, но попытказайти на них заканчивается, мягко говоря, странно.

К счастью, фирма Sun уже реализовала механизм об-работки файлов-«ссылок» Microsoft Windows, хотя пока недокументировала его. Это уже упоминавшийся выше классsun.awt.shell.ShellFolder. Помимо прочих методов, имеющихдокументированные эквиваленты в классе FileSystemView,класс ShellFolder содержит следующие два метода:

Вот как можно ими пользоваться:

Надо надеяться, что скоро эти методы станут докумен-тированными или, что более вероятно, получат документи-рованные эквиваленты в классе FileSystemView. Вероятно,что одновременно компания Sun исправит диалог выборафайла JFileChooser, с тем чтобы он начал корректно рабо-тать с локальной сетью Windows XP. Пока что можно прижелании «исправить» поведение JFileChooser для локаль-ной сети и других ярлыков XP самостоятельно. Простейшийспособ это сделать – реализовать собственного наследни-ка JFileChooser и перекрыть в нем методы isTraversable,setCurrentDirectory, getCurrentDirectory. Приблизительно этовыглядит так (здесь isLink и getLinkLocation – приведенныевыше методы):

f= new File(f.getPath());

fsv.isFileSystem(f)

public abstract boolean isLink(); public abstract ShellFolder getLinkLocation() throws FileNotFoundException

public static boolean isLink(File f) { try { return sun.awt.shell.ShellFolder .getShellFolder(f).isLink(); } catch (FileNotFoundException e) { return false; } }

public static File getLinkLocation(File f) throws FileNotFoundException { 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; }

public boolean isTraversable(File f) { if (super.isTraversable(f)) return true; if (f!=null && isLink(f)) { try { return super.isTraversable( getLinkLocation(f)); } catch (FileNotFoundException e) { } }

Page 68: 008 Системный Администратор 07 2003

66

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

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

return false; }

public void setCurrentDirectory(File f) { if (f!=null && isLink(f)) { try { super.setCurrentDirectory( getLinkLocation(f)); } catch (FileNotFoundException e) { } } super.setCurrentDirectory(f); }

public File getCurrentDirectory() { File dir= super.getCurrentDirectory(); if (dir!=null && isLink(dir)) { try { return getLinkLocation(dir); } catch (FileNotFoundException e) { } } return dir; }

тупа файловой системы NTFS. Остались «за бортом»многие понятия Windows, такие как каталоги «My Pictures»или «My Music». Если все-таки подобные возможностинеобходимы, то, к сожалению, единственный выход – ре-ализовывать недостающие функции самостоятельно ввиде native-кода для всех операционных систем, под ко-торыми предполагается эксплуатировать программу.

ЗаключениеМы рассмотрели ряд основных задач, возникающих приработе с файлами в Java, а также всевозможные нюансыи «подводные» камни, связанные с их решением. Я поста-рался приводить только тщательно протестированные ипродуманные фрагменты кода. К сожалению, этот код былдолжным образом протестирован только под Windows. Неисключено, что файловые системы Unix или Macintosh мо-гут добавить свои сюрпризы к уже описанным здесь.

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

Page 69: 008 Системный Администратор 07 2003
Page 70: 008 Системный Администратор 07 2003

68

образование

MAC OS X

или

ТО, ЧТО ДОЛЖЕН ЗНАТЬ КАЖДЫЙПРО MACINTOSH, APPLE

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

АЛЕКСАНДР ПОТЕМКИН

Page 71: 008 Системный Администратор 07 2003

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

образование

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

Итак, желание осуществилось – нас «познакомили»,вот тут все и началось...

Я расскажу историю развития компьютеров Apple (темсамым затронув создание первых персональных компью-теров) и самой фирмы Apple, а также расскажу про пос-леднюю (на момент написания этих строк) версию опера-ционной системы Mac OS X.

Появление первогоперсонального компьютера(небольшая историческая вводная)Первым персональным компьютером (в том смысле, чтоего можно было «взять с собой») следует считать компь-ютеры Altair. Однако первые Altair сложно назвать полно-ценными «компьютерами» – раз; компьютерами, «пригод-ными» для обычного пользователя – два.

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

Небольшое лирическое отступление о развитии ком-пьютеров в 1970-х годах: основными пользователями быликомпьютерные профессионалы – хакеры. Их карьера восновном начиналась за большими компьютерами фир-мы Dell либо IBM (последние популярностью не пользова-лись). Компьютерное время было весьма дорогим, а тягак компьютерам – очень высока. Так стали появляться пер-вые компьютеры, собранные «для себя».

Одним из таких компьютеров, пущенных в «промыш-ленное» производство, были компьютеры Altair фирмыMITS. Сразу же после организации этой фирмы она былазавалена заказами на год вперед. Люди платили деньгиза возможность получить пакет с микросхемами и схемойсбора всех деталей в один блок.

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

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

Процессором компьютера стал чип 6502 от MOSTechnology (основным критерием при выборе этого чипа былацена), микросхемы, способные работать с этим процессо-ром, ему подарил Дэн Сокол на одном из собраний клуба.

Через некоторое время Возняк собрал свой компью-тер так, что все уместилось на одну плату (что было дос-таточно красивым решением). Кроме того, ему пришлосьнаписать свой Basic, так как единственной на тот момент

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

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

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

Компания Apple Inc.Джобсу удалось заполучить в команду менеджера по име-ни Майк Марккула, который раньше занимался организа-цией продаж и добился на этом поприще больших успе-хов. С тех пор как он уволился из Intel, Марккула зани-мался различными бизнес-проектами.

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

Следующим привлеченным в компанию человеком былДжон Скалли – президент отделения Pepsi-Cola, крупней-шего в составе PepsiCo.

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

Фраза Джобса, обращенная к Скалли: «У вас никогдане возникало желания изменить мир? Или вы намереныпровести остаток жизни, продолжая торговать подслащен-ной водой?» положила начало весьма тесным отношени-ям между ними, которым в дальнейшем, увы, будет суж-дено распасться.

Джон Скалли становится президентом компании в ап-реле 1983 года.

К началу 1980 года годовой оборот фирмы превысил10 миллионов долларов.

Первые проблемыПосле Apple II у компании начались первые неприятнос-ти. 19 мая 1980 г. был презентован новый компьютер –Apple III. Технически эта машина была более совершен-на, однако именно с нее и начинается череда неудач: пос-ле серии задержек продукт был выпущен на рынок в не-доработанном виде, в результате чего так и не был «при-знан» пользователями. Одной из основных причин подоб-ных проблем была следующая: это был первый компью-тер, который собирался в условиях «фирмы» командойинженеров, которыми руководил Джобс.

В 1983 году выходит компьютер Lisa, использующийвсе преимущества графического интерфейса (разрабо-танного в Xerox) и оснащенный 1Mb оперативной памяти,Motorolla 68000 CPU (32 bit, 5Mhz), 2 приводами для дис-кет, жестким диском на 5Mb.

Марккула отстранил Стива (Джобса, Возняк сам ото-

Page 72: 008 Системный Администратор 07 2003

70

образование

шел от дел после серьезной авиакатастрофы в 1981 году)от работы над этим компьютером, в результате чего всяэнергия Джобса была брошена на компьютер Macintosh.

Компьютеры Lisa станут популярными с выходом«Lisa 2» и значительным снижением цены ($3495 против$9995), однако после назначения на должность руководи-теля проектами Lisa и Macintosh Стив позаботится о зак-рытии первого проекта.

Джобс активно продвигал свое детище, в результатечего Macintosh стал гораздо более популярным, нежелиLisa. Тому способствовала и грамотная маркетинговаякомпания, и, что самое главное, сам неутомимый Джобс.

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

NeXT Inc.«К 1985 году объемы продаж Apple достигли $2 млрдвпервые за непродолжительную историю компании нача-

ли сокращаться, в то время как рыночная доля персональ-ных компьютеров IBM и совместимых с ней моделей всеувеличивалась. Apple попала в непростую ситуацию, тре-бующую немедленного вмешательства старших.

…Apple было крайне необходимо сократить цикл раз-работки новых моделей, большую часть которого состав-ляли задержки, вызванные неудержимым стремлениемДжобса к совершенству. Кроме того, Джобс все чаще сталвмешиваться в деятельность других подразделений ком-пании, уже не довольствуясь властью только над отделе-нием компьютеров Macintosh. Менеджеры всех подразде-лений завалили Скалли жалобами, суть которых своди-лась к одному: либо над Джобсом будет быстро установ-лен контроль, либо все судно пойдет ко дну.

…Наконец, после долгих и мучительных колебаний,Скалли принял решение лишить своего друга и учите-ля реального влияния над деятельностью компании,удалив его на символическую должность председателясовета директоров Apple. Столь принципиальное изме-нение баланса сил внутри компании требовало одоб-рения Майка Марккула и совета директоров Apple. Не-задолго до начала заседания совета директоров 10 ап-реля 1985 года Скалли отозвал Джобса в сторону ирассказал ему о своих планах. Джобс отреагировал

Page 73: 008 Системный Администратор 07 2003

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

образование

словно ребенок, которого отправляют в чужую семьюна воспитание против его воли.

…Наконец, после бесконечного обсуждения, начавше-гося ранним вечером и завершившегося почти сутки спу-стя, совет директоров Apple принял единогласное реше-ние отправить Джобса в почетную отставку…» (1)

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

Создание компанииДжобс с помощью семи сооснователей, покинувших Appleвместе с ним, в 1985 году создает компанию NeXT Inc.(позже преобразованную в NeXT Computer Inc.) с устав-ным фондом в 7 миллионов долларов.

Стив Джобс посещает большинство американских уни-верситетов в поисках интересных технологий, так, в Уни-верситете Карнеги Милона он знакомится с Avie Tevanian,работающим над ядром Mach.

Adobe и NeXT начинают совместную разработку DisplayPostScript, базу будущей системы NeXTSTEP. В 1987 годуNeXT создает завод, способный выпускать 150’000 ком-пьютеров в год (всего NeXT за всю свою историю собра-ла 50’000 компьютеров).

12 октября 1988 Стив Джобс организовывает шоу вСан-Франциско, демонстрирует все возможности новойэлегантной машины NeXTcube (с магнитооптическим дис-ком на 256Mb, 68030 процессором, без жесткого диска ипривода для дискет) и системы NeXTSTEP (версии 0.8).

18 сентября 1990 Стив Джобс устраивает новое шоу вСан-Франциско для презентации новой машины и новойсистемы NeXTSTEP 2.0. Эта дата считается датой офи-циального выхода компьютера NeXT.

Tim Berners-Lee, работающий в CERN, разрабатываетпервый веб-клиент (браузер) для NeXTSTEP.

25 апреля 1991 Стив Джобс организовывает шоу вCNIT в Париже, приуроченное к официальному выходукомпьютеров NeXT во Франции.

Были произведены многочисленные демонстрациимашин 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 объявляет о лицензиро-вании части кода NeXTSTEP для будущего использова-ния в операционной системе Solaris. NeXT, в свою оче-редь, анонсирует порт NeXTSTEP на компьютеры на плат-форме SUN – SPARC.

Сразу же после этого соглашения SUN инвестирует

10 миллионов долларов в NeXT.В 1994 году NeXT публикует спецификации программ-

ного обеспечения, названные OpenStep, базирующиесяна системе NeXTSTEP 3.2. Инициатива получает поддер-жку в лице GNU – начато развитие GNUstep.

В апреле 1995 года NeXT выкупает все права наObject-C у Stepstone. В это же время выходит PDO (PDO –Portable Distributed Objects – система для распределен-ных вычислений) и NetInfo – программа, шедшая стандар-тно с NeXTSTEP.

В июне 1995 NeXT выпускает NeXTSTEP 3.3J и EOF1.1J – японские версии программного обеспечения.

20 декабря 1996 года Apple выкупает NeXT за 400миллионов долларов. Впрочем, некоторые утверждаютобратное. Загадочная картина на официальном сайтепредшествовала анонсу. В любом случае, это уже дру-гая история, которая начинается 24 марта 2001 года свыходом Mac OS X.

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

Стив продолжает политику оригинального дизайнакорпуса машины (машины NeXT были «упакованы» ввесьма стильный черный корпус) и доводит ее до логи-ческого завершения: с момента своего зарождения«Маки» по праву считались самыми простыми и понят-ными в использовании.

Политика Стива Джобса основывается на том, что ком-пьютер не должен более восприниматься как нечто слож-ное, скорее, как еще одна часть интерьера, бытовой тех-ники. Именно этим обуславливается исключительный ди-зайн корпусов последних компьютеров (самый яркий при-мер – iMac) от Apple, а также серия программ, начинаю-щихся с буквы «i» (iTunes, iMovie, iDVD, iPhoto) – идеоло-гия простых программ. Apple видит компьютер как про-стое, но в то же время весьма мощное средство для вы-полнения любых задач любыми пользователями.

Macintosh: каков создатель,таков и компьютер...Маки – творение фирмы Apple под четким руководствомСтива Джобса – человека, благодаря бешеной энергиикоторого и была создана эта «яблочная фирма». Крат-кой характеристикой Джобса может служить такое опи-сание: самоуверенный, немного эгоистичный и, несом-ненно, талантливый харизматичный лидер. Однако со-здателем первого Мака был друг Джобса – Стив Возняк,талантливый хакер (в изначальном значении этого сло-ва) по натуре достаточно спокойный, оригинальный и ве-селый человек. Пожалуй, именно эти качества можнонайти в Маках до сих пор. Каждая машина по-своемуоригинальна, имеет свои достоинства и недостатки. Кро-ме того, основным преимуществом фирма Apple можетсчитать по праву тот факт, что можно взять любого че-ловека с улицы, посадить его за Макинтош и через 15-20 минут он уже сможет выполнять большинство необ-ходимых функций. Однако это уже операционная систе-ма, а о ней разговор отдельный.

Page 74: 008 Системный Администратор 07 2003

72

образование

Операционные системы от Apple

Mac OS 9 (Classic)На Маках от рождения могут «бегать» две операционныесистемы – Mac OS X и Mac OS 9 – это родное. Впрочем,последнее творение Apple упорно пытается вытеснить срынка своей более новой системой («десяткой»).

Приживить на Мак можно любую систему, работаю-щую на процессорах PowerPC, а это как минимум Linux,OpenBSD, NetBSD, QNX, однако в родной системе, по-моему, есть своя прелесть и менять ее особого смысла яне вижу.

Итак, в арсенале компании Apple существует две опера-ционные системы: Mac OS 9 и Mac OS X. Первая из них сей-час именуется классикой, точнее, это более ранняя систе-ма, не использующая таких прелестей жизни, как защитапамяти и вытесняющая многозадачность.

В одном из описаний этой системы я встретил хоро-шую аналогию: Mac OS 9 предполагает, что все програм-мы дружески относятся друг к другу и к пользователю,и, кроме того, грамотно написаны. Если кто-то «заявля-ет», что ему и только ему нужны все ресурсы процессо-ра, причем прямо здесь и сейчас, то система предоста-вит эти ресурсы. В свое время святой обязанностью про-граммы является «отдать» все позаимствованное, кактолько это более не будет нужно, и не «лезть» не в свою

область памяти. Такой подход может показаться кому-то странным, однако он работал более 10 лет, и до сихпор большинство «макузеров» (от англ. – macintosh user)не собираются покидать свою любимую систему, обосно-вывая свое решение просто и лаконично: «Нам и здесьнеплохо». Впрочем, их можно понять: «девятка» оченьпростая и гибкая система в отличие от «десятки», в ос-нове которой лежит Unix. Этот факт мало кому нравитсяиз всех ветеранов Мака, зато очень привлекает пользо-вателей Unix-систем...

Mac OS XИтак, «десятка». Мое знакомство началось с Mac OS 9.2.2,и эта система своим устройством успела достаточно силь-но меня расстроить, и, возможно, не писал бы я этих строк(с некоторым агитационным оттенком), если бы не попа-лось бы на мои глаза новое творение «яблочников» –Mac OS X (10.2, известная также как Jaguar). Тут уже естьо чем рассказать.

Устройство системы Mac OS X«Десятка» – достаточно оригинальная система. Системнуюархитектуру у Mac OS X проще всего представить в видемногослойного пирога. На первом уровне находится мик-роядро Mach, над ним находится Darwin, далее CoreServices, Application Services. Над ними еще два уровня:

Page 75: 008 Системный Администратор 07 2003

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

образование

Carbon и Cocoa. На самом верху – собственно программы.Итак, рассмотрим каждый из этих подуровней отдельно.

Микроядро MachМикроядро отвечает за следующие задачи:� управление виртуальной памятью (virtual memory);� взаимодействие процессов (IPC);� поддержка ввода/вывода (I/O) и прерываний;� поддержка взаимодействия аппаратного и программ-

ного обеспечения;� управление заданиями и потоками (Tasks & Threads).

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

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

сколько грубым) определением будет следующее: Mach –это ядро, системный уровень; Darwin – это оболочка дляпользователя со всеми его приложениями.

Такая структура устройства системы пошла с 4.4BSDLite – первой свободно-распространяемой в исходных ко-дах *nix-системой, очищенной от кода AT&T – первона-чально, Unix был детищем этой компании, и вышел из ееисследовательских лабораторий; вначале коммуникаци-онный гигант смотрел на распространение этой системысквозь пальцы, однако затем, как только была осознанавозможная экономическая выгода, все, использующиекод, написанный в AT&T, были вынуждены убрать его подугрозой судебного преследования.

Core Services, Application ServicesНа этом уровне расположены общие для всей системыкомпоненты, такие как Core Foundation, Carbon Core, AppleEvents... (уровень Core Services) и Quartz, QuickDraw... (уро-вень Application Services). Рассказ о каждом из них выхо-дит за рамки задачи общего рассмотрения системы, нообщее у них одно – все они являются базой для всех при-ложений системы, да и для системы в частности.

Carbon, CocoaЭто тоже весьма интересная технология, достойная осо-бого внимания.

Page 76: 008 Системный Администратор 07 2003

74

образование

Mac OS X – это «следующий шаг» после Mac OS 9(Classic), но в то же время это логическое продолжениеразвитие NeXT (и спецификаций OpenStep). Посему же-лательно, чтобы приложения каждой из вышеупомянутыхсистем могли быть портированы на новое творение «яб-лочной компании» без особых затруднений.

Выход был найден достаточно оригинальный – новаясистема поддерживает «классические» приложения черезсреду Carbon, а «новые» (на самом деле – Next-овские)через среду Cocoa. Для того чтобы приложение заработа-ло в новой системе, для приложений NeXT достаточно про-сто произвести перекомпиляцию, в то время как приложе-ния из классики будут требовать некоторых доработок.

По заявлениям Apple, «карбонизация» есть лишь вре-менное решение – возможность быстрого портированияприложений на новую систему (в противном случае «де-сятка» бы просто лишилась бы своих основных приложе-ний, начиная от графики и заканчивая MS Office).

«Карбонизированные» приложения не являютсясколь либо ущербными – грамотно портированные при-ложения мало чем уступают своим новым собратьям(например, одно из основных приложений графическо-го взаимодействия системы с пользователем – Finder –написано с использованием именно этой среды), одна-ко же данная среда не поддерживает всех возможнос-тей системы, предоставляемых в полном объеме черезвызовы Cocoa.

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

Системная архитектура Mac OS XСистемная архитектура Mac OS X, впрочем, как и NextStep/OpenStep, основана на операционной системе Unix.

Для лучшего понимания работы этой системы рассмот-рим более подробно схему работы *nix-системы от заг-рузки до «приглашения к работе» (графического либотекстового).

Загрузка системы может быть разбита на 3 этапа.Первый начинается сразу после того, как программ-

ное обеспечение, прошитое в компьютере (то, что назы-вается BIOS на x86 платформе, Firmware на PowerPC инекоторых других) передает управление программе, за-писанной на винчестере (или CD/DVD-диске).

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

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

компьютера запрещены. Затем ядро запускает толькоодин процесс – init.

Третий этап – работа процесса init (от англ. –«initialization») – заключается в последовательном испол-нении команд, записанных в файлах конфигурации (ди-ректории /etc).

Первым делом обычно проверяется отсутствие оши-бок на диске, затем устанавливаются переменные среды(такие как пути для поиска исполняемых программ, сис-темная языковая кодировка, тип терминала и другие).

Потом запускаются системные «демоны» – програм-мы, исполняющиеся на заднем плане (background) и ожи-дающие определенного события, например, веб-серверожидает поступления подключения на 80 порт, после чегообслуживает поступающие команды.

Напоследок для пользователя готовят терминал, и за-пускается программа «login», предлагающая ввести ло-гин и пароль для начала работы.

Это был стандартный вариант запуска системы. Су-ществуют и другие варианты: среди основных – так назы-ваемый single-mode и графический.

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

Второй, графический, уже своего рода добавка: пос-ле основного запуска вместо или вместе с инициализа-цией текстового терминала также запускается «нечто гра-фическое». В случае стандартной *nix-системы «нечтографическое» – это «X server», в случае Мака –«WindowServer». С этого момента большинство пользо-вателей попадают в родную для них графическую среду.

Идеи, заложенные в Mac OS X*nix-системы всегда отличались гибкостью, они создава-лись и разрабатывались как многозадачные, многополь-зовательские, сетевые ОС. Нормальным взаимодействи-ем с компьютером во время создания этой системы счи-талась работа за текстовым терминалом, тем или инымобразом соединенным с главным компьютером.

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

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

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

Page 77: 008 Системный Администратор 07 2003

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

образование

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

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

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

Именно эти факторы и мешают продвижению *nix-си-стемы:� отсутствие единой стандартной графической библио-

теки для разработчиков (присутствующей в каждомдистрибутиве и не меняющейся от версии к версии);

� единого графического интерфейса (выбор – это хоро-шо, но наличие стандарта необходимо);

� его продуманности (сейчас зачастую интерфейсы либокопируют коммерческие реализации, такие какMicrosoft, Apple, Motif, либо не очень ясны для обыч-ных пользователей);

� грамотной реализации (качество кода, стабильностьработы).

Apple решила выбрать в качестве своей базовой плат-формы *nix, расширить его под себя и переделать всю гра-фическую систему. Так, одним из нововведений являетсяформат сохранения данных конфигурации – теперь все на-стройки хранятся в файлах формата XML, более трудногодля ручного редактирования, однако родного для «про-граммного» хранения данных; кому приходилось редакти-ровать файлы конфигурации после того, как по ним про-шелся автоматический, дружественный к пользователюграфический конфигуратор на *nix-платформе, поймет очем я, для остальных поясню: в результате подобных кон-фигураций оказывается сбита вся логика построения фай-ла, в ней нередко остается немало мусора, и далеко не всепараметры могут быть выставлены корректно.

Кроме того, фирма не может терять наработки про-шлых лет, в виде большого количества программного

Page 78: 008 Системный Администратор 07 2003

76

образование

обеспечения, написанного для «классики» (Mac OS до 9 вер-сии включительно) и чуть меньшего для NextStep/OpenStep.

Для этого в новой системе поддерживается два видабиблиотек – Carbon и Cocoa. Первая из них – для совмес-тимости с «классикой», вторая объявлена новой и приори-тетной. Для того чтобы старое (для «классики» или удов-летворяющее спецификациями OPENSTEP) программноеобеспечение заработало в новой системе, необходимо про-извести перекомпиляцию с незначительными изменения-ми (либо и вовсе без них). Кроме того, в качестве еще од-ной рабочей среды объявлена среда Java – виртуальнаямашина на Mac OS X считается лучшей реализацией сре-ди прочих, и достаточно тесно интегрирована с системой.

Не следует забывать и про слой BSD, и X server, кото-рый компания скоро уже должна выпустить в окончатель-ной версии (на данный момент доступна только beta-вер-сия). Также не была упомянута возможность запуска«классических» приложений, не портированных на новуюсистему. Так что получается, что сейчас, прямо «из ко-робки» система способна запускать приложения для«классики», приложения OPENSTEP, Java и огромное ко-личество *nix-приложений (для чего создан отдельныйпроект переноса так называемых портов с FreeBSD наDarwin, позволяющих установить приложение двумя ко-

мандами “cd” и “make install”) как графических, так и ра-ботающих из командной строки.

Дополняя картину, нельзя не упомянуть продукт подназванием Virtual PC – эмулятор x86 компьютера на MacOS (последняя 6 версия эмулирует Pentium II MMX, такто-вая частота зависит от мощности самого Мака).

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

Mac OS X в работе

DesktopЧто нужно от жизни обычному пользователю? Простота на-стройки, наличие офиса, приложений для работы в Интер-нете, работа с родным (в нашем случае – русским) языком.

Офисных пакета как минимум два: Microsoft Office (ста-бильно работающим не замечен) и Open Office. И тот идругой обеспечивают совместимость с документами, со-зданными на «обычных» компьютерах. Причем Office отMicrosoft снабжен даже большим количеством «фич», чемего собрат для Windows.

Page 79: 008 Системный Администратор 07 2003

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

образование

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

Браузеры: Internet Explorer (Microsoft), Safari (Apple), Mozilla(Open Source), Opera (Opera Software) и многие другие.

ICQ: ICQ (ICQ Inc.), Fire.app (Open Source), Proteus.E-mail: Outlook Express (Microsoft), Entourage (Microsoft),

Mail (Apple).

ЛокализацияСистемной кодировкой является Unicode, так что все гра-мотно написанные приложения не испытывают никакихзатруднений при работе с любым языком (систему можнов любой момент заставить «говорить» как на китайском,так и на украинском; то же относится к любому приложе-нию, если его разработчик озаботился многоязыковойподдержкой).

Кроме того, перекодировка текста предусмотрена науровне системных вызовов.

ServerТребования системного администратора обычно несколь-ко другие, а именно – не позволять пользователям делатьтого, что им не нужно, и иметь возможность настроитьвсе необходимые параметры под конкретную задачу, атакже поддержка системы up-to-date.

Системе известно такое понятие, как пользователь«root», здесь он также царь и бог и при желании можетделать с системой все что угодно (особенно из команд-ной строки).

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

Во-первых, Apple не зря начала создание своей Unix-системы, наслоив на классическую архитектуру свои на-стройки. До момента чтения и исполнения /etc/rc*-файловздесь все идет как обычно, однако затем из этих же фай-лов происходит вызов скриптов от «яблочной компании».Т.е. фактически происходит так: грузится Mach, грузитсяinit, который затем, как это и положено, отвечает за всепроцессы в системе, однако запускает большинство этихпроцессов SystemStarter, который читает и запускает дру-гие файлы (из директории /System/Library/StartupItems).Так вот формат файлов конфигурации для всякого при-ложения в Mac OS X – это XML. Данный формат файловчуть хуже читабелен для человека, зато легко читабелендля приложений, кроме того, запись конфигурации в ито-ге не генерирует «мусор», который обычно всегда можнонайти в обычных файлах конфигурации.

Однако отсюда минус: то, что нельзя настроить графи-чески, необходимо делать «руками». Нет, дело не в том,что это сложно сделать (командный интерпретатор tcsh иредактор vi никто не отменял), а в том, что все изменения,внесенные непредусмотренным системой образом, могутбыть впоследствии переписаны обновлением системы.

Кроме того, брандмауэр (в серверной версии системы

Mac OS X Server) в графической версии его настройкиимеет два варианта работы с трафиком: allow/deny. И втом случае, если администратор решит настроить NAT(masquerading в терминах других систем), то правила бран-дмауэра (стандартного ipfw, кстати) придется прописыватьнапрямую в конфигурационных файлах, что требует дос-таточно плотного знакомства с устройством системы.

В общем, можно сказать, что сервер под управлениемMac OS X Server имеет смысл ставить туда, где необходи-ма простота администрирования, возможно, в некоторыхслучаях в ущерб гибкости. С другими системами такойсервер будет жить очень даже недурно (с системой идетsamba, nfs, ssh, ftpd и ранее упоминаемый apache), а егообновление производится не более чем 6 нажатиями мыш-ки (и не вызывает таких печальных последствий, как ав-томатическое обновление на другой популярной платфор-ме известного производителя ПО), и кроме того, наличиеобновлений может проверяться каждый день/неделю/ме-сяц, и пользователю будет предложено установить имею-щиеся обновления.

Developer stationРазработчик – человек, которому нужно немного и от си-стемного администратора, и от обычного пользователя,но в первую очередь необходима удобная система разра-ботки (IDE), полная документация и, возможно, примерыреализации.

Это все можно найти в системе. Project Builder позво-ляет создавать приложения AppleScript (язык автомати-зации действий с программами), приложения Carbon,Cocoa, Java и C++.

Документация достаточно полно описывает все прин-ципы работы системы и снабжена примерами реализа-ции приложения (и/или драйвера). Кроме того, не стоитзабывать про открытый исходный код Darwin и другиенаработоки Apple (более подробную информацию можнонайти здесь: http://developer.apple.com/darwin/projects/).

Не могу также пропустить и такое приложение, какVirtual PC, – приложение, позволяющее запускать любуюx86 операционную систему и эмулирующее Pentium II MMX,S3 Trio 32/64 (4/8/12MB), Sound Blaster, Intel 21041 BasedEthernet Adapter и выделяющее то количество жесткогодиска и оперативной памяти, которое будет ему указано.Данное приложение можно отнести и к категории для раз-работчиков (тестирование своей программы под различ-ные системы), и к категории системщика (количество од-новременно работающих систем ограничено только сис-темными ресурсами «хоста») и просто для обычногопользователя – «окошки» в «окошке» позволяют работатьс приложениями, которые еще не портированы на Мак,или даже играть в игры (правда, не очень ресурсоемкие).

При подготовке статьи были использованы материалы:1. Джим Карлтон. Apple. Взгляд изнутри: история инт-

риг, ошибок и эгоизма. Издательство «ЛОРИ», 2001.2. Стивен Леви. Хакеры – герои компьютерной рево-

люции. ( www.cooler.it/hackers/)3. История развития NeXT. (http://www.levenez.com/

NeXTSTEP).

Page 80: 008 Системный Администратор 07 2003

78

образование

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

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

Page 81: 008 Системный Администратор 07 2003

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

образование

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

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

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

Увы, приходится признать, что, несмотря на многие ивесьма значительные достоинства бывшей советской си-стемы образования, учиться у нас (особенно в вузах – этостановится все заметнее по мере взросления) не всегдаинтересно. Едва ли не большинство выпускников россий-ских институтов и университетов сохранили воспомина-ния о томительно тянущихся лекциях, нудных объяснени-ях, казенным языком написанных учебниках. Смысл упор-но ускользает от тебя, и чувствуешь, что отстаешь от ку-рьерского поезда, уносящего вперед мысль преподава-теля. А как результат – напряженные семинары, непонят-ные лабораторные работы, нервная сдача экзаменов. Витоге основная цель учёбы – сохранить требуемые све-дения в голове до зачета или экзамена. А потом благопо-лучно забыть. Начисто.

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

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

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

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

Для примера возьму крупнейшую американскую груп-пу издателей учебной литературы – 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-код(указанный, например, в учебнике или методическом по-

Page 82: 008 Системный Администратор 07 2003

80

образование

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

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

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

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

Основным средством мониторинга успеваемости вамериканских школах, колледжах и университетах тра-диционно служат тесты. Обычно используются два ос-новных вида тестов: true/false (да/нет) и multiple choice(выбор из нескольких альтернатив). Американские сту-денты называют тесты вида true/false «угадайкой» и попонятным причинам любят их значительно больше, чемmultiple choice, в которых угадать сложнее и требуетсячто-то знать по теме.

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

Page 83: 008 Системный Администратор 07 2003

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

образование

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

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

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

Впервые разработан принцип свободного ввода мате-

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

Приживется ли интернет-обучениев России?Понятно, что эти непривычные большинству из нас инте-рактивные формы обучения исключительно удобны ипрактически полезны для обеих сторон, штурмующих бар-рикады под названием «получение высшего образова-ния». Преподаватели добиваются понимания и интересак своему предмету, студенты же (говорю именно о сту-дентах, а не об откровенных «халявщиках») хотят выу-чить с минимальными затратами сил и времени, все сдать,получить корочку и влиться во взрослую жизнь. И все этизадачи могли бы решить (пусть частично) новые интерес-ные методики обучения.

Page 84: 008 Системный Администратор 07 2003

82

образование

Самое же, пожалуй, важное, что для того, чтобы взятьна вооружение все эти технологии, не нужно никого при-глашать, перенимать опыт, создавать команды програм-мистов и т. д. Все эти разработки для ВСА на протяженииуже четырех лет выполняет российская компания –ФИЗИКОН (http://www.physicon.ru/) – разработчик учебныхкомпьютерных программ для средней и высшей школы.Ее интерактивные учебники вошли в Федеральный наборэлектронных учебников и были поставлены в 40 000 школРоссии. Компания успешно завершила свыше 40 проек-тов по разработке программного обеспечения для зару-бежных заказчиков.

В России разрабатывают как программное обеспече-ние, так и интерактивные учебные материалы для амери-канского сервера. Около 70% его уникального в масшта-бах всего мира содержания создано именно российскимиразработчиками. При работе над системой наши програм-мисты использовали значительное количество своих соб-ственных наработок и технологий и внесли в разработкусервера существенный интеллектуальный вклад.

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

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

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

Программисты компании создали уникальный инстру-ментарий для введения в систему свыше 50 видов задачи тестов. За время сотрудничества с Thomson Learningбыла сформирована большая группа редакторов матема-тических задач, которые алгоритмизировали около 120тысяч задач. Большинство редакторов – студенты и аспи-ранты Московского физико-технического института, ихфундаментальное образование позволяет им быстро ори-ентироваться в предметах и алгоритмах.

Тестирование ВСА в РоссииВесной этого года компанией был проведен очень ин-тересный эксперимент, немаловажный в отношении об-суждаемой темы. В течение недели в Лицее Информа-ционных Технологий г. Москвы тестировалась очеред-ная версия ВСА.

За эту неделю в тестировании приняло участие девять

Page 85: 008 Системный Администратор 07 2003

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

образование

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

Мероприятие преследовало несколько целей:� выявить особенности сервера, затрудняющие его ин-

туитивное использование;� решить, пригодна ли система для использования в

России.

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

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

И наконец, третий режим – «Экзамен» – разрешаеттолько одну попытку, а уж о ее результатах сообщит учи-тель. В каждом тесте учащимся предлагалось 12 задач,на прохождение всех трех видов теста отводилась однапара (два урока).

Нельзя сказать, что всем ученикам пришлась по душеперспектива два урока подряд решать задачки. Но боль-шинству все же становилось интересно разобраться с чем-то новым. Ученики регистрировались в системе и прохо-дили поэтапно все виды тестов. На возникавшие по ходувопросы тут же отвечали сотрудники ФИЗИКОНа, пере-вод заданий раздавался всем желающим в распечатан-ном виде, а непривычные для российского школьникаматематические обозначения были выписаны на доске.

В процессе тестирования за реакцией школьников вни-

Page 86: 008 Системный Администратор 07 2003

84

образование

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

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

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

В целом ученики хорошо справились с электроннымзаданием, правильно решив до 80% задач.

Все полученные в результате замечания анализиру-ются, а наиболее полезные и целесообразные из них вне-сены в следующую версию сервера.

Другой интересный вопрос, затронутый в эксперимен-те – возможность использования системы ВСА в России.

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

Очень важно то, что в систему возможно ввести и но-

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

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

В заключение хочется отметить, что описанный опыти наличие в России разработчиков, обладающих всеминеобходимыми знаниями и практическим опытом, можетсущественно помочь внедрению интернет-технологий вроссийскую образовательную систему. Особенно актуаль-но это в свете развернувшейся в последнее время инфор-матизации российского образования (снабжаются компь-ютерами самые отдаленные населенные пункты РФ, раз-рабатываются электронные учебники по грантам Мини-стерства образования РФ). Появляется надежда, что но-вые интерактивные полезные и интересные студентамметоды обучения войдут в нашу повседневную жизнь.Введение Единого Государственного Экзамена (котороетакже немыслимо без информационных технологий) по-степенно делает тестирование важной составной частьювсей системы нашего образования, приводит российскоеобразование к стандартам оценок, принятых в большин-стве западных стран. Если Россия хочет занять в обозри-мом будущем подобающее ей место среди ведущих госу-дарств мира, ей уже сейчас необходимо обратить самоепристальное внимание на новые технологии в образова-нии. Завтра начинается сегодня!

Page 87: 008 Системный Администратор 07 2003
Page 88: 008 Системный Администратор 07 2003

86

сети

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

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

Page 89: 008 Системный Администратор 07 2003

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

сети

Все, кто хотя бы один раз в жизни прокладывал сетьсобственными руками, скажут, что это занятие не изприятных. Одно дело – проектировать сеть, совсем дру-гое – заниматься монтажом оборудования и проклады-ванием кабелей. Конечно, когда все компьютеры нахо-дятся в одной комнате, особых проблем с кабелем, какправило витой парой, не возникает. Но когда нужнообъединить в сеть два, три, четыре, пять или более эта-жей, невольно начинаешь думать: «Кто бы за меня всеэто сделал?».

Конечно же Powerline! Powerline Communications – этосемейство технологий связи, использующее в качествефизической среды передачи информации существующуюсеть электропитания (220В или 120В).

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

Вам мало одного дома? Вы хотите подключить ещеодин? Технология Powerline позволяет передавать дан-ные на расстояние до десяти километров. Естествен-но, если мы что-то приобретаем, то нужно что-то от-дать взамен. В нашем случае мы жертвуем скоростьюпередачи. Если объекты находятся на расстоянии бо-лее двух километров, скорость передачи данных пада-ет до 0,05 Кб/с (максимум 50 Кб/с). Поэтому для связиудаленных объектов целесообразнее использовать дру-гие технологии, например RadioEthernet.

Скорость передачиданных и расстояниеВ зависимости от расстояния между объектами изменя-ется скорость передачи данных:� Высокоскоростной обмен (High baud rate). В этом ре-

жиме обеспечивается передача данных на расстоя-ние до нескольких сотен метров. Скорость передачиданных обратно пропорциональна расстоянию, мини-мальная скорость передачи в высокоскоростном ре-жиме – 100 Кб/с, максимальная – 14 Мб/с (практи-чески никогда не достигается). Данный вариант иде-ально подходит для создания небольшой SOHO-сети(Small Office – Home Office) или объединения в однусеть компьютеров друзей, живущих в одном доме.Однако подключить сразу все желаемые PLC-уст-ройства не получится: может не хватить полосы про-пускания, а она для PLC-устройств составляет неболее 10 Мб/с. Да, видео в реальном времени пере-давать не получится, но для передачи файлов с при-емлемой скоростью вполне хватит. О максимальнойскорости, а также о полосе пропускания мы еще по-говорим чуть позже.

� Среднескоростной обмен (Medium baud rate) – пред-назначен для передачи информации на средние рассто-яния – до двух-трех километров. При этом максималь-ная скорость передачи данных в этом режиме составля-ет 50 Кб/с, а минимальная – 0,05. В принципе, если поду-мать, 50 Кб/с – это не так уж и мало, если учесть, чтосуществующие линии телефонной связи, особенно ана-логовые, еле обеспечивают надежную передачу данныхна скорости 33,6 Кб/с. Мой модем, подключенный к ана-логовой АТС, работает по такому сценарию: сначала под-ключается на скорости 33,6 Кб/с, затем (минут через 15-20) сбрасывает скорость до 28,8 Кб/с, потом скорость топонижается (до 21 Кб/с), то повышается (до 28,8 Кб/с).

� Низкоскоростной обмен (Low baud rate). Обеспечива-ет передачу данных на расстояние более 10 километ-ров. Максимальная скорость передачи – 0,05 Кб/с.Данный режим будет полезен для передачи какой-ни-будь служебной информации небольшого объема.

Как подключиться к электросети?Предположим, что у нас есть самый обыкновенный ком-пьютер, снабженный самым обыкновенным Ethernet-адап-тером (имеется в виду FastEthernet). Как можно его под-ключить в PLC-сеть? Неужели прямо в розетку? Почти:для подключения компьютера к электросети использует-ся специальный адаптер – Powerline to Ethernet adapter.Вот он-то и подключается к электросети, а Ethernet-адап-тер подключается к нему. На рисунке 1 изображен при-мер небольшой домашней сети, состоящей из трех ком-пьютеров, использующей технологию Powerline.

Один из компьютеров подключается непосредствен-но к среде передачи данных, то есть к электропроводке,используя адаптер Powerline to Ethernet. На данном ком-пьютере должен быть установлен интернет-адаптер. Дру-гие два компьютера подключены в нашу домашнюю сетьчерез самый обыкновенный интернет-коммутатор (switch),который, в свою очередь, подключается к электросети спомощью адаптера Powerline to Ethernet. Далее, к одномуиз компьютеров подключен модем. Если правильно на-строить программное обеспечение, этот компьютер будетвыступать в роли интернет-шлюза и все компьютеры по-лучать доступ к Интернету.

На вашем компьютере нет сетевой платы? Не беда:кроме адаптера Powerline to Ethernet существуют адапте-ры Powerline to USB, позволяющие использовать USB-порткомпьютера вместо сетевой платы. Такой адаптер целе-сообразнее использовать на одиночных компьютерах, как

Ðèñ. 1. Ïðèìåð íåáîëüøîé ñåòè ñ èñïîëüçîâàíèåì òåõíîëîãèè Powerline.

Page 90: 008 Системный Администратор 07 2003

88

сети

в нашем случае. Во-первых, не нужно покупать сетевуюплату, а во-вторых, адаптер Powerline to USB стоит де-шевле, чем адаптер Powerline to Ethernet (цена зависит отмодели и производителя).

А что делать, если у вас старенький компьютер без USB-порта? Тогда есть два выхода: купить специальный USB-адаптер или специальную Powerline PCI-карту. В первомслучае у вас появится так необходимый вам USB-порт, ккоторому можно подключить адаптер Powerline to USB, аво втором – вы будете подключаться к электросети с помо-щью купленной вами Powerline PCI-платы. PLC-устройства,выполненные в виде PCI-платы, являются самыми деше-выми, но наименее распространенными.

Устройства производстваPlanet TechnologyРассмотрим два устройства производства PlanetTechnology:� Powerline to Ethernet converter (PL-101E)� USB to Powerline Network Adapter (PL-101U)

Первое устройство позволяет подключаться к элект-росети с помощью сетевого адаптера, а второе представ-ляет собою сетевой адаптер, подключаемый к USB и спо-собный работать по электросети – такой себе набор 2 в 1.

Устройства представлены на рисунках 2 и 3 соответ-ственно.

Оба устройства поддерживают спецификацииHomePlug PowerLine Alliance v1.0 и USB Spec 1.1. Основ-ные технические характеристики:� Максимальная скорость до 14 Мб/с;� Для надежности передачи данных используют кодиро-

вание с ключом 56 бит (DES);� Максимальное расстояние – до 90 м;� Метод сетевого доступа – CSMA/CA (Carrier Sense

Multiple Access with Collision Avoidance – метод коллек-тивного доступа с избежанием коллизий);

� Поддержка QoS (Quality of Service, IEEE 802.3u);� Полоса занимаемых частот для обмена данными: 4,3 –

29,9 Mhz;� Схема модуляции – OFDM, прямая коррекция ошибок

(FEC, Forward Error Correction).

Стоимость каждого устройства – около $130.Примечание: 56-битная система шифрования окажет-

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

Выбор устройстваСледующая таблица поможет вам выбрать ваше PLC-ус-тройство.

Примечание: в таблице 1 указана приблизительнаяцена, которая может измениться в зависимости от раз-личных факторов.

ТестированиеК сожалению, у меня не получилось раздобыть все пере-численные в таблице 1 устройства, поэтому ограничимсятеми, что были: Powerline to Ethernet converter (PL-101E) иUSB to Powerline Network Adapter (PL-101U).

Установка устройства происходит без проблем. USB-адаптер операционная система Windows 2000 определи-ла как Safely Remove Hardware, после чего был проин-сталлирован драйвер с компакт-диска.

Ethernet-устройства вообще не требуют никакого драй-вера, нужно только изменить пароль по умолчанию (обыч-но это слово «HomePlug»). Напомню, что пароль долженбыть одинаковым на всех PLC-устройствах.

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

Несмотря на то что заявленная максимальная скоростьпередачи данных равна 14 Мб/с, на практике она состав-ляла 5-6 Мб/с.

При передаче файла объемом 10 Мб наилучший ре-зультат был следующим: 5, 55 Мб/с. Всего было сделано10 попыток в идеальных условиях: оба устройства нахо-дились в пределах одной квартиры, и не было включенони одно устройство, способное создавать помехи – дажехолодильник был временно отключен.

При включении водонагревателя, холодильника и мик-роволновой печи скорость передачи этого же файла со-ставила 3,14 Мб/с. Очень даже неплохо, учитывая, чтосигнал преодолел сопротивление в 70 Ом и несколькоавтоматов-выключателей.

В отличие от PLC-устройств типа HomePlug, существу-ет еще один тип подобных устройств – HomePNA, позво-ляющий для передачи данных использовать обычные те-лефонные линии. А что если подключить наши HomePlug

Òàáëèöà 1. Òåõíè÷åñêèå õàðàêòåðèñòèêè PLC-óñòðîéñòâ.

Ðèñ. 2. Powerline to Ethernet converter (PL-101E).

Ðèñ. 3. USB to Powerline Network Adapter (PL-101U).

Page 91: 008 Системный Администратор 07 2003

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

сети

(PLC)-устройства к телефонной линии? Они работают,причем их работа оценивается утилитой мониторинга как«Excellent», то есть с максимальной скоростью. В то жевремя мы можем набрать номер и нормально разговари-вать по телефону – качество голосовой связи не постра-дало. Теоретически можно подключить PLC-устройства ик радио, то есть к ретрансляционной сети. Однако я нестал этого делать.

В начале статьи мы акцентировали внимание не толь-ко на удобстве, но и на надежности. Мол, самые надеж-ные и самые безопасные... Неужели нет способа «зава-лить» PLC-сеть? Способ есть: соедините сетевым кабе-лем два устройства Ethernet to PL и увидите, что будет.Если боитесь экспериментировать, скажу, что в резуль-тате блокируется работа всех устройств в подсети.

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

Хотя заявленная пропускная способность 14 Мб/с, напрактике она составляет 6 Мб/с, это не так уж и мало.Сравнивать PLC-устройства с сетью FastEhternet не сто-ит – они находятся в разных весовых категориях. Гораздокорректнее сравнивать Powerline-устройства сRadioEthernet и другими беспроводными сетями. Что луч-ше – RadioEthernet или Powerline сказать однозначно тоженельзя: это зависит от того, как вы хотите использоватьданные технологии. Если вы хотите объединить в сеть

несколько компьютеров друзей, находящихся в одномдоме, лучшим выбором окажется Powerline. А если объек-ты находятся на расстоянии более 1 километра, исполь-зовать Powerline вряд ли целесообразно: при таком рас-стоянии скорость передачи данных будет очень низкой.Используемое 56-битное шифрование DES создает до-полнительный барьер при перехвате информации. Такжестоит отметить, что шифрование выполняется на аппа-ратном уровне, и вам не нужно заботиться о различныхпрограммных средствах для шифрования трафика, как вслучае с Ethernet-сетью.

Стоимость Powerline-устройств на сегодняшний деньпока высока. Например, чтобы объединить в сеть два ком-пьютера, вам понадобится минимум $200. При использо-вании FastEhternet вам понадобятся всего лишь два сете-вых адаптера ($5-10 каждый) и до 100 метров витой парыпятой категории (от $20 за 100 метров). Как известно, еслинужно соединить сетью два компьютера, можно обойтисьбез концентратора/коммутатора, поэтому итоговая сто-имость такой сети 40-50 долларов: в четыре раза ниже,чем стоимость Powerline-сети. Однако в FastEthernet мыне учли стоимость прокладки кабеля (если вы будете за-ниматься этим сами, то стоимость будет определяться вре-менем, потраченным на монтаж такой сети) и возможно-го ремонта помещения, если придется прокладывать ка-бель через стену.

Кроме стоимости ограничивает распространение PLC-устройств максимальная полоса пропускания. Да, мыможем объединить в сеть компьютеры, которые располо-жены на разных этажах и даже в разных подъездах (еслиэто жилой дом), но мы не можем объединить в сеть всекомпьютеры, находящиеся в одном доме. Ограниченнаяполоса пропускания не позволяет работать с относитель-но высокой скоростью более чем 10-15 PLC-устройствам.

Page 92: 008 Системный Администратор 07 2003

90

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

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

Page 93: 008 Системный Администратор 07 2003

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

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

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

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

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

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

мы сейчас?� Что поедет в бизнес-центр, а что – на склад?� Как будет сделана сеть в бизнес-центре и как – на

складе?� Как центр и склад будут связаны между собой?� Как будет происходить процесс переезда?

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

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

Переезд – это не только головная боль, но идва-три вусмерть уставших сисадмина...

ВЯЧЕСЛАВ КАЛОШИН

Page 94: 008 Системный Администратор 07 2003

92

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

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

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

Видимо, их всех выращивают в одном инкубаторе, по-тому что планы различались в таких незначительных дета-лях, что даже неинтересно было сравнивать. Не подумай-те, что я хвастаюсь, но базируясь на тех данных, которыемы им выдали, я нарисовал чуть более симпатичную схемусети. Выбрали трех наиболее приглянувшихся поставщи-ков, попросили скорректировать схему сети так, как надонам (к примеру, я выделил бухгалтерию и начальство сзамами в отдельные сетки и увеличил число розеток израсчета 3 розетки на 2 человека) и предоставить оконча-тельные предложения с графиком и спецификациями. Тутодин из поставщиков хмыкая, начал рассказывать о том,что «это неправильно, так не делают и вообще, как-то не-интересно», за что с удивлением был послан ни с чем. Двадругих с радостью вгрызлись зубами в предложенное. На-конец необходимые экскурсии в проходящий отделку биз-нес-центр и на склад, крики «Вы нас разорите!» и прочееполагающееся были пройдены. (Запомните: если вы согла-ситесь с ценами сразу же, вы кровно обидите другую сто-рону. Вас будут считать за ламера и все остальное пойдетпод этим знаком. Доставьте удовольствие людям, сторгуй-те хотя бы 5%. В общем, как на восточном базаре.) Итак, унас на руках были два проекта будущей сети, которые мывручили директору. Там пошли уже другие переговоры, некасающиеся нас. В общем, через неделю в бизнес-центрепоявились ребята в синих спецовках и начали «согласновновь утвержденному плану» делать СКС.

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

Было решено следующее: берется подсеть в диапазоне

10. и разбивается на 5 диапазонов. Первый диапазон – шефи его замы. Могут видеть всех, заходить на любые ресурсысети, кроме управления сетевым оборудованием. Во времяработы в Интернете доступ к внутренним ресурсам забло-кирован. Второй диапазон – сисадмины и программисты.Разрешен доступ до всего сетевого оборудования, в Интер-нет и к другим подсетям. Третий диапазон – бухгалтерия.Разрешен доступ только к бухгалтерскому серверу. Четвер-тый диапазон – секретарши, менеджеры и прочий офисныйлюд. Доступ в Интернет – только http через прокси, выреза-ющий баннеры и прочую мерзость. Пятый диапазон – ин-тернетчики. Здесь сидят рекламщики и прочие люди, кото-рым Интернет необходим для работы, сюда же попадаютбоссы, когда захотят воспользоваться Интернетом. А такжезаведен отдельный компьютер из бухгалтерии – бухгалте-ры тоже люди и лишать их доступа к anekdot.ru плохо. Дос-тупа из этой подсети в другие подсети нет. Все сервера, кро-ме бухгалтерского, располагаются в админской подсети.

Все адреса выдаются DHCP-сервером согласно МАС-ад-ресам сетевых карт компьютеров. В VIP-зонах МАС- и IP-адреса прикреплены к портам соответствующего коммута-тора. Доступ с этих портов другим адресам запрещен сред-ствами ОС коммутатора. В других зонах неизвестным МАС-адресам выдаются IP-адреса из зоны, которая заблокиро-вана на роутерах. Таким образом, друг менеджера (партнерили еще кто), который принес свой ноутбук и включился всеть, с очень большой вероятностью не сможет без помощиадминистратора воспользоваться ресурсами сети.

Смену VIP-клиентам адреса при выходе в Интернетcделали просто. Им на десктоп ложится иконка, кликнув покоторой, они поднимают VPN-соединение с «интернетовс-кой» подсетью. Одновременно по факту поднятия VPN-со-единения на коммутаторе поднимаются дополнительныеправила, которые разрешают машине из VIP-зоны обмени-ваться пакетами только с VPN-сервером. На VPN-серверестоят дополнительные правила, которые блокируют любыепакеты на опасные порты вроде 139-го и пакеты, используе-мые наиболее популярными атаками. В общем, дешево исердито. Боссы пользуются Интернетом, а подростки, обчи-тавшиеся «Хакера», «пощупать» или достать их не смогут.

Разрисовали на этажном плане ареалы подсетей, рас-пределили VLAN по портам коммутаторов, мысленно все про-верили несколько раз и повесили получившийся плакат настенку для консультаций.

Теперь пора обратить свои взгляды к телефонии. В ста-ром здании была станция, которая могла обслужить 100 внут-ренних номеров и расширяться дальше не умела. А дирек-тору хотелось поставить каждому сотруднику по телефон-ному аппарату. Значит надо рисовать схему распределениятелефонных номеров. Задача осложнялась тем, что не хо-телось лишать сотрудников привычных им двухзначных те-лефонных номеров.

Была устроена консультация с инженером фирмы, по-ставляющей АТС. И был создан новый телефонный план:двузначные номера и их привязка к сотрудникам остаютсятеми же. Новые четырехзначные номера формируются сле-дующим образом: первая цифра номера обозначает принад-лежность сотрудника к подразделению фирмы. Следующиетри цифры обозначают «порядковый номер» сотрудника.

Page 95: 008 Системный Администратор 07 2003

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

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

Например: Алексей Алексеевич имеет внутренний номер34 и работает в бухгалтерии. После переезда на новое мес-то ему можно будет позвонить, просто набрав 34 и подож-дав пару секунд. Однако у него появится и другой номер:2034. При переходе, скажем, в юридический отдел, у негосменится номер на 1034. В итоге любому по номеру будетпонятно, где работает человек и исчезает путаница с номе-рами при переводах.

После некоторого размышления была рождена идея чутьподправить адресацию сети: привели IP-адрес сети к номе-ру телефона человека. К примеру, адрес 10.5.20.34 стал обо-значать того же Алексея Алексеевича, находящегося в Ин-тернете и имеющего телефон 2034. А 10.2.20.34 – его же,только занимающегося юридическими делами на благо фир-мы. Как оказалось впоследствии, это очень удобно при раз-борке всяких сетевых конфликтов.

С удаленным складом решили очень просто: местнаяфирмочка бросила туда выделенку. Мы поставили там млад-шую модель cisco в качестве роутера и брандмауэра. Зару-били на ней вообще все. Рядом взгромоздили VoIP-шлюз на4 аналоговых порта. Через cisco подняли VPN в общую сеть.На стороне бизнес-центра стоял такой же VoIP-шлюз, толь-ко с портами, приспособленными для включения в АТС. Ус-танавливать плату VoIP прямо в АТС было не выгодно – слиш-ком дорого. Все. Склад получил сеть и телефоны, включен-ные в общую сеть компании.

Этап четвертый«Ох, рано встает охрана …»Самый скучный. Программирование новой АТС и комму-таторов, проверка разводки (ползание под фальшпотол-ками и под новыми столами), накладка схемы сети на ре-альную разводку и корректировка всего этого дела. За-тем проход еще раз по всей сети и очередная корректи-ровка. Проверка электропитания и кондиционирования(путем включения в будущей серверной тепловой пушки)и так далее и тому подобное.

По окончании этого этапа получилось следующее:Около каждого телефонного стола мы имели сиротли-

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

Вздохнув, мы начали следующий этап.

Этап пятый«Мы едем, едем в далекие края …»Так как переезд сродни пожару, то решили запастись ог-нетушителями заранее. Расписали последовательностьдействий на уровне:� Выключить сервер.� Выключить блок бесперебойного питания.� Собрать все шнуры в пакет.� Завязать пакет и пометить цифрой «1».� Аккуратно вынуть сервер и поставить тут (схематич-

ное изображение соседней комнаты).� Наклеить на сервере и UPS цифры «1».

….

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

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

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

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

Как ни странно, но наиболее часто задаваемый вопрос:«А когда все заработает?» мы намеренно не включили впамятку. Ибо было дико приятно отвечать: «А все уже ра-ботает». И в самом деле, телефоны были теми же, про-граммы показывали все то же самое, что и должны былипоказывать, в общем, люди включались в работу «с колес».

Этап шестойПоследнийОн двигался параллельно: происходили разборки с дама-ми, которые по своей извечной женской натуре началипереставлять мебель и столы. Надо было зафиксироватьвсе перемещения, сделать изменения на схемах, в неко-торых случаях изготовить новые патч-корды и так далееи тому подобное. Второй поток заключался в просмотреоставляемой территории. Было захвачено то, что забылив суматохе. То, что решили оставить (провода, обзывае-мые сетью и коммутаторы от Lucent, старая АТС), отдалина растерзание в дирекцию. Если я не ошибаюсь, все этооптом купила фирма, которая въехала туда после нас. Не-известный администратор, я очень тебе сочувствую…

Ну и короткое резюме: системные администраторы по-лучили по премии и повышению зарплаты за прекраснопроведенный переезд. Плюс в их распоряжении оказаласьправильно сделанная и полностью документированнаясеть. Они счастливы. А я… Я получил дополнительныйопыт. Мне пока хватает.

Page 96: 008 Системный Администратор 07 2003

94

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

Неавторизованный доступ от именидругих апплетов в Sun Java (JRE/SDK)Уязвимость обнаружена в Sun’s Java Runtime Environment(JRE). Недоверяемый апплет может нарушить управлениедоступом Java.

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

Уязвимость обнаружена в 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� 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� SDK and JRE 1.3.1_05 and later� SDK and JRE 1.2.2_13 and later

Linux Production Releases� SDK and JRE 1.4.0_02 and later� SDK and JRE 1.3.1_05 and later

Раскрытие произвольных частей памятив Ethernet-фреймах в некоторыхдрайверах сетевых картв Microsoft Windows Server 2003Уязвимость раскрытия информации обнаружена вMicrosoft Windows Server 2003. Некоторые Microsoft-под-писанные драйверы раскрывают информацию из памятисистемы удаленному пользователю.

NGSSoftware Insight Security Research предупреждает,что несколько Ethernet-драйверов, которые поставляютсяс Windows Server 2003, могут раскрыть информацию изпамяти при заполнении Ethernet-фреймов в TCP-потоке.

Несколько месяцев назад @stake сообщил, что некото-рые Ethernet-драйверы могут раскрыть информацию от лю-бой области физической памяти при заполнении ICMP-со-общений. Согласно NGSSoftware, подобная проблема суще-ствует в Windows Server 2003 в Ethernet-пакетах, которыесодержат закрытую часть TCP FIN-ACK обмена. В сообще-нии указывается, что уязвимы несколько драйверов, по-ставляемых с Windows Server 2003 и сертифицированныхMicrosoft, включая драйвера для сетевой карты VIA Rhine II(интегрированной в некоторые материнские платы) и драй-вера для AMD PCNet карт. Несколько байт информации,включая пароли и другую чувствительную информацию,могут быть включены в часть данных Ethernet-фреймов.

Уязвимость обнаружена в Microsoft Windows Server 2003.В настоящее время способов устранения обнаружен-

ной уязвимости не существует.

Удаленное переполнение буферав базе данных MySQLПереполнение буфера обнаружено в MySQL libmysqlclient.Удаленный или локальный пользователь может выполнитьпроизвольный код или аварийно завершить работу при-ложения в зависимости от того, как приложение исполь-зует уязвимую библиотеку libmysqlclient.

Переполнение буфера обнаружено в функцииmysql_real_connect(). Имя Unix-сокета длиннее 300 сим-волов приведет к переполнению буфера и возможномувыполнению произвольного кода.

Пример:

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

Эксплоит:

Уязвимость обнаружена в MySQL 4.х и более раннихверсиях.

В настоящее время способов устранения обнаружен-ной уязвимости не существует.

mysql -S `perl -e 'print "A" x 350'` -hlocalhost

<?php for ($i;$i<350;$i++)

$buff .= "A"; ini_set("mysql.default_socket","$buff"); mysql_connect("localhost", "blabla", "blabla");?>

Выполнение произвольныхподключений через AdSubtractУязвимость обнаружена в программе блокирования бан-неров AdSubtract. Удаленный пользователь может выпол-нить произвольные подключения через приложение.

Удаленный пользователь может обойти ограничениядоступа, предназначенные ограничить доступ к 'localhost'-интерфейсу. Если при выполнении обратного DNS-поискаIP-адрес преобразует к имени домена '127.0.0.1.[domain]'или другому имени, в котором содержится '127.0.0.1', топри выполнении обратного DNS-поиска на IP-адресе соеди-няющегося удаленного пользователя AdSubtract решит, чтоподключение происходит от 127.0.0.1 (localhost).

Уязвимость обнаружена в AdSubtract 2.55.В настоящее время способов устранения обнаружен-

ной уязвимости не существует.

Просмотр некоторых паролей в Apple OS XУязвимость обнаружена в операционной системе Apple OSX в команде dsimportexport. Локальный пользователь мо-жет просматривать некоторые пароли.

Apple сообщает, что локальный пользователь может по-тенциально просматривать имя пользователя и пароль учет-ной записи, под которой запущена утилита dsimportexport.

Уязвимость обнаружена в Apple Mac OS X 10.2.Apple выпустил патч (Security Update 2003-06-12), ко-

торый можно скачать отсюда:http://www.info.apple.com/kbnum/n120215

bugtraq

Page 97: 008 Системный Администратор 07 2003

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

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

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

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

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

8165581655816558165581655

8165581655816558165581655

подписка

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

Page 98: 008 Системный Администратор 07 2003

96

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

РЕДАКЦИЯ

Исполнительный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[email protected]Технический редакторВладимир Лукин

РЕКЛАМНАЯ СЛУЖБАтел.: (095) 928-8253 (доб. 112)факс: (095) 928-8253Константин Меделянreс[email protected]

Верстка и оформление[email protected][email protected]

Дизайн обложкиНиколай Петрочук

103012, г. Москва,Ветошный переулок, дом 13/15тел.: (095) 928-8253 (доб. 112)факс: (095) 928-8253Е-mail: [email protected]: www.samag.ru

РУКОВОДИТЕЛЬ ПРОЕКТАПетр Положевец

УЧРЕДИТЕЛИВладимир ПоложевецАлександр Михалев

ИЗДАТЕЛЬЗАО «Издательский дом«Учительская газета»

Отпечатано типографиейООО «Мастер Печати»Тираж 5500 экз.

Журнал зарегистрированв Министерстве РФ по делам печати,телерадиовещания и средств мас-совых коммуникаций (свидетельствоПИ № 77-12542 от 24 апреля 2002г.)

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

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

OpenBSD. Первые шагиПродолжим наше знакомство сOpenBSD. Мы остановились на успеш-ной установке системы и предложени-ем перезагрузиться, что, собственноговоря, и выполняем. Итак, первая заг-рузка системы уже по традиции дляBSD-систем выполняется на синемфоне, и вы можете видеть, как ядро си-стемы опрашивает все устройства, ко-торые находит. Отлично, ядро загрузи-лось, дальше пошел init системы (про-цесс, который запускает все остальныепроцессы системы). Мы видим, как под-нимается сетевой интерфейс (в моемслучае le1), добавляется маршрут поумолчанию (в большинстве случаевнадо прописать его в /etc/mygate, я рас-скажу об этом файле при конфигури-ровании сети), запускаются демоныsendmail inetd и sshd. Торжественныймомент... Волшебная дверь в систему,которая тщательно выбирает себе дру-зей, но если вы станете ее другом – онасделает все для вас. Твердо и уверен-но вводим root, затем пароль, которыймы указывали при инсталляции.

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

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

Плохое электропитание,или «Грабли» с UPSК сожалению, отечественные сети элек-тропитания не обеспечивают достаточ-ную стабильность подаваемого напря-жения. Напряжение может изменятьсяпо значению и пропадать на время отнескольких миллисекунд до несколькихчасов без предварительного предуп-реждения. Данная нестабильность вэлектропитании есть следствие особен-ностей российского законодательства.В идеале проблемы и последствия сбо-ев электропитания должны решатьюристы. Однако мы живём далеко не видеальной стране, полной исключений.Все знают, что «русский сервис нена-вязчив», и за разумные деньги выби-рать особо не приходится.

Данная статья показывает доволь-но дешёвый вариант решения пробле-мы электропитания.

МониторингWindows-серверовс помощью NagiosЧасть 2Первая часть этой статьи рассказыва-ла об одной из нескольких методикнастройки Nagios для слежения за сер-верами под управлением семействаоперационных систем Windows. Длядостижения наших целей на контроли-руемую машину устанавливалась про-грамма NSClient, а данные собиралисьс помощью модуля check_nt.

В этой части мы изучим второйспособ мониторинга. Для получениянеобходимых данных мы будем ис-пользовать SNMP (Simple NetworkManagement Protocol). На данный мо-мент SNMP является самым популяр-ным протоколом управления и мони-торинга сетей. Первоначально он раз-рабатывался для работы с маршрути-заторами, но постепенно стал исполь-зоваться и во многих других устрой-ствах.