Пользователи, группы и sudo
Как устроены пользователи и группы в Linux, где они хранятся, и как sudo даёт точечные права без раздачи root.
Пользователи и их id
В уроке про права мы видели, что доступ к файлу определяется по числовому
uid. Этот uid принадлежит пользователю. У каждого пользователя есть
имя, числовой uid, основная группа, домашний каталог и shell. Себя
показывает id, всех пользователей хранит файл /etc/passwd:
$ id
uid=1000(deploy) gid=1000(deploy) groups=1000(deploy),27(sudo)
$ grep deploy /etc/passwd
deploy:x:1000:1000:Deploy User:/home/deploy:/bin/bash
Поля /etc/passwd: имя, x (пароль лежит отдельно), uid, gid, описание,
домашний каталог, shell. x означает, что хеш пароля не здесь, а в
/etc/shadow, который читает только root.
Системные и обычные пользователи
Пользователи делятся по uid. 0 это root, всемогущий. Малые uid (обычно до
1000) — системные пользователи под сервисы: nginx работает под www-data,
postgres под postgres. Они нужны, чтобы сервис не работал под root, как
мы видели в уроке про Dockerfile. Обычные люди получают uid от 1000.
Создать и удалить пользователя:
useradd -m -s /bin/bash alice # -m создаёт домашний каталог
passwd alice # задать пароль
userdel -r alice # -r удаляет и домашний каталог
Группы
Группа объединяет пользователей, чтобы давать права сразу нескольким. Файл доступа из урока про права смотрит на группу владельца. У пользователя есть одна основная группа и сколько угодно дополнительных.
groups alice # в каких группах состоит
usermod -aG docker alice # добавить в группу docker (-a чтобы не стереть остальные)
Флаг -a (append) важен: usermod -G docker alice без -a заменит все
группы пользователя на одну docker, выкинув его из остальных. Добавление
в группу docker или sudo даёт расширенные возможности, поэтому к нему
относятся как к выдаче прав.
sudo: точечный root
Раздавать пароль root всем плохо. sudo позволяет обычному пользователю
выполнять команды от имени root, не зная его пароля, и только если ему это
разрешено. Кто что может, описано в /etc/sudoers (правят через
visudo).
$ sudo systemctl restart nginx
[sudo] password for deploy: # вводит свой пароль, не root
Членство в группе sudo (или wheel на RHEL) обычно даёт право выполнять
любые команды через sudo. sudo ещё и логирует, кто что запускал от root, что
важно для разбора инцидентов. Это пример принципа наименьших привилегий:
давать ровно нужные права, а не root целиком.
Что важно запомнить
Пользователь — это имя плюс uid, основная группа, домашний каталог и
shell; всё это в /etc/passwd, а хеши паролей отдельно в /etc/shadow.
Сервисы работают под системными пользователями, не под root.
Группы дают права сразу нескольким; в группу добавляют через usermod -aG
именно с -a, иначе сотрёшь остальные. Членство в sudo/docker это
выдача прав.
sudo даёт точечный root по правилам из /etc/sudoers, под своим паролем и
с логированием. Это принцип наименьших привилегий на практике.
В следующем уроке разберём сеть на самом хосте: ip, ss и маршруты.
Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс