Почему не работает параметр NOPASSWD для sudoers?

Вопрос или проблема

У меня есть строка NOPASSWD в /etc/sudoers (редактировалась с помощью visudo)

gatoatigrado    ALL=(ALL) NOPASSWD: /bin/set-slow-cpufreq

Тем не менее, вывод такой:

gatoatigrado@coral:~> sudo -n /bin/set-slow-cpufreq
sudo: извините, для выполнения sudo требуется пароль

Эта команда работает на машине с OpenSuSE, но не на Ubuntu 11.10. Что я делаю не так?

Примечание: Я не могу найти никаких соответствующих сообщений в системных журналах, например, через tail -f /var/log/syslog.

редактировать

Вот содержимое /etc/sudoers.

Defaults    env_reset

# вещи, которые я пробовал скопировать с машины opensuse
Defaults always_set_home
Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS XDG_SESSION_COOKIE"

root    ALL=(ALL:ALL) ALL
gatoatigrado ALL=NOPASSWD: /bin/set-slow-cpufreq
%admin ALL=(ALL) ALL
%sudo   ALL=(ALL:ALL) ALL

Вы должны поместить эту строку после строки с правилом для группы sudo, потому что, как указывается в руководстве по sudoers:

   Когда для пользователя совпадает несколько записей, они применяются по порядку.
   Где есть несколько совпадений, используется последнее совпадение (что не обязательно является наиболее специфичным совпадением).

Я тоже столкнулся с этой проблемой.

Моя ситуация заключается в том, что я настраиваю удаленную систему, которая будет работать без головы. Я включил полное шифрование диска (в противном случае злоумышленник с физическим доступом может сделать все, что захочет). Я хочу аутентифицироваться только с помощью открытого ключа (я уберу пароль, чтобы схема “иметь что-то, знать что-то” была защищенной парой ключей — вход в систему как root, конечно, полностью отключен)

Установщик Ubuntu запрашивает не-root пользователя-администратора, который добавляется в группу sudo. Затем я вручную добавил себя в файл sudoers с помощью sudo visudo:

my_username ALL=(ALL:ALL) NOPASSWD:ALL

ПРИМЕЧАНИЕ: если вы используете nopasswd на своем ноутбуке, вы всегда должны блокировать свой компьютер, когда отходите, иначе случайный злоумышленник может воспользоваться этим, пока вы встаёте, чтобы добавить сливки в свой кофе

Мне все равно приходилось аутентифицироваться по паролю.

Ответ enzotib является ключом к тому, что происходит.
Группа sudo появляется в sudoers после записи для моего имени пользователя.

Вместо того чтобы переместить мою запись ниже строки sudo, я просто удалил строку, которую добавил ранее, и затем добавил NOPASSWD в запись для %sudo

Это кажется, работает.
Снова используйте nopasswd только в случае крайней необходимости (в моем случае это было именно то, что мне нужно, для большинства пользователей требование пароля для активности sudo лучше)

Дополнительное ПРЕДУПРЕЖДЕНИЕ:
Всегда редактируйте sudoers с помощью visudo. (sudo visudo)
Также, открыв другое окно, переключенное на пользователя root, вы можете восстановить любые ошибки, которые могли возникнуть при изменении файла sudoers.

Кроме ответа @enzotib (добавьте строку в конце /etc/sudoers), также убедитесь, что вы посмотрели /etc/sudoers.d. После установки Debian Buster у меня был этот файл

$ sudo cat /etc/sudoers.d/10-installer
%sudo ALL=(ALL) ALL

который перезаписал мое правило в конце файла sudoers. Странно, что у меня также была строка

# Позволить членам группы sudo выполнять любые команды
%sudo   ALL=(ALL:ALL) ALL

в /etc/sudoers. Поэтому я предполагаю, что /etc/sudoers.d/10-installer является артефактом установки. Я удалил его, и теперь все работает.

В идеале, если вы настраиваете, какие команды могут выполняться через sudo, вы должны вносить эти изменения в отдельный файл в /etc/sudoers.d/ вместо редактирования файла sudoers напрямую. Вы также всегда должны использовать visudo для редактирования файла(ов).

Пример:
sudo visudo -f /etc/sudoers.d/slowcpu

Вставьте свою строку, предоставляющую разрешение:
gatoatigrado ALL=NOPASSWD: /bin/set-slow-cpufreq

Затем сохраните и выйдите, и visudo предупредит вас, если у вас есть какие-либо ошибки синтаксиса.

Вы можете запустить sudo -l, чтобы увидеть разрешения, которые были предоставлены вашему пользователю, если какие-либо из конкретных команд NOPASSWD пользователя появляются ПЕРЕД какой-либо командой %groupyouarein ALL=(ALL) ALL в выводе, вам будет предложено ввести пароль.

Если вы часто создаете много таких файлов sudoers.d, вы можете захотеть создать их, названными по пользователям, чтобы их было легче визуализировать. Имейте в виду, что порядок НАЗВАНИЙ ФАЙЛОВ и ПРАВИЛ в файле имеет большое значение, ПОСЛЕДНЕЕ загруженное выигрывает, независимо от того, является ли оно БОЛЕЕ или МЕНЕЕ разрешающим, чем предыдущие записи.

Вы можете контролировать порядок имен файлов, используя префикс от 00-99 или aa/bb/cc, хотя также имейте в виду, что если у вас есть ЛЮБЫЕ файлы без числового префикса, они загрузятся после номерных файлов, переопределяя настройки. Это происходит потому, что в зависимости от настроек языка “лексикографическая сортировка”, используемая оболочкой, сортирует числа первыми, а затем может объединять заглавные и строчные буквы, сортируя в “возрастающем” порядке.

