Права доступа к файлам
Категория: Файловая система | Автор: admin | 30-09-2009, 04:44 | Просмотров: 7358

Каждому файлу соответствует набор прав доступа, представленный в виде девяти битов режима. Он определяет, какие пользователи имеют право читать файл, записывать в него данные или выполнять его. Вместе с другими тремя битами, влияющими на запуск исполняемых файлов, этот набор образует код режима доступа к файлу. Двенадцать битов режима хранятся в 16-битовом поле индексного дескриптора вместе с четырьмя дополнительными битами, определяющими тип файла.

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

 

Биты SUID и SGID

 

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

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

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

 

Sticky-бит

 

Бит, которому в коде режима доступа соответствует восьмеричное значение 1000, называется sticky-битом ("sticky" — липучка). Это хороший пример того, как UNIX по мере взросления избавляется от рудиментов, но они продолжают следовать за системой по пятам. В системах с небольшой памятью, например PDP-11/70, где UNIX работала в свои ранние годы, требовалось, чтобы отдельные программы постоянно оставались в памяти. Тогда sticky-бит был очень важен, так как запрещал выгрузку программ из памяти. Сегодня в мире 25-долларовых модулей памяти и быстродействующих дисковых накопителей sticky-бит никому не нужен, и современные ядра попросту игнорируют его.

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

Системы Solaris и HP-UX не столь строги в отношении каталогов с установленным sticky-битом. Пользователь, имеющий право записи в такой каталог, может удалять из него файлы, даже если он не является их владельцем.

 

Биты режима

 

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

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

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

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

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

 

#!/bin/csh -f

 

Она задает соответствующий интерпретатор команд. Текстовые файлы, в которых не указан конкретный интерпретатор, считаются сценариями интерпретатора sh (Bourne shell).

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

 

Просмотр атрибутов файла

 

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

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

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

 

 

% ls -1 /bin/sh

-rwxr-xr-x 1 root bin 85924 Sep 27 1997 /bin/sh

 

 

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

 

Таблица 5.2. Кодирование типов файлов в листинге команды ls

Тип файла

Символ

Создается командой

Удаляется командой

Обычный файл

-

редакторы, ср и др.

rm

Каталог

d

mkdir

rmdir, rm –f

Файл байт-ориентированного устройства

с

mknod

rm

Файл блок-ориентированного устройства

Ь

mknod

rm

Сокет

s

socket(2)

Rm

Именованный канал

p

mknod

rm

Символическая ссылка

l

ln -s

rm

 

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

Если бы был установлен бит смены идентификатора пользователя (SUID), то вместо буквы х, обозначающей право владельца на выполнение, стояла бы буква s. Если бы был установлен бит смены идентификатора группы (SGID), то вместо буквы х для группы тоже стояла бы буква s. Последний бит режима (право выполнения для остальных пользователей) представляется буквой t, когда для файла задан sticky-бит. Если биты SUID/SGID или sticky-бит установлены, а надлежащий бит выполнения — нет, эти биты представляются соответственно символами S и T, указывающими на наличие ошибки и игнорирование данных атрибутов.

Далее расположено поле со счетчиком ссылок на файл. В нашем примере здесь стоит единица, свидетельствующая о том, что /bin/sh — единственное имя, под которым известен данный файл. Всякий раз при создании жесткой ссылки на файл этот счетчик увеличивается на единицу.

Каждый каталог имеет минимум две жесткие ссылки: одну из родительского каталога и одну из специального файла '.' внутри самого каталога. Символические ссылки в счетчике не учитываются.

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

Затем следует поле, отображающее размер файла в байтах. Рассматриваемый файл имеет размер 85924 байта, т.е. почти 84 Кбайт. Далее указывается дата последнего изменения: 27 сентября 1997 г. В последнем поле листинга содержится имя файла: /bin/sh.

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

 

 

% ls -l /dev/ttya

crw-rw-rw- 1 root daemon 12, 0 Dec 20 1998 /dev/ttya

 

 

В основном поля те же, но вместо размера в байтах показаны старший и младший номера устройства. Имя /dev/ttya относится к первому устройству, управляемому драйвером устройства 12 (в данной системе это драйвер терминала).

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

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

 

Дополнительные флаги во FreeBSD

 

