4.16. Владельцы и права доступа

Несколько раньше в этой главе была описана ситуация, когда при попытке перейти в домашний каталог суперпользователя система выдавала следующее сообщение:

bash: cd: /root/: Permission denied

Это была демонстрация одного из способов защиты системы в Linux. Linux, как и UNIX, является многопользовательской системой и разрешение доступа к файлам — это один из способов ее защиты от злонамеренного вмешательства.

Как мы рассказывали ранее, один из способов получения доступа к требуемому файлу или каталогу, в доступе к которому вам отказано, — ввести в командной строке su -. Человек, знающий пароль суперпользователя, имеет доступ ко всему.

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

Все файлы и каталоги «находятся в собственности» пользователя, который их создал. Ранее вы создавали файл example1.txt (вспомните Разд. 4.12.1, Перенаправление стандартного вывода) в вашем домашнем каталоге, таким образом вы являетесь владельцем файла example1.txt.

Это означает, что вы можете указать, кому разрешено читать этот файл, кто может записывать текст в этот файл, или (если это программа, а не текстовый файл) кто может запускать его на исполнение.

Чтение, запись и запуск на исполнение — вот три действия, на которые требуется разрешение. Так как пользователи при создании учетных записей делятся на группы, вы можете также указать, имеет ли конкретная группа права на чтение, запись или запуск файла на исполнение.

Давайте рассмотрим более тщательно, что сообщает о файле example1.txt команда ls с опцией -l:

[user@localhost ~]$ ls -l example1.txt
-rw-rw-r--  1 user user 42 Мар 24 22:07 example1.txt

Выдается много подробностей. Можно видеть, кто имеет право на чтение (r) и запись (w) в файл, а также кто создал файл (user) и к какой группе принадлежит этот пользователь (user). Напоминаем, что по умолчанию имя группы, к которой принадлежит пользователь, совпадает с именем пользователя.

Остальная информация, выведенная справа от колонки групп, сообщает размер файла, дату и время его создания и его имя.

В первой колонке показаны текущие права доступа. Здесь имеется десять позиций. В первой позиции указывается тип файла. В оставшихся девяти выводятся права доступа для трех классов пользователей.

Пример:

-rw-rw-r--

Три класса пользователей — это владелец файла, члены группы, являющейся владельцем файла, и «остальные», то есть остальные пользователи системы.

  -     (rw-)     (rw-)    (r--) 1 user user 
  |       |         |        | 
 тип   владелец   группа  остальные
(type) (owner)   (group)  (others)
      

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

Далее идут три набора по три символа. Это могут быть:

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

ls -l example1.txt
-rw-rw-r--  1 user user 42 Мар 24 22:07 example1.txt

Владелец файла (в данном случае это user) может читать файл и записывать в него информацию. Группа, тоже user, также может читать файл example1.txt и записывать в него информацию. Этот файл не является программой, поэтому ни владелец, ни группа не могут запустить его на исполнение.

4.16.1. Команда chmod

Для изменения прав доступа используется команда chmod. В следующем примере мы покажем, как можно изменить права доступа к файлу example1.txt при помощи команды chmod.

Вот как выглядят текущие права доступа к рассматриваемому файлу:

-rw-rw-r--  1 user user 42 Мар 24 22:07 example1.txt

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

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

[Предостережение]Предостережение

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

В следующем примере показано, как разрешить всем пользователям читать файл, вносить в него изменения и сохранять их. Для этого надо изменить права доступа группы «остальные».

Введите в командной строке:

ls -l example1.txt

На экран будет выведена следующая информация:

-rw-rw-r--   1 user user 42 Мар 24 22:07 example1.txt

Теперь введите такую команду:

chmod o+w example1.txt

Команда o+w означает, что вы даете права «остальным» («others», обозначается буквой «о») на запись в файл example1.txt. Чтобы увидеть, к чему привело выполнение указанной команды, опять посмотрим на файл:

-rw-rw-rw-  1 user user 42 Мар 24 22:09 example1.txt

Теперь все могут читать и осуществлять запись в файл.

Чтобы запретить чтение файла example1.txt и запись в него, используйте команду chmod.

chmod go-rw example1.txt

Команда go-rw сообщает системе, что вы хотите запретить чтение файла example1.txt и запись в него группе и «остальным».

В результате права доступа будут выглядеть так:

-rw-------  1 user user 42 Мар 24 22:10 example1.txt

Рассмотренные классы и права являются сокращениями от соответствующих английских слов, поэтому их легко запомнить: все, что нужно помнить,  — это несколько символов и букв.

Вот список расшифровок данных сокращений:

Классы

u — пользователь, который является владельцем файла (от английского «user»);

