Plik Sudoers, włącz NOPASSWD dla użytkownika, wszystkie polecenia

142

Przedmowa

Jest to dość złożone pytanie związane z plikiem Sudoers i ogólnie poleceniem sudo.

UWAGA: Wprowadziłem te zmiany na dedykowanym komputerze z systemem Ubuntu Desktop 13.04, którego używam wyłącznie do celów edukacyjnych. Rozumiem, że włączenie NOPASSWD sudo jest ogromnym zagrożeniem dla bezpieczeństwa.

Pytanie

Początkowo moją jedyną zmianą w pliku sudoers (/ etc / sudoers) była jedna linia, specyfikacja użytkownika, która powinna umożliwić „nicholsonjf” uruchamianie wszystkich poleceń za pomocą sudo bez konieczności wprowadzania hasła (patrz wiersz rozpoczynający się od „nicholsonjf” „):

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL
nicholsonjf    ALL=NOPASSWD: ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

Jednak to nie zadziałało, a za każdym razem, gdy uruchamiałem polecenie jako „nicholsonjf”, wciąż pojawiał się monit o podanie hasła. Mogłem uruchomić polecenia sudo jako „nicholsonjf” dopiero po usunięciu „nicholsonjf” z grup sudo i admin.

Czy ktoś może wyjaśnić, dlaczego to zadziałało?

Czy to dlatego, że użytkownik „nicholsonjf” odziedziczył prawa sudo z dwóch specyfikacji grup „admin” i „sudo” (patrz poniżej w pliku sudoers), które zastępowały specyfikację użytkownika „nicholsonjf”, ponieważ znajdowały się w dalszej części plik konfiguracyjny?

James Nicholson
źródło
7
Uwaga: WSZYSTKIE = NOPASSWD: WSZYSTKIE musi być WSZYSTKIE = (WSZYSTKIE) NOPASSWD: WSZYSTKIE, w przeciwnym razie to nie działa ...
André Verwijs

Odpowiedzi:

164

Dodana linia została zastąpiona. Od man sudoers:

Gdy wiele wpisów pasuje do użytkownika, są one stosowane w kolejności. W przypadku wielu dopasowań używana jest ostatnia zgodność (niekoniecznie najbardziej specyficzna).

W twoim przypadku nicholsonjfbył członkiem grupy, sudowięc dla niego ta linia miała zastosowanie:

%sudo   ALL=(ALL:ALL) ALL

Jeśli chcesz zastąpić wpisy, po /etc/sudoersprostu wstaw nowe wpisy po nich.

Nowy wpis powinien wyglądać

myuser ALL=(ALL) NOPASSWD: ALL dla jednego użytkownika lub

%sudo ALL=(ALL) NOPASSWD: ALL dla grupy.

pabouk
źródło
6
Aby uzyskać kompletne rozwiązanie, chciałbym zobaczyć coś NOPASSWDw tej odpowiedzi ...
Daniel Alder,
22
Myślę, że rozwiązaniem powinno być:%sudo ALL=(ALL) NOPASSWD:ALL
Daniel Alder,
3
@DanielAlder: Wiersz specyfikacji z pytania nicholsonjf ALL=NOPASSWD: ALLjest poprawny. To było po prostu w niewłaściwym miejscu, jak wyjaśniłem w odpowiedzi. ------ RunasSpecyfikacja - w twoim przypadku (ALL)- jest opcjonalna. Jeśli pominiesz specyfikację, możesz uruchomić polecenia jako rooti nie możesz ich używać -uoraz -gopcji sudo.
pabouk
Jest to gorsze zagrożenie bezpieczeństwa, ponieważ zapewnia wielu użytkownikom dostęp bez hasła. Jeśli to twój komputer osobisty, to nie jest znaczące - być może. Po prostu przeniosę linię osobistą, aby trwała.
Mark Williams,
4
Dodatek zamiast korekty, jeśli używasz czegoś opartego na debian / ubuntu (może być ogólnie stosowane, nie widziałem go nigdzie indziej). Twoim absolutnym najlepszym rozwiązaniem jest dodanie niestandardowych poleceń do pliku w /etc/sudoers.d/ i pozostawienie sudoers zarządzany przez menedżera pakietów.
Aquarion
119

W przypadku pojedynczego użytkownika dodaj ten wiersz na końcu sudoerspliku, używającsudo visudo

superuser ALL=(ALL) NOPASSWD: ALL

Dla grupy

%supergroup  ALL=(ALL) NOPASSWD: ALL
Fedir RYKHTIK
źródło
8
Zanim przeczytałem tę odpowiedź, zrobiłem %sudo ALL=NOPASSWD: ALLto i działa. Czy jestem jedyną osobą, która uważa, że ​​formularz Extended Backus-Naur jest naprawdę trudny do zrozumienia?
Vince
4
@Vince Po użyciu polecenia nie mogę sudobez hasła jako użytkownik bez uprawnień sudo. Np. sudo -u root -iDziała, ale sudo -u git -inie działa.
NeverEndingQueue,
Jest to znacznie bardziej pomocna odpowiedź niż zaakceptowana, która, choć odpowiada na pytanie PO, prawdopodobnie nie jest tym, czego większość ludzi dociera do tej strony za pośrednictwem Google.
Mahmoud Al-Qudsi
3

Aby nigdy nie poprosi bieżącego użytkownika o hasło, gdy dany użytkownik korzysta sudozrobić

echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/dont-prompt-$USER-for-password

spowoduje to utworzenie pliku o nazwie /etc/sudoers.d/dont-prompt-<YOUR USERNAME>-for-sudo-passwordi będzie oznaczać, że użytkownik, który uruchomił to polecenie, nie będzie monitowany o podanie hasła podczas wykonywania sudopolecenia. Nadal będziesz monitowany o podanie hasła w innych kontekstach, na przykład podczas instalowania programów z aplikacji graficznej Ubuntu Software .

Zalety robienia tego w ten sposób w porównaniu z dodawaniem wiersza w echopoleceniu do /etc/sudoersużywania sudo visudo(jak sugerują inne odpowiedzi) to:

  1. /etc/sudoersjest czasem modyfikowany przez aktualizacje systemu, podczas gdy pliki w nim /etc/sudoers.dnie są
  2. sudo visudometoda jest podatna na błąd (jak wynika z tego samego pytania), podczas kopiowania / wklejania polecenia jest znacznie trudniejsze do bałagan

Zgodnie z sudo cat /etc/sudoers.d/READMEtą funkcją (wstawianie dodatkowych plików sudoer /etc/sudoers.d) jest domyślnie włączony od Debiana 1.7.2p1-1, który pojawił się pod koniec lat 90. (Ubuntu jest oparty na Debianie ).

Boris
źródło
(nie wahaj się edytować mojej odpowiedzi, jeśli możesz wymyślić lepszą nazwę pliku)
Boris
0

Jak Vince nie wspomniano w komentarzu , można skorzystać z tej linii:

%sudo ALL=NOPASSWD: ALL

(Różni się to od linii pokazanych w tych odpowiedziach i rozwiązało to problem).

E. Fortes
źródło
@Eliah to nie różni się tak bardzo od innych odpowiedzi. Wystarczy zastąpić symbol zastępczy supergroupw odpowiedzi Fedira słowem sudo. Co dalej, kolejny użytkownik grupy wheel? Lub jakakolwiek inna grupa, z której korzysta użytkownik?
muru
1
@muru „Wszystko, co robi, to zastąpić symbol zastępczy supergroupw odpowiedzisudo Fedira słowem .” Co? Wymiana supergroupze sudow linii %supergroup ALL=(ALL) NOPASSWD:ALLplonów %sudo ALL=(ALL) NOPASSWD:ALL, nie %sudo ALL=NOPASSWD: ALL.
Eliah Kagan
Co jest prawdopodobnie gorsze, ponieważ teraz NOPASSWD jest przeznaczony tylko dla użytkownika root jako użytkownik docelowy. Więc nawet nie odpowiada poprawnie na pytanie!
muru
@muru Co to jest nawet zapewne jednak jest substytucja supergroupz sudo. To jest własna odpowiedź, a nie post dzięki lub kopia innej odpowiedzi. Ale tak, zgadzam się: jeśli nie zamierzają tego , dla większości użytkowników nie będzie to tak dobre, jak metody z innych odpowiedzi. (Ale, szczególnie biorąc pod uwagę pytanie, które brzmi „wszystkie polecenia”, a nie „wszyscy docelowi użytkownicy”, nie sądzę, że w efekcie nawet nie próbuje odpowiedzieć na zadane pytanie.)
Eliah Kagan,
To działało dla mnie i chciałem podzielić się z innymi użytkownikami :) (w razie potrzeby usuń mój komentarz).
E. Fortes