Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Chast5.doc
Скачиваний:
9
Добавлен:
06.11.2018
Размер:
832 Кб
Скачать

17. Организация контроля доступа в ос unix Владельцы файлов

Файлы в UNIX имеют двух владельцев: пользователя (user owner) и груп­пу (group owner). Группой называется определенный список пользователей системы. Пользователь системы может быть членом нескольких групп, одна из которых является первичной (primary), ос­тальные — дополнительными (supplementary).

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

Для определения владельца файла достаточно посмотреть подробный листинг команды ls –l. Третья и четвертая колонки содержат имена владельца-пользователя и владельца-группы соответственно:

1 2 3 4 5 6 7 8

-rw-r—r-- 1 andy group 235520 Dec 22 19:13 p1.txt

-rw-rwr-- 1 andy student 3450 Apr 1 12:00 joke

Владельцем–пользователем вновь созданного файла является пользователь, который создал файл. Порядок назначения владельца-группы зависит от версии UNIX. Например, в SCO UNIX владельцем-группой является первичная группа пользователя, создавшего файл, а в Digital UNIX владелец-группа наследуется от владельца группы - каталога, в котором создается файл.

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

Операции изменения владельцев файла Таблица 17.1

Операция

Команда

Имеет право выполнить

В системе BSD

В системе SVR4

Изменение владельца - пользователя

chown

суперпользователь

Владелец файла

Изменение владельца - группы

chgr

суперпользователь

Владелец файла только для группы, к которой сам принадлежит

Права доступа к файлу

В операционной системе UNIX существуют три базовых класса доступа к файлу, в каждом из которых установлены соответствующие права доступа:

User access (u)

Для владельца – пользователя файла

Group access (g)

Для членов группы, являющейся владельцем файла

Other access (o)

Для остальных пользователей (кроме суперпользователя)

UNIX поддерживает три типа прав доступа для каждого класса: на чтение (read, обозначается символом г), на запись (write, обозначается символом w) и на выполнение (execute, обозначается символом х).

С помощью команды Is -l можно получить список прав доступа к файлу:

-rw--r--r-- 1 andy group 36482 Dec 22 17:06 report.txt

drwxr-xr-- 2 andy group 64 Aug 15 11:00 temp

-rwxr-xr-- 1 andy group 4668 May 10 17:00 a.out

Права доступа листинга отображаются в первой колонке (за исключением первого символа, обозначающего тип файла). Наличие права доступа обо­значается соответствующим символом, а отсутствие - символом '-'. Рас­смотрим, например, права доступа к файлу a.out.

Тип файла

Права владельца- пользователя

Права владельца - группы

Права остальных пользователей

-

rwx

r-x

r--

Обычный файл

Чтение, запись, выполнение

Чтение и выполнение

Только чтение

Права доступа могут быть изменены только владельцем файла или суперпользователем (superuser) - администратором системы. Для этого используется команда chmod. Ниже приведен общий формат этой команды.

Chmod file1 file2

