Пользователи и группы

Linux - многопользовательская система. Человек может отличать пользователей реальных (учётные записи людей, которые работают за компьютером) и системных (от имени которых запускаются системные процессы), но для машины разницы между ними нет никакой. Каждый пользователь представлен его уникальным идентификатором (UID, user ID), которым компьютер и оперирует в работе.

Пользователи могут объединяться в группы пользователей. В одной группе может находиться сколько угодно пользователей, так же как и один пользователь может состоять в скольких угодно группах. Любой пользователь обязательно состоит хотя бы в одной группе. По аналогии с пользователями, группы в cиcтеме также представлены их идентификаторами (GID, group ID).

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

Посмотреть идентификатор пользователя можно командой id. Например:

user@comp~$ id root uid=0(root) gid=0(root) groups=0(root)

Если имя не вводить, то выйдет информация про текущего пользователя. И кстати да, у root-а всегда UID=GID=0.

Файлы и права

Каждый файл в Linux принадлежит какому-либо пользователю (пользователь-владелец, владелец) и одновременно группе пользователей (группа-владелец). Пользователь-владелец не обязательно должен состоять в группе-владельце. Для каждого файла в Linux определяются отдельно права доступа для владельца, группы-владельца и для всех остальных пользователей.

Разновидностей прав доступа всего три: чтение, запись и выполнение, но их совместное использование даёт нам 23=8 комбинаций (3 категории прав и 2 варианта для каждого права - установлено оно или нет, см. комбинаторику).

Рассмотрим права доступа к файлу, которые выводятся как:

-rwxr-xr-x

Запись -rwxr-xr-x состоит из трёх блоков: это права доступа к файлу владельца, группы-владельца и всех остальных. Про первый символ минуса поговорим отдельно позже.

Буквы блока rwx определяют, соответственно, право доступа на чтение (r, read), запись (w, write) и выполнение (x, execute). Порядок букв менять нельзя. Если соответствующего права нет, то вместо буквы ставится минус (как, например, во втором и третьем блоках).

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

Буквы и цифры

Компьютер работает в двоичном коде. В двоичном коде он хранит данные на жёстком диске и в нём же производит вычисления.

Оперируя с числами в жизни мы имеем дело с десятичной системой счисления, так она называется потому, что все числа записываются десятью цифрами: от 0 до 9. В двоичной системе счисления цифр всего две: ноль и единица. К примеру, посчитаем от 0 до 7 в десятичной и двоичной системах, это поможет понять дальнейшее:

Десятичная система01234567
Двоичная система011011100101110111
Двоичная система (по 3 цифры)000001010011100101110111

Каждый блок rwx - это три бита информации по правам. Первый бит - чтение, второй - запись, третий - выполнение. Если право есть, бит равен 1, если нет - 0. То есть, для нашего примера, rwx = 111 = 7, r-x = 101 = 5, поэтому rwxr-xr-x = 111101101 = 755.

Большинство сайтов даёт такое правило пересчёта: x=1, w=2, r=4, нужные права просуммировать. Например, r-x = 4+1 = 5. Это даёт метод пересчёта, но не приносит понимания. Понимать надо так: права на чтение и запись это r-x = 101 (в двоичной записи) = 100+1 (в двоичной системе) = 4+1 (в десятичной системе) = 5.

Математики нервно курят, настолько лихо я использую знак равенства.

Это всё неправильно!

Потому что права доступа к файлу задаются не 9, а 12 битами. То есть:

rwxr-xr-x = 000111101101 = 0755

А всё то, о чём говорилось раньше - это укороченная запись прав.

На что уходят первые три бита?

Первый бит - SUID. Устанавливается на исполняемый файл. В этом случае файл выполнится от имени не текущего пользователя (как обычно и бывает), а от имени владельца файла. Группа для запуска - группа текущего пользователя.

Второй бит - SGID. Устанавливается на исполняемый файл. То же самое, что и для SUID, но для запуска подменяется не владелец, а группа.

Третий бит - Т-бит. Говорят, обычно устанавливается на папки. Если Т-бит установлен, то операция удаления больше не входит в операцию записи (w) и удалить файл может только его владелец.

Установка этих битов (и их комбинаций) в цифровом виде считается так же, как и установка прав. То есть, при установке Т-бита на файл с правами 755, получим права 1755.

Запись прав в буквенном виде всё-таки предназначена для человека, поэтому в ней есть нюансы. Установка SUID заменит x в блоке владельца на s и наш пример будет выглядеть как rwsr-xr-x. Установка SGID проделает то же самое с блоком группы-владельца: rwxr-sr-x. Установка Т-бита поменяет x на t в блоке остальных пользователей: rwsr-xr-t.

Забытый минус

-rwxr-xr-x

Первый символ в этой записи - это тип файла, а его, как ни крути, мы поменять не сможем. Но знать полезно.

- - обычный файл d - каталог (по сути, тоже файл) l - символическая ссылка c - символьный файл (/dev/null) b - файлы блочного доступа (/dev/sda) p - именованные каналы, pipes s - сокеты, сетевые подключения


Владимир
2011.11.22 15:29:16
#cid8419

Ответить

В принципе можно было бы добавить (а можно -- и не добавлять):
что изменить владельцев может только root;
про смысл бита "x" для файлов (т.е. что исполняться могут и текстовые файлы, а бинарники -- не обязательно исполняемые);
про смысл бита "x" для директорий, т.к. могут возникать вопросы типа "как это -- исполнить директорию?" (и сразу -- забавный пример про доступ к содержимому директории);
примеры как выставить SUID и SGID биты;