Jak uruchomić określony program jako root bez pytania o hasło?

169

Muszę uruchomić coś takiego jak sudo bez hasła, więc użyłem visudoi dodałem to do mojego sudoerspliku:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Potem wypróbowałem:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

Dlaczego prosi o hasło? Jak mogę uruchamiać / używać poleceń jako użytkownik root bez użytkownika root, bez pytania o hasło?

LanceBaynes
źródło

Odpowiedzi:

91

Masz inny wpis w sudoerspliku, który również pasuje do twojego użytkownika. NOPASSWDZasada musi być po tej jednej w celu jego pierwszeństwo.

Po wykonaniu tej czynności sudopoprosi o hasło normalnie dla wszystkich poleceń, z wyjątkiem tego /path/to/my/program, co zawsze pozwoli Ci uruchomić bez pytania o hasło.

Warren Young
źródło
6
czy to zadziałałoby, gdyby /path/to/my/programbył skryptem w języku Python?
sadmicrowave
Czy zamiast tego program może być aliasem ustawionym na bash (tj. In .bashrc)? A może nawet skrypt powłoki w środku /usr/local/sbin? Spróbować.
Nikos Alexandris,
Nikos - nie, to nie może być alias. Musi wskazywać na prawdziwą ścieżkę.
Paul Hedderly
sudoers? gdzie jest? heawy użyć swojej odpowiedzi (
Vasilii Suricov
@VasiliiSuricov: Zazwyczaj jest /etc, ale niektóre systemy umieszczają go gdzie indziej. Jeśli nie możesz go znaleźć, spróbuj man sudoers. Lokalna lokalizacja tego pliku powinna zostać podstawiona na manstronie w czasie, gdy sudozostała zbudowana dla tego systemu.
Warren Young
135

Jeśli jest wiele pasujących wpisów /etc/sudoers, sudo używa ostatniego. Dlatego jeśli możesz wykonać dowolną komendę z monitem o hasło i chcesz móc wykonać określoną komendę bez monitu o hasło, potrzebujesz wyjątku na końcu.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Zwróć uwagę na użycie (root), aby umożliwić uruchamianie programu jako root, ale nie jako inni użytkownicy. (Nie udzielaj więcej uprawnień niż wymagane minimum, chyba że wymyśliłeś implikacje).

Uwaga dla czytelników, którzy nie używają Ubuntu lub którzy zmienili domyślną konfigurację sudo (sudo Ubuntu jest domyślnie w porządku) : Uruchamianie skryptów powłoki z podwyższonymi uprawnieniami jest ryzykowne, musisz zacząć od czystego środowiska (po uruchomieniu powłoki, jest już za późno (zobacz Zezwalaj na setuid na skryptach powłoki ), więc musisz się tym zająć sudo). Upewnij się, że masz Defaults env_resetw /etc/sudoersalbo, że ta opcja jest domyślnym czasu kompilacji ( sudo sudo -V | grep envpowinny zawierać Reset the environment to a default set of variables).

Gilles
źródło
3
ex, aby rootować z jhon z sudo su bez przepustki -----> john ALL = (ALL) NOPASSWD: / bin / su
bortunac
5
@adrian Jeśli chcesz zezwolić na dowolne polecenia jako root, zrób to john ALL=(ALL) NOPASSWD: all. Nie ma sensu przechodzić przez su.
Gilles
Pytanie: czy powinienem zmienić uprawnienia mojego skryptu powłoki, aby mógł zostać zmodyfikowany i odczytany tylko przez użytkownika root, dla bezpieczeństwa? Mam na myśli atakującego modyfikującego skrypt, który ma wszystkie uprawnienia przyznane bez potrzeby podawania hasła, aby działał tak, jak chce. Oczywiście, atakujący nie może nawet odczytać pliku sudoers, aby dowiedzieć się, które skrypty mają to uprawnienie, ale nadal może wypróbować wszystkie moje niestandardowe skrypty, gdy znajdzie folder, w którym są przechowywane, w nadziei, że niektóre są dozwolone lub coś w tym stylu .
Jeffrey Lebowski,
1
@JeffreyLebowski Jeśli masz regułę sudo, która uruchamia skrypt (bezpośrednio lub pośrednio), ważne jest, aby tylko root (lub ludzie, którzy mają uprawnienia roota) mogli zapisywać do pliku skryptu oraz do katalogu zawierającego plik skryptu i jego katalog nadrzędny i tak dalej. Nie ma znaczenia, że ​​każdy może odczytać plik skryptu (chyba że zawiera hasło lub coś takiego, ale to zły pomysł, jeśli hasło jest w swoim własnym pliku, w przeciwnym razie istnieje zbyt duże ryzyko przypadkowego wycieku np. Przez wklejanie tej sekcji kodu w pytaniu na tej stronie).
Gilles,
1
@alper Nie. Bardzo niewiele rzeczy wymaga ponownego uruchomienia. Po zmianie sudoersnie musisz robić nic specjalnego: sudosprawdza to za każdym razem.
Gilles
24

OSTRZEŻENIE : Ta odpowiedź została uznana za niepewną. Zobacz komentarze poniżej

Kompletne rozwiązanie: następujące kroki pomogą Ci osiągnąć pożądany wynik:

  1. Utwórz nowy plik skryptu (zamień create_dir.shna żądaną nazwę skryptu):

    vim ~/create_dir.sh
    

    Skrypt zostanie utworzony w katalogu osobistym użytkownika

  2. Dodaj niektóre polecenia, które może wykonać tylko użytkownik rootlub sudoużytkownik, takie jak utworzenie folderu na poziomie katalogu głównego:

    mkdir /abc
    

    Uwaga: Nie dodawaj sudodo tych poleceń. Zapisz i wyjdź (używając :wq!)

  3. Przypisywanie uprawnień do wykonywania przy użyciu:

    sudo chmod u+x create_dir.sh
    
  4. Wprowadź zmiany, aby ten skrypt nie wymagał hasła.

    1. Otwórz sudoersplik:

      sudo visudo -f /etc/sudoers
      
    2. Dodaj następujący wiersz na końcu:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Zamień na ahmaddowolną swoją nazwę użytkownika. Upewnij się także, że to ostatni wiersz. Zapisz i wyjdź.

  5. Teraz po uruchomieniu polecenia dodaj sudoprzed nim:

    sudo ./create_dir.sh
    

    Spowoduje to uruchomienie poleceń w pliku skryptu bez pytania o hasło.

Wykonaj proste kroki wymienione tutaj http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

M. Ahmad Zafar
źródło
Byłoby lepiej, gdybyś podał tutaj odpowiednie kroki i używał linku jako kopii zapasowej dla bardziej szczegółowych informacji. W ten sposób twoja odpowiedź zachowuje możliwą wartość, nawet jeśli ten link nie byłby już ważny.
Anthon
15
Ta rada jest niepewna. Ta sudoczęść nie sudo chmod u+x create_dir.shjest konieczna, ponieważ użytkownik ma (prawdopodobnie) własność nad swoim domowym reż. Ponieważ użytkownik może pisać create_dir.sh, skutecznie dałeś mu darmową powłokę root.
Lekensteyn,
1
@ Lekensteyn Oznacza to także każdy program działający jako użytkownik. Równie dobrze może po prostu pozwolić użytkownikowi na uruchamianie czegokolwiek z sudo bez hasła.
pydsigner
2
Czy coś brakuje? Uważam, że całość chmodjest niepotrzebna, ponieważ polegasz na sudopodniesieniu swoich uprawnień.
G-Man,
10

Myślę, że twoja składnia jest nieprawidłowa. Przynajmniej używam następujących, które działają dla mnie:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
musiKk
źródło
6
(ALL)Część jest opcjonalna, pozostawiając ją ma dokładnie ten sam efekt. Mając (root)byłaby lepsza, ale jego brak nie wyjaśniają problemu.
Gilles
+1 za sudo dla tego polecenia i nic więcej! Nie ma powodu, aby łamać cały system ...
Johan
3
@Johan: To już było pytanie.
Gilles
5

Jeśli chcesz uniknąć konieczności używania sudo ani zmieniać pliku konfiguracyjnego sudoers, możesz użyć:

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

Spowoduje to, że polecenie będzie działać jako root bez potrzeby sudo.

linuxgnuru
źródło
Wow, nigdy wcześniej nie słyszałem o tym rozwiązaniu, oszałamiający umysł
coś Co
Dlaczego muszę przewijać do dołu tych rzeczy, aby znaleźć najlepszą odpowiedź? Dzięki za to proste bezpieczne rozwiązanie.
RyanNerd
5

Jeśli masz dystrybucję taką jak Manjaro, musisz najpierw zająć się plikiem, który przesłania definicję / etc / sudoers, możesz go usunąć lub pracować bezpośrednio z tym plikiem, aby dodać nowe konfiguracje.

Ten plik to:

sudo cat /etc/sudoers.d/10-installer

JEDYNY sposób, aby zobaczyć, że ma uprawnienia administratora, nie można wyświetlić tego katalogu bez niego, ten plik jest specyficzny dla Manjaro, możesz znaleźć tę konfigurację pod inną nazwą, ale w tym samym katalogu.

W wybranym pliku możesz dodać następujące linie, aby uzyskać żądaną konfigurację:

Zignoruj ​​uwierzytelnianie dla grupy

%group ALL=(ALL) NOPASSWD: ALL

lub Ignoruj ​​uwierzytelnianie dla użytkownika

youruser ALL=(ALL) NOPASSWD: ALL

lub Ignoruj ​​uwierzytelnianie pliku wykonywalnego dla określonego użytkownika

youruser ALL=(ALL) NOPASSWD: /path/to/executable

SZYBKA UWAGA: Otwierasz drzwi do korzystania z SUDO bez uwierzytelnienia, co oznacza, że ​​możesz uruchomić wszystko, modyfikując wszystko z systemu, używać go z odpowiedzialnością.

Lyoneel
źródło
4

Sprawdź, czy sudo nie jest aliasowane. Biegnij tak

/usr/bin/sudo /path/to/my/program

Na przykład alias powłoki taki jak ten:

alias sudo="sudo env PATH=$PATH"

może powodować takie zachowanie.

Sepero
źródło
Masz rację, mój komentarz był w porządku tutaj , przepraszam za to. Niemniej jednak jestem zaintrygowany - jak możesz oczekiwać, że aliasing zmieni przetwarzanie sudoersprzez sudo. A może mówisz o przekierowaniu sudona coś, co zawsze drukuje ten komunikat o błędzie, aby zgarnąć hasła? Jest to mało prawdopodobne w tym przypadku ...
Peter
2
Miałem ten sam problem co OP. Okazało się, że jest to spowodowane tym, że alias sudo="sudo env PATH=$PATH"mam w sobie ~/.bashrc. Zamiast po prostu rozwiązać to dla siebie i ślepo zajmować się biznesem, podałem swoją odpowiedź jako możliwe rozwiązanie dla każdego, kto przyjdzie z tym wątkiem.
Sepero,
1
To dobrze, ale kiedy nie jest to oczywiste (co w tym przypadku nie jest przynajmniej dla niektórych osób), dobrze jest podać wyjaśnienie w odpowiedzi, aby zapewnić pewien kontekst i uniemożliwić ludziom ślepe używanie magicznych zaklęć. +2 (- (- 1) + +1). :)
peterph
2

Po uruchomieniu skryptu musisz uruchomić go jako sudo /path/to/my/script.

Edycja: Na podstawie komentarza do innej odpowiedzi chcesz uruchomić to z ikony. Będziesz musiał utworzyć .desktopplik, który uruchamia twój program w sudo, tak jak w terminalu.

Możesz również rozważyć użycie gtk-sudowizualnego monitu o podanie hasła.

Prawdopodobnie powinieneś pomyśleć o tym, że nie powinieneś uruchamiać rzeczy jako root, i że lepszym sposobem jest zmiana systemu na dalsze, tak aby w ogóle nie potrzebujesz uprawnień roota.

Caleb
źródło
7
Nie twórz skryptów powłoki jako setuid . Zobacz Zezwalaj na setuid w skryptach powłoki .
Gilles
Nawet nie wspomniałem o tym, bo to taka zła opcja. Właśnie go usunąłem, ponieważ obawiam się, że pytający może skorzystać z porady, nawet z ostrzeżeniem, że była to zła rada!
Caleb
2

To rozwiązało problem (wypróbowałem też kilka innych odpowiedzi, które mogły pomóc):

Skrypt, do którego dzwoniłem, znajdował się w /usr/binkatalogu, do którego nie mam uprawnień do zapisu (chociaż zwykle mogę tam czytać dowolne pliki). Skrypt został chmodded + x (uprawnienie do pliku wykonywalnego), ale nadal nie działał. Przenosząc ten plik do ścieżki w moim katalogu domowym, zamiast tego /usr/binmogłem w końcu wywołać go za pomocą sudo bez podawania hasła.

Również coś, w co wątpiłem (wyjaśnienie dla przyszłych czytelników): Musisz uruchomić skrypt jako sudo. Wpisz sudopodczas wywoływania skryptu. Nie używaj sudopolecenia w skrypcie, który faktycznie wymaga rootowania (w moim przypadku zmienia się podświetlenie klawiatury). Być może to również działa, ale nie musisz i wydaje się, że jest to lepsze rozwiązanie, aby tego nie robić.

Luc
źródło
Drugi akapit miał odpowiedź na mój problem
M. Ahmad Zafar,
@MuhammadAhmadZafar Cieszę się, że to pomogło!
Luc
3
W rzeczywistości używanie sudoskryptu jest całkowicie w porządku, pod warunkiem, że masz odpowiednie uprawnienia (ustawione w sudoers), aby uruchomić dane polecenie bez hasła. To sprawia, że ​​wszystko jest trochę bezpieczniejsze.
peterph
mógłby naprawdę użyć tej odpowiedzi, przepisanej jako „krok po kroku”, a nie jako dialog z innymi odpowiedziami
Walrus the Cat,
@WalrustheCat Dobra uwaga. Ponownie czytając moją odpowiedź, myślę, że sam mogłem się trochę pomylić. W tej chwili jednak nie pamiętam, jaka była dokładnie sytuacja, więc nie mogę tak naprawdę napisać lepiej. Jeśli to wymyślisz, być może kombinacja kilku odpowiedzi, z całą pewnością prześlij nową odpowiedź!
Luc
1

Inną możliwością może być instalacja, konfiguracja, a następnie użycie polecenia super, aby uruchomić skrypt jako

super /path/to/your/script

Jeśli chcesz uruchomić jakiś binarny plik wykonywalny (np które zostały skompilowane do ELF binarnego z jakiegoś kodu źródłowego C)-co jest nie Script jako root, można rozważyć to setuid (a właściwie /bin/login, /usr/bin/sudoa /bin/sui supersą przy użyciu tej techniki ). Bądź jednak bardzo ostrożny, możesz otworzyć ogromną lukę bezpieczeństwa .

Konkretnie, twój program powinien być zakodowany paranoicznie (więc sprawdź wszystkie argumenty oraz środowisko i warunki zewnętrzne przed „działaniem”, zakładając potencjalnie wrogiego użytkownika), wtedy możesz ostrożnie używać seteuid (2) i przyjaciół (patrz także setreuid (2) ) (patrz także możliwości (7) i poświadczenia (7) i wykonanie (2) ...)

Użyjesz chmod u+s(czytaj chmod (1) ) podczas instalowania takiego pliku binarnego.

Ale bądź bardzo ostrożny .

Przeczytaj wiele rzeczy na temat setuid , w tym Advanced Linux Programming , zanim zakodujesz coś takiego.

Zauważ, że skrypt lub jakakolwiek szarpana rzecz nie może być setuid. Ale możesz zakodować (w C) małe owijające binarnie pliki setuid.

Basile Starynkevitch
źródło
0

Idealnie, jeśli dostosowujesz, które polecenia mogą być uruchamiane sudo, powinieneś wprowadzić te zmiany w osobnym pliku, /etc/sudoers.d/zamiast bezpośrednio edytować sudoersplik. Powinieneś również zawsze używać visudodo edycji plików. Trzeba przyznać NIGDY NOPASSWDna ALLpolecenia.

Przykład: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Wstaw swoje pozwolenie na udzielenie linii: myuser ALL= NOPASSWD: /path/to/your/program

Następnie zapisz i wyjdź, a visudoostrzeże Cię, jeśli wystąpią jakiekolwiek błędy składniowe.

Możesz uruchomić, sudo -laby zobaczyć uprawnienia przyznane przez użytkownika, jeśli którekolwiek z NOPASSWDpoleceń specyficznych dla użytkownika pojawi się PRZED jakimkolwiek %groupyouarein ALL=(ALL) ALLpoleceniem na wyjściu, zostaniesz poproszony o podanie hasła.

Jeśli odkryjesz, że tworzysz wiele takich plików sudoers.d, być może będziesz chciał utworzyć je o nazwach poszczególnych użytkowników, aby były łatwiejsze do wizualizacji. Należy pamiętać, że kolejność NAZW PLIKU i ZASAD w pliku jest bardzo ważna, OSTATNIE załadowane wygrywa, niezależnie od tego, czy jest WIĘCEJ, czy MNIEJ dopuszczające niż poprzednie wpisy.

Możesz kontrolować porządkowanie nazw plików za pomocą prefiksu 00-99 lub aa / bb / cc, ale pamiętaj również, że jeśli DOWOLNE pliki nie mają prefiksu numerycznego, zostaną załadowane po plikach numerowanych, zastępując ustawienia. Wynika to z faktu, że w zależności od ustawień języka „sortowanie leksykalne” powłoka używa najpierw liczb sortowania, a następnie może przeplatać wielkie i małe litery podczas sortowania w porządku rosnącym.

Spróbuj uruchomić printf '%s\n' {{0..99},{A-Z},{a-z}} | sorti printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortsprawdź, czy bieżący język jest drukowany AaBbCcitp., A ABCnastępnie abcokreśl najlepszy najlepszy prefiks „ostatniej” litery.

dragon788
źródło
0

Aby każdy użytkownik mógł uruchomić program jako sudo bez pytania o hasło, możesz dodać następujący wiersz

%sudo ALL=(root) NOPASSWD: /path/to/your/program

w /etc/sudoers

Zauważ, że % sudo to robi.

ultimatex
źródło
Chociaż jest to jeden ze sposobów realizacji reguły sudo, nie odpowiada ona na pytanie, dlaczego ustawienie flagi NOPASSWD dla tej reguły nadal powoduje wyświetlenie monitu o podanie hasła. Zobacz zaakceptowaną odpowiedź, aby dowiedzieć się, dlaczego tak się stało.
Jeff Schaller
0

Poniżej przedstawiono przypadek, w którym chcesz uruchomić polecenie bez hasła tylko wtedy, gdy ma on określony zestaw opcji, w których część opcji jest zmienna . AFAIK nie jest możliwe stosowanie zmiennych lub zakresów wartości w deklaracjach sudoers, tzn. Możesz wyraźnie zezwolić na dostęp, command option1ale nie command option2używając:

user_name ALL=(root) /usr/bin/command option1

ale jeśli struktura jest command option1 value1, gdzie value1może się różnić, musisz mieć wyraźne wiersze sudoers dla każdej możliwej wartości value1. Skrypt powłoki umożliwia obejście tego.

Ta odpowiedź została zainspirowana odpowiedzią M. Ahmada Zafara i naprawia tam problem bezpieczeństwa.

  1. Utwórz skrypt powłoki, bez którego wywołasz komendę sudo.
  2. Zapisz skrypt w folderze uprzywilejowanym do rootowania (np. /usr/local/bin/), Ustaw plik jako root (np. chown root:wheel /usr/local/bin/script_name) Bez dostępu do zapisu dla innych (np chmod 755 /usr/local/bin/script_name.).
  3. Dodaj wyjątek do sudoers za pomocą visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Uruchom skrypt sudo script_name.

Na przykład chcę zmienić limit czasu uśpienia wyświetlacza w systemie macOS. Odbywa się to za pomocą:

sudo pmset displaysleep time_in_minutes

Uważam, że zmiana limitu czasu snu jest niewinną czynnością, która nie usprawiedliwia kłopotów z wpisywaniem hasła, ale pmsetmoże robić wiele rzeczy i chciałbym, aby te inne rzeczy pozostały za hasłem sudo.

Mam więc następujący skrypt /usr/local/bin/ds:

#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi

Na końcu sudoerspliku mam następujący wiersz:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Aby ustawić limit czasu na 3 minuty, uruchamiam skrypt ze zwykłego konta użytkownika user_name:

sudo ds 3

PS Większość mojego skryptu to sprawdzanie poprawności danych wejściowych, co nie jest obowiązkowe, więc działałyby również:

#!/bin/bash
pmset displaysleep $1 
Koit Saarevet
źródło