День 15. Возвращаюсь назад: привет Linux
Автор статьи никого не призывает к правонарушениям и отказывается нести ответственность за ваши действия. Вся информация предоставлена исключительно в ознакомительных целях. Все действия происходят на виртуальных машинах и внутри локальной сети автора. Спасибо!
За предыдущие 14 дней многое узнал. Но фактически, я следовал инструкциям из книг и статей, так как имею большие пробелы в знаниях по этой теме. Таким образом знания не приобретёшь. Во всяком случае время потеряно не зря – понял, что необходимо подтянуть. Для этого составил небольшой план на основе учебных планов по специальности «Компьютерная безопасность» различных вузов. Вот эти 14 направлений, пробелы в которых необходимо заполнить:
- Операционные системы (День 15, День 16, День 17);
- * Методы анализа данных;
- Язык ассемблер (День 18, День 19, День 20, День 21, День 22);
- Системы управления базами данных (День 23, День 24, День 25, День 26);
- Модели безопасности компьютерных систем (День 27);
- * Наука о данных (День 28);
- * Современные технологии программирования и обработки информации;
- Основы построения защищенных компьютерных сетей;
- Компьютерные сети;
- Защита в операционных системах;
- Защита программ и данных;
- Защита серверов и рабочих станций;
- Системы обнаружения атак;
- Анализ программных реализаций алгоритмов защиты.
* — необязательные.
Для каждого пункта расписал перечень вопросов, на которые необходимо знать ответ. Начну с операционных систем.
За основу возьму книгу Эндрю Таненбаума «Современные операционные системы» и начну разбираться с 10 и 11 главой (конкретно об Linux, Android и Windows). Если что-то будет не понятно, то буду возвращаться к конкретным разделам. Попробую так, посмотрим, что из этого выйдет.
Изучение конкретных примеров: UNIX и Linux
Кстати, по данной теме есть две интересные, художественные книги. Первая написана Уолтером Айзексоном «Инноваторы. Как несколько гениев, хакеров и гиков совершили цифровую революцию» об истории развития компьютеров, сетей и интернета. В ней так же уделено внимание Биллу Гейтсу и Линусу Торвальдсу (и многим другим значимым фигурам). Вторая, самим Линусом Торвальдсом «Ради удовольствия: Рассказ нечаянного революционера» в формате биографии.
Первые 15 страниц десятой главы книги Таненбаума достаточно понятны и не вызвали необходимость вернуться к предыдущим главам.
Под блочным устройством понимается, например, жесткий диск, CD-ROM и др. Под символьным устройством – модем, терминал и др. Первые буферизуются, вторые – нет.
Один процесс имеет один счетчик команд, который отслеживает следующую команду. Процесс может создавать дополнительные потоки. Кроме процессов, есть демоны (тоже процессы, но фоновые), которые создаются (чаще всего) при загрузке системы. Типичным демоном является cron, который «просыпается» раз в минуту для проверки наличия задания на это время.
Системный вызов fork создает клон исходного процесса, который называется дочерним процессом (породивший, естественно, называется родительским). Дочерний и родительский процессы имеют собственные образы памяти, поэтому они не зависят друг от друга.
Каналы, по которым «общаются» процессы, называют трубами (pipes). Например, следующая строка (команда):
head info | sort
Создает два процесса head
и sort
и соединяет их каналом. До тех пор, пока head
не выполнит свою задачу, канал заблокирован. После разблокировки, программа sort обрабатывает принятые данные. Таким образом, временные файлы/переменные не используются.
В разделе 10.4 разбирается управление памятью в Linux. Знание языка программирования С в этом разделе играет на руку.
Основная идея подкачки в Linux: процессу не обязательно находиться целиком в памяти, чтобы выполняться.
В 10.5.2. про работу с сетью. Сокеты образуют пользовательских интерфейс для работы с сетью. Сокет, если так можно выразиться, находится на границе пространства пользователя и пространства ядра.
Для каждого файла ОС Linux хранит тип файла, размер, последнюю модификацию и другие полезные сведения, выводимые по команде:
$ stat file.txt
К слову о файлах и системных вызовах. Системный вызов lseek
, который применяется, если необходимо получить доступ к произвольной части файла, единственный (относящийся к файловой системе), который не вызывает перемещение блока головок диска. Вызов lseek
обновляет хранимое в памяти число, которое указывает позицию в файле.
Сначала я подумал, что индексный дескриптор (Inode
в выводе stat
) и файловый дескриптор это одно и то же. Но нет, это не так. Файловый дескриптор равен 0, для потока ввода, 1 для вывода и 2 для вывода ошибок. Пример работы каналов в Linux:
$ sort < in
Процесс программы sort будет иметь дескриптор 1 (вывод, т.е. в него выводятся данные). Дескриптор файла in будет равен 0 (ввод).
Нужно попробовать инструмент strace иltrace для отслеживания системных вызовов и динамических библиотек, соответственно (https://habr.com/ru/company/otus/blog/525012/).
В Linux все каталоги и устройства представляются в виде файлов, поэтому, как и все файлы, они имеют i-узлы.
Суперблок хранится в начале каждой группы блоков (кроме первой, там загрузчик). Т.е. суперблок является начальной точкой файловой системы.
Про файловую систему ext2
В файловой системе ext2, соответствующие каталогам i-узлы разбросаны по всем группам блоков. Обычные файлы размещаются (по возможности) в той же группе блоков, что и каталог, а данные файла, в том же блоке, что и файл (если есть место). Когда выделяются новые блоки под файлы, ext2 делает упреждающие выделение нескольких дополнительных блоков (preallocates) для этого же файла, чтобы минимизировать фрагментацию в будущем. Тем самым повышается производительность.
Поиск файлов осуществляется линейно (для пути usr/test/file
будут поочередно искаться i-узлы каталогов, потом файла). При этом последние запросы кэшируются. Если кратко, использование относительного пути при обращении к файлу более удобно не только для пользователя, но и для системы, так как сокращает количество работы.
Так же существует таблица описания открытых файлов для случая, если два процесса обращаются к одному файлу (например, записывают в него данные).
Про файловую систему ext4
Минусом ext2 является ее задержка записи данных на диск (для повышения производительности). Но такое решение критично для предотвращения потерь при сбое системы. Для повышения отказоустойчивости, используются журналируемые файловые системы. Такими являются ext3 и ext4. Суть журналируемой системы: составление журнала, в котором описываются все действия файловой системы. В случае сбоя, система проверяет этот журнал и, если в нем есть не записанные на диск изменения, производит запись.
Основным изменением в ext4, является появление экстентов. Это непрерывные блоки хранилища. За счет этого уменьшается фрагментация и допускается хранение более объемных файлов.
Файловая система /proc
В Linux есть еще одна файловая система — /proc
. В ней для каждого процесса создается каталог. Имя каталога формируется из PID.
Безопасность в Linux
Основным механизмом является наличие UID и GID у каждого процесса. Таким образом определяется набор разрешений для процесса/файла и т.д. Существуют три вида доступа: r
, w
и x
. Доступ задается 9-ю битами (по три бита на категорию: владелец, группа, посторонний).
Если все биты нулевые, то есть ни у кого нет доступа к файлу, то это, вероятно, файл-пустышка, который используется в качестве блокировки. То есть, если две программы одновременно попытаются создать одинаковый файл, то успешно закончит эту операцию первая из них. Несмотря на запрет доступа для всех, владелец все равно имеет к нему доступ.
У суперпользователя UID равен 0.
Каталоги имеют те же режимы доступа, только вместо выполнения (третий бит категории), разрешается поиск в нем.
У специальных файлов такие же биты защиты. Например, для принтера. Если все пользователи получат доступ к нему напрямую, будет хаос. Не все так плохо. Добавили специальный бит, чтобы и другие пользователи могли получить доступ к принтеру (становясь на время владельцем исполняемого файла).
Достаточно на сегодня (хотя это сегодня продлилось две недели). Завтра перейду к андроиду или сразу к Windows. Посмотрим.
Ссылки дня:
- Про strace: https://habr.com/ru/company/otus/blog/525012/