временно «закроем» для пользователей внешнюю границу «домашнего» каталога. Переключившись в консоль любого пользователя, убедимся, что пользователи при запуске команд ничем, кроме обычных прав доступа, не ограничены. Пользователи не могут преодолеть воздвигнутый барьер с помощью команды cd.., но «перепрыгнуть» через него в любой доступный каталог (например, командами cd / или cd /tmp) вполне в состоянии. Но вернуться в свои каталоги пользователи уже не смогут. Как видно, создание «тюрьмы» для внутренних пользователей перспектив не имеет.
Однако свобода перемещения внешних пользователей по дереву каталогов должна быть ограничена. Например, клиенты Web-сервера или FTP-сервера ни в коем случае не должны получать доступ за пределы «гостевых» каталогов.
Этот подход предусматривает запуск специальной утилиты, которая называется chroot (change root – изменить корневой каталог). С ее помощью некоторый системный сервис, обслуживающий сетевых клиентов, «запирают» в специально созданной «ветке» дерева каталогов, объявляя точку монтирования «корнем» дерева. Делается это с помощью команды
chroot <dir> <command>
Пользователь, попавший в это пространство, может перемещаться в пределах этой «ветки», не угрожая основной части файловой системы. Подняться выше директории, которая объявлена корневой, пользователь не может, поскольку родительским каталогом для «корня» он сам и является. Для правдоподобия подкаталоги этой резервации называют по аналогии с основными каталогами файловой системы и копируют в них все необходимые для работы и камуфляжа файлы.
Файловые «тюрьмы» не являются местами лишения свободы. Они должны содержать внутри себя все необходимое для добросовестного пользователя – подкаталоги, программы, библиотечные, конфигурационные и справочные файлы.
Права на доступ к уже существующему файлу или каталогу можно изменять. Администратор может изменить права доступа к любому файлу, пользователь – только к своим файлам. Производится это с помощью утилиты chmod (change mode – изменить режим). У этой команды несколько форм записи, с которыми можно познакомиться с помощью краткого справочника в этой книге либо с помощью электронных руководств man или info. Ее наиболее компактная форма
chmod XXXX <file_name> ,
где XXXX– 4 восьмеричных цифры, означающих права доступа к файлу: эффективные права, права владельца, его группы и всех остальных пользователей.
Обычно владельцу файла предоставляются полные права, а членам его группы и всем остальным пользователям – только самые необходимые. Но владелец файла вполне может ограничить себя в правах. Например, задав режим доступа к файлу в виде
chmod 077 <file_name> ,
он предоставляет полные права на файл своей группе и всем зарегистрированным пользователям, обделяя себя. С такой же легкостью он может восстановить справедливость, поскольку является владельцем файла. Иногда к таким трюкам вынужден прибегнуть администратор, когда задача разграничения доступа обычным способом не решается.
С каждым процессом в системе связан идентификатор пользователя UID, от имени которого процесс запущен. Алгоритм, реализованный системной функцией, сравнивает UID процесса и UID файла и, обнаружив, что к файлу обращается его владелец, проверяет только его права доступа. Если у владельца нет нужных прав, – ему будет отказано в доступе. Его права как члена своей основной группы или иного пользователя даже не будут проверяться. Но пользователь, ограничивший себя в правах, может легко исправить положение, переназначив права доступа в свою пользу, – ведь он остается владельцем этого файла и имеет право применить к нему команду chmod.
Система не оценивает целесообразность присвоения обычным файлам и каталогам тех или иных прав доступа. Администратор или владелец файла может указать любые, даже самые нелепые права доступа к файлу, и они будут без возражений установлены.
Передача прав владения файлами в системе также предусмотрена. Она производится с помощью утилиты chown (change owner – сменить владельца) командой
chown <user_name> <file_name>
Обычным пользователям не разрешается передавать свои файлы другим пользователям, включая администратора, поскольку с позиций компьютерной безопасности такое действие рассматривается не как акт доброты, а как возможная информационная атака. Во-первых, передавая свои файлы администратору, пользователь может создать предпосылку для случайного запуска вредоносной программы с правами суперпользователя. Во-вторых, создав файл неограниченного объема и передав права на него другому пользователю (например, из числа своих недругов), пользователь может переполнить дисковую квоту атакуемого и вызвать отказ системы в его обслуживании. Поэтому в ОС Linux передавать права на объекты файловой системы может только администратор.
Права на удаление файла не предусмотрено, и любой пользователь может удалить любой файл, находящийся в доступном для него на запись и исполнение каталоге. Никаких прав доступа на удаляемый файл при этом не требуется. Для защиты файлов, находящихся в общедоступных каталогах, от несанкционированного удаления создателям системы когда-то пришлось предусмотреть дополнительный атрибут, именуемый sticky («липкий») бит (это название давно утратило свое первоначальное назначение). Наличие этого атрибута в дополнение к первичным правам на запись и исполнение в каталоге разрешает удалять из него файлы только их владельцам. Само собой разумеется, что администратора подобный запрет не касается. Отображается этот дополнительный атрибут символом t вместо символа x для всех пользователей, например drwxrwxrwt. Если этот атрибут был определен, а права на исполнение каталога для группы пользователей «другие» не предусмотрено, символ T будет отображаться заглавным. Однако на самом деле дополнительный атрибут t является дополнением к праву на запись, и, если оно не установлено, то и sticky–бит никакого смысла не имеет.
Ранее уже обращалось внимание на существование особых команд, которые могут запускаться обычным пользователем, а выполняются с правами администратора. Такой командой, в частности, являетсяpasswd, поскольку ей приходится записывать новые данные в теневой файл /etc/shadow, чтение и запись которого разрешены только пользователю root. Такие исполняемые файлы имеют так называемый эффективный идентификатор SUID(Superuser UID).
Наряду с идентификатором SUID, но гораздо реже, используется эффективное право для группы владельца SGID. Команда ls –l отображает эффективные права символом s вместо символа x для владельца файла или его группы, например rwsr-s--x. Если при назначении прав этот атрибут был определен, а прав на исполнение файла для владельца не предусмотрено, символ S будет отображаться заглавным.
Всего в операционной системе насчитывается несколько десятков утилит, выполняемых с правами администратора или его группы. Их полный список может быть получен при запуске поисковой команды
find / -perm +6000 ,
где аргумент -perm является сокращением от permission – разрешение, а «плюс» перед числом указывает на объединение признаков SUID + SGID.
Назначение программ, имеющих установленные биты SUID и SGID, как правило, хорошо известно, а использование дополнительных прав обосновано. Если программа, содержащая бит эффективных прав SUID или SGID, не содержит ошибок и недокументированных возможностей, то ее запуск опасности не представляет. Тем не менее администратор должен по возможности сократить число таких программ (путем снятия опасных атрибутов) и периодически контролировать файловую систему на предмет
появления новых файлов с подобными свойствами. Наибольшую опасность представляют попытки внедрения таких программ на сменных машинных носителях. Для исключения такой опасности монтирование сменных носителей необходимо производить с указанием опции nosuid, что означает сброс опасных меток при монтировании.
На систему также возлагается функция «нераспространения» потенциально опасных свойств. Все операции, связанные с копированием, перемещением и переименованием файлов с установленными битами SUID и SGID, завершаются сбросом опасных атрибутов для преобразованных файлов.
В файловых системах ext*fs предусмотрены дополнительные свойства файловых объектов, обеспечиваемые файловой системой. В настоящее время поддерживаются следующие из них:
i– защита от любых изменений файла, включая изменение временных отметок и создание жестких ссылок;
а– запрет любых операций, кроме добавления данных;
S– синхронные обновления файла, при установке которых новые данные немедленно записываются на диск;
А– неизменяемость временной отметки последнего доступа к файлу;
d– игноририрование файла при операциях резервного копирования, выполняемого командой dump, что позволяет не расходовать дисковое или ленточное пространство на сохранение не очень нужных файлов.
Некоторые зарезервированные свойства, такие как создание и сохранение копии файла при его удалении, автоматическое сжатие и декомпрессия при записи/чтении файла, гарантированное стирание блоков данных при удалении файла, – безусловно полезны, однако поддерживаются не всеми версиями файловых систем Linux. Всего в метаданных файла предусмотрено 16 дополнительных свойств, 13 из них на момент написания книги документировано.
Установка дополнительных свойств файла производится с помощью команды
chattr +(-)(=) option <file_name> ,
где знаки означают:
«+» – установление атрибутов,
«-» – удаление атрибутов,
«=» – установление только атрибута, указанного после знака равенства.
Следует обратить внимание на то, что дополнительные свойства файлов в действительности не являются дополнениями к базовым правам и вполне автономны.
Например, дополнительный атрибут а позволяет производить только дописывание информации в конец файла и вовсе не является дополнением к базовому праву записи в файл. Установка этого атрибута может производиться на файл, к которому ни одному из пользователей нет права записи. После установки администратором атрибута а на файл любого из пользо-
вателей он становится защищенным от любых изменений, включая запись, удаление файла или изменение права доступа. Этот запрет распространяется и на самого администратора. И никто, кроме него, не имеет права что–либо дописывать в такой файл.
Такой атрибут может быть временно установлен на некоторые файлы журналов, чтобы демон syslogd мог записывать в них заданные события, а злоумышленник не имел возможности удалять из них уличающие его записи. Конечно, при обновлении журнала (т. е. при удалении самого «старого» файла) этот атрибут потребуется снять. Для того чтобы злоумышленник, проникший в систему с правами суперпользователя, не смог быстро снять этот атрибут, настоящий администратор должен «спрятать» или переименовать утилиту chattr.
Установив дополнительный атрибут i, администратор не сможет случайно удалить файл, записать что-либо в него, изменить права доступа, ни даже создать или удалить жесткую ссылку. Соответственно этого не сможет сделать и никто иной. Этим весьма полезным свойством необходимо пользоваться в отношении наиболее ответственных исполняемых и конфигурационных файлов. Установка подобного атрибута ни в коей мере не является защитой файла от преднамеренных действий администратора, поскольку ее просто установить и не менее просто отменить. И не следует забывать, что защита на уровне файловой системы преодолевается путем доступа напрямую к дисковой памяти с помощью шестнадцатеричных редакторов.
Дополнительные атрибуты файла командой ls не отображаются, и для их чтения необходимо воспользоваться командой
lsattr <file_name>
Команда выводит 16 битовых флагов с указанием дефисов на месте отсутствующих свойств и характерных символов на месте установленных. Аналогичная команда без имени файла выведет дополнительные атрибуты файлов из текущего каталога.