Права доступа к файлам и директориям в UNIX-подобных системах. Настройка прав доступа к файлам и директориям

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

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

При создании файла у него появляется владелец, то есть пользователь, который запустил процесс его создания. Также определяется группа, которая будет иметь права на этот файл. Изменять владельца файла и группу файла можно при помощи команд chown и chgrp.

Команды chown и chgrp

Команда chown (расшифровывается как “change owner”) используется для изменения владельца файла. При этом выполнять изменение владельца должен обязательно суперпользователь. Вам нужно ввести название команды, затем имя пользователя, которого вы собираетесь сделать владельцем файла, и в конце название файла:

# chown имя_пользователя название_файла

Команда chgrp (сокращение от “change group”) используется для изменения группы файла. При этом выполнить команду может как суперпользователь, так и владелец файла, но он обязательно должен быть членом группы, которой он хочет передать права на файл. Вам нужно ввести команду, название группы файлов, которой вы передаете права, а затем название файла:

# chgrp название_группы название_файла

Сразу расскажу о полезном ключе -R (расшифровывается как “recursively”). Он позволяет применять команду не только к текущей директории, но и ко всем поддиректориям. Ключ можно использовать и с chown, и с chgrp. Использовать такую рекурсивную команду удобно в случае большой вложенности.

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

Зачем настраивать права доступа?

Права доступа всегда необходимо назначать и разграничивать - это крайне важный момент обеспечения безопасности вашей Linux-системы. В случае, когда хакеру удастся получить доступ к одному из ваших пользователей, грамотно настроенные права доступа к файлам и каталогам не дадут ему возможности сделать много неприятностей. Иными словами, настройка прав доступа даст вам возможность максимально ограничить ваши данные от попадания в чужие руки (естественно, если речь не идет о root или sudo пользователях без ограничений, которые могут изменять любые права под себя).

Как смотреть права доступа?

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

После ввода этой команды вы увидите содержимое текущего каталога, а также информацию о владельце и правах доступа.

Пример отобразившейся информации:

Total 32 drwxr-xr-- 2 root root 4096 May 7 2016 bin drwxr-xr-- 2 root root 4096 May 7 2016 etc drwxr-xr-- 2 root root 4096 Aug 11 2016 games drwxr-xr-- 2 user1 users May 5 12:00 Images drwxr-xr-- 2 root root 4096 Mar 23 2016 sbin -rw-r--r-- 1 root root May 6 20:28 file1.txt -rw-r--r-- 1 root root May 6 09:58 kdm.log

Разберемся, что означают эти строки.

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

Помимо них есть и другие обозначения:

  • b — файл блочного устройства;
  • c — файл символьного устройства;
  • s — доменное гнездо (socket);
  • p — именованный канал (pipe);
  • l — символическая ссылка (link).

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

  • r - read - право на чтение;
  • w - write - право на запись (изменение, в том числе и удаление);
  • x - execute - право на выполнение этого файла (если речь о каталоге, то просмотр оглавления и поиск в нем);
  • - (прочерк) вместо одной из букв говорит о том, что соответствующего права у вас нет.

Поэтому по записи

Rw-r--r-- 1 root root May 6 20:28 file1.txt

можно сказать о том, что это обычный файл, владельцем которого является пользователь root, и он может читать и изменять этот файл.

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

В рассматриваемом нами примере выше у группы root будут права только на чтение файла.

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

Изменение прав доступа

Для назначения и изменения прав доступа используется команда chmod (сокращенно от change mode). Она вводится в командную строку по следующей логике:

chmod кто=права файл/каталог

Вместо «кто» вам нужно подставить обозначение того, для кого будет назначены права доступа. Существуют следующие обозначения:

  • u - user - владелец файла;
  • g - group - группа, которой принадлежит файл;
  • o - other - остальные пользователи;
  • a - all - все (вместо сочетания ugo).

Наконец, вместо «файл/каталог» вам нужно написать в команде название файла или каталога, права к которому вы хотите изменить.

Примеры

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

Даже если до этого у пользователей было больше прав (например, они могли еще и изменять файл), то теперь у них останется только право на чтение:

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

Chmod ug=rw file1.txt

Комбинировать можно и сами файлы или каталоги (если вы хотите изменить права сразу для нескольких файлов):

Chmod ug=rw file1.txt file2.txt

Добавление и исключение прав

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

К примеру, команда

Chmod o+w file.txt

