Come eseguire un programma specifico come root senza una richiesta di password?


169

Devo eseguire qualcosa come sudo senza password, quindi l'ho usato visudoe aggiunto al mio sudoersfile:

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

Poi l'ho provato:

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

Perché chiede una password? Come posso eseguire / utilizzare i comandi come root con un utente non root, senza chiedere una password?

Risposte:


91

Hai un'altra voce nel sudoersfile che corrisponde anche al tuo utente. La NOPASSWDregola deve essere dopo quella per avere la precedenza.

Fatto ciò, sudoverrà richiesta una password normalmente per tutti i comandi tranne /path/to/my/program, che ti consentirà sempre di eseguire senza richiedere la password.


6
funzionerebbe ancora se /path/to/my/programfosse uno script Python?
sadmic Microwave

Il programma può invece essere un alias, impostato per bash (cioè in .bashrc)? O addirittura uno script di shell all'interno /usr/local/sbin? Per provare.
Nikos Alexandris,

Nikos - no, non può essere un alias. Deve indicare un percorso reale.
Paul Hedderly,

sudoers? dove si trova? spassoso usare la tua risposta (
Vasilii Suricov,

@VasiliiSuricov: Di solito è dentro /etc, ma alcuni sistemi lo mettono altrove. Se non riesci a trovarlo, prova man sudoers. Il percorso locale per quel file dovrebbe essere sostituito nella manpagina al momento della sudocreazione del sistema.
Warren Young,

135

Se ci sono più voci corrispondenti in /etc/sudoers, sudo usa l'ultima. Pertanto, se è possibile eseguire qualsiasi comando con una richiesta di password e si desidera poter eseguire un comando particolare senza una richiesta di password, è necessario disporre dell'ultima eccezione.

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

Si noti l'uso di (root), per consentire l'esecuzione del programma come root ma non come altri utenti. (Non concedere più autorizzazioni del minimo richiesto a meno che tu non abbia pensato alle implicazioni.)

Nota per i lettori che non eseguono Ubuntu o che hanno modificato la configurazione di sudo predefinita (il sudo di Ubuntu è ok per impostazione predefinita) : l'esecuzione di script di shell con privilegi elevati è rischiosa, è necessario iniziare da un ambiente pulito (una volta avviata la shell, è troppo tardi (vedi Consenti setuid su script di shell ), quindi hai bisogno di sudo per occupartene). Assicurarsi di avere Defaults env_resetin /etc/sudoerso che questa opzione è di default in fase di compilazione ( sudo sudo -V | grep envdovrebbe includere Reset the environment to a default set of variables).


3
ex per ottenere il root da jhon con sudo su an no pass -----> john ALL = (ALL) NOPASSWD: / bin / su
bortunac

5
@adrian Se vuoi consentire comandi arbitrari come root, crealo john ALL=(ALL) NOPASSWD: all. Non ha senso andare via su.
Gilles,

Domanda: dovrei modificare le autorizzazioni del mio script di shell in modo che possa essere modificato e letto solo dall'utente root, per motivi di sicurezza? Sto pensando a un utente malintenzionato che modifica lo script, che dispone di tutte le autorizzazioni concesse senza la necessità di una password, in modo che faccia quello che vuole. Ovviamente, l'attaccante non può nemmeno leggere il file sudoers per sapere quali script hanno questo privilegio, ma può comunque provare con tutti i miei script personalizzati una volta che trova la cartella in cui sono memorizzati nella speranza che alcuni siano autorizzati, o qualcosa del genere .
Jeffrey Lebowski il

1
@JeffreyLebowski Se si dispone di una regola sudo che esegue lo script (direttamente o indirettamente), è fondamentale che solo i root (o le persone che dispongono dei privilegi di root) possano scrivere nel file di script e nella directory contenente il file di script e in la sua directory padre e così via. Non importa che chiunque possa leggere il file di script (a meno che non contenga una password o qualcosa del genere, ma è una cattiva idea, se c'è una password dovrebbe essere nel suo file, altrimenti c'è troppo rischio di perdere accidentalmente ad es. copia e incolla quella sezione del codice in una domanda su questo sito).
Gilles,

1
@alper No. Pochissime cose richiedono il riavvio. Dopo aver cambiato sudoers, non è necessario fare nulla di speciale: sudocontrollalo ogni volta.
Gilles,

24

ATTENZIONE : questa risposta è stata ritenuta insicura. Vedi i commenti qui sotto

Soluzione completa: i seguenti passaggi ti aiuteranno a ottenere l'output desiderato:

  1. Crea un nuovo file di script (sostituiscilo create_dir.shcon il nome dello script desiderato):

    vim ~/create_dir.sh
    

    Lo script verrà creato nella home directory dell'utente

  2. Aggiungere alcuni comandi che solo un rooto sudoutente può eseguire, come la creazione di una cartella al livello directory principale:

    mkdir /abc
    

    Nota: non aggiungere sudoa questi comandi. Salva ed esci (usando :wq!)

  3. Assegnare le autorizzazioni di esecuzione ad esso utilizzando:

    sudo chmod u+x create_dir.sh
    
  4. Apporta le modifiche in modo che questo script non richieda una password.

    1. Apri il sudoersfile:

      sudo visudo -f /etc/sudoers
      
    2. Aggiungi la seguente riga alla fine:

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

      Sostituisci ahmadcon qualunque sia il tuo nome utente. Assicurati anche che questa sia l'ultima riga. Salva ed esci.

  5. Ora quando esegui il comando aggiungi sudoprima come:

    sudo ./create_dir.sh
    

    Ciò eseguirà i comandi all'interno del file di script senza richiedere una password.

Segui i semplici passaggi indicati qui http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/


Sarebbe meglio se fornissi i passaggi pertinenti qui e utilizzassi il link come backup per informazioni più dettagliate. In questo modo la tua risposta conserva un possibile valore anche se quel link non sarebbe più valido.
Anthon,

15
Questo consiglio non è sicuro. La sudoparte di sudo chmod u+x create_dir.shnon è necessaria in quanto l'utente ha (presumibilmente) la proprietà sulla sua home directory. Dal momento che l'utente può scrivere create_dir.sh, hai effettivamente dato una shell di root gratuita a quell'utente.
Lekensteyn,

1
@Lekensteyn Il che significa anche per qualsiasi programma in esecuzione come utente. Potrebbe anche consentire all'utente di eseguire qualsiasi cosa con sudo senza password.
pydsigner,

2
Mi sto perdendo qualcosa? Credo che il tutto chmodnon sia necessario, dal momento che fai affidamento sudoper elevare i tuoi privilegi.
G-Man,

10

Penso che la tua sintassi sia sbagliata. Almeno io uso quanto segue che funziona per me:

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

6
La (ALL)parte è facoltativa, tralasciarla ha esattamente lo stesso effetto. Avere (root)sarebbe meglio però, ma la sua assenza non spiega il problema.
Gilles,

+1 per sudo per questo comando e nient'altro! Nessun motivo per rompere l'intero sistema ...
Johan,

3
@Johan: era già nella domanda.
Gilles,

5

Se si desidera evitare di utilizzare sudo né modificare il file di configurazione di sudoers, è possibile utilizzare:

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

Questo renderà il comando eseguito come root senza la necessità di sudo.


Caspita, non avevo mai sentito parlare di questa soluzione prima, sbalorditivo
qualcosa del

Perché devo scorrere fino alla fine di queste cose per trovare la risposta migliore? Grazie per questa semplice soluzione sicura.
RyanNerd,

5

Se hai una distro come Manjaro, devi prima occuparti di un file che sovrascrive la definizione di / etc / sudoers, puoi eliminarlo o lavorare direttamente con quel file per aggiungere le tue nuove configurazioni.

Questo file è:

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

L'UNICO modo per vederlo è nei privilegi di root, non puoi elencare questa directory senza di essa, questo file è specifico di Manjaro, potresti trovare questa configurazione con un altro nome, ma nella stessa directory.

Nel tuo file preferito, puoi aggiungere le seguenti righe per ottenere le configurazioni desiderate:

Ignora l'autenticazione per un gruppo

%group ALL=(ALL) NOPASSWD: ALL

oppure Ignora autenticazione per un utente

youruser ALL=(ALL) NOPASSWD: ALL

oppure Ignora autenticazione un eseguibile per un utente specifico

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

NOTA VELOCE: stai aprendo una porta per utilizzare SUDO senza autenticazione, ciò significa che puoi eseguire tutto modificando tutto dal tuo sistema, utilizzandolo con responsabilità.


4

Verificare che sudo non sia alias. Corri in questo modo

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

Ad esempio un alias di shell come questo:

alias sudo="sudo env PATH=$PATH"

può causare questo comportamento.


Hai ragione, il mio commento era fuori servizio qui , mi dispiace per quello. Tuttavia sono incuriosito: come pensi che l'aliasing cambi l'elaborazione di sudoerssudo. O stai parlando di reindirizzare sudoa qualcosa che stampa sempre questo messaggio di errore per raccogliere le password? È improbabile che il caso qui ...
Peter

2
Avevo lo stesso problema dell'OP. Si è scoperto essere causato da avere alias sudo="sudo env PATH=$PATH"nel mio ~/.bashrc. Piuttosto che risolverlo da solo e ciecamente solo per i miei affari, ho inviato la mia risposta come possibile soluzione per tutti coloro che seguono questo thread.
Sepero,

1
Va bene, ma quando non è ovvio (che in questo caso non è almeno per alcune persone) è bene inserire una spiegazione nella risposta per fornire un contesto e impedire alle persone di usare ciecamente incantesimi magici. +2 (- (- 1) + +1). :)
peterph

