Академический Документы
Профессиональный Документы
Культура Документы
НОВОСТИ ПРОФСОЮЗА
Свободные утилиты forensic
Обзор утилит, предназначенных для поиска доказательств
Профсоюз IT-специалистов – взлома, а также применяемых для сохранения случайно
первые шаги или умышленно стертых данных.
2
Сергей Яремчук
АДМИНИСТРИРОВАНИЕ grinder@ua.fm 50
Геннадий Дмитриев
stranger03@mail.ru 22 ОБРАЗОВАНИЕ
В чем слабость твоя?
БЕЗОПАСНОСТЬ Альтернативы парольной защите.
Максим Костышин
Ошибки переполнения буфера Maxim_kostyshin@mail.ru 82
извне и изнутри как обобщенный опыт
реальных атак
Часть 2 HARDWARE
Крис Касперски
kk@sendmail.ru 30 Сторожевой пес
Тестирование устройства Watchdog, предназначенного
для мониторинга и восстановления работоспособности
Межсетевые экраны D-Link серверов после сбоя через принудительный перезапуск.
ПРОФСОЮЗ 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"; }
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;
}
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», а во втором вообще набор несвязных
о существовании «посредника». символов.
$|=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 года.
РАБОТА ПО РАСПИСАНИЮ
ВО 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
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/
14
администрирование
Каждый из нас, работая за компьютером, иногда смотрит на часы. При этом кто-то поглядывает
на стену, кто-то на руку, а кто-то бросает беглый взгляд в угол экрана монитора. Конечно, часы
могут быть разными, главное – чтобы они шли точно. И если для обычных часов их точность
во многом определяется фирмой-производителем, то практически для любых «компьютерных»
высокая точность может быть достигнута благодаря синхронизации времени, например,
с помощью протокола 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.
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.
20
администрирование
тавляется в рамках одной подсети (ограничение broadcast- Режим Manycast
пакетов). Кроме того, для защиты от злоумышленников Этот режим является нововведением четвертой версии
необходимо использовать аутентификацию. протокола NTP. Он подразумевает поиск клиентом среди
своих сетевых соседей manycast-серверов, получение от
Режим Multicast каждого из них образцов времени (с использованием крип-
Данный режим во многом похож на broadcast. Отличие зак- тографии) и выбор на основании этих данных трех «луч-
лючается в том, что для доставки пакетов используются ших» manycast-серверов, с которыми клиент будет произ-
multicast-адреса сетей класса D адресного пространства водить синхронизацию. В случае выхода из строя одного
IP-адресов. Для клиентов и серверов задается адрес из серверов клиент автоматически обновляет свой список.
multicast-группы, которую они используют для синхрони- Для передачи образцов времени клиенты и серверы,
зации времени. Это делает возможным синхронизацию работающие в manycast-режиме, используют адреса
групп машин, расположенных в различных подсетях, при multicast-групп (сети класса D). Клиенты и серверы, ис-
условии, что соединяющие их маршрутизаторы поддер- пользующие один и тот же адрес, формируют одну ассо-
живают протокол IGMP и настроены на передачу группо- циацию. Количество ассоциаций определяется количе-
вого трафика. ством используемых multicast-адресов.
СОЗДАНИЕ КЛАСТЕРА
НА БАЗЕ 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).
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
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.
26
администрирование
Постскриптум, благодарности
и прочее
Чтобы вам не запутаться со всеми этапами установки кла-
стера, приведу небольшую табличку, в которой отражены
все основные этапы.
Время реакции кластера на непредвиденные ситуации
зависит от множества параметров. Это тип ресурса, свой-
ства ресурса, свойства группы ресурсов и времени, необ-
ходимого ресурсу на загрузку. Например, загрузка базы
данных сервера DHCP происходит достаточно быстро. Од-
нако перевод Exchange-сервера может занять до несколь-
ких секунд. Это время, необходимое Exchange-серверу
произвести быструю проверку целостности базы и загру-
зить все необходимые компоненты. В частности, мы экс-
28
безопасность
КРИС КАСПЕРСКИ
30
безопасность
В стеке… зуется в основном для служебных нужд shell-кода. При
Переполнения автоматических буферов наиболее часты этом следует учитывать, что:
и наиболее коварны. Часты – потому что размер таких а) объем стека не безграничен и упирается в определен-
буферов жестко (hardcoded) определяется еще на этапе ный лимит, так что выделять гигабайты памяти все-
компиляции, а процедура проверки корректности обраба- таки не стоит;
тываемых данных зачастую отсутствует или реализована б) если один из спящих объектов процесса-жертвы нео-
с грубыми ошибками. Коварны – потому что в непосред- жиданно проснется, содержимое свободной стековой па-
ственной близости от автоматических буферов присут- мяти окажется искаженным, и чтобы этого не случилось,
ствует адрес возврата из функции, модификация которо- shell-код должен подтянуть регистр ESP к верхнему уров-
го позволяет злоумышленнику осуществить передачу уп- ню, резервируя необходимое количество байт памяти;
равления на произвольный код. в) поскольку стековая память, принадлежащая потоку,
Еще в стеке содержится указатель на фрейм (он же выделяется динамически по мере его распухания, лю-
кадр) материнской функции, сохраняемый компилятором бая попытка выхода за пределы сторожевой страницы
перед открытием фрейма дочерней функции. Вообще-то (page guard) завершается исключением, поэтому либо
оптимизирующие компиляторы, поддерживающие техно- не запрашивайте более 4 Кб, либо прочитайте хотя бы
логию «плавающих» фреймов, обходятся и без этого, ис- по одной ячейке из каждой резервируемой страницы,
пользуя регистр-указатель вершины кадра как обычный двигаясь снизу вверх. Подробнее об этом можно про-
регистр общего назначения, однако даже поверхностный читать у Рихтера.
анализ обнаруживает большое количество уязвимых при-
ложений с кадром внутри, так что этот прием атаки все В зависимости от ограничений, наложенных на пре-
еще остается актуальным. Модификация кадра стека сры- дельно допустимую длину переполняющегося буфера,
вает адресацию локальных переменных и аргументов могут затираться те или иные локальные переменные или
материнской функции и дает возможность управлять ими служебные структуры данных. Очень может статься, что
по своему усмотрению. Установив кадр материнской фун- до адреса возврата просто не удастся «дотянуться», а
кции на «свой» буфер, злоумышленник может положить в даже если и удастся – не факт, что функция не грохнется
материнские переменные (аргументы) любые значения (в задолго до своего завершения. Допустим, за концом стро-
том числе и заведомо некорректные, поскольку проверка кового переполняющегося буфера располагается указа-
допустимости аргументов обычно выполняется до вызо- тель, из которого после переполнения что-то читается (за-
ва дочерних функций, а корректность автоматических пе- писывается). Поскольку переполнение буфера неизбеж-
ременных после их инициализации проверяют только па- но затирает указатель, любая попытка чтения оттуда вы-
раноики). Внимание! Поскольку после возврата из дочер- зывает немедленное исключение и – как следствие – ава-
ней функции все принадлежащие ей локальные перемен- рийное завершение программы. Причем затереть адрес
ные автоматически освобождаются, использовать дочер- возврата, подсунув указателю корректный адрес, скорее
ний буфер для хранения материнских переменных нельзя всего не удастся, т.к. в операционных системах семейства
(точнее, не рекомендуется, но если действовать осторож- Windows все гарантированно доступные адреса лежат
но, то можно). Обратитесь к куче, статической памяти или значительно ниже 01010101h – наименьшего адреса, ко-
автоматической памяти параллельного потока, воздей- торый только можно внедрить в середину строкового бу-
ствуя на нее косвенным образом. фера (подробнее см. «Запрещенные символы»). Так что
Выше кадра стека располагаются сохраненные значе- буфера, расположенные внизу кадра стека, для перепол-
ния регистров, восстанавливаемые при выходе из функ- нения все же предпочтительнее.
ции. Если материнская функция хранит в одном или не- За концом адреса возврата начинается область памя-
скольких таких регистрах критические переменные (напри- ти, принадлежащая материнским функциям и содержащая
мер, указатели, в которые что-то записывается), мы можем аргументы дочерней функции, автоматические переменные
свободно воздействовать на них по своему усмотрению. материнской функции, сохраненные регистры/кадр стека
Дальше начинается область, «оккупированная» ло- проматеринской функции/адрес возврата в праматеринс-
кальными переменными (и переполняющимся буфером в кую функции и т. д. Теоретически переполняющийся буфер
том числе). В зависимости от прихоти компилятора пос- может все это затереть (ну бывают же такие буйные буфе-
ледний может быть расположен как наверху кадра стека, ра), практически же – это либо не нужно, либо неосуще-
так и в гуще локальных переменных – это уже как пове- ствимо. Если мы можем навязать программе корректный
зет (или не повезет – с точки зрения жертвы). Перемен- адрес возврата (т.е. адрес возврата, указывающий на shell-
ные, находящиеся «ниже» переполняющегося буфера, код или любую точку «родного» кода программы), то в ма-
могут быть затерты при последовательном переполне- теринскую функцию она уже не вернется, и все махинации
нии – самом распространенном типе переполнения. Пе- с материнскими переменными останутся незамеченными.
ременные, находящиеся «выше» переполняющегося бу- Если же навязать корректный адрес возврата по тем или
фера, затираются лишь индексным переполнением, кото- иным причинам невозможно, то материнская функция тем
рое чрезвычайно мало распространено. более не сможет получить управления.
Наконец, выше кадра стека находятся только небо и Намного большую информацию несет чтение материн-
звезды, пардон – свободное стековое пространство. За- ской области памяти (см. «Указатели и индексы» в пре-
тирать тут особенно нечего, и эта область памяти исполь- дыдущей статье данного цикла) – здесь действительно
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-кода на универсальные решения закладываться,
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, вставляющей завершающий му, комбинируя их таким образом, чтобы каждый сим-
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-код просто не смо-
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
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 или каждый раз вы-
никновения, но и определенный культурный элемент. Вы- полнять полный цикл трансляции. Во-вторых, легальными
Solaris/SPARC
Системный вызов осуществляется через ловушку (trap), возбуждаемую специальной машинной командой ta 8. Номер
системного вызова передается через регистр g1, а аргументы – через регистры o0, o1, o2, o3 и o4. Перечень номеров
наиболее употребляемых системных функций приведен ниже.
Solaris/x86
Системный вызов осуществляется через шлюз дальнего вызова по адресу 007:00000000 (селектор семь, смещение
ноль). Номер системного вызова передается через регистр eax, а аргументы – через стек, причем самый левый аргу-
мент заталкивается в стек последним. Стек очищает сама вызываемая функция.
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
Free,Net,OpenBSD/x86
Операционные системы семейства BSD реализуют гибридный механизм вызова системных функций: поддерживая
как far call на адрес 0007:00000000 (только номера системных функций другие), так и прерывание по вектору 80h.
Аргументы в обоих случаях передаются через стек.
средствами ассемблера мы не сможем выполнить непос- рованию. Пропуск одной-единственной машинной коман-
редственный FAR CALL и будем вынуждены задавать его ды может стоить вам ночи впустую потраченного труда, –
через директиву DB. В-третьих, управление дампом не ведь для ее вставки в середину shell-кода все последую-
поддерживается в принципе и процедуру шифровки shell- щие инструкции должны быть смещены вниз, а соответ-
кода приходится выполнять сторонними утилитами. По- ствующие им смещения заново пересчитаны. Правда, мож-
этому очень часто для разработки головы червя исполь- но поступить и так: на место отсутствующей команды вне-
зуют HEX-редактор со встроенным ассемблером и крип- дрить JMP на конец shell-кода, перенести туда затертое JMP
том, например, HIEW или QVIEW. Машинный код каждой содержимое, добавить требуемое количество машинных
введенной ассемблерной инструкции генерируется в этом команд и еще одним JMP вернуть управление на прежнее
случае сразу, что называется, «на лету», и если резуль- место. Однако такой подход чреват ошибками и к тому же
тат трансляции вас не устраивает, вы можете, не отходя сфера его применения более чем ограничена (немногие
от кассы, испробовать несколько других вариантов. С дру- процессорные архитектуры поддерживают JMP вперед, не
гой стороны, такому способу разработки присущ целый содержащей в своем теле паразитных нулей).
ряд серьезных недостатков. Кроме того, HIEW, как и подавляющее большинство
Начнем с того, что набитый в HEX-редакторе машин- других HEX-редакторов, не позволяет использовать ком-
ный код практически не поддается дальнейшему редакти- ментарии, что затрудняет и замедляет процесс програм-
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»,
лее того. отображающим потоки управления, чем-то напоминающие
Ðèñóíîê 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
48
безопасность
Компьютеры и Интернет продолжают проникать и вторгаться в нашу жизнь, увеличивая тем самым
вероятность оказаться жертвой компьютерного преступления. Как ни прискорбно замечать,
несмотря на обилие и разнообразие средств защиты, с каждым годом количество взломов
увеличивается. Оказавшись жертвой взлома, некоторые, бывает, и теряются, что порой приводит
к неправильным решениям. Наверное, одна из самых распространенных ошибок состоит
в немедленном удалении всех данных и восстановлении системы из резервных архивов
и продолжении работы как ни в чем не бывало (хотя настаивать на своем мнении не буду, бывают
разные ситуации). Почему так? Во-первых, не всегда можно сразу точно узнать, когда произошел
взлом, и в архиве могут быть уже «зараженные» тем же 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
Ðèñóíîê 2
! pcat, ils, icat, file – предназначены для записи и анали- берет в файле conf/look@first и основные настройки бе-
за процессов и данных, содержащихся на диске. рет из файла grave-robber.cf.
! unrm и lazarus – для восстановления и анализа осво- Вывод выглядит так:
божденных дисковых блоков файловой системы.
! mactime – Perl-скрипт, предназначенный для сбора ин- # ./grave-robber
формации о времени последнего обращения, измене-
ния и время создания (mtimes, atimes и сtimes или луч-
ше modification, access или change – так запомнить
легче) файлов и каталогов, при этом не изменяя их.
Теперь поподробней.
Некоторые утилиты могут работать как с «живой» фай-
ловой системой, так и с образом, созданным при помощи
команды dd.
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 – вывод подробных данных.
Ðèñóíîê 3
Ðèñóíîê 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
Ðèñóíîê 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 тью большего фрагмента.
Ðèñóíîê 7
Ðèñóíîê 8
Пробуем.
# ls -al /data1/sort
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à
# ./hfind -h
60
безопасность
Проверяем, что происходит в /bin.
Как видите, с /bin/umount что-то случилось после со- Теперь в подкаталоге data появятся до тринадцати
здания базы данных, и его контрольная сумма не совпа- файлов, количество которых зависит от типов данных, и
дает. И наконец, скрипт на Perl – sorter, который анализиру- файл sorter.sum, в котором содержится суммарная инфор-
ет образ при помощи fls и icat, находит файлы, в том числе и мация о найденных файлах.
скрытые, для найденного файла запускает команду file, для
того чтобы его распознать. При использовании библиотеки # ls data
NSRL возможно отделение плохих файлов от хороших. Спи-
сок плохих тут же попадет в файл alert.txt. Опция -s позволя- Например, exec.txt содержит рассортированный по ал-
ет сохранить в указанном каталоге фактическое содержа- фавиту список исполняемых файлов, найденных в образе.
ние файла, но для этого необходимо указать при помощи
опции -С файл конфигурации, некоторые шаблоны можно
найти в каталоге sorter/sort, этот файл позволяет задать со-
ответствие между расширением и типом файла.
В каждом файле имеются поля шаблонов (конечно же,
можно добавить и свои), например:
#mkdir data
Ðèñóíîê 9
Ðèñóíîê 10
жите на раздел посвободнее. После чего запускаем, оп-
ционально можно указать порт.
# ./autopsy
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с.
БЛОЧНЫЕ ШИФРЫ
СТАНИСЛАВ ГОШКО
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), осно-
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
68
программирование
АЛЕКСЕЙ МИЧУРИН
При работе с массивами (списками)1 сортировка являет- сделать статью максимально понятной и для людей, не
ся, наверное, наиболее частой операцией. Я не беру в рас- знакомых с Perl.
чёт операции, отвечающие фактически за создание спис- Давайте сперва изучим особенности алгоритма сор-
ков: присоединение и удаление элементов, объединение тировки, вернее особенности её реализации в Perl 5.6. Я
массивов, срез и тому подобные; мы займёмся преобра- не буду здесь рассматривать саму реализацию. Она дос-
зованием уже созданных списков. Мало кто поспорит с таточно сложна и вместе с тем отлично прокомментиро-
тем, что процедура сортировки является весьма ресурсо- вана в исходных кодах Perl. Если вас интересует этот воп-
ёмкой. Можно ли снизить нагрузку на систему, не вмеши- рос, просто почитайте исходные коды. Итак, приступим.
ваясь в сам алгоритм сортировки?
В этой статье я хотел бы рассказать о путях оптимиза- Оценка производительности
ции сортировки в Perl, но думаю, что изложенные здесь сортировки в Perl
приёмы могут быть полезны и для программистов на дру- В качестве критерия производительности я выбрал вели-
гих языках. Особенно, когда речь идёт о языках высокого чину, равную отношению: в числителе – количество срав-
уровня, где уже существуют встроенные функции сорти- нений, необходимое для выполнения сортировки, в зна-
ровки, и вам не надо писать алгоритм сортировки само- менателе – количество элементов в сортируемом списке.
стоятельно, но и вмешаться в него вы уже не можете. Я То есть величину, показывающую, сколько сравнений при-
не смогу написать здесь учебник по Perl, но я постараюсь ходится в среднем на один элемент списка. Естественно,
70
программирование
эта величина зависит и от размера массива, и от меры В результате выполнения этой команды элементы мас-
его начальной упорядоченности. сива @unsorted сортируются по алфавиту и новый, сорти-
рованный, список помещается в массив @sorted4.
Ценность функции sort для программиста была бы не
велика, если бы это была единственная её форма, но, к
счастью, функция sort допускает формулирование любо-
го критерия сортировки. Вторая форма такова:
Ëèñòèíã 2
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+[ïîäâåðñèÿ]
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";
почту, поработать с ней и отослать ответы.
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. Добро пожаловать!
Несмотря на все усилия при построении защиты в компьютерном деле наиболее уязвимым
и наименее предсказуемым остается человек. К сожалению, при работе на компьютере человек
способен только понизить уровень защищенности, если он не выполняет определенных требований
безопасности. Последние примеры схем распространения вирусов по электронной почте (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-кодами карточек экспресс-оп- можно наладить.
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-технология не нашла применения при
оценкам официальных лиц, понадобится пять-шесть лет. аутентификации пользователей компьютеров, однако ак-
К недостаткам технологии биометрической аутентифи- тивный интерес со стороны потребителей, а также раз-
кации можно отнести пока еще высокую стоимость таких витие технологий в этой сфере может привести к тому,
изделий, а также необходимость дополнительного устрой- что широкое распространение таких устройств в нашей
ства считывания биометрических данных, что является оп- жизни позволит найти применение в сфере компьютер-
ределенным неудобством при использовании. ных технологий.
86
hardware
СТОРОЖЕВОЙ ПЕС
АНДРЕЙ БЕШКОВ
88
hardware
На прошлой неделе редакция нашего журнала попросила
меня провести тестирование в боевых условиях устройства
watchdog, предназначенного для мониторинга и восстанов-
ления работоспособности зависших серверов через прину-
дительный перезапуск. На первый взгляд такое устройство
имеет немного шансов для массового применения, так как
любой сервер априори задумывается как сущность, которая
должна работать круглосуточно и бесперебойно. Многие
системные администраторы гордятся тем, что под их коман-
дованием есть сервера, которые функционируют без пере-
загрузки по 360 дней и более. В то же время серверные опе-
рационные системы специально разрабатываются с прице-
лом именно на такой режим использования. Хотя, судя по
моему опыту эксплуатации разнообразных серверных сис-
тем, это еще ничего не значит, и как показывает практика,
вместо исправленных ошибок постоянно находятся новые.
К сожалению, на свете не существует безошибочных про-
грамм, плюс ко всему довольно часто на сервере работают
службы, написанные сторонними производителями. А это в
свою очередь также добавляет в систему нестабильности.
Учитывая то, что мы живем в неидеальном мире, часто скла-
дывается ситуация, когда сам сервер настроен не очень пра- Далее идет шнур RS232 для подключения к COM-пор-
вильно из-за недопонимания основ функционирования сис- ту компьютера. Два дополнительных провода бледноро-
темы или халатности администратора. Поэтому довольно ча- зового цвета служат для присоединения к кнопке reset или
сто случается, что сервера виснут намертво в самый непод- power подопытного сервера. Это в свою очередь помога-
ходящий момент. Хорошо, если администратор рядом, а что ет правильно управлять питанием ATX серверов. В моем
делать, если его нет поблизости и никто не знает, что де- случае использовался именно такой сервер.
лать. Или представим, что зависание произошло ночью, ехать
на другой конец города только ради того, чтобы запустить
злополучный сервер, удовольствие не из тех, что хочется
испытывать как можно чаще.
Порыскав в сети, удалось узнать, что производителем
устройства является Comar Technology. Честно говоря, сайт
www.comar.ru дизайном не впечатлил, впрочем, тут же поду-
малось о том, что это не самое главное, поэтому, закрыв
глаза на мелкие недочеты, я углубился в чтение техничес-
ких спецификаций, инструкций по применению прибора и
отзывов тех, кому уже пришлось воспользоваться данным
устройством. Закончив с этим занятием, решил принять
столь любезное предложение, да и самому было весьма ин-
тересно попробовать на зуб эту диковинку. Примерно через
сутки расторопный и ужасно деловитый курьер DHL доста-
вил загадочную посылку прямо на мой рабочий стол. С не-
терпением разорвав упаковку, я стал разбираться в том, что Следом за двумя вышеперечисленными предметами
находилось в заветном пакете. Итак, давайте посмотрим, что из коробки был извлечен знакомый всем до боли кабель
входит в стандартную поставку устройства watchdog. для подвода электропитания.
Сам прибор выглядит довольно просто, в то же время
презентабельно, плюс ко всему выполнен из ударопрочно-
го пластика, что отнюдь не маловажно в наше неспокой-
ное время. В переднюю панель прибора встроены красный
и зеленый светодиоды, служащие для индикации состоя-
ния самого устройства и наблюдаемого сервера. Там же
находятся два переключателя. Черный подает питание на
устройство, а серый разрешает ему работать в режиме мо-
ниторинга. Если перевести серый переключатель в поло-
жение «выкл», то прибор превращается в обычный элект-
рический удлинитель и не пытается вмешиваться в работу
сервера. Такой режим полезен при первоначальной на-
стройке сервера.
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 и
устройством. Такая мера применяется ради повыше-
ния безопасности, хотя мне кажется весьма сомнитель-
ным, что кто-то будет пытаться взломать устройство с
целью получить контроль над ним. Непонятно, как сде-
лать это без физического доступа к устройству. В то
же время, если есть физический доступ, то, наверное,
целесообразнее взламывать сам сервер.
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, где хранятся ванных в этой статье. На этой приятной ноте хотелось бы
сценарии запуска всех остальных системных демонов и закончить на сегодня наше, надеюсь, приятное для мно-
не забываем создать на него ссылку из каталога пред- гих общение.
Подписные
индексы:
81655
по каталогу
агентства
«Роспечать»
87836
по каталогу
агентства
«Пресса России»
РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
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