g — группа, к которой принадлежит пользователь (от английского «group»);

o — остальные (не владелец и не группа-владелец, от английского «others»);

a — все (u, g и o, от английского «all»).

Права

r — право на чтение;

w — право на запись;

x — право на исполнение.

Действия

+ — дает право;

- — отбирает право;

= — оставляет только данное право.

Хотите проверить ваши знания? Отберите у всех пользователей все права на файл example1.txt.

chmod a-rwx example1.txt

А сейчас проверьте, можете ли вы прочитать данный файл командой cat example1.txt. Вы должны увидеть следующее:

cat: example1.txt: Permission denied

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

chmod u+rw example1.txt

Чтобы убедиться что вы можете прочитать данный файл, воспользуйтесь командой cat example1.txt.

Приведем несколько примеров использования команды chmod:

  • g+w — дает группе-владельцу право на запись;

  • o-rwx — отбирает все права у остальных пользователей;

  • u+x — дает владельцу право на выполнение файла;

  • a+rw — позволяет любому читать и записывать в файл;

  • ug+r — позволяет владельцу и группе читать файл;

  • g=rx — позволяет группе читать и исполнять файл (не записывать в него).

Опция -R позволяет изменять права для всего дерева каталогов.

Поскольку каталоги нельзя «исполнять» как приложения, добавление или отмена соответствующего права означает разрешение (или запрет) просмотра каталога.

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

Наберите, например:

chmod a-x docs

чтобы отозвать у всех пользователей право на исполнение.

Если теперь вы попытаетесь изменить каталог при помощи команды cd docs, получите отказ:

bash: docs: Permission denied

Верните права себе и своей группе:

chmod ug+x docs

Если вы сейчас проверите результаты своих действий при помощи команды ls -l, вы увидите, что доступ к каталогу docs/ запрещен только остальным пользователям.

4.16.2. Определение прав доступа в виде числового кода

Помните сокращенный вариант записи аргументов команды chmod? Рассмотрим теперь другой способ изменения прав доступа. На первый взгляд он выглядит более сложным.

Вернем первоначальные права доступа к файлу example1.txt:

-rw-rw-r--  1 user user 42 Мар 24 22:07 example1.txt

Каждый тип прав доступа может быть представлен в цифровом виде:

  • r = 4

  • w = 2

  • x = 1

  • - = 0

Для установки определенных прав доступа используется сумма этих значений. Например, если вы хотите дать право на чтение и запись, необходимо использовать число 6, так как 4 (чтение) + 2 (запись) = 6.

Вот цифровой эквивалент прав доступа для файла example1.txt:

-  (rw-)   (rw-)  (r--)
     |       |      |
   4+2+0   4+2+0  4+0+0

Сумма прав пользователя равна 6, сумма прав группы равна 6, и сумма прав остальных пользователей равна 4. Права доступа читаются как 664.

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

Цифровой эквивалент станет равным числу 644.

Чтобы ввести в действие новые настройки, введите:

chmod 644 example1.txt

Теперь проверьте изменения, набрав следующую команду:

ls -l example1.txt

Вывод должен быть:

-rw-r--r--   1 user user 42 Мар 24 22:17 example1.txt

Теперь ни у группы, ни у других пользователей нет права на запись в файл example1.txt. Чтобы вернуть право на запись группе, добавьте значение права на запись (2) ко второму набору разрешений.

chmod 664 example1.txt
[Внимание]Внимание

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

Вот список некоторых часто используемых настроек, цифровых эквивалентов и их значения:

  • -rw------- (600) — только владелец имеет права на чтение и изменение файла;

  • -rw-r--r-- (644) — только у владельца есть права на чтение и изменение; у группы и остальных есть право только на чтение;

  • -rwx------ (700) — только у владельца файла есть права на чтение, изменение и выполнение файла;

  • -rwxr-xr-x (755) — у владельца есть права на чтение, изменение и выполнение, а у группы и остальных пользователей — на чтение и выполнение;

  • -rwx--x--x (711) — у владельца есть права на чтение, изменение и выполнение, а у группы и остальных пользователей — только на выполнение;

  • -rw-rw-rw- (666) — любой пользователь может читать и изменять файл (будьте осторожны с такими правами);

  • -rwxrwxrwx (777) — любой пользователь может читать, изменять и выполнять файл (еще раз предупреждаем, что в общем случае использовать такие разрешения опасно).

Некоторые часто встречающиеся разрешения для каталогов:

  • drwx------ (700) — только владелец может читать и изменять данный каталог;

  • drwxr-xr-x (755) — владелец может читать и изменять каталог, у пользователей и группы есть право на чтение и выполнение.