sudo: user is not in the sudoers file
Вызов sudo внутри службы почти всегда лишний: служба и так работает от нужного пользователя, а при необходимости прав ей выдают возможности. Если sudo всё же вызывается, ему нужны правило без пароля и отсутствие требования терминала.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Нет правила для пользователя службы
Служба работает от служебного пользователя, которого нет в списке. Запрос отклоняется, а сообщение попадает в журнал.
-
Требуется пароль, а ввести его негде
У службы нет терминала. Запрос пароля повисает и завершается отказом по таймауту.
-
Требуется терминал
Настройка requiretty в правилах не даёт выполнять sudo без терминала. В службах это всегда так.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Какие команды разрешены пользователю службы.
sudo -l -U appЗаписи о попытках повышения прав.
journalctl -u myapp.service -n 20 --no-pager | grep -i sudoРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Служба работает от служебного пользователя, которого нет в списке. Запрос отклоняется, а сообщение попадает в журнал.
- Как проверить
-
Посмотрите правила и пользователя службы.
sudo -l -U app 2>/dev/null | head systemctl show myapp.service -p User
- Как исправить
-
Лучший вариант — убрать sudo из службы: выдайте нужную возможность параметром
AmbientCapabilities=или перенесите действие в отдельную службу. Если правило всё же нужно, оно должно быть точным: одна команда, без пароля.
- Почему происходит
- У службы нет терминала. Запрос пароля повисает и завершается отказом по таймауту.
- Как проверить
-
Посмотрите, требует ли правило пароль.
sudo -l -U app 2>/dev/null | grep -i nopasswd
- Как исправить
- Правило для автоматизации должно быть без пароля и на конкретную команду. Разрешать всё без пароля нельзя.
- Почему происходит
- Настройка requiretty в правилах не даёт выполнять sudo без терминала. В службах это всегда так.
- Как проверить
-
Посмотрите настройку.
sudo grep -r requiretty /etc/sudoers /etc/sudoers.d/ 2>/dev/null
- Как исправить
- Уберите требование терминала для нужного пользователя или откажитесь от sudo в службе.
Пример вывода
Скрипт службы вызывает sudo без правила. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
myapp.sh[4100]: sudo: a password is required
sudo[4101]: app : user NOT in sudoers ; TTY=unknown ; PWD=/opt/myapp ; USER=root ; COMMAND=/usr/bin/systemctl restart nginx
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=4/NOPERMISSION в systemd Код 4/NOPERMISSION: программа сообщила о недостатке прав. По соглашению LSB это «у пользователя недостаточно привилегий».
- Interactive authentication required при управлении службой systemctl требует аутентификации: обращение от непривилегированного пользователя через polkit. Как разрешить точечно.
- status=126 в systemd: файл не исполняется Код 126: команда найдена, но выполнить её нельзя. Отличие от 127 и от 203/EXEC, разбор причин.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
- Argument list too long в службе или скрипте Список аргументов слишком длинный: подстановка имён файлов дала тысячи аргументов. Как переписать вызов.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
- Configuration file is marked executable Предупреждение о правах: unit-файл помечен исполняемым. Откуда берётся и почему это стоит исправить.
Источники
-
sudoers(5)
Правила и требования к терминалу и паролю. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено вызовом sudo в скрипте службы от служебного пользователя.