15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати
10.11.2023

Як вимкнути запит пароля для команди Sudo в Linux

Команда sudo — скорочення від superuser do — надає авторизованим користувачам Linux тимчасові привілеї рівня root для виконання адміністративних завдань. За замовчуванням кожен виклик sudo вимагає автентифікації за паролем для перевірки особи користувача. Ви можете вимкнути цей запит пароля глобально для користувача, вибірково для конкретних команд або тимчасово для сесії, змінивши файл /etc/sudoers через visudo або налаштувавши директиву timestamp_timeout.

Перш ніж продовжити: вимкнення автентифікації за паролем для sudo знижує рівень захисту вашої системи. Застосовуйте ці зміни лише до довірених облікових записів, бажано обмежуючи їх конкретними командами, а не надаючи повні привілеї ALL. У будь-якому виробничому середовищі VPS Hosting розглядайте sudo без пароля як зважений компроміс, а не зручне налаштування за замовчуванням.

Розуміння принципу роботи автентифікації Sudo

Коли користувач запускає sudo, стек Linux PAM (Pluggable Authentication Modules) автентифікує запит відповідно до правил, визначених у /etc/sudoers. Після успішної автентифікації ядро записує мітку часу облікових даних у /run/sudo/ts/ (або /var/db/sudo/ у старіших дистрибутивах). Наступні виклики sudo у межах вікна timestamp_timeout — 15 хвилин за замовчуванням — повністю пропускають повторну автентифікацію.

Ця архітектура означає, що існують два принципово різні важелі впливу:

  • Кешування облікових даних — розширення або усунення вікна тайм-ауту, щоб користувач автентифікувався один раз, а облікові дані зберігалися довше.
  • Директива NOPASSWD — інструктує sudo повністю пропускати автентифікацію для конкретних команд або користувачів, незалежно від часу.

Розуміння цього розрізнення є критично важливим. Збільшення timestamp_timeout до великого значення все одно вимагає однієї початкової автентифікації. Директива NOPASSWD не вимагає жодної автентифікації взагалі. З точки зору безпеки це не рівнозначні підходи.

Файл sudoers: архітектура та безпечне редагування

Основний файл конфігурації — /etc/sudoers. Його ніколи не можна редагувати безпосередньо за допомогою стандартного текстового редактора. Завжди використовуйте visudo, який:

  • Блокує файл від одночасного редагування
  • Перевіряє синтаксис перед збереженням
  • Запобігає тому, щоб пошкоджений файл sudoers заблокував усім користувачам доступ до sudo
sudo visudo

У сучасних системах Debian/Ubuntu /etc/sudoers містить директорію для додаткових файлів:

/etc/sudoers.d/

Ви можете розміщувати окремі файли правил тут замість безпосереднього редагування основного файлу. Це рекомендований підхід для виробничих систем — він дозволяє ізолювати ваші власні правила та спрощує аудит.

sudo visudo -f /etc/sudoers.d/custom_nopasswd

Файли у /etc/sudoers.d/ не повинні містити . у назві (наприклад, уникайте custom.conf) і повинні мати права доступу 0440:

sudo chmod 0440 /etc/sudoers.d/custom_nopasswd

Метод 1: Тимчасове обходження запиту пароля для однієї сесії

Прапор -S інструктує sudo зчитувати пароль зі стандартного введення (stdin), а не з термінала. Це насамперед корисно у неінтерактивних скриптах, де ви передаєте пароль програмно через pipe:

echo "your_password" | sudo -S apt update

Важливе застереження: Вбудовування паролів у відкритому вигляді в скрипти або історію оболонки є значним ризиком безпеки. Цей метод підходить для ізольованих конвеєрів автоматизації, де пароль вводиться через менеджер секретів або змінну середовища — але не жорстко закодований у файлі скрипту. Для автоматизації без участі людини на сервері директива NOPASSWD, описана нижче, є архітектурно чистішим рішенням.

Метод 2: Вимкнення запиту пароля для всіх команд конкретного користувача

