Skip to content

Latest commit

 

History

History
602 lines (438 loc) · 27 KB

File metadata and controls

602 lines (438 loc) · 27 KB

Этап 8. Пользователи, группы и sudo

Зачем в Linux несколько пользователей

В Windows вы привыкли к одной учётной записи, под которой делаете всё: работаете с документами, устанавливаете программы, меняете настройки. Иногда система просит «права администратора» — и вы нажимаете «Да».

В Linux подход строже. Каждый процесс и каждый файл принадлежат конкретному пользователю. Веб-сервер работает от одного пользователя, база данных — от другого, а вы подключаетесь по SSH от третьего. Это сделано намеренно:

  • Изоляция. Если взломают веб-сервер, злоумышленник получит права только этого пользователя, а не всей системы.
  • Разграничение ответственности. Каждый сервис имеет доступ только к своим файлам.
  • Аудит. Всегда видно, кто и что сделал.

Привязка к проекту. В этой главе мы создадим пользователя webmaster и группу webdev для управления нашим wordpress-project. В главе 11, когда будем настраивать nginx и PHP-FPM, каждый из них будет работать от отдельного системного пользователя — и вы уже будете понимать, почему это важно.

Пользователь root

В каждой Linux-системе есть суперпользователь root (UID 0). Он может всё: читать любые файлы, завершать любые процессы, менять любые настройки. Работать постоянно под root — всё равно что ходить по стройке без каски: можно, но одна ошибка будет стоить дорого.

rm -rf /home/student/old-project   # удалит каталог студента
rm -rf /                           # уничтожит ВСЮ систему

Под обычным пользователем вторая команда просто не выполнится — система скажет «Permission denied». Под root она сотрёт всё без вопросов. Поэтому правило простое: работайте под обычным пользователем, а root-права запрашивайте только когда нужно (через sudo, о котором поговорим ниже).

Как устроены пользователи

UID и файл /etc/passwd

Каждый пользователь в системе имеет числовой идентификатор — UID (User ID). Система различает пользователей именно по UID, а не по имени.

Информация о пользователях хранится в файле /etc/passwd. Посмотрим его:

cat /etc/passwd

Каждая строка описывает одного пользователя. Формат:

имя:x:UID:GID:комментарий:домашний_каталог:оболочка

Пример:

root:0:0:root:/root:/bin/bash
student:x:1000:1000::/home/student:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
Поле Значение
имя Логин пользователя
x Раньше здесь хранился пароль; теперь он в /etc/shadow
UID Числовой идентификатор пользователя
GID Числовой идентификатор основной группы
комментарий Полное имя или описание (может быть пустым)
домашний_каталог Каталог, в который попадает пользователь при входе
оболочка Программа, запускаемая при входе (/bin/bash, /usr/sbin/nologin и т.д.)

Системные и обычные пользователи

Пользователи делятся на две категории:

  • Системные (UID < 1000) — создаются автоматически для сервисов. Например, www-data для веб-сервера, mysql для базы данных. У них обычно нет пароля, а оболочка установлена в /usr/sbin/nologin или /bin/false — войти под ними нельзя.
  • Обычные (UID ≥ 1000) — реальные люди, которые подключаются к системе. У них есть домашний каталог /home/имя и рабочая оболочка (/bin/bash).
UID 0          root (суперпользователь)
UID 1–999      системные пользователи (www-data, sshd, mysql...)
UID 1000+      обычные пользователи (student, webmaster...)

Пароли и /etc/shadow

Пароли хранятся не в /etc/passwd, а в отдельном файле /etc/shadow, доступном только root. Это сделано для безопасности: /etc/passwd читают многие программы, и хранить в нём пароли (даже в зашифрованном виде) было бы опасно.

Заглянуть в /etc/shadow можно только с правами root:

sudo cat /etc/shadow

Детали формата /etc/shadow для нашего курса не важны — достаточно знать, что пароли хранятся именно там.

Группы

Зачем нужны группы

В главе 03 мы разбирали права доступа в формате rwxrwxrwx: владелец — группа — остальные. Тогда мы фокусировались на владельце. Теперь разберёмся с группами.

