Sudo — утилита выполнения команд от имени суперпользователя¶
Sudo (сокращение от англ. superuser do или substitute user do) — утилита командной строки для Unix-подобных операционных систем, позволяющая авторизованному пользователю запускать команды с правами другого пользователя, как правило, суперпользователя (root). Sudo входит в стандартный набор инструментов большинства дистрибутивов Linux и BSD, а также доступен для macOS, Solaris и ряда других систем. Утилита заменила устаревший механизм su и стала основным средством делегирования административных привилегий в многопользовательских системах.
¶Принцип работы
При вызове команды через sudo утилита запрашивает пароль текущего пользователя (а не пароль root), проверяет его и, при успешной аутентификации, выполняет запрошенную команду от имени указанного пользователя. Пароль кэшируется на короткий интервал (по умолчанию 5 минут), что позволяет выполнять несколько административных команд без повторного ввода.
Ключевое отличие от su: sudo не даёт постоянного доступа к оболочке root, а применяется только к конкретной команде. Права пользователей определяются конфигурационным файлом /etc/sudoers, который редактируется только утилитой visudo — она проверяет синтаксис и не позволяет сохранить файл с ошибкой, которая заблокировала бы доступ к администрированию.
¶Синтаксис и основные параметры
Типичный вызов выглядит так:
`` sudo [параметры] команда [аргументы] ``
Основные параметры:
| Параметр | Назначение |
|---|---|
-u пользователь | Выполнить команду от имени указанного пользователя (по умолчанию — root) |
-i | Запустить интерактивную оболочку с правами root |
-s | Запустить оболочку, указанную в переменной SHELL, с правами root |
-l | Показать список команд, доступных текущему пользователю |
-k | Сбросить кэшированный пароль |
-v | Продлить кэш пароля до максимального интервала |
-b | Перевести команду в фоновый режим |
-e | Редактировать указанный файл с правами root |
-p шаблон | Задать собственный шаблон запроса пароля |
Примеры:
`` sudo apt update sudo -u postgres psql sudo -i sudo -l ``
¶Файл /etc/sudoers
Главный конфигурационный файл задаёт, кто и какие команды может выполнять через sudo. Структура записи:
`` пользователь_или_группа список_хостов = (какой_пользователь) список_команд ``
Типичные примеры:
`` root ALL=(ALL:ALL) ALL %admin ALL=(ALL) ALL user1 ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx ``
Директива NOPASSWD: отключает запрос пароля для указанной команды. Группы пользователей указываются со знаком %. Отдельные файлы подключаются через #include или #includedir /etc/sudoers.d/.
¶История
Утилита создана в 1980 году студентом Трентского университета (Канада) Бобом Коггинсом (Bob Coggeshall) и Баком Бейкером (Buck Baker), которые разрабатывали её в рамках курсового проекта. В 1986 году код был переработан Чарльзом Хедриком (Charles Hedrick), работавшим администратором Rutgers University. В 1991 году поддержку sudo взяла на себя компания CERIAS при Пердьюском университете, а с 1999 года проект развивается сообществом OpenBSD и размещается на сайте sudo.ws. Текущий основной разработчик — Todd C. Miller.
¶Безопасность
Sudo считается более безопасной альтернативой su по нескольким причинам:
- каждая команда логируется (путь к файлу журнала задаётся директивой
Defaults logfile=); - можно делегировать права только на конкретные команды, а не на всю систему;
- действует принцип минимально необходимых привилегий;
- поддерживается двухфакторная аутентификация через плагины PAM.
Известные уязвимости sudo периодически обнаруживаются исследователями. Наиболее известна CVE-2021-3156 («Baron Samedit») — переполнение буфера в команде sudoedit, позволявшее получить права root. Уязвимость затронула версии с 1.8.2 по 1.8.31p2 и 1.9.0 по 1.9.5p1 и была оперативно исправлена.
¶Альтернативы
Прямая альтернатива sudo — утилита su, запрашивающая пароль целевого пользователя. В дистрибутивах на основе Debian и Ubuntu также распространён пакет sudo с расширением sudo-rs, написанным на Rust. В средах с графическим интерфейсом привилегии могут запрашиваться через PolicyKit (polkit), а в контейнерах и специализированных системах sudo нередко отсутствует вовсе, уступая место другим механизмам контроля доступа.
