Атрибуты файлов

В традиционной модели файловой системы UNIX и Linux каждому файлу соответствует набор из девяти битов режима. Они определяют, какие пользователи имеют прав читать файл, записывать в него данные или запускать его на выполнение. (Права доступа к файлу, отображаемые командой ls для символической ссылки lrwxrwxrwx представляют собой фиктивные значения. Права на создание, удаление или разрешение ссылки управляются содержащим ее каталогом, в то время как права чтения, записи или выполнения для файла, указываемого ссылкой, предоставляются собственными правами целевого файла. Следовательно, символическая ссылка не нуждается (и не обладает) ни в какой собственной информации о правах доступа.)Вместе с другими тремя битами, которые в основном влияют на работу исполняемых файлов, этот набор образует код, или режим, доступа к файлу.

Двенадцать битов режима хранятся вместе с четырьмя дополнительными битами, определяющими тип файла. Эти четыре бита устанавливаются при создании файла и не подлежат изменению. Биты режима могут изменяться владельцем файла или суперпользователем с помощью команды chmod ("change mode" — изменить режим). Просмотр значений этих битов осуществляется с помощью команды ls -i (или ls -id в случае каталога). Пример приведен далее.

Биты режима

Девять битов режима определяют, кто и какие операции может выполнять над файлом. Традиционная система UNIX не позволяет устанавливать режим на уровне отдельного пользователя (хотя теперь списки управления доступом поддерживаются во всех основных системах). Вместо этого три различных набора битов определяют права доступа, предоставляемые владельцу файла, членам группы, которой принадлежит файл, и прочим пользователям (в таком порядке). Каждый набор состоит из трех битов: бита чтения, записи и выполнения.

Код доступа удобно записывать в виде восьмеричного числа, так как каждая цифра в нем представляется тремя битами. Три старших бита (в коде доступа им соответствуют восьмеричные значения 400, 200 и 100) служат для управления доступом к файлу его владельца. Вторые три бита (40, 20 и 10) задают доступ для членов группы. Последние три бита (4, 2 и 1) определяют доступ к файлу остальных пользователей. Старший бит каждой триады — это бит чтения, средний — бит записи, младший — бит выполнения.

Каждый пользователь попадает только в одну из категорий прав доступа. В случае неоднозначности выбираются самые строгие права. Например, права владельца файла всегда определяются триадой битов владельца и никогда — битами группы. Возможна ситуация, когда другие пользователи имеют больше прав, чем владелец, но такая конфигурация используется редко.

Для обычного файла бит чтения означает возможность открывать и читать файл. Бит записи позволяет изменять содержимое файла, в том числе полностью очищать его. Правом удаления и переименования файла управляют биты, заданные для его родительского каталога, поскольку именно там хранится имя файла.

Установкой бита выполнения задается разрешение запускать файл. Существует два типа исполняемых файлов: бинарные файлы, которые выполняются непосредственно центральным процессором, и сценарии, обрабатываемые интерпретатором команд или какой-нибудь другой аналогичной программой. В соответствии с принятыми соглашениями, сценарии начинаются со строки примерно такого вида.

#! /usr/bin/perl

Здесь задается соответствующий интерпретатор. Текстовые исполняемые файлы, в которых не указан конкретный интерпретатор, считаются сценариями bash или sh.

Будучи установленным для каталога, бит выполнения (в этом контексте его часто называют битом поиска) разрешает переходить в каталог или проходить через него при доступе к файлу, но без получения списка содержимого каталога. Последнее (т.е. получение списка) становится возможным, если для каталога задана комбинация битов чтения и выполнения. Комбинация битов записи и выполнения позволяет создавать, удалять и переименовывать файлы в данном каталоге.

Традиционную девятибитовую модель режимов способны усложнить и переопределить многие такие расширения, как списки управления доступом, система SELinux, т.е. Linux с улучшенной безопасностью и "бонусные" биты режимов, определяемые отдельными файловыми системами. Если окажется, что вы не можете объяснить поведение своей файловой системы, проверьте, оказывает ли на нее влияние один из перечисленных выше факторов.

