ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ Утверждаю: Зав. каф. РЗИ ___________ Задорин А.С. Защита информационных процессов в компьютерных системах Практикум Учебно-методическое пособие по проведению практических занятий доц. каф. РЗИ _______ Агеев Е.Ю. Томск, 2007 ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ Утверждаю: Зав. каф. РЗИ ___________ Задорин А.С. Защита информационных процессов в компьютерных системах Практикум Учебно-методическое пособие по проведению практических занятий доц. каф. РЗИ _______ Агеев Е.Ю. Томск, 2007 2 © Е.Ю. Агеев. Защита информационных процессов в компьютерных системах. Практикум. – Томск: Издательство Томского государственного университета систем управления и радиоэлектроники, 2007. – 70 с. 3 Содержание Занятие №1 Знакомство с ОС Linux .........................................................................................6 Введение ................................................................................................................................6 Файлы и каталоги ..................................................................................................................6 Ориентация и навигация в файловой системе......................................................................8 Основные команды Linux .....................................................................................................9 Контрольные вопросы.........................................................................................................15 Выполнение работы ............................................................................................................15 Занятие №2 Процессы в ОС Linux..........................................................................................16 Понятие процесса ................................................................................................................16 Типы процессов ...................................................................................................................16 Атрибуты процесса .............................................................................................................17 Жизненный цикл процесса в Linux и основные системные вызовы .................................18 Контекст процесса...............................................................................................................19 Приоритеты процессов........................................................................................................20 Создание процесса ..............................................................................................................20 Сон и пробуждение .............................................................................................................21 Завершение выполнения процесса .....................................................................................21 Получение информации о процессах .................................................................................22 Сигналы: посылка и обработка...........................................................................................23 Контрольные вопросы.........................................................................................................26 Выполнение работы ............................................................................................................26 Занятие №3 Сетевые команды и утилиты Linux..................................................................27 Основные сетевые команды................................................................................................27 Контрольные вопросы.........................................................................................................29 Выполнение работы ............................................................................................................29 Занятие №4 Создание простых командных файлов (сценариев) .......................................29 Команды, конвейеры, списки..............................................................................................29 Метасимволы командного интерпретатора........................................................................30 Создание сценариев.............................................................................................................31 Переменные и присваивание ..............................................................................................33 Контрольные вопросы.........................................................................................................34 Выполнение работы ............................................................................................................34 Занятие №5 Программирование в командном интерпретаторе.........................................35 Создание командных файлов с выполнением циклических действий..............................35 Оператор выбора .................................................................................................................35 Условный оператор .............................................................................................................36 Перехват и обработка сигналов ..........................................................................................36 Запрос информации у пользователя ...................................................................................37 Вычисления в командном интерпретаторе.........................................................................37 Функции в командном интерпретаторе..............................................................................38 Контрольные вопросы.........................................................................................................39 Выполнение работы ............................................................................................................39 Занятие №6 Работа со сканером NMAP .................................................................................40 Обзор сканеров портов..........................................................Error! Bookmark not defined. Соображения по поводу сканирования портов ..................................................................42 Применение сканеров портов ...............................................Error! Bookmark not defined. Запуск Nmap из командной строки.......................................Error! Bookmark not defined. Типы сканирования в Nmap..................................................Error! Bookmark not defined. Опции раскрытия для Nmap..................................................Error! Bookmark not defined. Контрольные вопросы.........................................................................................................51 Выполнение работы ............................................................................................................51 4 Занятие №7 Работа с программой Nessus...............................................................................52 Общая информация .............................................................................................................52 Настройка программы.........................................................................................................52 Подключение клиента .........................................................................................................53 Использование Nessus .........................................................................................................54 Контрольные вопросы.........................................................................................................59 Выполнение работы ............................................................................................................59 Занятие №8 СОЗДАНИЕ ЗАЩИЩЕННЫХ ДОКУМЕНТОВ В ТЕКСТОВОМ ПРОЦЕССОРЕ OPENOFFICE.ORG WRITER .....................................................................60 Создание защищенного документа.....................................................................................60 Создание документа с цифровой подписью.......................................................................61 Контрольные вопросы.........................................................................................................62 Выполнение работы ............................................................................................................62 Занятие №9 Шифрование почтовых сообщений в программе Mozilla Thunderbird .......63 Создание электронного письма с цифровой подписью. ....................................................64 Получение подписанного электронного письма. ...............................................................66 Подготовка зашифрованного электронного письма. .........................................................67 Контрольные вопросы.........................................................................................................69 Выполнение работы ............................................................................................................69 Литература...........................................................................................................................70 5 Занятие №1 Знакомство с ОС Linux Продолжительность- 2 часа Максимальный рейтинг- 10 баллов Цель работы Познакомится с ОС Linux, изучить логическую структуры файловой системы Linux, освоить некоторые команды операционной системы, научиться запускать окно терминала, выполнять изученные команды. Введение Современные версии ОС Linux предлагают для работы удобный графический интерфейс, сильно напоминающий вид окон Windows. Однако работа в командной строке остается одним из необходимых навыков для управления и настройки ОС Linux. Эта операционная система, в отличие от Windows, построена так, что она работает независимо от графического интерфейса, его можно использовать или отключить, на функционирование операционной системы это не повлияет. Кроме того, ОС Linux – многопользовательская операционная система. Она позволяет на одном компьютере зарегистрироваться и одновременно работать нескольким разным пользователям. При этом они не только не будут мешать друг другу, но могут даже не заметить «присутствия» другого пользователя на компьютере. Для ОС Linux создано несколько различных графических оболочек, но наибольшее распространение получил графический интерфейс KDE (K Desktop Enviroment) фирмы Corel. Переключение из графического режима в окно терминального доступа выполняется с помощью комбинации клавиш Ctrl+Alt+F1 (F2-F6). Для обратного переключения необходимо нажать Alt+F7. Зарегистрировавшись в терминальном окне под тем же именем, что и в графической оболочке (или под другим) можно работать в режиме командной строки. Окно терминала может быть запущено и внутри графического режима. Для этого в строке ввода команды достаточно ввести «Konsole» или «Xterm». Файлы и каталоги Операционная система выполняет две основные задачи: манипулирование данными и их хранение. Большинство программ в основном манипулирует данными, но, в конечном счете, они где-нибудь хранятся. В системе Linux таким местом хранения является файловая система. Более того, в Linux все устройства, с которыми работает операционная система, также представлены в виде специальных файлов в файловой системе. Понятие логической файловой системы Логическая файловая система в ОС Linux (или просто файловая система) - это иерархически организованная структура всех каталогов и файлов в системе, начинающаяся с корневого каталога. Файловая система Linux обеспечивает унифицированный интерфейс доступа к данным, расположенным на различных носителях, и к периферийным устройствам. Логическая файловая система может состоять из одной или нескольких физических файловых (под)систем, являющихся разделами физических носителей (дисков, CD-ROM или дискет). Файловая система контролирует права доступа к файлам, выполняет операции создания и удаления файлов, а также выполняет запись/чтение данных файла. Поскольку большинство прикладных функций выполняется через интерфейс файловой системы, следовательно, права доступа к файлам определяют привилегии пользователя в системе. Файловая система обеспечивает также перенаправление запросов, адресованных периферийным устройствам, соответствующим модулям подсистемы ввода-вывода. Типы файлов 6 В Linux существует несколько типов файлов, различающихся по функциональному назначению и действиям операционной системы при выполнении тех или иных операций над ними. Обычный файл Представляет собой наиболее общий тип файлов, содержащий данные в некотором формате. Для операционной системы такие файлы представляют собой просто последовательность байтов. К этим файлам относятся текстовые файлы, двоичные данные и выполняемые программы. В длинном листинге признаком обычного файла является дефис (-) в первой позиции первого столбца: -rw-rw-r-- 1 root sys 8296 Фев 23 15:39 ps_data Каталог С помощью каталогов формируется логическое дерево файловой системы. Каталог - это файл, содержащий имена находящихся в нем файлов, а также указатели на дополнительную информацию - метаданные, позволяющие операционной системе производить действия с этими файлами. Каталоги определяют положение файла в дереве файловой системы. В длинном листинге признаком каталога является символ d в первой позиции первого столбца: drwxr-xr-x 2 informix informix 115 Фев 24 13:05 txt Файл устройства Обеспечивает доступ к физическим устройствам. В Linux различают символьные (character special device) и блочные (block special device) файлы устройств. Доступ к устройствам осуществляется путем открытия, чтения и записи в файл устройства. Символьные файлы устройств используются для небуферизованного обмена данными с устройством (терминал). Блочные файлы устройств позволяют производить обмен данными в виде пакетов фиксированной длины – блоков (жесткий диск). В длинном листинге признаком специального символьного и блочного устройств являются символы с и b в первой позиции первого столбца, соответственно: Файл - именованный канал Этот файл используется для связи между процессами по принципу очереди. Именованные каналы впервые появились в UNIX System V, но большинство современных систем поддерживают этот механизм. В длинном листинге признаком именованного канала является символ p (pipeline) в первой позиции первого столбца: Файл - ссылка Стандарт POSIX (Portable Operating System Interface for UNIX) требует реализовать поддержку двух типов связей - жестких и символических. Жесткой связью (hard link) считается элемент каталога, указывающий непосредственно на некоторый индексный дескриптор. Жесткие связи очень эффективны, но у них существуют определенные ограничения, так как они могут создаваться только в пределах одной физической файловой системы. Когда создается такая связь, связываемый файл должен уже существовать. Кроме того, каталоги не могут связываться жесткой связью. Символическая связь (symbolic link) - это специальный файл, который содержит путь к другому файлу. Указание на то, что данный элемент каталога является символической связью, находится в индексном дескрипторе. Поэтому обычные команды доступа к файлу вместо получения данных из физического файла, берут их из файла, имя которого приведено в связи. Этот путь может указывать на что угодно: это может быть каталог, он может даже находиться в другой физической файловой системе, более того, указанного файла может и вовсе не быть. 7 Некоторые системы накладывают ограничение на количество символических связей в пути. POSIX требует, чтобы их поддерживалось не менее 20, но действительное значение зависит от конкретной реализации. Конечно, в описании пути можно использовать сочетание символических и жестких связей. В длинном листинге признаком символической связи является символ l в первой позиции первого столбца. Количество жестких связей файла (а также количество файлов в каталоге, если файл является каталогом) отображается во втором поле длинного листинга. Файл - сокет Сокеты позволяют представить в виде файла в логической файловой системе сетевое соединение. В длинном листинге признаком сокета является символ s в первой позиции первого столбца. Ориентация и навигация в файловой системе Иерархическая структура файловой системы Linux упрощает ориентацию в ней. Каждый каталог, начиная с корневого (/), содержит файлы и другие каталоги (подкаталоги). Каждый каталог содержит также ссылку на родительский каталог (для корневого каталога родительским является он сам), представленную каталогом с именем две точки (..) и ссылку на самого себя, представленную каталогом с именем точка (.). Каждый запущенный в системе процесс имеет текущий каталог. Сразу после регистрации текущим каталогом пользователя (на самом деле, процесса - начальной программы, обычно, командного интерпретатора) становится начальный каталог, указанный в файле /etc/passwd. Каждый процесс может сослаться на любой файл или каталог в файловой системе по имени. Основные каталоги и их назначение Использование общепринятых имен основных файлов и структуры каталогов существенно облегчает работу в операционной системе. Типичная структура и назначение каталогов файловой системы Linux представлена в табл. 1. Каталог / /bin /dev /etc /home /lib /lost+found Таблица 1. Назначение и содержание Корневой каталог. Является основой файловой системы Linux. Все остальные каталоги и файлы располагаются в рамках структуры, порожденной корневым каталогом (в нем и в его подкаталогах), независимо от их физического местонахождения. Для корневого каталога обязательно должна создаваться отдельная физическая файловая система, а сам он является точкой ее монтирования, о чем свидетельствует наличие подкаталога lost+found. Пользовательские выполняемые программы. Сейчас обычно является символической связью, указывающей на /usr/bin. Каталог для специальных файлов устройств. Может иметь подкаталоги для различных классов и типов устройств, например, dsk, rdsk, rmt, inet (в SVR4). Каталог для конфигурационных файлов. Может иметь подкаталоги для различных компонентов и служб. Конфигурационные файлы в Linux обычные текстовые. Каталог для размещения начальных каталогов пользователей. Каталог для библиотек. Сейчас обычно является символической связью, указывающей на /usr/lib. Подкаталог, имеющийся в каждом каталоге, являющемся точкой монтирования физической файловой системы на диске. Корневой каталог всегда представлен отдельной физической файловой системой, должен быть всегда доступен, и монтируется автоматически при запуске системы. Все 8 /mnt /opt /proc /sbin /tmp /usr /usr/bin /usr/include /usr/lib /usr/local /var остальные физические файловые системы формально не нужны для функционирования ОС Linux. Точка монтирования для файловых систем на съемных носителях или дополнительных дисках. Может содержать подкаталоги для отдельных типов носителей, например, cdrom или floppy. Может быть пустым. Каталог для дополнительного коммерческого программного обеспечения. Может быть пустым или отсутствовать (в BSD-системах). Каталог псевдо-файловой системы, представляющей в виде каталогов и файлов информацию о ядре, памяти и процессах, работающих в системе. Каталог для системных выполняемых программ, необходимых для решения задач системного администрирования. Каталог для временных файлов. Имеет установленный клейкий бит и доступен для записи и чтения всем пользователям. Обычно создается в виде отдельной физической файловой системы, в том числе, в виртуальной памяти. В этом каталоге находятся выполняемые программы, библиотеки, заголовочные файлы, справочные руководства (/usr/share/man), исходные тексты ядра и утилит системы (Linux) и т.д. Часто каталог является точкой монтирования отдельной физической файловой системы. Основные выполняемые программы и утилиты. Заголовочные файлы библиотек. Статически и динамически компонуемые библиотеки. Каталог для дополнительного программного обеспечения. Содержит структуру подкаталогов, аналогичную корневому каталогу (bin, etc, include, lib и т.д.). Этот каталог используется для хранения изменяющихся файлов различных сервисных подсистем, например, файлов журналов системы. В файле /var/adm/messages, сохраняются сообщения, выданные системой во время загрузки. Наличие, назначение и использование других каталогов верхнего уровня и подкаталогов зависит от версии ОС Linux, установленного системного и прикладного программного обеспечения и конфигурации системы, созданной администратором. Имена файлов в ОС Linux В ОС LINUX поддерживается три способа указания имен файлов: • Краткое имя. Имя, не содержащее специальных символов – косая черта (/), является кратким именем файла. По краткому имени можно обратиться к файлам текущего каталога. • Относительное имя. Имя, не начинающееся с символа косой черты (/), но включающее такие символы. Оно ссылается на файл относительно текущего каталога. • Полное имя. Имя, начинающееся с символа косой черты (/). Оно ссылается на файл относительно корневого каталога. Это имя еще называют абсолютным, так как оно, в отличие от предыдущих способов задания имени, ссылается на один и тот же файл независимо от текущего каталога. Другие символы, кроме косой черты, не имеют в именах файлов Linux особого значения. В частности, отсутствует понятие расширения файла. Основные команды Linux Команда pwd Команда pwd выдает полное имя текущего (рабочего) каталога (Path working directory). Эта команда не имеет параметров. 9 Команда cd Используется для изменения текущего каталога, например: cd [каталог] В качестве параметра указывается каталог, в который должен быть сделан переход. Если каталог не указан, используется значение переменной среды $HOME (обычно это начальный каталог пользователя). Другими словами, команда cd без параметров выполняет переход в домашний каталог пользователя. Переход в другой каталог возможен, если пользователь имеет право на выполнение для этого каталога. Команда ls Для просмотра информации об именах, размере и атрибутах файлов в ОС Linux используется команда ls. Команда ls выдает информацию об указанном файле, если имя файла следует после команды или о файлах и каталогах в текущем каталоге (если имя файла не задано). Формат и подробность выдаваемой информации зависит от опций. Основные опции команды ls представлены в табл. 2: Таблица 2. Опция -a -F -i -l -r -R -t Назначение Выдает все файлы и подкаталоги, включая те, имена которых начинаются с точки (.). По умолчанию такие файлы не выдаются (они считаются скрытыми). Добавляет к имени файла суффикс, показывающий его тип. Помечает каталоги косой чертой (/), выполняемые файлы - звездочкой (*), именованные каналы (FIFO) - вертикальной чертой (|), символические связи - "собакой" (@), а сокеты - знаком равенства (=). Для каждого файла выдает в первом столбце листинга номер индексного дескриптора (i-node). Выдает длинный листинг, включающий права доступа, количество связей, владельца, группу, размер в байтах, время последнего изменения каждого файла и, естественно, имя файла. Если файл является специальным файлом устройства, вместо размера выдаются главный и второстепенный номера устройства. Если с момента последнего изменения прошло более 6 месяцев, оно обычно выдается в формате 'месяц день год'. Для файлов, измененных позднее, чем 6 месяцев назад, время выдается в формате 'месяц день время'. Если файл является символической связью, в длинном листинге после имени файла указывается стрелочка (->) и имя файла, на который связь ссылается. Изменяет порядок сортировки на обратный стандартному (обратный лексикографический или сначала самые старые файлы, в зависимости от других опций). Рекурсивно выдает содержимое подкаталогов. Сортирует листинг по временной отметке (сначала - самые новые), а не по имени файла. По умолчанию используется время последнего изменения. (Опции -u и -c позволяют сортировать по времени последнего обращения и времени создания, соответственно.) К основным операциям для работы с файлами, помимо создания и просмотра характеристик, можно отнести копирование, удаление, перемещение и переименование, а также просмотр содержимого. Команды для выполнения этих действий представлены в следующих подразделах. Команда mkdir Создает новый пустой каталог с именем, указанным после команды: mkdir каталог ... 10 Команда ln Эта команда создает файл - ссылку на другой файл. Синтаксис команды: ln [ -fns ] исходный_файл ... цель В результате выполнения команды создается жесткая (по-умолчанию) или символическая (если указана опция -s) связь с заданным именем цель. Если файл с таким именем уже существует, он перезаписывается. При вызове команды с одним аргументом (без указания цели) создается связь на указанный исходный_файл с таким же именем в текущем каталоге. Опции -f и -n требуют, соответственно, принудительно создать связь или не создавать ее, если цель задает существующий файл. Первый аргумент команды ln должен указывать существующий файл или каталог. Команда cp Команда cp копирует исходный файл в целевой файл или каталог. Она имеет следующий синтаксис: cp [-p] исходный целевой cp [-r] [-p] исходный... каталог Имя исходного файла не должно совпадать с целевым. Если целевой файл является каталогом, то исходные файлы копируются в него под теми же именами. В этом случае можно указывать несколько исходных файлов. Если целевой файл существует и не является каталогом, его старое содержимое теряется. Права доступа, владелец и группа целевого файла при этом не меняются. Если целевой файл не существует или является каталогом, новые файлы создаются с теми же правами доступа, что и исходные. Время последнего изменения целевого файла (последнего доступа, если он не существовал), а также время последнего доступа к исходным файлам устанавливается равным времени копирования. Если целевой файл был связью на другой файл, все связи сохраняются, а содержимое файла изменяется. Команда cp поддерживает следующие основные опции: -р сохраняет информацию о владельце, по возможности - права доступа и времена доступа для нового файла; -r копирует рекурсивно, включая подкаталоги. Два дефиса (--) позволяют явно указать конец опций командной строки, что дает возможность команде cp работать с именами файлов, начинающимися с дефиса (-). Если в одной командной строке указаны -- и -, второй дефис будет интерпретироваться как имя файла. Команда rm Команда rm применяется для удаления файлов. В результате выполнения команды происходит удаление записи файла из соответствующего каталога и уменьшение на 1 количества связей в индексном дескрипторе. Если количество связей в результате становится равным 0, файл уничтожается (после завершения работы всех использовавших его процессов) - соответствующий индексный дескриптор становится свободным, и блоки данных файла также освобождаются. Для удаления файла пользователь должен обладать правом записи в соответствующий каталог. Если нет права на запись в файл и входной поток связан с терминалом, на терминал выдаются (в восьмеричном виде) права доступа к файлу и запрашивается подтверждение; если введен ответ y - файл удаляется, иначе - нет. Команда rm воспринимает следующие основные опции: -f (Force) Удаляет без подтверждения все файлы, независимо от прав доступа к ним, если имеется право записи для каталога; -i Запрашивает подтверждение, прежде чем удалить файл. Опция -i отменяет действие опции -f; 11 -r -R Рекурсивное удаление, с подкаталогами, в том числе, не пустыми; То же, что и опция -r. Команда rm без опций рекурсивного удаления не удаляет подкаталоги. Команда rmdir Предназначена для удаления пустых каталогов. Если в каталоге есть другие файлы, кроме ссылок на текущий и родительский каталог, команда rmdir его не удаляет. Команда rmdir имеет следующие опции: -p Позволяет удалить каталог и его родительские каталоги, если они - пустые. В стандартный выходной поток выдается сообщение об удалении всех указанных каталогов или о сохранении части из них по каким-либо причинам. -s Подавляет выдачу сообщений при использовании опции -p. Команда mv Команда mv перемещает (переименовывает) исходный файл (или файлы) в целевой файл (или каталог). Она имеет следующий синтаксис: mv [-f][-i] исходный_файл целевой_файл mv [-f][-i] исходный_файл ... каталог Имя исходного файла не должно совпадать с именем целевого файла. Если целевой файл является каталогом, то исходные файлы перемещаются в него под теми же именами. Только в этом случае можно указывать несколько исходных файлов. Если целевой файл существует и не является каталогом, его старое содержимое теряется. Для перемещения файла необходимо иметь права записи в исходном и целевом каталоге. Команда mv имеет следующие опции: -f Принудительное перемещение - если целевой файл уже существует, то он удаляется. -i Запрашивает подтверждение удаления существующего файла. Команда cat Команда cat – инструмент, предназначенный для конкатенации (объединения) нескольких файлов. Команда работает с символами перенаправления ввода-вывода (>, <, >>). Например, для объединения содержимого двух файлов: first.txt и second.txt в файле combinet.txt используется команда: cat first.txt second.txt > combinet.txt. Команда cat second.txt >> first.txt дописывает содержимое файла second.txt в конец файла first.txt. Эта же команда может использоваться и для просмотра содержимого файлов. Если в качестве параметра команде передано имя файла, она читает его содержимое и помещает его в стандартный выходной поток, т.е. на экран. Если ни один файл не указан или указан символ дефиса (-), то команда читает стандартный входной поток (ввод с клавиатуры). Это позволяет создавать новые файлы с помощью команды cat. Например, команда: cat > first.txt Создаст в текущей директории новый файл с именем first.txt, после чего направит в него стандартный входной поток, т.е. все, что будет вводится на клавиатуре. Завершить ввод можно нажатием клавиш Ctrl+D. 12 Команды mount и umount Физические файловые системы, кроме корневой (/), считаются съемными (removable) в том смысле, что они могут быть как доступны для пользователей, так и не доступны. Команда mount уведомляет систему, что блочное устройство или удаленный ресурс доступны для пользователей в точке монтирования, каталоге в структуре файловой системы, который уже должен существовать. Точка монтирования становится именем корня вновь смонтированного устройства или ресурса. Говорят, что эта команда монтирует или подключает физическую файловую систему или ресурс к общей логической файловой системе. Команда mount имеет следующий синтаксис: mount [-v | -p] mount [-F ТипФС] [-V] [-o специфические_опции] {устройство|точка_монтирования} mount [-F ТипФС] [-V] [-o специфические_опции] устройство точка_монтирования} Команда mount, при вызове с аргументами, проверяет все аргументы, за исключением устройства, и вызывает системный модуль монтирования для указанного типа файловой системы. При вызове без аргументов команда mount выдает список всех смонтированных файловых систем из соответствующей системной таблицы. При вызове с неполным списком аргументов (например, только с указанием устройства или точки_монтирования, или когда указаны оба эти аргумента, но не задан тип файловой системы), mount будет просматривать таблицу стандартных файловых систем в поисках недостающих аргументов. Затем она вызывает системный модуль монтирования для соответствующего типа файловой системы. Специфические опции монтирования зависят от типа физической файловой системы. Все физические файловые системы можно монтировать только для чтения. Обратная процедура по отношению к монтированию называется демонтированием и выполняется командой umount со следующим синтаксисом: umount [-V] [-o специфические_опции] {устройство|точка_монтирования} Команды mount и umount воспринимают следующие основные опции: -p -F -V -v -o Выдает список смонтированных файловых систем в формате таблицы смонтированных файловых систем. Задает тип файловой системы для монтирования. Тип файловой системы должен быть либо задан, либо определяется по таблице стандартных файловых систем в ходе монтирования. Выдает результирующую командную строку, но не выполняет команду. Командная строка генерируется с использованием опций и аргументов, указанных пользователем, путем добавления к ним, при необходимости, информации, взятой из таблицы стандартных файловых систем. Выдает результаты в "новом" стиле. При этом дополнительно отображается тип файловой системы и флаги. Поля точка_монтирования и устройство переставлены. Задает специфические опции для указанного типа физической файловой системы. Любой пользователь может вызывать команду mount для получения списка смонтированных файловых систем и ресурсов. Монтировать или демонтировать файловые системы может только пользователь root (администратор). Команда mount по-умолчанию добавляет запись в таблицу смонтированных файловых систем (файл /etc/mnttab), umount удаляет запись из этой таблицы. Поля в таблице смонтированных устройств разделены пробелами и представляют блочное специальное устройство, точку монтирования, тип смонтированной файловой системы, опции монтирования и время, когда файловая система была смонтирована. Таблица стандартных файловых систем (файл /etc/fstab) описывает стандартные параметры для физических файловых систем. Поля в таблице (их 7) разделены пробелами и символами табуляции, и представляют, соответственно: 13 1. специальное блочное устройство или имя монтируемого ресурса; 2. неформатированное (специальное символьное) устройство для проверки утилитой fsck; 3. стандартный каталог монтирования; 4. тип файловой системы; 5. число, используемое fsck для принятия решения об автоматической проверке файловой системы и о порядке этой проверки по отношению к другим файловым системам; 6. признак автоматического монтирования файловой системы; 7. опции монтирования. Если в поле нет значения, используется дефис (-). Команда df Команда df (disk free) позволяет получить информацию об объеме свободного дискового пространства. Чаще всего, команда df вызывается без опций или с опцией -k. Опция -k выдает информацию об объемах в килобайтах. Для каждой физической файловой системы выдается отдельная строка, включающая (при использовании опции -k) специальный файл или имя смонтированного ресурса, общий объем, использованный объем, доступный объем для использования обычными пользователями, процент свободного места в файловой системе и точку монтирования. Команда du Выводит объем, занимаемый на диске каталогом или файлом, имя которого указано в качестве параметра команды. Если ввести команду без параметров, выдается информация о текущем каталоге. 14 Контрольные вопросы 1. Какие типы файлов существуют в ОС Linux. 2. Поясните понятие «точка монтирования». 3. Какие операции могут быть выполнены с помощью команды cat. 4. Чем отличаются краткое, полное и относительное имя файла. 5. Перечислите основные ключи команды ls, поясните их назначение. 6. В каком случае целесообразно применение команды rmdir, а в каком rm. 7. Каково содержимое каталогов /etc, /bin, /sbin в операционной системе Linux. 8. Выполните сравнительный анализ команд cp и mv. 9. Поясните назначение команды pwd. 10. Как можно определить размер файла в ОС Linux. 11. Как Вы думаете, почему в ОС Windows нет необходимости выполнять команды монтирования, а в ОС Linux они необходимы. 12. Где хранится информация об известных операционной системе файловых системах. 13. Какое значение хранит системная переменная HOME. Выполнение работы 1. Определить размер системных каталогов /usr, /sbin и /etc. 2. Просмотреть содержимое директории /tmp. 3. Создать в домашнем каталоге текстовый файл с именем proba.txt, внести в него свои имя, фамилию, отчество, номер группы и курса. 4. Просмотреть параметры созданного файла. 15 Занятие №2 Процессы в ОС Linux Продолжительность- 2 часа Максимальный рейтинг- 10 баллов Цель работы Изучить вопросы запуска, работы и взамодействия процессов в ОС Linux, познакомится с понятием «сигнал» и основными сигналами, управляющими работой процессов. Освоить команды вывода списка выполняющихся процессов и отправки сигналов процессам. Понятие процесса Основным ресурсом компьютера является его процессор (или процессоры в многопроцессорных системах). В каждый момент времени один процессор может выполнять только один процесс. Организация планирования процессов так, чтобы за счет их переключения создавалась иллюзия одновременной работы нескольких процессов - одна из основных задач любой многопользовательской и многозадачной операционной системы. В ОС Linux основным средством организации и единицей многозадачности является процесс - уникальным образом идентифицируемая программа, которая нуждается в получении доступа к ресурсам процессора. Операционная система манипулирует образом процесса, который представляет собой программный код, а также разделами данных процесса, определяющими среду выполнения. Сегмент кода содержит реальные инструкции процессора, включающие как строки, скомпилированные и написанные пользователем, так и стандартный код, сгенерированный компилятором для системы. Этот системный код обеспечивает взаимодействие между программой и операционной системой. Основой операционной системы Linux является ядро. Ядро представляет собой специальную программу (или несколько программных модулей, в случае модульного ядра), которая постоянно находится в оперативной памяти и работает, пока работает операционная система. Ядро управляет системными таблицами, используемыми для отслеживания процессов и других ресурсов. Ядро загружается в память во время начальной загрузки и немедленно запускает необходимые процессы, первым и главным из которых является процесс инициализации операционной системы - init. Данные, связанные с процессом, также являются частью образа процесса. Некоторые из них хранятся в регистрах процессора. Кроме того, существуют динамические области в памяти для хранения данных (куча), выделяемые процессом по ходу работы при необходимости. Для хранения локальных переменных программы и передачи параметров процесс может использовать специальную область памяти – стек. Когда процесс выполняет обращение к функции или подпрограмме, в стек отправляется новый фрейм. Одной из частей каждого фрейма является указатель на базу предыдущего фрейма, который позволяет легко вернуться из вызова функции. Типы процессов В ОС UNIX выделяется три типа процессов: системные, процессы-демоны и прикладные процессы. Системные процессы являются частью ядра и всегда расположены в оперативной памяти. Системные процессы не имеют соответствующих им программ в виде исполняемых файлов и запускаются особым образом при инициализации ядра системы. Выполняемые инструкции и данные этих процессов находятся в ядре системы, таким образом, они могут вызывать функции и обращаться к данным, недоступным для остальных процессов. К системным процессам можно отнести и процесс начальной инициализации, init, являющийся прародителем всех остальных процессов. Хотя init не является частью ядра, и его запуск происходит из выполняемого файла, его работа жизненно важна для функционирования всей системы в целом. 16 Демоны (Daemon – сокращение от Disk and execution monitor – отслеживание дисковых операций и выполнения программ) – это не интерактивные процессы, которые запускаются обычным образом - путем загрузки в память соответствующих им программ, и выполняются в фоновом режиме. Обычно демоны запускаются при инициализации системы, но после инициализации ядра и обеспечивают работу различных подсистем Linux: системы терминального доступа, системы печати, сетевых служб и т.д. Демоны не связаны ни с одним пользователем. Аналогичные функции в ОС Windows выполняют службы. Большую часть времени демоны ожидают, пока тот или иной процесс запросит определенную услугу. К прикладным процессам относятся все остальные процессы, выполняющиеся в системе. Как правило, это процессы, порожденные в рамках пользовательского сеанса работы. Важнейшим пользовательским процессом является начальный командный интерпретатор, который обеспечивает выполнение команд пользователя в системе Linux. Пользовательские процессы могут выполняться как в интерактивном (приоритетном), так и в фоновом режимах. Интерактивные процессы монопольно владеют терминалом, и пока такой процесс не завершит свое выполнение, пользователь не имеет доступа к командной строке. Атрибуты процесса Процесс в Linux имеет ряд атрибутов, позволяющих операционной системе управлять его работой. Идентификатор процесса (PID) Каждый процесс имеет уникальный идентификатор PID, позволяющий ядру системы различать процессы. Когда создается новый процесс, ядро присваивает ему следующий свободный (т.е. не ассоциированный ни с каким процессом) идентификатор. Присвоение идентификатора обычно происходит по возрастающий, т.е. идентификатор нового процесса больше, чем идентификатор процесса, созданного перед ним. Если идентификатор достигает максимального значения (обычно - 65737), следующий процесс получит минимальный свободный PID и цикл повторяется. Когда процесс завершает работу, ядро освобождает использовавшийся им идентификатор. Идентификатор родительского процесса (PPID) Идентификатор процесса, породившего данный процесс. Все процессы в системе, кроме системных процессов и процесса init, являющегося прародителем остальных процессов, порождены одним из существующих или существовавших ранее процессов. Поправка приоритета (NI) Относительный приоритет процесса, учитываемый планировщиком при определении очередности запуска. Фактическое же распределение процессорных ресурсов определяется приоритетом выполнения (атрибут PRI), зависящим от нескольких факторов, в частности от заданного относительного приоритета. Относительный приоритет не изменяется системой на всем протяжении жизни процесса (хотя может быть изменен пользователем или администратором) в отличие от приоритета выполнения, динамически изменяемого планировщиком. Терминальная линия (TTY) Терминал или псевдотерминал, связанный с процессом. С этим терминалом по умолчанию связаны стандартные потоки: входной, выходной и поток сообщений об ошибках. Потоки (программные каналы) являются стандартным средством межпроцессного взаимодействия в ОС Linux. Процессы-демоны не связаны с терминалом. Реальный (UID) и эффективный (EUID) идентификаторы пользователя Реальным идентификатором пользователя данного процесса является идентификатор пользователя, запустившего процесс. Эффективный идентификатор служит для определения прав доступа процесса к системным ресурсам (в первую очередь к ресурсам файловой 17 системы). Обычно реальный и эффективный идентификаторы совпадают, т.е. процесс имеет в системе те же права, что и пользователь, запустивший его. Однако существует возможность задать процессу более широкие права, чем права пользователя, путем установки бита SUID, когда эффективному идентификатору присваивается значение идентификатора владельца выполняемого файла (например, пользователя root). Реальный (GID) и эффективный (EGID) идентификаторы группы Реальный идентификатор группы равен идентификатору основной или текущей группы пользователя, запустившего процесс. Эффективный идентификатор служит для определения прав доступа к системным ресурсам от имени группы. Обычно эффективный идентификатор группы совпадает с реальным. Но если для выполняемого файла установлен бит SGID, такой файл выполняется с эффективным идентификатором группы-владельца. Жизненный цикл процесса в Linux и основные системные вызовы Жизненный цикл процесса в ОС Linux может быть разбит на несколько состояний. Переход из одного состояния в другое происходит в зависимости от наступления определенных событий в системе. Возможны следующие состояния процесса: 1. Процесс выполняется в пользовательском режиме. При этом процессором выполняются прикладные инструкции данного процесса. 2. Процесс выполняется в режиме ядра. При этом процессом выполняются системные инструкции ядра от имени процесса. 3. Процесс не выполняется, но готов к запуску, как только планировщик выберет его (состояние runnable). Процесс находиться в очереди на выполнение и обладает всеми необходимыми ему ресурсами, кроме процессора. 4. Процесс находиться в состоянии сна (asleep), ожидая недоступного в данный момент ресурса, например завершения операции ввода-вывода. 5. Процесс возвращается из режима ядра в режим задачи, но ядро прерывает его и производит переключение контекста для запуска более приоритетного процесса. 6. Процесс только что создан системным вызовом fork и находится в переходном состоянии: он существует, но не готов к запуску и не находиться в состоянии сна. 7. Процесс выполнил системный вызов exit и перешел в состояние зомби (zombie, defunct). Как такового процесса не существует, но остаются записи, содержащие код возврата и временную статистику его выполнения, доступную для родительского процесса. Это состояние является конечным в жизненном цикле процесса. Процесс начинает свой жизненный путь с состояния 6, когда родительский процесс выполняет системный вызов fork. После того как создание процесса полностью завершено, процесс завершает "дочернюю часть" вызова fork и переходит в состояние готовности к запуску, ожидая своей очереди на выполнение. Когда планировщик выбирает процесс для выполнения, он переходит в состояние 1 и выполняется в пользовательском режиме. Выполнение в пользовательском режиме завершается в результате системного вызова или прерывания, и процесс переходит в режим ядра, в котором выполняется код системного вызова или прерывания. После этого процесс опять может вернуться в пользовательский режим. Однако во время выполнения системного вызова процесса в режиме ядра процессу может понадобиться недоступный в данный момент ресурс. Для ожидания доступа к такому ресурсу, процесс делает системный вызов sleep и переходит в состояние сна. При этом процесс добровольно освобождает вычислительные ресурсы, которые предоставляются следующему наиболее приоритетному процессу. Когда ресурс становиться доступным, ядро "пробуждает процесс", используя вызов wakeup, помещает его в очередь на выполнение, и процесс переходит в состояние 3 готовности к запуску. При предоставлении процессу вычислительных ресурсов происходит переключение контекста, в результате которого сохраняется образ, или контекст, текущего процесса, и управление передается новому. Переключение контекста может произойти, например, если 18 процесс перешел в состояние сна, или если в состоянии готовности к запуску находится процесс с более высоким приоритетом, чем текущий. В последнем случае ядро не может немедленно прервать текущий процесс и произвести переключение контекста. Дело в том, что переключение контекста при выполнении в режиме ядра может произвести к нарушению целостности самой системы. Поэтому переключение контекста откладывается до момента перехода процесса из режима ядра в пользовательский режим, когда все системные операции завершены, и структуры данных ядра находятся в нормальном состоянии. Таким образом, после того как планировщик выбрал процесс на запуск, последний начинает свое выполнение в режиме ядра, где завершает переключение контекста. Далее состояние процесса зависит от предыстории. Наконец, процесс выполняет системный вызов exit и заканчивает свое выполнение. Процесс может быть также завершен вследствие получения сигнала. В обоих случаях ядро освобождает ресурсы, принадлежащие процессу, за исключением кода возврата и статистики его выполнения, и переводит процесс в состояние зомби. В этом состоянии процесс находится до тех пор, пока родительский процесс не выполнит системный вызов wait, после чего вся информация о процессе будет уничтожена, а родитель получит код возврата завершившегося процесса. Контекст процесса Каждый процесс Linux имеет контекст, под которым понимается вся информация, требуемая для описания процесса. Эта информация сохраняется, когда выполнение процесса приостанавливается, и восстанавливается, когда планировщик предоставляет процессу вычислительные ресурсы. Контекст процесса состоит из нескольких частей: Адресное пространство процесса в пользовательском режиме Сюда входят код, данные и стек процесса, а также другие области, например, разделяемая память или код и данные динамических библиотек. • Управляющая информация Ядро использует две основные структуры для управления процессом - proc и user. Сюда же входят данные, необходимые для отображения виртуального адресного пространства процесса в физическую память. • Среда процесса Переменные среды процесса, значения которых задаются в командном интерпретаторе или в самом процессе с помощью системных вызовов, а также наследуются порожденным процессом от родительского и обычно хранятся в нижней части стека. Среду процесса можно получать или изменять с помощью функций. • Аппаратный контекст Сюда входят значения общих и ряда системных регистров процессора, в частности, указатель текущей инструкции и указатель стека. Переключение между процессами, необходимое для распределения вычислительного ресурса, по существу, выражается в переключении контекста, когда контекст выполнявшегося процесса запоминается, а восстанавливается контекст процесса, выбранного планировщиком. Переключение процесса является достаточно ресурсоемкой операцией. Помимо сохранения состояния регистров процесса, ядро вынуждено выполнить множество других действий. Контекст переключается в четырех случаях: • 1. Текущий процесс переходит в состояние сна, ожидая недоступного ресурса. 2. Текущий процесс завершает свое выполнение. 3. Если после пересчета приоритетов в очереди на выполнение есть более высокоприоритетный процесс. 4. Происходит пробуждение более высокоприоритетного процесса. Первые два случая соответствуют добровольному переключению контекста и действия ядра при этом достаточно просты. Ядро вызывает процедуру переключения контекста из функций 19 sleep или exit. Третий и четвертый случаи переключения контекста происходят не по воле процесса, который в это время выполняется в режиме ядра и поэтому не может быть немедленно приостановлен. В этой ситуации ядро устанавливает специальный флаг runrun, который указывает, что в очереди находится более высокоприоритетный процесс, требующий предоставления вычислительных ресурсов. Перед переходом процесса из режима ядра в режим задачи ядро проверяет этот флаг и, если он установлен, вызывает функцию переключения контекста. Приоритеты процессов Планирование процессов основано на приоритете процесса. Планировщик всегда выбирает процесс с наивысшим приоритетом. Приоритет процесса не является фиксированным и динамически изменяется системой в зависимости от использования вычислительных ресурсов, времени ожидания запуска и текущего состояния процесса. Если процесс готов к запуску и имеет наивысший приоритет, планировщик приостановит выполнение текущего процесса (с более низким приоритетом), даже если последний не "выработал" свой временной квант. Ядро Linux является непрерываемым (nonpreemptive). Это означает, что процесс, находящийся в режиме ядра (в результате системного вызова или прерывания) и выполняющий системные инструкции, не может быть прерван системой, а вычислительные ресурсы переданы другому высокоприоритетному процессу. В этом состоянии выполняющийся процесс не может освободить процессор "по собственному желанию", в результате недоступности какого-либо ресурса перейдя в состояние сна. В противном случае система может прервать выполнение процесса только при переходе из режима ядра в пользовательский режим. Такой подход значительно упрощает решение задач синхронизации и поддержки целостности структур данных ядра. Каждый процесс имеет два атрибута приоритета: текущий приоритет, на основании которого происходит планирование, и относительный приоритет, называемый также поправкой приоритета - nice number, который задается при порождении процесса и влияет на текущий приоритет. Диапазон значений текущего приоритета различен, в зависимости от версии ОС Linux и используемого планировщика. В любом случае, процессы, выполняющиеся в пользовательском режиме, имеют более низкий приоритет, чем работающие в режиме ядра. Создание процесса Новый процесс создается в только путем системного вызова fork. Процесс, сделавший вызов fork, называется родительским, а вновь созданный процесс - порожденным. Новый процесс является точной копией родительского. При порождении (разветвлении) процесса проверяется, достаточно ли памяти и места в таблице процессов для данного процесса. Если да, то образ текущего процесса копируется в новый образ процесса, и в таблице процессов возникает новый элемент. Новому процессу присваивается новый уникальный идентификатор (PID). Когда изменение таблицы процессов ядра завершается, процесс добавляется к списку процессов, доступных для выполнения и ожидающих в очереди планировщика подобно другим процессам. Порожденный процесс наследует от родительского процесса следующие основные характеристики: 1. 2. 3. 4. 5. 6. 7. 8. Способы обработки сигналов (адреса функций обработки сигналов). Реальные и эффективные идентификаторы пользователя и группы. Значение поправки приоритета. Все присоединенные разделяемые сегменты памяти. Идентификатор группы процессов. Терминальную линию. Текущий каталог. Корневой каталог. 20 9. Маска создания файлов (umask). 10. Ограничения ресурсов (ulimit). Порожденный процесс отличается от родительского процесса следующими основными характеристиками: 1. Порожденный процесс имеет свой уникальный идентификатор. 2. Порожденный процесс имеет свои собственные копии дескрипторов файлов (в частности, стандартных потоков), открытых родительским процессом. Каждый дескриптор файла порожденного процесса имеет первоначально такое же значение текущей позиции в файле, что и соответствующий родительский. 3. У порожденного процесса обнуляются счетчики времени, потраченного системой для его обслуживания. Системный вызов fork завершается неудачей и новый процесс не порождается, если: • • • Создать процесс запрещает системное ограничение на общее количество процессов. Создать процесс запрещает системное ограничение на количество процессов у одного пользователя. Общее количество системной памяти, предоставленной для физического вводавывода, временно оказалось недостаточным. Сон и пробуждение Процесс обычно переводится в состояние сна при обработке системной функции. Если для завершения обработки запроса требуется недоступный ресурс, процесс снимается с процессора и переводится в состояние сна. Состояние сна - это логическое состояние процесса, при этом он не перемещается физически в памяти. Переход в состояние сна, в первую очередь, определяется занесением в системную таблицу процессов соответствующего флага состояния и события, пробуждающего процесс. События информируют о доступности того или иного ресурса. Как правило, события связаны с работой периферийных устройств. Наступление одного и того же события может ожидать несколько процессов. Поскольку переход из состояния в состояние акт скорее логический, то и пробуждаются все процессы ожидающие данное событие. Это приводит к смене состояния со «сна» на «готов к выполнению», и соответствующие процессы помещаются в очередь на запуск. Задачу выбора процесса для запуска решает планировщик. Поскольку планировщик принимает решение о запуске процесса, основываясь на приоритетах, единственным способом установить «справедливый» порядок запуска процессов является присвоение определенного приоритета каждому событию. Завершение выполнения процесса Процесс завершает работу при выполнении системного вызова exit. Процесс может сам завершить свою работу, в соответствии с алгоритмом, либо может быть прекращен ядром. При завершении процесса последовательно выполняются следующие действия: 1. Отключаются все сигналы. 2. В вызвавшем процессе закрываются все дескрипторы открытых файлов. 3. Если родительский процесс находится в состоянии вызова wait, то системный вызов wait завершается, выдавая родительскому процессу в качестве результата идентификатор завершившегося процесса, и младшие 8 бит его кода завершения. 4. Если родительский процесс не находится в состоянии вызова wait, то завершающийся процесс переходит в состояние зомби. У всех существующих потомков завершенных процессов, а также у зомби-процессов идентификатор родительского процесса устанавливается равным 1. Таким образом, они становятся потомками процесса инициализации (init). 21 Если идентификатор процесса, терминальная линия и идентификатор группы процессов у завершающегося процесса совпадают, то всем процессам с тем же идентификатором группы процессов посылается сигнал HUP. Тем самым, завершаются и все порожденные в приоритетном режиме процессы. Родительскому процессу посылается сигнал CHLD (завершение порожденного процесса). Этот сигнал пробуждает родительский процесс, если тот ожидает завершения порожденных процессов. Получение информации о процессах Для получения информации о состоянии процессов используется команда ps. Она имеет следующий синтаксис: ps [-acdelfjLP] [-t список_терминалов] [-p список_идентификаторов_процессов] [-u|U список_идентификаторов_пользователей] [-g список_идентификаторов_лидеров_групп] [-G список_числовых_идентификаторов_групп] Основные опции команды ps описаны в табл. 3. Опция -a -d -e -l -f -g список -G список -p список -t список -U список -u список Таблица 3. Назначение Предоставляет информацию обо всех процессах, кроме групповых, и не связанных с терминалом. Предоставляет информацию обо всех процессах, исключая лидеров сеанса. Предоставляет информацию обо всех процессах. Генерирует длинный листинг. Генерирует полный листинг. Выводит информацию только о процессах, для которых указаны идентификаторы лидеров групп. Лидер группы - это процесс, номер которого идентичен его идентификатору группы. Командный интерпретатор, запускаемый при входе в систему, является стандартным примером лидера группы. Предоставляет информацию обо всех процессах, имеющих отношение к указанным номерам групп. Предоставляет информацию по процессам с указанными идентификаторами. Предоставляет информацию по процессам, имеющим отношение к указанным терминалам. Предоставляет информацию обо всех процессах, имеющих отношение к указанным идентификаторам пользователей. Предоставляет информацию обо всех процессах, имеющих отношение к указанным именам пользователей. Основные поля в результатах выполнения команды ps представлены в табл. 4. Заголовок ADDR С COMD F Таблица 4. Значение Адрес процесса в памяти. Доля выделенного планировщиком времени ЦП. Имя команды и аргументы (для опции -f). Флаги (шестнадцатеричные), логическая сумма которых дает следующие сведения о процессе: 00 - процесс терминирован; элемент таблицы процессов свободен; 01 - системный процесс: всегда в основной памяти; 02 - процесс трассируется родительским процессом; 22 NI PID PPID PRI S STIME SZ TIME TTY UID WCHAN 04 - родительский трассировочный сигнал остановил процесс; родительский процесс ждет [см. ptrace(2)]; 08 - процесс не может быть разбужен сигналом; 10 - процесс в основной памяти; 20 - процесс в основной памяти; блокирован до завершения события; 40 - идет сигнал к удаленной системе; 80 - процесс в очереди на ввод-вывод. Поправка приоритета. Идентификатор процесса. Идентификатор родительского процесса. Текущий приоритет процесса. Состояние процесса: B,W - процесс находиться в состоянии ожидания; I - создание процесса; O - процесс выполняется; R - находиться в очереди готовых к выполнению процессов; S - процесс не активен; T - процесс трассируется; X - ожидает дополнительной оперативной памяти; Z - процесс "зомби". Время запуска процесса. Размер (в блоках по 512 байт) образа процесса в памяти. Общее время выполнения для процесса Терминальная линия процесса Идентификатор пользователя владельца процесса Адрес события, которого ожидает процесс. У активного процесса этот столбец - пустой. Сигналы: посылка и обработка Сигналы обеспечивают механизм вызова определенной процедуры при наступлении некоторого события (аналогично прерываниям). Каждое событие имеет свой числовой идентификатор (обычно в диапазоне от 1 до 36) и соответствующую символьную константу имя. При работе с сигналами необходимо различать две фазы: 1. Генерация или посылка сигнала. 2. Доставка и обработка сигнала. Сигнал отправляется, когда происходит определенное событие, о наступлении которого должен быть уведомлен процесс. Сигнал считается доставленным, когда процесс, которому был отправлен сигнал, получает его и выполняет его обработку. В промежутке между этими двумя событиями сигнал ожидает доставки. Сигнал может посылаться одним процессом другому (с помощью соответствующего системного вызова ) и будет доставлен, если оба процесса - одного пользователя или сигнал послан от имени пользователя root. Сигналы посылаются также ядром. Ядро генерирует и посылает процессу сигнал в ответ на ряд событий, которые могут быть вызваны самим процессом, другим процессом, прерыванием или каким либо внешним событием. Основные причины отправки сигнала: • Исключительные ситуации Выполнение процесса вызывает исключительну ситуацию, например, деление на 0. • Терминальные прерывания Нажатие клавиш терминала, например, <Del>, <Ctrl+C>, <Ctrl+\>, вызывает посылку сигнала текущему процессу, связанному с терминалом. 23 • • • • • Другие процессы Процесс может посылать сигнал другому процессу или группе процессов с помощью системного вызова kill. В этом случае сигналы являются элементарной формой межпроцессного взаимодействия. Управление заданиями Командные интерпретаторы, поддерживающие средства управления заданиями, используют сигналы для манипулирования фоновыми и текущими процессами. Когда процесс, выполняющийся в фоновом режиме, делает попытку чтения или записи на терминал, ему посылается сигнал останова. Когда порожденный процесс завершает свою работу, родительский процесс уведомляется об этом также с помощью сигнала. Квоты Когда процесс превышает выделенную ему квоту вычислительных ресурсов или ресурсов файловой системы, ему посылается соответствующий сигнал. Уведомления Процесс может запросить уведомление о наступлении тех или иных событий, например, готовности устройства и т.д. Такое уведомление посылается процессу в виде сигнала. Будильники Если процесс установил таймер, ему будет послан сигнал, когда значение таймера станет равным 0. Основные сигналы Информация о некоторых сигналах представлена в табл. 5. Полный список сигналов можно получить по команде kill - l. Таблица 5. Имя/номер Стандартная сигнала обработка Завершение процесса HUP 1 ILL 4 . Завершение процесса и сброс образа памяти TRAP 5 Завершение процесса и сброс образа памяти FPE 8 Завершение процесса и сброс образа памяти KILL 9 BUS 10 Завершение процесса Завершение процесса и сброс образа памяти PIPE 13 Завершение процесса ALRM 14 Завершение процесса Значение Отключился терминал (или закрыто терминальное окно). Сигнал посылается всем не фоновым процессам, связанным с соответствующей терминальной линией На центральный процессор была послана запрещенная инструкция. Это могло быть следствием недопустимого перехода в машинном коде программы, например, попытки выполнить строку данных Была установлена ловушка точки прерывания процесса. Этим управляет системный вызов ptrace, который полезен для отладки. Была попытка выполнить запрещенную арифметическую операцию, например, взятие логарифма отрицательного числа или деление на 0. Не перехватываемый сигнал, позволяющий завершить любой процесс. Ошибка на шине ввода-вывода. Обычно это является результатом попытки выполнить чтение или запись вне границ памяти программы. Программа попыталась выполнить чтение или запись в программный канал, другой конец которого уже завершил работу. Этот сигнал помогает завершить работу конвейера, когда одна из его команд дала сбой. Программист может установить будильник, чтобы позволить вам в определенный момент времени выполнить какое-нибудь действие. 24 TERM 15 TSTP 24 Завершение процесса CONT 25 Игнорируется Остановка процесса Стандартный сигнал, посылаемый для остановки процесса. Это запрос от терминала на остановку процесса. Посылка этого сигнала процессу происходит при нажатии комбинации клавиш Ctrl-Z. Этот сигнал указывает процессу на возобновление его работы. Процессу посылается либо команда fg, либо bg, а командный интерпретатор выполняет внутренний системный вызов wait для привилегированного процесса, либо не выполняет его для фонового процесса. Посылка сигналов Для посылки сигналов из командного интерпретатора используется команда kill. Она имеет следующий синтаксис: kill [ -s сигнал ] pid ... Эта команда посылает указанный сигнал (по умолчанию - TERM) всем процессам с указанными идентификаторами. 25 Контрольные вопросы 1. Что такое процесс. 2. Назовите типы процессов в ОС Linux. 3. Какой командой можно вывести список выполняющихся процессов. 4. Опишите жизненный цикл процесса. 5. Какие атрибуты имеет процесс. 6. Поясните назначение атрибута процесса «поправка приоритета». 7. Как можно обратиться к выполняющемуся в системе процессу. 8. Зачем нужны сигналы, какие виды сигналов вы знаете. 9. Какая команда используется для отправки сигналов процессам. Какой сигнал по умолчанию посылает эта команда. 10. Какие функции выполняет системный вызов fork. 11. В каких случаях, кроме использования специальной команды, генерируются сигналы. 12. Какие функции в системе выполняет процесс init. 13. Что такое контекст процесса. Выполнение работы 1. Вывести список всех выполняющихся в системе процессов. Проанализировать разницу между выводом по умолчанию и выводом в длинном листинге. Зафиксировать идентификаторы всех выполняющихся процессов. Отдельно определить идентификаторы пользовательских процессов. 2. Запустить любой новый процесс в системе. Вновь вывести список процессов. Какой идентификатор получил новый процесс? 3. Командой kill отправить вновь созданному процессу стандартный сигнал завершения. Вновь вывести список процессов, убедится в отсутствии ранее запущенного процесса. 4. Запустить программу OpenOffice.org Writer. Вывести список процессов и определить с каким процессом (процессами) связана запущенная программа. Отправить командой kill процессу, связанному с программой сигнал остановки. Проверить реакцию программы на результат выполнения команды. 26 Занятие №3 Сетевые команды и утилиты Linux Продолжительность- 2 часа Максимальный рейтинг- 10 баллов Цель работы Изучить сетевые команды и утилиты. Научится определять конфигурационные параметры сетевого интерфейса, выполнять проверку канала связи до удаленного компьютера, передачу и прием файлов с удаленного компьютера, маршрут прохождения сетевых пакетов. Основные сетевые команды Сегодня практически нет компьютеров, которые не подключаются к компьютерным сетям. Поэтому поддержка сети включена во все современные операционные системы. ОС Linux имела такую поддержку всегда, она может работать (и часто используется) также в качестве серверной операционной системы благодаря встроенным или подключаемым программным средствам. Описываемые ниже команды позволяют получить информацию о сетевых параметрах компьютера, запущенных сетевых сервисах, проверить сетевое соединение, выполнить подключение к удаленной машине, передачу и прием информации с удаленного сетевого компьютера и т.п. Традиционно команды запускаются из командной строки в окне терминала. В большинство современных версий ОС Linux включены графические программы-конфигураторы, позволяющие пошагово настраивать всю сетевую систему. Однако, зачастую такая программа не позволяет проводить тонкую настройку параметров устройств. Поэтому традиционный способ настройки – с помощью редактирования конфигурационных файлов и выполнения соответствующих команд остается актуальным и сегодня. Введенная в окно терминала команда будет выполнена только в том случае, если исполнимый файл находится в текущем каталоге или в каталогах, содержащихся в системной переменной PATH. В противном случае будет выдано сообщение о том, что командный процессор не находит команду, например: bash: ifconfig: command not found Для каждого пользователя в ОС Linux создается отдельный профиль, хранящий конфигурационные настройки командного интерпретатора, в том числе и значение переменной PATH. По умолчанию эта переменная содержит путь к домашнему каталогу пользователя, каталогу исполнимых файлов /bin и Команда ifconfig Эта команда позволяет настроить сетевой интерфейс (сетевую карту), задать определенный IP-адрес и маску подсети, адрес сервера имен и др. Все эти действия должны выполняться только администратором компьютера. Для обычного пользователя доступным остается, как правило, только просмотр текущих настроек конфигурации. Первый сетевой интерфейс Ethernet обозначается в ОС Linux – eth0, ethl – вторая сетевая плата и т.д. Интерфейс петли обратной связи (Local Loopback) обозначается lo. Утилита ftp Программная утилита, запускаемая в командной строке представляет собой встроенный в систему клиент для обмена файлами с удаленной машиной по сети. Она позволяет просматривать каталоги, создавать каталоги на удаленной машине, загружать и выгружать файлы с помощью стандартного набора команд. Допускает автоматизацию операций по обмену файлами. Количество команд, доступных при запуске этой утилиты достаточно велико. Просмотреть их полный список можно с помощью команды help. Основными являются следующие команды: 27 Open – команда открытия сетевого соединения по протоколу FTP. Например: ftp>open ie.tusur.ru Команда открытия соединения выполняется и при запуске утилиты с одновременным указанием адреса сетевого компьютера: ftp ie.tusur.ru Многие ftp-серверы разрешают анонимное подключение любого пользователя с ограниченными доступом к ресурсам сервера. В качестве логина все анонимные пользователи используют логин anonymous, а вместо пароля вводят адре электронной почты. Если анонимное подключение к серверу разрешено, то в результате выполнения команды в окне терминала отобразится примерно такой набор сообщений: Connected to ie.tusur.ru. 220 iq-mcp FTP server (Version wu-2.4(3) Thu Jun 12 14:38:11 EST 1997) ready. Name (ie.tusur.ru:bball): anonymous 331 Guest login ok, send your complete e-mail address as password. Password: 230 Guest login ok, access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. Если анонимное подключение запрещено, то необходимо ввести (при их наличии) выданные администратором удаленного ftp-сервера логин и пароль. ls – команда, так же как ее аналог в командном интерпретаторе, выводит список содержимого текущего каталога, только это корневой каталог ftp-сервера. Вывод всегда выполняется с указанием прав доступа. Среди каталогов на ftp-сервере, как правило, существуют каталоги /incoming и /pub. В каталоге /incoming анонимному пользователю обычно доступна запись новых файлов и каталогов, а в каталоге /pub разрешено чтение. cd – команда перехода в другой каталог. В качестве параметра команде должно быть передано имя каталога: ftp>cd pub get – команда получения файла с ftp-сервера. В качестве параметра команде передается имя требуемого файла. put – команда передачи файла на ftp-сервер. close – команда закрытия текущего ftp-соединения. exit – команда закрытия текущего ftp-соединения и завершения работы ftp-клиента. bye – синоним команды exit. Команда netstat Выдает разнообразную статистику о работе сети, содержимое таблиц маршрутизации и т.д. Команда ping Посылает специальный пакет ICMP, требующий ответа от удаленного сервера. Позволяет проверить доступность удаленного хоста и скорость работы сети. Обычно доступна только пользователю root. 28 Команда rlogin Программа удаленной регистрации. Позволяет работать с удаленной машиной так же, как с локальной. Поддерживает доверительные отношения. Команда rsh Удаленный командный интерпретатор. Позволяет выполнить любую команду интерпретатора на удаленной машине и получить ее выходной поток на локальной. Поддерживает доверительные отношения. Команда ssh Защищенный командный интерпретатор, функционально аналогичный программам telnet, rsh и rlogin, но передающий пароли и данные в зашифрованном виде. Команда telnet Программа удаленного подключения к указанной сетевой службе. Обычно используется для удаленной регистрации. Не поддерживает доверительные отношения. Команда traceroute Программа трассировки пакетов. Показывает маршрут, по которому будут направляться пакеты на указанный удаленных хост и скорость передачи на каждом из переходов. Обычно доступна только пользователю root. Контрольные вопросы 1. Какие операции можно выполнить с помощью утилиты ftp. 2. Каково назначение программы telnet, обеспечивает ли эта программа защищенное подключение. 3. С помощью какой команды можно определить маршрут прохождения пакетов. 4. Может ли обычный пользователь настроить сетевой интерфейс и с помощью какой команды он должен это сделать. 5. Поясните назначение команды Bye. Выполнение работы 1. Выполнить подключение к удаленному ftp-серверу. 2. Получить список файлов в директории /pub. 3. Скачать на свой компьютер небольшой (текстовый) файл. 4. Просмотреть этот файл любой программой – текстовым редактором. Занятие №4 Создание простых командных файлов (сценариев) Продолжительность- 2 часа Максимальный рейтинг- 10 баллов Цель работы Освоить правила создания и структуру командных файлов как простых, так и более сложных. Запомнить назначение специальных символов в командных файлах. Команды, конвейеры, списки Командные строки имеют определенную структуру. Простая команда - это последовательность слов через пробел. Нажатие клавиши Enter при вводе команды или перевод строки при обработке сценария являются для командного интерпретатора признаком завершения команды. Она обрабатывается и выполняется. Из простых команд строятся более сложные конструкции: конвейеры и списки. Конвейер - это последовательность из одной или более команд, разделенных символом |. Стандартный выходной поток каждой команды, кроме последней, соединяется при помощи программного канала со стандартным входным потоком следующей команды. 29 Каждая команда выполняется как отдельный процесс; интерпретатор ожидает окончания последней команды. Список - это последовательность одного или более конвейеров, разделенных символами: ;, &, && или || и, возможно, заканчивающаяся ; или &. Из этих четырех символов, ; и & имеют равный приоритет, который ниже, чем у && и || (эти символы тоже имеют равный приоритет). Точка с запятой (;) вызывает последовательное выполнение предшествующего конвейера (т.е. командный интерпретатор ожидает окончания конвейера перед выполнением любых команд, следующих за точкой с запятой). Амперсанд (&) вызывает асинхронное выполнение предшествующего конвейера (т.е. командный интерпретатор не ожидает окончания работы конвейера). Символ && (||) ведет к тому, что следующий за ним список выполняется только в том случае, когда предыдущий конвейер вернул нулевой (ненулевой) статус выхода. В список может входить произвольное количество переводов строк и точек с запятой, разделяющих команды. Метасимволы командного интерпретатора Ряд символов, как было описано выше, имеют для командного интерпретатора специальное значение - это метасимволы. Они описаны в табл. 6. Метасимволы не входят в команды и обрабатываются в несколько проходов до начала выполнения реальных программ. Таблица 6. Метасимвол > >> < | <<str * ? [abc] ; & `...` (...) $1,$2,...$9 $var ${var} \ '...' Интерпретация prog>file - переключить стандартный выходной поток в файл prog>>file - добавить стандартный выходной поток к файлу prog<file - извлечь стандартный входной поток из файла p1 | p2 - передать стандартный выходной поток p1 как стандартный входной поток p2 "Документ здесь": стандартный входной поток задается в последующих строках до строки, состоящей только из символов str. По умолчанию в данных интерпретируются метасимволы \, $ и ``. Если необходимо предотвратить в данных интерпретацию всех метасимволов, необходимо экранировать строку str, предварив обратной косой или взяв в двойные или одиночные кавычки. Задает в имени файла любую строку из нуля или более символов Задает любой символ в имени файла Задает любой символ из [abc] в имени файла, при этом допускаются диапазоны, задаваемые при помощи дефиса -. Если первым символом после [ является !, с этой конструкцией сопоставляется любой символ, не входящий в квадратные скобки. Разделитель команд: p1; p2 - выполнить p1, затем p2. Выполняет предшествующую команду в фоновом режиме Инициирует выполнение команд(ы) в ...; `...` заменяется на полученный в результате выполнения стандартный выходной поток Инициирует выполнение команд(ы) ... в порожденном командном интерпретаторе Заменяются аргументами командного файла Значение переменной (ключевого параметра) var в сеансе Значение var: исключает коллизии в случае конкатенации переменной с последующим текстом \c - использовать непосредственно символ c, \перевод строки отбрасывается Непосредственное использование того, что в кавычках 30 # var=value p1&&p2 Непосредственное использование, но после того, как будут интерпретированы метасимволы $, `...` и \ Начало комментария Присваивает значение value переменной var Выполнить p1; в случае успеха выполнить p2 p1||p2 Выполнить p1; в случае неудачи выполнить p2 "..." Перед выполнением команды каждое слово-аргумент команды просматривается в поисках метасимволов *, ? и [. Если в слове есть один из этих символов, слово рассматривается как шаблон. Такое слово заменяется отсортированными в алфавитном порядке именами файлов, соответствующих шаблону. Если ни одно их имен файлов не соответствует шаблону, слово оставляется без изменений. Символ . в начале имени файла или сразу после /, а также сам символ /, должны сопоставляться явно. При таком количестве метасимволов интерпретатора необходимо иметь возможность экранировать специальный символ от интерпретации. Для этого можно использовать апострофы, кавычки или обратный слэш. При этом кавычки одного вида могут экранировать кавычки другого вида. Обратите внимание, что кавычки "", в отличие от апострофов, не экранируют строку полностью - интерпретатор заглядывает внутрь кавычек в поисках $, `...` и \. В кавычках могут содержаться переводы строк, пробелы, табуляции, символы ;, &, (, ), |, ^, < и >. Создание сценариев Если необходимо ввести ряд команд в определенной последовательности, причем, возможно, делать это придется многократно, то появляется потребность в автоматизации этих рутинных операций. Вместо введения этой последовательности команд создать специальный командный файл-сценарий, который будет выполнять те же самые команды в заданной последовательности. Запустить этот файл можно как одну «новую» команду. Предположим, что вам как администратору предстоит часто подсчитывать количество пользователей, работающих в настоящий момент в системе, при помощи простого конвейера: $ who | wc -l Здесь команда who выводит строки с указанием зарегистрированных в системе пользователей, а команда wc с ключом –l подсчитывает число выведенных строк, очевидно, совпадающее с числом пользователей. Назовем создаваемый сценарий nu. Все, что нужно сделать – создать текстовый файл с именем nu и записать в него строку с описанным конвейером. Но для того, чтобы файл стал исполняться, как команда, нужно установить для него атрибут «исполнимый». Это можно сделать с помощью команды chmod: $ chmod +x nu а затем вы можете вызывать его посредством $ nu На самом деле, при выполнении команды nu создается новый процесс интерпретатора (порожденный интерпретатор), который и выполняет команды, содержащиеся в nu. Чтобы команда выполнялась в том же интерпретаторе, необходимо поставить перед вызовом команды точку (.). Заметьте, что $ . nu выполняется быстрее, чем простой вызов nu. В большинстве программ надо использовать аргументы - файлы, флаги и т.д. В соответствии с синтаксисом командной строки, это можно 31 сделать, передавая их после имени команды через пробелы. Предположим, мы хотим создать командный файл cx, устанавливающий атрибут «исполнимый» для заданного файла, так что: $ cx nu есть сокращенная запись для $ chmod +x nu Возникает вопрос - как передать командному файлу имя файла-аргумента? Для этого в командном интерпретаторе используются позиционные параметры. При выполнении командного файла, каждое вхождение $1 заменяется первым аргументом, $2 - вторым и так далее до $9. $0 заменяется именем выполняемой команды. Поэтому, если файл cx содержит строку (и сам является исполнимым): chmod +x $1 то при выполнении команды $ cx nu интерпретатор заменит $1 первым аргументом команды nu. А как быть, если нужно работать с несколькими аргументами, например, заставить программу cx делать выполняемыми несколько файлов? Можно включить девять аргументов в командный файл (явно можно задавать только девять аргументов, так как конструкция $10 распознается как «первый аргумент, за которым следует 0»): chmod +x $1 $2 $3 $4 $5 $6 $7 $8 $9 Если пользователь такого командного файла задаст менее девяти аргументов, то оставшиеся окажутся пустыми строками и только настоящие аргументы будут переданы команде chmod. Но такое решение не подходит, если количество аргументов превышает девять. В таких случаях интерпретатор предоставляет специальный параметр $*, который заменяется всеми аргументами команды, независимо от их количества. С учетом этого, универсальный командный файл, устанавливающий атрибут «исполнимый» для любого числа файлов-аргументов должен содержать строку: chmod +x $* Все позиционные и специальные параметры, поддерживаемые командным интерпретатором, представлены в табл. 7. Таблица 7. Параметр Назначение Имя выполняемой команды $0 Заменяются аргументами командного файла $1,$2,...$9 Количество аргументов $# Все аргументы, передаваемые интерпретатору. "$*" является единым $* словом, образованным из всех аргументов, объединенных вместе с пробелами. Аналогично $*. "$@" идентично аргументам: пробелы в аргументах $@ игнорируются, и получается список слов, идентичных исходным аргументам. Флаги, установленные в интерпретаторе. $Значение, возвращенное последней выполненной командой (статус $? выхода). Номер процесса интерпретатора. $$ Номер процесса последней команды, запущенной асинхронно с помощью $! &. 32 Переменные и присваивание Подобно большинству языков программирования, командный интерпретатор поддерживает переменные, которые называют еще ключевыми параметрами (поскольку они предаются по имени - ключу). Переменные можно создавать, изменять и выбирать их значения. Для присваивания значения переменной применяется конструкция: переменная=значение Обратите внимание на отсутствие пробелов до и после знака присваивания. Вспомните, что командный интерпретатор считает пробелы разделителями слов. Если поставить пробел после знака присваивания, то интерпретатор не изменит значения переменной, но будет искать команду с именем значение. Присваиваемое значение должно выражаться одним словом, и его следует взять в кавычки, если оно содержит метасимволы, которые не нужно обрабатывать. Создание (определение) переменной происходит при первом присваивании ей значения. Переменные не нужно явно объявлять до момента их использования. Если переменная не объявлена (не получила значения), при обращении к ней будет получена пустая строка. Все переменные в командном интерпретаторе - строковые, поэтому тип переменной задавать не надо. Некоторые команды интерпретируют строки как числа. Многие переменные, такие как, например, PATH, имеют специальное значение для интерпретатора. По традиции, такие переменные называют встроенными и обозначают прописными буквами, а обычные переменные - строчными. Основные встроенные переменные представлены в табл. 8. Таблица 8. Переменная Значение Начальный каталог пользователя. $HOME Путь для поиска выполняемых команд. $PATH Путь поиска для команды cd. $CDPATH Список символов, разделяющих слова в аргументах $IFS Файл почтового ящика. Командный интерпретатор информирует $MAIL пользователя о получении почты в указанный файл. Эта переменная определяет, как часто (в секундах) интерпретатор будет $MAILCHECK проверять поступление почты в файл, определяемый переменной MAIL. По умолчанию принято значение 600 секунд. При установке в 0, интерпретатор будет проверять почту перед каждой выдачей строкиприглашения. Строка-приглашение, по умолчанию принята '$ ' $PS1 Строка-приглашение при продолжении командной строки, по умолчанию $PS2 принята '> ' Типичным примером использования переменных является хранение в них длинных строк, таких как имена файлов. Команда set, при вызове без параметров показывает значение всех определенных переменных. 33 Контрольные вопросы 1. Что такое конвейер, как создается конвейер. 2. Для чего предназначены сценарии. 3. Перечислите известные вам метасимволы и их значение. 4. Как присвоить значение переменной в командном файле. 5. Как создать исполнимый файл. 6. Почему исполнимый файл, предваряемый точкой выполняется быстрее. 7. Как передать аргументы на вход файла-сценария. Выполнение работы Выполнить задание в соответствии с вариантом № варианта 1 2 3 4 5 6 7 8 9 10 Задание Создать командный файл, подсчитывающий количество выполняемых в системе процессов Создать командный файл, подсчитывающий количество файлов в каталоге /bin Создать командный файл, сохраняющий информацию о значении заданных в системе переменных в текстовый файл SystemVariables.txt Создать командный файл, удаляющий файл, переданный в качестве параметра Создать командный файл, сохраняющий информацию о содержимом каталога /bin в файле BinContained.txt Создать командный файл, сохраняющий информацию количестве символов в слове, переданном в качестве параметра в файле LetterCount.txt Создать командный файл, перемещающий заданный в качестве параметра файл в заданный в качестве параметра каталог Создать командный файл, завершающий процесс с заданным в качестве параметра номером Создать командный файл, сохраняющий информацию о значении конфигурационных параметров сетевого интерфейса в текстовый файл с именем, заданным в качестве параметра Создать командный файл, изменяющий текущий каталог на /user/local 34 Занятие №5 Программирование в командном интерпретаторе Продолжительность- 2 часа Максимальный рейтинг- 10 баллов Цель работы Научиться создавать сложные командные файлы с циклическими операциями, проверкой условый, выполнением вычислений. Создание командных файлов с выполнением циклических действий Цикл for Цикл for имеет следующий синтаксис: for <имя переменной> [in <список слов>] do <команды> done Переменная последовательно получает значение очередного слова из списка, и для этого значения выполняются команды в теле цикла. Цикл завершается, когда пройден весь список слов. По умолчанию в качестве списка слов используются аргументы командной строки. Например: $ for i in 1 2 3 4 5 > do > echo $i > done Операторы цикла while и until Командный интерпретатор поддерживает также традиционные циклы по условию со следующим синтаксисом: while <команды> do <команды> done until <команды> do <команды> done Выполняются команды, задающие условие, и проверяется код возврата последней из них. Если это ноль (истина), выполняются команды в теле цикла while или завершается выполнение цикла until. Если это не ноль (ложь), завершается работа цикла while или выполняется очередная итерация цикла until. Оператор выбора Командный интерпретатор поддерживает выполнение того или иного блока команд в зависимости от значения некоторого слова. Для этого используется оператор case со следующим синтаксисом: case <слово> in <описание варианта> ) <команды> ;; {<описание варианта> ) <команды> ;; } esac Слово (обычно - значение переменной) сравнивается последовательно с шаблонами. Если произошло совпадение, то выполняются команды, соответствующие данному варианту и оператор завершается. Учтите, что шаблон *) сопоставляется с любым словом, и, тем самым, задает вариант по умолчанию. В шаблонах оператора case символы . и /, в отличие от шаблонов имен файлов, не обязательно задавать явно. 35 Условный оператор Командный интерпретатор поддерживает условный оператор следующего общего вида: if <команды> then <команды> {elif <команды> then <команды>} [else <команды>] fi Выполняются команды после if и проверяется код возврата последней из них. Если это 0 (истина) выполняются соответствующие команды после then и выполнение оператора завершается. Если же это не 0 (ложь), то при наличии конструкций elif выполняются последовательно соответствующие команды-условия и, если они возвращают код 0, команды после then, а затем оператор завершается. Если ни одно из условий не было истинным, выполняются команды в части else и оператор завершается. В качестве условия в условном операторе может использоваться любая команда. Однако, имеется стандартная команда для проверки условий в традиционном понимании. Это команда test. Команда test имеет следующий синтаксис: test <выражение> | [ <выражение> ] Выражение строится из примитивов, представленных в табл. 9, при необходимости, с помощью следующих операторов: Унарный оператор отрицания. Бинарный оператор "и". Бинарный оператор "или". Скобки для группировки. Учтите, что скобки распознаются командным интерпретатором, поэтому их надо брать в кавычки. Таблица 9. Примитив Условие файл существует и доступен для чтения -r файл файл существует и доступен для записи -w файл файл существует и является выполняемым -x файл истина, если файл существует и является обычным файлом (не -f файл каталогом) файл существует и является каталогом -d файл файл существует и является символьной связью -h файл файл существует и не пуст -s файл -t [ дескриптор ] истина, если открытый файл с указанным дескриптором (по умолчанию, 1) ассоциирован с терминалом истина, если строка s1 имеет нулевую длину -z s1 истина, если строка s1 имеет ненулевую длину -n s1 истина, если строки s1 и s2 идентичны s1 = s2 истина, если строки s1 и s2 не совпадают s1 != s2 истина, если строка s1 непустая s1 сравнение целых чисел на равенство (=). Можно использовать также и n1 -eq n2 другие сравнения: -ne (!=), -gt (>), -ge (>=), -lt (<) и -le (<=). ! -a -o (<выражение>) Перехват и обработка сигналов В программах командного интерпретатора можно перехватывать и обрабатывать сигналы. Для этого используется команда trap, устанавливающая с момента выполнения обработчик в виде последовательности команд для всех перечисленных сигналов. Эта команда имеет следующий синтаксис: 36 trap <последовательность команд> <список сигналов> Запрос информации у пользователя Командный интерпретатор позволяет, запрашивать у пользователя информацию, которая помещается в указанную переменную. Для этого используется команда read: $ read greeting Hello, world! $ echo $greeting Hello, world! $ На практике имеет смысл перед запросом выдать приглашение с помощью команды echo. Вычисления в командном интерпретаторе Вычисления можно выполнять с помощью любой программы, воспринимающей свои параметры как выражение, значение которого необходимо вычислить, и выдающей результат вычисления в стандартный выходной поток. Однако современные командные интерпретаторы включают встроенную команду для выполнения простейших арифметических действий. Это команда let: let <аргумент> {<аргумент>} Вот как ее можно использовать: $ let a=5 $ echo $a 5 $ let a=a*a+34/2 $ echo $a 42 $ let "a = 7" $ echo $a 7 Обратите внимание, что если вокруг знака равенства идут пробелы, необходимо брать выражение в кавычки. Команда let требует, чтобы выражение было одним словом. Кроме того, для обращения к значению переменной в этой команде не нужно использовать метасимвол $. Команда expr Одной из стандартных программ-калькуляторов является программа expr. Ее основные операторы представлены в табл. 10. Таблица 10. Оператор Результат Возвращает значение первого выражения, если оно не пустое и выр1 \| выр2 не равно 0, иначе, возвращает значение второго выражения. Возвращает значение первого выражения, если оба выражения выр1 \& выр2 не пустые и не равны 0, иначе, возвращает 0. Складывает или вычитает целочисленные аргументы. выр1 { +, - } выр2 Умножает, делит или возвращает остаток от деления для выр1 { \*, /, % } выр2 целочисленных аргументов. Возвращает длину строки. length строка Рассмотрим простой пример вычисления с помощью expr: 37 $ a=5 $ echo $a 5 $ a=`expr $a \* $a + 34 / 2` $ echo $a 42 Обратите внимание, что между элементами выражения надо указывать пробелы. Функции в командном интерпретаторе Стандартным способом разбиения программ на модули в командном интерпретаторе является оформление необходимых действий в виде отдельного выполняемого файла с программой командного интерпретатора - создание новой команды. Тем не менее, для некоторых модулей такой подход может оказаться неэффективным и избыточным, так как модули могут не представлять самостоятельного значения вне программы, в которой они используются. Поэтому в современных версиях командных интерпретаторов предлагается возможность создавать и вызывать функции. Синтаксис определения функции Для определения функций используется ключевое слово function. Функции читаются и хранятся внутренне командным интерпретатором. Функции выполняются как команды, причем аргументы передаются как позиционные параметры. Синтаксис определения функции следующий: function <идентификатор> { <список команд> } | <идентификатор> () { <список команд> } где список команд задает команды, выполняемые в качестве тела функции. Команды обычно разделяются точкой с запятой или переводами строк. Функции выполняются вызвавшим их процессом и используют все его файлы и текущий рабочий каталог. Сигналы, перехватываемые вызывающим процессом, внутри фунции обрабатываются стандартным образом. Сигналы, не перехватываемые или игнорируемые функцией, прекращают ее выполнение и передаются вызвавшей команде. Обычно переменные совместно используются вызывающей программой и функцией. Однако, специальная команда typeset, используемая внутри функции, позволяет определять локальные переменные, область действия которых - текущая функция и все вызываемые ею функции. Для выхода из функции используется специальная команда return. В случае ошибки в функции, управление передается вызывающей команде. Идентификаторы определенных функций можно получить с помощью опций -f или +f специальной команды typeset. Текст функций показывается при использовании опции -f. Определение функции можно отменить с помощью опции -f специальной команды unset. Обычно при выполнении сценария командным интерпретатором никакие функции не заданы. Опция -xf команды typeset позволяет экспортировать функцию для использования сценариями, выполняемыми без отдельного вызова интерпретатора. Функции, которые должны быть определены для всех вызовов интерпретатора, необходимо задавать в файле начального запуска с помощью опций -xf команды typeset. Часто в виде функций оформляется выдача сообщений о параметрах вызова программы. В любом случае, если задача может быть разбита на подзадачи, решение этих подзадач имеет смысл оформлять в виде отдельной команды, если они полезны не только в контексте решаемой задачи, или в виде функции в противном случае. 38 Контрольные вопросы 1. Можно ли в файлах сценария выполнять вычисления. 2. Какие операторы циклов можно использовать в командных сценариях. 3. Поясните как в командном файле применить оператор условия. 4. Можно ли вводить информацию с клавиатуры для обработки командным файлом. 5. Какие действия выполняет команда expr. 6. Поясните назначение команды trap. 7. Как работает команда test, приведите примеры примитивов, которые она воспринимает. Выполнение работы Создать файл сценария содержащий элементы программирования в соответствии с индивидуальным заданием. 39 Занятие №6 Работа со сканером NMAP Продолжительность- 2 часа Максимальный рейтинг- 10 баллов Цель работы Изучить работу с программой-сканером портов NMAP. Общая информация Порт – это идентификатор приложения, работающего на компьютере и использующего сетевые соединения. Как для TCP, так и для UDP-сервисов номера портов лежат в диапазоне от 1 до 65535. Номера портов от 0 до 1023 считаются зарезервированными для общеупотребительных приложений (табл. 11), обычно выполняющихся от имени пользователя root или другого привилегированного пользователя. Соответствующие им номера портов называются общеизвестными. Номера портов с 1024 по 65535 могут использоваться остальными приложениями. Они обычно соответствуют определенным сервисам, но не обязательно. Кроме того, существуют недолговечные номера портов, которые операционная система выбирает случайным образом из номеров, превышающих 1024, (обычно - в верхней части диапазона). Они используются для машин, которые произвольным образом устанавливают соединения с другими машинами. Например, для загрузки web-страницы ваша машина обратится к порту 80 web-сервера. Сервер увидит входящее соединение с некоторым случайным номером порта, превышающим 1024. В таком случае сервер будет знать, что это, вероятно, пользователь, а не другое приложение, устанавливающее с ним соединение. Он также использует недолговечный номер порта для отслеживания определенного пользователя и сеанса. Например, если вы параллельно откроете два навигатора, то ваш компьютер для сеанса каждого из них создаст два разных номера порта для установления соединений, которые сервер будет считать различными. Таблица 11. Номер порта 21 22 23 25 53 79 80 135-139 443 Протокол FTP SSH Telnet SMTP DNS Finger HTTP NetBIOS SSL Сервис Протокол передачи файлов (управляющий порт) Защищенный shell Telnet Почтовый сервис Разрешение доменных имен Finger Web-сервис Сетевые коммуникации Windows Защищенный web-сервис То, что пакет помечен для порта 80, не запрещает ему содержать данные, отличные от webтрафика. Система номеров портов зависит от определенной "честности" машин, с которыми приходится взаимодействовать, и именно отсюда может прийти беда. На самом деле, многие приложения, такие как программы мгновенного обмена сообщениями и одноранговое ПО, которые обычно блокируются межсетевым экраном организации, нарушают эту конвенцию и проскальзывают через порт 80, который согласно конфигурации остается открытым, поскольку пользователям, находящимся позади межсетевого экрана, разрешен web-доступ. Когда порт на компьютере открыт, он получает весь направляемый в него трафик, законный или незаконный. Посылая некорректно сформированные пакеты, пакеты со слишком большим количеством данных или с некорректно отформатированными данными, иногда можно вызвать аварийное завершение основного приложения, перенаправить поток управления в этом приложении и незаконно получить доступ к машине. Такая атака называется переполнением буфера и составляет большой процент современных уязвимостей. 40 Переполнение буфера происходит, если прикладные программисты неаккуратно пишут программы и не обеспечивают должную обработку данных, «переполняющих» области памяти, отведенные входным переменным. Когда в программу поступают входные данные, не умещающиеся в отведенный буфер, они могут изменить внутренний ход выполнения программы и в результате предоставить хакеру доступ к ресурсам системного уровня. Раньше это было технически сложной задачей, за которую могли взяться только самые квалифицированные хакеры. Но теперь, чтобы осуществить подобный взлом, уже не нужно быть высококлассным программистом. Доступны программы, которые с одного щелчка мыши автоматически выполняют переполнение буферов. Почти все программы, независимо от размера, содержат ошибки такого рода. Современное программное обеспечение, насчитывающее миллионы строк исходных текстов, - просто-напросто слишком сложное, чтобы избежать подобных ошибок. Возможно, со временем, когда вырастут новые поколения программистов, обученных автоматически писать безопасный код, данная проблема потеряет свою остроту или исчезнет совсем. Пока же необходимо внимательно следить за тем, какие приложения или порты видны в вашей сети. Эти порты являются потенциальными «окнами» в серверах и рабочих станциях, через которые хакеры могут запускать свой вредоносный код в ваш компьютер. Поскольку именно здесь происходит большинство нарушений безопасности, очень важно понимать, что происходит на этом уровне на ваших серверах и других машинах. Этого можно добиться с помощью программного средства, называемого сканером портов. Сканеры портов последовательно опрашивают порты TCP или UDP и смотрят, не ответит ли приложение. Если ответ получен, это означает, что некоторое приложение слушает порт с данным номером. Имеется 65535 возможных портов TCP и столько же UDP. Сканеры можно сконфигурировать для опроса всех возможных портов или только общеупотребительных (с номерами, меньшими 1024). Веская причина для полного сканирования состоит в том, что сетевые троянские и другие вредоносные программы, чтобы избежать обнаружения, нередко используют нетрадиционные порты с номерами в верхней части диапазона. Кроме того, некоторые производители не следуют стандартам должным образом и подключают серверные приложения к портам с большими номерами. Полное сканирование охватывает все возможные места, где могут скрываться приложения, хотя и требует больше времени. Существует большое число программ-сканеров портов от очень сложных с множеством различных возможностей до имеющих минимальную функциональность. В конце концов, можно вручную выполнить сканирование портов, например, с помощью программы Telnet, проверяя порты по очереди. Просто подключайтесь к IP-адресу, добавляя номер порта, например: telnet 192.168.0.1:80 Номер после двоеточия (для некоторых реализаций Telnet необходимо просто оставить пробел между IP-адресом и номером порта) говорит Telnet, что для соединения надо использовать порт 80 вместо стандартного для Telnet порта 23. Вместо того чтобы получить от Telnet обычное приглашение вы соединитесь с web-сервером, если он запущен на машине. После нажатия клавиши ввода вы получите первый ответ web-сервера навигатору. Вы увидите информацию из заголовка HTTP, которая обычно обрабатывается навигатором и скрыта от пользователя. Так же можно поступить с любым открытым портом, по сути, именно это и делают сканеры портов: они пытаются установить соединение и ожидают ответ. Некоторые сканеры портов пытаются также идентифицировать операционную систему на другом конце, выявляя так называемые идентификационные метки TCP. Хотя TCP/IP является стандартом сетевых коммуникаций, каждый производитель реализует его немного иначе, чем другие. Эти различия, обычно не мешающие взаимодействию, проявляются в ответах на любое воздействие, такое как эхо-тест или попытка установления TCP-соединения. Сравнивая полученный от машины ответ с базой известных 41 идентификационных меток TCP, можно сделать разумное предположение об операционной системе на другом конце. Знание операционной системы и ее версии может послужить хорошей отправной точкой для определения того, какие зацепки и средства проникновения стоит испробовать. Это очень веская причина для регулярного сканирования своей сети, чтобы определить, какие порты в системе оставлены открытыми. Затем следует их просмотреть, закрыть неиспользуемые порты и защитить те, которые должны оставаться открытыми. Планирование сканирования портов При планировании сканирования портов любой сети помните, что эта деятельность создает большую нагрузку на сеть. Сканирование за короткое время десятков тысяч портов порождает в сети интенсивный трафик. Если вы используете для сканирования устаревшей сети на 10 Мбит/с мощный компьютер, это может существенно повлиять на сетевую производительность. При сканировании через Интернет данная проблема будет менее острой, так как ограничивающим фактором послужит пропускная способность промежуточных соединений, однако все равно можно снизить производительность загруженного web-сервера или почтового сервера. В крайних случаях ваша активность может даже привести к прекращению работы машин. Независимо от способа использования, перед сканированием следует получить разрешение владельца сканируемых хостов. Сканирование портов - деятельность на грани законности (в действительности вы не взламываете системы, просто опрашиваете сеть). Однако вашему начальнику может быть не до нюансов, если вы нарушите работу корпоративной сети. Даже при наличии разрешения необходимо принять во внимание предполагаемый эффект сканирования целевой сети. Если это интенсивно используемая сеть, сканирование нужно выполнять ночью или в периоды наименьшей активности. Некоторые сканеры имеют возможность замедлять посылку пакетов, чтобы не очень сильно воздействовать на сеть. Это означает, что сканирование будет выполняться дольше, но в более дружественном для сети режиме. Некоторые современные устройства, такие как межсетевые экраны и некоторые маршрутизаторы, достаточно интеллектуальны, чтобы распознать сканирование своих портов и отреагировать на него. Брандмауэр UNIX и Linux – Iptables можно сконфигурировать для этого, используя опцию multiport и устанавливая флаг приоритета. Машины могут отвечать на сканирование портов снижением скорости ответа для каждого последующего опроса. В итоге ваше сканирование может растянуться до бесконечности. Когда вы получите разрешение на сканирование, следует определить, с какой целью вы собираетесь сканировать сеть. Сканеры портов предлагают быстрый способ просмотра диапазона адресов и выявления все активных машин в этом сегменте, позволяя выполнять инвентаризацию сети. Сканер портов покажет все сервисы, запущенные в данный момент на машине. Если это серверная машина, то, вероятно, таковых окажется много, и, возможно, не все из них на самом деле нужны для выполнения основной функции машины. Чем больше работающих сервисов, тем меньше безопасности. И все эти программы могут замедлять работу перегруженного сервера. Ненужные Web-, FTP- и DNS-серверы крадут циклы процессора у основной функции компьютера. Сканирование портов серверов с последующим анализом результатов и оптимизацией может дать немедленное увеличение скорости и сокращение времени реакции. Сканирование позволяет обнаружить вирусные программы, внедренные на компьютеры сети. Эти программы называются шпионским ПО, потому что нередко они пытаются следить за активностью пользователя и могут передавать собранные данные обратно на шпионский центральный сервер. Эти программы обычно не опасны, но их чрезмерное количество может существенно снизить производительность труда пользователя. Кроме того, написаны они зачастую неаккуратно и могут мешать работе других программ или даже вызывать их аварийное завершение. Другим классом вредоносного программного обеспечения являются «троянские» программы. Эти программы 42 специально созданы для взлома сетей. Подобно троянскому коню из греческой мифологии, эти программы открывают хакерам и взломщикам заднюю дверь в вашу сеть. Обычно их присутствие можно обнаружить только по открытому сетевому порту, а с помощью антивирусных средств выявить их крайне сложно. Оказавшись внутри компьютера, большинство «троянских» программ пытаются вступить во внешние коммуникации, чтобы дать своему создателю или отправителю знать, что они заразили машину на этих портах. В табл. 12 перечислены наиболее распространенные «троянские» программы и номера портов, используемые ими. Сетевые «черви» - особо мерзкий тип вирусов. Зачастую они снабжены сетевыми средствами и открывают порты на зараженном компьютере. Сетевые «черви» используют сеть для распространения и поэтому иногда выявляются при сканировании портов. Таблица 12. Номер IP Известные "троянские" программы, использующие эти порта протокол порты 12456 и TCP NetBus 54321 23274 и TCP Sub7 27573 31335 TCP Trin00 31337 TCP Back Orifice 31785-31791 TCP Hack 'a'Tack 33270 TCP Trinity 54321 UDP Back Orifice 2000 60000 TCP Deep Throat 65000 TCP Stacheldraht Программа NMAP Программа Nmap - вне всяких сомнений, лучший сканер портов. Его создатель программист с псевдонимом «Fyodor», разработки которого используются во многих других программах и портированы практически на все употребительные операционные системы. Достаточно сказать, что Nmap должен входить в инструментарий каждого администратора безопасности. Перечислим некоторые из основных достоинств Nmap: • • • У него есть множество опций. Можно понизить частоту отправки зондирующих пакетов, если вы опасаетесь замедления работы сети, или, наоборот, повысить ее, если имеется запас ширины полосы пропускания. Опции невидимости - еще один элемент репертуара Nmap. Хотя некоторые критикуют эти опции, полагая, что они необходимы только хакерам, для них имеются законные применения. Например, если необходимо проверить, насколько чувствительной является система обнаружения вторжений. Nmap позволяет сделать это, выполняя сканирование с различными уровнями невидимости. Далее, Nmap выходит за рамки простого сканирования портов и осуществляет идентификацию ОС, что полезно при установлении соответствия между IP-адресами и машинами. Он легкий, но мощный. Код Nmap невелик и будет выполняться даже на самых старых машинах, он запускается даже на некоторых КПК. В небольшом объеме он концентрирует огромную энергию и без проблем сканирует очень большие сети. Он прост в использовании. Хотя существует множество различных способов его запуска, реализуемое по умолчанию базовое сканирование SYN делает все, что требуется большинству приложений. Имеется как режим командной строки, так и графический интерфейс для LINUX и Windows, чтобы удовлетворить запросы как круглых дураков, так и тех, кому необходима графика. Он также очень хорошо документирован и поддерживается большим числом разработчиков и оперативных ресурсов. Экран графической оболочки программы показан на рис. 1. 43 Рис. 1. Графический интерфейс Nmap. Графический клиент Nmap предоставляет весьма простой интерфейс. Вверху имеется поле для ввода IP-адреса или диапазона IP-адресов, а чтобы начать сканирование, достаточно нажать кнопку Scan. В табл. 13 приведены различные форматы для ввода IP-адресов. Адреса могут также извлекаться из файла, если выбрать пункт Input элемента File основного меню и задать текстовый файл с данными в подходящем для Nmap формате. Таблица 13. Формат Пример Одиночный IP-адрес 192.168.0.1 IP- адреса, разделенные запятыми 192.168.0.1,192.168.0.2 IP-диапазон, разделенный дефисом 192.168.0.1-255 Использование стандартной нотации с косой 192.168.0.1/24 (сеть класса С из 256 чертой адресов) Nmap можно запустить из командной строки как в LINUX, так и в Windows. Общий формат команды запуска таков: nmap параметры IP-диапазон Основные способы сканирования NMAP Nmap поддерживает множество различных видов сканирования. В табл. 14 перечислены наиболее употребительные. В скобках указаны параметры командной строки. 44 Таблица 14. Тип сканирования (параметры командной строки) SYN (-sS) TCP-соединение: Connect (-sT) Эхо-тестирование: Ping Sweep (-sP) UDP-сканирование: UDP Scan (-sU) Описание Способ сканирования, установленный по умолчанию, пригодный для большинства целей. Он менее заметен, чем TCP Connect, то есть не будет фиксироваться большинством простых средств протоколирования. В этом режиме в каждый возможный порт посылаются одиночные TCPпакеты с установленным флагом SYN. Если в ответ возвращается пакет SYN ACK, то Nmap делает вывод, что здесь запущен сервис. Если ответа нет, то предполагается, что порт закрыт SYN-сканирование не завершает трехходовое квитирование установления связи в TCP, так как не возвращает целевой машине пакет с установленным флагом ACK. С точки зрения сканируемой системы действующие соединения не устанавливаются. Однако, удаленная система будет удерживать эту «половинку сокета» открытой, пока не пройдет максимально допустимое время ответа. Некоторые современные серверы и программы выявления вторжений достаточно интеллектуальны, чтобы уловить подобные действия, но для большинства машин SYN-сканирование будет невидимым Это тип сканирования напоминает SYN за исключением того, что трехходовое квитирование установления связи в TCP выполняется до конца и устанавливается полноценное соединение. Подобное сканирование не только шумно, но и создает дополнительную нагрузку на сканируемые машины и сеть. Однако, если скрытность или экономия полосы пропускания не являются приоритетными, то сканированием Connect, по сравнению с SYN, можно порой получить более точные результаты. Кроме того, если у вас нет привилегий администратора или суперпользователя на машине Nmap, вы не сможете воспользоваться никаким другим типом сканирования, поскольку создание построенных особым образом пакетов для других типов сканирования требует низкоуровневого доступа к ОС Выполняется простое эхо-тестирование всех адресов, чтобы увидеть, какие из них ответят на ICMP-запрос. Если вас на самом деле не интересует, какие сервисы запущены, и вы просто хотите знать, какие IP-адреса активны, то данный тип позволит достичь цели много быстрее, чем полное сканирование портов. Однако некоторые машины могут быть сконфигурированы так, чтобы не отвечать на ping (например, новый межсетевой экран XP), но, тем не менее, выполнять некоторые сервисы, поэтому Ping Sweep - менее надежный метод, чем полное сканирование портов Этот тип сканирования проверяет наличие слушаемых UDPпортов. Так как UDP, в отличие от TCP, не отвечает положительным подтверждением, а отвечает на входящий пакет, только когда порт закрыт, данный тип сканирования 45 FIN-сканирование: FIN Stealth (-sF) NULL-сканирование: NULL Scan (-sN) XMAS-сканирование: XMAS Tree (-sX) Сканирование через отражатель: Bounce Scan (-n FTP_HOST) RPC-сканирование: RPC Scan (-sR) может иногда приводить к ложным срабатываниям, однако он способен выявить троянские программы, использующие UDP-порты с большими номерами и скрытые RPC-сервисы. Он может быть весьма медленным, так как некоторые машины намеренно замедляют ответы на этот тип трафика, чтобы избежать перегрузки. Однако машины, выполняющие ОС Windows, не реализуют замедления, поэтому вы сможете использовать UDP для нормального сканирования хостов Windows. Это скрытное сканирование, аналогичное SYN, но использующее пакеты TCP FIN. Большинство компьютеров, но не все, ответят пакетом RST, поэтому сканирование FIN сопряжено с ложными срабатываниями и пропуском положительных результатов, но может осуществляться под наблюдением некоторых программ выявления вторжений и при наличии других контрмер Еще одно весьма скрытное сканирование, при котором все флаги заголовка TCP сброшены (или пусты). Подобные пакеты обычно некорректны, и некоторые хосты не знают, что с ними делать. Операционные системы Windows входят в эту группу, так что их сканирование в режиме Null будет давать недостоверные результаты. Однако для серверов не под Windows, защищенных межсетевым экраном, оно может стать способом проникновения Аналогично сканированию NULL, за исключением того, что все флаги в заголовке TCP установлены, а не сброшены (отсюда и название - пакет расцвечен, как рождественская елка). Машины Windows, ввиду особенностей реализации на них стека TCP, не отвечают на подобные пакеты Этот хитроумный тип сканирования использует лазейку в протоколе TCP для "отражения" сканирующих пакетов от сервера FTP во внутреннюю сеть, которая обычно недоступна. Зная IP-адрес сервера FTP, который подключен к локальной сети, вы можете проникнуть через межсетевой экран и сканировать внутренние машины. Стоит проверить и свою собственную сеть на наличие данной уязвимости. В большинстве современных серверов FTP эта дыра в защите ликвидирована. Примечание: В дополнение к сканируемым IP-адресам вы должны задать действующий сервер FTP, имеющий доступ к сети Этот особый тип сканирования ищет машины, отвечающие сервисам удаленного вызова процедур (RPC). Сервис RPC, при определенных условиях позволяющий удаленным командам выполняться на машине, сопряжен со значительным риском. Так как сервисы RPC могут выполняться на многих различных портах, то по результатам обычного сканирования выявить эти порты трудно. RPC-сканирование зондирует найденные открытые порты с помощью команд, показывающих имя программы и версию сервиса RPC. Неплохо время от времени проводить подобное сканирование, чтобы узнать, работают ли, и где именно, RPC-сервисы 46 Window-сканирование: Window Scan (-sW) Реактивное сканирование: Idle Scan (-sI хостзомби:используемый_порт) Данный тип сканирования полагается на аномалию в ответах на пакеты ACK в некоторых операционных системах, чтобы обнаружить порты, которые предположительно фильтруются. Известно, что к числу операционных систем, уязвимых для подобного сканирования, принадлежат некоторые версии AIX, Amiga, BeOS, BSDI, Cray, DG/UX, Digital LINUX, FreeBSD, HP/UX, IRIX, MacOS, NetBSD, OpenBSD, OpenStep, OpenVMS, OS/2, QNX, Rhapsody, SunOS 4.X, Tru64 LINUX, Ultrix, VAX и VxWorks Данный тип сканирования появился в Nmap версии 3.0. Это сверхскрытный метод, при применении которого пакеты сканирования отражаются от внешнего хоста. Необязательно иметь контроль над этим хостом, но он должен работать и удовлетворять некоторым требованиям. Вы должны ввести IP адрес хоста-зомби и номер используемого порта. Хотя это сканирование крайне трудно проследить до исходной точки, оно вряд ли особенно полезно для большинства администраторов, сканирующих свои собственные сети. Это одна из самых спорных опций Nmap, так как на практике она применима только для злоумышленных атак Опции времени Nmap Nmap предоставляет средства для повышения или понижения частоты, с которой посылаются пакеты сканирования. Если вас беспокоит слишком большой сетевой трафик (или вы пытаетесь действовать скрытно), то можно понизить частоту. Помните только, что чем реже посылаются пакеты, тем дольше продлится сканирование. Для больших сетей время может вырасти экспоненциально. С другой стороны, если вы торопитесь и не обращаете внимание на некоторый дополнительный сетевой трафик, можно поднять частоту. Различные уровни и частоты пакетов приведены в табл. 15 и 16. Таблица 15 Опция Описание TCP + ICMP Настройка Nmap, установленная по умолчанию. В процессе такого (-PB) сканирования программа использует для определения статуса хоста и ICMP, и TCP-пакеты. Это наиболее надежный и точный способ, так как, если хост активен, то хотя бы по одному методу ответ, как правило, будет получен. К сожалению, это также самый шумный способ, который, скорее всего, приведет к регистрации каким-нибудь устройством сканируемой сети ЭхоДля обнаружения хостов используется только метод TCP. Многие тестирование межсетевые экраны и некоторые маршрутизаторы отбрасывают пакеты TCP ICMP, возможно, с протоколированием. Если вы пытаетесь остаться (-PT) невидимым, то метод TCP - это наилучший вариант. Однако для некоторых экзотических типов сканирования (FIN, XMAS, NULL) какието хосты могут остаться незамеченными. ЭхоИспользовать для раскрытия сети только пакеты ICMP. Это не лучший тестирование вариант, если вы сканируете сеть извне через межсетевой экран, так как ICMP большинство ваших пакетов будет, вероятно, отброшено. Однако внутри (-PE) сети данный метод вполне надежен, хотя вы можете пропустить свой межсетевой экран и некоторые сетевые устройства, которые не отвечают на ICMP-пакеты 47 Без эхотестирования (-P0) Если задается эта опция, то Nmap не будет пытаться сначала выяснить, какие хосты активны, а будет вместо этого посылать пакеты по каждому IP-адресу заданного диапазона, даже если по этому адресу машины нет. Это расточительно как с точки зрения полосы пропускания, так и времени, особенно когда сканируются большие диапазоны. Однако это может быть единственным способом просканировать хорошо защищенную сеть, которая не отвечает на ICMP-пакеты. Уровень частоты Параметр командной строки Параноидальный -F 0 Исподтишка Вежливый Нормальный Агрессивный -F 1 -F 2 -F 3 -F 4 Безумный -F 5 Частота пакетов Раз в 5 минут Раз в 15 секунд Раз в 4 секунды Со скоростью работы ОС То же, что и Normal, но максимальное время ожидания пакета сокращено до 5 минут на хост и до 1,25 секунды на зондирующий пакет. Время ожидания 0,75 секунды на хост и 0,3 секунды на зондирующий пакет. Таблица 16. Пояснения Не используйте эту опцию при сканировании большого числа хостов, иначе сканирование никогда не закончится. Используется по умолчанию Этот метод не будет хорошо работать, если только вы не находитесь в очень быстрой сети и не используете очень быстрый сервер Nmap. Даже в этом случае есть риск потерять данные. Другие опции Nmap В табл. 17 перечислены некоторые другие опции Nmap, которые управляют, например, разрешением доменных имен, идентификацией ОС и т.д., и не попадают в другие категории Таблица 17. Опция Описание Не выполнять Обычно Nmap пытается разрешать доменные имена для всех разрешение имен сканируемых IP-адресов. Это может существенно затягивать (-n) сканирование, поэтому если вас не интересуют имена хостов, разрешение имен можно отключить Помните, однако, что знать имена хостов полезно, особенно при сканировании сетей с DHCP, где IP-адреса могут меняться Быстрое сканирование Эта опция вызывает сканирование только портов, перечисленных (-F) в файлах употребительных портов Nmap. По умолчанию это общеупотребительные серверные порты с номерами, меньшими 1024. Данные файлы можно отредактировать и добавить в список другие порты. Подобное сканирование может оказаться значительно более быстрым, но оно не выявит троянские 48 Диапазон портов (-p диапазон_портов) Использование приманок (-D адрес_приманки_1, адрес_приманки_2...) Фрагментация (-f) Запрашивать информацию Identd (-I) Разрешать все адреса (-R) Идентификация ОС (-O) программы и сервисы, использующие порты с большими номерами. По умолчанию Nmap сканирует все 65535 возможных портов TCP. Однако, если вы хотите просканировать только определенный диапазон, можно задать его в качестве аргумента опции -p. Это полезно, если вы хотите просканировать только один тип серверов, например, порт 80 для Web-серверов, или только верхние диапазоны, чтобы найти необычные сервисы и потенциальные троянские программы. Эта опция создает видимость, что хосты, указанные в качестве приманок, участвуют в сканировании целевых машин. Последние будут наблюдать потоки данных из нескольких источников, и им будет трудно определить, какой из них является реальным сканирующим хостом. Это еще одна опция сверхскрытности, не обязательная для большинства добропорядочных применений и создающая, кроме того, существенно более высокую нагрузку на сеть. Следует учитывать также, что использование хостов в качестве приманок может привести к блокированию их доступа к сканируемой машине. На вас может обрушиться гнев людей, которых вы таким образом "подставили". Данная опция вызывает фрагментацию отправляемых пакетов сканирования. Это - средство обеспечения скрытности, которое можно применять, чтобы избежать обнаружения сканирования. Пакеты будут собираться на другом конце получающей их машиной, но фрагментированные пакеты могут обмануть системы обнаружения вторжений и межсетевые экраны, которые зачастую проверяют соответствие конкретным шаблонам Служба Identd функционирует на некоторых (обычно - LINUX) машинах и предоставляет при запросе дополнительную информацию о хосте, например, тип операционной системы. Следует учитывать, что Nmap автоматически выполняет идентификацию ОС с помощью идентификационных меток TCP, поэтому данная опция менее полезна, чем кажется на первый взгляд. Если в вашей сети нет систем LINUX, то применение этой опции вообще теряет смысл При использовании данной опции Nmap пытается разрешать все адреса в диапазоне, даже когда они не отвечают. Это может быть полезно, например, в сети поставщика Интернет-услуг, где целый диапазон записей о хостах может быть присвоен потенциальным IP-адресам для пула коммутируемого доступа, но в каждый момент времени возможно использование только определенной части из них. Эта опция включена по умолчанию. Как упоминалось ранее, каждая реализация стека TCP имеет свои особенности. При сравнении точной идентификационной метки ответов с базой данных известных идентификационных меток TCP, Nmap, как правило, может с высокой достоверностью (иногда - вплоть до диапазона версий) идентифицировать ОС, с которой общается. Изредка попадается что-то незнакомое, и тогда ответ TCP печатается внизу отчета. Если вы обнаружите неопределенную сигнатуру, вы сможете помочь в построении базы данных идентификационных меток ОС. Если вы точно знаете, чему она 49 Отправить через интерфейс (-e имя_интерфейса) соответствует, скопируйте ее и отправьте по электронной почте на адрес группы разработчиков Nmap. Они добавят ее в базу данных, чтобы в будущем при сканировании машины такого типа ее можно было правильно идентифицировать. Все известные Nmap идентификационные метки TCP содержатся в файле nmapos-fingerprints в каталоге Data установки Nmap. Эта опция заставляет пакеты сканирования отправляться через определенный интерфейс. На практике это необходимо только на машине с несколькими сетевыми платами, или если Nmap не опознает ваш сетевой интерфейс автоматически. Вывод результатов Nmap Nmap генерирует отчет, содержащий каждый обнаруженный IP-адрес, выявленные слушающие порты по этим адресам и соответствующие общеизвестные имена сервисов (при наличии таковых). Отчет также показывает, является ли порт открытым, фильтруемым или закрытым. Тот факт, что Nmap получил ответ из порта 80 и напечатал в отчете «http», еще не означает, что на компьютере запущен Web-сервер, хотя, скорее всего, это так. Всегда можно проверить любой подозрительный открытый порт, подключаясь с помощью telnet к нужному IP-адресу с указанием номера порта и анализируя полученный ответ. Если там выполняется web-сервер, то обычно получают ответ, вводя команду GET / HTTP. Должна быть выдана подразумеваемая домашняя страница в необработанном HTML-виде (а не как красивая Webстраница), что послужит подтверждением функционирования сервера. То же самое можно проделать с другими сервисами, такими как FTP и SMTP. Отметим, что в LINUX-версии Nmap кодирует цветом найденные порты в соответствии с их ролью (табл. 18). Таблица 18. Цвет Описание Красный Данный номер порта присвоен сервису, который предлагает некоторую форму прямого входа в систему (как, например, Telnet или FTP). Зачастую эти сервисы оказываются наиболее притягательными для хакеров Голубой Этот номер порта представляет почтовый сервис, такой как SMTP или POP. Подобные сервисы также часто являются объектами хакерских атак Жирный Эти сервисы могут предоставлять некоторую информацию о машине или черный операционной системе (как, например, finger, echo и т.д.) Простой Любые другие идентифицированные сервисы или порты черный На рис. 2, показан формат вывода программы. Он позволяет быстро просмотреть отчет и определить, есть ли какие-то сервисы или порты, о которых следует побеспокоиться. Это не означает, что нужно игнорировать все необычные номера, которые не выделены цветом или шрифтом (в версиях LINUX). Троянские программы и ПО для общения часто отображаются как неизвестные сервисы. Рис. 2. Вывод Nmap 50 Журналы Nmap можно сохранять в различных форматах, включая обычный или машиночитаемый текст, и импортировать их в другую программу. Однако, если этих возможностей недостаточно, то существует программное средство обработки отчетов Nlog. Контрольные вопросы 1. Что такое порт. 2. Какие номера портов закреплены за стандартными сетевыми сервисами. Назовите некоторые номера портов и соответствующие им сервисы. 3. Зачем нужны сканеры портов. 4. Могут ли сканеры портов использоваться в сетях не использующих протоколы TCP/IP. 5. Что означает SYN-сканирование. 6. Назовите автора-разработчика программы NMAP. 7. Какая программа обрабатывает отчеты NMAP. 8. Что означает красный цвет в отчете NMAP, черный. 9. Какой режим сканирования задается командой nmap -PB. Выполнение работы Выполнить сканирование по индивидуальному заданию. 51 Занятие №7 Работа с программой Nessus Продолжительность- 2 часа Максимальный рейтинг- 10 баллов Цель работы Познакомиться с программой-сканером безопасности Nessus. Изучить интерфейс клиентского приложения программы, выполнить пробное сканирование внутренней сети. Общая информация Nessus - это инструмент для автоматизации проверки и обнаружения известных уязвимостей и брешей в защите. Обычно кто-то - хакерская группа, компания по разработке ПО для обеспечения безопасности или даже простой пользователь обнаруживает новую уязвимость в каком-либо ПО. Эта уязвимость может быть найдена случайно или же путём тщательного поиска. Nessus – это программа со множеством возможностей, однако она довольно сложна в использовании. Nessus распространяется по лицензии GPL (General Public License). Сайт программы www.nessus.org. Платная техническая поддержка Nessus всегда доступна на www.tenablesecurity.com. Nessus разрабатывался большим коллективом разработчиков, руководимым Renaud Deraison. Сравнительное тестирование программ-сканеров безопасности показывает, что возможности Nessus равны или даже превосходят возможности некоторых продуктов, стоящих тысячи долларов. Важная особенность Nessus – используемая в программе технология клиент-сервер. Сервер может быть размещён в самых разнообразных стратегических точках сети, позволяя осуществлять проверки разных участков сети. Центральный клиент или многочисленные клиенты могут контролировать сервер. Сервер может быть запущен практически на всех разновидностях Unix систем. Он даже может быть запущен на MAC OS X и IBM/AIX, но проще всего его установить на Linux системах. Клиентом может быть как Windows, так и UNIX. Nessus сервер осуществляет действительную проверку безопасности, в то время, как клиент обеспечивает удобный для работы интерфейс. Программа Nessus использует другие программы: NMAP – программу сканер портов, Hydra – программу тестер паролей, и наконец Nikto – CGI сканер. Хотя эти программы не обязательны для установки, но они очень сильно увеличат работоспособность Nessus. Рекомендуются именно они, потому что эти программы считаются лучшими утилитами в своем классе под UNIX системы. Настройка программы После успешной установки сервера, требуется выполнить некоторые базовые шаги. Первым шагом, завершающим установку, будет добавление нового пользователя. Новый пользователь может быть добавлен командой «nessus-adduser», при этом программа задаст вам вопрос о способе аутентификации. Аутентификация может быть осуществлена различными способами, однако, аутентификация при помощи пароля является самым простым и в тоже время самым надёжным способом. Следующим вопросом будет частичная блокировка возможностей некоторых пользователей. Во время использования Nessus пользователь может быть полностью блокирован или допущен к сканированию только некоторых IP адресов. Следующим шагом необходимо сгенерировать сертификат для шифрования трафика между клиентом и сервером. Эту задачу выполняет команда «nessusmkcert». Прежде чем начинать сканирование, следует обновить сценарии сканирования. Сценарии сканирования Nessus можно сравнить с коллекцией отпечатков вирусов обычного антивируса. Каждый сценарий посвящен отдельной уязвимости. Сценарии могут быть написаны как для непосредственной эксплуатации уязвимостей, так и для простого определения версии уязвимого ПО. Сценарии могут быть написаны практически на любом языке, но обычно для этого используется Nessus Attack Scripting Language (NASL). NASL – 52 это собственный язык Nessus, специально разработанный для написания сценариев проверки уязвимостей. Сценарии NASL обычно тестируются, посылая на проверяемый хост особый код и сравнивая результаты с результатами уязвимых значений. Есть лишь небольшое число сценариев, написанных не на NASL. Это C и Perl скрипты, осуществляющие особые цели, которые не так просто создать при помощи NASL. Обновление сценариев желательно делать ежедневно. Новые уязвимости обнаруживаются и распространяются постоянно. Обычно, после появления новой уязвимости кто-то из разработчиков Nessus пишет NASL сценарий и публикует его реализацию на www.nessus.org. Далее это сценарий рассматривается разработчиками и помещается в список одобренных сценариев. Из-за высокого риска, серьёзные сценарии часто выходят в один день с появлением информации о новой критической уязвимости. Обновление сценариев осуществляется командой «nessus-updateplugins». На выполнение этой команды имеет право только пользователь root. Однако, обычные пользователи не ограничены никакими средствами от просмотра списков сценариев на www.nessus.org. Новые или предназначенные для какой-либо особой цели сценарии могут быть написаны на NASL, так что вы можете создавать ваши собственные сценарии. Для запуска сервера необходимо выполнить команду «nessusd –D». Для использования программы нужно установить клиента. Существует три основных клиента Nessus. Стандартная Unix GUI версия автоматически устанавливается в процессе установки сервера. Nessus можно также контролировать из командной строки. Третий вариант – это существующая версия под Windows, которая называется NessusWX. Подключение клиента Так, как Nessus - это технология клиент-сервер, то, запуская клиента, необходимо подключиться к серверу. В стандартном клиенте введите IP адрес сервера, имя пользователя и пароль (пользователя можно создать командой «nessus-adduser») и нажмите login. В NessusWX процесс проще, но использует меню подключения соединения. Клиент подключается к серверу через SSL соединение и загружает список установленных на данный момент сценариев. Эта проверка гарантирует, что и в дальнейшем вы будете держать связь именно с предназначенным сервером. Рисунки 3 и 4 демонстрируют подключение, используя Unix и Windows GUI средства. Рисунок 5 показывает аутентификацию пользователя, с использованием NessusWX клиента. Рис. 3. Запуск Nessus в Unix GUI. 53 Рис. 4. Запуск Nessus в Windows. Рис. 5. Аутентификация пользователя с использованием NessusWX клиента. Использование Nessus Самой главной и сильной особенностью Nessus являются сценарии. Выбор сценариев – это залог успеха всего сканирования. Сценарии делятся на категории несколькими способами. Один из методов группировки – группировка по степени опасности применения сценариев сканирования. Различают опасные и неопасные сценарии. Некоторые сценарии считаются опасными, так как могут вызвать отказ в обслуживании (DoS) и аварийное завершение работы системы, уязвимой для DoS атаки. Разумеется, такие сценарии не стоит вслепую запускать на функционирующей системе. Они не вызывают серьёзного ущерба, но требуют, как минимум, перезагрузки системы. Стандартный клиент обозначает опасные сценарии предупреждающим треугольником. NessusWX не имеет никакого специального предупреждения об опасных сценариях, за исключением функции Enable Non-DoS. И никакого другого предупреждения, что даже безопасный сценарий может повлечь за собой крах и неработоспособность системы, вы не найдёте. Так, как сценарии посылают нестандартный набор данных, риск во время их использования существует всегда, хотя реальная угроза бывает довольно редко. Поэтому каждый, кто сканирует систему, должен понимать, что это может повлечь за собой повреждение, даже, когда используются на первый взгляд безопасные сценарии. Рисунок 6 показывает выбор сценариев с использованием Unix GUI. Рисунки 7 и 8 показывают выбор сценариев в NessusWX для Windows. 54 Рис. 6. выбор сценариев с использованием Unix GUI. Рис. 7. Выбор plug-ins с использованием Windows NessusWX клиента. 55 Рис. 8. Включение безопасных plug-ins в Windows NessusWX. Безопасные проверки не могут нанести вреда, они используют лишь пассивные сценарии и направлены, например, на определение версии используемого программного обеспечения. Однако безопасные проверки не всегда бывают корректными. Иногда они могут выдавать ложные предупреждения или пропускать опасные уязвимости. Режим безопасного сканирования нужно выставить на панели Scan options. Рисунок 9 изображает безопасную проверку в NessusWX. Рис. 9. Выбор безопасных проверок Другой способ организации сценариев – это организация по таким категориям, как Windows, FTP, SNMP, SMB, Cisco, и т.д. У этого способа организации есть недостатки. Например, куда следует отнести сценарий FTP применимый только для Windows, - к категории Windows или FTP? Ведь выбор категории делает автор сценария, а не кто-то другой. Для облегчения работы был создан механизм фильтрации сценариев. Механизм фильтрации помогает изолировать лишние сценарии. Фильтр может быть установлен на имя сценария, номер сценария и т.п. Кликните на категорию сценария, и вы получите подробности работы и действия этого сценария. Если вам нужна более подробная информация о нём, например NASL код сценария, то вы можете его найти на cgi.nessus.org/plugins/. Заметьте, что сценарии категории «DoS» и сценарии категории «опасные / DoS» это разные вещи. «Опасные / DoS» категории сценариев используют известную уязвимость, в то время как 56 сценарии категории «DoS» чаще всего только проверяют на наличие уязвимости. Если требуется открыто просканировать систему на наличие уязвимостей, не опасаясь за последствия, то наилучшим решением является выбор всех сценариев. Однако если целью является скрытое сканирование или происходит сканирование рабочей системы, то выбор сценариев становится нелёгким делом. Сканирование портов – одна из важных частей процесса сканирования. Это процесс, во время которого определяются активные порты для определённого IP адреса. Каждый порт связан с определённым приложением. Nessus – это разумный сканер, и он использует сценарии только в том случае, если будет найдена программа для проверки на уязвимость. Например, сценарии для веб-сервера будут использованы только в случае, если будет найден веб-сервер. Так как довольно часто порты используются не по их стандартному назначению, для того, чтобы определить их, Nessus использует сценарии, называемые сервисами (services). Сервисные сценарии стараются определить программу, запущенную на каждом порте. Как только программа определена, против неё запускаются сценарии, выбранные пользователем. Nessus позволяет использовать несколько различных способов сканирования портов. Первый - это классический NMAP сканнер, который получил широкую известность. В программе есть и встроенный сканер портов и сканер на основе программы ping. Насколько важен грамотный выбор сценариев, настолько же важен и выбор способа сканирования, зависящий от ситуации. Рисунки 10 и 11, показывают обычное SYN сканирование, используя NessusWX и Unix GUI клиента, соответственно: Рис. 10. Выбор SYN сканирование в NessusWX. 57 Рис. 11. Выбор SYN сканирование в Unix клиенте. Конечная задача – определить объекты сканирования. Цель сканирования указывается на панели Target Selection. Объектом сканирования может быть как простой IP адрес, так и подсеть или даже диапазон IP адресов. Рисунки 12 и 13 показывают, как выбрать цель в клиентском приложении. Рис. 12. Выбор цели сканирования в Unix GUI. 58 Рис. 13. Выбор цели сканирования в NessusWX. Контрольные вопросы 1. Какие задачи решает программа Nessus. 2. В чем преимущества программы Nessus. 3. Чтотакое NASL. 4. Почему некоторые сценарии, выполняемые программой, считаются опасными. 5. Какой командой запускается серверная часть программы. 6. Доступ к программе осуществляется через специальное клиентское приложение, а в нем необходимо ввести регистрационную информацию, что делать если вы еще не зарегистрировались, сможете ли вы воспользоваться программой. 7. Может ли Nessus использовать другие программы, какие. Выполнение работы 1. Запустить серверную часть программы. 2. Запустить клиентскую часть, зарегистрироваться. 3. Выполнить пробное сканирование внутренней сети. 59 Занятие №8 СОЗДАНИЕ ЗАЩИЩЕННЫХ ДОКУМЕНТОВ В ТЕКСТОВОМ ПРОЦЕССОРЕ OPENOFFICE.ORG WRITER Продолжительность- 2 часа Максимальный рейтинг- 10 баллов Цель работы Изучить технологию создания защищенных документов и документов, подписанных цифровой подписью в текстовом процессоре OpenOffice.org Writer. Создание защищенного документа Все документы, которые сохраняются в XML-формате (формат используемый в OpenOffice.org Writer по-умолчанию, расширение .odt), можно сохранять с паролями. Документы, сохраненные с паролем, нельзя открыть без пароля. Содержимое защищается таким образом, чтобы его нельзя было читать с помощью какого-либо внешнего редактора. Шифруются текстовое содержимое, графические изображения и объекты OLE. Информация, введенная в диалоговом окне Файл - Свойства не шифруется. Она включает имя автора, дату создания, количество слов и символов. Для включения защиты необходимо выбрать команду Файл - Сохранить как и в открывшемся диалоговом окне (рис. 14) установить флажок Сохранить с паролем. Рис. 14. Сохранение документа в зашифрованном виде. Если поле установки флажка нажать клавишу «ОК», то появится окно с запросом пароля, рис. 15., используемого как ключ шифрования. Рис. 15. Окно введения пароля для шифрования документа. Для отключения защиты сначала необходимо открыть документ, введя правильный пароль. 60 Затем, выбрав команду Файл - Сохранить как, вновь попасть в окно сохранения документа (рис. 14) и снять флажок Сохранить с паролем. При попытке открыть защищенный документ появляется окно запроса пароля (рис. 15). Создание документа с цифровой подписью Прежде, чем подписывать документы OpenOffice.org, необходимо получить (или создать) личный цифровой сертификат (digital certificate) и установить его на свою машину. Цифровой сертификат это защищенный паролем файл в котором хранится различная информация - имя владельца, его e-mail адрес, ключ шифрования, а также наименование организации выдавшей этот сертификат и дату, после которой цифровой сертификат считается недействительным (expiration period). Большинство организаций выдающие сертификаты делают это на коммерческой основе и требуют оплаты за их выдачу. Но существуют и некоммерческие организации, например ассоциация CACert (http://www.cacert.org), выдает цифровые сертификаты бесплатно. Можно создать и так называемый самоподписанный цифровой сертификат (self-signed certificate). Цифровой сертификат (Digital certificate) - небольшой файл, содержимое которого уникальным образом идентифицирует пользователя или сайт, показывая, что вы можете доверять определённой информации. Цифровой сертификат содержит открытый ключ владельца сертификата, его персональную информацию, а также цифровую подпись сертифицирующей организации. Цифровая подпись (Digital signature) информация об организации или личности, зашифрованная с помощью закрытого ключа этой организации. Удостоверяет, что документ исходит от того лица, чья цифровая подпись прилагается. Подпись нельзя подделать, т.к. закрытый ключ недоступен. Кроме того, внесение изменений в документ приводит к разрушению цифровой подписи, т.е. наличие цифровой подписи в документе не только подтверждает личность отправителя, но и свидетельствует о том, что документ никем кроме отправителя не изменялся. Для получения сертификата от CACert достаточно зарегистрироваться на сайте этой организации. Заполнив поля электронной формы с запросами о вашей персональной информации, через некоторое время вы получаете на свою электронную почту ссылку на подтверждение запроса. Переход по этой ссылке приводит к генерированию персонального сертификата и вы можете установить его на вашу машину. Для выполнения указанных процедур требуется поддержка Java, поэтому в вашем браузере должна быть разрешена ее работа. Сертификат CACert устанавливается в программу-браузер, после установки его необходимо экспортировать в виде отдельного файла, который можно сохранить в любой доступный каталог. Для создания самоподписываемого сертификата можно использовать бесплатную программу SELFCERT от фирмы Abylonsoft (http://www.abylonsoft.com/). После получения сертификата можно подписать документ цифровой подписью. Для этого нужно выполнить следующие шаги: 1. В меню Файл выбрать пункт Цифровые подписи. 2. В окне сообщения выводится рекомендация сохранить документ. Нажмите кнопку Да, чтобы сохранить файл. 3. После сохранения будет открыто диалоговое окно «Цифровые подписи». Нажмите кнопку Добавить, для создания цифровой подписи. 4. В диалоговом окне «Выбор сертификата» выберите сертификат и нажмите кнопку "OK". 5. Будет снова открыто диалоговое окно «Цифровые подписи», в котором можно добавить любые необходимые дополнительные сертификаты. Нажмите кнопку «ОК», чтобы добавить общий ключ к сохраненному файлу. 61 Для подписанного документа в строке состояния отображается значок. Чтобы просмотреть сертификат, можно дважды щелкнуть этот значок, рис. 16. Рис. 16. Окно просмотра свойств сертификата. Контрольные вопросы 8. Можно ли в текстовом процессоре OpenOffice.org Writer создать зашифрованный документ. 9. Что такое цифровой сертификат. 10. Обеспечивает ли цифровая подпись защиту документа. 11. Откуда можно взять сертификат. Можно ли его изготовить самостоятельно. 12. Может ли текстовый процессор OpenOffice.org Writer снимать защиту с зашифрованных документов Microsoft Word. 13. Какой формат используется для хранения текстовых документов в OpenOffice.org Writer. 14. Можно ли создать в OpenOffice.org Writer защищенный паролем документ формата .doc. Выполнение работы 1. Создать в OpenOffice.org Writer защищенный паролем документ. Открыть этот документ в простом редакторе (например, встроенном в Midnight Commander), проанализировать его содержимое. Какую информацию можно извлечь из зашифрованного файла. 2. Получить сертификат от CACert. Создать в OpenOffice.org Writer документ с цифровой подписью на основе полученного сертификата. Что происходит с документом при попытке внесения в него изменений. 62 Занятие №9 Шифрование почтовых сообщений в программе Mozilla Thunderbird Продолжительность- 2 часа Максимальный рейтинг- 10 баллов Цель работы Изучить технологию шифрования и дешифровки зашифрованных почтовых сообщений на примере почтовой программы Mozilla Thunderbird. Введение Известно, что высокоэффективное шифрование отдельных файлов электронных документов, почтовых сообщений, каталогов и т.п. обеспечивает программа PGP (Pretty Good Privacy – довольно хорошая секретность), разработанная Филиппом Циммерманом (Philip Zimmermann) и использующая схему шифрования с асимметричными ключами. Такая схема основана на математических алгоритмах, позволяющих шифровать сообщение одним ключом, а расшифровывать другим. Программа, использующая асимметричный алгоритм шифрования, генерирует пару связанных ключей. Особенность алгоритма шифрования в том, что расшифровать сообщение можно только парным ключом, соответствующим ключу с которым выполнялось шифрование, но нельзя ключом которым выполнялось шифрование. Ключи стали именоваться открытый и закрытый, т.к. один из них (открытый) может распространяться свободно, тогда как закрытый хранится в надежно защищенном месте. Для вычисления парного ключа на основе имеющегося, например, открытого требуются слишком большие вычислительные мощности и огромные временные периоды, поэтому нет никакой опасности в свободном распространении одного из ключей. Отправив всем своим адресатам открытый ключ мы даем им возможность шифровать этим ключом сообщения, предназначенные для нас. Никто другой расшифровать их не сможет, потому что закрытый ключ – второй из пары ключей – необходимый для расшифровки хранится у нас и мы его никому не передаем. Даже сами наши адресаты, зашифровав сообщения нашим открытым ключом не смогут их затем расшифровать, т.к. не имеют закрытого ключа. Симметричность процесса шифрования позволяет выполнять и обратную операцию – шифрование с помощью закрытого ключа. В этом случае расшифровка должна выполняться открытым ключом, т.е. расшифровать такое сообщение могут все, у кого есть открытый ключ, потенциально все желающие, т.к. открытый ключ распространяется свободно и может быть общедоступен. Такое шифрование применяется для однозначной идентификации отправителя и называется цифровой подписью. Отправитель шифрует своим закрытым ключом свои идентификационные данные – имя и фамилию, название компании и т.п. Поскольку только у него храниться закрытый ключ шифрования, расшифровав персональную информацию отправителя открытым ключом, мы убеждаемся, что отправитель именно тот человек (банк, компания) за кого он себя выдает. Ранние версии программы PGP были бесплатными, однако ее современные реализации являются коммерческими. В качестве альтернативного программного пакета в рамках FSF (Free Software Foundation) и под лицензией GPL (General [GNU] Public License) распространяется и получает все большую популярность пакет GnuPG (GPG), реализующий алгоритм шифрования, аналогичный PGP. Шифрование почтовых вложений и самих писем с помощью этого пакета поддерживается популярным почтовым клиентом Mozilla Thunderbird. Программа GPG работает из командной строки и выполняет операции шифрования или дешифровки зашифрованных файлов. Для встраивания программы в почтовый клиент и автоматизации оперций шифрования/дешифровки разработан программный модуль Enigmail, делающий задачу отправки закрытой почты простой и удобной дополнительной функцией почтового клиента. 63 В ходе практического занятия отдельно будут рассмотрены процедуры шифрования персональной информации с помощью закрытого ключа, иначе говоря, создание цифровой подписи электронного сообщения и шифрования с помощью открытого ключа, полученного от адресата, сообщения для этого адресата. Генерации связанной пары ключей (открытого и закрытого), является необходимым условием выполнения описываемых процедур, но в данной работе не рассматривается и должна быть изучена самостоятельно, так же как и обмен открытыми ключами. Создание электронного письма с цифровой подписью. Для создания письма с цифровой подписью необходимо создать новое сообщение. На первом этапе рекомендуется в качестве получателя указать свой обратный адрес, т.е. отправлять письмо самому себе. В этом случае для расшифровки сообщения используется собственный открытый ключ, заботится о получении которого не приходится (ключи всегда генерируются парами). При подготовке сообщения для другого адресата необходимо предварительно передать ему ваш открытый ключ шифрования. Введите произвольный текст, под которым хотите подписаться и после того как текст будет готов, кликните мышкой на пиктограмме замка «OpenPGP», рис. 17. Следует отметить, что эта пиктограмма появляется в Mozilla Thunderbird только после установки программного модуля Enigmail. В раскрывшемся окне необходимо установить флажок в чек-боксе «Sing Message» подписать сообщение. Рис. 17. Формирование почтового сообщения с цифровой подписью. 64 После этого отправка сообщения на почтовый сервер, вызывает ответный запрос парольной фразы для закрытого ключа шифрования, рис. 18. Такой запрос возникает всегда при обращении к закрытому ключу (ключ хранится на вашем компьютере). Если необходимо отправить несколько почтовых сообщений с цифровой подписью, то, чтобы не вводить каждый раз пароль, в окне запроса можно установить флажок, разрешающий Enigmail запоминать пароль на некоторое время и автоматически его использовать. В примере, показанном на рис.2 это время составляет 5 минут. Рис. 18. Запрос парольной фразы для доступа к закрытому ключу. После ввода парольной фразы модуль Enigmail вычислит и подставит цифровую подпись прямо в текст сообщения. На рис. 19 показано какой вид получает подписанное электронное письмо. Рис. 19. Электронное письмо с цифровой подписью, подготовленное к отправке. 65 Заголовок в начале почтового сообщения «BEGIN PGP SIGNED MESSAGE», предупреждает о том, что ниже него содержится текст подписанный с помощью PGP. Сама цифровая подпись располагается ниже текста сообщения, между заголовками «BEGIN PGP SIGNATURE» и «PGP SIGNATURE». Получение подписанного электронного письма. При получении подписанного цифровой подписью электронного сообщения модуль Enigmail автоматически определяет тот факт, что письмо содержит цифровую подпись, об этом свидетельствует пиктограмма карандаша в заголовке письма (рис. 20) и сообщение о результате проверки цифровой подписи в статусной строке. Разумеется, проверка завершится успешно только в том случае, когда модуль Enigmail найдет на локальных дисках соответствующий открытый ключ шифрования для отправителя сообщения. Этот ключ должен быть получен и установлен заранее. Пиктограмма в нижнем правом углу письма может принимать несколько типов окраски. Зеленый цвет свидетельствует о том, что проверка завершена успешно. В статусной строке Enigmail, выводится информация о том, что полученное письмо подписано «Ignatev F Igor», идентификатор открытого (публичного) ключа, хранящийся в системе, для которого – KeyID =0xE89ED89ED. Рис. 20. Письмо с цифровой подписью, полученное адресатом. Если письмо будет содержать неправильную цифровую подпись, его внешний вид меняется: • • • В статусной строке Enigmail выводится предупреждение о том, что цифровая подпись неверная; Картинка в заголовке письма превращается в изображение сломанного карандаша; Пиктограмма в нижнем правом углу окашивается в красный цвет. Это – признак того, что вас хотят обмануть. Возможно полученное письмо во время пересылки (случайно или намеренно) подверглось изменению или человек, поставивший подпись, не тот, за кого он себя выдает. Наконец, результат проверки может быть 66 отрицательным, если отправитель использовал секретный ключ не соответствующий хранящемуся у получателя открытому ключу. Какова бы ни была причина, доверять полученному электронному сообщению нельзя. Подготовка зашифрованного электронного письма. Процедура создания зашифрованного электронного письма отличается от создания письма с цифровой подписью только тем, что после нажатия на пикограмму «OpenPGP» в окне рис. 17 необходимо выбрать пункт «Encrypt Message» - зашифровать сообщение. Модуль Enigmail при подготовке зашифрованного письма предлагает три варианта шифрования, рис. 21: • • • Зашифровать только текст сообщения, но не присоединенный файл (файлы); Зашифровать только присоединенный файл, оставив текст письма в открытом виде; Зашифровать письмо полностью – и текст письма, и присоединенный файл. Рис. 21. Выбор способа шифрования электронного письма. В случае выбора полного шифрования используется кодирование по стандарту PGP/MIME. Не все почтовые программы поддерживают этот стандарт. Об этом говорит текст предупреждения в окне выбора способа шифрования. На платформе ОС Windows лишь несколько программ могут работать с кодированными PGP/MIME сообщениями. Это Enigmail, Sylpheed, Pegasus и Mulberry. Ни одна из этих программ не является широко используемой в России. Для избежания проблем с кодировкой рекомендуется выбирать второй вариант и использовать английский алфавит для именования файлов. Если точно известно, что адресат имеет программу, поддерживающую стандарт PGP/MIME (например, Enigmail), то следует выбрать третий вариант. В этом случае имена файлов могут быть и в русской кодировке. Еще раз отметим важность шифрования электронного сообщения для вашего адресата открытым ключом, полученным от этого адресата и никаким другим. Для запоминания последовательности действий при шифровании можно потренироваться, отправляя зашифрованное сообщение самому себе. В этом случае шифровать его нужно собственным открытым ключом. Программа запрашивает каким из открытых ключей мы собираемся выполнять шифрование, если в хранилище ключей присутствует больше одного ключа. Процесс шифрования выполняется достаточно быстро и конечным его результатом будет письмо в таком виде, как оно показано на рисунке 22. При получении зашифрованного письма модуль Enigmail автоматически определит его как закодированное. Поскольку процесс расшифровки требует доступа к закрытому ключу, программа попросит ввести пароль. После правильного пароля выполняется 67 декодирование сообщения и оно становится доступно в исходном виде, рис. 23. На рисунке показаны признаки зашифрованного сообщения – пиктограмма ключа, и результата выполнения его расшифровки – зеленый замочек. Возможность запоминания пароля на некоторое время позволяет более комфортно работать с большим числом писем от одного адресата. Рис. 22. Зашифрованное электронное письмо. 68 Рис. 23. Расшифрованное сообщение. Контрольные вопросы 1. Почему для шифрования сообщений электронной почты применяется механизм асимметричного шифрования. 2. Что такое открытый ключ, в каких случаях он применяется. 3. Поясните понятие «цифровая подпись». Зачем нужна такая подпись. 4. Расшифруйте аббревиатуру PGP, GPG, в чем отличия программ, описываемых этими сокращениями. 5. Как называется программный модуль, обеспечивающий шифрование почтовых сообщений в программе Mozilla Thunderbird. 6. Существуют ли программы, взламывающие зашифрованные по ассимметричному алгоритму электронные документы. 7. Что в почтовом сообщении показывает факт присутствия цифровой подписи. 8. Почему мы не можем отправить сообщение адресату, зашифровав его своим открытым ключом. 9. Для чего нужна функция запоминания пароля. 10. Какие проблемы могут возникнуть при отправке зашифрованных сообщений с файлами, имеющими в названии кириллические символы. Выполнение работы Работа выполняется в парах отправитель – получатель. Каждый студент выступает для другого отправителем, сам же является получателем сообщений. 69 1. Убедиться, что в программе установлены необходимые ключи шифрования. Если их нет сгенерировать или получить их. 2. Подготовить для адресата письмо с цифровой подписью. Обменяться сообщениями. Убедиться в их успешном декодировании. Продемонстрировать результат преподавателю. 3. Подготовить для адресата зашифрованное сообщение без вложений. Обменяться сообщениями. Убедиться в их успешном декодировании. Продемонстрировать результат преподавателю. 4. Подготовить для адресата зашифрованное сообщение с вложением. Зашифровать только письмо. Обменяться сообщениями. Убедиться, что вложение доступно без дешифрования. Расшифровать сообщение. Убедиться в его успешном декодировании. Продемонстрировать результат преподавателю. 5. Подготовить для адресата зашифрованное сообщение с вложением. Зашифровать его полностью. Обменяться сообщениями. Расшифровать сообщение. Убедиться в его успешном декодировании. Продемонстрировать результат преподавателю. Литература 1. Д. Скембрей, С. Макклуре, Д. Куртц. Секреты хакеров. Проблемы и решения сетевой защиты. Пер. с англ. — М.: Издательство «Лори», 2001. — 464 с. 2. Э. Танненбаум. Компьютерные сети. Пер. с англ. — СПб.: Питер, 2002. — 848 с. 70