Как всегда применять пароль sudo для конкретной команды?

12

На днях я выполнял некоторые задачи по обслуживанию своего веб-сервера. Я спешил и спал, поэтому все делал по sudoкоманде.

И затем я случайно нажал Ctrl+ V, отправив эту команду на мой веб-сервер:

sudo rm -rf /*

Для тех, кто интересуется, что делает команда выше: Это удалило весь мой веб-сервер

К счастью, у меня были резервные копии, и, к сожалению, мне пришлось потратить еще два часа на то, чтобы проснуться, чтобы исправить эту удивительную ошибку. Но с тех пор мне стало интересно:

Есть ли способ всегда применять пароль sudo для конкретной команды?

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

Итак, есть ли способ сделать это? Мне просто нужен пароль, чтобы rmкоманда всегда применялась. Другие команды, которые я использую, обычно nanoили cpкоторые (до некоторой степени) являются обратимыми.

Павел Яничек
источник
2
@solsTiCe /*раскрывается перед передачей в команду rm. Таким образом, команда не видит ни одного аргумента, но список аргументов ( /bin /boot /cdrom /dev /etc /home...)
Дан
3
Один важный урок, который можно извлечь из этого, заключается в том, что вы не должны запускать вещи с помощью sudo, если вам это действительно не нужно. Я знаю, что это не отвечает на то, что вы задали здесь, но главный вопрос заключается в том, как (надеюсь) предотвратить повторное удаление вашего сервера, и избегание sudo должно быть вашей первой линией защиты от этого.
Дэвид З
2
Возможный дубликат Как я могу установить пароль для команды 'rm'?
WinEunuuchs2Unix
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, например.

PerlDuck
источник
9

Одним из методов будет использование safe-rm . Это ТОЛЬКО адресует использование «rm» и предотвращает запуск определенных версий «rm». Это включает удаление вашей корневой системы, но также может использоваться для предотвращения удаления системных каталогов, таких как "/ usr /" или "/ var /". По ссылке:

Предотвращение случайного удаления важных файлов

Safe-rm - это инструмент безопасности, предназначенный для предотвращения случайного удаления важных файлов путем замены /bin/rmоболочкой, которая проверяет заданные аргументы на предмет настраиваемого черного списка файлов и каталогов, которые никогда не следует удалять.

Пользователи, которые пытаются удалить один из этих защищенных файлов или каталогов, не смогут это сделать, и вместо этого им будет показано предупреждение:

$ rm -rf /usr   
Skipping /usr

(Защищенные пути могут быть установлены как на уровне сайта, так и на уровне пользователя.)

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

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

Rinzwind
источник
Голосование за безопасность
Майкл Фултон,
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», заключенную в пробелы, или *" rm "*)с помощью команды caseперехватить любую командную строку, содержащую «rm».

Десерт
источник
[[ "$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. Любой другой ввод, включая ни одного, не прерывает операцию.

Дэвид Фёрстер
источник