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

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

Ссылки по теме

- Пользователи и группы
- umask (Русский)
- Списки управления доступом
- Capabilities (Русский)
- Расширенные атрибуты

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

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

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

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

    $ ls -l /путь/к/каталогу

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

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

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

Каждая из трёх триад разрешений (`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 archie  4096 июл  5 17:37 Документы

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

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

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

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

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

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

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

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

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

    -rw-r--r-- 1 archie web  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 web 4096 июл 5 17:37 Документы`

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

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

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

Разрешения можно восстановить:

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

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

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

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

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

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

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

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

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

    $ chmod g=rw foobar

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

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

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

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

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

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

    $ chmod g+w foobar

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

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

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

    $ chmod a-w foobar

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

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

    $ chmod -R a+rX ./data/

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

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

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

    $ chmod g=u foobar

После: `-rw-rw-r-- 1 archie web 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 web 5120 июн 27 08:28 foobar`

    $ chmod 664 foobar

После: `-rw-rw-r-- 1 archie web 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 /путь/к/файлу

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

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

Смотрите статью Расширенные атрибуты.

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

### Preserve root

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

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

- chattr — Википедия
- Linux File Permission Confusion
- Linux File Permission Confusion part 2
- Backup and restore file permissions in Linux
- Why is "chmod -R 777 /" destructive?
- The How and Why of User Private Groups in Unix

Categories:

- File systems (Русский)
- Command-line (Русский)