Группа — это способ объединить нескольких пользователей и дать им общие права на файлы. Например:

  • Три разработчика работают над одним проектом. Вместо того чтобы давать каждому права по отдельности, создаём группу webdev и делаем каталог проекта доступным для этой группы.
  • Веб-сервер и PHP-FPM должны читать одни и те же файлы. Оба сервиса можно добавить в общую группу.

GID и файл /etc/group

Каждая группа имеет числовой идентификатор — GID (Group ID). Информация о группах хранится в файле /etc/group:

cat /etc/group

Формат строки:

имя_группы:x:GID:список_участников

Пример:

sudo:x:27:student
www-data:x:33:
users:x:100:student,webmaster

Здесь группа sudo содержит пользователя student, а группа users — student и webmaster.

Основная и дополнительные группы

У каждого пользователя есть:

  • Основная группа (primary group) — указана в /etc/passwd (поле GID). Файлы, которые создаёт пользователь, по умолчанию принадлежат этой группе.
  • Дополнительные группы (supplementary groups) — перечислены в /etc/group. Дают дополнительные права.

Посмотреть группы текущего пользователя:

id

Вывод:

uid=1000(student) gid=1000(student) groups=1000(student),27(sudo)

Здесь основная группа — student, дополнительная — sudo.

Управление пользователями

Создание пользователя: adduser

В Debian для создания пользователей используют команду adduser. Она задаёт интерактивные вопросы и делает всё сама: создаёт домашний каталог, копирует туда файлы из /etc/skel, предлагает задать пароль.

sudo adduser webmaster

Система попросит ввести пароль и необязательную информацию (полное имя, телефон и т.д.) — их можно пропустить, нажимая Enter.

adduser vs useradd. В Debian есть две команды для создания пользователей. useradd — низкоуровневая утилита, которая создаёт запись в /etc/passwd, но не делает ничего другого (не создаёт домашний каталог, не просит пароль). adduser — дружелюбная обёртка, которая вызывает useradd внутри и делает всю рутину за вас. В повседневной работе используйте adduser.

Смена пароля: passwd

Сменить пароль пользователя:

sudo passwd webmaster

Сменить свой собственный пароль (без sudo):

passwd

Изменение пользователя: usermod

Команда usermod позволяет изменить параметры существующего пользователя. Самая частая задача — добавить пользователя в дополнительную группу:

sudo usermod -aG sudo webmaster
Флаг Значение
-aG append (добавить) к списку Groups (групп)
-d Изменить домашний каталог
-s Изменить оболочку (shell)
-l Переименовать пользователя

Важно: флаг -a обязателен при использовании -G. Без него команда заменит все дополнительные группы пользователя на указанную, а не добавит к существующим. Это частая ошибка, которая может лишить пользователя доступа к sudo.

Удаление пользователя: deluser

sudo deluser webmaster          # удалить пользователя
sudo deluser --remove-home webmaster  # удалить вместе с домашним каталогом

Аналогично adduser, команда deluser — дружелюбная обёртка над userdel.

Отключение пользователя: usermod -L

Иногда удалять пользователя не нужно — достаточно заблокировать ему вход. Например, сотрудник ушёл в отпуск или уволился, но его файлы и домашний каталог должны остаться:

sudo usermod -L webmaster      # заблокировать (Lock)

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

Чтобы разблокировать:

sudo usermod -U webmaster      # разблокировать (Unlock)

Когда блокировка лучше удаления? Если пользователь владеет файлами или процессами, удаление может оставить в системе «бесхозные» объекты с числовым UID вместо имени. Блокировка безопаснее: доступ закрыт, а порядок в системе сохранён.

Управление группами

Создание и удаление групп

sudo addgroup webdev      # создать группу
sudo delgroup webdev      # удалить группу

Добавление пользователя в группу

Добавить существующего пользователя в существующую группу:

sudo adduser webmaster webdev

Или через usermod:

sudo usermod -aG webdev webmaster

Оба варианта делают одно и то же. adduser в данном случае проще для запоминания.

Проверка принадлежности

id webmaster

Вывод:

uid=1001(webmaster) gid=1001(webmaster) groups=1001(webmaster),27(sudo),1002(webdev)

Команда groups показывает то же самое, но короче:

groups webmaster
webmaster : webmaster sudo webdev

Переключение пользователей: su

Команда su (switch user) позволяет переключиться на другого пользователя:

su webmaster       # переключиться, но остаться в текущем каталоге
su - webmaster     # переключиться с полной загрузкой окружения

Разница важна: su - (с дефисом) загружает окружение целевого пользователя — его переменные, PATH, домашний каталог. Без дефиса вы окажетесь «внутри» другого пользователя, но с частью старого окружения, что может привести к путанице.

Чтобы вернуться обратно, нажмите Ctrl+D или введите exit.

Переключиться на root:

su -

Система попросит пароль root. Но в Debian (и многих других дистрибутивах) пароль root может быть не задан — тогда войти через su не получится. Для этого и существует sudo.

sudo: выполнение команд от имени root

Зачем нужен sudo

Вместо того чтобы переключаться на root, можно выполнить одну команду с правами суперпользователя:

sudo apt update

Преимущества sudo перед работой под root:

  • Точечные права. Вы получаете root-доступ только на одну команду, а не на всю сессию.
  • Аудит. Каждый вызов sudo записывается в системный журнал — видно, кто, когда и что выполнил.
  • Без пароля root. Вы вводите свой пароль, а не пароль root. Пароль root можно вообще не задавать.

Группа sudo

В Debian пользователь получает право на sudo, если состоит в группе sudo. Мы уже добавили туда webmaster:

sudo usermod -aG sudo webmaster

После этого webmaster может выполнять любые команды через sudo.

Когда изменения вступают в силу? Изменение групп пользователя вступает в силу при следующем входе в систему. Если вы добавили пользователя в группу, но id показывает старый список — нужно выйти и войти заново (или выполнить su - webmaster в текущем терминале).

Файл /etc/sudoers и visudo

Настройки sudo хранятся в файле /etc/sudoers. Редактировать его напрямую нельзя — синтаксическая ошибка может заблокировать sudo для всех пользователей. Для редактирования используется специальная команда:

sudo visudo

Она открывает /etc/sudoers в редакторе и проверяет синтаксис перед сохранением. Если вы допустили ошибку, visudo предупредит и не сохранит файл.

Формат правил в /etc/sudoers:

кто   на_каком_хосте=(от_чьего_имени)   какие_команды

Пример записи, которая даёт группе sudo полный доступ:

%sudo   ALL=(ALL:ALL) ALL

Разберём по частям:

Часть Значение
%sudo Группа sudo (знак % означает группу)
ALL= На любом хосте
(ALL:ALL) От имени любого пользователя и группы
ALL Любые команды

Именно благодаря этой строке все участники группы sudo могут выполнять любые команды через sudo.

Каталог /etc/sudoers.d/. Вместо редактирования основного файла можно создавать отдельные файлы в каталоге /etc/sudoers.d/. Это удобнее: каждое правило в своём файле, проще управлять. Файлы в этом каталоге подключаются автоматически директивой @includedir /etc/sudoers.d в конце /etc/sudoers.

Практика: настраиваем пользователя для проекта

Пришло время применить всё на практике. Мы создадим пользователя и группу для управления нашим wordpress-project.

Шаг 1. Создаём группу и пользователя

sudo addgroup webdev
sudo adduser webmaster

При создании webmaster задайте пароль (запомните его — он понадобится для входа).

Шаг 2. Добавляем webmaster в группы

sudo adduser webmaster webdev
sudo adduser webmaster sudo

Проверяем:

id webmaster

Вы должны увидеть группы webmaster, webdev и sudo.

Шаг 3. Меняем владельца каталога проекта

Вспомним, что каталог wordpress-project принадлежит вашему текущему пользователю. Передадим его webmaster и группе webdev:

sudo chown -R webmaster:webdev ~/wordpress-project

Но этого недостаточно. Каталог проекта находится внутри вашего домашнего каталога, а в Debian домашние каталоги создаются с правами drwxr-x--- — другие пользователи не могут даже пройти сквозь них. Откроем проход:

chmod o+x ~

Эта команда добавляет только право на проход (x) для остальных пользователей. Читать содержимое домашнего каталога (ls /home/student) они по-прежнему не смогут — для этого нужен бит r, который мы не добавляли.

