Файл 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_resetDefaults        mail_badpassDefaults        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 specificationroot    ALL=(ALL:ALL) ALLnicholsonjf    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, потому что они находились дальше в файле конфигурации?

Добавленная вами строка была переопределена. От man sudoers:

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

В вашем случае nicholsonjf был членом группы sudo так что для него эта линия применима:

%sudo   ALL=(ALL:ALL) ALL

Если вы хотите переопределить записи в /etc/sudoers просто поместите новые записи после них.

Новая запись должна выглядеть следующим образом

myuser ALL=(ALL) NOPASSWD: ALL для одного пользователя или

%sudo ALL=(ALL) NOPASSWD: ALL для группы.

Для одного пользователя добавьте эту строку в конце вашего sudoers файл, использующий sudo visudo команда:

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-sudo-password

Он создает файл с именем /etc/sudoers.d/dont-prompt-<YOUR USERNAME>-for-sudo-password со следующим содержанием:

<YOUR USERNAME> ALL=(ALL:ALL) NOPASSWD: ALL

Преимущества такого способа по сравнению с ручным добавлением этой строки в /etc/sudoers с помощью sudo visudo (как было предложено в других ответах) являются

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

Обратите внимание, что вам все равно может быть предложено ввести пароль в других контекстах, например, при установке материалов из Программное обеспечение Ubuntu графическое приложение.

Согласно с sudo cat /etc/sudoers.d/README эта функция (помещения дополнительных файлов sudoer в /etc/sudoers.d) был включен по умолчанию начиная с Debian 1.7.2p1-1, который вышел в конце 1990-х годов (Ubuntu - это основанный на Debian).

Когда я исследовал это, я понял, что в /etc/sudoers файл, который является не комментарием, а директива это делает любой файл или папку в каталоге /etc/sudoers/* переопределить содержимое /etc/sudoers.

Это хитрая маленькая директива, поскольку на первый взгляд она выглядит как закомментированная строка. Это выглядит так:

#includedir /etc/sudoers.d

Вот как я реализовал некорневого пользователя без пароля в эфемерном образе 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 директива, которая позволила бы любым файлам в подкаталогах переопределять эти встроенные обновления.

Как Винс имеет упомянуто в комментарии, вы можете использовать эту строку:

%sudo ALL=NOPASSWD: ALL

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

Можно вставить строку в одну строку без форматирования EOF в конце файла sudoers или удалить с помощью sed -i:

cat >> /etc/sudoers <<<'PaSe ALL=(ALL:ALL) NOPASSWD:ALL'

Ссылка:https://stackoverflow.com/questions/41298208/how-to-append-a-line-at-the-end-of-etc-sudoers-file-using-shell-script-without/70039824#70039824

примечание: ALL=NOPASSWD: ALL должно быть ALL=(ALL) NOPASSWD: ALL, иначе это не сработает…

Возможный дубликат Почему опция sudoers NOPASSWD не работает?

смотрите также этот ответ : http://askubuntu.com/questions/139723/sudo-does-not-ask-for-password/139733#139733