даст остальным пользователям возможность редактировать этот файл.

Копирование прав

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

Chmod o=u file.txt

Но менять сами права при вводе команды такой конструкции нельзя.

Цифровое обозначение

Наверняка вы ни раз сталкивались с тем, что папкам или файлам даются права доступа в виде цифр. Например, 754, 755, 774 и т.д.

Каждая из цифр - это то же обозначение прав доступа для владельца, группы и остальных пользователей соответственно.

Расшифровка: чтение (r) - 4, запись (w) - 2 и выполнение (x) - 1. Если сложить все эти права, то получится 7 - такое право доступа может быть у владельца файла. Группа может иметь право на чтение и запись (4+2) - обозначается 1. И так далее.

Чтобы было понятнее:

Такая запись пошла из двоичного кодирования восьмеричных цифр, то есть 754 - это восьмеричная запись 9 бит, которые задают права для файла или каталога.

При желании вы можете использовать команду chmod с цифровым кодированием:

Chmod 754 file1.txt

Примеры

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

Дополнительно

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

В Filezilla:

Для правильной работы PHP-скриптов и обеспечения безопасности данных необходимо установить определенные права доступа к файлам и директориям с помощью команды chmod или средствами FTP-клиента либо файлового менеджера контрольной панели хостинга. Как узнать, какое значение прав доступа нужно применить для достижения оптимального результата?

Владелец и группа

В файловых системах операционных систем типа UNIX (Linux, FreeBSD и т.п.) в свойствах каждого элемента файловой системы (файла или директории) содержится информация о его владельце и группе .

Владелец файла/директории - имя пользователя операционной системы, которому «принадлежит» файл или директория.
Группа - наименование группы пользователей операционной системы, членам которой предоставлен доступ к файлу или директории.

Запомните, что у каждого файла и директории владелец и имя группы могут быть различными. Например, если FTP-подключение и веб-сервер запускаются на хостинге различными пользователями (к примеру, ftp-user и Apache ), то у файлов, загруженных по FTP, владельцем будет ftp-user , а у файлов, созданных с помощью PHP-скрипта (например, распакованные во время установки WebAsyst), владельцем будет Apache .

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

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

  • первая цифра означает права доступа владельца;
  • вторая цифра означает права доступа членов группы;
  • третья цифра означает права доступа остальных пользователей системы.

Каждая цифра является суммой фиксированных значений доступа:

1 (обозначается также буквой x ) - выполнение. Делает файл исполняемым (программой), а для директории позволяет изменять ее содержимое (например, создавать, удалять или переименовывать файлы внутри нее).
2 (обозначается также буквой w ) - перезапись. Позволяет перезаписывать содержимое файла, а для директории позволяет выполнять ее переименование.
4 (обозначается также буквой r ) - чтение. Позволяет считывать содержимое файла, а для директории - считывать список имен вложенных поддиректорий и файлов.

Пример

750 = (1+2+4)(1+4)()

В этом примере владельцу разрешены выполнение, перезапись и чтение (1, 2 и 4), членам группы - только выполнение и чтение (1 и 4), а остальным пользователям операционной системы доступ запрещен.

Директории и файлы WebAsyst

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

Несколько практических задач с решениями

  1. Какие права нужно установить для файла, чтобы редактировать его по FTP?

    Это зависит от имени владельца и группы файлов/директорий, а также того, какой из пользователей входит в какую группу. Рассмотрим все это на примере.

    Дано :
    На сервере есть пользователи ftp-user и Apache и группа group , в которую входит пользователь ftp-user .
    Владелец файла - Apache , имя группы - group .
    Необходимо обеспечить возможность редактирования файла и PHP-скриптам (пользователь Apache ), и FTP-клиенту (пользователь ftp-user ). При этом любой другой доступ в целях безопасности должен быть запрещен.

    Решение :
    Права доступа владельца : поскольку владелец - тот же пользователь, который исполняет PHP-скрипты (в этом примере Apache ), то ему нужно предоставить права чтения (4) и перезаписи (2) - для исполнения PHP-кода и перезаписи файла (например, при обновлении скриптов). Следовательно, первая цифра 2+4=6.
    Права доступа группы ftp-user group ), значит, членам группы нужны права на чтение и перезапись, т.е. 2+4=6.

    660 и выполняем команду chmod :

    Chmod 660 index.php

  2. Какие права нужно установить для директории, чтобы редактировать по FTP файлы внутри нее?

    Дано :
    Владелец директории - Apache , имя группы - group .

    Решение :
    Права доступа владельца : допустим, что владельцу (в данном случае PHP-скриптам «в лице» веб-сервера) для нормальной работы программы необходим иметь полный доступ к файлам внутри директории, следовательно, значение 1+2+4=7.
    Права доступа группы : FTP-соединение работает от имени пользователя ftp-user , который входит в группу файла (group ), значит, членам группы нужны права на чтение и выполнение (изменение содержимого директории), т.е. 1+4=5.
    Права доступа остальных пользователей : поскольку все нужные права доступа уже предоставлены, больше ничего назначать не нужно, значит, оставляем 0.

    Составляем окончательное число из отдельных значений и получаем 750 и выполняем команду chmod :

    Chmod 750 published

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

