Jak zawsze egzekwować hasło sudo dla określonej komendy?


12

Innego dnia robiłem kilka zadań konserwacyjnych na moim serwerze internetowym. Spieszyłem się i byłem śpiący, więc wszystko robiłem za pomocą sudopoleceń.

A potem przypadkowo nacisnąłem Ctrl+ V, wysyłając to polecenie na mój serwer internetowy:

sudo rm -rf /*

Dla tych, którzy zastanawiają się, co robi powyższe polecenie: usunęło to cały mój serwer WWW

Na szczęście miałem kopie zapasowe i niestety musiałem spędzić dwie godziny na czuciu, aby naprawić ten niesamowity błąd. Ale od tego czasu zastanawiam się:

Czy istnieje sposób, aby zawsze wymuszać hasło sudo dla określonego polecenia?

Gdyby serwer poprosił mnie o hasło, oszczędziłbym sobie wielu kłopotów. Tak się nie stało, ponieważ wykonałem około 5 sudopoleceń przed tym majestatycznym błędem.

Czy jest na to sposób? Potrzebuję tylko hasła z rmpoleceniem, aby zawsze być egzekwowanym. Inne polecenia, których używam, są zwykle nanolub cpktóre (do pewnego stopnia) można cofnąć.



2
@solsTiCe /*jest rozwijany przed przekazaniem go do polecenia rm. Dlatego polecenie nie widzi ani jednego argumentu, ale listę argumentów ( /bin /boot /cdrom /dev /etc /home...)
Dan

3
Jedną ważną lekcją, którą należy wyciągnąć z tego, jest to, że nie powinieneś uruchamiać rzeczy w sudo, chyba że naprawdę potrzebujesz. Wiem, że to nie odpowiada na to, o co tutaj pytałeś, ale nadrzędnym pytaniem jest, jak (mam nadzieję) zapobiec ponownemu usunięciu serwera, a unikanie sudo powinno być pierwszą linią obrony przed tym.
David Z


2
@ WinEunuuchs2Unix To wcale nie jest duplikat, op tutaj nie chce, aby rmpolecenie miało hasło. Chcą tylko sudozapytać o jeden za każdym razem, gdy używane jest polecenie rm. Rozwiązanie pytania, które podłączyłeś, stałoby się nieco irytujące, gdy twoje pierwsze polecenie jest sudo rm. Ponieważ poprosi Cię o dwa hasła, jedno za sudojedno rm.
Dan

Odpowiedzi:


17

Można ustawić timestamp_timeoutTO 0dla poszczególnych poleceń /etc/sudoers. Utwórz plik visudo -f /etc/sudoers.d/pducko następującej treści:

Cmnd_Alias DANGEROUS = /bin/rm

Defaults!DANGEROUS timestamp_timeout=0

pduck ALL = (ALL:ALL) DANGEROUS

Teraz użytkownik pduckjest zawsze proszony o hasło podczas działania sudo rm(bez względu na podane dodatkowe parametry), nawet jeśli użytkownik jest członkiem sudogrupy i sudopamięta swoje hasło dla innych poleceń.

Minusem jest to, że nie można łatwo dodać parametrów do /bin/rmwiersza w pliku, aby dodatkowo to ograniczyć. Cóż… możesz:

Cmnd_Alias DANGEROUS = /bin/rm -f

ale wtedy zostaniesz poproszony o podanie dokładnie, sudo rm -fa nie (ponownie) sudo rm -rfna przykład.


9

Jedną z metod byłoby użycie safe-rm . Spowoduje to TYLKO zastosowanie słowa „rm” i zapobiegnie uruchomieniu określonych wersji „rm”. Obejmuje to usunięcie systemu głównego, ale można go również użyć do zapobiegania usuwaniu katalogów związanych z systemem, takich jak „/ usr /” lub „/ var /”. Z linku:

Anulowanie przypadkowego usunięcia ważnych plików

Safe-rm to narzędzie bezpieczeństwa, którego zadaniem jest zapobieganie przypadkowemu usunięciu ważnych plików poprzez zamianę /bin/rmna opakowanie, które sprawdza podane argumenty względem konfigurowalnej czarnej listy plików i katalogów, których nigdy nie należy usuwać.

Użytkownicy, którzy spróbują usunąć jeden z tych chronionych plików lub katalogów, nie będą mogli tego zrobić i zamiast tego zostanie wyświetlony komunikat ostrzegawczy:

$ rm -rf /usr   
Skipping /usr

(Ścieżki chronione można ustawić zarówno na poziomie witryny, jak i użytkownika.)

Odzyskiwanie ważnych plików usuniętych przez pomyłkę może być dość trudne. Zabezpiecz się już dziś, instalując safe-rm i zmniejsz prawdopodobieństwo, że będziesz musiał skontaktować się z usługą odzyskiwania danych!

wprowadź opis zdjęcia tutaj


Zagłosowano na sejf
Michael Fulton

3

sudozapewnia opcję -k, --reset-timestamp, patrz man sudo:

W przypadku użycia w połączeniu z poleceniem lub opcją, która może wymagać hasła, ta opcja spowoduje, że sudo zignoruje buforowane poświadczenia użytkownika. W rezultacie sudo poprosi o podanie hasła (jeśli jest to wymagane przez zasady bezpieczeństwa) i nie zaktualizuje poświadczeń użytkownika w pamięci podręcznej.

Możesz napisać proste opakowanie do sudotestowania rm -rf /*i uruchamiania

sudo -k rm -rf /*

zamiast tego, np. tak:

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

Przykładowe użycie

Testowanie echo atutaj.

$ sudo echo
[sudo] password for dessert: 

$ sudo echo

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

Jeśli chcesz być pytany przy każdym uruchomieniu rm, możesz dostosować powyższą funkcję w następujący sposób:

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

Jeśli chcesz połączyć zarówno ogólne wywołania poleceń, jak i określone wiersze poleceń, polecam użyć casenp .:

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 "$@"
}

Zauważ, że te podejścia nie będzie działać po uruchomieniu sudoz opcjami - możliwe rozwiązania są [[ "$*" =~ " rm " ]]w celu sprawdzenia smyczkowy „rm” otoczony spacjami lub *" rm "*)z casezłapać żadnego wiersza poleceń zawierające „rm”.


[[ "$1" == "rm" ]] && opt="-k";A co /bin/rm?
Rinzwind

@Rinzwind Myślę, że funkcję tę można łatwo dostosować do konkretnych potrzeb, zwłaszcza casepodejścia.
deser

1

Ta odpowiedź nie dotyczy sudoczęści twojego pytania, ale z drugiej strony stanowi sposób na ograniczenie ryzyka przypadkowego rmwywołania przez dowolnego użytkownika.

Możesz alias rmdo rm -Iktórego

  • prosi o potwierdzenie, gdy tylko usunie katalog lub więcej niż 3 pliki
  • tak długo, jak pominiesz to,-f co przesłania poprzednie -Iopcje.

--one-file-systemto kolejne możliwe zabezpieczenie przed niezamierzonym usunięciem, którego używam w swoim rmaliasie.

Ustawiać

Aby utworzyć taki alias, użyj polecenia:

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

Możesz umieścić go w swoim ~/.bashrclub nawet /etc/bash.bashrc.

Stosowanie

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

Aby potwierdzić, wpisz yesjego tłumaczenie na język lokalny lub pierwszą literę dowolnego słowa i naciśnij Enter. Wszelkie inne dane wejściowe, w tym brak, przerywają działanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.