
- •В.В. Бакланов
- •Защитные механизмы
- •Операционной системы
- •Екатеринбург
- •Оглавление
- •Введение
- •1. Пользователи и их права
- •Учетные записи пользователей и работа с ними
- •Video::18:
- •Ivanov:X:1002:101::/home/ivanov:/bin/bash
- •1.2. Процедура регистрации и ее безопасность
- •VI /etc/passwd
- •Initrd /boot/initrd.Img–2.6.18–5–686
- •Права доступа к файлам
- •Комбинированные права доступа
- •1.5. Решение практических задач на разграничение доступа
- •Использование механизма sudo
- •2. Безопасное управление процессами
- •2.1. Общие сведения о процессах
- •Virtual memory (kbytes, -V) unlimited
- •2.2. Средства наблюдения за процессами
- •2.3. Переменные окружения
- •2.4. Способы автоматического запуска и остановки программ
- •Id:3:initdefault:
- •Id:3:initdefault:
- •2.5. Периодически запускаемые процессы
- •2.6. Запуск и остановка программ в интерактивном и фоновом режимах
- •2.7. Средства взаимодействия между процессами
- •2.8. Перенаправление ввода/вывода
- •2.9. Файловая система /proc как «зеркало» процессов
- •2.10. Терминальный режим и консольные атаки
- •16:10:12 Up 15 min, 4 users, load average: 0,00, 0,00, 0,01
- •Ivanov tty2 - 16:07 3:08 0.01s 0.01s -sh
- •Ivanov tty2 2008-11-05 16:07
- •2.11. Сокрытие процессов
- •2.12. Аудит событий и его безопасность
- •3. Работа с объектами файловой системы
- •3.1. Действия над обычными файлами
- •3.2. Работа со специальными файлами устройств
- •255 Heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
- •255 Heads, 63 sectors/track, 91201 cylinders, total 1465149168 sectors
- •255 Heads, 63 sectors/track, 38913 cylinders, total 625142448 sectors
- •16 Heads, 32 sectors/track, 988 cylinders, total 505856 sectors
- •3.3. Монтирование файловых систем
- •3.4. Копирование и запись данных
- •2,0,0 200) 'Ata ' 'wdc wd3200bevt-2' '11.0' Disk
- •1000,0,0 100000) 'Hl-dt-st' 'dvdram gma-4082n' 'pt06' Removable cd-rom
- •3.5. Использование «жестких» и символических ссылок
- •4. Безопасность файловых систем ext*fs
- •4.1. Архитектура файловых систем ext*fs
- •Inode count: 438048
- •Inodes per group: 8112
- •Inode blocks per group: 507
- •Inode: 131329 (0x00020101)
- •Indirect block:
- •131329 Drwxr-xr-X 2 root root 4096 Мар 18 17:42
- •Inode: 527744 (0x00080d80)
- •Indirect block:
- •0X024f9040 73 79 6e 63 0a 00 00 00 : 00 00 00 00 00 00 00 00 sync............
- •4.2. Временные отметки файлов
- •4.3. Алгоритмы логического удаления и восстановления файлов
- •Сетевые возможности операционных систем linux
- •5.1. Контроль и настройка сетевых интерфейсов
- •Inet addr:192.168.0.4 Bcast:192.168.0.255 Mask:255.255.255.0
- •Interrupt:5 Base address:0x4000
- •Inet addr:127.0.0.1 Mask:255.0.0.0
- •Ifconfig eth0 -arp
- •Inet addr:192.168.0.4 Bcast:192.168.0.255 Mask:255.255.255.0
- •Interrupt:5 Base address:0x4000
- •Ifconfig eth0 promisc -arp
- •Iwconfig ath0 mode adhoc channel 1 essid “abcd”
- •5.2. Разведка сети
- •5.3. Перехват и анализ сетевого трафика
- •Лабораторный практикум
- •Общие требования
- •Памятка обучаемым
- •Выполнение работы
- •Лабораторная работа № 2 «Исследование архитектуры файловых систем ext*fs»
- •Контрольные вопросы
- •Контрольные вопросы
- •Лабораторная работа № 4 «Реализация политики разграничения доступа средствами ос Linux»
- •Временная нейтрализация парольной защиты
- •Контрольные вопросы
- •Лабораторная работа № 5 «Исследование процессов в ос Linux» Подготовка к работе
- •Наблюдение за файловой системой /proc
- •Просмотр и анализ информации о процессах
- •Управление процессами
- •Работа с консолями
- •Работа с каналами
- •Исследование опасных команд
- •Контрольные вопросы
- •ЛаборАторная работа № 6 «Исследование сетевых возможностей ос Linux»
- •Ifconfig eth0 –arp
- •Контрольные вопросы
- •Лабораторная работа № 7 «Исследование беспроводной сети WiFi под управлением ос Linux»
- •Interrupt:19
- •Inet addr:127.0.0.1 Mask:255.0.0.0
- •Iwconfig ath0 channel 1 essid "abcd"
- •Iwlist ath1 scan
- •Iwconfig ath0 key off
- •Iwconfig ath0 key 0123-4567-89ab-cdef
- •Контрольные вопросы
- •Лабораторная работа № 8 «Наблюдение и аудит в ос Linux»
- •Библиографический список
2. Безопасное управление процессами
Операционные системы на базе ядра Linux являются многозадачными системами общего назначения, и управление процессами в них напрямую связано с обеспечением безопасности обрабатываемой компьютерной информации. Так, угрозами являются несанкционированный запуск опасного процесса, необоснованный и сверхнормативный захват процессорного времени, доступ пользовательского процесса в чужое адресное пространство и многое другое.
Процессом называется компьютерная программа на этапе исполнения. Но процесс – это не только действие, но и ресурсы, которыми операционная система наделяет программу. К числу этих ресурсов в первую очередь относится адресуемая виртуальная память, в которую загружаются программный код, данные (константы и переменные), библиотечные функции, стек и вспомогательная информация. Сложная программа может создать несколько одновременно выполняемых процессов. Повторяющийся запуск на исполнение одной и той же программы также создает множество независимых процессов. Поэтому правильнее назвать процессом выполняющийся экземпляр программы.
2.1. Общие сведения о процессах
По отношению к пользователю процесс может быть интерактивным и фоновым. Процесс может запускаться из ядра операционной системы либо из программного файла. В ОС Linux существует три вида процессов, отличающихся привилегиями, режимом исполнения и наличием порождающих объектов в файловой системе.
Системные процессы. Они не имеют собственных исполняемых файлов и запускаются из ядра операционной системы. Минимальный комплект системных процессов должен обеспечить функционирование виртуальной памяти, многозадачности и файловой системы. Системные процессы стартуют при загрузке операционной системы и выполняются в течение всего времени ее работы. Системные процессы являются частью ядра и всегда расположены в оперативной памяти. Системные процессы не имеют соответствующих им программ в виде исполняемых файлов и запускаются особым образом при инициализации ядра системы. Выполняемые инструкции и данные этих процессов находятся в ядре системы, таким образом, они могут вызывать функции и обращаться к данным, недоступным для остальных процессов. Эти процессы не общаются с пользователем, и он может узнать об их существовании, только просматривая список процессов. Рассматриваемая ниже команда ps –ef, начиная с версии 2.4 ядра Linux, показывает процессы ядра в квадратных скобках (ранее имена «ядерных» процессов отображались в круглых скобках).
Есть один процесс, который по своей сути является системным, но запускается не из ядра, а из отдельного исполняемого файла с именем /sbin/init. Этот процесс является прародителем всех остальных процессов. Идентификатор процесса (PID) у него равен единице, несмотря на то, что до него загружаются процессы ядра. Принудительное завершение этого процесса командой kill -9 1 , по сути, означает аварийный останов системы, но ОС Linux не позволяет сделать это даже администратору.
Сервисные службы или демоны. Даже если компьютер не выполняет функции сервера, система нуждается в существовании множества процессов для «самообслуживания»: направления заданий на печать и обеспечения их очереди, запуска заданий по расписанию, проверки целостности файловой системы и т. д. Набор утилит и системных программ, предназначенных для предоставления таких услуг, принято называть службами (сервисами) или демонами (от английского daemon). Последнее название не связано с какими-либо злыми мифическими духами и представляет собой акроним от Disk And Execution MONitor. Это процессы, которые выполняются в фоновом режиме, не связаны с конкретными терминалами, не общаются с обычными пользователями напрямую и не могут управляться ими.
Обычно демон активизируется в процессе загрузки системы после инициализации ядра, по инициативе администратора, по запросу пользовательской программы, по сетевому запросу или по наступлению какого-либо системного события. Каждому демону соответствует исполняемый файл. Идентифицировать большинство демонов можно по завершающему имя файла символу d: syslogd, inetd, telnetd и др.
Большинство демонов запускаются при старте операционной системы, после системных процессов. Их запуск происходит при участии процесса init из загрузочных сценариев (порядок загрузки системы изложен ниже). Администратор имеет право «вручную» запускать сервисы с помощью команды start и завершать их командой stop, но наличие данных команд зависит от используемого дистрибутива ОС Linux. Впрочем, по отношению к демонам можно использовать и обычную форму запуска в виде имени файла в командной строке. Завершить сервис, как и обычный процесс, можно направлением ему сигнала на завершение работы при помощи команды kill <PID> (см. ниже).
Пользовательские процессы. Запускаются из исполняемого (бинарного) файла пользователем. Они могут выполняться в интерактивном или фоновом режиме, и срок их выполнения обычно ограничен продолжительностью сеанса работы пользователя. Впрочем, как будет показано ниже, фоновые процессы продолжают существовать и после завершения пользовательского сеанса. Пользовательские процессы наследуют идентификатор пользователя и, как правило, имеют соответствующие права на доступ к объектам. Но некоторые пользовательские процессы могут при выполнении иметь больше прав, чем имеет создавший их пользователь.
Самый важный пользовательский процесс – командный интерпретатор (оболочка или шелл), обеспечивающий диалоговый режим работы с пользователем. К моменту, когда система предоставит пользователю право управлять собой, в ней уже будет существовать несколько десятков системных и сервисных процессов.
Система изолирует пользовательские процессы друг от друга, от системных процессов и демонов. Каждый процесс выполняется в своем виртуальном адресном пространстве и других процессов «не видит». В многозадачной операционной системе пользовательские процессы не имеют права читать данные чужого процесса, записывать свои данные в его адресное пространство, отбирать у других задач вычислительное время и право доступа к устройствам ввода-вывода.
Выполнение процессов может происходить в одном из двух возможных режимах: в режиме ядра либо в пользовательском режиме. В режиме ядра процесс может выполнять любые привилегированные инструкции по управлению центральным процессором. В пользовательском режиме выполняются обычные, непривилегированные инструкции. Любая программа, созданная для многозадачной операционной системы, использует вызовы системных функций. Большинство таких функций (обычные вычислительные процедуры, операции со строками и др.) не требуют каких-либо исключительных привилегий и могут выполняться в пользовательском режиме. Но создание, модификация или удаление объектов файловой системы, монтирование дисковых устройств, создание учетных записей и многое другое требуют системных привилегий.
Управление процессами осуществляется частью ядра, именуемой планировщиком задач или просто планировщиком (scheduler). В ОС Linux реализована принудительная или, по иному, вытесняющая многозадачность, когда планировщик задач в замкнутом цикле передает управление следующему процессу, не «спрашивая» согласия на это у предыдущего процесса. Для того чтобы переключить центральный процессор с одной задачи на другую, также требуется время. Планировщик задач обычно расходует 5-7 % процессорного времени на то, чтобы сохранить в памяти содержимое предыдущей задачи, загрузить в регистры центрального процессора адреса следующей задачи и передать ей управление. Каждый процесс выполняется в течение нескольких миллисекунд, и у пользователя создается
представление, что компьютер способен выполнять все задачи одновременно.
Процесс является носителем определенного приоритета, nice number, который принимается во внимание планировщиком задач при выборе очередности и продолжительности запуска. Приоритет процесса – это его право распоряжаться временем центрального процессора. Этот приоритет никак не связан с правами доступа к файлам. Некоторые системные процессы должны иметь большой приоритет, но если они будут владеть большей частью процессорного времени, у компьютера не останется возможностей для выполнения пользовательских задач, ради которых он, собственно, и работает. Поэтому системные процессы, как правило, не злоупотребляют своими полномочиями. Процессы, созданные в одинаковых условиях обычным пользователем и администратором системы, имеют примерно равные приоритеты. Избыточный приоритет – весьма опасная вещь, способная приводить к атакам на отказ в обслуживании.
Абсолютный приоритет – это число, находящееся в диапазоне от –20 (наивысший приоритет) до 19 (наименьший). Обычным образом запускаемая программа имеет нулевой приоритет. Именно такое значение будет выведено, если ввести команду nice без аргументов. Положительное значение этого фактора свидетельствует о понижении приоритета, и наоборот. Команда
nice -n <command>
позволяет задать приоритет, с которым будет выполняться процесс после запуска.
Утилита renice позволяет изменить приоритет (точнее – его относительное значение, которое называют фактором уступчивости) уже запущенного процесса. Привилегия суперпользователя позволяет запускать процессы с отрицательным фактором уступчивости или понижать это значение у выполняющегося процесса. Обычные пользователи и их процессы не имеют прав захватывать лишнее время у центрального процессора. Это означает, что пользователь может только замедлять свой процесс. Так, команда
renice +10 <PID>
позволит пользователю замедлить свой процесс на 10 пунктов (сколько миллисекунд потеряет при этом квант процессорного времени, выделенный этому процессу, зависит и от аппаратной платформы, и от загрузки системы). Но вернуть приоритет замедленного процесса в прежнее значение пользователь уже не сможет – ему запрещено указывать отрицательные значения фактора уступчивости.
С помощью утилиты snice можно изменить приоритет всем процессам, созданным определенным пользователем:
snice +5 ivanov
Существует категория так называемых «жадных» программ, которые способны захватывать ресурсы компьютерной системы в ущерб другим процессам. Например, программа, имеющая право повышать свой приоритет, может захватить все время центрального процессора и уйти в вечный цикл. Но пользовательским процессам такие проделки запрещены. В то же время «жадная» программа может затребовать непомерно большой объем виртуальной памяти и вызвать ее дефицит. Такой жадности способствует непонятная расточительность универсальных операционных систем, и Linux здесь не является исключением. Воспользовавшись внутренней командой оболочки ulimit –a , можно отобразить действующие в системе ограничения по процессорному времени (cpu time), виртуальной памяти (virtual memory) и размеру создаваемых файлов (file size). На рис. 2.1 можно видеть, что по умолчанию эти и некоторые иные ресурсы ничем не ограничены (unlimited).
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 447