Comando sudo di Linux

Sui sistemi operativi simili a Unix, il comando sudo (“cambia utente, fai”) consente a un utente con le autorizzazioni appropriate di eseguire un comando come un altro utente. Per impostazione predefinita, sudo esegue i comandi come root.
Questa pagina descrive la versione Linux di sudo.
Descrizione
sudo consente a un utente autorizzato di eseguire un comando come un altro utente, in base alle specifiche nel file /etc/sudoers. L’uid e il gid reali ed effettivi dell’utente emittente vengono quindi impostati in modo che corrispondano a quelli dell’account utente di destinazione come specificato nel file passwd.
Per impostazione predefinita, sudo richiede che gli utenti si autentichino con una password. Per impostazione predefinita, questa è la password dell’utente, non la password di root stessa.
Una volta autenticato un utente, viene registrato un timestamp e l’utente può utilizzare sudo senza password per un breve periodo (5 minuti, a meno che non sia configurato diversamente in sudoers). Questo timestamp può essere rinnovato se l’utente emette sudo con il flag -v.
Se un utente non elencato in sudoers tenta di eseguire un comando utilizzando sudo, viene considerato un tentativo fallito di violare la sicurezza del sistema e la posta viene inviata alle autorità appropriate, come definito al momento della configurazione o nel file sudoers. L’autorità predefinita da notificare in caso di tentativi sudo non riusciti è root. Nota che la posta non viene inviata se un utente non autorizzato tenta di eseguire sudo con i flag -l o -v; questo consente agli utenti di determinare da soli se sono autorizzati o meno a utilizzare sudo.
sudo può registrare sia i tentativi (ed errori) riusciti che quelli non riusciti su syslog, un file di registro univoco o entrambi. Per impostazione predefinita, sudo si registrerà su syslog ma questo può essere modificato al momento della configurazione o nel file sudoers.
Per modificare il file sudoers, usa il comando visudo.
Sintassi
sudo -V | -h | -l | -L | -v | -k | -K | -s | [ -H ] [-P ] [-S ] [ -b ] |
[ -p prompt ] [ -c class|- ] [ -a auth_type ] [-r role ] [-t type ]
[ -u username|#uid ] command
Opzioni
| -V | L’opzione -V (versione) fa in modo che sudo stampi il numero di versione e esca. Se l’utente che invoca è già root, l’opzione -V stampa un elenco dei valori predefiniti con cui sudo è stato compilato e gli indirizzi di rete locale della macchina. |
| -l | L’opzione -l (elenco) stampa i comandi consentiti (e vietati) all’utente sull’host corrente. |
| -L | L’opzione -L (list defaults) elenca i parametri impostati in una riga Defaults con una breve descrizione per ciascuno. Questa opzione è utile insieme a grep. |
| -h | L’opzione -h (aiuto) fa in modo che sudo stampi un messaggio di utilizzo e esca. |
| -v | Se viene data l’opzione -v (convalida), sudo aggiorna il timestamp dell’utente, richiedendo la password dell’utente se necessario. Questo estende il timeout sudo per altri 5 minuti (o qualunque sia il timeout impostato in sudoers) ma non esegue un comando. |
| -K | L’opzione -k (kill) di sudo invalida il timestamp dell’utente impostando l’ora su di esso all’epoca. La prossima volta che sudo verrà eseguito verrà richiesta una password. Questa opzione non richiede una password ed è stata aggiunta per consentire a un utente di revocare le autorizzazioni sudo da un file .logout. |
| -K | L’opzione -K (sure kill) di sudo rimuove completamente il timestamp dell’utente. Allo stesso modo, questa opzione non richiede una password. |
| -B | L’opzione -b (background) dice a sudo di eseguire il comando dato in background. Nota che se usi l’opzione -b non puoi usare il controllo del job della shell per manipolare il processo. |
| -P | L’opzione -p (prompt) consente di sovrascrivere il prompt della password predefinito e utilizzarne uno personalizzato. Sono supportate le seguenti percentuali di escape (‘%’):
%u viene espanso al nome di accesso dell’utente che lo ha invocato; %U viene espanso al nome di accesso dell’utente con cui verrà eseguito il comando (che per impostazione predefinita è root); %h viene espanso al nome host locale senza il nome di dominio; %H viene espanso al nome host locale incluso il nome di dominio (solo se il nome host della macchina è completo o se è impostata l’opzione sudoers “fqdn”); %% (due caratteri % consecutivi) vengono compressi in un singolo carattere %. |
| -C | L’opzione -c (classe) fa in modo che sudo esegua il comando specificato con risorse limitate dalla classe di accesso specificata. L’argomento della classe può essere un nome di classe come definito in /etc/login.conf o un singolo carattere ‘-‘. Specificare una classe di – indica che il comando deve essere eseguito limitato dalle capacità di accesso predefinite per l’utente che esegue il comando. Se l’argomento della classe specifica una classe utente esistente, il comando deve essere eseguito come root o il comando sudo deve essere eseguito da una shell che è già root. Questa opzione è disponibile solo su sistemi con classi di accesso BSD in cui sudo è configurato con l’opzione –with-logincap. |
| -un | L’opzione -a (tipo di autenticazione) fa sì che sudo utilizzi il tipo di autenticazione specificato durante la convalida dell’utente, come consentito da /etc/login.conf. L’amministratore di sistema può specificare un elenco di metodi di autenticazione specifici per sudo aggiungendo una voce “auth-sudo” in /etc/login.conf. Questa opzione è disponibile solo su sistemi che supportano l’autenticazione BSD in cui sudo è configurato con l’opzione –with-bsdauth. |
| -u | L’opzione -u (utente) fa in modo che sudo esegua il comando specificato come utente diverso da root. Per specificare un uid invece di un nome utente, usa #uid. |
| -S | L’opzione -s (shell) esegue la shell specificata dalla variabile d’ambiente SHELL se è impostata o la shell come specificato nel file passwd. |
| -H | L’opzione -H (HOME) imposta la variabile di ambiente HOME sulla directory home dell’utente di destinazione (root per impostazione predefinita) come specificato in passwd. Per impostazione predefinita, sudo non modifica HOME. |
| -P | L’opzione -P (preserve group vector) fa sì che sudo mantenga inalterato il vettore del gruppo dell’utente. Per impostazione predefinita, sudo inizializzerà il vettore del gruppo nell’elenco dei gruppi dell’utente di destinazione. Gli ID di gruppo reali ed effettivi, tuttavia, sono ancora impostati per corrispondere all’utente di destinazione. |
| -R | L’opzione -r (ruolo) fa sì che il nuovo contesto di sicurezza (SELinux) abbia il ruolo specificato da ROLE. |
| -T | L’opzione -t (tipo) fa sì che il nuovo contesto di sicurezza (SELinux) abbia il tipo (dominio) specificato da TYPE. Se non viene specificato alcun tipo, il tipo predefinito viene derivato dal ruolo specificato. |
| -S | L’opzione -S (stdin) fa sì che sudo legga la password dall’input standard invece che dal dispositivo terminale. |
| — | Il flag — indica che sudo deve interrompere l’elaborazione degli argomenti della riga di comando. È molto utile in combinazione con il flag -s. |
Valori di ritorno
In caso di corretta esecuzione di un programma, il valore restituito da sudo sarà il valore restituito dal programma che è stato eseguito.
Altrimenti, sudo si chiude con un valore di uscita 1 se c’è un problema di configurazione/autorizzazione o se sudo non può eseguire il comando dato. In quest’ultimo caso la stringa di errore viene stampata su stderr. Se sudo non riesce a stabilire una o più voci nel PATH dell’utente, viene stampato un errore su stderr. (Se la directory non esiste o se non è una directory, la voce viene ignorata e non viene stampato alcun errore.) Ciò non dovrebbe accadere in circostanze normali. Il motivo più comune per cui stat restituisce “permesso negato” è se stai eseguendo un montaggio automatico e una delle directory nel tuo PATH si trova su una macchina che è attualmente irraggiungibile.
Note di sicurezza
sudo cerca di essere sicuro durante l’esecuzione dei comandi. Le variabili che controllano il modo in cui viene eseguito il caricamento dinamico e l’associazione possono sovvertire il programma eseguito da sudo. Per combattere ciò, alcune variabili di ambiente specifiche del sistema vengono rimosse dall’ambiente che viene passato ai comandi che vengono eseguiti. Altre variabili che sudo rimuove dall’ambiente includono:
- IFS
- ENV
- BASH_ENV
- KRB_CONF
- KRBCONFDIR
- KRBTKFILE
- KRB5_CONFIG
- LOCALDOMAIN
- RES_OPTIONS
- OSTALIAS
- NLSPATH
- PATH_LOCALE
- CONDIZIONI
- TERMINFO_DIRS
- TERMPATH
in quanto anch’essi possono rappresentare una minaccia. Se la variabile TERMCAP è impostata ed è un percorso, anch’essa viene ignorata. Inoltre, se alcune variabili contengono i caratteri \/o %, vengono ignorate.
Se sudo è stato compilato con il supporto SecurID, vengono cancellate anche le variabili VAR_ACE, USR_ACE e DLC_ACE. L’elenco delle variabili di ambiente che sudo cancella è contenuto nell’output di sudo -V quando viene eseguito come root.
Per impedire lo spoofing dei comandi, sudo controlla “.” e “” (entrambi denotano la directory corrente) per ultimi durante la ricerca di un comando nel PERCORSO dell’utente (se uno o entrambi sono nel PERCORSO). Si noti, tuttavia, che la variabile di ambiente PATH effettiva non viene modificata e viene passata invariata al programma eseguito da sudo.
Per motivi di sicurezza, se il tuo sistema operativo supporta le librerie condivise e non disabilita i percorsi di ricerca della libreria definiti dall’utente per i programmi setuid (la maggior parte lo fa), usa un’opzione del linker che disabilita questo comportamento o collega sudo staticamente.
sudo controlla la proprietà della sua directory timestamp (/var/run/sudo per impostazione predefinita) e ignora il contenuto della directory se non è di proprietà di root e solo scrivibile da root. Sui sistemi che consentono agli utenti non root di distribuire file tramite chown, se la directory timestamp si trova in una directory scrivibile da chiunque (es: /tmp), è possibile che un utente crei la directory timestamp prima di eseguire sudo. Tuttavia, poiché sudo controlla la proprietà e la modalità della directory e del suo contenuto, l’unico danno che si può fare è “nascondere” i file inserendoli nella directory timestamp. È improbabile che ciò accada poiché una volta che la directory timestamp è di proprietà di root e inaccessibile da qualsiasi altro utente, l’utente che inserisce i file non sarebbe in grado di recuperarli. Per aggirare questo problema, puoi utilizzare una directory che non è scrivibile da tutti per i timestamp (/var/adm/sudo per esempio) o creare /var/run/sudo con il proprietario (root) e i permessi appropriati (0700) nei file di avvio del sistema.
sudo non onorerà i timestamp impostati in un lontano futuro. I timestamp con una data maggiore di current_time + 2 * TIMEOUT vengono ignorati e sudo registrerà e si lamenterà. Questo viene fatto per impedire a un utente di creare il proprio timestamp con una data falsa sui sistemi che consentono agli utenti di distribuire file.
Tieni presente che sudo registra solo il comando che esegue esplicitamente. Se un utente esegue un comando come “sudo su” o “sudo sh”, i comandi successivi eseguiti da quella shell non vengono registrati, né il controllo di accesso di sudo li influenzerà. Lo stesso vale per i comandi che offrono escape della shell (inclusa la maggior parte degli editor). Per questo motivo, è necessario prestare attenzione quando si concede agli utenti l’accesso ai comandi tramite sudo per verificare che il comando non dia inavvertitamente all’utente una shell di root efficace.
Variabili ambientali
sudo utilizza le seguenti variabili di ambiente:
| IL PERCORSO | Impostato su un valore corretto se SECURE_PATH è impostato |
| GUSCIO | Usato per determinare la shell da eseguire con l’opzione -s |
| UTENTE | Impostato sull’utente di destinazione (root a meno che non sia specificata l’opzione -u) |
| CASA | In modalità -s o -H (o se sudo è stato configurato con l’opzione –enable-shell-sets-home), impostare sulla directory home dell’utente di destinazione. |
| SUDO_PROMPT | Utilizzato come richiesta di password predefinita |
| SUDO_COMANDO | Impostato sul comando eseguito da sudo |
| SUDO_USER | Impostato al login dell’utente che ha invocato sudo |
| SUDO_UID | Impostato sull’uid dell’utente che ha invocato sudo |
| SUDO_GID | Impostato al gid dell’utente che ha invocato sudo |
| SUDO_PS1 | Se impostato, PS1 sarà impostato sul suo valore |
Esempi
sudo shutdown -r now
Riavvia il sistema; eseguire il comando di spegnimento come root.
sudo -u hope ls /home/otheruser/Documents
Elenca il contenuto della directory /home/otheruser/Documents come spera l’utente.
sudo -u hope -g otherusers mkdir /home/otheruser/Documents/newfiles
Crea una nuova directory con il comando mkdir, come spera l’utente, con il gruppo corrente di Hope impostato su otherusers. speranza deve essere un membro del gruppo otherusers.
sudo -v
Estendi/ripristina il timeout di autenticazione automatica di sudo, permettendoti di continuare a inviare comandi sudo senza inserire una password.
sudo -k
“Uccidi” l’autenticazione sudo per l’utente corrente. Il prossimo comando sudo richiede una password.
Comandi correlati
su — Diventa il superutente o un altro utente.
visudo — Modifica il file sudoers, che definisce chi può eseguire sudo.
