Guida a Sudo(ers)
1.
Sudo
Assegnare permessi
Il pacchetto app-admin/sudo permette all'amministratore di sistema di
concedere ad altri utenti i privilegi per eseguire una o più applicazioni a
cui normalmente non avrebbero diritto. Invece di impostare il bit setuid
di queste applicazioni sudo permette una gestione migliore di chi
può eseguire certi comandi e quando.
Usando sudo puoi creare una lista precisa di chi può eseguire
determinati comandi. Se tu impostassi il bit setuid chiunque potrebbe eseguire
quell'applicazione (o, a seconda dei permessi utilizzati, ogni membro di un
certo gruppo). Con sudo, invece, puoi (e dovresti) richiedere all'utente
l'inserimento di una password quando tenta di eseguire tale applicazione.
Loggare le attività
Un ulteriore vantaggio di sudo è che può fornire i log di ogni
tentativo di esecuzione (sia andato a buon fine che non) di un'applicazione.
Questo è veramente comodo se si vuole tenere traccia di chi ha fatto l'errore
che ti è costato 10 ore di tempo per sistemarlo :)
Configurare Sudo
La configurazione di sudo è gestita dal file /etc/sudoers.
Questo file non andrebbe mai editato usando nano /etc/sudoers o
vim /etc/sudoers o qualsiasi altro editor da voi utilizzato. Quando
si vuole modificare questo file si dovrebbe usare visudo.
Questo programma infatti permette di controllare che non ci siano due
amministratori che stanno modificando il file contemporaneamente, di mantenere
i permessi corretti sul file stesso e di verificarne la sintassi in modo da
evitare errori.
Questa guida
Questa guida può essere vista come una breve introduzione a questo
programma. Il pacchetto sudo è molto più potente di come viene
descritto qui. Possiede infatti molte funzionalità come il poter editare file
come un utente differente (sudoedit), può essere eseguito in uno script
(può girare in background, può leggere la password dallo standard in e non
dalla tastiera, ...), etc.
Per favore leggi le pagine del manuale di sudo e di sudoers per
informazioni maggiori.
2.
Sintassi di Sudoers
Sintassi di base
La cosa più difficile dell'utilizzo di sudo è la sintassi di
/etc/sudoers.
La sintassi base è qualcosa di simile a:
Codice 2.1: Sintassi di base di /etc/sudoers |
user host = comandi
|
Questa sintassi indica a sudo che l'utente, identificato da user
e loggato nel sistema host può eseguire qualsiasi comando indicato in
commands come se fosse l'utente root. Facciamo un esempio reale per
semplificare le cose: si vuole permettere all'utente swift di eseguire
emerge se è autenticato in localhost:
Codice 2.2: Reale esempio di /etc/sudoers |
swift localhost = /usr/bin/emerge
|
Nota:
L'hostname deve corrispondere a ciò che restituisce il comando hostname.
|
Prestare attenzione a cosa si scrive: non permettere ad utenti
di eseguire applicazioni che potrebbero concedergli privilegi troppo elevati.
Per esempio, permettere ad utenti di eseguire emerge come utente root
significa affidargli i pieni accessi al sistema in quanto emerge può
essere utilizzato per cambiare file di sistema a vantaggio dell'utente stesso.
Se non vi fidate dei vostri utenti sudo non dategli nessun diritto.
Il nome dell'utente può anche essere sostituito con il nome di un gruppo -
in questo caso si deve far precedere al nome del gruppo il carattere %.
Esempio per permettere a tutti gli utenti del gruppo wheel di eseguire
emerge:
Codice 2.3: Permettere ai membri del gruppo wheel di eseguire emerge |
%wheel localhost = /usr/bin/emerge
|
Si possono inserire più comandi nella stessa linea in modo da non doverne
creare una diversa per ogni istruzione. Per esempio, per permettere allo stesso
utente non solo di eseguire emerge ma anche di eseguire ebuild e
emerge-webrsync come utente root:
Codice 2.4: Comandi multipli |
swift localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync
|
Si può inoltre specificare un preciso comando e non solo il generico
programma. Questo è comodo per poterne restringere l'uso ad uno specifico set
di opzioni. Il programma sudo permette wildcard in stile shell (AKA
caratteri meta o glob) per essere usate in pathname come argomenti nella riga
di comando nei file sudoers. Notare che questi non sono espressioni
regolari.
Esempio:
Codice 2.5: Permettere il solo aggiornamento del sistema usando sudo |
$ sudo emerge -uDN world
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
Password:
|
La password richiesta da sudo è la password personale dell'utente.
Questo è fatto per impedire che terminali lasciati accidentalmente aperti
vengano usati per scopi dannosi da altre persone.
Dovresti sapere che sudo non modifica la variabile ${PATH}: ogni
comando scritto dopo sudo viene trattato nel tuo ambiente. Se
vuoi permettere all'utente di eseguire un programma posto in, per
esempio, /sbin, l'utente stesso deve preoccuparsi di utilizzare
sudo fornendo il path completo del comando da eseguire:
Codice 2.6: Usare il path completo di un programma |
$ sudo /usr/sbin/emerge-webrsync
|
Usare gli Alias
In sistemi di grandi dimensioni inserire tutti gli utenti più e più volte
(o gli host o i comandi) può essere un lavoro davvero faticoso. Per
semplificare l'amministrazione di /etc/sudoers si possono definire
degli alias. Il formato di tale definizione è relativamente semplice:
Codice 2.7: Dichiarare alias in /etc/sudoers |
Host_Alias hostalias = hostname1, hostname2, ...
User_Alias useralias = user1, user2, ...
Cmnd_Alias cmndalias = command1, command2, ...
|
Un alias che funziona sempre, in ogni posizione, è ALL (per
differenziare maggiormente gli alias dai non-alias è consigliato usare i
caratteri maiuscoli per i primi). Come indubbiamente avrai notato l'alias
ALL è utilizzabile per tutte le possibili configurazioni.
Esempio dell'uso di ALL per permettere a tutti gli utenti di
eseguire il comando shutdown solo se loggati localmente:
Codice 2.8: Permettere a tutti gli utenti di eseguire shutdown |
ALL localhost = /sbin/shutdown
|
Altro esempio per permettere all'utente swift di eseguire il comando
emerge come root, indipendentemente da dove si è loggato è:
Codice 2.9: Permettere ad un utente di eseguire un comando indipendentemente da dove si è loggato |
swift ALL = /usr/bin/emerge
|
Un esempio ancora più interessante è definire un set di utenti che
possono eseguire applicazioni amministrative (come emerge o
ebuild) e un gruppo di utenti che possono cambiare la password di
chiunque, eccetto quella di root!
Codice 2.10: Usare alias per utenti e programmi |
User_Alias SOFTWAREMAINTAINERS = swift, john, danny
User_Alias PASSWORDMAINTAINERS = swift, sysop
Cmnd_Alias SOFTWARECOMMANDS = /usr/bin/emerge, /usr/bin/ebuild
Cmnd_Alias PASSWORDCOMMANDS = /usr/bin/passwd [a-zA-Z0-9_-]*, !/usr/bin/passwd root
SOFTWAREMAINTAINERS localhost = SOFTWARECOMMANDS
PASSWORDMAINTAINERS localhost = PASSWORDCOMMANDS
|
Esecuzioni Non-Root
Usando sudo è inoltre possibile permettere ad un utente di eseguire
un'applicazione come un utente differente, e non root. Questo può essere molto
utile se nel sistema vengono eseguite delle applicazioni da utenti
particolari (per esempio apache come web server) e si vuole permettere
ad alcuni utenti di eseguire determinate operazioni amministrative come se
fossero questi utenti particolari (come uccidere processi zombie).
Dentro /etc/sudoers bisogna elencare l'utente(utenti) con cui si
vuole eseguire l'applicazione tra ( e ) prima
dell'elenco dei comandi:
Codice 2.11: Sintassi per l'esecuzione di programmi come utente non-root |
users hosts = (run-as) commands
|
Esempio per permettere all'utente swift di eseguire il comando
kill come se fosse l'utente apache o gorg:
Codice 2.12: Esempio di esecuzione come utente non-root |
Cmnd_Alias KILL = /bin/kill, /usr/bin/pkill
swift ALL = (apache, gorg) KILL
|
E' possibile usare il comando sudo -u per specificare l'utente con
cui vuole eseguire l'applicazione interessata:
Codice 2.13: Eseguire il comando pkill come utente apache |
$ sudo -u apache pkill apache
|
Si possono settare alias anche per gli utenti con cui si vogliono eseguire
determinate operazioni usando la direttiva Runas_Alias, il cui uso è
identico alle altre direttive _Alias viste precedentemente.
Passwords e configurazioni di default
Di default sudo chiede all'utente di identificarsi usando la propria
password personale. Quando questa viene inserita sudo la ricorda per 5
minuti, permettendo così all'utente di eseguire più comandi senza doversi
preoccupare di reinserire la password ogni volta.
Ovviamente questo comportamento può essere modificato: si può settare la
direttiva Defaults: nel file /etc/sudoers per cambiare tale
impostazione per un utente.
Per esempio, per cambiare i 5 minuti di default in 0 minuti (non ricordare mai
la password) per l'utente swift:
Codice 2.14: Cambiare il valore del timeout |
Defaults:swift timestamp_timeout=0
|
Impostando il valore a -1 significherebbe ricordare la password
indefinitamente (fino al riavvio del sistema).
Un utilizzo differente è il voler impostare la richiesta della password
dell'utente con cui si vuole eseguire il comando e non quella privata
dell'utente che utilizza sudo. Questo è possibile usando
runaspw. Nell'esempio seguente modifichiamo inoltre il numero di
tentativi possibili (quante volte l'utente può inserire la password prima
che sudo ritorni un errore) passando dai 3 di default a 2:
Codice 2.15: Richiedere la password di root invece che la password privata dell'utente |
Defaults:john runaspw, passwd_tries=2
|
Un'altra funzione interessante è la variabile DISPLAY, che se
impostata permette di eseguire tools grafici.
Codice 2.16: Mantenere abilitata la variabile DISPLAY |
Defaults:john env_keep=DISPLAY
|
Esistono dozzine di configurazioni di default modificabili tramite la direttiva
Defaults:. Leggi le pagine di manuale di sudo cercando l'argomento
Defaults per avere maggiori informazioni.
Se invece si vuol permettere ad un utente di eseguire certi comandi senza
fornire una password bisogna far precedere alla lista dei comandi
NOPASSWD:. Ad esempio:
Codice 2.17: Permettere l'esecuzione di emerge come utente root senza richiedere una password |
swift localhost = NOPASSWD: /usr/bin/emerge
|
3.
Usare Sudo
Mostrare i privilegi
Un utente, per poter visualizzare l'elenco dei comandi che sudo gli mette a
disposizione, può utilizzare sudo -l:
Codice 3.1: Elenco permessi |
$ sudo -l
User swift may run the following commands on this host:
(root) /usr/libexec/xfsm-shutdown-helper
(root) /usr/bin/emerge
(root) /usr/bin/passwd [a-zA-Z0-9_-]*
(root) !/usr/bin/passwd root
(apache) /usr/bin/pkill
(apache) /bin/kill
|
Se l'utente è associato ad alcuni programmi in /etc/sudoers che
non richiedono una password, questa non verrà richiesta neanche per mostrarli
col comando precedente. Altrimenti una password, se non "ricordata" da
sudo, verrà richiesta all'utente.
Aumentare la durata della password
Di default se un utente ha inserito la sua password in sudo questa
verrà ricordata per 5 minuti. Se l'utente vuole prolungare questo periodo può
eseguire il comando sudo -v per ricomiciare il timeout, avendo
quindi a disposizione altri 5 minuti prima che sudo la richieda
nuovamente.
Codice 3.2: Prolungare la durata della password |
$ sudo -v
|
Per dire a sudo di "scordare" immediatamente la propria password si
può utilizzare il comando sudo -k.
I contenuti di questo documento sono rilasciati sotto la licenza Creative
Commons - Attribution / Share Alike.
|