File permissions and attributes (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи File permissions and attributes. Дата последней синхронизации: 10 февраля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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

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

Просмотр разрешений

Чтобы посмотреть разрешения (или права файла), используйте команду ls с опцией -l для просмотра содержимого каталога, например:

$ ls -l /путь/к/каталогу
итого 128
-rw-rw-r-- 1 archie users  5120 апр 27 08:28 customers.ods
-rw-r--r-- 1 archie users  3339 апр 27 08:28 todo
-rwxr-xr-x 1 archie users  2048 май  6 12:56 myscript.sh
drwxr-xr-x 6 archie users  4096 июл  5 17:37 Документы
drwxr-xr-x 2 archie users  4096 июл  5 13:45 Загрузки
drwxr-xr-x 2 archie users  4096 июл  5 21:03 Рабочий стол

Здесь мы должны сосредоточиться на первом столбце. Например, обратив внимания на значение drwxrwxrwx+, каждый символ которого объясняется в следующих таблицах:

d rwx rwx rwx +
Обозначет тип файла, технически не относится к разрешениям. Смотрите типы файлов (UNIX) для ознакомления со всеми возможными значениями. Разрешения, которые имеет владелец к файлу (объяснения ниже). Разрешения, которые имеет группа к файлу (объяснения ниже). Разрешения, которые имеют все остальные пользователи к файлу (объяснения ниже). Одиночный символ, который указывает на применение альтернативного метода доступа. Пробел указывает на отсутствие альтернативного метода доступа. Символ . обозначает файл с контекстом безопасности, но без другого альтернативного метода доступа. Файл с любой другой комбинацией альтернативных методов доступа помечается символом +, например в случае Access Control Lists (Русский).

Каждая из трёх триад разрешений (rwx в примере выше) может состоять из следующих символов:

Символ Влияние на файлы Влияние на директории
Разрешение на чтение (первый символ) - Файл не может быть прочитан. Содержимое каталога не может быть показано.
r Файл можно прочитать. Содержимое каталога может быть показано.
Разрешение на запись (второй символ) - Файл не может быть изменён. Содержимое каталога не может быть изменено.
w Файл может быть изменён. Содержимое каталога может быть изменено (создание новых файлов или папок; переименовывание и удаление существующих файлов или папок); дополнительно требуется разрешение на выполнение, в противном случае, это разрешение не действует.
Разрешение на выполнение (третий символ) - Файл не может быть выполнен. Каталог не может быть доступен с помощью cd.
x Файл может быть выполнен. Доступ к каталогу можно получить с помощью cd. Это единственный бит, который на практике можно считать «наследуемым» от каталогов-предков; фактически, если какой-либо каталог в пути не имеет установленного бита x, конечный файл или каталог также оказывается недоступен независимо от его разрешений; подробнее смотрите path_resolution(7).
s Показывает установленный suid бит: в триаде пользователя — setuid; в триаде группы — setgid; в триаде остальных не встречается; также подразумевает, что установлен бит x.
S То же, что и s, но бит x не установлен; редко встречается у обычных файлов, бесполезен для каталогов.
t Sticky bit; встречается только в триаде остальных; также подразумевает, что установлен бит x.
T То же, что и t, но бит x не установлен; редко встречается у обычных файлов.

Смотрите info Coreutils -n "Mode Structure" и chmod(1) для более подробной информации.

Совет: Также можно посмотреть разрешения с помощью команды namei -l путь.

Примеры

Давайте посмотрим несколько примеров для лучшего понимания:

drwx------ 6 archie users  4096 июл  5 17:37 Документы

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

dr-x------ 6 archie users  4096 июл  5 17:37 Документы

Archie имеет полный доступ, за исключением создания, переименовывания и удаления файлов. Он может просматривать список файлов и (если позволяют разрешения к файлам) может получить доступ к существующему файлу в Документах.

d-wx------ 6 archie users  4096 июл  5 17:37 Документы

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

d--x------ 6 archie users  4096 июл  5 17:37 Документы

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

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

Давайте посмотрим на другой пример, на этот раз файл, а не каталог:

-rw-r--r-- 1 archie users  5120 июн 27 08:28 foobar

Здесь мы видим первой буквой не d, а -. Таким образом мы знаем, что это файл, а не директория. Благодаря разрешению rw- владелец может читать и писать, но не выполнять. Может показаться странным, что у владельца нет всех трёх разрешений, но разрешение x не требуется, так как это файл текста/данных, который может быть прочитан текстовым редактором, например Gedit, EMACS или программным обеспечением подобно R, а не исполнятся самим файлом (если он содержит что-то вроде программного кода на Python, то тогда подобное вполне возможно). Для группы установлены права доступа r--, поэтому у группы есть возможность читать файл, но не записывать и не редактировать его - фактически это установка чего-либо только для чтения. Мы видим, что подобные разрешения применимы и ко всем остальным пользователям.

Изменение разрешений

chmod это команда в Linux и других Unix-подобных операционных системах, которая позволяет изменять права доступа к файлам или каталогам.

Текстовый метод

Для изменения прав доступа - или режима доступа - к файлу используйте команду chmod в терминале. Ниже приведена общая структура команды:

chmod кто=разрешения имя_файла

Где кто - любая из нескольких букв, каждая из которых обозначает, кому дано разрешение. Они следующие:

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

Права доступа обозначаются так же, как описано в разделе #Просмотр разрешений (r, w и x).

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

До: drwxr-xr-x 6 archie users 4096 июл 5 17:37 Документы

$ chmod g= Документы
$ chmod o= Документы

После: drwx------ 6 archie users 4096 июл 6 17:32 Документы

Здесь, поскольку вы хотите отказать в разрешениях, вы не ставите никаких букв после =, где будут введены разрешения. Из этого видно, что только разрешения владельца - это rwx, а все остальные разрешения - это -.

Это можно восстановить с помощью:

До: drwx------ 6 archie users 4096 июл 6 17:32 Документы

$ chmod g=rx Документы
$ chmod o=rx Документы

После: drwxr-xr-x 6 archie users 4096 июл 6 17:32 Документы

В следующем примере вы предоставляете права на чтение и выполнение группе и другим пользователям, поэтому вы ставите следующие буквы для этих прав (r и x) после =, не оставляя пробелов.

Вы можете упростить это поместив более одной буквы кто в одну и ту же команду, например:

$ chmod go=rx Документы
Примечание: Не имеет значения, в каком порядке вы ставите буквы кто или буквы разрешений в команде chmod: команды chmod go=rx file и chmod og=xr file делают одно и то же.

Рассмотрим ещё один пример: предположим, вы хотите изменить файл foobar так, чтобы у вас были разрешения на чтение и запись, а коллеги из группы users, которые могут совместно работать с файлом foobar, также могли читать и записывать файл, а все остальные пользователи могли только читать его:

До: -rw-r--r-- 1 archie users 5120 июн 27 08:28 foobar

$ chmod g=rw foobar

После: -rw-rw-r-- 1 archie users 5120 июн 27 08:28 foobar

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

Сокращения для текстового метода

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

Давайте попробуем применить + и - на предыдущем примере добавления разрешений на запись в группу:

До: -rw-r--r-- 1 archie users 5120 июн 27 08:28 foobar

$ chmod g+w foobar

После: -rw-rw-r-- 1 archie users 5120 июн 27 08:28 foobar

Ещё пример, который запрещает запись абсолютно всем (a):

До: -rw-rw-r-- 1 archie users 5120 июн 27 08:28 foobar

$ chmod a-w foobar

После: -r--r--r-- 1 archie users 5120 июн 27 08:28 foobar

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

$ chmod -R a+rX ./data/

Копирование разрешений

С помощью chmod можно взять разрешения у одного класса, например владельца, и выставить те же разрешения группе или даже всем. Для этого вместо r, w или x после = поставьте нужную вам букву кто. Например:

До: -rw-r--r-- 1 archie users 5120 июн 27 08:28 foobar

$ chmod g=u foobar

После: -rw-rw-r-- 1 archie users 5120 июн 27 08:28 foobar

Эта команда по сути означает «изменить разрешения группы (g=), чтобы они были такими же, как у владельца (=u)». Обратите внимание, что вы не можете скопировать одновременно несколько разрешений или добавить новые, то есть такая команда:

$ chmod g=wu foobar

выдаст ошибку.

Числовой метод

Команда chmod позволяет задавать разрешения в виде чисел.

Использование чисел — это ещё один метод, который позволяет редактировать разрешения одновременно для владельца, группы и остальных, а также биты setuid, setgid и sticky. Основная структура такова:

$ chmod xxx путь

где xxx это три цифры, каждое их которых может иметь значение от 0 до 7. Первая цифра задаёт разрешения для владельца, вторая — для группы, а третья — для всех остальных.

Права r, w и x соответствуют следующим числам:

r=4
w=2
x=1

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

  • Владелец: rwx=4+2+1=7
  • Группа: r-x=4+0+1=5
  • Остальные: r-x=4+0+1=5
$ chmod 755 путь

Это эквивалентно следующим двум командам:

$ chmod u=rwx путь
$ chmod go=rx путь

Чтобы посмотреть текущие права в числовом виде, можно использовать команду stat(1):

$ stat -c %a путь

где %a задаёт числовой формат вывода.

Большинство каталогов имеют значение 755, которое разрешает чтение, запись и выполнение для владельца, но запрещает запись для всех остальных, а файлы обычно имеют значение 644, разрешающее чтение и запись для владельца, но только чтение для всех остальных; так как большинство файлов не являются исполняемыми, то бит выполнения x у них не установлен.

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

До: -rw-r--r-- 1 archie users 5120 июн 27 08:28 foobar

$ chmod 664 foobar

После: -rw-rw-r-- 1 archie users 5120 июн 27 08:28 foobar

Для исполняемого файла вы могли бы задать 774, если бы вы хотели предоставить разрешение на исполнение владельцу и группе. Если бы вы хотели, чтобы у всех было разрешение только на чтение, число было бы 444. Если рассматривать r как 4, w как 2 и x как 1, то это, вероятно, самый простой способ вычислить числовые значения для использования chmod xxx путь, но существует также двоичный метод, при котором каждое разрешение рассматривается как двоичное число, а затем они объединяются в обычное десятичное число. Этот способ немного более запутанный, но для полноты картины он здесь приведён.

Рассмотрим такой набор разрешений:

-rwxr-xr--

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

-rwxrwxr-x
 111111101

Затем можно преобразовать двоичные числа:

000=0	    100=4
001=1	    101=5
010=2	    110=6
011=3	    111=7

Итоговое значение получается 775.

Допустим, мы хотим удалить разрешение на запись из группы:

-rwxr-xr-x
 111101101

Итоговое значение будет равно 755, и вы можете использовать команду chmod 755 имяфайла, чтобы снять разрешение на запись. Обратите внимание, что вы получите одно и то же трёхзначное число независимо от того, какой метод вы используете. Используете ли вы текст или цифры, зависит от личных предпочтений и скорости набора текста. Если вы хотите вернуть файлу или каталогу права по умолчанию, например, разрешение на чтение и запись (и выполнение) для владельца, но запретить запись для всех остальных, может быть быстрее использовать chmod 755/644 имяфайла. Однако если вы меняете разрешения на что-то нестандартное, проще и быстрее использовать текстовый метод, а не выполнять преобразование в числа, в процессе которого можно случайно ошибиться. Для пользователя, который использует chmod изредка, вероятно, нет существенной разницы в скорости использования обоих методов.

Вы также можете использовать числовой метод для установки битов setuid, setgid и sticky, используя четыре цифры.

setuid=4
setgid=2
sticky=1

Например, chmod 2777 имяфайла выдаст всем права на чтение/запись/выполнение и включит бит setgid.

Массовое изменение разрешений

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

Чтобы выставить разрешения 755 только каталогам:

$ find каталог -type d -exec chmod 755 {} +

Чтобы выставить разрешения 644 только файлам в каталоге:

$ find каталог -type f -exec chmod 644 {} +

Изменение владельца

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

Рассмотрим следующий пример: создание нового раздела с помощью GParted для резервного копирования данных. Gparted делает всё это от имени root, поэтому по умолчанию всё принадлежит root. Всё это хорошо, но обычные пользователи не смогут записать данные в смонтированный раздел.

brw-rw---- 1 root disk 8,    9 июл  6 16:02 sda9
drwxr-xr-x 5 root root    4096 июл  6 16:01 Backup

В данном примере устройством в /dev владеет root, как и каталогом для монтирования (/media/Backup). Чтобы изменить владельца каталога, можно сделать следующее:

До: drwxr-xr-x 5 root root 4096 июл 6 16:01 Backup

# chown archie /media/Backup

После: drwxr-xr-x 5 archie root 4096 июл 6 16:01 Backup

Теперь новый владелец archie может записывать данные в этот раздел без изменения разрешений (потому что изначально уже стояли права rwx, разрешающие запись владельцу).

Примечание:
  • chown всегда сбрасывает биты setuid и setgid.
  • Обычные пользователи не могут использовать chown для «передачи» файлов, которыми они владеют, другому пользователю.

Списки управления доступом

Списки управления доступом (Access Control Lists, ACL) предоставляют дополнительный, более гибкий механизм разрешений для файловых систем, позволяя устанавливать разрешения для любого пользователя или группы на любой файл.

Umask

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

Атрибуты файла

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

Важно: По умолчанию cp, rsync и другие подобные программы не сохраняют эти атрибуты.

Пакет e2fsprogs содержит программы lsattr(1) и chattr(1), которые позволяют просмотреть и изменить атрибуты файла соответственно.

Здесь приведены некоторые полезные атрибуты. Не все файловые системы поддерживают каждый упомянутый атрибут.

  • a - append only: Файл может быть открыт только для добавления.
  • c - compressed: Включить сжатие на уровне файловой системы для файла.
  • i - immutable: Не может быть изменён, удалён или переименован. Может быть установлен только пользователем root.
  • j - data journaling: Использовать журнал для записи данных файла так же, как и метаданных.
  • m - no compression: Отключить сжатие на уровне файловой системы для файла.
  • A - no atime update: Время получения доступа к файлу не будет обновляться.
  • C - no copy on write: Отключение copy-on-write на поддерживающих это файловых системах.

Полный список атрибутов и подробную информацию о них можно прочитать в chattr(1).

Пример установки атрибута immutable:

# chattr +i /путь/к/файлу

Для снятия атрибута замените + на -.

Расширенные атрибуты

Расширенные атрибуты (Extended attributes) — это пары ключ-значение, привязанные к файлу или каталогу. Существует четыре их класса: security, system, trusted и user.

Важно: По умолчанию cp, rsync и другие подобные программы не сохраняют расширенные атрибуты, смотртие #Сохранение расширенных атрибутов.

Расширенные атрибуты используются для Capabilities.

Пользовательские расширенные атрибуты

Класс user может использоваться для хранения дополнительной информации о файле. Пример создания атрибута:

$ setfattr -n user.checksum -v "3baf9ebce4c664ca8d9e5f6314fb47fb" foo.txt

Просмотр имеющихся атрибутов:

$ getfattr -d foo.txt
# file: foo.txt
user.checksum="3baf9ebce4c664ca8d9e5f6314fb47fb"

Удаление атрибута:

$ setfattr -x user.checksum foo.txt

Сохранение расширенных атрибутов

Команда Требуемый флаг
cp --preserve=mode,ownership,timestamps,xattr
mv сохраняет по умолчанию1
tar --xattrs для создания --xattrs-include='*' для извлечения
bsdtar -p для извлечения
rsync --xattrs
  1. mv без предупреждения убирает расширенные атрибуты, если целевая файловая система их не поддерживает.

Чтобы сохранить расширенные атрибуты в текстовых редакторах, настройте их на усечение (truncate) файлов при сохранении вместо использования rename(2).[1]

Советы и рекомендации

Preserve root

Используйте флаг --preserve-root, чтобы предотвратить рекурсивное выполнение chmod на /. Это поможет, например, предотвратить удаление бита выполнения во всей системе и тем самым сломать систему. Чтобы использовать этот флаг всегда, пропишите его в псевдониме. Смотрите также [2].

Смотрите также