open atlas
↑ К треку
Командная строка CLI · 05 · 03

sudo и root

Root (uid 0) обходит все проверки прав доступа к файлам. sudo позволяет обычному пользователю выполнить одну команду от имени root без постоянного переключения. Главные ловушки: sudo на каждую команду, chmod 777 как «исправление» и рекурсивный chown не в том каталоге.

CLI Junior ◷ 22 min
Уровень
ОсновыJuniorMiddleSenior

Ты хочешь установить пакет, и каждая команда завершается Permission denied. Кто-то говорит: «просто добавь sudo спереди». И ты начинаешь делать это везде. Потом однажды опечатка с sudo rm -rf уничтожает каталог, который без sudo был бы в безопасности. Root-доступ — не удобная функция, это заряженное оружие. Этот урок о том, как обращаться с ним осознанно.

Цель

После этого урока ты сможешь объяснить, что такое root (uid 0) и почему он обходит проверки прав, использовать sudo для выполнения одной команды с повышенными привилегиями, понимать, что контролирует файл sudoers, и называть три самых опасных привычки с sudo/chmod, которых нужно избегать.

1

Root — суперпользователь: uid 0 обходит все проверки прав. В Linux есть одна особая идентичность пользователя: root с ID пользователя 0. Проверка прав ядра — трёхшаговое правило UID/GID из предыдущего урока — имеет жёстко закодированное исключение: если эффективный UID процесса равен 0, все проверки на чтение и запись проходят автоматически. Право выполнения всё ещё проверяется для обычных файлов (root не может выполнить файл, у которого ни для кого не установлен бит выполнения), но для владения и rwx-доступа root ничем не ограничен.

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

2

sudo запускает одну команду от имени root без входа под root. Вместо переключения на учётную запись root, sudo выполняет одну команду с эффективным UID root, а затем возвращает тебя в обычную пользовательскую сессию:

# установка пакета (требует root)
sudo apt install htop

# редактирование конфиг-файла, принадлежащего root
sudo nano /etc/hosts

# кто ты до и после
whoami           # alice
sudo whoami      # root
whoami           # alice  ← вернулся к норме

sudo запрашивает твой собственный пароль (не пароль root), проверяет конфигурацию sudoers, подтверждая разрешение, выполняет команду и логирует выполненное. Эта запись в /var/log/auth.log делает sudo проверяемым способом, которым su - или sudo -i не являются.

3

Файл sudoers контролирует, кто что может запускать. /etc/sudoers (всегда редактируй через visudo, никогда напрямую) определяет, какие пользователи или группы могут запускать какие команды от имени каких субъектов:

# синтаксис: кто  где=(от_кого)  команда
alice   ALL=(ALL)  /usr/bin/apt, /usr/bin/systemctl
%devs   ALL=(ALL)  NOPASSWD: /usr/bin/docker

На Ubuntu/Debian вхождение в группу sudo даёт неограниченный доступ (ALL=(ALL:ALL) ALL). На RHEL/CentOS аналогичная группа называется wheel. Дефолтный пользователь облачной VM (ubuntu, ec2-user, centos) обычно добавлен в одну из этих групп при создании.

Никогда не добавляй NOPASSWD: ALL для пользователя — это полностью обесценивает смысл sudo.

4

Принцип минимальных привилегий: используй минимальный доступ, достаточный для задачи. Применительно к root-доступу это означает:

  • Запускай сервисы от имени выделенных непривилегированных пользователей (www-data, postgres, node). Если процесс скомпрометирован, атакующий получает доступ этого пользователя, а не root.
  • Используй sudo для конкретной команды, которой это нужно, а не для интерактивной root-оболочки.
  • Предпочитай sudo systemctl restart nginx вместо sudo -i, за которым следует systemctl restart nginx. Первый вариант логируется; второй даёт тебе неограниченную root-сессию, где каждая последующая команда одинаково опасна.
  • Никогда не запускай веб-сервер, базу данных или среду выполнения приложений от имени root.
Разбор примера

Безопасное применение изменения конфига.

Нужно обновить /etc/nginx/sites-available/myapp.conf (принадлежит root) и перезагрузить nginx.

Плохая привычка — открыть root-оболочку:

sudo -i
nano /etc/nginx/sites-available/myapp.conf
nginx -t
systemctl reload nginx
exit

Каждая команда в этой оболочке выполняется от root. Опечатка в любой строке — ошибка уровня root.

Лучше — точечный sudo:

sudo nano /etc/nginx/sites-available/myapp.conf
sudo nginx -t
sudo systemctl reload nginx

Тот же результат. Три залогированных вызова sudo вместо незалогированной root-сессии. Если nginx -t упадёт, ты остаёшься в контексте обычного пользователя — нельзя случайно что-то стереть неправильно направленным rm.

Почему это работает

На macOS root существует и sudo работает так же. Стандартная конфигурация sudoers даёт членам группы admin полный sudo-доступ (аналог группы sudo на Ubuntu). System Integrity Protection (SIP) добавляет дополнительный уровень, ограничивающий даже root от изменения защищённых путей вроде /System и /usr — чего на Linux нет. На Linux root действительно ничем не ограничен.

Частая ошибка

Два подводных камня, к которым новички тянутся вместе: sudo chmod 777 /var/www/html и sudo chown -R root:root ., запущенный не в том каталоге. Первый делает каждый файл доступным для записи всем — любой локальный пользователь или скомпрометированный процесс может перезаписать файлы твоего приложения. Второй, если запущен на один каталог выше нужного (промах при автодополнении табом), может сменить владение всему домашнему каталогу, лишив тебя доступа к собственным файлам. Безопасная альтернатива: определи точно, какому файлу или каталогу какое право нужно, и установи только его. chmod 777 практически никогда не является правильным правом в продакшне.

Проверь себя
Викторина

Почему запуск веб-приложения от имени root считается опасным?

Итог

Root (uid 0) — не пользователь с высокими правами, а обход системы прав. Ядро пропускает rwx-проверки для uid 0 на чтение и запись. sudo выполняет одну команду от имени root, запрашивает твой собственный пароль и логирует вызов. Файл sudoers (/etc/sudoers, редактируй через visudo) контролирует точно, кто что может запускать. Применяй принцип минимальных привилегий: запускай сервисы от выделенных непривилегированных пользователей, используй точечный sudo <команда> вместо sudo -i, и никогда не прибегай к chmod 777 как к исправлению — вместо этого диагностируй реальное несоответствие владения или прав.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 4 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources4
expand
  1. 01
  2. 02
  3. 03
  4. 04

Trademarks belong to their respective owners. Editorial reference only.