2

Quando esegui il tuo script devi eseguirlo come sudo /path/to/my/script.

Modifica: in base al tuo commento a un'altra risposta, vuoi eseguirlo da un'icona. Dovrai creare un .desktopfile che esegue il tuo programma con sudo, proprio come sul terminale.

Si potrebbe anche considerare l'utilizzo gtk-sudoper una richiesta di password visiva.

Probabilmente dovresti considerare l'idea che non dovresti eseguire le cose come root e che cambiare il sistema più avanti lungo la strada in modo che non ti servano affatto i permessi di root sarebbe un modo migliore per andare.


7
Non impostare script di shell setuid . Vedi Consenti setuid su script shell .
Gilles,

Ho pensato di non menzionarlo nemmeno perché è un'opzione così negativa. L'ho appena cancellato perché sono preoccupato che questo richiedente potrebbe usare il consiglio anche con l'avvertimento che era un cattivo consiglio!
Caleb,

2

Ciò ha risolto il problema per me (ho anche provato alcune delle altre risposte, che avrebbero potuto aiutare):

Lo script che stavo chiamando era in /usr/binuna directory per la quale non ho i permessi di scrittura (anche se di solito posso leggere qualsiasi file lì). La sceneggiatura era chmodded + x (permesso eseguibile), ma non funzionava ancora. Spostare questo file in un percorso nella mia directory home, anziché/usr/bin , sono stato finalmente in grado di chiamarlo con sudo senza inserire una password.

Anche qualcosa di cui ho dubitato (chiarendo per i futuri lettori): è necessario eseguire la sceneggiatura come sudo. Digitare sudoquando si chiama lo script. Non usare sudoper il comando all'interno del tuo script che ha effettivamente bisogno di root (cambiando la retroilluminazione della tastiera nel mio caso). Forse funziona anche questo, ma non è necessario e sembra una soluzione migliore per non farlo.


Il secondo paragrafo aveva la risposta al mio problema
M. Ahmad Zafar,

@MuhammadAhmadZafar Sono contento che abbia aiutato!
Luc,

4
In realtà l'utilizzo sudoall'interno di uno script va benissimo purché tu abbia i diritti appropriati (impostati in sudoers) per eseguire il comando in questione senza una password. Rende le cose un po 'più sicure.
peterph,

potrei davvero usare questa risposta riscritta come un passo per passo 'questo è come lo fai' piuttosto che come un dialogo con le altre risposte
Walrus the Cat,

@WalrustheCat Un buon punto. Rileggendo la mia risposta, penso che avrei potuto essere un po 'confuso da solo. In questo momento, però, non ricordo quale fosse esattamente la situazione, quindi non posso davvero scrivere meglio. Se lo capisci, forse una combinazione di più risposte, in ogni caso invia una nuova risposta!
Luc,

1

Un'altra possibilità potrebbe essere quella di installare, configurare, quindi utilizzare il super comando per eseguire lo script come

super /path/to/your/script

Se vuoi eseguire un eseguibile binario (ad esempio se hai compilato un binario ELF da un codice sorgente C) -che non è uno script- come root, potresti considerare di renderlo setuid (e in realtà /bin/login, /usr/bin/sudoe /bin/sue supertutti stanno usando quella tecnica ). Tuttavia, fai molta attenzione, potresti aprire un enorme buco di sicurezza .

Concretamente, il tuo programma dovrebbe essere codificato in modo paranoico (quindi controlla tutti gli argomenti e l'ambiente e le condizioni esterne prima di "agire", assumendo un utente potenzialmente ostile), quindi potresti usare seteuid (2) e amici (vedi anche setreuid (2) ) (vedi anche funzionalità (7) e credenziali (7) ed esegui (2) ...)

Userai chmod u+s(leggi chmod (1) ) quando installi un tale binario.

Ma stai molto attento .

Leggi molte cose su setuid , inclusa la Programmazione avanzata di Linux , prima di scrivere una cosa del genere.

Notare che una sceneggiatura o qualsiasi cosa scritta da Shebang non può essere impostata. Ma potresti codificare (in C) un piccolo setuid-binario avvolgendolo.


0

Idealmente, se stai personalizzando quali comandi possono essere eseguiti tramite sudo, dovresti apportare queste modifiche in un file separato in /etc/sudoers.d/invece di modificarlo sudoersdirettamente. Dovresti anche usare sempre visudoper modificare i file. Non si dovrebbe mai concedere NOPASSWDin ALLcomandi.

Esempio: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Inserisci la tua linea che concede l'autorizzazione: myuser ALL= NOPASSWD: /path/to/your/program

Quindi salva ed esci e visudoti avviserà se hai errori di sintassi.

È possibile eseguire sudo -lper visualizzare le autorizzazioni concesse all'utente, se viene visualizzato uno qualsiasi dei NOPASSWDcomandi specifici dell'utente PRIMA di qualsiasi %groupyouarein ALL=(ALL) ALLcomando nell'output, verrà richiesta la password.

Se ti ritrovi a creare molti di questi file sudoers.d, allora forse vorrai crearli nominati per utente in modo che siano più facili da visualizzare. Tieni presente che l'ordinamento dei NOMI DEI FILE e delle REGOLE all'interno del file è molto importante, quello ULTIMO caricato vince, sia che sia PIÙ o MENO permissivo rispetto alle voci precedenti.

Puoi controllare l'ordinamento dei nomi dei file usando un prefisso 00-99 o aa / bb / cc, anche se tieni presente che se hai QUALSIASI file che non ha prefisso numerico, verranno caricati dopo i file numerati, sovrascrivendo le impostazioni. Questo perché, a seconda delle impostazioni della lingua, l '"ordinamento lessicale" della shell utilizza prima i numeri di ordinamento e quindi può alternare lettere maiuscole e minuscole quando si ordina in ordine "crescente".

Prova a correre printf '%s\n' {{0..99},{A-Z},{a-z}} | sorte printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortper vedere se la tua lingua corrente stampa AaBbCcecc. O ABCpoi abcper determinare quale sarebbe il migliore "ultimo" prefisso lettera da usare.


0

Per consentire a qualsiasi utente di eseguire il programma come sudo senza chiedere la password, è possibile aggiungere la seguente riga

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

nel /etc/sudoers

Nota che % sudo ce la fa.


Sebbene questo sia un modo per realizzare una regola sudo, non risponde alla domanda sul perché l'impostazione del flag NOPASSWD su questa regola abbia comunque comportato la richiesta di una password. Vedi la risposta accettata per avere un'idea del perché sia ​​successo.
Jeff Schaller

0

Quanto segue è per il caso in cui si desidera eseguire un comando senza password solo se ha un set specifico di opzioni, in cui una parte delle opzioni è variabile . AFAIK non è possibile utilizzare variabili o intervalli di valori nelle dichiarazioni dei sudoers, ovvero è possibile consentire l'accesso in modo esplicito command option1ma non command option2utilizzando:

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

ma se la struttura è command option1 value1, dove value1può variare, è necessario disporre di righe esplicite sudoers per ogni possibile valore di value1. Lo script Shell fornisce un modo per aggirarlo.

Questa risposta è stata ispirata dalla risposta di M. Ahmad Zafar e risolve lì il problema di sicurezza.

  1. Creare uno script shell in cui si chiama il comando senza sudo.
  2. Salvare lo script in una cartella con privilegi di root (ad es. /usr/local/bin/), Rendere il file di proprietà root (ad es. chown root:wheel /usr/local/bin/script_name) Senza accesso in scrittura per altri (ad es chmod 755 /usr/local/bin/script_name.).
  3. Aggiungi l'eccezione ai sudoers usando visudo:

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

  4. Esegui la tua sceneggiatura sudo script_name.

Ad esempio, voglio cambiare il timeout di sospensione della visualizzazione su macOS. Questo viene fatto usando:

sudo pmset displaysleep time_in_minutes

Considero cambiare il timeout di sospensione un'azione innocente che non giustifica la seccatura della digitazione della password, ma pmsetpuò fare molte cose e mi piacerebbe tenere queste altre cose dietro la password sudo.

Quindi ho il seguente script su /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

Alla fine del sudoersfile ho la seguente riga:

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

Per impostare il timeout a 3 minuti, eseguo il mio script dall'account utente normale user_name:

sudo ds 3

PS La maggior parte del mio script è la convalida dell'input, che non è obbligatorio, quindi anche i seguenti funzionerebbero:

#!/bin/bash
pmset displaysleep $1 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.