Цей метод надає вказаному користувачу можливість виконувати будь-яку команду sudo без пароля. Використовуйте його обережно — як правило, для виділених службових облікових записів або облікових записів автоматизації, але не для облікових записів операторів-людей.

Крок 1: Відкрийте файл sudoers:

sudo visudo

Крок 2: Додайте наступний рядок, замінивши username на фактичне ім’я облікового запису Linux:

username ALL=(ALL) NOPASSWD: ALL

Крок 3: Збережіть і вийдіть. У nano-based visudo натисніть Ctrl+X, потім Y, потім Enter. У vi-based visudo введіть :wq.

Що означає це правило, розібране по частинах:

ПолеЗначенняЗміст
usernameЦільовий користувачДо кого застосовується правило
ALL (перший)Будь-який хостПравило застосовується на всіх машинах (корисно для спільних конфігурацій sudoers)
(ALL)Будь-який цільовий користувачМоже виконувати команди від імені будь-якого користувача, включаючи root
NOPASSWD: ALLВсі команди, без пароляАвтентифікація не потрібна для жодної команди

Метод 3: Вимкнення запиту пароля лише для конкретних команд

Це найбільш безпечний підхід, коли виконання без пароля дійсно необхідне. Замість надання повних привілеїв NOPASSWD: ALL, ви обмежуєте виняток точним шляхом до бінарного файлу.

Крок 1: Відкрийте файл sudoers:

sudo visudo

Крок 2: Знайдіть розділ Defaults і додайте цільове правило нижче нього:

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

Замініть username на фактичний обліковий запис і вкажіть повний абсолютний шлях до кожної команди. Ви можете розділяти кілька команд комами в одному рядку.

Крок 3: Збережіть і вийдіть.

Чому важливі абсолютні шляхи: sudo зіставляє команди з правилами sudoers, використовуючи повний шлях до бінарного файлу. Якщо ви вказуєте apt-get без шляху, правило може не спрацювати, або, що гірше, замість нього може бути викликаний шкідливий бінарний файл, розміщений раніше у $PATH. Завжди перевіряйте шляхи за допомогою which:

which systemctl
# /usr/bin/systemctl

Реальний приклад використання: Конвеєр розгортання, що працює від імені користувача deploy, потребує перезапуску служб застосунків після кожного релізу. Надання NOPASSWD лише для systemctl restart myapp означає, що конвеєр може функціонувати автономно без надання повного доступу root.

Метод 4: Збільшення тайм-ауту мітки часу облікових даних

Замість повного усунення автентифікації ви можете збільшити час, протягом якого sudo пам’ятає успішну автентифікацію. Це найменш інвазивний варіант для інтерактивних користувачів, які виконують кілька адміністративних команд протягом однієї робочої сесії.

Крок 1: Відкрийте файл sudoers:

sudo visudo

Крок 2: Змініть або додайте директиву timestamp_timeout у блоці Defaults:

Defaults    timestamp_timeout=60

Це встановлює кеш облікових даних на 60 хвилин. Користувач автентифікується один раз, і наступні команди sudo у межах цього вікна не вимагають пароля.

Спеціальні значення:

ЗначенняПоведінка
0Пароль потрібен при кожному виклику sudo
-1Термін дії облікових даних ніколи не закінчується (фактично без пароля після першої автентифікації)
15За замовчуванням у більшості дистрибутивів
60Розумний варіант для активних адміністративних сесій

Крок 3: Збережіть і вийдіть.

Щоб застосувати перевизначення тайм-ауту лише для конкретного користувача, а не для всієї системи:

Defaults:username    timestamp_timeout=60

Метод 5: Використання додаткового файлу sudoers (найкраща практика для виробництва)

Замість безпосереднього редагування /etc/sudoers створіть обмежений додатковий файл. Цей підхід є ідемпотентним, придатним для аудиту та безпечним для управління за допомогою інструментів управління конфігурацією, таких як Ansible, Puppet або Chef.

sudo visudo -f /etc/sudoers.d/deploy_nopasswd

Вміст файлу:

