В Windows вы привыкли к одной учётной записи, под которой делаете всё: работаете с документами, устанавливаете программы, меняете настройки. Иногда система просит «права администратора» — и вы нажимаете «Да».
В Linux подход строже. Каждый процесс и каждый файл принадлежат конкретному пользователю. Веб-сервер работает от одного пользователя, база данных — от другого, а вы подключаетесь по SSH от третьего. Это сделано намеренно:
- Изоляция. Если взломают веб-сервер, злоумышленник получит права только этого пользователя, а не всей системы.
- Разграничение ответственности. Каждый сервис имеет доступ только к своим файлам.
- Аудит. Всегда видно, кто и что сделал.
Привязка к проекту. В этой главе мы создадим пользователя
webmasterи группуwebdevдля управления нашим wordpress-project. В главе 11, когда будем настраивать nginx и PHP-FPM, каждый из них будет работать от отдельного системного пользователя — и вы уже будете понимать, почему это важно.
В каждой Linux-системе есть суперпользователь root (UID 0). Он может всё: читать любые файлы, завершать любые процессы, менять любые настройки. Работать постоянно под root — всё равно что ходить по стройке без каски: можно, но одна ошибка будет стоить дорого.
rm -rf /home/student/old-project # удалит каталог студента
rm -rf / # уничтожит ВСЮ систему
Под обычным пользователем вторая команда просто не выполнится —
система скажет «Permission denied». Под root она сотрёт всё без
вопросов. Поэтому правило простое: работайте под обычным
пользователем, а root-права запрашивайте только когда нужно
(через sudo, о котором поговорим ниже).
Каждый пользователь в системе имеет числовой идентификатор — 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/passwd, а в отдельном файле /etc/shadow,
доступном только root. Это сделано для безопасности: /etc/passwd
читают многие программы, и хранить в нём пароли (даже в зашифрованном
виде) было бы опасно.
Заглянуть в /etc/shadow можно только с правами root:
sudo cat /etc/shadowДетали формата /etc/shadow для нашего курса не важны — достаточно
знать, что пароли хранятся именно там.
В главе 03 мы разбирали права доступа в формате rwxrwxrwx:
владелец — группа — остальные. Тогда мы фокусировались на владельце.
Теперь разберёмся с группами.
Группа — это способ объединить нескольких пользователей и дать им общие права на файлы. Например:
- Три разработчика работают над одним проектом. Вместо того чтобы
давать каждому права по отдельности, создаём группу
webdevи делаем каталог проекта доступным для этой группы. - Веб-сервер и PHP-FPM должны читать одни и те же файлы. Оба сервиса можно добавить в общую группу.
Каждая группа имеет числовой идентификатор — 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.
В Debian для создания пользователей используют команду adduser.
Она задаёт интерактивные вопросы и делает всё сама: создаёт домашний
каталог, копирует туда файлы из /etc/skel, предлагает задать пароль.
sudo adduser webmasterСистема попросит ввести пароль и необязательную информацию (полное имя, телефон и т.д.) — их можно пропустить, нажимая Enter.
adduser vs useradd. В Debian есть две команды для создания пользователей.
useradd— низкоуровневая утилита, которая создаёт запись в/etc/passwd, но не делает ничего другого (не создаёт домашний каталог, не просит пароль).adduser— дружелюбная обёртка, которая вызываетuseraddвнутри и делает всю рутину за вас. В повседневной работе используйтеadduser.
Сменить пароль пользователя:
sudo passwd webmasterСменить свой собственный пароль (без sudo):
passwdКоманда usermod позволяет изменить параметры существующего
пользователя. Самая частая задача — добавить пользователя
в дополнительную группу:
sudo usermod -aG sudo webmaster| Флаг | Значение |
|---|---|
-aG |
append (добавить) к списку Groups (групп) |
-d |
Изменить домашний каталог |
-s |
Изменить оболочку (shell) |
-l |
Переименовать пользователя |
Важно: флаг
-aобязателен при использовании-G. Без него команда заменит все дополнительные группы пользователя на указанную, а не добавит к существующим. Это частая ошибка, которая может лишить пользователя доступа к sudo.
sudo deluser webmaster # удалить пользователя
sudo deluser --remove-home webmaster # удалить вместе с домашним каталогомАналогично adduser, команда deluser — дружелюбная обёртка
над userdel.
Иногда удалять пользователя не нужно — достаточно заблокировать ему вход. Например, сотрудник ушёл в отпуск или уволился, но его файлы и домашний каталог должны остаться:
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 webmasterwebmaster : webmaster sudo webdev
Команда su (switch user) позволяет переключиться на другого
пользователя:
su webmaster # переключиться, но остаться в текущем каталоге
su - webmaster # переключиться с полной загрузкой окруженияРазница важна: su - (с дефисом) загружает окружение целевого
пользователя — его переменные, PATH, домашний каталог. Без дефиса
вы окажетесь «внутри» другого пользователя, но с частью старого
окружения, что может привести к путанице.
Чтобы вернуться обратно, нажмите Ctrl+D или введите exit.
Переключиться на root:
su -Система попросит пароль root. Но в Debian (и многих других
дистрибутивах) пароль root может быть не задан — тогда войти через
su не получится. Для этого и существует sudo.
Вместо того чтобы переключаться на root, можно выполнить одну команду с правами суперпользователя:
sudo apt updateПреимущества sudo перед работой под root:
- Точечные права. Вы получаете root-доступ только на одну команду, а не на всю сессию.
- Аудит. Каждый вызов sudo записывается в системный журнал — видно, кто, когда и что выполнил.
- Без пароля root. Вы вводите свой пароль, а не пароль root. Пароль root можно вообще не задавать.
В Debian пользователь получает право на sudo, если состоит в группе
sudo. Мы уже добавили туда webmaster:
sudo usermod -aG sudo webmasterПосле этого webmaster может выполнять любые команды через sudo.
Когда изменения вступают в силу? Изменение групп пользователя вступает в силу при следующем входе в систему. Если вы добавили пользователя в группу, но
idпоказывает старый список — нужно выйти и войти заново (или выполнитьsu - webmasterв текущем терминале).
Настройки 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.
sudo addgroup webdev
sudo adduser webmasterПри создании webmaster задайте пароль (запомните его — он
понадобится для входа).
sudo adduser webmaster webdev
sudo adduser webmaster sudoПроверяем:
id webmasterВы должны увидеть группы webmaster, webdev и sudo.
Вспомним, что каталог 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.
Убедимся, что участники группы webdev могут читать и писать
в каталог проекта:
sudo chmod -R g+rwX ~/wordpress-projectПочему заглавная X? Строчная
xдобавила бы право на выполнение всем файлам, включая текстовые и конфигурационные. ЗаглавнаяXдобавляет право на выполнение только каталогам (чтобы в них можно было входить) и файлам, которые уже имеют хотя бы один бит выполнения. Мы использовали этот приём в главе 03.
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 |
Посмотреть список групп |
-
Посмотрите содержимое файла
/etc/passwd. Найдите строку своего пользователя. Определите его UID, GID, домашний каталог и оболочку. -
Выполните команду
idбез аргументов. Сравните вывод с тем, что нашли в/etc/passwd. В каких дополнительных группах вы состоите? -
Создайте пользователя
testuserкомандойsudo adduser testuser. Проверьте, что он появился в/etc/passwd(используйтеgrep). Какой UID ему присвоен? -
Создайте группу
developers. Добавьте в неёtestuser. Убедитесь командойid testuser, что группа появилась в списке. -
Переключитесь на
testuserкомандойsu - testuser. Попробуйте выполнитьsudo apt update. Что произойдёт и почему? -
Вернитесь в свою учётную запись (
exit). Добавьтеtestuserв группуsudo. Снова переключитесь наtestuserи повторитеsudo apt update. Теперь команда должна работать. -
Удалите пользователя
testuserвместе с его домашним каталогом. Убедитесь, что он исчез из/etc/passwd. -
Посмотрите файл
/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.