В качестве аргументов команда принимает указание классов доступа (‘u’ – владелец-пользователь, ‘g’ – владелец-группа, ‘o’ - остальные пользователи, ‘a’ - все классы пользователей), права доступа ('г - чтение, 'w' - запись, 'х' - выполнение) и операцию, которую необходимо произвести (‘+’ - добавить, '-' - удалить и '=' - присвоить) для списка файлов file 1, file2 и т.д. Например, команда

$ chmod g-wx ownfile

лишит членов группы-владельца файла ownfile права на запись и выполнение этого файла.

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

Приведем несколько примеров:

$ chmod a+w text

Предоставить право на запись для всех пользователей

$ chmod go=r text

Установить право на чтение для всех пользователей за исключением владельца

$ chmod g+x-w runme

Добавить для группы право на выполнение файла runme

$ chmod u+w, og+r-w t1 t2

Добавить право записи для владельца, право на чтение для группы и остальных пользователей, отключить право на запись для всех пользователей, исключая владельца

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

$ chmod 754 *

Число определяется следующим образом: нужно представить права доступа в двоичном виде (0 - отсутствие соответствующего права, 1 - его наличие) и каждую триаду, соответствующую классу доступа, в свою очередь преобразовать в десятичное число.

Владелец

Группа

Остальные

r w x

r - x

r - -

1 1 1

1 0 1

1 0 0

7

5

4

Таким образом, приведенный пример эквивалентен следующей символьной форме chmod(l):

$ chmod u=rwx, g=rx, o=r

Значение прав доступа различно для разных типов файлов. Для файлов операции, которые можно производить, следуют из самих названий прав доступа. Например, чтобы просмотреть содержимое файла командой cat, пользователь должен иметь право на чтение (г). Редактирование файла, т. е. его изменение, предусматривает наличие права на запись (w). Наконец, для того чтобы запустить некоторую программу на выполнение, вы должны иметь соответствующее право (х). Исполняемый файл может быть как скомпилированной программой, так и скриптом командного интерпретатора shell. В последнем случае вам также понадобится право на чтение, поскольку при выполнении скрипта командный интерпретатор должен иметь возможность считывать команды из файла. Все сказанное, за исключением, пожалуй, права на выполнение, имеющего смысл лишь для обычных файлов и каталогов, справедливо и для других типов файлов: специальных файлов устройств, именованных каналов и сокетов. Например, чтобы иметь возможность распечатать документ, вы должны иметь право на запись в специальный файл устройства, связанный с принтером. Для каталогов эти права имеют другой смысл, а для символических связей они вообще не используются, поскольку контролируются целевым файлом.

Права доступа для каталогов не столь очевидны. Это в первую очередь связано с тем, что система трактует операции чтения и записи для каталогов отлично от остальных файлов. Право чтения каталога позволяет вам получить имена (и только имена) файлов, находящихся в данном каталоге. Чтобы получить дополнительную информацию о файлах каталог; (например, подробный листинг команды Is -l), системе придется «заглянуть» в метаданные файлов, что требует права на выполнения для каталога. Право на выполнения также потребуется для каталога, в который вы захотите перейти (т. е. сделать его текущим) с помощью команды cd (1). Это же право нужно иметь для доступа ко всем каталогам на пути к указанному. Например, если вы установите право на выполнения для всех пользователей в одном из своих подкаталогов, он все равно останется недоступным, пока ваш домашний каталог не будет иметь такого же права.

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

$ pwd # Где мы находимся ?

/home/andrey

$ mkdir darkroom # Создадим каталог

$ ls -l # Получим его атрибуты

drwxr--r-- 2 andy group 65 jun 23 21:00 darkroom

$ chmod a-r+x darkroom #Превратим darkroom в темный каталог

$ ls -l # Получим его атрибуты

d-wx--x--x 2 andy group 65 jun 23 21:00 darkroom

$ cp file1 darkroom # Поместим в каталог darkroom некоторый #файл

$ cd darkroom # Перейдем в этот каталог

$ ls -l darkroom # Попытаемся получить листинг каталога

##permission denied # Попытка не удалась

$ cat file1 # Тем не менее с файлом можно работать…

Особого внимания требует право на запись для каталога. Создание и удале­ние файлов в каталоге требуют изменения его содержимого, и, следователь­но, права на запись в этот каталог. Самое важное, что при этом не учиты­ваются права доступа для самого файла. То есть для того, чтобы удалить не­который файл из каталога, не обязательно иметь какие-либо права доступа к этому файлу, важно лишь иметь право на запись для каталога, в котором находится этот файл. Имейте в виду, что право на запись в каталог дает большие полномочия, и предоставляйте это право с осторожностью. Правда, существует способ несколько обезопасить себя в случае, когда необходимо предоставить право на запись другим пользователям, - установка флага Sticky bit на каталог. Но об этом будет сказано чуть позже.

В табл. 17.2 приведены примеры некоторых действий над файлами и мини­мальные права доступа, необходимые для выполнения этих операций.

Примеры прав доступа Таблица 17.2

Команда

Смысл действия

Минимальные права доступа

Для обычного файла

Для каталога, содержащего файл

cd /u/andrey

Перейти в каталог /u/andrey

__

x

ls /u/andrey/*.c

Вывести все файлы с расширением с этого каталога

__

r

ls -s /u/andrey/*.c

Вывести дополнительную информацию об этих файлах (размер)

__

rx

cat report.txt

Вывести на экран содержимое файла report.txt

r

x

cat >>report.txt

Добавить данные в файл report.txt

w

x

runme.sh

Выполнить скрипт командного интерпретатора runme.sh

x

x

runme

Выполнить программу runme

rx

x

rm runme

Удалить файл runme в текущем каталоге

__

xw

Операционная система производит проверку прав доступа при создании, открытии (для чтения или записи), запуске на выполнение или удалении файла. При этом выполняются следующие проверки:

  • Если операция запрашивается суперпользователем, доступ разрешается. Никакие дополнительные проверки не производятся. Это позволяет администратору иметь неограниченный доступ ко всей файловой системе.

  • Если операция запрашивается владельцем файла, то:

    • если требуемое право доступа определено (например, при опера­ции чтения файла установлено право на чтение для владельца-пользователя данного файла), доступ разрешается,

    • в противном случае доступ запрещается.

  • Если операция запрашивается пользователем, являющимся членом группы, которая является владельцем файла, то:

    • если требуемое право доступа определено, доступ разрешается,

    • в противном случае доступ запрещается.

  • Если требуемое право доступа для прочих пользователей (other) уста­новлено, доступ разрешается, в противном случае доступ запрещается.

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

----rw-r-- 2 andy group 65 Dec 22 19:13 filel

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]