# Allow the deploy user to restart services without a password
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp

Встановіть правильні права доступу:

sudo chmod 0440 /etc/sudoers.d/deploy_nopasswd

Перевірте, чи конфігурація sudoers є дійсною для всіх файлів:

sudo visudo -c
# sudoers file: /etc/sudoers, parsed OK
# sudoers file: /etc/sudoers.d/deploy_nopasswd, parsed OK

Порівняння всіх методів

МетодОбласть діїПотребує початкової автентифікаціїРизик безпекиНайкращий випадок використання
sudo -S зі stdinОдна командаТак (через pipe)Високий при жорсткому кодуванніCI/CD з менеджером секретів
NOPASSWD: ALLВсі команди, один користувачНіДуже високийІзольовані облікові записи автоматизації
NOPASSWD: /path/cmdЛише конкретні командиНіНизький-середнійКонвеєри розгортання, скрипти
Розширення timestamp_timeoutВсі команди, обмежені часомТак (один раз)НизькийІнтерактивні адміністративні сесії
Додатковий файл /etc/sudoers.d/НалаштовуєтьсяНалаштовуєтьсяЗалежить від правилаВиробничі сервери під управлінням IaC

Міркування щодо посилення безпеки

Вимкнення запитів пароля sudo створює реальну поверхню атаки. Застосуйте такі заходи пом’якшення:

  • Аудит використання sudo: Увімкніть журналювання sudo, додавши Defaults logfile="/var/log/sudo.log" до вашої конфігурації sudoers. Регулярно переглядайте цей журнал.
  • Обмеження за командою та аргументом: NOPASSWD: /usr/bin/systemctl restart nginx набагато безпечніше, ніж NOPASSWD: /usr/bin/systemctl — останнє дозволяє користувачу зупиняти, вимикати або маскувати будь-яку службу.
  • Використання виділених службових облікових записів: Ніколи не застосовуйте NOPASSWD: ALL до основного облікового запису оператора-людини. Створіть обліковий запис спеціального призначення (наприклад, deploy, monitor) з мінімальним білим списком команд.
  • Поєднання з автентифікацією лише за SSH-ключем: Якщо на сервері налаштовано sudo без пароля, переконайтеся, що сам SSH-доступ вимагає автентифікації на основі ключів. Одночасне вимкнення паролів SSH і sudo на загальнодоступному сервері є критичною помилкою конфігурації.
  • Ротація та перегляд: Periodically audit /etc/sudoers.d/ for stale rules tied to decommissioned accounts or deprecated scripts.

На Виділених серверах, де у вас є повний контроль над апаратним забезпеченням, ці конфігурації мають ще більшу вагу — скомпрометований обліковий запис із sudo без пароля на виділеній машині означає повний, безперешкодний доступ root без ізоляції на рівні гіпервізора.

Перевірка вашої конфігурації

Після внесення змін завжди перевіряйте правило від імені цільового користувача без переходу до root:

# Switch to the target user
su - username

# Test a specific command
sudo /usr/bin/systemctl restart nginx

# Verify sudo privileges without executing a command
sudo -l

sudo -l перелічує всі команди, які поточний користувач має право виконувати, включаючи ті, що є NOPASSWD. Це ваш основний інструмент налагодження, коли правило не працює належним чином.

Щоб перевірити ефективні правила sudoers для конкретного користувача з сесії root:

sudo -l -U username

Практична конфігурація для конвеєра розгортання веб-сервера

Нижче наведено повну, готову до виробництва конфігурацію для користувача розгортання на веб-сервері — такий тип налаштування ви б використовували на VPS з cPanel або власному стеку LEMP/LAMP:

1. Створіть користувача розгортання:

sudo useradd -m -s /bin/bash deploy
sudo passwd deploy

2. Створіть додаткове правило sudoers:

sudo visudo -f /etc/sudoers.d/deploy
# Deployment pipeline: passwordless service management only
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart php8.2-fpm
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/chown -R www-data /var/www/html

3. Встановіть права доступу та перевірте:

