15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
10.11.2023

Как да деактивирате искането за парола за командата Sudo в Linux

Командата sudo — съкращение от superuser do — предоставя на оторизирани Linux потребители временни привилегии на root ниво за изпълнение на административни задачи. По подразбиране всяко извикване на sudo изисква удостоверяване с парола за потвърждаване на самоличността на извикващия. Можете да деактивирате тази подкана за парола или глобално за потребител, или избирателно за конкретни команди, или временно за сесия, като промените файла /etc/sudoers чрез visudo или като коригирате директивата timestamp_timeout.

Преди да продължите: деактивирането на удостоверяването с парола за sudo намалява защитата на вашата система в дълбочина. Прилагайте тези промени само към доверени акаунти, за предпочитане ограничени до конкретни команди, а не за общи привилегии ALL. В производствена среда с VPS Хостинг, третирайте passwordless 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), а не от терминала. Това е предимно полезно в неинтерактивни скриптове, където подавате паролата програмно чрез тръба:

echo "your_password" | sudo -S apt update

Критична забележка: Вграждането на пароли в обикновен текст в скриптове или история на обвивката е значителен риск за сигурността. Този метод е подходящ за изолирани тръбопроводи за автоматизация, където паролата се инжектира чрез мениджър на тайни или променлива на средата — не е твърдо кодирана в скриптов файл. За автоматизация без надзор на сървър, директивата NOPASSWD, описана по-долу, е архитектурно по-чистото решение.

Метод 2: Деактивиране на подканата за парола за всички команди за конкретен потребител

Този метод предоставя на именован потребител възможността да изпълнява всяка команда sudo без парола. Използвайте го пестеливо — обикновено за специализирани сервизни акаунти или потребители за автоматизация, а не за акаунти на човешки оператори.

Стъпка 1: Отворете файла sudoers:

sudo visudo

Стъпка 2: Добавете следния ред, като замените username с действителното име на Linux акаунта:

username ALL=(ALL) NOPASSWD: ALL

Стъпка 3: Запазете и излезте. В nano-базиран visudo, натиснете Ctrl+X, след това Y, след това Enter. В vi-базиран 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Единична командаДа (чрез тръба)Висок при твърдо кодиране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 ключ: Ако на сървъра е конфигуриран passwordless sudo, уверете се, че самият SSH достъп изисква удостоверяване с ключ. Едновременното деактивиране на SSH пароли и sudo пароли на публично достъпен сървър е критична грешна конфигурация.
  • Ротирайте и преглеждайте: Периодично одитирайте /etc/sudoers.d/ за остарели правила, свързани с деактивирани акаунти или остарели скриптове.

На Dedicated сървъри, където имате пълен хардуерен контрол, тези конфигурации имат още по-голямо значение — компрометиран акаунт с passwordless sudo на dedicated машина означава пълен, неоспорен 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. Тествайте като потребителя за внедряване:

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

Този модел е директно приложим към всеки автоматизиран работен процес за внедряване, независимо дали използвате GitHub Actions, GitLab CI, Jenkins или персонализиран шел скрипт, задействан чрез SSH.

Ако вашата инфраструктура включва управлявани VPS контролни панели, проверете дали собственият системен потребител на панела (напр. cpanel, plesk) не е непреднамерено засегнат от широките правила NOPASSWD: ALL, които добавяте към sudoers.

Контролен списък с ключови изводи

Преди да приложите каквато и да е конфигурация на passwordless 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.

ЧЗВ

Какъв е най-безопасният начин да разрешите passwordless 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
За начало