- Вопрос или проблема
- редактировать
- ПРИМЕЧАНИЕ: если вы используете nopasswd на своем ноутбуке, вы всегда должны блокировать свой компьютер, когда отходите, иначе случайный злоумышленник может воспользоваться этим, пока вы встаёте, чтобы добавить сливки в свой кофе
- Ответ или решение
- 1. Порядок записей в sudoers
- 2. Использование нескольких файлов sudoers
- 3. Правильность редактирования
- 4. Проверка настроек
- 5. Проблемы с polkit и другими правами
- Заключение
Вопрос или проблема
У меня есть строка 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
. Если всё сделано правильно, но проблема остаётся, рекомендуется мучительно проверять системные логи на наличие сообщений об ошибках.