Группы, пользователи и права
Группы, пользователи и права
Удалять файлы операционной системы или читать список паролей нельзя почти никогда, а запускать команду ls
можно всегда.
В Unix есть два основных механизма для управления тем, что разрешено делать: пользователи и группы пользователей.
Каждый файл принадлежит какому-то пользователю и какой-то группе.
Пользователи
Unix — многопользовательская система. Список пользователей обычно находится в файле /etc/passwd
. Каждая строка там — это описание пользователя в виде разделённых двоеточиями полей (см. passwd(5)
):
- Имя;
- Пароль (в
/etc/passwd
не пишется); - Номер пользователя;
- Номер основной группы пользователя;
- Описание;
- Домашняя директория (домашний каталог);
- Путь к shell, используемому пользователем.
Использование пользователей
Важный пользователь — root
(рут), с номером 0. Это суперпользователь, ему всё можно.
Есть пользователи, которые связаны с реальными людьми.
Запускать какую-то долго работающую программу с доступом в сеть от рута — плохо: если её взломают, то получат доступ ко всему. Хотя бы по этой причине создаётся много пользователей-болванок, от имени которых запущены сервисы и которым нельзя почти ничего.
Домашний каталог
Каждому пользователю присвоен домашний каталог (и обычно ему же принадлежит). Там обычно хранятся его личные файлы, а используемые программы ищут/сохраняют свою конфигурацию где-то относительно домашнего каталога.
cd
без аргументов:
cd
переходит в домашний каталог.
Рабочая директория программы, запускаемой при входе в систему, будь то shell или графическая оболочка, — домашний каталог.
Домашний каталог обозначается символом ~
.
Группы
Каждый пользователь относится к набору групп. Созданные пользователем файлы будут принадлежать его основной группе.
id
выводит имя и список групп данного пользователя, например:
uid=1000(p01) gid=1000(p01) groups=1000(p01),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),
122(lpadmin),135(lxd),136(sambashare)
Подсказка 💡
Частая проблема: добавление пользователя в группу будет иметь эффект только при следующем входе в систему. Запомните это!
Права
В выводе команды ls -l
есть следующие колонки: права на файл, число ссылок на него, владелец файла, группа-владелец файла, размер файла, дата последнего редактирования, имя.
В колонце с правами в начале указывается тип файла. Например -
, если это обычный, регулярный файл.
Если это директория или устройство, то там будет d
или b
/c
соответственно.
Подробнее см. info
-страницы:
info '(coreutils)What information is listed'`
Права
Дальше в колонке с правами идут три триады — это права на этот файл для:
- владельца файла
- группы-владельцы файла
- и всех остальных пользователей систем
Права
Смысл прав
Допустим, у нас есть файл a
,
ls -l a
## вывод
---xrw-r-- 1 p01 p01 0 дек 01 12:16 a
файл регулярный, права на файл такие: --xrw-r--
Разобьём множество всех пользователей системы на подмножества:
- владелец файла
a
- группа-владелец файла
a
- все остальные пользователи системы
root
, потому что он особенный
и подпишем какие у них права.
Смысл прав
Права на файл a
- если мы пользователь из множества владелец, то нам можно только исполнять файл; читать и писать его нельзя;
- если мы пользователь из множества группа-владелец, то мы можем только читать и писать в этот файл;
Права при этом не объединяются: если мы и владелец и находимся в группе-владельце (так чаще всего и бывает), то права, которые указаны у владельца важнее и перетирают права, которые получаем засчёт нахождения в группе-владельце.
Смысл прав
Для обычных файлов
-
Чтение (
r
):- read (Чтение)
- Действия: Чтение файла.
-
Запись (
w
):- write (Запись)
- Действия: Запись в файл.
-
Исполнение (
x
):- execute (Исполнение)
- Действия: Исполнение файла как программы.
Смысл прав
Для директорий
-
Чтение (
r
):- read (Чтение)
- Действия: Получение списка имён содержимого директории.
-
Запись (
w
):- write (Запись)
- Действия: Изменение содержимого директории: добавление, удаление, переименование файлов.
-
Исполнение (
x
):- execute (Исполнение)
- Действия: Использование директории как текущей.
Как установить права
Символьное представление прав
В Linux для изменения прав файлов используется команда chmod
с символьным представлением. Этот метод использует буквы и символы для обозначения категорий пользователей и разрешений.
Вот разбивка:
u
,g
,o
,a
обозначают Пользователя, Группу, Остальных и Всех соответственно.+
,-
,=
используются для добавления, удаления или установки разрешений.r
,w
,x
,-
обозначают Чтение, Запись, Исполнение и Отсутствие разрешения.
Как установить права
Примеры:
chmod u+x файл
: Эта команда добавляет (+
) разрешение на исполнение (x
) пользователю (u
) для файла с именемфайл
.chmod a=rw файл
: Устанавливает (=
) разрешения на чтение (r
) и запись (w
) для всех пользователей (a
) файлафайл
.chmod g-w файл
: Удаляет (-
) разрешение на запись (w
) у группы (g
) для файлафайл
.chmod o+r файл
: Добавляет (+
) разрешение на чтение (r
) для остальных пользователей (o
) файлафайл
.
Числовое представление прав
Права также могут быть представлены численно, с использованием восьмеричного числа.
Каждый разряд представляет разные наборы пользователей:
- разряд сотен для разрешений владельца.
- разряд десятков для разрешений группы.
- разряд единниц для разрешений остальных.
Каждая цифра является суммой:
- 4 для чтения (
r
), - 2 для записи (
w
), - 1 для исполнения (
x
).
Числовое представление прав
Примеры:
chmod 644 файл
: Устанавливает разрешения на чтение (4
) и запись (2
) для владельца (всего6
), и разрешение на чтение (4
) для группы и остальных.chmod 750 файл
: Устанавливает разрешения на чтение (4
), запись (2
) и исполнение (1
) для владельца (всего7
), чтение и исполнение (5
) для группы и никаких разрешений (0
) для остальных.chmod 777 файл
: Устанавливает разрешения на чтение, запись и исполнение для всех.chmod 400 файл
: Устанавливает разрешение на чтение только для владельца и никаких разрешений для группы и остальных.
Для получения дополнительной информации обратитесь к странице руководства chmod
(man chmod
или chmod(1p)
).
SUID, SGID, sticky bit
В третьем поле каждой триады может быть не только -
и x
.
s
в первой триаде: SUID (set-user-id) — программа будет исполняться так, будто её запустил её владелец.S
во второй триаде: SGID (set-group-id) — программа будет исполняться так, будто нынешний пользователь состоит в группе, которой она принадлежит.t
в третьей триаде: sticky bit — на файлах не имеет смысла, а на директории означает, что удалить файл из неё сможет только владелец файла или самой директории.
Примеры SUID
SUID нужен, когда хочется пользователям дать ограниченный объём власти. Несколько SUID-приложений, принадлежащих руту:
su
(super user) запускает shell от имени другого пользователя (обычно — рута).sudo
(super user do) от имени другого пользователя (обычно — рута) выполняет поданную в аргументах команду. Пример:$ sudo rm -rf /*
.
Временная директория
/tmp
— директория, в которой хранятся временные файлы. Обычно очищается при перезапуске компьютера, а её содержимое находится в оперативной памяти.
На /tmp
стоит sticky bit: директория публичная, каждый должен иметь право в неё писать, но мы не хотим каждому позволять что угодно из неё удалить.
См. mktemp(1)
или документацию к своему языку программирования, чтобы узнать, как создавать временные файлы и директории, и никому этим не мешать.
Числовое представление SUID, SGID, sticky bit
Для установки этих флагов можно указать старший, четвёртый разряд chmod
:
4000
— SUID,2000
— SGID,1000
— sticky bit.
Примеры:
chmod 4755
означает “установлен SUID; владелец имеет право на чтение, запись и исполнение (4 + 2 + 1 = 7), а все остальные — только на чтение и исполнение (4 + 1 = 5)“.
см chmod(1p)