Во FreeBSD и других системах, построенных на ядре 4.4BSD, имеется ряд дополнительных флагов, которые могут быть установлены для файлов. Эти флаги связаны с расширенной семантикой файловой системы. Например, флаг sappnd делает файл доступным только для присоединения (это может быть полезно при создании журнальных файлов). А благодаря флагу schg файл становится неизменяемым и неудаляемым. Узнать о наличии этих файлов поможет команда ls -lo:

 

 

% ls -lo /kernel

-r-xr-xr-x 1 root wheel schg 2498230 Nov 30 23:51 /kernel

 

 

Управлять флагами можно с помощью команды chflags:

 

 

# chflags noschg /kernel

# ls -lo /kernel

-r-xr-xr-x 1 root wheel - 2498230 Nov 30 23:51 /kernel

 

 

Список доступных флагов вы можете получить на странице интерактивного руководства chflags(l).

 

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

 

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

Первым аргументом команды chmod является спецификация прав доступа. Второй и последующий аргументы — имена файлов, права доступа к которым подлежат изменению. При использовании восьмеричной нотации первая цифра относится к владельцу, вторая — к группе а третья — к остальным пользователям. Если необходимо задать биты SUID/SGID или sticky-бит, следует указывать не три, а четыре восьмеричные цифры. Первая цифра в этом случае будет соответствовать трем специальным битам.

В табл. 5.3 показано восемь возможных комбинаций для каждого трехбитового набора, где символы r, w и х обозначают соответственно чтение, запись и выполнение.

Таблица 5.3 Коды прав доступа в команде chmod

Восьмеричное число

Двоичное число

Маска режима доступа

0

000

---

1

001

--х

2

010

-w-

3

011

-wx

4

100

r--

5

101

r-х

6

110

rw-

7

111

rwx

 

Например, команда chmod 711 myprog предоставляет владельцу все права, а всем остальным пользователям — только право выполнения.

В табл. 5.4 представлены некоторые примеры мнемонических спецификаций.

 

Таблица 5.4 Примеры мнемонических спецификаций команды chmod

Спецификация

Смысл

u+w

Владельцу файла дополнительно дается право выполнения

ug=rw,о=г

Владельцу и группе предоставляется право чтения/записи, остальным пользователям — право чтения

а-х

Все пользователи лишаются права выполнения

ug=srx,о=

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

g=u

Группе назначаются такие же права, что и владельцу

 

Символ u ("user") обозначает владельца файла, символ g ("group") — группу, символ о ("others") — других пользователей, символ a ("all") — всех пользователей сразу.

 

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

 

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

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

 

 

# chmod 755 ~matt

# chown -R matt ~matt

# chgrp -R staff ~matt

 

 

можно использовать для конфигурирования начального каталога нового пользователя после копирования в него стандартных файлов сценариев. Не следует пытаться выполнять команду chown для файлов, имена которых начинаются с точки:

 

 

# chown -R matt ~matt/.*
 

 

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

В некоторых системах посредством команды chown можно изменять владельца и группу файла одновременно. Ее синтаксис в этом случае таков:

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

 

Например:

 

 

# chown -R matt:staff ~matt
 

 

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

 

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

 

Встроенная shell-команда umask позволяет менять стандартный режим доступа к создаваемым файлам. Значение umask задается в виде трехразрядного восьмеричного числа, которое соответствует отнимаемым правам доступа. При создании файла код доступа устанавливается равным разнице между величиной, которую запрашивает создающая файл программа, и значением umask. В табл. 5.5 перечислены возможные комбинации битов режима для команды umask.

 

Таблица 5.5 Схема кодирования значения umask

Восьмеричное число

Двоичное число

Маска режима доступа

0

000

rwx

1

001

rw-

2

010

r-x

3

011

r--

4

100

-wx

5

101

-w-

6

110

--x

7

111

---

 

Например, команда umask 027 предоставляет все права владельцу файла, запрещает читать файл группе и не дает никаких прав остальным пользователям. По умолчанию значение umask равно, как правило, 022, т.е. выполнять модификацию файла разрешается только его владельцу.

Не существует способа, которым можно было бы заставить пользователя придерживаться конкретного значения umask, так как он в любой момент может изменить его. Возможно, однако, задание стандартного значения umask в тех копиях файлов .cshrc и .profile, которые предоставляются новым пользователям системы.



 (голосов: 3)
Версия для печати | Комментариев: 0
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.


 
Логин
Пароль
 

 
Locations of visitors to this page