Введение / Зачем это нужно
Правильная настройка файла sudoers в Linux позволяет делегировать права администратора без разглашения пароля root и с детальным контролем того, что именно может выполнить пользователь или группа. Гибкие правила снижают риск случайных или злонамеренных действий и помогают соблюсти принцип минимальных привилегий. После этого гайда вы сможете безопасно управлять доступом к повышенным привилегиям на серверах и рабочих станциях.
Требования / Подготовка
- Пользователь с доступом к sudo или root-привилегиями.
- Любой поддерживаемый дистрибутив Linux из списка appliesTo.
- Базовое понимание командной строки и прав доступа в Linux.
- Установленный пакет sudo (по умолчанию присутствует в большинстве дистрибутивов).
Пошаговая инструкция
Шаг 1: Откройте sudoers через visudo
Никогда не редактируйте /etc/sudoers напрямую через nano или vim. Используйте visudo: эта команда блокирует файл при редактировании и проверяет синтаксис перед сохранением.
sudo visudo
По умолчанию visudo использует nano или редактор по умолчанию. Вы можете изменить редактор через переменную окружения:
sudo EDITOR=vim visudo
Шаг 2: Добавьте правило для пользователя или группы
В конец файла или в подходящий инклюд добавьте строку правила. Базовый синтаксис:
user host=(runas) command
Примеры:
# Полный доступ для пользователя admin
admin ALL=(ALL:ALL) ALL
# Доступ только к systemctl для перезапуска веб-сервера
wwwusr ALL=(root) /bin/systemctl restart nginx
# Права для группы %admins
%admins ALL=(ALL:ALL) ALL
Для сложных конфигураций используйте алиасы:
User_Alias DEVTEAM = alice, bob
Cmnd_Alias WEB_CMDS = /bin/systemctl restart nginx, /bin/systemctl status nginx
DEVTEAM ALL=(root) WEB_CMDS
Шаг 3: Настройте NOPASSWD для доверенных команд
Если нужно разрешить выполнение определённых команд без ввода пароля, добавьте тег NOPASSWD:. Всегда ограничивайте список команд, чтобы не ослаблять безопасность.
# Без пароля только для systemctl restart nginx
deploy ALL=(root) NOPASSWD: /bin/systemctl restart nginx
# Для группы разработки — чтение логов без пароля
%devs ALL=(root) NOPASSWD: /usr/bin/journalctl, /usr/bin/tail /var/log/nginx/*
⚠️ Важно: не используйте
NOPASSWD: ALLдля широких учёток в производственных средах. Это повышает риск компрометации и расширяет возможности злоумышленника при взломе аккаунта.
Шаг 4: Проверьте и примените изменения
После сохранения файла в visudo убедитесь, что синтаксис корректен, а правило работает ожидаемо:
# Проверить синтаксис всех sudoers-файлов
sudo visudo -c
# Посмотреть эффективные права для текущего пользователя
sudo -l
# Выполнить тестовую команду
sudo systemctl restart nginx
Если visudo -c сообщает об ошибке, не покидайте редактор с изменениями до их исправления. Если вы уже сохранили некорректный файл, загрузитесь в recovery mode, перемонтируйте корень с правами записи и исправьте правило.
Возможные проблемы
- Ошибка синтаксиса после сохранения. Причина: пропущена запятая, лишний пробел или неверный путь к команде. Решение: запустите
visudo -c, найдите ошибку и исправьте её вvisudo. - Права не применяются. Причина: конфликт правил или отсутствие разрешённого хоста/алиаса. Решение: проверьте порядок правил — более специфичные должны быть выше общих, и убедитесь, что хост и пользователь совпадают.
- «sudo: no tty present» при использовании в скриптах. Причина: требование tty в sudoers. Решение: добавьте
Defaults:user !requirettyдля нужного пользователя или используйтеssh -tпри удалённом вызове. - Пользователь не может выполнить команду через sudo. Причина: не указан полный путь к исполняемому файлу. Решение: в sudoers всегда используйте абсолютные пути, например
/bin/systemctl, а неsystemctl.