Виртуальный хостинг

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

Поскольку система Linux с самого начала разрабатывалась как многопользовательская, в ней предусмотрен такой механизм, как права доступа к файлам и каталогам. Он позволяет разграничить полномочия пользователей, работающих в системе. В частности, права доступа позволяют отдельным пользователям иметь «личные» файлы и каталоги. Например, если пользователь student создал в своём домашнем каталоге файлы, то он является владельцем этих файлов и может определить права доступа к ним для себя и остальных пользователей. Он может, например, полностью закрыть доступ к своим файлам для остальных пользователей, или разрешить им читать свои файлы, запретив изменять и исполнять их.

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

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

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

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

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

drwx------ 2 student student 4096 Фев 19 17:30 Documents

Rw-r--r-- 1 student student 0 Фев 20 08:03 file.txt

drwx------ 2 student student 4096 Фев 19 15:59 tmp

drwxr-xr-x 4 root root 4096 Фев 15 08:32 cache

drwxr-xr-x 11 root root 4096 Фев 9 15:29 lib

drwxr-xr-x 6 root root 4096 Фев 20 07:32 lock

drwxr-xr-x 14 root root 4096 Фев 20 07:32 log

lrwxrwxrwx 1 root root 10 Фев 5 13:22 mail -> spool/mail

drwxr-xr-x 5 root root 4096 Фев 17 03:38 run

drwxr-xr-x 6 root root 4096 Фев 20 07:32 spool

drwxr-xr-x 3 root root 4096 Фев 15 09:24 www

Для файла ~/file.txt первое поле в строке ("-rw-r--r--") отражает права доступа. Третье поле указывает на владельца файла (student), четвёртое поле указывает на группу, которая владеет этим файлом (student). Последнее поле - это имя файла (file.txt). Другие поля описаны в документации к команде ls.

Данный файл является собственностью пользователя student и группы student. Последовательность "-rw-r--r--" показывает права доступа для пользователя - владельца файла, пользователей - членов группы-владельца, а также для всех остальных пользователей.

Первый символ из этого ряда ("-") обозначает тип файла. Символ "-" означает, что это - обычный файл, который не является каталогом (в этом случае первым символом было бы "d"), символьной ссылкой (было бы "l") или псевдофайлом устройства (было бы "c" или "b"). Следующие три символа ("rw-") представляют собой права доступа, предоставленные владельцу student. Символ "r" - сокращение от read (англ. читать), а "w" - сокращение от write (англ. писать). Таким образом, student имеет право на чтение и запись (изменение) файла file.txt.

После символа "w" мог бы стоять символ "x", означающий наличие прав на исполнение (англ. execute, исполнять) файла. Однако символ "-", стоящий здесь вместо "x", указывает, что student не имеет права на исполнение этого файла. Это разумно, так как файл file.txt не является программой. В то же время, пользователь, зарегистрировавшийся в системе как student, при желании может предоставить себе право на исполнение данного файла, поскольку является его владельцем. Для изменения прав доступа к файлу или каталогу используется команда chmod.

Следующие три символа ("r--") отражают права доступа группы к файлу. Группой-собственником файла в нашем примере является группа student. Поскольку здесь присутствует только символ "r", все пользователи из группы student могут читать этот файл, но не могут изменять или исполнять его.

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

Для ~/Documents первое поле содержит "drwx------". Это каталог (на что указывает первая символ - буква "d"), владелец которого (student) может читать, писать и переходить в него. Другие пользователи - как члены группы student, так и все прочие - никаких прав не имеют и ни перейти, ни прочитать содержимое этого каталога, ни, тем более, что-либо в него записать не могут.

