С чего начать Первые шаги трек · 15 ступеней
Linux Labs

visudo — безопасная правка sudoers

5 мин Ubuntu 24.04 · sudo 1.9.15

Команда visudo правит /etc/sudoers и файлы /etc/sudoers.d и не даёт сохранить правило с ошибкой в грамматике.

Шпаргалка

7 команд Версия для печати
  • sudo visudo основной /etc/sudoers
  • sudo visudo -f /etc/sudoers.d/deploy отдельный файл правила
  • sudo EDITOR=vim visudo -f /etc/sudoers.d/deploy в другом редакторе
  • sudo chmod 0440 /etc/sudoers.d/deploy права, которых ждёт sudo
  • sudo visudo -c проверить все файлы и их права
  • sudo visudo -cf /tmp/candidate проверить готовый файл
  • sudo -l -U deploy что в итоге разрешено deploy

Обзор

sudo пускает пользователей по правилам из /etc/sudoers и файлов каталога /etc/sudoers.d. Ошибка в этих файлах может оставить машину без sudo, поэтому их правят через visudo. Он открывает копию файла в редакторе (в Ubuntu по умолчанию nano, другой — через EDITOR), а после сохранения проверяет грамматику. Файл с ошибкой он не запишет.

text
student@ubuntu:~$ sudo visudo -c
/etc/sudoers: parsed OK
/etc/sudoers.d/90-student: parsed OK
/etc/sudoers.d/README: parsed OK

visudo -c проверяет основной файл и все подключённые, вместе с их владельцем и правами. parsed OK значит только то, что строка написана по грамматике. Что она разрешает, visudo не оценивает.

Правило читается слева направо:

Часть deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart app Что значит
deploy кому; %группа — всем участникам группы
ALL= на какой машине (почти всегда ALL)
(root) от чьего имени запускать
NOPASSWD: без ввода своего пароля
/usr/bin/systemctl restart app какую команду — полный путь и аргументы

Ключи

4

Полный список — man visudo, грамматика правил — man sudoers.

Ключ Что делает Пример
-c --check Только проверить — грамматику, владельца и права всех файлов sudoers. sudo visudo -c
-f --file file Править или проверить указанный файл вместо /etc/sudoers. sudo visudo -f /etc/sudoers.d/deploy
-s --strict Строгая проверка — ещё и необъявленные алиасы. sudo visudo -cs
-q --quiet Не печатать подробности ошибок — с -c в скриптах, где важен код возврата. sudo visudo -cq

Ничего не найдено. Попробуй запрос короче.

Рецепты

3

Выдать одну команду отдельным файлом

bash
sudo visudo -f /etc/sudoers.d/deploy
# в редакторе одна строка:
# deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart app
sudo chmod 0440 /etc/sudoers.d/deploy
sudo visudo -c
sudo -l -U deploy

Отдельный файл видно сразу, его легко убрать, основной /etc/sudoers не меняется. Требования к файлу: имя без точки и без ~ в конце, владелец root:root, права 0440.

Проверить правило до установки

bash
sudo visudo -cf /tmp/candidate

Сначала проверь грамматику, потом смысл: команда в правиле — полный путь (найди его command -v systemctl), аргументы — ровно те, что нужны. ALL на месте команды даёт любую команду от root.

Проверить от имени того, кому выдано

bash
sudo -u deploy sudo -n /usr/bin/systemctl restart app   # пройдёт
sudo -u deploy sudo -n /usr/bin/systemctl stop app      # откажет

-n запрещает вопрос о пароле: где правила нет, sudo сразу печатает a password is required.

Неполадки

5

visudo: unable to open /etc/sudoers: Permission denied

visudo запущен без root. Нужен sudo visudo.

syntax error и вопрос What now?

Сохранённый файл не прошёл проверку: visudo печатает файл, номер строки и место ошибки и спрашивает, что делать. e — вернуться в редактор и исправить, x — выйти без сохранения. Q сохранит файл с ошибкой — так не делай.

bad permissions, should be mode 0440

Файл в /etc/sudoers.d создан с обычными правами. Поставь sudo chmod 0440 файл и повтори sudo visudo -c.

Правило есть, а sudo его не видит

Имя файла содержит точку (deploy.conf) или кончается на ~ — такие файлы sudo пропускает молча, и visudo -c их не перечисляет. Переименуй без точки.

Правило есть, а пароль всё равно спрашивают

Из подходящих правил действует последнее. Строка %sudo ALL=(ALL:ALL) ALL или другой файл ниже по порядку могут перекрыть твоё. Посмотри итог: sudo -l -U имя. Файлы /etc/sudoers.d читаются в порядке имён — отсюда префиксы 90-.

Опасно

2

Править sudoers обычным редактором

sudo nano /etc/sudoers сохранит файл с ошибкой, и sudo может перестать работать. Правь только через visudo и держи открытым второй терминал с sudo -i, пока не проверишь результат.

Слишком широкое правило

NOPASSWD: ALL, звёздочка в аргументах или программа, из которой можно запустить оболочку (vim, less, find -exec), дают пользователю полный root. Разрешай конкретную команду с конкретными аргументами.

См. также

  • sudo — как sudo применяет правила и что делать при отказе.
  • users-groups — группа sudo и членство в ней.
  • usermod — добавить пользователя в группу sudo.
  • permissions — права файлов, в том числе 0440.
  • nano — редактор, который открывает visudo в Ubuntu.
  • vim — другой редактор через EDITOR=vim.
Загрузка…