Як завжди застосовувати пароль sudo для певної команди?


12

Днями я виконував деякі завдання з обслуговування на своєму веб-сервері. Я поспішав і сонний, тому все робив, використовуючи sudoкоманду.

І тоді я випадково натиснув Ctrl+ V, відправивши цю команду на свій веб-сервер:

sudo rm -rf /*

Для тих, хто цікавиться, що робить вищевказана команда: Це видалило весь мій веб-сервер

На щастя, у мене були резервні копії і, на жаль, мені довелося провести ще дві години, будучи неспаними, щоб виправити цю приголомшливу помилку. Але відтоді мені цікаво:

Чи є спосіб завжди застосовувати пароль sudo для конкретної команди?

Якби сервер запитав мене про пароль, я б врятував себе від безлічі клопотів. Так не було, бо я пробіг приблизно 5 sudoкоманд перед цією величною помилкою.

Отже, чи є спосіб це зробити? Мені просто потрібен пароль з rmкомандою, щоб завжди його виконували. Інші команди, які я використовую, як правило, nanoабо cpякі обидві (певною мірою) зворотні.



2
@solsTiCe /*розгортається до того, як він буде переданий команді rm. Таким чином, команда не бачить жодного аргументу, але список аргументів ( /bin /boot /cdrom /dev /etc /home...)
Dan

3
Одне важливе заняття, яке потрібно позбавити від цього, - це те, що ви не повинні вести речі з судо, якщо вам це не потрібно. Я знаю, що це не відповідає тому, що ви тут задали, але всеохоплююче питання полягає в тому, як (сподіваємось) не допустити, щоб знову видалити ваш сервер, а уникнення судо має стати вашою першою лінією захисту проти цього.
David Z


2
@ WinEunuuchs2Unix Це зовсім не повторне запитання, оп тут не хоче, щоб rmкоманда мала пароль. Вони просто хочуть sudoзапросити один раз кожен раз, коли використовується команда rm. Вирішення питання, з яким ви пов’язали, стане дещо дратівливим, коли ваша перша команда sudo rm. Оскільки він запитає у вас два паролі, один для sudoодного rm.
Ден

Відповіді:


17

Ви можете встановити timestamp_timeoutTo 0для певних команд /etc/sudoers. Створіть файл visudo -f /etc/sudoers.d/pduckіз таким вмістом:

Cmnd_Alias DANGEROUS = /bin/rm

Defaults!DANGEROUS timestamp_timeout=0

pduck ALL = (ALL:ALL) DANGEROUS

Тепер користувач pduckзавжди запитує пароль під час запуску sudo rm(незалежно від того, які додаткові параметри задано), навіть незважаючи на те, що користувач є членом sudoгрупи та sudoпам’ятає свій пароль для інших команд.

Мінус полягає в тому, що ви не можете легко додати параметри до /bin/rmрядка у файлі, щоб ще більше обмежити це. Ну ... ви можете, як:

Cmnd_Alias DANGEROUS = /bin/rm -f

але тоді вам просто підкажуть точно, sudo rm -fа не (знову) sudo rm -rf, наприклад.


9

Одним із методів було б використання safe-rm . Це ТІЛЬКО вирішить використання "rm" і не дозволить запускати конкретні версії "rm". Це включає видалення вашої кореневої системи, але також може бути використане для запобігання видаленню системних каталогів, таких як "/ usr /" або "/ var /". За посиланням:

Попередження випадкового видалення важливих файлів

Safe-rm - це інструмент безпеки, призначений для запобігання випадкового видалення важливих файлів шляхом заміни /bin/rmобгорткою, яка перевіряє задані аргументи на коригуваному чорному списку файлів і каталогів, які ніколи не слід видаляти.

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

$ rm -rf /usr   
Skipping /usr

(Захищені шляхи можна встановити як на рівні сайту, так і на користувачів.)

Відновлення важливих файлів, які ви видалили помилково, може бути досить важким. Захистіть себе сьогодні, встановивши safe-rm та зменшіть ймовірність того, що вам знадобиться звернутися до служби відновлення даних!

введіть тут опис зображення


Засуджений за безпечну корову
Майкл Фултон

3

sudoнадає варіант -k, --reset-timestamp, див man sudo.

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

Ви можете написати просту обгортку для sudoтестування rm -rf /*та запуску

sudo -k rm -rf /*

замість цього, наприклад, наприклад:

sudo ()                                                                                                                                                 
{ 
    [[ "$*" == "rm -rf /*" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

Приклад використання

Тестування echo aтут.

$ sudo echo
[sudo] password for dessert: 

$ sudo echo

$ sudo echo a
[sudo] password for dessert: 
a
$ sudo echo a
[sudo] password for dessert: 
a

Якщо ви хочете, щоб вас запитували кожен раз, коли ви працюєте rmв цілому, ви можете адаптувати вищевказану функцію так:

sudo () 
{ 
    [[ "$1" == "rm" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

Якщо ви хочете поєднати як загальні виклики команд, так і конкретні командні рядки, рекомендую використовувати case, наприклад:

sudo () 
{ 
    case "$*" in 
        rm*)            opt="-k" ;;
        "mv /home"*)    opt="-k" ;;
        "ln -s /usr/bin/fish /bin/sh") opt="-k" && echo "Don't you dare!" ;;
        *)              opt="" ;;
    esac;
    /usr/bin/sudo $opt "$@"
}

Зверніть увагу , що ці підходи не будете працювати , якщо ви працюєте sudoз варіантами - можливі рішення [[ "$*" =~ " rm " ]]для перевірки рядка «ет» в оточенні просторів або *" rm "*)з caseзловити будь-яку командний рядок , що містить «тт».


[[ "$1" == "rm" ]] && opt="-k";а як же /bin/rm?
Rinzwind

@Rinzwind Я думаю, що функція легко адаптується до конкретних потреб, особливо caseпідходу.
десерт

1

Ця відповідь не стосується sudoчастини вашого запитання, але, з іншого боку, стосується способу зменшити небезпеку випадкових rmвикликів для будь-якого користувача.

Ви можете псевдонім rmдо rm -Iякого

  • просить підтвердити, як тільки він видалить каталог або більше 3-х файлів
  • до тих пір, поки ви не залишите,-f що перевершує попередні -Iпараметри.

--one-file-systemє ще одним можливим захистом від випадкового видалення, який я використовую у своєму rmпсевдонімі.

Налаштування

Для створення такого псевдоніма використовуйте команду:

alias rm='rm -I --one-file-system'

Ви можете помістити його у свій ~/.bashrcабо навіть /etc/bash.bashrc.

Використання

$ sudo rm -r /etc/apt/sources.list.d /*
rm: remove all arguments?

Щоб підтвердити тип yesабо його переклад у вашу мову чи першу букву будь-якого слова, натисніть Enter. Будь-який інший вхід, включаючи жоден, не припиняє операцію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.