Проверяем:

ls -la ~/wordpress-project/

Все файлы и каталоги должны принадлежать webmaster:webdev.

Шаг 4. Настраиваем права для группы

Убедимся, что участники группы webdev могут читать и писать в каталог проекта:

sudo chmod -R g+rwX ~/wordpress-project

Почему заглавная X? Строчная x добавила бы право на выполнение всем файлам, включая текстовые и конфигурационные. Заглавная X добавляет право на выполнение только каталогам (чтобы в них можно было входить) и файлам, которые уже имеют хотя бы один бит выполнения. Мы использовали этот приём в главе 03.

Шаг 5. Проверяем от имени webmaster

su - webmaster
cd ~student/wordpress-project
ls -la
cat config/nginx.conf
echo "test" >> site/index.html
cat site/index.html
exit

Если всё настроено правильно, webmaster сможет читать и изменять файлы проекта.

Почему chmod o+x ~, а не chmod o+rx ~? Бит x на каталоге разрешает проход через него (то есть обращение к файлам внутри по полному пути). Бит r разрешает чтение списка файлов. Мы добавили только x: webmaster сможет попасть в wordpress-project, но не сможет просмотреть, что ещё лежит в вашем домашнем каталоге. Это стандартная практика, когда нужно предоставить доступ к вложенному каталогу, не раскрывая всё содержимое.

Справочник команд

Команда Описание
adduser имя Создать пользователя (интерактивно)
deluser имя Удалить пользователя
deluser --remove-home имя Удалить пользователя с домашним каталогом
usermod -L имя Заблокировать пользователя (без удаления)
usermod -U имя Разблокировать пользователя
passwd имя Задать/сменить пароль
usermod -aG группа имя Добавить пользователя в группу
addgroup имя Создать группу
delgroup имя Удалить группу
adduser пользователь группа Добавить пользователя в группу
id имя Показать UID, GID и группы пользователя
groups имя Показать группы пользователя
su - имя Переключиться на пользователя (с загрузкой окружения)
sudo команда Выполнить команду от имени root
sudo visudo Безопасно редактировать /etc/sudoers
cat /etc/passwd Посмотреть список пользователей
cat /etc/group Посмотреть список групп

Практические задания

  1. Посмотрите содержимое файла /etc/passwd. Найдите строку своего пользователя. Определите его UID, GID, домашний каталог и оболочку.

  2. Выполните команду id без аргументов. Сравните вывод с тем, что нашли в /etc/passwd. В каких дополнительных группах вы состоите?

  3. Создайте пользователя testuser командой sudo adduser testuser. Проверьте, что он появился в /etc/passwd (используйте grep). Какой UID ему присвоен?

  4. Создайте группу developers. Добавьте в неё testuser. Убедитесь командой id testuser, что группа появилась в списке.

  5. Переключитесь на testuser командой su - testuser. Попробуйте выполнить sudo apt update. Что произойдёт и почему?

  6. Вернитесь в свою учётную запись (exit). Добавьте testuser в группу sudo. Снова переключитесь на testuser и повторите sudo apt update. Теперь команда должна работать.

  7. Удалите пользователя testuser вместе с его домашним каталогом. Убедитесь, что он исчез из /etc/passwd.

  8. Посмотрите файл /etc/group. Найдите группу webdev. Какие пользователи в ней состоят?

Итоги

В этой главе вы:

  • узнали, зачем в Linux несколько пользователей и почему опасно работать под root;
  • разобрались с файлами /etc/passwd, /etc/shadow и /etc/group;
  • научились создавать и удалять пользователей (adduser, deluser) и группы (addgroup, delgroup);
  • освоили изменение пользователей (usermod, passwd) и проверку принадлежности к группам (id, groups);
  • научились переключаться между пользователями (su) и выполнять команды от имени root (sudo);
  • познакомились с visudo и форматом /etc/sudoers;
  • создали пользователя webmaster и группу webdev для сквозного проекта, настроили права на каталог wordpress-project.

В следующей главе мы разберём процессы и сервисы (systemd) — узнаем, как Linux запускает и управляет программами, и научимся работать с systemctl и journalctl.