sudo chmod 0440 /etc/sudoers.d/deploy
sudo visudo -c

4. Перевірте від імені користувача deploy:

su - deploy
sudo systemctl restart nginx
# Should execute without a password prompt

Цей шаблон безпосередньо застосовується до будь-якого автоматизованого робочого процесу розгортання, незалежно від того, чи використовуєте ви GitHub Actions, GitLab CI, Jenkins або власний shell-скрипт, що запускається через SSH.

Якщо ваша інфраструктура включає керовані Панелі керування VPS, переконайтеся, що власний системний користувач панелі (наприклад, cpanel, plesk) не зазнає ненавмисного впливу широких правил NOPASSWD: ALL, які ви додаєте до sudoers.

Контрольний список ключових висновків

Перш ніж застосовувати будь-яку конфігурацію sudo без пароля, пройдіть через цю матрицю рішень:

  • Це обліковий запис людини чи службовий обліковий запис? Службові облікові записи можуть використовувати NOPASSWD; для облікових записів людей краще використовувати розширення timestamp_timeout.
  • Чи можна обмежити виняток конкретними командами? Завжди надавайте перевагу NOPASSWD: /path/to/command над NOPASSWD: ALL.
  • Чи захищений SSH-доступ автентифікацією на основі ключів? Якщо ні, спочатку виправте це, перш ніж послаблювати вимоги sudo.
  • Чи ведеться журнал активності sudo? Додайте Defaults logfile="/var/log/sudo.log", якщо це ще не зроблено.
  • Чи використовуєте ви додаткові файли у /etc/sudoers.d/? Надавайте перевагу цьому підходу над безпосереднім редагуванням /etc/sudoers для зручності обслуговування.
  • Чи запускали ви sudo visudo -c для перевірки синтаксису? Ніколи не пропускайте цей крок — синтаксична помилка у sudoers може повністю заблокувати вам адміністративний доступ.
  • Чи є у вас позасмуговий метод відновлення? На хмарних VPS-екземплярах переконайтеся, що у вас є консольний доступ або знімок для відновлення перед внесенням змін до sudoers.

FAQ

Який найбезпечніший спосіб дозволити sudo без пароля для конкретного скрипту?

Створіть скрипт-обгортку з фіксованим абсолютним шляхом, розмістіть його в системній директорії (наприклад, /usr/local/bin/deploy-restart.sh) і надайте NOPASSWD лише для цього конкретного шляху у /etc/sudoers.d/. Це запобігає ін’єкції аргументів і обмежує наслідки у разі компрометації облікового запису.

Чи вплине вимкнення запиту пароля sudo на всі термінальні сесії негайно?

Так. Зміни у /etc/sudoers або файлах у /etc/sudoers.d/ набувають чинності негайно для всіх нових викликів sudo. Немає потреби перезапускати будь-яку службу або виходити з системи. Існуючі кешовані облікові дані не зачіпаються до їх закінчення.

Що станеться, якщо я допущу синтаксичну помилку у файлі sudoers?

Якщо ви використовували visudo, він виявить помилку перед збереженням і запропонує вам її виправити. Якщо ви якимось чином обійшли visudo і допустили синтаксичну помилку, sudo взагалі відмовиться працювати. Для відновлення потрібно завантажитися в однокористувацький режим або використати позасмуговий консольний доступ для виправлення файлу.

Чи можна застосувати NOPASSWD до групи замість окремого користувача?

Так. Використовуйте синтаксис %groupname: %developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx. Це застосовує правило до всіх членів групи developers, що спрощує управління доступом у масштабі без редагування sudoers для кожного нового члена команди.

Чи однаково поводяться timestamp_timeout=-1 та NOPASSWD: ALL?

Ні. timestamp_timeout=-1 означає, що термін дії облікових даних ніколи не закінчується після першої успішної автентифікації — але ця перша автентифікація все одно вимагає пароля. NOPASSWD: ALL повністю пропускає автентифікацію, включаючи самий перший виклик. Перший варіант значно безпечніший для інтерактивних користувачів.

15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати