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

235

Каким образом 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. Какой механизм это позволяет?

aychedee
источник
Связанный: Выполнить sudo без пароля?
Элия ​​Каган

Ответы:

332

Хорошо, я обнаружил ответ, поэтому могу также привести его здесь для полноты. В конце /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

В конце.

aychedee
источник
4
Я почти уверен, что должен был сделать полную перезагрузку.
aychedee
2
новые правила sudo будут использоваться для каждого нового зарегистрированного пользователя - так что вам нужно хотя бы повторно войти в систему
bluszcz
32
'sudo service sudo restart' работает :)
Laice
4
В более поздних версиях (например, 14.04) включенный файл /etc/sudoers.d/90-cloud-init-users(для редактирования .. sudo visudo -f /etc/sudoers.d/90-cloud-init-users). Хотя было бы проще создать дополнительные файлы, чем редактировать сгенерированный. Обратите внимание, что файлы, содержащие .или заканчивающиеся на ~, не будут включены.
Моломби
2
@ Phil_1984_ Скорее всего, он был добавлен в качестве комментария, чтобы обеспечить совместимость с другими (стандартными?) Версиями sudo, которые не допускают включения, но не были бы сбиты странным комментарием. (Стандарты сложны! ;-)
jpaugh
94

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

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_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

# 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

и наконец, запустите это:

sudo service sudo restart

Вот и все!

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

sudo groupadd admin

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

sudo usermod ubuntu -g admin

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

jiminikiz
источник
3
Примечание для себя: это соглашение о перемещении менее ограничительных разрешений ниже в стеке. Но не делать это не повлияет на функциональность.
Poweratom
2
Как объяснил jiminikiz, мне пришлось поместить % admin после % sudo на мою Ubuntu GNOME 16.04 LTS. Плюс, идентификатор группы администраторов - это точно не admin, а adm на моем Ubuntu. Перезагрузка не требовалась.
хата
5

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

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

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

WaughWaugh
источник
2

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

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

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

Проверьте редактирование с помощью:

sudo visudo -c

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

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

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

sudo <anything>
user315445
источник
21
Это довольно опасный совет ... скопируйте и вставьте это неправильно, и вы заблокируете себя от своего собственного сервера. Отсюда и совет использовать visudo. Он проверяет правильность синтаксиса перед сохранением на диск. Таким образом, для тех, кто хочет использовать это. Не делайте этого на удаленном сервере, который вам небезразличен. Возможно, вы захотите включить предупреждение об этом в свой ответ.
айчедее
8
Не использовать visudo - ужасная идея. Поверь мне, я знаю.
Trognanders
1
ИМХО, копировать-вставить безопаснее, чем ручное редактирование. Небольшое упрощение:echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
theartofrain
4
@theartofrain - Обычно я бы согласился, но visudoособенно приятно, если вы не позволите вам сломать файл sudoers, тем самым не заблокировав вас на вашей машине (или, по крайней мере, на sudo).
Джон V
3
@JonV Вы также можете потерять права администратора visudo, но обычно не случайно, потому что visudoсохраняются только те изменения, которые правильно сформированы в соответствии с грамматикой для файлов sudoers . Большинство ошибок синтаксически неправильны, поэтому они не причиняют вреда visudo. Если /etc/sudoersфайл в файле /etc/sudoers.d имеет неправильную форму , он sudoотказывается повышать привилегии для кого-либо в качестве меры безопасности, поэтому отказ от использования visudoопасен. (Хотя иногда это pkexecможно исправить без перезагрузки.)
Элия ​​Каган
0

Вот как я реализовал пользователя без полномочий root в эфемерном образе Docker для использования в конвейере CICD:

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    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 "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id
Сет Бергман
источник