Zapobiegaj sudo monitowania o hasło podczas uruchamiania niedozwolonego polecenia

15

Udzieliłem grupie uprawnień do uruchamiania niektórych poleceń bez hasła za pośrednictwem sudo. Gdy jeden z użytkowników popełni literówkę lub wykona nieprawidłowe polecenie, system wyświetli monit o podanie hasła, a następnie pojawi się błąd. Jest to mylące dla użytkownika, dlatego chciałbym po prostu wyświetlić błąd zamiast monitować go o hasło. czy to możliwe?

Oto przykład mojego pliku sudoers:

%mygroup ALL=(ALL) NOPASSWD:/usr/local/bin/myscript.sh *

Przykład, gdy uruchomią zły skrypt:

# sudo /usr/local/bin/otherscript.sh
[sudo] password for user:
Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>.

Pożądane wyjście:

Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>. Please check the command and try again.

Zwróć uwagę na brak monitu o hasło.

Moje google-fu nie powiodło się mnie i zwraca tylko wyniki nie pyta o hasło, gdy użytkownik jest dozwolone, aby uruchomić polecenie.

użytkownik184982
źródło
8
Gdyby to było możliwe, mógłby otworzyć (małą) dziurę w zabezpieczeniach. Jeśli zostawisz się zalogowany i „pożyczę” twoją klawiaturę, nie widzę, które polecenia sudopozwolą ci wykonać bez podania hasła. Dzięki funkcji, którą chcesz, mogę uzyskać te informacje dla określonych poleceń.
Keith Thompson,
4
Jest to dość duży problem bezpieczeństwa. Nie należy używać sudo ze skryptami jako poleceniem. Ludzie mogą po prostu edytować skrypt i uruchamiać, co tylko chcą, całkowicie maskując go z audytu. Zamiast tego dodaj wywołanie sudo w skrypcie.
coteyr
1
@coteyr z uruchamianiem plików binarnych sudojest równie dużym problemem, jeśli użytkownicy mają dostęp do zapisu tych plików.
Dmitrij Grigoryev,
1
@CllWitthoft, dlatego używasz ścieżek bezwzględnych do określania dozwolonych programów w sudoers.
Dmitrij Grigoryev,
1
@DmitryGrigoryev, tak, ale jeśli zamierzasz użyć seda lub czegoś takiego tylko dla jednego pliku, sudo nie ma żadnych korzyści. Zezwolenie użytkownikowi na modyfikację pliku jest przyczyną, dla której pliki mają uprawnienia. Nie musisz wymyślać koła od nowa. Jeśli chcesz, aby użytkownik mógł zmodyfikować plik, pozwól mu. Nie ma potrzeby ani korzyści, aby skakać przez obręcze z sudo, aby umożliwić użytkownikowi modyfikację pliku bez hasła. Zawsze możesz im na to pozwolić. Właściwe narzędzie do właściwej pracy.
coteyr

Odpowiedzi:

25

Z szybkiego czytania sudo(8)

   -n          The -n (non-interactive) option prevents sudo from
               prompting the user for a password.  If a password is
               required for the command to run, sudo will display an error
               message and exit.

A dla wątpiących:

# grep jdoe /etc/sudoers
jdoe    ALL=(ALL) NOPASSWD: /bin/echo
#

Testowany w ten sposób:

% sudo echo allowed
allowed
% sudo -n ed             
sudo: a password is required
% sudo ed               

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Password:

Więc aliasdla sudotych ludzi prawdopodobnie rade, aby zapobiec szybka hasło. Dlaczego to wymaga niestandardowej kompilacji sudo, nie wiem, po prostu przeczytałem instrukcję.

gałązka
źródło
W rzeczy samej. Umieściłbym coś takiego alias sudo="$(which sudo) -n"w / etc / bashrc, a następnie użyłem sudo(dostosowanego zachowania) lub command sudo(domyślnego zachowania) według potrzeb.
CVn
7

Jedną z rzeczy, która działała dla mnie (Sudo wersja 1.8.17p1), ale spełnia tylko część twojego problemu, jest ustawienie liczby prób wprowadzenia hasła na 0.

Defaults:%mygroup passwd_tries = 0

Powoduje to, że sudo kończy działanie z kodem 1, gdy próbuje się wykonać dowolne polecenie wymagające hasła. Nie wyświetla jednak żadnego komunikatu o błędzie.

meuh
źródło
To także poprawna odpowiedź, ale brak komunikatu o błędzie może być mylący. Prawidłowy, ale nieoczekiwany błąd z powyższej odpowiedzi jest również mylący. To chyba podrzucenie. Dziękujemy za udzielenie alternatywnej odpowiedzi, opcje są zawsze mile widziane!
user184982,
2

Nie możesz.

Nie ma sposobu, aby powiedzieć, kim jesteś, dopóki się nie uwierzytelnisz, a domyślnie nie możesz uwierzytelnić się bez hasła.

Możesz zmienić uwierzytelnianie, aby korzystać z kluczy USB, skanerów odcisków palców, uwierzytelniania głosu, rozpoznawania twarzy lub wielu innych rzeczy, ale sprawa jest taka sama.

Nie możesz się uwierzytelnić, bez uwierzytelniania ORAZ przed uwierzytelnieniem sudo nie musi informować Cię, co możesz uruchomić, a czego nie.

Coteyr
źródło
2
Wpisanie hasła podczas uruchamiania sudo nie jest identyfikacją („powiedz, kim jesteś”). Sudo wie kim jesteś. Wpisanie hasła to potwierdzenie obecności.
Gilles „SO- przestań być zły”
Potwierdzam obecność jako „uwierzytelnienie”. Podobnie jak w przypadku uwierzytelniania, a następnie autoryzacji.
coteyr
2
Odpowiedź mówi „uwierzytelnianie”, a nie „identyfikacja”. Natomiast sudo nie wie kim jesteś ubiegać się, na podstawie użytkownika, który jest zalogowany na tym terminalu, to nie wiem, kim jesteś , dopóki nie uwierzytelniony tę tożsamość.
Dave Sherohman,
2

@StrongBad skomentował coś, co zasługuje na odpowiedź:

Myślę, że najlepszym rozwiązaniem byłoby napisanie skryptu opakowującego, który zawsze wywołuje sudoprawidłowe parametry. (W tym -n)

Skrypt otoki może analizować argumenty itp., Dzięki czemu wywoływany skrypt sudo staje się tak mały, jak to możliwe, a zatem mniej prawdopodobne, że zawiera błędy.

Stig Hemmer
źródło
1

To jest niemożliwe. Jedynym sposobem jest zmiana kodu źródłowego i skompilowanie własnego widelcasudo

użytkownik1700494
źródło
Masz rację, ale nie sądzę, że uzyskam pozwolenie na załadowanie niestandardowej wersji sudo na wszystkie nasze serwery produkcyjne. hah
user184982,