Биты setuid и setgid

Биты, которым в коде доступа соответствуют восьмеричные значения 4000 и 2000, — это биты смены идентификатора пользователя (setuid) и идентификатора группы (setgid). Если эти биты установлены для исполняемых файлов, они позволяют программам получать доступ к файлам и процессам, которые при прочих обстоятельствах недоступны пользователю, выполняющему эти программы.

Когда файл начинается с символов #/, он в первую очередь обрабатывается ядром. Но если нтерпретатор команд не указан или указан неправильно, ядро откажется выполнять файл. В этом случае текущий интерпретатор предпримет вторую попытку, попытавшись выполнить сценарий в интерпретаторе sh. Если бит setgid установлен для каталога, то создаваемые в нем файлы будут принимать идентификатор группы каталога, а не группы, в которую входит владелец файла. Это упрощает пользователям, принадлежащим к одной группе, совместный доступ к каталогам. Следует также учитывать, что для исполняемого файла бит setgid имеет другое значение.

Бит setgid можно устанавливать для файлов, не являющихся исполняемыми. Тем самым запрашивается специальный режим блокирования файлов при их открытии. Правда, нам не известны случаи использования этой возможности.

 

Дополнительный бит

Бит, которому в коде доступа соответствует восьмеричное значение 1000, называется дополнительным (sticky bit). В первых UNIX-системах дополнительный бит запрещал выгрузку программ из памяти. Сегодня он утратил свое значение и, попросту, игнорируется.

Если дополнительный бит установлен для каталога, то файловая система позволит удалять и переименовывать его файлы только владельцу каталога, владельцу файла или суперпользователю. Иметь одно лишь право записи в каталог недостаточно. Такая мера позволяет несколько лучше защитить каталоги вроде /tmp.

Системы Solarls и HP-UX менее строги в обработке дополнительных каталогов: вы можете удалить файл в дополнительном каталоге, если у вас есть на него право записи (даже если вы не являетесь его владельцем). В этом действительно есть здравый смысл, но об этом отличительном нюансе не стоит забывать.

 

Команда ls: просмотр атрибутов файла

Файловая система хранит для каждого файла около сорока информационных полей; большая часть из них используется самой файловой системой. Администратора, в основном, интересует количество жестких ссылок, владелец, группа, код доступа, время последнего обращения и последней модификации, размер и тип файла. Всю эту информацию можно получить с помощью команды ls -1 (или команды ls -id в случае каталога; без флага -d команда ls перечисляет содержимое каталога).

Для каждого файла хранится также время последнего изменения атрибутов. Традиционное название этого поля ("ctime" от "change time" — время изменения) многих вводит в заблуждение, так как они полагают, что это время создания файла. На самом деле здесь зафиксировано время последнего изменения одного из атрибутов файла (владелец, код доступа и так далее), но не его содержимого.

Рассмотрим пример.

$ ls -1 /bin/gzip

-rwxr-xr-x 3 root root 62100 May 28 2010 /bin/gzip

В первом поле задается тип файла и режим доступа к нему. Поскольку первый символ — дефис, значит, перед нами обычный.

Следующие девять символов — это три набора битов режима. Порядок наборов таков: владелец, группа, другие пользователи. В листинге команды ls биты режима представляются буквами г, w и х (чтение, запись и выполнение). В показанном примере владелец имеет все права доступа к файлу, а остальные пользователи — только право на чтение и выполнение. Если бы был установлен бит setuid, то вместо буквы х, обозначающей право владельца на выполнение, стояла бы буква s. В случае бита setgid вместо буквы х для группы тоже была бы указана буква s. Последний бит режима (право выполнения для других пользователей) представляется буквой t, когда для файла задан sticky-бит. Если бит setuid/setgid или sticky-бит установлен, а надлежащий бит выполнения — нет, эти биты представляются символами Бит, что указывает на игнорирование данных атрибутов вследствие ошибки.

Второе поле листинга представляет собой счетчик ссылок на файл. В данном случае здесь стоит цифра 3, свидетельствующая о том, что /bin/gzip — одно из трех имен файла (два других — /bin/gunzip и /bin/zcat). Каждый раз при создании жесткой ссылки на файл этот счетчик увеличивается на единицу. Символические ссылки в счетчике не учитываются.

Любой каталог имеет минимум две жесткие ссылки: из родительского каталога и из специального файла "." внутри самого каталога.

Следующие два поля определяют владельца и группу файла. В данном примере файл принадлежит пользователю root и одноименной группе. В действительности ядро хранит эти данные не в строковом виде, а в виде идентификаторов. Если символьные версии идентификаторов определить невозможно, в этих полях будут отображаться числа. Так происходит, когда запись пользователя или группы была удалена из файла, соответственно, /etc/passwd или /etc/group. Не исключено также, что возникла ошибка в базе данных NLS или LDAP, если она используется.

В следующем поле отображается размер файла в байтах. Рассматриваемый файл имеет размер 62100 байт. Далее указана дата последней модификации файла: 28 мая 2010 г. В последнем поле листинга приведено имя файла: /bin/gzip.

Для файла устройства команда ls выдает несколько иную информацию.

$ ls -1 /dev/ttyO

crw-rw---1  root  root  4, 0  Jun 11  20:41  /dev/ttyO

Большинство полей те же, но вместо размера в байтах показаны старший и младший номера устройства. Имя /dev/ttyO относится в данной системе (Red Hat) к первой виртуальной консоли, управляемой драйвером устройства 4 (драйву терминала).

При поиске жестких ссылок может пригодиться команда ls -i, отображающая для каждого файла номер его индексного дескриптора. Не вдаваясь в детали реализации файловой системы, скажем, что этот номер представляет собой индекс таблицы, в которой перечислены все файлы системы. Именно на индексные дескрипторы ссылаются файловые записи каталогов. Жесткие ссылки, указывающие на один и тот же файл, будут иметь одинаковый номер. Для того чтобы составить представление о "паутине" ссылок, воспользуйтесь командой ls -li для определения числа ссылок и номера индексного дескриптора какого-нибудь файла, а затем поищите его "двойников" с помощью команды find.

Другими важными опциями команды ls являются -а, отображающая все записи в каталоге (даже те файлы, имена которых начинаются с точки), -t, выполняющая сортировку файлов по времени изменения (или -tr, осуществляющая сортировку в обратном хронологическом порядке), -F, отображающая имена файлов с выделением каталогов и исполняемых файлов, -R, выводящая рекурсивный список, и -h, которая отображает размеры файлов в удобной для человеческого восприятия форме (например, 8К или 53М).

 

Команда chmod: изменение прав доступа

Код доступа к файлу можно изменить с помощью команды chmod. Такое право есть лишь у владельца файла и пользователя root. В первых UNIX-системах код доступа задавался в виде восьмеричного числа. В современных версиях поддерживается также система мнемонических обозначений. Первый способ удобнее для системного администратора, но при этом можно задать только абсолютное значение кода доступа. В случае использования мнемонического синтаксиса разрешается сбрасывать и устанавливать отдельные биты режима.

Первым аргументом команды chmod является спецификация прав доступа. Второй и последующий аргументы — это имена файлов, права доступа к которым подлежат изменению. При использовании восьмеричной формы записи первая цифра относится к владельцу, вторая — к группе, а третья — к другим пользователям. Если необходимо задать биты setuid/setgid или дополнительный бит, следует указывать не три, а четыре восьмеричные цифры: первая цифра в этом случае будет соответствовать трем специальным битам. Символ u ("wser") обозначает владельца файла, g ("group") — группу, о ("others") — других пользователей, а ("") — всех пользователей.

 

При наличии опции -R команда chmod будет рекурсивно обновлять права доступа ко всем файлам указанного каталога и его подкаталогов. Здесь удобнее всего придерживаться мнемонического синтаксиса, чтобы менялись только те биты, которые заданы явно. Например, команда

$ chmod -R g+w mydir

добавляет групповое право записи к каталогу mydir и его содержимому, не затрагивая остальные права.

При установке битов выполнения будьте осторожны с выполнением команды chmod -R. Ведь применительно к каталогу и файлу бит выполнения интерпретируется по-разному. Поэтому вряд ли реальный результат выполнения команды chmod -R а-х будет соответствовать ожидаемому вами.

 

Команды chown и chgrp: смена владельца и группы

Команды chown и chgrp предназначены для изменения владельца файла и группы соответственно. Синтаксис этих команд подобен синтаксису команды chmod, за исключением того, что первый аргумент содержит нового владельца или группу соответственно.

Для того чтобы изменить группу файла, необходимо либо быть владельцем файла и входить в назначаемую группу, либо быть пользователем root. Правила изменения владельца в целом усложнились и зависят от конкретной системы. В большинстве систем предусмотрены средства настройки поведения команды chown в зависимости от выполняемого процесса.

Как и команда chmod, команды chown и chgrp имеют флаг -R, который задает смену владельца или группы не только самого каталога, но и всех его подкаталогов и файлов. Например, последовательность команд

$ sudo chown -R matt ^matt/restore

$ sudo chgrp -R staff ^matt/restore

можно применить для восстановления из резервной копии владельца и группы файлов Для пользователя matt. Если вы устанавливаете домашний (исходный) каталог пользователя, не следует пытаться выполнять команду chown для файлов, имена которых начинаются с точки.

$ sudo chown -R matt ~matt/.

Дело в том, что указанному шаблону соответствует также файл ~matt/.., поэтому будет изменен владелец родительского каталога и, возможно, домашних каталогов других пользователей.

Команда chown может изменить владельца файла и группу одновременно с помощью такого синтаксиса.

chown пользователь: группа файл ...

Например:

$ sudo chown -R matt: staff -matt/restore

Команда umask: задание стандартных прав доступа

 

Встроенная команда umask позволяет менять стандартный режим доступа к создаваемым файлам. Каждый процесс имеет собственный атрибут umask; встроенная в интерпретатор команда umask устанавливает собственное значение umask, которое затем наследуется выполняемыми вами командами.

<>Значение umask задается в виде трехзначного восьмеричного числа, которое соответствует аннулируемым правам доступа. При создании файла код доступа к нему устанавливается равным разнице между величиной, которую запрашивает создающая файл программа, и значением umask. Нельзя заставить пользователей придерживаться конкретного значения umask, так как они в любой момент могут изменить его. Можно, однако, задать стандартное значение umask в тех копиях файла .profile, которые предоставляются новым пользователям системы.

 

Дополнительные флаги в системе Linux

В файловых системах ext2, ext3 и ext4 определен ряд вспомогательных флагов, устанавливая которые можно запрашивать особые режимы обработки файлов (здесь важно подчеркнуть слово "запрашивать", поскольку многие флаги еще не реализованы). Например, один флаг делает файл доступным только для дополнения, а другой — недоступным для изменения и удаления.

В связи с тем что эти флаги являются специфической особенностью файловых систем серии ext, в Linux для их просмотра и изменения предназначены специальные команды lsattr и chattr. Не вполне ясно, имеют ли остальные флаги, за исключением d, практическую ценность. Флаги а и i изначально задумывались как дополнительное средство защиты системы от хакеров и злонамеренных программ. К сожалению, они лишь мешают работе полезных программ, отпугивая только тех хакеров, которые не знают о существовании команды chattr -ia. Исследования показали, что эти флаги чаще используются самими хакерами, чем для защиты от них.

Особого внимания заслуживают флаги S и D. Поскольку при внесении изменений они заставляют немедленно записывать на диск все страницы памяти, связанные с файлом или каталогом, может показаться, будто это служит дополнительной защитой данных на случай сбоя. На самом же деле порядок выполнения операций, связанных с синхронными обновлениями, весьма необычен и, как стало известно, мешает работе команды fsck. В результате процедура восстановления поврежденной файловой системы усложняется, вместо того чтобы стать более надежной. Обычно лучше использовать возможность ведения журнала файловой системы, поддерживаемую ext3 и ext4. Опция j может вызвать запись в журнал информации об определенных файлах (правда, за счет некоторого снижения производительности системы).

Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.