Академический Документы
Профессиональный Документы
Культура Документы
Конфигурирование
Конфигурирование
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
Желаем успехов!
2
администрирование
ПРОЦЕССЫ
И НИТИ
ВСЕВОЛОД СТАХОВ
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 – путь (полный или относи- такие процессы делать.
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 (фактически привилегии опе- самом потоке делать обратное преобразование. Данный
рационной системы): способ позволяет передать потоку абсолютно любые па-
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.
10
репортаж
Научились делать!
Недавно фирма ДКС устроила пресс-конференцию, на ко- мым в изготовлении пластиковых окон, то есть для исполь-
торой объявила о начале продаж системы СКС «Инлайнер» зования снаружи, а не для внутренних помещений, как
(систематизированной кабельной системы) российского про- обычно. Цена, правда, также не уступает зарубежным ана-
изводства. Поначалу я скептически отнесся к подобной сис- логам, а некоторые и превосходит. Сама система представ-
теме – не секрет, что российские короба быстро ломаются лена целым комплексом устройств (коробами, уголками,
(особенно если приходится их открывать). Но всегда дума- розетками и прочим), что и позволяет ей именоваться СКС,
ешь: «а вдруг?», поэтому я и поехал на это мероприятие. а не коробами. Для себя я отметил несколько «фичей»:
Пресс-конференция проходила на заводе фирмы ДКС некоторые модели уголков можно ставить на углы комнат,
в Твери. Первое впечатление положительное: отремон- не равных 900 – как раз для наших стен. Сами короба эла-
тированное в современном стиле здание, которое не по- стичны: можно и на кривую стену приделать.
терялось бы на фоне московских офисов, ярким пятном Интересно сделаны розетки (это не ноу-хау, просто взя-
выделялось среди руин промзоны провинциального го- то хорошее решение). Они устанавливаются на те же креп-
рода. Внутри чисто, и что меня поразило больше всего – ления, что и крышка короба, и поэтому их при желании
весь завод выполнен в едином стиле, начиная с цехов и можно передвинуть без необходимости сверлить стену
заканчивая конференц-залом и столовой (кстати, поизящ- или менять часть проводки (надо только не забыть при
нее большинства московских кафе). установке сделать запас провода). Весьма удобно при пе-
Наконец, представлена собственно сама система. На- репланировке офиса.
звать ее «новой» нельзя – система выпускается по лицен- Помня о свойстве отечественных коробов разваливать-
зии итальянской фирмы IBOCO, и уже несколько лет пред- ся при втором-третьем открывании, я несколько раз про-
ставлена на нашем рынке. Как ни странно, но российская делал эту операцию с ДКС-овским коробом, причем раз-
версия по ряду характеристик превосходит итальянского ными «варварскими» способами – отвертками, просто ру-
прародителя: ударопрочность возросла до 6 Дж (против 2 ками, но сломать так и не удалось, что радует. Все-таки
по евростандарту), также возросла стойкость к ультрафи- хорошо, когда у нас начинают работать, как в Европе – да
олету – используются присадки, аналогичные применяе- еще и вещи полезные делают.
С днем рождения!
11 апреля хостинг-провайдер HighWay.ru отметил свой день по отзывам клиентов, они говорят правду. На мероприятии
рождения, уже четвертый по счету. За время работы компа- были подведены итоги конкурса «Кто похвалит меня лучше
нией было зарегистрировано 3463 различных доменных име- всех, тот получит…», тьфу, конкурс на лучшее поздравле-
ни, предоставлен хостинг 3673 серверам, к тому же ние с днем рождения. Главный приз – сотовый телефон. А
HighWay.ru имеет развитую дилерскую сеть, насчитываю- самый изобретательный дилер получил в подарок электро-
щую 57 компаний. Маркетинговая политика являет собой отвертку. Как утверждают старые знакомые компании, та-
пример очередной попытки найти компромисс в дилемме кие шутки вполне в их духе, за что и любят Хайвейцев. Ну и
цена/качество, сделав упор именно на качестве предостав- качество, надо полагать, хорошее – а раз так, нам только
ляемых услуг, разумеется за минимальную… (правда, я не остается присоединиться к поздравлениям.
помню ни одной компании, которая бы говорила что их цена С днем рождения, HighWay!
не минимальна). А вот насчет индивидуального подхода, судя
На мероприятиях побывал Константин Меделян
КОНФИГУРИРОВАНИЕ
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 (îêîí÷àòåëüíûé âàðèàíò) # ñêàçàòü êëèåíòàì, ÷òîáû îòäàëè àäðåñ ÷åðåç 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.
ВСЕВОЛОД СТАХОВ
Наверное, любой из вас хотя бы отдаленно знает, что та- Это открывает широкие возможности при создании се-
кое маршрутизация. Итак, маршрутизация – это, как бы это тей со сложной структурой. Ещё очень важной особеннос-
банально не звучало, есть выбор маршрута. В данной ста- тью является универсальность 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):
исходные коды могут быть получены по адресу: 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
# touch /var/log/tcpdump.log
# chattr 600 /var/log/tcpdump.log
но обычно это делается в инициализационном скрипте. # 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, что соответствует истине.
ДМИТРИЙ РОЖКОВ
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
..... # 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
# cd / delay=20
# find . -xdev | cpio -pm /mnt/newroot
default=Linux
В том случае, когда исходная файловая система состоит image=/vmlinuz
из нескольких разделов, эту процедуру придется повто- label=Linux
рить и для них, но для этого можно уже воспользоваться read-only
более понятной командой:
Когда необходимые изменения внесены, достаточно
# cp -a /usr /mnt/newroot/usr командой:
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.
ствующему драйверу ОС, что на каком-то разделе одно-
УДАЛЕННОЕ РЕЗЕРВНОЕ
КОПИРОВАНИЕ
26
администрирование
Резервное копирование, как правило, предусматривает
наличие некоторого объема «ручной работы». Обычно это
замена съемных носителей. Наличие этого этапа мешает
полностью автоматизировать процесс и тем самым накла-
дывает ограничение на частоту резервного копирования,
а в некоторых случаях и на его регулярность. Выходом из
ситуации может стать создание промежуточных копий на
жестком диске. Это позволит, не снижая частоты резерв-
ного копирования, уменьшить частоту сохранения данных
на съемные носители (а в некоторых случаях и вообще
отказаться от него).
Вместе с тем надежность такого решения практичес-
ки невозможно обеспечить, если жесткий диск подклю-
чен к тому серверу, с которого делается копия, и органи-
зация удаленного резервного копирования становится
необходимостью.
Пример, о котором пойдет речь, несложно реализовать
в любой системе, где есть ssh и tar (последний выбран
произвольно и может быть заменен на cpio, pax или даже
dump). Тем не менее, поскольку некоторые детали реали-
зации будут различны даже для FreeBSD и Linux, пришлось
отказаться от идеи сделать некий универсальный пример,
что привело бы только к излишнему усложнению.
Выбор ssh обусловлен необходимостью обеспечить бе-
зопасность данных при передаче по сети. Тем не менее,
этот выбор сам по себе не освобождает от необходимос-
ти принятия дополнительных мер безопасности как по
отношению к данным, так и по отношению к серверу, слу-
жащему для сохранения резервных копий. Для этого, во-
первых, необходимо правильно устанавливать права на
файлы, во-вторых, все действия должны быть выполне-
ны под пользователями с минимально возможными при-
вилегиями, и, наконец, в качестве дополнительной меры
нелишним будет применить chroot.
Ситуацию с правами на файлы проиллюстрирую на
примере:
# 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 в
сеансе пользователя неизменным. При вызове из скрип-
та они, как правило, не нужны.
Второе требование безопасности относится к учетной
записи для входа на удаленный сервер. Поскольку эта
запись используется только для копирования файлов, прав
ДЕНИС ПЕПЛИН пользователя должно быть достаточно, чтобы сохранять
файлы в своем домашнем каталоге. Он не должен вхо-
#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 включается ного носителя можно выбрать компакт-диски. Они дале-
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.
ДИСТАНЦИОННОЕ
УПРАВЛЕНИЕ В
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>
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
или
/etc/init.d/lircd start
begin
prog = ïðîãðàììà, êîòîðàÿ áóäåò îáðàáàòûâàòü ñîáûòèå
button = êíîïêà, êîòîðóþ íàæàëè
repeat = åñëè 0, òî ïîâòîðíûé ñèãíàë (íàæàòèå êíîïêè)
áóäåò èãíîðèðîâàòüñÿ
config = êîìàíäà
end
Небольшой пример:
begin
prog = irexec
button = 1
repeat = 1
config = echo “Âû íàæàëè êíîïêó 1”
end
ЭТО
ДОЛЖЕН
ЗНАТЬ
КАЖДЫЙ,
ИЛИ
ЧЕТЫРЕ
БАЗОВЫХ
ПРИНЦИПА
ВЫБОРА
КОММУТАТОРА
ЛВС
Если вы планируете смонтировать у себя
новую локальную вычислительную сеть
(ЛВС) или модернизировать старую, то вам
необходимо определиться с сетевой
технологией, выбрать тип магистрали
будущей сети, представить принцип
построения серверной подсистемы и
выбрать производителя сетевого
оборудования.
ГЕННАДИЙ КАРПОВ
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) вой технологии, ее назначения в индустрии вычислитель-
38
администрирование
Таблица 1. Сравнение высокоскоростных технологий.
Таблица 2. Сравнительная оценка производительности коммутаторов среднего класса (класса рабочей группы).
количество процессоров равно 24-м, то коммутатор в со- процессоров и объем буфера – это те характеристики,
стоянии одновременно поддерживать соединение по схе- которые как раз и определяют тактико-технические дан-
ме «12 на 12». К сожалению, информацию о количестве ные производимого им оборудования, сегмент потенци-
центральных процессоров в конкретных реализациях ком- ального рынка, на который он (производитель) может пре-
мутаторов найти очень трудно. Вычислить их количество, тендовать.
используя такие характеристики как Switch Bandwidth или
Bus Capacity, точно нельзя, но оценить в принципе мож- Главный вывод
но. С другой стороны, эта задача практически не связана Доверьте модернизацию вашей сети профессионалам или
с конкретными моделями конкретных производителей. не жалейте средств на обучение собственных специалис-
Каждый производитель позиционирует свое оборудова- тов, пусть они лучше экспериментируют на лабораторных
ние для конкретного сегмента рынка ЛВС. Количество работах в учебном центре, а не с вашими деньгами.
ОРГАНИЗАЦИЯ
ДОСТУПА В ИНТЕРНЕТ
НА ПРЕДПРИЯТИЯХ
АЛЕКСЕЙ ФЁДОРОВ
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 ставить смысла тоже
Выбрав провайдера, и удостоверившись, что он пред- нет: скорее всего, его ресурсы будут простаивать впустую
лагает качественный и приемлемый по скорости доступ в (если, конечно, вы не захотите нагрузить в будущем сервер
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;
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
46
администрирование
Недавно один из знакомых администраторов попросил
помочь ему в создании почтовой системы для фирмы, в
ПОЧТОВАЯ
которой он работает. Подумав о сакраментальном сло-
ве RTFM и вспомнив, что недавних переселенцев с
Windows надо поощрять, я все же решил поискать для
него хорошую документацию, подробно описывающую
то, что ему предстоит выполнить. Побродив некоторое
время в сети, я с удивлением обнаружил отсутствие того,
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.
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
# mkdir /opt
# mkdir /opt/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, который использует эту гов успешно завершится. Во избежание всяких казусов
54
программирование
ВЛАДИМИР МЕШКОВ
Общая методика перехвата способом /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. Эта функция возвращает указатель
кцией 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)
Поля структуры 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:
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:
Переменные и их назначение:
Теперь нам известен адрес функции 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;
В случае неудачи возвращаем нулевое значение: }
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:
Адрес функции 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.
62
безопасность
SELINUX
" Открытое программное
обеспечение играет все более
и более важную роль в федеральных
IT- системах. Я восхищен, что
эксперты защиты агентства
национальной безопасности делают
это ценное содействие open source. "
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-системах напрямую может привести к
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/
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.
ТЕХНОЛОГИИ
ПРОТОКОЛИРОВАНИЯ
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,
так, впрочем, и в других системах реализована крайне
АНТОН ДАНИЛЕНКО неполно, а именно: практически нет разделения ресур-
сов между машинами (загрузка процессора, памяти и пр.).
#!/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
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
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-адресов виртуальных машин на
материнской, например так:
ПРОТОКОЛИРУЕМОГО СЕРВЕРА
СЕРВЕРА После этого отредактируем /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:
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();
# íà ìàòåðèíñêîé ìàøèíå
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 в результате переполнений буфера или других атак.
тема протоколирования, она не поможет вам ровно ни- Если вы только начинаете заниматься безопасностью ва-
чем в предотвращении вторжений/утечек информации без шей уже функционирующей в Интернете системы, можно
перманентного слежения за ее работой и обрабатывае- воспользоваться дополнительными средствами аудита,
мыми ею протоколами. Нельзя забывать, что протоколи- такими как сканеры сетевой безопасности. Результаты
рование – лишь средство экстренного оповещения, а не сканирования позволят вам сделать вывод об общем со-
панацея от всех бед. Главная же задача администратора стоянии вашего сервера, критических уязвимостях сер-
безопасности – это не допустить компрометирования си- висов и стабильности работы системы в целом. В любом
стемы как таковой. Нужно следить за появлением уязви- случае надо помнить, что с совершенствованием техно-
мостей во всех функционирующих на серверах сервисов, логий защиты, совершенствуются и автоматизируются
выходом заплаток и обновлений. Нужно тщательно про- технологии нападения. Таким образом, люди, которые,
думывать политику как внешней, так и локальной безо- порой, в своих знаниях недалеко ушли от рядовых пользо-
пасности. Даже если в системе нет валидных пользова- вателей, могут нанести существенный урон критически важ-
тельских учетных записей, необходимо предусмотреть ным данным серьезных компаний, воспользовавшись кем-
возможность получения прав в системе путем компроме- то написанными и опубликованными средствами атаки.
СОВЕТЫ ПО БЕЗОПАСНОЙ
ВЕБ-АУТЕНТИФИКАЦИИ
ИГОРЬ ТЕТЕРИН
76
безопасность
Речь пойдет об аутентификации на сайтах. Аутентифика- ные хранятся не в голове или записной книжке клиента, а в
ция – очень важная вещь, от нее зависит безопасность все- компьютере, например в cookie. Если аутентификация про-
го вашего проекта. Если система была продумана недо- зрачна лишь в небольшом промежутке времени, либо в те-
статочно хорошо, то в случае хранения приватной инфор- чение одной сессии, то идентифицирующие данные могут
мации о проекте будут слагать истории на аналогах быть просто в памяти, если было предустановлено ПО, то
hacknet.ru о том, как получить чужие данные и управлять данные могут быть где угодно (винчестер, внешние носите-
ими. Обычные почтовые системы сколько существуют, ли и т. п.). Автоматизировать процесс получения чужих дан-
столько и исправляют свои системы аутентификации. К ных легче всего, когда они хранятся в cookie. Современные
тому же система аутентификации может содержать систе- системы аутентификации комбинируют различные методы,
му восстановления пароля, что еще больше подрывает бе- поэтому автоматизировать что-то будет очень сложно. Сис-
зопасность. На своем опыте приходилось открывать пару тема WebMoney предлагает хранить критичные данные на
ящиков именно за счет слабой системы аутентификации. дискетке. Все обычные веб-сайты хранят обычные cookies,
Не буду спорить, для новичков поломать mail.ru покажется не заставляя пользователей сильно напрягаться.
невозможным, но это не так сложно. Речь далее пойдет не
о взломе mail.ru, а о способах аутентификации и защиты Безопасность
от взлома. Самый обычный вариант аутентификации, используемый
на большинстве крупных сайтов: при входе на страницу
Способы пользователь аутентифицируется парой логин/пароль, пос-
Существует несколько стандартных способов аутентифи- ле чего создается сессия, которая ограничивается либо
кации. Но любые способы основываются на какой-либо закрытием браузера, либо временем. Сессия может при-
идентифицирующей информации. И чем меньше иденти- вязываться к IP.
фикационных данных, тем слабее защита. Например, Вы думаете тут ничего не поделать? У таких крупных
аутентификация на основе лишь имени и пароля куда систем обычно существует система восстановления паро-
опаснее, чем если к этому добавится верификация по IP- лей. А сценарий взлома, например, почтового ящика будет
адресу. Приведу несколько примеров, начиная с самого выглядеть так: посылаем жертве письмо с ссылкой на свою
слабого: страничку, либо используем Flash/Action Script->JScript:
Отсутствие аутентификации, знание нахождения нуж-
ных данных; GetUrl(”javascript:alert(“123”);”);
Аутентификация за счет передаваемых куков;
Аутентификация на основе имени и пароля; При получении почты у жертвы создана сессия, в это
Аутентификация на основе имени и пароля, IP-адреса; время жертве доступны все параметры ящика для чтения
Аутентификация на основе имени и пароля, времени, (кроме пароля). Таким образом жертва, зайдя на вашу
IP-адреса и т. п. страницу, сама того не зная, открывает в фреймах стра-
нички с параметрами, при этом отправляя их содержи-
Такие методы сравнивать сложно, поскольку аутенти- мое вам же. Это несложно реализуется примерно следу-
фикация может проходить однажды и на определенный ющим скриптом (написанным на Perl), который вызыва-
срок, либо на каждый сеанс связи. ется из фрейма:
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: те кэширизацию ответов. Неплохим примером может по-
80
образование
ОБУЧАЮЩИЕ
СИТУАЦИОННЫЕ
ЦЕНТРЫ
АНДРЕЙ ФИЛИППОВИЧ
82
образование
В феврале 2003 г. в РГГУ прошла конференция «Ситуа- ситуационных залах АЭС и аэропорта. В будущем, при
ционный центр как инструмент моделирования процессов увеличении числа СЦ, возможен рост спроса на соответ-
для подготовки специалистов». Она была посвящена воп- ствующих специалистов.
росам создания ситуационных центров в образователь- Новые (создаваемые) СЦ, которые должны осуществ-
ных учреждениях. лять постоянный мониторинг, не позволяют отработать
Термин «Ситуационные Центры» в настоящее время име- экстренные ситуации до их возникновения, поэтому для
ет множество трактовок, поэтому важно подчеркнуть, что его них всегда существует необходимость в системе обуче-
создание не сводится к закупке современной компьютерной ния. В центрах, где постоянный контроль несущественен,
и презентационной техники или к использованию методов си- можно предусмотреть специальный режим работы – ре-
туационного моделирования и понятия “ситуации” [5]. В пос- жим обучения. Проиллюстрируем необходимость созда-
леднем случае под ситуацией можно понимать практически ния ОСЦ на следующем примере. СЦ вооруженных сил
любое явление в мире, однако это не позволяет каждую ав- требуются специалисты для работы в мирных и боевых
томатизированную систему считать СЦ. условиях. Центр работает непрерывно и позволяет на-
В рамках этой статьи под СЦ будем понимать сово- брать необходимую статистику для принятия решений в
купность программно-технических средств, научно-мате- условиях мира. Боевые действия никогда не велись, и их
матических методов и инженерных решений для автома- невозможно полноценно имитировать с помощью учений,
тизации процессов отображения, моделирования, анали- поэтому создание ОСЦ необходимо.
за ситуаций и управления. СЦ позволяет автоматизиро-
вать обработку самой ситуации, а не только исходных Возможность создания ОСЦ
данных, необходимых для ее последующего выявления и Рассмотрим существующие возможности создания обу-
анализа субъектом. чающих ситуационных центров. Для этого выделим три
основных варианта разработки ОСЦ:
Необходимость создания обучающих СЦ 1. для действующего СЦ;
Рассмотрим необходимость создания обучающих ситуа- 2. для разрабатываемого СЦ;
ционных центров (ОСЦ) с точки зрения подготовки сотруд- 3. для универсального СЦ.
ников для работы в действующем центре. Персонал СЦ
условно разделим на две группы: инженеры программно- 1. ОСЦ можно реализовать как копию действующего
технического обеспечения и оперативный состав. Инже- центра или как его упрощенную модификацию. Создание
неры осуществляют контроль, настройку, ремонт, замену полной копии в большинстве случаев экономически не-
и доработку используемой техники и программных про- выгодно. Упрощенная модификация должна воссоздать
дуктов. Оперативный состав проводит анализ ситуаций и редуцируемые части на информационном уровне. В про-
принимает управленческие решения. тивном случае ОСЦ будет представлять собой лишь на-
Обе группы могут работать в двух режимах – индиви- бор отдельных компонент. Такой подход реализации ОСЦ
дуальном и коллективном. В первом случае каждый со- приводит к идее о создании виртуального СЦ, который
трудник работает только в своей фиксированной области полностью или частично функционирует на программном,
и не согласовывает свою деятельность с другими члена- а не на техническом или физическом уровне.
ми группы. Во втором случае сотрудники могут работать В ОСЦ должна существовать эффективная система
над решением общей проблемы и должны учитывать воз- оценки обучающего персонала, которая может быть пост-
можные влияния своих решений на деятельность коллег. роена на основе экспертной системы. Если в нее заложить
Потребность в создании СЦ для обучения специалис- опыт множества специалистов, то она может оказаться
тов, работающих в индивидуальном режиме, может воз- более эффективной, чем индивидуальное обучение.
никнуть только в случае, когда реализация группы отдель- Другим вариантом тестирования обучающихся явля-
ных рабочих мест более трудоемка, чем разработка цент- ется сравнение их деятельности с работой экспертов. Для
ра в целом. Необходимость подготовки инженеров про- этого необходимо обеспечить совместное поступление
граммно-технического обеспечения в СЦ существенно информации в обучающий и действующий СЦ или осу-
меньше, чем оперативного состава. Это связано с тем, что ществить протоколирование деятельности экспертов за
центр для обеспечения повышенной надежности почти все- длительный промежуток времени для последующего ис-
гда строится на модульном принципе, дающем возможность пользования в ОСЦ. Последнее решение может оказать-
изучать его работу на примере отдельных компонент. ся менее предпочтительным, т.к. ситуация в системе по-
Целесообразность создания ОСЦ определяется по- стоянно изменяется. Оптимальным вариантом является
требностью в подготовке большого числа специалистов, возможность использования обоих подходов.
способных работать в коллективном режиме и невозмож- 2. На этапе проектирования нового (нетипового) СЦ
ностью или экономической невыгодностью индивидуаль- нужно учитывать возможность его использования для
ного обучения. обучения. Если постоянный мониторинг за ситуацией не
В настоящее время количество СЦ в России мало. обязателен, то следует предусмотреть несколько режи-
Кроме того, почти все они являются уникальными, что со- мов работы.
здает существенное препятствие для подготовки «универ- При отсутствии опыта и накопленной базы управлен-
сального» работника. Например, невозможно обучить ческих решений разработка экспертной или сравниваю-
диспетчера, способного одинаково хорошо работать в щей системы практически невозможна. Для преодоления
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.
кими и другими семиотическими системами. Выпуск спе-
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-
документ существует четыре варианта, приведу их все, так
как на различных сайтах их часто можно встретить.
Первый и, наверное, наиболее предпочтительный, так
как принят по умолчанию:
Ðèñ. 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 (никакое значение).
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. «$», «/», «“», «.» и некоторые другие, то они должны обя-
94
подписка
Единый
подписной
индекс:
81655
по каталогу 81655
агентства
«Роспечать»
Рады видеть
Вас нашими
читателями!
РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
НОМЕРЕ:
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