
- •4.1Безопасность ос семейства unix
- •4.1.1Средства идентификации и аутентификации
- •4.1.1.1Этап регистрации пользователя в системе
- •4.1.1.2Иерархия пользователей и групп системы unix
- •4.1.1.3Модули pam
- •4.1.2Безопасность файловой системы ос unix
- •4.1.2.1Разграничение доступа к ресурсам
- •4.1.3Механизмы взаимодействия пользователя с ресурсами
- •4.1.3.1Специальные атрибуты доступа
- •4.1.3.2Изменение прав доступа к ресурсам системы
- •4.1.4Подсистема регистрации и учета
- •4.1.4.1Основные файлы журналов событий
- •4.1.4.2Универсальная подсистема учета System Log
4.1.1.2Иерархия пользователей и групп системы unix
Для дальнейшего обсуждения идеологии системы безопасности и угроз для системы обеспечения контроля доступа необходимо рассмотреть механизмы реализации системы управления доступом к ресурсам, иерархию пользователей и групп пользователей в ОС UNIX с точки зрения безопасности.
Пользовательские идентификаторы представляются шестнадцатибитными целыми беззнаковыми числами и могут принимать значения от 0 до 65535. В операционных системах семейства UNIX нулевое значение пользовательского идентификатора зарезервировано за главным пользователем системы, обладающим особыми правами на все ресурсы системы, - суперпользователем. Соответствующая учетная запись обычно используется для целей системного администрирования. Однако некоторые приложения могут использовать учетную запись суперпользователя для гарантированного доступа к ресурсам. Идентификаторы от 1 до 9 обычно используются для системных функций. Идентификаторы рядовых пользователей, как правило, начинаются с 20, 100 или 500. Некоторые новые реализации UNIX поддерживают тридцатидвухбитные идентификаторы пользователей.
Все права пользователей по отношению к ресурсам системы в системе UNIX связаны не с входными именами учетных записей, а со значением UID, а также значением группового идентификатора - GID. Это означает, что пользователь с входным именем, отличным от root, может иметь все права суперпользователя, если будет иметь идентификатор пользователя равный нулю. И наоборот, учетная запись с входным именем root не будет иметь особых привилегий, если ее UID не установлен в ноль.
Информация о всех пользователях системы хранится в специализированном файле - базе данных учетных записей. Таким файлом для стандартных ОС семейства UNIX является файл /etc/passwd. Файлы /etc/passwd и /etc/group являются одними из важнейших в ОС UNIX, поскольку определяют базу зарегистрированных пользователей, с которыми связаны права на ресурсы системы.
Файл passwd может быть прочитан кем угодно. Это необходимо, чтобы могли работать программы, проверяющие имена и идентификаторы пользователей.
Файл паролей имеет жестко заданную структуру. Содержимое файла представляет собой таблицу. Каждая строка файла — это запись таблицы. Каждая запись состоит из нескольких полей. Поля файла passwd, как принято и в некоторых других служебных таблицах в Unix, разделяются двоеточием, поэтому двоеточия нельзя использовать ни в одном из полей. Всего имеется семь полей: имя пользователя, пароль, идентификатор пользователя, идентификатор группы, поле GECOS (оно же поле комментариев), домашний каталог и командная оболочка входа в систему.
В первом поле указывается имя пользователя. Поле имени является единственным полем, значение которого должно быть уникальным.
Во втором поле хранится пароль пользователя в хэшированном виде. Первые два символа хэшированного пароля являются затравкой (salt). При каждой смене пароля затравка выбирается случайным образом. Длина хэшированного пароля в этом поле всегда равна 13 символам, причем некоторые из символов, такие как двоеточие и одинарная кавычка, никогда не встречаются среди них. Поле пароля может быть пустым. Если изменить пароль, хранящийся в поле, добавив к нему какой-либо символ, например одинарную кавычку, то данная учетная запись окажется заблокированной, а соответствующий пользователь более не сможет войти в систему. Это достаточно старый прием, и в настоящее время его практически не используют. Современные системы для подключения пользователей к системе используют механизм /etc/shadow (о нем чуть позже), который предусматривает более правильные способы блокирования учетной записи без изменения пароля.
В третьем поле указывается идентификатор пользователя.
Четвертое поле содержит идентификатор группы (Group ID, GID). Группа, указанная в этом поле, называется первичной группой пользователя (primary group).
Пятое поле теперь называют полем комментариев, но первоначальное его название — GECOS, от «GE Consolidated Operating System». При запросе информации о пользователе через finger или иную программу содержимое данного поля теперь возвращается как истинное имя пользователя. Поле комментариев может быть пустым.
Шестое поле задает домашний каталог пользователя.
Седьмое и последнее поле задает командную оболочку входа в систему. Не всякую оболочку можно указать в этом поле. В зависимости от настроек системы в нем может быть указана только оболочка из списка допустимых оболочек.
Рисунок 4.35 – Пример файла /etc/passwd (при использовании теневых паролей)
Пример полей записи из файла /etc/passwd:
Stud1:Fixx2XB23eaBs:505:100:Student 1:/home/stud1:/bin/bash
_____ ____________ ___ ___ _______ __________ _______
Вх.имя Контр.сумма Ид-р Ид-р Имя Нач.каталог Ком.оболочка
пароля п-ля гр. п-ля
Все поля, кроме системного имени и значений пользовательского и группового идентификаторов в строках файла учетных записей пользователей ОС UNIX, необязательны.
Владельцем файла /etc/shadow является пользователь root и только он имеет право читать этот файл. Для его создания нужно взять имена пользователей и хэшированные пароли из файла passwd и поместить их в файл shadow, заменив при этом все хэшированные пароли в файле passwd символами х.
Файл теневых паролей во многих отношениях схож с файлом обычных паролей. Назначение первого и второго полей файла shadow такое же, как и у первого поля файла passwd.
С третьего поля начинается информация об устаревании пароля. В нем хранится число дней, прошедших с 1 января 1970 года до дня последнего изменения пароля.
Четвертое поле задает минимальное число дней, которые должны пройти, прежде чем можно будет вновь изменять пароль. Пока со дня последнего изменения пароля не пройдет столько дней, сколько указанно в этом поле, вновь изменять пароль нельзя.
Пятое поле задает максимальное число дней, в течение которых можно использовать пароль, после чего он подлежит обязательной смене. При положительное значении этого поля попытка пользователя войти в систему после истечения срока действия пароля приведет к тому, что команда password будет запущена не как обычно, а в режиме обязательной смены пароля.
Значение из шестого поля определяет, за сколько дней до окончания срока действия пароля следует начать выдавать предупреждение об этом. Получив пред упреждение, пользователь может начать придумывать новый пароль, который был бы легко запоминаем и достаточно надежен с точки зрения безопасности.
Седьмое поле задает число дней, начиная со дня обязательной смены пароля по истечении которых данная учетная запись блокируется. Иначе говоря, если по прошествии указанного количества дней, отсчитываемых со дня обязательной смены пароля, пользователь не зайдет в систему и не изменит свой пароль, то его учетная запись будет заблокирована.
В предпоследнем поле хранится день блокировки учетной записи.
Последнее поле зарезервировано и не используется.
Некоторые входные имена, описанные в первой записи каждой строки файла паролей, являются зарезервированными системными именами UNIX и непосредственно связаны со строением системы безопасности.
ОС семейства UNIX используют различные зарезервированные имена для выполнения системных функций. Ниже перечислены наиболее общие системные имена, используемые в различных реализациях UNIX:
Root |
суперпользователь, управляет доступом в систему и низкоуровневыми системными функциями; |
daemon или sys |
управление некоторыми сетевыми процессами, в некоторых реализациях отвечает также за другие системные сервисы; |
guest |
используется для посетителей, не имеющих собственных учетных записей; |
ftp |
используется для анонимного доступа к системе по протоколу передачи файлов FTP; |
uucp |
управление системой UUCP-сервиса, отвечающего за передачу почты; |
news |
используется системой новостей Usenet; |
nobody |
пользователь, не имеющий собственных файлов в системе, часто используется по умолчанию для непривилегированных действий. |
Перечисленные системные учетные записи не имеют реальных имен пользователей в соответствующих полях файла учетных записей. Знак "*" в поле, хранящем контрольную сумму пароля для учетной записи, предотвращает возможность подключения пользователей к UNIX под подобными системными именами.
Каждый пользователь ОС UNIX входит в одну или несколько групп. С точки зрения системы безопасности в ОС UNIX под группой следует понимать совокупность общих атрибутов, определяющих права доступа к ресурсам операционной системы, присущую некоторому числу пользователей системы.
Группы в UNIX предназначены для организации равноправного доступа части пользователей системы к каким-либо общим файлам или устройствам и облегчения администрирования. Путем помещения пользователя в соответствующую группу можно дополнить или ограничить его полномочия над какими-нибудь системными ресурсами.
Как и в случае с отдельными пользователями, любая группа имеет имя и идентификационный номер (GID). Групповой идентификатор - целое шестнадцатибитное число. Каждый пользователь входит в первичную группу, идентификационный номер которой указан в файле /etc/passwd для каждой учетной записи.
Данные по всем группам пользователей в системе, соответствующие им групповые идентификаторы и данные о принадлежности пользователей к той или иной группе содержатся в файле описания групп /etc/group.
Файл /etc/groups по своей природе похож на файл паролей.
Каждая запись файла /etc/group состоит из четырех полей, разделенных двоеточиями. Первое поле задает имя группы. Подобно имени пользователя, оно облегчает жизнь системных администраторов (символьные имена запоминаются куда легче числовых идентификаторов).
Второе поле обычно всегда пустое, так как механизм паролей для групп обычно не используется, однако если данное поле не пусто и содержит пароль, то к группе может присоединиться любой пользователь. Для этого нужно выполнить команду newgrp с именем группы в качестве параметра, после чего ввести правильный пароль. Если пароль для группы не задан, то присоединиться к ней могут только пользователи, перечисленные в списке членов группы.
Третье поле задает идентификатор группы (Group ID, GID). Смысл его такой же, как и у идентификатора пользователя. Удобней, когда он уникальный, хотя это и необязательно.
Последнее поле представляет собой список имен пользователей, принадлежащих к группе (пробелы между запятой и первым или последним символом имени обычно игнорируются, но для гарантированной работы всех программ лучше не допускать их появления). Имена пользователей перечисляются через запятую без пробелов. Указывать пользователя в списке членов его первичной группе не обязательно, однако это не повредит и может уберечь от некоторой путаницы в дальнейшем. Первичная группа пользователя указывается (в обязательном порядке) в файле passwd и назначается при подключении пользователя к системе исходя из этой информации Соответственно, если изменить первичную группу пользователя в файле passwd, то пользователь более не сможет присоединиться к своей бывшей первичной группе
Пользователи UNIX являются членами групп, описанных в /etc/group в дополнение к первичной группе, указанной в /etc/passwd. Описание соответствия группового идентификатора GID и имени пользователя в /etc/group сделано для удобства пользователей и администратора.
Пользователи могут одновременно являться членами нескольких различных групп.
Рисунок 4.36 – Принадлежность пользователя группам
Во многих системах UNIX группа с нулевым идентификатором имеет специальное значение и обычно называется wheel. Только входящие в группу wheel пользователи могут получить права системного администратора. Такое дополнительное условие положительно сказывается на защищенности системы безопасности от попыток несанкционированного получения полномочий суперпользователя зарегистрированными пользователями системы.
Существует принципиальная разница в работе с группами в основных ветвях реализаций ОС UNIX.
В более ранних, чем System V Release 4, реализациях UNIX фирмы AT&T, пользователь в каждый момент времени мог принадлежать только одной из групп системы. Для изменения своей текущей группы было необходимо воспользоваться командой newgrp.
В BSD UNIX и System V Release 4 были введены расширенные возможности управления группами пользователей. В таких системах пользователь может одновременно являться членом разных групп.
В процессе подключения любого пользователя к системе, просматривается база групп в файле /etc/group и определяется первичная группа из файла учетных записей /etc/passwd. При проверке прав доступа пользователя к каким-либо ресурсам системы проверяются права доступа для всех групп, в которые входит пользователь.
Механизм групп позволяет выбрать одну из двух различных схем: группа по умолчанию и частные группы пользователей.
По команде newgrp пользователь становится членом указанной в команде группы, при этом данная группа становился для данного пользователя группой входа в систему (login group). При этом пользователь продолжает оставаться членом тех групп, в которые он входил до выполнения команды newgrp. Группа входа в систему является группой, которая (если атрибуты каталога не предписывают ничего другого) становится групповым владельцем файлов, создаваемых пользователем. Если требуется, чтобы пользователи могли присоединяться и покидать группу без вмешательства системного администратора, то этой группе можно назначить пароль.
Преимущество схемы с группой по умолчанию заключается в том, что она облегчает совместное использование файлов, так как при ее использовании не нужно заботиться о правах доступа к ним. Эта схема подразумевает открытый подход к системе по принципу «разрешено все, что не запрещено».
Частные группы пользователей обладают именами, совпадающими с именами пользователей. Частная группа делается группой входа в систему, поэтому по умолчанию, то есть если атрибуты каталога не предписывают ничего другого, она назначается в качестве группы-владельца всех файлов данного пользователя. Таким образом, пользователю david ставится в соответствие группа david, которая назначается группой-владельцем всех файлов этого пользователя.
Преимущество частных групп пользователя состоит в том, что пользователям не нужно думать об ограничении доступа к своим файлам: по умолчанию доступ к пользовательским файлам с самого момента их создания будет ограничен: пользователь, как правило, может читать или изменять только принадлежащие ему файлы; кроме того, создавать файлы он может только в своем домашнем каталоге. Данное поведение по умолчанию может быть изменено системным администратором или пользователем, причем как на уровне отдельного файла, так и на уровне каталога.
Различие между группой по умолчанию и частными группами пользователей заключается в степени открытости этих двух схем. В случае схемы с группой по умолчанию любой пользователь может читать (а часто и изменять) файлы другого пользователя. С частными же группами чтение или запись файла, созданного другим пользователем, возможны лишь если его владелец явно предоставил права на эти операции остальным пользователям.
С точки зрения системы безопасности, файлы /etc/passwd и /etc/group являются одними из важнейших в ОС UNIX. Если злоумышленник получит возможность изменить содержимое /etc/passwd, то он сможет легко получить права суперпользователя, либо изменив содержимое контрольной суммы поля пароля системного администратора, чтобы войти под его учетной записью с паролем, контрольная сумма которого записана, либо изменив значение своего пользовательского идентификатора на нулевое и тем самым указав свою учетную запись как учетную запись суперпользователя.
Если злоумышленник получит возможность изменить содержимое файла /etc/group, то он сможет добавить себя в любую группу. Путем добавления себя в соответствующую группу, злоумышленник сможет получить доступ к файлу /etc/passwd и затем получить права суперпользователя.
Уже отмечалось, что проверка прав доступа к ресурсам в системе UNIX организована на основе контроля значений пользовательского (UID) и группового (GID) идентификаторов процесса. Процессы в системе UNIX, в действительности, имеют два класса пользовательских и групповых идентификаторов одновременно. Это позволяет гибко делегировать права на отдельные ресурсы системы под контролем специального приложения, не давая пользователю всех прав на несанкционированные (запрещенные в рамках работы данного приложения) действия с данными ресурсами.
Каждому процессу системы поставлены в соответствие действительные и эффективные пользовательские и групповые идентификаторы. Действительные идентификаторы показывают UID и GID пользователя, под которыми пользователь был зарегистрирован в системе. Эффективные значения идентификаторов определяют права, присвоенные выполняемому процессу.
Обычно действительные и эффективные значения идентификаторов процессов совпадают. Это означает, что выполняемый пользователем процесс имеет права, совпадающие с правами самого пользователя, полученными в момент подключении. Нередко для контроля доступа к ресурсам, обычно недоступным, пользователю бывает необходимо переустановить идентификатор пользовательского процесса.
Для выполнения команд с правами другого пользователя можно выйти из системы, а затем снова подключиться под требуемой учетной записью. После этого, для запускаемых пользователем процессов будут устанавливаться новые значения действительных и эффективных идентификаторов пользователя и группы. Система будет считать, что работает новый пользователь.
Для временного изменения действительного значения UID и изменения текущей учетной записи пользователя, можно воспользоваться утилитой /bin/su. Эта утилита запрашивает входное имя и пароль требуемой учетной записи, проверяет их и запускает новую командную оболочку с действительным пользовательским идентификатором требуемого пользователя. После завершения работы с особыми правами доступа пользователь должен вернуться к старой оболочке со старым значением действительного UID при помощи команд exit, bye или logout.
Вызов команды su без аргументов равносилен ее вызову с аргументом root. Наличие дефиса между su и именем пользователя говорит команде, что смена пользователя должна осуществляться по полной программе, , то есть со сменой пользовательского окружения. Без указания дефиса в результате выполнения su пользователь станет другим пользователем, но окружение останется его изначальным. В частности, значение переменной PATH останется прежним и не будет заменено на значение PATH пользователя, которым он стал.
Наиболее правильным считается использование команды sudo. Данная команда позволяет избранным пользователям выполнять некоторые программы на правах суперпользователя, причем у обратившегося к этой команде пользователя запрашивается не пароль суперпользователя, а его собственный пароль. Используется sudo подобно команде su. Пользователь вводит sudo команда_для_выполнения, затем свой пароль, и если ему это разрешено, указанная команда выполняется в контексте привилегий суперпользователя.
Множество системных утилит UNIX требуют своего выполнения с наивысшими правами суперпользователя, поскольку работают с важнейшими ресурсами операционной системы. Иногда необходимо обеспечить возможность запуска одной из подобных утилит помощнику системного администратора или простому пользователю. При этом не всегда разумно давать пользователю полный доступ ко всей системе с такими правами и раскрывать ему пароль суперпользователя.
Проблема решается с использованием специальных атрибутов у программ, при выполнении которых происходит переопределение значений эффективных пользовательских или групповых идентификаторов на заданные. По завершению процессов с атрибутами переопределения эффективных пользовательского или группового идентификаторов происходит восстановление исходных значений идентификаторов.
ОС UNIX контролирует права доступа процесса исходя из эффективных значений идентификаторов. При выполнении задач с атрибутами переопределения эффективных идентификаторов устанавливается эффективное значение пользовательского или группового идентификатора процесса, равное значению UID или GID владельца программы. Процессы с атрибутами переопределения эффективных пользовательских или групповых идентификаторов называют setuid- или SUID-процессами и setgid- или SGID-процессами. При этом, действительные значения идентификаторов остаются равными значению идентификатора пользователя, запустившего данный процесс и позволяют при необходимости различать статус пользователя процесса.