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

На сегодняшний день операционная система GNU/Linux считается одной из самых безопасных. Она используется на большинстве самых крупных суперкомпьютеров мира, значительно опережая другие операционные системы семейства UNIX и Windows. Одним из ключевых факторов безопасности системы GNU/Linux является управление доступами.

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

GNU/Linux, как любая UNIX-подобная ОС, имеет встроенную систему контроля доступа к файлам. Эта система присваивает каждому файлу в файловой системе два атрибута: владелец (пользователь) и группа.

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

Разрешения в Linux — это набор правил, которые определяют кто и что может делать с файлом или каталогом.
Команда id -a показывает какой пользователь и группа используется в данный момент:

По выводу данной команды можно определить имя пользователя (uid=1000) John, он состоит в группе John (gid=1000) и admins (gid=1001).
Причем группа John (gid=1000) является «эффективной» группой, а группа admins (gid=1000) — нет.
Если конкретное разрешение доступа предоставляется одной из групп, к которой принадлежит пользователь, то этому пользователю также будет предоставлен этот доступ.
«Эффективный» gid важен при создании файлов и директорий.

Список пользователей системы хранится в файле /etc/passwd:

А список групп в файле /etc/group:

Пароли пользователей раньше хранились в файле /etc/passwd, однако позже решили перенести это в отдельный файл /etc/shadow, который недоступен даже для чтения обычным пользователям.

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

Команда stat показывает список атрибутов объекта:

По выводу команды можно увидеть, что файл /etc/fstab принадлежит пользователю root (uid=0) и группе с аналогичным именем и идентификатором группы. Права доступа файла показаны в двух видах: комбинации восьмеричных чисел (0644) и в виде атрибутов доступа (-rw-r—r—). Число 0644 является восьмеричным, оно состоит из четырех цифр в диапазоне от 0 до 7. Пока что первую цифру (0) можно пропустить, о ее назначении будет рассказано немного позже.

Представим восьмеричную комбинацию 644 в двоичном виде:
110 100 100
и сравним ее с аналогичным выводом команды stat:
rw-r—r—
Если каждую букву мы заменим на единицу, а дефис на ноль, то полученные двоичные значения совпадут.

Каждая из букв rwx означает, что у файла существуют права на: чтение (r), запись (w) и исполнение (x).

Вернемся к восьмеричному представлению прав.
Для его получения можно также использовать сумму значений:
4 — разрешение на чтение, пользователю/группе разрешено читать содержимое файла или смотреть содержимое каталога (листинг).
2 — разрешение на запись, пользователь/группа может изменять содержимое объекта. В директориях он позволяет субъекту изменять то, что записано как находящееся в каталоге. Это означает возможность создавать файлы в каталоге или, что то же самое, перемещать файлы в каталог, удалять файлы из каталога.
1 — разрешение на исполнение. Юзер или группа может исполнить файл. Любой файл может быть помечен как исполняемый. В случае с директориями разрешение выполнения позволяет субъекту проходить через каталог в подкаталоги.

Поэтому число 5, например, будет означать: разрешение на чтение и исполнение, но не на запись.

Так как цифры три, они означают права доступа для разных субъектов, а именно: владелец файла, группа, другие пользователи и группы. В нашем примере можно сделать вывод о том, что владелец файла (root) может записывать и читать содержимое файла /etc/fstab, но не исполнять. Группа root может только читать файл, равно как и все остальные.

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

Действительно, право на чтение и запись имеет суперпользователь root, группа shadowможет читать файл, а все остальные не могут ни читать, ни запускать файл, ни писать в него.

Помимо утилиты stat существуют другие способы просмотра прав на файлы и каталоги.
Наиболее популярной утилитой является ls с ключом -l, она позволяет отображать права пользователей в форме удобной для понимания человеком (в формате rwx):

В выводе команды первый символ (в данном случае это дефис) определяет тип объекта, дефис для обычного файла, d — для каталога, l — для символической (мягкой) ссылки, c — для символьного устройства, p — для именованного канала, s — для сокета и b — для блочного устройства. Устройства и именованные каналы находятся только в каталоге /devфайловой системы Linux.

Комбинация символов:
-rw-rwxr—
соответствует цифрам разрешений, для владельца разрешаем чтение и запись, для группы владельца разрешаем чтение, исполнение и запись, для всех остальных — только запись.

Утилита umask определяет права доступа по умолчанию для новых директорий и файлов. Вывод команды umask представляет собой четырехзначное восьмеричное число, которое вычитается из 0777 для получения разрешения по умолчанию. В большинстве дистрибутивов Linux это число имеет вид 0022, что соответствует правами по умолчанию 0755. В таком случае владелец имеет все права, а группа и все остальные только права на чтение и исполнение.

umask может устанавливаться двумя способами.
Первый способ, глобально с использованием модуля pam_umask, либо записью для каждого пользователя в файл ~/.bashrc.
Первая из четырех восьмеричных цифр, которые представляют права доступа, содержит биты setuid и setgid. Они могут использоваться для переопределения некоторых из описанных выше значений по умолчанию.

Утилита chmod является стандартным инструментов для управления правами доступа в UNIX/Linux.
К примеру файл text.txt имеет права 0644, изменим их так, чтобы любой пользователь в системе мог в него записать:

Попробуем что-либо записать в файл из-под пользователя Jack:

В Linux существуют также списки контроля доступа (ACL). ACL являются расширенным средством установки прав доступа к объектам. Списки доступа позволяют тонко определять права доступа к файлам, назначая другим пользователям или группе разные привилегии.

В рамках данной статьи описания ACL не будет, так как это достойно отдельной статьи.