Как запустить команду sudo без пароля?

Как работает ubuntu пользователь на изображениях AWS для Ubuntu Server 12.04 не имеет пароля sudo для всех команд, когда для этого нет конфигурации в /etc/sudoers?

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

Итак, я добавил нового пользователя и перешел к редактированию /etc/sudoers (используя visudo, конечно). Из чтения этого файла казалось, что по умолчанию ubuntu пользователь получал его без пароля sudo от того, чтобы быть членом admin группа. Поэтому я добавил к этому своего нового пользователя. Что не сработало. Затем я попробовал добавить NOPASSWD директива для sudoers. Что тоже не сработало.

В любом случае, сейчас мне просто любопытно. Как работает ubuntu пользователь получает привилегии без пароля, если они не определены в /etc/sudoers. Каков механизм, который позволяет это сделать?

Хорошо, я нашел ответ, так что могу также поместить его здесь для полноты картины. В конце /etc/sudoers есть то, что я считал просто комментарием:

#includedir /etc/sudoers.d

Однако на самом деле это включает в себя содержимое этого каталога. Внутри которого находится файл /etc/sudoers.d/90-cloudimg-ubuntu. Который имеет ожидаемое содержание

# ubuntu user is default user in cloud-images.# It needs passwordless sudo functionality.ubuntu ALL=(ALL) NOPASSWD:ALL

Так вот где находится конфигурация sudo для пользователя ubuntu по умолчанию.

Вы должны отредактировать этот файл с помощью visudo. Следующая команда позволит вам отредактировать правильный файл с помощью visudo.

sudo visudo -f /etc/sudoers.d/90-cloudimg-ubuntu

И добавьте строку типа:

aychedee ALL=(ALL) NOPASSWD:ALL

В конце.

Я обнаружил, что самое простое, что нужно сделать, чтобы легко воспроизвести это поведение на нескольких серверах, было следующее:

sudo visudo

Измените эту строку:

# Members of the admin group may gain root privileges%admin  ALL=(ALL) ALL

к этой строке:

# Members of the admin group may gain root privileges%admin  ALL=(ALL) NOPASSWD:ALL

И двигай им под эта линия:

# Allow members of group sudo to execute any command%sudo   ALL=(ALL:ALL) ALL

теперь у вас должно быть это:

# 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) ALL# Allow members of group sudo to execute any command%sudo   ALL=(ALL:ALL) ALL# Members of the admin group may gain root privileges%admin  ALL=(ALL) NOPASSWD:ALL# See sudoers(5) for more information on "#include" directives:#includedir /etc/sudoers.d

затем для каждого пользователя, которому требуется доступ к sudo С паролем:

sudo adduser <user> sudo

и для каждого пользователя, которому требуется доступ к sudo БЕЗ пароля:

sudo adduser <user> admin

(в более старых версиях ubuntu вам может потребоваться):

sudo service sudo restart

И это все!

Редактировать: Возможно, вам придется добавить группу администратора, так как я не думаю, что она существует по умолчанию.

sudo groupadd admin

Вы также можете добавить AWS по умолчанию ubuntu пользователя к admin группируйте с помощью этой команды:

sudo usermod ubuntu -g admin

Примечание: Как @ошибка как уже упоминалось, вам может потребоваться использовать adm в качестве имени вашей группы администраторов, в зависимости от того, какая версия Ubuntu используется.

Я бы создал свой собственный файл в каталоге /etc /sudoers.d/ - файл, созданный Amazon Cloud, может быть перезаписан в случае любого обновления. После создания вашего файла в /etc/sudoers.d добавьте эту запись,

<your user name> ALL=(ALL) NOPASSWD:ALL

Перезагрузите систему, и это сработает.

Короткий ответ без использования какого-либо редактора (протестировано на bash, очень рискованно выполнять на удаленных хостах).

Настройте sudo для работы без пароля для текущего пользователя:

echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers

Проверьте правку с помощью:

sudo visudo -c

Проверьте, можете ли вы использовать sudo без пароля:

sudo cat /etc/sudoers | grep "$USER"

... или просто попробуйте это с:

sudo <что угодно>

Когда я исследовал это, я понял, что в /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.
  • Пароли для обоих foo и root удаляются.
  • То sed команда выполняет встроенные обновления для /etc/sudoers файл, позволяющий foo и root пользователи без пароля получают доступ к sudo команда.
  • То sed команда отключает #includedir директива, которая позволила бы любым файлам в подкаталогах переопределять эти встроенные обновления.

По теме: Выполнить sudo без пароля?