9.2. Права доступа

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

Информация о правах доступа хранится в виде четырёх восьмеричных цифр, каждая из которых определяет различный набор прав доступа. Существуют такие права доступа: для пользователя, для группы и для остальных. Четвёртая восьмеричная цифра используется для хранения специальной информации: идентификатора пользователя (UID), идентификатора группы (GID) и sticky-бита. Ниже представлен перечень восьмеричных значених, присваиваемых различным режимам доступа (им также соответствуют буквенные обозначения, которые могут быть просмотрены программами типа ls и могут быть изменены командой chmod):

Таблица 9-1. Права доступа в виде восьмеричных цифр

Тип доступа Восьмеричное значение Буквенное обозначение
“sticky”-бит 1 t
установка ID пользователя 4 s
установка ID группы 2 s
чтение 4 r
запись 2 w
выполнение 1 x

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

Права доступа к bash'у по умолчанию:

% ls -l /bin/bash
-rwxr-xr-x   1 root     bin  477692 Mar 21 19:57 /bin/bash

Для каталога первый дефис заменяется на букву “d”. Затем следуют три группы прав доступа (владелец, группа и остальные). В примере видно, что владелец имеет права на чтение, запись и выполнение (rwx). Группа имеет только права на чтение и выполнение (r-x). И все остальные имеют права только на чтение и выполнение (r-x).

Каким же образом можно установить права доступа к другому файлу такие же, как у bash'а? Сначала давайте создадим файл для примера:

% touch /tmp/example
% ls -l /tmp/example
-rw-rw-r---  1 david    users    0 Apr 19 11:21 /tmp/example

Для изменения прав доступа к файлу example нужно воспользоваться командой chmod(1) (он англ. “change mode”). Просто добавьте необходимые восьмеричные цифры, чтобы получить требуемые права доступа. Чтобы пользователь имел права на чтение, запись и выполнение, мы получим цифру 7. Для чтения и записи - 5. Сложите их вместе (не суммируйте!) и передайте в качестве аргумента в chmod:

% chmod 755 /tmp/example
% ls -l /tmp/example
-rwxr-xr-x   1 david    users    0 Apr 19 11:21 /tmp/example

Вы могли бы задать вопрос: “Почему бы просто не создать файл уже с такими правами доступа?” Ответ очень прост. bash содержит небольшую встроенную команду под названием umask. Она включена в большинство командных процессоров Unix и управляет правами доступа, которые назначаются новым создаваемым файлам. Мы рассмотрели немного встроенных команд bash'а в Разд. 8.3.1. Работа umask очень похожа на работу chmod, только в обратном порядке. Вы указываете восьмеричные значения, которые не должны присутствовать в правах для создаваемых файлов. По умолчанию значение umask составляет 0022.

% umask
0022
% umask 0077
% touch tempfile
% ls -l tempfile
-rw--------  1 david    users    0 Apr 19 11:21 tempfile

Дополнительную информацию смотрите на странице руководства bash.

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

% chmod 6755 /tmp/example
% ls -l /tmp/example
-rwsr-sr-x   1 david    users    0 Apr 19 11:21 /tmp/example

Если вас смущают восьмеричные числа, при работе с chmod вы можете использовать буквы. Наборы прав доступа:

Владелец u
Группа g
Остальные o
Всё выше перечисленное a

Для получения результатов из приведенных выше примеров нам потребуется воспользоваться несколькими командами:

% chmod a+rx /tmp/example
% chmod u+w /tmp/example
% chmod ug+s /tmp/example

Некотрые люди предпочитают использовать буквы, а не числа. В любом случае права доступа будут получены точно такие же.

Работа с восьмеричным форматом зачастую оказывается быстрее, и вы часто будете встречать его в shell-скриптах. Однако иногда использование букв оказывается более продуктивным. Например, при использовании восьмеричного формата нет простого способа изменения прав доступа к файлам и каталогам для группы, на затрагивающего при этом других групп. А при использовании букв - это простая задача.

% ls -l /tmp/
-rwxr-xr-x   1 alan    users    0 Apr 19 11:21 /tmp/example0
-rwxr-x---   1 alan    users    0 Apr 19 11:21 /tmp/example1
----r-xr-x   1 alan    users    0 Apr 19 11:21 /tmp/example2
% chmod g-rwx /tmp/example?
-rwx---r-x   1 alan    users    0 Apr 19 11:21 /tmp/example0
-rwx------   1 alan    users    0 Apr 19 11:21 /tmp/example1
-------r-x   1 alan    users    0 Apr 19 11:21 /tmp/example2

Выше мы несколько раз упоминали о правах доступа, связанных установкой ID пользователя (SIUD, set user ID) и ID группы (SGID, set group ID). Вас могло заинтересовать, что же это такое. Обычно, когда вы запускаете программу, она работает под вашей учётной записью. Другими словами она имеет права, которые есть у вас как у пользователя. То же самое касается и группы. Когда вы запускаете программу, она выполняется с правами вашей текущей группы. С правами доступа, устанавливающими идентификатор пользователя, вы можете заставить программу всегда выполняться с правами её владельца (например “root”'а). Установка идентификатора группы работает точно так же, но только по отношению к группе.

Будьте осторожны с этими битами. SUID- и SGID-программы могут нанести серьёзный ущерб безопасности вашей системы. Если вы часто устанавливаете SUID-биты на программы, владельцем которых является root, тем самым вы позволяете любым пользователям запускать эти программы с правами root'а. Поскольку он не имеет никаких ограничений в системе, вы можете представить, насколько это может быть опасным для безопасности вашей системы. Короче говоря, устанавливать ID пользователя и группы не так уж и плохо, однако используйте их только в общих случаях.