# Как использовать sudo в Linux без пароля `sudo apt update` `sudo systemctl restart nginx` `sudo reboot` При работе с [[Linux]] приходится очень часто использовать `sudo`. И каждый раз вводить пароль со временем становится довольно утомительно. Когда это утомление достигает пика, в конце концов решаешь настроить `sudo` так, чтобы не вводить пароль. Вероятно, те, кто читает эту статью, испытывают похожие чувства. В этой статье я расскажу, как избавиться от необходимости вводить пароль для `sudo`. ![Безопасность Linux с Таксом и ключом](/media/whitedec/blog_img/vaBoSfdn.webp) ## Где находятся настройки sudo и как их изменять? Основной файл настроек `sudo` находится здесь: `/etc/sudoers` Настройки `sudo` могут вызвать серьезные проблемы, если синтаксис будет некорректным. Если вы ошибетесь и заблокируете саму команду `sudo`, восстановление будет хлопотным. Поэтому используется специальная команда `visudo`. ```bash sudo visudo ``` `visudo` проверяет синтаксис при сохранении и немедленно сообщает об ошибках. Даже в официальном руководстве настоятельно рекомендуется использовать именно `visudo`. ## Но не стоит напрямую изменять /etc/sudoers При вводе `sudo visudo` сразу открывается файл `/etc/sudoers`, и его можно тут же редактировать. Однако открывать и изменять файл `/etc/sudoers` напрямую — не лучшая практика. Я обычно предпочитаю не трогать основной файл конфигурации, а создавать новые файлы в директории `/etc/sudoers.d/`. Так проще отслеживать изменения и откатываться назад, если что-то пойдет не так. `sudo` спроектирован так, чтобы включать дополнительные настройки из файлов, расположенных в этой директории. Действительно, в самой последней строке файла `/etc/sudoers` можно увидеть `include /etc/sudoers.d/`. ```bash sudo visudo -f /etc/sudoers.d/no-password-common-commands ``` Имя файла можно выбрать произвольно, главное, чтобы оно было легко узнаваемым в будущем. Но не стоит давать слишком небрежные имена, иначе потом сами же будете страдать. Кстати, файлы, имена которых содержат `~` или `.`, игнорируются `sudoers`. Об этом говорится в комментариях внутри файла README в этой директории. ## Давайте разберем формат настроек Настройки `sudoers` имеют примерно такой формат: Честно говоря... это синтаксис, который невозможно запомнить. Просто запишите его куда-нибудь или добавьте эту страницу блога в закладки. Используешь его нечасто, но когда понадобится, забываешь. ```bash Имя_пользователя ХОСТ=(ПОЛЬЗОВАТЕЛЬ_ДЛЯ_ВЫПОЛНЕНИЯ) ОПЦИИ: КОМАНДА ``` Например, если имя пользователя `potter` и вы хотите выполнять `apt update` без пароля, это можно записать так: ```bash potter ALL=(ALL) NOPASSWD: /usr/bin/apt ``` Давайте разберем каждую часть: * `potter`: Имя пользователя, к которому применяются настройки. * `ALL`: Применять на всех хостах. * `(ALL)`: Указывает, от имени какого пользователя можно выполнять команду. Иногда я видел, как люди писали `(root)`. Я использую `ALL`. * `NOPASSWD`: Не запрашивать пароль. * `/usr/bin/apt`: "Абсолютный путь" к разрешенной команде. Если вы не уверены в пути к команде, можете проверить его с помощью `which`: ```bash ~$which apt /usr/bin/apt ~$which apt-get /usr/bin/apt-get ~$which reboot /usr/sbin/reboot ~$which systemctl /usr/bin/systemctl ``` ## Искушение открыть все с помощью ALL Здесь возникает очень сильное искушение: ```bash potter ALL=(ALL) NOPASSWD: ALL ``` Выглядит очень чисто. Все команды `sudo` выполняются без пароля. Удобно, очень удобно. Это личный выбор, но я считаю, что лучше воздержаться от этого. Я даже не хочу представлять ситуацию, когда одна неправильно введенная команда выполняется с правами root. Если скрипт пойдет не так, у вас не будет последнего тормоза в виде ввода пароля. Если кто-то воспользуется открытым терминалом, то это конец. В мире много странных людей... Выбор за вами. ## Разрешение без пароля только для часто используемых команд Я иду на компромисс и разрешаю выполнение без пароля только для часто используемых команд. Этот подход довольно хорош. Например, давайте предположим, что вы хотите использовать `apt`, `apt-get`, `reboot`, `systemctl` без пароля. Сначала откройте файл конфигурации: ```bash sudo visudo -f /etc/sudoers.d/no-password-common-commands ``` И добавьте следующую строку: ```ini potter ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get, /usr/sbin/reboot, /usr/bin/systemctl ``` Теперь пользователь `potter` сможет выполнять следующие команды без пароля: ```bash sudo apt update sudo apt -y upgrade sudo apt-get update sudo reboot sudo systemctl reload nginx ``` Если вам не хочется открывать все возможности `systemctl`, можно разрешить только определенные команды: ```bash potter ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx, /usr/bin/systemctl status nginx ``` ## Разделение на несколько строк для лучшей читаемости Если команд становится много, одна строка может выглядеть неаккуратно. В этом случае можно разбить ее на несколько строк с помощью `\`. Хотя это привычное разделение строк, часто используемое пользователями Linux, почему-то на практике его редко применяют. Однако, его использование значительно улучшает читаемость. ```bash potter ALL=(ALL) NOPASSWD: \ /usr/bin/apt, \ /usr/bin/apt-get, \ /usr/sbin/reboot, \ /usr/bin/systemctl ``` Выглядит хорошо и аккуратно. ## Применение к определенной группе Эта настройка также весьма полезна. На серверах, которыми управляют несколько человек, бывает удобнее использовать группы. Если вы хотите применить ее только к определенной группе, используйте формат `%имя_группы`. Например, для группы `admin` это будет выглядеть так: ```bash %admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/apt, /usr/bin/apt-get ``` ## Увеличение времени действия пароля Если полное отключение пароля вызывает беспокойство, есть другой способ: регулировка времени, по истечении которого пароль запрашивается повторно. По умолчанию, после однократного ввода пароля он не запрашивается в течение 10 или 15 минут, но это время можно изменить. Это делается с помощью настройки `timestamp_timeout`. Например, так `sudo` не будет запрашивать пароль в течение 60 минут: ```bash Defaults timestamp_timeout=60 ``` Единица измерения — "минуты", но если установить `0`, это будет кошмар с постоянным вводом пароля. Если установить `-1`, пароль `sudo` не будет запрашиваться до закрытия терминала. Это почти такая же мощная и удобная опция, как `ALL`, но может вызывать некоторое беспокойство при использовании. Конечно, эти настройки — разрешение без пароля и увеличение времени удержания — могут сосуществовать. Например, их можно комбинировать следующим образом: ```bash 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`. ```bash sudo visudo -f /etc/sudoers.d/no-password-common-commands ``` 2. Добавьте правило `NOPASSWD`. ```ini Defaults timestamp_timeout=30 potter ALL=(ALL) NOPASSWD: \ /usr/bin/apt, \ /usr/bin/apt-get, \ /usr/sbin/reboot ``` Решать, насколько открывать пароль, каждый должен сам, но я бы хотел, чтобы вы помнили одно: > Истинный комфорт наступит тогда, когда будут удовлетворены как удобство для пальцев, так и спокойствие души.