Файл Sudoers, включите NOPASSWD для пользователя, все команды
Предисловие
Это довольно сложный вопрос, связанный с файлом Sudoers и командой sudo в целом.
ПРИМЕЧАНИЕ. Я внес эти изменения на выделенной машине с Ubuntu Desktop 13.04, которую я использую исключительно в учебных целях. Я понимаю, что включить NOPASSWD sudo - огромный риск для безопасности.
Вопрос
Первоначально мое единственное изменение в файле sudoers (/etc/sudoers) было одной строкой, пользовательской спецификацией, которая должна была позволить nicholsonjf запускать все команды с sudo без необходимости вводить пароль (см. Строку, начинающуюся с nicholsonjf). "):
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
nicholsonjf ALL=NOPASSWD: ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
Однако это не сработало, и мне все равно предлагали ввести пароль каждый раз, когда я запускал команду nicholsonjf. Я смог запустить команды sudo только как nicholsonjf, как только удалил nicholsonjf из групп sudo и admin.
Кто-нибудь может объяснить, почему это сработало?
Это потому, что пользователь 'nicholsonjf' унаследовал права sudo из двух групповых спецификаций 'admin' и 'sudo' (как показано ниже в файле sudoers), которые переопределяли пользовательскую спецификацию 'nicholsonjf', потому что они находились ниже в файл конфигурации?
6 ответов
Ваша добавленная строка была переопределена. От man sudoers:
Когда несколько записей совпадают для пользователя, они применяются по порядку. При наличии нескольких совпадений используется последнее совпадение (которое не обязательно является наиболее конкретным совпадением).
В твоем случае nicholsonjf был членом группы sudo так для него применяется эта строка:
%sudo ALL=(ALL:ALL) ALL
Если вы хотите переопределить записи в /etc/sudoers просто ставьте новые записи после них.
Новая запись должна выглядеть
myuser ALL=(ALL) NOPASSWD:ALL для одного пользователя, или
%sudo ALL=(ALL) NOPASSWD:ALL для группы.
Для одного пользователя:
superuser ALL=(ALL) NOPASSWD:ALL
Для группы:
%supergroup ALL=(ALL) NOPASSWD:ALL
Никогда не запрашивать у текущего пользователя пароль, когда этот пользователь использует sudo делать
echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/dont-prompt-$USER-for-password
это создаст файл с именем /etc/sudoers.d/dont-prompt-<YOUR USERNAME>-for-sudo-password и будет означать, что пользователь, который запустил эту команду как, не будет запрашивать свой пароль при выполнении sudo команда. Вам по-прежнему будет предложено ввести пароль в других контекстах, например при установке содержимого из графического приложения Ubuntu Software.
Преимущества такого подхода перед добавлением строки в echo командовать /etc/sudoers с помощью sudo visudo (как подсказывают другие ответы)
/etc/sudoersиногда изменяется системными обновлениями, тогда как файлы в/etc/sudoers.dнеsudo visudoМетод подвержен ошибкам (о чем свидетельствует этот вопрос), тогда как копировать / вставлять команду намного сложнее
Согласно с sudo cat /etc/sudoers.d/README эта функция (помещение дополнительных файлов sudoer в /etc/sudoers.d) был включен по умолчанию начиная с Debian 1.7.2p1-1, который вышел в конце 1990-х годов (Ubuntu основан на Debian).
Как Vince упомянул в комментарии, вы можете использовать эту строку:
%sudo ALL=NOPASSWD: ALL
(Это отличается от строк, показанных в этих ответах, и это решило проблему для меня.)
Изучая это, я понял, что в
/etc/sudoersфайл, который не является комментарием, а директивой, которая делает любой файл или папку в каталоге
/etc/sudoers/* переопределить содержимое
/etc/sudoers.
Это маленькая хитрая директива, так как на первый взгляд кажется, что это прокомментированная строка. Выглядит это так:
#includedir /etc/sudoers.d
Вот как я реализовал пользователя без полномочий root и без пароля в эфемерном образе Docker для использования в конвейере CICD с базовым образом ubuntu:18.04:
RUN \
useradd -U foo -m -s /bin/bash -p foo -G sudo && passwd -d foo && passwd -d root && \
sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^#includedir.*/## Removed the #include directive! ##"/g' && \
echo "Customized the sudoers file for passwordless access!" && \
echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "root ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "foo user:"; su foo -c 'whoami && id' && \
echo "root user:"; su root -c 'whoami && id'
Что происходит с приведенным выше кодом:
- Пользователь и группа
fooсоздано. - Пользователь
fooдобавляется к обоимfooа такжеsudoгруппа. - Домашний каталог установлен на
/home/foo. - Оболочка настроена на
/bin/bash. - В
sedвыполняет встроенные обновления/etc/sudoersфайл, чтобы разрешитьfooа такжеrootбеспарольный доступ пользователей кsudoгруппа. - В
sedкоманда отключает#includedirдиректива, которая позволит любым файлам в подкаталогах переопределять эти встроенные обновления.
Можно вставить строку в одну строку без форматирования EOF в конце файла sudoers или удалить с помощью
sed -i:
cat >> /etc/sudoers <<<'PaSe ALL=(ALL:ALL) NOPASSWD:ALL'