Для /var/adm первое поле содержит "drwxr-xr-x". Это каталог, владелец которого - root - имеет права "rwx" - т.е. может читать, писать и переходить в этот каталог. Пользователи из группы root имеют права "r-x" - т.е. могут читать содержимое каталога и переходить в него. Те же права и у всех остальных пользователей.

Для /var/empty первое поле содержит "dr-xr-xr-x". Это каталог, владелец которого (root), группа (root) и все остальные пользователи имеют одинаковые права "r-x" - т.е. могут читать содержимое каталога и переходить в него, что соответствует названию каталога (empty - пустой). Правда, стоит отметить, что root записать что-либо в этот каталог всё-таки может, поскольку на суперпользователя права доступа не распространяются.

Для /var/nobody первое поле содержит "drwxr-x---". Это каталог, владелец которого - root - имеет права "rwx". Группа - nobody - имеет права "r-x", т.е. может переходить в каталог и читать его. Прочие пользователи доступа к каталогу не имеют. Такие права объясняются тем, что nobody - это псевдопользователь, и /var/nobody - его домашний каталог (см. запись в /etc/passwd). Это бесправный пользователь, и даже прав на запись чего-либо в свой домашний каталог у него нет.

Для /var/mail в первом поле стоит "lrwxrwxrwx". Первый символ - "l" - означает символьную ссылку. Согласно выводу ls -l, эта ссылка на /var/spool/mail (путь spool/mail указан относительно каталога, где размещена ссылка - т.е. /var). Права доступа к файлу или каталогу, на который ссылается символьная ссылка, определяется правами на сам файл, а не правами ссылки. Поэтому здесь права доступа ничего не означают.

Также видно два особых случая. Первый - это /var/tmp. Права на этот каталог - "rwxrwxrwt". Последняя "t" означает наличие на каталоге дополнительного флага - т.н. sticky bit. Это каталог для временных файлов и в него разрешена запись всем пользователям. Однако удалять из него пользователи могут только свои файлы.

Второй случай - это /bin/su . Здесь права - "rws--x---". Владелец файла (root) может его читать, записывать и запускать. Пользователи, включённые в группу wheel, могут только запускать этот файл, прочитать и тем более записать его они не имеют права. Все прочие пользователи никаких прав на этот файл не имеют. Буква "s" вместо "x" для прав владельца файла имеет особый смысл. Это т.н. SUID bit, и его наличие означает, что данная программа будет запускаться не с правами пользователя, а с правами владельца файла. Иными словами, непривилегированный пользователь (входящий в группу wheel!) может запустить эту программу и получить права её владельца - т.е. суперпользователя.

Как говорилось, удалённо войти в систему с правами суперпользователя нельзя. Программа /bin/su является одним из способов повысить права обычного пользователя до администратора системы. Именно поэтому её выполнение разрешено только пользователям из группы wheel.

Возможность доступа к файлу зависит также от прав доступа к каталогу, в котором находится файл. Например, даже если права доступа к файлу установлены как "rwxrwxrwx", другие пользователи не могут получить доступ к файлу, пока они не имеют прав на исполнение для каталога, в котором находится файл. Другими словами, чтобы воспользоваться имеющимися у вас правами доступа к файлу, вы должны иметь право на исполнение для всех каталогов вдоль пути к файлу. Например, псевдопользователь nobody не сможет прочитать файл ~/file.txt, несмотря на то, что права на этот файл - "rw-r--r--", т.к. права доступа к домашнему каталогу /home/student/ - "rwx------".

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

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

Каждому файлу соответствует набор прав доступа, представленный в виде девяти битов режима. Он определяет, какие пользователи имеют право читать файл, записывать в него данные или выполнять его. Вместе с другими тремя битами, влияющими на запуск исполняемых файлов, этот набор образует код режима доступа к файлу. Двенадцать битов режима хранятся в 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 ). По соглашению сценарии начинаются со строки примерно такого вида:

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

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

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

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

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

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

% ls -1 /bin/sh

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

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

Тип файла

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

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

Обычный файл

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

m kdir

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

m knod

r m

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

m knod

socket(2)

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

Следующие девять символов в этом поле — это три набора битов режима. В листинге команды 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

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

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

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

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

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

% ls -lo /kernel

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

# chflags noschg /kernel

# ls -lo /kernel

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Символ 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

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

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

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

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

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



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: