понедельник, 2 апреля 2018 г.

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

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

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

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

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

Разрешения в Linux - это набор правил, которые определяют кто и что может делать с файлом или каталогом.
Команда id -a показывает какой пользователь и группа используется в данный момент:
$ id -a
uid=1000(John) gid=1000(John) groups=1000(John),1001(admins)

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

Список пользователей системы хранится в файле /etc/passwd:
$ egrep John /etc/passwd
John:x:1000:1000:John Doe,,,:/home/John:/bin/bash

А список групп в файле /etc/group:
$ grep John /etc/group
John:x:1000:admins

Пароли пользователей раньше хранились в файле /etc/passwd, однако позже решили перенести это в отдельный файл /etc/shadow, который недоступен даже для чтения обычным пользователям.
$ sudo grep John /etc/shadow
John:$6$ePumXggz$ci/.WihX2R/3aq5NQ5wWR7tvWGrle3Uw1W0Um9m1lqb0UvMDu9gM7vQUK55.L9fQe78l0pytWkU8SO9KFklAp/:16539:0:99999:7:::

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

Команда stat показывает список атрибутов объекта:
$ stat /etc/fstab | grep "Access: ("
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

По выводу команды можно увидеть, что файл /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 недоступен для чтения обычным пользователям, проверим права доступа на этот файл:
$ sudo stat /etc/shadow | grep "Access: ("
Access: (0640/-rw-r-----) Uid: ( 0/ root) Gid: ( 42/ shadow)

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

Помимо утилиты stat существуют другие способы просмотра прав на файлы и каталоги.
Наиболее популярной утилитой является ls с ключом -l, она позволяет отображать права пользователей в форме удобной для понимания человеком (в формате rwx):
$ ls -l /etc/fstab
-rw-r--r-- 1 root root 1047 apr 1 2017 /etc/fstab

В выводе команды первый символ (в данном случае это дефис) определяет тип объекта, дефис для обычного файла, 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, изменим их так, чтобы любой пользователь в системе мог в него записать:
$ touch test.txt
$ /bin/ls -lh test.txt
-rw-r--r-- 1 John John 0 Dec 16 11:57 test.txt
$ /bin/chmod 666 test.txt
$ /bin/ls -lh test.txt
-rw-rw-rw- 1 John John 0 Dec 16 11:58 test.txt

Попробуем что-либо записать в файл из-под пользователя Jack:
# su Jack -s /bin/bash
$ echo hello > test.txt
$ cat test.txt
hello

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

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

Комментариев нет: