← Весь справочник

sudo

Запуск команд от имени root или другого пользователя; правила в /etc/sudoers и visudo

sudo запускает одну команду от имени другого пользователя — по умолчанию root. Кому и что разрешено, описано в /etc/sudoers и файлах из /etc/sudoers.d/. Пароль спрашивается у того, кто вызывает sudo, а не у root. После ввода он запоминается на несколько минут (в Ubuntu — 15).

Синтаксис

sudo [опции] команда [аргументы…]
sudo -i | -s                  # оболочка от имени root
sudo -l                       # что мне разрешено
sudoedit файл                 # безопасно отредактировать файл от root
visudo [-c] [-f файл]         # редактировать или проверить sudoers

От чьего имени и в каком окружении

ОпцияЧто делает
-u aliceвыполнить от имени alice, а не root (можно -u '#1001' по UID)
-g группас указанной основной группой
-iоболочка входа целевого пользователя: его окружение, его домашний каталог, его профиль; sudo -i команда — выполнить через эту оболочку
-sоболочка от имени root, но в текущем каталоге и без профиля входа
-Eсохранить все переменные окружения (если политика разрешает)
--preserve-env=VAR1,VAR2сохранить только указанные переменные
-D каталогперейти в каталог перед запуском (нужно разрешение runcwd в sudoers)
-bзапустить команду в фоне

Пароль и сессия

ОпцияЧто делает
-nне спрашивать пароль: если он нужен — сразу ошибка (для скриптов)
-Sчитать пароль со stdin, а не с терминала
-vпродлить запомненный пароль, ничего не запуская
-kзабыть пароль: следующий sudo спросит снова
-Kудалить запомненный пароль полностью и выйти

Посмотреть права

КомандаЧто показывает
sudo -lтвои правила: строки (от_кого) [NOPASSWD:] команды и действующие Defaults
sudo -l -U aliceправила другого пользователя (нужен root)
sudo -l командаразрешена ли конкретная команда: печатает её полный путь или ничего (код 1)

Правила в sudoers

Строка правила: кто хост=(от_кого:группа) [NOPASSWD:] команды. Хост почти всегда ALL.

ПравилоЗначение
alice ALL=(ALL:ALL) ALLalice может всё, с паролем
%devs ALL=(ALL) ALLто же для всех участников группы devs (% — группа)
alice ALL=(ALL) NOPASSWD: ALLвсё и без пароля
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginxодна команда ровно с этими аргументами
alice ALL=(root) /usr/bin/id """" вместо аргументов — команда только без аргументов
alice ALL=(root) /usr/bin/tail -n * /var/log/** в аргументах — шаблон
alice ALL=(root) /usr/bin/ls, !/usr/bin/ls /root! — исключение из разрешённого
alice ALL=(www-data) /usr/bin/phpтолько от имени www-data
alice ALL=(root) sudoedit /etc/hostsредактировать файл через sudoedit

Команды пишут полными путями: ls без пути visudo не примет. Узнать путь: command -v systemctl. В Ubuntu уже есть правило %sudo ALL=(ALL:ALL) ALL, поэтому проще всего дать полные права через группу sudo.

Алиасы и Defaults

ЗаписьЧто делает
Cmnd_Alias LOGS = /usr/bin/journalctl, /usr/bin/tail -n * /var/log/*именованный список команд — потом alice ALL=(root) LOGS
User_Alias OPS = alice, bobименованный список пользователей
Runas_Alias APPS = www-data, postgresот чьего имени: alice ALL=(APPS) ALL
Defaults secure_path="…"PATH для всех команд под sudo
Defaults:alice timestamp_timeout=5сколько минут помнить пароль (для alice); 0 — спрашивать всегда
Defaults env_keep += "HTTP_PROXY"какие переменные не сбрасывать
@includedir /etc/sudoers.dчитать файлы из каталога (уже есть в Ubuntu)

visudo

КомандаЧто делает
visudoоткрыть /etc/sudoers в редакторе, проверить синтаксис перед сохранением
visudo -f /etc/sudoers.d/имято же для отдельного файла
visudo -cпроверить все файлы sudoers, включая права на них
visudo -cf файлпроверить один файл, не устанавливая его

Редактор берётся из SUDO_EDITOR, VISUAL или EDITOR; например, EDITOR=vim visudo.

Примеры

# выполнить команду от root и от другого пользователя
sudo apt-get update
sudo -u www-data ls -l /srv/app

# что разрешено текущему пользователю
sudo -l

# разрешена ли конкретная команда
sudo -l /usr/bin/systemctl

# root-оболочка с окружением root
sudo -i

# дать пользователю полные права через группу sudo (нужен перелогин)
usermod -aG sudo alice

# своё правило — отдельным файлом через visudo
visudo -f /etc/sudoers.d/deploy

# или создать файл скриптом и обязательно проверить синтаксис
echo 'deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx' > /etc/sudoers.d/deploy
chmod 440 /etc/sudoers.d/deploy
visudo -c

# проверить черновик, не устанавливая его
visudo -cf ./sudoers-draft

# записать в защищённый файл: перенаправление делает оболочка, а не sudo
echo '127.0.0.1 example.local' | sudo tee -a /etc/hosts

# отредактировать системный файл своим редактором, не запуская редактор от root
sudoedit /etc/hosts

# передать одну переменную окружения
sudo --preserve-env=HTTP_PROXY apt-get update

Подводные камни

  • sudo echo текст > /etc/файл не работает. Перенаправление > выполняет твоя оболочка — ещё без прав root, поэтому «Permission denied». Используй | sudo tee файл (tee -a — дописать) или sudo sh -c 'echo текст > файл'.
  • Редактируй только через visudo — он проверяет синтаксис перед сохранением. Строка с ошибкой в sudoers пропускается: правило молча не заработает, а sudo при каждом запуске будет печатать «syntax error». После правки скриптом всегда запускай visudo -c.
  • Имена в /etc/sudoers.d/. Файлы, в имени которых есть точка (deploy.conf) или которые оканчиваются на ~, игнорируются. Права должны быть 0440, иначе visudo -c ругается, а файл с записью для всех sudo пропустит.
  • Порядок правил важен: при нескольких подходящих строках действует последняя. Правило с паролем ниже правила с NOPASSWD для той же команды снова потребует пароль.
  • Аргументы в правиле — точное совпадение. Правило /usr/bin/systemctl restart nginx не разрешит systemctl restart nginx.service. А команда без аргументов в правиле разрешает любые аргументы.
  • Встроенные команды оболочки (cd, export, source) через sudo не запустить — это не программы. Для них — sudo -i или sudo sh -c '…'.
  • Окружение сбрасывается. PATH заменяется на secure_path из sudoers, HOME становится домашним каталогом целевого пользователя, большинство переменных теряется. Скрипт из ~/bin может «не найтись» под sudo.
  • Опасные разрешения. Правило на /usr/bin/tail позволит прочитать /etc/shadow, на vim, less, find, tar — запустить из них оболочку root. Для правки файлов давай sudoedit, а не редактор.
  • Новая группа sudo начнёт действовать только в новой сессии пользователя.

См. также

useradd · su · id · chmod · redirection · tee · env