Product SiteDocumentation Site

9.3. Управление правами

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

9.3.1. Владельцы и разрешения

У каждого файла и каталога имеются специальные разрешения для трёх категорий пользователей:
  • его владельца (обозначается u, от «user»);
  • его группы-владельца (обозначается g, от «group»), представленная всеми членами группы;
  • остальных (обозначается o, от «other»).
Можно комбинировать три основных типа прав:
  • чтение (обозначается r, от «read»);
  • запись (или изменение, обозначается w, от «write»);
  • исполнение (обозначается x, от «eXecute»).
По отношению к файлу, такие права хорошо понятны: доступ для чтения позволяет читать содержимое (включая копирование), доступ для записи позволяет менять содержимое, доступ для исполнения позволяет запускать (работает для программ).
Каталоги обрабатываются иначе. Доступ на чтение даёт право получить список его содержимого (файлов и каталогов), доступ на запись позволяет создавать и удалять файлы, а доступ на исполнение позволяет проходить через него (в частности переходить в него с помощью команды cd). Возможность проходить через каталог, не имея возможности прочесть его, позволяет получить доступ к файлам внутри него, если они известны по имени, но не находить их, если о их существовании или их точных именах не известно.
Три команды для управления разрешениями, связанными с файлом:
  • chown пользователь файл изменяет владельца файла;
  • chgrp группа файл меняет группу-владельца;
  • chmod права файл изменяет разрешения на файл.
Есть два способа представления прав. Из них символьное, пожалуй, более легко для понимания и запоминания. В нём используются указанные выше символы. Можно определить права для каждой категории пользователей (u/g/o), присвоив их явно (с помощью =), добавив (+) или отняв (-). Так, выражение u=rwx,g+rw,o-r даёт владельцу права на чтение, запись и исполнение, добавляет права на чтение и запись для группы-владельца и отнимает право на чтение у остальных пользователей. Права, не затрагиваемые добавлением или отъёмом, остаются без изменений. Буква a (от «all») обозначает все три категории пользователей, так что a=rx даёт всем трём категориям одинаковые права (читать и исполнять, но не записывать).
В цифровом (восьмеричном) представлении каждому праву соответствует конкретное значение: 4 — чтению, 2 — записи, 1 — исполнению. Каждая комбинация прав соответствует сумме этих чисел. Каждое значение затем присваивается своей категории пользователей, будучи записанным подряд с остальными в обычном порядке (владелец, группа, остальные).
Например, команда chmod 754 файл установит следующие права: на чтение, запись и исполнение для владельца (поскольку 7 = 4 + 2 + 1); на чтение и исполнение для группы (поскольку 5 = 4 + 1); только на чтение для остальных. 0 означает отсутствие прав, так что chmod 600 файл разрешает чтение и запись владельцу и не даёт никаких прав группе и всем остальным. Наиболее распространённые комбинации прав — 755 для исполняемых файлов и каталогов и 644 для файлов с данными.
Для представления в таком виде специальных прав можно указать в начале четвёртую цифру в соответствии с тем же принципом, где битам setuid, setgid sticky соответствуют 4, 2 и 1. chmod 4754 установит бит setuid наравне с вышеописанными правами.
Заметьте, что для восьмеричного представления возможна только установка всех прав сразу, нельзя добавить новое правило, как например, доступ для чтения для владельца группы — пользователь должен, учитывая существующие права, вычислить новое соответствующее значение.

9.3.2. ACLs - Access Control Lists (Списки контроля доступа)

Многие файловые системы, например. Btrfs, Ext3, Ext4, JFS, XFS и т. д. поддерживают использование списков управления доступом (ACL). Они расширяют базовые функции владения и разрешения файлов, описанные в предыдущем разделе, и позволяют более детально контролировать каждый (файловый) объект. Например: пользователь хочет поделиться файлом с другим пользователем, и этот пользователь должен иметь возможность только читать файл, но не записывать или изменять его.
Для некоторых файловых систем использование списков ACL включено по умолчанию (например, Btrfs, Ext3, Ext4). Для других файловых систем или более старых систем его необходимо включить с помощью параметра монтирования acl — либо непосредственно в команде mount , либо в файле /etc/fstab. Таким же образом использование списков ACL можно отключить с помощью параметра монтирования noacl. Для файловых систем Ext* можно также использовать команду tune2fs -o [no]acl /dev/device, чтобы включить/отключить использование списков ACL по умолчанию. Значения по умолчанию для каждой файловой системы обычно можно найти на страницах руководства по их омонимам в разделе 5 (filesystem(5)) или в mount(8).
После включения ACL разрешения можно установить с помощью команды setfacl(1), пока getfacl(1) позволяет получить списки ACL для данного объекта или пути. Эти команды являются частью пакета acl. С setfacl можно также настроить вновь созданные файлы или каталоги для наследования разрешений от родительского каталога. Важно отметить, что списки ACL обрабатываются в своем порядке и что более ранняя запись, соответствующая ситуации, имеет приоритет над более поздними записями.
Если для файла установлены списки ACL, вывод команды ls -l покажет знак плюса после традиционных разрешений. При использовании списков ACL команда chmod ведёт себя несколько иначе и значение umask может быть проигнорировано. Расширенная документация, например acl(5) содержит больше информации.