Попробуйте запустить printf '%s\n' {{0..99},{A-Z},{a-z}} | sort и printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort, чтобы увидеть, печатает ли ваш текущий язык AaBbCc и т. д. или ABC, а затем abc, чтобы определить, какой префикс “последней” буквы лучше использовать.

На удаленной системе уберите шифрование, но пусть все будет принадлежать root, как в группе “Администраторов” — то есть не 0!
Вы можете дополнить #sudo -g Administrators тех, кто нуждается в полном доступе — не в файле sudo, а в профиле .login. Любой стандартный скрипт теперь может получить доступ к удаленному как “root”, и вы можете защитить файлы, которые необходимо защищать.
Еще одна удобная “группа” – это “Песочница” с директорией входа в кеш браузера и может читать это свободно и ничего больше. Используйте заглавную букву в первом символе.

Я столкнулся с этой проблемой, когда настраивал пользователя для выполнения команд sudo без необходимости ввода пароля в Ubuntu.

Я создал файл с именем my_user в каталоге /etc/sudoers.d, который содержал следующее:

# Правила для пользователя my_user
my_user ALL=(ALL) NOPASSWD: ALL

Кроме того, my_user был частью группы sudo после выполнения команды ниже:

sudo usermod -aG sudo my_user

Но когда я запускаю команду sudo для тестирования, например, sudo ls, появляется запрос на пароль.

Вот как я это решил:

Сначала я выполнил команду ниже, чтобы проверить разрешения моего пользователя:

sudo -l -U my_user

И я получил следующий вывод:

(ALL : ALL) ALL
(ALL) NOPASSWD: ALL
(ALL) ALL

Последняя строка вывода (ALL) ALL переопределяла разрешение (ALL) NOPASSWD: ALL.

После тщательного расследования я выяснил, что в каталоге /etc/sudoers.d есть другой файл с именем waagent, который содержал:

my_user ALL = (ALL) ALL

Все, что мне нужно было сделать, это закомментировать содержимое файла waagent или удалить файл полностью. И это заставило содержимое файла my_user в каталоге /etc/sudoers.d иметь приоритет.

И на этот раз все сработало нормально.

Ни один из ответов не сработал для меня на Debian 12 Server, и я спросил об этом ИИ, и вот ответ, который сработал:

Создайте правило Polkit в каталоге /etc/polkit-1/

sudo nano /etc/polkit-1/rules.d/90-allow-user-stop.rules

js синтаксис

polkit.addRule(function(action, subject) { 
if (action.id == "org.freedesktop.systemd1.manage-units" && 
action.lookup("unit") == "your-service.service" &&
 action.lookup("verb") == "stop" &&
 subject.user == "your-username") {
 return polkit.Result.YES; 
} 
});

и перезапустите сервис Polkit:

sudo systemctl restart polkit

Ответ или решение

Существует несколько причин, почему опция NOPASSWD в файле /etc/sudoers может не работать, даже когда кажется, что всё настроено правильно. Рассмотрим ключевые моменты, на которые стоит обратить внимание для диагностики этой проблемы.

1. Порядок записей в sudoers

В файле sudoers, порядок строк имеет значение. Если у вас есть правило для группы sudo, которое разрешает выполнение команд с запросом пароля, а ваша запись с NOPASSWD идет раньше, то она будет проигнорирована. Как указано в мануале по sudoers:

"Когда для одного и того же пользователя есть несколько записей, они применяются в порядке их появления. Последняя из них имеет приоритет."

Поэтому, чтобы ваша запись работала, необходимо разместить строку с NOPASSWD после всех общих записей для группы sudo. Это можно сделать так:

%sudo ALL=(ALL:ALL) ALL
gatoatigrado ALL=(ALL) NOPASSWD: /bin/set-slow-cpufreq

2. Использование нескольких файлов sudoers

В Ubuntu и других дистрибутивах на базе Debian часто используются дополнительные файлы в директории /etc/sudoers.d/. Правила из этих файлов также могут переопределять настройки, определенные в основном файле sudoers. Проверьте, нет ли конфликта между файлами в /etc/sudoers.d/ и вашим правилом. Например, если у вас есть файл, который содержит:

gatoatigrado ALL=(ALL) ALL

Это правило может перекрыть ваши настройки с NOPASSWD. Вы можете либо удалить этот файл, либо изменить его содержимое, чтобы использовать NOPASSWD.

3. Правильность редактирования

Важно редактировать файл sudoers только с помощью команды visudo, так как она проверяет синтаксис и предотвращает возможность возникновения ошибок, которые могут заблокировать доступ к sudo. Например, используйте:

sudo visudo -f /etc/sudoers.d/myspecialrule

4. Проверка настроек

Чтобы убедиться, что ваши настройки применяются корректно, выполните команду:

sudo -l

Эта команда покажет права вашего пользователя и все команды, которые он может выполнять без пароля. Если вы видите в выводе NOPASSWD, ваше правило применено. Если строка о NOPASSWD находится перед строкой с ALL, она не будет работать.

5. Проблемы с polkit и другими правами

Иногда, если система использует PolicyKit (например, для графических приложений), настройки, связанные с sudo, могут не распространяться на специфические команды, требующие привилегий. В таких случаях может потребоваться создать специальные правила в polkit, чтобы разрешить выполнение команд без пароля.

Заключение

При настройке опции NOPASSWD в sudoers нужно помнить о порядке записей и о том, что могут существовать конфликты с другими файлами в /etc/sudoers.d/. Всегда проверяйте настройки с помощью команды sudo -l и редактируйте sudoers через visudo. Если всё сделано правильно, но проблема остаётся, рекомендуется мучительно проверять системные логи на наличие сообщений об ошибках.

Оцените материал
Добавить комментарий

Капча загружается...