sudo (выполнение команд с правами root)
sudo это команда, которая позволяет разрешённому пользователю запустить программу от имени суперпользователя (root) или другого пользователя, если это допускает политика безопасности. Политика по умолчанию, sudoers, проверяет учётные данные самого вызывающего, применяет правила по командам и записывает в журнал, что запускалось. Так большинство серверов Linux выдают административный доступ без общего пароля root.
Что такое sudo и как он работает
sudo (читается «су-ду») запускает команду от имени суперпользователя или другого пользователя, если это разрешает политика безопасности. Согласно руководству sudo, политика проверяется по реальному идентификатору вызывающего пользователя, а политика по умолчанию, sudoers, настраивается в /etc/sudoers. Когда нужна аутентификация, sudoers проверяет учётные данные самого вызывающего, а не целевого пользователя, поэтому делиться паролем root не требуется.
В этом главное отличие от su. В руководстве su сказано, что по умолчанию он запускает интерактивную оболочку от root, а правила доступа, например членство в группе wheel, оставляет на усмотрение PAM. sudo действует по командам: политика может ограничить, какие команды человек запускает, на каком хосте и от какого пользователя, а проект sudo описывает результат как журнал команд и их аргументов. Сами правила разобраны на странице sudoers, а общая идея называется принципом наименьших привилегий.
Повседневные команды и безопасная проверка
Эти формы покрывают почти всю ежедневную работу:
sudo -l # что можно запускать на этом хосте
sudo -u www-data id # одна команда от другого пользователя
sudo -i # login-оболочка целевого пользователя (по умолчанию root)
sudo -s # оболочка из переменной $SHELL
sudo -v # продлить кэшированные учётные данные
sudo -k # забыть кэшированные данные в этой сессии
sudo -n true # ошибка вместо запроса пароля
sudoedit /etc/hosts # правка временной копии, затем копирование обратно
По руководству, -i запускает оболочку целевого пользователя как login-оболочку, читает её файлы входа и переходит в домашний каталог, а -s запускает оболочку из SHELL или из записи passwd. Оба варианта дают интерактивный shell от root, поэтому лучше выполнять отдельные команды. Чтобы безопасно проверить правило, выполните sudo -k, затем sudo -n true: команда завершится ошибкой, если понадобился бы пароль или запуск не разрешён. Администратор может посмотреть права другой учётной записи через sudo -l -U deploy.
Кэш, журнал и типичные ошибки
- Кэш учётных данных. В руководстве sudoers у
timestamp_timeoutзначение по умолчанию 5 минут, хранится отдельно для каждого терминала (timestamp_typeпо умолчаниюtty). Значение 0 всегда запрашивает пароль, отрицательное никогда не истекает до перезагрузки. - Оболочки скрывают детали. После
sudo -iв журнале видно лишь запуск оболочки. Запись набранного внутри требуетlog_inputилиlog_output, по умолчанию оба выключены. - Куда пишется журнал. По умолчанию в syslog, пока не задан файл. Разрешённые команды пишутся с приоритетом
notice, отказы и неудачная аутентификация сalert, а попыток ввода пароля по умолчанию три. - Слишком широкие правила. Запущенная через sudo программа может запускать другие, поэтому разрешение редакторов, пейджеров или
ALLсводит контроль на нет. - Правила без пароля.
NOPASSWDозначает, что украденная сессия или ключ равны оболочке root.
Сам sudo это привилегированное ПО, поэтому его нужно обновлять, как объясняет руководство по управлению патчами.
Место sudo в защите сервера
На VPS sudo превращает принцип наименьших привилегий в практику: каждый человек входит под именной учётной записью по ключу, прямой вход root выключен, а административные действия повышаются по одной команде. Свои правила кладите в /etc/sudoers.d, делайте каждое узким и регулярно проверяйте. Руководство о пользователях, sudo и наименьших привилегиях описывает такой аудит и уязвимость sudo, которую стоит закрыть патчем, а руководство по защите SSH объясняет, как отключить root по SSH.
Проверьте, кто может повышать права и что происходило недавно:
getent group sudo wheel
sudo journalctl _COMM=sudo --since today
В системах с systemd журнал собирает сообщения sudo из syslog, а _COMM= отбирает записи по имени процесса; в других системах смотрите журнал аутентификации вашего дистрибутива. Поскольку полный доступ к sudo превращает один украденный ключ в root, добавьте администраторам второй фактор для SSH и подключите эти записи к разбору журналов и мониторингу.
Связанные термины: sudoers, Наименьшие привилегии, Вход под root, PAM, UID 0.
Часто задаваемые вопросы
Что делает sudo?
sudo запускает команду от root или другого пользователя, если это разрешает политика безопасности, по умолчанию файл sudoers. Когда нужна аутентификация, он спрашивает пароль самого вызывающего и записывает попытку в журнал.
Чем sudo отличается от su?
su запускает интерактивную оболочку от другого пользователя, по умолчанию root, а правила доступа оставляет PAM. sudo применяет политику по команде, хосту и целевому пользователю и ведёт журнал, поэтому людям можно дать узкие права без пароля root.
Чем отличаются sudo -i и sudo -s?
sudo -i запускает оболочку целевого пользователя как login-оболочку, читает её файлы входа и переходит в её домашний каталог. sudo -s запускает оболочку из переменной SHELL или из записи пользователя в passwd.
Как долго sudo помнит мой пароль?
По умолчанию 5 минут для каждого терминала, это задаёт timestamp_timeout в sudoers. Команда sudo -k сбрасывает кэшированные данные текущей сессии, а sudo -K удаляет их для всех терминалов.
Где sudo записывает, что я запускал?
По умолчанию sudo пишет через syslog: разрешённые команды с приоритетом notice, отказы и неудачную аутентификацию с alert. В системах с systemd их можно читать через journalctl, а файл журнала задаётся опцией logfile.
Хотите увидеть, в каком состоянии ваш сервер?
Запустите бесплатную read-only проверку сервера или откройте Security Lab и посмотрите цикл обнаружение, сдерживание, восстановление, проверка в действии.
Получить бесплатную проверку сервераОткрыть Security Lab