Wykonać sudo bez hasła?

292

Zainspirowany tym pytaniem ....

Jestem jedyną osobą korzystającą z mojego systemu z 12.04.
Za każdym razem wydawam sudopolecenie; system prosi o podanie hasła użytkownika (które jest dobre na swój sposób).
Jednak myślałem; bez aktywacji konta root ; jak mogę wykonać polecenia sudo, które nie będą wymagały hasła użytkownika do uwierzytelnienia.

UWAGA: Chcę wykonać polecenie sudo bez uwierzytelniania za pomocą hasła; tylko wtedy, gdy są wykonywane przez terminal.
Nie chcę usuwać tej dodatkowej warstwy zabezpieczeń z innych funkcji, na przykład podczas korzystania z „Centrum oprogramowania Ubuntu” lub wykonywania skryptu bash poprzez przeciągnięcie pliku coś.sh do terminala.

Bhavesh Diwan
źródło
2
więc chcesz być poproszony tylko o podanie hasła w terminalu, a o inne rzeczy nie, lub w inny sposób? w obu przypadkach, myślę, że jest to naruszenie bezpieczeństwa
Dr_Bunsen
Chcę, aby system nie pytał o hasło tylko w terminalu ... w jakimkolwiek innym celu system musi zapytać o hasło. To wymaganie jest tylko tymczasowe i należy je stosować podczas konfigurowania n instalowania nowych serwerów .. podczas nowych instalacji serwera, naprawdę zajmuje to wiele godzin konfigurowania za pomocą poleceń sudo .. wydawanie hasła co 15 minut. jest ból głowy. Nie chcę używać konta roota.
Bhavesh Diwan
Musisz przeczytać dyskusję w: askubuntu.com/questions/135428/…
david6
1
Na pewno możesz przedłużyć limit czasu. Ponadto, jeśli często wykonujesz nowe konfiguracje serwerów, powinieneś pomyśleć o automatyzacji tego procesu. Nie zarabiasz na pisaniu, zarabiasz na rozwiązywaniu problemów i wykonywaniu zadań *.
MauganRa,

Odpowiedzi:

82

sudo -i jest właściwą drogą, jeśli nie chcesz wpisywać hasła co 10 minut podczas modyfikowania systemu (lub innych systemów) i nie chcesz modyfikować żadnych plików systemowych.

Nastąpi przełączenie na rootowanie przy użyciu sudohasła użytkownika, gdy zamkniesz konsolę lub wpiszesz exitsię w normalnego użytkownika.

Bruno Pereira
źródło
2
Czy to będzie prawdą, że wprowadzę hasło tylko raz ... i do czasu, gdy nie wyjdę; pogoda 5 godz. lub 15 .... system nie poprosi o uwierzytelnienie za pomocą hasła, gdy zostanie wydane jakiekolwiek polecenie sudo.
Bhavesh Diwan
2
@ Z9iT do momentu wpisania exitlub do zamknięcia okna emulatora terminala.
Bruno Pereira,
2
Dzięki .. Zaakceptowałem tę odpowiedź, ponieważ serwer służy do wydawania poleceń sudo bez uwierzytelniania hasłem przez n-godzin do czasu, gdy nie wyjdziemy. Brak modyfikacji plików systemowych to plus.
Bhavesh Diwan
3
To tak naprawdę nie odpowiada na pytanie, ponieważ nadal musisz wprowadzić hasło, aby zostać rootem w tym momencie.
Adam F.
2
Nie, jeśli uruchamiasz maszynę wirtualną w bezpiecznym środowisku i chcesz, aby ta funkcja natychmiast coś zrobiła i nie chcesz zajmować się hasłami. Ta odpowiedź nie odpowiada na pytanie, choć jest prawdopodobnie pomocną informacją. Zgadzam się z Adamem F.
Jonathanem Komarem,
572

Możesz skonfigurować, sudoaby nigdy nie pytać o hasło.

Otwórz okno terminala i wpisz:

sudo visudo

W dolnej części pliku dodaj następujący wiersz:

$USER ALL=(ALL) NOPASSWD: ALL

Gdzie $USERjest twoja nazwa użytkownika w twoim systemie? Zapisz i zamknij plik sudoers (jeśli nie zmieniłeś domyślnego edytora terminali (będziesz wiedział, jeśli masz), naciśnij ctl + x, aby wyjść nanoi poprosi o zapisanie).

Począwszy od Ubuntu 19.04, plik powinien teraz wyglądać mniej więcej tak

#
# 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:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) 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

YOUR_USERNAME_HERE ALL=(ALL) NOPASSWD: ALL

Następnie możesz pisać sudo <whatever you want>w oknie terminala bez pytania o hasło.

Dotyczy to tylko korzystania z sudopolecenia w terminalu. Nadal pojawi się monit o podanie hasła, jeśli (na przykład) spróbujesz zainstalować pakiet z centrum oprogramowania

monit o hasło GUI

Octávio Filipe Gonçalves
źródło
15
Zaleca się stosowanie sudo visudozamiast bezpośredniej edycji. Również zmiana uprawnień sudoers może się zablokować. Podczas edycji za pomocą vimużyj :wq!do zapisu plików tylko do odczytu i wyjdź z edytora. W ten sposób uprawnienia 644 nie są konieczne.
Lekensteyn
8
Jest to poważne zagrożenie bezpieczeństwa, każdy, kto przejmie jakiekolwiek konto z uprawnieniami sudo, może przejąć kontrolę nad całym systemem i zablokować dalszy dostęp do tego komputera, co nie jest zalecane.
Bruno Pereira,
6
@ wil93 brakuje Ci sensu: skrypt, który wzywa sudo install crapware, nie poprosi o hasło w tym przypadku i może zepsuć wszystko, co masz, i nie musisz być fizycznie obok komputera, aby rozpowszechniać skrypty podczas ostatniego sprawdzania. .. To tylko przykład.
Bruno Pereira,
12
@BrunoPereira Jeśli planujemy uruchamiania skryptów niezaufane wtedy , że jest zagrożenie bezpieczeństwa (nawet jeśli sudo pyta o hasło, złośliwy skrypt może zawsze rm -rf ~brudząc sporo rzeczy). Ogólnie rzecz biorąc, nie nazwałbym „poważnym zagrożeniem bezpieczeństwa” zwykłym usunięciem hasła z sudo.
wil93,
5
Zgadzam się z @ wil93. Podczas uruchamiania niezaufanego skryptu wpisanie hasła jest jedynie szansą na anulowanie procesu, podczas gdy wątpię, aby było ono bezużyteczne dla większości ludzi. Chodzi o to, że wiesz, skąd skrypt i co robi.
Czad
36

Limity czasu rootowania sudo są najłatwiejszym i najbezpieczniejszym sposobem na zrobienie tego. Przedstawię wszystkie przykłady, ale ostrzegam, że jest to bardzo ryzykowne, jakkolwiek to zrobisz, chociaż ten sposób jest znacznie bezpieczniejszy:

sudo visudo

Spowoduje to otwarcie edytora i skierowanie go do pliku sudoers - Ubuntu domyślnie ma wartość nano, inne systemy używają Vi. Jesteś teraz superużytkownikiem edytującym jeden z najważniejszych plików w systemie. Bez stresu!

(Szczegółowe instrukcje Vi zapisane w (vi!) . Zignoruj ​​je, jeśli używasz nano.)

Użyj klawiszy strzałek, aby przejść na koniec Defaultslinii.

(vi!) naciśnij klawisz A (wielkie „a”), aby przejść na koniec bieżącej linii i przejść do trybu edycji (dołącz po ostatnim znaku w linii).

Teraz wpisz:

,timestamp_timeout=X

gdzie X to limit czasu w minutach. Jeśli podasz 0, zawsze będziesz pytany o hasło. Jeśli podasz wartość ujemną, limit czasu nigdy nie wygaśnie. Np Defaults env_reset,timestamp_timeout=5.

(vi!) naciśnij Escape, aby powrócić do trybu poleceń. Teraz, jeśli jesteś zadowolony ze swojej edycji, wpisz, :w Enteraby zapisać plik i :q Enterwyjść z vi. Jeśli popełniłeś błąd, być może najłatwiejszym sposobem jest powtórzenie od początku, wyjście bez zapisywania (naciśnij, Escapeaby przejść do trybu poleceń), a następnie wpisz: q! Enter.

Naciśnij Ctrl+ X, a następnie Y, Enteraby zapisać plik i wyjść z nano.

Możesz przeczytać strony podręczników sudoers i vi, aby uzyskać dodatkowe informacje.

man sudoers
man vi

Zresetuj wartość limitu czasu za pomocą:

sudo -k

Te instrukcje mają usunąć monit o podanie hasła podczas korzystania z polecenia sudo. Polecenie sudo nadal będzie jednak musiało być użyte do uzyskania dostępu do roota.

Edytuj plik sudoers

Otwórz okno terminala. Wpisz sudo visudo. Dodaj następujący wiersz do END pliku (jeśli nie na końcu, można go anulować późniejszymi wpisami):

<username> ALL=NOPASSWD: ALL

Zamień na <username>swoją nazwę użytkownika (bez <>). Zakłada się, że Ubuntu utworzyło grupę o tej samej nazwie co nazwa użytkownika, co jest typowe. Możesz na przemian używać użytkowników grupy lub dowolnej innej takiej grupy, w której się znajdujesz. Upewnij się tylko, że jesteś w tej grupie. Można to sprawdzić, przechodząc do opcji System -> Administracja -> Użytkownicy i grupy.

Przykład:

michael ALL=NOPASSWD: ALL

Wpisz ^ X ( Ctrl+ X), aby wyjść. Powinno to poprosić o opcję zapisania pliku, wpisz Y, aby zapisać.

Wyloguj się, a następnie zaloguj ponownie. Powinno to umożliwić uruchomienie polecenia sudo bez pytania o hasło.

Konto root

Włączanie konta root

Włączenie konta root jest rzadko konieczne. Prawie wszystko, co musisz zrobić jako administrator systemu Ubuntu, można zrobić za pomocą sudo lub gksudo. Jeśli naprawdę potrzebujesz trwałego logowania do roota, najlepszą alternatywą jest symulacja powłoki rootowania przy użyciu następującego polecenia:

sudo -i

Jeśli jednak musisz włączyć logowanie roota, możesz to zrobić w następujący sposób:

sudo passwd root

Ponowne wyłączenie konta root

Jeśli z jakiegoś powodu włączyłeś swoje konto root i chcesz je ponownie wyłączyć, użyj następującego polecenia w terminalu:

sudo passwd -dl root

Systemowa grupa sudo

root$ echo "%sudo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

Wyloguj się, a następnie zaloguj ponownie.

Zresetuj limit czasu sudo

Możesz upewnić się, że sudo poprosi o hasło następnym razem, uruchamiając:

sudo -k
user209328
źródło
Opublikowałem to przed dodaniem, aby uzyskać informacje na temat całego systemu, a inni czytają tutaj:
user209328,
To była późna odpowiedź, ale jest najbardziej kompleksowa pod względem dostępnych opcji.
Jenning
1
Hmm, na Ubuntu 18.04 MATE działa to doskonale, podczas gdy robienie tego samego na Ubuntu 18.04 GNOME spowodowało mi zmarszczki z powodu problemu „nazwa użytkownika nie jest w pliku sudoers ...”. Właśnie dlatego tak wielu ludzi nienawidzi linuksa - ponieważ rzadko jest to „przyczynowe”: D Na wypadek, gdybyś wpadł na to samo ... W ten sposób rozwiązujesz problem: tecmint.com/…
Peter
Zmienna środowiskowa EDITOR może ustawić edytor używany ... np. sudo env EDITOR=/bin/nano visudoDo niezawodnej edycji sudoersw nano. (do ustawienia edytora można także użyć aktualizacji-alternatyw)
Gert van den Berg
29

Preferowanym sposobem udzielania indywidualnych (lub grupowych) uprawnień byłoby dodawanie plików /etc/sudoers.d

To oddziela lokalne zmiany od domyślnych zasad i oszczędza czas na wypadek zmiany pliku sudoers dystrybucji.

Aby ustawić zalogowanego użytkownika jako sudoer i sudonie monitować go o hasło, użyj

echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/$USER

spowoduje to utworzenie pliku o nazwie /etc/sudoers.d/$USER(gdzie $USERjest nazwa użytkownika, do którego użytkownik był zalogowany, tak jak podczas uruchamiania tego polecenia), co wyjaśni, którzy użytkownicy mają uprawnienia.

Jeśli chcesz to zrobić dla innego użytkownika, po prostu zastąp oba wystąpienia $USERinną nazwą użytkownika w powyższym poleceniu.

echo "otheruser ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/otheruser

Podobnie jeden plik może służyć do zarządzania wieloma dyrektywami:

echo "username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers.d/local

Zobacz /etc/sudoers.d/READMEi man sudoerswięcej informacji.

użytkownik1656671
źródło
polecenie echo nie powiodło się, mimo że jestem rootem. ale dodałem plik i edytowałem go bezpośrednio, a to działało na najnowszym Ubuntu (podczas gdy dodawanie użytkownika do sudoers bezpośrednio nie!)
scape
1
Właściwy sposób to zrobić za pomocą teepolecenia.
woto 19.01.18
1
Jest to lepszy sposób, który działa sudo sh -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$(logname)'sudo chmod 440 /etc/sudoers.d/$(logname)
:,
W sudo ... >filepowłoce przekierowanie jest wykonywane w oryginalnej powłoce, więc może działać tylko w powłoce głównej.
Konstantin Pelepelin
metoda tee, bez problemów z pozwoleniem:echo "username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/username
Carson Ip
7

Przyjemny jeden wiersz do usuwania monitów sudo dla bieżącego użytkownika

sudo bash -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" | (EDITOR="tee -a" visudo)'
Eric Landry
źródło
2
Myślę, że możesz po prostu zrobić: potrzebuje echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo env EDITOR="tee -a" visudotylko w końcu (a nawet nie będzie potrzebny w domyślnej konfiguracji, IIRC). visudosudoenv
muru
jest tak wiele rzeczy, które mogą pójść nie tak (oczywiście błąd użytkownika), że moim bardzo skromnym zdaniem zaleca się bezpośrednią edycję pliku sudoer ( sudo visudo) podczas testowania wyniku (przy wciąż otwartym edytorze), dla tych nowych użytkowników, którzy mogą ulec pokusie wypróbowania tego „jednowierszowego”.
michael
Dzięki za opinie! Właśnie szybko próbowałem skrypty usunąć monit sudo o hasło w moich testowych maszynach wirtualnych. Sugerujemy ulepszenia :)
Eric Landry
Nadal musisz sudo chmod 440 /etc/sudoers.d/$(logname)poprawić uprawnienia do plików, jak podano w pliku README w tym katalogu.
paradroid
6

Oczywiście to, co chcesz zrobić, nie jest zalecane. Po chwili wchodzenie sudostaje się tak automatyczne, że zmniejsza się jego przydatność.

Innym podejściem jest pozostawienie pliku sudoers w niezmienionej postaci i, robiąc coś skomplikowanego dla setek setek serwerów, wejdź sudo bash. To da ci powłokę, która będzie uwierzytelniona jako root, dopóki jej nie opuścisz.

John S Gruber
źródło
12
sudo -slub sudo -iprawdopodobnie oba są lepszymi pomysłami niż sudo bash, ponieważ zapewniają, że środowisko jest zdrowe i rzeczy.
Darael
2
„rozsądek i rzeczy” zasadniczo nie należą do dziedziny „lepszych pomysłów”, czy ktoś mógłby podać techniczne wyjaśnienie, dlaczego sudo -s lub sudo -i jest lepsze niż sudo bash? (Edytuj: Oto odpowiednie pytanie askubuntu.com/questions/376199/... )
Nuzzolilo,
2
wiele sudopoleceń (szczególnie o tym sudo pip ...) wymaga sudo -H(ustaw HOME), aby polecenie działało poprawnie. W innych przypadkach sudo -Emoże być wymagane (zachowanie env). Bieganie sudo bashprawdopodobnie będzie działać w większości przypadków, ale nie we wszystkich, a gdy nie, nie będzie jasne, dlaczego.
michael
1
sudo su to tradycyjny sposób na zmianę ról i rozpoczęcie działania jako administrator systemu.
user1656671
3

Od superużytkownika pochodzi dobra odpowiedź:

Użyj przełącznika -S, który odczytuje hasło ze STDIN:

echo <password> | sudo -S <command>

Zastąp <password>swoim hasłem.

WinEunuuchs2Unix
źródło
2
Nie jest to sugerowane, ponieważ hasło pozostaje w jawnym typie w pliku historii powłoki. Zamiast tego zastosuj inne rozwiązania.
HappyCactus,
1
@HappyCactus możesz umieścić raz miejsce przed echonim, aby nie pojawiło się ono w historii?
WinEunuuchs2Unix
Tak, pozwoli to uniknąć ujawnienia hasła w postaci czystego tekstu w pliku historii. Ale czy zawsze pamiętasz, aby go dodać? :-)
HappyCactus,
@HappyCactus Zazwyczaj dodam wiodącą przestrzeń przez przypadek, a potem denerwuję się, gdy historia nie może zostać przywołana :) W każdym razie superużytkownik ma 129 głosów pozytywnych, więc myślę, że warto tu zostawić. Ludzie będą czytać nasze komentarze i wiedzieć o ryzyku i etapach awersji do ryzyka.
WinEunuuchs2Unix
W pełni się zgadzam. Miłego dnia!
HappyCactus
2

Jedna wkładka

sudo sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g'

upteryx
źródło
2

Jest to jedno-liniowe rozwiązanie, które zmienia również uprawnienia do plików, jak podano w /etc/sudoer.d/README:

sudo sh -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$(logname)' & sudo chmod 440 /etc/sudoers.d/$(logname)
paradroid
źródło
0
  • Rozwijanie pomysłu @upteryx.

  • W ten sposób zaimplementowałem użytkownika innego niż root, bez hasła, w efemerycznym obrazie Docker do użytku w potoku CICD:

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
    echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id
Seth Bergman
źródło