Как использовать sudo в Linux без пароля

sudo apt update sudo systemctl restart nginx sudo reboot

При работе с Linux приходится очень часто использовать sudo. И каждый раз вводить пароль со временем становится довольно утомительно.

Когда это утомление достигает пика, в конце концов решаешь настроить sudo так, чтобы не вводить пароль. Вероятно, те, кто читает эту статью, испытывают похожие чувства.

В этой статье я расскажу, как избавиться от необходимости вводить пароль для sudo.

Безопасность Linux с Таксом и ключом

Где находятся настройки sudo и как их изменять?

Основной файл настроек sudo находится здесь:

/etc/sudoers

Настройки sudo могут вызвать серьезные проблемы, если синтаксис будет некорректным. Если вы ошибетесь и заблокируете саму команду sudo, восстановление будет хлопотным. Поэтому используется специальная команда visudo.

sudo visudo

visudo проверяет синтаксис при сохранении и немедленно сообщает об ошибках. Даже в официальном руководстве настоятельно рекомендуется использовать именно visudo.

Но не стоит напрямую изменять /etc/sudoers

При вводе sudo visudo сразу открывается файл /etc/sudoers, и его можно тут же редактировать.

Однако открывать и изменять файл /etc/sudoers напрямую — не лучшая практика.

Я обычно предпочитаю не трогать основной файл конфигурации, а создавать новые файлы в директории /etc/sudoers.d/.

Так проще отслеживать изменения и откатываться назад, если что-то пойдет не так.

sudo спроектирован так, чтобы включать дополнительные настройки из файлов, расположенных в этой директории.

Действительно, в самой последней строке файла /etc/sudoers можно увидеть include /etc/sudoers.d/.

sudo visudo -f /etc/sudoers.d/no-password-common-commands

Имя файла можно выбрать произвольно, главное, чтобы оно было легко узнаваемым в будущем.

Но не стоит давать слишком небрежные имена, иначе потом сами же будете страдать.

Кстати, файлы, имена которых содержат ~ или ., игнорируются sudoers. Об этом говорится в комментариях внутри файла README в этой директории.

Давайте разберем формат настроек

Настройки sudoers имеют примерно такой формат:

Честно говоря... это синтаксис, который невозможно запомнить. Просто запишите его куда-нибудь или добавьте эту страницу блога в закладки.

Используешь его нечасто, но когда понадобится, забываешь.

Имя_пользователя ХОСТ=(ПОЛЬЗОВАТЕЛЬ_ДЛЯ_ВЫПОЛНЕНИЯ) ОПЦИИ: КОМАНДА

Например, если имя пользователя potter и вы хотите выполнять apt update без пароля, это можно записать так:

potter ALL=(ALL) NOPASSWD: /usr/bin/apt

Давайте разберем каждую часть:

  • potter: Имя пользователя, к которому применяются настройки.
  • ALL: Применять на всех хостах.
  • (ALL): Указывает, от имени какого пользователя можно выполнять команду. Иногда я видел, как люди писали (root). Я использую ALL.
  • NOPASSWD: Не запрашивать пароль.
  • /usr/bin/apt: "Абсолютный путь" к разрешенной команде.

Если вы не уверены в пути к команде, можете проверить его с помощью which:

~$which apt
/usr/bin/apt

~$which apt-get
/usr/bin/apt-get

~$which reboot
/usr/sbin/reboot

~$which systemctl
/usr/bin/systemctl

Искушение открыть все с помощью ALL

Здесь возникает очень сильное искушение:

potter ALL=(ALL) NOPASSWD: ALL

Выглядит очень чисто. Все команды sudo выполняются без пароля. Удобно, очень удобно.

Это личный выбор, но я считаю, что лучше воздержаться от этого.

Я даже не хочу представлять ситуацию, когда одна неправильно введенная команда выполняется с правами root.

Если скрипт пойдет не так, у вас не будет последнего тормоза в виде ввода пароля. Если кто-то воспользуется открытым терминалом, то это конец. В мире много странных людей...

Выбор за вами.

Разрешение без пароля только для часто используемых команд

Я иду на компромисс и разрешаю выполнение без пароля только для часто используемых команд. Этот подход довольно хорош.

Например, давайте предположим, что вы хотите использовать apt, apt-get, reboot, systemctl без пароля.

Сначала откройте файл конфигурации:

sudo visudo -f /etc/sudoers.d/no-password-common-commands

И добавьте следующую строку:

potter ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get, /usr/sbin/reboot, /usr/bin/systemctl

Теперь пользователь potter сможет выполнять следующие команды без пароля:

sudo apt update
sudo apt -y upgrade
sudo apt-get update
sudo reboot
sudo systemctl reload nginx

Если вам не хочется открывать все возможности systemctl, можно разрешить только определенные команды:

potter ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx, /usr/bin/systemctl status nginx

Разделение на несколько строк для лучшей читаемости

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

Хотя это привычное разделение строк, часто используемое пользователями Linux, почему-то на практике его редко применяют.

Однако, его использование значительно улучшает читаемость.

potter ALL=(ALL) NOPASSWD: \
    /usr/bin/apt, \
    /usr/bin/apt-get, \
    /usr/sbin/reboot, \
    /usr/bin/systemctl

Выглядит хорошо и аккуратно.

Применение к определенной группе

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

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

Например, для группы admin это будет выглядеть так:

%admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/apt, /usr/bin/apt-get

Увеличение времени действия пароля

Если полное отключение пароля вызывает беспокойство, есть другой способ: регулировка времени, по истечении которого пароль запрашивается повторно.

По умолчанию, после однократного ввода пароля он не запрашивается в течение 10 или 15 минут, но это время можно изменить.

Это делается с помощью настройки timestamp_timeout.

Например, так sudo не будет запрашивать пароль в течение 60 минут:

Defaults timestamp_timeout=60

Единица измерения — "минуты", но если установить 0, это будет кошмар с постоянным вводом пароля.

Если установить -1, пароль sudo не будет запрашиваться до закрытия терминала. Это почти такая же мощная и удобная опция, как ALL, но может вызывать некоторое беспокойство при использовании.

Конечно, эти настройки — разрешение без пароля и увеличение времени удержания — могут сосуществовать.

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

Defaults timestamp_timeout=30

potter ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get, /usr/sbin/reboot

Часто используемые команды — без пароля, а для остальных команд sudo — 30 минут без запроса после одной аутентификации.

Думаю, это довольно хороший компромисс между удобством и безопасностью.

Уменьшать неудобства хорошо, но не ценой увеличения небезопасности.

Заключение

Убрать ввод пароля для sudo несложно.

Хотя объяснение было долгим, краткий итог таков:

  1. Создайте отдельный файл конфигурации в /etc/sudoers.d/ с помощью visudo.
sudo visudo -f /etc/sudoers.d/no-password-common-commands
  1. Добавьте правило NOPASSWD.
Defaults timestamp_timeout=30

potter ALL=(ALL) NOPASSWD: \
    /usr/bin/apt, \
    /usr/bin/apt-get, \
    /usr/sbin/reboot

Решать, насколько открывать пароль, каждый должен сам, но я бы хотел, чтобы вы помнили одно:

Истинный комфорт наступит тогда, когда будут удовлетворены как удобство для пальцев, так и спокойствие души.